Files
player/Project/Src/NES/6502cart_gcc.S

208 lines
4.6 KiB
ArmAsm
Raw Normal View History

.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_
.type cpu6502_init, %function
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
.type map67_, %function
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
.type map89_, %function
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
.type mapAB_, %function
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
.type mapCD_, %function
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
.type mapEF_, %function
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
.type map89AB_, %function
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>
2025-07-09 00:55:12 +08:00
add r2, globalptr,#memmap_tbl // //<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
.type mapCDEF_, %function
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
.type map89ABCDEF_, %function
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