⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spcops.inc

📁 NES game Emulator in Linux.c and asm codes.
💻 INC
📖 第 1 页 / 共 2 页
字号:
 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,C_LABEL(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 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 SPC_RETURN

 movsx eax,byte [R_NativePC-1]  ; sign extend for addition
 short_branch
 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,C_LABEL(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 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 SPC_RETURN

 movsx eax,byte [R_NativePC-1]  ; sign extend for addition
 short_branch
 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 SPC_RETURN

 movsx eax,byte [R_NativePC-1]  ; sign extend for addition
 short_branch
 OPCODE_EPILOG

; FF

ALIGNC
EXPORT_C SPC_STOP
 OPCODE_EPILOG  ; What else can stop do?

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -