mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-22 16:04:18 +00:00
594 lines
10 KiB
NASM
594 lines
10 KiB
NASM
TITLE 'ASM OPERAND SCAN MODULE'
|
||
; OPERAND SCAN MODULE
|
||
ORG 1860H
|
||
;
|
||
; EXTERNALS
|
||
IOMOD EQU 200H ;I/O MODULE
|
||
SCMOD EQU 1100H ;SCANNER MODULE
|
||
SYMOD EQU 1340H ;SYMBOL TABLE MODULE
|
||
BMOD EQU 15A0H ;BINARY SEARCH MODULE
|
||
;
|
||
;
|
||
PERR EQU IOMOD+18H
|
||
SCAN EQU SCMOD+6H ;SCANNER ENTRY POINT
|
||
CR EQU 0DH ;CARRIAGE RETURN
|
||
;
|
||
LOOKUP EQU SYMOD+6H ;LOOKUP
|
||
FOUND EQU LOOKUP+3 ;FOUND SYMBOL IF ZERO FLAG NOT SET
|
||
ENTER EQU FOUND+3 ;ENTER SYMBOL
|
||
SETTY EQU ENTER+3 ;SET TYPE FIELD
|
||
GETTY EQU SETTY+3 ;SET TYPE FIELD
|
||
SETVAL EQU GETTY+3 ;SET VALUE FIELD
|
||
GETVAL EQU SETVAL+3 ;GET VALUE FIELD
|
||
;
|
||
BSEAR EQU BMOD+3 ;BINARY SEARCH ROUTINE
|
||
BGET EQU BSEAR+3 ;GET VALUES WITH SEARCH
|
||
;
|
||
; COMMON EQUATES
|
||
PBMAX EQU 120 ;MAX PRINT SIZE
|
||
PBUFF EQU 10CH ;PRINT BUFFER
|
||
PBP EQU PBUFF+PBMAX ;PRINT BUFFER POINTER
|
||
;
|
||
TOKEN EQU PBP+1 ;CURRENT TOKEN UDER SCAN
|
||
VALUE EQU TOKEN+1 ;VALUE OF NUMBER IN BINARY
|
||
ACCLEN EQU VALUE+2 ;ACCUMULATOR LENGTH
|
||
ACMAX EQU 64 ;MAX ACCUMULATOR LENGTH
|
||
ACCUM EQU ACCLEN+1
|
||
;
|
||
EVALUE EQU ACCUM+ACMAX ;VALUE FROM EXPRESSION ANALYSIS
|
||
;
|
||
SYTOP EQU EVALUE+2 ;CURRENT SYMBOL TOP
|
||
SYMAX EQU SYTOP+2 ;MAX ADDRESS+1
|
||
;
|
||
PASS EQU SYMAX+2 ;CURRENT PASS NUMBER
|
||
FPC EQU PASS+1 ;FILL ADDRESS FOR NEXT HEX BYTE
|
||
ASPC EQU FPC+2 ;ASSEMBLER'S PSEUDO PC
|
||
;
|
||
; GLOBAL EQUATES
|
||
IDEN EQU 1 ;IDENTIFIER
|
||
NUMB EQU 2 ;NUMBER
|
||
STRNG EQU 3 ;STRING
|
||
SPECL EQU 4 ;SPECIAL CHARACTER
|
||
;
|
||
PLABT EQU 0001B ;PROGRAM LABEL
|
||
DLABT EQU 0010B ;DATA LABEL
|
||
EQUT EQU 0100B ;EQUATE
|
||
SETT EQU 0101B ;SET
|
||
MACT EQU 0110B ;MACRO
|
||
;
|
||
EXTT EQU 1000B ;EXTERNAL
|
||
REFT EQU 1011B ;REFER
|
||
GLBT EQU 1100B ;GLOBAL
|
||
;
|
||
;
|
||
; TABLE DEFINITIONS
|
||
XBASE EQU 0 ;START OF OPERATORS
|
||
OPER EQU 15 ;LAST OPERATOR
|
||
RT EQU 16
|
||
PT EQU RT+1 ;RT IS REGISTER TYPE, PT IS PSEUDO OPERATION
|
||
OBASE EQU PT+1
|
||
;
|
||
PLUS EQU 5
|
||
MINUS EQU 6
|
||
NOTF EQU 8 ;NOT
|
||
LPAR EQU 12
|
||
RPAR EQU 13
|
||
OSMAX EQU 10
|
||
VSMAX EQU 8*2
|
||
;
|
||
;
|
||
; BEGINNING OF MODULE
|
||
JMP ENDMOD ;PAST THIS MODULE
|
||
JMP OPAND ;SCAN OPERAND FIELD
|
||
JMP MULF ;MULTIPLY FUNCTION
|
||
JMP DIVE ;DIVIDE FUNCTION
|
||
UNARY: DS 1 ;TRUE IF NEXT OPERATOR IS UNARY
|
||
OPERV: DS OSMAX ;OPERATOR STACK
|
||
HIERV: DS OSMAX ;OPERATOR PRIORITY
|
||
VSTACK: DS VSMAX ;VALUE STACK
|
||
OSP: DS 1 ;OPERATOR STACK POINTER
|
||
VSP: DS 1 ;VALUE STACK POINTER
|
||
;
|
||
;
|
||
;
|
||
STKV: ;PLACE CURRENT H,L VALUE AT TOP OF VSTACK
|
||
XCHG ;HOLD VALUE IN D,E
|
||
LXI H,VSP
|
||
MOV A,M
|
||
CPI VSMAX
|
||
JC STKV0
|
||
CALL ERREX ;OVERFLOW IN EXPRESSION
|
||
MVI M,0 ;VSP=0
|
||
STKV0: MOV A,M ;GET VSP
|
||
INR M ;VSP=VSP+1
|
||
INR M ;VSP=VSP+2
|
||
MOV C,A ;SAVE VSP
|
||
MVI B,0 ;DOUBLE VSP
|
||
LXI H,VSTACK
|
||
DAD B
|
||
MOV M,E ;LOW BYTE
|
||
INX H
|
||
MOV M,D ;HIGH BYTE
|
||
RET
|
||
;
|
||
STKO: ;STACK OPERATOR (REG-A) AND PRIORITY (REG-B)
|
||
PUSH PSW ;SAVE IT
|
||
LXI H,OSP
|
||
MOV A,M
|
||
CPI OSMAX
|
||
JC STKO1
|
||
MVI M,0
|
||
CALL ERREX ;OPERATOR STACK OVERFLOW
|
||
STKO1: MOV E,M ;GET OSP
|
||
MVI D,0
|
||
INR M ;OSP=OSP+1
|
||
POP PSW ;RECALL OPERATOR
|
||
LXI H,OPERV
|
||
DAD D ;OPERV(OSP)
|
||
MOV M,A ;OPERV(OSP)=OPERATOR
|
||
LXI H,HIERV
|
||
DAD D
|
||
MOV M,B ;HIERV(OSP)=PRIORITY
|
||
RET
|
||
;
|
||
LODV1: ;LOAD TOP ELEMENT FROM VSTACK TO H,L
|
||
LXI H,VSP
|
||
MOV A,M
|
||
ORA A
|
||
JNZ LODOK
|
||
CALL ERREX ;UNDERFLOW
|
||
LXI H,0
|
||
RET
|
||
;
|
||
LODOK: DCR M
|
||
DCR M ;VSP=VSP-2
|
||
MOV C,M ;LOW BYTE
|
||
MVI B,0
|
||
LXI H,VSTACK
|
||
DAD B ;VSTACK(VSP)
|
||
MOV C,M ;GET LOW BYTE
|
||
INX H
|
||
MOV H,M
|
||
MOV L,C
|
||
RET
|
||
;
|
||
LODV2: ;LOAD TOP TWO ELEMENTS DE HOLDS TOP, HL HOLDS TOP-1
|
||
CALL LODV1
|
||
XCHG
|
||
CALL LODV1
|
||
RET
|
||
;
|
||
APPLY: ;APPLY OPERATOR IN REG-A TO TOP OF STACK
|
||
MOV L,A
|
||
MVI H,0
|
||
DAD H ;OPERATOR NUMBER*2
|
||
LXI D,OPTAB
|
||
DAD D ;INDEXED OPTAB
|
||
MOV E,M ;LOW ADDRESS
|
||
INX H
|
||
MOV H,M ;HIGH ADDRESS
|
||
MOV L,E
|
||
PCHL ;SET PC AND GO TO SUBROUTINE
|
||
;
|
||
OPTAB: DW MULOP
|
||
DW DIVOP
|
||
DW MODOP
|
||
DW SHLOP
|
||
DW SHROP
|
||
DW ADDOP
|
||
DW SUBOP
|
||
DW NEGOP
|
||
DW NOTOP
|
||
DW ANDOP
|
||
DW OROP
|
||
DW XOROP
|
||
DW ERREX ;(
|
||
;
|
||
; SPECIFIC HANDLERS FOLLOW
|
||
SHFT: ;SET UP OPERANDS FOR SHIFT L AND R
|
||
CALL LODV2
|
||
MOV A,D ;ENSURE 0-15
|
||
ORA A
|
||
JNZ SHERR
|
||
MOV A,E
|
||
CPI 17
|
||
RC ;RETURN IF 0-16 SHIFT
|
||
SHERR: CALL ERREX
|
||
MVI A,16
|
||
RET
|
||
;
|
||
NEGF: ;COMPUTE 0-H,L TO H,L
|
||
XRA A
|
||
SUB L
|
||
MOV L,A
|
||
MVI A,0
|
||
SBB H
|
||
MOV H,A
|
||
RET
|
||
;
|
||
DIVF: CALL LODV2
|
||
DIVE: ;(EXTERNAL ENTRY FROM MAIN PROGRAM)
|
||
XCHG ;SWAP D,E WITH H,L FOR DIVIDE FUNCTION
|
||
; COMPUTE X/Y WHERE X IS IN D,E AND Y IS IN H,L
|
||
; THE VALUE OF X/Y APPEARS IN D,E AND X MOD Y IS IN H,L
|
||
;
|
||
SHLD DTEMP ;SAVE X IN TEMPORARY
|
||
LXI H,BNUM ;STORE BIT COUNT
|
||
MVI M,11H
|
||
LXI B,0 ;INTIALIZE RESULT
|
||
PUSH B
|
||
XRA A ;CLEAR FLAGS
|
||
DLOOP:
|
||
MOV A,E ;GET LOW Y BYTE
|
||
RAL
|
||
MOV E,A
|
||
MOV A,D
|
||
RAL
|
||
MOV D,A
|
||
DCR M ;DECREMENT BIT COUNT
|
||
POP H ;RESTORE TEMP RESULT
|
||
RZ ;ZERO BIT COUNT MEANS ALL DONE
|
||
MVI A,0 ;ADD IN CARRY
|
||
ACI 0 ;CARRY
|
||
DAD H ;SHIFT TEMP RESULT LEFT ONE BIT
|
||
MOV B,H ;COPY HA AND L TO A A ND C
|
||
ADD L
|
||
LHLD DTEMP ;GET ADDRESS OF X
|
||
SUB L ;SUBTRACT FROM TEMPORARY RESULT
|
||
MOV C,A
|
||
MOV A,B
|
||
SBB H
|
||
MOV B,A
|
||
PUSH B ;SAVE TEMP RESULT IN STACK
|
||
JNC DSKIP ;NO BORROW FROM SUBTRACT
|
||
DAD B ;ADD X BACK IN
|
||
XTHL ;REPLACE TEMP RESULT ON STACK
|
||
DSKIP: LXI H,BNUM ;RESTORE H,L
|
||
CMC
|
||
JMP DLOOP ;REPEAT LOOP STEPS
|
||
;
|
||
DTEMP: DS 2
|
||
BNUM: DS 1
|
||
;
|
||
MULF: ;MULTIPLY D,E BY H,L AND REPLACE H,L WITH RESULT
|
||
MOV B,H
|
||
MOV C,L ;COPY OF 1ST VALUE TO B,C FOR SHIFT AND ADD
|
||
LXI H,0 ;H,L IS THE ACCUMULATOR
|
||
MUL0: XRA A
|
||
MOV A,B ;CARRY IS CLEARED
|
||
RAR
|
||
MOV B,A
|
||
MOV A,C
|
||
RAR
|
||
MOV C,A
|
||
JC MUL1 ;SKIP THIS ADD IF LSB IS ZERO
|
||
ORA B
|
||
RZ ;RETURN WITH H,L
|
||
JMP MUL2 ;SKIP ADD
|
||
MUL1: DAD D ;ADD CURRENT VALUE OF D
|
||
MUL2: XCHG ;READY FOR *2
|
||
DAD H
|
||
XCHG
|
||
JMP MUL0
|
||
;
|
||
MULOP: ;MULTIPLY D,E BY H,L
|
||
CALL LODV2
|
||
CALL MULF
|
||
JMP ENDOP
|
||
;
|
||
DIVOP: ;DIVIDE H,L BY D,E
|
||
CALL DIVF
|
||
XCHG ;RESULT TO H,L
|
||
JMP ENDOP
|
||
;
|
||
MODOP: CALL DIVF
|
||
JMP ENDOP
|
||
;
|
||
SHLOP: CALL SHFT ;CHECK VALUES
|
||
SHL0: ORA A ;DONE?
|
||
JZ ENDOP
|
||
DAD H ;HL=HL*2
|
||
DCR A
|
||
JMP SHL0
|
||
;
|
||
SHROP: CALL SHFT
|
||
SHR0: ORA A ;DONE?
|
||
JZ ENDOP
|
||
PUSH PSW ;SAVE CURRENT COUNT
|
||
XRA A
|
||
MOV A,H
|
||
RAR
|
||
MOV H,A
|
||
MOV A,L
|
||
RAR
|
||
MOV L,A
|
||
POP PSW
|
||
DCR A
|
||
JMP SHR0
|
||
;
|
||
ADDOP: CALL LODV2
|
||
ADD0: DAD D
|
||
JMP ENDOP
|
||
;
|
||
SUBOP: CALL LODV2
|
||
XCHG ;TREAT AS HL+(-DE)
|
||
CALL NEGF ;0-HL
|
||
JMP ADD0
|
||
;
|
||
NEGOP: CALL LODV1
|
||
NEG0: CALL NEGF ;COMPUTE 0-HL
|
||
JMP ENDOP
|
||
;
|
||
NOTOP: CALL LODV1
|
||
INX H ;65536-HL = 65535-(HL+1)
|
||
JMP NEG0
|
||
;
|
||
ANDOP: CALL LODV2
|
||
MOV A,D
|
||
ANA H
|
||
MOV H,A
|
||
MOV A,E
|
||
ANA L
|
||
MOV L,A
|
||
JMP ENDOP
|
||
;
|
||
OROP: CALL LODV2
|
||
MOV A,D
|
||
ORA H
|
||
MOV H,A
|
||
MOV A,E
|
||
ORA L
|
||
MOV L,A
|
||
JMP ENDOP
|
||
;
|
||
XOROP: CALL LODV2
|
||
MOV A,D
|
||
XRA H
|
||
MOV H,A
|
||
MOV A,E
|
||
XRA L
|
||
MOV L,A
|
||
;
|
||
ENDOP: JMP STKV
|
||
;
|
||
;
|
||
;
|
||
ENDEXP: ;RETURNS ZERO FLAG IF SYMBOL IS CR, ;, OR ,
|
||
LDA TOKEN
|
||
CPI SPECL
|
||
RNZ ;NOT END IF NOT SPECIAL
|
||
;
|
||
LDA ACCUM
|
||
CPI CR
|
||
RZ
|
||
CPI ';'
|
||
RZ
|
||
CPI ','
|
||
RZ
|
||
CPI '!'
|
||
RET
|
||
;
|
||
OPAND: ;SCAN THE OPERAND FIELD OF AN INSTRUCTION
|
||
; (NOT A DB WITH FIRST TOKEN STRING > 2 OR 0)
|
||
XRA A
|
||
STA OSP ;ZERO OPERATOR STACK POINTER
|
||
STA VSP
|
||
DCR A ;255
|
||
STA UNARY
|
||
LXI H,0
|
||
SHLD EVALUE
|
||
;
|
||
OP0: ;ARRIVE HERE WITH NEXT ITEM ALREADY SCANNED
|
||
CALL ENDEXP ;DONE?
|
||
JNZ OP1
|
||
; EMPTY THE OPERATOR STACK
|
||
EMPOP: LXI H,OSP
|
||
MOV A,M ;GET THE OSP AND CHECK FOR EMPTY
|
||
ORA A
|
||
JZ CHKVAL ;JUMP IF EMPTY
|
||
DCR M ;POP ELEMENT
|
||
MOV E,A ;COPY FOR DOUBLE ADD
|
||
DCR E
|
||
MVI D,0
|
||
LXI H,OPERV
|
||
DAD D ;INDEXED - OPERV(OSP)
|
||
MOV A,M ;GET OPERATOR
|
||
CALL APPLY ;APPLY OPERATOR
|
||
JMP EMPOP
|
||
;
|
||
CHKVAL:
|
||
LDA VSP ;MUST HAVE ONE ELEMENT IT THE STACK
|
||
CPI 2
|
||
CNZ ERREX
|
||
LDA PBUFF
|
||
CPI ' '
|
||
RNZ ;EVALUE REMAINS AT ZERO
|
||
LHLD VSTACK ;GET DOUBLE BYTE IN STACK
|
||
SHLD EVALUE
|
||
RET
|
||
;
|
||
OP1: ;MORE TO SCAN
|
||
LDA PBUFF
|
||
CPI ' '
|
||
JNZ GETOP
|
||
LDA TOKEN
|
||
CPI STRNG ;IS THIS A STRING?
|
||
JNZ OP3
|
||
;
|
||
; STRING - CONVERT TO DOUBLE PRECISION
|
||
LDA ACCLEN
|
||
ORA A
|
||
CZ ERREX ;ERROR IF LENGTH=0
|
||
CPI 3
|
||
CNC ERREX ;ERROR IF LENGTH>2
|
||
MVI D,0
|
||
LXI H,ACCUM
|
||
MOV E,M ;LSBYTE
|
||
INX H
|
||
DCR A ;A HAS THE LENGTH
|
||
JZ OP2 ;ONE OR TWO BYTES
|
||
MOV D,M ;FILL HIGH ORDER
|
||
OP2: XCHG ;VALUE TO H,L
|
||
JMP STNUM ;STORE TO STACK
|
||
;
|
||
OP3: ;NOT A STRING, CHECK FOR NUMBER
|
||
CPI NUMB
|
||
JNZ OP4
|
||
LHLD VALUE ;NUMERIC VALUE
|
||
JMP STNUM
|
||
;
|
||
OP4: ;NOT STRING OR NUMBER, MUST BE ID OR SPECL
|
||
CALL BGET ;BINARY SEARCH, GET ATTRIBUTES
|
||
JNZ OP6 ;MATCH?
|
||
; YES, MAY BE OPERATOR
|
||
CPI OPER+1
|
||
JNC OP5
|
||
; OPERATOR ENCOUNTERED MS NIBBLE OF B IS PRIORITY NUMBER LS NIBBLE
|
||
; IS THE OPERATOR
|
||
; ACC HAS THE OPERATOR NUMBER, B HAS PRIORITY
|
||
CPI LPAR ;(?
|
||
MOV C,A ;SAVE COPY OF OPERATOR NUMBER
|
||
LDA UNARY
|
||
JNZ OPER1 ;JUMP IF NOT A (
|
||
; ( ENCOUNTERED, UNARY MUST BE TRUE
|
||
ORA A
|
||
CZ ERREX
|
||
MVI A,0FFH
|
||
STA UNARY ;UNARY IS SET TRUE
|
||
MOV A,C ;RECOVER OPERATOR
|
||
JMP OPER4 ;CALLS STKO AND SETS UNARY TO TRUE
|
||
;
|
||
;
|
||
OPER1: ;NOT A LEFT PAREN
|
||
ORA A
|
||
JNZ OPER6 ;MUST BE + OR - SINCE UNARY IS SET
|
||
;
|
||
; UNARY NOT SET, MUST BE BINARY OPERATOR
|
||
OPER2: ;COMPARE HIERARCHY OF TOS
|
||
PUSH B ;SAVE PRIORITY AND OPERATOR NUMBER
|
||
LDA OSP
|
||
ORA A
|
||
JZ OPER3 ;NO MORE OPERATORS IN STACK
|
||
MOV E,A ;OSP TO E
|
||
DCR E ;OSP-1
|
||
MVI D,0
|
||
LXI H,HIERV
|
||
DAD D ;HL ADDRESSES TOP OF OPERATOR STACK
|
||
MOV A,M ;PRIORITY OF TOP OPERATOR
|
||
CMP B ;CURRENT GREATER?
|
||
JC OPER3 ;JUMP IF SO
|
||
; APPLY TOP OPERATOR TO VALUE STACK
|
||
LXI H,OSP
|
||
MOV M,E ;OSP=OSP-1
|
||
LXI H,OPERV
|
||
DAD D
|
||
MOV A,M ;OPERATOR NUMBER TO ACC
|
||
CALL APPLY
|
||
POP B ;RESTORE OPERATOR NUMBER AND PRIORITY
|
||
JMP OPER2 ;FOR ANOTHER TEST
|
||
;
|
||
OPER3: ;ARRIVE HERE WHEN OPERATOR IS STACKED
|
||
; CHECK FOR RIGHT PAREN BALANCE
|
||
POP B ;OPERATOR NUMBER IN C, PRIORITY IN B
|
||
MOV A,C
|
||
CPI RPAR
|
||
JNZ OPER4 ;JUMP IF NOT A RIGHT PAREN
|
||
;
|
||
; RIGHT PAREN FOUND, STACK MUST CONTAIN LEFT PAREN TO DELETE
|
||
LXI H,OSP
|
||
MOV A,M
|
||
ORA A ;ZERO?
|
||
JZ LPERR ;PAREN ERROR IF SO
|
||
DCR A ;OSP-1
|
||
MOV M,A ;STORED TO MEMORY
|
||
MOV E,A
|
||
MVI D,0
|
||
LXI H,OPERV
|
||
DAD D
|
||
MOV A,M ;TOP OPERATOR IN REG-A
|
||
CPI LPAR
|
||
JZ NLERR ;JMP IF NO ERROR - PARENS BALANCE
|
||
LPERR: CALL ERREX
|
||
NLERR: ;ERROR REPORTING COMPLETE
|
||
XRA A
|
||
JMP OPER5 ;TO CLEAR UNARY FLAG
|
||
;
|
||
OPER4: ;ORDINARY OPERATOR
|
||
CALL STKO
|
||
MVI A,0FFH ;TO SET UNARY FLAG
|
||
OPER5: STA UNARY
|
||
JMP GETOP ;FOR ANOTHER ELEMENT
|
||
;
|
||
OPER6: ;UNARY SET, MUST BE + OR -
|
||
MOV A,C ;RECALL OPERATOR
|
||
CPI PLUS
|
||
JZ GETOP ;IGNORE UNARY PLUS
|
||
CPI MINUS
|
||
JNZ CHKNOT
|
||
INR A ;CHANGE TO UNARY MINUS
|
||
MOV C,A
|
||
JMP OPER2
|
||
CHKNOT: ;UNARY NOT SYMBOL?
|
||
CPI NOTF
|
||
CNZ ERREX
|
||
JMP OPER2
|
||
;
|
||
;
|
||
OP5: ;ELEMENT FOUND IN TABLE, NOT AN OPERATOR
|
||
CPI PT ;PSEUDO OPERATOR?
|
||
CZ ERREX ;ERROR IF SO
|
||
MOV L,B ;GET LOW VALUE TO L
|
||
MVI H,0 ;ZERO HIGH ORDER BYTE
|
||
JMP STNUM ;STORE IT
|
||
;
|
||
OP6: ;NOT FOUND IN TABLE SCAN, $?
|
||
LDA TOKEN
|
||
CPI SPECL
|
||
JNZ OP7
|
||
LDA ACCUM
|
||
CPI '$'
|
||
JZ CURPC ;USE CURRENT PC
|
||
CALL ERREX
|
||
LXI H,0
|
||
JMP STNUM
|
||
CURPC: LHLD ASPC ;GET CURRENT PC
|
||
JMP STNUM
|
||
;
|
||
OP7: ;NOT $, LOOK IT UP
|
||
CALL LOOKUP
|
||
CALL FOUND
|
||
JNZ FIDENT
|
||
; NOT FOUND IN SYMBOL TABLE, ENTER IF PASS 1
|
||
MVI A,'P'
|
||
CALL PERR
|
||
CALL ENTER ;ENTER SYMBOL WITH ZERO TYPE FIELD
|
||
JMP FIDE0
|
||
FIDENT: CALL GETTY ;TYPE TO H,L
|
||
ANI 111B
|
||
MVI A,'U'
|
||
CZ PERR
|
||
;
|
||
FIDE0:
|
||
CALL GETVAL ;VALUE TO H,L
|
||
;
|
||
STNUM: ;STORE H,L TO VALUE STACK
|
||
LDA UNARY
|
||
ORA A ;UNARY OPERATION SET
|
||
CZ ERREX ;OPERAND ENCOUNTERED WITH UNARY OFF
|
||
XRA A
|
||
STA UNARY ;SET TO OFF
|
||
CALL STKV ;STACK THE VALUE
|
||
;
|
||
GETOP: CALL SCAN
|
||
JMP OP0
|
||
;
|
||
ERREX: ;PUT 'E' ERROR IN OUTPUT BUFFER
|
||
PUSH H
|
||
MVI A,'E'
|
||
CALL PERR
|
||
POP H
|
||
RET
|
||
;
|
||
ENDMOD EQU ($ AND 0FFE0H) + 20H ;NEXT HALF PAGE
|
||
END
|
||
|