home *** CD-ROM | disk | FTP | other *** search
- ' ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
- ' ██ TUTORIAL.BAS ██
- ' ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
-
- 'The assumption is made that this file is being read in the QuickBASIC
- 'environment--that's what it was designed for.
-
- 'This file is a working program, with exactly the same code as PULDOWN.BAS,
- 'and, if PULDOWN.QLB is loaded, you can run it anytime. Infact, if you don't
- 'have PULDOWN.QLB loaded, please do so now: exit QB and reload with the
- 'command line:
-
- ' QB /L PULDOWN
- '
- 'This file differs from PULDOWN.BAS only in that it has extensive comments
- 'that show you how how the program works and how to customize.
- 'Just be sure that you save at least one original of this file on a diskette,
- 'and it is highly recommended that you read all the way through the comments
- 'at least once before editing.
- '
-
- 'If you have trouble following some of the explanations, don't fret--customizing
- 'PULDOWN is actually fairly easy. There's a section at the end of this file
- 'that guides you through a customizining session. Search for: STEP BY STEP.
-
- 'Terms used:
-
- ' "Barmenu" is used to indicate the horizontal menu at the top of
- ' of the screen.
- '
- ' "Pulldown" refers to a pulldown window menu such as appears when
- ' you press ALT+F in QB.
- '
- ' "Trigger letter" indicates a character in a pulldown that can be
- ' pressed to instantly activate a menu item without actually moving
- ' to it. They appear in the pulldowns in the opposite color of the
- ' other characters in the menu item. To see an example of a trigger
- ' letter (my terminology), press Alt then ENTER: the O in "Open
- ' Program " is a trigger letter, as are many others in the QB menu.
- '
- ' QB means QuickBASIC in general and the QB Environment in particular.
- ' AL means Assembly Language.
- '
- ' VM and vm are frequently used in variable names. They stand for
- ' Vertical Menu, i.e. pulldown. This might help you in reading the code.
- '
- ' If you're not clear on what a QuickLibrary (QLB) or Library (LIB)
- ' module is, don't despair. A QLB and a LIB that have the same filename
- ' are essentially the same thing. They are binary files that are CALLed
- ' by QB much like subroutines. The crucial difference between them is
- ' that a QLB must be loaded at the same time as QB to work, while a LIB
- ' must be present in the QB path only when you compile BASIC code to
- ' an EXE file.
- '
- ' Other technical terms used here are part of the QuickBASIC vocabulary,
- ' and you should consult your QB manuals and books for them. This text
- ' is written for programmers and a minimal familiarity with programming
- ' terms and concepts is assumed, but some accommodations are made for
- ' the raw beginner.
- '
- 'The presence of an inverse block " ██ " marks crucial information--don't
- 'miss them.
- '
- 'Some of the crucial information is in the last section: END NOTES. Although
- 'crucial, it is not needed while familiarizing yourself with the program.
-
- 'Notice that there's no DEFINT and each number is declared an integer with
- ' n% since there's no way of knowing whether a program that incorporates
- ' PULDOWN won't need other kinds of number declarations.
-
- '"PULL" is the actual name of the Assembly Language routine that is CALLed.
- 'That name cannot be changed, except by aliasing. The names of the variables
- 'that are used before the actual call can be changed (if you enjoy making
- 'trouble for yourself).
-
- 'Program lines are tabbed (except for labels), like the one 5 lines below:
-
- '▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- 'PROGRAM BEGINS:
-
- DECLARE FUNCTION PULL% (BYVAL Inverse%, BYVAL Normal%, BYVAL BarMenu%, BYVAL KeyOff%, BYVAL BarNumber%, BYVAL VM1%, BYVAL VM1A%, BYVAL VM10%, BYVAL VM2%, BYVAL VM2A%, BYVAL VM20%, BYVAL VM3%, BYVAL VM3A%, BYVAL VM30%, BYVAL VM4%, BYVAL VM4A% _
- , BYVAL VM40%, BYVAL VM5%, BYVAL VM5A%, BYVAL VM50%, BYVAL VM6%, BYVAL VM6A%, BYVAL VM60%, BYVAL VM7%, BYVAL VM7A%, BYVAL VM70%)
-
-
- '█ All the code after this point can be put into a Subprogram in your ultimate
- ' program, provided you put a 'CALL MySub'in the main program and restructure
- ' the ensuing code somewhat (like eliminating RETURNs), but that subject is
- ' beyond the scope of this file.
- '█ In any case, the above declaration must be in the main program and at or
- ' near the top.
-
-
- 'This is where the customizing part really starts.
- 'The next cluster of code initializes the barmenu items, of which there
- 'can be no more than seven ██ and there must be no fewer than one.
- '
- '█ All the barmenu items must be in the same string, as in BarMenu$ below.
- '█ Each item MUST be ten spaces long, including blanks.
- '█ The BarNumber% variable must have the total number of barmenu items, in
- ' this case 7.
-
- '█ BarMenuKeys$ holds the first letter of each of the barmenu items. They
- ' must be entered in the exact number, form and order in which they appear
- ' on the menu, with no blank spaces. █ If you change the number or order of
- ' barmenu items, don't forget to change this string and the BarNumber% variable.
- '██ You cannot have the same letter appear twice in BarMenuKeys$ (actually,
- ' you can, but the first instance will be selected every time)
-
- '█ A barmenu item can consist of two or more words, so long as they fit in
- ' ten spaces.
-
-
- BarMenu$ = " English Italian German French Spanish Hellos Quit "
- BarMenu% = SADD(BarMenu$)
- BarMenuKeys$ = "EIGFSHQ"
- KeyOff% = SADD(BarMenuKeys$) 'the 'Off' in KeyOff% stands for offset
- BarNumber% = 7
-
- 'BarMenu section ends
- '▀▀▀▀▀
-
- '█ Normal% is the foreground color of characters. Inverse% is background
- 'color. First we must determine if we're in a mono system or color. The
- 'cluster of code below does that and assigns the colors. Note that only the
- 'last, CASE ELSE clause applies to color. Mixing the foreground and background
- 'colors in a one byte value is a tedious business--if you want to experiment,
- 'round up the usual reference suspects. However, a partial COLOR MIX table is
- 'provided at the end. The only firm rule is that Inverse% and Normal% must be
- 'symmetrical--you can't have red on green for one and green on yellow for the
- 'other.
-
- DEF SEG = 0
- Attr% = PEEK(&H410) 'this is where BIOS stores video state
- SELECT CASE Attr%
- CASE 48 TO 63
- Inverse% = 112 'or &H70 'Compare Attr% to all
- Normal% = 7 'byte numbers that have
- Attr% = 0 'bits 5 & 4 set. If they
- CASE 112 TO 127 'are both set, it means
- Inverse% = 112 'mono, otherwise, color.
- Normal% = 7
- Attr% = 0
- CASE 176 TO 191
- Inverse% = 112
- Normal% = 7
- Attr% = 0
- CASE 240 TO 255
- Inverse% = 112
- Normal% = 7
- Attr% = 0
- CASE ELSE
- Inverse% = 31 'bright white on blue
- Normal% = 121 'bright blue on white
- END SELECT
- DEF SEG
-
- 'The Inverse% and Normal% variables are not used in the BASIC part, they
- 'are strictly parameters to be passed to the AL routine. And yes, there are
- 'several other ways of going about this. Use your favorite method, so long
- 'as the two color values end up properly assigned.
-
- '▄▄▄▄▄▄▄
- 'Pulldown initializiation sets begin:
-
- 'This is where the fun begins. The contents and form of the pulldowns is
- 'determined in the next section of code. Examine the first set, which
- 'initializes the first (leftmost) pulldown. The format will be explained
- 'in the next comment.
-
- VM1% = 4
- VM1A% = 11
- VM1$ = " Hundreds Tho_usands Millions Billions "
- VM10% = SADD(VM1$)
-
- '█ The first value, VM1% determines the number of items in the pulldown,
- ' that is, the number of lines, or depth (excluding the box). You can,
- ' theoretically have as many as 21 lines.
-
- '█ The second value, VMnA%, determines the number of characters in the
- ' item field of the pulldown, including blanks, but excluding the box.
- ' As an example, the item field of the first item in the first pulldown is:
-
- ' " Hundreds "
- '
- ' If you've counted the spaces, it comes out to 12, not eleven. ██ The
- ' field must always be 1 space greater than what is declared in VMn% █
- ' --more on that later.
- ' You can make the pulldowns as wide as you wish, so long as there's room
- ' on the screen. The width of the box (2 spaces) must be taken into
- ' account and the fact that each pulldown begins in the same column as its
- ' corresponding barmenu item. So, on the first pulldown, the item field
- ' can be as wide as 76 spaces, but only 20 on the seventh pulldown.██
-
- ' VMn$ is the string that actually carries the items in a pulldown. They
- ' must all be in the same string, and the field length must be consistent
- ' throughout the string.
-
- ' Finally, VMn0% determines where BASIC stores the string so that PULDOWN.QLB
- ' and PULDOWN.LIB can find it. Leave it alone.
-
- '██ The cluster of pulldown initialization sets must be contiguous and in
- ' ascending order, as they are here, where the VM2 set follows the VM1 set
- ' etc. ██
-
- 'To get a taste of what customizing is like, use the Insert key to change
- 'one of the words below in VM2$ (taking care not to change the length of the
- 'string) then Run (F5) to see the change.
-
- VM2% = 9
- VM2A% = 7
- VM2$ = "Uno Due Tre _QuattroCinque Sei Sette Ot_to Nove "
- VM20% = SADD(VM2$)
-
- 'The VM3 set illustrates the use of Ctrl+Char and Function keys, as displayed
- 'in the line:
-
- '
- 'VM3$ = " Ein...Ctrl+E Z_wei Dr_ei Vier Funf..or F10 "
-
- 'These two keypresses greatly improve speed and convenience in accessing crucial
- 'and often-used program features since they can be used anytime the pulldowns
- 'are active, even if the user is not in the pulldown containing the menu items
- 'in question.
-
- 'ABOUT CTRL+CHAR:
- '~~~~~~~~~~~~~~~
- 'Any letter character can be used but avoid using C--it encourages bad habits.
-
- 'Char can duplicate a trigger letter with a different meaning, for
- 'example Ctrl+e can mean Exit, while trigger key "e" could mean "erase".
-
- 'It is irrelevant whether Char is displayed or pressed in upper or lower
- 'case. PULDOWN will always return the upper case ASCII values.
-
- 'Use restraint with Ctrl+Char--it should be limited to a few letters that the
- 'user can remember easily and are logical, like Ctrl+Q for 'Quit, or Ctrl+F
- 'for File.
-
- 'ABOUT FUNCTION KEYS:
- '~~~~~~~~~~~~~~~~~~~
- 'F11 and F12 are not supported.
-
- 'The Function keys are most useful for commands that are in effect throughout
- 'the program--not just during the menu, like "save what I've entered so far,"
- 'or "let's start over".
-
- VM3% = 5
- VM3A% = 13
- VM3$ = " Ein...Ctrl+E Z_wei Dr_ei Vier Funf..or F10 "
- VM30% = SADD(VM3$)
-
- 'You may have noticed that some of the items are broken up by underscores,
- 'as in " Vingt et deu_x " below. That's what makes a trigger letter.
- 'When a pulldown with a trigger letter is activated, pressing a trigger
- 'letter calls that menu function without need of arrow keys or ENTER.
-
- ' ██ An underscore must precede the trigger letter. Items that do not have
- ' a trigger letter must have an extra blank space to maintain the uniformity
- ' of field length. (That's why declared field length is one less than actual)
-
- ' ██ There is a limit of 5 trigger letters per pulldown.
- ' ██ You cannot duplicate a trigger letter within the same pulldown, but
- ' you can have the same trigger letter in different pulldowns.
-
- VM4% = 3
- VM4A% = 20 '
- VM4$ = "Vingt et un Vingt et deu_x Vingt et trois "
- VM40% = SADD(VM4$)
-
- VM5% = 4
- VM5A% = 14
- VM5$ = "Ciento Ciento y _uno Ciento y _dos Cien_to y tres "
- VM50% = SADD(VM5$)
-
- ' █ You can have as few as 1 pulldown or a as many as 7,██ but make sure
- ' that the BarNumber% variable reflects the number.
-
- ' █ A reminder: as you get to the higher pulldowns, be mindful of how many
- ' screen columns are left.
-
- VM6% = 3
- VM6A% = 16
- VM6$ = " Hello, there Live long and Prosper. "
- VM60% = SADD(VM6$)
-
- 'Notice that each barmenu item must have a pulldown, even if only one line
- 'deep. ██ You cannot have a barmenu item without a pulldown:
-
- VM7% = 1 'one item
- VM7A% = 13
- VM7$ = " _Quit...Esc "
- VM70% = SADD(VM7$)
-
- 'The cluster of pulldown initialization sets end here.
- 'All the code that follows is optional, except for the actual CALL PULL
-
- CLS
-
- '█ If you wish to add any features to the menu screen, like the name of the
- ' program--as is done here, or a frame around the screen, do so before █
- ' calling PULL:
-
- LOCATE 2, 34
- SELECT CASE Attr%
- CASE 0
- COLOR 0, 7
- CASE ELSE
- COLOR 7, 1 'white on blue
- END SELECT
-
- PRINT " PULDOWN.BAS "
- COLOR 7, 0
-
-
- 'Here PULDOWN is actually called as a function named PULL. Its return value
- 'is put into RETVAL%, but you may change that.
- 'Notice that the list of parameters is exceedingly long. Be careful you don't
- 'chop it off during the editing process. Also there is no actual CALL in the
- 'call--the word is used in the text for clarity.
-
-
- RETVAL% = PULL%(Inverse%, Normal%, BarMenu%, KeyOff%, BarNumber%, VM1%, VM1A%, VM10%, VM2%, VM2A%, VM20%, VM3%, VM3A%, VM30%, VM4%, VM4A%, VM40%, VM5%, VM5A%, VM50%, VM6%, VM6A%, VM60%, VM7%, VM7A%, VM70%)
-
- 'Before returning control to the main program, PULL erases the active
- 'pulldown, returns the barmenu to its "rest" state, and restores the screem
- 'below the barmenu to its pre-CALL condition.
-
- 'PULL returns four kinds of values:
-
- ' The first type consists exclusively of the number 1. This indicates
- ' that the user has pressed ESC, and exited the menu without taking
- ' action.
-
- ' The second type indicates that Ctrl+Char has been pressed, and returns
- ' a value between 64 and 90, which are ASCII codes except that 64
- ' indicates that a non-letter key has been pressed.
- ' (Again: Char may be pressed with or without Shift, but is returned
- ' as if with)
- ' █ In the 65-90 range, only the ones that you designate in the menu
- ' are actually valid. Identifying valid characters is done in the BASIC
- ' part of the program, as shown below.
-
- ' The third type returns values between 159 and 168, and represent
- ' Function Keys 1 through 10. Each of these numbers is actually the scan
- ' code of the key plus 100 (i.e.: F1 = 59 + 100 = 159)
-
- ' Values that are greater than 168 (and usually they will be >10,000)
- ' are the fourth type: the offset within the data segment
- ' of the menu item that was selected. This will by far the most common
- ' return value. It is the address in memory of the menu item, and is
- ' rendered useful by means of PEEKs, as shown below.
- '
- 'To see how the Return Value works, use the QB Debug menu to AddWatch: RETVAL%.
- 'Make the next line of code below a breakpoint, and run the program four times.
- 'The first time, press Esc in the menu; the second time, Ctrl+Char; the third
- 'time, an F-Key, and finally select a menu item either with ENTER or with a
- 'trigger key. Each time, as QB hits the breakpoint, look at RETVAL%.
-
- 'Once PULDOWN has returned a value, its job is essentially over. Making something
- 'useful out that single number is the programmer's job--your job, and
- 'how you do it depends on your program requirements, and your programming
- 'style. What follows is a sparse but wide-ranging example of how it can be
- 'handled. These are only suggestions.
-
- LOCATE 5, 1
-
- 'First, check for ESC, Ctrl, and F-Keys
-
- SELECT CASE RETVAL%
- CASE 1
- GOTO Last 'Yes, it's ESC
- CASE 2 TO 68
- GOTO BadKey 'don't want these
- CASE 69
- GOTO IsCtrl 'we want this one -- CHR$(69) = E
- CASE 70 TO 167
- GOTO BadKey 'don't want these
- CASE 168
- GOTO IsFKey 'F10
- END SELECT
-
- 'If it's not ESC or Ctrl+Char, then the user must have selected one of the menu
- 'items. We must find out which one by retrieving the selected string and
- 'comparing it with all the possibilities.
-
- 'The essence of my way of doing that is in the first line of the FOR/NEXT
- 'loop: we PEEK at RETVAL% and convert it to an ASCII CHR$. Then we add 1 to
- 'RETVAL%, and repeat the whole process as many times as it takes to get
- 'enough letters to identify the menu item. I have selected four characters.
- 'Infact, three should be plenty, but many menu items start with a blank
- 'because it looks better. If you will consistently have a blank in the first
- 'position, you can start the loop with RETVAL% + 1, and loop three times. Just
- 'be careful that each three-letter combination is unique--you wouldn't want
- 'to confuse "File" with "Fill Screen," for example--a four-loop PEEK would
- 'be needed to distinguish between these two.
-
- 'Rather than concatenating (Final$ = A$ + B$ + C$), I am using a supposedly
- 'faster method: setting up a blank string of the proper length (RETVAL$),
- 'then filling it in with MID$:
-
- RETVAL$ = " "
-
- FOR RT% = 1 TO 4
- MID$(RETVAL$, RT%, 1) = CHR$(PEEK(RETVAL%))
- RETVAL% = RETVAL% + 1
- NEXT
-
- 'Here too you might want to set up a breakpoint and a Watch, Run, and see
- 'what RETVAL$ looks like after you select a menu item.
-
- 'Now comes the laborious part. The return string must be compared with
- 'with each menu item. In this sample program, only a few of the total
- 'items are compared. A working program will have as many CASEs as there
- 'are pulldown items.
-
- 'There are a few things to watch out for. The comparison string must be
- 'of the same length as the retrieved string. It must be exactly as it appears
- 'in its declared form, not its display form, including initial blanks
- '(unless you retrieve at RETVAL% + n), but █ most important, it means including
- 'any underscores, as in "_Qu":
-
- SELECT CASE RETVAL$
- CASE " Hel" 'notice leading blank...
- GOSUB greeting
- CASE "Uno " '...but none here
- GOSUB italian
- CASE " Z_w" 'Include underscore!
- GOSUB deutsch
- CASE "Ving"
- GOSUB francais
- CASE " _Qu" '(Quit)
- GOTO Last
- CASE ELSE
- GOTO AnyKey
- END SELECT
- GOTO Last
-
- '(Please note that many of the items in the sample menu start with the
- ' same syllable, but that would rarely be the case in a "real" menu)
-
- 'And here is the payoff. In a working program of course, a menu selection
- 'will usually branch to something more than just printing a message, but
- 'this does illustrate how to get to the actual work:
-
- 'This next section handles the first three types of Return Value:
-
- AnyKey:
- PRINT "You have selected "; RETVAL$
- GOTO Last
- IsCtrl:
- PRINT "You have pressed Ctrl+e and selected 'Ein'"
- GOTO Last
-
- '█ Note that PULDOWN cannnot tell what menu item was selected when Ctrl+Char
- ' is pressed. That determination is made on the basis that each instance is
- ' associated with a particular menu item in the BASIC code: if Ctrl+e has
- ' been pressed, then it MUST be 'Ein'.
-
- '...and the same goes for the Function keys:
-
- IsFKey:
- PRINT "You have pressed F10 and selected 'Funf'"
- GOTO Last
- BadKey:
- PRINT "You have pressed an unassigned key"
-
- Last:
- END
-
- 'And here are handled the selected "working" menu items:
-
- greeting:
- COLOR 16, 7
- PRINT "Hello Hello"
- WHILE INKEY$ = "": WEND
- COLOR 7, 0
- RETURN Last
- italian:
- COLOR 0, 7
- PRINT "MA CHE, SCHERZI?"
- WHILE INKEY$ = "": WEND
- COLOR 7, 0
- RETURN Last
- deutsch:
- COLOR 16, 7
- PRINT "Ein VolksMenu. Wunderbar!"
- COLOR 7, 0
- RETURN Last
- francais:
- COLOR 1, 0
- PRINT "Yo, alouette..."
- COLOR 7, 0
- RETURN Last
-
-
- 'PROGRAM ENDS
-
- '▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- 'STEP BY STEP:
-
- 'Now we will go through a step-by-step exercise in customizing one of the
- 'pulldowns. We will change the VM6 set "Hellos" to "List" consisting of
- 'these items: First, Second, Third, Fourth, Fifth, Sixth.
- 'This is what the original set looks like:
-
- ' VM6% = 3
- ' VM6A% = 16
- ' VM6$ = " Hello, there Live long and Prosper. "
- ' VM60% = SADD(VM6$)
- '
- 'First, we will change VM6% (depth) to 6, because that's how many items we have.
- 'Then we change VM7% (width) to 8 because the longest item is six letters long,
- 'and we want (at least) one blank space at either end just for esthetics.
- 'Then we edit the VM6 string to the new items, making sure that each field
- 'has 9 spaces (item length + 1, remember?).
-
- '(Be careful with the length of the item fields. The Insert key and the QB
- 'Cut + Paste feature really come in handy for this kind of editing)
-
- 'Then we also want to make "First" a trigger item, so we put an underscore
- 'before the "F".
- 'This is what we end up with:
-
- ' VM6% = 6
- ' VM6A% = 8
- ' VM6$ = " _First Second Third Fourth Fifth Sixth "
- ' VM60% = SADD(VM6$)
-
- 'Now we simply delete the original VM6 set and cut and paste the new one in
- '(remembering to eliminate the comment quotes)
- 'If we run the program at this point, our new menu will be there, but its
- 'barmenu item will still read "Hellos". So we change
-
- ' BarMenu$ = " English Italian German French Spanish Hellos Quit "
- '
- 'to:
- '
- ' BarMenu$ = " English Italian German French Spanish List Quit "
- '
- 'and we change
- '
- ' BarMenuKeys$ = "EIGFSHQ"
- '
- ' to:
- '
- ' BarMenuKeys$ = "EIGFSLQ"
- '
-
- 'Voilá! That's all there is to it. But let's take the example a little
- 'further, and say that "List" will be the last item on the barmenu. So we
- 'delete the VM7 set ("Quit")...
- '
- '...and we change
- '
- 'BarNumber% = 7 to BarNumber% = 6
- '
- 'and we go back to BarMenuKeys$ and change it to: EIGFSL
- '
- 'That's all there is to it. Follow these steps and you can customize PULDOWN
- 'to your CPU's content, so long as you stay within the stated constraints.
-
- '▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- 'END NOTES
-
- 'PULDOWN's generated menu will always start at Row 1, Column 1. That cannot
- 'be changed, except at the source code level. It is, after all, meant to be
- 'a main menu. But if there is demand for making the starting position a
- 'variable, I might be talked into it.
-
- 'The sum of all the characters and spaces in all the pulldown menus
- 'cannot exceed 1000. This is the equivalent of seven pulldown menus, each
- 'ten lines deep and 13 characters wide. That's large enough to go beyond
- 'practicality. But if you should get to the point where you need to figure out
- 'precisely how many bytes your menu takes, here's how to do it:
- '
- ' In each pulldown set, add 1 to the VMnA% variable, then multiply
- ' it by the VMn1% variable.
- '
- ' Repeat this procedure for each set, then add them up.
- '
- ' Example: (VM1A% + 1) * VM1%
- ' ( 11 + 1) * 4 = 48
- ' Repeating this step with each VM set and adding the results
- ' yields 378 for the current set of pulldowns.
-
- 'There may be occasions when, after the user has selected a menu item, you
- 'want to keep the barmenu at the top of the screen, and the "active" barmenu
- 'item in reverse color, just as QuickBASIC does when you select something
- 'from the "File" menu. PULDOWN cannot do this for you, because it's finished.
- 'You must overwrite the barmenu item with LOCATE, COLOR and PRINT commands.
-
- 'PULDOWN disables the Ctrl+C feature while it is in effect, so the user cannot
- 'blow the menu and the whole program. The only way to get out of the menu is
- 'to select an item or press ESC. However, when running in QB, Ctrl+Break
- 'will return you to the environment.
-
- 'COLOR MIX TABLE (partial):
-
- ' Blue on Yellow 97
- ' Yellow on Blue 22
-
- ' Bright blue on yellow 105
- ' Bright yellow on blue 22
-
- ' Bright blue on red 73
- ' Bright red on blue 28
-
- ' Magenta on green 45
- ' Green on magenta 90
-
- ' Red on white 124
- ' White on red 79
-
- ' Blue on white 113
- ' White on blue 23
-
- ' Bright blue on white 121 'default setting
- ' Bright white on blue 31
-
- ' etc.
-
- 'EOF
-
-