2025-07-08 19:13:35 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.include "6502def.s"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD> 6502 PC <EFBFBD><EFBFBD>ַת<EFBFBD><EFBFBD>Ϊ ROM ƫ<EFBFBD>Ƶ<EFBFBD>ַ
|
|
|
|
|
.macro encodePC
|
|
|
|
|
and r1, m6502_pc, #0xE000 // r9 & 0xE000
|
|
|
|
|
ldr r2, =memmap_tbl
|
|
|
|
|
add r2, globalptr // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD> r2
|
|
|
|
|
lsr r0, r1, #11 // >>11λ
|
|
|
|
|
ldr r0, [r2, r0] // <EFBFBD><EFBFBD> r2 + r0 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD> r0
|
|
|
|
|
str r0, [globalptr,#lastbank] // <EFBFBD><EFBFBD><EFBFBD>浱ǰ bank ƫ<EFBFBD><EFBFBD>
|
|
|
|
|
add m6502_pc, m6502_pc, r0 // m6502_pc += r0
|
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 6502 <EFBFBD><EFBFBD>־<EFBFBD><EFBFBD> r0
|
|
|
|
|
.macro encodeP extra
|
2025-07-09 00:14:03 +08:00
|
|
|
|
and r0, cycles, #CYC_V+CYC_D+CYC_I+CYC_C // CYC_V+CYC_D+CYC_I+CYC_C
|
|
|
|
|
tst m6502_nz, #0x80000000 // PSR_N
|
2025-07-08 19:13:35 +08:00
|
|
|
|
IT NE
|
|
|
|
|
orrne r0, r0, #N // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> N <EFBFBD><EFBFBD>־
|
2025-07-09 00:14:03 +08:00
|
|
|
|
|
|
|
|
|
tst m6502_nz, #0xFF // Z <EFBFBD><EFBFBD>־
|
2025-07-08 19:13:35 +08:00
|
|
|
|
IT EQ
|
|
|
|
|
orreq r0, r0, #Z // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Z <EFBFBD><EFBFBD>־
|
2025-07-09 00:14:03 +08:00
|
|
|
|
orr r0, r0, #\extra // <EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־ (B/R)
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> r0 <EFBFBD>е<EFBFBD> 6502 <EFBFBD><EFBFBD>־
|
|
|
|
|
.macro decodeP
|
2025-07-09 00:14:03 +08:00
|
|
|
|
bic cycles,cycles,#CYC_V+CYC_D+CYC_I+CYC_C // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> CYC_V+CYC_D+CYC_I+CYC_C
|
2025-07-08 19:13:35 +08:00
|
|
|
|
and r1, r0, #V+D+I+C // <EFBFBD><EFBFBD>ȡ V/D/I/C <EFBFBD><EFBFBD>־
|
2025-07-09 00:14:03 +08:00
|
|
|
|
orr cycles,cycles,r1 // д<EFBFBD><EFBFBD> cycles
|
|
|
|
|
bic m6502_nz, r0, #0xFD // r0 is signed
|
|
|
|
|
eor m6502_nz, m6502_nz, #Z // <EFBFBD><EFBFBD>ת Z λ
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ָ<EFBFBD>ִ<EFBFBD><EFBFBD>
|
|
|
|
|
.macro fetch count
|
2025-07-09 00:14:03 +08:00
|
|
|
|
ldr r0, [r10,#clocksh]
|
2025-07-08 19:13:35 +08:00
|
|
|
|
add r0, r0, \count
|
|
|
|
|
str r0, [globalptr,#clocksh]
|
|
|
|
|
|
|
|
|
|
ldr r1, [globalptr,#opz]
|
2025-07-09 00:14:03 +08:00
|
|
|
|
subs cycles, cycles, \count*256
|
2025-07-08 19:13:35 +08:00
|
|
|
|
|
2025-07-09 00:14:03 +08:00
|
|
|
|
ITT PL
|
|
|
|
|
ldrbpl r0, [m6502_pc], #1
|
2025-07-08 19:13:35 +08:00
|
|
|
|
ldrpl pc, [r1, r0, lsl #2]
|
|
|
|
|
|
|
|
|
|
ldr pc, [globalptr,#nexttimeout]
|
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// ͬ<EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Carry λ
|
|
|
|
|
.macro fetch_c count
|
|
|
|
|
ldr r0, [globalptr,#clocksh]
|
|
|
|
|
add r0, r0, \count
|
|
|
|
|
str r0, [globalptr,#clocksh]
|
|
|
|
|
|
|
|
|
|
ldr r1, [globalptr,#opz]
|
2025-07-09 00:14:03 +08:00
|
|
|
|
sbcs cycles, cycles, \count*256
|
2025-07-08 19:13:35 +08:00
|
|
|
|
|
2025-07-09 00:14:03 +08:00
|
|
|
|
ITT PL
|
|
|
|
|
ldrbpl r0, [m6502_pc], #1
|
2025-07-08 19:13:35 +08:00
|
|
|
|
ldrpl pc, [r1, r0, lsl #2]
|
|
|
|
|
|
|
|
|
|
ldr pc, [globalptr,#nexttimeout]
|
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD>־
|
|
|
|
|
.macro clearcycles
|
2025-07-09 00:14:03 +08:00
|
|
|
|
and cycles,cycles,#CYC_MASK // CYC_MASK
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD>ַ<EFBFBD><EFBFBD>ȡ
|
|
|
|
|
.macro readmemabs
|
2025-07-09 00:14:03 +08:00
|
|
|
|
and r1, addy, #0xE000
|
2025-07-08 19:13:35 +08:00
|
|
|
|
adr lr, 0f
|
|
|
|
|
lsr r1, r1, #11
|
2025-07-09 00:14:03 +08:00
|
|
|
|
ldr pc, [m6502_rmem, r1]
|
2025-07-08 19:13:35 +08:00
|
|
|
|
0:
|
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD>ȡ
|
|
|
|
|
.macro readmemzp
|
2025-07-09 00:14:03 +08:00
|
|
|
|
ldrb r0, [cpu_zpage, addy]
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
|
|
|
|
|
.macro readmemzpi
|
2025-07-09 00:14:03 +08:00
|
|
|
|
lsr r0, addy, #24
|
|
|
|
|
ldrb r0, [cpu_zpage, r0]
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// RAM <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> NZ
|
|
|
|
|
.macro readmemzps
|
2025-07-09 00:14:03 +08:00
|
|
|
|
ldrsb m6502_nz, [cpu_zpage,addy]
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ
|
|
|
|
|
.macro readmemimm
|
2025-07-09 00:14:03 +08:00
|
|
|
|
ldrb r0, [m6502_pc], #1
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> NZ
|
|
|
|
|
.macro readmemimms
|
2025-07-09 00:14:03 +08:00
|
|
|
|
ldrsb m6502_nz, [m6502_pc], #1
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ʽ
|
|
|
|
|
.macro readmem
|
|
|
|
|
.if _type == _ABS
|
|
|
|
|
readmemabs
|
|
|
|
|
.elseif _type == _ZP
|
|
|
|
|
readmemzp
|
|
|
|
|
.elseif _type == _ZPI
|
|
|
|
|
readmemzpi
|
|
|
|
|
.elseif _type == _IMM
|
|
|
|
|
readmemimm
|
|
|
|
|
.endif
|
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD>Ķ<EFBFBD>ȡ
|
|
|
|
|
.macro readmems
|
|
|
|
|
.if _type == _ABS
|
|
|
|
|
readmemabs
|
2025-07-09 00:14:03 +08:00
|
|
|
|
orr m6502_nz, r0, r0, lsl #24
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.elseif _type == _ZP
|
|
|
|
|
readmemzps
|
|
|
|
|
.elseif _type == _IMM
|
|
|
|
|
readmemimms
|
|
|
|
|
.endif
|
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD>ַд<EFBFBD><EFBFBD>
|
|
|
|
|
.macro writememabs
|
2025-07-09 00:14:03 +08:00
|
|
|
|
and r1, addy, #0xE000
|
|
|
|
|
@ ldr r2, =writemem_tbl
|
|
|
|
|
@ add r2, globalptr
|
|
|
|
|
add r2, globalptr,#writemem_tbl
|
|
|
|
|
adr lr, 0f
|
2025-07-08 19:13:35 +08:00
|
|
|
|
|
|
|
|
|
lsr r1, r1, #11
|
|
|
|
|
ldr pc, [r2, r1]
|
|
|
|
|
0:
|
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD>ҳд<EFBFBD><EFBFBD>
|
|
|
|
|
.macro writememzp
|
2025-07-09 00:14:03 +08:00
|
|
|
|
strb r0, [cpu_zpage,addy]
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>
|
|
|
|
|
.macro writememzpi
|
2025-07-09 00:14:03 +08:00
|
|
|
|
lsr r1, addy, #24
|
|
|
|
|
strb r0, [cpu_zpage, r1]
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>д<EFBFBD>뷽ʽ
|
|
|
|
|
.macro writemem
|
|
|
|
|
.if _type == _ABS
|
|
|
|
|
writememabs
|
|
|
|
|
.elseif _type == _ZP
|
|
|
|
|
writememzp
|
|
|
|
|
.elseif _type == _ZPI
|
|
|
|
|
writememzpi
|
|
|
|
|
.endif
|
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// 16λѹջ
|
|
|
|
|
.macro push16
|
|
|
|
|
mov r1, r0, lsr #8
|
|
|
|
|
ldr r2, [globalptr,#m6502_s]
|
|
|
|
|
strb r1, [r2], #-1
|
|
|
|
|
orr r2, r2, #0x100
|
|
|
|
|
strb r0, [r2], #-1
|
|
|
|
|
strb r2, [globalptr,#m6502_s]
|
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// 8λѹջ
|
|
|
|
|
.macro push8 x
|
|
|
|
|
ldr r2, [globalptr,#m6502_s]
|
|
|
|
|
strb \x, [r2], #-1
|
|
|
|
|
strb r2, [globalptr,#m6502_s]
|
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// 16λ<EFBFBD><EFBFBD>ջ
|
|
|
|
|
.macro pop16
|
|
|
|
|
ldrb r2, [globalptr,#m6502_s]
|
|
|
|
|
add r2, r2, #2
|
|
|
|
|
strb r2, [globalptr,#m6502_s]
|
|
|
|
|
ldr r2, [globalptr,#m6502_s]
|
|
|
|
|
ldrb r0, [r2], #-1
|
|
|
|
|
orr r2, r2, #0x100
|
2025-07-09 00:14:03 +08:00
|
|
|
|
ldrb m6502_pc, [r2]
|
|
|
|
|
orr m6502_pc, m6502_pc, r0, lsl #8
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// 8λ<EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD>
|
|
|
|
|
.macro pop8 x
|
|
|
|
|
ldrb r2, [globalptr,#m6502_s]
|
|
|
|
|
add r2, r2, #1
|
|
|
|
|
strb r2, [globalptr,#m6502_s]
|
|
|
|
|
orr r2, r2, #0x100
|
2025-07-09 00:14:03 +08:00
|
|
|
|
ldrsb \x, [cpu_zpage, r2]
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѱַģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
.equ _IMM, 1
|
|
|
|
|
.equ _ZP, 2
|
|
|
|
|
.equ _ZPI, 3
|
|
|
|
|
.equ _ABS, 4
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѱַ
|
|
|
|
|
.macro doABS
|
|
|
|
|
.set _type, _ABS
|
2025-07-09 00:14:03 +08:00
|
|
|
|
ldrb addy, [m6502_pc], #1
|
|
|
|
|
ldrb r0, [m6502_pc], #1
|
|
|
|
|
orr addy, addy, r0, lsl #8
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// X<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
.macro doAIX
|
|
|
|
|
.set _type, _ABS
|
2025-07-09 00:14:03 +08:00
|
|
|
|
ldrb addy, [m6502_pc], #1
|
|
|
|
|
ldrb r0, [m6502_pc], #1
|
|
|
|
|
orr addy, addy, r0, lsl #8
|
|
|
|
|
add addy, addy, m6502_x, lsr #24
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// Y<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
.macro doAIY
|
|
|
|
|
.set _type, _ABS
|
2025-07-09 00:14:03 +08:00
|
|
|
|
ldrb addy, [m6502_pc], #1
|
|
|
|
|
ldrb r0, [m6502_pc], #1
|
|
|
|
|
orr addy, addy, r0, lsl #8
|
|
|
|
|
add addy, addy, m6502_y, lsr #24
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѱַ
|
|
|
|
|
.macro doIMM
|
|
|
|
|
.set _type, _IMM
|
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// X<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѱַ
|
|
|
|
|
.macro doIIX
|
|
|
|
|
.set _type, _ABS
|
2025-07-09 00:14:03 +08:00
|
|
|
|
ldrb r0, [m6502_pc], #1
|
|
|
|
|
add r0, m6502_x, r0, lsl #24
|
|
|
|
|
lsr addy, r0, #24
|
|
|
|
|
ldrb addy, [cpu_zpage, addy]
|
2025-07-08 19:13:35 +08:00
|
|
|
|
add r0, r0, #0x01000000
|
|
|
|
|
lsr r1, r0, #24
|
2025-07-09 00:14:03 +08:00
|
|
|
|
ldrb r1, [cpu_zpage, r1]
|
|
|
|
|
orr addy, addy, r1, lsl #8
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// Y<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѱַ
|
|
|
|
|
.macro doIIY
|
|
|
|
|
.set _type, _ABS
|
2025-07-09 00:14:03 +08:00
|
|
|
|
ldrb r0, [m6502_pc], #1
|
|
|
|
|
ldrb addy, [r0,cpu_zpage]
|
|
|
|
|
add r0, r0, cpu_zpage
|
2025-07-08 19:13:35 +08:00
|
|
|
|
ldrb r1, [r0, #1]
|
2025-07-09 00:14:03 +08:00
|
|
|
|
orr addy, addy, r1, lsl #8
|
|
|
|
|
add addy, addy, m6502_y, lsr #24
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѱַ
|
|
|
|
|
.macro doZPI
|
|
|
|
|
.set _type, _ABS
|
2025-07-09 00:14:03 +08:00
|
|
|
|
ldrb r0, [m6502_pc], #1
|
|
|
|
|
ldrb addy, [r0,cpu_zpage]
|
|
|
|
|
add r0, r0, cpu_zpage
|
2025-07-08 19:13:35 +08:00
|
|
|
|
ldrb r1, [r0, #1]
|
2025-07-09 00:14:03 +08:00
|
|
|
|
orr addy, addy, r1, lsl #8
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD>ҳѰַ
|
|
|
|
|
.macro doZ
|
|
|
|
|
.set _type, _ZP
|
2025-07-09 00:14:03 +08:00
|
|
|
|
ldrb addy, [m6502_pc], #1
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD>ҳ˫<EFBFBD>ֽ<EFBFBD>Ѱַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> bbr/bbs<EFBFBD><EFBFBD>
|
|
|
|
|
.macro doZ2
|
|
|
|
|
.set _type, _ZP
|
2025-07-09 00:14:03 +08:00
|
|
|
|
ldrb addy, [m6502_pc], #2
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD>ҳX<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
.macro doZIX
|
|
|
|
|
.set _type, _ZP
|
2025-07-09 00:14:03 +08:00
|
|
|
|
ldrb addy, [m6502_pc], #1
|
|
|
|
|
add addy, addy, m6502_x, lsr #24
|
|
|
|
|
and addy, addy, #0xff
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD>ҳX<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>
|
|
|
|
|
.macro doZIXf
|
|
|
|
|
.set _type, _ZPI
|
2025-07-09 00:14:03 +08:00
|
|
|
|
ldrb addy, [m6502_pc], #1
|
|
|
|
|
add addy, m6502_x, addy, lsl #24
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD>ҳY<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
.macro doZIY
|
|
|
|
|
.set _type, _ZP
|
2025-07-09 00:14:03 +08:00
|
|
|
|
ldrb addy, [m6502_pc], #1
|
|
|
|
|
add addy, addy, m6502_y, lsr #24
|
|
|
|
|
and addy, addy, #0xff
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD>ҳY<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>
|
|
|
|
|
.macro doZIYf
|
|
|
|
|
.set _type, _ZPI
|
2025-07-09 00:14:03 +08:00
|
|
|
|
ldrb addy, [m6502_pc], #1
|
|
|
|
|
add addy, m6502_y, addy, lsl #24
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// ADC <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
.macro opADC
|
|
|
|
|
readmem
|
2025-07-09 00:14:03 +08:00
|
|
|
|
movs r1, cycles, lsr #1
|
2025-07-08 19:13:35 +08:00
|
|
|
|
|
|
|
|
|
IT CS
|
|
|
|
|
subcs r0, r0, #0x00000100
|
2025-07-09 00:14:03 +08:00
|
|
|
|
adcs m6502_a, m6502_a, r0, ror #8
|
2025-07-08 19:13:35 +08:00
|
|
|
|
|
2025-07-09 00:14:03 +08:00
|
|
|
|
mov m6502_nz, m6502_a, asr #24
|
|
|
|
|
orr cycles, cycles, #CYC_C+CYC_V
|
2025-07-08 19:13:35 +08:00
|
|
|
|
|
|
|
|
|
IT VC
|
2025-07-09 00:14:03 +08:00
|
|
|
|
bicvc cycles, cycles, #CYC_V
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// AND <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
.macro opAND
|
|
|
|
|
readmem
|
2025-07-09 00:14:03 +08:00
|
|
|
|
and m6502_a, m6502_a, r0, lsl #24
|
|
|
|
|
mov m6502_nz, m6502_a, asr #24
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// ASL <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
.macro opASL
|
|
|
|
|
readmem
|
|
|
|
|
add r0, r0, r0
|
2025-07-09 00:14:03 +08:00
|
|
|
|
orrs m6502_nz, r0, r0, lsl #24
|
|
|
|
|
orr cycles, cycles, #CYC_C
|
2025-07-08 19:13:35 +08:00
|
|
|
|
writemem
|
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// BIT <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
.macro opBIT
|
|
|
|
|
readmem
|
2025-07-09 00:14:03 +08:00
|
|
|
|
bic cycles, cycles, #CYC_V
|
2025-07-08 19:13:35 +08:00
|
|
|
|
tst r0, #V
|
|
|
|
|
|
|
|
|
|
IT NE
|
2025-07-09 00:14:03 +08:00
|
|
|
|
orrne cycles, cycles, #CYC_V
|
2025-07-08 19:13:35 +08:00
|
|
|
|
|
2025-07-09 00:14:03 +08:00
|
|
|
|
and m6502_nz, r0, m6502_a, lsr #24
|
|
|
|
|
orr m6502_nz, m6502_nz, r0, lsl #24
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD>Ƚϲ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
.macro opCOMP x
|
|
|
|
|
readmem
|
2025-07-09 00:14:03 +08:00
|
|
|
|
subs m6502_nz, \x, r0, lsl #24
|
|
|
|
|
mov m6502_nz, m6502_nz, asr #24
|
|
|
|
|
orr cycles, cycles, #CYC_C
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
.macro opDEC
|
|
|
|
|
readmem
|
|
|
|
|
sub r0, r0, #1
|
2025-07-09 00:14:03 +08:00
|
|
|
|
orr m6502_nz, r0, r0, lsl #24
|
2025-07-08 19:13:35 +08:00
|
|
|
|
writemem
|
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
.macro opEOR
|
|
|
|
|
readmem
|
2025-07-09 00:14:03 +08:00
|
|
|
|
eor m6502_a, m6502_a, r0, lsl #24
|
|
|
|
|
mov m6502_nz, m6502_a, asr #24
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
.macro opINC
|
|
|
|
|
readmem
|
|
|
|
|
add r0, r0, #1
|
2025-07-09 00:14:03 +08:00
|
|
|
|
orr m6502_nz, r0, r0, lsl #24
|
2025-07-08 19:13:35 +08:00
|
|
|
|
writemem
|
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
.macro opLOAD x
|
|
|
|
|
readmems
|
2025-07-09 00:14:03 +08:00
|
|
|
|
mov \x, m6502_nz, lsl #24
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
.macro opLSR
|
|
|
|
|
.if _type == _ABS
|
|
|
|
|
readmemabs
|
|
|
|
|
movs r0, r0, lsr #1
|
2025-07-09 00:14:03 +08:00
|
|
|
|
orr cycles, cycles, #CYC_C
|
|
|
|
|
mov m6502_nz, r0
|
2025-07-08 19:13:35 +08:00
|
|
|
|
writememabs
|
|
|
|
|
.elseif _type == _ZP
|
2025-07-09 00:14:03 +08:00
|
|
|
|
ldrb m6502_nz, [cpu_zpage, addy]
|
|
|
|
|
movs m6502_nz, m6502_nz, lsr #1
|
|
|
|
|
orr cycles, cycles, #CYC_C
|
|
|
|
|
strb m6502_nz, [cpu_zpage, addy]
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.elseif _type == _ZPI
|
2025-07-09 00:14:03 +08:00
|
|
|
|
lsr m6502_nz, addy, #24
|
|
|
|
|
ldrb m6502_nz, [cpu_zpage, m6502_nz]
|
|
|
|
|
movs m6502_nz, m6502_nz, lsr #1
|
|
|
|
|
orr cycles, cycles, #CYC_C
|
|
|
|
|
lsr r1, addy, #24
|
|
|
|
|
strb m6502_nz, [cpu_zpage, r1]
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endif
|
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// OR <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
.macro opORA
|
|
|
|
|
readmem
|
2025-07-09 00:14:03 +08:00
|
|
|
|
orr m6502_a, m6502_a, r0, lsl #24
|
|
|
|
|
mov m6502_nz, m6502_a, asr #24
|
2025-07-08 19:13:35 +08:00
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
.macro opROL
|
|
|
|
|
readmem
|
2025-07-09 00:14:03 +08:00
|
|
|
|
movs cycles, cycles, lsr #1
|
2025-07-08 19:13:35 +08:00
|
|
|
|
adc r0, r0, r0
|
2025-07-09 00:14:03 +08:00
|
|
|
|
orrs m6502_nz, r0, r0, lsl #24
|
|
|
|
|
adc cycles, cycles, cycles
|
2025-07-08 19:13:35 +08:00
|
|
|
|
writemem
|
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
.macro opROR
|
|
|
|
|
readmem
|
2025-07-09 00:14:03 +08:00
|
|
|
|
movs cycles, cycles, lsr #1
|
2025-07-08 19:13:35 +08:00
|
|
|
|
|
|
|
|
|
IT CS
|
|
|
|
|
orrcs r0, r0, #0x100
|
|
|
|
|
|
|
|
|
|
movs r0, r0, lsr #1
|
2025-07-09 00:14:03 +08:00
|
|
|
|
orr m6502_nz, r0, r0, lsl #24
|
|
|
|
|
adc cycles, cycles, cycles
|
2025-07-08 19:13:35 +08:00
|
|
|
|
writemem
|
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
.macro opSBC
|
|
|
|
|
readmem
|
|
|
|
|
movs r1, cycles, lsr #1
|
|
|
|
|
sbcs m6502_a, m6502_a, r0, lsl #24
|
|
|
|
|
and m6502_a, m6502_a, #0xff000000
|
|
|
|
|
mov m6502_nz, m6502_a, asr #24
|
2025-07-09 00:14:03 +08:00
|
|
|
|
orr cycles, cycles, #CYC_C+CYC_V
|
2025-07-08 19:13:35 +08:00
|
|
|
|
|
|
|
|
|
IT VC
|
|
|
|
|
bicvc cycles, cycles, #CYC_V
|
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.macro opSTORE x
|
|
|
|
|
mov r0, \x, lsr #24
|
|
|
|
|
writemem
|
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
@ .global main
|
|
|
|
|
@ .type main, %function
|
|
|
|
|
@ mian:
|
|
|
|
|
@ encodePC
|
|
|
|
|
@ encodeP (B+R)
|
|
|
|
|
@ encodeP (R)
|
|
|
|
|
@ decodeP
|
|
|
|
|
@ fetch 10
|
|
|
|
|
@ fetch_c 10
|
|
|
|
|
|
|
|
|
|
@ clearcycles
|
|
|
|
|
@ readmemabs
|
|
|
|
|
@ readmemzp
|
|
|
|
|
@ readmemzpi
|
|
|
|
|
@ readmemzps
|
|
|
|
|
@ readmemimm
|
|
|
|
|
@ readmemimms
|
|
|
|
|
@ readmem
|
|
|
|
|
@ readmems
|
|
|
|
|
@ writememabs
|
|
|
|
|
@ writememzp
|
|
|
|
|
@ writememzpi
|
|
|
|
|
@ writemem
|
|
|
|
|
@ push16
|
|
|
|
|
@ push8 r0
|
|
|
|
|
@ pop16
|
|
|
|
|
@ pop8 r0
|
|
|
|
|
@ doABS
|
|
|
|
|
@ doAIX
|
|
|
|
|
@ doAIY
|
|
|
|
|
@ doIMM
|
|
|
|
|
@ doIIX
|
|
|
|
|
@ doIIY
|
|
|
|
|
@ doZPI
|
|
|
|
|
@ doZ
|
|
|
|
|
@ doZ2
|
|
|
|
|
@ doZIX
|
|
|
|
|
@ doZIXf
|
|
|
|
|
@ doZIY
|
|
|
|
|
@ doZIYf
|
|
|
|
|
@ opADC
|
|
|
|
|
@ opAND
|
|
|
|
|
@ opASL
|
|
|
|
|
@ opBIT
|
|
|
|
|
@ opCOMP r5
|
|
|
|
|
@ opDEC
|
|
|
|
|
@ opEOR
|
|
|
|
|
@ opINC
|
|
|
|
|
@ opLOAD r5
|
|
|
|
|
@ opLSR
|
|
|
|
|
@ opORA
|
|
|
|
|
@ opROL
|
|
|
|
|
@ opROR
|
|
|
|
|
@ opSBC
|
|
|
|
|
@ opSTORE r5
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|