all repos — mgba @ 227cbea37a1196f34e8884a5331f54c5f30c6e01

mGBA Game Boy Advance Emulator

src/gb/gb.h (view raw)

  1/* Copyright (c) 2013-2016 Jeffrey Pfau
  2 *
  3 * This Source Code Form is subject to the terms of the Mozilla Public
  4 * License, v. 2.0. If a copy of the MPL was not distributed with this
  5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  6#ifndef GB_H
  7#define GB_H
  8
  9#include "util/common.h"
 10
 11#include "core/log.h"
 12#include "core/timing.h"
 13
 14#include "lr35902/lr35902.h"
 15
 16#include "gb/audio.h"
 17#include "gb/interface.h"
 18#include "gb/memory.h"
 19#include "gb/sio.h"
 20#include "gb/timer.h"
 21#include "gb/video.h"
 22
 23extern const uint32_t DMG_LR35902_FREQUENCY;
 24extern const uint32_t CGB_LR35902_FREQUENCY;
 25extern const uint32_t SGB_LR35902_FREQUENCY;
 26
 27mLOG_DECLARE_CATEGORY(GB);
 28
 29// TODO: Prefix GBAIRQ
 30enum GBIRQ {
 31	GB_IRQ_VBLANK = 0x0,
 32	GB_IRQ_LCDSTAT = 0x1,
 33	GB_IRQ_TIMER = 0x2,
 34	GB_IRQ_SIO = 0x3,
 35	GB_IRQ_KEYPAD = 0x4,
 36};
 37
 38enum GBIRQVector {
 39	GB_VECTOR_VBLANK = 0x40,
 40	GB_VECTOR_LCDSTAT = 0x48,
 41	GB_VECTOR_TIMER = 0x50,
 42	GB_VECTOR_SIO = 0x58,
 43	GB_VECTOR_KEYPAD = 0x60,
 44};
 45
 46struct mCoreSync;
 47struct mAVStream;
 48struct mCoreCallbacks;
 49struct GB {
 50	struct mCPUComponent d;
 51
 52	struct LR35902Core* cpu;
 53	struct GBMemory memory;
 54	struct GBVideo video;
 55	struct GBTimer timer;
 56	struct GBAudio audio;
 57	struct GBSIO sio;
 58	enum GBModel model;
 59
 60	struct mCoreSync* sync;
 61	struct mTiming timing;
 62
 63	uint8_t* keySource;
 64
 65	void* pristineRom;
 66	size_t pristineRomSize;
 67	size_t yankedRomSize;
 68	uint32_t romCrc32;
 69	struct VFile* romVf;
 70	struct VFile* biosVf;
 71	struct VFile* sramVf;
 72	struct VFile* sramRealVf;
 73	uint32_t sramSize;
 74	int sramDirty;
 75	int32_t sramDirtAge;
 76	bool sramMaskWriteback;
 77
 78	struct mCoreCallbacks* coreCallbacks;
 79	struct mAVStream* stream;
 80
 81	bool cpuBlocked;
 82	struct mTimingEvent eiPending;
 83	unsigned doubleSpeed;
 84};
 85
 86struct GBCartridge {
 87	uint8_t entry[4];
 88	uint8_t logo[48];
 89	union {
 90		char titleLong[16];
 91		struct {
 92			char titleShort[11];
 93			char maker[4];
 94			uint8_t cgb;
 95		};
 96	};
 97	char licensee[2];
 98	uint8_t sgb;
 99	uint8_t type;
100	uint8_t romSize;
101	uint8_t ramSize;
102	uint8_t region;
103	uint8_t oldLicensee;
104	uint8_t version;
105	uint8_t headerChecksum;
106	uint16_t globalChecksum;
107	// And ROM data...
108};
109
110void GBCreate(struct GB* gb);
111void GBDestroy(struct GB* gb);
112
113void GBReset(struct LR35902Core* cpu);
114void GBDetectModel(struct GB* gb);
115
116void GBUpdateIRQs(struct GB* gb);
117void GBHalt(struct LR35902Core* cpu);
118
119struct VFile;
120bool GBLoadROM(struct GB* gb, struct VFile* vf);
121bool GBLoadSave(struct GB* gb, struct VFile* vf);
122void GBYankROM(struct GB* gb);
123void GBUnloadROM(struct GB* gb);
124void GBSynthesizeROM(struct VFile* vf);
125
126bool GBIsBIOS(struct VFile* vf);
127void GBLoadBIOS(struct GB* gb, struct VFile* vf);
128
129void GBSramClean(struct GB* gb, uint32_t frameCount);
130void GBResizeSram(struct GB* gb, size_t size);
131void GBSavedataMask(struct GB* gb, struct VFile* vf, bool writeback);
132void GBSavedataUnmask(struct GB* gb);
133
134struct Patch;
135void GBApplyPatch(struct GB* gb, struct Patch* patch);
136
137bool GBIsROM(struct VFile* vf);
138void GBGetGameTitle(const struct GB* gba, char* out);
139void GBGetGameCode(const struct GB* gba, char* out);
140
141void GBFrameEnded(struct GB* gb);
142
143#endif