mirror of
https://github.com/daniel5151/ANESE.git
synced 2025-04-02 10:32:00 -04:00
558 lines
18 KiB
PHP
Executable file
Vendored
558 lines
18 KiB
PHP
Executable file
Vendored
Pop: inc byte [R_S]
|
|
mov al, [R_S]
|
|
mov ah, 1
|
|
jmp RB
|
|
|
|
Push: mov dl, al ; V becomes the second parameter to WB
|
|
mov al, 0
|
|
R_S equ $-1
|
|
mov ah, 1
|
|
dec byte [R_S]
|
|
jmp WB
|
|
|
|
Misfire:
|
|
; ax = reference page; dx = intended destination
|
|
mov al, dl ; ax=wrapped address: al = new address, ah = old page
|
|
cmp ax, dx
|
|
jne RB ; If the wrapped address is not same, do extra read
|
|
ret
|
|
|
|
ExecuteOpcode:
|
|
mov al, [C_NMI]
|
|
push ax
|
|
mov di, 0xC000
|
|
R_PC equ $-2
|
|
|
|
mov ax, di
|
|
inc di
|
|
call RB
|
|
mov ah, 0
|
|
mov [C_OPCODE], ax
|
|
pop ax
|
|
|
|
;;;;;;;;;;;
|
|
;; TODO: insert NMI/IRQ
|
|
;;;;;;;;;;;
|
|
|
|
mov byte [C_PBITS], 0x30
|
|
cmp byte [C_RESET], 0
|
|
jne .GotReset
|
|
cmp al, 0
|
|
je .NotNMI
|
|
cmp byte [C_NMI_EDGE], 0
|
|
je .GotNMI
|
|
.NotNMI:cmp byte [C_IRQ], 0
|
|
je .NotIRQ
|
|
test byte [R_P], 4
|
|
jz .GotIRQ
|
|
.NotIRQ:cmp al, 0
|
|
jne short .DoOpcode
|
|
mov byte [C_NMI_EDGE], 0
|
|
jmp short .DoOpcode
|
|
.GotReset:
|
|
mov al,1
|
|
jmp short .GotSpecial
|
|
.GotNMI:
|
|
mov byte [C_NMI_EDGE], 1
|
|
mov al,0
|
|
jmp short .GotSpecial
|
|
.GotIRQ:
|
|
mov al,2
|
|
.GotSpecial:
|
|
mov ah,1
|
|
mov word [C_OPCODE], ax
|
|
mov byte [C_PBITS], 0x20
|
|
;jmp .DoOpcode
|
|
.DoOpcode:
|
|
|
|
call DEBUG
|
|
|
|
mov bx, word 0x0000
|
|
C_OPCODE equ $-2
|
|
mov cl, bl
|
|
shr bx, 3 ; BX = C_OPCODE / 8
|
|
and cl, 7 ; CL = C_OPCODE % 8
|
|
mov al, 1
|
|
shl al, cl
|
|
mov [C_OPCODEBIT], al
|
|
mov byte [C_SB], 0
|
|
mov [mop_bx], bx
|
|
|
|
xor si, si ; C_ADDR = 0
|
|
xor bp, bp ; C_D = 0
|
|
mov cx, 0x00FF ; C_T and C_C
|
|
|
|
mov bx, mop_engine
|
|
|
|
; REGISTER ALLOCATION:
|
|
; AX, DX = function parameters and temporaries
|
|
; AL = RB&WB return value
|
|
; AX = wrap&Misfire return values
|
|
|
|
; DI = R_PC
|
|
; SI = C_ADDR (address operand, initialized to $0000)
|
|
; BP = C_D (address index, initialized to $0000)
|
|
; CL = C_T (operand, initialized to $FF)
|
|
; CH = C_C (second operand, initialized to 0)
|
|
;
|
|
; BX = mop_engine
|
|
;
|
|
; No function must trample these. In addition, Pop must not trample DX.
|
|
|
|
%macro opcode_test 2
|
|
call bx
|
|
dw %2
|
|
db %1 - $ - 1
|
|
;mov al, [C_OPCODEBIT] ;3 bytes
|
|
;test al, [%2 + bx] ;4 bytes
|
|
;jz short %1 ;2 bytes
|
|
; skip if the opcode did not match
|
|
%endm
|
|
|
|
;/* Decode address operand */
|
|
mop00: opcode_test mop01, mop00data
|
|
mov si, 0xFFFA ;// NMI vector location
|
|
|
|
mop01: opcode_test mop02, mop01data
|
|
mov si, 0xFFFC ;// Reset vector location
|
|
|
|
mop02: opcode_test mop03, mop02data
|
|
mov si, 0xFFFE ;// Interrupt vector location
|
|
|
|
mop03: opcode_test mop04, mop03data
|
|
mov ax, di
|
|
inc di
|
|
call RB
|
|
movzx si, al
|
|
|
|
mop04: opcode_test mop05, mop04data
|
|
movzx bp, byte[R_X] ;// register index
|
|
|
|
mop05: opcode_test mop06, mop05data
|
|
movzx bp, byte[R_Y] ;// register index
|
|
|
|
mop06: opcode_test mop07, mop06data
|
|
lea si, [bp+si] ;// add zeropage-index
|
|
and si, 0xFF
|
|
xor bp, bp
|
|
call tick
|
|
|
|
mop07: opcode_test mop08, mop07data
|
|
mov ax, di ;// absolute address
|
|
inc di
|
|
call RB
|
|
mov dx, si
|
|
mov dh, al
|
|
mov si, dx
|
|
|
|
mop08: opcode_test mop09, mop08data
|
|
xchg si, ax
|
|
push ax
|
|
call RB
|
|
movzx si, al
|
|
pop ax
|
|
mov dx, ax
|
|
inc dx
|
|
mov al, dl ; wrapped address: al = new address, ah = old page
|
|
call RB
|
|
mov dx, si
|
|
mov dh, al
|
|
mov si, dx ;// indirect w/ page wrap
|
|
|
|
mop09: opcode_test mop10, mop09data
|
|
mov ax, si
|
|
lea dx, [bp+si]
|
|
call Misfire ;// abs. load: extra misread when cross-page
|
|
|
|
mop10: opcode_test mop11, mop10data
|
|
mov ax, si ;// abs. store: always issue a misread
|
|
lea dx, [bp+si]
|
|
mov al, dl ; wrapped address: al = new address, ah = old page
|
|
call RB
|
|
|
|
;/* Load source operand */
|
|
mop11: opcode_test mop12, mop11data
|
|
and cl, byte 0x00 ;// Many operations take A or X as operand. Some try in
|
|
R_A equ $-1
|
|
|
|
mop12: opcode_test mop13, mop12data
|
|
and cl, byte 0x00 ;// error to take both; the outcome is an AND operation.
|
|
R_X equ $-1
|
|
|
|
mop13: opcode_test mop14, mop13data
|
|
and cl, byte 0x00 ;// sty,dey,iny,tya,cpy
|
|
R_Y equ $-1
|
|
|
|
mop14: opcode_test mop15, mop14data
|
|
and cl, [R_S] ;// tsx, las
|
|
|
|
mop15: opcode_test mop16, mop15data
|
|
mov al, byte 0x00
|
|
R_P equ $-1
|
|
or al, byte 0x30
|
|
C_PBITS equ $-1
|
|
and cl, al
|
|
mov ch, cl ;// php, flag test/set/clear, interrupts
|
|
|
|
mop16: opcode_test mop17, mop16data
|
|
mov ch, cl
|
|
mov cl, 0xFF ;// save as second operand
|
|
|
|
mop17: opcode_test mop18, mop17data
|
|
lea ax, [bp+si]
|
|
call RB
|
|
and cl, al ;// memory operand
|
|
|
|
mop18: opcode_test mop19, mop18data
|
|
mov ax, di
|
|
inc di
|
|
call RB
|
|
and cl, al ;// immediate operand
|
|
|
|
;/* Operations that mogrify memory operands directly */
|
|
mop19: opcode_test mop1A, mop19data
|
|
mov al, cl
|
|
and al, 0xC0
|
|
mov ah, [R_P]
|
|
and ah, 0x3F
|
|
or al, ah
|
|
mov [R_P], al ;// bit
|
|
|
|
mop1A: opcode_test mop20, mop1Adata
|
|
mov al, [R_P]
|
|
and al, 1
|
|
mov [C_SB], al ;// rol,rla, ror,rra,arr
|
|
|
|
mop20: opcode_test mop21, mop20data
|
|
mov al, cl
|
|
shr al, 7 ;// rol,rla, asl,slo,[arr,anc]
|
|
push word mop21
|
|
mop_set_c:
|
|
mov ah, [R_P]
|
|
and ah, 0xFE
|
|
or al, ah
|
|
mov [R_P], al
|
|
ret
|
|
|
|
mop21: opcode_test mop22, mop21data
|
|
mov al, cl
|
|
and al, 1 ;// lsr,sre, ror,rra,asr
|
|
call mop_set_c
|
|
|
|
mop22: opcode_test mop23, mop22data
|
|
shl cl, 1
|
|
or cl, [C_SB]
|
|
|
|
mop23: opcode_test mop24, mop23data
|
|
shr cl, 1
|
|
mov ah, 0
|
|
C_SB equ $-1
|
|
shl ah, 7
|
|
or cl, ah
|
|
|
|
mop24: opcode_test mop25, mop24data
|
|
dec cl ;// dec,dex,dey,dcp
|
|
; ^ No cx. Must not wrap into ch.
|
|
|
|
mop25: opcode_test mop26, mop25data
|
|
inc cl ;// inc,inx,iny,isb
|
|
; ^ No cx. Must not wrap into ch.
|
|
|
|
;/* Store modified value (memory) */
|
|
mop26: opcode_test mop27, mop26data
|
|
lea ax, [bp+si]
|
|
mov dl, cl
|
|
call WB
|
|
|
|
mop27: opcode_test mop28, mop27data
|
|
mov ax, si
|
|
lea dx, [bp+si]
|
|
mov al, dl ; wrapped address: al = new address, ah = old page
|
|
|
|
shr dx, 8
|
|
and dl, cl
|
|
mov cl, dl
|
|
call WB ;// [shx,shy,shs,sha?]
|
|
|
|
;/* Some operations used up one clock cycle that we did not account for yet */
|
|
mop28: opcode_test mop29, mop28data
|
|
call tick ;// nop,flag ops,inc,dec,shifts,stack,transregister,interrupts
|
|
|
|
;/* Stack operations and unconditional jumps */
|
|
mop29: opcode_test mop30, mop29data
|
|
call tick
|
|
call Pop
|
|
mov cl, al ;// pla,plp,rti
|
|
|
|
mop30: opcode_test mop31, mop30data
|
|
mov ax, di
|
|
inc di
|
|
call RB
|
|
call Pop
|
|
mov dl, al
|
|
call Pop
|
|
mov dh, al
|
|
mov di, dx ;// rti,rts
|
|
|
|
mop31: opcode_test mop32, mop31data
|
|
mov ax, di
|
|
inc di
|
|
call RB ;// rts
|
|
|
|
mop32: opcode_test mop33, mop32data
|
|
lea ax, [di-1] ; normal
|
|
cmp word [C_OPCODE], 0
|
|
jne .normal
|
|
lea ax, [di+1] ; BRK
|
|
.normal:
|
|
push ax
|
|
mov al, ah
|
|
call Push
|
|
pop ax
|
|
call Push ;// jsr, interrupts
|
|
|
|
mop33: opcode_test mop34, mop33data
|
|
mov di, si ;// jmp, jsr, interrupts
|
|
|
|
mop34: opcode_test mop35, mop34data
|
|
mov al, cl
|
|
call Push ;// pha, php, interrupts
|
|
|
|
;/* Bitmasks */
|
|
mop35: opcode_test mop36, mop35data
|
|
mov cl, 1
|
|
|
|
mop36: opcode_test mop37, mop36data
|
|
shl cl, 1
|
|
|
|
mop37: opcode_test mop38, mop37data
|
|
shl cl, 2
|
|
|
|
mop38: opcode_test mop39, mop38data
|
|
shl cl, 4
|
|
|
|
mop39: opcode_test mop40, mop39data
|
|
not cl ;// sbc, isb, clear flag
|
|
|
|
mop40: opcode_test mop41, mop40data
|
|
or cl, ch ;// ora, slo, set flag
|
|
|
|
mop41: opcode_test mop42, mop41data
|
|
and cl, ch ;// and, bit, rla, clear/test flag
|
|
|
|
mop42: opcode_test mop43, mop42data
|
|
xor cl, ch ;// eor, sre
|
|
|
|
;/* Conditional branches */
|
|
mop43: opcode_test mop44, mop43data
|
|
mov al, cl
|
|
or al, al
|
|
jz .NoBranch1
|
|
call tick
|
|
mov dx, di
|
|
mov ax, si ;discard hi part.
|
|
;movsx ax, al
|
|
cbw
|
|
add ax, dx
|
|
mov di, ax
|
|
xchg dx, ax
|
|
call Misfire
|
|
.NoBranch1:
|
|
|
|
mop44: opcode_test mop45, mop44data
|
|
mov al, cl
|
|
or al, al
|
|
jnz .NoBranch2
|
|
call tick
|
|
mov dx, di
|
|
mov ax, si ;discard hi part.
|
|
cbw
|
|
add ax, dx
|
|
mov di, ax
|
|
xchg dx, ax
|
|
call Misfire
|
|
.NoBranch2:
|
|
|
|
;/* Addition and subtraction */
|
|
mop45: opcode_test mop46, mop45data
|
|
mov ch, cl
|
|
mov ah, [R_P]
|
|
and ah, 1
|
|
add ah, 0xFF ; now host Cf is set if P.C was
|
|
adc cl, [R_A]
|
|
mov dh, 0
|
|
rcl dh, 1 ; new carry flag is in DH
|
|
mov dl, ch
|
|
xor dl, cl ; dl = c^t
|
|
xor al, [R_A]; al = A^t
|
|
and al, dl ; al = (c^t) & (A^t)
|
|
and al, 80h
|
|
shr al, 1
|
|
or al, dh
|
|
mov ah, [R_P]
|
|
and ah, 0xFF-0x41
|
|
or al, ah
|
|
mov [R_P], al
|
|
|
|
mop46: opcode_test mop47, mop46data
|
|
mov al, ch
|
|
sub al, cl
|
|
mov cl, al
|
|
; FIXME: check if a CMC is necessary here
|
|
cmc
|
|
;;;
|
|
mov al, 0
|
|
rcl al, 1 ;// cmp,cpx,cpy, dcp, sbx
|
|
call mop_set_c
|
|
|
|
;/* Store modified value (register) */
|
|
mop47: opcode_test mop48, mop47data
|
|
mov [R_A], cl
|
|
|
|
mop48: opcode_test mop49, mop48data
|
|
mov [R_X], cl
|
|
|
|
mop49: opcode_test mop50, mop49data
|
|
mov [R_Y], cl
|
|
|
|
mop50: opcode_test mop51, mop50data
|
|
mov [R_S], cl
|
|
|
|
mop51: opcode_test mop52, mop51data
|
|
mov al, cl
|
|
and al, 0xFF-0x30
|
|
mov [R_P], al ;// plp, rti, flag set/clear
|
|
|
|
;/* Generic status flag updates */
|
|
mop52: opcode_test mop53, mop52data
|
|
mov al, cl
|
|
and al, 0x80
|
|
mov ah, [R_P]
|
|
and ah, 0x7F
|
|
or al, ah
|
|
mov [R_P], al
|
|
|
|
mop53: opcode_test mop54, mop53data
|
|
mov al, [R_P]
|
|
and al, 0xFD
|
|
mov ah, cl
|
|
or ah, ah
|
|
jnz @@nz
|
|
or al, 2
|
|
@@nz: mov [R_P], al
|
|
|
|
mop54: opcode_test mop_done, mop54data
|
|
mov al, cl
|
|
add al, 0x20
|
|
and al, 0x40
|
|
mov ah, [R_P]
|
|
and ah, 0xBF
|
|
or al, ah
|
|
mov [R_P], al ;// [arr]
|
|
|
|
mop_done:
|
|
mov [R_PC], di
|
|
mov byte [C_RESET], 0
|
|
ret
|
|
|
|
section .const
|
|
|
|
mop35data: db 0x01,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x07
|
|
mop37data: db 0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x07
|
|
mop40data: db 0xAB,0xA2,0xAA,0xAA,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x07
|
|
mop33data: db 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07
|
|
mop28data: db 0xD9,0xD5,0xDC,0xDD,0xC9,0xC5,0xDC,0xDD,0xD8,0xC5,0xDC,0xDD,0xD9,0xC5,0xDC,0xDD,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0xC8,0xC5,0xDC,0xDD,0xC8,0xC5,0xDC,0xDD,0x07
|
|
mop51data: db 0x01,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x07
|
|
mop52data: db 0xEE,0xEE,0xEE,0xEA,0xEE,0xEE,0xEE,0xEA,0xEE,0xEE,0xEE,0xEA,0xEE,0xEF,0xEE,0xEA,0x00,0x0D,0x00,0x01,0xFF,0xFF,0xFE,0xFE,0xFB,0xFF,0xEE,0xEA,0xFB,0xFB,0xEE,0xEA
|
|
mop09data: db 0x00,0x00,0x02,0x32,0x00,0x00,0x02,0x32,0x00,0x00,0x02,0x32,0x00,0x00,0x02,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0xFA,0x00,0x00,0x02,0x32,0x00,0x00,0x02,0x32
|
|
mop10data: db 0x00,0x00,0x0C,0xC8,0x00,0x00,0x0C,0xC8,0x00,0x00,0x0C,0xC8,0x00,0x00,0x0C,0xC8,0x00,0x00,0x0E,0xFA,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0xC8,0x00,0x00,0x0C,0xC8
|
|
mop07data: db 0x00,0xF0,0x00,0xFA,0x01,0xF0,0x00,0xFA,0x00,0xF0,0x00,0xFA,0x00,0xF0,0x00,0xFA,0x00,0xF0,0x00,0xFA,0x00,0xF0,0x00,0xFA,0x00,0xF0,0x00,0xFA,0x00,0xF0,0x00,0xFA
|
|
mop05data: db 0x00,0x00,0x0E,0x0A,0x00,0x00,0x0E,0x0A,0x00,0x00,0x0E,0x0A,0x00,0x00,0x0E,0x0A,0x00,0x00,0xCE,0xCA,0x00,0x00,0xCE,0xCA,0x00,0x00,0x0E,0x0A,0x00,0x00,0x0E
|
|
mop06data: db 0x0A,0x00,0xF0,0x00,0x0A,0x00,0xF0,0x00,0x0A,0x00,0xF0,0x00,0x0A,0x00,0xF0,0x00,0x0A,0x00,0xF0,0x00,0x0A,0x00,0xF0,0x00,0x0A,0x00,0xF0,0x00,0x0A,0x00,0xF0
|
|
mop41data: db 0x00,0x00,0x01,0x01,0xBA,0xB2,0xAB,0xAA,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01
|
|
mop38data: db 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01
|
|
mop31data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
|
mop02data: db 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
|
mop48data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0x00,0x0C,0x00
|
|
mop36data: db 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00
|
|
mop34data: db 0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07
|
|
mop53data: db 0xEE,0xEE,0xEE,0xEA,0xFE,0xFE,0xEE,0xEA,0xEE,0xEE,0xEE,0xEA,0xEE,0xEF,0xEE,0xEA,0x00,0x0D,0x00,0x01,0xFF,0xFF,0xFE,0xFE,0xFB,0xFF,0xEE,0xEA,0xFB,0xFB,0xEE,0xEA,0x00
|
|
mop47data: db 0xAE,0xAE,0xAA,0xAA,0xAE,0xAE,0xAA,0xAA,0xAE,0xAE,0xAA,0xAA,0xAE,0xAF,0xAA,0xAA,0x00,0x0C,0x00,0x01,0xAA,0xAA,0xAA,0xAA,0x00,0x00,0x00,0x00,0xAA,0xAA,0xAA,0xAA,0x00
|
|
mop26data: db 0xC8,0xC0,0xCC,0xC8,0xC8,0xC0,0xCC,0xC8,0xC8,0xC0,0xCC,0xC8,0xC8,0xC0,0xCC,0xC8,0xFA,0xF0,0xFE,0x22,0x00,0x00,0x00,0x00,0xC8,0xC0,0xCC,0xC8,0xC8,0xC0,0xCC,0xC8,0x00
|
|
mop08data: db 0x0B,0x00,0x0E,0x00,0x0A,0x00,0x0E,0x00,0x0A,0x00,0x0E,0x00,0x0A,0x10,0x0E,0x00,0x0A,0x00,0x0E,0x00,0x0A,0x00,0x0E,0x00,0x0A,0x00,0x0E,0x00,0x0A,0x00,0x0E,0x00,0x07
|
|
mop11data: db 0xAE,0xAE,0xAA,0xAA,0xBE,0xBE,0xAA,0xAA,0xAE,0xAF,0xAA,0xAA,0x04,0x0C,0x00,0x00,0xAA,0xAA,0xAA,0xAA,0x00,0x05,0x00,0x00,0xAA,0xAA,0xAA,0xAA
|
|
mop29data: db 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01
|
|
mop50data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x08
|
|
mop54data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08
|
|
mop27data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD8
|
|
mop13data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x11,0x10,0x11,0x00,0x00,0x00,0x00,0x11,0x11
|
|
mop30data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
|
mop32data: db 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07
|
|
mop03data: db 0xFA,0xF0,0xFF,0xFA,0xFB,0xF0,0xFF,0xFA,0xFA,0xF0,0xFF,0xFA,0xFA,0xF0,0xFF,0xFA,0xFA,0xF0,0xFF,0xFA,0xFA,0xF0,0xFF,0xFA,0xFA,0xF0,0xFF,0xFA,0xFA,0xF0,0xFF,0xFA,0x00
|
|
mop04data: db 0x0A,0x00,0xF0,0xF0,0x0A,0x00,0xF0,0xF0,0x0A,0x00,0xF0,0xF0,0x0A,0x00,0xF0,0xF0,0x0A,0x00,0x30,0x30,0x0A,0x00,0x30,0x30,0x0A,0x00,0xF0,0xF0,0x0A,0x00,0xF0,0xF0,0x00
|
|
mop22data: db 0xCC,0xC4,0xCC,0xC8,0xCC,0xC4,0xCC,0xC8
|
|
mop00data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
|
mop25data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xC8,0xC1,0xCC,0xC8,0x00
|
|
mop20data: db 0xCC,0xCC,0xCC,0xC8,0xCC,0xCC,0xCC,0xC8,0x00,0x00,0x00,0x00,0x00,0x08
|
|
mop14data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C
|
|
mop45data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAA,0xA2,0xAA,0xAA,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAA,0xAA,0xAA,0xAA,0x00
|
|
mop16data: db 0xAA,0xA2,0xAA,0xAA,0xBA,0xB2,0xAA,0xAA,0xAA,0xA2,0xAA,0xAA,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBB,0xBA,0xAA,0xAA,0x11,0x10
|
|
mop1Adata: db 0x00,0x00,0x00,0x00,0xCC,0xC4,0xCC,0xC8,0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xC8,0x00
|
|
mop12data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC8,0xCC,0xCC,0xCC,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x11,0x11
|
|
mop21data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xC8,0xCC,0xC4,0xCC,0xC8
|
|
mop49data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x11,0x11,0x10,0x10,0x00,0x01
|
|
mop42data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAA,0xA2,0xAA,0xAA
|
|
mop46data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBB,0xBA,0xAA,0xAA,0x11,0x10
|
|
mop23data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xC8,0xCC,0xCC,0xCC,0xC8
|
|
mop24data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xC8,0xC4,0xCC,0xC8
|
|
mop43data: db 0x00,0x00,0x00,0x00
|
|
mop44data: db 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00
|
|
mop39data: db 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0xAA,0xAA,0xAA,0xAA,0x00
|
|
mop15data: db 0x01,0x01,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x07
|
|
mop18data: db 0x04,0x0A,0x00,0x00,0x04,0x0A,0x00,0x00,0x04,0x0A,0x00,0x00,0x04,0x0A,0x00,0x00,0x05,0x0A,0x00,0x00,0x05,0x0A,0x00,0x00,0x05,0x0A,0x00,0x00,0x05,0x0A
|
|
mop19data: db 0x00,0x00,0x00,0x00,0x10,0x10
|
|
mop01data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
|
mop17data: db 0xEA,0xE0,0xEE,0xEA,0xFA,0xF0,0xEE,0xEA,0xEA,0xE0,0xEE,0xEA,0xEA,0xE0,0xEE,0xEA,0x00,0x00,0x00,0x00,0xFA,0xF0,0xFE,0xFA,0xFA,0xF0,0xEE,0xEA,0xFA,0xF0,0xEE,0xEA,0x00
|
|
|
|
section .text
|
|
|
|
mop_engine:
|
|
; This only purpose of this function is
|
|
; to make the opcode_test macro take 5 bytes
|
|
; rather than 9 bytes per call site.
|
|
pop bx
|
|
push di
|
|
mov di, .return-2
|
|
|
|
mov ax, [bx]
|
|
|
|
mov dl, [bx+2]
|
|
sub bx, di
|
|
inc bx
|
|
mov [di], bx
|
|
|
|
xchg bx, ax
|
|
mov al, 0
|
|
C_OPCODEBIT EQU $-1
|
|
test al, [bx + 0xC3C3]
|
|
mop_bx equ $-2
|
|
jnz .no_skip
|
|
|
|
mov dh, 0
|
|
add [di], dx
|
|
.no_skip:
|
|
pop di
|
|
mov bx, mop_engine
|
|
jmp .return + 0xC3C3
|
|
.return:
|
|
|
|
;1B9
|
|
;A3E7
|
|
|
|
|
|
|
|
%include "disasm.inc"
|
|
|
|
%include "cpu.asm"
|
|
|
|
|