| 
									
										
										
										
											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
 | 
					
						
							|  |  |  |  | 
 |