Skip to content

Commit

Permalink
new packed cartridge format in preparation for, stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
erisdev committed Dec 23, 2016
1 parent 21bf30d commit 80a4b5d
Show file tree
Hide file tree
Showing 5 changed files with 123 additions and 56 deletions.
3 changes: 2 additions & 1 deletion Makefile
Expand Up @@ -10,8 +10,9 @@ LDFLAGS += -L$(Z80_DIR) -lz80 -g \
.PHONY : all
all : vg8m bios demo

vg8m : sdl_driver.o vg8m.o video.o | libz80
vg8m : sdl_driver.o vg8m.o cart.o video.o | libz80

cart.o : cart.c vg8m.h
vg8m.o : vg8m.c vg8m.h
video.o : video.c video.h vg8m.h
sdl_driver.o : sdl_driver.c vg8m.h video.h
Expand Down
65 changes: 65 additions & 0 deletions cart.c
@@ -0,0 +1,65 @@
#include "config.h"

#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>

#include "vg8m.h"
#include "internal.h"

static const char MAGIC[] = "VGDMP100";

typedef struct s_dump_header DumpHeader;
struct s_dump_header {
char magic[8];
uint16_t flags;
uint16_t prog_offset;
uint16_t prog_size;
uint16_t pat_2bpp_offset;
uint16_t pat_2bpp_size;
uint16_t pat_3bpp_offset;
uint16_t pat_3bpp_size;
};

typedef struct s_cart_header CartHeader;
struct s_cart_header {
char magic[8];
char title[0x20];
char developer[0x20];
char lang[2];
uint16_t flags;
uint8_t version;
};

bool vg8m_load_cart(VG8M *emu, const char *filename) {
DumpHeader header;
int fd = open(filename, O_RDONLY);
if (fd == -1) goto error;

if (read(fd, &header, sizeof(header)) == -1)
goto error;

if (header.prog_size > 0) {
if (lseek(fd, header.prog_offset, SEEK_SET) == -1
|| read(fd, emu->cart_prog_rom, header.prog_size) == -1)
goto error;
}

if (header.pat_2bpp_size > 0) {
if (lseek(fd, header.pat_2bpp_offset, SEEK_SET) == -1
|| read(fd, emu->cart_2bpp_rom, header.pat_2bpp_size) == -1)
goto error;
}

if (header.pat_3bpp_size > 0) {
if (lseek(fd, header.pat_3bpp_offset, SEEK_SET) == -1
|| read(fd, emu->cart_3bpp_rom, header.pat_3bpp_size) == -1)
goto error;
}

close(fd);
return true;
error:
if (fd != -1) close(fd);
return false;
}
41 changes: 41 additions & 0 deletions internal.h
@@ -0,0 +1,41 @@
#pragma once
#include "vg8m.h"

enum {
SYS_ROM_SIZE = 0x0800,
SYS_RAM_SIZE = 0x0700,
HWREGS_SIZE = sizeof(VG8MRegisters),
CHAR_ROM_SIZE = 0x1000,
USER_RAM_SIZE = 0x4000,
CART_ROM_SIZE = 0x8000,

CART_2BPP_SIZE = 0x4000,
CART_3BPP_SIZE = 0x3000,
};


enum {
SYS_ROM_ADDR = 0x0000, SYS_ROM_END = 0x07FF,
SYS_RAM_ADDR = 0x0800, SYS_RAM_END = 0x0EFF,
HWREGS_ADDR = 0x0F00, HWREGS_END = HWREGS_ADDR + HWREGS_SIZE - 1,
CHAR_ROM_ADDR = 0x1000, CHAR_ROM_END = 0x1FFF,
USER_RAM_ADDR = 0x4000, USER_RAM_END = 0x7FFF,
CART_ROM_ADDR = 0x8000, CART_ROM_END = 0xFFFF,
};

enum {
INT_VBLANK = 0x20,
INT_HBLANK = 0x22,
};

enum {
MODE_HBLANK,
MODE_VBLANK,
MODE_DRAW,
};

enum {
CYCLES_HBLANK = 200,
CYCLES_VBLANK = 500,
CYCLES_DRAW = 200,
};
63 changes: 9 additions & 54 deletions vg8m.c
Expand Up @@ -13,6 +13,7 @@

#include "vg8m.h"
#include "video.h"
#include "internal.h"

static uint8_t *_load_file(uint16_t size, const char *filename);
static void _unload_file(uint8_t *buffer, uint16_t size);
Expand All @@ -23,49 +24,16 @@ static void _writeio(VG8M *emu, uint16_t addr, uint8_t data);
static uint8_t _readmem(VG8M *emu, uint16_t addr);
static void _writemem(VG8M *emu, uint16_t addr, uint8_t data);

enum {
SYS_ROM_SIZE = 0x0800,
SYS_RAM_SIZE = 0x0700,
HWREGS_SIZE = sizeof(VG8MRegisters),
CHAR_ROM_SIZE = 0x1000,
USER_RAM_SIZE = 0x4000,
CART_ROM_SIZE = 0x8000,
};


enum {
SYS_ROM_ADDR = 0x0000, SYS_ROM_END = 0x07FF,
SYS_RAM_ADDR = 0x0800, SYS_RAM_END = 0x0EFF,
HWREGS_ADDR = 0x0F00, HWREGS_END = HWREGS_ADDR + HWREGS_SIZE - 1,
CHAR_ROM_ADDR = 0x1000, CHAR_ROM_END = 0x1FFF,
USER_RAM_ADDR = 0x4000, USER_RAM_END = 0x7FFF,
CART_ROM_ADDR = 0x8000, CART_ROM_END = 0xFFFF,
};

enum {
INT_VBLANK = 0x20,
INT_HBLANK = 0x22,
};

enum {
MODE_HBLANK,
MODE_VBLANK,
MODE_DRAW,
};

enum {
CYCLES_HBLANK = 200,
CYCLES_VBLANK = 500,
CYCLES_DRAW = 200,
};

static inline uint16_t _min(uint16_t a, uint16_t b) {
return a < b ? a : b;
}

void vg8m_init(VG8M *emu) {
emu->system_ram = calloc(SYS_RAM_SIZE, sizeof(uint8_t));
emu->user_ram = calloc(USER_RAM_SIZE, sizeof(uint8_t));
emu->cart_prog_rom = calloc(CART_ROM_SIZE, sizeof(uint8_t));
emu->cart_2bpp_rom = calloc(CART_2BPP_SIZE, sizeof(uint8_t));
emu->cart_3bpp_rom = calloc(CART_3BPP_SIZE, sizeof(uint8_t));

// memcpy(emu->system_rom, bios_system_bin, bios_system_bin_len);
// memcpy(emu->system_charset, bios_charset_1bpp, bios_charset_1bpp_len);
Expand All @@ -90,11 +58,13 @@ void vg8m_fin(VG8M *emu) {
// free(emu->system_rom);
free(emu->system_ram);
free(emu->user_ram);
free(emu->cart_prog_rom);
free(emu->cart_2bpp_rom);
free(emu->cart_3bpp_rom);
free(emu->cpu);

_unload_file(emu->system_rom, SYS_ROM_SIZE);
_unload_file(emu->system_charset, CHAR_ROM_SIZE);
_unload_file(emu->cartridge_rom, CART_ROM_SIZE);
}

void vg8m_reset(VG8M *emu) {
Expand Down Expand Up @@ -153,21 +123,6 @@ bool vg8m_load_system(VG8M *emu, const char *rom_filename, const char *charset_f
return false;
}

bool vg8m_load_cart(VG8M *emu, const char *filename) {
uint8_t *buffer = NULL;

buffer = _load_file(CART_ROM_SIZE, filename);
if (!buffer)
goto error;

emu->cartridge_rom = buffer;

return true;
error:
_unload_file(buffer, CART_ROM_SIZE);
return false;
}

void vg8m_set_buttons(VG8M *emu, VG8MButtonMask buttons, bool pressed) {
if (pressed)
emu->hwregs.buttons |= buttons;
Expand Down Expand Up @@ -323,8 +278,8 @@ static uint8_t _readmem(VG8M *emu, uint16_t addr) {
else if (inregion(addr, USER_RAM_ADDR, USER_RAM_END))
return emu->user_ram[addr - USER_RAM_ADDR];

else if (inregion(addr, CART_ROM_ADDR, CART_ROM_END) && emu->cartridge_rom)
return emu->cartridge_rom[addr - CART_ROM_ADDR];
else if (inregion(addr, CART_ROM_ADDR, CART_ROM_END))
return emu->cart_prog_rom[addr - CART_ROM_ADDR];

return 0xFF;
}
Expand Down
7 changes: 6 additions & 1 deletion vg8m.h
@@ -1,4 +1,7 @@
#pragma once
#include <stdbool.h>
#include <stdint.h>

#include "z80.h"

typedef struct s_vg8m VG8M;
Expand Down Expand Up @@ -36,7 +39,9 @@ struct s_vg8m {
uint8_t *system_ram;
uint8_t *system_charset;
uint8_t *user_ram;
uint8_t *cartridge_rom;
uint8_t *cart_prog_rom;
uint8_t *cart_2bpp_rom;
uint8_t *cart_3bpp_rom;
VG8MRegisters hwregs;

VG8MCallback scanline_callback;
Expand Down

0 comments on commit 80a4b5d

Please sign in to comment.