all repos — mgba @ 1285aa2749e7cf4984829aa34a7f708220b6eb24

mGBA Game Boy Advance Emulator

include/mgba/internal/sm83/sm83.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 SM83_H
  7#define SM83_H
  8
  9#include <mgba-util/common.h>
 10
 11CXX_GUARD_START
 12
 13#include <mgba/core/cpu.h>
 14#include <mgba/internal/sm83/isa-sm83.h>
 15
 16struct SM83Core;
 17
 18#pragma pack(push, 1)
 19union FlagRegister {
 20	struct {
 21#if defined(__POWERPC__) || defined(__PPC__)
 22		unsigned z : 1;
 23		unsigned n : 1;
 24		unsigned h : 1;
 25		unsigned c : 1;
 26		unsigned unused : 4;
 27#else
 28		unsigned unused : 4;
 29		unsigned c : 1;
 30		unsigned h : 1;
 31		unsigned n : 1;
 32		unsigned z : 1;
 33#endif
 34	};
 35
 36	uint8_t packed;
 37};
 38#pragma pack(pop)
 39
 40enum SM83ExecutionState {
 41	SM83_CORE_FETCH = 3,
 42	SM83_CORE_IDLE_0 = 0,
 43	SM83_CORE_IDLE_1 = 1,
 44	SM83_CORE_EXECUTE = 2,
 45
 46	SM83_CORE_MEMORY_LOAD = 7,
 47	SM83_CORE_MEMORY_STORE = 11,
 48	SM83_CORE_READ_PC = 15,
 49	SM83_CORE_STALL = 19,
 50	SM83_CORE_OP2 = 23
 51};
 52struct SM83Memory {
 53	uint8_t (*cpuLoad8)(struct SM83Core*, uint16_t address);
 54	uint8_t (*load8)(struct SM83Core*, uint16_t address);
 55	void (*store8)(struct SM83Core*, uint16_t address, int8_t value);
 56
 57	int (*currentSegment)(struct SM83Core*, uint16_t address);
 58
 59	const uint8_t* activeRegion;
 60	uint16_t activeMask;
 61	uint16_t activeRegionEnd;
 62	void (*setActiveRegion)(struct SM83Core*, uint16_t address);
 63};
 64
 65struct SM83InterruptHandler {
 66	void (*reset)(struct SM83Core* cpu);
 67	void (*processEvents)(struct SM83Core* cpu);
 68	void (*setInterrupts)(struct SM83Core* cpu, bool enable);
 69	uint16_t (*irqVector)(struct SM83Core* cpu);
 70	void (*halt)(struct SM83Core* cpu);
 71	void (*stop)(struct SM83Core* cpu);
 72
 73	void (*hitIllegal)(struct SM83Core* cpu);
 74};
 75
 76struct SM83Core {
 77#pragma pack(push, 1)
 78	union {
 79		struct {
 80			union FlagRegister f;
 81			uint8_t a;
 82		};
 83		uint16_t af;
 84	};
 85#pragma pack(pop)
 86	union {
 87		struct {
 88			uint8_t c;
 89			uint8_t b;
 90		};
 91		uint16_t bc;
 92	};
 93	union {
 94		struct {
 95			uint8_t e;
 96			uint8_t d;
 97		};
 98		uint16_t de;
 99	};
100	union {
101		struct {
102			uint8_t l;
103			uint8_t h;
104		};
105		uint16_t hl;
106	};
107	uint16_t sp;
108	uint16_t pc;
109
110	uint16_t index;
111
112	int32_t cycles;
113	int32_t nextEvent;
114	enum SM83ExecutionState executionState;
115	bool halted;
116
117	uint8_t bus;
118	bool condition;
119	SM83Instruction instruction;
120
121	bool irqPending;
122
123	struct SM83Memory memory;
124	struct SM83InterruptHandler irqh;
125
126	struct mCPUComponent* master;
127
128	size_t numComponents;
129	struct mCPUComponent** components;
130};
131
132void SM83Init(struct SM83Core* cpu);
133void SM83Deinit(struct SM83Core* cpu);
134void SM83SetComponents(struct SM83Core* cpu, struct mCPUComponent* master, int extra, struct mCPUComponent** extras);
135void SM83HotplugAttach(struct SM83Core* cpu, size_t slot);
136void SM83HotplugDetach(struct SM83Core* cpu, size_t slot);
137
138void SM83Reset(struct SM83Core* cpu);
139void SM83RaiseIRQ(struct SM83Core* cpu);
140
141void SM83Tick(struct SM83Core* cpu);
142void SM83Run(struct SM83Core* cpu);
143
144CXX_GUARD_END
145
146#endif