Files
erkyrath.infocom-zcode-terps/atari/ops1.dip
Andrew Plotkin b642da811e Initial commit.
2023-11-16 18:19:54 -05:00

155 lines
1.9 KiB
Plaintext

PAGE
SBTTL "--- 1-OPS ---"
; ----
; PUSH
; ----
; PUSH [ARG1] ONTO G-STACK
GPUSH: LDX ARG1+LO
LDA ARG1+HI
JMP PSHXA
; ---
; POP
; ---
; POP Z-STACK INTO VARIABLE [ARG1]
GPOP: JSR POPVAL
JMP DOPUT
; -----
; VALUE
; -----
; RETURN VALUE OF VARIABLE [ARG1]
GVALUE: LDA ARG1+LO ; GET VARIABLE ID
JSR VARGET ; PUT VALUE INTO [VALUE]
JMP PUTVAL
; ---
; INC
; ---
; INCREMENT VARIABLE [ARG1]
GINC: LDA ARG1+LO
JSR VARGET
JSR INCVAL
JMP DOPUT
; ---
; DEC
; ---
; DECREMENT VARIABLE [ARG1]
GDEC: LDA ARG1+LO
JSR VARGET
JSR DECVAL
DOPUT: LDA ARG1+LO
JMP VARPUT
; -----
; ZERO?
; -----
; [ARG1] = 0 ?
GZEROP: LDA ARG1+LO
ORA ARG1+HI
BEQ PYES
JMP PREDF
PYES: JMP PREDS
; ----
; BNOT
; ----
; COMPLEMENT [ARG1]
GBNOT: LDA ARG1+LO
EOR #$FF
TAX
LDA ARG1+HI
EOR #$FF
JMP VEXIT
; ----
; JUMP
; ----
; JUMP TO G-ADDRESS [ARG1]
GJUMP: JSR A12VAL ; MOVE [ARG1] TO [VALUE]
JMP PREDB3 ; A BRANCH THAT ALWAYS SUCCEEDS
; ------
; RETURN
; ------
; RETURN FROM "CALL" WITH VALUE [ARG1]
GRET: LDA OLDGSP
STA GSP ; SYNC THE G-STACK
JSR POPVAL ; POP # LOCALS INTO [X]
TXA ; ANY LOCALS?
BEQ RET2 ; NO, SKIP
; RESTORE ALL PUSHED LOCALS
ASL A ; WORD-ALIGN # LOCALS
STA ADEX ; USE FOR INDEXING
DEC ADEX ; ZERO-ALIGN THE INDEX
RET1: JSR POPVAL ; POP LOCAL INTO [X/A] AND [VALUE]
LDX ADEX ; GET INDEX
STA LOCALS,X ; STORE MSB IN TABLE
DEX
LDA VALUE+LO ; SAME FOR LSB
STA LOCALS,X
DEX
STX ADEX ; SAVE INDEX
BPL RET1 ; LOOP TILL EMPTY
; RESTORE GPC
RET2: JSR POPVAL ; RESTORE [GPC]
;***
STX GPC0 ; DON'T FORGET THAT 17TH BIT
JSR POPVAL
;***
STX GPCL
STA GPCH
LDA #0
STA GPCFLG ; PC HAS CHANGED
JSR POPVAL
STX OLDGSP ; RESTORE OLD GSP
LDX ARG1+LO
LDA ARG1+HI
; FALL THROUGH TO ...
; -----------------
; VALUE RETURN EXIT
; -----------------
; ENTRY: VALUE IN [X/A] (LSB/MSB)
VEXIT: STX VALUE+LO
STA VALUE+HI
JMP PUTVAL
END