Skip to content

Commit f9f0992

Browse files
committed
Update firmware and clocking
1 parent ea5e6d0 commit f9f0992

File tree

5 files changed

+44
-51
lines changed

5 files changed

+44
-51
lines changed

ext/sys/mem.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#include "firmware/src/ria/sys/mem.h"

roms/bogo.xex

450 Bytes
Binary file not shown.

src/systems/x65.c

Lines changed: 41 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
329305
uint32_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+
}

src/systems/x65.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ extern "C" {
4747
// bump snapshot version when x65_t memory layout changes
4848
#define X65_SNAPSHOT_VERSION (1)
4949

50-
#define X65_FREQUENCY (4295454) // clock frequency in Hz
50+
#define X65_FREQUENCY (2030000) // clock frequency in Hz
5151
#define X65_MAX_AUDIO_SAMPLES (1024) // max number of audio samples in internal sample buffer
5252
#define X65_DEFAULT_AUDIO_SAMPLES (128) // default number of samples in internal sample buffer
5353

0 commit comments

Comments
 (0)