Files
player/Project/Src/NES/6502cart_gcc.S
2025-07-10 00:08:56 +08:00

208 lines
4.6 KiB
ArmAsm
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

.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}
// cpu
ldr r10,=cpu_data
// NES_RAMr11
ldr r11,=NES_RAM
ldr r11,[r11]
//
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]
//
ldr r0,=op_table
str r0,[globalptr,#opz]
// rom
ldr r0,=romfile
ldr r0,[r0] // R0ROM
add r3,r0,#16 // r3rom(
str r3,[globalptr,#rombase] // rom
mov r2,#1
ldrb r1,[r3,#-12] // 16kB PROM 2
rsb r0,r2,r1,lsl#14 // romsize=X*16KB <<14 r0=0x7fff
str r0,[globalptr,#rommask] // rommask=promsize-1 32768-1
mov r9,#0 // (encodePC*)
str r9,[globalptr,#lastbank] // 6502PC ROM0
mov r0,#0 // rom
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
// r0=mapper号
// rom
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
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
ldr r1,[globalptr,#rombase] // rom
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
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 // //r90xe000
add r2, globalptr,#memmap_tbl // //r2
lsr r1,r1,#11 // //>>11 r1/2048
ldr r0,[r2,r1] // //r2+r1r0
str r0,[globalptr,#lastbank] // //6502PC ROM
add r9,r9,r0 // //m6502_pc+r0
orr lr,#0x01 // lr1arm
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
mov r1,r12
bl asm_Mapper_Write
ldmfd sp!,{r3,lr}
orr lr,#0x01 // lr1arm
bx lr
@ .global main
@ .type main, %function
@ mian:
@ b cpu6502_init