aboutsummaryrefslogtreecommitdiffstats
path: root/src/cart.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/cart.h')
-rw-r--r--src/cart.h53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/cart.h b/src/cart.h
new file mode 100644
index 0000000..ec864bb
--- /dev/null
+++ b/src/cart.h
@@ -0,0 +1,53 @@
+#ifndef GBC_CART_H
+#define GBC_CART_H
+
+#include "types.h"
+
+typedef enum {
+ MBC_NONE,
+ MBC_1,
+ MBC_2,
+ MBC_3,
+ MBC_5,
+} MbcType;
+
+typedef struct {
+ u8 *rom; // full ROM image
+ size_t rom_size;
+ int rom_banks; // number of 16KB banks
+
+ u8 *ram; // external cartridge RAM
+ size_t ram_size;
+ int ram_banks; // number of 8KB banks
+
+ MbcType mbc;
+ bool has_ram;
+ bool has_battery;
+ bool has_rtc;
+ bool cgb; // CGB flag set in header
+
+ char title[17];
+
+ // MBC state
+ bool ram_enabled;
+ u8 rom_bank; // low bank register
+ u8 rom_bank_hi; // high bits (mbc1 mode / mbc5)
+ u8 ram_bank;
+ u8 bank_mode; // MBC1 banking mode select
+
+ // RTC (MBC3)
+ u8 rtc_reg[5]; // S, M, H, DL, DH
+ u8 rtc_latch;
+
+ char save_path[512];
+} Cart;
+
+// Load a ROM file into cart. Returns 0 on success.
+int cart_load(Cart *c, const char *path);
+void cart_free(Cart *c);
+void cart_save(Cart *c);
+
+u8 cart_read(Cart *c, u16 addr);
+void cart_write(Cart *c, u16 addr, u8 val);
+
+#endif