Files
TZFS/asm/mz-xz009/EXPR.ASM

2039 lines
41 KiB
NASM
Raw Blame History

; -----------------------------
; MZ-800 BASIC Expression part
; FI:EXPR ver 1.0A 8.25.84
; Programed by T.Miho
; -----------------------------
;
;
INCLD MACRO
;
IBYTE: ENT ;0..255
CALL IDEEXP
DCHECK: ENT
LD A,D
OR A
JP NZ,ER03
LD A,E
RET
;
DEEXP: ENT
CALL EXPR8
REP5 DEC,DE
DEC DE
DEC DE
DEC DE
DEC DE
DEC DE
ENDM
JR STDEFC
;
IDEEXP: ENT ;DE=(HL)
CALL EXPR
STDEFC: ENT
PUSH AF
PUSH HL
EX DE,HL
CALL STROMT
CALL HLFLT
EX DE,HL
POP HL
POP AF
RET
;
STREXP: ENT
CALL EXPR
PUSH AF
CALL STROK
PUSH HL
EX DE,HL
CALL CVTSDC
POP HL
POP AF
RET
;
CVTSDC: ENT
LD B,M
INC HL
LD E,M
INC HL
LD D,M
LD HL,(STRST)
ADD HL,DE
EX DE,HL
LD A,B
RET
SKP H
;
EXPR: ENT
LD DE,(VARED)
LD (TMPEND),DE
EXPRNX: ENT
LD DE,(INTFAC)
PUSH DE
CALL EXPR8
POP DE
RET
;
EXPR8: PUSH DE
LD DE,(TMPEND)
CALL MEMECK
POP DE
;
;
EXPR7: CALL EXPR6
EXPR7L: CP EAH ;XOR
RET NZ
LD A,(PRCSON)
PUSH AF
INC HL
CALL EXPR6
POP BC
PUSH AF
PUSH HL
CALL ADJUST
CALL .XOR.
POP HL
POP AF
JR EXPR7L
;
EXPR6: CALL EXPR5
EXPR6L: CP EBH ;OR
RET NZ
LD A,(PRCSON)
PUSH AF
INC HL
CALL EXPR5
POP BC
PUSH AF
PUSH HL
CALL ADJUST
CALL .OR.
POP HL
POP AF
JR EXPR6L
;
EXPR5: CALL EXPR4
EXPR5L: CP ECH ;AND
RET NZ
LD A,(PRCSON)
PUSH AF
INC HL
CALL EXPR4
POP BC
PUSH AF
PUSH HL
CALL ADJUST
CALL .AND.
POP HL
POP AF
JR EXPR5L
;
EXPR4: TEST1 EDH ;NOT
CALL TEST1
DEFB EDH
ENDM
JR NZ,EXPR3
CALL EXPR3
PUSH AF
PUSH HL
LD HL,-5
ADD HL,DE
CALL .NOT.
POP HL
POP AF
RET
EXPR3: CALL EXPR2
EXPR3L: CP EEH ;><
RET C
PUSH AF ;stk OPC
LD A,(PRCSON)
PUSH AF ;stk OPC, PRCSON
INC HL
CALL EXPR2
POP BC ;stk OPC; B=PRCSON
EX (SP),HL ;stk RJOB; HL=OPC
PUSH AF ;stk RJOB,NEXT
PUSH HL ;stk RJOB,NEXT,OPC
CALL ADJUST
CALL CMP
EX AF,AF' ;AF' = result
POP AF ;stk RJOB,NEXT; A=OPC
CP F6H ;<
JR NZ,NXTCP1
EX AF,AF'
JR C,TRUE
FALSE: LD BC,0
RLBACK: LD M,C
INC HL
LD M,B
INC HL
XOR A
LD M,A
INC HL
LD M,A
INC HL
LD M,A
LD A,5
LD (PRCSON),A
POP AF ;POP NEXT
POP HL ;POP RJOB
JR EXPR3L
;
TRUE: LD BC,8081H
JR RLBACK
;
NXTCP1: CP F5H ;>
JR NZ,NXTCP2
EX AF,AF'
JR Z,FALSE
JR C,FALSE
JR TRUE
;
NXTCP2: CP F4H ;=
JR NZ,NXTCP3
EX AF,AF'
JR Z,TRUE
JR FALSE
;
NXTCP3: CP F2H ;=>,>=
JR C,NXTCP4
EX AF,AF'
JR NC,TRUE
JR FALSE
;
NXTCP4: CP F0H ;=<,<=
JR C,NXTCP5
EX AF,AF'
JR Z,TRUE
JR C,TRUE
JR FALSE
;
NXTCP5: EX AF,AF' ;<>,><
JR Z,FALSE
JR TRUE
;
;
EXPR2: CALL EXPR1
EXPR2L: CP F7H ;+,-
RET C
LD A,(PRCSON)
PUSH AF
INC HL
JR Z,EXPR2A ;+
CALL EXPR1
POP BC
PUSH AF
PUSH HL
CALL ADJUST
CALL SUB
EXPR2X: POP HL
POP AF
JR EXPR2L
EXPR2A: CALL EXPR1
POP BC
PUSH AF
PUSH HL
CALL ADJUST
CALL ADD
JR EXPR2X
;
;
EXPR1: CALL EXPR0
EXPR1L: CP F9H ;MOD, YEN
RET C
LD A,(PRCSON)
PUSH AF
INC HL
JR Z,EXPR1A ;YEN
CALL EXPR0
POP BC
PUSH AF
PUSH HL
CALL ADJUST
CALL MOD
EXPR1X: POP HL
POP AF
JR EXPR1L
EXPR1A: CALL EXPR0
POP BC
PUSH AF
PUSH HL
CALL ADJUST
CALL YEN
JR EXPR1X
;
;
EXPR0: CALL EXPRZ
EXPR0L: CP FBH ;/,*
RET C
LD A,(PRCSON)
PUSH AF
INC HL
JR Z,EXPR0A ;/
CALL EXPRZ
POP BC
PUSH AF
PUSH HL
CALL ADJUST
CALL MUL
EXPR0X: POP HL
POP AF
JR EXPR0L
EXPR0A: CALL EXPRZ
POP BC
PUSH AF
PUSH HL
CALL ADJUST
CALL DIV
JR EXPR0X
;
EXPRZ: TEST1 F7H ;+
CALL TEST1
DEFB F7H
ENDM
JR Z,EXPRZ
CP F8H ;-
JR NZ,EXPRY
INC HL
CALL EXPRY
JR EXPRX2
;
EXPRY: CALL FACTOR
EXPRYL: CP FDH ;^
RET NZ
LD A,(PRCSON)
PUSH AF
INC HL
CALL EXPRX
POP BC
PUSH AF
PUSH HL
CALL ADJUST ;
CALL POWERS ;(HL)^(DE)
POP HL
POP AF
JR EXPRYL
;
EXPRX: TEST1 F7H ;+
CALL TEST1
DEFB F7H
ENDM
JR Z,EXPRX
CP F8H ;-
JR NZ,FACTOR
INC HL
CALL FACTOR
EXPRX2: PUSH AF
PUSH HL
LD HL,-5
ADD HL,DE
CALL NEG
POP HL
POP AF
RET
;
SKP H
FACTOR: CALL ENDCHK
JP Z,ER01
CALL FAC0
JP HLFTCH
;
FAC0: PUSH HL
LD HL,(MEMLMT)
SCF
SBC HL,DE
JP C,ER06 ;TOO COMPLEX EXPR
POP HL
CP E4H ;PI
JR Z,FACPAI
CP 20H
JR NC,VARFNC ;IM 20 ....
;
FACNUM: ENT ;Factor(numeric)
INC HL
CP 15H
JR C,FACINT
CALL LDIR5 ;IM 15
JR FACR5
FACPAI: INC HL
PUSH HL
LD HL,FLTPAI
CALL LDIR5
POP HL
FACR5: LD A,5
FACRX: LD (PRCSON),A
RET
;
FACINT: CP 0BH ;IM 00 .. 14
JR NC,FACI4
DEC A
JP M,ER01 ;IM 00
LD B,0
LD C,A
JR FACI6
;
FACI4: LD C,M ;IM 0B .. 14
INC HL
LD B,M
INC HL
CP 0CH
JR NZ,FACI6
INC BC
INC BC
LD A,(BC)
INC BC
EX AF,AF'
LD A,(BC)
LD B,A
EX AF,AF'
LD C,A
FACI6: PUSH HL
PUSH DE
EX DE,HL
LD E,C
LD D,B
CALL FLTHEX
POP DE
POP HL
LD A,5
FACRX5: REP5 INC,DE
INC DE
INC DE
INC DE
INC DE
INC DE
ENDM
JR FACRX
;
VARFNC: CP '"'
JR NZ,VARFN1
INC HL
PUSH HL
CALL STRLCK ;B=len(HL str.)
EX (SP),HL ;New text point
PUSH HL ;Old text point
LD HL,(TMPEND)
PUSH BC
LD BC,(STRST)
OR A
SBC HL,BC ;HL=OFSET+ADR
POP BC
EX DE,HL
LD M,B ;FAC set len.
INC HL
LD M,E ;FAC set adrs
INC HL
LD M,D
INC HL
INC HL
INC HL
POP DE ;Old text point
PUSH HL ;New expr point
LD HL,(TMPEND)
CALL STRENT ;(HL)_(DE),B
LD (TMPEND),HL
POP DE ;New expr point
POP HL ;New text point
LD A,3
LD (PRCSON),A
RET
;
VARFN1: CP "("
JR NZ,FUNC
INC HL ;( ... )
CALL EXPR8
JP CH29H
;
;
;
FUNC: OR A ;Function
JP P,VARFN2
CP E7H ;SPC ==>
INC HL
JR NZ,FUNC1
LD B,5 ;param is numeric
LD A,A8H ; SPACE$
PUSH AF
JR FUNC2
FUNC1: CP FFH
JP NZ,ER01
LD A,M
INC HL
CP A0H
JP Z,CHR$OP ;CHR$
CP C8H
JP NC,ER01
CP BAH
JR NC,GETJPA ;complex
CP 9CH ;JOY STICK
JR Z,GETJPA
CP 9DH ;JOY STRIG
JP Z,GETJPA
PUSH AF
CP B3H
JR NC,SYSV ;system var
LD B,3
CP ABH
JR NC,FUNC2 ;param is string
LD B,5 ;param is numeric
CP 88H ;RND
JR Z,RNDONL
FUNC2: CALL HCH28H
FUNC4: PUSH BC
CALL EXPR8
CALL CH29H
POP AF
CALL STRCK
FUNC6: POP AF
PUSH DE
PUSH HL
LD HL,-5
ADD HL,DE
CALL GETJPA
POP HL
POP DE
RET
;
;
RNDONL: TEST1 "("
CALL TEST1
DEFB "("
ENDM
JR Z,FUNC4
SYSV: LD A,5
LD (PRCSON),A
PUSH HL
LD HL,FLONE
CALL LDIR5
POP HL
JR FUNC6
SKP H
;
GETJPA: PUSH HL
ADD A,A
LD L,A
LD H,0
LD BC,FJPTBL
ADD HL,BC
LD A,M
INC HL
LD H,M
LD L,A
EX (SP),HL
RET
;
SIZE: ENT
EX DE,HL
LD HL,-527
ADD HL,SP
LD BC,(TMPEND)
OR A
SBC HL,BC
EX DE,HL
JR NC,PUT2B
XOR A
JR PUT1B
;
CSRH: ENT
LD A,(CURX)
JR PUT1B
CSRV: ENT
LD A,(CURY)
JR PUT1B
POSH: ENT
LD DE,(POINTX)
JR PUT2B
POSV: ENT
LD DE,(POINTY)
JR PUT2B
ERR: ENT
LD A,(ERRCOD)
PUT1B: LD E,A
LD D,0
PUT2B: LD A,5
LD (PRCSON),A
JP FLTHEX
;
ERL: ENT
LD DE,(ERRLNO)
CALL FLTHEX
INC HL
BIT 7,M
DEC HL
RET Z
LD DE,FL64K
JP ADD
;
FL64K: DEF5 91,00,00,00,00 ;65536
DEFW 0091H
DEFW 0000H
DEFB 00H
ENDM
SKP H
;
CHR$OP: CALL HCH28H
LD B,0
CHR$LP: PUSH BC ;counter
PUSH DE ;FAC
CALL DEEXP
CALL DCHECK
POP DE ;FAC
POP BC ;counter
PUSH AF ;data
INC B
TEST1 ","
CALL TEST1
DEFB ","
ENDM
JR Z,CHR$LP
CALL CH29H
LD A,B ;length
EXX
LD B,A
LD HL,(TMPEND) ;string start
CALL ADDHLA
LD DE,HL ;string end+1
CALL MEMECK
CHR$4: DEC HL
POP AF ;data
LD M,A
DJNZ CHR$4
EXX
LD A,B ;length
EXX
LD B,A
;
;HL=String start
;DE=String end+1
;B =String length
;DE'=FAC
;HL'=TEXT,??
;
STEXR2: LD (TMPEND),DE
LD DE,(STRST)
OR A
SBC HL,DE
PUSH HL
LD A,B
EXX
EX DE,HL
LD M,A
INC HL
POP BC
LD M,C
INC HL
LD M,B
LD BC,3 ;
ADD HL,BC
STRPRS: EX DE,HL
LD A,3
LD (PRCSON),A
RET
SKP H
;
HEX$: ENT
PUSH HL
CALL HLFLT
CALL HEXHL
SVC .COUNT
RST 3
DEFB .COUNT
ENDM
;
; DE:adrs
; B:length
; (SP):Text pointer
;
PUTSTR: ENT
LD A,B
OR A
JR Z,NULSPC
LD HL,(TMPEND)
PUSH HL
PUSH BC
CALL STRENT
POP BC
EX DE,HL
POP HL
EXX
POP DE
EXX
JR STEXR2
NULSPC: POP HL
CALL CLRFAC
JR STRPRS
;
SPACE$: ENT
PUSH HL
CALL HLINCK
LD B,A
LD C,A
OR A
LD A," "
PUSH DE
CALL NZ,?SETDE
POP DE
LD B,C
JR PUTSTR
;
HLINCK: CALL HLFLT
LD DE,KEYBUF
LD A,H
OR A
JP NZ,ER03
LD A,L
RET
SKP H
;
;
STR$: ENT
PUSH HL
CALL CVNMFL
LD A,(DE)
CP " "
JR NZ,+3
INC DE
SVC .COUNT
RST 3
DEFB .COUNT
ENDM
JR PUTSTR
;
SKP H
EOF: ENT
CALL HCH28H
CALL GETLU
LD B,A
CALL HCH29H
LD A,B
PUSH HL
PUSH DE
SVC .SEGAD
RST 3
DEFB .SEGAD
ENDM
LD DE,-1
JR C,EOF2
INC HL
BIT ##EOF,M
JR NZ,EOF2
LD DE,0
EOF2: POP HL
CALL FLTHEX
LD A,5
LD (PRCSON),A
EOF8: REP5 INC,HL
INC HL
INC HL
INC HL
INC HL
INC HL
ENDM
EX DE,HL
POP HL
RET
;
POINT: ENT
CALL HCH28H
PUSH DE ;EXPR pointer
CALL DEEXP ;X
LD BC,DE ;X
POP DE ;EXPR pointer
PUSH DE ;EXPR pointer
PUSH BC ;X
CALL CH2CH
CALL DEEXP ;Y
CALL CH29H
EX (SP),HL ;HL=X
EX DE,HL
SVC .POINT
RST 3
DEFB .POINT
ENDM
INC A
JP Z,ER03 ;Out of range
DEC A
POP DE ;TEXT pointer
POP HL ;EXPR pointer
PUSH DE ;TEXT pointer
CALL PUT1B
JR EOF8
SKP H
;
ASC: ENT
PUSH HL
CALL CVTSDC
OR A
JR Z,+3
LD A,(DE)
JR LEN2
;
LEN: ENT
PUSH HL
CALL CVTSDC
LEN2: POP HL
JP PUT1B
;
VAL: ENT
PUSH HL
CALL CVTSDC
LD HL,(TMPEND)
PUSH HL
CALL STRENT
LD M,0
POP DE
POP HL
JP CVFLAS
SKP H
;
LEFT$: ENT
CALL CH28EX
CALL CH29H
CALL BCHECK
EX DE,HL
LD A,M
CP C
JR NC,+3
LD C,A
LD M,C
LD BC,5
FACSTR: LD A,3
ADD HL,BC
EX DE,HL
LD (PRCSON),A
JP HLFTCH
;
RIGHT$: ENT
CALL CH28EX
CALL CH29H
CALL BCHECK
EX DE,HL
LD A,M
SUB C
JR NC,MID$EE
XOR A
LD C,M
MID$EE: LD M,C
INC HL
ADD A,M
LD M,A
INC HL
JR NC,+3
INC M
LD BC,3 ;
JR FACSTR
SKP H
;
MID$: ENT
CALL CH28EX
CALL BCHECK
OR A
JP Z,ER03
PUSH AF
TEST1 ")"
CALL TEST1
DEFB ")"
ENDM
LD A,FFH
JR Z,MID$2
CALL HCH2CH
PUSH DE
EX DE,HL
LD BC,5
ADD HL,BC
EX DE,HL
CALL DEEXP
CALL CH29H
CALL DCHECK
POP DE
MID$2: POP BC
LD C,A
EX DE,HL
LD A,M
SUB B
JR C,MIDNUL
INC A
CP C
JR NC,+3
LD C,A
LD A,B
DEC A
JR MID$EE
;
MIDNUL: XOR A
LD C,A
JR MID$EE
;
BCHECK: LD A,B
OR A
JP NZ,ER03
LD A,C
RET
;
CH28EX: CALL HCH28H
PUSH DE
CALL EXPR8
CALL CH2CH
CALL STROK
CALL DEEXP
LD C,E
LD B,D
POP DE
RET
SKP H
;
TI$: ENT
PUSH HL
PUSH DE
LD HL,(TMPEND)
PUSH HL
LD A,"0"
LD B,6
CALL ?SETHL
SVC .TIMRD ;A,DE
RST 3
DEFB .TIMRD
ENDM
POP HL
OR A
JR Z,TI$2
INC M
INC HL
INC M
INC M
DEC HL
TI$2: EX DE,HL
LD BC,8CA0H ;10H
CALL CLDGIT
LD BC,E10H ;1H
CALL CLDGIT
CP 3AH
JR C,TI$4
SUB 10
DEC DE
LD (DE),A
DEC DE
LD A,(DE)
INC A
LD (DE),A
INC DE
INC DE
TI$4: DEC DE
DEC DE
LD A,(DE)
INC DE
LD B,A
LD A,(DE)
INC DE
LD C,A
LD A,B
CP 32H
JR NZ,TI$6
LD A,C
CP 34H
JR NZ,TI$6
LD HL,(TMPEND)
LD A,"0"
LD B,6
CALL ?SETHL
JR TI$8
TI$6: LD BC,258H ;10M
CALL CLDGIT
LD BC,3CH ;1M
CALL CLDGIT
LD BC,0AH ;10S
CALL CLDGIT
LD A,30H
ADD A,L
LD (DE),A
TI$8: LD HL,(TMPEND)
LD DE,6
EX DE,HL
ADD HL,DE
LD (TMPEND),HL
EX DE,HL
LD DE,(STRST)
OR A
SBC HL,DE
EX DE,HL
POP HL
LD M,6
INC HL
LD M,E
INC HL
LD M,D
INC HL
INC HL
INC HL
EX DE,HL
POP HL
LD A,3
LD (PRCSON),A
JP HLFTCH
;
CLDGIT: OR A
SBC HL,BC
JR C,CLDGRT
LD A,(DE)
INC A
LD (DE),A
JR CLDGIT
CLDGRT: ADD HL,BC
INC DE
RET
;
TIMDAI: ENT
TESTX F4H ;TI$=....
CALL TESTX
DEFB F4H
ENDM
CALL STREXP
LD A,B
CP 6
JP NZ,ER03
PUSH HL
PUSH DE
LD HL,0
CALL TIMASC
CP 24
JP NC,ER03
CP 12
LD A,0
JR C,TIMDA2
PUSH DE
LD DE,12
OR A
SBC HL,DE
POP DE
INC A
TIMDA2: PUSH AF
CALL TIMASC
CP 60
JP NC,ER03
CALL TIMASC
CP 60
JP NC,ER03
POP AF
EX DE,HL
SVC .TIMST
RST 3
DEFB .TIMST
ENDM
POP DE
POP HL
RET
;
TIMASC: PUSH DE
LD D,H
LD E,L
ADD HL,HL
ADD HL,HL
ADD HL,DE
LD D,H
LD E,L
ADD HL,HL
ADD HL,DE
ADD HL,HL
ADD HL,HL
POP DE
LD A,(DE)
INC DE
SUB 30H
JP C,ER03
CP 0AH
JP NC,ER03
PUSH BC
LD C,A
ADD A,A
ADD A,A
ADD A,C
ADD A,A
LD C,A
LD A,(DE)
INC DE
SUB 30H
JP C,ER03
CP 0AH
JP NC,ER03
ADD A,C
LD C,A
LD B,0
ADD HL,BC
POP BC
RET
SKP H
;
INTGTV: ENT
LD DE,(VARED)
LD (TMPEND),DE
LD DE,(INTFAC)
GETVAR: PUSH DE
CALL VSRTST
GETFNV: LD A,M
CP "("
JP Z,ARRAY
PUSH HL
CALL CHVRNM
JR NC,CRNVAR
LD A,C
LD C,L
LD B,H
POP HL
POP DE
RET
;
CRNVAR: LD A,(DE)
ADD A,C ;VAR.LEN.+TYPE
ADD A,2
PUSH BC
EX DE,HL
LD HL,(TMPEND)
PUSH HL
OR A
SBC HL,DE
INC HL
LD C,L
LD B,H
POP HL
PUSH DE
EX DE,HL
LD L,A
LD H,0
ADD HL,DE
EX DE,HL
CALL MEMECK
LDDR
LD E,A
LD D,0
SVC .ADDP2
RST 3
DEFB .ADDP2
ENDM
POP HL
POP BC
LD DE,KEYBUF
LD M,C ;TYPE SET
INC HL
SCF
SBC A,C ;B=A-C-1
LD B,A
VARSL1: LD A,(DE) ;VAR.LEN.&NAME
LD M,A
INC DE
INC HL
DJNZ VARSL1
PUSH HL
LD B,C
CALL ?CLRHL ;VAR.CLR
LD M,A ;VAR.END MARK
LD A,C
POP BC
POP HL
POP DE
RET
;
VSRTST: CALL HLFTCH
SUB "A"
CP 26
JP NC,ER01
LD DE,KEYBUF
LD B,0
VSRTS1: INC DE
LD A,M
CALL TSTVAR
JR C,TSTTYP
LD (DE),A
INC B
LD A,B
CP 3
JR C,+3
DEC B
INC HL
JR VSRTS1
TSTTYP: LD DE,KEYBUF
EX DE,HL
LD M,B
EX DE,HL
LD C,5
CP 24H ;$
RET NZ
LD C,3
INC HL
RET
;
ADJUST: LD HL,-5
EX DE,HL
ADD HL,DE
EX DE,HL
ADD HL,DE
LD A,B
JP STRCK
;
;
STRLCK: LD B,FFH
STRLL1: INC B
LD A,M
OR A
RET Z
INC HL
CP '"'
RET Z
JR STRLL1
;
STRENT: ENT
LD A,B
OR A
RET Z
CALL LDHLDE
EX DE,HL
CALL MEMECK
EX DE,HL
RET
;
;
MEMECK: ENT ;SBC SP,DE
PUSH HL
LD HL,-512
ADD HL,SP
SBC HL,DE
POP HL
RET NC
JP ER06'
;
;
;
; PUSH DE
; KEYBUF..LEN. NAME
; HL=(
;
ARRAY0: LD DE,(INTFAC)
PUSH DE
JR ARRAY2
;
ARRAY: XOR A
LD (AUTDIM),A
INC HL
LD (ARYTXT),HL
ARRAY2: LD B,0
EXX
POP HL ;POP FAC
PUSH HL ;PUSH FAC
PUSH HL ;PUSH FAC1
LD HL,(TMPEND)
LD DE,KEYBUF
PUSH HL
LD A,(DE)
LD M,A
INC DE
INC HL
LD B,A
CALL STRENT
POP DE
LD (TMPEND),HL
LD HL,(STRST)
EX DE,HL
OR A
SBC HL,DE
EX (SP),HL ;NAME ADR.
PUSH HL ;PUSH FAC1
EXX
TSALOP: POP DE ;POP FAC1
PUSH DE ;PUSH FAC1
PUSH BC ;PUSH B,TYPE(C)
LD BC,(ARYTXT)
LD A,(AUTDIM)
PUSH BC
PUSH AF
LD BC,(DGBF00)
PUSH BC
CALL DEEXP ;<3B><>DE=EXP(INT)
BIT 7,D
JP NZ,ER03
EX AF,AF'
POP BC
LD (DGBF00),BC
POP AF
LD (AUTDIM),A
POP BC
LD (ARYTXT),BC
EX AF,AF'
INC HL
CP ")"
JR Z,TSFARY
CP ","
JP NZ,ER01
POP BC ;POP B,TYPE(C)
INC B ;(.,.,.,.)
LD A,B
CP 4
JP NC,ER03
EXX
POP HL ;POP FAC1
POP DE ;POP NAME ADR.
EXX
PUSH DE ;ANS
EXX
PUSH DE ;PUSH NAME ADR.
PUSH HL ;PUSH FAC1
EXX
JR TSALOP
;
TSFARY: POP BC ;POP B,TYPE(C)
EXX
POP HL ;POP FAC1
POP DE ;POP NAME ADR.
EXX
INC B ;ARRAY POINT
PUSH DE ;ANS
PUSH HL ;PUSH TEXT POINT
EXX
LD HL,(STRST)
ADD HL,DE
LD B,M
INC B
LD DE,KEYBUF
CALL LDDEHL
EXX
SET 7,C
CALL CHVRNM
RES 7,C
JR NC,ARYDIM
LD A,B
CP M
JP NZ,ER07 ;DUPLICATE
;LD A,(AUTDIM)
;OR A
;JP NZ,ER07
INC HL
EX DE,HL
POP HL
LD (DGBF00),HL ;TEXT END
EXX
LD HL,0000H
EXX
EX DE,HL
ADRCL: LD E,M
INC HL
LD D,M
INC HL
EX (SP),HL
PUSH DE
EXX
POP DE
CALL DIMMUL
EXX
PUSH HL
OR A
SBC HL,DE
JP NC,ER03
EXX
POP DE
CALL DIMADD
EXX
POP HL
DJNZ ADRCL
PUSH HL
EXX
LD A,C
LD D,B
BIT 6,A
JR NZ,VARDIM
AND 0FH
LD E,A
PUSH AF
CALL DIMMUL
PUSH HL
EXX
POP BC
POP AF
POP HL
ADD HL,BC
LD C,L
LD B,H
VARDME: LD HL,(DGBF00)
POP DE
RET
;
VARDIM: LD E,M
INC HL
LD D,M
POP HL
LD C,L
LD B,H
LD M,E
INC HL
LD M,D
AND 0FH
JR VARDME
;
;
ARYDIM: EXX
LD A,(AUTDIM)
OR A
JP Z,ER03
POP HL ;TEXT POINT
LD (DGBF00),HL
EXX
LD DE,(TMPEND)
LD L,B
LD H,0
ADD HL,HL
ADD HL,DE
EX DE,HL
INC DE
CALL MEMECK
LD M,B
INC HL
EXX
LD HL,1
EXX
ADRCL': POP DE
LD A,(AUTDIM)
OR A
JR NZ,ADRC''
PUSH HL ;1
EX DE,HL
LD DE,10
SCF
SBC HL,DE
JP NC,ER03
POP HL ;1
ADRC'': INC DE
LD M,E
INC HL
LD M,D
INC HL
PUSH DE
EXX
POP DE
CALL DIMMUL
EXX
DJNZ ADRCL'
LD E,C
LD D,0
PUSH BC
PUSH DE
EXX
POP DE
CALL DIMMUL
PUSH HL
EXX
POP BC
PUSH BC ;2 A*B*C*D
EX DE,HL
LD HL,(TMPEND) ;(.,.,.)*2
LD L,M
LD H,0
ADD HL,HL
LD A,(KEYBUF) ;+NAME
ADD A,5 ;+TY+LN+NL+(.,.)
ADD A,L
LD L,A
LD A,0
ADC A,H
LD H,A
JR C,DIMOVM
ADD HL,BC
JR C,DIMOVM
PUSH HL ;3 LEN
ADD HL,DE ;+TEMPEND
DIMOVM: JP C,ER06'
EX DE,HL
CALL MEMECK
PUSH HL ;4 TMPEND
EXX
POP HL ;4 TMPEND
LD BC,(STRST) ;VAR END
DEC BC
OR A
SBC HL,BC
PUSH HL ;4 TRANS LEN
EXX
POP BC ;4 TRANS LEN
LDDR
POP DE ;3 LEN
SVC .ADDP2
RST 3
DEFB .ADDP2
ENDM
POP BC ;2 CLR LEN
PUSH DE ;2 LEN
EXX
POP DE ;2 LEN
LD H,B
LD L,C
POP BC ;1 TYPE
LD A,C
OR 80H
LD M,A
INC HL
DEC DE
LD M,E
INC HL
LD M,D
INC HL
LD DE,KEYBUF
LD A,(DE)
INC A
LD B,A
CALL LDHLDE
LD DE,(TMPEND)
LD A,(DE)
LD M,A
INC HL
INC DE
ADD A,A
LD B,A
CALL LDHLDE
PUSH HL
EXX
POP HL
DIMCLR: XOR A
LD M,A
INC HL
DEC BC
LD A,B
OR C
JR NZ,DIMCLR
LD M,A
EXX
POP DE
LD A,(AUTDIM)
OR A
JR Z,VARCUL
LD HL,(DGBF00)
RET
;
VARCUL: LD HL,(ARYTXT)
PUSH DE
JP ARRAY2
SKP H
;
DIM: ENT
LD A,FFH
LD (AUTDIM),A
NXTDIM: CALL VSRTST
LD A,M
CALL CH28H
CALL ARRAY0
CALL HLFTCH
CP ","
RET NZ
INC HL
JR NXTDIM
;
DIMADD: ADD HL,DE
RET NC
JR SORDIM
;
DIMMUL: PUSH BC
EX DE,HL
LD C,L
LD A,H
LD HL,0
CALL DMMULS
LD A,C
CALL DMMULS
POP BC
RET
;
DMMULS: OR A
JR Z,SKPMUL
LD B,8
DMMULP: ADD HL,HL
JR C,SORDIM
RLCA
JR NC,DMMULE
ADD HL,DE
JR C,SORDIM
DMMULE: DJNZ DMMULP
RET
;
SKPMUL: LD A,H
LD H,L
LD L,0
OR A
RET Z
SORDIM: JP ER06
;
;
ARYTXT: DEFS 2
AUTDIM: DEFS 1
SKP H
;
VARFN2: SUB "A"
CP 26
JP NC,ER01
LD BC,(FNVRBF)
LD A,B
OR C
JR NZ,FNGTVR
CALL GETVAR
FNGTV2: PUSH DE
PUSH HL
LD L,C
LD H,B
LD B,A
LD C,A
CALL LDDEHL
POP HL
LD A,C
POP DE
JP FACRX5
;
FNGTVR: PUSH DE
CALL VSRTST
PUSH HL
INC B
LD DE,KEYBUF
LD HL,(TMPEND)
CALL STRENT
LD B,0
LD HL,(FNVRBF)
CALL HLFTCH
CP F4H
JR Z,FNSHNO
CP "("
JR NZ,SERROL ;<3B><>JP NZ,ER01
FNGTL1: INC HL
INC B
PUSH BC
CALL VSRTST
LD A,C
POP DE
CP E ;TYPE
LD C,E ;<3B><>
JR NZ,FNGTL2
PUSH DE
LD C,B
INC C
PUSH HL
LD HL,(TMPEND)
LD DE,KEYBUF
CALL HLDECK
POP HL
POP BC
JR Z,FNSHOK
FNGTL2: CALL HLFTCH
CP ")"
JR Z,FNSHNO
CP ","
JR Z,FNGTL1 ;<3B><><EFBFBD>
SERROL: JP ER01 ;<3B><>
FNSHNO: LD HL,(TMPEND)
LD DE,KEYBUF
LD A,M
LD (DE),A
LD B,A
INC HL
INC DE
LD A,M
LD (DE),A
DJNZ -4
POP HL
POP DE
CALL FNGTV1
JR FNGTV2
;
FNSHOK: LD HL,(FNTXBF)
CALL HCH28H
DEC B
JR Z,FNSH13
DEC HL
FNSH11: PUSH BC
FNSH12: CALL IFSKSB
CALL ENDCHK
JP Z,ER01
CP ")"
JP Z,ER01
CP ","
JR NZ,FNSH12
POP BC
DJNZ FNSH11
INC HL
FNSH13: EX DE,HL
POP HL
EX (SP),HL
EX DE,HL
LD BC,(FNVRBF)
PUSH BC
LD BC,0
LD (FNVRBF),BC
CALL EXPR8
POP HL
LD (FNVRBF),HL
POP HL
JP HLFTCH
;
FNGTV1: PUSH DE
JP GETFNV
SKP H
;
CHVRNM: ENT
LD HL,(VARST)
ASLOP: LD DE,KEYBUF
LD A,M
OR A
RET Z
CP 40H
JR NC,ARYATA
CP C
JR NZ,SKIPUS
INC HL
LD A,(DE)
CP M
JR NZ,SKIPU2
LD B,A
VARCL1: INC DE
INC HL
LD A,(DE) ;<3B><>
CP M ;<3B><>
;CALL NZ,SMALCH
JR NZ,SKIPU3
DJNZ VARCL1
INC HL
SCF
RET
SKIPU3: INC HL
DJNZ SKIPU3
LD A,C
JR ARSKFN
SKIPU2: LD A,C
DEC HL
SKIPUS: AND 0FH ;TYPE
INC HL
ADD A,M ;NAME LEN.
INC HL
ARSKFN: LD E,A
LD D,0
ADD HL,DE
JR ASLOP
;
;
ARYATA: CP C ;TYPE
JR Z,ARMSN1
INC HL
MIDNAM: LD E,M
INC HL
LD D,M
DEC HL
ADD HL,DE
JR ASLOP
;
NXTVR1: LD A,C
SUB B
CPL
LD C,A
LD B,FFH
ADD HL,BC
POP BC
NXTVR: DEC HL
DEC HL
JR MIDNAM
;
;
ARMSN1: LD A,M
EXX
LD C,A
LD B,00H
EXX
INC HL
PUSH DE
LD E,M
INC HL
LD D,M
INC HL
EX DE,HL
ADD HL,DE
;LD (ARYEDA),HL
EX DE,HL
POP DE
LD A,(DE)
CP M ;NAME LEN.
JR NZ,NXTVR
PUSH BC
LD B,A
LD C,A
AYNMCK: INC HL
INC DE
LD A,(DE) ;<3B><>
CP M ;<3B><>
JR NZ,NXTVR1
DJNZ AYNMCK
INC HL
POP BC
SCF
RET
SKP H
;
DEFFN: ENT
CALL VSRTST
SET 6,C
PUSH HL
CALL CHVRNM
JP C,ER07 ;ARY DEF ERR
LD M,C
EX (SP),HL
PUSH HL
DEC HL
FNSKP1: CALL IFSKSB
OR A
JR Z,FNSKED
CP 3AH ;:
JR NZ,FNSKP1
FNSKED: POP DE
PUSH HL
INC HL
SBC HL,DE
LD A,(KEYBUF)
ADD A,4
LD C,A
LD B,0
LD A,L
ADD HL,BC
LD B,A
PUSH HL
EXX
POP BC
PUSH BC
PUSH HL
PUSH DE
PUSH BC
LD HL,0
ADD HL,SP
LD DE,(TMPEND)
DEC H
OR A
SBC HL,DE
LD A,12
JP C,NESTER
POP BC
POP DE
POP HL
LD HL,(TMPEND)
PUSH HL
ADD HL,BC
EX (SP),HL
PUSH HL
LD DE,(STRST) ;VAR END
OR A
SBC HL,DE
LD C,L
LD B,H
POP HL
POP DE
LDDR
POP DE
SVC .ADDP2
RST 3
DEFB .ADDP2
ENDM
DEC DE
POP HL
EX (SP),HL
INC HL
LD M,E
INC HL
LD M,D
INC HL
LD DE,KEYBUF
LD A,(DE)
LD M,A
LD B,A
INC DE
INC HL
LD A,(DE)
LD M,A
DJNZ -4
INC HL
PUSH HL
EXX
POP HL
CALL LDHLDE
LD M,0
POP HL
RET
;
FNEXP: ENT
PUSH DE
CALL VSRTST
POP IX
PUSH BC
SET 6,C
LD DE,(FNTXBF)
LD (FNTXBF),HL
PUSH DE
CALL CHVRNM
JP NC,ER15 ;UNDEF FN
LD DE,(FNVRBF)
LD (FNVRBF),HL
PUSH DE
PUSH IX
DEC HL
FNEQSK: CALL IFSKSB
CALL ENDCHK
JP Z,ER01
CP F4H ;=
JR NZ,FNEQSK
INC HL
POP DE
PUSH DE
CALL EXPR8
POP DE
LD HL,(FNTXBF)
POP BC
LD (FNVRBF),BC
POP BC
LD (FNTXBF),BC
EX DE,HL
POP BC
LD A,C
CALL STRCK
LD BC,5
ADD HL,BC
EX DE,HL
CALL HLFTCH
CP "("
RET NZ
PUSH DE
LD B,1
SK29LP: PUSH BC
CALL IFSKSB
POP BC
CALL ENDCK0
JP Z,ER01
CP "("
JR NZ,+3
INC B
CP ")"
JR NZ,SK29LP
DJNZ SK29LP
INC HL
CALL HLFTCH
POP DE
RET
;
STRCK: CP 3
JR NZ,STROMT
STROK: ENT
LD A,(PRCSON)
CP 3
RET Z
JP ER04 ;TYPE MISMATCH
STROMT: ENT
LD A,(PRCSON)
CP 3
RET NZ
JP ER04
;
FNVRBF: ENT
DEFW 0
FNTXBF: DEFS 2
SKP H
;
;
;
HLDECK: LD A,(DE)
CP M
RET NZ
PUSH BC
PUSH DE
PUSH HL
LD B,C
HLDEC1: LD A,(DE)
CP M
JR NZ,HLDEC2
INC DE
INC HL
DJNZ HLDEC1
XOR A
HLDEC2: POP HL
POP DE
POP BC
RET
;
; Joy stick command
;
STCK: ENT
CALL HCH28H
PUSH DE
CALL DEEXP
CALL DCHECK
CP 3
JP NC,ER03
POP DE
PUSH AF
CALL HCH29H
POP AF
SVC .STICK
RST 3
DEFB .STICK
ENDM
EX DE,HL
PUSH DE
CALL PUT1B
JP EOF8
;
STIG: ENT
CALL HCH28H
PUSH DE
CALL DEEXP
CALL DCHECK
CP 5
JP NC,ER03
POP DE
PUSH AF
CALL HCH29H
POP AF
SVC .STRIG
RST 3
DEFB .STRIG
ENDM
EX DE,HL
PUSH DE
CALL PUT1B
JP EOF8
;
END