Skip to content

Commit 6b649d5

Browse files
committed
Load XEX to PSRAM
1 parent df37a76 commit 6b649d5

File tree

4 files changed

+52
-20
lines changed

4 files changed

+52
-20
lines changed

src/chips/cgia.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -752,9 +752,6 @@ void cgia_mirror_vram(cgia_t* vpu) {
752752
_cgia_copy_vcache_bank(vpu, vram_cache_ptr[0] == vram_cache[0] ? 0 : 1);
753753
_cgia_copy_vcache_bank(vpu, vram_cache_ptr[1] == vram_cache[0] ? 0 : 1);
754754
}
755-
void cgia_mem_wr(cgia_t* vpu, uint32_t addr, uint8_t data) {
756-
cgia_ram_write(addr, data);
757-
}
758755

759756
static void _copy_internal_regs(cgia_t* vpu) {
760757
vpu->chip = (uint8_t*)&CGIA;

src/chips/cgia.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -240,8 +240,6 @@ uint64_t cgia_tick(cgia_t* vpu, uint64_t pins);
240240
void cgia_snapshot_onsave(cgia_t* snapshot);
241241
// fixup cgia_t snapshot after loading
242242
void cgia_snapshot_onload(cgia_t* snapshot, cgia_t* sys);
243-
// mirror RAM writes to CGIA VRAM
244-
void cgia_mem_wr(cgia_t* vpu, uint32_t addr, uint8_t data);
245243
// copy VRAM - after fastload
246244
void cgia_mirror_vram(cgia_t* vpu);
247245
// read CGIA register value

src/systems/x65.c

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
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+
1417
static uint8_t _x65_vpu_fetch(uint32_t addr, void* user_data);
1518
static 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

291300
uint8_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
}

src/systems/x65.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,9 +191,13 @@ uint32_t x65_save_snapshot(x65_t* sys, x65_t* dst);
191191
bool x65_load_snapshot(x65_t* sys, uint32_t version, x65_t* src);
192192

193193
// ---- memory access functions ----------------------------------------------
194-
/* read a byte at 16-bit address */
194+
/* write a byte to (PS)RAM, mirroring to CGIA L1 cache */
195+
void mem_ram_write(x65_t* sys, uint32_t addr, uint8_t data);
196+
/* read a byte from (PS)RAM */
197+
uint8_t mem_ram_read(x65_t* sys, uint32_t addr);
198+
/* read a byte like a CPU */
195199
uint8_t mem_rd(x65_t* sys, uint8_t bank, uint16_t addr);
196-
/* write a byte to 16-bit address */
200+
/* write a byte like a CPU */
197201
void mem_wr(x65_t* sys, uint8_t bank, uint16_t addr, uint8_t data);
198202
/* helper method to write a 16-bit value, does 2 mem_wr() */
199203
static inline void mem_wr16(x65_t* sys, uint8_t bank, uint16_t addr, uint16_t data) {

0 commit comments

Comments
 (0)