Files
player/Project/Src/NES/cart.s

200 lines
5.6 KiB
ArmAsm
Raw Normal View History

2025-06-27 00:32:57 +08:00
INCLUDE equates.s
IMPORT NES_RAM
IMPORT NES_SRAM
IMPORT CPU_reset
IMPORT romfile ;from main.c
IMPORT cpu_data ; 6502.s
IMPORT op_table
EXPORT cpu6502_init
EXPORT map67_
EXPORT map89_
EXPORT mapAB_
EXPORT mapCD_
EXPORT mapEF_
;----------------------------------------------------------------------------
AREA rom_code, CODE, READONLY
; THUMB
PRESERVE8
;----------------------------------------------------------------------------
cpu6502_init PROC
;----------------------------------------------------------------------------
stmfd sp!,{r4-r11,lr}
ldr r10,=cpu_data ;<3B><>ȡ<EFBFBD><C8A1>ַ
ldr r11,=NES_RAM ;r11=cpu_zpage
ldr r11,[r11] ;NES_RAM<41><4D><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
;*******************************************************
str r11,memmap_tbl ;NES_RAM<41><4D><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
str r11,memmap_tbl+4
str r11,memmap_tbl+8
ldr r0,=NES_SRAM ;NES_SRAM<41><4D><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
ldr r0,[r0]
str r0,memmap_tbl+12
;**********************************************************************
ldr r0,=op_table ;<3B><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ַ
str r0,opz ;<3B><><EFBFBD><EFBFBD>
ldr r0,=romfile
ldr r0,[r0] ;R0<52><30><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ROMӳ<4D>񣨰<EFBFBD><F1A3A8B0><EFBFBD>ͷ<EFBFBD><CDB7>
add r3,r0,#16 ;r3<72><33><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>rom<6F><6D><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>
str r3,rombase ;<3B><><EFBFBD><EFBFBD>rom<6F><6D><EFBFBD><EFBFBD>ַ
;r3=rombase til end of loadcart so DON'T FUCK IT UP
mov r2,#1
ldrb r1,[r3,#-12] ; 16kB PROM<4F><4D><EFBFBD><EFBFBD>Ŀ 2
rsb r0,r2,r1,lsl#14 ;romsize=X*16KB <<14 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8> r0=0x7fff
str r0,rommask ;rommask=promsize-1 32768-1
;------------------------------------------------------------------------------------
mov r9,#0 ;(<28><><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD>encodePC<50><43>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD>*<2A><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĴ<D0B5><C4B4><EFBFBD>)
str r9,lastbank ;6502PC<50><43> ROM<4F><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>д0
mov r0,#0 <><C4AC>romӳ<6D><D3B3>
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
movne r0,r1,lsr#4 ;ignore high nibble if header looks bad <09><><EFBFBD>Ը<EFBFBD><D4B8><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
;r0=mapper<65><72>
;----------------------------------------------------------------------------
ldr r0,=Mapper_W
str r0,writemem_tbl+16
str r0,writemem_tbl+20
str r0,writemem_tbl+24
str r0,writemem_tbl+28
;------------------------------------------------------------------------------
bl CPU_reset ;reset everything else
ldmfd sp!,{r4-r11,lr}
bx lr
ENDP
;----------------------------------------------------------------------------
map67_ ;rom paging.. r0=page#
;----------------------------------------------------------------------------
ldr r1,rommask
and r0,r1,r0,lsl#13
ldr r1,rombase
add r0,r1,r0
sub r0,r0,#0x6000
str r0,memmap_tbl+12
b flush
;----------------------------------------------------------------------------
map89_ ;rom paging.. r0=page# ROM<4F><4D>ҳ
;----------------------------------------------------------------------------
ldr r1,rombase ;rom<6F><6D>ʼ<EFBFBD><CABC>ַ
sub r1,r1,#0x8000
ldr r2,rommask
and r0,r2,r0,lsl#13
add r0,r1,r0
str r0,memmap_tbl+16
b flush
;----------------------------------------------------------------------------
mapAB_
;----------------------------------------------------------------------------
ldr r1,rombase
sub r1,r1,#0xa000
ldr r2,rommask
and r0,r2,r0,lsl#13
add r0,r1,r0
str r0,memmap_tbl+20
b flush
;----------------------------------------------------------------------------
mapCD_
;----------------------------------------------------------------------------
ldr r1,rombase
sub r1,r1,#0xc000
ldr r2,rommask
and r0,r2,r0,lsl#13
add r0,r1,r0
str r0,memmap_tbl+24
b flush
;----------------------------------------------------------------------------
mapEF_
;----------------------------------------------------------------------------
ldr r1,rombase
sub r1,r1,#0xe000
ldr r2,rommask
and r0,r2,r0,lsl#13
add r0,r1,r0
str r0,memmap_tbl+28
b flush
;----------------------------------------------------------------------------
map89AB_
;----------------------------------------------------------------------------
ldr r1,rombase ;rom<6F><6D><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>
sub r1,r1,#0x8000
ldr r2,rommask
and r0,r2,r0,lsl#14
add r0,r1,r0
str r0,memmap_tbl+16
str r0,memmap_tbl+20
flush ;update m6502_pc & lastbank
ldr r1,lastbank
sub r9,r9,r1
and r1,r9,#0xE000 ;//r9<72><39>0xe000<30><30>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
adr r2,memmap_tbl ;//<2F>Ѵ<D1B4><E6B4A2>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ص<EFBFBD>r2
lsr r1,r1,#11 ;//>>11λ r1/2048
ldr r0,[r2,r1] ;//<2F><>ȡr2<72><32>ַ+r1ƫ<31>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>ݵ<EFBFBD>r0
str r0,lastbank ;//<2F><><EFBFBD><EFBFBD>6502PC<50><43> ROM<4F><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
add r9,r9,r0 ;//m6502_pc+r0
orr lr,#0x01 ;lr<6C><72><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>1<EFBFBD><31>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>arm״̬
bx lr
;----------------------------------------------------------------------------
mapCDEF_
;----------------------------------------------------------------------------
ldr r1,rombase
sub r1,r1,#0xc000
ldr r2,rommask
and r0,r2,r0,lsl#14
add r0,r1,r0
str r0,memmap_tbl+24
str r0,memmap_tbl+28
b flush
;----------------------------------------------------------------------------
map89ABCDEF_
;----------------------------------------------------------------------------
ldr r1,rombase
sub r1,r1,#0x8000
ldr r2,rommask
and r0,r2,r0,lsl#15
add r0,r1,r0
str r0,memmap_tbl+16
str r0,memmap_tbl+20
str r0,memmap_tbl+24
str r0,memmap_tbl+28
b flush
;*************************************************************************************
IMPORT asm_Mapper_Write;
Mapper_W
;-------------------------------------------
stmfd sp!,{r3,lr} ;LR <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ջ
mov r1,r12
bl asm_Mapper_Write
ldmfd sp!,{r3,lr}
orr lr,#0x01 ;lr<6C><72><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>1<EFBFBD><31>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>arm״̬
bx lr
; nop
;---------------------------------------------------------------------------------------
END