1111 #define CHIPS_ASSERT (c ) assert(c)
1212#endif
1313
14+ // declare function to sync RAM writes to CGIA L1 cache
15+ void cgia_ram_write (uint32_t addr , uint8_t data );
16+
1417static uint8_t _x65_vpu_fetch (uint32_t addr , void * user_data );
1518static void _x65_api_call (uint8_t data , void * user_data );
1619
@@ -241,13 +244,11 @@ static uint64_t _x65_tick(x65_t* sys, uint64_t pins) {
241244 if (mem_access ) {
242245 if (pins & W65816_RW ) {
243246 // memory read
244- W65816_SET_DATA (pins , sys -> ram [ addr ] );
247+ W65816_SET_DATA (pins , mem_ram_read ( sys , addr ) );
245248 }
246249 else {
247250 // memory write
248- uint8_t data = W65816_GET_DATA (pins );
249- sys -> ram [addr ] = data ;
250- cgia_mem_wr (& sys -> cgia , addr , data );
251+ mem_ram_write (sys , addr , W65816_GET_DATA (pins ));
251252 }
252253 }
253254 return pins ;
@@ -283,9 +284,17 @@ void mem_wr(x65_t* sys, uint8_t bank, uint16_t addr, uint8_t data) {
283284 return ;
284285 }
285286 }
286- const uint32_t full_addr = (bank << 16 ) | addr ;
287- sys -> ram [full_addr ] = data ;
288- cgia_mem_wr (& sys -> cgia , full_addr , data );
287+ // else
288+ mem_ram_write (sys , (bank << 16 ) | addr , data );
289+ }
290+
291+ void mem_ram_write (x65_t * sys , uint32_t addr , uint8_t data ) {
292+ sys -> ram [addr ] = data ;
293+ cgia_ram_write (addr , data );
294+ }
295+
296+ uint8_t mem_ram_read (x65_t * sys , uint32_t addr ) {
297+ return sys -> ram [addr ];
289298}
290299
291300uint8_t _x65_vpu_fetch (uint32_t addr , void * user_data ) {
@@ -299,15 +308,15 @@ void _x65_api_call(uint8_t data, void* user_data) {
299308 case 0x10 : { // RIA_API_GET_CHARGEN
300309 uint8_t value ;
301310 if (!rb_get (& sys -> ria .api_stack , & value )) break ;
302- uint16_t mem_addr = (uint16_t )value ;
311+ uint32_t mem_addr = (uint32_t )value ;
312+ if (!rb_get (& sys -> ria .api_stack , & value )) break ;
313+ mem_addr |= (uint32_t )value << 8 ;
303314 if (!rb_get (& sys -> ria .api_stack , & value )) break ;
304- mem_addr |= (uint16_t )value << 8 ;
305- uint8_t bank ;
306- if (!rb_get (& sys -> ria .api_stack , & bank )) break ;
315+ mem_addr |= (uint32_t )value << 16 ;
307316
308317 // copy chargen to memory
309318 for (size_t i = 0 ; i < sizeof (font8_data ); ++ i )
310- mem_wr (sys , bank , mem_addr ++ , font8_data [i ]);
319+ mem_ram_write (sys , mem_addr ++ , font8_data [i ]);
311320 break ;
312321 }
313322 case 0xFF : // STOP CPU
@@ -452,7 +461,31 @@ bool x65_quickload_xex(x65_t* sys, chips_range_t data) {
452461 while (addr <= end_addr && addr >= start_addr ) {
453462 if (addr == 0xfffc ) reset_lo_loaded = true;
454463 if (addr == 0xfffd ) reset_hi_loaded = true;
455- mem_wr (sys , load_bank , addr ++ , * ptr ++ );
464+ switch (addr ) {
465+ case 0xffff :
466+ case 0xfffe :
467+ case 0xfffd :
468+ case 0xfffc :
469+ case 0xfffb :
470+ case 0xfffa :
471+ case 0xfff9 :
472+ case 0xfff8 :
473+ case 0xfff5 :
474+ case 0xfff4 :
475+ case 0xffef :
476+ case 0xffee :
477+ case 0xffeb :
478+ case 0xffea :
479+ case 0xffe9 :
480+ case 0xffe8 :
481+ case 0xffe7 :
482+ case 0xffe6 :
483+ case 0xffe5 :
484+ case 0xffe4 : // sync interrupt vectors
485+ mem_wr (sys , load_bank , addr , * ptr );
486+ }
487+
488+ mem_ram_write (sys , (load_bank << 16 ) | addr ++ , * ptr ++ );
456489 }
457490 }
458491 }
0 commit comments