aboutsummaryrefslogtreecommitdiffstats
path: root/src/cart.h
blob: ec864bba676a121fb19fc575b10dbe5e1db81a15 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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