208 lines
4.6 KiB
ArmAsm
208 lines
4.6 KiB
ArmAsm
.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_RAM地址指针加载到r11里
|
||
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] // R0现在指向ROM映像(包括头)
|
||
add r3,r0,#16 // r3现在指向rom镜像(不包括头)
|
||
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从 ROM的最后偏移量写0
|
||
|
||
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 // //r9和0xe000按位与运算
|
||
add r2, globalptr,#memmap_tbl // //把存储器映象地址加载到r2
|
||
lsr r1,r1,#11 // //>>11位 r1/2048
|
||
ldr r0,[r2,r1] // //读取r2地址+r1偏移的数据到r0
|
||
|
||
str r0,[globalptr,#lastbank] // //保存6502PC从 ROM的最后偏移量
|
||
add r9,r9,r0 // //m6502_pc+r0
|
||
orr lr,#0x01 // lr最低位置1防止进入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 寄存器放栈
|
||
mov r1,r12
|
||
bl asm_Mapper_Write
|
||
ldmfd sp!,{r3,lr}
|
||
orr lr,#0x01 // lr最低位置1防止进入arm状态
|
||
bx lr
|
||
|
||
|
||
|
||
@ .global main
|
||
@ .type main, %function
|
||
@ mian:
|
||
@ b cpu6502_init
|
||
|