添加gcc版的nes汇编文件 未验证

This commit is contained in:
ranchuan
2025-07-08 19:13:35 +08:00
parent a1253887f3
commit 9d0c9708f8
6 changed files with 2368 additions and 4 deletions

View File

@@ -1,6 +1,6 @@
#include "mywin_inc.h"
#include "ff.h"
// #include "nes_main.h"
#include "nes_main.h"
#include "gif.h"
#include "system_updata.h"
#include "avi.h"
@@ -347,7 +347,7 @@ void FILDER_OpenFile(WIN_FilderStruct *filder)
{
FILDER_GetFileRoute(filder);
WIN_KeyShieldOn();
// nes_load ((u8*)filder->fileName,LCD_GetShowAddr(),LCD_GetLcdSizeX()/2-128,LCD_GetLcdSizeY()/2-120);
nes_load ((u8*)filder->fileName,LCD_GetShowAddr(),LCD_GetLcdSizeX()/2-128,LCD_GetLcdSizeY()/2-120);
WIN_KeyShieldOff();
}
else if (strcmp(p_str, ".avi") == 0)

1533
Project/Src/NES/6502_gcc.S Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,211 @@
.syntax unified
.cpu cortex-m4
.fpu softvfp
.thumb
.text
.include "6502def.s"
.extern NES_RAM
.extern NES_SRAM
.extern CPU_reset
.extern romfile
.extern cpu_data
.extern op_table
.global cpu6502_init
.global map67_
.global map89_
.global mapAB_
.global mapCD_
.global mapEF_
@ .thumb_func
cpu6502_init:
// ѹջ
stmfd sp!,{r4-r11,lr}
// <EFBFBD>Ѷ<EFBFBD>ȡcpu<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ldr r10,=cpu_data
// <EFBFBD><EFBFBD>NES_RAM<EFBFBD><EFBFBD>ַָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>r11<EFBFBD><EFBFBD>
ldr r11,=NES_RAM
ldr r11,[r11]
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>ӳ<EFBFBD><EFBFBD>
str r11,[globalptr,#memmap_tbl]
str r11,[globalptr,#memmap_tbl+4]
str r11,[globalptr,#memmap_tbl+8]
ldr r0,=NES_SRAM
ldr r0,[r0]
str r0,[globalptr,#memmap_tbl+12]
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַָ<EFBFBD><EFBFBD>
ldr r0,=op_table
str r0,[globalptr,#opz]
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>rom<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
ldr r0,=romfile
ldr r0,[r0] // R0<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>ROMӳ<EFBFBD>񣨰<EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD>
add r3,r0,#16 // r3<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>rom<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD>
str r3,[globalptr,#rombase] // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>rom<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
mov r2,#1
ldrb r1,[r3,#-12] // 16kB PROM<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ 2
rsb r0,r2,r1,lsl#14 // romsize=X*16KB <<14 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD> r0=0x7fff
str r0,[globalptr,#rommask] // rommask=promsize-1 32768-1
mov r9,#0 // (<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD>encodePC<EFBFBD><EFBFBD>ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>*<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĴ<EFBFBD><EFBFBD><EFBFBD>)
str r9,[globalptr,#lastbank] // 6502PC<EFBFBD><EFBFBD> ROM<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>д0
mov r0,#0 // Ĭ<EFBFBD><EFBFBD>romӳ<EFBFBD><EFBFBD>
bl map89AB_ // 89AB=1st 16k
mov r0,#-1
bl mapCDEF_ // CDEF=last 16k
ldrb r1,[r3,#-10] // get mapper
ldrb r2,[r3,#-9]
tst r2,#0x0e // long live DiskDude!
and r1,r1,#0xf0
and r2,r2,#0xf0
orr r0,r2,r1,lsr#4
IT NE
movne r0,r1,lsr#4 // ignore high nibble if header looks bad <EFBFBD><EFBFBD><EFBFBD>Ը<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// r0=mapper<EFBFBD><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>дrom<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
ldr r0,=Mapper_W
str r0,[globalptr,#writemem_tbl+16]
str r0,[globalptr,#writemem_tbl+20]
str r0,[globalptr,#writemem_tbl+24]
str r0,[globalptr,#writemem_tbl+28]
// cpu<EFBFBD><EFBFBD>λ
bl CPU_reset
ldmfd sp!,{r4-r11,lr}
bx lr
@ .end
// ----------------------------------------------------------------------------
map67_: // rom paging.. r0=page#
// ----------------------------------------------------------------------------
ldr r1,[globalptr,#rommask]
and r0,r1,r0,lsl#13
ldr r1,[globalptr,#rombase]
add r0,r1,r0
sub r0,r0,#0x6000
str r0,[globalptr,#memmap_tbl+12]
b flush
// ----------------------------------------------------------------------------
map89_: // rom paging.. r0=page# ROM<EFBFBD><EFBFBD>ҳ
// ----------------------------------------------------------------------------
ldr r1,[globalptr,#rombase] // rom<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ
sub r1,r1,#0x8000
ldr r2,[globalptr,#rommask]
and r0,r2,r0,lsl#13
add r0,r1,r0
str r0,[globalptr,#memmap_tbl+16]
b flush
// ----------------------------------------------------------------------------
mapAB_:
// ----------------------------------------------------------------------------
ldr r1,[globalptr,#rombase]
sub r1,r1,#0xa000
ldr r2,[globalptr,#rommask]
and r0,r2,r0,lsl#13
add r0,r1,r0
str r0,[globalptr,#memmap_tbl+20]
b flush
// ----------------------------------------------------------------------------
mapCD_:
// ----------------------------------------------------------------------------
ldr r1,[globalptr,#rombase]
sub r1,r1,#0xc000
ldr r2,[globalptr,#rommask]
and r0,r2,r0,lsl#13
add r0,r1,r0
str r0,[globalptr,#memmap_tbl+24]
b flush
// ----------------------------------------------------------------------------
mapEF_:
// ----------------------------------------------------------------------------
ldr r1,[globalptr,#rombase]
sub r1,r1,#0xe000
ldr r2,[globalptr,#rommask]
and r0,r2,r0,lsl#13
add r0,r1,r0
str r0,[globalptr,#memmap_tbl+28]
b flush
// ----------------------------------------------------------------------------
map89AB_:
// ----------------------------------------------------------------------------
ldr r1,[globalptr,#rombase] // rom<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD>
sub r1,r1,#0x8000
ldr r2,[globalptr,#rommask]
and r0,r2,r0,lsl#14
add r0,r1,r0
str r0,[globalptr,#memmap_tbl+16]
str r0,[globalptr,#memmap_tbl+20]
flush: // update m6502_pc & lastbank
ldr r1,[globalptr,#lastbank]
sub r9,r9,r1
and r1,r9,#0xE000 // //r9<EFBFBD><EFBFBD>0xe000<EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ldr r2, =memmap_tbl
add r2, globalptr // //<EFBFBD>Ѵ<EFBFBD><EFBFBD>ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>r2
lsr r1,r1,#11 // //>>11λ r1/2048
ldr r0,[r2,r1] // //<EFBFBD><EFBFBD>ȡr2<EFBFBD><EFBFBD>ַ+r1ƫ<EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>r0
str r0,[globalptr,#lastbank] // //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>6502PC<EFBFBD><EFBFBD> ROM<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
add r9,r9,r0 // //m6502_pc+r0
orr lr,#0x01 // lr<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>ֹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>arm״̬
bx lr
// ----------------------------------------------------------------------------
mapCDEF_:
// ----------------------------------------------------------------------------
ldr r1,[globalptr,#rombase]
sub r1,r1,#0xc000
ldr r2,[globalptr,#rommask]
and r0,r2,r0,lsl#14
add r0,r1,r0
str r0,[globalptr,#memmap_tbl+24]
str r0,[globalptr,#memmap_tbl+28]
b flush
// ----------------------------------------------------------------------------
map89ABCDEF_:
// ----------------------------------------------------------------------------
ldr r1,[globalptr,#rombase]
sub r1,r1,#0x8000
ldr r2,[globalptr,#rommask]
and r0,r2,r0,lsl#15
add r0,r1,r0
str r0,[globalptr,#memmap_tbl+16]
str r0,[globalptr,#memmap_tbl+20]
str r0,[globalptr,#memmap_tbl+24]
str r0,[globalptr,#memmap_tbl+28]
b flush
.extern asm_Mapper_Write
.type Mapper_W, %function
Mapper_W:
stmfd sp!,{r3,lr} // LR <EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ
mov r1,r12
bl asm_Mapper_Write
ldmfd sp!,{r3,lr}
orr lr,#0x01 // lr<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>ֹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>arm״̬
bx lr
@ .global main
@ .type main, %function
@ mian:
@ b cpu6502_init

64
Project/Src/NES/6502def.s Normal file
View File

@@ -0,0 +1,64 @@
m6502_nz .req r3 // bit 31=N, Z=1 if bits 0-7=0 ;RN<52><4E><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>
m6502_rmem .req r4 // readmem_tbl
m6502_a .req r5 // bits 0-23=0, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>е<EFBFBD><EFBFBD>ֽ<EFBFBD>
m6502_x .req r6 // bits 0-23=0
m6502_y .req r7 // bits 0-23=0
cycles .req r8 // also VDIC flagsҲVDIC<EFBFBD><EFBFBD>־
m6502_pc .req r9
globalptr .req r10 // =wram_globals* ptr
m6502_optbl .req r10
cpu_zpage .req r11 // =CPU_RAM
addy .req r12 // keep this at r12 (<EFBFBD><EFBFBD>ͷ APCS) //addr :<EFBFBD><EFBFBD><EFBFBD><EFBFBD>8λ<EFBFBD><EFBFBD>ַ
// equates.s - GCC/GAS version
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD>GAS <EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD> RN<EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD>ʹ<EFBFBD>üĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>
// globalptr, r10
// cpu_zpage <EFBFBD><EFBFBD>Ӧ r11<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽƫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MAP 0, globalptr<EFBFBD><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> globalptr ָ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>ƫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
.equ opz, 0 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
.equ readmem_tbl, opz + 4 // <EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>
.equ writemem_tbl, readmem_tbl + 32 // д<EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>
.equ memmap_tbl, writemem_tbl + 32 // ROM/RAM ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>
.equ cpuregs, memmap_tbl + 32 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 6502 <EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD>ʼƫ<EFBFBD><EFBFBD>
.equ m6502_s, cpuregs + 28 // ջָ<EFBFBD><EFBFBD> s
.equ lastbank, m6502_s + 4 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD> ROM bank <EFBFBD><EFBFBD>ַ
.equ nexttimeout, lastbank + 4 // <EFBFBD>´γ<EFBFBD>ʱ<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>ַ
.equ rombase, nexttimeout + 4 // ROM <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ
.equ romnumber, rombase + 4 // ROM <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
.equ rommask, romnumber + 4 // ROM <EFBFBD><EFBFBD><EFBFBD>romsize-1<EFBFBD><EFBFBD>
.equ joy0data, rommask + 4 // <EFBFBD>ֱ<EFBFBD> 1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
.equ joy1data, joy0data + 4 // <EFBFBD>ֱ<EFBFBD> 2 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
.equ clocksh, joy1data + 4 // APU ʱ<EFBFBD>Ӽ<EFBFBD><EFBFBD><EFBFBD>
.equ cpunmif, clocksh + 4 // NMI <EFBFBD>жϱ<EFBFBD>־
.equ cpuirqf, cpunmif + 4 // IRQ <EFBFBD>жϱ<EFBFBD>־
.equ C, 0x01 // 6502 flags 6502<EFBFBD><EFBFBD>־
.equ Z, 0x02
.equ I, 0x04
.equ D, 0x08
.equ B, 0x10 // (always 1 except when IRQ pushes it) IRQ<EFBFBD>ⲿ<EFBFBD>ж<EFBFBD>
.equ R, 0x20 // (locked at 1)
.equ V, 0x40
.equ N, 0x80
.equ CYC_C, 0x01 // Carry bit <EFBFBD><EFBFBD>λ
.equ BRANCH, 0x02 // branch instruction encountered <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ֧<EFBFBD><EFBFBD>
.equ CYC_I, 0x04 // IRQ mask
.equ CYC_D, 0x08 // Decimal bit С<EFBFBD><EFBFBD>λ
.equ CYC_V, 0x40 // Overflow bit <EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
.equ CYC_MASK, 0xFF // CYCLE-1 ;Mask

View File

@@ -0,0 +1,548 @@
.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
and r0, r8, #0x4F // CYC_V+CYC_D+CYC_I+CYC_C
tst r3, #0x80000000 // PSR_N
IT NE
orrne r0, r0, #N // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> N <EFBFBD><EFBFBD>־
tst r3, #0xFF // Z <EFBFBD><EFBFBD>־
IT EQ
orreq r0, r0, #Z // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Z <EFBFBD><EFBFBD>־
orr r0, r0, \extra // <EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־ (B/R)
.endm
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> r0 <EFBFBD>е<EFBFBD> 6502 <EFBFBD><EFBFBD>־
.macro decodeP
bic r8, r8, #0x4F // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> CYC_V+CYC_D+CYC_I+CYC_C
and r1, r0, #V+D+I+C // <EFBFBD><EFBFBD>ȡ V/D/I/C <EFBFBD><EFBFBD>־
orr r8, r8, r1 // д<EFBFBD><EFBFBD> cycles
bic r3, r0, #0xFD // r0 is signed
eor r3, r3, #Z // <EFBFBD><EFBFBD>ת Z λ
.endm
// <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ָ<EFBFBD>ִ<EFBFBD><EFBFBD>
.macro fetch count
ldr r0, [globalptr,#clocksh]
add r0, r0, \count
str r0, [globalptr,#clocksh]
ldr r1, [globalptr,#opz]
subs r8, r8, \count * 256
IT PL
ldrbpl r0, [r9], #1
IT PL
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]
sbcs r8, r8, \count * 256
IT PL
ldrbpl r0, [r9], #1
IT PL
ldrpl pc, [r1, r0, lsl #2]
ldr pc, [globalptr,#nexttimeout]
.endm
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD>־
.macro clearcycles
and r8, r8, #0xFF // CYC_MASK
.endm
// <EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD>ַ<EFBFBD><EFBFBD>ȡ
.macro readmemabs
and r1, r12, #0xE000
adr lr, 0f
lsr r1, r1, #11
ldr pc, [r4, r1]
0:
.endm
// <EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD>ȡ
.macro readmemzp
ldrb r0, [r11, r12]
.endm
// <EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
.macro readmemzpi
lsr r0, r12, #24
ldrb r0, [r11, r0]
.endm
// RAM <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> NZ
.macro readmemzps
ldrsb r3, [r11, r12]
.endm
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ
.macro readmemimm
ldrb r0, [r9], #1
.endm
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> NZ
.macro readmemimms
ldrsb r3, [r9], #1
.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
orr r3, r0, r0, lsl #24
.elseif _type == _ZP
readmemzps
.elseif _type == _IMM
readmemimms
.endif
.endm
// <EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD>ַд<EFBFBD><EFBFBD>
.macro writememabs
and r1, r12, #0xE000
// adr r2, writemem_tbl
ldr r2, =writemem_tbl
add r2, r10
lsr r1, r1, #11
ldr pc, [r2, r1]
0:
.endm
// <EFBFBD><EFBFBD>ҳд<EFBFBD><EFBFBD>
.macro writememzp
strb r0, [r11, r12]
.endm
// <EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>
.macro writememzpi
lsr r1, r12, #24
strb r0, [r11, r1]
.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
ldrb r9, [r2]
orr r9, r9, r0, lsl #8
.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
ldrsb \x, [r11, r2]
.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
ldrb r12, [r9], #1
ldrb r0, [r9], #1
orr r12, r12, r0, lsl #8
.endm
// X<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
.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
.endm
// Y<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
.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
.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
ldrb r0, [r9], #1
add r0, r6, r0, lsl #24
lsr r12, r0, #24
ldrb r12, [r11, r12]
add r0, r0, #0x01000000
lsr r1, r0, #24
ldrb r1, [r11, r1]
orr r12, r12, r1, lsl #8
.endm
// Y<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѱַ
.macro doIIY
.set _type, _ABS
ldrb r0, [r9], #1
ldrb r12, [r11, r0]
add r0, r0, r11
ldrb r1, [r0, #1]
orr r12, r12, r1, lsl #8
add r12, r12, r7, lsr #24
.endm
// <EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѱַ
.macro doZPI
.set _type, _ABS
ldrb r0, [r9], #1
ldrb r12, [r11, r0]
add r0, r0, r11
ldrb r1, [r0, #1]
orr r12, r12, r1, lsl #8
.endm
// <EFBFBD><EFBFBD>ҳѰַ
.macro doZ
.set _type, _ZP
ldrb r12, [r9], #1
.endm
// <EFBFBD><EFBFBD>ҳ˫<EFBFBD>ֽ<EFBFBD>Ѱַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> bbr/bbs<EFBFBD><EFBFBD>
.macro doZ2
.set _type, _ZP
ldrb r12, [r9], #2
.endm
// <EFBFBD><EFBFBD>ҳX<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
.macro doZIX
.set _type, _ZP
ldrb r12, [r9], #1
add r12, r12, r6, lsr #24
and r12, r12, #0xff
.endm
// <EFBFBD><EFBFBD>ҳX<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>
.macro doZIXf
.set _type, _ZPI
ldrb r12, [r9], #1
add r12, r6, r12, lsl #24
.endm
// <EFBFBD><EFBFBD>ҳY<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
.macro doZIY
.set _type, _ZP
ldrb r12, [r9], #1
add r12, r12, r7, lsr #24
and r12, r12, #0xff
.endm
// <EFBFBD><EFBFBD>ҳY<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>
.macro doZIYf
.set _type, _ZPI
ldrb r12, [r9], #1
add r12, r7, r12, lsl #24
.endm
// ADC <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
.macro opADC
readmem
movs r1, r8, lsr #1
IT CS
subcs r0, r0, #0x00000100
adcs r5, r5, r0, ror #8
mov r3, r5, asr #24
orr r8, r8, #CYC_C+CYC_V
IT VC
bicvc r8, r8, #CYC_V
.endm
// AND <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
.macro opAND
readmem
and r5, r5, r0, lsl #24
mov r3, r5, asr #24
.endm
// ASL <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
.macro opASL
readmem
add r0, r0, r0
orrs r3, r0, r0, lsl #24
orr r8, r8, #CYC_C
writemem
.endm
// BIT <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
.macro opBIT
readmem
bic r8, r8, #CYC_V
tst r0, #V
IT NE
orrne r8, r8, #CYC_V
and r3, r0, r5, lsr #24
orr r3, r3, r0, lsl #24
.endm
// <EFBFBD>Ƚϲ<EFBFBD><EFBFBD><EFBFBD>
.macro opCOMP x
readmem
subs r3, \x, r0, lsl #24
mov r3, r3, asr #24
orr r8, r8, #CYC_C
.endm
// <EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
.macro opDEC
readmem
sub r0, r0, #1
orr r3, r0, r0, lsl #24
writemem
.endm
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
.macro opEOR
readmem
eor r5, r5, r0, lsl #24
mov r3, r5, asr #24
.endm
// <EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
.macro opINC
readmem
add r0, r0, #1
orr r3, r0, r0, lsl #24
writemem
.endm
// <EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>
.macro opLOAD x
readmems
mov \x, r3, lsl #24
.endm
// <EFBFBD>߼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
.macro opLSR
.if _type == _ABS
readmemabs
movs r0, r0, lsr #1
orr r8, r8, #CYC_C
mov r3, r0
writememabs
.elseif _type == _ZP
ldrb r3, [r11, r12]
movs r3, r3, lsr #1
orr r8, r8, #CYC_C
strb r3, [r11, r12]
.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]
.endif
.endm
// OR <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
.macro opORA
readmem
orr r5, r5, r0, lsl #24
mov r3, r5, asr #24
.endm
// ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
.macro opROL
readmem
movs r8, r8, lsr #1
adc r0, r0, r0
orrs r3, r0, r0, lsl #24
adc r8, r8, r8
writemem
.endm
// ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
.macro opROR
readmem
movs r8, r8, lsr #1
IT CS
orrcs r0, r0, #0x100
movs r0, r0, lsr #1
orr r3, r0, r0, lsl #24
adc r8, r8, r8
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
orr cycles, cycles, #CYC_C | CYC_V
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

View File

@@ -70,7 +70,8 @@ INC=[
'-ISrc/rt-thread',
'-ISrc/rt-thread/include',
# '-ISrc/sqlite3',
'-ISrc/zlib'
'-ISrc/zlib',
'-ISrc/NES'
]
SRC_DIR=[
@@ -128,6 +129,13 @@ SRC=[
'Src/MP3/helix/arm/asmmisc_gcc.s',
'Src/MP3/helix/arm/asmpoly_thumb2_gcc.s',
'Src/MY/syscalls.c',
'Src/NES/6502_gcc.S',
'Src/NES/6502cart_gcc.S',
'Src/NES/nes_apu.c',
'Src/NES/nes_main.c',
'Src/NES/nes_ppu.c',
'Src/NES/nes_mapper.c',
]
LD_FILE="stm32f429ighx_flash.ld"
@@ -303,7 +311,7 @@ def build_target(src:list):
if(check_rebuild(dst,obj_list)):
rsp=f"{' '.join(obj_list)} -o {dst} {flags} \
-T{LD_FILE} -lc -lm -lnosys -Wl,-Map={OUTPUT}/{TARGET}.map,--cref -Wl,--gc-sections \
-Wl,--no-warn-rwx-segments -Wl,-print-memory-usage"
-Wl,-print-memory-usage"
print(f"链接 {dst}")
with open(f"{OUTPUT}/{TARGET}.rsp",'w+') as f:
f.write(rsp.replace('\\','/'))