mirror of
https://github.com/erkyrath/infocom-zcode-terps.git
synced 2026-01-22 18:31:55 +00:00
173 lines
3.2 KiB
Plaintext
173 lines
3.2 KiB
Plaintext
PAGE
|
|
SBTTL "--- MAIN LOOP ---"
|
|
|
|
MLOOP: JSR ROMOUT ; FOR SAFETY
|
|
DEC RAND2 ; RANDOMNESS
|
|
DEC RAND2
|
|
|
|
CLR ARGCNT ; RESET # ARGUMENTS
|
|
JSR NEXTPC ; GET NEXT Z-BYTE
|
|
STA OPCODE ; SAVE OPCODE
|
|
|
|
IF DEBUG
|
|
LDB #'0'
|
|
JSR DOBUG
|
|
LDA OPCODE
|
|
ENDIF
|
|
|
|
LBPL OP2 ; 2-OP IF POSITIVE
|
|
CMPA #176
|
|
BLO OP1 ; IT'S A 1-OP
|
|
CMPA #192
|
|
BLO OP0 ; IF NOT A 0-OP ...
|
|
|
|
; HANDLE AN X-OP
|
|
|
|
OPEXT: JSR NEXTPC ; GET ARGUMENT BYTE
|
|
STA TEMP2 ; HOLD IT HERE
|
|
CLR TEMP2+1 ; INIT LOOP INDEX
|
|
BRA OPX1
|
|
|
|
OPX0: LDA TEMP2 ; GRAB ARG BYTE
|
|
ASLA ; SHIFT TO BITS 7 & 6
|
|
ASLA
|
|
STA TEMP2 ; SAVE RESULT
|
|
|
|
OPX1: ANDA #%11000000 ; MASK OUT GARBAGE
|
|
BNE OPX2
|
|
JSR GETLNG ; 00 = LONG IMMEDIATE
|
|
BRA OPXNXT
|
|
|
|
OPX2: CMPA #%01000000
|
|
BNE OPX3
|
|
JSR GETSHT ; 01 = SHORT IMMEDIATE
|
|
BRA OPXNXT
|
|
|
|
OPX3: CMPA #%10000000
|
|
BNE OPX4 ; 11 = NO MORE VARIABLES
|
|
JSR GETVAR ; 10 = VARIABLE
|
|
|
|
OPXNXT: LDB TEMP2+1 ; GET INDEX
|
|
LDX #ARG1 ; BASE ADDR OF ARGS
|
|
ABX ; ADD OFFSET IN B
|
|
LDD TEMP ; GRAB THE ARGUMENT'S VALUE
|
|
STD ,X ; AND SAVE IT
|
|
INC ARGCNT ; KEEP TRACK
|
|
INC TEMP2+1 ; UPDATE
|
|
INC TEMP2+1 ; ARGUMENT INDEX
|
|
LDA TEMP2+1 ; DONE 4 ARGS YET?
|
|
CMPA #8
|
|
BLO OPX0 ; NO, KEEP GRABBING
|
|
|
|
; DISPATCH THE X-OP
|
|
|
|
OPX4: LDB OPCODE ; RETRIEVE THE OPCODE
|
|
CMPB #224 ; IS IT AN EXTENDED 2-OP?
|
|
LBLO OP2EX ; YES, HANDLE LIKE A 2-OP
|
|
ANDB #%00011111 ; ELSE ISOLATE OP BITS
|
|
CMPB #NOPSX ; COMPARE TO LEGAL # OF X-OPS
|
|
BLO DISPX ; CONTINUE IF OKAY
|
|
|
|
; *** ERROR #1 -- ILLEGAL X-OP ***
|
|
|
|
LDA #1
|
|
JSR ZERROR
|
|
|
|
DISPX: LDX #OPTX ; X-OP DISPATCH TABLE
|
|
DODIS: ASLB ; FORM A WORD-OFFSET INTO IT
|
|
ABX ; ADD THE OFFSET
|
|
|
|
IF DEBUG
|
|
PSHS X
|
|
LDB #'1'
|
|
JSR DOBUG
|
|
PULS X
|
|
ENDIF
|
|
|
|
JSR [,X] ; HANDLE THE OPCODE
|
|
JMP MLOOP ; AND GO BACK FOR ANOTHER
|
|
|
|
; HANDLE A 0-OP
|
|
|
|
OP0: LDX #OPT0 ; 0-OP DISPATCH TABLE
|
|
LDB OPCODE ; FETCH OPCODE
|
|
ANDB #%00001111 ; ISOLATE OP BITS
|
|
CMPB #NOPS0 ; OPCODE OUT OF RANGE?
|
|
BLO DODIS ; NO, GO DISPATCH IT
|
|
|
|
; *** ERROR #2 -- ILLEGAL 0-OP ***
|
|
|
|
LDA #2
|
|
JSR ZERROR
|
|
|
|
; HANDLE A 1-OP
|
|
|
|
OP1: ANDA #%00110000 ; ISOLATE ARG BITS
|
|
BNE OP1A
|
|
JSR GETLNG ; 00 = LONG IMMEDIATE
|
|
BRA OP1EX
|
|
|
|
OP1A: CMPA #%00010000
|
|
BNE OP1B
|
|
JSR GETSHT ; 01 = SHORT IMMEDIATE
|
|
BRA OP1EX
|
|
|
|
OP1B: CMPA #%00100000
|
|
BEQ OP1C
|
|
|
|
; *** ERROR #3 -- ILLEGAL 1-OP ***
|
|
|
|
BADOP1: LDA #3
|
|
JSR ZERROR
|
|
|
|
OP1C: JSR GETVAR ; 10 = VARIABLE
|
|
|
|
OP1EX: LDD TEMP
|
|
STD ARG1 ; GRAB THE ARGUMENT
|
|
INC ARGCNT ; ONE ARGUMENT
|
|
LDX #OPT1 ; ADDR OF 1-OP DISPATCH TABLE
|
|
LDB OPCODE ; RESTORE OPCODE
|
|
ANDB #%00001111 ; ISOLATE OP BITS
|
|
CMPB #NOPS1 ; IF OPCODE OUT OF RANGE,
|
|
BHS BADOP1 ; REPORT IT
|
|
BRA DODIS ; ELSE DISPATCH THE 1-OP
|
|
|
|
; HANDLE A 2-OP
|
|
|
|
OP2: ANDA #%01000000 ; ISOLATE 1ST ARG BIT
|
|
BNE OP2A
|
|
JSR GETSHT ; 0 = SHORT IMMEDIATE
|
|
BRA OP2B
|
|
|
|
OP2A: JSR GETVAR ; 1 = VARIABLE
|
|
|
|
OP2B: LDD TEMP ; GRAB VALUE
|
|
STD ARG1 ; SAVE IN ARG1
|
|
INC ARGCNT
|
|
|
|
LDA OPCODE ; RESTORE OPCODE
|
|
ANDA #%00100000 ; ISOLATE 2ND ARG BIT
|
|
BNE OP2C
|
|
JSR GETSHT ; 0 = SHORT IMMEDIATE
|
|
BRA OP2D
|
|
|
|
OP2C: JSR GETVAR ; 1 = VARIABLE
|
|
|
|
OP2D: LDD TEMP ; GRAB 2ND VALUE
|
|
STD ARG2 ; STORE AS ARG2
|
|
INC ARGCNT
|
|
|
|
OP2EX: LDX #OPT2 ; ADDR OF 2-OP DISPATCH TABLE
|
|
LDB OPCODE ; RESTORE YET AGAIN
|
|
ANDB #%00011111 ; ISOLATE OP BITS
|
|
CMPB #NOPS2 ; OPCODE IN RANGE?
|
|
LBLO DODIS ; YES, GO DISPATCH IT
|
|
|
|
; *** ERROR #4 -- ILLEGAL 2-OP ***
|
|
|
|
BADOP2: LDA #4
|
|
JSR ZERROR
|
|
|
|
END
|
|
|