添加gcc版的nes汇编文件 未验证
This commit is contained in:
211
Project/Src/NES/6502cart_gcc.S
Normal file
211
Project/Src/NES/6502cart_gcc.S
Normal file
@@ -0,0 +1,211 @@
|
||||
.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_
|
||||
|
||||
|
||||
|
||||
@ .thumb_func
|
||||
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
|
||||
@ .end
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
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
|
||||
// ----------------------------------------------------------------------------
|
||||
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
|
||||
// ----------------------------------------------------------------------------
|
||||
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
|
||||
// ----------------------------------------------------------------------------
|
||||
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
|
||||
// ----------------------------------------------------------------------------
|
||||
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
|
||||
// ----------------------------------------------------------------------------
|
||||
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>
|
||||
ldr r2, =memmap_tbl
|
||||
add r2, globalptr // //<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
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
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
|
||||
// ----------------------------------------------------------------------------
|
||||
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
|
||||
|
Reference in New Issue
Block a user