diff --git a/Project/6502_a.s b/Project/6502_a.s new file mode 100644 index 0000000..95245ef Binary files /dev/null and b/Project/6502_a.s differ diff --git a/Project/Src/NES/6502mac_gcc.S b/Project/Src/NES/6502mac_gcc.S index b44ccc2..8709d98 100644 --- a/Project/Src/NES/6502mac_gcc.S +++ b/Project/Src/NES/6502mac_gcc.S @@ -19,38 +19,37 @@ // 打包 6502 标志到 r0 .macro encodeP extra - and r0, r8, #0x4F // CYC_V+CYC_D+CYC_I+CYC_C - tst r3, #0x80000000 // PSR_N + 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 IT NE orrne r0, r0, #N // 设置 N 标志 - tst r3, #0xFF // Z 标志 + + tst m6502_nz, #0xFF // Z 标志 IT EQ orreq r0, r0, #Z // 设置 Z 标志 - orr r0, r0, \extra // 添加额外标志 (B/R) + orr r0, r0, #\extra // 添加额外标志 (B/R) .endm // 解包 r0 中的 6502 标志 .macro decodeP - bic r8, r8, #0x4F // 清除 CYC_V+CYC_D+CYC_I+CYC_C + bic cycles,cycles,#CYC_V+CYC_D+CYC_I+CYC_C // 清除 CYC_V+CYC_D+CYC_I+CYC_C and r1, r0, #V+D+I+C // 提取 V/D/I/C 标志 - orr r8, r8, r1 // 写入 cycles - bic r3, r0, #0xFD // r0 is signed - eor r3, r3, #Z // 反转 Z 位 + orr cycles,cycles,r1 // 写入 cycles + bic m6502_nz, r0, #0xFD // r0 is signed + eor m6502_nz, m6502_nz, #Z // 反转 Z 位 .endm // 获取下一条指令并执行 .macro fetch count - ldr r0, [globalptr,#clocksh] + ldr r0, [r10,#clocksh] add r0, r0, \count str r0, [globalptr,#clocksh] ldr r1, [globalptr,#opz] - subs r8, r8, \count * 256 + subs cycles, cycles, \count*256 - IT PL - ldrbpl r0, [r9], #1 - - IT PL + ITT PL + ldrbpl r0, [m6502_pc], #1 ldrpl pc, [r1, r0, lsl #2] ldr pc, [globalptr,#nexttimeout] @@ -63,12 +62,10 @@ str r0, [globalptr,#clocksh] ldr r1, [globalptr,#opz] - sbcs r8, r8, \count * 256 + sbcs cycles, cycles, \count*256 - IT PL - ldrbpl r0, [r9], #1 - - IT PL + ITT PL + ldrbpl r0, [m6502_pc], #1 ldrpl pc, [r1, r0, lsl #2] ldr pc, [globalptr,#nexttimeout] @@ -76,42 +73,42 @@ // 清除周期标志 .macro clearcycles - and r8, r8, #0xFF // CYC_MASK + and cycles,cycles,#CYC_MASK // CYC_MASK .endm // 绝对地址读取 .macro readmemabs - and r1, r12, #0xE000 + and r1, addy, #0xE000 adr lr, 0f lsr r1, r1, #11 - ldr pc, [r4, r1] + ldr pc, [m6502_rmem, r1] 0: .endm // 零页读取 .macro readmemzp - ldrb r0, [r11, r12] + ldrb r0, [cpu_zpage, addy] .endm // 零页索引读取(带高位) .macro readmemzpi - lsr r0, r12, #24 - ldrb r0, [r11, r0] + lsr r0, addy, #24 + ldrb r0, [cpu_zpage, r0] .endm // RAM 读取并设置 NZ .macro readmemzps - ldrsb r3, [r11, r12] + ldrsb m6502_nz, [cpu_zpage,addy] .endm // 立即数读取 .macro readmemimm - ldrb r0, [r9], #1 + ldrb r0, [m6502_pc], #1 .endm // 立即数读取并设置 NZ .macro readmemimms - ldrsb r3, [r9], #1 + ldrsb m6502_nz, [m6502_pc], #1 .endm // 根据类型选择读取方式 @@ -131,7 +128,7 @@ .macro readmems .if _type == _ABS readmemabs - orr r3, r0, r0, lsl #24 + orr m6502_nz, r0, r0, lsl #24 .elseif _type == _ZP readmemzps .elseif _type == _IMM @@ -141,10 +138,11 @@ // 绝对地址写入 .macro writememabs - and r1, r12, #0xE000 - // adr r2, writemem_tbl - ldr r2, =writemem_tbl - add r2, r10 + and r1, addy, #0xE000 + @ ldr r2, =writemem_tbl + @ add r2, globalptr + add r2, globalptr,#writemem_tbl + adr lr, 0f lsr r1, r1, #11 ldr pc, [r2, r1] @@ -153,13 +151,13 @@ // 零页写入 .macro writememzp - strb r0, [r11, r12] + strb r0, [cpu_zpage,addy] .endm // 零页索引写入 .macro writememzpi - lsr r1, r12, #24 - strb r0, [r11, r1] + lsr r1, addy, #24 + strb r0, [cpu_zpage, r1] .endm // 根据类型选择写入方式 @@ -198,8 +196,8 @@ ldr r2, [globalptr,#m6502_s] ldrb r0, [r2], #-1 orr r2, r2, #0x100 - ldrb r9, [r2] - orr r9, r9, r0, lsl #8 + ldrb m6502_pc, [r2] + orr m6502_pc, m6502_pc, r0, lsl #8 .endm // 8位弹栈(带符号扩展) @@ -208,7 +206,7 @@ add r2, r2, #1 strb r2, [globalptr,#m6502_s] orr r2, r2, #0x100 - ldrsb \x, [r11, r2] + ldrsb \x, [cpu_zpage, r2] .endm // 定义寻址模式常量 @@ -220,27 +218,27 @@ // 绝对寻址 .macro doABS .set _type, _ABS - ldrb r12, [r9], #1 - ldrb r0, [r9], #1 - orr r12, r12, r0, lsl #8 + ldrb addy, [m6502_pc], #1 + ldrb r0, [m6502_pc], #1 + orr addy, addy, r0, lsl #8 .endm // X寄存器绝对索引 .macro doAIX .set _type, _ABS - ldrb r12, [r9], #1 - ldrb r0, [r9], #1 - orr r12, r12, r0, lsl #8 - add r12, r12, r6, lsr #24 + ldrb addy, [m6502_pc], #1 + ldrb r0, [m6502_pc], #1 + orr addy, addy, r0, lsl #8 + add addy, addy, m6502_x, lsr #24 .endm // Y寄存器绝对索引 .macro doAIY .set _type, _ABS - ldrb r12, [r9], #1 - ldrb r0, [r9], #1 - orr r12, r12, r0, lsl #8 - add r12, r12, r7, lsr #24 + ldrb addy, [m6502_pc], #1 + ldrb r0, [m6502_pc], #1 + orr addy, addy, r0, lsl #8 + add addy, addy, m6502_y, lsr #24 .endm // 立即数寻址 @@ -251,159 +249,159 @@ // X寄存器间接寻址 .macro doIIX .set _type, _ABS - ldrb r0, [r9], #1 - add r0, r6, r0, lsl #24 - lsr r12, r0, #24 - ldrb r12, [r11, r12] + ldrb r0, [m6502_pc], #1 + add r0, m6502_x, r0, lsl #24 + lsr addy, r0, #24 + ldrb addy, [cpu_zpage, addy] add r0, r0, #0x01000000 lsr r1, r0, #24 - ldrb r1, [r11, r1] - orr r12, r12, r1, lsl #8 + ldrb r1, [cpu_zpage, r1] + orr addy, addy, r1, lsl #8 .endm // Y寄存器间接寻址 .macro doIIY .set _type, _ABS - ldrb r0, [r9], #1 - ldrb r12, [r11, r0] - add r0, r0, r11 + ldrb r0, [m6502_pc], #1 + ldrb addy, [r0,cpu_zpage] + add r0, r0, cpu_zpage ldrb r1, [r0, #1] - orr r12, r12, r1, lsl #8 - add r12, r12, r7, lsr #24 + orr addy, addy, r1, lsl #8 + add addy, addy, m6502_y, lsr #24 .endm // 零页间接寻址 .macro doZPI .set _type, _ABS - ldrb r0, [r9], #1 - ldrb r12, [r11, r0] - add r0, r0, r11 + ldrb r0, [m6502_pc], #1 + ldrb addy, [r0,cpu_zpage] + add r0, r0, cpu_zpage ldrb r1, [r0, #1] - orr r12, r12, r1, lsl #8 + orr addy, addy, r1, lsl #8 .endm // 零页寻址 .macro doZ .set _type, _ZP - ldrb r12, [r9], #1 + ldrb addy, [m6502_pc], #1 .endm // 零页双字节寻址(用于 bbr/bbs) .macro doZ2 .set _type, _ZP - ldrb r12, [r9], #2 + ldrb addy, [m6502_pc], #2 .endm // 零页X索引 .macro doZIX .set _type, _ZP - ldrb r12, [r9], #1 - add r12, r12, r6, lsr #24 - and r12, r12, #0xff + ldrb addy, [m6502_pc], #1 + add addy, addy, m6502_x, lsr #24 + and addy, addy, #0xff .endm // 零页X索引(带左移) .macro doZIXf .set _type, _ZPI - ldrb r12, [r9], #1 - add r12, r6, r12, lsl #24 + ldrb addy, [m6502_pc], #1 + add addy, m6502_x, addy, lsl #24 .endm // 零页Y索引 .macro doZIY .set _type, _ZP - ldrb r12, [r9], #1 - add r12, r12, r7, lsr #24 - and r12, r12, #0xff + ldrb addy, [m6502_pc], #1 + add addy, addy, m6502_y, lsr #24 + and addy, addy, #0xff .endm // 零页Y索引(带左移) .macro doZIYf .set _type, _ZPI - ldrb r12, [r9], #1 - add r12, r7, r12, lsl #24 + ldrb addy, [m6502_pc], #1 + add addy, m6502_y, addy, lsl #24 .endm // ADC 操作 .macro opADC readmem - movs r1, r8, lsr #1 + movs r1, cycles, lsr #1 IT CS subcs r0, r0, #0x00000100 - adcs r5, r5, r0, ror #8 + adcs m6502_a, m6502_a, r0, ror #8 - mov r3, r5, asr #24 - orr r8, r8, #CYC_C+CYC_V + mov m6502_nz, m6502_a, asr #24 + orr cycles, cycles, #CYC_C+CYC_V IT VC - bicvc r8, r8, #CYC_V + bicvc cycles, cycles, #CYC_V .endm // AND 操作 .macro opAND readmem - and r5, r5, r0, lsl #24 - mov r3, r5, asr #24 + and m6502_a, m6502_a, r0, lsl #24 + mov m6502_nz, m6502_a, asr #24 .endm // ASL 操作 .macro opASL readmem add r0, r0, r0 - orrs r3, r0, r0, lsl #24 - orr r8, r8, #CYC_C + orrs m6502_nz, r0, r0, lsl #24 + orr cycles, cycles, #CYC_C writemem .endm // BIT 操作 .macro opBIT readmem - bic r8, r8, #CYC_V + bic cycles, cycles, #CYC_V tst r0, #V IT NE - orrne r8, r8, #CYC_V + orrne cycles, cycles, #CYC_V - and r3, r0, r5, lsr #24 - orr r3, r3, r0, lsl #24 + and m6502_nz, r0, m6502_a, lsr #24 + orr m6502_nz, m6502_nz, r0, lsl #24 .endm // 比较操作 .macro opCOMP x readmem - subs r3, \x, r0, lsl #24 - mov r3, r3, asr #24 - orr r8, r8, #CYC_C + subs m6502_nz, \x, r0, lsl #24 + mov m6502_nz, m6502_nz, asr #24 + orr cycles, cycles, #CYC_C .endm // 减一操作 .macro opDEC readmem sub r0, r0, #1 - orr r3, r0, r0, lsl #24 + orr m6502_nz, r0, r0, lsl #24 writemem .endm // 异或操作 .macro opEOR readmem - eor r5, r5, r0, lsl #24 - mov r3, r5, asr #24 + eor m6502_a, m6502_a, r0, lsl #24 + mov m6502_nz, m6502_a, asr #24 .endm // 加一操作 .macro opINC readmem add r0, r0, #1 - orr r3, r0, r0, lsl #24 + orr m6502_nz, r0, r0, lsl #24 writemem .endm // 加载操作 .macro opLOAD x readmems - mov \x, r3, lsl #24 + mov \x, m6502_nz, lsl #24 .endm // 逻辑右移 @@ -411,52 +409,52 @@ .if _type == _ABS readmemabs movs r0, r0, lsr #1 - orr r8, r8, #CYC_C - mov r3, r0 + orr cycles, cycles, #CYC_C + mov m6502_nz, r0 writememabs .elseif _type == _ZP - ldrb r3, [r11, r12] - movs r3, r3, lsr #1 - orr r8, r8, #CYC_C - strb r3, [r11, r12] + ldrb m6502_nz, [cpu_zpage, addy] + movs m6502_nz, m6502_nz, lsr #1 + orr cycles, cycles, #CYC_C + strb m6502_nz, [cpu_zpage, addy] .elseif _type == _ZPI - lsr r3, r12, #24 - ldrb r3, [r11, r3] - movs r3, r3, lsr #1 - orr r8, r8, #CYC_C - lsr r1, r12, #24 - strb r3, [r11, r1] + 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] .endif .endm // OR 操作 .macro opORA readmem - orr r5, r5, r0, lsl #24 - mov r3, r5, asr #24 + orr m6502_a, m6502_a, r0, lsl #24 + mov m6502_nz, m6502_a, asr #24 .endm // 循环左移 .macro opROL readmem - movs r8, r8, lsr #1 + movs cycles, cycles, lsr #1 adc r0, r0, r0 - orrs r3, r0, r0, lsl #24 - adc r8, r8, r8 + orrs m6502_nz, r0, r0, lsl #24 + adc cycles, cycles, cycles writemem .endm // 循环右移 .macro opROR readmem - movs r8, r8, lsr #1 + movs cycles, cycles, lsr #1 IT CS orrcs r0, r0, #0x100 movs r0, r0, lsr #1 - orr r3, r0, r0, lsl #24 - adc r8, r8, r8 + orr m6502_nz, r0, r0, lsl #24 + adc cycles, cycles, cycles writemem .endm @@ -467,7 +465,7 @@ sbcs m6502_a, m6502_a, r0, lsl #24 and m6502_a, m6502_a, #0xff000000 mov m6502_nz, m6502_a, asr #24 - orr cycles, cycles, #CYC_C | CYC_V + orr cycles, cycles, #CYC_C+CYC_V IT VC bicvc cycles, cycles, #CYC_V