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