1
0
mirror of https://github.com/pevans/erc-c.git synced 2024-06-24 15:29:32 +00:00

Add objstore code, tests

This commit is contained in:
Peter Evans 2018-01-03 20:51:20 -06:00
parent fd4b135d5a
commit 4d07bd7640
4 changed files with 106 additions and 0 deletions

23
include/objstore.h Normal file
View File

@ -0,0 +1,23 @@
#ifndef _OBJSTORE_H_
#define _OBJSTORE_H_
#include "apple2.mem.h"
#include "vm_bits.h"
typedef struct {
char header[4];
vm_8bit apple2_disk2_rom[APPLE2_DISK2_ROM_SIZE];
vm_8bit apple2_sys_rom[0x4000];
vm_8bit apple2_sysfont[APPLE2_SYSFONT_SIZE];
} objstore;
extern int objstore_init();
#define OBJSTORE_DECL(x) \
const vm_8bit *objstore_##x()
OBJSTORE_DECL(apple2_disk2_rom);
OBJSTORE_DECL(apple2_sys_rom);
OBJSTORE_DECL(apple2_sysfont);
#endif

View File

@ -13,6 +13,7 @@ set(erc_sources
mos6502.exec.c
mos6502.loadstor.c
mos6502.stat.c
objstore.c
option.c
vm_bitfont.c
vm_screen.c

73
src/objstore.c Normal file
View File

@ -0,0 +1,73 @@
/*
* obj.c
*/
#include <zlib.h>
#include "objstore.h"
#include "objstore_data.h"
/*
* This is data that we expect to find in the store_data variable that
* is defined in objstore_data.h.
*/
#define HEADER_DATA "hope"
/*
* Our object store. Just a simple struct that we pull data out from.
*/
static objstore store;
/*
* This function will set up the store variable so that it contains
* useful information rather than garbage data from the stack. It does
* so with a simply memcpy from store_data directly into store, such
* that the store data itself can be aligned for access.
*/
int
objstore_init()
{
int cmp;
// We want to input some bad header data and compare with what
// eventually should get put into there by memcmp.
store.header[0] = 'h';
store.header[1] = 'e';
store.header[2] = 'y';
store.header[3] = '\0';
memcpy(&store, store_data, sizeof(store));
// Test if the header field data is exactly equivalent to that
// defined in HEADER_DATA. Note we use memcmp(), because the header
// field is an array of just 4 bytes; strcmp() and strncmp() have an
// expectation that both pointers will be directed at NUL-terminated
// strings, which is _not_ the case for store.header (but,
// incidentally, _is_ the case for HEADER_DATA!).
cmp = memcmp(store.header, HEADER_DATA,
sizeof(store.header) / sizeof(char));
// If the two areas of memory were not a complete match...
if (cmp != 0) {
log_critical("Object store initialization failed with bad data");
return ERR_BADFILE;
}
return OK;
}
/*
* Something to simplify the very simple getter functions we use for
* getting data from the object store.
*/
#define OBJSTORE_DEFN(x) \
const vm_8bit *objstore_##x() { return store.x; }
/*
* Note we have an extra semicolon on the end... this is mostly to avoid
* screwing up my indent, to be honest. But C will ignore the
* semicolons, so all is well.
*/
OBJSTORE_DEFN(apple2_sys_rom);
OBJSTORE_DEFN(apple2_disk2_rom);
OBJSTORE_DEFN(apple2_sysfont);

9
tests/objstore.c Normal file
View File

@ -0,0 +1,9 @@
#include <criterion/criterion.h>
#include "log.h"
#include "objstore.h"
Test(objstore, init)
{
cr_assert_eq(objstore_init(), OK);
}