mirror of
https://github.com/erkyrath/infocom-zcode-terps.git
synced 2026-01-11 23:43:24 +00:00
129 lines
3.9 KiB
Plaintext
129 lines
3.9 KiB
Plaintext
SUBTTL MAINLOOP
|
|
PAGE
|
|
|
|
;MAIN INSTRUCTION INTERPRETATION LOOP
|
|
PUBLIC NXTINS,NXI0A$,NXI0B$,NXI0C$,NXI1$,NXI2$,NXI3$,NXI4$,NXI5$
|
|
PUBLIC NXI6$,NXI7$,NXI8$,NXI8A$,NXI9$,NXI10$,NXI11$,NXI12$,NXI14$
|
|
PUBLIC NXI15$
|
|
NXTINS PROC
|
|
CALL NXTBYT ;GET THE OPERATION BYTE
|
|
MOV DX,AX ;SAVE A COPY
|
|
CMP AX,80H ;IS IT A 2OP?
|
|
JAE NXI00$ ;YES
|
|
JMP NXI9$
|
|
NXI00$: CMP AX,0B0H ;NO, IS IT A 1OP?
|
|
JGE NXI0A$ ;NO
|
|
JMP NXI12$ ;YES
|
|
NXI0A$: CMP AX,0C0H ;IS IT A 0OP?
|
|
JG NXI0B$ ;NO
|
|
JMP NXI13$ ;YES
|
|
NXI0B$: AND AX,3FH ;IT'S EXTENDED, GET THE OPCODE
|
|
SHL AX,1 ;MAKE IT A WORD OFFSET
|
|
MOV BP,AX ;GET THE OPERATOR POINTER
|
|
MOV SI,[BP+EXTOP] ; (6) REMOVED DS OVERRIDE
|
|
CMP SI,0
|
|
JNE NXI0C$ ;OPERATION EXISTS
|
|
JMP NXI14$ ;NO SUCH OPERATION
|
|
NXI0C$: MOV BP,4 ; (A0) DEFAULT NUMBER OF MODE BITS
|
|
CMP DX,0ECH ; (A0) IS IT XCALL?
|
|
JNZ NXI0D$ ; (A0) NO, GO ON AS USUAL
|
|
MOV BP,8 ; (A0) 8 MODE SPECIFIERS
|
|
CALL NXTBYT ; (A0) GET THE FIRST MODE BYTE
|
|
MOV DX,AX ; (A0) SAVE IT
|
|
CALL NXTBYT ; (A0) GET THE SECOND MODE BYTE
|
|
|
|
MOV CX,4 ; (A0) LOOP COUNT
|
|
NXI0E$: PUSH AX ; (A0) SAVE BITS IN PROPER ORDER hh
|
|
SHR AX,1 ; (A0) MOVE THE BITS TO THE RIGHT
|
|
SHR AX,1 ; (A0) MOVE THE BITS TO THE RIGHT
|
|
LOOP NXI0E$
|
|
|
|
MOV AX,DX ; (A0) GET SECOND BYTE
|
|
JMP NXI0F$ ; (A0) FALL THROUGH TO PROCESS aabbccdd
|
|
|
|
NXI0D$: CALL NXTBYT ;GET THE ARGUMENT BYTE
|
|
NXI0F$: MOV CX,4 ;SPLIT IT INTO 4 2-BIT MODE BYTES
|
|
NXI1$: PUSH AX
|
|
SAR AX,1
|
|
SAR AX,1
|
|
LOOP NXI1$
|
|
MOV CX,BP ;RETRIEVE THE 4 (OR 8) BYTES IN PROPER ORDER
|
|
SUB DX,DX
|
|
MOV BX,OFFSET ARGBLK;FIRST ARGUMENT SLOT
|
|
NXI2$: POP AX ;GET NEXT MODE BYTE?
|
|
AND AX,3 ;CLEAR OFF UNWANTED BITS
|
|
CMP AX,3 ;NO MORE ARGUMENTS?
|
|
JE NXI4$ ;YES, FLUSH ANY OTHER MODE BYTES
|
|
CALL GETARG ;ELSE, GET THE NEXT ARGUMENT
|
|
MOV [BX],AX ;SAVE IT IN ARGUMENT BLOCK
|
|
ADD BX,2
|
|
INC DX ;REMEMBER NUMBER OF ARGS GOTTEN
|
|
NXI3$: LOOP NXI2$ ;LOOP FOR REST OF MODE BYTES
|
|
JMP NXI5$
|
|
NXI4$: DEC CX ;DETERMINE NUMBER OF REMAINING MODE BYTES
|
|
SHL CX,1 ;WORD COUNT
|
|
ADD SP,CX ;FLUSH THEM
|
|
NXI5$: XCHG CX,DX
|
|
MOV AX,CX ;NUMBER OF ARGS GOES HERE FOR OPERATOR TO USE
|
|
CMP BYTE PTR [SI],90H ;(6)DOES OPERATOR WANT ARGBLK POINTER?
|
|
JE NXI8A$ ;YES, CALL OPERATOR NOW
|
|
DEC CX ;NO, IT WANTS ARGS IN REGISTERS
|
|
JL NXI8A$ ;NO ARGS, JUST CALL OPERATOR
|
|
JE NXI8$ ;1 ARG, GET IT
|
|
SUB CX,2
|
|
JL NXI7$ ;2 ARGS
|
|
JE NXI6$ ;3 ARGS
|
|
MOV DX,ARGBLK[6] ;ELSE, 4 ARGS, GET 4TH
|
|
NXI6$: MOV CX,ARGBLK[4] ;GET 3RD
|
|
NXI7$: MOV BX,ARGBLK[2] ;GET 2ND
|
|
NXI8$: MOV AX,ARGBLK ;GET FIRST ARG
|
|
NXI8A$: JMP NXI15$ ;AND CALL OPERATOR
|
|
NXI9$: AND AX,1FH ;2OP, EXTRACT OPERATION BITS
|
|
SHL AX,1 ;MAKE IT A WORD OFFSET
|
|
MOV BP,AX ;FIND POINTER TO OPERATOR ROUTINE
|
|
MOV SI,[BP+EXTOP] ;(6) REMOVED DS OVERRIDE
|
|
CMP SI,0
|
|
JE NXI14$ ;NO SUCH OPERATION
|
|
MOV AX,1 ;ASSUME FIRST ARG IS AN IMMEDIATE
|
|
TEST DX,40H ;IS IT INSTEAD A VARIABLE?
|
|
JE NXI10$ ;NO
|
|
INC AX ;YES, CHANGE MODE
|
|
NXI10$: CALL GETARG ;GET THE FIRST ARG
|
|
PUSH AX ;SAVE IT
|
|
MOV AX,1 ;ASSUME SECOND ARG IS AN IMMEDIATE
|
|
TEST DX,20H ;IS IT INSTEAD A VARIABLE?
|
|
JE NXI11$ ;NO
|
|
INC AX ;YES, CHANGE MODE
|
|
NXI11$: CALL GETARG ;GET THE SECOND ARG
|
|
MOV BX,AX ;POSITION IT
|
|
POP AX ;RECOVER FIRST ARG
|
|
CMP BYTE PTR [SI],90H ;(6)DOES ROUTINE WANT ARGUMENT BLOCK?
|
|
JNE NXI15$ ;NO, GO CALL IT
|
|
MOV ARGBLK,AX ;YES, MOVE ARGS TO ARGBLK
|
|
MOV ARGBLK[2],BX
|
|
MOV AX,2 ;ALWAYS 2 ARGS
|
|
JMP NXI15$ ;NOW CALL OPERATOR
|
|
NXI12$: AND DX,0FH ;1OP, EXTRACT OPERATION BITS
|
|
SHL DX,1 ;MAKE IT A WORD OFFSET
|
|
MOV BP,DX ;GET OPERATOR ROUTINE POINTER
|
|
MOV SI,[BP+ONEOP] ;(6) REMOVED DS OVERRIDE
|
|
CMP SI,0
|
|
JE NXI14$ ;ILLEGAL OPERATION
|
|
SAR AX,1 ;EXTRACT MODE BITS
|
|
SAR AX,1
|
|
SAR AX,1
|
|
SAR AX,1
|
|
AND AX,3
|
|
CALL GETARG ;GET THE ARGUMENT
|
|
JMP NXI15$ ;AND CALL OPERATOR
|
|
NXI13$: AND AX,0FH ;0OP, EXTRACT OPERATION BITS
|
|
SHL AX,1 ;MAKE IT A WORD OFFSET
|
|
MOV BP,AX ;GET OPERATOR ROUTINE POINTER
|
|
MOV SI,[BP+ZEROOP] ; (6) REMOVED DS OVERRIDE
|
|
CMP SI,0
|
|
JNE NXI15$ ;IT'S A LEGAL OPERATION
|
|
NXI14$: FATAL FTL5 ;OTHERWISE, COMPLAIN
|
|
NXI15$: CALL SI ;CALL THE OPERATOR ROUTINE
|
|
JMP NXTINS ;AND LOOP FOR NEXT INSTRUCTION
|
|
NXTINS ENDP
|