@@ -302,30 +302,6 @@ uint8_t _x65_vpu_fetch(uint32_t addr, void* user_data) {
302302 return sys -> ram [addr & 0xFFFFFF ];
303303}
304304
305- void _x65_api_call (uint8_t data , void * user_data ) {
306- x65_t * sys = (x65_t * )user_data ;
307- switch (data ) {
308- case 0x10 : { // RIA_API_GET_CHARGEN
309- uint8_t value ;
310- if (!rb_get (& sys -> ria .api_stack , & value )) break ;
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 ;
314- if (!rb_get (& sys -> ria .api_stack , & value )) break ;
315- mem_addr |= (uint32_t )value << 16 ;
316-
317- // copy chargen to memory
318- for (size_t i = 0 ; i < sizeof (font8_data ); ++ i )
319- mem_ram_write (sys , mem_addr ++ , font8_data [i ]);
320- break ;
321- }
322- case 0xFF : // STOP CPU
323- sys -> running = false;
324- break ;
325- default : fprintf (stderr , "Unhandled RIA API call: %02x\n" , data );
326- }
327- }
328-
329305uint32_t x65_exec (x65_t * sys , uint32_t micro_seconds ) {
330306 CHIPS_ASSERT (sys && sys -> valid );
331307 uint32_t num_ticks = clk_us_to_ticks (X65_FREQUENCY , micro_seconds );
@@ -461,31 +437,7 @@ bool x65_quickload_xex(x65_t* sys, chips_range_t data) {
461437 while (addr <= end_addr && addr >= start_addr ) {
462438 if (addr == 0xfffc ) reset_lo_loaded = true;
463439 if (addr == 0xfffd ) reset_hi_loaded = true;
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 ++ );
440+ mem_wr (sys , load_bank , addr ++ , * ptr ++ );
489441 }
490442 }
491443 }
@@ -547,3 +499,43 @@ bool x65_load_snapshot(x65_t* sys, uint32_t version, x65_t* src) {
547499 * sys = im ;
548500 return true;
549501}
502+
503+ #include "firmware/src/ria/api/api.h"
504+
505+ volatile uint8_t __regs [0x40 ];
506+ uint8_t xstack [XSTACK_SIZE + 1 ];
507+ size_t volatile xstack_ptr ;
508+
509+ void _x65_api_call (uint8_t data , void * user_data ) {
510+ x65_t * sys = (x65_t * )user_data ;
511+
512+ // sync RIA regs
513+ memcpy (__regs , sys -> ria .reg , sizeof (__regs ));
514+
515+ switch (data ) {
516+ case API_OP_ZXSTACK : {
517+ api_zxstack ();
518+ } break ;
519+ case API_OP_OEM_GET_CHARGEN : {
520+ // FIXME: use mem.h defined 512 bytes xstack
521+ uint8_t value ;
522+ if (!rb_get (& sys -> ria .api_stack , & value )) break ;
523+ uint32_t mem_addr = (uint32_t )value ;
524+ if (!rb_get (& sys -> ria .api_stack , & value )) break ;
525+ mem_addr |= (uint32_t )value << 8 ;
526+ if (!rb_get (& sys -> ria .api_stack , & value )) break ;
527+ mem_addr |= (uint32_t )value << 16 ;
528+
529+ // copy chargen to memory
530+ for (size_t i = 0 ; i < sizeof (font8_data ); ++ i )
531+ mem_ram_write (sys , mem_addr ++ , font8_data [i ]);
532+ } break ;
533+ case API_OP_HALT : // STOP CPU
534+ sys -> running = false;
535+ break ;
536+ default : fprintf (stderr , "Unhandled RIA API call: %02x\n" , data );
537+ }
538+
539+ // sync RIA regs back
540+ memcpy (sys -> ria .reg , __regs , sizeof (__regs ));
541+ }
0 commit comments