1
0
mirror of https://github.com/pevans/erc-c.git synced 2025-08-08 05:25:01 +00:00

Change objstore structure to contain all peripheral ROM

This commit is contained in:
Peter Evans
2018-01-09 15:56:21 -06:00
parent 3c46a41351
commit 0e0244162f
5 changed files with 2206 additions and 2103 deletions

View File

@@ -4,8 +4,30 @@
#include "apple2.h" #include "apple2.h"
#include "vm_segment.h" #include "vm_segment.h"
#define APPLE2_DISK2_ROM_OFFSET 0xC600 /*
#define APPLE2_DISK2_ROM_SIZE 0x100 * Given a slot number (1-7), this will return the memory page address
* for the site of the ROM that is associated for the peripheral that
* would be connected there.
*/
#define APPLE2_PERIPHERAL_SLOT(n) \
(0xC000 + (n << 8))
/*
* This is the size of any peripheral's ROM that we can hold in memory
* (which is any page from $C100 - $C700).
*/
#define APPLE2_PERIPHERAL_SIZE 0x700
/*
* Peripheral ROM can only occupy a single page in memory.
*/
#define APPLE2_PERIPHERAL_PAGE 0x100
/*
* System ROM requires a full 16k; part of it is copied into several
* pages beginning at $C800, and much more go into $D000 - $FFFF.
*/
#define APPLE2_SYSROM_SIZE 0x4000
/* /*
* The size of our block of ROM is 12k * The size of our block of ROM is 12k
@@ -26,7 +48,7 @@
extern vm_8bit apple2_mem_read_bank(vm_segment *, size_t, void *); extern vm_8bit apple2_mem_read_bank(vm_segment *, size_t, void *);
extern void apple2_mem_write_bank(vm_segment *, size_t, vm_8bit, void *); extern void apple2_mem_write_bank(vm_segment *, size_t, vm_8bit, void *);
extern void apple2_mem_map(apple2 *); extern void apple2_mem_map(apple2 *);
extern int apple2_mem_init_disk2_rom(apple2 *); extern int apple2_mem_init_peripheral_rom(apple2 *);
extern int apple2_mem_init_sys_rom(apple2 *); extern int apple2_mem_init_sys_rom(apple2 *);
#endif #endif

View File

@@ -8,8 +8,8 @@
typedef struct { typedef struct {
char header[4]; char header[4];
vm_8bit apple2_disk2_rom[APPLE2_DISK2_ROM_SIZE]; vm_8bit apple2_peripheral_rom[APPLE2_PERIPHERAL_SIZE];
vm_8bit apple2_sys_rom[0x4000]; vm_8bit apple2_sys_rom[APPLE2_SYSROM_SIZE];
vm_8bit apple2_sysfont[APPLE2_SYSFONT_SIZE]; vm_8bit apple2_sysfont[APPLE2_SYSFONT_SIZE];
} objstore; } objstore;
@@ -20,7 +20,7 @@ extern void objstore_clear();
#define OBJSTORE_DECL(x) \ #define OBJSTORE_DECL(x) \
const vm_8bit *objstore_##x() const vm_8bit *objstore_##x()
OBJSTORE_DECL(apple2_disk2_rom); OBJSTORE_DECL(apple2_peripheral_rom);
OBJSTORE_DECL(apple2_sys_rom); OBJSTORE_DECL(apple2_sys_rom);
OBJSTORE_DECL(apple2_sysfont); OBJSTORE_DECL(apple2_sysfont);

File diff suppressed because it is too large Load Diff

View File

@@ -96,34 +96,19 @@ apple2_mem_map(apple2 *mach)
} }
} }
/*
* Since we can't write into ROM normally, we need a separate function
* we can call which will do the writing for us.
*/
int int
apple2_mem_init_disk2_rom(apple2 *mach) apple2_mem_init_peripheral_rom(apple2 *mach)
{ {
int err; int err;
const vm_8bit *diskrom;
diskrom = objstore_apple2_disk2_rom(); // Let's copy beginning at the 1-slot offset in memory, but going
// all the way as far as the length of all peripheral ROM in memory.
// Copy into the first peripheral page for disk ROM. err = vm_segment_copy_buf(mach->memory,
err = vm_segment_copy_buf(mach->memory, diskrom, objstore_apple2_peripheral_rom(),
APPLE2_DISK2_ROM_OFFSET, 0, APPLE2_PERIPHERAL_SLOT(1), 0,
APPLE2_DISK2_ROM_SIZE); APPLE2_PERIPHERAL_SIZE);
if (err != OK) { if (err != OK) {
log_critical("Could not copy apple2 disk2 rom"); log_critical("Could not copy apple2 peripheral rom");
return ERR_BADFILE;
}
// This second copy will copy into the next slot over, which is
// essentially the second disk drive. It's all the same ROM.
err = vm_segment_copy_buf(mach->memory, diskrom,
APPLE2_DISK2_ROM_OFFSET + 0x100, 0,
APPLE2_DISK2_ROM_SIZE);
if (err != OK) {
log_critical("Could not copy apple2 disk2 rom");
return ERR_BADFILE; return ERR_BADFILE;
} }

View File

@@ -93,6 +93,6 @@ objstore_ready()
* screwing up my indent, to be honest. But C will ignore the * screwing up my indent, to be honest. But C will ignore the
* semicolons, so all is well. * semicolons, so all is well.
*/ */
OBJSTORE_DEFN(apple2_sys_rom); // ignore docblock OBJSTORE_DEFN(apple2_peripheral_rom); // ignore docblock
OBJSTORE_DEFN(apple2_disk2_rom); // ignore docblock OBJSTORE_DEFN(apple2_sys_rom); // ignore docblock
OBJSTORE_DEFN(apple2_sysfont); // ignore docblock OBJSTORE_DEFN(apple2_sysfont); // ignore docblock