mirror of
https://github.com/erkyrath/infocom-zcode-terps.git
synced 2026-05-02 06:35:43 +00:00
Initial commit.
This commit is contained in:
172
colorcomputer/main.src
Normal file
172
colorcomputer/main.src
Normal file
@@ -0,0 +1,172 @@
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user