www.pudn.com > sn068s.zip > SPCOPS.NI
; SPC700 opcodes 0x00-0x0F: ; 00: NOP 1,2 ; 01: TCALL 0 1,8 ; 02: SET1 dp.0 2,4 ; 03: BBS dp.0,rel 3,5/7 ; 04: OR A,dp 2,3 ; 05: OR A,labs 3,4 ; 06: OR A,(X) 1,3 ; 07: OR A,(dp+X) 2,6 ; 08: OR A,#imm 2,2 ; 09: OR dp(d),dp(s) 3,6 ; 0A: OR1 C,mem.bit 3,5 ; 0B: ASL dp 2,4 ; 0C: ASL labs 3,5 ; 0D: PUSH PSW 1,4 ; 0E: TSET1 labs 3,6 ; 0F: BRK 1,8 ; ; SPC700 opcodes 0x10-0x1F: ; 10: BPL rel 2,2/4 ; 11: TCALL 1 1,8 ; 12: CLR1 dp.0 2,4 ; 13: BBC dp.0,rel 3,5/7 ; 14: OR A,dp+X 2,4 ; 15: OR A,labs+X 3,5 ; 16: OR A,labs+Y 3,5 ; 17: OR A,(dp)+Y 2,6 ; 18: OR dp,#imm 3,5 ; 19: OR (X),(Y) 1,5 ; 1A: DECW dp 2,6 ; 1B: ASL dp+X 2,5 ; 1C: ASL A 1,2 ; 1D: DEC X 1,2 ; 1E: CMP X,labs 3,4 ; 1F: JMP (labs+X) 3,6 ; ; SPC700 opcodes 0x20-0x2F: ; 20: CLRP 1,2 ; 21: TCALL 2 1,8 ; 22: SET1 dp.1 2,4 ; 23: BBS dp.1,rel 3,5/7 ; 24: AND A,dp 2,3 ; 25: AND A,labs 3,4 ; 26: AND A,(X) 1,3 ; 27: AND A,(dp+X) 2,6 ; 28: AND A,#imm 2,2 ; 29: AND dp(d),dp(s) 3,6 ; 2A: OR1 C,/mem.bit 3,5 ; 2B: ROL dp 2,4 ; 2C: ROL labs 3,5 ; 2D: PUSH A 1,4 ; 2E: CBNE dp,rel 3,5/7 ; 2F: BRA rel 2,4 ; ; SPC700 opcodes 0x30-0x3F: ; 30: BMI rel 2,2/4 ; 31: TCALL 3 1,8 ; 32: CLR1 dp.1 2,4 ; 33: BBC dp.1,rel 3,5/7 ; 34: AND A,dp+X 2,4 ; 35: AND A,labs+X 3,5 ; 36: AND A,labs+Y 3,5 ; 37: AND A,(dp)+Y 2,6 ; 38: AND dp,#imm 3,5 ; 39: AND (X),(Y) 1,5 ; 3A: INCW dp 2,6 ; 3B: ROL dp+X 2,5 ; 3C: ROL A 1,2 ; 3D: INC X 1,2 ; 3E: CMP X,dp 2,3 ; 3F: CALL labs 3,8 ; ; SPC700 opcodes 0x40-0x4F: ; 40: SETP 1,2 ; 41: TCALL 4 1,8 ; 42: SET1 dp.2 2,4 ; 43: BBS dp.2,rel 3,5/7 ; 44: EOR A,dp 2,3 ; 45: EOR A,labs 3,4 ; 46: EOR A,(X) 1,3 ; 47: EOR A,(dp+X) 2,6 ; 48: EOR A,#imm 2,2 ; 49: EOR dp(d),dp(s) 3,6 ; 4A: AND1 C,mem.bit 3,4 ; 4B: LSR dp 2,4 ; 4C: LSR labs 3,5 ; 4D: PUSH X 1,4 ; 4E: TCLR1 labs 3,6 ; 4F: PCALL upage 2,6 ; ; SPC700 opcodes 0x50-0x5F: ; 50: BVC rel 2,2/4 ; 51: TCALL 5 1,8 ; 52: CLR1 dp.2 2,4 ; 53: BBC dp.2,rel 3,5/7 ; 54: EOR A,dp+X 2,4 ; 55: EOR A,labs+X 3,5 ; 56: EOR A,labs+Y 3,5 ; 57: EOR A,(dp)+Y 2,6 ; 58: EOR dp,#imm 3,5 ; 59: EOR (X),(Y) 1,5 ; 5A: CMPW YA,dp 2,4 ; 5B: LSR dp+X 2,5 ; 5C: LSR A 1,2 ; 5D: MOV X,A 1,2 ; 5E: CMP Y,labs 3,4 ; 5F: JMP labs 3,3 ; ; SPC700 opcodes 0x60-0x6F: ; 60: CLRC 1,2 ; 61: TCALL 6 1,8 ; 62: SET1 dp.3 2,4 ; 63: BBS dp.3,rel 3,5/7 ; 64: CMP A,dp 2,3 ; 65: CMP A,labs 3,4 ; 66: CMP A,(X) 1,3 ; 67: CMP A,(dp+X) 2,6 ; 68: CMP A,#imm 2,2 ; 69: CMP dp(d),dp(s) 3,6 ; 6A: AND1 C,/mem.bit 3,4 ; 6B: ROR dp 2,4 ; 6C: ROR labs 3,5 ; 6D: PUSH Y 1,4 ; 6E: DBNZ dp,rel 3,5/7 ; 6F: RET 1,5 ; ; SPC700 opcodes 0x70-0x7F: ; 70: BVS rel 2,2/4 ; 71: TCALL 7 1,8 ; 72: CLR1 dp.3 2,4 ; 73: BBC dp.3,rel 3,5/7 ; 74: CMP A,dp+X 2,4 ; 75: CMP A,labs+X 3,5 ; 76: CMP A,labs+Y 3,5 ; 77: CMP A,(dp)+Y 2,6 ; 78: CMP dp,#imm 3,5 ; 79: CMP (X),(Y) 1,5 ; 7A: ADDW YA,dp 2,5 ; 7B: ROR dp+X 2,5 ; 7C: ROR A 1,2 ; 7D: MOV A,X 1,2 ; 7E: CMP Y,dp 2,3 ; 7F: RETI 1,6 ; ; SPC700 opcodes 0x80-0x8F: ; 80: SETC 1,2 ; 81: TCALL 8 1,8 ; 82: SET1 dp.4 2,4 ; 83: BBS dp.4,rel 3,5/7 ; 84: ADC A,dp 2,3 ; 85: ADC A,labs 3,4 ; 86: ADC A,(X) 1,3 ; 87: ADC A,(dp+X) 2,6 ; 88: ADC A,#imm 2,2 ; 89: ADC dp(d),dp(s) 3,6 ; 8A: EOR1 C,mem.bit 3,5 ; 8B: DEC dp 2,4 ; 8C: DEC labs 3,5 ; 8D: MOV Y,#imm 2,2 ; 8E: POP PSW 1,4 ; 8F: MOV dp,#imm 3,5 ; ; SPC700 opcodes 0x90-0x9F: ; 90: BCC rel 2,2/4 ; 91: TCALL 9 1,8 ; 92: CLR1 dp.4 2,4 ; 93: BBC dp.4,rel 3,5/7 ; 94: ADC A,dp+X 2,4 ; 95: ADC A,labs+X 3,5 ; 96: ADC A,labs+Y 3,5 ; 97: ADC A,(dp)+Y 2,6 ; 98: ADC dp,#imm 3,5 ; 99: ADC (X),(Y) 1,5 ; 9A: SUBW YA,dp 2,5 ; 9B: DEC dp+X 2,5 ; 9C: DEC A 1,2 ; 9D: MOV X,SP 1,2 ; 9E: DIV YA,X 1,12 ; 9F: XCN A 1,5 ; ; SPC700 opcodes 0xA0-0xAF: ; A0: EI 1,3 ; A1: TCALL 10 1,8 ; A2: SET1 dp.5 2,4 ; A3: BBS dp.5,rel 3,5/7 ; A4: SBC A,dp 2,3 ; A5: SBC A,labs 3,4 ; A6: SBC A,(X) 1,3 ; A7: SBC A,(dp+X) 2,6 ; A8: SBC A,#imm 2,2 ; A9: SBC dp(d),dp(s) 3,6 ; AA: MOV1 C,mem.bit 3,4 ; AB: INC dp 2,4 ; AC: INC labs 3,5 ; AD: CMP Y,#imm 2,2 ; AE: POP A 1,4 ; AF: MOV (X)+,A 1,4 ; ; SPC700 opcodes 0xB0-0xBF: ; B0: BCS rel 2,2/4 ; B1: TCALL 11 1,8 ; B2: CLR1 dp.5 2,4 ; B3: BBC dp.5,rel 3,5/7 ; B4: SBC A,dp+X 2,4 ; B5: SBC A,labs+X 3,5 ; B6: SBC A,labs+Y 3,5 ; B7: SBC A,(dp)+Y 2,6 ; B8: SBC dp,#imm 3,5 ; B9: SBC (X),(Y) 1,5 ; BA: MOVW YA,dp 2,5 ; BB: INC dp+X 2,5 ; BC: INC A 1,2 ; BD: MOV SP,X 1,2 ; BE: DAS A 1,3 ; BF: MOV A,(X)+ 1,4 ; ; SPC700 opcodes 0xC0-0xCF: ; C0: DI 1,3 ; C1: TCALL 12 1,8 ; C2: SET1 dp.6 2,4 ; C3: BBS dp.6,rel 3,5/7 ; C4: MOV dp,A 2,4 ; C5: MOV labs,A 3,5 ; C6: MOV (X),A 1,4 ; C7: MOV (dp+X),A 2,7 ; C8: CMP X,#imm 2,2 ; C9: MOV labs,X 3,5 ; CA: MOV1 mem.bit,C 3,6 ; CB: MOV dp,Y 2,4 ; CC: MOV labs,Y 3,5 ; CD: MOV X,#imm 2,2 ; CE: POP X 1,4 ; CF: MUL YA 1,9 ; ; SPC700 opcodes 0xD0-0xDF: ; D0: BNE rel 2,2/4 ; D1: TCALL 13 1,8 ; D2: CLR1 dp.6 2,4 ; D3: BBC dp.6,rel 3,5/7 ; D4: MOV dp+X,A 2,5 ; D5: MOV labs+X,A 3,6 ; D6: MOV labs+Y,A 3,6 ; D7: MOV (dp)+Y,A 2,7 ; D8: MOV dp,X 2,4 ; D9: MOV dp+Y,X 2,5 ; DA: MOVW dp,YA 2,4 ; DB: MOV dp+X,Y 2,5 ; DC: DEC Y 1,2 ; DD: MOV A,Y 1,2 ; DE: CBNE dp+X,rel 3,6/8 ; DF: DAA A 1,3 ; ; SPC700 opcodes 0xE0-0xEF: ; E0: CLRV 1,2 ; E1: TCALL 14 1,8 ; E2: SET1 dp.7 2,4 ; E3: BBS dp.7,rel 3,5/7 ; E4: MOV A,dp 2,3 ; E5: MOV A,labs 3,4 ; E6: MOV A,(X) 1,3 ; E7: MOV A,(dp+X) 2,6 ; E8: MOV A,#imm 2,2 ; E9: MOV X,labs 3,4 ; EA: NOT1 mem.bit 3,5 ; EB: MOV Y,dp 2,3 ; EC: MOV Y,labs 3,4 ; ED: NOTC 1,3 ; EE: POP Y 1,4 ; EF: SLEEP 1,3 ; ; SPC700 opcodes 0xF0-0xFF: ; F0: BEQ rel 2,2/4 ; F1: TCALL 15 1,8 ; F2: CLR1 dp.7 2,4 ; F3: BBC dp.7,rel 3,5/7 ; F4: MOV A,dp+X 2,4 ; F5: MOV A,labs+X 3,5 ; F6: MOV A,labs+Y 3,5 ; F7: MOV A,(dp)+Y 2,6 ; F8: MOV X,dp 2,3 ; F9: MOV X,dp+Y 2,4 ; FA: MOV dp(d),dp(s) 3,5 ; FB: MOV Y,dp+X 2,4 ; FC: INC Y 1,2 ; FD: MOV Y,A 1,2 ; FE: DBNZ Y,rel 2,4/6 ; FF: STOP 1,3 ; ; 00 ALIGNC EXPORT_C SPC_NOP inc R_NativePC OPCODE_EPILOG ; 01 TCALL 0 ; 02 - SPC_SET1 in SPCmain.S ; 03 - SPC_BBS in SPCmain.S ; 04 SPC_OR_A dp ; 05 SPC_OR_A abs ; 06 SPC_OR_A OXO ; 07 SPC_OR_A OOdp_XOO ; 08 ALIGNC EXPORT_C SPC_OR_A_IM SPC_OP_A_IM_NZ OR ; 09 SPC_OR_mem dp_dp ; 0A ALIGNC EXPORT_C SPC_OR1 ; Carry flag = Carry flag OR mem.bit ADDR_membit ; bx contains mem and cx contains bit number GET_BYTE_SPC ; C |= (byte & bit) mov cl,[offset_to_bit+ecx] and al,cl mov cl,B_C_flag or al,cl STORE_FLAGS_C al OPCODE_EPILOG ; 0B SPC_ASL dp ; 0C SPC_ASL abs ; 0D ALIGNC EXPORT_C SPC_PUSH_PSW inc R_NativePC SETUPFLAGS_SPC PUSH_B OPCODE_EPILOG ; 0E ALIGNC EXPORT_C SPC_TSET1 ; I have done this as TSB (65816) including the flag setting based on AND mov cl,B_A ADDR_abs mov ah,cl GET_BYTE_SPC ; Get byte and cl,al ; NZ set for: mem & A or al,ah STORE_FLAGS_NZ cl SET_BYTE_SPC ; mem |= A OPCODE_EPILOG ; 0F - BRK - Not yet implemented (maybe never) ; 10 SPC_BFC BPL,SPC_FLAG_N ; 11 TCALL 1 ; 12 - SPC_CLR1 in SPCmain.S ; 13 - SPC_BBC in SPCmain.S ; 14 SPC_OR_A Odp_XO ; 15 SPC_OR_A Oabs_XO ; 16 SPC_OR_A Oabs_YO ; 17 SPC_OR_A OOdpO_YO ; 18 SPC_OR_mem dp_IM ; 19 SPC_OR_mem OXO_OYO ; 1A ALIGNC EXPORT_C SPC_DECW_dp ADDR_dp GET_WORD_SPC ; get DP word dec eax mov cl,ah STORE_FLAGS_N ah or cl,al dec bx STORE_FLAGS_Z cl SET_WORD_SPC OPCODE_EPILOG ; 1B SPC_ASL Odp_XO ; 1C ALIGNC EXPORT_C SPC_ASL_A mov al,B_A inc R_NativePC add al,al sbb cl,cl STORE_FLAGS_NZC al,cl mov B_A,al OPCODE_EPILOG ; 1D SPC_DEC_reg X,B_X ; 1E SPC_CMP_X abs ; 1F ALIGNC EXPORT_C SPC_JMP_Oabs_XO ADDR_Oabs_XO GET_WORD_SPC cmp eax,0xFFC0 mov R_NativePC,eax mov eax,[SPC_FFC0_Address] jnb .possible_rom mov eax,_SPCRAM .possible_rom: add R_NativePC,eax mov B_SPC_Code_Base,eax OPCODE_EPILOG ; 20 ALIGNC EXPORT_C SPC_CLRP inc R_NativePC STORE_FLAGS_P ah mov B_SPC_PAGE_H,ah OPCODE_EPILOG ; 21 TCALL 2 ; 22 - SPC_SET1 in SPCmain.S ; 23 - SPC_BBS in SPCmain.S ; 24 SPC_AND_A dp ; 25 SPC_AND_A abs ; 26 SPC_AND_A OXO ; 27 SPC_AND_A OOdp_XOO ; 28 ALIGNC EXPORT_C SPC_AND_A_IM SPC_OP_A_IM_NZ AND ; 29 SPC_AND_mem dp_dp ; 2A ALIGNC EXPORT_C SPC_OR1C ; Carry flag = Carry flag OR !mem.bit ADDR_membit ; bx contains mem and cx contains bit number GET_BYTE_SPC ; C |= ((byte & bit) ^ bit) mov cl,[offset_to_bit+ecx] and al,cl xor al,cl mov cl,B_C_flag or al,cl STORE_FLAGS_C al OPCODE_EPILOG ; 2B SPC_ROL dp ; 2C SPC_ROL abs ; 2D SPC_PUSH_reg A,B_A ; 2E ALIGNC EXPORT_C SPC_CBNE_dp mov ebx,B_SPC_PAGE mov bl,[1+R_NativePC] ; get dp add R_NativePC,byte 3 GET_BYTE_SPC ; get (dp) cmp B_A,al je near SPC_RETURN movsx eax,byte [R_NativePC-1] ; sign extend for addition add R_Cycles,byte 2 ; Branch taken add R_NativePC,eax ;add dword [_TotalCycles],byte 2 ; (0.32) Butcha - fix 'lost' SPC timer ticks! OPCODE_EPILOG ; 2F ALIGNC EXPORT_C SPC_BRA movsx eax,byte [1+R_NativePC] ; sign extend for addition add R_NativePC,byte 2 add R_NativePC,eax OPCODE_EPILOG ; 30 SPC_BFS BMI,SPC_FLAG_N ; 31 TCALL 3 ; 32 - SPC_CLR1 in SPCmain.S ; 33 - SPC_BBC in SPCmain.S ; 34 SPC_AND_A Odp_XO ; 35 SPC_AND_A Oabs_XO ; 36 SPC_AND_A Oabs_YO ; 37 SPC_AND_A OOdpO_YO ; 38 SPC_AND_mem dp_IM ; 39 SPC_AND_mem OXO_OYO ; 3A ALIGNC EXPORT_C SPC_INCW_dp ADDR_dp GET_WORD_SPC ; get DP word inc eax mov cl,ah STORE_FLAGS_N ah or cl,al dec bx STORE_FLAGS_Z cl SET_WORD_SPC OPCODE_EPILOG ; 3B SPC_ROL Odp_XO ; 3C ALIGNC EXPORT_C SPC_ROL_A mov cl,B_C_flag inc R_NativePC add cl,255 ;MAKE_CARRY mov al,B_A adc al,al sbb cl,cl STORE_FLAGS_NZC al,cl mov B_A,al OPCODE_EPILOG ; 3D SPC_INC_reg X,B_X ; 3E SPC_CMP_X dp ; 3F ALIGNC EXPORT_C SPC_CALL GET_PC eax add eax,byte 3 PUSH_W xor eax,eax mov al,[1+R_NativePC] mov ah,[2+R_NativePC] cmp eax,0xFFC0 mov R_NativePC,eax mov eax,[SPC_FFC0_Address] jnb .possible_rom mov eax,_SPCRAM .possible_rom: add R_NativePC,eax mov B_SPC_Code_Base,eax OPCODE_EPILOG ; 40 ALIGNC EXPORT_C SPC_SETP mov al,1 inc R_NativePC STORE_FLAGS_P al mov B_SPC_PAGE_H,al OPCODE_EPILOG ; 41 TCALL 4 ; 42 - SPC_SET1 in SPCmain.S ; 43 - SPC_BBS in SPCmain.S ; 44 SPC_EOR_A dp ; 45 SPC_EOR_A abs ; 46 SPC_EOR_A OXO ; 47 SPC_EOR_A OOdp_XOO ; 48 ALIGNC EXPORT_C SPC_EOR_A_IM SPC_OP_A_IM_NZ EOR ; 49 SPC_EOR_mem dp_dp ; 4A ALIGNC EXPORT_C SPC_AND1 ; Carry flag = Carry flag AND mem.bit ADDR_membit ; bx contains mem and cx contains bit number GET_BYTE_SPC ; C = C && (byte & bit) mov cl,[offset_to_bit+ecx] and al,cl jnz near SPC_RETURN ; C && 1 = C STORE_FLAGS_C al ; C && 0 = 0 OPCODE_EPILOG ; 4B SPC_LSR dp ; 4C SPC_LSR abs ; 4D SPC_PUSH_reg X,B_X ; 4E ALIGNC EXPORT_C SPC_TCLR1 ; I have done this as TRB (65816) including the flag setting based on AND mov cl,B_A ADDR_abs mov ah,cl xor cl,0xFF GET_BYTE_SPC ; Get byte and ah,al ; NZ set for: mem & A STORE_FLAGS_NZ ah and al,cl SET_BYTE_SPC ; mem &= ~A OPCODE_EPILOG ; 4F ALIGNC EXPORT_C SPC_PCALL ; u-page is the last page on the SPC RAM (uppermost-page!) GET_PC eax add eax,byte 2 PUSH_W mov eax,0xFF00 mov al,[1+R_NativePC] ; upage offset cmp al,0xC0 mov R_NativePC,eax mov eax,[SPC_FFC0_Address] jnb .possible_rom mov eax,_SPCRAM .possible_rom: add R_NativePC,eax mov B_SPC_Code_Base,eax OPCODE_EPILOG ; 50 SPC_BFC BVC,SPC_FLAG_V ; 51 TCALL 5 ; 52 - SPC_CLR1 in SPCmain.S ; 53 - SPC_BBC in SPCmain.S ; 54 SPC_EOR_A Odp_XO ; 55 SPC_EOR_A Oabs_XO ; 56 SPC_EOR_A Oabs_YO ; 57 SPC_EOR_A OOdpO_YO ; 58 SPC_EOR_mem dp_IM ; 59 SPC_EOR_mem OXO_OYO ; 5A ALIGNC EXPORT_C SPC_CMPW_YA_dp ADDR_dp GET_WORD_SPC ; get DP word mov edi,eax mov eax,B_YA sub ax,di ; (0.30) Butcha: + C flag sbb cl,cl or al,ah STORE_FLAGS_N ah xor cl,0xFF STORE_FLAGS_Z al STORE_FLAGS_C cl OPCODE_EPILOG ; 5B SPC_LSR Odp_XO ; 5C ALIGNC EXPORT_C SPC_LSR_A mov al,B_A inc R_NativePC shr al,byte 1 sbb cl,cl mov B_A,al STORE_FLAGS_NZC al,cl OPCODE_EPILOG ; 5D SPC_MOV_reg_reg X__A,B_X,B_A ; 5E SPC_CMP_Y abs ; 5F ALIGNC EXPORT_C SPC_JMP_abs mov al,[1+R_NativePC] mov ah,[2+R_NativePC] cmp eax,0xFFC0 mov R_NativePC,eax mov eax,[SPC_FFC0_Address] jnb .possible_rom mov eax,_SPCRAM .possible_rom: add R_NativePC,eax mov B_SPC_Code_Base,eax OPCODE_EPILOG ; 60 ALIGNC EXPORT_C SPC_CLRC inc R_NativePC STORE_FLAGS_C ah OPCODE_EPILOG ; 61 TCALL 6 ; 62 - SPC_SET1 in SPCmain.S ; 63 - SPC_BBS in SPCmain.S ; 64 SPC_CMP_A dp ; 65 SPC_CMP_A abs ; 66 SPC_CMP_A OXO ; 67 SPC_CMP_A OOdp_XOO ; 68 ALIGNC EXPORT_C SPC_CMP_A_IM SPC_CMP_reg_IM B_A ; 69 SPC_CMP_mem dp_dp ; 6A ALIGNC EXPORT_C SPC_AND1C ; Carry flag = Carry flag AND !mem.bit ADDR_membit ; bx contains mem and cx contains bit number GET_BYTE_SPC ; C = C && !(byte & bit) mov cl,[offset_to_bit+ecx] and al,cl jz near SPC_RETURN ; C && !0 = C STORE_FLAGS_C 0 ; C && !1 = 0 OPCODE_EPILOG ; 6B SPC_ROR dp ; 6C SPC_ROR abs ; 6D SPC_PUSH_reg Y,B_Y ; 6E ALIGNC EXPORT_C SPC_DBNZ_dp mov ebx,B_SPC_PAGE mov bl,[1+R_NativePC] ; get dp add R_NativePC,byte 3 GET_BYTE_SPC ; get (dp) dec al SET_BYTE_SPC test al,al jz near SPC_RETURN movsx eax,byte [R_NativePC-1] ; sign extend for addition add R_Cycles,byte 2 ; Branch taken add R_NativePC,eax ;add dword [_TotalCycles],byte 2 ; (0.32) Butcha - fix 'lost' SPC timer ticks! OPCODE_EPILOG ; 6F ALIGNC EXPORT_C SPC_RET POP_W cmp eax,0xFFC0 mov R_NativePC,eax mov eax,[SPC_FFC0_Address] jnb .possible_rom mov eax,_SPCRAM .possible_rom: add R_NativePC,eax mov B_SPC_Code_Base,eax OPCODE_EPILOG ; 70 SPC_BFS BVS,SPC_FLAG_V ; 71 TCALL 7 ; 72 - SPC_CLR1 in SPCmain.S ; 73 - SPC_BBC in SPCmain.S ; 74 SPC_CMP_A Odp_XO ; 75 SPC_CMP_A Oabs_XO ; 76 SPC_CMP_A Oabs_YO ; 77 SPC_CMP_A OOdpO_YO ; 78 SPC_CMP_mem dp_IM ; 79 SPC_CMP_mem OXO_OYO ; 7A ALIGNC EXPORT_C SPC_ADDW_YA_dp STORE_FLAGS_V ah ADDR_dp GET_WORD_SPC ; get DP word mov ebx,B_YA add bx,ax lahf mov B_YA,ebx jno .no_overflow STORE_FLAGS_V 1 .no_overflow: sbb cl,cl STORE_FLAGS_N bh or bl,bh STORE_FLAGS_C cl STORE_FLAGS_Z bl STORE_FLAGS_H ah OPCODE_EPILOG ; 7B SPC_ROR Odp_XO ; 7C ALIGNC EXPORT_C SPC_ROR_A mov cl,B_C_flag inc R_NativePC add cl,255 ;MAKE_CARRY mov al,B_A rcr al,1 sbb cl,cl mov B_A,al STORE_FLAGS_NZC al,cl OPCODE_EPILOG ; 7D SPC_MOV_reg_reg A__X,B_A,B_X ; 7E SPC_CMP_Y dp ; 7F - RETI - not yet implemented ; 80 ALIGNC EXPORT_C SPC_SETC mov al,1 inc R_NativePC STORE_FLAGS_C al OPCODE_EPILOG ; 81 TCALL 8 ; 82 - SPC_SET1 in SPCmain.S ; 83 - SPC_BBS in SPCmain.S ; 84 SPC_ADC_A dp ; 85 SPC_ADC_A abs ; 86 SPC_ADC_A OXO ; 87 SPC_ADC_A OOdp_XOO ; 88 ALIGNC EXPORT_C SPC_ADC_A_IM STORE_FLAGS_V ah mov al,[1+R_NativePC] mov cl,B_C_flag add R_NativePC,byte 2 add cl,255 ;MAKE_CARRY mov cl,B_A adc cl,al lahf mov B_A,cl jno .no_overflow STORE_FLAGS_V 1 .no_overflow: sbb al,al STORE_FLAGS_NZ cl STORE_FLAGS_C al STORE_FLAGS_H ah OPCODE_EPILOG ; 89 SPC_ADC_mem dp_dp ; 8A ALIGNC EXPORT_C SPC_EOR1 ; Carry flag = Carry flag EOR mem.bit ADDR_membit ; bx contains mem and cx contains bit number GET_BYTE_SPC mov cl,[offset_to_bit+ecx] and al,cl jz near SPC_RETURN ; C = C EOR 0 -> C = C mov al,B_C_flag cmp al,1 sbb al,al STORE_FLAGS_C al ; C = C EOR 1 -> C = !C OPCODE_EPILOG ; 8B SPC_DEC dp ; 8C SPC_DEC abs ; 8D ALIGNC EXPORT_C SPC_MOV_Y_IM SPC_MOV_reg_IM B_Y ; 8E ALIGNC EXPORT_C SPC_POP_PSW inc R_NativePC POP_B RESTOREFLAGS_SPC OPCODE_EPILOG ; 8F ALIGNC EXPORT_C SPC_MOV_dp_IM ADDR2_dp_IM al ; immediate byte in al SET_BYTE_SPC OPCODE_EPILOG ; 90 SPC_BFC BCC,SPC_FLAG_C ; 91 TCALL 9 ; 92 - SPC_CLR1 in SPCmain.S ; 93 - SPC_BBC in SPCmain.S ; 94 SPC_ADC_A Odp_XO ; 95 SPC_ADC_A Oabs_XO ; 96 SPC_ADC_A Oabs_YO ; 97 SPC_ADC_A OOdpO_YO ; 98 SPC_ADC_mem dp_IM ; 99 SPC_ADC_mem OXO_OYO ; 9A ALIGNC EXPORT_C SPC_SUBW_YA_dp STORE_FLAGS_V ah ADDR_dp GET_WORD_SPC ; get DP word mov ebx,B_YA sub bx,ax lahf mov B_YA,ebx jno .no_overflow STORE_FLAGS_V 1 .no_overflow: sbb cl,cl STORE_FLAGS_N bh or bl,bh xor cl,0xFF STORE_FLAGS_Z bl STORE_FLAGS_C cl STORE_FLAGS_H ah OPCODE_EPILOG ; 9B SPC_DEC Odp_XO ; 9C SPC_DEC_reg A,B_A ; 9D SPC_MOV_reg_reg X__SP,B_X,B_SP ; 9E ALIGNC EXPORT_C SPC_DIV ; This may not be 100% due to overflow checking! inc R_NativePC xor ebx,ebx mov bl,B_X test bl,bl ; If zero skip divide! jz .overflow mov ax,B_YA ; Dividend xor edx,edx div bx ; Result is ax=quotient,dx=remainder test ah,ah ; Check for overflow jnz .overflow .no_overflow: mov [_Y],dl ; Remainder in Y LOAD_BASE mov [_A],al ; Quotient in A STORE_FLAGS_V ah STORE_FLAGS_NZ al OPCODE_EPILOG ALIGNC .overflow: LOAD_BASE mov ebx,0x80 mov dword [_YA],0xFFFF STORE_FLAGS_N bl STORE_FLAGS_Z bl STORE_FLAGS_V bl OPCODE_EPILOG ; 9F ALIGNC EXPORT_C SPC_XCN mov al,B_A rol al,4 inc R_NativePC mov B_A,al STORE_FLAGS_NZ al OPCODE_EPILOG ; A0 ALIGNC EXPORT_C SPC_EI mov al,1 inc R_NativePC STORE_FLAGS_I al OPCODE_EPILOG ; A1 TCALL 10 ; A2 - SPC_SET1 in SPCmain.S ; A3 - SPC_BBS in SPCmain.S ; A4 SPC_SBC_A dp ; A5 SPC_SBC_A abs ; A6 SPC_SBC_A OXO ; A7 SPC_SBC_A OOdp_XOO ; A8 ALIGNC EXPORT_C SPC_SBC_A_IM STORE_FLAGS_V ah mov al,[1+R_NativePC] mov cl,B_C_flag add R_NativePC,byte 2 cmp cl,1 ;MAKE_NOT_CARRY mov cl,B_A sbb cl,al lahf mov B_A,cl jno .no_overflow STORE_FLAGS_V 1 .no_overflow: sbb al,al STORE_FLAGS_N cl xor al,0xFF STORE_FLAGS_Z cl STORE_FLAGS_C al STORE_FLAGS_H ah OPCODE_EPILOG ; A9 SPC_SBC_mem dp_dp ; AA ALIGNC EXPORT_C SPC_MOV1_C_ ; Carry flag = mem.bit ADDR_membit ; bx contains mem and cx contains bit number GET_BYTE_SPC mov cl,[offset_to_bit+ecx] and al,cl STORE_FLAGS_C al OPCODE_EPILOG ; AB SPC_INC dp ; AC SPC_INC abs ; AD ALIGNC EXPORT_C SPC_CMP_Y_IM SPC_CMP_reg_IM B_Y ; AE SPC_POP_reg A,B_A ; AF ALIGNC EXPORT_C SPC_MOV_OXOInc_A ADDR_OXOInc mov al,B_A SET_BYTE_SPC OPCODE_EPILOG ; B0 SPC_BFS BCS,SPC_FLAG_C ; B1 TCALL 11 ; B2 - SPC_CLR1 in SPCmain.S ; B3 - SPC_BBC in SPCmain.S ; B4 SPC_SBC_A Odp_XO ; B5 SPC_SBC_A Oabs_XO ; B6 SPC_SBC_A Oabs_YO ; B7 SPC_SBC_A OOdpO_YO ; B8 SPC_SBC_mem dp_IM ; B9 SPC_SBC_mem OXO_OYO ; BA ALIGNC EXPORT_C SPC_MOVW_YA_dp ADDR_dp xor eax,eax GET_WORD_SPC mov cl,al mov B_YA,eax or cl,ah STORE_FLAGS_N ah STORE_FLAGS_Z cl OPCODE_EPILOG ; BB SPC_INC Odp_XO ; BC SPC_INC_reg A,B_A ; BD ALIGNC EXPORT_C SPC_MOV_SP_X mov al,B_X inc R_NativePC mov B_SP,al OPCODE_EPILOG ; BE - DAS - not yet implemented ; BF ALIGNC EXPORT_C SPC_MOV_A_OXOInc ADDR_OXOInc GET_BYTE_SPC mov B_A,al STORE_FLAGS_NZ al OPCODE_EPILOG ; C0 ALIGNC EXPORT_C SPC_DI inc R_NativePC STORE_FLAGS_I ah OPCODE_EPILOG ; C1 TCALL 12 ; C2 - SPC_SET1 in SPCmain.S ; C3 - SPC_BBS in SPCmain.S ; C4 SPC_MOV_mem_A dp ; C5 SPC_MOV_mem_A abs ; C6 SPC_MOV_mem_A OXO ; C7 SPC_MOV_mem_A OOdp_XOO ; C8 ALIGNC EXPORT_C SPC_CMP_X_IM SPC_CMP_reg_IM B_X ; C9 SPC_MOV_mem_X abs ; CA ALIGNC EXPORT_C SPC_MOV1__C ; mem.bit = Carry flag ADDR_membit ; bx contains mem and cx contains bit number GET_BYTE_SPC mov ah,B_C_flag test ah,ah jz .clear_bit mov cl,[offset_to_bit+ecx] or al,cl SET_BYTE_SPC OPCODE_EPILOG ALIGNC .clear_bit: mov cl,[offset_to_not+ecx] and al,cl SET_BYTE_SPC OPCODE_EPILOG ; CB SPC_MOV_mem_Y dp ; CC SPC_MOV_mem_Y abs ; CD ALIGNC EXPORT_C SPC_MOV_X_IM SPC_MOV_reg_IM B_X ; CE SPC_POP_reg X,B_X ; CF ALIGNC EXPORT_C SPC_MUL inc R_NativePC mov al,B_Y mul byte B_A mov cl,al mov B_YA,eax or cl,ah STORE_FLAGS_N ah STORE_FLAGS_Z cl OPCODE_EPILOG ; D0 SPC_BFC BNE,SPC_FLAG_Z ; D1 TCALL 13 ; D2 - SPC_CLR1 in SPCmain.S ; D3 - SPC_BBC in SPCmain.S ; D4 SPC_MOV_mem_A Odp_XO ; D5 SPC_MOV_mem_A Oabs_XO ; D6 SPC_MOV_mem_A Oabs_YO ; D7 SPC_MOV_mem_A OOdpO_YO ; D8 SPC_MOV_mem_X dp ; D9 SPC_MOV_mem_X Odp_YO ; DA ALIGNC EXPORT_C SPC_MOVW_dp_YA ADDR_dp mov eax,B_YA SET_WORD_SPC OPCODE_EPILOG ; DB SPC_MOV_mem_Y Odp_XO ; DC SPC_DEC_reg Y,B_Y ; DD SPC_MOV_reg_reg A__Y,B_A,B_Y ; DE ALIGNC EXPORT_C SPC_CBNE_Odp_XO mov ebx,B_SPC_PAGE mov al,B_X mov bl,[1+R_NativePC] ; get dp add R_NativePC,byte 3 add bl,al GET_BYTE_SPC ; Get (dp) cmp B_A,al je near SPC_RETURN movsx eax,byte [R_NativePC-1] ; sign extend for addition add R_Cycles,byte 2 ; Branch taken add R_NativePC,eax ;add dword [_TotalCycles],byte 2 OPCODE_EPILOG ; DF - DAA - not yet implemented ; E0 ALIGNC EXPORT_C SPC_CLRV inc R_NativePC STORE_FLAGS_H ah STORE_FLAGS_V ah OPCODE_EPILOG ; E1 TCALL 14 ; E2 - SPC_SET1 in SPCmain.S ; E3 - SPC_BBS in SPCmain.S ; E4 SPC_MOV_A_mem dp ; E5 SPC_MOV_A_mem abs ; E6 SPC_MOV_A_mem OXO ; E7 SPC_MOV_A_mem OOdp_XOO ; E8 ALIGNC EXPORT_C SPC_MOV_A_IM SPC_MOV_reg_IM B_A ; E9 SPC_MOV_X_mem abs ; EA ALIGNC EXPORT_C SPC_NOT1 ; !mem.bit ADDR_membit ; bx contains mem and cx contains bit number GET_BYTE_SPC mov cl,[offset_to_bit+ecx] xor al,cl ; complement the bit SET_BYTE_SPC OPCODE_EPILOG ; EB SPC_MOV_Y_mem dp ; EC SPC_MOV_Y_mem abs ; ED ALIGNC EXPORT_C SPC_NOTC mov al,B_C_flag inc R_NativePC cmp al,1 sbb al,al STORE_FLAGS_C al OPCODE_EPILOG ; EE SPC_POP_reg Y,B_Y ; EF ALIGNC EXPORT_C SPC_SLEEP OPCODE_EPILOG ; What else can sleep do? ; F0 SPC_BFS BEQ,SPC_FLAG_Z ; F1 TCALL 15 ; F2 - SPC_CLR1 in SPCmain.S ; F3 - SPC_BBC in SPCmain.S ; F4 SPC_MOV_A_mem Odp_XO ; F5 SPC_MOV_A_mem Oabs_XO ; F6 SPC_MOV_A_mem Oabs_YO ; F7 SPC_MOV_A_mem OOdpO_YO ; F8 SPC_MOV_X_mem dp ; F9 SPC_MOV_X_mem Odp_YO ; FA ALIGNC EXPORT_C SPC_MOV_dp_dp ADDR2_dp_dp al ; al is (s), bx d SET_BYTE_SPC OPCODE_EPILOG ; FB SPC_MOV_Y_mem Odp_XO ; FC SPC_INC_reg Y,B_Y ; FD SPC_MOV_reg_reg Y__A,B_Y,B_A ; FE ALIGNC EXPORT_C SPC_DBNZ_Y mov al,B_Y add R_NativePC,byte 2 dec al mov B_Y,al jz near SPC_RETURN movsx eax,byte [R_NativePC-1] ; sign extend for addition add R_Cycles,byte 2 ; Branch taken add R_NativePC,eax ;add dword [_TotalCycles],byte 2 ; (0.32) Butcha - fix 'lost' SPC timer ticks! OPCODE_EPILOG ; FF ALIGNC EXPORT_C SPC_STOP OPCODE_EPILOG ; What else can stop do?