2023-11-16 18:19:54 -05:00

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