瀏覽代碼

Stub out MMU functions, opcodes; const fixes.

master
Ben Kurtovic 9 年之前
父節點
當前提交
274b2eaa93
共有 9 個檔案被更改,包括 336 行新增27 行删除
  1. +1
    -1
      src/config.c
  2. +1
    -1
      src/config.h
  3. +9
    -7
      src/gamegear.c
  4. +1
    -1
      src/gamegear.h
  5. +51
    -4
      src/mmu.c
  6. +9
    -2
      src/mmu.h
  7. +6
    -7
      src/z80.c
  8. +1
    -1
      src/z80.h
  9. +257
    -3
      src/z80_instructions.inc

+ 1
- 1
src/config.c 查看文件

@@ -364,7 +364,7 @@ void config_destroy(Config *config)
/*
DEBUG FUNCTION: Print out all config arguments to stdout.
*/
void config_dump_args(Config* config)
void config_dump_args(const Config* config)
{
DEBUG("Dumping arguments:")
DEBUG("- fullscreen: %s", config->fullscreen ? "true" : "false")


+ 1
- 1
src/config.h 查看文件

@@ -38,5 +38,5 @@ int config_create(Config**, int, char*[]);
void config_destroy(Config*);

#ifdef DEBUG_MODE
void config_dump_args(Config*);
void config_dump_args(const Config*);
#endif

+ 9
- 7
src/gamegear.c 查看文件

@@ -21,7 +21,8 @@ GameGear* gamegear_create()
if (!gg)
OUT_OF_MEMORY()

// mmu_init(&gg->mmu, ...);
if (!mmu_init(&gg->mmu))
OUT_OF_MEMORY()
z80_init(&gg->cpu, &gg->mmu);
gg->powered = false;
gg->exc_buffer[0] = '\0';
@@ -35,22 +36,23 @@ GameGear* gamegear_create()
*/
void gamegear_destroy(GameGear *gg)
{
// mmu_free(&gg->mmu);
mmu_free(&gg->mmu);
free(gg);
}

/*
Load a ROM image into the GameGear object.

Does *not* steal a reference to the ROM object. Calling this function while
the GameGear is powered on has no effect.
Does *not* steal a reference to the ROM object, so it must be kept alive
until another ROM is loaded or the GameGear is destroyed. Calling this
function while the GameGear is powered on has no effect.
*/
void gamegear_load(GameGear *gg, ROM *rom)
void gamegear_load(GameGear *gg, const ROM *rom)
{
if (gg->powered)
return;

// mmu_hard_map(&gg->mmu, rom->data, ..., ...);
mmu_load_rom(&gg->mmu, rom->data, rom->size);
}

/*
@@ -68,7 +70,7 @@ void gamegear_power(GameGear *gg, bool state)
return;

if (state) {
// mmu_power(&gg->mmu);
mmu_power(&gg->mmu);
z80_power(&gg->cpu);
gg->last_tick = get_time_ns();
} else {


+ 1
- 1
src/gamegear.h 查看文件

@@ -26,7 +26,7 @@ typedef struct {

GameGear* gamegear_create();
void gamegear_destroy(GameGear*);
void gamegear_load(GameGear*, ROM*);
void gamegear_load(GameGear*, const ROM*);
void gamegear_power(GameGear*, bool);
bool gamegear_simulate(GameGear*);
const char* gamegear_get_exception(GameGear*);

+ 51
- 4
src/mmu.c 查看文件

@@ -5,8 +5,55 @@

/*
Initialize a MMU object.

Return true if initialization was successful, or false if the required
amount of memory could not be allocated.
*/
bool mmu_init(MMU *mmu)
{
// TODO
return true;
}

/*
Free memory previously allocated by the MMU.
*/
void mmu_free(MMU *mmu)
{
// TODO
}

/*
Load a block ROM into the MMU.

size should be a power of two.
*/
void mmu_load_rom(MMU *mmu, const uint8_t *data, size_t size)
{
// TODO
}

/*
Power on the MMU, setting initial memory values.
*/
void mmu_power(MMU *mmu)
{
// TODO
}

/*
Read a byte of memory.
*/
uint8_t mmu_read_byte(MMU *mmu, uint16_t addr)
{
// TODO
return 0x00;
}

/*
...
*/
// void mmu_init(MMU *mmu, ...)
// {
// //
// }
void mmu_write_byte(MMU *mmu, uint16_t addr, uint8_t value)
{
// TODO
}

+ 9
- 2
src/mmu.h 查看文件

@@ -3,7 +3,9 @@

#pragma once

// #include <>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

/* Structs */

@@ -13,4 +15,9 @@ typedef struct {

/* Functions */

// void mmu_init(MMU*, ...);
bool mmu_init(MMU*);
void mmu_free(MMU*);
void mmu_load_rom(MMU*, const uint8_t*, size_t);
void mmu_power(MMU*);
uint8_t mmu_read_byte(MMU*, uint16_t);
void mmu_write_byte(MMU*, uint16_t, uint8_t);

+ 6
- 7
src/z80.c 查看文件

@@ -63,7 +63,7 @@ void z80_power(Z80 *z80)
/*
Return whether a particular flag is set in the F register.
*/
static inline bool get_flag(Z80 *z80, uint8_t flag)
static inline bool get_flag(const Z80 *z80, uint8_t flag)
{
return z80->regfile.f & (1 << flag);
}
@@ -71,7 +71,7 @@ static inline bool get_flag(Z80 *z80, uint8_t flag)
/*
Return whether a particular flag is set in the F' register.
*/
static inline bool get_shadow_flag(Z80 *z80, uint8_t flag)
static inline bool get_shadow_flag(const Z80 *z80, uint8_t flag)
{
return z80->regfile.f_ & (1 << flag);
}
@@ -79,7 +79,7 @@ static inline bool get_shadow_flag(Z80 *z80, uint8_t flag)
/*
Return the CPU's current interrupt mode.
*/
static inline uint8_t get_interrupt_mode(Z80 *z80)
static inline uint8_t get_interrupt_mode(const Z80 *z80)
{
if (!z80->regfile.im_a)
return 0;
@@ -101,8 +101,7 @@ bool z80_do_cycles(Z80 *z80, double cycles)
{
cycles -= z80->pending_cycles;
while (cycles > 0 && !z80->except) {
// uint8_t opcode = mmu_read_byte(&z80->mmu, z80->regfile.pc);
uint8_t opcode = 0x00;
uint8_t opcode = mmu_read_byte(z80->mmu, z80->regfile.pc);
cycles -= (*instruction_lookup_table[opcode])(z80, opcode) - 2;
}

@@ -114,9 +113,9 @@ bool z80_do_cycles(Z80 *z80, double cycles)
/*
DEBUG FUNCTION: Print out all register values to stdout.
*/
void z80_dump_registers(Z80 *z80)
void z80_dump_registers(const Z80 *z80)
{
Z80RegFile *regfile = &z80->regfile;
const Z80RegFile *regfile = &z80->regfile;
DEBUG("Dumping Z80 register values:")

DEBUG("- AF: 0x%02X%02X (C: %u, N: %u, P/V: %u, H: %u, Z: %u, S: %u)",


+ 1
- 1
src/z80.h 查看文件

@@ -37,5 +37,5 @@ void z80_power(Z80*);
bool z80_do_cycles(Z80*, double);

#ifdef DEBUG_MODE
void z80_dump_registers(Z80*);
void z80_dump_registers(const Z80*);
#endif

+ 257
- 3
src/z80_instructions.inc 查看文件

@@ -20,7 +20,7 @@ static uint8_t z80_inst_nop(Z80 *z80, uint8_t opcode)
/*
Unimplemented opcode handler.
*/
static uint8_t z80_inst_ERR(Z80 *z80, uint8_t opcode)
static uint8_t z80_inst_unimplemented(Z80 *z80, uint8_t opcode)
{
z80->except = true;
z80->exc_code = Z80_EXC_UNIMPLEMENTED_OPCODE;
@@ -29,6 +29,260 @@ static uint8_t z80_inst_ERR(Z80 *z80, uint8_t opcode)
}

static uint8_t (*instruction_lookup_table[256])(Z80*, uint8_t) = {
z80_inst_nop,
z80_inst_ERR
/* 0x00 */ z80_inst_nop,
/* 0x01 */ z80_inst_unimplemented,
/* 0x02 */ z80_inst_unimplemented,
/* 0x03 */ z80_inst_unimplemented,
/* 0x04 */ z80_inst_unimplemented,
/* 0x05 */ z80_inst_unimplemented,
/* 0x06 */ z80_inst_unimplemented,
/* 0x07 */ z80_inst_unimplemented,
/* 0x08 */ z80_inst_unimplemented,
/* 0x09 */ z80_inst_unimplemented,
/* 0x0A */ z80_inst_unimplemented,
/* 0x0B */ z80_inst_unimplemented,
/* 0x0C */ z80_inst_unimplemented,
/* 0x0D */ z80_inst_unimplemented,
/* 0x0E */ z80_inst_unimplemented,
/* 0x0F */ z80_inst_unimplemented,
/* 0x10 */ z80_inst_unimplemented,
/* 0x11 */ z80_inst_unimplemented,
/* 0x12 */ z80_inst_unimplemented,
/* 0x13 */ z80_inst_unimplemented,
/* 0x14 */ z80_inst_unimplemented,
/* 0x15 */ z80_inst_unimplemented,
/* 0x16 */ z80_inst_unimplemented,
/* 0x17 */ z80_inst_unimplemented,
/* 0x18 */ z80_inst_unimplemented,
/* 0x19 */ z80_inst_unimplemented,
/* 0x1A */ z80_inst_unimplemented,
/* 0x1B */ z80_inst_unimplemented,
/* 0x1C */ z80_inst_unimplemented,
/* 0x1D */ z80_inst_unimplemented,
/* 0x1E */ z80_inst_unimplemented,
/* 0x1F */ z80_inst_unimplemented,
/* 0x20 */ z80_inst_unimplemented,
/* 0x21 */ z80_inst_unimplemented,
/* 0x22 */ z80_inst_unimplemented,
/* 0x23 */ z80_inst_unimplemented,
/* 0x24 */ z80_inst_unimplemented,
/* 0x25 */ z80_inst_unimplemented,
/* 0x26 */ z80_inst_unimplemented,
/* 0x27 */ z80_inst_unimplemented,
/* 0x28 */ z80_inst_unimplemented,
/* 0x29 */ z80_inst_unimplemented,
/* 0x2A */ z80_inst_unimplemented,
/* 0x2B */ z80_inst_unimplemented,
/* 0x2C */ z80_inst_unimplemented,
/* 0x2D */ z80_inst_unimplemented,
/* 0x2E */ z80_inst_unimplemented,
/* 0x2F */ z80_inst_unimplemented,
/* 0x30 */ z80_inst_unimplemented,
/* 0x31 */ z80_inst_unimplemented,
/* 0x32 */ z80_inst_unimplemented,
/* 0x33 */ z80_inst_unimplemented,
/* 0x34 */ z80_inst_unimplemented,
/* 0x35 */ z80_inst_unimplemented,
/* 0x36 */ z80_inst_unimplemented,
/* 0x37 */ z80_inst_unimplemented,
/* 0x38 */ z80_inst_unimplemented,
/* 0x39 */ z80_inst_unimplemented,
/* 0x3A */ z80_inst_unimplemented,
/* 0x3B */ z80_inst_unimplemented,
/* 0x3C */ z80_inst_unimplemented,
/* 0x3D */ z80_inst_unimplemented,
/* 0x3E */ z80_inst_unimplemented,
/* 0x3F */ z80_inst_unimplemented,
/* 0x40 */ z80_inst_unimplemented,
/* 0x41 */ z80_inst_unimplemented,
/* 0x42 */ z80_inst_unimplemented,
/* 0x43 */ z80_inst_unimplemented,
/* 0x44 */ z80_inst_unimplemented,
/* 0x45 */ z80_inst_unimplemented,
/* 0x46 */ z80_inst_unimplemented,
/* 0x47 */ z80_inst_unimplemented,
/* 0x48 */ z80_inst_unimplemented,
/* 0x49 */ z80_inst_unimplemented,
/* 0x4A */ z80_inst_unimplemented,
/* 0x4B */ z80_inst_unimplemented,
/* 0x4C */ z80_inst_unimplemented,
/* 0x4D */ z80_inst_unimplemented,
/* 0x4E */ z80_inst_unimplemented,
/* 0x4F */ z80_inst_unimplemented,
/* 0x50 */ z80_inst_unimplemented,
/* 0x51 */ z80_inst_unimplemented,
/* 0x52 */ z80_inst_unimplemented,
/* 0x53 */ z80_inst_unimplemented,
/* 0x54 */ z80_inst_unimplemented,
/* 0x55 */ z80_inst_unimplemented,
/* 0x56 */ z80_inst_unimplemented,
/* 0x57 */ z80_inst_unimplemented,
/* 0x58 */ z80_inst_unimplemented,
/* 0x59 */ z80_inst_unimplemented,
/* 0x5A */ z80_inst_unimplemented,
/* 0x5B */ z80_inst_unimplemented,
/* 0x5C */ z80_inst_unimplemented,
/* 0x5D */ z80_inst_unimplemented,
/* 0x5E */ z80_inst_unimplemented,
/* 0x5F */ z80_inst_unimplemented,
/* 0x60 */ z80_inst_unimplemented,
/* 0x61 */ z80_inst_unimplemented,
/* 0x62 */ z80_inst_unimplemented,
/* 0x63 */ z80_inst_unimplemented,
/* 0x64 */ z80_inst_unimplemented,
/* 0x65 */ z80_inst_unimplemented,
/* 0x66 */ z80_inst_unimplemented,
/* 0x67 */ z80_inst_unimplemented,
/* 0x68 */ z80_inst_unimplemented,
/* 0x69 */ z80_inst_unimplemented,
/* 0x6A */ z80_inst_unimplemented,
/* 0x6B */ z80_inst_unimplemented,
/* 0x6C */ z80_inst_unimplemented,
/* 0x6D */ z80_inst_unimplemented,
/* 0x6E */ z80_inst_unimplemented,
/* 0x6F */ z80_inst_unimplemented,
/* 0x70 */ z80_inst_unimplemented,
/* 0x71 */ z80_inst_unimplemented,
/* 0x72 */ z80_inst_unimplemented,
/* 0x73 */ z80_inst_unimplemented,
/* 0x74 */ z80_inst_unimplemented,
/* 0x75 */ z80_inst_unimplemented,
/* 0x76 */ z80_inst_unimplemented,
/* 0x77 */ z80_inst_unimplemented,
/* 0x78 */ z80_inst_unimplemented,
/* 0x79 */ z80_inst_unimplemented,
/* 0x7A */ z80_inst_unimplemented,
/* 0x7B */ z80_inst_unimplemented,
/* 0x7C */ z80_inst_unimplemented,
/* 0x7D */ z80_inst_unimplemented,
/* 0x7E */ z80_inst_unimplemented,
/* 0x7F */ z80_inst_unimplemented,
/* 0x80 */ z80_inst_unimplemented,
/* 0x81 */ z80_inst_unimplemented,
/* 0x82 */ z80_inst_unimplemented,
/* 0x83 */ z80_inst_unimplemented,
/* 0x84 */ z80_inst_unimplemented,
/* 0x85 */ z80_inst_unimplemented,
/* 0x86 */ z80_inst_unimplemented,
/* 0x87 */ z80_inst_unimplemented,
/* 0x88 */ z80_inst_unimplemented,
/* 0x89 */ z80_inst_unimplemented,
/* 0x8A */ z80_inst_unimplemented,
/* 0x8B */ z80_inst_unimplemented,
/* 0x8C */ z80_inst_unimplemented,
/* 0x8D */ z80_inst_unimplemented,
/* 0x8E */ z80_inst_unimplemented,
/* 0x8F */ z80_inst_unimplemented,
/* 0x90 */ z80_inst_unimplemented,
/* 0x91 */ z80_inst_unimplemented,
/* 0x92 */ z80_inst_unimplemented,
/* 0x93 */ z80_inst_unimplemented,
/* 0x94 */ z80_inst_unimplemented,
/* 0x95 */ z80_inst_unimplemented,
/* 0x96 */ z80_inst_unimplemented,
/* 0x97 */ z80_inst_unimplemented,
/* 0x98 */ z80_inst_unimplemented,
/* 0x99 */ z80_inst_unimplemented,
/* 0x9A */ z80_inst_unimplemented,
/* 0x9B */ z80_inst_unimplemented,
/* 0x9C */ z80_inst_unimplemented,
/* 0x9D */ z80_inst_unimplemented,
/* 0x9E */ z80_inst_unimplemented,
/* 0x9F */ z80_inst_unimplemented,
/* 0xA0 */ z80_inst_unimplemented,
/* 0xA1 */ z80_inst_unimplemented,
/* 0xA2 */ z80_inst_unimplemented,
/* 0xA3 */ z80_inst_unimplemented,
/* 0xA4 */ z80_inst_unimplemented,
/* 0xA5 */ z80_inst_unimplemented,
/* 0xA6 */ z80_inst_unimplemented,
/* 0xA7 */ z80_inst_unimplemented,
/* 0xA8 */ z80_inst_unimplemented,
/* 0xA9 */ z80_inst_unimplemented,
/* 0xAA */ z80_inst_unimplemented,
/* 0xAB */ z80_inst_unimplemented,
/* 0xAC */ z80_inst_unimplemented,
/* 0xAD */ z80_inst_unimplemented,
/* 0xAE */ z80_inst_unimplemented,
/* 0xAF */ z80_inst_unimplemented,
/* 0xB0 */ z80_inst_unimplemented,
/* 0xB1 */ z80_inst_unimplemented,
/* 0xB2 */ z80_inst_unimplemented,
/* 0xB3 */ z80_inst_unimplemented,
/* 0xB4 */ z80_inst_unimplemented,
/* 0xB5 */ z80_inst_unimplemented,
/* 0xB6 */ z80_inst_unimplemented,
/* 0xB7 */ z80_inst_unimplemented,
/* 0xB8 */ z80_inst_unimplemented,
/* 0xB9 */ z80_inst_unimplemented,
/* 0xBA */ z80_inst_unimplemented,
/* 0xBB */ z80_inst_unimplemented,
/* 0xBC */ z80_inst_unimplemented,
/* 0xBD */ z80_inst_unimplemented,
/* 0xBE */ z80_inst_unimplemented,
/* 0xBF */ z80_inst_unimplemented,
/* 0xC0 */ z80_inst_unimplemented,
/* 0xC1 */ z80_inst_unimplemented,
/* 0xC2 */ z80_inst_unimplemented,
/* 0xC3 */ z80_inst_unimplemented,
/* 0xC4 */ z80_inst_unimplemented,
/* 0xC5 */ z80_inst_unimplemented,
/* 0xC6 */ z80_inst_unimplemented,
/* 0xC7 */ z80_inst_unimplemented,
/* 0xC8 */ z80_inst_unimplemented,
/* 0xC9 */ z80_inst_unimplemented,
/* 0xCA */ z80_inst_unimplemented,
/* 0xCB */ z80_inst_unimplemented,
/* 0xCC */ z80_inst_unimplemented,
/* 0xCD */ z80_inst_unimplemented,
/* 0xCE */ z80_inst_unimplemented,
/* 0xCF */ z80_inst_unimplemented,
/* 0xD0 */ z80_inst_unimplemented,
/* 0xD1 */ z80_inst_unimplemented,
/* 0xD2 */ z80_inst_unimplemented,
/* 0xD3 */ z80_inst_unimplemented,
/* 0xD4 */ z80_inst_unimplemented,
/* 0xD5 */ z80_inst_unimplemented,
/* 0xD6 */ z80_inst_unimplemented,
/* 0xD7 */ z80_inst_unimplemented,
/* 0xD8 */ z80_inst_unimplemented,
/* 0xD9 */ z80_inst_unimplemented,
/* 0xDA */ z80_inst_unimplemented,
/* 0xDB */ z80_inst_unimplemented,
/* 0xDC */ z80_inst_unimplemented,
/* 0xDD */ z80_inst_unimplemented,
/* 0xDE */ z80_inst_unimplemented,
/* 0xDF */ z80_inst_unimplemented,
/* 0xE0 */ z80_inst_unimplemented,
/* 0xE1 */ z80_inst_unimplemented,
/* 0xE2 */ z80_inst_unimplemented,
/* 0xE3 */ z80_inst_unimplemented,
/* 0xE4 */ z80_inst_unimplemented,
/* 0xE5 */ z80_inst_unimplemented,
/* 0xE6 */ z80_inst_unimplemented,
/* 0xE7 */ z80_inst_unimplemented,
/* 0xE8 */ z80_inst_unimplemented,
/* 0xE9 */ z80_inst_unimplemented,
/* 0xEA */ z80_inst_unimplemented,
/* 0xEB */ z80_inst_unimplemented,
/* 0xEC */ z80_inst_unimplemented,
/* 0xED */ z80_inst_unimplemented,
/* 0xEE */ z80_inst_unimplemented,
/* 0xEF */ z80_inst_unimplemented,
/* 0xF0 */ z80_inst_unimplemented,
/* 0xF1 */ z80_inst_unimplemented,
/* 0xF2 */ z80_inst_unimplemented,
/* 0xF3 */ z80_inst_unimplemented,
/* 0xF4 */ z80_inst_unimplemented,
/* 0xF5 */ z80_inst_unimplemented,
/* 0xF6 */ z80_inst_unimplemented,
/* 0xF7 */ z80_inst_unimplemented,
/* 0xF8 */ z80_inst_unimplemented,
/* 0xF9 */ z80_inst_unimplemented,
/* 0xFA */ z80_inst_unimplemented,
/* 0xFB */ z80_inst_unimplemented,
/* 0xFC */ z80_inst_unimplemented,
/* 0xFD */ z80_inst_unimplemented,
/* 0xFE */ z80_inst_unimplemented,
/* 0xFF */ z80_inst_unimplemented
};

Loading…
取消
儲存