' by Dennis Mull and Tina Sweet
' Copyright (C) 1994 DOS World
' Published in Issue #18, November 1994, page 54
by Dennis Mull and Tina Sweet
Copyright (C) 1994 DOS World
Published in Issue #18, November 1994, page 54
FUNSUBS.BAS contains four attention-grabbing subroutines that you can add to
your own QBasic programs to create special visual and sound effects. The
second program, LIB.BAS, aids you in merging the subroutines from FUNSUBS.BAS
into your own programs.
To run FUNSUBS.BAS, which shows you a demonstration of the special effects,
change to the directory containing FUNSUBS.BAS, then type:
QBASIC /RUN FUNSUBS
Within FUNSUBS.BAS the MARQUEEPAUSE section creates fancy borders that blink
like the lights on a movie marquee sign; TICKPRINT and TICKERTAPE print
messages on your screen; and DOSOUND lets you add sound effects to your
FUNSUBS.BAS puts MARQUEEPAUSE through its paces first. To keep things simple,
the program displays a short message surrounded by a border composed of
asterisks. The routine turns on each of the asterisks in the border in
sequence and then turns each one off, just as the light bulbs in a marquee
switch on and off. You may substitute another character for the asterisk by
changing the value of the variable CH%. (See the table "Program Variables,"
below.) For example, to use a "happy face" in the marquee's border, alter the
variable's value by changing CH% = 42 to CH% = 1, the ASCII value for the
Use MARQUEEPAUSE to print a border anywhere on screen simply by assigning the
proper values to the QBasic variables you pass to the subprogram as
Suppose you want to display the following message for five seconds at the
start of your program:
Copyright Dennis Mull & Tina Sweet
All rights reserved.
To clear the screen and place the message in row 11, column 23, you'd start
by adding a CLS statement and three LOCATE statements:
LOCATE 11, 23, 0: PRINT "Copyright Dennis Mull & Tina Sweet"
LOCATE 12, 23, 0: PRINT "Version 1.1"
LOCATE 13, 23, 0: PRINT "All rights reserved."
You'd then set the values for MARQUEEPAUSE and call the subroutine:
CH% = 42: BKCLR% = 14: CHCLR% = 14: ROW% = 9
COL% = 21: WIDE% = 55: HIGH% = 6: TOUT! = 5
MARQUEEPAUSE CH%, BKCLR%, CHCLR%, ROW%, COL%, WIDE%, HIGH%, TOUT!
TICKPRINT and TICKERTAPE are variations on a theme. TICKPRINT displays a
message in the center of the screen, printing it one character at a time from
left to right, sounding a single "typewriter click" as each character is
printed, clearing the screen, and starting over again. TICKERTAPE displays a
message that scrolls its way from left to right, simultaneously sounding a
click as each character appears. The message disappears when you press a key.
You might use these routines in different ways--perhaps to focus attention on
a short menu, a help screen, or a message to remind users that they must type
something before the program can continue.
As written, TICKPRINT and TICKERTAPE display yellow text on a black screen,
but you can vary this by changing the values of CHCLR% and BKCLR%, the
variables that control foreground and background color. (See the accompanying
table "Color Values," below.)
For example, you might color-code your messages, displaying error messages in
red text on a white background and help messages in white text on a blue
background. To set up the first color scheme under TICKPRINT, you'd change
TICKPRINT MESSAGE$, 12, 26, 5, 1, 0, 14
to read as follows:
TICKPRINT MESSAGE$, 12, 26, 5, 1, 7, 4
To use the white-on-blue color scheme with TICKERTAPE, you'd change this
TICKERTAPE MESSAGE$, 25, 6, 40, 0, 14
TICKERTAPE MESSAGE$, 25, 6, 40, 1, 7
When you call TICKPRINT and use a value of zero for BKCLR%, the subroutine
uses black as the background color, as you'd expect. When you set CHCLR% to
zero, however, your message appears in a rainbow of colors. If you don't like
that effect and would prefer black as a text color, disable this feature by
deleting the following lines from TICKPRINT:
IF CHCLR% = 0 THEN
IF DOC% < 15 THEN DOC% = DOC% + 1
COLOR DOC%, BKCLR%
IF DOC% = 15 THEN DOC% = 0
Ticking isn't the only "music" FUNSUBS.BAS lets you make. The program's
fourth subroutine, DOSOUND, demonstrates how to add whistles, bomb drops,
beebops, and a siren to any message. These sounds have many uses: For
example, imagine using a bomb drop or a siren to accompany an error message.
Users would know right away that something had gone wrong.
You choose a sound by initializing the parameter variable WHICHSND%, using a
number from 1 to 4. The numbers correspond to those given in DOSOUND's CASE
statement for each sound. You may also tell DOSOUND how many times you want
it to make the sound by initializing the variable HOWMANY%, using a value
from 1 to 100.
Another option is to use DOSOUND within a do...loop construction. In the
following example, for instance, the sound will continue until the user
presses a key:
WHICHSND% = 1: HOWMANY% = 1
DOSOUND WHICHSND%, HOWMANY%
A$ = "": A$ = INKEY$
LOOP WHILE A$ = ""
You can add your own sounds to DOSOUND. To do this, load FUNSUBS.BAS into
QBasic. If you're at the DOS command line, change to the directory containing
FUNSUBS.BAS, then type:
When you press the F2 key, QBasic will display a list of the subroutines in
FUNSUBS.BAS. Highlight the subroutine DOSOUND and press Enter. When QBasic
displays DOSOUND, use the down-arrow key to move the cursor to the beginning
of the line that reads END SELECT, then press Enter. Type the code for the
new sound in the blank space you created. For example, if you want to add a
snippet of arcade "music" to your sound repertoire, insert these lines:
FOR X = 1 TO 20 STEP 2
SOUND 150 * X, .7
FOR X = 30 TO 1 STEP -2
SOUND 50 * X, .7
Save your work. Press F2 and Enter to switch back to the program's main
module. Move the cursor down to this statement:
LOCATE 12, 35: PRINT " "
and press Enter again. Insert the following line into the listing:
DOSOUND 5, 1: SLEEP 1
To test the new sound, press Shift+ F5 to run the program again.
We're confident you can dream up many uses for these versatile subroutines.
And the best part is that you won't have to do much typing to incorporate our
ideas into your code, because we've included a short program, LIB.BAS, which
merges the subroutines in FUNSUBS.BAS with another QBasic program.
Before running LIB.BAS, make sure it and FUNSUBS.BAS are in the same
directory and that you change to that directory. When you run LIB.BAS, it
asks you to type the name of the program to which you want to add the
FUNSUBS.BAS subroutines. (If that program isn't in the current directory, you
may include a directory name.) When you type in the name of your program and
press Enter, LIB.BAS merges the FUNSUBS.BAS routines with your program and
saves the combined program as a file named TEMP.BAS.
You should immediately load TEMP.BAS into QBasic and use QBasic's Save As
command to save TEMP.BAS under a different name to avoid overwriting it the
next time you use LIB.BAS. You may use the name of the program to which
you're adding FUNSUBS.BAS, which overwrites the old version of that program,
or choose a new filename.)
After adding FUNSUBS.BAS to another program, delete any sections of
FUNSUBS.BAS you don't need. First, press F2 to see a list, then highlight the
name of the subroutine to delete and press Alt+D. Delete any other routines
you don't need, then press F2 and Enter to return to the main module. If you
delete any of the FUNSUBS.BAS routines in this way, you should also go to the
beginning of the program and delete the corresponding declare statements.
You may want to take the precaution of storing a backup copy of FUNSUBS.BAS
in a safe place.
Variable Range of Values Description
-------- --------------- -----------
BKCLR% 0-15 background color
CH% 1-6; 8; 14-27; 33-254 ASCII value of character
used in marquee border
CHCLR% 1-15 foreground color
COL% 1-78 column to begin printing
DELAY! 1-100 length of delay to adjust
scrolling or printing speed
HIGH% 1-23 height of border
HOWMANY% 1-100 number of times to sound
MESSAGE$ 1-79 message to print
ROW% 1-25 row to begin printing
SND% 0 or 1 turn sound off (0) and on (1)
TOUT! 1-100 elapsed time (in seconds) before
WHICHSND% 1-4 number of CASE statement
for desired sound
WIDE% 2-16 width of marquee border
Number Color Number Color
------ ----- ------ -----
0* black 8 dark gray
1 blue 9 light blue
2 green 10 light green
3 cyan 11 light cyan
4 red 12 light red
5 magenta 13 light magenta
6 brown 14 yellow
7 white 15 bright white
*In the version of TICKPRINT provided here, selecting a value of zero for a
foreground color tells the routine to display text in a rainbow of colors.