2025-07-08 19:13:35 +08:00
|
|
|
|
.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_
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-09 23:38:26 +08:00
|
|
|
|
.type cpu6502_init, %function
|
2025-07-08 19:13:35 +08:00
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-09 23:38:26 +08:00
|
|
|
|
.type map67_, %function
|
2025-07-08 19:13:35 +08:00
|
|
|
|
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
|
2025-07-09 23:38:26 +08:00
|
|
|
|
|
|
|
|
|
.type map89_, %function
|
2025-07-08 19:13:35 +08:00
|
|
|
|
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
|
2025-07-09 23:38:26 +08:00
|
|
|
|
|
|
|
|
|
.type mapAB_, %function
|
2025-07-08 19:13:35 +08:00
|
|
|
|
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
|
2025-07-09 23:38:26 +08:00
|
|
|
|
|
|
|
|
|
.type mapCD_, %function
|
2025-07-08 19:13:35 +08:00
|
|
|
|
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
|
2025-07-09 23:38:26 +08:00
|
|
|
|
|
|
|
|
|
.type mapEF_, %function
|
2025-07-08 19:13:35 +08:00
|
|
|
|
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
|
2025-07-09 23:38:26 +08:00
|
|
|
|
|
|
|
|
|
.type map89AB_, %function
|
2025-07-08 19:13:35 +08:00
|
|
|
|
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
|
2025-07-08 19:13:35 +08:00
|
|
|
|
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
|
|
|
|
|
|
2025-07-09 23:38:26 +08:00
|
|
|
|
.type mapCDEF_, %function
|
2025-07-08 19:13:35 +08:00
|
|
|
|
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
|
2025-07-09 23:38:26 +08:00
|
|
|
|
|
|
|
|
|
.type map89ABCDEF_, %function
|
2025-07-08 19:13:35 +08:00
|
|
|
|
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
|
|
|
|
|
|