home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Interactive Guide
/
c-cplusplus-interactive-guide.iso
/
c_ref
/
csource4
/
284_01
/
basic.asm
< prev
next >
Wrap
Assembly Source File
|
1989-03-13
|
12KB
|
1,129 lines
;
; PALO ALTO TINY BASIC
; "PORTABLE 8080" VERSION
;
; MEMORY CONFIGURATION
ITOP EQU 0000H
LTOP EQU 1000H
VTOP EQU 1300H
LBUF EQU VTOP+0037H
LBFSZ EQU 80
MSTK EQU LBUF+LBFSZ
TMSTK EQU MSTK+30
STACK EQU 1400H
; MAIN PROGRAM
ORG ITOP
ENTRY: DI
LXI H,OTOP
SHLD OBTM
START: LXI SP,STACK
EI
CALL CRLF
LXI D,OKMES
SUB A
CALL MSG
LXI H,$+7
SHLD CLABL
LXI H,0000H
SHLD FCNTR
SHLD RSTCK
EDITR: MVI A,'>'
CALL GETL
PUSH D
LXI D,LBUF
CALL GINT
CALL SKPBL
MOV A,H
ORA L
POP B
JZ KWCPR
INSRT: DCX D
MOV A,H
STAX D
DCX D
MOV A,L
STAX D
PUSH B
PUSH D
MOV A,C
SUB E
PUSH PSW
CALL SRCH
PUSH D
JNZ MOVE
PUSH D
CALL SKIPL
POP B
LHLD OBTM
CALL TRNSF
MOV H,B
MOV L,C
SHLD OBTM
MOVE: POP B
LHLD OBTM
POP PSW
PUSH H
CPI 03H
JZ START
ADD L
MOV L,A
MVI A,00H
ADC H
MOV H,A
LXI D,VTOP
CALL COMPR
JNC ERSRY
SHLD OBTM
POP D
CALL TR2
POP D
POP H
CALL TRNSF
JMP EDITR
GETL: CALL PUT
LXI D,LBUF
GETL1: CALL GET
CPI 7FH
JZ CRUB
CPI 08H
JZ CRUB
CPI 18H
JZ CCAN
CALL PUT
STAX D
INX D
CPI 0DH
RZ
MOV A,E
CPI LBUFL+LBFSZ
JNZ GETL1
CRUB: MOV A,E
CPI LBUFL
JZ CCAN
DCX D
MVI A,08H
CALL PUT
MVI A,20H
CALL PUT
MVI A,08H
CALL PUT
JMP GETL1
CCAN: CALL CRLF
MVI A,5CH
JMP GETL
LBUFL EQU LBUF AND 0FFH
SRCH: MOV A,H
ORA A
JM ERHOW
LXI D,OTOP
SRCH1: PUSH H
LHLD OBTM
DCX H
CALL COMPR
POP H
RC
LDAX D
SUB L
MOV B,A
INX D
LDAX D
SBB H
JC SKPL1
DCX D
ORA B
RET
SKIPL: INX D
SKPL1: INX D
SKPL2: LDAX D
CPI 0DH
JNZ SKPL1
INX D
JMP SRCH1
TRNSF: CALL COMPR
RZ
LDAX D
STAX B
INX D
INX B
JMP TRNSF
TR2: MOV A,B
SUB D
JNZ TR2E
MOV A,C
SUB E
RZ
TR2E: DCX D
DCX H
LDAX D
MOV M,A
JMP TR2
KWCPR: LXI H,CMDKW-1
NXTKW: CALL SKPBL
NXTK1: PUSH D
KWC1: LDAX D
INX D
CPI '.'
JZ KWSRT
INX H
CMP M
JZ KWC1
DCX D
SUB A
CMP M
JZ EXEQT
KWSK1: INX H
CMP M
JNZ KWSK1
INX H
INX H
POP D
JMP NXTK1
KWSRT: SUB A
KWSK2: INX H
CMP M
JNZ KWSK2
EXEQT: INX H
MOV A,M
INX H
MOV H,M
MOV L,A
POP PSW
PCHL
TEST: XTHL
CALL SKPBL
CMP M
INX H
JZ TSTEQ
PUSH B
MOV C,M
MVI B,00H
DAD B
POP B
DCX D
TSTEQ: INX D
INX H
XTHL
RET
SKPBL: LDAX D
CPI ' '
RNZ
INX D
JMP SKPBL
NEW: CALL TSCR2
LXI H,OTOP
SHLD OBTM
STOP: CALL TSCR2
JMP START
GOSUB: CALL PSHV
CALL EEXPR
PUSH D
CALL SRCH
JNZ ERHW1
LHLD CLABL
PUSH H
LHLD RSTCK
PUSH H
LXI H,0000H
SHLD FCNTR
DAD SP
SHLD RSTCK
JMP RUN2
RETURN: CALL TSCR2
LHLD RSTCK
MOV A,H
ORA L
JZ ERWHT
SPHL
POP H
SHLD RSTCK
POP H
SHLD CLABL
POP D
CALL POPV
JMP ENDL
FOR: CALL PSHV
CALL LTSUB
DCX H
SHLD FCNTR
LXI H,KWTO-1
JMP NXTKW
FORTO: CALL EEXPR
SHLD FTOV
LXI H,KWSTP-1
JMP NXTKW
FSTEP: CALL EEXPR
JMP FOR0
FSTP1: LXI H,0001H
FOR0: SHLD FSTPV
LHLD CLABL
SHLD FLABL
XCHG
SHLD FOBJ
LXI B,000AH
LHLD FCNTR
XCHG
MOV H,B
MOV L,B
DAD SP
DB 3EH
FOR3: DAD B
MOV A,M
INX H
ORA M
JZ FOR10
MOV A,M
DCX H
CMP D
JNZ FOR3
MOV A,M
CMP E
JNZ FOR3
FOR5: XCHG
LXI H,0000H
DAD SP
MOV B,H
MOV C,L
LXI H,000AH
DAD D
CALL TR2
SPHL
FOR10: LHLD FOBJ
XCHG
JMP ENDL
NEXT: CALL TSTV
JC ERWHT
SHLD NCNTR
NEXT1: PUSH D
XCHG
LHLD FCNTR
MOV A,H
ORA L
JZ ERWT1
CALL COMPR
JZ NEXT2
POP D
CALL POPV
LHLD NCNTR
JMP NEXT1
NEXT2: MOV E,M
INX H
MOV D,M
LHLD FSTPV
PUSH H
DAD D
XCHG
LHLD FCNTR
MOV M,E
INX H
MOV M,D
LHLD FTOV
POP PSW
ORA A
JP NEXT4
XCHG
NEXT4: CALL CMINT
POP D
JC NEXT5
LHLD FLABL
SHLD CLABL
LHLD FOBJ
XCHG
JMP ENDL
NEXT5: CALL POPV
JMP ENDL
PSHV: LXI H,TMSTK
CALL TWSCP
POP B
DAD SP
JNC ERSRY
LHLD FCNTR
MOV A,H
ORA L
JZ NPSH
LHLD FOBJ
PUSH H
LHLD FLABL
PUSH H
LHLD FTOV
PUSH H
LHLD FSTPV
PUSH H
LHLD FCNTR
NPSH: PUSH H
PUSH B
RET
POPV: POP B
POP H
SHLD FCNTR
MOV A,H
ORA L
JZ NPOP
POP H
SHLD FSTPV
POP H
SHLD FTOV
POP H
SHLD FLABL
POP H
SHLD FOBJ
NPOP: PUSH B
RET
IFSTM: CALL EEXPR
MOV A,H
ORA L
JNZ NXTGO
REM: LXI H,0000H
CALL SKPL2
JNC RUN2
JMP START
LIST: CALL GINT
CALL TSCR2
CALL SRCH
LISTL: JC START
CALL WLINE
CALL BREAK
CALL SRCH1
JMP LISTL
WLINE: LDAX D
MOV L,A
INX D
LDAX D
MOV H,A
INX D
MVI C,04H
CALL WINT
MVI A,' '
CALL PUT
SUB A
CALL MSG
RET
PRINT: MVI C,6
PRSC: CALL TEST
DB ';'
DB PRCR-$-1
CALL CRLF
JMP NXTGO
PRCR: CALL TEST
DB 0DH
DB PRSHA-$-1
CALL CRLF
JMP RUN1
PRSHA: CALL TEST
DB '#'
DB PRLTR-$-1
CALL EEXPR
MOV C,L
JMP PRCMA
PRLTR: CALL PRSUB
JMP PREXP
PRCMA: CALL TEST
DB ','
DB PREND-$-1
CALL TSTSC
JMP PRSHA
PREND: CALL CRLF
JMP ENDL
PREXP: CALL EEXPR
PUSH B
CALL WINT
POP B
JMP PRCMA
PRSUB: CALL TEST
DB '"'
DB PR13-$-1
MVI A,'"'
JMP PR11
PR13: CALL TEST
DB 27H
DB PR14-$-1
MVI A,27H
PR11: CALL MSG
CPI 0DH
POP H
JZ RUN1
JMP PR12
PR14: CALL TEST
DB 5FH
DB PR15-$-1
MVI A,8DH
CALL PUT
CALL PUT
POP H
PR12: INX H
INX H
INX H
PCHL
PR15: RET
WINT: PUSH D
LXI D,000AH
PUSH D
MOV B,D
DCR C
CALL ABS
JP WINT1
MVI B,'-'
DCR C
WINT1: PUSH B
WINT2: CALL DIVID
MOV A,B
ORA C
JZ WINT3
XTHL
DCR L
PUSH H
MOV H,B
MOV L,C
JMP WINT2
WINT3: POP B
WINT4: DCR C
MOV A,C
ORA A
JM WINT5
MVI A,' '
CALL PUT
JMP WINT4
WINT5: MOV A,B
CALL PUT
MOV E,L
WINT6: MOV A,E
CPI 0AH
POP D
RZ
ADI 30H
CALL PUT
JMP WINT6
ERRIN: LHLD NCNTR
SPHL
POP H
SHLD CLABL
POP D
POP D
INPUT: PUSH D
CALL PRSUB
JMP INPT2
INPT1: CALL TSTV
JC INPT6
JMP INPT4
INPT2: PUSH D
CALL TSTV
JC ERWHT
LDAX D
MOV C,A
SUB A
STAX D
POP D
CALL MSG
MOV A,C
DCX D
STAX D
INPT4: PUSH D
XCHG
LHLD CLABL
PUSH H
LXI H,INPUT
SHLD CLABL
LXI H,0000H
DAD SP
SHLD NCNTR
PUSH D
MVI A,':'
CALL GETL
LXI D,LBUF
CALL EEXPR
POP D
XCHG
MOV M,E
INX H
MOV M,D
POP H
SHLD CLABL
POP D
INPT6: POP PSW
CALL TEST
DB ','
DB ENDL-$-1
JMP INPUT
LETDF: CALL TSCR1
CPI 0DH
JZ ENDL
LET: CALL LTSUB
CALL TEST
DB ','
DB ENDL-$-1
JMP LET
LTSUB: CALL TSTV
JC ERWHT
PUSH H
CALL TEST
DB '='
DB LERR-$-1
CALL EEXPR
MOV B,H
MOV C,L
POP H
MOV M,C
INX H
MOV M,B
RET
GOTO: CALL EEXPR
PUSH D
CALL TSCR2
CALL SRCH
JNZ ERHW1
POP PSW
JMP RUN2
RUN: CALL TSCR2
LXI D,OTOP
RUN1: LXI H,0000H
CALL SRCH1
JC START
RUN2: XCHG
SHLD CLABL
XCHG
INX D
INX D
NXTGO: CALL BREAK
LXI H,STMKW-1
JMP NXTKW
ENDL: CALL TSTSC
LERR: JMP ERWHT
TSTSC: CALL TEST
DB ';'
DB TSCR1-$-1
POP PSW
JMP NXTGO
TSCR1: CALL TEST
DB 0DH
DB TSRTN-$-1
POP PSW
JMP RUN1
TSRTN: RET
TSCR2: CALL SKPBL
CPI 0DH
RZ
JMP ERWHT
EEXPR: CALL EXPR
PUSH H
LXI H,ROPKW-1
JMP NXTKW
GE: CALL IFEXQ
RC
MOV L,A
RET
NE: CALL IFEXQ
RZ
MOV L,A
RET
GT: CALL IFEXQ
RZ
RC
MOV L,A
RET
LE: CALL IFEXQ
MOV L,A
RZ
RC
MOV L,H
RET
EQ: CALL IFEXQ
RNZ
MOV L,A
RET
LT: CALL IFEXQ
RNC
MOV L,A
RET
NOROP: POP H
RET
IFEXQ: MOV A,C
POP H
POP B
PUSH H
PUSH B
MOV C,A
CALL EXPR
XCHG
XTHL
CALL CMINT
POP D
LXI H,0000H
MVI A,01H
RET
EXPR: CALL TEST
DB '-'
DB EXPR1-$-1
LXI H,0000H
JMP NEGA1
EXPR1: CALL TEST
DB '+'
DB EXPR3-$-1
EXPR3: CALL TERM
EXPR2: CALL TEST
DB '+'
DB NEGA0-$-1
PUSH H
CALL TERM
JMP ADDBL
NEGA0: CALL TEST
DB '-'
DB EXPRT-$-1
NEGA1: PUSH H
CALL TERM
CALL TWSCP
ADDBL: XCHG
XTHL
MOV A,H
XRA D
MOV A,D
DAD D
POP D
JM EXPR2
XRA H
JP EXPR2
JMP ERHOW
TERM: CALL FACTR
MULT: CALL TEST
DB '*'
DB DIV-$-1
PUSH H
CALL FACTR
MVI B,00H
CALL ABS
XCHG
XTHL
CALL ABS
MOV A,H
ORA A
JZ MULT1
MOV A,D
ORA D
XCHG
JNZ ERHW1
MULT1: MOV A,L
MVI L,0
ORA A
JZ TERM1
MULTL: DAD D
JC ERHW1
DCR A
JNZ MULTL
JMP TERM1
DIV: CALL TEST
DB '/'
DB EXPRT-$-1
PUSH H
CAL