.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