home *** CD-ROM | disk | FTP | other *** search
- ORG 3
- ;
- STAK EQU 7100H
- ;
- ; TINY BASIC INTERPRETER
- ; INTEGER ARITHMETIC
- ; WITH RND FUNCTION
- ;
- STRT: LXI SP,STAK
- NOP
- NOP
- NOP
- CALL INIT ;INITIALIZE
- LXI H,TOPL
- MVI M,1
- SHLD EFPN
- ERNT: XRA A
- STA LNUM
- MVI E,'?'
- MVI A,'>'
- CALL DTIN+8
- CALL LF
- LXI H,IBUF
- SHLD APNT
- CALL NTST ;TEST FOR #
- JC STMT ;NO #, XCT
- CALL RPLN ;EDIT
- JMP ERNT
- ;
- ; INITIALIZATION ROUTINE
- ;
- INIT: LXI H,SYMT
- MVI B,NSYM
- CALL CLER
- STA CHCT
- LHLD EFPN
- INX H
- SHLD NMLC
- LXI H,ASTR
- SHLD ASTK
- LXI H,VSTR
- SHLD VSTK
- LXI H,RSTR-1
- MOV M,A
- INX H
- MOV M,A
- SHLD RSTK
- RET
- ;
- ; ZERO MEMORY
- ;
- CLER: XRA A
- MOV M,A
- INX H
- DCR B
- JNZ CLER+1
- RET
- ;
- ; INPUT ROUTINE
- ;
- DTIN: MVI E,'?'
- MOV A,E
- CALL TVTO
- MVI A,' '
- CALL TVTO
- DTN1: LXI H,IBUF
- PUSH H
- MVI B,IBLN
- CALL CLER
- POP H
- MVI B,IBLN-2
- DTN2: CALL TVTI
- CMP E
- JZ DTN1
- CPI 18H
- JNZ $+12
- LXI SP,STAK
- CALL CRLF
- JMP ERNT
- MOV M,A
- CPI 13
- RZ
- DCR B
- JM ILTL
- INX H
- JMP DTN2
- ;
- ; TEST INPUT FOR LINE NUMBER
- ;
- NTST: CALL SBLK
- CALL TSTN
- RC
- MOV B,H
- MOV C,L
- CALL ADEC
- MOV A,H
- ORA A
- JNZ ERRM
- MOV A,L
- CPI 2
- JC ERRM
- STA FNUM
- MOV H,B
- MOV L,C
- SHLD APNT ;SET APNT
- RET
- SBLK: LHLD APNT
- MOV A,M
- CPI ' '
- RNZ
- INX H
- SBL1: SHLD APNT
- JMP SBLK+3
- ;
- ; TEST FOR NUMERIC
- ;
- TSTN: LHLD APNT
- MOV A,M
- TSN1: CPI '0'
- RC
- CPI '9'+1
- CMC
- RET
- ;
- ; CONVERT ASCII TO BINARY
- ;
- ADEC: LXI H,0
- LDAX B
- CALL TSN1
- RC
- MOV D,H
- MOV E,L
- DAD H
- DAD H
- DAD D
- DAD H
- SUI '0'
- MOV E,A
- MVI D,0
- DAD D
- INX B
- JMP ADEC+3
- ;
- ; REPLACE LINE
- ;
- RPLN: CALL LNFD
- JNZ INSL
- PUSH H
- PUSH H
- INX H
- CALL NXTL
- POP D
- ;
- ; DELETE OLD LINE
- ;
- RPL1: MOV A,M
- STAX D
- INX D
- INX H
- CPI 2
- JNC RPL1
- DCX D
- XCHG
- SHLD EFPN
- POP D
- LHLD APNT
- MOV A,M
- CPI 13
- RZ
- XCHG
- ;
- ; INSERT NEW LINE - COUNT CHARS IN NEW LINE
- ;
- INSL: XCHG
- LHLD APNT
- LXI B,1
- INS1: MOV A,M
- INR C
- INX H
- CPI 13
- JNZ INS1
- LHLD EFPN
- PUSH H
- DAD B
- MOV A,H
- CPI MMAX
- JNC ERMO
- SHLD EFPN ;NEW EOF
- POP B
- ;
- ; MOV ALL LINES UP
- ;
- INS2: LDAX B
- MOV M,A
- MOV A,B
- SUB D
- DCX H
- DCX B
- JNZ INS2
- MOV A,C
- INR A
- SUB E
- JNZ INS2
- ;
- ; INSERT NEW LINE
- ;
- LDA FNUM
- STAX D
- INX D
- LHLD APNT
- INS3: MOV A,M
- STAX D
- INX H
- INX D
- CPI 13
- JNZ INS3
- RET
- ;
- ; LINE FINDER
- ;
- LNFD: LXI H,TOPL
- LDA FNUM
- MOV B,A
- LNF1: MOV A,M
- CPI 2
- RC
- CMP B
- RNC
- INX H
- CALL NXTL
- JMP LNF1
- ;
- ; GET NEXT LINE START
- ;
- NXTL: MOV A,M
- INX H
- CPI 13
- RZ
- JNC NXTL
- DCX H
- RET
- ;
- ; RANDOM NUMBER GENERATOR
- ;
- RND: CALL ASPP
- MOV A,L
- ORA H
- JZ GEN
- STA LORD
- SHLD HORD
- GEN: LDA LORD
- MVI C,15
- MOV B,A
- ANI 33 ;BITS 19 AND 24
- JPE GEN1
- STC
- GEN1: LHLD HORD
- CALL HLRS
- SHLD HORD
- MOV A,B
- RAR
- DCR C
- JNZ GEN+5
- STA LORD
- MVI A,7FH
- ANA H
- MOV H,A
- CALL ASPH
- RET
- ;
- ; HLCM - HL COMPLEMENT
- ;
- HLCM: MOV A,L
- CMA
- MOV L,A
- MOV A,H
- CMA
- MOV H,A
- INX H
- RET
- ;
- ; HLLS - HL LEFT SHIFT
- ;
- HLLS: MOV A,L
- RAL
- MOV L,A
- MOV A,H
- RAL
- MOV H,A
- RET
- ;
- ; HLRS - HL RIGHT SHIFT
- ;
- HLRS: MOV A,H
- RAR
- MOV H,A
- MOV A,L
- RAR
- MOV L,A
- RET
- ;
- ; BUML - BINARY MULTIPLY
- ;
- BUML: PUSH H
- LXI H,0
- SHLD PRD2
- MVI B,16
- BUM1: LHLD PRD1
- CALL HLRS
- SHLD PRD1
- LHLD PRD2
- JNC BUM2
- POP D
- DAD D
- PUSH D
- BUM2: CALL HLRS
- SHLD PRD2
- DCR B
- JNZ BUM1
- POP D
- LHLD PRD1
- CALL HLRS
- RET
- ;
- ; BUDV - BINARY DIVIDE
- ;
- BUDV: CALL HLCM
- PUSH H
- MVI B,17
- ORA A
- BUD1: LHLD DVD2
- CALL HLLS
- SHLD DVD2
- DCR B
- JZ BUD2
- LHLD DVD1
- CALL HLLS
- SHLD DVD1
- POP D
- DCX SP
- DCX SP
- DAD D
- JNC BUD1
- SHLD DVD1
- JMP BUD1
- BUD2: POP D
- RET
- ;
- ; SPNZ - SPACE TO NEXT ZONE
- ;
- SPNZ: LDA CHCT
- MOV B,A
- SUI 8
- JZ $+6
- JNC SPNZ+4
- MOV C,A
- DCR C
- MVI A,' '
- SPN3: INR C
- JP SPN4
- CALL TVTO
- INR B
- JMP SPN3
- SPN4: MOV A,B
- STA CHCT
- RET
- ;
- ; VSIN - INCREMENT VSTK
- ;
- VSIN: CALL STOV
- SHLD VSTK
- RET
- ;
- ; STOV - CHECK FOR OVERFLOW
- ;
- STOV: LHLD ASTK
- XCHG
- LHLD VSTK
- INX H
- INX H
- MOV A,L
- SUB E
- MOV A,H
- SBB D
- JNC STOF
- RET
- ;
- ; TAPE INPUT ROUTINE
- ;
- TPIN: MVI C,1
- LXI D,8
- IN TAPU
- ANA C
- JNZ TPIN+5
- MVI B,192
- DCR B
- JNZ $-1
- TPI2: IN TAPU
- ANA C
- ADD D
- RRC
- MOV D,A
- MVI B,128
- DCR B
- JNZ $-1
- DCR E
- JNZ TPI2
- MOV M,A
- CMP C
- RZ
- INX H
- JMP TPIN+2
- TVTI: JMP 3F08H
- TVTO: PUSH B
- MOV C,A
- CALL 3809H
- POP B
- RET
- ;
- ; END BLOCK 1
- ; STMT - STATEMENT PROCESSOR
- ;
- STMT: LXI D,LTMS
- CALL TST
- STM1: CALL TSTV
- JC ERRS
- LXI D,EQMS
- CALL TST
- CALL EXPR
- CALL DONE
- CALL STOR
- JMP NXT
- EQMS: DB '='+128
- JMP ERRS
- LTMS: DB 'LE','T'+128
- LXI D,GOMS
- CALL TST
- LXI D,TOMS
- CALL TST
- CALL EXPR
- CALL DONE
- JMP XFER
- TOMS: DB 'T','O'+128
- LXI D,SBMS
- CALL TST
- CALL EXPR
- CALL DONE
- CALL SAV
- JMP XFER
- SBMS: DB 'SU','B'+128
- JMP ERRS
- GOMS: DB 'G','O'+128
- LXI D,PRMS
- CALL TST
- PRT1: LXI D,QUMS
- CALL TST
- CALL PRS
- PRT2: LXI D,CMMS
- CALL TST
- CALL SPNZ
- JMP PRT1
- CMMS: DB ','+128
- LXI D,SMMS
- CALL TST
- LHLD APNT
- MOV A,M
- CPI 13
- JZ SMM2
- CPI ':'
- JNZ PRT1
- JMP SMM2
- SMMS: DB ';'+128
- CALL CRLF
- XRA A
- STA CHCT
- SMM2: CALL DONE
- JMP NXT
- QUMS: DB '"'+128
- LHLD APNT
- MOV A,M
- CPI 13
- JZ SMMS+1
- CPI ':'
- JZ SMMS+1
- CALL EXPR
- CALL PRNV
- JMP PRT2
- PRMS: DB 'P','R'+128
- LXI D,IFMS
- CALL TST
- CALL EXPR
- CALL RELP
- CALL EXPR
- CALL CMPR
- JNC STMT
- IFNX: LHLD APNT
- CALL NXTL
- DCX H
- SHLD APNT
- JMP NXT
- IFMS: DB 'I','F'+128
- LXI D,INMS
- CALL TST
- XRA A
- STA CHCT
- CALL DTIN
- INM1 CALL TSTV
- JC ERRS
- CALL NCOV
- CALL STOR
- LXI D,CMM1
- CALL TST
- JMP INM1
- CMM1: DB ','+128
- XRA A
- STA CHCT
- CALL DONE
- JMP NXT
- INMS: DB 'I','N'+128
- LXI D,RTMS
- CALL TST
- CALL DONE
- JMP RSTO
- RTMS: DB 'RE','T'+128
- LXI D,ENMS
- CALL TST
- JMP ENDM
- ENMS: DB 'EN','D'+128
- LXI D,LSMS
- CALL TST
- JMP LIST
- LSMS: DB 'LIS','T'+128
- LXI D,RNMS
- CALL TST
- CALL INIT
- LXI H,TOPL
- MOV A,M
- CPI 2
- JC ERRM
- JMP NXT1-4
- RNMS: DB 'RU','N'+128
- LXI D,CLMS
- CALL TST
- JMP STRT
- CLMS: DB 'CLEA','R'+128
- LXI D,TPMS
- CALL TST
- JMP TAPE
- TPMS: DB 'TAP','E'+128
- LXI D,LDMS
- CALL TST
- LXI H,TOPL
- CALL TPIN
- SHLD EFPN
- JMP ERNT
- LDMS: DB 'LOA','D'+128
- LXI D,DMSG
- CALL TST
- LDMX: CALL TSTV
- JNC DMER
- LXI D,DMC2
- CALL TST
- JMP LDMX:
- DMC2: DB ','+128
- CALL DONE
- JMP NXT
- DMSG: DB 'DI','M'+128
- LXI D,SZEM
- CALL TST
- CALL SZER
- JMP ERNT
- SZEM: DB 'SIZ','E'+128
- LXI D,RMKS
- CALL TST
- JMP IFNX
- RMKS: DB 'RE','M'+128
- LXI D,CLRM
- CALL TST
- ; CALL CLRS ;THIS IS A NO-NO
- NOP
- NOP
- NOP
- ;
- XRA A
- STA CHCT
- CALL DONE
- JMP NXT
- CLRM: DB 'CLR','S'+128
- ; END OF STATEMENT PROCESSOR
- ; IF NO MORE OPERATIONS ARE ADDED
- ; INPUT TESTS HERE
- ;
- ; DEFAULT IS LET
- ;
- JMP STM1
- ;
- ; TST ROUTINE - STRING COMPARE
- ; ALTERNATE RETURN IF NO MATCH
- ;
- TST: MVI B,1
- LHLD APNT
- TST1: LDAX D
- RAL
- JNC TST2
- DCR B
- CMC
- TST2: RAR
- CMP M
- INX H
- INX D
- JNZ TST3
- MOV A,B
- ORA A
- JNZ TST1
- CALL SBL1
- RET
- ;
- ; SET ALT. RETURN
- ;
- TST3: MOV A,B
- ORA A
- JZ TST5
- TST4: LDAX D
- INX D
- RAL
- JNC TST4
- TST5: XCHG
- POP D
- PCHL ;ALT RETURN
- ;
- ; DONE - TEST FOR CR OR :
- ;
- DONE: CALL SBLK
- CPI 13
- RZ
- CPI ':'
- RZ
- JMP ERRS
- ;
- ; NXT - SETUP FOR NEXT LINE #
- ;
- NXT: LHLD APNT
- MOV A,M
- INX H
- CPI ':'
- JZ NXT1
- MOV A,M
- CPI 2
- JC EOFR
- STA LNUM
- INX H
- NXT1: CALL SBL1
- JMP STMT
- ;
- ; XFER - NEW LINE FOR GO
- ;
- XFER: CALL ASPP
- MOV A,H
- ORA A
- JNZ ERRM
- MOV A,L
- CPI 2
- JC ERRM
- XFE1: STA FNUM
- CALL LNFD
- JNZ ERML
- JMP NXT1-4
- ;
- ; SAV - SAVE RETURN LINE #
- ;
- SAV: CALL NXTL
- JC EOFR
- MOV B,M
- LXI H,RSTR+8
- XCHG
- LHLD RSTK
- MOV A,L
- SUB E
- MOV A,H
- SBB D
- JNC GSER
- MOV M,B
- INX H
- SHLD RSTK
- RET
- ;
- ; TSTV - TEST FOR VARIABLE
- ;
- TSTV: MVI C,0
- LHLD APNT
- MOV A,M
- CPI 'A'
- RC
- CPI 'Z'+1
- CMC
- RC
- MOV B,A
- INX H
- MOV A,M
- CPI '('
- JNZ $+9
- INX H
- MVI C,0E0H
- JMP TSV1
- CPI '1'
- JC TSV1
- CPI '7'
- JNC TSV1
- INX H
- ANI 7
- RRC
- RRC
- RRC
- MOV C,A
- TSV1: CALL SBL1
- MVI A,1FH
- ANA B
- ORA C
- MOV B,A
- MVI C,-1
- LXI H,SYMT-1
- TSV2: INX H
- INR C
- MOV A,M
- ORA A
- JZ TSV3
- MOV A,C
- CPI NSYM
- JNC SMOE
- MOV A,M
- CMP B
- JNZ TSV2
- INR A
- TSV3: MOV M,B
- PUSH PSW
- PUSH PSW
- MVI D,0
- MOV A,C
- RAL
- MOV E,A
- LXI H,VSTR
- DAD D
- MOV A,B
- SUI 0E0H
- JNC TSV4
- CALL ASPH
- POP PSW
- CZ VSIN
- POP PSW
- RET
- ;
- ; STOR - STORE VAR. VALUE
- ;
- STOR: CALL ASPP
- PUSH H
- CALL ASPP
- POP D
- MOV M,E
- INX H
- MOV M,D
- RET
- ;
- ; RSTO - NEW # FOR RETURN
- ;
- RSTO: LHLD RSTK
- DCX H
- MOV A,M
- ORA A
- JZ RNER
- SHLD RSTK
- JMP XFE1
- ;
- ; PRNV - PRINT VARIABLE
- ;
- PRNV: CALL ASPP
- CALL DECA
- RET
- ;
- ; TAPE - OUTPUT TO TAPE
- ;
- TAPE: LXI H,TOPL
- MOV A,M
- CALL TAPO
- CPI 2
- JC ERNT
- INX H
- JMP TAPE+3
- ;
- ; END BLOCK 2
- ; ASPH - PUSH HL TO ASTK
- ;
- ASPH: PUSH H
- CALL STOV
- DCX D
- POP H
- MOV A,L
- STAX D
- DCX D
- MOV A,H
- STAX D
- XCHG
- SHLD ASTK
- RET
- ;
- ; ASPP - POP HL FROM ASTK
- ;
- ASPP: LHLD ASTK
- XCHG
- LXI H,ASTR
- CALL HLCM
- DAD D
- JC SUFE
- XCHG
- MOV D,M
- INX H
- MOV E,M
- INX H
- SHLD ASTK
- XCHG
- RET
- ;
- ; PRS - PRINT STRING
- ;
- PRS: LHLD APNT
- DCX H
- MOV A,M
- CPI '"'
- JNZ PRS+3
- INX H
- LDA CHCT
- MOV B,A
- PRS1: MOV A,M
- INX H
- CPI 13
- JZ CRER
- CPI '"'
- JZ PRS3
- INR B
- CALL TVTO
- JMP PRS1
- PRS3: MOV A,B
- STA CHCT
- CALL SBL1
- RET
- ;
- ; DECA $ CNVV - OUTPUT #
- ;
- DECA: MOV A,H
- ORA A
- JP DEC1
- MVI A,'-'
- CALL TVTO
- LDA CHCT
- INR A
- STA CHCT
- CALL HLCM
- DEC1: LXI B,5
- LXI D,-10000
- CALL CNVV
- LXI D,-1000
- CALL CNVV
- LXI D,-100
- CALL CNVV
- LXI D,-10
- CALL CNVV
- LXI D,-1
- CALL CNVV
- RET
- CNVV: PUSH B
- MVI B,'0'-1
- INR B
- DAD D
- MOV A,H
- RAL
- JNC CNVV+3
- XCHG
- CALL HLCM
- DAD D
- MOV A,B
- POP B
- CPI '0'
- JZ CNV2
- CNV1: DCR C
- CALL TVTO
- LDA CHCT
- INR A
- STA CHCT
- MVI B,128
- RET
- CNV2: ADD B
- JP CNV3
- SUB B
- JMP CNV1
- CNV3: DCR C
- JZ CNV3-4
- RET
- ;
- ; NCOV - INPUT # TO BINARY
- ;
- NCOV: LHLD APNT
- PUSH H
- LHLD TMP1
- LDA CHCT
- ORA A
- JNZ NCO2
- LXI H,IBUF
- NCO2: CALL SBL1
- CALL EXPR
- CALL SBLK
- INX H
- SHLD TMP1
- MOV A,H
- STA CHCT
- POP H
- SHLD APNT
- RET
- ;
- ; RELP - RELATIONAL OP TEST
- ;
- RELP: LXI D,M0
- CALL TST
- MVI L,0
- REL1: MVI H,0
- CALL ASPH
- RET
- M0: DB '='+128
- LXI D,M4
- CALL TST
- LXI D,M1
- CALL TST
- MVI L,2
- JMP REL1
- M1: DB '='+128
- LXI D,M3
- CALL TST
- MVI L,3
- JMP REL1
- M3: DB '>'+128
- MVI L,1
- JMP REL1
- M4: DB '<'+128
- LXI D,M41
- CALL TST
- LXI D,M5
- CALL TST
- MVI L,5
- JMP REL1
- M5: DB '='+128
- LXI D,M6
- CALL TST
- MVI L,3
- JMP REL1
- M6: DB '<'+128
- MVI L,4
- JMP REL1
- M41: DB '>'+128
- JMP REER
- ;
- ; EXPR - EXPRESSION EVALUATOR
- ; CAN BE CALLED RECURSIVELY
- ;
- EXPR: LXI D,E0
- CALL TST
- CALL TERM
- CALL ASPP
- CALL HLCM
- CALL ASPH
- JMP E1
- E0: DB '-'+128
- LXI D,E01
- CALL TST
- JMP E01+1
- E01: DB '+'+128
- CALL TERM
- E1: LXI D,E2
- CALL TST
- CALL TERM
- CALL IADD
- JMP E1
- E2: DB '+'+128
- LXI D,E3
- CALL TST
- CALL TERM
- CALL ISUB
- JMP E1
- E3: DB '-'+128
- RET
- ;
- ; TERM - TERM EVALUATOR
- ; CAN BE CALLED RECURSIVELY
- ;
- TERM: CALL FACT
- LXI D,I1
- CALL TST
- CALL FACT
- CALL MULT
- JMP TERM+3
- I1: DB '*'+128
- LXI D,I2
- CALL TST
- CALL FACT
- CALL DIVD
- JMP TERM+3
- I2: DB '/'+128
- RET
- ;
- ; FACT - GET FACTORS
- ;
- FACT: CALL FNTS
- RNC
- CALL TSTV
- JC F0
- JZ UDVE
- CALL ASPP
- MOV E,M
- INX H
- MOV D,M
- XCHG
- FAC1: CALL ASPH
- RET
- F0: CALL TSTN
- JC F1
- MOV B,H
- MOV C,L
- CALL ADEC
- MOV D,B
- MOV E,C
- XCHG
- CALL SBL1
- XCHG
- JMP FAC1
- F1: LXI D,F11
- CALL TST ;TEST FOR (
- CALL EXPR ;RECURSIVE CALL
- LXI D,FE1
- CALL TST
- RET
- FE1: DB ')'+128
- JMP RPER
- F11: DB '('+128
- JMP ERRS
- ;
- ; FNTS - FUNCTION TEST
- ; RND ONLY FUNCTION INITIALLY
- ;
- FNTS: LXI D,RNDM
- CALL TST
- CALL EXPR ;RECURSIVE
- CALL RND
- LXI D,RPMS
- CALL TST
- ORA A
- RET
- RPMS: DB ')'+128
- JMP RPER
- RNDM: DB 'RND'
- DB '('+128
- STC
- RET
- ;
- ; DIM SETUP AND HANDLING
- ;
- TSV4: PUSH H
- CALL EXPR
- LXI D,RPTV
- CALL TST
- JMP $+7
- RPTV: DB ')'+128
- JMP RPER
- CALL ASPP
- XRA A
- ORA H
- JM DMER
- ORA L
- JZ DMER
- XCHG
- POP H
- POP PSW
- JNZ TSV6
- ;
- ; NEW VAR
- ;
- PUSH D
- XCHG
- LHLD NMLC
- XCHG
- MOV M,E
- INX H
- MOV M,D
- POP H
- DAD H
- DAD D
- SHLD NMLC
- MOV A,H
- CPI MMAX
- JNC ERMO
- POP PSW
- CALL VSIN
- STC
- RET
- ;
- ; EXISTING DIM VAR
- ;
- TSV6: DCX D
- XCHG
- DAD H
- LDAX D
- ADD L
- MOV L,A
- INX D
- LDAX D
- ADC H
- MOV H,A
- CALL ASPH
- POP PSW
- RET
- ;
- ; SIZE COMMAND
- ;
- SZER: LHLD EFPN
- XCHG
- LXI H,TOPL
- CALL HLCM
- DAD D
- CALL DECA
- MVI A,5
- STA CHCT
- CALL SPNZ
- MVI D,MMAX
- MVI E,0
- LHLD EFPN
- CALL HLCM
- DAD D
- CALL DECA
- CALL CRLF
- RET
- ;
- ; END BLOCK 3
- ; CMPR - COMPARE 2 VALUES
- ;
- CMPR: CALL ASPP
- PUSH H
- CALL ASPP
- XCHG
- POP H
- PUSH D
- CALL ASPH
- CALL ISUB
- CALL ASPP
- POP B
- ;
- ; HERE WITH X-Y IN HL
- ;
- MOV A,H
- ORA A
- JNZ CMP0
- ORA L
- MOV A,C
- JZ CMP2
- CPI 3
- RET
- CMP0: MOV A,C
- JP $-4
- CPI 1
- RC
- CPI 4
- CMC
- RET
- CMP2: CPI 0
- RZ
- CPI 2
- RZ
- CPI 5
- RET
- ;
- ; ISUB/IADD - ADD - SUBTRACT
- ;
- ISUB: CALL ASPP
- CALL HLCM
- JMP IADD+3
- IADD: CALL ASPP
- MOV A,H
- ANI 128
- RAR
- MOV B,A
- PUSH H
- CALL ASPP
- MOV A,H
- ANI 128
- ADD B
- POP D
- DAD D
- RAR
- MOV B,A
- MOV A,H
- RAL
- MOV A,B
- RAR
- CPI 128
- JZ AOFE
- CPI 112
- JZ AOFE
- CALL ASPH
- RET
- ;
- ; DIVD - INTEGER DIVIDE
- ;
- DIVD: CALL ASPP
- MOV A,L
- ORA H
- JZ DZER
- MVI A,128
- ANA H
- MOV B,A
- CM HLCM
- PUSH H
- CALL ASPP
- MVI A,128
- ANA H
- ADD B
- STA TEMP
- MOV A,H
- ORA A
- CM HLCM
- SHLD DVD2
- LXI H,0
- SHLD DVD1
- POP H
- CALL BUDV
- LDA TEMP
- ORA A
- CNZ HLCM
- CALL ASPH
- RET
- ;
- ; MULT - INTEGER MULTIPLY
- ;
- MULT: CALL ASPP
- MVI A,128
- ANA H
- MOV B,A
- CM HLCM
- PUSH H
- CALL ASPP
- MVI A,128
- ANA H
- ADD B
- STA TEMP
- MOV A,H
- RAL
- CC HLCM
- SHLD PRD1
- POP H
- CALL BUML
- MOV A,H
- RAL
- JC MOFE
- XCHG
- LHLD PRD2
- MOV A,L
- ORA H
- JNZ MOFE
- XCHG
- LDA TEMP
- ORA A
- CNZ HLCM
- CALL ASPH
- RET
- ;
- ; TAPO - TAPE OUT ROUTINE
- ;
- TAPO: MVI C,9
- ORA A
- RAL
- TAP1: OUT TAPU
- MVI B,128
- TAP2: DCR B
- JNZ TAP2
- RAR
- DCR C
- JNZ TAP1
- RAR
- STC
- RAL
- OUT TAPU
- MVI B,255
- TAP3: DCR B
- JNZ TAP3
- RAR
- RET
- ;
- ; LIST - LIST FILE ON TVT
- ;
- LIST: MVI A,1
- STA FNUM
- MVI A,255
- STA LNUM
- CALL TSTN
- JC LIS1
- MOV B,H
- MOV C,L
- CALL ADEC
- MOV A,L
- STA FNUM
- STA LNUM
- MOV H,B
- MOV L,C
- CALL SBL1
- CALL TSTN
- JC LIS1
- MOV B,H
- MOV C,L
- CALL ADEC
- MOV A,L
- STA LNUM
- ;LIS1: CALL CLRS
- LIS1: NOP
- NOP
- NOP
- CALL LNFD
- MOV A,M
- CPI 2
- JC ERNT
- PUSH H
- MVI H,0
- MOV L,A
- CPI 100
- JNC LIS2
- MVI A,' '
- CALL TVTO
- MOV A,L
- CPI 10
- JNC LIS2
- MVI A,' '
- CALL TVTO
- LIS2: CALL DECA
- POP H
- INX H
- LIS3: MOV A,M
- CALL TVTO
- INX H
- CPI 13
- JNZ LIS3
- CALL LF
- MOV B,M
- LDA LNUM
- SUB B
- JNC LIS1+6
- JMP ERNT
- ;
- ; ERRS - ERROR HANDLING
- ;
- ERRS: MVI L,10
- ERR1: MVI H,0
- LXI SP,STAK
- CALL CRLF
- CALL DECA
- MVI A,' '
- CALL TVTO
- MVI A,'A'
- CALL TVTO
- MVI A,'T'
- CALL TVTO
- MVI A,' '
- CALL TVTO
- LDA LNUM
- MOV L,A
- MVI H,0
- CALL DECA
- CALL CRLF
- JMP ERNT
- ERRM: MVI L,15
- JMP ERR1
- ERMO: MVI L,20
- JMP ERR1
- EOFR: LDA LNUM
- ORA A
- JZ ERNT
- MVI L,25
- JMP ERR1
- ERML: MVI L,30
- JMP ERR1
- GSER: MVI L,35
- JMP ERR1
- SMOE: MVI L,40
- JMP ERR1
- STOF: MVI L,45
- JMP ERR1
- RNER: MVI L,50
- JMP ERR1
- CRER: MVI L,55
- JMP ERR1
- REER: MVI L,60
- JMP ERR1
- RPER: MVI L,65
- JMP ERR1
- UDVE: MVI L,70
- JMP ERR1
- AOFE: MVI L,75
- JMP ERR1
- MOFE: MVI L,80
- JMP ERR1
- DZER: MVI L,85
- JMP ERR1
- ENDM: MVI L,90
- JMP ERR1
- SUFE: MVI L,95
- JMP ERR1
- ILTL: MVI L,100
- JMP ERR1
- DMER: MVI L,105
- JMP ERR1
- CRLF: MVI A,0DH ;CARRIAGE RETURN
- CALL TVTO
- LF: MVI A,0AH ;LINE FEED
- JMP TVTO
- ;
- ; VARIABLE DEFINITIONS
- ;
- TVT EQU 0
- TAPU EQU 1
- CLRS EQU 0E090H
- NSYM EQU 120
- MMAX EQU 20H
- IBLN EQU 74
- ;
- ; STORAGE AREAS
- ;
- EFPN: DS 2
- TMP1: DS 2
- NMLC: DS 2
- APNT: DS 2
- LNUM: DS 1
- FNUM: DS 1
- ASTK: DS 2
- VSTK: DS 2
- RSTK: DS 2
- PRD1: DS 2
- PRD2: DS 2
- CHCT: DS 1
- TEMP: DS 1
- DVD1 EQU PRD1
- DVD2 EQU PRD2
- HORD: DS 2
- LORD: DS 1
- DS 1
- RSTR: DS 8
- SYMT: DS 120
- VSTR: DS 256
- ASTR EQU $
- IBUF: DS 74
- TOPL EQU $
- ;
- END
-