' Vic 20 .prg file viewer Ver 1.46 - Quick BASIC 4.5 (c) L.Davison 2008
' Takes a raw .prg Vic 20 program file and outputs it to the screen and optionally to
' both text and html output files. The text file has special C= characters replaced by
' names in curly braces, e.g. [CTRL]1 which is Black is rendered as {BLK}. With the
' html output file there is the option to display these keys as small, 8 by 8 pixel,
' graphics resembling the actual characters that would be seen in a listing. If html
' graphics are selected then another potion is to add a path string to each image tag
' so that the output html file doesn't need to have the graphics in the same directory.
' All the standard BASIC 2.0 keywords, as well as the Super Expander keywords, are
' supported.
' comments, suggestions, additions, offers of monetary reward etc to ..
'
' leeedavison@googlemail.com
CONST false = 0, true = -1 ' define these
DIM token%(255) ' token flags
DIM token$(255,1) ' token decoder
DIM symbol$(255,1) ' symbol decoder
esc$ = CHR$(27) ' define ESCAPE
quote$ = CHR$(34) ' " as a string
cr$ = CHR$(13) ' [CR] as a string
fe$ = "</FONT>" ' end of <FONT></FONT>
fl$ = "<FONT COLOR=blue>" ' line number font colour
fq$ = "<FONT COLOR=green>" ' quote string font colour
ft$ = "<FONT COLOR=red>" ' token font colour
text% = false ' default to no text output
html% = false ' default to no html output
imgs% = false ' default to no html graphics
ipath$ = "" ' default path for html graphics
istring$ = "<IMG SRC=" ' html graphics ident string
ver$ = "1.46" ' version number string
SCREEN 12 ' 640 x 480 x 16
CLS ' clear it
PRINT "Vic 20 .PRG file reader v"; ver$; ". (c) Lee Davison 2008."
PRINT
GOSUB Initialise ' set up arrays
INPUT "Enter .PRG file name "; filename$ ' get the filename without the .prg
IF filename$ = "" THEN END ' no file then just quit
IF RIGHT$(UCASE$(filename$), 4) = ".PRG" THEN ' ensure no ".prg" end
filename$ = LEFT$(filename$, LEN(filename$) - 4)
END IF
PRINT "Text output file [Y]es/[n]o ?" ' prompt user
DO
DO
key$ = UCASE$(INKEY$) ' get key
LOOP WHILE key$ = "" ' wait for press
IF key$ = cr$ THEN ' user just hit [RETURN]
key$ = "Y" ' so default to yes
END IF
IF key$ = "Y" THEN ' if text wanted
text% = true ' set the flag
END IF
LOOP WHILE (key$ <> "N") AND (key$ <> "Y") ' loop until "N" or "Y"
PRINT "HTML output file [Y]es/[n]o ?" ' prompt user
DO
DO
key$ = UCASE$(INKEY$) ' get key
LOOP WHILE key$ = "" ' wait for press
IF key$ = cr$ THEN ' user just hit [RETURN]
key$ = "Y" ' so default to yes
END IF
IF key$ = "Y" THEN ' if html wanted
html% = true ' set the flag
END IF
LOOP WHILE (key$ <> "N") AND (key$ <> "Y") ' loop until "N" or "Y"
IF html% THEN
PRINT "HTML file graphics [y]es/[N]o ?" ' prompt user
DO
DO
key$ = UCASE$(INKEY$) ' get key
LOOP WHILE key$ = "" ' wait for press
IF key$ = cr$ THEN ' user just hit [RETURN]
key$ = "N" ' so default to no
END IF
IF key$ = "Y" THEN ' if graphics
imgs% = 1 ' set the flag
END IF
LOOP WHILE (key$ <> "N") AND (key$ <> "Y") ' loop until "N" or "Y"
IF imgs% THEN
INPUT "HTML image path or [ENTER] "; ipath$ ' prompt the user
END IF
END IF
GOSUB DoFile ' process the file
COLOR 15 ' white
PRINT "Press any key to exit." ' prompt user
DO
LOOP WHILE INKEY$ = "" ' wait for press
END ' all done, bye.
' process file. open the input file and the output file(s), process the input
' file then close all files as needed
DoFile:
OPEN filename$ + ".prg" FOR BINARY ACCESS READ AS #1
' open the .prg file
IF text% THEN ' if the user wants text output
OPEN filename$ + ".txt" FOR OUTPUT AS #2 ' open the text write file
END IF
IF html% THEN ' if the user wants html output
OPEN filename$ + ".htm" FOR OUTPUT AS #3 ' open the html write file
END IF
i% = 0% ' clear the read index
GOSUB DoStream ' process the byte stream
IF html% THEN ' if the user wanted html output
CLOSE #3 ' close the html output file
END IF
IF text% THEN ' if the user wanted text output
CLOSE #2 ' close the text output file
END IF
CLOSE #1 ' close the input file
RETURN
' process a stream of bytes until no input remains
DoStream:
GOSUB HTMLHeader ' write the html header
GOSUB GetWord ' get the LOAD address
address$ = "LOAD address $" + RIGHT$("000" + HEX$(word&), 4)
PRINT address$ ' print load address to screen
IF html% THEN ' if the user wants html output
PRINT #3, " "; address$ ' print load address to html file
PRINT #3,
END IF
DO
GOSUB DoLine ' do a program line
IF INKEY$ = esc$ THEN ' check for user quit
eoprog% = true ' flag exit if [ESCAPE] pressed
END IF
LOOP WHILE NOT eoprog% ' loop until program end or abort
GOSUB HTMLFooter ' write the html footer
RETURN
' write the header to the html file
HTMLHeader:
IF html% THEN ' if the user wants html output
PRINT #3, "<HTML><HEAD><TITLE>"; filename$;
PRINT #3, ".prg for the Vic 20</TITLE></HEAD>"
PRINT #3, "<BODY>"
PRINT #3, "Program listing of <TT><B>"; filename$;
PRINT #3, ".prg</B></TT> for the Vic 20"
PRINT #3, "<HR>"
PRINT #3, "<PRE>"
END IF
RETURN
' write the footer to the html file
HTMLFooter:
IF html% THEN ' if the user wants html output
PRINT #3, "</PRE>"
PRINT #3, "<HR>"
PRINT #3, "Converted to HTML using <TT><B>";
PRINT #3, "prgread.exe v"; ver$; "</TT></B> by ";
PRINT #3, "<A HREF="; quote$; "mailto:leeedavison";
PRINT #3, "@googlemail.com"; quote$; ">Lee Davison</A>"
PRINT #3, "</BODY></HTML>"
END IF
RETURN
' set the token flag and font colour
HTMLToken:
IF html% THEN ' if the user wants html output
IF NOT oquote% THEN ' if we're not quoting a string
IF token%(byte%) THEN ' if this is a token and ..
IF NOT token% THEN ' .. we're not already doing tokens
PRINT #3, ft$; ' then set the token colour
token% = true ' and flag we're doing tokens
END IF
ELSE ' else if this isn't a token ..
IF token% THEN ' .. and we were doing tokens
PRINT #3, fe$; ' then end the token colour
token% = false ' and flag we're not doing tokens
END IF
END IF
END IF
END IF
RETURN
' set the quote flag and font colour
HTMLQuote:
IF html% THEN ' if the user wants html output
IF oquote% THEN ' if this is a close quote
PRINT #3, byte$; fe$; ' print the quote
ELSE ' else it's an open quote
PRINT #3, fq$; byte$; ' print the quote
END IF
END IF
RETURN
' print the text quote
TEXTQuote:
IF text% THEN ' if the user wants text output
PRINT #2, byte$; ' print the quote
END IF
RETURN
' print the html line number
HTMLLine:
IF html% THEN ' if the user wants html output
PRINT #3, fl$; " "; word$; fe$; ' print a space and the line number
END IF
RETURN
' print the text line number
TEXTLine:
IF text% THEN ' if the user wants text output
PRINT #2, word$; ' print the line number
END IF
RETURN
' print the html byte
HTMLByte:
IF html% THEN ' if the user wants html output
IF oquote% THEN ' if we're quoting a string
html$ = symbol$(byte%, imgs%) ' set the symbol
ELSE
html$ = token$(byte%, imgs%) ' set the token
END IF
IF html$ = "&" THEN ' if it's an apersand
html$ = "&" ' make it an html ampersand
ELSEIF html$ = "<" THEN ' if it's less than
html$ = "<" ' make it an html less than
ELSEIF html$ = ">" THEN ' if it's greater than
html$ = ">" ' make it an html greater than
END IF
IF (LEFT$(html$, 9) = istring$) AND (ipath$ <> "") THEN
' if it's an image tag AND we have
' a path to insert
html$ = istring$ + ipath$ + RIGHT$(html$, LEN(html$) - 9)
' insert the path
END IF
PRINT #3, html$; ' print the html
END IF
RETURN
' print the text byte
TEXTByte:
IF text% THEN ' if the user wants text output
IF oquote% THEN ' if we're quoting a string
PRINT #2, symbol$(byte%, 0); ' print the symbol
ELSE ' else
PRINT #2, token$(byte%, 0); ' print the token
END IF
END IF
RETURN
' print the html new line
HTMLNewline:
IF html% THEN ' if the user wants html output
IF oquote% or token% THEN ' if open quote or token is flagged
PRINT #3, fe$; ' close the font
END IF
PRINT #3, ' print the new line
END IF
RETURN
' print the text new line
TEXTNewline:
IF text% THEN ' if the user wants text output
PRINT #2, ' new line
END IF
RETURN
' do a line from the program, return the EOF flag
DoLine:
GOSUB GetWord ' get the next line pointer
oquote% = false ' not quoting a string
token% = false ' not listing tokens
eoprog% = (word& = 0) ' flag if this is the last line
IF NOT eoprog% THEN ' if not end
isline% = true ' flag if there's a line to do
GOSUB GetWord ' get the line number
word$ = STR$(word&) ' convert to string
word$ = RIGHT$(word$, LEN(word$) - 1) + " " ' shift leading space to trailing
COLOR 1 : PRINT word$; : COLOR 15 ' print the line number
GOSUB TEXTLine ' print text line number
GOSUB HTMLLine ' print html line number
DO
GOSUB GetByte ' get program line byte
GOSUB HTMLToken ' set the html token colour
IF byte% = 0 THEN ' if it's the EOL marker
isline% = false ' flag EOL
ELSEIF byte% = 34 THEN ' if it's open or close quote
COLOR 2 ' blue for the line number
PRINT byte$; ' print the quote
GOSUB TEXTQuote ' do the text quote
GOSUB HTMLQuote ' do the html quote and colour
oquote% = NOT oquote% ' toggle quote flag
ELSE
IF oquote% THEN ' if we're quoting a string
COLOR 2 ' green for quotes
PRINT symbol$(byte%, 0); ' print the symbol
ELSE
IF token%(byte%) THEN ' if it's a token
COLOR 4 ' red for tokens
END IF
PRINT token$(byte%, 0); ' print the token
END IF
GOSUB TEXTByte ' print the html byte
GOSUB HTMLByte ' print the html byte
END IF
COLOR 15 ' back to white
LOOP WHILE isline% ' loop until [EOL]
PRINT ' new line
GOSUB TEXTNewline ' print the text new line
GOSUB HTMLNewline ' print the html new line
END IF
RETURN
' get a byte from the input stream. return the value as a string and a number
GetByte:
byte$ = " " ' one byte long string
GET #1, (i% + 1), byte$ ' get LEN(byte$) bytes
i% = i% + 1% ' increment the index
byte% = ASC(byte$) ' get numeric byte value
RETURN
' get a low byte high byte pair as a word
GetWord:
GOSUB GetByte ' get address low byte
word& = byte% ' copy it
GOSUB GetByte ' get address high byte
word& = word& + (byte% * 256&) ' convert and add it
RETURN
' set up the conversion and flag arrays
Initialise:
RESTORE
' for text or non graphic html
FOR index% = 0 TO 255
READ token$(index%,0) ' read in the token strings
NEXT
FOR index% = 0 TO 255
READ symbol$(index%,0) ' read in the symbol strings
NEXT
' for graphic html
FOR index% = 0 TO 255
READ token$(index%,1) ' read in the token strings
NEXT
FOR index% = 0 TO 255
READ symbol$(index%,1) ' read in the symbol strings
NEXT
' flags for valid token values
FOR index% = 0 TO 255
READ token%(index%) ' read in the token flags
NEXT
' ** tokens **********************************************************************
'$00
DATA "{SYM}","{SYM}","{SYM}","{STOP}","{SYM}","{WHT}","{SYM}","{SYM}"
DATA "{DIS}","{ENA}","{SYM}","{SYM}","{SYM}","{SYM}","{LOWER}","{SYM}"
'$10
DATA "{SYM}","{DOWN}","{RVS ON}","{HOME}","{DEL}","{SYM}","{SYM}","{SYM}"
DATA "{SYM}","{SYM}","{SYM}","{SYM}","{RED}","{RIGHT}","{GRN}","{BLU}"
'$20
DATA " ","!","","#","$","%","&","'"
DATA "(",")","*","+",",","-",".","/"
'$30
DATA "0","1","2","3","4","5","6","7"
DATA "8","9",":",";","<","=",">","?"
'$40
DATA "@","A","B","C","D","E","F","G"
DATA "H","I","J","K","L","M","N","O"
'$50
DATA "P","Q","R","S","T","U","V","W"
DATA "X","Y","Z","[","{POUND}","]","^","{L ARROW}"
'$60
DATA "{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}"
DATA "{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}"
'$70
DATA "{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}"
DATA "{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}"
'$80
DATA "END","FOR","NEXT","DATA","INPUT#","INPUT","DIM","READ"
DATA "LET","GOTO","RUN","IF","RESTORE","GOSUB","RETURN","REM"
'$90
DATA "STOP","ON","WAIT","LOAD","SAVE","VERIFY","DEF","POKE"
DATA "PRINT#","PRINT","CONT","LIST","CLR","CMD","SYS","OPEN"
'$A0
DATA "CLOSE","GET","NEW","TAB(","TO","FN","SPC(","THEN"
DATA "NOT","STEP","+","-","*","/","^","AND"
'$B0
DATA "OR",">","=","<","SGN","INT","ABS","USR"
DATA "FRE","POS","SQR","RND","LOG","EXP","COS","SIN"
'$C0
DATA "TAN","ATN","PEEK","LEN","STR$","VAL","ASC","CHR$"
DATA "LEFT$","RIGHT$","MID$","GO","KEY","GRAPHIC","SCNCLR","CIRCLE"
'$D0
DATA "DRAW","REGION","COLOR","POINT","SOUND","CHAR","PAINT","RPOT"
DATA "RPEN","RSND","RCOLR","RGR","RJOY","RDOT","{SYM}","{SYM}"
'$E0
DATA "{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}"
DATA "{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}"
'$F0
DATA "{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}"
DATA "{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{PI}"
' ** symbol **********************************************************************
'$00
DATA "{SYM}","{SYM}","{SYM}","{STOP}","{SYM}","{WHT}","{SYM}","{SYM}"
DATA "{DIS}","{ENA}","{SYM}","{SYM}","{SYM}","{SYM}","{LOWER}","{SYM}"
'$10
DATA "{SYM}","{DOWN}","{RVS ON}","{HOME}","{DEL}","{SYM}","{SYM}","{SYM}"
DATA "{SYM}","{SYM}","{SYM}","{SYM}","{RED}","{RIGHT}","{GRN}","{BLU}"
'$20
DATA " ","!","","#","$","%","&","'"
DATA "(",")","*","+",",","-",".","/"
'$30
DATA "0","1","2","3","4","5","6","7"
DATA "8","9",":",";","<","=",">","?"
'$40
DATA "@","A","B","C","D","E","F","G"
DATA "H","I","J","K","L","M","N","O"
'$50
DATA "P","Q","R","S","T","U","V","W"
DATA "X","Y","Z","[","{POUND}","]","{U ARROW}","{L ARROW}"
'$60
DATA "{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}"
DATA "{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}"
'$70
DATA "{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}"
DATA "{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}"
'$80
DATA "{SYM}","{C=1}","{SYM}","{RUN}","{SYM}","{F1}","{F3}","{F5}"
DATA "{F7}","{F2}","{F4}","{F6}","{F8}","{SYM}","{UPPER}","{SYM}"
'$90
DATA "{BLK}","{UP}","{RVS OFF}","{CLR}","{INST}","{C=2}","{C=3}","{C=4}"
DATA "{C=5}","{C=6}","{C=7}","{C=8}","{PUR}","{LEFT}","{YEL}","{CYN}"
'$A0
DATA "{^SPC}","{C=K}","{C=I}","{C=T}","{C=@}","{C=G}","{C=+}","{C=M}"
DATA "{C=POUND}","{^POUND}","{C=N}","{C=Q}","{C=D}","{C=Z}","{C=S}","{C=P}"
'$B0
DATA "{C=A}","{C=E}","{C=R}","{C=W}","{C=H}","{C=J}","{C=L}","{C=Y}"
DATA "{C=U}","{C=O}","{^@}","{C=F}","{C=C}","{C=X}","{C=V}","{C=B}"
'$C0
DATA "{^*}","{^A}","{^B}","{^C}","{^D}","{^E}","{^F}","{^G}"
DATA "{^H}","{^I}","{^J}","{^K}","{^L}","{^M}","{^N}","{^O}"
'$D0
DATA "{^P}","{^Q}","{^R}","{^S}","{^T}","{^U}","{^V}","{^W}"
DATA "{^X}","{^Y}","{^Z}","{^+}","{C=-}","{^-}","{^RET}","{C=*}"
'$E0
DATA "{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}"
DATA "{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}"
'$F0
DATA "{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}"
DATA "{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{SYM}","{PI}"
' ** tokens **********************************************************************
'$00
DATA " ","<IMG SRC=81.bmp>"
DATA "<IMG SRC=82.bmp>","<IMG SRC=83.bmp ALT={STOP}>"
DATA "<IMG SRC=84.bmp>","<IMG SRC=85.bmp ALT={WHT}>"
DATA "<IMG SRC=86.bmp>","<IMG SRC=87.bmp>"
DATA "<IMG SRC=88.bmp ALT={DIS}>","<IMG SRC=89.bmp ALT={ENA}>"
DATA "<IMG SRC=8a.bmp>","<IMG SRC=8b.bmp>"
DATA "<IMG SRC=8c.bmp>","<IMG SRC=8d.bmp>"
DATA "<IMG SRC=8e.bmp ALT={LOWER}>","<IMG SRC=8f.bmp>"
'$10
DATA "<IMG SRC=90.bmp>","<IMG SRC=91.bmp ALT={DOWN}>"
DATA "<IMG SRC=92.bmp ALT={RVSON}>","<IMG SRC=93.bmp ALT={HOME}>"
DATA "<IMG SRC=94.bmp ALT={DEL}>","<IMG SRC=95.bmp>"
DATA "<IMG SRC=96.bmp>","<IMG SRC=97.bmp>"
DATA "<IMG SRC=98.bmp>","<IMG SRC=99.bmp>"
DATA "<IMG SRC=9a.bmp>","<IMG SRC=9b.bmp>"
DATA "<IMG SRC=9c.bmp ALT={RED}>","<IMG SRC=9d.bmp ALT={RIGHT}>"
DATA "<IMG SRC=9e.bmp ALT={GRN}>","<IMG SRC=9f.bmp ALT={BLU}>"
'$20
DATA " ","!","","#","$","%","&","'"
DATA "(",")","*","+",",","-",".","/"
'$30
DATA "0","1","2","3","4","5","6","7"
DATA "8","9",":",";","<","=",">","?"
'$40
DATA "@","A","B","C","D","E","F","G"
DATA "H","I","J","K","L","M","N","O"
'$50
DATA "P","Q","R","S","T","U","V","W"
DATA "X","Y","Z","["
DATA "<IMG SRC=2c.bmp ALT={POUND}>","]"
DATA "<IMG SRC=2e.bmp>","<IMG SRC=2f.bmp ALT={LARROW}>"
'$60
DATA "<IMG SRC=40.bmp>","<IMG SRC=41.bmp>","<IMG SRC=42.bmp>","<IMG SRC=43.bmp>"
DATA "<IMG SRC=44.bmp>","<IMG SRC=45.bmp>","<IMG SRC=46.bmp>","<IMG SRC=47.bmp>"
DATA "<IMG SRC=48.bmp>","<IMG SRC=49.bmp>","<IMG SRC=4a.bmp>","<IMG SRC=4b.bmp>"
DATA "<IMG SRC=4c.bmp>","<IMG SRC=4d.bmp>","<IMG SRC=4e.bmp>","<IMG SRC=4f.bmp>"
'$70
DATA "<IMG SRC=50.bmp>","<IMG SRC=51.bmp>","<IMG SRC=52.bmp>","<IMG SRC=53.bmp>"
DATA "<IMG SRC=54.bmp>","<IMG SRC=55.bmp>","<IMG SRC=56.bmp>","<IMG SRC=57.bmp>"
DATA "<IMG SRC=58.bmp>","<IMG SRC=59.bmp>","<IMG SRC=5a.bmp>","<IMG SRC=5b.bmp>"
DATA "<IMG SRC=5c.bmp>","<IMG SRC=5d.bmp>","<IMG SRC=5e.bmp>","<IMG SRC=5f.bmp>"
'$80
DATA "END","FOR","NEXT","DATA","INPUT#","INPUT","DIM","READ"
DATA "LET","GOTO","RUN","IF","RESTORE","GOSUB","RETURN","REM"
'$90
DATA "STOP","ON","WAIT","LOAD","SAVE","VERIFY","DEF","POKE"
DATA "PRINT#","PRINT","CONT","LIST","CLR","CMD","SYS","OPEN"
'$A0
DATA "CLOSE","GET","NEW","TAB(","TO","FN","SPC(","THEN"
DATA "NOT","STEP","+","-","*","/","^","AND"
'$B0
DATA "OR",">","=","<","SGN","INT","ABS","USR"
DATA "FRE","POS","SQR","RND","LOG","EXP","COS","SIN"
'$C0
DATA "TAN","ATN","PEEK","LEN","STR$","VAL","ASC","CHR$"
DATA "LEFT$","RIGHT$","MID$","GO","KEY","GRAPHIC","SCNCLR","CIRCLE"
'$D0
DATA "DRAW","REGION","COLOR","POINT","SOUND","CHAR","PAINT","RPOT"
DATA "RPEN","RSND","RCOLR","RGR","RJOY","RDOT","<IMG SRC=5e.bmp>","<IMG SRC=5f.bmp>"
'$E0
DATA " ","<IMG SRC=61.bmp>","<IMG SRC=62.bmp>","<IMG SRC=63.bmp>"
DATA "<IMG SRC=64.bmp>","<IMG SRC=65.bmp>","<IMG SRC=66.bmp>","<IMG SRC=67.bmp>"
DATA "<IMG SRC=68.bmp>","<IMG SRC=69.bmp>","<IMG SRC=6a.bmp>","<IMG SRC=6b.bmp>"
DATA "<IMG SRC=6c.bmp>","<IMG SRC=6d.bmp>","<IMG SRC=6e.bmp>","<IMG SRC=6f.bmp>"
'$F0
DATA "<IMG SRC=70.bmp>","<IMG SRC=71.bmp>","<IMG SRC=72.bmp>","<IMG SRC=73.bmp>"
DATA "<IMG SRC=74.bmp>","<IMG SRC=75.bmp>","<IMG SRC=76.bmp>","<IMG SRC=77.bmp>"
DATA "<IMG SRC=78.bmp>","<IMG SRC=79.bmp>","<IMG SRC=7a.bmp>","<IMG SRC=7b.bmp>"
DATA "<IMG SRC=7c.bmp>","<IMG SRC=7d.bmp>"
DATA "<IMG SRC=7e.bmp>","<IMG SRC=5e.bmp ALT={PI}>"
' ** symbol **********************************************************************
'$00
DATA " ","<IMG SRC=81.bmp>"
DATA "<IMG SRC=82.bmp>","<IMG SRC=83.bmp ALT={STOP}>"
DATA "<IMG SRC=84.bmp>","<IMG SRC=85.bmp ALT={WHT}>"
DATA "<IMG SRC=86.bmp>","<IMG SRC=87.bmp>"
DATA "<IMG SRC=88.bmp ALT={DIS}>","<IMG SRC=89.bmp ALT={ENA}>"
DATA "<IMG SRC=8a.bmp>","<IMG SRC=8b.bmp>"
DATA "<IMG SRC=8c.bmp>","<IMG SRC=8d.bmp>"
DATA "<IMG SRC=8e.bmp ALT={LOWER}>","<IMG SRC=8f.bmp>"
'$10
DATA "<IMG SRC=90.bmp>","<IMG SRC=91.bmp ALT={DOWN}>"
DATA "<IMG SRC=92.bmp ALT={RVSON}>","<IMG SRC=93.bmp ALT={HOME}>"
DATA "<IMG SRC=94.bmp ALT={DEL}>","<IMG SRC=95.bmp>"
DATA "<IMG SRC=96.bmp>","<IMG SRC=97.bmp>"
DATA "<IMG SRC=98.bmp>","<IMG SRC=99.bmp>"
DATA "<IMG SRC=9a.bmp>","<IMG SRC=9b.bmp>"
DATA "<IMG SRC=9c.bmp ALT={RED}>","<IMG SRC=9d.bmp ALT={RIGHT}>"
DATA "<IMG SRC=9e.bmp ALT={GRN}>","<IMG SRC=9f.bmp ALT={BLU}>"
'$20
DATA " ","!","","#","$","%","&","'"
DATA "(",")","*","+",",","-",".","/"
'$30
DATA "0","1","2","3","4","5","6","7"
DATA "8","9",":",";","<","=",">","?"
'$40
DATA "@","A","B","C","D","E","F","G"
DATA "H","I","J","K","L","M","N","O"
'$50
DATA "P","Q","R","S","T","U","V","W"
DATA "X","Y","Z","["
DATA "<IMG SRC=2c.bmp ALT={POUND}>","]"
DATA "<IMG SRC=2e.bmp ALT={UARROW}>","<IMG SRC=2f.bmp ALT={LARROW}>"
'$60
DATA "<IMG SRC=40.bmp>","<IMG SRC=41.bmp>","<IMG SRC=42.bmp>","<IMG SRC=43.bmp>"
DATA "<IMG SRC=44.bmp>","<IMG SRC=45.bmp>","<IMG SRC=46.bmp>","<IMG SRC=47.bmp>"
DATA "<IMG SRC=48.bmp>","<IMG SRC=49.bmp>","<IMG SRC=4a.bmp>","<IMG SRC=4b.bmp>"
DATA "<IMG SRC=4c.bmp>","<IMG SRC=4d.bmp>","<IMG SRC=4e.bmp>","<IMG SRC=4f.bmp>"
'$70
DATA "<IMG SRC=50.bmp>","<IMG SRC=51.bmp>","<IMG SRC=52.bmp>","<IMG SRC=53.bmp>"
DATA "<IMG SRC=54.bmp>","<IMG SRC=55.bmp>","<IMG SRC=56.bmp>","<IMG SRC=57.bmp>"
DATA "<IMG SRC=58.bmp>","<IMG SRC=59.bmp>","<IMG SRC=5a.bmp>","<IMG SRC=5b.bmp>"
DATA "<IMG SRC=5c.bmp>","<IMG SRC=5d.bmp>","<IMG SRC=5e.bmp>","<IMG SRC=5f.bmp>"
'$80
DATA "<IMG SRC=c0.bmp>","<IMG SRC=c1.bmp ALT={C=1}>"
DATA "<IMG SRC=c2.bmp>","<IMG SRC=c3.bmp ALT={RUN}>"
DATA "<IMG SRC=c4.bmp>","<IMG SRC=c5.bmp ALT={F1}>"
DATA "<IMG SRC=c6.bmp ALT={F3}>","<IMG SRC=c7.bmp ALT={F5}>"
DATA "<IMG SRC=c8.bmp ALT={F7}>","<IMG SRC=c9.bmp ALT={F2}>"
DATA "<IMG SRC=ca.bmp ALT={F4}>","<IMG SRC=cb.bmp ALT={F6}>"
DATA "<IMG SRC=cc.bmp ALT={F8}>","<IMG SRC=cd.bmp>"
DATA "<IMG SRC=ce.bmp ALT={UPPER}>","<IMG SRC=cf.bmp>"
'$90
DATA "<IMG SRC=d0.bmp ALT={BLK}>","<IMG SRC=d1.bmp ALT={UP}>"
DATA "<IMG SRC=d2.bmp ALT={RVSOFF}>","<IMG SRC=d3.bmp ALT={CLR}>"
DATA "<IMG SRC=d4.bmp ALT={INST}>","<IMG SRC=d5.bmp ALT={C=2}>"
DATA "<IMG SRC=d6.bmp ALT={C=3}>","<IMG SRC=d7.bmp ALT={C=4}>"
DATA "<IMG SRC=d8.bmp ALT={C=5}>","<IMG SRC=d9.bmp ALT={C=6}>"
DATA "<IMG SRC=da.bmp ALT={C=7}>","<IMG SRC=db.bmp ALT={C=8}>"
DATA "<IMG SRC=dc.bmp ALT={PUR}>","<IMG SRC=dd.bmp ALT={LEFT}>"
DATA "<IMG SRC=de.bmp ALT={YEL}>","<IMG SRC=df.bmp ALT={CYN}>"
'$A0
DATA " ","<IMG SRC=61.bmp ALT={C=K}>"
DATA "<IMG SRC=62.bmp ALT={C=I}>","<IMG SRC=63.bmp ALT={C=T}>"
DATA "<IMG SRC=64.bmp ALT={C=@}>","<IMG SRC=65.bmp ALT={C=G}>"
DATA "<IMG SRC=66.bmp ALT={C=+}>","<IMG SRC=67.bmp ALT={C=M}>"
DATA "<IMG SRC=68.bmp ALT={C=POUND}>","<IMG SRC=69.bmp ALT={^POUND}>"
DATA "<IMG SRC=6a.bmp ALT={C=N}>","<IMG SRC=6b.bmp ALT={C=Q}>"
DATA "<IMG SRC=6c.bmp ALT={C=D}>","<IMG SRC=6d.bmp ALT={C=Z}>"
DATA "<IMG SRC=6e.bmp ALT={C=S}>","<IMG SRC=6f.bmp ALT={C=P}>"
'$B0
DATA "<IMG SRC=70.bmp ALT={C=A}>","<IMG SRC=71.bmp ALT={C=E}>"
DATA "<IMG SRC=72.bmp ALT={C=R}>","<IMG SRC=73.bmp ALT={C=W}>"
DATA "<IMG SRC=74.bmp ALT={C=H}>","<IMG SRC=75.bmp ALT={C=J}>"
DATA "<IMG SRC=76.bmp ALT={C=L}>","<IMG SRC=77.bmp ALT={C=Y}>"
DATA "<IMG SRC=78.bmp ALT={C=U}>","<IMG SRC=79.bmp ALT={C=O}>"
DATA "<IMG SRC=7a.bmp ALT={^@}>","<IMG SRC=7b.bmp ALT={C=F}>"
DATA "<IMG SRC=7c.bmp ALT={C=C}>","<IMG SRC=7d.bmp ALT={C=X}>"
DATA "<IMG SRC=7e.bmp ALT={C=V}>","<IMG SRC=7f.bmp ALT={C=B}>"
'$C0
DATA "<IMG SRC=40.bmp ALT={^*}>","<IMG SRC=41.bmp ALT={^A}>"
DATA "<IMG SRC=42.bmp ALT={^B}>","<IMG SRC=43.bmp ALT={^C}>"
DATA "<IMG SRC=44.bmp ALT={^D}>","<IMG SRC=45.bmp ALT={^E}>"
DATA "<IMG SRC=46.bmp ALT={^F}>","<IMG SRC=47.bmp ALT={^G}>"
DATA "<IMG SRC=48.bmp ALT={^H}>","<IMG SRC=49.bmp ALT={^I}>"
DATA "<IMG SRC=4a.bmp ALT={^J}>","<IMG SRC=4b.bmp ALT={^K}>"
DATA "<IMG SRC=4c.bmp ALT={^L}>","<IMG SRC=4d.bmp ALT={^M}>"
DATA "<IMG SRC=4e.bmp ALT={^N}>","<IMG SRC=4f.bmp ALT={^O}>"
'$D0
DATA "<IMG SRC=50.bmp ALT={^P}>","<IMG SRC=51.bmp ALT={^Q}>"
DATA "<IMG SRC=52.bmp ALT={^R}>","<IMG SRC=53.bmp ALT={^S}>"
DATA "<IMG SRC=54.bmp ALT={^T}>","<IMG SRC=55.bmp ALT={^U}>"
DATA "<IMG SRC=56.bmp ALT={^V}>","<IMG SRC=57.bmp ALT={^W}>"
DATA "<IMG SRC=58.bmp ALT={^X}>","<IMG SRC=59.bmp ALT={^Y}>"
DATA "<IMG SRC=5a.bmp ALT={^Z}>","<IMG SRC=5b.bmp ALT={^+}>"
DATA "<IMG SRC=5c.bmp ALT={C=-}>","<IMG SRC=5d.bmp ALT={^-}>"
DATA "<IMG SRC=5e.bmp ALT={^RET}>","<IMG SRC=5f.bmp ALT={C=*}>"
'$E0
DATA " ","<IMG SRC=61.bmp>","<IMG SRC=62.bmp>","<IMG SRC=63.bmp>"
DATA "<IMG SRC=64.bmp>","<IMG SRC=65.bmp>","<IMG SRC=66.bmp>","<IMG SRC=67.bmp>"
DATA "<IMG SRC=68.bmp>","<IMG SRC=69.bmp>","<IMG SRC=6a.bmp>","<IMG SRC=6b.bmp>"
DATA "<IMG SRC=6c.bmp>","<IMG SRC=6d.bmp>","<IMG SRC=6e.bmp>","<IMG SRC=6f.bmp>"
'$F0
DATA "<IMG SRC=70.bmp>","<IMG SRC=71.bmp>","<IMG SRC=72.bmp>","<IMG SRC=73.bmp>"
DATA "<IMG SRC=74.bmp>","<IMG SRC=75.bmp>","<IMG SRC=76.bmp>","<IMG SRC=77.bmp>"
DATA "<IMG SRC=78.bmp>","<IMG SRC=79.bmp>","<IMG SRC=7a.bmp>","<IMG SRC=7b.bmp>"
DATA "<IMG SRC=7c.bmp>","<IMG SRC=7d.bmp>"
DATA "<IMG SRC=7e.bmp>","<IMG SRC=5e.bmp ALT={PI}>"
' ** token flags *****************************************************************
DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DATA -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
DATA -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
DATA -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
DATA -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
DATA -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
DATA -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0
DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1
RETURN
|