Home » Archimedes archive » Acorn User » AU 1997-10 A.adf » Extras » Apple][e/PD/PIC/!PICbasic/!RunImage

Apple][e/PD/PIC/!PICbasic/!RunImage

This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.

Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.

Tape/disk: Home » Archimedes archive » Acorn User » AU 1997-10 A.adf » Extras
Filename: Apple][e/PD/PIC/!PICbasic/!RunImage
Read OK:
File size: 5633 bytes
Load address: 0000
Exec address: 0000
File contents
   10REM PIC 16CXX series assembler
   20REM Accepts tokenised BASIC files
   30PRINT"PIC Assembler V0.98 (C)SPROW 1997"'
   40*KEY 9 CHAIN"ADFS::RiscHD.$.Language.BasicV.PICs.K2Project.K2sauce"
   50:
   60REM Globals to reset on power up,the rest are reset for each new file
   70source$="":REM The filename to read from
   80loaded%=FALSE:REM Boolean flag as to whether a valid program is 'loaded'
   90opcount%=0:REM No. PIC opcodes in DATA statements
  100keycount%=8:REM Number of supported direct mode commands
  110PROCreset:REM These are all reset for every file too
  120:
  130REM Count the table length
  140REPEAT:READbit$,mnemonic$,meaning$:opcount%=opcount%+1:UNTILmnemonic$="[[["
  150RESTORE
  160allow%=128
  170DIM bit$(opcount%),mnemonic$(opcount%),meaning$(opcount%+keycount%)
  180DIM jumpto%(28),token$(127),keyword$(keycount%)
  190DIM string$(allow% DIV8),integer%(allow% DIV4),real(allow%),name$(allow%*2)
  200:
  210FORdata%=1TOopcount%
  220READbit$(data%),mnemonic$(data%),meaning$(data%)
  230IFLEFT$(mnemonic$(data%),1)<>delta$ THENjumpto%(1+ASC(delta$)-64)=data%:jumpto%(ASC(LEFT$(mnemonic$(data%),1))-64)=data%:delta$=LEFT$(mnemonic$(data%),1)
  240NEXT:REM Build a table linking 1st mnemonic letters to array elements
  250:
  260REPEAT
  270READtoken$:tokennum%=EVAL("&"+LEFT$(token$,2))
  280token$(tokennum%-128)=RIGHT$(token$,LEN(token$)-2)
  290UNTILLEFT$(token$,2)="FF"
  300:
  310FORdata%=1TOkeycount%
  320READkeyword$(data%),meaning$(opcount%+data%)
  330NEXT
  340:
  350ONERRORREPORT:PRINTERL:CLOSE#0
  360REPEAT
  370INPUTLINE">"command$
  380command$=FNstripleft(command$):found%=FALSE
  390IFLEFT$(command$,4)="HELP" THENfound%=FNhelp(RIGHT$(command$,LEN(command$)-4))
  400IFLEFT$(command$,5)="CHAIN" THENfound%=FNchain(RIGHT$(command$,LEN(command$)-5))
  410IFLEFT$(command$,4)="LOAD" THENfound%=FNload(RIGHT$(command$,LEN(command$)-4)):found%=TRUE
  420IFLEFT$(command$,4)="LIST" THENfound%=FNlist(RIGHT$(command$,LEN(command$)-4))
  430IFLEFT$(command$,4)="QUIT" THENfound%=FNquit(RIGHT$(command$,LEN(command$)-4))
  440IFLEFT$(command$,3)="RUN" THENfound%=FNrun(RIGHT$(command$,LEN(command$)-3))
  450IFLEFT$(command$,3)="CLS" THENfound%=FNcls(RIGHT$(command$,LEN(command$)-3)):found%=TRUE
  460IFLEFT$(command$,4)="STOP" THENfound%=NOT(FNstop(RIGHT$(command$,LEN(command$)-4)))
  470IFLEFT$(command$,1)="*" THENfound%=TRUE:OSCLI(RIGHT$(command$,LEN(command$)-1))
  480IFfound%=FALSE ANDLENcommand$>0 THENPRINT'"Command not supported"
  490UNTILFNnowild(command$," ")="QUIT"
  500END
  510:
  520DEFFNquit(parameter$)
  530IFFNnowild(parameter$," ")<>"" THENPRINT'"Syntax error":=TRUE
  540OSCLI("SAVE from098 "+STR$~(code%)+" +"+STR$~(2*FNfindvalue("P%"))+" 0 FFFFF800")
  550=TRUE
  560:
  570DEFFNrun(parameter$)
  580IFFNnowild(parameter$," ")<>"" THENPRINT'"Syntax error":=TRUE
  590IFloaded%=FALSE THENPRINT'"No program loaded":=TRUE
  600=FNchain(CHR$34+source$+CHR$34)
  610:
  620DEFFNhelp(parameter$)
  630LOCALdata%,found%,mnemonic$
  640parameter$=FNnowild(parameter$," ")
  650REM Asking for help in general
  660IFparameter$="" THENPRINT"Help is available on the following:"'"HELP <assembler mnemonic>"'"HELP <command>"'"HELP .":=TRUE
  670REM Look through keywords first
  680IFparameter$="." THENVDU14:PRINT"Help with direct mode keywords:"
  690FORdata%=1TOkeycount%
  700IFparameter$=LEFT$(keyword$(data%),LEN(parameter$)) ORparameter$="." THENPRINTkeyword$(data%);" - ";meaning$(opcount%+data%):found%=TRUE:REM All help support
  710NEXT
  720REM Is it a mnemonic?
  730IFparameter$="." THENPRINT'"Help with the assembler:"
  740parameter$=FNucase(parameter$)
  750FORdata%=1TO(opcount%-1)
  760mnemonic$=FNfindwild(1,mnemonic$(data%)," ")
  770IFparameter$=LEFT$(mnemonic$,LEN(parameter$)) ORparameter$="." THENPRINTmnemonic$(data%);" - ";meaning$(data%):found%=TRUE:REM All help support
  780NEXT
  790IFfound%=FALSE THENPRINT'"No help available on that topic" ELSEVDU15
  800=TRUE
  810:
  820DEFFNload(parameter$)
  830parameter$=FNstripright(FNstripleft(parameter$)):PROCreset
  840REM Check for opening ditto
  850IFLEFT$(parameter$,1)<>CHR$34 THENPRINT'"No such variable":=FALSE
  860REM Check for closing ditto
  870lastditto%=INSTR(RIGHT$(parameter$,LEN(parameter$)-1),CHR$34)
  880IFlastditto%=0 THENPRINT'"Missing "+CHR$34:=FALSE
  890REM Look for anymore text on the line
  900IF(lastditto%+1)<>LENparameter$ THENPRINT'"Syntax error":=FALSE
  910in%=OPENIN MID$(parameter$,2,LEN(parameter$)-2)
  920IFin%=0 THENPRINT'"File not found":=FALSE
  930IFBGET#in%<>13 THENPRINT'"Bad program":loaded%=FALSE:CLOSE#in%:=FALSE
  940PTR#in%=(EXT#in%)-1
  950IFBGET#in%<>255 THENPRINT'"Bad program":loaded%=FALSE:CLOSE#in%:=FALSE
  960loaded%=TRUE:CLOSE#in%:source$=MID$(parameter$,2,LEN(parameter$)-2)
  970=TRUE
  980:
  990DEFFNlist(parameter$)
 1000REM List a program onto the screen
 1010LOCALlinenum$,linenum%,minline%,maxline%,rangehi$,rangelo$,byte%
 1020IFloaded%=FALSE THENPRINT'"No program loaded":=TRUE
 1030REM Read any options given
 1040parameter$=FNnowild(parameter$," ")
 1050rangelo$=FNfindwild(1,parameter$,","):rangehi$=FNfindwild(2+LENrangelo$,parameter$,",")
 1060REM Now work out which lines are reqd
 1070IFrangehi$="" ANDINSTR(parameter$,",")=0 THENrangehi$=rangelo$
 1080IFrangehi$="" ANDINSTR(parameter$,",")<>0 THENrangehi$="&8000"
 1090IFparameter$="," THENrangelo$="0"
 1100IFrangehi$+rangelo$="" THENmaxline%=&8000 ELSEminline%=EVALrangelo$:maxline%=EVALrangehi$
 1110pointer%=1:in%=OPENINsource$:PTR#in%=1:VDU11:REM Backup one line,and skip past opening &0D
 1120REPEAT
 1130byte%=BGET#in%:REM The hi byte of the line number
 1140linenum%=(byte%*256)+BGET#in%:linenum$=STRING$(5-LEN(STR$(linenum%))," ")+STR$(linenum%)
 1150REM BeEVALsilent if not in listing range
 1160IF(linenum%>=minline%)AND(linenum%<=maxline%) THENPRINT'linenum$;
 1170pointer%=pointer%+3:PTR#in%=pointer%
 1180IF(linenum%<minline%)OR(linenum%>maxline%) THENREPEAT:byte%=BGET#in%:UNTILbyte%=13:PTR#in%=PTR#in%-1:pointer%=PTR#in%
 1190REPEAT
 1200byte%=BGET#in%
 1210IFbyte%<127 THENVDUbyte% ELSEPRINT;FNunpacktoken(byte%);
 1220pointer%=pointer%+1
 1230UNTILbyte%=13 ORpointer%>=(EXT#in%-1)
 1240UNTILpointer%>=(EXT#in%-1) ORlinenum%>maxline%
 1250PRINT:CLOSE#in%
 1260=TRUE
 1270:
 1280DEFFNchain(parameter$)
 1290LOCALwork$,result%,maxline%,data%,length%
 1300IFFNload(parameter$)=FALSE THEN=TRUE
 1310in%=OPENINsource$:length%=(EXT#in%)-2:maxline%=1
 1320REM Now,repeatedly select the interpretter
 1330REPEAT
 1340 work$="":PTR#in%=PTR#in%+2+SGNmaxline%:maxline%=BGET#in%-4
 1350 FORdata%=1TOmaxline%:work$=work$+CHR$(BGET#in%):NEXT
 1360 IFINSTR("[]",LEFT$(work$,1))<>0 THENinasm%=SGN(ASCwork$-ASC"]")
 1370 IFinasm%=FALSE THENresult%=FNinbasic(work$) ELSEresult%=FNinasm(work$)
 1380UNTILPTR#in%=length% ORresult%=0
 1390CLOSE#in%
 1400=TRUE
 1410:
 1420REM ****INTERPRETTERS****
 1430:
 1440DEFFNinbasic(string$)
 1450REM Only keywords allowed outside assembler are REM,FOR,TO,STEP,DIM,NEXT,CLS,STOP,END
 1460LOCALbyte%,token$,work$
 1470byte%=ASC(LEFT$(string$,1))
 1480work$=FNfindwild(1,string$,":")
 1490IFbyte%>127 ANDbyte%<>&8D THENtoken$=FNunpacktoken(byte%) ELSEtoken$=CHR$byte%
 1500IFtoken$="REM" ORINSTR(":]"+CHR$13,token$)<>0 THEN=TRUE:REM Empty and comment line support
 1510IFtoken$="=" THENPRINT'"No FN":=FALSE
 1520IFLENtoken$=1 THENPROCassignvariable(work$):=TRUE
 1530IFtoken$="NEXT" THEN=FNnext(work$)
 1540IFtoken$="FOR" THEN=FNfor(work$)
 1550IFtoken$="DIM" THEN=FNdim(work$)
 1560IFtoken$="CLS" THEN=FNcls(work$)
 1570IFtoken$="STOP" THEN=FNstop(work$)
 1580IFtoken$="END" THEN=FALSE ELSEPRINT'"Command not supported":=FALSE
 1590:
 1600DEFFNcls(string$)
 1610work$=FNnowild(RIGHT$(string$,LENstring$-1)," ")
 1620IFwork$<>"" THENPRINT'"Syntax error":=FALSE ELSECLS:=TRUE
 1630:
 1640DEFFNstop(string$)
 1650work$=FNnowild(RIGHT$(string$,LENstring$-1)," ")
 1660IFwork$<>"" THENPRINT'"Syntax error" ELSEPRINT'"STOP"
 1670=FALSE
 1680:
 1690DEFFNnext(string$)
 1700LOCALstep%,limit%,for%,name$,work$
 1710REM Check for 'NEXT,' and 'NEXT <variable>' constructs
 1720work$=FNnowild(RIGHT$(string$,LENstring$-1)," ")
 1730IFfor$="" ORINSTR(work$,",")<>0 THENPRINT'"No FOR":=FALSE
 1740name$=FNfindwild(1,for$,",")
 1750IFwork$<>"" ANDname$<>work$ THENPRINT'"Can't Match FOR":=FALSE
 1760REM Get the FOR parameters from the stack
 1770limit%=EVAL(FNfindwild(2+LENname$,for$,":"))
 1780step%=EVAL(FNfindwild(3+LENname$+LEN(STR$limit%),for$,";"))
 1790pointer%=EVAL(RIGHT$(for$,LENfor$-INSTR(for$,";")))
 1800for%=FNfindvalue(name$)+step%
 1810PROCassignvariable(name$+"="+STR$(for%))
 1820IFfor%>limit% THENfor$="":pointer%=PTR#in% ELSEPTR#in%=pointer%
 1830=TRUE
 1840:
 1850DEFFNfor(string$)
 1860LOCALlimit%,step%,lttr$
 1870REM Assume a STEP of 1 if not told otherwise
 1880IFfor$<>"" THENPRINT'"Too many FORs":=FALSE
 1890IFINSTR(string$,CHR$&88)=0 THENstring$=string$+CHR$&88+"1"
 1900IFINSTR(string$,CHR$&B8)=0 THENPRINT'"No TO":=FALSE
 1910string$=FNstripleft(RIGHT$(string$,LENstring$-1))
 1920REM Add variable to table and FOR stack
 1930lttr$=FNfindwild(1,string$,CHR$&B8):PROCassignvariable(lttr$)
 1940limit%=FNsetnum(FNfindwild(2+LEN(lttr$),string$,CHR$&88))
 1950step%=FNsetnum(RIGHT$(string$,LENstring$-INSTR(string$,CHR$&88)))
 1960REM Of the form "variable,limit.step;addr"
 1970for$=FNfindwild(1,string$,"=")+","+STR$limit%+":"+STR$step%+";"+STR$PTR#in%
 1980=TRUE
 1990:
 2000DEFFNdim(string$)
 2010REM Reserve memory,returning TRUE if successful
 2020LOCALname$,amount$
 2030string$=FNstripleft(RIGHT$(string$,LENstring$-1))
 2040name$=FNfindwild(1,string$,"% "):REM Either is the separator
 2050IFMID$(string$,1+LENname$,1)="%" THENname$=name$+"%"
 2060amount$=FNfindwild(1+LENname$,string$,":")
 2070IFname$="" ANDamount$="" THENPRINT'"Bad DIM":=FALSE
 2080IFname$="" ORamount$="" THENPRINT'"No such variable":=FALSE
 2090DIMcode% 2*FNsetnum(amount$):REM Get twice as much due to 14 bit program bus
 2100PROCassignvariable(name$+"="+STR$code%)
 2110=TRUE
 2120:
 2130DEFFNinasm(string$)
 2140LOCALdata%,byte%,found%,initial%,mnemonic$,work$
 2150REM Tokens found inside the assembler are merely unpacked
 2160FORdata%=1TOLENstring$
 2170byte%=ASC(MID$(string$,data%,1))
 2180IFbyte%>127 ANDbyte%<>&8D THENstring$=LEFT$(string$,data%-1)+FNunpacktoken(byte%)+RIGHT$(string$,LENstring$-data%)
 2190NEXT
 2200IFLEFT$(string$,1)="." THEN=FNassignlabel(string$)
 2210IFLEFT$(string$,1)="[" THENstring$=RIGHT$(string$,LENstring$-1)
 2220work$=FNucase(string$):REM Speeds up mnemonic testing later
 2230IFINSTR(work$,"OPT")=1 THEN=FNoption(string$)
 2240IFINSTR(work$,"EQU")=1 THENPRINT'"Silly":=FALSE:REM Not allowed data on the program bus,silly
 2250initial%=ASC(LEFT$(work$,1))
 2260IFinitial%>ASC"Z" ORinitial%<ASC"A" THEN=TRUE:REM Empty and comment line support
 2270REM Use lookup table until 'mnemonic$=string in program',then work out the parameters
 2280found%=jumpto%(initial%-64)-1
 2290REPEAT:found%=found%+1
 2300mnemonic$=LEFT$(mnemonic$(found%),INSTR(mnemonic$(found%)," ")-1)
 2310UNTILmnemonic$=LEFT$(work$,LEN(mnemonic$)) ORfound%=jumpto%(1+initial%-64)
 2320IFmnemonic$<>LEFT$(work$,LEN(mnemonic$)) THENPRINT'"No such mnemonic":=FALSE
 2330=FNasmparms(found%,string$)
 2340:
 2350DEFFNasmparms(pointer%,string$)
 2360LOCALwork$,length%,parameter$,number%,byte$,lttr$
 2370REM Isolate the parameters,if any
 2380length%=LEN(FNfindwild(1,mnemonic$(pointer%)," "))
 2390parameter$=FNstripleft(RIGHT$(string$,LENstring$-length%))
 2400REM Instructions requiring literals NEED to have a hash after them
 2410IFMID$(mnemonic$(pointer%),4,2)="LW" ANDLEFT$(parameter$,1)<>"#" THENPRINT'"Missing #":=FALSE
 2420REM Based on the template,how many parameters SHOULD there be
 2430lttr$=FNnowild(RIGHT$(mnemonic$(pointer%),3)," ,")
 2440number%=LENlttr$:parameter$=FNnowild(parameter$,"#")
 2450IFnumber%=2 ANDINSTR(parameter$,",")=0 THENPRINT'"Missing ,":=FALSE
 2460IFnumber%<>0 ANDFNnowild(parameter$," ")="" THENPRINT'"No such variable":=FALSE
 2470IF(option%AND1)<>1 THEN=FNtomemory("0","")
 2480byte$=FNnowild(bit$(pointer%)," ")
 2490REM Now interpret and substitute the values
 2500IFnumber%=2 THENwork$=FNfindwild(1,parameter$,","):byte$=FNoverlay(FNsetnum(work$),LEFT$(lttr$,1),byte$)
 2510IFnumber%<>0 THENwork$=FNfindwild(number%+LENwork$,parameter$,"\:"):byte$=FNoverlay(FNsetnum(work$),MID$(lttr$,number%,1),byte$)
 2520=FNtomemory(byte$,string$)
 2530:
 2540DEFFNtomemory(byte$,string$)
 2550REM Alter pseudo pointers and put in memory
 2560PROCassignvariable("P%=P%+1"):PROCassignvariable("O%=O%+1")
 2570IFstring$="" THEN=TRUE
 2580LOCALbyte%
 2590byte%=FNsetbin(byte$):P%=FNfindvalue("P%")-1
 2600REM Show the object & source
 2610PRINTFNpad(4,STR$~P%);" ";FNpad(4,STR$~(byte%));"  ";FNfindwild(1,string$,"\")
 2620IFINSTR(string$,"\")<>0 THENPRINTSPC(11);"\";RIGHT$(string$,LENstring$-INSTR(string$,"\"))
 2630REM Calculate where it goes in normal 8 bit terms
 2640?(code%+(P%*2))=byte% MOD256:?(code%+(P%*2)+1)=byte% DIV256
 2650=TRUE
 2660:
 2670DEFFNoption(string$)
 2680REM This is just used to control printing at present
 2690option%=FNfindvalue(RIGHT$(string$,LENstring$-3))
 2700IFoption%>7 THENPRINT'"Bad option":=FALSE
 2710=TRUE
 2720:
 2730REM ****GENERAL UTILITIES****
 2740:
 2750DEFPROCreset
 2760REM These are reset every time a new file is loaded
 2770pointer%=0:REM Is where in the BASIC file we are
 2780inasm%=FALSE:REM Boolean flag as to whether in BASIC or inside []'s
 2790for$="":REM Holds details of the FOR...NEXT loop
 2800code%=0:REM Where the result is held in memory
 2810s%=0:i%=0:r%=0:n%=0:REM None yet
 2820delta$="@":REM Holds the 1st letter of the last mnemonic change found
 2830option%=0:REM Assembler option 'OPT'
 2840ENDPROC
 2850:
 2860DEFPROCdump
 2870LOCALs%,i%,r%,data%
 2880IFn%=0 THENENDPROC
 2890PRINT"There are ";n%;" variables defined..."
 2900REPEAT
 2910PRINTname$(data%);" is a";
 2920IFRIGHT$(name$(data%),1)="$" THENPRINT" string=",string$(s%):s%=s%+1
 2930IFRIGHT$(name$(data%),1)="%" THENPRINT"n integer=",integer%(i%):i%=i%+1
 2940IFRIGHT$(name$(data%),1)<>"$" ANDRIGHT$(name$(data%),1)<>"%" THENPRINT" real number=",real(r%):r%=r%+1
 2950data%=data%+1
 2960UNTILdata%=n%
 2970ENDPROC
 2980:
 2990DEFFNcount(lttr$,string$)
 3000REM Returns the maximum number allowed for a parameter
 3010LOCALdata%,length%
 3020FORdata%=1TOLEN(string$)
 3030IFMID$(string$,data%,1)=lttr$ THENlength%=length%+1
 3040NEXT
 3050=length%
 3060:
 3070DEFFNunpacktoken(tokennum%)
 3080REM Convert token to meaningful text
 3090LOCALbyte%,data%,mask%
 3100IFtokennum%<>&8D THEN=token$(tokennum%-128)
 3110REM It was a line number
 3120byte%=BGET#in%
 3130data%=(byte% AND(32+16))*4:REM Shift up 2 places and discard
 3140data%=data% EOR BGET#in%
 3150mask%=(byte% AND(8+4))*16:REM Shift up 2 places more and discard
 3160mask%=mask% EOR BGET#in%
 3170=data%+(mask%*256)
 3180:
 3190REM ****STRING UTILITIES****
 3200:
 3210DEFFNpad(length%,string$)
 3220=STRING$(length%-LENstring$,"0")+string$
 3230:
 3240DEFFNfindwild(pointer%,string$,separator$)
 3250REM Find all the text from pointer% to the chosen separator(s)
 3260LOCALlength%,found%,data%
 3270FORdata%=pointer%TOLENstring$
 3280IFINSTR(separator$,MID$(string$,data%,1))<>0 ANDfound%=FALSE THENfound%=data%
 3290NEXT
 3300IFfound%=FALSE THENfound%=LENstring$+1:REM Not found at all
 3310=MID$(string$,pointer%,found%-pointer%)
 3320:
 3330DEFFNpophex(string$,pointer%)
 3340REM Gets the hex number that follows
 3350LOCALdata%,length%
 3360FORdata%=(pointer%+1)TOLENstring$
 3370IFlength%=0 ANDINSTR("0123456789ABCDEF",MID$(string$,data%,1))=0 THENlength%=data%
 3380NEXT
 3390=MID$(string$,pointer%,length%-pointer%)
 3400:
 3410DEFFNstripright(string$)
 3420REM Performs RTRIM$
 3430LOCALdata%,pointer%
 3440FORdata%=LEN(string$)TO1 STEP-1
 3450IFpointer%=0 ANDMID$(string$,data%,1)<>" " THENpointer%=data%
 3460NEXT
 3470=LEFT$(string$,pointer%)
 3480:
 3490DEFFNstripleft(string$)
 3500REM Performs LTRIM$
 3510LOCALdata%,pointer%
 3520FORdata%=1TOLEN(string$)
 3530IFpointer%=0 ANDMID$(string$,data%,1)<>" " THENpointer%=data%
 3540NEXT
 3550=RIGHT$(string$,LEN(string$)-pointer%+1)
 3560:
 3570DEFFNnowild(string$,separator$)
 3580REM Gets rid of ALL occurences of the chosen separator(s)
 3590LOCALwork$,data%
 3600FORdata%=1TOLENstring$
 3610IFINSTR(separator$,MID$(string$,data%,1))=0 THENwork$=work$+MID$(string$,data%,1)
 3620NEXT
 3630=work$
 3640:
 3650DEFFNucase(string$)
 3660REM Alphabetics => upper case (ASCii values of a,z are 97,122)
 3670LOCALdata%,work$,byte%
 3680FORdata%=1TOLEN(string$)
 3690byte%=ASC(MID$(string$,data%,1))AND&DF
 3700IFbyte%>ASC"Z" ORbyte%<ASC"A" THENwork$=work$+MID$(string$,data%,1) ELSEwork$=work$+CHR$byte%
 3710NEXT
 3720=work$
 3730:
 3740REM ****NUMERICAL UTILITIES****
 3750:
 3760DEFFNoverlay(over%,lttr$,string$)
 3770REM Overlays the binary conversion of over% in lttr$'s place
 3780LOCALbinary$,data%
 3790FORdata%=(FNcount(lttr$,string$)-1)TO0STEP-1
 3800binary$=binary$+STR$(SGN(over%AND(2^data%)))
 3810NEXT
 3820=LEFT$(string$,INSTR(string$,lttr$)-1)+binary$+RIGHT$(string$,LEN(string$)-INSTR(string$,lttr$)-LEN(binary$)+1)
 3830:
 3840DEFFNfindvalue(string$)
 3850IFRIGHT$(string$,1)="$" THEN=string$(FNallocate(string$))
 3860IFRIGHT$(string$,1)="%" THEN=integer%(FNallocate(string$))
 3870=real(FNallocate(string$))
 3880:
 3890DEFPROCassignvariable(string$)
 3900REM Used to define variables outside the assembler
 3910LOCALdata%,lttr$,work$
 3920work$=FNstripleft(FNfindwild(1,string$,"="))
 3930work$=FNstripright(work$):REM Now contains the variable name
 3940REM First,search for absolutely forbidden characters
 3950FORdata%=1TO(LEN(work$)-1)
 3960lttr$=MID$(work$,data%,1)
 3970IFINSTR(CHR$34+" !#%&'()*+,-./:;<=>?@[\]^`",lttr$)<>0 ORASClttr$>122 THENPRINT'"Mistake":ENDPROC
 3980NEXT
 3990REM Now,check it doesn't start with any of these
 4000lttr$=LEFT$(work$,1)
 4010IFINSTR("0123456789",lttr$)<>0 THENPRINT'"Syntax error":ENDPROC
 4020IFlttr$="$" THENPRINT'"Don't use the '$' operator":ENDPROC
 4030REM Guess the type time
 4040lttr$=RIGHT$(work$,1)
 4050IFINSTR(CHR$34+" !#&'()*+,-./:;<=>?@[\]^`",lttr$)<>0 ORASClttr$>122 THENPRINT'"Mistake":ENDPROC
 4060REM Locate/create slot passing 'string$' as the expression
 4070string$=RIGHT$(string$,LEN(string$)-INSTR(string$,"="))
 4080IFlttr$="$" THENstring$(FNallocate(work$))=FNsetstr(string$)
 4090IFlttr$="%" THENinteger%(FNallocate(work$))=FNsetnum(string$)
 4100IFlttr$<>"%" ANDlttr$<>"$" THENreal(FNallocate(work$))=FNsetnum(string$)
 4110ENDPROC
 4120:
 4130DEFFNassignlabel(string$)
 4140REM Used by the assembler to assign labels
 4150LOCALdata%,lttr$,work$
 4160string$=FNstripleft(RIGHT$(string$,LEN(string$)-1))
 4170IF(option%AND1)=1 THENPRINTFNpad(4,STR$~FNfindvalue("P%"));SPC(7);".";string$:=TRUE
 4180string$=FNstripright(string$)
 4190REM First,search for absolutely forbidden characters
 4200FORdata%=1TO(LEN(string$)-1)
 4210lttr$=MID$(string$,data%,1)
 4220IFINSTR(CHR$34+" !#%&'()*+,-./:;<=>?@[\]^`",lttr$)<>0 ORASClttr$>122 THENPRINT'"Mistake":=FALSE
 4230NEXT
 4240REM Now,check it doesn't start with any of these
 4250IFINSTR("$0123456789",LEFT$(string$,1))<>0 THENPRINT'"Syntax error":=FALSE
 4260REM And it can't end with a dollar
 4270lttr$=RIGHT$(string$,1)
 4280IFlttr$="$" THENPRINT'"Type mismatch":=FALSE
 4290IFINSTR(CHR$34+" !#&'()*+,-./:;<=>?@[\]^`",lttr$)<>0 THENPRINT'"Mistake":=FALSE
 4300work$=string$+"="+STR$(FNfindvalue("P%")):REM Means work$ contains "name=P%" now
 4310IFlttr$="%" THENinteger%(FNallocate(string$))=FNsetnum(work$) ELSEreal(FNallocate(string$))=FNsetnum(work$)
 4320=TRUE
 4330:
 4340DEFFNsetnum(string$)
 4350REM Returns a number evaluation including binary
 4360string$=RIGHT$(string$,LEN(string$)-INSTR(string$,"="))
 4370string$=FNnowild(string$," ")
 4380IFLEFT$(string$,1)="%" THEN=FNsetbin(string$)
 4390=EVAL(FNexpandnum(string$))
 4400:
 4410DEFFNsetstr(string$)
 4420REM Returns a string evaluation
 4430=EVAL(FNexpandstr(string$))
 4440:
 4450DEFFNsetbin(string$)
 4460REM Returns binary => decimal
 4470LOCALdata%,result%,lttr$
 4480REM accepts nos. with or without leading '%' symbol
 4490string$=FNnowild(RIGHT$(string$,LEN(string$)-INSTR(string$,"%"))," ")
 4500IFLENstring$>14 THENPRINT'"Too big":=0
 4510IFLENstring$=0 THENPRINT'"Bad Binary":=0
 4520FORdata%=1TOLENstring$
 4530lttr$=MID$(string$,data%,1)
 4540IFlttr$="1" THENresult%=result%OR(2^(LENstring$-data%))
 4550NEXT
 4560=result%
 4570:
 4580DEFFNallocate(string$)
 4590REM Return the slot number if found,or allocate a new one if NOT found
 4600LOCALdata%,sFind%,iFind%,rFind%,type%,found%
 4610sFind%=TRUE:iFind%=TRUE:rFind%=TRUE:found%=TRUE
 4620type%=ASC"r":REM Assume a real number
 4630IFRIGHT$(string$,1)="$" THENtype%=ASC"s"
 4640IFRIGHT$(string$,1)="%" THENtype%=ASC"i"
 4650FORdata%=0TOn%
 4660rFind%=rFind%+1:REM Assume a real number
 4670IFRIGHT$(name$(data%),1)="$" THENsFind%=sFind%+1:rFind%=rFind%-1
 4680IFRIGHT$(name$(data%),1)="%" THENiFind%=iFind%+1:rFind%=rFind%-1
 4690IFstring$=name$(data%) THENfound%=EVAL(CHR$type%+"Find%")
 4700NEXT
 4710IFfound%<>TRUE THEN=found%
 4720name$(n%)=string$:n%=n%+1
 4730IFtype%=ASC"s" THENs%=s%+1:=s%-1:REM s% points to NEXT free slot
 4740IFtype%=ASC"i" THENi%=i%+1:=i%-1:REM i% points to NEXT free slot
 4750r%=r%+1:=r%-1:REM r% points to NEXT free slot
 4760:
 4770DEFFNexpandstr(string$)
 4780REM Substitutes variables from my list to numbers
 4790REM Not yet!!
 4800=string$
 4810:
 4820DEFFNexpandnum(string$)
 4830REM Substitute in numbers and my variables
 4840LOCALpointer%,result$,work$,byte$
 4850pointer%=1
 4860REPEAT
 4870byte$=MID$(string$,pointer%,1)
 4880IFbyte$="&" THENwork$=FNpophex(string$,pointer%):pointer%=pointer%+LENwork$
 4890IFbyte$="%" THENwork$=STR$(FNsetbin(RIGHT$(string$,LENstring$-pointer%))):pointer%=LENstring$+1
 4900IFASC(byte$)>127 THENwork$=FNunpacktoken(ASCbyte$):pointer%=pointer%+1
 4910IFINSTR("0123456789^()*-+/. ",byte$)<>0 THENwork$=byte$:pointer%=pointer%+1
 4920IFINSTR("0123456789&%^()*-+/. ",byte$)=0 THENwork$=FNfindwild(pointer%,string$,"^*-+/ "):pointer%=pointer%+LENwork$:work$=STR$(FNfindvalue(work$))
 4930result$=result$+work$
 4940UNTILpointer%>LENstring$
 4950=result$
 4960:
 4970REM ****TABLES OF TEMPLATES****
 4980:
 4990REM Mnemonics allowed,where f=file,d=destination,b=bit pattern,k=constant
 5000DATA"00 0111 dfff ffff","ADDWF  f,d","Add W and f"
 5010DATA"00 0101 dfff ffff","ANDWF  f,d","AND W and f"
 5020DATA"11 111x kkkk kkkk","ADDLW  k  ","Add literal to W"
 5030DATA"11 1001 kkkk kkkk","ANDLW  k  ","And literal and W"
 5040DATA"01 00bb bfff ffff","BCF    f,b","Bit clear f"
 5050DATA"01 01bb bfff ffff","BSF    f,b","Bit set f"
 5060DATA"01 10bb bfff ffff","BTFSC  f,b","Bit test,skip if clear  "
 5070DATA"01 11bb bfff ffff","BTFSS  f,b","Bit test,skip if set"
 5080DATA"10 0kkk kkkk kkkk","CALL   k  ","Call subroutine"
 5090DATA"00 0000 0110 0100","CLRWDT    ","Clear watch dog timer"
 5100DATA"00 0001 0xxx xxxx","CLRW      ","Clear W"
 5110DATA"00 0001 1fff ffff","CLRF   f  ","Clear f"
 5120DATA"00 1001 dfff ffff","COMF   f,d","Complement f"
 5130DATA"00 1011 dfff ffff","DECFSZ f,d","Decrement f, skip if zero"
 5140DATA"00 0011 dfff ffff","DECF   f,d","Decrement f"
 5150DATA"10 1kkk kkkk kkkk","GOTO   k  ","Goto address  k"
 5160DATA"11 1000 kkkk kkkk","IORLW  k  ","Inclusive OR literal and W"
 5170DATA"00 1111 dfff ffff","INCFSZ f,d","Increment f,skip if zero"
 5180DATA"00 1010 dfff ffff","INCF   f,d","Increment f"
 5190DATA"00 0100 dfff ffff","IORWF  f,d","Inclusive OR W and f"
 5200DATA"00 1000 dfff ffff","MOVF   f,d","Move f"
 5210DATA"00 0000 1fff ffff","MOVWF  f  ","Move W to f"
 5220DATA"11 00xx kkkk kkkk","MOVLW  k  ","Move Literal to W"
 5230DATA"00 0000 0xx0 0000","NOP       ","No operation"
 5240DATA"00 0000 0110 0010","OPTION    ","Load OPTION register with W"
 5250DATA"00 1101 dfff ffff","RLF    f,d","Rotate left f"
 5260DATA"00 1100 dfff ffff","RRF    f,d","Rotate right f"
 5270DATA"00 0000 0000 1001","RETFIE    ","Return from Interrupt"
 5280DATA"11 01xx kkkk kkkk","RETLW  k  ","Return with literal in W"
 5290DATA"00 0000 0000 1000","RETURN    ","Return from subroutine"
 5300DATA"00 0010 dfff ffff","SUBWF  f,d","Subtract W from f"
 5310DATA"00 1110 dfff ffff","SWAPF  f,d","Swap left & right nybbles of f"
 5320DATA"00 0000 0110 0011","SLEEP     ","Go into stand by mode"
 5330DATA"11 110x kkkk kkkk","SUBLW  k  ","Subtract W from literal"
 5340DATA"00 0000 0110 0fff","TRIS   f  ","Tristate port f"
 5350DATA"00 0110 dfff ffff","XORWF  f,d","Exclusive OR W and f"
 5360DATA"11 1010 kkkk kkkk","XORLW  k  ","Exclusive OR literal and W"
 5370DATA"[[[","[[[","EOT marker CHR$91 is ASC'Z'+1 which is a '['"
 5380:
 5390REM BASIC II tokens
 5400DATA "80AND","81DIV","82EOR","83MOD","84OR","85ERROR","86LINE","87OFF","88STEP","89SPC"
 5410DATA "8ATAB","8BELSE","8CTHEN","8EOPENIN","8FPTR","90PAGE","91TIME","92LOMEM","93HIMEM"
 5420DATA "94ABS","95ACS","96ADVAL","97ASC","98ASN","99ATN","9ABGET","9BCOS","9CCOUNT","9DDEG"
 5430DATA "9EERL","9FERR","A0EVAL","A1EXP","A2EXT","A3FALSE","A4FN","A5GET","A6INKEY","A7INSTR("
 5440DATA "A8INT","A9LEN","AALN","ABLOG","ACNOT","ADOPENUP","AEOPENOUT","AFPI","B0POINT(","B1POS"
 5450DATA "B2RAD","B3RND","B4SGN","B5SIN","B6SQR","B7TAN","B8TO","B9TRUE","BAUSR","BBVAL"
 5460DATA "BCVPOS","BDCHR$","BEGET$","BFINKEY$","C0LEFT$(","C1MID$(","C2RIGHT$(","C3STR$"
 5470DATA "C4STRING$(","C5EOF","C6AUTO","C7DELETE","C8LOAD","C9LIST","CANEW","CBOLD","CCRENUMBER"
 5480DATA "CDSAVE","CFPTR","D0PAGE","D1TIME","D2LOMEM","D3HIMEM","D4SOUND","D5BPUT","D6CALL"
 5490DATA "D7CHAIN","D8CLEAR","D9CLOSE","DACLG","DBCLS","DCDATA","DDDEF","DEDIM","DFDRAW","E0END"
 5500DATA "E1ENDPROC","E2ENVELOPE","E3FOR","E4GOSUB","E5GOTO","E6GCOL","E7IF","E8INPUT","E9LET"
 5510DATA "EALOCAL","EBMODE","ECMOVE","EDNEXT","EEON","EFVDU","F0PLOT","F1PRINT","F2PROC","F3READ"
 5520DATA "F4REM","F5REPEAT","F6REPORT","F7RESTORE","F8RETURN","F9RUN","FASTOP","FBCOLOUR","FCTRACE"
 5530DATA "FDUNTIL","FEWIDTH","FFOSCLI"
 5540:
 5550REM Direct mode keywords
 5560DATA HELP,"Gives details of available help"
 5570DATA CHAIN"filename","Loads and assembles the PIC source code"
 5580DATA LOAD"filename","Loads the PIC source code"
 5590DATA "LIST [<from><,to>]","Optionally list program <from>...<to>"
 5600DATA RUN,"Clears variables then executes program"
 5610DATA QUIT,"Ends the PIC assembler"
 5620DATA CLS,"Clears the screen"
 5630DATA STOP,"Stops what's happening"

 � PIC 16CXX series assembler
#� Accepts tokenised BASIC files
)�"PIC Assembler V0.98 (C)SPROW 1997"'
(G*KEY 9 CHAIN"ADFS::RiscHD.$.Language.BasicV.PICs.K2Project.K2sauce"
2:
<G� Globals to reset on power up,the rest are reset for each new file
F*source$="":� The filename to read from
PFloaded%=�:� Boolean flag as to whether a valid program is 'loaded'
Z3opcount%=0:� No. PIC opcodes in DATA statements
d:keycount%=8:� Number of supported direct mode commands
n3�reset:� These are all reset for every file too
x:
�� Count the table length
�C�:�bit$,mnemonic$,meaning$:opcount%=opcount%+1:�mnemonic$="[[["
��
�allow%=128
�E� bit$(opcount%),mnemonic$(opcount%),meaning$(opcount%+keycount%)
�1� jumpto%(28),token$(127),keyword$(keycount%)
�I� string$(allow% �8),integer%(allow% �4),real(allow%),name$(allow%*2)
�:
��data%=1�opcount%
�1�bit$(data%),mnemonic$(data%),meaning$(data%)
��mnemonic$(data%),1)<>delta$ �jumpto%(1+�(delta$)-64)=data%:jumpto%(�(�mnemonic$(data%),1))-64)=data%:delta$=�mnemonic$(data%),1)
�D�:� Build a table linking 1st mnemonic letters to array elements
�:
�
'�token$:tokennum%=�("&"+�token$,2))
.token$(tokennum%-128)=�token$,�(token$)-2)
"��token$,2)="FF"
,:
6�data%=1�keycount%
@-�keyword$(data%),meaning$(opcount%+data%)
J�
T:
^�:�:�#0
h�
r�">"command$
|*command$=�stripleft(command$):found%=�
�@�command$,4)="HELP" �found%=�help(�command$,�(command$)-4))
�B�command$,5)="CHAIN" �found%=�chain(�command$,�(command$)-5))
�I�command$,4)="LOAD" �found%=�load(�command$,�(command$)-4)):found%=�
�@�command$,4)="LIST" �found%=�list(�command$,�(command$)-4))
�@�command$,4)="QUIT" �found%=�quit(�command$,�(command$)-4))
�>�command$,3)="RUN" �found%=�run(�command$,�(command$)-3))
�G�command$,3)="CLS" �found%=�cls(�command$,�(command$)-3)):found%=�
�C�command$,4)="STOP" �found%=�(�stop(�command$,�(command$)-4)))
�;�command$,1)="*" �found%=�:�(�command$,�(command$)-1))
�5�found%=� ��command$>0 ��'"Command not supported"
�!��nowild(command$," ")="QUIT"
��
�:
ݤquit(parameter$)
5�nowild(parameter$," ")<>"" ��'"Syntax error":=�
J�("SAVE from098 "+�~(code%)+" +"+�~(2*�findvalue("P%"))+" 0 FFFFF800")
&=�
0:
:ݤrun(parameter$)
D5�nowild(parameter$," ")<>"" ��'"Syntax error":=�
N(�loaded%=� ��'"No program loaded":=�
X=�chain(�34+source$+�34)
b:
lݤhelp(parameter$)
v�data%,found%,mnemonic$
�&parameter$=�nowild(parameter$," ")
� � Asking for help in general
�s�parameter$="" ��"Help is available on the following:"'"HELP <assembler mnemonic>"'"HELP <command>"'"HELP .":=�
�!� Look through keywords first
�;�parameter$="." ��14:�"Help with direct mode keywords:"
��data%=1�keycount%
���parameter$=�keyword$(data%),�(parameter$)) �parameter$="." ��keyword$(data%);" - ";meaning$(opcount%+data%):found%=�:� All help support
��
�� Is it a mnemonic?
�1�parameter$="." ��'"Help with the assembler:"
�!parameter$=�ucase(parameter$)
��data%=1�(opcount%-1)
�/mnemonic$=�findwild(1,mnemonic$(data%)," ")
~�parameter$=�mnemonic$,�(parameter$)) �parameter$="." ��mnemonic$(data%);" - ";meaning$(data%):found%=�:� All help support
�
7�found%=� ��'"No help available on that topic" ��15
 =�
*:
4ݤload(parameter$)
>9parameter$=�stripright(�stripleft(parameter$)):�reset
H� Check for opening ditto
R1�parameter$,1)<>�34 ��'"No such variable":=�
\� Check for closing ditto
f1lastditto%=��parameter$,�(parameter$)-1),�34)
p&�lastditto%=0 ��'"Missing "+�34:=�
z'� Look for anymore text on the line
�5�(lastditto%+1)<>�parameter$ ��'"Syntax error":=�
�(in%=� �parameter$,2,�(parameter$)-2)
�!�in%=0 ��'"File not found":=�
�2�#in%<>13 ��'"Bad program":loaded%=�:�#in%:=�
��#in%=(�#in%)-1
�3�#in%<>255 ��'"Bad program":loaded%=�:�#in%:=�
�:loaded%=�:�#in%:source$=�parameter$,2,�(parameter$)-2)
�=�
�:
�ݤlist(parameter$)
�$� List a program onto the screen
�@�linenum$,linenum%,minline%,maxline%,rangehi$,rangelo$,byte%
�(�loaded%=� ��'"No program loaded":=�
� Read any options given
&parameter$=�nowild(parameter$," ")
Wrangelo$=�findwild(1,parameter$,","):rangehi$=�findwild(2+�rangelo$,parameter$,",")
$'� Now work out which lines are reqd
.7�rangehi$="" ��parameter$,",")=0 �rangehi$=rangelo$
87�rangehi$="" ��parameter$,",")<>0 �rangehi$="&8000"
B!�parameter$="," �rangelo$="0"
LP�rangehi$+rangelo$="" �maxline%=&8000 �minline%=�rangelo$:maxline%=�rangehi$
VSpointer%=1:in%=�source$:�#in%=1:�11:� Backup one line,and skip past opening &0D
`�
j0byte%=�#in%:� The hi byte of the line number
tJlinenum%=(byte%*256)+�#in%:linenum$=�5-�(�(linenum%))," ")+�(linenum%)
~'� Be�silent if not in listing range
�;�(linenum%>=minline%)�(linenum%<=maxline%) ��'linenum$;
�&pointer%=pointer%+3:�#in%=pointer%
�b�(linenum%<minline%)�(linenum%>maxline%) ��:byte%=�#in%:�byte%=13:�#in%=�#in%-1:pointer%=�#in%
��
�byte%=�#in%
�.�byte%<127 ��byte% ��;�unpacktoken(byte%);
�pointer%=pointer%+1
�"�byte%=13 �pointer%>=(�#in%-1)
�+�pointer%>=(�#in%-1) �linenum%>maxline%
��:�#in%
�=�
�:
ݤchain(parameter$)

)�work$,result%,maxline%,data%,length%
�load(parameter$)=� �=�
-in%=�source$:length%=(�#in%)-2:maxline%=1
(,� Now,repeatedly select the interpretter
2�
<6 work$="":�#in%=�#in%+2+�maxline%:maxline%=�#in%-4
F- �data%=1�maxline%:work$=work$+�(�#in%):�
P0 �"[]",�work$,1))<>0 �inasm%=�(�work$-�"]")
Z> �inasm%=� �result%=�inbasic(work$) �result%=�inasm(work$)
d��#in%=length% �result%=0
n	�#in%
x=�
�:
�� ****INTERPRETTERS****
�:
�ݤinbasic(string$)
�W� Only keywords allowed outside assembler are REM,FOR,TO,STEP,DIM,NEXT,CLS,STOP,END
��byte%,token$,work$
�byte%=�(�string$,1))
�"work$=�findwild(1,string$,":")
�E�byte%>127 �byte%<>&8D �token$=�unpacktoken(byte%) �token$=�byte%
�L�token$="REM" ��":]"+�13,token$)<>0 �=�:� Empty and comment line support
��token$="=" ��'"No FN":=�
�)�token$=1 ��assignvariable(work$):=�
�!�token$="NEXT" �=�next(work$)
�token$="FOR" �=�for(work$)
�token$="DIM" �=�dim(work$)
�token$="CLS" �=�cls(work$)
"!�token$="STOP" �=�stop(work$)
,3�token$="END" �=� ��'"Command not supported":=�
6:
@ݤcls(string$)
J+work$=�nowild(�string$,�string$-1)," ")
T)�work$<>"" ��'"Syntax error":=� ��:=�
^:
hݤstop(string$)
r+work$=�nowild(�string$,�string$-1)," ")
|*�work$<>"" ��'"Syntax error" ��'"STOP"
�=�
�:
�ݤnext(string$)
�"�step%,limit%,for%,name$,work$
�8� Check for 'NEXT,' and 'NEXT <variable>' constructs
�+work$=�nowild(�string$,�string$-1)," ")
�+�for$="" ��work$,",")<>0 ��'"No FOR":=�
�name$=�findwild(1,for$,",")
�4�work$<>"" �name$<>work$ ��'"Can't Match FOR":=�
�+� Get the FOR parameters from the stack
�*limit%=�(�findwild(2+�name$,for$,":"))
�4step%=�(�findwild(3+�name$+�(�limit%),for$,";"))
�'pointer%=�(�for$,�for$-�for$,";")))
 for%=�findvalue(name$)+step%
&�assignvariable(name$+"="+�(for%))
8�for%>limit% �for$="":pointer%=�#in% ��#in%=pointer%
&=�
0:
:ݤfor(string$)
D�limit%,step%,lttr$
N.� Assume a STEP of 1 if not told otherwise
X#�for$<>"" ��'"Too many FORs":=�
b/�string$,�&88)=0 �string$=string$+�&88+"1"
l#�string$,�&B8)=0 ��'"No TO":=�
v,string$=�stripleft(�string$,�string$-1))
�)� Add variable to table and FOR stack
�:lttr$=�findwild(1,string$,�&B8):�assignvariable(lttr$)
�6limit%=�setnum(�findwild(2+�(lttr$),string$,�&88))
�4step%=�setnum(�string$,�string$-�string$,�&88)))
�,� Of the form "variable,limit.step;addr"
�Cfor$=�findwild(1,string$,"=")+","+�limit%+":"+�step%+";"+Ï#in%
�=�
�:
�ݤdim(string$)
�1� Reserve memory,returning TRUE if successful
��name$,amount$
�,string$=�stripleft(�string$,�string$-1))
�=name$=�findwild(1,string$,"% "):� Either is the separator
.�string$,1+�name$,1)="%" �name$=name$+"%"
+amount$=�findwild(1+�name$,string$,":")
)�name$="" �amount$="" ��'"Bad DIM":=�
 2�name$="" �amount$="" ��'"No such variable":=�
*K�code% 2*�setnum(amount$):� Get twice as much due to 14 bit program bus
4%�assignvariable(name$+"="+�code%)
>=�
H:
Rݤinasm(string$)
\0�data%,byte%,found%,initial%,mnemonic$,work$
f;� Tokens found inside the assembler are merely unpacked
p�data%=1��string$
zbyte%=�(�string$,data%,1))
�b�byte%>127 �byte%<>&8D �string$=�string$,data%-1)+�unpacktoken(byte%)+�string$,�string$-data%)
��
�,�string$,1)="." �=�assignlabel(string$)
�2�string$,1)="[" �string$=�string$,�string$-1)
�<work$=�ucase(string$):� Speeds up mnemonic testing later
�'�work$,"OPT")=1 �=�option(string$)
�N�work$,"EQU")=1 ��'"Silly":=�:� Not allowed data on the program bus,silly
�initial%=�(�work$,1))
�F�initial%>�"Z" �initial%<�"A" �=�:� Empty and comment line support
�W� Use lookup table until 'mnemonic$=string in program',then work out the parameters
�!found%=jumpto%(initial%-64)-1
��:found%=found%+1
�;mnemonic$=�mnemonic$(found%),�mnemonic$(found%)," ")-1)
	B�mnemonic$=�work$,�(mnemonic$)) �found%=jumpto%(1+initial%-64)
	=�mnemonic$<>�work$,�(mnemonic$)) ��'"No such mnemonic":=�
	=�asmparms(found%,string$)
	$:
	. ݤasmparms(pointer%,string$)
	81�work$,length%,parameter$,number%,byte$,lttr$
	B#� Isolate the parameters,if any
	L3length%=�(�findwild(1,mnemonic$(pointer%)," "))
	V5parameter$=�stripleft(�string$,�string$-length%))
	`D� Instructions requiring literals NEED to have a hash after them
	jJ�mnemonic$(pointer%),4,2)="LW" ��parameter$,1)<>"#" ��'"Missing #":=�
	t?� Based on the template,how many parameters SHOULD there be
	~/lttr$=�nowild(�mnemonic$(pointer%),3)," ,")
	�5number%=�lttr$:parameter$=�nowild(parameter$,"#")
	�4�number%=2 ��parameter$,",")=0 ��'"Missing ,":=�
	�D�number%<>0 ��nowild(parameter$," ")="" ��'"No such variable":=�
	�'�(option%�1)<>1 �=�tomemory("0","")
	�%byte$=�nowild(bit$(pointer%)," ")
	�-� Now interpret and substitute the values
	�`�number%=2 �work$=�findwild(1,parameter$,","):byte$=�overlay(�setnum(work$),�lttr$,1),byte$)
	�w�number%<>0 �work$=�findwild(number%+�work$,parameter$,"\:"):byte$=�overlay(�setnum(work$),�lttr$,number%,1),byte$)
	�=�tomemory(byte$,string$)
	�:
	�ݤtomemory(byte$,string$)
	�-� Alter pseudo pointers and put in memory
9�assignvariable("P%=P%+1"):�assignvariable("O%=O%+1")

�string$="" �=�

�byte%
.byte%=�setbin(byte$):P%=�findvalue("P%")-1
(� Show the object & source
2E�pad(4,�~P%);" ";�pad(4,�~(byte%));"  ";�findwild(1,string$,"\")
<B�string$,"\")<>0 ��(11);"\";�string$,�string$-�string$,"\"))
F3� Calculate where it goes in normal 8 bit terms
P;?(code%+(P%*2))=byte% �256:?(code%+(P%*2)+1)=byte% �256
Z=�
d:
nݤoption(string$)
x6� This is just used to control printing at present
�,option%=�findvalue(�string$,�string$-3))
�!�option%>7 ��'"Bad option":=�
�=�
�:
�� ****GENERAL UTILITIES****
�:
���reset
�5� These are reset every time a new file is loaded
�2pointer%=0:� Is where in the BASIC file we are
�Ainasm%=�:� Boolean flag as to whether in BASIC or inside []'s
�2for$="":� Holds details of the FOR...NEXT loop
�0code%=0:� Where the result is held in memory
�"s%=0:i%=0:r%=0:n%=0:� None yet
Gdelta$="@":� Holds the 1st letter of the last mnemonic change found
&option%=0:� Assembler option 'OPT'
�
":
,
��dump
6�s%,i%,r%,data%
@�n%=0 ��
J,�"There are ";n%;" variables defined..."
T�
^�name$(data%);" is a";
h:��name$(data%),1)="$" ��" string=",string$(s%):s%=s%+1
r=��name$(data%),1)="%" ��"n integer=",integer%(i%):i%=i%+1
|T��name$(data%),1)<>"$" ��name$(data%),1)<>"%" ��" real number=",real(r%):r%=r%+1
�data%=data%+1
�
�data%=n%
��
�:
�ݤcount(lttr$,string$)
�8� Returns the maximum number allowed for a parameter
��data%,length%
��data%=1��(string$)
�/�string$,data%,1)=lttr$ �length%=length%+1
��
�=length%
�:
�ݤunpacktoken(tokennum%)
&� Convert token to meaningful text
�byte%,data%,mask%
+�tokennum%<>&8D �=token$(tokennum%-128)
&� It was a line number
0byte%=�#in%
:<data%=(byte% �(32+16))*4:� Shift up 2 places and discard
Ddata%=data% � �#in%
N@mask%=(byte% �(8+4))*16:� Shift up 2 places more and discard
Xmask%=mask% � �#in%
b=data%+(mask%*256)
l:
v� ****STRING UTILITIES****
�:
�ݤpad(length%,string$)
�#=�length%-�string$,"0")+string$
�:
�+ݤfindwild(pointer%,string$,separator$)
�@� Find all the text from pointer% to the chosen separator(s)
��length%,found%,data%
��data%=pointer%��string$
�>�separator$,�string$,data%,1))<>0 �found%=� �found%=data%
��
�3�found%=� �found%=�string$+1:� Not found at all
�'=�string$,pointer%,found%-pointer%)
�:

ݤpophex(string$,pointer%)

&� Gets the hex number that follows

�data%,length%

  �data%=(pointer%+1)��string$

*G�length%=0 ��"0123456789ABCDEF",�string$,data%,1))=0 �length%=data%

4�

>(=�string$,pointer%,length%-pointer%)

H:

Rݤstripright(string$)

\� Performs RTRIM$

f�data%,pointer%

p�data%=�(string$)�1 �-1

z7�pointer%=0 ��string$,data%,1)<>" " �pointer%=data%

��

�=�string$,pointer%)

�:

�ݤstripleft(string$)

�� Performs LTRIM$

��data%,pointer%

��data%=1��(string$)

�7�pointer%=0 ��string$,data%,1)<>" " �pointer%=data%

��

�$=�string$,�(string$)-pointer%+1)

�:

� ݤnowild(string$,separator$)

�;� Gets rid of ALL occurences of the chosen separator(s)
�work$,data%
�data%=1��string$
D�separator$,�string$,data%,1))=0 �work$=work$+�string$,data%,1)
$�
.
=work$
8:
Bݤucase(string$)
L@� Alphabetics => upper case (ASCii values of a,z are 97,122)
V�data%,work$,byte%
`�data%=1��(string$)
j"byte%=�(�string$,data%,1))�&DF
tN�byte%>�"Z" �byte%<�"A" �work$=work$+�string$,data%,1) �work$=work$+�byte%
~�
�
=work$
�:
�!� ****NUMERICAL UTILITIES****
�:
�"ݤoverlay(over%,lttr$,string$)
�>� Overlays the binary conversion of over% in lttr$'s place
��binary$,data%
�)�data%=(�count(lttr$,string$)-1)�0�-1
�)binary$=binary$+�(�(over%�(2^data%)))
��
�Z=�string$,�string$,lttr$)-1)+binary$+�string$,�(string$)-�string$,lttr$)-�(binary$)+1)
�:
ݤfindvalue(string$)

2��string$,1)="$" �=string$(�allocate(string$))
3��string$,1)="%" �=integer%(�allocate(string$))
=real(�allocate(string$))
(:
2��assignvariable(string$)
<4� Used to define variables outside the assembler
F�data%,lttr$,work$
P.work$=�stripleft(�findwild(1,string$,"="))
Z=work$=�stripright(work$):� Now contains the variable name
d6� First,search for absolutely forbidden characters
n�data%=1�(�(work$)-1)
xlttr$=�work$,data%,1)
�K秽34+" !#%&'()*+,-./:;<=>?@[\]^`",lttr$)<>0 ��lttr$>122 ��'"Mistake":�
��
�2� Now,check it doesn't start with any of these
�lttr$=�work$,1)
�0�"0123456789",lttr$)<>0 ��'"Syntax error":�
�0�lttr$="$" ��'"Don't use the '$' operator":�
�� Guess the type time
�lttr$=�work$,1)
�J秽34+" !#&'()*+,-./:;<=>?@[\]^`",lttr$)<>0 ��lttr$>122 ��'"Mistake":�
�<� Locate/create slot passing 'string$' as the expression
�.string$=�string$,�(string$)-�string$,"="))
�:�lttr$="$" �string$(�allocate(work$))=�setstr(string$)
�;�lttr$="%" �integer%(�allocate(work$))=�setnum(string$)
D�lttr$<>"%" �lttr$<>"$" �real(�allocate(work$))=�setnum(string$)
�
:
"ݤassignlabel(string$)
,,� Used by the assembler to assign labels
6�data%,lttr$,work$
@.string$=�stripleft(�string$,�(string$)-1))
JC�(option%�1)=1 ��pad(4,�~�findvalue("P%"));�(7);".";string$:=�
T string$=�stripright(string$)
^6� First,search for absolutely forbidden characters
h�data%=1�(�(string$)-1)
rlttr$=�string$,data%,1)
|L秽34+" !#%&'()*+,-./:;<=>?@[\]^`",lttr$)<>0 ��lttr$>122 ��'"Mistake":=�
��
�2� Now,check it doesn't start with any of these
�8�"$0123456789",�string$,1))<>0 ��'"Syntax error":=�
�$� And it can't end with a dollar
�lttr$=�string$,1)
�$�lttr$="$" ��'"Type mismatch":=�
�?秽34+" !#&'()*+,-./:;<=>?@[\]^`",lttr$)<>0 ��'"Mistake":=�
�Nwork$=string$+"="+�(�findvalue("P%")):� Means work$ contains "name=P%" now
�d�lttr$="%" �integer%(�allocate(string$))=�setnum(work$) �real(�allocate(string$))=�setnum(work$)
�=�
�:
�ݤsetnum(string$)
�2� Returns a number evaluation including binary
.string$=�string$,�(string$)-�string$,"="))
 string$=�nowild(string$," ")
'�string$,1)="%" �=�setbin(string$)
&=�(�expandnum(string$))
0:
:ݤsetstr(string$)
D!� Returns a string evaluation
N=�(�expandstr(string$))
X:
bݤsetbin(string$)
l� Returns binary => decimal
v�data%,result%,lttr$
�5� accepts nos. with or without leading '%' symbol
�;string$=�nowild(�string$,�(string$)-�string$,"%"))," ")
� �string$>14 ��'"Too big":=0
�"�string$=0 ��'"Bad Binary":=0
��data%=1��string$
�lttr$=�string$,data%,1)
�4�lttr$="1" �result%=result%�(2^(�string$-data%))
��
�=result%
�:
�ݤallocate(string$)
�H� Return the slot number if found,or allocate a new one if NOT found
�,�data%,sFind%,iFind%,rFind%,type%,found%
'sFind%=�:iFind%=�:rFind%=�:found%=�
%type%=�"r":� Assume a real number
 ��string$,1)="$" �type%=�"s"
  ��string$,1)="%" �type%=�"i"
*�data%=0�n%
4*rFind%=rFind%+1:� Assume a real number
>:��name$(data%),1)="$" �sFind%=sFind%+1:rFind%=rFind%-1
H:��name$(data%),1)="%" �iFind%=iFind%+1:rFind%=rFind%-1
R3�string$=name$(data%) �found%=�(�type%+"Find%")
\�
f�found%<>� �=found%
pname$(n%)=string$:n%=n%+1
z<�type%=�"s" �s%=s%+1:=s%-1:� s% points to NEXT free slot
�<�type%=�"i" �i%=i%+1:=i%-1:� i% points to NEXT free slot
�/r%=r%+1:=r%-1:� r% points to NEXT free slot
�:
�ݤexpandstr(string$)
�3� Substitutes variables from my list to numbers
�� Not yet!!
�=string$
�:
�ݤexpandnum(string$)
�,� Substitute in numbers and my variables
�!�pointer%,result$,work$,byte$
�pointer%=1
��
byte$=�string$,pointer%,1)
H�byte$="&" �work$=�pophex(string$,pointer%):pointer%=pointer%+�work$
Q�byte$="%" �work$=�(�setbin(�string$,�string$-pointer%))):pointer%=�string$+1
$A�(byte$)>127 �work$=�unpacktoken(�byte$):pointer%=pointer%+1
.F�"0123456789^()*-+/. ",byte$)<>0 �work$=byte$:pointer%=pointer%+1
8��"0123456789&%^()*-+/. ",byte$)=0 �work$=�findwild(pointer%,string$,"^*-+/ "):pointer%=pointer%+�work$:work$=�(�findvalue(work$))
Bresult$=result$+work$
L�pointer%>�string$
V=result$
`:
j!� ****TABLES OF TEMPLATES****
t:
~K� Mnemonics allowed,where f=file,d=destination,b=bit pattern,k=constant
�3�"00 0111 dfff ffff","ADDWF  f,d","Add W and f"
�3�"00 0101 dfff ffff","ANDWF  f,d","AND W and f"
�8�"11 111x kkkk kkkk","ADDLW  k  ","Add literal to W"
�9�"11 1001 kkkk kkkk","ANDLW  k  ","And literal and W"
�3�"01 00bb bfff ffff","BCF    f,b","Bit clear f"
�1�"01 01bb bfff ffff","BSF    f,b","Bit set f"
�@�"01 10bb bfff ffff","BTFSC  f,b","Bit test,skip if clear  "
�<�"01 11bb bfff ffff","BTFSS  f,b","Bit test,skip if set"
�7�"10 0kkk kkkk kkkk","CALL   k  ","Call subroutine"
�=�"00 0000 0110 0100","CLRWDT    ","Clear watch dog timer"
�/�"00 0001 0xxx xxxx","CLRW      ","Clear W"
�/�"00 0001 1fff ffff","CLRF   f  ","Clear f"
4�"00 1001 dfff ffff","COMF   f,d","Complement f"

A�"00 1011 dfff ffff","DECFSZ f,d","Decrement f, skip if zero"
3�"00 0011 dfff ffff","DECF   f,d","Decrement f"
7�"10 1kkk kkkk kkkk","GOTO   k  ","Goto address  k"
(B�"11 1000 kkkk kkkk","IORLW  k  ","Inclusive OR literal and W"
2@�"00 1111 dfff ffff","INCFSZ f,d","Increment f,skip if zero"
<3�"00 1010 dfff ffff","INCF   f,d","Increment f"
F<�"00 0100 dfff ffff","IORWF  f,d","Inclusive OR W and f"
P.�"00 1000 dfff ffff","MOVF   f,d","Move f"
Z3�"00 0000 1fff ffff","MOVWF  f  ","Move W to f"
d9�"11 00xx kkkk kkkk","MOVLW  k  ","Move Literal to W"
n4�"00 0000 0xx0 0000","NOP       ","No operation"
xC�"00 0000 0110 0010","OPTION    ","Load OPTION register with W"
�5�"00 1101 dfff ffff","RLF    f,d","Rotate left f"
�6�"00 1100 dfff ffff","RRF    f,d","Rotate right f"
�=�"00 0000 0000 1001","RETFIE    ","Return from Interrupt"
�@�"11 01xx kkkk kkkk","RETLW  k  ","Return with literal in W"
�>�"00 0000 0000 1000","RETURN    ","Return from subroutine"
�9�"00 0010 dfff ffff","SUBWF  f,d","Subtract W from f"
�F�"00 1110 dfff ffff","SWAPF  f,d","Swap left & right nybbles of f"
�=�"00 0000 0110 0011","SLEEP     ","Go into stand by mode"
�?�"11 110x kkkk kkkk","SUBLW  k  ","Subtract W from literal"
�7�"00 0000 0110 0fff","TRIS   f  ","Tristate port f"
�<�"00 0110 dfff ffff","XORWF  f,d","Exclusive OR W and f"
�B�"11 1010 kkkk kkkk","XORLW  k  ","Exclusive OR literal and W"
�?�"[[[","[[[","EOT marker CHR$91 is ASC'Z'+1 which is a '['"
:
� BASIC II tokens
X� "80AND","81DIV","82EOR","83MOD","84OR","85ERROR","86LINE","87OFF","88STEP","89SPC"
"X� "8ATAB","8BELSE","8CTHEN","8EOPENIN","8FPTR","90PAGE","91TIME","92LOMEM","93HIMEM"
,Z� "94ABS","95ACS","96ADVAL","97ASC","98ASN","99ATN","9ABGET","9BCOS","9CCOUNT","9DDEG"
6\� "9EERL","9FERR","A0EVAL","A1EXP","A2EXT","A3FALSE","A4FN","A5GET","A6INKEY","A7INSTR("
@]� "A8INT","A9LEN","AALN","ABLOG","ACNOT","ADOPENUP","AEOPENOUT","AFPI","B0POINT(","B1POS"
JU� "B2RAD","B3RND","B4SGN","B5SIN","B6SQR","B7TAN","B8TO","B9TRUE","BAUSR","BBVAL"
TU� "BCVPOS","BDCHR$","BEGET$","BFINKEY$","C0LEFT$(","C1MID$(","C2RIGHT$(","C3STR$"
^]� "C4STRING$(","C5EOF","C6AUTO","C7DELETE","C8LOAD","C9LIST","CANEW","CBOLD","CCRENUMBER"
hX� "CDSAVE","CFPTR","D0PAGE","D1TIME","D2LOMEM","D3HIMEM","D4SOUND","D5BPUT","D6CALL"
r]� "D7CHAIN","D8CLEAR","D9CLOSE","DACLG","DBCLS","DCDATA","DDDEF","DEDIM","DFDRAW","E0END"
|[� "E1ENDPROC","E2ENVELOPE","E3FOR","E4GOSUB","E5GOTO","E6GCOL","E7IF","E8INPUT","E9LET"
�^� "EALOCAL","EBMODE","ECMOVE","EDNEXT","EEON","EFVDU","F0PLOT","F1PRINT","F2PROC","F3READ"
�`� "F4REM","F5REPEAT","F6REPORT","F7RESTORE","F8RETURN","F9RUN","FASTOP","FBCOLOUR","FCTRACE"
�#� "FDUNTIL","FEWIDTH","FFOSCLI"
�:
�� Direct mode keywords
�,� HELP,"Gives details of available help"
�?� CHAIN"filename","Loads and assembles the PIC source code"
�0� LOAD"filename","Loads the PIC source code"
�B� "LIST [<from><,to>]","Optionally list program <from>...<to>"
�2� RUN,"Clears variables then executes program"
�#� QUIT,"Ends the PIC assembler"
�� CLS,"Clears the screen"
�#� STOP,"Stops what's happening"
�
00000000  0d 00 0a 20 f4 20 50 49  43 20 31 36 43 58 58 20  |... . PIC 16CXX |
00000010  73 65 72 69 65 73 20 61  73 73 65 6d 62 6c 65 72  |series assembler|
00000020  0d 00 14 23 f4 20 41 63  63 65 70 74 73 20 74 6f  |...#. Accepts to|
00000030  6b 65 6e 69 73 65 64 20  42 41 53 49 43 20 66 69  |kenised BASIC fi|
00000040  6c 65 73 0d 00 1e 29 f1  22 50 49 43 20 41 73 73  |les...)."PIC Ass|
00000050  65 6d 62 6c 65 72 20 56  30 2e 39 38 20 28 43 29  |embler V0.98 (C)|
00000060  53 50 52 4f 57 20 31 39  39 37 22 27 0d 00 28 47  |SPROW 1997"'..(G|
00000070  2a 4b 45 59 20 39 20 43  48 41 49 4e 22 41 44 46  |*KEY 9 CHAIN"ADF|
00000080  53 3a 3a 52 69 73 63 48  44 2e 24 2e 4c 61 6e 67  |S::RiscHD.$.Lang|
00000090  75 61 67 65 2e 42 61 73  69 63 56 2e 50 49 43 73  |uage.BasicV.PICs|
000000a0  2e 4b 32 50 72 6f 6a 65  63 74 2e 4b 32 73 61 75  |.K2Project.K2sau|
000000b0  63 65 22 0d 00 32 05 3a  0d 00 3c 47 f4 20 47 6c  |ce"..2.:..<G. Gl|
000000c0  6f 62 61 6c 73 20 74 6f  20 72 65 73 65 74 20 6f  |obals to reset o|
000000d0  6e 20 70 6f 77 65 72 20  75 70 2c 74 68 65 20 72  |n power up,the r|
000000e0  65 73 74 20 61 72 65 20  72 65 73 65 74 20 66 6f  |est are reset fo|
000000f0  72 20 65 61 63 68 20 6e  65 77 20 66 69 6c 65 0d  |r each new file.|
00000100  00 46 2a 73 6f 75 72 63  65 24 3d 22 22 3a f4 20  |.F*source$="":. |
00000110  54 68 65 20 66 69 6c 65  6e 61 6d 65 20 74 6f 20  |The filename to |
00000120  72 65 61 64 20 66 72 6f  6d 0d 00 50 46 6c 6f 61  |read from..PFloa|
00000130  64 65 64 25 3d a3 3a f4  20 42 6f 6f 6c 65 61 6e  |ded%=.:. Boolean|
00000140  20 66 6c 61 67 20 61 73  20 74 6f 20 77 68 65 74  | flag as to whet|
00000150  68 65 72 20 61 20 76 61  6c 69 64 20 70 72 6f 67  |her a valid prog|
00000160  72 61 6d 20 69 73 20 27  6c 6f 61 64 65 64 27 0d  |ram is 'loaded'.|
00000170  00 5a 33 6f 70 63 6f 75  6e 74 25 3d 30 3a f4 20  |.Z3opcount%=0:. |
00000180  4e 6f 2e 20 50 49 43 20  6f 70 63 6f 64 65 73 20  |No. PIC opcodes |
00000190  69 6e 20 44 41 54 41 20  73 74 61 74 65 6d 65 6e  |in DATA statemen|
000001a0  74 73 0d 00 64 3a 6b 65  79 63 6f 75 6e 74 25 3d  |ts..d:keycount%=|
000001b0  38 3a f4 20 4e 75 6d 62  65 72 20 6f 66 20 73 75  |8:. Number of su|
000001c0  70 70 6f 72 74 65 64 20  64 69 72 65 63 74 20 6d  |pported direct m|
000001d0  6f 64 65 20 63 6f 6d 6d  61 6e 64 73 0d 00 6e 33  |ode commands..n3|
000001e0  f2 72 65 73 65 74 3a f4  20 54 68 65 73 65 20 61  |.reset:. These a|
000001f0  72 65 20 61 6c 6c 20 72  65 73 65 74 20 66 6f 72  |re all reset for|
00000200  20 65 76 65 72 79 20 66  69 6c 65 20 74 6f 6f 0d  | every file too.|
00000210  00 78 05 3a 0d 00 82 1c  f4 20 43 6f 75 6e 74 20  |.x.:..... Count |
00000220  74 68 65 20 74 61 62 6c  65 20 6c 65 6e 67 74 68  |the table length|
00000230  0d 00 8c 43 f5 3a f3 62  69 74 24 2c 6d 6e 65 6d  |...C.:.bit$,mnem|
00000240  6f 6e 69 63 24 2c 6d 65  61 6e 69 6e 67 24 3a 6f  |onic$,meaning$:o|
00000250  70 63 6f 75 6e 74 25 3d  6f 70 63 6f 75 6e 74 25  |pcount%=opcount%|
00000260  2b 31 3a fd 6d 6e 65 6d  6f 6e 69 63 24 3d 22 5b  |+1:.mnemonic$="[|
00000270  5b 5b 22 0d 00 96 05 f7  0d 00 a0 0e 61 6c 6c 6f  |[[".........allo|
00000280  77 25 3d 31 32 38 0d 00  aa 45 de 20 62 69 74 24  |w%=128...E. bit$|
00000290  28 6f 70 63 6f 75 6e 74  25 29 2c 6d 6e 65 6d 6f  |(opcount%),mnemo|
000002a0  6e 69 63 24 28 6f 70 63  6f 75 6e 74 25 29 2c 6d  |nic$(opcount%),m|
000002b0  65 61 6e 69 6e 67 24 28  6f 70 63 6f 75 6e 74 25  |eaning$(opcount%|
000002c0  2b 6b 65 79 63 6f 75 6e  74 25 29 0d 00 b4 31 de  |+keycount%)...1.|
000002d0  20 6a 75 6d 70 74 6f 25  28 32 38 29 2c 74 6f 6b  | jumpto%(28),tok|
000002e0  65 6e 24 28 31 32 37 29  2c 6b 65 79 77 6f 72 64  |en$(127),keyword|
000002f0  24 28 6b 65 79 63 6f 75  6e 74 25 29 0d 00 be 49  |$(keycount%)...I|
00000300  de 20 73 74 72 69 6e 67  24 28 61 6c 6c 6f 77 25  |. string$(allow%|
00000310  20 81 38 29 2c 69 6e 74  65 67 65 72 25 28 61 6c  | .8),integer%(al|
00000320  6c 6f 77 25 20 81 34 29  2c 72 65 61 6c 28 61 6c  |low% .4),real(al|
00000330  6c 6f 77 25 29 2c 6e 61  6d 65 24 28 61 6c 6c 6f  |low%),name$(allo|
00000340  77 25 2a 32 29 0d 00 c8  05 3a 0d 00 d2 15 e3 64  |w%*2)....:.....d|
00000350  61 74 61 25 3d 31 b8 6f  70 63 6f 75 6e 74 25 0d  |ata%=1.opcount%.|
00000360  00 dc 31 f3 62 69 74 24  28 64 61 74 61 25 29 2c  |..1.bit$(data%),|
00000370  6d 6e 65 6d 6f 6e 69 63  24 28 64 61 74 61 25 29  |mnemonic$(data%)|
00000380  2c 6d 65 61 6e 69 6e 67  24 28 64 61 74 61 25 29  |,meaning$(data%)|
00000390  0d 00 e6 86 e7 c0 6d 6e  65 6d 6f 6e 69 63 24 28  |......mnemonic$(|
000003a0  64 61 74 61 25 29 2c 31  29 3c 3e 64 65 6c 74 61  |data%),1)<>delta|
000003b0  24 20 8c 6a 75 6d 70 74  6f 25 28 31 2b 97 28 64  |$ .jumpto%(1+.(d|
000003c0  65 6c 74 61 24 29 2d 36  34 29 3d 64 61 74 61 25  |elta$)-64)=data%|
000003d0  3a 6a 75 6d 70 74 6f 25  28 97 28 c0 6d 6e 65 6d  |:jumpto%(.(.mnem|
000003e0  6f 6e 69 63 24 28 64 61  74 61 25 29 2c 31 29 29  |onic$(data%),1))|
000003f0  2d 36 34 29 3d 64 61 74  61 25 3a 64 65 6c 74 61  |-64)=data%:delta|
00000400  24 3d c0 6d 6e 65 6d 6f  6e 69 63 24 28 64 61 74  |$=.mnemonic$(dat|
00000410  61 25 29 2c 31 29 0d 00  f0 44 ed 3a f4 20 42 75  |a%),1)...D.:. Bu|
00000420  69 6c 64 20 61 20 74 61  62 6c 65 20 6c 69 6e 6b  |ild a table link|
00000430  69 6e 67 20 31 73 74 20  6d 6e 65 6d 6f 6e 69 63  |ing 1st mnemonic|
00000440  20 6c 65 74 74 65 72 73  20 74 6f 20 61 72 72 61  | letters to arra|
00000450  79 20 65 6c 65 6d 65 6e  74 73 0d 00 fa 05 3a 0d  |y elements....:.|
00000460  01 04 05 f5 0d 01 0e 27  f3 74 6f 6b 65 6e 24 3a  |.......'.token$:|
00000470  74 6f 6b 65 6e 6e 75 6d  25 3d a0 28 22 26 22 2b  |tokennum%=.("&"+|
00000480  c0 74 6f 6b 65 6e 24 2c  32 29 29 0d 01 18 2e 74  |.token$,2))....t|
00000490  6f 6b 65 6e 24 28 74 6f  6b 65 6e 6e 75 6d 25 2d  |oken$(tokennum%-|
000004a0  31 32 38 29 3d c2 74 6f  6b 65 6e 24 2c a9 28 74  |128)=.token$,.(t|
000004b0  6f 6b 65 6e 24 29 2d 32  29 0d 01 22 14 fd c0 74  |oken$)-2).."...t|
000004c0  6f 6b 65 6e 24 2c 32 29  3d 22 46 46 22 0d 01 2c  |oken$,2)="FF"..,|
000004d0  05 3a 0d 01 36 16 e3 64  61 74 61 25 3d 31 b8 6b  |.:..6..data%=1.k|
000004e0  65 79 63 6f 75 6e 74 25  0d 01 40 2d f3 6b 65 79  |eycount%..@-.key|
000004f0  77 6f 72 64 24 28 64 61  74 61 25 29 2c 6d 65 61  |word$(data%),mea|
00000500  6e 69 6e 67 24 28 6f 70  63 6f 75 6e 74 25 2b 64  |ning$(opcount%+d|
00000510  61 74 61 25 29 0d 01 4a  05 ed 0d 01 54 05 3a 0d  |ata%)..J....T.:.|
00000520  01 5e 0e ee 85 f6 3a f1  9e 3a d9 23 30 0d 01 68  |.^....:..:.#0..h|
00000530  05 f5 0d 01 72 11 e8 86  22 3e 22 63 6f 6d 6d 61  |....r...">"comma|
00000540  6e 64 24 0d 01 7c 2a 63  6f 6d 6d 61 6e 64 24 3d  |nd$..|*command$=|
00000550  a4 73 74 72 69 70 6c 65  66 74 28 63 6f 6d 6d 61  |.stripleft(comma|
00000560  6e 64 24 29 3a 66 6f 75  6e 64 25 3d a3 0d 01 86  |nd$):found%=....|
00000570  40 e7 c0 63 6f 6d 6d 61  6e 64 24 2c 34 29 3d 22  |@..command$,4)="|
00000580  48 45 4c 50 22 20 8c 66  6f 75 6e 64 25 3d a4 68  |HELP" .found%=.h|
00000590  65 6c 70 28 c2 63 6f 6d  6d 61 6e 64 24 2c a9 28  |elp(.command$,.(|
000005a0  63 6f 6d 6d 61 6e 64 24  29 2d 34 29 29 0d 01 90  |command$)-4))...|
000005b0  42 e7 c0 63 6f 6d 6d 61  6e 64 24 2c 35 29 3d 22  |B..command$,5)="|
000005c0  43 48 41 49 4e 22 20 8c  66 6f 75 6e 64 25 3d a4  |CHAIN" .found%=.|
000005d0  63 68 61 69 6e 28 c2 63  6f 6d 6d 61 6e 64 24 2c  |chain(.command$,|
000005e0  a9 28 63 6f 6d 6d 61 6e  64 24 29 2d 35 29 29 0d  |.(command$)-5)).|
000005f0  01 9a 49 e7 c0 63 6f 6d  6d 61 6e 64 24 2c 34 29  |..I..command$,4)|
00000600  3d 22 4c 4f 41 44 22 20  8c 66 6f 75 6e 64 25 3d  |="LOAD" .found%=|
00000610  a4 6c 6f 61 64 28 c2 63  6f 6d 6d 61 6e 64 24 2c  |.load(.command$,|
00000620  a9 28 63 6f 6d 6d 61 6e  64 24 29 2d 34 29 29 3a  |.(command$)-4)):|
00000630  66 6f 75 6e 64 25 3d b9  0d 01 a4 40 e7 c0 63 6f  |found%=....@..co|
00000640  6d 6d 61 6e 64 24 2c 34  29 3d 22 4c 49 53 54 22  |mmand$,4)="LIST"|
00000650  20 8c 66 6f 75 6e 64 25  3d a4 6c 69 73 74 28 c2  | .found%=.list(.|
00000660  63 6f 6d 6d 61 6e 64 24  2c a9 28 63 6f 6d 6d 61  |command$,.(comma|
00000670  6e 64 24 29 2d 34 29 29  0d 01 ae 40 e7 c0 63 6f  |nd$)-4))...@..co|
00000680  6d 6d 61 6e 64 24 2c 34  29 3d 22 51 55 49 54 22  |mmand$,4)="QUIT"|
00000690  20 8c 66 6f 75 6e 64 25  3d a4 71 75 69 74 28 c2  | .found%=.quit(.|
000006a0  63 6f 6d 6d 61 6e 64 24  2c a9 28 63 6f 6d 6d 61  |command$,.(comma|
000006b0  6e 64 24 29 2d 34 29 29  0d 01 b8 3e e7 c0 63 6f  |nd$)-4))...>..co|
000006c0  6d 6d 61 6e 64 24 2c 33  29 3d 22 52 55 4e 22 20  |mmand$,3)="RUN" |
000006d0  8c 66 6f 75 6e 64 25 3d  a4 72 75 6e 28 c2 63 6f  |.found%=.run(.co|
000006e0  6d 6d 61 6e 64 24 2c a9  28 63 6f 6d 6d 61 6e 64  |mmand$,.(command|
000006f0  24 29 2d 33 29 29 0d 01  c2 47 e7 c0 63 6f 6d 6d  |$)-3))...G..comm|
00000700  61 6e 64 24 2c 33 29 3d  22 43 4c 53 22 20 8c 66  |and$,3)="CLS" .f|
00000710  6f 75 6e 64 25 3d a4 63  6c 73 28 c2 63 6f 6d 6d  |ound%=.cls(.comm|
00000720  61 6e 64 24 2c a9 28 63  6f 6d 6d 61 6e 64 24 29  |and$,.(command$)|
00000730  2d 33 29 29 3a 66 6f 75  6e 64 25 3d b9 0d 01 cc  |-3)):found%=....|
00000740  43 e7 c0 63 6f 6d 6d 61  6e 64 24 2c 34 29 3d 22  |C..command$,4)="|
00000750  53 54 4f 50 22 20 8c 66  6f 75 6e 64 25 3d ac 28  |STOP" .found%=.(|
00000760  a4 73 74 6f 70 28 c2 63  6f 6d 6d 61 6e 64 24 2c  |.stop(.command$,|
00000770  a9 28 63 6f 6d 6d 61 6e  64 24 29 2d 34 29 29 29  |.(command$)-4)))|
00000780  0d 01 d6 3b e7 c0 63 6f  6d 6d 61 6e 64 24 2c 31  |...;..command$,1|
00000790  29 3d 22 2a 22 20 8c 66  6f 75 6e 64 25 3d b9 3a  |)="*" .found%=.:|
000007a0  ff 28 c2 63 6f 6d 6d 61  6e 64 24 2c a9 28 63 6f  |.(.command$,.(co|
000007b0  6d 6d 61 6e 64 24 29 2d  31 29 29 0d 01 e0 35 e7  |mmand$)-1))...5.|
000007c0  66 6f 75 6e 64 25 3d a3  20 80 a9 63 6f 6d 6d 61  |found%=. ..comma|
000007d0  6e 64 24 3e 30 20 8c f1  27 22 43 6f 6d 6d 61 6e  |nd$>0 ..'"Comman|
000007e0  64 20 6e 6f 74 20 73 75  70 70 6f 72 74 65 64 22  |d not supported"|
000007f0  0d 01 ea 21 fd a4 6e 6f  77 69 6c 64 28 63 6f 6d  |...!..nowild(com|
00000800  6d 61 6e 64 24 2c 22 20  22 29 3d 22 51 55 49 54  |mand$," ")="QUIT|
00000810  22 0d 01 f4 05 e0 0d 01  fe 05 3a 0d 02 08 16 dd  |".........:.....|
00000820  a4 71 75 69 74 28 70 61  72 61 6d 65 74 65 72 24  |.quit(parameter$|
00000830  29 0d 02 12 35 e7 a4 6e  6f 77 69 6c 64 28 70 61  |)...5..nowild(pa|
00000840  72 61 6d 65 74 65 72 24  2c 22 20 22 29 3c 3e 22  |rameter$," ")<>"|
00000850  22 20 8c f1 27 22 53 79  6e 74 61 78 20 65 72 72  |" ..'"Syntax err|
00000860  6f 72 22 3a 3d b9 0d 02  1c 4a ff 28 22 53 41 56  |or":=....J.("SAV|
00000870  45 20 66 72 6f 6d 30 39  38 20 22 2b c3 7e 28 63  |E from098 "+.~(c|
00000880  6f 64 65 25 29 2b 22 20  2b 22 2b c3 7e 28 32 2a  |ode%)+" +"+.~(2*|
00000890  a4 66 69 6e 64 76 61 6c  75 65 28 22 50 25 22 29  |.findvalue("P%")|
000008a0  29 2b 22 20 30 20 46 46  46 46 46 38 30 30 22 29  |)+" 0 FFFFF800")|
000008b0  0d 02 26 06 3d b9 0d 02  30 05 3a 0d 02 3a 15 dd  |..&.=...0.:..:..|
000008c0  a4 72 75 6e 28 70 61 72  61 6d 65 74 65 72 24 29  |.run(parameter$)|
000008d0  0d 02 44 35 e7 a4 6e 6f  77 69 6c 64 28 70 61 72  |..D5..nowild(par|
000008e0  61 6d 65 74 65 72 24 2c  22 20 22 29 3c 3e 22 22  |ameter$," ")<>""|
000008f0  20 8c f1 27 22 53 79 6e  74 61 78 20 65 72 72 6f  | ..'"Syntax erro|
00000900  72 22 3a 3d b9 0d 02 4e  28 e7 6c 6f 61 64 65 64  |r":=...N(.loaded|
00000910  25 3d a3 20 8c f1 27 22  4e 6f 20 70 72 6f 67 72  |%=. ..'"No progr|
00000920  61 6d 20 6c 6f 61 64 65  64 22 3a 3d b9 0d 02 58  |am loaded":=...X|
00000930  1c 3d a4 63 68 61 69 6e  28 bd 33 34 2b 73 6f 75  |.=.chain(.34+sou|
00000940  72 63 65 24 2b bd 33 34  29 0d 02 62 05 3a 0d 02  |rce$+.34)..b.:..|
00000950  6c 16 dd a4 68 65 6c 70  28 70 61 72 61 6d 65 74  |l...help(paramet|
00000960  65 72 24 29 0d 02 76 1b  ea 64 61 74 61 25 2c 66  |er$)..v..data%,f|
00000970  6f 75 6e 64 25 2c 6d 6e  65 6d 6f 6e 69 63 24 0d  |ound%,mnemonic$.|
00000980  02 80 26 70 61 72 61 6d  65 74 65 72 24 3d a4 6e  |..&parameter$=.n|
00000990  6f 77 69 6c 64 28 70 61  72 61 6d 65 74 65 72 24  |owild(parameter$|
000009a0  2c 22 20 22 29 0d 02 8a  20 f4 20 41 73 6b 69 6e  |," ")... . Askin|
000009b0  67 20 66 6f 72 20 68 65  6c 70 20 69 6e 20 67 65  |g for help in ge|
000009c0  6e 65 72 61 6c 0d 02 94  73 e7 70 61 72 61 6d 65  |neral...s.parame|
000009d0  74 65 72 24 3d 22 22 20  8c f1 22 48 65 6c 70 20  |ter$="" .."Help |
000009e0  69 73 20 61 76 61 69 6c  61 62 6c 65 20 6f 6e 20  |is available on |
000009f0  74 68 65 20 66 6f 6c 6c  6f 77 69 6e 67 3a 22 27  |the following:"'|
00000a00  22 48 45 4c 50 20 3c 61  73 73 65 6d 62 6c 65 72  |"HELP <assembler|
00000a10  20 6d 6e 65 6d 6f 6e 69  63 3e 22 27 22 48 45 4c  | mnemonic>"'"HEL|
00000a20  50 20 3c 63 6f 6d 6d 61  6e 64 3e 22 27 22 48 45  |P <command>"'"HE|
00000a30  4c 50 20 2e 22 3a 3d b9  0d 02 9e 21 f4 20 4c 6f  |LP .":=....!. Lo|
00000a40  6f 6b 20 74 68 72 6f 75  67 68 20 6b 65 79 77 6f  |ok through keywo|
00000a50  72 64 73 20 66 69 72 73  74 0d 02 a8 3b e7 70 61  |rds first...;.pa|
00000a60  72 61 6d 65 74 65 72 24  3d 22 2e 22 20 8c ef 31  |rameter$="." ..1|
00000a70  34 3a f1 22 48 65 6c 70  20 77 69 74 68 20 64 69  |4:."Help with di|
00000a80  72 65 63 74 20 6d 6f 64  65 20 6b 65 79 77 6f 72  |rect mode keywor|
00000a90  64 73 3a 22 0d 02 b2 16  e3 64 61 74 61 25 3d 31  |ds:".....data%=1|
00000aa0  b8 6b 65 79 63 6f 75 6e  74 25 0d 02 bc 8c e7 70  |.keycount%.....p|
00000ab0  61 72 61 6d 65 74 65 72  24 3d c0 6b 65 79 77 6f  |arameter$=.keywo|
00000ac0  72 64 24 28 64 61 74 61  25 29 2c a9 28 70 61 72  |rd$(data%),.(par|
00000ad0  61 6d 65 74 65 72 24 29  29 20 84 70 61 72 61 6d  |ameter$)) .param|
00000ae0  65 74 65 72 24 3d 22 2e  22 20 8c f1 6b 65 79 77  |eter$="." ..keyw|
00000af0  6f 72 64 24 28 64 61 74  61 25 29 3b 22 20 2d 20  |ord$(data%);" - |
00000b00  22 3b 6d 65 61 6e 69 6e  67 24 28 6f 70 63 6f 75  |";meaning$(opcou|
00000b10  6e 74 25 2b 64 61 74 61  25 29 3a 66 6f 75 6e 64  |nt%+data%):found|
00000b20  25 3d b9 3a f4 20 41 6c  6c 20 68 65 6c 70 20 73  |%=.:. All help s|
00000b30  75 70 70 6f 72 74 0d 02  c6 05 ed 0d 02 d0 17 f4  |upport..........|
00000b40  20 49 73 20 69 74 20 61  20 6d 6e 65 6d 6f 6e 69  | Is it a mnemoni|
00000b50  63 3f 0d 02 da 31 e7 70  61 72 61 6d 65 74 65 72  |c?...1.parameter|
00000b60  24 3d 22 2e 22 20 8c f1  27 22 48 65 6c 70 20 77  |$="." ..'"Help w|
00000b70  69 74 68 20 74 68 65 20  61 73 73 65 6d 62 6c 65  |ith the assemble|
00000b80  72 3a 22 0d 02 e4 21 70  61 72 61 6d 65 74 65 72  |r:"...!parameter|
00000b90  24 3d a4 75 63 61 73 65  28 70 61 72 61 6d 65 74  |$=.ucase(paramet|
00000ba0  65 72 24 29 0d 02 ee 19  e3 64 61 74 61 25 3d 31  |er$).....data%=1|
00000bb0  b8 28 6f 70 63 6f 75 6e  74 25 2d 31 29 0d 02 f8  |.(opcount%-1)...|
00000bc0  2f 6d 6e 65 6d 6f 6e 69  63 24 3d a4 66 69 6e 64  |/mnemonic$=.find|
00000bd0  77 69 6c 64 28 31 2c 6d  6e 65 6d 6f 6e 69 63 24  |wild(1,mnemonic$|
00000be0  28 64 61 74 61 25 29 2c  22 20 22 29 0d 03 02 7e  |(data%)," ")...~|
00000bf0  e7 70 61 72 61 6d 65 74  65 72 24 3d c0 6d 6e 65  |.parameter$=.mne|
00000c00  6d 6f 6e 69 63 24 2c a9  28 70 61 72 61 6d 65 74  |monic$,.(paramet|
00000c10  65 72 24 29 29 20 84 70  61 72 61 6d 65 74 65 72  |er$)) .parameter|
00000c20  24 3d 22 2e 22 20 8c f1  6d 6e 65 6d 6f 6e 69 63  |$="." ..mnemonic|
00000c30  24 28 64 61 74 61 25 29  3b 22 20 2d 20 22 3b 6d  |$(data%);" - ";m|
00000c40  65 61 6e 69 6e 67 24 28  64 61 74 61 25 29 3a 66  |eaning$(data%):f|
00000c50  6f 75 6e 64 25 3d b9 3a  f4 20 41 6c 6c 20 68 65  |ound%=.:. All he|
00000c60  6c 70 20 73 75 70 70 6f  72 74 0d 03 0c 05 ed 0d  |lp support......|
00000c70  03 16 37 e7 66 6f 75 6e  64 25 3d a3 20 8c f1 27  |..7.found%=. ..'|
00000c80  22 4e 6f 20 68 65 6c 70  20 61 76 61 69 6c 61 62  |"No help availab|
00000c90  6c 65 20 6f 6e 20 74 68  61 74 20 74 6f 70 69 63  |le on that topic|
00000ca0  22 20 8b ef 31 35 0d 03  20 06 3d b9 0d 03 2a 05  |" ..15.. .=...*.|
00000cb0  3a 0d 03 34 16 dd a4 6c  6f 61 64 28 70 61 72 61  |:..4...load(para|
00000cc0  6d 65 74 65 72 24 29 0d  03 3e 39 70 61 72 61 6d  |meter$)..>9param|
00000cd0  65 74 65 72 24 3d a4 73  74 72 69 70 72 69 67 68  |eter$=.striprigh|
00000ce0  74 28 a4 73 74 72 69 70  6c 65 66 74 28 70 61 72  |t(.stripleft(par|
00000cf0  61 6d 65 74 65 72 24 29  29 3a f2 72 65 73 65 74  |ameter$)):.reset|
00000d00  0d 03 48 1d f4 20 43 68  65 63 6b 20 66 6f 72 20  |..H.. Check for |
00000d10  6f 70 65 6e 69 6e 67 20  64 69 74 74 6f 0d 03 52  |opening ditto..R|
00000d20  31 e7 c0 70 61 72 61 6d  65 74 65 72 24 2c 31 29  |1..parameter$,1)|
00000d30  3c 3e bd 33 34 20 8c f1  27 22 4e 6f 20 73 75 63  |<>.34 ..'"No suc|
00000d40  68 20 76 61 72 69 61 62  6c 65 22 3a 3d a3 0d 03  |h variable":=...|
00000d50  5c 1d f4 20 43 68 65 63  6b 20 66 6f 72 20 63 6c  |\.. Check for cl|
00000d60  6f 73 69 6e 67 20 64 69  74 74 6f 0d 03 66 31 6c  |osing ditto..f1l|
00000d70  61 73 74 64 69 74 74 6f  25 3d a7 c2 70 61 72 61  |astditto%=..para|
00000d80  6d 65 74 65 72 24 2c a9  28 70 61 72 61 6d 65 74  |meter$,.(paramet|
00000d90  65 72 24 29 2d 31 29 2c  bd 33 34 29 0d 03 70 26  |er$)-1),.34)..p&|
00000da0  e7 6c 61 73 74 64 69 74  74 6f 25 3d 30 20 8c f1  |.lastditto%=0 ..|
00000db0  27 22 4d 69 73 73 69 6e  67 20 22 2b bd 33 34 3a  |'"Missing "+.34:|
00000dc0  3d a3 0d 03 7a 27 f4 20  4c 6f 6f 6b 20 66 6f 72  |=...z'. Look for|
00000dd0  20 61 6e 79 6d 6f 72 65  20 74 65 78 74 20 6f 6e  | anymore text on|
00000de0  20 74 68 65 20 6c 69 6e  65 0d 03 84 35 e7 28 6c  | the line...5.(l|
00000df0  61 73 74 64 69 74 74 6f  25 2b 31 29 3c 3e a9 70  |astditto%+1)<>.p|
00000e00  61 72 61 6d 65 74 65 72  24 20 8c f1 27 22 53 79  |arameter$ ..'"Sy|
00000e10  6e 74 61 78 20 65 72 72  6f 72 22 3a 3d a3 0d 03  |ntax error":=...|
00000e20  8e 28 69 6e 25 3d 8e 20  c1 70 61 72 61 6d 65 74  |.(in%=. .paramet|
00000e30  65 72 24 2c 32 2c a9 28  70 61 72 61 6d 65 74 65  |er$,2,.(paramete|
00000e40  72 24 29 2d 32 29 0d 03  98 21 e7 69 6e 25 3d 30  |r$)-2)...!.in%=0|
00000e50  20 8c f1 27 22 46 69 6c  65 20 6e 6f 74 20 66 6f  | ..'"File not fo|
00000e60  75 6e 64 22 3a 3d a3 0d  03 a2 32 e7 9a 23 69 6e  |und":=....2..#in|
00000e70  25 3c 3e 31 33 20 8c f1  27 22 42 61 64 20 70 72  |%<>13 ..'"Bad pr|
00000e80  6f 67 72 61 6d 22 3a 6c  6f 61 64 65 64 25 3d a3  |ogram":loaded%=.|
00000e90  3a d9 23 69 6e 25 3a 3d  a3 0d 03 ac 13 cf 23 69  |:.#in%:=......#i|
00000ea0  6e 25 3d 28 a2 23 69 6e  25 29 2d 31 0d 03 b6 33  |n%=(.#in%)-1...3|
00000eb0  e7 9a 23 69 6e 25 3c 3e  32 35 35 20 8c f1 27 22  |..#in%<>255 ..'"|
00000ec0  42 61 64 20 70 72 6f 67  72 61 6d 22 3a 6c 6f 61  |Bad program":loa|
00000ed0  64 65 64 25 3d a3 3a d9  23 69 6e 25 3a 3d a3 0d  |ded%=.:.#in%:=..|
00000ee0  03 c0 3a 6c 6f 61 64 65  64 25 3d b9 3a d9 23 69  |..:loaded%=.:.#i|
00000ef0  6e 25 3a 73 6f 75 72 63  65 24 3d c1 70 61 72 61  |n%:source$=.para|
00000f00  6d 65 74 65 72 24 2c 32  2c a9 28 70 61 72 61 6d  |meter$,2,.(param|
00000f10  65 74 65 72 24 29 2d 32  29 0d 03 ca 06 3d b9 0d  |eter$)-2)....=..|
00000f20  03 d4 05 3a 0d 03 de 16  dd a4 6c 69 73 74 28 70  |...:......list(p|
00000f30  61 72 61 6d 65 74 65 72  24 29 0d 03 e8 24 f4 20  |arameter$)...$. |
00000f40  4c 69 73 74 20 61 20 70  72 6f 67 72 61 6d 20 6f  |List a program o|
00000f50  6e 74 6f 20 74 68 65 20  73 63 72 65 65 6e 0d 03  |nto the screen..|
00000f60  f2 40 ea 6c 69 6e 65 6e  75 6d 24 2c 6c 69 6e 65  |.@.linenum$,line|
00000f70  6e 75 6d 25 2c 6d 69 6e  6c 69 6e 65 25 2c 6d 61  |num%,minline%,ma|
00000f80  78 6c 69 6e 65 25 2c 72  61 6e 67 65 68 69 24 2c  |xline%,rangehi$,|
00000f90  72 61 6e 67 65 6c 6f 24  2c 62 79 74 65 25 0d 03  |rangelo$,byte%..|
00000fa0  fc 28 e7 6c 6f 61 64 65  64 25 3d a3 20 8c f1 27  |.(.loaded%=. ..'|
00000fb0  22 4e 6f 20 70 72 6f 67  72 61 6d 20 6c 6f 61 64  |"No program load|
00000fc0  65 64 22 3a 3d b9 0d 04  06 1c f4 20 52 65 61 64  |ed":=...... Read|
00000fd0  20 61 6e 79 20 6f 70 74  69 6f 6e 73 20 67 69 76  | any options giv|
00000fe0  65 6e 0d 04 10 26 70 61  72 61 6d 65 74 65 72 24  |en...&parameter$|
00000ff0  3d a4 6e 6f 77 69 6c 64  28 70 61 72 61 6d 65 74  |=.nowild(paramet|
00001000  65 72 24 2c 22 20 22 29  0d 04 1a 57 72 61 6e 67  |er$," ")...Wrang|
00001010  65 6c 6f 24 3d a4 66 69  6e 64 77 69 6c 64 28 31  |elo$=.findwild(1|
00001020  2c 70 61 72 61 6d 65 74  65 72 24 2c 22 2c 22 29  |,parameter$,",")|
00001030  3a 72 61 6e 67 65 68 69  24 3d a4 66 69 6e 64 77  |:rangehi$=.findw|
00001040  69 6c 64 28 32 2b a9 72  61 6e 67 65 6c 6f 24 2c  |ild(2+.rangelo$,|
00001050  70 61 72 61 6d 65 74 65  72 24 2c 22 2c 22 29 0d  |parameter$,",").|
00001060  04 24 27 f4 20 4e 6f 77  20 77 6f 72 6b 20 6f 75  |.$'. Now work ou|
00001070  74 20 77 68 69 63 68 20  6c 69 6e 65 73 20 61 72  |t which lines ar|
00001080  65 20 72 65 71 64 0d 04  2e 37 e7 72 61 6e 67 65  |e reqd...7.range|
00001090  68 69 24 3d 22 22 20 80  a7 70 61 72 61 6d 65 74  |hi$="" ..paramet|
000010a0  65 72 24 2c 22 2c 22 29  3d 30 20 8c 72 61 6e 67  |er$,",")=0 .rang|
000010b0  65 68 69 24 3d 72 61 6e  67 65 6c 6f 24 0d 04 38  |ehi$=rangelo$..8|
000010c0  37 e7 72 61 6e 67 65 68  69 24 3d 22 22 20 80 a7  |7.rangehi$="" ..|
000010d0  70 61 72 61 6d 65 74 65  72 24 2c 22 2c 22 29 3c  |parameter$,",")<|
000010e0  3e 30 20 8c 72 61 6e 67  65 68 69 24 3d 22 26 38  |>0 .rangehi$="&8|
000010f0  30 30 30 22 0d 04 42 21  e7 70 61 72 61 6d 65 74  |000"..B!.paramet|
00001100  65 72 24 3d 22 2c 22 20  8c 72 61 6e 67 65 6c 6f  |er$="," .rangelo|
00001110  24 3d 22 30 22 0d 04 4c  50 e7 72 61 6e 67 65 68  |$="0"..LP.rangeh|
00001120  69 24 2b 72 61 6e 67 65  6c 6f 24 3d 22 22 20 8c  |i$+rangelo$="" .|
00001130  6d 61 78 6c 69 6e 65 25  3d 26 38 30 30 30 20 8b  |maxline%=&8000 .|
00001140  6d 69 6e 6c 69 6e 65 25  3d a0 72 61 6e 67 65 6c  |minline%=.rangel|
00001150  6f 24 3a 6d 61 78 6c 69  6e 65 25 3d a0 72 61 6e  |o$:maxline%=.ran|
00001160  67 65 68 69 24 0d 04 56  53 70 6f 69 6e 74 65 72  |gehi$..VSpointer|
00001170  25 3d 31 3a 69 6e 25 3d  8e 73 6f 75 72 63 65 24  |%=1:in%=.source$|
00001180  3a cf 23 69 6e 25 3d 31  3a ef 31 31 3a f4 20 42  |:.#in%=1:.11:. B|
00001190  61 63 6b 75 70 20 6f 6e  65 20 6c 69 6e 65 2c 61  |ackup one line,a|
000011a0  6e 64 20 73 6b 69 70 20  70 61 73 74 20 6f 70 65  |nd skip past ope|
000011b0  6e 69 6e 67 20 26 30 44  0d 04 60 05 f5 0d 04 6a  |ning &0D..`....j|
000011c0  30 62 79 74 65 25 3d 9a  23 69 6e 25 3a f4 20 54  |0byte%=.#in%:. T|
000011d0  68 65 20 68 69 20 62 79  74 65 20 6f 66 20 74 68  |he hi byte of th|
000011e0  65 20 6c 69 6e 65 20 6e  75 6d 62 65 72 0d 04 74  |e line number..t|
000011f0  4a 6c 69 6e 65 6e 75 6d  25 3d 28 62 79 74 65 25  |Jlinenum%=(byte%|
00001200  2a 32 35 36 29 2b 9a 23  69 6e 25 3a 6c 69 6e 65  |*256)+.#in%:line|
00001210  6e 75 6d 24 3d c4 35 2d  a9 28 c3 28 6c 69 6e 65  |num$=.5-.(.(line|
00001220  6e 75 6d 25 29 29 2c 22  20 22 29 2b c3 28 6c 69  |num%))," ")+.(li|
00001230  6e 65 6e 75 6d 25 29 0d  04 7e 27 f4 20 42 65 a0  |nenum%)..~'. Be.|
00001240  73 69 6c 65 6e 74 20 69  66 20 6e 6f 74 20 69 6e  |silent if not in|
00001250  20 6c 69 73 74 69 6e 67  20 72 61 6e 67 65 0d 04  | listing range..|
00001260  88 3b e7 28 6c 69 6e 65  6e 75 6d 25 3e 3d 6d 69  |.;.(linenum%>=mi|
00001270  6e 6c 69 6e 65 25 29 80  28 6c 69 6e 65 6e 75 6d  |nline%).(linenum|
00001280  25 3c 3d 6d 61 78 6c 69  6e 65 25 29 20 8c f1 27  |%<=maxline%) ..'|
00001290  6c 69 6e 65 6e 75 6d 24  3b 0d 04 92 26 70 6f 69  |linenum$;...&poi|
000012a0  6e 74 65 72 25 3d 70 6f  69 6e 74 65 72 25 2b 33  |nter%=pointer%+3|
000012b0  3a cf 23 69 6e 25 3d 70  6f 69 6e 74 65 72 25 0d  |:.#in%=pointer%.|
000012c0  04 9c 62 e7 28 6c 69 6e  65 6e 75 6d 25 3c 6d 69  |..b.(linenum%<mi|
000012d0  6e 6c 69 6e 65 25 29 84  28 6c 69 6e 65 6e 75 6d  |nline%).(linenum|
000012e0  25 3e 6d 61 78 6c 69 6e  65 25 29 20 8c f5 3a 62  |%>maxline%) ..:b|
000012f0  79 74 65 25 3d 9a 23 69  6e 25 3a fd 62 79 74 65  |yte%=.#in%:.byte|
00001300  25 3d 31 33 3a cf 23 69  6e 25 3d 8f 23 69 6e 25  |%=13:.#in%=.#in%|
00001310  2d 31 3a 70 6f 69 6e 74  65 72 25 3d 8f 23 69 6e  |-1:pointer%=.#in|
00001320  25 0d 04 a6 05 f5 0d 04  b0 0f 62 79 74 65 25 3d  |%.........byte%=|
00001330  9a 23 69 6e 25 0d 04 ba  2e e7 62 79 74 65 25 3c  |.#in%.....byte%<|
00001340  31 32 37 20 8c ef 62 79  74 65 25 20 8b f1 3b a4  |127 ..byte% ..;.|
00001350  75 6e 70 61 63 6b 74 6f  6b 65 6e 28 62 79 74 65  |unpacktoken(byte|
00001360  25 29 3b 0d 04 c4 17 70  6f 69 6e 74 65 72 25 3d  |%);....pointer%=|
00001370  70 6f 69 6e 74 65 72 25  2b 31 0d 04 ce 22 fd 62  |pointer%+1...".b|
00001380  79 74 65 25 3d 31 33 20  84 70 6f 69 6e 74 65 72  |yte%=13 .pointer|
00001390  25 3e 3d 28 a2 23 69 6e  25 2d 31 29 0d 04 d8 2b  |%>=(.#in%-1)...+|
000013a0  fd 70 6f 69 6e 74 65 72  25 3e 3d 28 a2 23 69 6e  |.pointer%>=(.#in|
000013b0  25 2d 31 29 20 84 6c 69  6e 65 6e 75 6d 25 3e 6d  |%-1) .linenum%>m|
000013c0  61 78 6c 69 6e 65 25 0d  04 e2 0b f1 3a d9 23 69  |axline%.....:.#i|
000013d0  6e 25 0d 04 ec 06 3d b9  0d 04 f6 05 3a 0d 05 00  |n%....=.....:...|
000013e0  17 dd a4 63 68 61 69 6e  28 70 61 72 61 6d 65 74  |...chain(paramet|
000013f0  65 72 24 29 0d 05 0a 29  ea 77 6f 72 6b 24 2c 72  |er$)...).work$,r|
00001400  65 73 75 6c 74 25 2c 6d  61 78 6c 69 6e 65 25 2c  |esult%,maxline%,|
00001410  64 61 74 61 25 2c 6c 65  6e 67 74 68 25 0d 05 14  |data%,length%...|
00001420  1c e7 a4 6c 6f 61 64 28  70 61 72 61 6d 65 74 65  |...load(paramete|
00001430  72 24 29 3d a3 20 8c 3d  b9 0d 05 1e 2d 69 6e 25  |r$)=. .=....-in%|
00001440  3d 8e 73 6f 75 72 63 65  24 3a 6c 65 6e 67 74 68  |=.source$:length|
00001450  25 3d 28 a2 23 69 6e 25  29 2d 32 3a 6d 61 78 6c  |%=(.#in%)-2:maxl|
00001460  69 6e 65 25 3d 31 0d 05  28 2c f4 20 4e 6f 77 2c  |ine%=1..(,. Now,|
00001470  72 65 70 65 61 74 65 64  6c 79 20 73 65 6c 65 63  |repeatedly selec|
00001480  74 20 74 68 65 20 69 6e  74 65 72 70 72 65 74 74  |t the interprett|
00001490  65 72 0d 05 32 05 f5 0d  05 3c 36 20 77 6f 72 6b  |er..2....<6 work|
000014a0  24 3d 22 22 3a cf 23 69  6e 25 3d 8f 23 69 6e 25  |$="":.#in%=.#in%|
000014b0  2b 32 2b b4 6d 61 78 6c  69 6e 65 25 3a 6d 61 78  |+2+.maxline%:max|
000014c0  6c 69 6e 65 25 3d 9a 23  69 6e 25 2d 34 0d 05 46  |line%=.#in%-4..F|
000014d0  2d 20 e3 64 61 74 61 25  3d 31 b8 6d 61 78 6c 69  |- .data%=1.maxli|
000014e0  6e 65 25 3a 77 6f 72 6b  24 3d 77 6f 72 6b 24 2b  |ne%:work$=work$+|
000014f0  bd 28 9a 23 69 6e 25 29  3a ed 0d 05 50 30 20 e7  |.(.#in%):...P0 .|
00001500  a7 22 5b 5d 22 2c c0 77  6f 72 6b 24 2c 31 29 29  |."[]",.work$,1))|
00001510  3c 3e 30 20 8c 69 6e 61  73 6d 25 3d b4 28 97 77  |<>0 .inasm%=.(.w|
00001520  6f 72 6b 24 2d 97 22 5d  22 29 0d 05 5a 3e 20 e7  |ork$-."]")..Z> .|
00001530  69 6e 61 73 6d 25 3d a3  20 8c 72 65 73 75 6c 74  |inasm%=. .result|
00001540  25 3d a4 69 6e 62 61 73  69 63 28 77 6f 72 6b 24  |%=.inbasic(work$|
00001550  29 20 8b 72 65 73 75 6c  74 25 3d a4 69 6e 61 73  |) .result%=.inas|
00001560  6d 28 77 6f 72 6b 24 29  0d 05 64 1d fd 8f 23 69  |m(work$)..d...#i|
00001570  6e 25 3d 6c 65 6e 67 74  68 25 20 84 72 65 73 75  |n%=length% .resu|
00001580  6c 74 25 3d 30 0d 05 6e  09 d9 23 69 6e 25 0d 05  |lt%=0..n..#in%..|
00001590  78 06 3d b9 0d 05 82 05  3a 0d 05 8c 1b f4 20 2a  |x.=.....:..... *|
000015a0  2a 2a 2a 49 4e 54 45 52  50 52 45 54 54 45 52 53  |***INTERPRETTERS|
000015b0  2a 2a 2a 2a 0d 05 96 05  3a 0d 05 a0 16 dd a4 69  |****....:......i|
000015c0  6e 62 61 73 69 63 28 73  74 72 69 6e 67 24 29 0d  |nbasic(string$).|
000015d0  05 aa 57 f4 20 4f 6e 6c  79 20 6b 65 79 77 6f 72  |..W. Only keywor|
000015e0  64 73 20 61 6c 6c 6f 77  65 64 20 6f 75 74 73 69  |ds allowed outsi|
000015f0  64 65 20 61 73 73 65 6d  62 6c 65 72 20 61 72 65  |de assembler are|
00001600  20 52 45 4d 2c 46 4f 52  2c 54 4f 2c 53 54 45 50  | REM,FOR,TO,STEP|
00001610  2c 44 49 4d 2c 4e 45 58  54 2c 43 4c 53 2c 53 54  |,DIM,NEXT,CLS,ST|
00001620  4f 50 2c 45 4e 44 0d 05  b4 17 ea 62 79 74 65 25  |OP,END.....byte%|
00001630  2c 74 6f 6b 65 6e 24 2c  77 6f 72 6b 24 0d 05 be  |,token$,work$...|
00001640  18 62 79 74 65 25 3d 97  28 c0 73 74 72 69 6e 67  |.byte%=.(.string|
00001650  24 2c 31 29 29 0d 05 c8  22 77 6f 72 6b 24 3d a4  |$,1))..."work$=.|
00001660  66 69 6e 64 77 69 6c 64  28 31 2c 73 74 72 69 6e  |findwild(1,strin|
00001670  67 24 2c 22 3a 22 29 0d  05 d2 45 e7 62 79 74 65  |g$,":")...E.byte|
00001680  25 3e 31 32 37 20 80 62  79 74 65 25 3c 3e 26 38  |%>127 .byte%<>&8|
00001690  44 20 8c 74 6f 6b 65 6e  24 3d a4 75 6e 70 61 63  |D .token$=.unpac|
000016a0  6b 74 6f 6b 65 6e 28 62  79 74 65 25 29 20 8b 74  |ktoken(byte%) .t|
000016b0  6f 6b 65 6e 24 3d bd 62  79 74 65 25 0d 05 dc 4c  |oken$=.byte%...L|
000016c0  e7 74 6f 6b 65 6e 24 3d  22 52 45 4d 22 20 84 a7  |.token$="REM" ..|
000016d0  22 3a 5d 22 2b bd 31 33  2c 74 6f 6b 65 6e 24 29  |":]"+.13,token$)|
000016e0  3c 3e 30 20 8c 3d b9 3a  f4 20 45 6d 70 74 79 20  |<>0 .=.:. Empty |
000016f0  61 6e 64 20 63 6f 6d 6d  65 6e 74 20 6c 69 6e 65  |and comment line|
00001700  20 73 75 70 70 6f 72 74  0d 05 e6 1d e7 74 6f 6b  | support.....tok|
00001710  65 6e 24 3d 22 3d 22 20  8c f1 27 22 4e 6f 20 46  |en$="=" ..'"No F|
00001720  4e 22 3a 3d a3 0d 05 f0  29 e7 a9 74 6f 6b 65 6e  |N":=....)..token|
00001730  24 3d 31 20 8c f2 61 73  73 69 67 6e 76 61 72 69  |$=1 ..assignvari|
00001740  61 62 6c 65 28 77 6f 72  6b 24 29 3a 3d b9 0d 05  |able(work$):=...|
00001750  fa 21 e7 74 6f 6b 65 6e  24 3d 22 4e 45 58 54 22  |.!.token$="NEXT"|
00001760  20 8c 3d a4 6e 65 78 74  28 77 6f 72 6b 24 29 0d  | .=.next(work$).|
00001770  06 04 1f e7 74 6f 6b 65  6e 24 3d 22 46 4f 52 22  |....token$="FOR"|
00001780  20 8c 3d a4 66 6f 72 28  77 6f 72 6b 24 29 0d 06  | .=.for(work$)..|
00001790  0e 1f e7 74 6f 6b 65 6e  24 3d 22 44 49 4d 22 20  |...token$="DIM" |
000017a0  8c 3d a4 64 69 6d 28 77  6f 72 6b 24 29 0d 06 18  |.=.dim(work$)...|
000017b0  1f e7 74 6f 6b 65 6e 24  3d 22 43 4c 53 22 20 8c  |..token$="CLS" .|
000017c0  3d a4 63 6c 73 28 77 6f  72 6b 24 29 0d 06 22 21  |=.cls(work$).."!|
000017d0  e7 74 6f 6b 65 6e 24 3d  22 53 54 4f 50 22 20 8c  |.token$="STOP" .|
000017e0  3d a4 73 74 6f 70 28 77  6f 72 6b 24 29 0d 06 2c  |=.stop(work$)..,|
000017f0  33 e7 74 6f 6b 65 6e 24  3d 22 45 4e 44 22 20 8c  |3.token$="END" .|
00001800  3d a3 20 8b f1 27 22 43  6f 6d 6d 61 6e 64 20 6e  |=. ..'"Command n|
00001810  6f 74 20 73 75 70 70 6f  72 74 65 64 22 3a 3d a3  |ot supported":=.|
00001820  0d 06 36 05 3a 0d 06 40  12 dd a4 63 6c 73 28 73  |..6.:..@...cls(s|
00001830  74 72 69 6e 67 24 29 0d  06 4a 2b 77 6f 72 6b 24  |tring$)..J+work$|
00001840  3d a4 6e 6f 77 69 6c 64  28 c2 73 74 72 69 6e 67  |=.nowild(.string|
00001850  24 2c a9 73 74 72 69 6e  67 24 2d 31 29 2c 22 20  |$,.string$-1)," |
00001860  22 29 0d 06 54 29 e7 77  6f 72 6b 24 3c 3e 22 22  |")..T).work$<>""|
00001870  20 8c f1 27 22 53 79 6e  74 61 78 20 65 72 72 6f  | ..'"Syntax erro|
00001880  72 22 3a 3d a3 20 8b db  3a 3d b9 0d 06 5e 05 3a  |r":=. ..:=...^.:|
00001890  0d 06 68 13 dd a4 73 74  6f 70 28 73 74 72 69 6e  |..h...stop(strin|
000018a0  67 24 29 0d 06 72 2b 77  6f 72 6b 24 3d a4 6e 6f  |g$)..r+work$=.no|
000018b0  77 69 6c 64 28 c2 73 74  72 69 6e 67 24 2c a9 73  |wild(.string$,.s|
000018c0  74 72 69 6e 67 24 2d 31  29 2c 22 20 22 29 0d 06  |tring$-1)," ")..|
000018d0  7c 2a e7 77 6f 72 6b 24  3c 3e 22 22 20 8c f1 27  ||*.work$<>"" ..'|
000018e0  22 53 79 6e 74 61 78 20  65 72 72 6f 72 22 20 8b  |"Syntax error" .|
000018f0  f1 27 22 53 54 4f 50 22  0d 06 86 06 3d a3 0d 06  |.'"STOP"....=...|
00001900  90 05 3a 0d 06 9a 13 dd  a4 6e 65 78 74 28 73 74  |..:......next(st|
00001910  72 69 6e 67 24 29 0d 06  a4 22 ea 73 74 65 70 25  |ring$)...".step%|
00001920  2c 6c 69 6d 69 74 25 2c  66 6f 72 25 2c 6e 61 6d  |,limit%,for%,nam|
00001930  65 24 2c 77 6f 72 6b 24  0d 06 ae 38 f4 20 43 68  |e$,work$...8. Ch|
00001940  65 63 6b 20 66 6f 72 20  27 4e 45 58 54 2c 27 20  |eck for 'NEXT,' |
00001950  61 6e 64 20 27 4e 45 58  54 20 3c 76 61 72 69 61  |and 'NEXT <varia|
00001960  62 6c 65 3e 27 20 63 6f  6e 73 74 72 75 63 74 73  |ble>' constructs|
00001970  0d 06 b8 2b 77 6f 72 6b  24 3d a4 6e 6f 77 69 6c  |...+work$=.nowil|
00001980  64 28 c2 73 74 72 69 6e  67 24 2c a9 73 74 72 69  |d(.string$,.stri|
00001990  6e 67 24 2d 31 29 2c 22  20 22 29 0d 06 c2 2b e7  |ng$-1)," ")...+.|
000019a0  66 6f 72 24 3d 22 22 20  84 a7 77 6f 72 6b 24 2c  |for$="" ..work$,|
000019b0  22 2c 22 29 3c 3e 30 20  8c f1 27 22 4e 6f 20 46  |",")<>0 ..'"No F|
000019c0  4f 52 22 3a 3d a3 0d 06  cc 1f 6e 61 6d 65 24 3d  |OR":=.....name$=|
000019d0  a4 66 69 6e 64 77 69 6c  64 28 31 2c 66 6f 72 24  |.findwild(1,for$|
000019e0  2c 22 2c 22 29 0d 06 d6  34 e7 77 6f 72 6b 24 3c  |,",")...4.work$<|
000019f0  3e 22 22 20 80 6e 61 6d  65 24 3c 3e 77 6f 72 6b  |>"" .name$<>work|
00001a00  24 20 8c f1 27 22 43 61  6e 27 74 20 4d 61 74 63  |$ ..'"Can't Matc|
00001a10  68 20 46 4f 52 22 3a 3d  a3 0d 06 e0 2b f4 20 47  |h FOR":=....+. G|
00001a20  65 74 20 74 68 65 20 46  4f 52 20 70 61 72 61 6d  |et the FOR param|
00001a30  65 74 65 72 73 20 66 72  6f 6d 20 74 68 65 20 73  |eters from the s|
00001a40  74 61 63 6b 0d 06 ea 2a  6c 69 6d 69 74 25 3d a0  |tack...*limit%=.|
00001a50  28 a4 66 69 6e 64 77 69  6c 64 28 32 2b a9 6e 61  |(.findwild(2+.na|
00001a60  6d 65 24 2c 66 6f 72 24  2c 22 3a 22 29 29 0d 06  |me$,for$,":"))..|
00001a70  f4 34 73 74 65 70 25 3d  a0 28 a4 66 69 6e 64 77  |.4step%=.(.findw|
00001a80  69 6c 64 28 33 2b a9 6e  61 6d 65 24 2b a9 28 c3  |ild(3+.name$+.(.|
00001a90  6c 69 6d 69 74 25 29 2c  66 6f 72 24 2c 22 3b 22  |limit%),for$,";"|
00001aa0  29 29 0d 06 fe 27 70 6f  69 6e 74 65 72 25 3d a0  |))...'pointer%=.|
00001ab0  28 c2 66 6f 72 24 2c a9  66 6f 72 24 2d a7 66 6f  |(.for$,.for$-.fo|
00001ac0  72 24 2c 22 3b 22 29 29  29 0d 07 08 20 66 6f 72  |r$,";")))... for|
00001ad0  25 3d a4 66 69 6e 64 76  61 6c 75 65 28 6e 61 6d  |%=.findvalue(nam|
00001ae0  65 24 29 2b 73 74 65 70  25 0d 07 12 26 f2 61 73  |e$)+step%...&.as|
00001af0  73 69 67 6e 76 61 72 69  61 62 6c 65 28 6e 61 6d  |signvariable(nam|
00001b00  65 24 2b 22 3d 22 2b c3  28 66 6f 72 25 29 29 0d  |e$+"="+.(for%)).|
00001b10  07 1c 38 e7 66 6f 72 25  3e 6c 69 6d 69 74 25 20  |..8.for%>limit% |
00001b20  8c 66 6f 72 24 3d 22 22  3a 70 6f 69 6e 74 65 72  |.for$="":pointer|
00001b30  25 3d 8f 23 69 6e 25 20  8b cf 23 69 6e 25 3d 70  |%=.#in% ..#in%=p|
00001b40  6f 69 6e 74 65 72 25 0d  07 26 06 3d b9 0d 07 30  |ointer%..&.=...0|
00001b50  05 3a 0d 07 3a 12 dd a4  66 6f 72 28 73 74 72 69  |.:..:...for(stri|
00001b60  6e 67 24 29 0d 07 44 17  ea 6c 69 6d 69 74 25 2c  |ng$)..D..limit%,|
00001b70  73 74 65 70 25 2c 6c 74  74 72 24 0d 07 4e 2e f4  |step%,lttr$..N..|
00001b80  20 41 73 73 75 6d 65 20  61 20 53 54 45 50 20 6f  | Assume a STEP o|
00001b90  66 20 31 20 69 66 20 6e  6f 74 20 74 6f 6c 64 20  |f 1 if not told |
00001ba0  6f 74 68 65 72 77 69 73  65 0d 07 58 23 e7 66 6f  |otherwise..X#.fo|
00001bb0  72 24 3c 3e 22 22 20 8c  f1 27 22 54 6f 6f 20 6d  |r$<>"" ..'"Too m|
00001bc0  61 6e 79 20 46 4f 52 73  22 3a 3d a3 0d 07 62 2f  |any FORs":=...b/|
00001bd0  e7 a7 73 74 72 69 6e 67  24 2c bd 26 38 38 29 3d  |..string$,.&88)=|
00001be0  30 20 8c 73 74 72 69 6e  67 24 3d 73 74 72 69 6e  |0 .string$=strin|
00001bf0  67 24 2b bd 26 38 38 2b  22 31 22 0d 07 6c 23 e7  |g$+.&88+"1"..l#.|
00001c00  a7 73 74 72 69 6e 67 24  2c bd 26 42 38 29 3d 30  |.string$,.&B8)=0|
00001c10  20 8c f1 27 22 4e 6f 20  54 4f 22 3a 3d a3 0d 07  | ..'"No TO":=...|
00001c20  76 2c 73 74 72 69 6e 67  24 3d a4 73 74 72 69 70  |v,string$=.strip|
00001c30  6c 65 66 74 28 c2 73 74  72 69 6e 67 24 2c a9 73  |left(.string$,.s|
00001c40  74 72 69 6e 67 24 2d 31  29 29 0d 07 80 29 f4 20  |tring$-1))...). |
00001c50  41 64 64 20 76 61 72 69  61 62 6c 65 20 74 6f 20  |Add variable to |
00001c60  74 61 62 6c 65 20 61 6e  64 20 46 4f 52 20 73 74  |table and FOR st|
00001c70  61 63 6b 0d 07 8a 3a 6c  74 74 72 24 3d a4 66 69  |ack...:lttr$=.fi|
00001c80  6e 64 77 69 6c 64 28 31  2c 73 74 72 69 6e 67 24  |ndwild(1,string$|
00001c90  2c bd 26 42 38 29 3a f2  61 73 73 69 67 6e 76 61  |,.&B8):.assignva|
00001ca0  72 69 61 62 6c 65 28 6c  74 74 72 24 29 0d 07 94  |riable(lttr$)...|
00001cb0  36 6c 69 6d 69 74 25 3d  a4 73 65 74 6e 75 6d 28  |6limit%=.setnum(|
00001cc0  a4 66 69 6e 64 77 69 6c  64 28 32 2b a9 28 6c 74  |.findwild(2+.(lt|
00001cd0  74 72 24 29 2c 73 74 72  69 6e 67 24 2c bd 26 38  |tr$),string$,.&8|
00001ce0  38 29 29 0d 07 9e 34 73  74 65 70 25 3d a4 73 65  |8))...4step%=.se|
00001cf0  74 6e 75 6d 28 c2 73 74  72 69 6e 67 24 2c a9 73  |tnum(.string$,.s|
00001d00  74 72 69 6e 67 24 2d a7  73 74 72 69 6e 67 24 2c  |tring$-.string$,|
00001d10  bd 26 38 38 29 29 29 0d  07 a8 2c f4 20 4f 66 20  |.&88)))...,. Of |
00001d20  74 68 65 20 66 6f 72 6d  20 22 76 61 72 69 61 62  |the form "variab|
00001d30  6c 65 2c 6c 69 6d 69 74  2e 73 74 65 70 3b 61 64  |le,limit.step;ad|
00001d40  64 72 22 0d 07 b2 43 66  6f 72 24 3d a4 66 69 6e  |dr"...Cfor$=.fin|
00001d50  64 77 69 6c 64 28 31 2c  73 74 72 69 6e 67 24 2c  |dwild(1,string$,|
00001d60  22 3d 22 29 2b 22 2c 22  2b c3 6c 69 6d 69 74 25  |"=")+","+.limit%|
00001d70  2b 22 3a 22 2b c3 73 74  65 70 25 2b 22 3b 22 2b  |+":"+.step%+";"+|
00001d80  c3 8f 23 69 6e 25 0d 07  bc 06 3d b9 0d 07 c6 05  |..#in%....=.....|
00001d90  3a 0d 07 d0 12 dd a4 64  69 6d 28 73 74 72 69 6e  |:......dim(strin|
00001da0  67 24 29 0d 07 da 31 f4  20 52 65 73 65 72 76 65  |g$)...1. Reserve|
00001db0  20 6d 65 6d 6f 72 79 2c  72 65 74 75 72 6e 69 6e  | memory,returnin|
00001dc0  67 20 54 52 55 45 20 69  66 20 73 75 63 63 65 73  |g TRUE if succes|
00001dd0  73 66 75 6c 0d 07 e4 12  ea 6e 61 6d 65 24 2c 61  |sful.....name$,a|
00001de0  6d 6f 75 6e 74 24 0d 07  ee 2c 73 74 72 69 6e 67  |mount$...,string|
00001df0  24 3d a4 73 74 72 69 70  6c 65 66 74 28 c2 73 74  |$=.stripleft(.st|
00001e00  72 69 6e 67 24 2c a9 73  74 72 69 6e 67 24 2d 31  |ring$,.string$-1|
00001e10  29 29 0d 07 f8 3d 6e 61  6d 65 24 3d a4 66 69 6e  |))...=name$=.fin|
00001e20  64 77 69 6c 64 28 31 2c  73 74 72 69 6e 67 24 2c  |dwild(1,string$,|
00001e30  22 25 20 22 29 3a f4 20  45 69 74 68 65 72 20 69  |"% "):. Either i|
00001e40  73 20 74 68 65 20 73 65  70 61 72 61 74 6f 72 0d  |s the separator.|
00001e50  08 02 2e e7 c1 73 74 72  69 6e 67 24 2c 31 2b a9  |.....string$,1+.|
00001e60  6e 61 6d 65 24 2c 31 29  3d 22 25 22 20 8c 6e 61  |name$,1)="%" .na|
00001e70  6d 65 24 3d 6e 61 6d 65  24 2b 22 25 22 0d 08 0c  |me$=name$+"%"...|
00001e80  2b 61 6d 6f 75 6e 74 24  3d a4 66 69 6e 64 77 69  |+amount$=.findwi|
00001e90  6c 64 28 31 2b a9 6e 61  6d 65 24 2c 73 74 72 69  |ld(1+.name$,stri|
00001ea0  6e 67 24 2c 22 3a 22 29  0d 08 16 29 e7 6e 61 6d  |ng$,":")...).nam|
00001eb0  65 24 3d 22 22 20 80 61  6d 6f 75 6e 74 24 3d 22  |e$="" .amount$="|
00001ec0  22 20 8c f1 27 22 42 61  64 20 44 49 4d 22 3a 3d  |" ..'"Bad DIM":=|
00001ed0  a3 0d 08 20 32 e7 6e 61  6d 65 24 3d 22 22 20 84  |... 2.name$="" .|
00001ee0  61 6d 6f 75 6e 74 24 3d  22 22 20 8c f1 27 22 4e  |amount$="" ..'"N|
00001ef0  6f 20 73 75 63 68 20 76  61 72 69 61 62 6c 65 22  |o such variable"|
00001f00  3a 3d a3 0d 08 2a 4b de  63 6f 64 65 25 20 32 2a  |:=...*K.code% 2*|
00001f10  a4 73 65 74 6e 75 6d 28  61 6d 6f 75 6e 74 24 29  |.setnum(amount$)|
00001f20  3a f4 20 47 65 74 20 74  77 69 63 65 20 61 73 20  |:. Get twice as |
00001f30  6d 75 63 68 20 64 75 65  20 74 6f 20 31 34 20 62  |much due to 14 b|
00001f40  69 74 20 70 72 6f 67 72  61 6d 20 62 75 73 0d 08  |it program bus..|
00001f50  34 25 f2 61 73 73 69 67  6e 76 61 72 69 61 62 6c  |4%.assignvariabl|
00001f60  65 28 6e 61 6d 65 24 2b  22 3d 22 2b c3 63 6f 64  |e(name$+"="+.cod|
00001f70  65 25 29 0d 08 3e 06 3d  b9 0d 08 48 05 3a 0d 08  |e%)..>.=...H.:..|
00001f80  52 14 dd a4 69 6e 61 73  6d 28 73 74 72 69 6e 67  |R...inasm(string|
00001f90  24 29 0d 08 5c 30 ea 64  61 74 61 25 2c 62 79 74  |$)..\0.data%,byt|
00001fa0  65 25 2c 66 6f 75 6e 64  25 2c 69 6e 69 74 69 61  |e%,found%,initia|
00001fb0  6c 25 2c 6d 6e 65 6d 6f  6e 69 63 24 2c 77 6f 72  |l%,mnemonic$,wor|
00001fc0  6b 24 0d 08 66 3b f4 20  54 6f 6b 65 6e 73 20 66  |k$..f;. Tokens f|
00001fd0  6f 75 6e 64 20 69 6e 73  69 64 65 20 74 68 65 20  |ound inside the |
00001fe0  61 73 73 65 6d 62 6c 65  72 20 61 72 65 20 6d 65  |assembler are me|
00001ff0  72 65 6c 79 20 75 6e 70  61 63 6b 65 64 0d 08 70  |rely unpacked..p|
00002000  15 e3 64 61 74 61 25 3d  31 b8 a9 73 74 72 69 6e  |..data%=1..strin|
00002010  67 24 0d 08 7a 1e 62 79  74 65 25 3d 97 28 c1 73  |g$..z.byte%=.(.s|
00002020  74 72 69 6e 67 24 2c 64  61 74 61 25 2c 31 29 29  |tring$,data%,1))|
00002030  0d 08 84 62 e7 62 79 74  65 25 3e 31 32 37 20 80  |...b.byte%>127 .|
00002040  62 79 74 65 25 3c 3e 26  38 44 20 8c 73 74 72 69  |byte%<>&8D .stri|
00002050  6e 67 24 3d c0 73 74 72  69 6e 67 24 2c 64 61 74  |ng$=.string$,dat|
00002060  61 25 2d 31 29 2b a4 75  6e 70 61 63 6b 74 6f 6b  |a%-1)+.unpacktok|
00002070  65 6e 28 62 79 74 65 25  29 2b c2 73 74 72 69 6e  |en(byte%)+.strin|
00002080  67 24 2c a9 73 74 72 69  6e 67 24 2d 64 61 74 61  |g$,.string$-data|
00002090  25 29 0d 08 8e 05 ed 0d  08 98 2c e7 c0 73 74 72  |%)........,..str|
000020a0  69 6e 67 24 2c 31 29 3d  22 2e 22 20 8c 3d a4 61  |ing$,1)="." .=.a|
000020b0  73 73 69 67 6e 6c 61 62  65 6c 28 73 74 72 69 6e  |ssignlabel(strin|
000020c0  67 24 29 0d 08 a2 32 e7  c0 73 74 72 69 6e 67 24  |g$)...2..string$|
000020d0  2c 31 29 3d 22 5b 22 20  8c 73 74 72 69 6e 67 24  |,1)="[" .string$|
000020e0  3d c2 73 74 72 69 6e 67  24 2c a9 73 74 72 69 6e  |=.string$,.strin|
000020f0  67 24 2d 31 29 0d 08 ac  3c 77 6f 72 6b 24 3d a4  |g$-1)...<work$=.|
00002100  75 63 61 73 65 28 73 74  72 69 6e 67 24 29 3a f4  |ucase(string$):.|
00002110  20 53 70 65 65 64 73 20  75 70 20 6d 6e 65 6d 6f  | Speeds up mnemo|
00002120  6e 69 63 20 74 65 73 74  69 6e 67 20 6c 61 74 65  |nic testing late|
00002130  72 0d 08 b6 27 e7 a7 77  6f 72 6b 24 2c 22 4f 50  |r...'..work$,"OP|
00002140  54 22 29 3d 31 20 8c 3d  a4 6f 70 74 69 6f 6e 28  |T")=1 .=.option(|
00002150  73 74 72 69 6e 67 24 29  0d 08 c0 4e e7 a7 77 6f  |string$)...N..wo|
00002160  72 6b 24 2c 22 45 51 55  22 29 3d 31 20 8c f1 27  |rk$,"EQU")=1 ..'|
00002170  22 53 69 6c 6c 79 22 3a  3d a3 3a f4 20 4e 6f 74  |"Silly":=.:. Not|
00002180  20 61 6c 6c 6f 77 65 64  20 64 61 74 61 20 6f 6e  | allowed data on|
00002190  20 74 68 65 20 70 72 6f  67 72 61 6d 20 62 75 73  | the program bus|
000021a0  2c 73 69 6c 6c 79 0d 08  ca 19 69 6e 69 74 69 61  |,silly....initia|
000021b0  6c 25 3d 97 28 c0 77 6f  72 6b 24 2c 31 29 29 0d  |l%=.(.work$,1)).|
000021c0  08 d4 46 e7 69 6e 69 74  69 61 6c 25 3e 97 22 5a  |..F.initial%>."Z|
000021d0  22 20 84 69 6e 69 74 69  61 6c 25 3c 97 22 41 22  |" .initial%<."A"|
000021e0  20 8c 3d b9 3a f4 20 45  6d 70 74 79 20 61 6e 64  | .=.:. Empty and|
000021f0  20 63 6f 6d 6d 65 6e 74  20 6c 69 6e 65 20 73 75  | comment line su|
00002200  70 70 6f 72 74 0d 08 de  57 f4 20 55 73 65 20 6c  |pport...W. Use l|
00002210  6f 6f 6b 75 70 20 74 61  62 6c 65 20 75 6e 74 69  |ookup table unti|
00002220  6c 20 27 6d 6e 65 6d 6f  6e 69 63 24 3d 73 74 72  |l 'mnemonic$=str|
00002230  69 6e 67 20 69 6e 20 70  72 6f 67 72 61 6d 27 2c  |ing in program',|
00002240  74 68 65 6e 20 77 6f 72  6b 20 6f 75 74 20 74 68  |then work out th|
00002250  65 20 70 61 72 61 6d 65  74 65 72 73 0d 08 e8 21  |e parameters...!|
00002260  66 6f 75 6e 64 25 3d 6a  75 6d 70 74 6f 25 28 69  |found%=jumpto%(i|
00002270  6e 69 74 69 61 6c 25 2d  36 34 29 2d 31 0d 08 f2  |nitial%-64)-1...|
00002280  15 f5 3a 66 6f 75 6e 64  25 3d 66 6f 75 6e 64 25  |..:found%=found%|
00002290  2b 31 0d 08 fc 3b 6d 6e  65 6d 6f 6e 69 63 24 3d  |+1...;mnemonic$=|
000022a0  c0 6d 6e 65 6d 6f 6e 69  63 24 28 66 6f 75 6e 64  |.mnemonic$(found|
000022b0  25 29 2c a7 6d 6e 65 6d  6f 6e 69 63 24 28 66 6f  |%),.mnemonic$(fo|
000022c0  75 6e 64 25 29 2c 22 20  22 29 2d 31 29 0d 09 06  |und%)," ")-1)...|
000022d0  42 fd 6d 6e 65 6d 6f 6e  69 63 24 3d c0 77 6f 72  |B.mnemonic$=.wor|
000022e0  6b 24 2c a9 28 6d 6e 65  6d 6f 6e 69 63 24 29 29  |k$,.(mnemonic$))|
000022f0  20 84 66 6f 75 6e 64 25  3d 6a 75 6d 70 74 6f 25  | .found%=jumpto%|
00002300  28 31 2b 69 6e 69 74 69  61 6c 25 2d 36 34 29 0d  |(1+initial%-64).|
00002310  09 10 3d e7 6d 6e 65 6d  6f 6e 69 63 24 3c 3e c0  |..=.mnemonic$<>.|
00002320  77 6f 72 6b 24 2c a9 28  6d 6e 65 6d 6f 6e 69 63  |work$,.(mnemonic|
00002330  24 29 29 20 8c f1 27 22  4e 6f 20 73 75 63 68 20  |$)) ..'"No such |
00002340  6d 6e 65 6d 6f 6e 69 63  22 3a 3d a3 0d 09 1a 1e  |mnemonic":=.....|
00002350  3d a4 61 73 6d 70 61 72  6d 73 28 66 6f 75 6e 64  |=.asmparms(found|
00002360  25 2c 73 74 72 69 6e 67  24 29 0d 09 24 05 3a 0d  |%,string$)..$.:.|
00002370  09 2e 20 dd a4 61 73 6d  70 61 72 6d 73 28 70 6f  |.. ..asmparms(po|
00002380  69 6e 74 65 72 25 2c 73  74 72 69 6e 67 24 29 0d  |inter%,string$).|
00002390  09 38 31 ea 77 6f 72 6b  24 2c 6c 65 6e 67 74 68  |.81.work$,length|
000023a0  25 2c 70 61 72 61 6d 65  74 65 72 24 2c 6e 75 6d  |%,parameter$,num|
000023b0  62 65 72 25 2c 62 79 74  65 24 2c 6c 74 74 72 24  |ber%,byte$,lttr$|
000023c0  0d 09 42 23 f4 20 49 73  6f 6c 61 74 65 20 74 68  |..B#. Isolate th|
000023d0  65 20 70 61 72 61 6d 65  74 65 72 73 2c 69 66 20  |e parameters,if |
000023e0  61 6e 79 0d 09 4c 33 6c  65 6e 67 74 68 25 3d a9  |any..L3length%=.|
000023f0  28 a4 66 69 6e 64 77 69  6c 64 28 31 2c 6d 6e 65  |(.findwild(1,mne|
00002400  6d 6f 6e 69 63 24 28 70  6f 69 6e 74 65 72 25 29  |monic$(pointer%)|
00002410  2c 22 20 22 29 29 0d 09  56 35 70 61 72 61 6d 65  |," "))..V5parame|
00002420  74 65 72 24 3d a4 73 74  72 69 70 6c 65 66 74 28  |ter$=.stripleft(|
00002430  c2 73 74 72 69 6e 67 24  2c a9 73 74 72 69 6e 67  |.string$,.string|
00002440  24 2d 6c 65 6e 67 74 68  25 29 29 0d 09 60 44 f4  |$-length%))..`D.|
00002450  20 49 6e 73 74 72 75 63  74 69 6f 6e 73 20 72 65  | Instructions re|
00002460  71 75 69 72 69 6e 67 20  6c 69 74 65 72 61 6c 73  |quiring literals|
00002470  20 4e 45 45 44 20 74 6f  20 68 61 76 65 20 61 20  | NEED to have a |
00002480  68 61 73 68 20 61 66 74  65 72 20 74 68 65 6d 0d  |hash after them.|
00002490  09 6a 4a e7 c1 6d 6e 65  6d 6f 6e 69 63 24 28 70  |.jJ..mnemonic$(p|
000024a0  6f 69 6e 74 65 72 25 29  2c 34 2c 32 29 3d 22 4c  |ointer%),4,2)="L|
000024b0  57 22 20 80 c0 70 61 72  61 6d 65 74 65 72 24 2c  |W" ..parameter$,|
000024c0  31 29 3c 3e 22 23 22 20  8c f1 27 22 4d 69 73 73  |1)<>"#" ..'"Miss|
000024d0  69 6e 67 20 23 22 3a 3d  a3 0d 09 74 3f f4 20 42  |ing #":=...t?. B|
000024e0  61 73 65 64 20 6f 6e 20  74 68 65 20 74 65 6d 70  |ased on the temp|
000024f0  6c 61 74 65 2c 68 6f 77  20 6d 61 6e 79 20 70 61  |late,how many pa|
00002500  72 61 6d 65 74 65 72 73  20 53 48 4f 55 4c 44 20  |rameters SHOULD |
00002510  74 68 65 72 65 20 62 65  0d 09 7e 2f 6c 74 74 72  |there be..~/lttr|
00002520  24 3d a4 6e 6f 77 69 6c  64 28 c2 6d 6e 65 6d 6f  |$=.nowild(.mnemo|
00002530  6e 69 63 24 28 70 6f 69  6e 74 65 72 25 29 2c 33  |nic$(pointer%),3|
00002540  29 2c 22 20 2c 22 29 0d  09 88 35 6e 75 6d 62 65  |)," ,")...5numbe|
00002550  72 25 3d a9 6c 74 74 72  24 3a 70 61 72 61 6d 65  |r%=.lttr$:parame|
00002560  74 65 72 24 3d a4 6e 6f  77 69 6c 64 28 70 61 72  |ter$=.nowild(par|
00002570  61 6d 65 74 65 72 24 2c  22 23 22 29 0d 09 92 34  |ameter$,"#")...4|
00002580  e7 6e 75 6d 62 65 72 25  3d 32 20 80 a7 70 61 72  |.number%=2 ..par|
00002590  61 6d 65 74 65 72 24 2c  22 2c 22 29 3d 30 20 8c  |ameter$,",")=0 .|
000025a0  f1 27 22 4d 69 73 73 69  6e 67 20 2c 22 3a 3d a3  |.'"Missing ,":=.|
000025b0  0d 09 9c 44 e7 6e 75 6d  62 65 72 25 3c 3e 30 20  |...D.number%<>0 |
000025c0  80 a4 6e 6f 77 69 6c 64  28 70 61 72 61 6d 65 74  |..nowild(paramet|
000025d0  65 72 24 2c 22 20 22 29  3d 22 22 20 8c f1 27 22  |er$," ")="" ..'"|
000025e0  4e 6f 20 73 75 63 68 20  76 61 72 69 61 62 6c 65  |No such variable|
000025f0  22 3a 3d a3 0d 09 a6 27  e7 28 6f 70 74 69 6f 6e  |":=....'.(option|
00002600  25 80 31 29 3c 3e 31 20  8c 3d a4 74 6f 6d 65 6d  |%.1)<>1 .=.tomem|
00002610  6f 72 79 28 22 30 22 2c  22 22 29 0d 09 b0 25 62  |ory("0","")...%b|
00002620  79 74 65 24 3d a4 6e 6f  77 69 6c 64 28 62 69 74  |yte$=.nowild(bit|
00002630  24 28 70 6f 69 6e 74 65  72 25 29 2c 22 20 22 29  |$(pointer%)," ")|
00002640  0d 09 ba 2d f4 20 4e 6f  77 20 69 6e 74 65 72 70  |...-. Now interp|
00002650  72 65 74 20 61 6e 64 20  73 75 62 73 74 69 74 75  |ret and substitu|
00002660  74 65 20 74 68 65 20 76  61 6c 75 65 73 0d 09 c4  |te the values...|
00002670  60 e7 6e 75 6d 62 65 72  25 3d 32 20 8c 77 6f 72  |`.number%=2 .wor|
00002680  6b 24 3d a4 66 69 6e 64  77 69 6c 64 28 31 2c 70  |k$=.findwild(1,p|
00002690  61 72 61 6d 65 74 65 72  24 2c 22 2c 22 29 3a 62  |arameter$,","):b|
000026a0  79 74 65 24 3d a4 6f 76  65 72 6c 61 79 28 a4 73  |yte$=.overlay(.s|
000026b0  65 74 6e 75 6d 28 77 6f  72 6b 24 29 2c c0 6c 74  |etnum(work$),.lt|
000026c0  74 72 24 2c 31 29 2c 62  79 74 65 24 29 0d 09 ce  |tr$,1),byte$)...|
000026d0  77 e7 6e 75 6d 62 65 72  25 3c 3e 30 20 8c 77 6f  |w.number%<>0 .wo|
000026e0  72 6b 24 3d a4 66 69 6e  64 77 69 6c 64 28 6e 75  |rk$=.findwild(nu|
000026f0  6d 62 65 72 25 2b a9 77  6f 72 6b 24 2c 70 61 72  |mber%+.work$,par|
00002700  61 6d 65 74 65 72 24 2c  22 5c 3a 22 29 3a 62 79  |ameter$,"\:"):by|
00002710  74 65 24 3d a4 6f 76 65  72 6c 61 79 28 a4 73 65  |te$=.overlay(.se|
00002720  74 6e 75 6d 28 77 6f 72  6b 24 29 2c c1 6c 74 74  |tnum(work$),.ltt|
00002730  72 24 2c 6e 75 6d 62 65  72 25 2c 31 29 2c 62 79  |r$,number%,1),by|
00002740  74 65 24 29 0d 09 d8 1d  3d a4 74 6f 6d 65 6d 6f  |te$)....=.tomemo|
00002750  72 79 28 62 79 74 65 24  2c 73 74 72 69 6e 67 24  |ry(byte$,string$|
00002760  29 0d 09 e2 05 3a 0d 09  ec 1d dd a4 74 6f 6d 65  |)....:......tome|
00002770  6d 6f 72 79 28 62 79 74  65 24 2c 73 74 72 69 6e  |mory(byte$,strin|
00002780  67 24 29 0d 09 f6 2d f4  20 41 6c 74 65 72 20 70  |g$)...-. Alter p|
00002790  73 65 75 64 6f 20 70 6f  69 6e 74 65 72 73 20 61  |seudo pointers a|
000027a0  6e 64 20 70 75 74 20 69  6e 20 6d 65 6d 6f 72 79  |nd put in memory|
000027b0  0d 0a 00 39 f2 61 73 73  69 67 6e 76 61 72 69 61  |...9.assignvaria|
000027c0  62 6c 65 28 22 50 25 3d  50 25 2b 31 22 29 3a f2  |ble("P%=P%+1"):.|
000027d0  61 73 73 69 67 6e 76 61  72 69 61 62 6c 65 28 22  |assignvariable("|
000027e0  4f 25 3d 4f 25 2b 31 22  29 0d 0a 0a 13 e7 73 74  |O%=O%+1").....st|
000027f0  72 69 6e 67 24 3d 22 22  20 8c 3d b9 0d 0a 14 0a  |ring$="" .=.....|
00002800  ea 62 79 74 65 25 0d 0a  1e 2e 62 79 74 65 25 3d  |.byte%....byte%=|
00002810  a4 73 65 74 62 69 6e 28  62 79 74 65 24 29 3a 50  |.setbin(byte$):P|
00002820  25 3d a4 66 69 6e 64 76  61 6c 75 65 28 22 50 25  |%=.findvalue("P%|
00002830  22 29 2d 31 0d 0a 28 1e  f4 20 53 68 6f 77 20 74  |")-1..(.. Show t|
00002840  68 65 20 6f 62 6a 65 63  74 20 26 20 73 6f 75 72  |he object & sour|
00002850  63 65 0d 0a 32 45 f1 a4  70 61 64 28 34 2c c3 7e  |ce..2E..pad(4,.~|
00002860  50 25 29 3b 22 20 22 3b  a4 70 61 64 28 34 2c c3  |P%);" ";.pad(4,.|
00002870  7e 28 62 79 74 65 25 29  29 3b 22 20 20 22 3b a4  |~(byte%));"  ";.|
00002880  66 69 6e 64 77 69 6c 64  28 31 2c 73 74 72 69 6e  |findwild(1,strin|
00002890  67 24 2c 22 5c 22 29 0d  0a 3c 42 e7 a7 73 74 72  |g$,"\")..<B..str|
000028a0  69 6e 67 24 2c 22 5c 22  29 3c 3e 30 20 8c f1 89  |ing$,"\")<>0 ...|
000028b0  28 31 31 29 3b 22 5c 22  3b c2 73 74 72 69 6e 67  |(11);"\";.string|
000028c0  24 2c a9 73 74 72 69 6e  67 24 2d a7 73 74 72 69  |$,.string$-.stri|
000028d0  6e 67 24 2c 22 5c 22 29  29 0d 0a 46 33 f4 20 43  |ng$,"\"))..F3. C|
000028e0  61 6c 63 75 6c 61 74 65  20 77 68 65 72 65 20 69  |alculate where i|
000028f0  74 20 67 6f 65 73 20 69  6e 20 6e 6f 72 6d 61 6c  |t goes in normal|
00002900  20 38 20 62 69 74 20 74  65 72 6d 73 0d 0a 50 3b  | 8 bit terms..P;|
00002910  3f 28 63 6f 64 65 25 2b  28 50 25 2a 32 29 29 3d  |?(code%+(P%*2))=|
00002920  62 79 74 65 25 20 83 32  35 36 3a 3f 28 63 6f 64  |byte% .256:?(cod|
00002930  65 25 2b 28 50 25 2a 32  29 2b 31 29 3d 62 79 74  |e%+(P%*2)+1)=byt|
00002940  65 25 20 81 32 35 36 0d  0a 5a 06 3d b9 0d 0a 64  |e% .256..Z.=...d|
00002950  05 3a 0d 0a 6e 15 dd a4  6f 70 74 69 6f 6e 28 73  |.:..n...option(s|
00002960  74 72 69 6e 67 24 29 0d  0a 78 36 f4 20 54 68 69  |tring$)..x6. Thi|
00002970  73 20 69 73 20 6a 75 73  74 20 75 73 65 64 20 74  |s is just used t|
00002980  6f 20 63 6f 6e 74 72 6f  6c 20 70 72 69 6e 74 69  |o control printi|
00002990  6e 67 20 61 74 20 70 72  65 73 65 6e 74 0d 0a 82  |ng at present...|
000029a0  2c 6f 70 74 69 6f 6e 25  3d a4 66 69 6e 64 76 61  |,option%=.findva|
000029b0  6c 75 65 28 c2 73 74 72  69 6e 67 24 2c a9 73 74  |lue(.string$,.st|
000029c0  72 69 6e 67 24 2d 33 29  29 0d 0a 8c 21 e7 6f 70  |ring$-3))...!.op|
000029d0  74 69 6f 6e 25 3e 37 20  8c f1 27 22 42 61 64 20  |tion%>7 ..'"Bad |
000029e0  6f 70 74 69 6f 6e 22 3a  3d a3 0d 0a 96 06 3d b9  |option":=.....=.|
000029f0  0d 0a a0 05 3a 0d 0a aa  1f f4 20 2a 2a 2a 2a 47  |....:..... ****G|
00002a00  45 4e 45 52 41 4c 20 55  54 49 4c 49 54 49 45 53  |ENERAL UTILITIES|
00002a10  2a 2a 2a 2a 0d 0a b4 05  3a 0d 0a be 0b dd f2 72  |****....:......r|
00002a20  65 73 65 74 0d 0a c8 35  f4 20 54 68 65 73 65 20  |eset...5. These |
00002a30  61 72 65 20 72 65 73 65  74 20 65 76 65 72 79 20  |are reset every |
00002a40  74 69 6d 65 20 61 20 6e  65 77 20 66 69 6c 65 20  |time a new file |
00002a50  69 73 20 6c 6f 61 64 65  64 0d 0a d2 32 70 6f 69  |is loaded...2poi|
00002a60  6e 74 65 72 25 3d 30 3a  f4 20 49 73 20 77 68 65  |nter%=0:. Is whe|
00002a70  72 65 20 69 6e 20 74 68  65 20 42 41 53 49 43 20  |re in the BASIC |
00002a80  66 69 6c 65 20 77 65 20  61 72 65 0d 0a dc 41 69  |file we are...Ai|
00002a90  6e 61 73 6d 25 3d a3 3a  f4 20 42 6f 6f 6c 65 61  |nasm%=.:. Boolea|
00002aa0  6e 20 66 6c 61 67 20 61  73 20 74 6f 20 77 68 65  |n flag as to whe|
00002ab0  74 68 65 72 20 69 6e 20  42 41 53 49 43 20 6f 72  |ther in BASIC or|
00002ac0  20 69 6e 73 69 64 65 20  5b 5d 27 73 0d 0a e6 32  | inside []'s...2|
00002ad0  66 6f 72 24 3d 22 22 3a  f4 20 48 6f 6c 64 73 20  |for$="":. Holds |
00002ae0  64 65 74 61 69 6c 73 20  6f 66 20 74 68 65 20 46  |details of the F|
00002af0  4f 52 2e 2e 2e 4e 45 58  54 20 6c 6f 6f 70 0d 0a  |OR...NEXT loop..|
00002b00  f0 30 63 6f 64 65 25 3d  30 3a f4 20 57 68 65 72  |.0code%=0:. Wher|
00002b10  65 20 74 68 65 20 72 65  73 75 6c 74 20 69 73 20  |e the result is |
00002b20  68 65 6c 64 20 69 6e 20  6d 65 6d 6f 72 79 0d 0a  |held in memory..|
00002b30  fa 22 73 25 3d 30 3a 69  25 3d 30 3a 72 25 3d 30  |."s%=0:i%=0:r%=0|
00002b40  3a 6e 25 3d 30 3a f4 20  4e 6f 6e 65 20 79 65 74  |:n%=0:. None yet|
00002b50  0d 0b 04 47 64 65 6c 74  61 24 3d 22 40 22 3a f4  |...Gdelta$="@":.|
00002b60  20 48 6f 6c 64 73 20 74  68 65 20 31 73 74 20 6c  | Holds the 1st l|
00002b70  65 74 74 65 72 20 6f 66  20 74 68 65 20 6c 61 73  |etter of the las|
00002b80  74 20 6d 6e 65 6d 6f 6e  69 63 20 63 68 61 6e 67  |t mnemonic chang|
00002b90  65 20 66 6f 75 6e 64 0d  0b 0e 26 6f 70 74 69 6f  |e found...&optio|
00002ba0  6e 25 3d 30 3a f4 20 41  73 73 65 6d 62 6c 65 72  |n%=0:. Assembler|
00002bb0  20 6f 70 74 69 6f 6e 20  27 4f 50 54 27 0d 0b 18  | option 'OPT'...|
00002bc0  05 e1 0d 0b 22 05 3a 0d  0b 2c 0a dd f2 64 75 6d  |....".:..,...dum|
00002bd0  70 0d 0b 36 13 ea 73 25  2c 69 25 2c 72 25 2c 64  |p..6..s%,i%,r%,d|
00002be0  61 74 61 25 0d 0b 40 0c  e7 6e 25 3d 30 20 8c e1  |ata%..@..n%=0 ..|
00002bf0  0d 0b 4a 2c f1 22 54 68  65 72 65 20 61 72 65 20  |..J,."There are |
00002c00  22 3b 6e 25 3b 22 20 76  61 72 69 61 62 6c 65 73  |";n%;" variables|
00002c10  20 64 65 66 69 6e 65 64  2e 2e 2e 22 0d 0b 54 05  | defined..."..T.|
00002c20  f5 0d 0b 5e 1a f1 6e 61  6d 65 24 28 64 61 74 61  |...^..name$(data|
00002c30  25 29 3b 22 20 69 73 20  61 22 3b 0d 0b 68 3a e7  |%);" is a";..h:.|
00002c40  c2 6e 61 6d 65 24 28 64  61 74 61 25 29 2c 31 29  |.name$(data%),1)|
00002c50  3d 22 24 22 20 8c f1 22  20 73 74 72 69 6e 67 3d  |="$" .." string=|
00002c60  22 2c 73 74 72 69 6e 67  24 28 73 25 29 3a 73 25  |",string$(s%):s%|
00002c70  3d 73 25 2b 31 0d 0b 72  3d e7 c2 6e 61 6d 65 24  |=s%+1..r=..name$|
00002c80  28 64 61 74 61 25 29 2c  31 29 3d 22 25 22 20 8c  |(data%),1)="%" .|
00002c90  f1 22 6e 20 69 6e 74 65  67 65 72 3d 22 2c 69 6e  |."n integer=",in|
00002ca0  74 65 67 65 72 25 28 69  25 29 3a 69 25 3d 69 25  |teger%(i%):i%=i%|
00002cb0  2b 31 0d 0b 7c 54 e7 c2  6e 61 6d 65 24 28 64 61  |+1..|T..name$(da|
00002cc0  74 61 25 29 2c 31 29 3c  3e 22 24 22 20 80 c2 6e  |ta%),1)<>"$" ..n|
00002cd0  61 6d 65 24 28 64 61 74  61 25 29 2c 31 29 3c 3e  |ame$(data%),1)<>|
00002ce0  22 25 22 20 8c f1 22 20  72 65 61 6c 20 6e 75 6d  |"%" .." real num|
00002cf0  62 65 72 3d 22 2c 72 65  61 6c 28 72 25 29 3a 72  |ber=",real(r%):r|
00002d00  25 3d 72 25 2b 31 0d 0b  86 11 64 61 74 61 25 3d  |%=r%+1....data%=|
00002d10  64 61 74 61 25 2b 31 0d  0b 90 0d fd 64 61 74 61  |data%+1.....data|
00002d20  25 3d 6e 25 0d 0b 9a 05  e1 0d 0b a4 05 3a 0d 0b  |%=n%.........:..|
00002d30  ae 1a dd a4 63 6f 75 6e  74 28 6c 74 74 72 24 2c  |....count(lttr$,|
00002d40  73 74 72 69 6e 67 24 29  0d 0b b8 38 f4 20 52 65  |string$)...8. Re|
00002d50  74 75 72 6e 73 20 74 68  65 20 6d 61 78 69 6d 75  |turns the maximu|
00002d60  6d 20 6e 75 6d 62 65 72  20 61 6c 6c 6f 77 65 64  |m number allowed|
00002d70  20 66 6f 72 20 61 20 70  61 72 61 6d 65 74 65 72  | for a parameter|
00002d80  0d 0b c2 12 ea 64 61 74  61 25 2c 6c 65 6e 67 74  |.....data%,lengt|
00002d90  68 25 0d 0b cc 17 e3 64  61 74 61 25 3d 31 b8 a9  |h%.....data%=1..|
00002da0  28 73 74 72 69 6e 67 24  29 0d 0b d6 2f e7 c1 73  |(string$).../..s|
00002db0  74 72 69 6e 67 24 2c 64  61 74 61 25 2c 31 29 3d  |tring$,data%,1)=|
00002dc0  6c 74 74 72 24 20 8c 6c  65 6e 67 74 68 25 3d 6c  |lttr$ .length%=l|
00002dd0  65 6e 67 74 68 25 2b 31  0d 0b e0 05 ed 0d 0b ea  |ength%+1........|
00002de0  0c 3d 6c 65 6e 67 74 68  25 0d 0b f4 05 3a 0d 0b  |.=length%....:..|
00002df0  fe 1c dd a4 75 6e 70 61  63 6b 74 6f 6b 65 6e 28  |....unpacktoken(|
00002e00  74 6f 6b 65 6e 6e 75 6d  25 29 0d 0c 08 26 f4 20  |tokennum%)...&. |
00002e10  43 6f 6e 76 65 72 74 20  74 6f 6b 65 6e 20 74 6f  |Convert token to|
00002e20  20 6d 65 61 6e 69 6e 67  66 75 6c 20 74 65 78 74  | meaningful text|
00002e30  0d 0c 12 16 ea 62 79 74  65 25 2c 64 61 74 61 25  |.....byte%,data%|
00002e40  2c 6d 61 73 6b 25 0d 0c  1c 2b e7 74 6f 6b 65 6e  |,mask%...+.token|
00002e50  6e 75 6d 25 3c 3e 26 38  44 20 8c 3d 74 6f 6b 65  |num%<>&8D .=toke|
00002e60  6e 24 28 74 6f 6b 65 6e  6e 75 6d 25 2d 31 32 38  |n$(tokennum%-128|
00002e70  29 0d 0c 26 1a f4 20 49  74 20 77 61 73 20 61 20  |)..&.. It was a |
00002e80  6c 69 6e 65 20 6e 75 6d  62 65 72 0d 0c 30 0f 62  |line number..0.b|
00002e90  79 74 65 25 3d 9a 23 69  6e 25 0d 0c 3a 3c 64 61  |yte%=.#in%..:<da|
00002ea0  74 61 25 3d 28 62 79 74  65 25 20 80 28 33 32 2b  |ta%=(byte% .(32+|
00002eb0  31 36 29 29 2a 34 3a f4  20 53 68 69 66 74 20 75  |16))*4:. Shift u|
00002ec0  70 20 32 20 70 6c 61 63  65 73 20 61 6e 64 20 64  |p 2 places and d|
00002ed0  69 73 63 61 72 64 0d 0c  44 17 64 61 74 61 25 3d  |iscard..D.data%=|
00002ee0  64 61 74 61 25 20 82 20  9a 23 69 6e 25 0d 0c 4e  |data% . .#in%..N|
00002ef0  40 6d 61 73 6b 25 3d 28  62 79 74 65 25 20 80 28  |@mask%=(byte% .(|
00002f00  38 2b 34 29 29 2a 31 36  3a f4 20 53 68 69 66 74  |8+4))*16:. Shift|
00002f10  20 75 70 20 32 20 70 6c  61 63 65 73 20 6d 6f 72  | up 2 places mor|
00002f20  65 20 61 6e 64 20 64 69  73 63 61 72 64 0d 0c 58  |e and discard..X|
00002f30  17 6d 61 73 6b 25 3d 6d  61 73 6b 25 20 82 20 9a  |.mask%=mask% . .|
00002f40  23 69 6e 25 0d 0c 62 16  3d 64 61 74 61 25 2b 28  |#in%..b.=data%+(|
00002f50  6d 61 73 6b 25 2a 32 35  36 29 0d 0c 6c 05 3a 0d  |mask%*256)..l.:.|
00002f60  0c 76 1e f4 20 2a 2a 2a  2a 53 54 52 49 4e 47 20  |.v.. ****STRING |
00002f70  55 54 49 4c 49 54 49 45  53 2a 2a 2a 2a 0d 0c 80  |UTILITIES****...|
00002f80  05 3a 0d 0c 8a 1a dd a4  70 61 64 28 6c 65 6e 67  |.:......pad(leng|
00002f90  74 68 25 2c 73 74 72 69  6e 67 24 29 0d 0c 94 23  |th%,string$)...#|
00002fa0  3d c4 6c 65 6e 67 74 68  25 2d a9 73 74 72 69 6e  |=.length%-.strin|
00002fb0  67 24 2c 22 30 22 29 2b  73 74 72 69 6e 67 24 0d  |g$,"0")+string$.|
00002fc0  0c 9e 05 3a 0d 0c a8 2b  dd a4 66 69 6e 64 77 69  |...:...+..findwi|
00002fd0  6c 64 28 70 6f 69 6e 74  65 72 25 2c 73 74 72 69  |ld(pointer%,stri|
00002fe0  6e 67 24 2c 73 65 70 61  72 61 74 6f 72 24 29 0d  |ng$,separator$).|
00002ff0  0c b2 40 f4 20 46 69 6e  64 20 61 6c 6c 20 74 68  |..@. Find all th|
00003000  65 20 74 65 78 74 20 66  72 6f 6d 20 70 6f 69 6e  |e text from poin|
00003010  74 65 72 25 20 74 6f 20  74 68 65 20 63 68 6f 73  |ter% to the chos|
00003020  65 6e 20 73 65 70 61 72  61 74 6f 72 28 73 29 0d  |en separator(s).|
00003030  0c bc 19 ea 6c 65 6e 67  74 68 25 2c 66 6f 75 6e  |....length%,foun|
00003040  64 25 2c 64 61 74 61 25  0d 0c c6 1c e3 64 61 74  |d%,data%.....dat|
00003050  61 25 3d 70 6f 69 6e 74  65 72 25 b8 a9 73 74 72  |a%=pointer%..str|
00003060  69 6e 67 24 0d 0c d0 3e  e7 a7 73 65 70 61 72 61  |ing$...>..separa|
00003070  74 6f 72 24 2c c1 73 74  72 69 6e 67 24 2c 64 61  |tor$,.string$,da|
00003080  74 61 25 2c 31 29 29 3c  3e 30 20 80 66 6f 75 6e  |ta%,1))<>0 .foun|
00003090  64 25 3d a3 20 8c 66 6f  75 6e 64 25 3d 64 61 74  |d%=. .found%=dat|
000030a0  61 25 0d 0c da 05 ed 0d  0c e4 33 e7 66 6f 75 6e  |a%........3.foun|
000030b0  64 25 3d a3 20 8c 66 6f  75 6e 64 25 3d a9 73 74  |d%=. .found%=.st|
000030c0  72 69 6e 67 24 2b 31 3a  f4 20 4e 6f 74 20 66 6f  |ring$+1:. Not fo|
000030d0  75 6e 64 20 61 74 20 61  6c 6c 0d 0c ee 27 3d c1  |und at all...'=.|
000030e0  73 74 72 69 6e 67 24 2c  70 6f 69 6e 74 65 72 25  |string$,pointer%|
000030f0  2c 66 6f 75 6e 64 25 2d  70 6f 69 6e 74 65 72 25  |,found%-pointer%|
00003100  29 0d 0c f8 05 3a 0d 0d  02 1e dd a4 70 6f 70 68  |)....:......poph|
00003110  65 78 28 73 74 72 69 6e  67 24 2c 70 6f 69 6e 74  |ex(string$,point|
00003120  65 72 25 29 0d 0d 0c 26  f4 20 47 65 74 73 20 74  |er%)...&. Gets t|
00003130  68 65 20 68 65 78 20 6e  75 6d 62 65 72 20 74 68  |he hex number th|
00003140  61 74 20 66 6f 6c 6c 6f  77 73 0d 0d 16 12 ea 64  |at follows.....d|
00003150  61 74 61 25 2c 6c 65 6e  67 74 68 25 0d 0d 20 20  |ata%,length%..  |
00003160  e3 64 61 74 61 25 3d 28  70 6f 69 6e 74 65 72 25  |.data%=(pointer%|
00003170  2b 31 29 b8 a9 73 74 72  69 6e 67 24 0d 0d 2a 47  |+1)..string$..*G|
00003180  e7 6c 65 6e 67 74 68 25  3d 30 20 80 a7 22 30 31  |.length%=0 .."01|
00003190  32 33 34 35 36 37 38 39  41 42 43 44 45 46 22 2c  |23456789ABCDEF",|
000031a0  c1 73 74 72 69 6e 67 24  2c 64 61 74 61 25 2c 31  |.string$,data%,1|
000031b0  29 29 3d 30 20 8c 6c 65  6e 67 74 68 25 3d 64 61  |))=0 .length%=da|
000031c0  74 61 25 0d 0d 34 05 ed  0d 0d 3e 28 3d c1 73 74  |ta%..4....>(=.st|
000031d0  72 69 6e 67 24 2c 70 6f  69 6e 74 65 72 25 2c 6c  |ring$,pointer%,l|
000031e0  65 6e 67 74 68 25 2d 70  6f 69 6e 74 65 72 25 29  |ength%-pointer%)|
000031f0  0d 0d 48 05 3a 0d 0d 52  19 dd a4 73 74 72 69 70  |..H.:..R...strip|
00003200  72 69 67 68 74 28 73 74  72 69 6e 67 24 29 0d 0d  |right(string$)..|
00003210  5c 15 f4 20 50 65 72 66  6f 72 6d 73 20 52 54 52  |\.. Performs RTR|
00003220  49 4d 24 0d 0d 66 13 ea  64 61 74 61 25 2c 70 6f  |IM$..f..data%,po|
00003230  69 6e 74 65 72 25 0d 0d  70 1b e3 64 61 74 61 25  |inter%..p..data%|
00003240  3d a9 28 73 74 72 69 6e  67 24 29 b8 31 20 88 2d  |=.(string$).1 .-|
00003250  31 0d 0d 7a 37 e7 70 6f  69 6e 74 65 72 25 3d 30  |1..z7.pointer%=0|
00003260  20 80 c1 73 74 72 69 6e  67 24 2c 64 61 74 61 25  | ..string$,data%|
00003270  2c 31 29 3c 3e 22 20 22  20 8c 70 6f 69 6e 74 65  |,1)<>" " .pointe|
00003280  72 25 3d 64 61 74 61 25  0d 0d 84 05 ed 0d 0d 8e  |r%=data%........|
00003290  17 3d c0 73 74 72 69 6e  67 24 2c 70 6f 69 6e 74  |.=.string$,point|
000032a0  65 72 25 29 0d 0d 98 05  3a 0d 0d a2 18 dd a4 73  |er%)....:......s|
000032b0  74 72 69 70 6c 65 66 74  28 73 74 72 69 6e 67 24  |tripleft(string$|
000032c0  29 0d 0d ac 15 f4 20 50  65 72 66 6f 72 6d 73 20  |)..... Performs |
000032d0  4c 54 52 49 4d 24 0d 0d  b6 13 ea 64 61 74 61 25  |LTRIM$.....data%|
000032e0  2c 70 6f 69 6e 74 65 72  25 0d 0d c0 17 e3 64 61  |,pointer%.....da|
000032f0  74 61 25 3d 31 b8 a9 28  73 74 72 69 6e 67 24 29  |ta%=1..(string$)|
00003300  0d 0d ca 37 e7 70 6f 69  6e 74 65 72 25 3d 30 20  |...7.pointer%=0 |
00003310  80 c1 73 74 72 69 6e 67  24 2c 64 61 74 61 25 2c  |..string$,data%,|
00003320  31 29 3c 3e 22 20 22 20  8c 70 6f 69 6e 74 65 72  |1)<>" " .pointer|
00003330  25 3d 64 61 74 61 25 0d  0d d4 05 ed 0d 0d de 24  |%=data%........$|
00003340  3d c2 73 74 72 69 6e 67  24 2c a9 28 73 74 72 69  |=.string$,.(stri|
00003350  6e 67 24 29 2d 70 6f 69  6e 74 65 72 25 2b 31 29  |ng$)-pointer%+1)|
00003360  0d 0d e8 05 3a 0d 0d f2  20 dd a4 6e 6f 77 69 6c  |....:... ..nowil|
00003370  64 28 73 74 72 69 6e 67  24 2c 73 65 70 61 72 61  |d(string$,separa|
00003380  74 6f 72 24 29 0d 0d fc  3b f4 20 47 65 74 73 20  |tor$)...;. Gets |
00003390  72 69 64 20 6f 66 20 41  4c 4c 20 6f 63 63 75 72  |rid of ALL occur|
000033a0  65 6e 63 65 73 20 6f 66  20 74 68 65 20 63 68 6f  |ences of the cho|
000033b0  73 65 6e 20 73 65 70 61  72 61 74 6f 72 28 73 29  |sen separator(s)|
000033c0  0d 0e 06 10 ea 77 6f 72  6b 24 2c 64 61 74 61 25  |.....work$,data%|
000033d0  0d 0e 10 15 e3 64 61 74  61 25 3d 31 b8 a9 73 74  |.....data%=1..st|
000033e0  72 69 6e 67 24 0d 0e 1a  44 e7 a7 73 65 70 61 72  |ring$...D..separ|
000033f0  61 74 6f 72 24 2c c1 73  74 72 69 6e 67 24 2c 64  |ator$,.string$,d|
00003400  61 74 61 25 2c 31 29 29  3d 30 20 8c 77 6f 72 6b  |ata%,1))=0 .work|
00003410  24 3d 77 6f 72 6b 24 2b  c1 73 74 72 69 6e 67 24  |$=work$+.string$|
00003420  2c 64 61 74 61 25 2c 31  29 0d 0e 24 05 ed 0d 0e  |,data%,1)..$....|
00003430  2e 0a 3d 77 6f 72 6b 24  0d 0e 38 05 3a 0d 0e 42  |..=work$..8.:..B|
00003440  14 dd a4 75 63 61 73 65  28 73 74 72 69 6e 67 24  |...ucase(string$|
00003450  29 0d 0e 4c 40 f4 20 41  6c 70 68 61 62 65 74 69  |)..L@. Alphabeti|
00003460  63 73 20 3d 3e 20 75 70  70 65 72 20 63 61 73 65  |cs => upper case|
00003470  20 28 41 53 43 69 69 20  76 61 6c 75 65 73 20 6f  | (ASCii values o|
00003480  66 20 61 2c 7a 20 61 72  65 20 39 37 2c 31 32 32  |f a,z are 97,122|
00003490  29 0d 0e 56 16 ea 64 61  74 61 25 2c 77 6f 72 6b  |)..V..data%,work|
000034a0  24 2c 62 79 74 65 25 0d  0e 60 17 e3 64 61 74 61  |$,byte%..`..data|
000034b0  25 3d 31 b8 a9 28 73 74  72 69 6e 67 24 29 0d 0e  |%=1..(string$)..|
000034c0  6a 22 62 79 74 65 25 3d  97 28 c1 73 74 72 69 6e  |j"byte%=.(.strin|
000034d0  67 24 2c 64 61 74 61 25  2c 31 29 29 80 26 44 46  |g$,data%,1)).&DF|
000034e0  0d 0e 74 4e e7 62 79 74  65 25 3e 97 22 5a 22 20  |..tN.byte%>."Z" |
000034f0  84 62 79 74 65 25 3c 97  22 41 22 20 8c 77 6f 72  |.byte%<."A" .wor|
00003500  6b 24 3d 77 6f 72 6b 24  2b c1 73 74 72 69 6e 67  |k$=work$+.string|
00003510  24 2c 64 61 74 61 25 2c  31 29 20 8b 77 6f 72 6b  |$,data%,1) .work|
00003520  24 3d 77 6f 72 6b 24 2b  bd 62 79 74 65 25 0d 0e  |$=work$+.byte%..|
00003530  7e 05 ed 0d 0e 88 0a 3d  77 6f 72 6b 24 0d 0e 92  |~......=work$...|
00003540  05 3a 0d 0e 9c 21 f4 20  2a 2a 2a 2a 4e 55 4d 45  |.:...!. ****NUME|
00003550  52 49 43 41 4c 20 55 54  49 4c 49 54 49 45 53 2a  |RICAL UTILITIES*|
00003560  2a 2a 2a 0d 0e a6 05 3a  0d 0e b0 22 dd a4 6f 76  |***....:..."..ov|
00003570  65 72 6c 61 79 28 6f 76  65 72 25 2c 6c 74 74 72  |erlay(over%,lttr|
00003580  24 2c 73 74 72 69 6e 67  24 29 0d 0e ba 3e f4 20  |$,string$)...>. |
00003590  4f 76 65 72 6c 61 79 73  20 74 68 65 20 62 69 6e  |Overlays the bin|
000035a0  61 72 79 20 63 6f 6e 76  65 72 73 69 6f 6e 20 6f  |ary conversion o|
000035b0  66 20 6f 76 65 72 25 20  69 6e 20 6c 74 74 72 24  |f over% in lttr$|
000035c0  27 73 20 70 6c 61 63 65  0d 0e c4 12 ea 62 69 6e  |'s place.....bin|
000035d0  61 72 79 24 2c 64 61 74  61 25 0d 0e ce 29 e3 64  |ary$,data%...).d|
000035e0  61 74 61 25 3d 28 a4 63  6f 75 6e 74 28 6c 74 74  |ata%=(.count(ltt|
000035f0  72 24 2c 73 74 72 69 6e  67 24 29 2d 31 29 b8 30  |r$,string$)-1).0|
00003600  88 2d 31 0d 0e d8 29 62  69 6e 61 72 79 24 3d 62  |.-1...)binary$=b|
00003610  69 6e 61 72 79 24 2b c3  28 b4 28 6f 76 65 72 25  |inary$+.(.(over%|
00003620  80 28 32 5e 64 61 74 61  25 29 29 29 0d 0e e2 05  |.(2^data%)))....|
00003630  ed 0d 0e ec 5a 3d c0 73  74 72 69 6e 67 24 2c a7  |....Z=.string$,.|
00003640  73 74 72 69 6e 67 24 2c  6c 74 74 72 24 29 2d 31  |string$,lttr$)-1|
00003650  29 2b 62 69 6e 61 72 79  24 2b c2 73 74 72 69 6e  |)+binary$+.strin|
00003660  67 24 2c a9 28 73 74 72  69 6e 67 24 29 2d a7 73  |g$,.(string$)-.s|
00003670  74 72 69 6e 67 24 2c 6c  74 74 72 24 29 2d a9 28  |tring$,lttr$)-.(|
00003680  62 69 6e 61 72 79 24 29  2b 31 29 0d 0e f6 05 3a  |binary$)+1)....:|
00003690  0d 0f 00 18 dd a4 66 69  6e 64 76 61 6c 75 65 28  |......findvalue(|
000036a0  73 74 72 69 6e 67 24 29  0d 0f 0a 32 e7 c2 73 74  |string$)...2..st|
000036b0  72 69 6e 67 24 2c 31 29  3d 22 24 22 20 8c 3d 73  |ring$,1)="$" .=s|
000036c0  74 72 69 6e 67 24 28 a4  61 6c 6c 6f 63 61 74 65  |tring$(.allocate|
000036d0  28 73 74 72 69 6e 67 24  29 29 0d 0f 14 33 e7 c2  |(string$))...3..|
000036e0  73 74 72 69 6e 67 24 2c  31 29 3d 22 25 22 20 8c  |string$,1)="%" .|
000036f0  3d 69 6e 74 65 67 65 72  25 28 a4 61 6c 6c 6f 63  |=integer%(.alloc|
00003700  61 74 65 28 73 74 72 69  6e 67 24 29 29 0d 0f 1e  |ate(string$))...|
00003710  1d 3d 72 65 61 6c 28 a4  61 6c 6c 6f 63 61 74 65  |.=real(.allocate|
00003720  28 73 74 72 69 6e 67 24  29 29 0d 0f 28 05 3a 0d  |(string$))..(.:.|
00003730  0f 32 1d dd f2 61 73 73  69 67 6e 76 61 72 69 61  |.2...assignvaria|
00003740  62 6c 65 28 73 74 72 69  6e 67 24 29 0d 0f 3c 34  |ble(string$)..<4|
00003750  f4 20 55 73 65 64 20 74  6f 20 64 65 66 69 6e 65  |. Used to define|
00003760  20 76 61 72 69 61 62 6c  65 73 20 6f 75 74 73 69  | variables outsi|
00003770  64 65 20 74 68 65 20 61  73 73 65 6d 62 6c 65 72  |de the assembler|
00003780  0d 0f 46 16 ea 64 61 74  61 25 2c 6c 74 74 72 24  |..F..data%,lttr$|
00003790  2c 77 6f 72 6b 24 0d 0f  50 2e 77 6f 72 6b 24 3d  |,work$..P.work$=|
000037a0  a4 73 74 72 69 70 6c 65  66 74 28 a4 66 69 6e 64  |.stripleft(.find|
000037b0  77 69 6c 64 28 31 2c 73  74 72 69 6e 67 24 2c 22  |wild(1,string$,"|
000037c0  3d 22 29 29 0d 0f 5a 3d  77 6f 72 6b 24 3d a4 73  |="))..Z=work$=.s|
000037d0  74 72 69 70 72 69 67 68  74 28 77 6f 72 6b 24 29  |tripright(work$)|
000037e0  3a f4 20 4e 6f 77 20 63  6f 6e 74 61 69 6e 73 20  |:. Now contains |
000037f0  74 68 65 20 76 61 72 69  61 62 6c 65 20 6e 61 6d  |the variable nam|
00003800  65 0d 0f 64 36 f4 20 46  69 72 73 74 2c 73 65 61  |e..d6. First,sea|
00003810  72 63 68 20 66 6f 72 20  61 62 73 6f 6c 75 74 65  |rch for absolute|
00003820  6c 79 20 66 6f 72 62 69  64 64 65 6e 20 63 68 61  |ly forbidden cha|
00003830  72 61 63 74 65 72 73 0d  0f 6e 19 e3 64 61 74 61  |racters..n..data|
00003840  25 3d 31 b8 28 a9 28 77  6f 72 6b 24 29 2d 31 29  |%=1.(.(work$)-1)|
00003850  0d 0f 78 19 6c 74 74 72  24 3d c1 77 6f 72 6b 24  |..x.lttr$=.work$|
00003860  2c 64 61 74 61 25 2c 31  29 0d 0f 82 4b e7 a7 bd  |,data%,1)...K...|
00003870  33 34 2b 22 20 21 23 25  26 27 28 29 2a 2b 2c 2d  |34+" !#%&'()*+,-|
00003880  2e 2f 3a 3b 3c 3d 3e 3f  40 5b 5c 5d 5e 60 22 2c  |./:;<=>?@[\]^`",|
00003890  6c 74 74 72 24 29 3c 3e  30 20 84 97 6c 74 74 72  |lttr$)<>0 ..lttr|
000038a0  24 3e 31 32 32 20 8c f1  27 22 4d 69 73 74 61 6b  |$>122 ..'"Mistak|
000038b0  65 22 3a e1 0d 0f 8c 05  ed 0d 0f 96 32 f4 20 4e  |e":.........2. N|
000038c0  6f 77 2c 63 68 65 63 6b  20 69 74 20 64 6f 65 73  |ow,check it does|
000038d0  6e 27 74 20 73 74 61 72  74 20 77 69 74 68 20 61  |n't start with a|
000038e0  6e 79 20 6f 66 20 74 68  65 73 65 0d 0f a0 13 6c  |ny of these....l|
000038f0  74 74 72 24 3d c0 77 6f  72 6b 24 2c 31 29 0d 0f  |ttr$=.work$,1)..|
00003900  aa 30 e7 a7 22 30 31 32  33 34 35 36 37 38 39 22  |.0.."0123456789"|
00003910  2c 6c 74 74 72 24 29 3c  3e 30 20 8c f1 27 22 53  |,lttr$)<>0 ..'"S|
00003920  79 6e 74 61 78 20 65 72  72 6f 72 22 3a e1 0d 0f  |yntax error":...|
00003930  b4 30 e7 6c 74 74 72 24  3d 22 24 22 20 8c f1 27  |.0.lttr$="$" ..'|
00003940  22 44 6f 6e 27 74 20 75  73 65 20 74 68 65 20 27  |"Don't use the '|
00003950  24 27 20 6f 70 65 72 61  74 6f 72 22 3a e1 0d 0f  |$' operator":...|
00003960  be 19 f4 20 47 75 65 73  73 20 74 68 65 20 74 79  |... Guess the ty|
00003970  70 65 20 74 69 6d 65 0d  0f c8 13 6c 74 74 72 24  |pe time....lttr$|
00003980  3d c2 77 6f 72 6b 24 2c  31 29 0d 0f d2 4a e7 a7  |=.work$,1)...J..|
00003990  bd 33 34 2b 22 20 21 23  26 27 28 29 2a 2b 2c 2d  |.34+" !#&'()*+,-|
000039a0  2e 2f 3a 3b 3c 3d 3e 3f  40 5b 5c 5d 5e 60 22 2c  |./:;<=>?@[\]^`",|
000039b0  6c 74 74 72 24 29 3c 3e  30 20 84 97 6c 74 74 72  |lttr$)<>0 ..lttr|
000039c0  24 3e 31 32 32 20 8c f1  27 22 4d 69 73 74 61 6b  |$>122 ..'"Mistak|
000039d0  65 22 3a e1 0d 0f dc 3c  f4 20 4c 6f 63 61 74 65  |e":....<. Locate|
000039e0  2f 63 72 65 61 74 65 20  73 6c 6f 74 20 70 61 73  |/create slot pas|
000039f0  73 69 6e 67 20 27 73 74  72 69 6e 67 24 27 20 61  |sing 'string$' a|
00003a00  73 20 74 68 65 20 65 78  70 72 65 73 73 69 6f 6e  |s the expression|
00003a10  0d 0f e6 2e 73 74 72 69  6e 67 24 3d c2 73 74 72  |....string$=.str|
00003a20  69 6e 67 24 2c a9 28 73  74 72 69 6e 67 24 29 2d  |ing$,.(string$)-|
00003a30  a7 73 74 72 69 6e 67 24  2c 22 3d 22 29 29 0d 0f  |.string$,"="))..|
00003a40  f0 3a e7 6c 74 74 72 24  3d 22 24 22 20 8c 73 74  |.:.lttr$="$" .st|
00003a50  72 69 6e 67 24 28 a4 61  6c 6c 6f 63 61 74 65 28  |ring$(.allocate(|
00003a60  77 6f 72 6b 24 29 29 3d  a4 73 65 74 73 74 72 28  |work$))=.setstr(|
00003a70  73 74 72 69 6e 67 24 29  0d 0f fa 3b e7 6c 74 74  |string$)...;.ltt|
00003a80  72 24 3d 22 25 22 20 8c  69 6e 74 65 67 65 72 25  |r$="%" .integer%|
00003a90  28 a4 61 6c 6c 6f 63 61  74 65 28 77 6f 72 6b 24  |(.allocate(work$|
00003aa0  29 29 3d a4 73 65 74 6e  75 6d 28 73 74 72 69 6e  |))=.setnum(strin|
00003ab0  67 24 29 0d 10 04 44 e7  6c 74 74 72 24 3c 3e 22  |g$)...D.lttr$<>"|
00003ac0  25 22 20 80 6c 74 74 72  24 3c 3e 22 24 22 20 8c  |%" .lttr$<>"$" .|
00003ad0  72 65 61 6c 28 a4 61 6c  6c 6f 63 61 74 65 28 77  |real(.allocate(w|
00003ae0  6f 72 6b 24 29 29 3d a4  73 65 74 6e 75 6d 28 73  |ork$))=.setnum(s|
00003af0  74 72 69 6e 67 24 29 0d  10 0e 05 e1 0d 10 18 05  |tring$).........|
00003b00  3a 0d 10 22 1a dd a4 61  73 73 69 67 6e 6c 61 62  |:.."...assignlab|
00003b10  65 6c 28 73 74 72 69 6e  67 24 29 0d 10 2c 2c f4  |el(string$)..,,.|
00003b20  20 55 73 65 64 20 62 79  20 74 68 65 20 61 73 73  | Used by the ass|
00003b30  65 6d 62 6c 65 72 20 74  6f 20 61 73 73 69 67 6e  |embler to assign|
00003b40  20 6c 61 62 65 6c 73 0d  10 36 16 ea 64 61 74 61  | labels..6..data|
00003b50  25 2c 6c 74 74 72 24 2c  77 6f 72 6b 24 0d 10 40  |%,lttr$,work$..@|
00003b60  2e 73 74 72 69 6e 67 24  3d a4 73 74 72 69 70 6c  |.string$=.stripl|
00003b70  65 66 74 28 c2 73 74 72  69 6e 67 24 2c a9 28 73  |eft(.string$,.(s|
00003b80  74 72 69 6e 67 24 29 2d  31 29 29 0d 10 4a 43 e7  |tring$)-1))..JC.|
00003b90  28 6f 70 74 69 6f 6e 25  80 31 29 3d 31 20 8c f1  |(option%.1)=1 ..|
00003ba0  a4 70 61 64 28 34 2c c3  7e a4 66 69 6e 64 76 61  |.pad(4,.~.findva|
00003bb0  6c 75 65 28 22 50 25 22  29 29 3b 89 28 37 29 3b  |lue("P%"));.(7);|
00003bc0  22 2e 22 3b 73 74 72 69  6e 67 24 3a 3d b9 0d 10  |".";string$:=...|
00003bd0  54 20 73 74 72 69 6e 67  24 3d a4 73 74 72 69 70  |T string$=.strip|
00003be0  72 69 67 68 74 28 73 74  72 69 6e 67 24 29 0d 10  |right(string$)..|
00003bf0  5e 36 f4 20 46 69 72 73  74 2c 73 65 61 72 63 68  |^6. First,search|
00003c00  20 66 6f 72 20 61 62 73  6f 6c 75 74 65 6c 79 20  | for absolutely |
00003c10  66 6f 72 62 69 64 64 65  6e 20 63 68 61 72 61 63  |forbidden charac|
00003c20  74 65 72 73 0d 10 68 1b  e3 64 61 74 61 25 3d 31  |ters..h..data%=1|
00003c30  b8 28 a9 28 73 74 72 69  6e 67 24 29 2d 31 29 0d  |.(.(string$)-1).|
00003c40  10 72 1b 6c 74 74 72 24  3d c1 73 74 72 69 6e 67  |.r.lttr$=.string|
00003c50  24 2c 64 61 74 61 25 2c  31 29 0d 10 7c 4c e7 a7  |$,data%,1)..|L..|
00003c60  bd 33 34 2b 22 20 21 23  25 26 27 28 29 2a 2b 2c  |.34+" !#%&'()*+,|
00003c70  2d 2e 2f 3a 3b 3c 3d 3e  3f 40 5b 5c 5d 5e 60 22  |-./:;<=>?@[\]^`"|
00003c80  2c 6c 74 74 72 24 29 3c  3e 30 20 84 97 6c 74 74  |,lttr$)<>0 ..ltt|
00003c90  72 24 3e 31 32 32 20 8c  f1 27 22 4d 69 73 74 61  |r$>122 ..'"Mista|
00003ca0  6b 65 22 3a 3d a3 0d 10  86 05 ed 0d 10 90 32 f4  |ke":=.........2.|
00003cb0  20 4e 6f 77 2c 63 68 65  63 6b 20 69 74 20 64 6f  | Now,check it do|
00003cc0  65 73 6e 27 74 20 73 74  61 72 74 20 77 69 74 68  |esn't start with|
00003cd0  20 61 6e 79 20 6f 66 20  74 68 65 73 65 0d 10 9a  | any of these...|
00003ce0  38 e7 a7 22 24 30 31 32  33 34 35 36 37 38 39 22  |8.."$0123456789"|
00003cf0  2c c0 73 74 72 69 6e 67  24 2c 31 29 29 3c 3e 30  |,.string$,1))<>0|
00003d00  20 8c f1 27 22 53 79 6e  74 61 78 20 65 72 72 6f  | ..'"Syntax erro|
00003d10  72 22 3a 3d a3 0d 10 a4  24 f4 20 41 6e 64 20 69  |r":=....$. And i|
00003d20  74 20 63 61 6e 27 74 20  65 6e 64 20 77 69 74 68  |t can't end with|
00003d30  20 61 20 64 6f 6c 6c 61  72 0d 10 ae 15 6c 74 74  | a dollar....ltt|
00003d40  72 24 3d c2 73 74 72 69  6e 67 24 2c 31 29 0d 10  |r$=.string$,1)..|
00003d50  b8 24 e7 6c 74 74 72 24  3d 22 24 22 20 8c f1 27  |.$.lttr$="$" ..'|
00003d60  22 54 79 70 65 20 6d 69  73 6d 61 74 63 68 22 3a  |"Type mismatch":|
00003d70  3d a3 0d 10 c2 3f e7 a7  bd 33 34 2b 22 20 21 23  |=....?...34+" !#|
00003d80  26 27 28 29 2a 2b 2c 2d  2e 2f 3a 3b 3c 3d 3e 3f  |&'()*+,-./:;<=>?|
00003d90  40 5b 5c 5d 5e 60 22 2c  6c 74 74 72 24 29 3c 3e  |@[\]^`",lttr$)<>|
00003da0  30 20 8c f1 27 22 4d 69  73 74 61 6b 65 22 3a 3d  |0 ..'"Mistake":=|
00003db0  a3 0d 10 cc 4e 77 6f 72  6b 24 3d 73 74 72 69 6e  |....Nwork$=strin|
00003dc0  67 24 2b 22 3d 22 2b c3  28 a4 66 69 6e 64 76 61  |g$+"="+.(.findva|
00003dd0  6c 75 65 28 22 50 25 22  29 29 3a f4 20 4d 65 61  |lue("P%")):. Mea|
00003de0  6e 73 20 77 6f 72 6b 24  20 63 6f 6e 74 61 69 6e  |ns work$ contain|
00003df0  73 20 22 6e 61 6d 65 3d  50 25 22 20 6e 6f 77 0d  |s "name=P%" now.|
00003e00  10 d6 64 e7 6c 74 74 72  24 3d 22 25 22 20 8c 69  |..d.lttr$="%" .i|
00003e10  6e 74 65 67 65 72 25 28  a4 61 6c 6c 6f 63 61 74  |nteger%(.allocat|
00003e20  65 28 73 74 72 69 6e 67  24 29 29 3d a4 73 65 74  |e(string$))=.set|
00003e30  6e 75 6d 28 77 6f 72 6b  24 29 20 8b 72 65 61 6c  |num(work$) .real|
00003e40  28 a4 61 6c 6c 6f 63 61  74 65 28 73 74 72 69 6e  |(.allocate(strin|
00003e50  67 24 29 29 3d a4 73 65  74 6e 75 6d 28 77 6f 72  |g$))=.setnum(wor|
00003e60  6b 24 29 0d 10 e0 06 3d  b9 0d 10 ea 05 3a 0d 10  |k$)....=.....:..|
00003e70  f4 15 dd a4 73 65 74 6e  75 6d 28 73 74 72 69 6e  |....setnum(strin|
00003e80  67 24 29 0d 10 fe 32 f4  20 52 65 74 75 72 6e 73  |g$)...2. Returns|
00003e90  20 61 20 6e 75 6d 62 65  72 20 65 76 61 6c 75 61  | a number evalua|
00003ea0  74 69 6f 6e 20 69 6e 63  6c 75 64 69 6e 67 20 62  |tion including b|
00003eb0  69 6e 61 72 79 0d 11 08  2e 73 74 72 69 6e 67 24  |inary....string$|
00003ec0  3d c2 73 74 72 69 6e 67  24 2c a9 28 73 74 72 69  |=.string$,.(stri|
00003ed0  6e 67 24 29 2d a7 73 74  72 69 6e 67 24 2c 22 3d  |ng$)-.string$,"=|
00003ee0  22 29 29 0d 11 12 20 73  74 72 69 6e 67 24 3d a4  |"))... string$=.|
00003ef0  6e 6f 77 69 6c 64 28 73  74 72 69 6e 67 24 2c 22  |nowild(string$,"|
00003f00  20 22 29 0d 11 1c 27 e7  c0 73 74 72 69 6e 67 24  | ")...'..string$|
00003f10  2c 31 29 3d 22 25 22 20  8c 3d a4 73 65 74 62 69  |,1)="%" .=.setbi|
00003f20  6e 28 73 74 72 69 6e 67  24 29 0d 11 26 1b 3d a0  |n(string$)..&.=.|
00003f30  28 a4 65 78 70 61 6e 64  6e 75 6d 28 73 74 72 69  |(.expandnum(stri|
00003f40  6e 67 24 29 29 0d 11 30  05 3a 0d 11 3a 15 dd a4  |ng$))..0.:..:...|
00003f50  73 65 74 73 74 72 28 73  74 72 69 6e 67 24 29 0d  |setstr(string$).|
00003f60  11 44 21 f4 20 52 65 74  75 72 6e 73 20 61 20 73  |.D!. Returns a s|
00003f70  74 72 69 6e 67 20 65 76  61 6c 75 61 74 69 6f 6e  |tring evaluation|
00003f80  0d 11 4e 1b 3d a0 28 a4  65 78 70 61 6e 64 73 74  |..N.=.(.expandst|
00003f90  72 28 73 74 72 69 6e 67  24 29 29 0d 11 58 05 3a  |r(string$))..X.:|
00003fa0  0d 11 62 15 dd a4 73 65  74 62 69 6e 28 73 74 72  |..b...setbin(str|
00003fb0  69 6e 67 24 29 0d 11 6c  1f f4 20 52 65 74 75 72  |ing$)..l.. Retur|
00003fc0  6e 73 20 62 69 6e 61 72  79 20 3d 3e 20 64 65 63  |ns binary => dec|
00003fd0  69 6d 61 6c 0d 11 76 18  ea 64 61 74 61 25 2c 72  |imal..v..data%,r|
00003fe0  65 73 75 6c 74 25 2c 6c  74 74 72 24 0d 11 80 35  |esult%,lttr$...5|
00003ff0  f4 20 61 63 63 65 70 74  73 20 6e 6f 73 2e 20 77  |. accepts nos. w|
00004000  69 74 68 20 6f 72 20 77  69 74 68 6f 75 74 20 6c  |ith or without l|
00004010  65 61 64 69 6e 67 20 27  25 27 20 73 79 6d 62 6f  |eading '%' symbo|
00004020  6c 0d 11 8a 3b 73 74 72  69 6e 67 24 3d a4 6e 6f  |l...;string$=.no|
00004030  77 69 6c 64 28 c2 73 74  72 69 6e 67 24 2c a9 28  |wild(.string$,.(|
00004040  73 74 72 69 6e 67 24 29  2d a7 73 74 72 69 6e 67  |string$)-.string|
00004050  24 2c 22 25 22 29 29 2c  22 20 22 29 0d 11 94 20  |$,"%"))," ")... |
00004060  e7 a9 73 74 72 69 6e 67  24 3e 31 34 20 8c f1 27  |..string$>14 ..'|
00004070  22 54 6f 6f 20 62 69 67  22 3a 3d 30 0d 11 9e 22  |"Too big":=0..."|
00004080  e7 a9 73 74 72 69 6e 67  24 3d 30 20 8c f1 27 22  |..string$=0 ..'"|
00004090  42 61 64 20 42 69 6e 61  72 79 22 3a 3d 30 0d 11  |Bad Binary":=0..|
000040a0  a8 15 e3 64 61 74 61 25  3d 31 b8 a9 73 74 72 69  |...data%=1..stri|
000040b0  6e 67 24 0d 11 b2 1b 6c  74 74 72 24 3d c1 73 74  |ng$....lttr$=.st|
000040c0  72 69 6e 67 24 2c 64 61  74 61 25 2c 31 29 0d 11  |ring$,data%,1)..|
000040d0  bc 34 e7 6c 74 74 72 24  3d 22 31 22 20 8c 72 65  |.4.lttr$="1" .re|
000040e0  73 75 6c 74 25 3d 72 65  73 75 6c 74 25 84 28 32  |sult%=result%.(2|
000040f0  5e 28 a9 73 74 72 69 6e  67 24 2d 64 61 74 61 25  |^(.string$-data%|
00004100  29 29 0d 11 c6 05 ed 0d  11 d0 0c 3d 72 65 73 75  |)).........=resu|
00004110  6c 74 25 0d 11 da 05 3a  0d 11 e4 17 dd a4 61 6c  |lt%....:......al|
00004120  6c 6f 63 61 74 65 28 73  74 72 69 6e 67 24 29 0d  |locate(string$).|
00004130  11 ee 48 f4 20 52 65 74  75 72 6e 20 74 68 65 20  |..H. Return the |
00004140  73 6c 6f 74 20 6e 75 6d  62 65 72 20 69 66 20 66  |slot number if f|
00004150  6f 75 6e 64 2c 6f 72 20  61 6c 6c 6f 63 61 74 65  |ound,or allocate|
00004160  20 61 20 6e 65 77 20 6f  6e 65 20 69 66 20 4e 4f  | a new one if NO|
00004170  54 20 66 6f 75 6e 64 0d  11 f8 2c ea 64 61 74 61  |T found...,.data|
00004180  25 2c 73 46 69 6e 64 25  2c 69 46 69 6e 64 25 2c  |%,sFind%,iFind%,|
00004190  72 46 69 6e 64 25 2c 74  79 70 65 25 2c 66 6f 75  |rFind%,type%,fou|
000041a0  6e 64 25 0d 12 02 27 73  46 69 6e 64 25 3d b9 3a  |nd%...'sFind%=.:|
000041b0  69 46 69 6e 64 25 3d b9  3a 72 46 69 6e 64 25 3d  |iFind%=.:rFind%=|
000041c0  b9 3a 66 6f 75 6e 64 25  3d b9 0d 12 0c 25 74 79  |.:found%=....%ty|
000041d0  70 65 25 3d 97 22 72 22  3a f4 20 41 73 73 75 6d  |pe%=."r":. Assum|
000041e0  65 20 61 20 72 65 61 6c  20 6e 75 6d 62 65 72 0d  |e a real number.|
000041f0  12 16 20 e7 c2 73 74 72  69 6e 67 24 2c 31 29 3d  |.. ..string$,1)=|
00004200  22 24 22 20 8c 74 79 70  65 25 3d 97 22 73 22 0d  |"$" .type%=."s".|
00004210  12 20 20 e7 c2 73 74 72  69 6e 67 24 2c 31 29 3d  |.  ..string$,1)=|
00004220  22 25 22 20 8c 74 79 70  65 25 3d 97 22 69 22 0d  |"%" .type%=."i".|
00004230  12 2a 0f e3 64 61 74 61  25 3d 30 b8 6e 25 0d 12  |.*..data%=0.n%..|
00004240  34 2a 72 46 69 6e 64 25  3d 72 46 69 6e 64 25 2b  |4*rFind%=rFind%+|
00004250  31 3a f4 20 41 73 73 75  6d 65 20 61 20 72 65 61  |1:. Assume a rea|
00004260  6c 20 6e 75 6d 62 65 72  0d 12 3e 3a e7 c2 6e 61  |l number..>:..na|
00004270  6d 65 24 28 64 61 74 61  25 29 2c 31 29 3d 22 24  |me$(data%),1)="$|
00004280  22 20 8c 73 46 69 6e 64  25 3d 73 46 69 6e 64 25  |" .sFind%=sFind%|
00004290  2b 31 3a 72 46 69 6e 64  25 3d 72 46 69 6e 64 25  |+1:rFind%=rFind%|
000042a0  2d 31 0d 12 48 3a e7 c2  6e 61 6d 65 24 28 64 61  |-1..H:..name$(da|
000042b0  74 61 25 29 2c 31 29 3d  22 25 22 20 8c 69 46 69  |ta%),1)="%" .iFi|
000042c0  6e 64 25 3d 69 46 69 6e  64 25 2b 31 3a 72 46 69  |nd%=iFind%+1:rFi|
000042d0  6e 64 25 3d 72 46 69 6e  64 25 2d 31 0d 12 52 33  |nd%=rFind%-1..R3|
000042e0  e7 73 74 72 69 6e 67 24  3d 6e 61 6d 65 24 28 64  |.string$=name$(d|
000042f0  61 74 61 25 29 20 8c 66  6f 75 6e 64 25 3d a0 28  |ata%) .found%=.(|
00004300  bd 74 79 70 65 25 2b 22  46 69 6e 64 25 22 29 0d  |.type%+"Find%").|
00004310  12 5c 05 ed 0d 12 66 17  e7 66 6f 75 6e 64 25 3c  |.\....f..found%<|
00004320  3e b9 20 8c 3d 66 6f 75  6e 64 25 0d 12 70 1d 6e  |>. .=found%..p.n|
00004330  61 6d 65 24 28 6e 25 29  3d 73 74 72 69 6e 67 24  |ame$(n%)=string$|
00004340  3a 6e 25 3d 6e 25 2b 31  0d 12 7a 3c e7 74 79 70  |:n%=n%+1..z<.typ|
00004350  65 25 3d 97 22 73 22 20  8c 73 25 3d 73 25 2b 31  |e%=."s" .s%=s%+1|
00004360  3a 3d 73 25 2d 31 3a f4  20 73 25 20 70 6f 69 6e  |:=s%-1:. s% poin|
00004370  74 73 20 74 6f 20 4e 45  58 54 20 66 72 65 65 20  |ts to NEXT free |
00004380  73 6c 6f 74 0d 12 84 3c  e7 74 79 70 65 25 3d 97  |slot...<.type%=.|
00004390  22 69 22 20 8c 69 25 3d  69 25 2b 31 3a 3d 69 25  |"i" .i%=i%+1:=i%|
000043a0  2d 31 3a f4 20 69 25 20  70 6f 69 6e 74 73 20 74  |-1:. i% points t|
000043b0  6f 20 4e 45 58 54 20 66  72 65 65 20 73 6c 6f 74  |o NEXT free slot|
000043c0  0d 12 8e 2f 72 25 3d 72  25 2b 31 3a 3d 72 25 2d  |.../r%=r%+1:=r%-|
000043d0  31 3a f4 20 72 25 20 70  6f 69 6e 74 73 20 74 6f  |1:. r% points to|
000043e0  20 4e 45 58 54 20 66 72  65 65 20 73 6c 6f 74 0d  | NEXT free slot.|
000043f0  12 98 05 3a 0d 12 a2 18  dd a4 65 78 70 61 6e 64  |...:......expand|
00004400  73 74 72 28 73 74 72 69  6e 67 24 29 0d 12 ac 33  |str(string$)...3|
00004410  f4 20 53 75 62 73 74 69  74 75 74 65 73 20 76 61  |. Substitutes va|
00004420  72 69 61 62 6c 65 73 20  66 72 6f 6d 20 6d 79 20  |riables from my |
00004430  6c 69 73 74 20 74 6f 20  6e 75 6d 62 65 72 73 0d  |list to numbers.|
00004440  12 b6 0f f4 20 4e 6f 74  20 79 65 74 21 21 0d 12  |.... Not yet!!..|
00004450  c0 0c 3d 73 74 72 69 6e  67 24 0d 12 ca 05 3a 0d  |..=string$....:.|
00004460  12 d4 18 dd a4 65 78 70  61 6e 64 6e 75 6d 28 73  |.....expandnum(s|
00004470  74 72 69 6e 67 24 29 0d  12 de 2c f4 20 53 75 62  |tring$)...,. Sub|
00004480  73 74 69 74 75 74 65 20  69 6e 20 6e 75 6d 62 65  |stitute in numbe|
00004490  72 73 20 61 6e 64 20 6d  79 20 76 61 72 69 61 62  |rs and my variab|
000044a0  6c 65 73 0d 12 e8 21 ea  70 6f 69 6e 74 65 72 25  |les...!.pointer%|
000044b0  2c 72 65 73 75 6c 74 24  2c 77 6f 72 6b 24 2c 62  |,result$,work$,b|
000044c0  79 74 65 24 0d 12 f2 0e  70 6f 69 6e 74 65 72 25  |yte$....pointer%|
000044d0  3d 31 0d 12 fc 05 f5 0d  13 06 1e 62 79 74 65 24  |=1.........byte$|
000044e0  3d c1 73 74 72 69 6e 67  24 2c 70 6f 69 6e 74 65  |=.string$,pointe|
000044f0  72 25 2c 31 29 0d 13 10  48 e7 62 79 74 65 24 3d  |r%,1)...H.byte$=|
00004500  22 26 22 20 8c 77 6f 72  6b 24 3d a4 70 6f 70 68  |"&" .work$=.poph|
00004510  65 78 28 73 74 72 69 6e  67 24 2c 70 6f 69 6e 74  |ex(string$,point|
00004520  65 72 25 29 3a 70 6f 69  6e 74 65 72 25 3d 70 6f  |er%):pointer%=po|
00004530  69 6e 74 65 72 25 2b a9  77 6f 72 6b 24 0d 13 1a  |inter%+.work$...|
00004540  51 e7 62 79 74 65 24 3d  22 25 22 20 8c 77 6f 72  |Q.byte$="%" .wor|
00004550  6b 24 3d c3 28 a4 73 65  74 62 69 6e 28 c2 73 74  |k$=.(.setbin(.st|
00004560  72 69 6e 67 24 2c a9 73  74 72 69 6e 67 24 2d 70  |ring$,.string$-p|
00004570  6f 69 6e 74 65 72 25 29  29 29 3a 70 6f 69 6e 74  |ointer%))):point|
00004580  65 72 25 3d a9 73 74 72  69 6e 67 24 2b 31 0d 13  |er%=.string$+1..|
00004590  24 41 e7 97 28 62 79 74  65 24 29 3e 31 32 37 20  |$A..(byte$)>127 |
000045a0  8c 77 6f 72 6b 24 3d a4  75 6e 70 61 63 6b 74 6f  |.work$=.unpackto|
000045b0  6b 65 6e 28 97 62 79 74  65 24 29 3a 70 6f 69 6e  |ken(.byte$):poin|
000045c0  74 65 72 25 3d 70 6f 69  6e 74 65 72 25 2b 31 0d  |ter%=pointer%+1.|
000045d0  13 2e 46 e7 a7 22 30 31  32 33 34 35 36 37 38 39  |..F.."0123456789|
000045e0  5e 28 29 2a 2d 2b 2f 2e  20 22 2c 62 79 74 65 24  |^()*-+/. ",byte$|
000045f0  29 3c 3e 30 20 8c 77 6f  72 6b 24 3d 62 79 74 65  |)<>0 .work$=byte|
00004600  24 3a 70 6f 69 6e 74 65  72 25 3d 70 6f 69 6e 74  |$:pointer%=point|
00004610  65 72 25 2b 31 0d 13 38  86 e7 a7 22 30 31 32 33  |er%+1..8..."0123|
00004620  34 35 36 37 38 39 26 25  5e 28 29 2a 2d 2b 2f 2e  |456789&%^()*-+/.|
00004630  20 22 2c 62 79 74 65 24  29 3d 30 20 8c 77 6f 72  | ",byte$)=0 .wor|
00004640  6b 24 3d a4 66 69 6e 64  77 69 6c 64 28 70 6f 69  |k$=.findwild(poi|
00004650  6e 74 65 72 25 2c 73 74  72 69 6e 67 24 2c 22 5e  |nter%,string$,"^|
00004660  2a 2d 2b 2f 20 22 29 3a  70 6f 69 6e 74 65 72 25  |*-+/ "):pointer%|
00004670  3d 70 6f 69 6e 74 65 72  25 2b a9 77 6f 72 6b 24  |=pointer%+.work$|
00004680  3a 77 6f 72 6b 24 3d c3  28 a4 66 69 6e 64 76 61  |:work$=.(.findva|
00004690  6c 75 65 28 77 6f 72 6b  24 29 29 0d 13 42 19 72  |lue(work$))..B.r|
000046a0  65 73 75 6c 74 24 3d 72  65 73 75 6c 74 24 2b 77  |esult$=result$+w|
000046b0  6f 72 6b 24 0d 13 4c 16  fd 70 6f 69 6e 74 65 72  |ork$..L..pointer|
000046c0  25 3e a9 73 74 72 69 6e  67 24 0d 13 56 0c 3d 72  |%>.string$..V.=r|
000046d0  65 73 75 6c 74 24 0d 13  60 05 3a 0d 13 6a 21 f4  |esult$..`.:..j!.|
000046e0  20 2a 2a 2a 2a 54 41 42  4c 45 53 20 4f 46 20 54  | ****TABLES OF T|
000046f0  45 4d 50 4c 41 54 45 53  2a 2a 2a 2a 0d 13 74 05  |EMPLATES****..t.|
00004700  3a 0d 13 7e 4b f4 20 4d  6e 65 6d 6f 6e 69 63 73  |:..~K. Mnemonics|
00004710  20 61 6c 6c 6f 77 65 64  2c 77 68 65 72 65 20 66  | allowed,where f|
00004720  3d 66 69 6c 65 2c 64 3d  64 65 73 74 69 6e 61 74  |=file,d=destinat|
00004730  69 6f 6e 2c 62 3d 62 69  74 20 70 61 74 74 65 72  |ion,b=bit patter|
00004740  6e 2c 6b 3d 63 6f 6e 73  74 61 6e 74 0d 13 88 33  |n,k=constant...3|
00004750  dc 22 30 30 20 30 31 31  31 20 64 66 66 66 20 66  |."00 0111 dfff f|
00004760  66 66 66 22 2c 22 41 44  44 57 46 20 20 66 2c 64  |fff","ADDWF  f,d|
00004770  22 2c 22 41 64 64 20 57  20 61 6e 64 20 66 22 0d  |","Add W and f".|
00004780  13 92 33 dc 22 30 30 20  30 31 30 31 20 64 66 66  |..3."00 0101 dff|
00004790  66 20 66 66 66 66 22 2c  22 41 4e 44 57 46 20 20  |f ffff","ANDWF  |
000047a0  66 2c 64 22 2c 22 41 4e  44 20 57 20 61 6e 64 20  |f,d","AND W and |
000047b0  66 22 0d 13 9c 38 dc 22  31 31 20 31 31 31 78 20  |f"...8."11 111x |
000047c0  6b 6b 6b 6b 20 6b 6b 6b  6b 22 2c 22 41 44 44 4c  |kkkk kkkk","ADDL|
000047d0  57 20 20 6b 20 20 22 2c  22 41 64 64 20 6c 69 74  |W  k  ","Add lit|
000047e0  65 72 61 6c 20 74 6f 20  57 22 0d 13 a6 39 dc 22  |eral to W"...9."|
000047f0  31 31 20 31 30 30 31 20  6b 6b 6b 6b 20 6b 6b 6b  |11 1001 kkkk kkk|
00004800  6b 22 2c 22 41 4e 44 4c  57 20 20 6b 20 20 22 2c  |k","ANDLW  k  ",|
00004810  22 41 6e 64 20 6c 69 74  65 72 61 6c 20 61 6e 64  |"And literal and|
00004820  20 57 22 0d 13 b0 33 dc  22 30 31 20 30 30 62 62  | W"...3."01 00bb|
00004830  20 62 66 66 66 20 66 66  66 66 22 2c 22 42 43 46  | bfff ffff","BCF|
00004840  20 20 20 20 66 2c 62 22  2c 22 42 69 74 20 63 6c  |    f,b","Bit cl|
00004850  65 61 72 20 66 22 0d 13  ba 31 dc 22 30 31 20 30  |ear f"...1."01 0|
00004860  31 62 62 20 62 66 66 66  20 66 66 66 66 22 2c 22  |1bb bfff ffff","|
00004870  42 53 46 20 20 20 20 66  2c 62 22 2c 22 42 69 74  |BSF    f,b","Bit|
00004880  20 73 65 74 20 66 22 0d  13 c4 40 dc 22 30 31 20  | set f"...@."01 |
00004890  31 30 62 62 20 62 66 66  66 20 66 66 66 66 22 2c  |10bb bfff ffff",|
000048a0  22 42 54 46 53 43 20 20  66 2c 62 22 2c 22 42 69  |"BTFSC  f,b","Bi|
000048b0  74 20 74 65 73 74 2c 73  6b 69 70 20 69 66 20 63  |t test,skip if c|
000048c0  6c 65 61 72 20 20 22 0d  13 ce 3c dc 22 30 31 20  |lear  "...<."01 |
000048d0  31 31 62 62 20 62 66 66  66 20 66 66 66 66 22 2c  |11bb bfff ffff",|
000048e0  22 42 54 46 53 53 20 20  66 2c 62 22 2c 22 42 69  |"BTFSS  f,b","Bi|
000048f0  74 20 74 65 73 74 2c 73  6b 69 70 20 69 66 20 73  |t test,skip if s|
00004900  65 74 22 0d 13 d8 37 dc  22 31 30 20 30 6b 6b 6b  |et"...7."10 0kkk|
00004910  20 6b 6b 6b 6b 20 6b 6b  6b 6b 22 2c 22 43 41 4c  | kkkk kkkk","CAL|
00004920  4c 20 20 20 6b 20 20 22  2c 22 43 61 6c 6c 20 73  |L   k  ","Call s|
00004930  75 62 72 6f 75 74 69 6e  65 22 0d 13 e2 3d dc 22  |ubroutine"...=."|
00004940  30 30 20 30 30 30 30 20  30 31 31 30 20 30 31 30  |00 0000 0110 010|
00004950  30 22 2c 22 43 4c 52 57  44 54 20 20 20 20 22 2c  |0","CLRWDT    ",|
00004960  22 43 6c 65 61 72 20 77  61 74 63 68 20 64 6f 67  |"Clear watch dog|
00004970  20 74 69 6d 65 72 22 0d  13 ec 2f dc 22 30 30 20  | timer".../."00 |
00004980  30 30 30 31 20 30 78 78  78 20 78 78 78 78 22 2c  |0001 0xxx xxxx",|
00004990  22 43 4c 52 57 20 20 20  20 20 20 22 2c 22 43 6c  |"CLRW      ","Cl|
000049a0  65 61 72 20 57 22 0d 13  f6 2f dc 22 30 30 20 30  |ear W".../."00 0|
000049b0  30 30 31 20 31 66 66 66  20 66 66 66 66 22 2c 22  |001 1fff ffff","|
000049c0  43 4c 52 46 20 20 20 66  20 20 22 2c 22 43 6c 65  |CLRF   f  ","Cle|
000049d0  61 72 20 66 22 0d 14 00  34 dc 22 30 30 20 31 30  |ar f"...4."00 10|
000049e0  30 31 20 64 66 66 66 20  66 66 66 66 22 2c 22 43  |01 dfff ffff","C|
000049f0  4f 4d 46 20 20 20 66 2c  64 22 2c 22 43 6f 6d 70  |OMF   f,d","Comp|
00004a00  6c 65 6d 65 6e 74 20 66  22 0d 14 0a 41 dc 22 30  |lement f"...A."0|
00004a10  30 20 31 30 31 31 20 64  66 66 66 20 66 66 66 66  |0 1011 dfff ffff|
00004a20  22 2c 22 44 45 43 46 53  5a 20 66 2c 64 22 2c 22  |","DECFSZ f,d","|
00004a30  44 65 63 72 65 6d 65 6e  74 20 66 2c 20 73 6b 69  |Decrement f, ski|
00004a40  70 20 69 66 20 7a 65 72  6f 22 0d 14 14 33 dc 22  |p if zero"...3."|
00004a50  30 30 20 30 30 31 31 20  64 66 66 66 20 66 66 66  |00 0011 dfff fff|
00004a60  66 22 2c 22 44 45 43 46  20 20 20 66 2c 64 22 2c  |f","DECF   f,d",|
00004a70  22 44 65 63 72 65 6d 65  6e 74 20 66 22 0d 14 1e  |"Decrement f"...|
00004a80  37 dc 22 31 30 20 31 6b  6b 6b 20 6b 6b 6b 6b 20  |7."10 1kkk kkkk |
00004a90  6b 6b 6b 6b 22 2c 22 47  4f 54 4f 20 20 20 6b 20  |kkkk","GOTO   k |
00004aa0  20 22 2c 22 47 6f 74 6f  20 61 64 64 72 65 73 73  | ","Goto address|
00004ab0  20 20 6b 22 0d 14 28 42  dc 22 31 31 20 31 30 30  |  k"..(B."11 100|
00004ac0  30 20 6b 6b 6b 6b 20 6b  6b 6b 6b 22 2c 22 49 4f  |0 kkkk kkkk","IO|
00004ad0  52 4c 57 20 20 6b 20 20  22 2c 22 49 6e 63 6c 75  |RLW  k  ","Inclu|
00004ae0  73 69 76 65 20 4f 52 20  6c 69 74 65 72 61 6c 20  |sive OR literal |
00004af0  61 6e 64 20 57 22 0d 14  32 40 dc 22 30 30 20 31  |and W"..2@."00 1|
00004b00  31 31 31 20 64 66 66 66  20 66 66 66 66 22 2c 22  |111 dfff ffff","|
00004b10  49 4e 43 46 53 5a 20 66  2c 64 22 2c 22 49 6e 63  |INCFSZ f,d","Inc|
00004b20  72 65 6d 65 6e 74 20 66  2c 73 6b 69 70 20 69 66  |rement f,skip if|
00004b30  20 7a 65 72 6f 22 0d 14  3c 33 dc 22 30 30 20 31  | zero"..<3."00 1|
00004b40  30 31 30 20 64 66 66 66  20 66 66 66 66 22 2c 22  |010 dfff ffff","|
00004b50  49 4e 43 46 20 20 20 66  2c 64 22 2c 22 49 6e 63  |INCF   f,d","Inc|
00004b60  72 65 6d 65 6e 74 20 66  22 0d 14 46 3c dc 22 30  |rement f"..F<."0|
00004b70  30 20 30 31 30 30 20 64  66 66 66 20 66 66 66 66  |0 0100 dfff ffff|
00004b80  22 2c 22 49 4f 52 57 46  20 20 66 2c 64 22 2c 22  |","IORWF  f,d","|
00004b90  49 6e 63 6c 75 73 69 76  65 20 4f 52 20 57 20 61  |Inclusive OR W a|
00004ba0  6e 64 20 66 22 0d 14 50  2e dc 22 30 30 20 31 30  |nd f"..P.."00 10|
00004bb0  30 30 20 64 66 66 66 20  66 66 66 66 22 2c 22 4d  |00 dfff ffff","M|
00004bc0  4f 56 46 20 20 20 66 2c  64 22 2c 22 4d 6f 76 65  |OVF   f,d","Move|
00004bd0  20 66 22 0d 14 5a 33 dc  22 30 30 20 30 30 30 30  | f"..Z3."00 0000|
00004be0  20 31 66 66 66 20 66 66  66 66 22 2c 22 4d 4f 56  | 1fff ffff","MOV|
00004bf0  57 46 20 20 66 20 20 22  2c 22 4d 6f 76 65 20 57  |WF  f  ","Move W|
00004c00  20 74 6f 20 66 22 0d 14  64 39 dc 22 31 31 20 30  | to f"..d9."11 0|
00004c10  30 78 78 20 6b 6b 6b 6b  20 6b 6b 6b 6b 22 2c 22  |0xx kkkk kkkk","|
00004c20  4d 4f 56 4c 57 20 20 6b  20 20 22 2c 22 4d 6f 76  |MOVLW  k  ","Mov|
00004c30  65 20 4c 69 74 65 72 61  6c 20 74 6f 20 57 22 0d  |e Literal to W".|
00004c40  14 6e 34 dc 22 30 30 20  30 30 30 30 20 30 78 78  |.n4."00 0000 0xx|
00004c50  30 20 30 30 30 30 22 2c  22 4e 4f 50 20 20 20 20  |0 0000","NOP    |
00004c60  20 20 20 22 2c 22 4e 6f  20 6f 70 65 72 61 74 69  |   ","No operati|
00004c70  6f 6e 22 0d 14 78 43 dc  22 30 30 20 30 30 30 30  |on"..xC."00 0000|
00004c80  20 30 31 31 30 20 30 30  31 30 22 2c 22 4f 50 54  | 0110 0010","OPT|
00004c90  49 4f 4e 20 20 20 20 22  2c 22 4c 6f 61 64 20 4f  |ION    ","Load O|
00004ca0  50 54 49 4f 4e 20 72 65  67 69 73 74 65 72 20 77  |PTION register w|
00004cb0  69 74 68 20 57 22 0d 14  82 35 dc 22 30 30 20 31  |ith W"...5."00 1|
00004cc0  31 30 31 20 64 66 66 66  20 66 66 66 66 22 2c 22  |101 dfff ffff","|
00004cd0  52 4c 46 20 20 20 20 66  2c 64 22 2c 22 52 6f 74  |RLF    f,d","Rot|
00004ce0  61 74 65 20 6c 65 66 74  20 66 22 0d 14 8c 36 dc  |ate left f"...6.|
00004cf0  22 30 30 20 31 31 30 30  20 64 66 66 66 20 66 66  |"00 1100 dfff ff|
00004d00  66 66 22 2c 22 52 52 46  20 20 20 20 66 2c 64 22  |ff","RRF    f,d"|
00004d10  2c 22 52 6f 74 61 74 65  20 72 69 67 68 74 20 66  |,"Rotate right f|
00004d20  22 0d 14 96 3d dc 22 30  30 20 30 30 30 30 20 30  |"...=."00 0000 0|
00004d30  30 30 30 20 31 30 30 31  22 2c 22 52 45 54 46 49  |000 1001","RETFI|
00004d40  45 20 20 20 20 22 2c 22  52 65 74 75 72 6e 20 66  |E    ","Return f|
00004d50  72 6f 6d 20 49 6e 74 65  72 72 75 70 74 22 0d 14  |rom Interrupt"..|
00004d60  a0 40 dc 22 31 31 20 30  31 78 78 20 6b 6b 6b 6b  |.@."11 01xx kkkk|
00004d70  20 6b 6b 6b 6b 22 2c 22  52 45 54 4c 57 20 20 6b  | kkkk","RETLW  k|
00004d80  20 20 22 2c 22 52 65 74  75 72 6e 20 77 69 74 68  |  ","Return with|
00004d90  20 6c 69 74 65 72 61 6c  20 69 6e 20 57 22 0d 14  | literal in W"..|
00004da0  aa 3e dc 22 30 30 20 30  30 30 30 20 30 30 30 30  |.>."00 0000 0000|
00004db0  20 31 30 30 30 22 2c 22  52 45 54 55 52 4e 20 20  | 1000","RETURN  |
00004dc0  20 20 22 2c 22 52 65 74  75 72 6e 20 66 72 6f 6d  |  ","Return from|
00004dd0  20 73 75 62 72 6f 75 74  69 6e 65 22 0d 14 b4 39  | subroutine"...9|
00004de0  dc 22 30 30 20 30 30 31  30 20 64 66 66 66 20 66  |."00 0010 dfff f|
00004df0  66 66 66 22 2c 22 53 55  42 57 46 20 20 66 2c 64  |fff","SUBWF  f,d|
00004e00  22 2c 22 53 75 62 74 72  61 63 74 20 57 20 66 72  |","Subtract W fr|
00004e10  6f 6d 20 66 22 0d 14 be  46 dc 22 30 30 20 31 31  |om f"...F."00 11|
00004e20  31 30 20 64 66 66 66 20  66 66 66 66 22 2c 22 53  |10 dfff ffff","S|
00004e30  57 41 50 46 20 20 66 2c  64 22 2c 22 53 77 61 70  |WAPF  f,d","Swap|
00004e40  20 6c 65 66 74 20 26 20  72 69 67 68 74 20 6e 79  | left & right ny|
00004e50  62 62 6c 65 73 20 6f 66  20 66 22 0d 14 c8 3d dc  |bbles of f"...=.|
00004e60  22 30 30 20 30 30 30 30  20 30 31 31 30 20 30 30  |"00 0000 0110 00|
00004e70  31 31 22 2c 22 53 4c 45  45 50 20 20 20 20 20 22  |11","SLEEP     "|
00004e80  2c 22 47 6f 20 69 6e 74  6f 20 73 74 61 6e 64 20  |,"Go into stand |
00004e90  62 79 20 6d 6f 64 65 22  0d 14 d2 3f dc 22 31 31  |by mode"...?."11|
00004ea0  20 31 31 30 78 20 6b 6b  6b 6b 20 6b 6b 6b 6b 22  | 110x kkkk kkkk"|
00004eb0  2c 22 53 55 42 4c 57 20  20 6b 20 20 22 2c 22 53  |,"SUBLW  k  ","S|
00004ec0  75 62 74 72 61 63 74 20  57 20 66 72 6f 6d 20 6c  |ubtract W from l|
00004ed0  69 74 65 72 61 6c 22 0d  14 dc 37 dc 22 30 30 20  |iteral"...7."00 |
00004ee0  30 30 30 30 20 30 31 31  30 20 30 66 66 66 22 2c  |0000 0110 0fff",|
00004ef0  22 54 52 49 53 20 20 20  66 20 20 22 2c 22 54 72  |"TRIS   f  ","Tr|
00004f00  69 73 74 61 74 65 20 70  6f 72 74 20 66 22 0d 14  |istate port f"..|
00004f10  e6 3c dc 22 30 30 20 30  31 31 30 20 64 66 66 66  |.<."00 0110 dfff|
00004f20  20 66 66 66 66 22 2c 22  58 4f 52 57 46 20 20 66  | ffff","XORWF  f|
00004f30  2c 64 22 2c 22 45 78 63  6c 75 73 69 76 65 20 4f  |,d","Exclusive O|
00004f40  52 20 57 20 61 6e 64 20  66 22 0d 14 f0 42 dc 22  |R W and f"...B."|
00004f50  31 31 20 31 30 31 30 20  6b 6b 6b 6b 20 6b 6b 6b  |11 1010 kkkk kkk|
00004f60  6b 22 2c 22 58 4f 52 4c  57 20 20 6b 20 20 22 2c  |k","XORLW  k  ",|
00004f70  22 45 78 63 6c 75 73 69  76 65 20 4f 52 20 6c 69  |"Exclusive OR li|
00004f80  74 65 72 61 6c 20 61 6e  64 20 57 22 0d 14 fa 3f  |teral and W"...?|
00004f90  dc 22 5b 5b 5b 22 2c 22  5b 5b 5b 22 2c 22 45 4f  |."[[[","[[[","EO|
00004fa0  54 20 6d 61 72 6b 65 72  20 43 48 52 24 39 31 20  |T marker CHR$91 |
00004fb0  69 73 20 41 53 43 27 5a  27 2b 31 20 77 68 69 63  |is ASC'Z'+1 whic|
00004fc0  68 20 69 73 20 61 20 27  5b 27 22 0d 15 04 05 3a  |h is a '['"....:|
00004fd0  0d 15 0e 15 f4 20 42 41  53 49 43 20 49 49 20 74  |..... BASIC II t|
00004fe0  6f 6b 65 6e 73 0d 15 18  58 dc 20 22 38 30 41 4e  |okens...X. "80AN|
00004ff0  44 22 2c 22 38 31 44 49  56 22 2c 22 38 32 45 4f  |D","81DIV","82EO|
00005000  52 22 2c 22 38 33 4d 4f  44 22 2c 22 38 34 4f 52  |R","83MOD","84OR|
00005010  22 2c 22 38 35 45 52 52  4f 52 22 2c 22 38 36 4c  |","85ERROR","86L|
00005020  49 4e 45 22 2c 22 38 37  4f 46 46 22 2c 22 38 38  |INE","87OFF","88|
00005030  53 54 45 50 22 2c 22 38  39 53 50 43 22 0d 15 22  |STEP","89SPC".."|
00005040  58 dc 20 22 38 41 54 41  42 22 2c 22 38 42 45 4c  |X. "8ATAB","8BEL|
00005050  53 45 22 2c 22 38 43 54  48 45 4e 22 2c 22 38 45  |SE","8CTHEN","8E|
00005060  4f 50 45 4e 49 4e 22 2c  22 38 46 50 54 52 22 2c  |OPENIN","8FPTR",|
00005070  22 39 30 50 41 47 45 22  2c 22 39 31 54 49 4d 45  |"90PAGE","91TIME|
00005080  22 2c 22 39 32 4c 4f 4d  45 4d 22 2c 22 39 33 48  |","92LOMEM","93H|
00005090  49 4d 45 4d 22 0d 15 2c  5a dc 20 22 39 34 41 42  |IMEM"..,Z. "94AB|
000050a0  53 22 2c 22 39 35 41 43  53 22 2c 22 39 36 41 44  |S","95ACS","96AD|
000050b0  56 41 4c 22 2c 22 39 37  41 53 43 22 2c 22 39 38  |VAL","97ASC","98|
000050c0  41 53 4e 22 2c 22 39 39  41 54 4e 22 2c 22 39 41  |ASN","99ATN","9A|
000050d0  42 47 45 54 22 2c 22 39  42 43 4f 53 22 2c 22 39  |BGET","9BCOS","9|
000050e0  43 43 4f 55 4e 54 22 2c  22 39 44 44 45 47 22 0d  |CCOUNT","9DDEG".|
000050f0  15 36 5c dc 20 22 39 45  45 52 4c 22 2c 22 39 46  |.6\. "9EERL","9F|
00005100  45 52 52 22 2c 22 41 30  45 56 41 4c 22 2c 22 41  |ERR","A0EVAL","A|
00005110  31 45 58 50 22 2c 22 41  32 45 58 54 22 2c 22 41  |1EXP","A2EXT","A|
00005120  33 46 41 4c 53 45 22 2c  22 41 34 46 4e 22 2c 22  |3FALSE","A4FN","|
00005130  41 35 47 45 54 22 2c 22  41 36 49 4e 4b 45 59 22  |A5GET","A6INKEY"|
00005140  2c 22 41 37 49 4e 53 54  52 28 22 0d 15 40 5d dc  |,"A7INSTR("..@].|
00005150  20 22 41 38 49 4e 54 22  2c 22 41 39 4c 45 4e 22  | "A8INT","A9LEN"|
00005160  2c 22 41 41 4c 4e 22 2c  22 41 42 4c 4f 47 22 2c  |,"AALN","ABLOG",|
00005170  22 41 43 4e 4f 54 22 2c  22 41 44 4f 50 45 4e 55  |"ACNOT","ADOPENU|
00005180  50 22 2c 22 41 45 4f 50  45 4e 4f 55 54 22 2c 22  |P","AEOPENOUT","|
00005190  41 46 50 49 22 2c 22 42  30 50 4f 49 4e 54 28 22  |AFPI","B0POINT("|
000051a0  2c 22 42 31 50 4f 53 22  0d 15 4a 55 dc 20 22 42  |,"B1POS"..JU. "B|
000051b0  32 52 41 44 22 2c 22 42  33 52 4e 44 22 2c 22 42  |2RAD","B3RND","B|
000051c0  34 53 47 4e 22 2c 22 42  35 53 49 4e 22 2c 22 42  |4SGN","B5SIN","B|
000051d0  36 53 51 52 22 2c 22 42  37 54 41 4e 22 2c 22 42  |6SQR","B7TAN","B|
000051e0  38 54 4f 22 2c 22 42 39  54 52 55 45 22 2c 22 42  |8TO","B9TRUE","B|
000051f0  41 55 53 52 22 2c 22 42  42 56 41 4c 22 0d 15 54  |AUSR","BBVAL"..T|
00005200  55 dc 20 22 42 43 56 50  4f 53 22 2c 22 42 44 43  |U. "BCVPOS","BDC|
00005210  48 52 24 22 2c 22 42 45  47 45 54 24 22 2c 22 42  |HR$","BEGET$","B|
00005220  46 49 4e 4b 45 59 24 22  2c 22 43 30 4c 45 46 54  |FINKEY$","C0LEFT|
00005230  24 28 22 2c 22 43 31 4d  49 44 24 28 22 2c 22 43  |$(","C1MID$(","C|
00005240  32 52 49 47 48 54 24 28  22 2c 22 43 33 53 54 52  |2RIGHT$(","C3STR|
00005250  24 22 0d 15 5e 5d dc 20  22 43 34 53 54 52 49 4e  |$"..^]. "C4STRIN|
00005260  47 24 28 22 2c 22 43 35  45 4f 46 22 2c 22 43 36  |G$(","C5EOF","C6|
00005270  41 55 54 4f 22 2c 22 43  37 44 45 4c 45 54 45 22  |AUTO","C7DELETE"|
00005280  2c 22 43 38 4c 4f 41 44  22 2c 22 43 39 4c 49 53  |,"C8LOAD","C9LIS|
00005290  54 22 2c 22 43 41 4e 45  57 22 2c 22 43 42 4f 4c  |T","CANEW","CBOL|
000052a0  44 22 2c 22 43 43 52 45  4e 55 4d 42 45 52 22 0d  |D","CCRENUMBER".|
000052b0  15 68 58 dc 20 22 43 44  53 41 56 45 22 2c 22 43  |.hX. "CDSAVE","C|
000052c0  46 50 54 52 22 2c 22 44  30 50 41 47 45 22 2c 22  |FPTR","D0PAGE","|
000052d0  44 31 54 49 4d 45 22 2c  22 44 32 4c 4f 4d 45 4d  |D1TIME","D2LOMEM|
000052e0  22 2c 22 44 33 48 49 4d  45 4d 22 2c 22 44 34 53  |","D3HIMEM","D4S|
000052f0  4f 55 4e 44 22 2c 22 44  35 42 50 55 54 22 2c 22  |OUND","D5BPUT","|
00005300  44 36 43 41 4c 4c 22 0d  15 72 5d dc 20 22 44 37  |D6CALL"..r]. "D7|
00005310  43 48 41 49 4e 22 2c 22  44 38 43 4c 45 41 52 22  |CHAIN","D8CLEAR"|
00005320  2c 22 44 39 43 4c 4f 53  45 22 2c 22 44 41 43 4c  |,"D9CLOSE","DACL|
00005330  47 22 2c 22 44 42 43 4c  53 22 2c 22 44 43 44 41  |G","DBCLS","DCDA|
00005340  54 41 22 2c 22 44 44 44  45 46 22 2c 22 44 45 44  |TA","DDDEF","DED|
00005350  49 4d 22 2c 22 44 46 44  52 41 57 22 2c 22 45 30  |IM","DFDRAW","E0|
00005360  45 4e 44 22 0d 15 7c 5b  dc 20 22 45 31 45 4e 44  |END"..|[. "E1END|
00005370  50 52 4f 43 22 2c 22 45  32 45 4e 56 45 4c 4f 50  |PROC","E2ENVELOP|
00005380  45 22 2c 22 45 33 46 4f  52 22 2c 22 45 34 47 4f  |E","E3FOR","E4GO|
00005390  53 55 42 22 2c 22 45 35  47 4f 54 4f 22 2c 22 45  |SUB","E5GOTO","E|
000053a0  36 47 43 4f 4c 22 2c 22  45 37 49 46 22 2c 22 45  |6GCOL","E7IF","E|
000053b0  38 49 4e 50 55 54 22 2c  22 45 39 4c 45 54 22 0d  |8INPUT","E9LET".|
000053c0  15 86 5e dc 20 22 45 41  4c 4f 43 41 4c 22 2c 22  |..^. "EALOCAL","|
000053d0  45 42 4d 4f 44 45 22 2c  22 45 43 4d 4f 56 45 22  |EBMODE","ECMOVE"|
000053e0  2c 22 45 44 4e 45 58 54  22 2c 22 45 45 4f 4e 22  |,"EDNEXT","EEON"|
000053f0  2c 22 45 46 56 44 55 22  2c 22 46 30 50 4c 4f 54  |,"EFVDU","F0PLOT|
00005400  22 2c 22 46 31 50 52 49  4e 54 22 2c 22 46 32 50  |","F1PRINT","F2P|
00005410  52 4f 43 22 2c 22 46 33  52 45 41 44 22 0d 15 90  |ROC","F3READ"...|
00005420  60 dc 20 22 46 34 52 45  4d 22 2c 22 46 35 52 45  |`. "F4REM","F5RE|
00005430  50 45 41 54 22 2c 22 46  36 52 45 50 4f 52 54 22  |PEAT","F6REPORT"|
00005440  2c 22 46 37 52 45 53 54  4f 52 45 22 2c 22 46 38  |,"F7RESTORE","F8|
00005450  52 45 54 55 52 4e 22 2c  22 46 39 52 55 4e 22 2c  |RETURN","F9RUN",|
00005460  22 46 41 53 54 4f 50 22  2c 22 46 42 43 4f 4c 4f  |"FASTOP","FBCOLO|
00005470  55 52 22 2c 22 46 43 54  52 41 43 45 22 0d 15 9a  |UR","FCTRACE"...|
00005480  23 dc 20 22 46 44 55 4e  54 49 4c 22 2c 22 46 45  |#. "FDUNTIL","FE|
00005490  57 49 44 54 48 22 2c 22  46 46 4f 53 43 4c 49 22  |WIDTH","FFOSCLI"|
000054a0  0d 15 a4 05 3a 0d 15 ae  1a f4 20 44 69 72 65 63  |....:..... Direc|
000054b0  74 20 6d 6f 64 65 20 6b  65 79 77 6f 72 64 73 0d  |t mode keywords.|
000054c0  15 b8 2c dc 20 48 45 4c  50 2c 22 47 69 76 65 73  |..,. HELP,"Gives|
000054d0  20 64 65 74 61 69 6c 73  20 6f 66 20 61 76 61 69  | details of avai|
000054e0  6c 61 62 6c 65 20 68 65  6c 70 22 0d 15 c2 3f dc  |lable help"...?.|
000054f0  20 43 48 41 49 4e 22 66  69 6c 65 6e 61 6d 65 22  | CHAIN"filename"|
00005500  2c 22 4c 6f 61 64 73 20  61 6e 64 20 61 73 73 65  |,"Loads and asse|
00005510  6d 62 6c 65 73 20 74 68  65 20 50 49 43 20 73 6f  |mbles the PIC so|
00005520  75 72 63 65 20 63 6f 64  65 22 0d 15 cc 30 dc 20  |urce code"...0. |
00005530  4c 4f 41 44 22 66 69 6c  65 6e 61 6d 65 22 2c 22  |LOAD"filename","|
00005540  4c 6f 61 64 73 20 74 68  65 20 50 49 43 20 73 6f  |Loads the PIC so|
00005550  75 72 63 65 20 63 6f 64  65 22 0d 15 d6 42 dc 20  |urce code"...B. |
00005560  22 4c 49 53 54 20 5b 3c  66 72 6f 6d 3e 3c 2c 74  |"LIST [<from><,t|
00005570  6f 3e 5d 22 2c 22 4f 70  74 69 6f 6e 61 6c 6c 79  |o>]","Optionally|
00005580  20 6c 69 73 74 20 70 72  6f 67 72 61 6d 20 3c 66  | list program <f|
00005590  72 6f 6d 3e 2e 2e 2e 3c  74 6f 3e 22 0d 15 e0 32  |rom>...<to>"...2|
000055a0  dc 20 52 55 4e 2c 22 43  6c 65 61 72 73 20 76 61  |. RUN,"Clears va|
000055b0  72 69 61 62 6c 65 73 20  74 68 65 6e 20 65 78 65  |riables then exe|
000055c0  63 75 74 65 73 20 70 72  6f 67 72 61 6d 22 0d 15  |cutes program"..|
000055d0  ea 23 dc 20 51 55 49 54  2c 22 45 6e 64 73 20 74  |.#. QUIT,"Ends t|
000055e0  68 65 20 50 49 43 20 61  73 73 65 6d 62 6c 65 72  |he PIC assembler|
000055f0  22 0d 15 f4 1d dc 20 43  4c 53 2c 22 43 6c 65 61  |"..... CLS,"Clea|
00005600  72 73 20 74 68 65 20 73  63 72 65 65 6e 22 0d 15  |rs the screen"..|
00005610  fe 23 dc 20 53 54 4f 50  2c 22 53 74 6f 70 73 20  |.#. STOP,"Stops |
00005620  77 68 61 74 27 73 20 68  61 70 70 65 6e 69 6e 67  |what's happening|
00005630  22 0d ff                                          |"..|
00005633