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"