Listing of file='B1.SRC;01' on disk='vmedia/source_3-sector.ccvf'
BASIC INTERPRETER
CCII V8.79
LINBF 8046H ;LINE BUFFER
BUFP 8047H ;BASIC BUFFER
80ABH ;DATA FLAG
80ACH ;MAX RAM AVAIL
80AEH ;STRING SPACE ADDR
80CCH ;CURRENT LINE NO
80D2H ;STACK
80D2H ;$ SPACE ALLOCATION
80D4H ;START OF BASIC ADDR
80D6H ;END OF BASIC ADDR
;START OF VARIABLES
80D8H ;START OF ARRAYS ADDR
80DAH ;END OF ARRAYS ADDR
TEMPHL 80DEH ;BUFFER POINTER
BRTRY 80E0H
RFLG 80E1H
CRTRY 80E2H
OBC 80E3H
FPB 80F7H
FATR 80F8H
FNAM 80F9H
FTYP 80FFH
FSBK 8103H
FSIZ 8105H
FLBC 8107H
FLAD 8108H
FSAD 810AH
FAUX 810FH
FHAN 8111H
FBLK 8115H
FBUF 8117H
FXBC 8119H
DBFE 819DH
XFFCN 819FH
XFBLK 81A1H
XFBUF 81A3H
XFXBC 81A5H
PUP 81B7H
THRUFL 81DEH ;
KBDFL 81DFH ;KYBD STATUS FLAG
81F1H ;BASIC OUTPUT FLAG
81E3H ;SERIAL INPUT FLAG
BASFL 81F1H
KBCHA 81FEH ;KYBD CHAR
READY 81FFH ;CHAR READY FLAG
8200H ;INPUT FLAG PTR
ORG 01F2CH
; INTERPRETER START
1F2CH START: CALL L356 ;INIT BASIC
LXI H,2104H ;"READY" MSG
CALL DISPLAY ;PRINT IT
JMP ILKP ;INSERT LINK PTRS
1F38H JMP L3611 ;ESC-I
1F3BH JMP L0641
1F3EH CALL INIT
LXI H,L027 ;SET RETURN
PUSH H
CALL L067 ;DO "AUTO"
LHLD 8200H
JMP L064 ;KYBD INPUT
1F4EH L001: LHLD 80C0H
LDA L3502 ;(362BH)
ORG $-2
1F52H L002: DCX H
MVI M,0
MVI A,0EBH
ORG $-1
; CMPDH
1F56H L003: XCHG
; CMPHD
1F57H L004: MOV A,H
SUB D
RNZ
MOV A,L
SUB E
RET
1F5DH L005: XTHL
SHLD 820BH
POP H
MOV C,M
INX H
MOV B,M
INX H
PUSH B
JMP 820AH
; MATH JUMP TABLE (?)
1F6AH DW 32ADH ;SGN
DW 3371H ;INT
DW 32C3H ;ABS
DW 3934H ;CALL
DW 2CF2H ;FRE
DW 8211H ;INP
DW 2D20H ;POS
DW 3547H ;SQR
DW 361FH ;RND
DW 31B2H ;LOG
DW 358EH ;EXP
DW 3653H ;COS
DW 3659H ;SIN
DW 36BAH ;TAN
DW 36CFH ;ATN
DW 307BH ;PEEK
DW 2F85H ;LEN
DW 2DA7H ;STR$
DW 3060H ;VAL
DW 2F94H ;ASC
DW 2FA3H ;CHR$
DW 2FB3H ;LEFT$
DW 2FE3H ;RIGHT$
DW 2FEDH ;MID$
; SIGN JUMP TABLE (?)
1F9AH DB 79H
DW 3431H
DB 79H
DW 30B1H
DB 7CH
DW 31F0H
DB 7CH
DW 3232H
DB 7FH
DW 3550H
DB 50H
DW 2AE5H
DB 46H
DW 2AE4H
1FAFH DB -1
; SUBTRACT 128 FROM NUMBER FOLLOWING TOKEN
; TO OBTAIN ASCII VALUE OF ITS LAST CHAR.
1FB0H DB 'EN',196 ;END
DB 'FO',210 ;FOR
DB 'NEX',212 ;NEXT
DB 'DAT',193 ;DATA
DB 'INPU',212 ;INPUT
DB 'DI',205 ;DIM
DB 'REA',196 ;READ
DB 'FIL',197 ;FILE
DB 'GOT',207 ;GOTO
DB 'RU',206 ;RUN
DB 'I',198 ;IF
DB 'RESTOR',197 ;RESTORE
DB 'GOSU',194 ;GOSUB
DB 'RETUR',206 ;RETURN
DB 'RE',205 ;REM
DB 'GE',212 ;GET
DB 'OU',212 ;OUT
DB 'PU',212 ;PUT
DB 'PLO',212 ;PLOT
DB 'SAV',197 ;SAVE
DB 'LOA',196 ;LOAD
2000H L006 EQU $-1
DB 'POK',197 ;POKE
DB 'PRIN',212 ;PRINT
DB 'LIS',212 ;LIST
DB 'CON',212 ;CONT
DB 'CLEA',210 ;CLEAR
DB 'DE',198 ;DEF
DB 'WAI',212 ;WAIT
DB 'O',206 ;ON
DB 'TAB',168 ;TAB(
DB 'T',207 ;TO
DB 'F',206 ;FN
DB 'SPC',168 ;SPC(
DB 'THE',206 ;THEN
DB 'NO',212 ;NOT
DB 'STE',171 ;STEP
; THIS USE 1F9AH JUMP TABLE ?
; (EXCEPT FOR AND/OR TOKENS)
DB 173 ;-
DB 170 ;*
DB 175 ;/
DB 222 ;^
DB 'AN',196 ;AND
DB 'O',210 ;OR
DB 190 ;>
DB 189 ;=
DB 188 ;<
; THIS USE 1F6AH JUMP TABLE ?
DB 'SG',206 ;SGN
DB 'IN',212 ;INT
DB 'AB',211 ;ABS
DB 'CAL',204 ;CALL
DB 'FR',197 ;FRE
DB 'IN',207 ;INP
DB 'PO',211 ;POS
DB 'SQ',210 ;SQR
DB 'RN',196 ;RND
DB 'LO',199 ;LOG
DB 'EX',208 ;EXP
DB 'CO',211 ;COS
DB 'SI',206 ;SIN
DB 'TA',206 ;TAN
DB 'AT',206 ;ATN
DB 'PEE',203 ;PEEK
DB 'LE',206 ;LEN
DB 'STR',164 ;STR$
DB 'VA',204 ;VAL
DB 'AS',195 ;ASC
DB 'CHR',164 ;CHR$
DB 'LEFT',164 ;LEFT$
DB 'RIGHT',164 ;RIGHT$
DB 'MID',164 ;MID$
2096H DB 0,0
2098H DW 2625H
DW 253EH
DW 2976H
DW 2739H
20A0H DW 2886H
DW 2B8AH
DW 28C3H
DW 39ECH
DW 2705H
DW 26E8H
DW 27C8H
DW 25F4H
20B0H DW 26F4H
DW 2723H
DW 273BH
DW 3C20H
DW 821CH
DW 3BCAH
DW 265AH
DW 384CH
20C0H DW 37EBH
DW 3085H
DW 27E9H
DW 247FH
DW 2647H
DW 26BCH
DW 2D28H
DW 3018H
20D0H DW 27AAH
; ERROR TABLE
20D2H DB 'N','F'+128 ;NEXT W/O FOR
DB 'S','N'+128 ;SYNTAX
DB 'R','G'+128 ;RET W/O GOSUB
DB 'O','D'+128 ;OUT OF DATA
DB 'C','F'+128 ;CALL FUNCTION
DB 'O','V'+128 ;OVERFLOW
DB 'O','M'+128 ;OUT OF MEMORY
20E0H DB 'U','S'+128 ;UNDEFINED LINE
DB 'B','S'+128 ;BAD SUBSCRIPT
DB 'D','D'+128 ;DOUBLE DIM
DB '0','/'+128 ;/0
DB 'I','D'+128 ;ILLEGAL DIRECT
DB 'T','M'+128 ;TYPE MISMATCH
DB 'O','S'+128 ;OUT OF STRING
DB 'L','S'+128 ;LONG STRING
20F0H DB 'S','T'+128 ;STRING TEMPORIES
DB 'C','N'+128 ;CAN NOT
DB 'U','F'+128 ;UNDEFINED FUNCTION
DB 'S','L'+128 ;SAVE/LOAD
20F8H DB ' ERRO','R'+128,0
20FFH DB ' IN',160
2103H DB 0
2104H DB 13,10,255,13
DB 'READY',10,13,10
DB 0
2111H DB 13,255
2113H DB 13,'BREA',203,0
211AH L007: LXI H,4
DAD SP
211EH L008: MOV A,M
INX H
CPI 129
RNZ
MOV C,M
INX H
MOV B,M
INX H
PUSH H
MOV L,C
MOV H,B
MOV A,D
ORA E
XCHG
JZ L009
CALL L003 ;CMPDH
2133H L009: LXI B,13
POP H
RZ
DAD B
JMP L008
; CK MEMORY SIZE
; MOVE MEMORY TO MAKE ROOM FOR BASIC LINE
213CH L010: CALL L016 ;CK FREE MEMORY
213FH L011: PUSH B
XTHL
POP B
2142H L012: CALL L004 ;CMPHD
MOV A,M
STAX B
RZ
DCX B
DCX H
JMP L012
214DH L013: PUSH H
LHLD 80DAH ;END OF ARRAYS
MVI B,0
DAD B
DAD B
CALL L016 ;CK FREE MEMORY
ORG $-1
2157H L014: MOV E,D
2158H L015: POP H
RET
; CK FREE MEMORY
215AH L016: PUSH D
XCHG
LXI H,-40
DAD SP
CALL L004 ;CMPHD
XCHG
POP D
RNC
2166H L017: MVI E,12
JMP L022 ;OM ERROR
216BH L018: LHLD 80C4H
SHLD 80CCH ;CURRENT LINE NO
;===========================================================
; ERROR TRAPS
2171H L019: MVI E,2 ;SYNTAX ERROR
LXI B,141EH
; (LXI B)
; (MVI E,14H)
ORG $-2
2174H L020: MVI E,14H ;DIV BY 0 ERROR
LXI B,001EH
; (LXI B)
; (MVI E,0)
ORG $-2
2177H L021: MVI E,0 ;NEXT W/O FOR ERROR
; PROCESS ERROR CODE
2179H L022: CALL INIT2 ;CLR STACK
CALL L135 ;CR/LF,0 TO 8208H, 0 TO A
CMA ;NOW 255
CALL L073 ;TO CRT
MVI A,13 ;CR
CALL L136 ;BASOUT, 0 TO 8208H, 0 TO A
LXI H,20D2H ;ERROR TABLE
218BH L023: MOV D,A ;0 TO D
DAD D ;POINT TO CODE IN TABLE
MOV A,M ;1ST CHAR OF ERROR
CALL L073 ;PRINT IT
CALL L096 ;2ND CHAR OF ERROR
CALL L073 ;PRINT IT
LXI H,20F8H ;"ERROR" MSG
219AH L024: CALL DISPLAY ;PRINT IT
LHLD 80CCH ;CURRENT LINE NO
MOV A,H ;IF LINE #
ANA L ; = -1
INR A ;DON'T PRINT
CNZ L328 ;DO PRINT
MVI A,193
; (MVI A,)
; (POP B)
ORG $-1
21A7H POP B
21A8H L025: LXI H,2104H ;"READY" MSG
CALL DISPLAY ;PRINT IT
;=============================================================
; COMMAND (ENTERING BASIC LINE) GROUP
21AEH L026: LXI H,-1 ;INIT CUR LINE
SHLD 80CCH ;TO -1
CALL L062 ;ZERO LINE BUFFER. WAIT FOR
;KYBD ENTRY. CR/LF,0 TO 8208H
;0 TO A, 8046H IN HL
21B7H L027: INX H ;BUF+1
MOV A,M ;1ST CHAR
CPI 10
JZ L028 ;IF LF
DCX H ;8046H NOW
21BFH L028: CALL L096 ;NEXT CHAR, SKIP SPACES, <C>
;IF ASCII NUMBER, <Z> IF ":"
;OR 0 (END STATEMENT OR LINE)
INR A ;SET <Z><NZ> BUT
DCR A ;NO EFFECT CARRY
JZ L026 ;NULL LINE-DO AGAIN
PUSH PSW
CALL L112 ;DECIMAL # TO BINARY
;IN DE. IF NO # DE=0
PUSH D ;SAVE LINE NO
CALL L041 ;CONVERT BASIC LINE IN BUFFER
;TO TOKEN FORM. BASIC BUFFER
;NOW HAS A 1 LINE BASIC PROGRAM
;8046H TO HL, 0 TO A, LINE LEN
;TO C.
MOV B,A ;0 TO B
POP D ;LINE #
POP PSW ;FLAGS
JNC L092 ;<NC> INDICATES A BASIC LINE TO
;BE PROCESSED. <C> INDICATES A
;LINE TO BE STORED IN MEMY
PUSH D ;SAVE LINE
PUSH B ;SAVE LINE LEN
CALL L096 ;1ST CHAR-SKIP SPACES.
;<C> IF ASCII #
;<Z> IF ":" OR 0
ORA A ;NULL?
PUSH PSW ;FLAGS
CALL L035 ;GET LINE WITH # IN DE. IF NOT
;GET NEXT LINE. <C> IF LINE
;EXISTS, <Z> IF EOF.
;BC START ADDR
;DE LINE #
;HL NEXT LINE ADDR
PUSH B ;LINE START ADDR
JNC L030 ;NEW LINE # JUMP
;NO OLD LINE TO KILL
XCHG ;NEXT LINE ADDR TO DE
LHLD 80D6H ;END OF BASIC
21E7H L029: LDAX D ;DELETE OLD VERSION
STAX B ;OF LINE FROM MEMORY
INX B ;NEXT LINE START ADDR
INX D ;TO END OF BASIC IS SHIFTED TO
;OLD LINE START ADDR (DELETE
;OLD LINE)
CALL L004 ;CMPHD DONE IF DE=HL
JNZ L029 ;NOT DONE
MOV H,B ;SHIFT NEW
MOV L,C ; END OF BASIC
SHLD 80D6H ; AND SAVE
21F6H L030: POP D ;START ADDR FOR LINE
POP PSW ;NULL LINE?
JZ ILKP ;YES-INSERT LINK
LHLD 80D6H ;END OF BASIC
XTHL ;NEW LINE LEN TO HL
;END OF BASIC TO STACK
POP B ;THEN TO BC
DAD B ;NEW END OF BASIC
PUSH H ; AND SAVE
CALL L010 ;CK MEMORY SIZE. MOVE MEMY TO
;MAKE FOR NEW LINE
POP H ;NEW END OF BASIC
SHLD 80D6H ; SAVED
XCHG ;LINE START ADDR TO HL
MOV M,H ;INSERT # SO LINK <>0
INX H ;SKIP BASIC
INX H ; LINE NUMBER
POP D ;RESTORE LINE #
MOV M,E ;INSERT
INX H ; LINE
MOV M,D ; NUMBER
INX H
LXI D,BUFP ;MOVE
2215H L031: LDAX D ; BASIC
MOV M,A ; LINE
INX H ; TO
INX D ; MEMORY
ORA A ;EOL?
JNZ L031 ;NO
; INSERT LINK PTRS
221DH ILKP: CALL INIT ;INIT BASIC LINE PTRS. ZERO
;VARIABLES/ARRAYS. INIT STACK
;POINTER. 8299H TO HL
INX H ;START OF BASIC
XCHG ; TO DE
2222H ILKP1: MOV H,D ;START ADDR OF CURRENT
MOV L,E ;LINE TO HL
MOV A,M
INX H ;IF FWD PTR =0
ORA M ;THEN THIS IS END
JZ L026 ;OF BASIC
INX H ;SKIP
INX H ; LINE
INX H ; NUMBER
XRA A
222EH ILKP2: CMP M ;FIND BEGIN
INX H ; OF NEXT
JNZ ILKP2 ; BASIC LINE
XCHG ;PUT START ADDR
MOV M,E ;OF THIS LINE
INX H ;IN LINK PTR
MOV M,D ;OF PREV LINE
JMP ILKP1 ;AND LOOP
; GET LINE WITH # IN DE.
; <C> IF LINE EXISTS
; <Z> IF EOF
; BC START ADDR
; DE LINE #
; HL NEXT LINE ADDR
223AH L035: LHLD 80D4H ;START OF BASIC
223DH L036: MOV B,H ;INTO BC
MOV C,L
MOV A,M ;CK FOR
INX H ; END OF
ORA M ; BASIC
DCX H ;START OF LINE
RZ ;IF EOF
INX H ;SKIP OVER
INX H ;LINK PTR
MOV A,M ;GET THE
INX H ; LINE
MOV H,M ; NUMBER
MOV L,A
CALL L004 ;LINE REQUIRED?
MOV H,B ;START ADDR OF
MOV L,C ; LINE TO HL
MOV A,M ;GET START ADDR
INX H ; OF NEXT LINE
MOV H,M ; & SAVE TO HL
MOV L,A
CMC
RZ ;IF LINE WANTED <Z><C> IS SET
CMC ;TO <NC>
RNC ;IF NO ACTUAL LINE #
JMP L036 ;TRY AGAIN
; INIT BASIC LINE PTRS
; ZERO VARIABLES/ARRAYS
; INIT STACK POINTER
; 8299H TO HL
225AH INIT: LHLD 80D4H ;START OF BASIC
DCX H ;-1
225EH INIT1: SHLD 80C8H ;SAVE
LHLD 80ACH ;MAX RAM
SHLD 80C0H ;SAVE
CALL L098
LHLD 80D6H ;ZERO
SHLD 80D8H ; VARIABLES
SHLD 80DAH ; & ARRAYS
2273H INIT2: POP B ;SAVE RET ADDR
LHLD 80D2H ;START OF STRING AREA
SPHL ;INIT BASIC STACK
LXI H,80B0H ;BUFFER
SHLD 80AEH ;BUFFER PTR
XRA A
MOV H,A ;ZERO TO
MOV L,A ; HL
SHLD 80D0H ;=0
STA 80C6H ;=0
PUSH H ;RST 0 TO STACK
PUSH B ;REPLACE RET ADDR
2289H INIT3: LHLD 80C8H ;BASIC START-1 TO HL
RET
; CONVERT BASIC LINE IN BUFFER TO TOKEN FORM.
; BASIC BUFFER NOW HAS A 1 LINE BASIC PROGRAM
; 8046H TO HL, 0 TO A, LINE LEN TO C.
228DH L041: XRA A
STA 80ABH ;ZERO DATA FLAG
MVI C,5 ;C = LEN OF BASIC TOKEN LINE.
;STARTS AT 5 AS BASIC LINK,
;LINE #, EOL = 5 BYTES
LXI D,BUFP ;BUFFER START ADDR FOR TOKEN
;LINE. SAME BUF AS USED BY
;COMMAND LINE (ADDR IN HL).
;COMMAND LINE IS OVER WRITTEN
;BY TOKEN LINE
2296H L042: MOV A,M ;1ST CHAR IN CMD LINE
CPI ' ' ;SPACE?
INX H ;BUF+1
JZ L042 ;YES-SKIP
DCX H ;KEEP HL STRAIGHT
MOV B,A ;CHAR TO B
CPI '"' ;QUOTES?
JZ L052 ;YES
ORA A ;EOL?
JZ L055 ;YES
LDA 80ABH ;DATA FLAG
ORA A ;SET FLAGS
MOV B,A
MOV A,M ;GET CHAR AGAIN
JNZ L048 ;DATA FLAG<>0
CPI '?' ;? FOR PRINT?
MVI A,150 ;SET PRINT TOKEN
JZ L048 ;YES
MOV A,M ;CHAR AGAIN
CPI '0'
JC L043 ;<>DIGIT
CPI '<'
JC L048 ;< '<'
22C3H L043: PUSH D ;SAVE TOKEN BUF ADDR
LXI D,1FB0H-1 ;CMD TOKEN TABLE
PUSH H ;SAVE
JMP L045 ;SHORT SKIP
22CBH L044: CALL L096 ;NEXT CHAR-SKIP SPACES
22CEH L045: INX D ;NEXT TOKEN TABLE CHAR
22CFH L046: LDAX D ;GET IT
ANI 127 ;STRIP A7 BIT
JZ L047 ;IF 0 JUMP. END OF TOKEN TABLE
CMP M ;TOKEN CHAR?
JNZ L053 ;NO-NEXT ONE
LDAX D ;GET CHAR AGAIN
ORA A ;SET FLAGS
JP L044 ;<128, DO MORE
POP PSW ;GET RID OF "PUSH H" IN L043
MOV A,B ;POSITION OF COMMAND IN TABLE
ORI 128 ;PLUS A7 ON GIVES TOKEN VALUE
JP 7EE1H ;NOT REALLY!! <M> SET!
; (JP)
; (POP H)
; (MOV A,M)
ORG $-2
22E3H L047: POP H ;CMD LINE ADDR
MOV A,M ;GET CHAR
POP D ;TOKEN LINE ADDR
22E6H L048: INX H ;NEXT CMD LINE CHAR
STAX D ;SAVE CHAR IN TOKEN LINE
INX D ;TOKEN BUF+1
INR C ;INCR TOKEN LINE LEN
SUI '9'+1 ;IS IT A ":"?
JZ L049 ;YES!
CPI 'I' ;DATA? (131-58=73)
JNZ L050 ;NO
22F4H L049: STA 80ABH ;SET DATA FLAG (0 OR 73)
22F7H L050: SUI 'T' ;REM? (142-58=84)
JNZ L042 ;NO-NEXT CMD
MOV B,A ;0 TO B
22FDH L051: MOV A,M ;NEXT CHAR FROM CMD LINE
ORA A ;SET FLAGS
JZ L055 ;IF EOL
CMP B ;QUOTES=34, REM=0
JZ L048 ;YES
2306H L052: INX H ;CMD LINE +1
STAX D ;STORE TOKEN CHAR
INR C ;INCR TOKEN LEN
INX D ;TOKEN BUF +1
JMP L051 ;DO MORE
230DH L053: POP H ;ADDR OF START OF CMD LINE
PUSH H
INR B ;KEEP TRACK OF CMD
XCHG ;CMD TABLE TO HL
2311H L054: ORA M ;SET FLAGS
INX H ;CMD TABLE +1
JP L054 ;IF LAST CHAR IN CMD TABLE,
;A7 IS ON. LOOP UNTIL DONE
XCHG ;CMD LINE TO HL
JMP L046 ;NEXT CMD
231AH L055: LXI H,LINBF ;LINE BUFFER
STAX D ;A=0, DE=TOKEN LINE ADDR
INX D ;INSERTS 3 ZEROS AT END OF
STAX D ;TOKEN LINE, ONE FOR EOL,
INX D ;TWO FOR EOF
STAX D
RET
;=========================================================
; KEYBOARD INTERRUPT GROUP
; DELETE/RESTORE CHARS
2323H L056: MVI A,25 ;SET ->
CALL 8205H ;ECHO IT
2328H L057: MVI A,7 ;DO BELL TOO
CALL 8205H ;ECHO
MVI A,26 ;SET <-
CALL 8205H ;ECHO
2332H L058: MOV A,M ;CURRENT CHAR
CPI ' ' ;COMMAND <25?
MVI A,25 ;SET <-
JC L059 ;YES
MVI A,' ' ;A SPACE
CALL 8205H ;ECHO
MVI A,26 ;SET <-
2341H L059: CALL 8205H ;ECHO
MOV A,L ;LO BYTE OF BUF ADDR
DCX H ;BUF-1
SHLD TEMPHL ;SAVE IT
CPI 46H ;CK LO BYTE OF BUFFER ADDR
;FOR START OF BUFFER
RNZ ;IF NOT
CALL L135 ;CR/LF, 0 TO 8208H
234FH L060: LXI H,LINBF ;LINE BUFFER
2352H L061: SHLD TEMPHL ;BASIC BUF CHR PNTR
RET
; ZERO LINE BUFFER
; WAIT FOR KYBD ENTRY
; CR/LF,0 TO 8208H
; 0 TO A, 8046H IN HL
2356H L062: LXI H,LINBF ;LINE BUFFER
MVI A,99 ;ZERO
235BH L063: MVI M,0 ;BASIC
INX H ;INPUT
DCR A ;BUFFER
JNZ L063
CALL L060 ;8046H TO 80DEH
LHLD 8200H ;KBDFL TO HL
MVI M,23 ;KYBD INPUT TO BASEX
STA THRUFL ;23 TO THRUFL
; INPUT LOOP
236DH L064: EI ;ENABLE
LDA THRUFL ;WAIT FOR
CPI 13 ;ENTRY
JNZ L064 ;NOT YET
MVI M,12 ;12 TO 81DFH - ALL KYBD
;ENTRIES IGNORED
EI ;ENABLE AGAIN
XRA A
STA READY ;CLR READY FLAG
JMP L134 ;8046H TO HL, CR/LF, 0 TO
;8208H, RETURN
; BASEX
; KEYBOARD INTERRUPT ROUTINE
2380H L0641: LDA THRUFL ;USED TO FLAG THAT 1ST KEY
;OF AN ESC CODE HAS BEEN
;SEEN. NEXT CHAR IS CODE.
CPI 27 ;ESCAPE?
JZ L071 ;YES
MOV A,E ;KYBD CHAR TO A
DCR A ;IS IT AUTO?
JZ L067 ;YES
XRA A ;SET 0
MOV M,A ; INTO KBDFL
MOV A,E ;GET CHAR
CPI 3 ;PLOT?
RZ ;YES!
MVI M,23 ;23 TO KBDFL
RC ;IF <3
LHLD TEMPHL ;BUFFER POINTER
CPI 27 ;ESCAPE?
JZ L070 ;YES
ANA A ;SET FLAGS
JP L066 ;IF <128
CPI 214 ;>214?
JNC L066 ;YES!
JMP L086 ;GET COMMAND FROM TOKEN
;COMMAND ADDR IN DE. NOTE
;214 IS AN ERROR...CCII
;TOKENS ARE 128 TO 197. A
;198 TO 213 WILL GET GARBAGE.
23AAH L065: INX H ;NEXT BUF BYTE
MVI M,' ' ;SET A SPACE
MOV A,L ;END OF BUFFER IS 80A8H
CPI 0A8H ;END?
JZ L056 ;YES..DO ->,BELL,<-
LDAX D ;GET CMD CHAR
INX D ;CMD BUF+1
ORA A ;A7 ON? (LAST CMD CHAR)
PUSH PSW ;SAVE FLAGS
ANI 127 ;STRIP A7 BIT
MOV M,A ;CHAR TO BUFFER
CALL 8205H ;ECHO
POP PSW ;FLAGS
JP L065 ;NOT LAST CHAR
MVI A,' ' ;SPACE AFTER TOKEN
23C3H L066: INX H ;BUF+1
CPI 25 ;A ->?
CZ L244 ;RESTORE NEXT BUF BYTE
RZ ;IF NEXT BYTE=0
DCX H ;BACK TO ORIG
CALL 8205H ;ECHO
CPI 11 ;EL?
JZ L060 ;YES - 8046H TO 80DEH
CPI 26 ;A <-?
JZ L058 ;YES
CPI 12 ;EP?
RZ ;YES
CPI 13 ;CR?
INX H ;BUF+1
JZ L069 ;YES
MOV M,A ;NO-SAVE CHAR
MOV A,L ;LO BYTE BUF ADDR
CPI 0A8H ;END?
JZ L057 ;DO BELL,<-
JMP L061 ;NO-QUIT
; "AUTO" - LOAD & RUN MENU PROGRAM
23EBH L067: LXI H,LINBF ;LINE BUFFER
LXI D,2404H ;FCS "MENU" MSG
MVI B,9 ;LENGTH
23F3H L068: INX H ;MOVE FCS
LDAX D ; CMD MSG
MOV M,A ; TO BASIC
INX D ; LINE BUFFER
23F7H DCR B
JNZ L068
INX H
MVI A,13 ;13 TO 81DEH
23FEH L069: STA THRUFL
MVI M,0 ;END OF FCS CMD LINE
RET
;148=TOKEN FOR LOAD
;137=TOKEN FOR RUN
2404H DB 148,'"MENU":',137
; SETS BASEX FOR 2ND BYTE OF ESCAPE CODE
240DH L070: MOV A,L ;BUFFER LO BYTE
INX H ;BUF+1
MVI M,' ' ;A SPACE
CPI 0A6H ;AT 80A6H? - 2 BYTES
;BEFORE END TO ENSURE
;ROOM FOR SECOND CHAR
JNC L056 ;NOT ENOUGH ROOM!
;DO ->,BELL,<-
MOV A,E ;GET CHAR (27)
STA THRUFL ; TO 81DEH
RET
; HANDLE ESCAPE CODES
241BH L071: XRA A
STA THRUFL ;0 TO 81DEH
MOV A,E ;2ND CHAR
ANI 31 ;ALLOW ONLY #S
LHLD TEMPHL ;BUFFER ADDR
INX H ;+1
CPI 4 ;ESC-D?
JZ L072 ;YES
CPI 5 ;ESC-E?
JZ L072 ;YES
CPI 23 ;ESC-W?
JZ L072 ;YES
CPI 31 ;ESC-CRT?
JZ L072 ;YES
MVI A,27 ;MUST BE ESC-ESC
CALL 8205H ;SO ECHO IT
MOV M,A ;AND SAVE
INX H ;BUF+1
MOV A,E ;GET CHAR AGAIN
CALL 8205H ;ECHO AGAIN
MOV M,A ;AND SAVE IT
SHLD TEMPHL ;AND BUFFER
RET
; PROCESS ESC-D, ESC-E, ESC-W, ESC-CRT
244AH L072: LHLD 0036H ;8042H TO HL (FCS STACK)
SPHL ;RESET STACK POINTER
LXI H,0038H ;SET BEGEX
PUSH H
LHLD 000BH ;008DH TO HL
;START ADDR OF ESC TABLE
MVI D,0 ;0 TO D
MOV E,A ;ESC CODE IN E
DAD D ;GET ESC
DAD D ; ROUTINE ADDR
MOV A,M ;ADDR LO
INX H
MOV H,M ;ADDR HI
MOV L,A
PUSH H ;ONTO STACK
LHLD 8200H ;81DFH TO HL
MVI M,0 ;0 TO KBDFL...KYBD TO VISUAL
RET ;CURSOR DISPLAY, JMP TO ROUTINE
;
;==============================================================
; BYTE TO CRT
2465H L073: CPI ' '
JC 8205H ;ECHO
PUSH PSW
LDA 8208H
PUSH H
LXI H,8209H
CMP M
CNC L135 ;CR/LF, 0 TO 8208H, 0 TO A
POP H
INR A
STA 8208H
POP PSW
JMP 8205H ;ECHO
247FH CALL L112 ;TO BINARY
RNZ
PUSH H
CALL L035 ;GET LINE IN DE
PUSH B
2488H L074: POP H
CALL L005
POP B
XRA A
STA THRUFL
MOV A,B
ORA C
JZ L015
PUSH B
CALL L100 ;KYBD CHECK
CALL L135 ;CR/LF, 0 TO 8208H, 0 TO A
CALL L005
XTHL
CALL L329 ;PRINT BYTES FREE
POP H
JMP L076
24A8H L075: LDA THRUFL
ORA A
MVI A,'9'+1
JNZ L080
MVI A,' '
CALL L073 ;TO CRT
MVI A,'9'+1
CALL L073 ;TO CRT
INX H
24BCH L076: MOV A,M
ORA A
JM L078
MVI A,' '
24C3H L077: CALL L073 ;TO CRT
24C6H L078: MOV A,M
CPI '"'
JNZ L079
PUSH PSW
LDA THRUFL
XRI 1
STA THRUFL
POP PSW
24D6H L079: CPI '9'+1
JZ L075
24DBH L080: ORA A
INX H
JZ L074
JP L077
MVI B,0
CALL L084
JC L081
PUSH PSW
MVI A,' '
MOV B,A
CALL L073
POP PSW
24F3H L081: CALL L086 ;SEARCH TOKENS
24F6H L082: LDAX D
INX D
ORA A
PUSH PSW
ANI 127
CALL L073 ;TO CRT
POP PSW
JP L082
MOV A,M
ORA A
JP L083
CALL L084
JNC L078
250EH L083: MOV A,B
JMP L077
2512H L084: CPI 164 ;"-" TOKEN
JNC L085
CPI 157 ;"TAB(" TOKEN
STC
RZ
CPI 159 ;"FN" TOKEN
STC
RZ
CPI 160 ;"SPC(" TOKEN
STC
RZ
CMC
RET
2525H L085: CPI 169 ;"OR" TOKEN
RZ
CPI 170 ;">" TOKEN
RZ
STC
RET
; SEARCH TOKENS
252DH L086: SUI 127
MOV C,A
LXI D,1FB0H-1;TOKEN TABLE
2533H L087: LDAX D
INX D
ORA A
JP L087
DCR C
JNZ L087
RET
253EH MVI A,100
STA 80C6H
CALL L123
XTHL
CALL L007
POP D
JNZ L088
SPHL
2550H L088: XCHG
MVI C,8
CALL L013
PUSH H
CALL L119
XTHL
PUSH H
LHLD 80CCH ;CURRENT LINE NO
XTHL
CALL L095
SBB M
CALL L160
CALL L159
PUSH H
CALL L300
POP H
PUSH B
PUSH D
LXI B,8100H
MOV D,C
MOV E,D
MOV A,M
CPI 163
MVI A,1
JNZ L089
CALL L096 ;NEXT CHAR-SKIP SPACE
;<C> IF ASCII #
;<Z> IF : OR 0
CALL L159
PUSH H
CALL L300
CALL L292
POP H
258CH L089: PUSH B
PUSH D
PUSH PSW
INX SP
PUSH H
LHLD 80C8H
XTHL
2595H L090: MVI B,129
PUSH B
INX SP
2599H L091: CALL L100 ;KYBD CHECK
SHLD 80C8H
MOV A,M
CPI '9'+1
JZ L092
ORA A
JNZ L019 ;SYNTAX ERROR
INX H
MOV A,M
INX H
ORA M
INX H
JZ L102
MOV E,M
INX H
MOV D,M
XCHG
SHLD 80CCH ;CURRENT LINE NO
XCHG
25B9H L092: CALL L096 ;NEXT CHAR-SKIP SPACE
;<C> IF ASCII #
;<Z> IF : OR 0
LXI D,L091
PUSH D
25C0H L093: RZ
25C1H L094: SUI 128
JC L123
CPI 29
JNC L019 ;SYNTAX ERROR
RLC
MOV C,A
MVI B,0
XCHG
LXI H,2098H
DAD B
MOV C,M
INX H
MOV B,M
PUSH B
XCHG
JMP L096 ;NEXT CHAR-SKIP SPACE
;<C> IF ASCII #
;<Z> IF : OR 0
25DCH L095: MOV A,M
XTHL
CMP M
INX H
XTHL
JNZ L019 ;SYNTAX ERROR
; NEXT CHAR-SKIP SPACE
; <C> IF ASCII #
; <Z> IF : OR 0
25E4H L096: INX H
25E5H L097: MOV A,M
CPI '9'+1
RNC
CPI ' '
JZ L096
CPI '0'
CMC
INR A
DCR A
RET
25F4H CALL L112 ;TO BINARY
MOV A,D
ORA E
JZ L098
PUSH H
CALL L118
POP D
JMP L099
2604H L098: XCHG ;SAVE HL
LHLD 80D4H ;START OF BASIC
DCX H ;-1
2609H L099: SHLD 80DCH ;SAVE
XCHG ;GET HL
RET
; KEYBOARD CHECK
260EH L100: EI
LDA READY
ANA A
RZ
JP L100
XRA A
STA READY
LDA KBCHA
CALL BASOUT
CPI 10
RNZ
; SET FOR "BREAK"
ORI 0C0H
ORG $-1
2625H RNZ
SHLD 80C8H
2629H L101: POP B
262AH L102: PUSH PSW
LHLD 80CCH ;CURRENT LINE NO
MOV A,L
ANA H
INR A
JZ L103
SHLD 80CEH
LHLD 80C8H
SHLD 80D0H
263DH L103: POP PSW
LXI H,2111H ;"BREAK" MSG
JNZ L024 ;PRINT IT
JMP L025 ;READY INPUT
2647H MVI E,32
LHLD 80D0H
MOV A,H
ORA L
JZ L022 ;CN ERROR
XCHG
LHLD 80CEH
SHLD 80CCH ;CURRENT LINE NO
XCHG
RET
265AH L104: CALL L252
CALL 8205H ;ECHO
CALL L097
RZ
CALL L095
INR L
JMP L104
; CHECK IF LETTER
; < C> BAD
; <NC> LETTER
266BH L105: MOV A,M
CPI 'A'
RC
CPI 'Z'+1
CMC
RET
2673H L106: CALL L096 ;NEXT CHAR-SKIP SPACE
;<C> IF ASCII #
;<Z> IF : OR 0
2676H L107: CALL L159
2679H L108: CALL L292
JM L111
267FH L109: LDA RFLG
CPI 144
2684H L110: JC L309
LXI B,9080H
LXI D,0
CALL L307
MOV D,C
RZ
2692H L111: MVI E,8
JMP L022 ;CF ERROR
; ASCII DECIMAL # TO BINARY
2697H L112: DCX H
2698H L113: LXI D,0
269BH L114: CALL L096 ;NEXT CHAR-SKIP SPACE
;<C> IF ASCII #
;<Z> IF : OR 0
RNC
PUSH H
PUSH PSW
LXI H,MULHD
CALL L004 ;CMPHD
JC L019 ;SYNTAX ERROR
MOV H,D
MOV L,E
DAD D
DAD H
DAD D
DAD H
POP PSW
SUI '0'
MOV E,A
MVI D,0
DAD D
XCHG
POP H
JMP L114
26BCH JZ INIT1
CALL L107
CALL L097
RNZ
PUSH H
LHLD 80ACH
MOV A,L
SUB E
MOV E,A
MOV A,H
SBB D
MOV D,A
JC L019 ;SYNTAX ERROR
LHLD 80D6H ;END OF BASIC
LXI B,40
DAD B
CALL L004 ;CMPHD
JNC L017
XCHG
SHLD 80D2H ;STRING SPACE ALLOC
POP H
JMP INIT1
26E8H JZ INIT
CALL INIT1
LXI B,L091
JMP L115
26F4H MVI C,3
CALL L013
POP B
PUSH H
PUSH H
LHLD 80CCH ;CURRENT LINE NO
XTHL
MVI D,140
PUSH D
INX SP
2704H L115: PUSH B
2705H L116: CALL L112 ;TO BINARY
2708H L117: CALL L120
270BH L118: PUSH H
LHLD 80CCH ;CURRENT LINE NO
CALL L004 ;CMPHD
POP H
INX H
CC L036
CNC L035 ;GET LINE IN DE
MOV H,B
MOV L,C
DCX H
RC
MVI E,14
JMP L022 ;US ERROR
2723H RNZ
MVI D,-1
CALL L007
SPHL
CPI 140
MVI E,4
JNZ L022 ;RG ERROR
POP H
SHLD 80CCH ;CURRENT LINE NO
LXI H,L091
XTHL
2739H L119: LXI B,0E3AH
NOP
ORG $-2
273BH L120: MVI C,0
MVI B,0
273FH L121: MOV A,C
MOV C,B
MOV B,A
2742H L122: MOV A,M
ORA A
RZ
CMP B
RZ
INX H
CPI '"'
JZ L121
JMP L122
2750H L123: CALL L180
CALL L095
XRA H
PUSH D
LDA 80AAH
PUSH PSW
CALL L163
POP PSW
XTHL
SHLD 80C8H
RAR
CALL L162
JZ L127
276BH L124: PUSH H
LHLD TEMPHL
PUSH H
INX H
INX H
MOV E,M
INX H
MOV D,M
LXI H,8208H
CALL L004 ;CMPHD
JNC L125
LHLD 80D2H ;STRING SPACE ALLOC
CALL L004 ;CMPHD
POP D
JNC L126
LHLD 80D6H ;END OF VARIABLES
CALL L004 ;CMPHD
JNC L126
MVI A,209
ORG $-1
2792H L125: POP D
CALL L242
XCHG
CALL L210
279AH L126: CALL L242
POP H
CALL L304
POP H
RET
27A3H L127: PUSH H
CALL L303
POP D
POP H
RET
27AAH CALL L252
MOV A,M
MOV B,A
CPI 188
JZ L128
CALL L095
ADC B
DCX H
27B9H L128: MOV C,E
27BAH L129: DCR C
MOV A,B
JZ L094
CALL L113
CPI ','
RNZ
JMP L129
27C8H CALL L163
MOV A,M
CPI 136
JZ L130
CALL L095
ORA C
DCX H
27D6H L130: CALL L292
JZ L120
CALL L096 ;NEXT CHAR-SKIP SPACE
;<C> IF ASCII #
;<Z> IF : OR 0
JC L116
JMP L093
27E5H L131: DCX H
CALL L096 ;NEXT CHAR-SKIP SPACE
;<C> IF ASCII #
;<Z> IF : OR 0
JZ L135 ;CR/LF, 0 TO 8208H, 0 TO A
27ECH L132: RZ
CPI 157
JZ L140
CPI 160
JZ L139
PUSH H
CPI ','
JZ L138
CPI ';'
JZ L143
POP B
CALL L163
PUSH H
LDA 80AAH
ORA A
JNZ L133
CALL L330
CALL L214
LHLD TEMPHL
LDA 8208H
ADD M
PUSH H
LXI H,8209H
CMP M
POP H
CNC L135 ;CR/LF, 0 TO 8208H, 0 TO A
2824H L133: CALL DISP1
POP H
JMP L131
282BH L134: LXI H,LINBF
; CR/LF, 0 TO 8208H, 0 TO A
282EH L135: MVI A,13
CALL L073 ;TO CRT
MVI A,10
2835H L136: CALL L073 ;TO CRT
2838H L137: XRA A
STA 8208H
RET
283DH L138: MVI A,9
CALL L073 ;TO CRT
LDA 8208H
ORI 7
INR A
STA 8208H
JMP L143
284EH L139: STC
284FH L140: PUSH PSW
CALL L251
CALL L095
DAD H
DCX H
POP PSW
CPI 160
PUSH H
MVI A,-1
JZ L141
LDA 8208H
CMA
2865H L141: ADD E
JNC L143
INR A
MOV B,A
286BH L142: MVI A,' '
CALL L073 ;TO CRT
DCR B
JNZ L142
2874H L143: POP H
CALL L096 ;NEXT CHAR-SKIP SPACE
;<C> IF ASCII #
;<Z> IF : OR 0
JMP L132
287BH L144: LDA 80C7H
ORA A
JNZ L018
POP B
JMP INIT3
2886H CPI '"'
JNZ L145
CALL L215
CALL L095
DCX SP
PUSH H
CALL DISP1
POP H
JMP L146
289AH L145: MVI A,'?'
CALL L073 ;TO CRT
289FH L146: PUSH H
CALL L208
CALL L062 ;ZERO LINE BUFFER. WAIT FOR
;KYBD ENTRY. CR/LF,0 TO 8208H
;0 TO A, 8046H IN HL
MVI A,','
STA LINBF
INX H
MOV A,M
CPI 10
DCX H
POP B
JZ L101
PUSH B
ORA A
JNZ L147
INX H
MVI M,' '
INX H
MOV M,A
DCX H
DCX H
JMP L147
28C3H PUSH H
LHLD 80DCH
ORI 0AFH
ORG $-1
28C8H L147: XRA A
STA 80C7H
XTHL
JMP L149
28D0H L148: CALL L095
INR L
28D4H L149: CALL L180
XTHL
PUSH D
MOV A,M
CPI ','
JZ L150
LDA 80C7H
ORA A
JNZ L155
MVI A,'?'
CALL L073 ;TO CRT
CALL L062 ;ZERO LINE BUFFER. WAIT FOR
;KYBD ENTRY. CR/LF,0 TO 8208H
;0 TO A, 8046H IN HL
28EEH L150: LDA 80AAH
ORA A
JZ L153
CALL L096 ;NEXT CHAR-SKIP SPACE
;<C> IF ASCII #
;<Z> IF : OR 0
MOV D,A
MOV B,A
CPI '"'
JZ L152
MVI D,':'
MVI B,','
LDA 80C7H
ORA A
JNZ L151
MOV D,A
SHLD 80C2H
POP H
XTHL
CALL L097
XTHL
PUSH H
LHLD 80C2H
JNZ L151
MOV B,D
291CH L151: DCX H
291DH L152: CALL L216
XCHG
LXI H,2934H
XTHL
PUSH D
JMP L124
2929H L153: CALL L096 ;NEXT CHAR-SKIP SPACE
;<C> IF ASCII #
;<Z> IF : OR 0
CALL L315
XTHL
CALL L303
2934H POP H
CALL L097
JZ L154
CPI ','
JNZ L144
293FH L154: XTHL
CALL L097
JNZ L148
POP D
LDA 80C7H
ORA A
XCHG
JNZ L099
ORA M
XCHG
RET
2952H L155: CALL L119
ORA A
JNZ L156
INX H
MOV A,M
INX H
ORA M
MVI E,6
JZ L022 ;OD ERROR
INX H
MOV E,M
INX H
MOV D,M
XCHG
SHLD 80C4H
XCHG
296BH L156: CALL L096 ;NEXT CHAR-SKIP SPACE
;<C> IF ASCII #
;<Z> IF : OR 0
CPI 131
JNZ L155
JMP L150
2976H LXI D,0
2979H L157: CNZ L180
SHLD 80C8H
CALL L007
JNZ L021 ;NF ERROR
SPHL
PUSH D
MOV A,M
INX H
PUSH PSW
PUSH D
CALL L298
XTHL
PUSH H
CALL L256
POP H
CALL L303
POP H
CALL L301
PUSH H
CALL L307
POP H
POP B
SUB B
CALL L301
JZ L158
XCHG
SHLD 80CCH ;CURRENT LINE NO
MOV L,C
MOV H,B
JMP L090
29B1H L158: SPHL
LHLD 80C8H
MOV A,M
CPI ','
JNZ L091
CALL L096 ;NEXT CHAR-SKIP SPACE
;<C> IF ASCII #
;<Z> IF : OR 0
CALL L157
29C1H L159: CALL L163
29C4H L160: ORI '7'
ORG $-1
29C5H L161: STC
29C6H L162: LDA 80AAH
ADC A
RPE
29CBH MVI E,24
JMP L022 ;TM ERROR
29D0H L163: DCX H
MVI D,0
29D3H L164: PUSH D
MVI C,1
CALL L013
CALL L169
SHLD 80CAH
29DFH L165: LHLD 80CAH
29E2H POP B
MOV A,B
CPI 120
CNC L160
MOV A,M
MVI D,0
29ECH L166: SUI 171
JC L167
CPI 3
JNC L167
CPI 1
RAL
XRA D
CMP D
MOV D,A
JC L019 ;SYNTAX ERROR
SHLD 80C2H
CALL L096 ;NEXT CHAR-SKIP SPACE
;<C> IF ASCII #
;<Z> IF : OR 0
JMP L166
2A08H L167: MOV A,D
ORA A
JNZ L177
MOV A,M
SHLD 80C2H
SUI 164
RC
CPI 7
RNC
MOV E,A
LDA 80AAH
DCR A
ORA E
MOV A,E
JZ L233
RLC
ADD E
MOV E,A
LXI H,1F9AH ;SIGN (?) JUMP TABLE
DAD D
MOV A,B
MOV D,M
CMP D
RNC
INX H
CALL L160
2A30H L168: PUSH B
LXI B,L165
PUSH B
MOV B,E
MOV C,D
CALL L297
MOV E,B
MOV D,C
MOV C,M
INX H
MOV B,M
INX H
PUSH B
LHLD 80C2H
JMP L164
2A47H L169: XRA A
STA 80AAH
CALL L096 ;NEXT CHAR-SKIP SPACE
;<C> IF ASCII #
;<Z> IF : OR 0
JC L315
CALL L105 ;CK LETTER <C> IF NO
JNC L172
CPI 164
JZ L169
CPI '.'
JZ L315
CPI 165
JZ L171
CPI '"'
JZ L215
CPI 162
JZ L179
CPI 159
JZ L206
SUI 174
JNC L173
2A7AH L170: CALL L095
DB 028H ;ILLEGAL!
CALL L163
CALL L095
DAD H
RET
2A86H L171: MVI D,125
CALL L164
LHLD 80CAH
PUSH H
CALL L296
2A92H CALL L160
POP H
RET
2A97H L172: CALL L180
2A9AH PUSH H
XCHG
SHLD TEMPHL
LDA 80AAH
ORA A
CZ L298
POP H
RET
2AA8H L173: MVI B,0
RLC
MOV C,A
PUSH B
CALL L096 ;NEXT CHAR-SKIP SPACE
;<C> IF ASCII #
;<Z> IF : OR 0
MOV A,C
CPI ')'
JC L174
CALL L095
DB 028H ;ILLEGAL!
CALL L163
CALL L095
INR L
CALL L161
XCHG
LHLD 80DEH
XTHL
PUSH H
XCHG
CALL L252
XCHG
XTHL
JMP L175
2AD3H L174: CALL L170
XTHL
LXI D,2A92H
PUSH D
2ADBH L175: LXI B,1F6AH ;MATH (?) JUMP TABLE
DAD B
MOV C,M
INX H
MOV H,M
MOV L,C
PCHL
2AE5H ORI 175
PUSH PSW
CALL L160
CALL L109
POP PSW
XCHG
POP B
XTHL
XCHG
CALL L299
PUSH PSW
CALL L109
POP PSW
POP B
MOV A,C
LXI H,L203
JNZ L176
ANA E
MOV C,A
MOV A,B
ANA D
PCHL
2B07H L176: ORA E
MOV C,A
MOV A,B
ORA D
PCHL
2B0CH L177: LXI H,2B1EH
LDA 80AAH
RAR
MOV A,D
RAL
MOV E,A
MVI D,100
MOV A,B
CMP D
RNC
JMP L168
2B1EH DB 020H,02BH,079H,0B7H
DB 01FH,0C1H,0D1H,0F5H
DB 0CDH,0C6H,029H,021H
DB 061H,02BH,0E5H,0CAH
DB 019H,033H,0AFH,032H
DB 0AAH,080H,0D5H,0CDH
DB 059H,02FH,0D1H,0CDH
DB 05DH,01FH,0CDH,05DH
DB 01FH,0CDH,05DH,02FH
DB 0CDH,0EDH,032H,0E1H
DB 0E3H,055H,0E1H
2B49H L178: MOV A,E
ORA D
RZ
MOV A,D
SUI 1
RC
XRA A
CMP E
INR A
RNC
DCR D
DCR E
LDAX B
CMP M
INX H
INX B
JZ L178
CMC
JMP L293
2B61H INR A
ADC C
POP B
ANA B
ADI 255
SBB A
JMP L294
2B6BH L179: MVI D,'Z'
CALL L164
CALL L160
CALL L109
MOV A,E
CMA
MOV C,A
MOV A,D
CMA
CALL L203
POP B
JMP L165
2B82H CALL L097
RZ
CALL L095
INR L
LXI B,2B82H
PUSH B
ORI 0AFH
ORG $-1
2B8FH L180: XRA A
STA 80A9H
MOV B,M
2B94H L181: CALL L105 ;CK LETTER <C> IF NO
JC L019
XRA A
MOV C,A
STA 80AAH
CALL L096 ;NEXT CHAR-SKIP SPACE
;<C> IF ASCII #
;<Z> IF : OR 0
JC L182
CALL L105 ;CK LETTER <C> IF NO
JC L184
2BABH L182: MOV C,A
2BACH L183: CALL L096 ;NEXT CHAR-SKIP SPACE
;<C> IF ASCII #
;<Z> IF : OR 0
JC L183
CALL L105 ;CK LETTER <C> IF NO
JNC L183
2BB8H L184: SUI '$'
JNZ L185
INR A
STA 80AAH
RRC
ADD C
MOV C,A
CALL L096 ;NEXT CHAR-SKIP SPACE
;<C> IF ASCII #
;<Z> IF : OR 0
2BC7H L185: LDA 80C6H
ADD M
SUI '('
JZ L192
XRA A
STA 80C6H
PUSH H
LHLD 80D8H ;START OF ARRAYS
XCHG
LHLD 80D6H ;END OF BASIC
2BDCH L186: CALL L004 ;CMPHD
JZ L188
MOV A,C
SUB M
INX H
JNZ L187
MOV A,B
SUB M
2BEAH L187: INX H
JZ L190
INX H
INX H
INX H
INX H
JMP L186
2BF5H L188: POP H
XTHL
PUSH D
LXI D,2A9AH
CALL L004 ;CMPHD
POP D
JZ L191
XTHL
PUSH H
PUSH B
LXI B,6
LHLD 80DAH ;END OF ARRAYS
PUSH H
DAD B
POP B
PUSH H
CALL L010 ;CK MEMORY SIZE-MOVE MEMORY
;TO MAKE ROOM FOR BASIC LINE
POP H
SHLD 80DAH ;END OF ARRAYS
MOV H,B
MOV L,C
SHLD 80D8H ;START OF ARRAYS
2C1BH L189: CALL L002
JNZ L189
POP D
MOV M,E
INX H
MOV M,D
INX H
2C26H L190: XCHG
POP H
RET
2C29H L191: STA RFLG
LXI H,2103H
SHLD TEMPHL
POP H
RET
2C34H L192: PUSH H
LHLD 80A9H
XTHL
MOV D,A
2C3AH L193: PUSH D
PUSH B
CALL L106
POP B
POP PSW
XCHG
XTHL
PUSH H
XCHG
INR A
MOV D,A
MOV A,M
CPI ','
JZ L193
CALL L095
DAD H
SHLD 80CAH
POP H
SHLD 80A9H
PUSH D
CALL L430
JC L195
LDA 80A9H
ORA A
MVI E,18
JNZ L022 ;DD ERROR
POP PSW
SUB M
JZ L199
2C6DH L194: MVI E,16
JMP L022 ;BS ERROR
2C72H L195: LXI D,4
POP PSW
MOV M,C
INX H
MOV M,B
INX H
MOV C,A
CALL L013
INX H
INX H
SHLD 80C2H
MOV M,C
INX H
LDA 80A9H
RAL
MOV A,C
2C8AH L196: LXI B,11
JNC L197
POP B
INX B
2C92H L197: MOV M,C
INX H
MOV M,B
INX H
PUSH PSW
PUSH H
CALL L312
XCHG
POP H
POP PSW
DCR A
JNZ L196
PUSH PSW
MOV B,D
MOV C,E
XCHG
DAD D
JC L194
CALL L016 ;CK FREE MEMORY
SHLD 80DAH ;END OF ARRAYS
2CB0H L198: CALL L002
JNZ L198
INX B
MOV D,A
LHLD 80C2H
MOV E,M
XCHG
DAD H
DAD B
XCHG
DCX H
DCX H
MOV M,E
INX H
MOV M,D
INX H
POP PSW
JC L201
2CCAH L199: MOV B,A
MOV C,A
MOV A,M
INX H
MVI D,225
ORG $-1
2CCFH L200: POP H
MOV E,M
INX H
MOV D,M
INX H
XTHL
PUSH PSW
CALL L004 ;CMPHD
JNC L194
PUSH H
CALL L312
POP D
DAD D
POP PSW
DCR A
MOV B,H
MOV C,L
JNZ L200
DAD H
DAD H
POP B
DAD B
XCHG
2CEEH L201: LHLD 80CAH
RET
; "FRE" TOKEN
2CF2H LHLD 80DAH ;END OF ARRAYS
XCHG
LXI H,0
DAD SP
LDA 80AAH
ORA A
JZ L202
CALL L238
CALL L2311
LHLD 80D2H ;STRING SPACE ALLOC
XCHG
LHLD 80C0H
2D0EH L202: MOV A,L
SUB E
MOV C,A
MOV A,H
SBB D
2D13H L203: MOV B,C
2D14H L204: MOV D,B
MVI E,0
LXI H,80AAH
MOV M,E
MVI B,'Z'
JMP L295
; "POS" TOKEN
2D20H LDA 8208H
2D23H L205: MOV B,A
XRA A
JMP L204
2D28H CALL L209
CALL L208
LXI B,L119
PUSH B
PUSH D
CALL L095
NOP
CALL L180
CALL L160
CALL L095
DAD H
CALL L095
XRA H
MOV B,H
MOV C,L
XTHL
JMP L207
2D4BH L206: CALL L209
PUSH D
CALL L170
CALL L160
XTHL
CALL L005
POP D
CALL L005
POP H
CALL L005
CALL L005
DCX H
DCX H
DCX H
DCX H
PUSH H
CALL L004 ;CMPHD
PUSH D
MVI E,34
JZ L022 ;UF ERROR
CALL L303
POP H
CALL L159
CALL L097
JNZ L019 ;SN ERROR
POP H
POP D
POP B
2D82H L207: MOV M,C
INX H
MOV M,B
JMP L213
2D88H L208: PUSH H
LHLD 80CCH ;CURRENT LINE NO
INX H
MOV A,H
ORA L
POP H
RNZ
MVI E,22
JMP L022 ;ID ERROR
2D96H L209: CALL L095
SBB A
MVI A,128
STA 80C6H
ORA M
MOV B,A
CALL L181
JMP L160
; "STR$" TOKEN
2DA7H CALL L160
CALL L330
CALL L214
CALL L238
LXI B,2FAFH
PUSH B
2DB7H L210: MOV A,M
INX H
INX H
PUSH H
CALL L223
POP H
MOV C,M
INX H
MOV B,M
CALL L212
PUSH H
MOV L,A
CALL L235
POP D
RET
2DCCH L211: CALL L223
2DCFH L212: LXI H,80BCH
PUSH H
MOV M,A
INX H
2DD5H L213: INX H
MOV M,E
INX H
MOV M,D
POP H
RET
2DDBH L214: DCX H
2DDCH L215: MVI B,'"'
MOV D,B
2DDFH L216: PUSH H
MVI C,-1
2DE2H L217: INX H
MOV A,M
INR C
ORA A
JZ L218
CMP D
JZ L218
CMP B
JNZ L217
2DF1H L218: CPI '"'
CZ L096 ;NEXT CHAR-SKIP SPACE
;<C> IF ASCII #
;<Z> IF : OR 0
XTHL
INX H
XCHG
MOV A,C
CALL L212
2DFDH L219: LXI D,80BCH
LHLD 80AEH ;STRING SPACE
SHLD TEMPHL
MVI A,1
STA 80AAH
CALL L304
CALL L004 ;CMPHD
SHLD 80AEH ;STRING SPACE
POP H
MOV A,M
RNZ
MVI E,30
JMP L022 ;ST ERROR
; DISPLAY ROUTINE
2E1CH INX H
2E1DH DISPLAY:CALL L214
2E20H DISP1: CALL L238
CALL L301
INR E
2E27H DISP2: DCR E
RZ
LDAX B
CALL L073
CPI 13
CZ L137
INX B
JMP DISP2
2E36H L223: ORA A
MVI C,241
ORG $-1
2E38H POP PSW
PUSH PSW
LHLD 80D2H ;STRING SPACE ALLOC
XCHG
LHLD 80C0H
CMA
MOV C,A
MVI B,-1
DAD B
INX H
CALL L004 ;CMPHD
JC L224
SHLD 80C0H
INX H
XCHG
POP PSW
RET
2E54H L224: POP PSW
MVI E,26
JZ L022 ;OS ERROR
CMP A
PUSH PSW
LXI B,2E38H
PUSH B
2E60H L225: LHLD 80ACH
2E63H L226: SHLD 80C0H
LXI H,0
PUSH H
LHLD 80D2H ;STRING SPACE ALLOC
PUSH H
LXI H,80B0H
2E71H XCHG
LHLD 80AEH ;STRING SPACE
CALL L003 ;CMPDH
LXI B,2E71H
JNZ L230
LHLD 80D6H ;END OF BASIC
2E81H L227: XCHG
LHLD 80D8H ;START OF ARRAYS
CALL L003 ;CMPDH
JZ L229
MOV A,M
INX H
INX H
ORA A
CALL L231
JMP L227
2E95H L228: POP B
2E96H L229: XCHG
LHLD 80DAH ;END OF ARRAYS
CALL L003 ;CMPDH
JZ L232
CALL L301
MOV A,E
PUSH H
DAD B
ORA A
JP L228
SHLD 80C2H
POP H
MOV C,M
MVI B,0
DAD B
DAD B
INX H
2EB4H XCHG
LHLD 80C2H
CALL L003 ;CMPDH
JZ L229
LXI B,2EB4H
2EC1H L230: PUSH B
ORI 128
2EC4H L231: MOV A,M
INX H
INX H
MOV E,M
INX H
MOV D,M
INX H
RP
ORA A
2ECDH L2311: RZ
MOV B,H
MOV C,L
CALL L001
MOV H,B
MOV L,C
RC
POP H
XTHL
CALL L004 ;CMPHD
XTHL
PUSH H
MOV H,B
MOV L,C
RNC
POP B
POP PSW
POP PSW
PUSH H
PUSH D
PUSH B
RET
2EE7H L232: POP D
POP H
MOV A,L
ORA H
RZ
DCX H
MOV B,M
DCX H
MOV C,M
PUSH H
DCX H
DCX H
MOV L,M
MVI H,0
DAD B
MOV D,B
MOV E,C
DCX H
MOV B,H
MOV C,L
LHLD 80C0H
CALL L011
POP H
MOV M,C
INX H
MOV M,B
MOV L,C
MOV H,B
DCX H
JMP L226
2F0CH L233: PUSH B
PUSH H
LHLD TEMPHL
XTHL
CALL L169
XTHL
CALL L161
MOV A,M
PUSH H
LHLD TEMPHL
PUSH H
ADD M
MVI E,28
JC L022 ;LS ERROR
CALL L211
POP D
CALL L240
XTHL
CALL L239
PUSH H
LHLD 80BEH
XCHG
CALL L234
CALL L234
LXI H,29E2H
XTHL
PUSH H
JMP L219
2F43H L234: POP H
XTHL
CALL L005
MOV C,M
INX H
MOV B,M
POP H
2F4CH L235: INR L
2F4DH L236: DCR L
RZ
LDAX B
STAX D
INX B
INX D
JMP L236
2F56H L237: CALL L161
2F59H L238: LHLD TEMPHL
2F5CH L239: XCHG
2F5DH L240: CALL L242
XCHG
RNZ
PUSH D
MOV D,B
MOV E,C
DCX D
MOV C,M
CALL L001
JNZ L241
MOV B,A
DAD B
SHLD 80C0H
2F72H L241: POP H
RET
2F74H L242: LHLD 80AEH ;STRING SPACE
DCX H
MOV B,M
DCX H
MOV C,M
DCX H
DCX H
CALL L004 ;CMPHD
RNZ
SHLD 80AEH ;STRING SPACE
RET
; "LEN" TOKEN
2F85H LXI B,L205
PUSH B
2F89H L243: CALL L237
XRA A
MOV D,A
STA 80AAH
2F91H L244: MOV A,M
ORA A
RET
; "ASC" TOKEN
2F94H CALL L243
JZ L111
INX H
INX H
MOV E,M
INX H
MOV D,M
LDAX D
JMP L205
; "CHR$" TOKEN
2FA3H MVI A,1
CALL L211
CALL L253
LHLD 80BEH
MOV M,E
2FAFH POP B
JMP L219
; "LEFT$" TOKEN
2FB3H CALL L248
XRA A
2FB7H L245: XTHL
MOV C,A
2FB9H PUSH H
MOV A,M
CMP B
JC L246
MOV A,B
LXI D,0EH
ORG $-2
2FC1H L246: MVI C,0
PUSH B
CALL L223
POP B
POP H
PUSH H
INX H
INX H
MOV B,M
INX H
MOV H,M
MOV L,B
MVI B,0
DAD B
MOV B,H
MOV C,L
CALL L212
MOV L,A
CALL L235
POP D
CALL L240
JMP L219
; "RIGHT$" TOKEN
2FE3H CALL L248
POP D
PUSH D
LDAX D
SUB B
JMP L245
; "MID$" TOKEN
2FEDH XCHG
MOV A,M
CALL L249
PUSH B
MVI E,-1
CPI ')'
JZ L247
CALL L095
INR L
CALL L252
3001H L247: CALL L095
DAD H
POP PSW
XTHL
LXI B,2FB9H
PUSH B
DCR A
CMP M
MVI B,0
RNC
MOV C,A
MOV A,M
SUB C
CMP E
MOV B,A
RC
MOV B,E
RET
3018H CALL L250
PUSH PSW
MVI E,0
CALL L097
JZ 8222H
CALL L095
INR L
CALL L252
JMP 8222H
302EH L248: XCHG
CALL L095
DAD H
3033H L249: POP B
POP D
PUSH B
MOV B,E
INR B
DCR B
RNZ
JMP L111
303DH L250: CALL L252
STA 8224H
STA 8220H
CALL L095
INR L
JMP L252
304DH L251: CALL L096 ;NEXT CHAR-SKIP SPACE
;<C> IF ASCII #
;<Z> IF : OR 0
3050H L252: CALL L159
3053H L253: CALL L108
MOV A,D
ORA A
JNZ L111
CALL L097
MOV A,E
RET
; "VAL" TOKEN
3060H CALL L243
JZ L265
MOV E,A
INX H
INX H
MOV A,M
INX H
MOV H,M
MOV L,A
PUSH H
DAD D
MOV B,M
MOV M,D
XTHL
PUSH B
MOV A,M
CALL L315
POP B
POP H
MOV M,B
RET
; "PEEK" TOKEN
307BH CALL L292
CALL L254
LDAX D
JMP L205
3085H CALL L159
CALL L292
CALL L254
PUSH D
CALL L095
INR L
CALL L252
POP D
STAX D
RET
3099H L254: JM L109
LDA RFLG
CPI 145
JMP L110
30A4H L255: LXI H,352CH
30A7H L256: CALL L301
JMP L259
30ADH L257: CALL L301
LXI H,0D1C1H
30B3H L258: CALL L296
30B6H L259: MOV A,B
ORA A
RZ
LDA RFLG
ORA A
JZ L299
SUB B
JNC L260
CMA
INR A
XCHG
CALL L297
XCHG
CALL L299
POP B
POP D
30D0H L260: CPI 25
RNC
PUSH PSW
CALL L306
MOV H,A
POP PSW
CALL L275
ORA H
LXI H,TEMPHL
JP L261
CALL L273
JNC L269
INX H
INR M
JZ L272
MVI L,1
CALL L279
JMP L269
30F6H L261: XRA A
SUB B
MOV B,A
MOV A,M
SBB E
MOV E,A
INX H
MOV A,M
SBB D
MOV D,A
INX H
MOV A,M
SBB C
MOV C,A
3104H L262: CC L274
3107H L263: MOV L,B
MOV H,E
XRA A
310AH L264: MOV B,A
MOV A,C
ORA A
JNZ L268
MOV C,D
MOV D,H
MOV H,L
MOV L,A
MOV A,B
SUI 8
CPI 224
JNZ L264
311CH L265: XRA A
311DH L266: STA RFLG
RET
3121H L267: DCR B
DAD H
MOV A,D
RAL
MOV D,A
MOV A,C
ADC A
MOV C,A
3129H L268: JP L267
MOV A,B
MOV E,H
MOV B,L
ORA A
JZ L269
LXI H,RFLG
ADD M
MOV M,A
JNC L265
RZ
313CH L269: MOV A,B
313DH L270: LXI H,RFLG
ORA A
CM L271
MOV B,M
INX H
MOV A,M
ANI 128
XRA C
MOV C,A
JMP L299
314EH L271: INR E
RNZ
INR D
RNZ
INR C
RNZ
MVI C,128
INR M
RNZ
3158H L272: MVI E,10
JMP L022 ;OV ERROR
315DH L273: MOV A,M
ADD E
MOV E,A
INX H
MOV A,M
ADC D
MOV D,A
INX H
MOV A,M
ADC C
MOV C,A
RET
3169H L274: LXI H,CRTRY
MOV A,M
CMA
MOV M,A
XRA A
MOV L,A
SUB B
MOV B,A
MOV A,L
SBB E
MOV E,A
MOV A,L
SBB D
MOV D,A
MOV A,L
SBB C
MOV C,A
RET
317DH L275: MVI B,0
317FH L276: SUI 8
JC L277
MOV B,E
MOV E,D
MOV D,C
MVI C,0
JMP L276
318CH L277: ADI 9
MOV L,A
318FH L278: XRA A
DCR L
RZ
MOV A,C
3193H L279: RAR
MOV C,A
MOV A,D
RAR
MOV D,A
MOV A,E
RAR
MOV E,A
MOV A,B
RAR
MOV B,A
JMP L278
31A1H DB 000H,000H,000H,081H
31A5H DB 003H,0AAH,056H,019H
DB 080H,0F1H,022H,076H
DB 080H,045H,0AAH,038H
DB 082H
; "LOG" TOKEN
31B2H L280: CALL L292
JPE L111
LXI H,RFLG
MOV A,M
LXI B,8035H
LXI D,04F3H
SUB B
PUSH PSW
MOV M,B
PUSH D
PUSH B
CALL L259
POP B
POP D
INR B
CALL L286
LXI H,31A1H
CALL L257
LXI H,31A5H
CALL L348
LXI B,8080H
LXI D,0
CALL L259
POP PSW
CALL L326
31E9H L281: LXI B,8031H
LXI D,7218H
LXI H,0D1C1H
ORG $-2
31F0H POP B
POP D
31F2H L282: CALL L292
RZ
MVI L,0
CALL L287
MOV A,C
STA 8238H
XCHG
SHLD 8233H
LXI B,0
MOV D,B
MOV E,B
LXI H,L263
PUSH H
LXI H,3214H
PUSH H
PUSH H
LXI H,TEMPHL
3214H MOV A,M
INX H
ORA A
JZ L283
PUSH H
XCHG
MVI E,8
JMP 822BH
3221H L283: MOV B,E
MOV E,D
MOV D,C
MOV C,A
RET
3226H L284: CALL L297
LXI B,8420H
LXI D,0
CALL L299
3232H L285: POP B
POP D
3234H L286: CALL L292
JZ L020 ;/0 ERROR
MVI L,-1
CALL L287
INR M
INR M
DCX H
MOV A,M
STA 8258H
DCX H
MOV A,M
STA 8254H
DCX H
MOV A,M
STA 8250H
MOV B,C
XCHG
XRA A
MOV C,A
MOV D,A
MOV E,A
STA 825BH
JMP 824CH
325CH L287: MOV A,B
ORA A
JZ L290
MOV A,L
LXI H,RFLG
XRA M
ADD B
MOV B,A
RAR
XRA B
MOV A,B
JP L289
ADI 128
MOV M,A
JZ 824AH
CALL L306
MOV M,A
DCX H
RET
327AH L288: CALL L292
CMA
POP H
327FH L289: ORA A
3280H L290: POP H
JP L265
JMP L272
3287H L291: CALL L300
MOV A,B
ORA A
RZ
ADI 2
JC L272
MOV B,A
CALL L259
LXI H,RFLG
INR M
RNZ
JMP L272
329EH L292: LDA RFLG
ORA A
RZ
LDA BRTRY
CPI 47
RAL
32A9H L293: SBB A
RNZ
INR A
RET
; "SGN" TOKEN
32ADH CALL L292
32B0H L294: MVI B,136
LXI D,0
32B5H L295: LXI H,RFLG
MOV C,A
MOV M,B
MVI B,0
INX H
MVI M,128
RAL
JMP L262
; "ABS" TOKEN
32C3H CALL L292
RP
32C7H L296: LXI H,BRTRY
MOV A,M
XRI 128
MOV M,A
RET
32CFH L297: XCHG
LHLD TEMPHL
XTHL
PUSH H
LHLD BRTRY
XTHL
PUSH H
XCHG
RET
32DCH L298: CALL L301
32DFH L299: XCHG
SHLD TEMPHL
MOV H,B
MOV L,C
SHLD BRTRY
XCHG
RET
32EAH L300: LXI H,TEMPHL
32EDH L301: MOV E,M
INX H
MOV D,M
INX H
MOV C,M
INX H
MOV B,M
32F4H L302: INX H
RET
32F6H L303: LXI D,TEMPHL
32F9H L304: MVI B,4
32FBH L305: LDAX D
MOV M,A
INX D
INX H
DCR B
JNZ L305
RET
3304H L306: LXI H,BRTRY
MOV A,M
RLC
STC
RAR
MOV M,A
CMC
RAR
INX H
INX H
MOV M,A
MOV A,C
RLC
STC
RAR
MOV C,A
RAR
XRA M
RET
3319H L307: MOV A,B
ORA A
JZ L292
LXI H,32A7H
PUSH H
CALL L292
MOV A,C
RZ
LXI H,BRTRY
XRA M
MOV A,C
RM
CALL L308
RAR
XRA C
RET
3333H L308: INX H
MOV A,B
CMP M
RNZ
DCX H
MOV A,C
CMP M
RNZ
DCX H
MOV A,D
CMP M
RNZ
DCX H
MOV A,E
SUB M
RNZ
POP H
POP H
RET
3346H L309: MOV B,A
MOV C,A
MOV D,A
MOV E,A
ORA A
RZ
PUSH H
CALL L300
CALL L306
XRA M
MOV H,A
CM L310
MVI A,152
SUB B
CALL L275
MOV A,H
RAL
CC L271
MVI B,0
CC L274
POP H
RET
336AH L310: DCX D
MOV A,D
ANA E
INR A
RNZ
DCR C
RET
; "INT" TOKEN
3371H L311: LXI H,RFLG
MOV A,M
CPI 152
LDA TEMPHL
RNC
MOV A,M
CALL L309
MVI M,152
MOV A,E
PUSH PSW
MOV A,C
RAL
CALL L262
POP PSW
RET
; END PART 1