libsidplayfp  2.0.2
mmu.h
1 /*
2  * This file is part of libsidplayfp, a SID player engine.
3  *
4  * Copyright 2011-2019 Leandro Nini <drfiemost@users.sourceforge.net>
5  * Copyright 2007-2010 Antti Lankila
6  * Copyright 2000 Simon White
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21  */
22 
23 #ifndef MMU_H
24 #define MMU_H
25 
26 #include <stdint.h>
27 
28 #include "sidendian.h"
29 #include "sidmemory.h"
30 #include "EventScheduler.h"
31 
32 #include "Banks/SystemRAMBank.h"
33 #include "Banks/SystemROMBanks.h"
34 #include "Banks/ZeroRAMBank.h"
35 
36 #include "sidcxx11.h"
37 
38 #include <string.h>
39 
40 namespace libsidplayfp
41 {
42 
43 class Bank;
44 class IOBank;
45 
49 class MMU final : public PLA, public sidmemory
50 {
51 private:
52  EventScheduler &eventScheduler;
53 
55  bool loram, hiram, charen;
56 
58  Bank* cpuReadMap[16];
59 
61  Bank* cpuWriteMap[16];
62 
64  IOBank* ioBank;
65 
67  KernalRomBank kernalRomBank;
68 
70  BasicRomBank basicRomBank;
71 
73  CharacterRomBank characterRomBank;
74 
76  SystemRAMBank ramBank;
77 
79  ZeroRAMBank zeroRAMBank;
80 
81 private:
82  void setCpuPort(uint8_t state) override;
83  uint8_t getLastReadByte() const override { return 0; }
84  event_clock_t getPhi2Time() const override { return eventScheduler.getTime(EVENT_CLOCK_PHI2); }
85 
86  void updateMappingPHI2();
87 
88 public:
89  MMU(EventScheduler &eventScheduler, IOBank* ioBank);
90 
91  void reset();
92 
93  void setRoms(const uint8_t* kernal, const uint8_t* basic, const uint8_t* character)
94  {
95  kernalRomBank.set(kernal);
96  basicRomBank.set(basic);
97  characterRomBank.set(character);
98  }
99 
100  // RAM access methods
101  uint8_t readMemByte(uint_least16_t addr) override { return ramBank.peek(addr); }
102  uint_least16_t readMemWord(uint_least16_t addr) override { return endian_little16(ramBank.ram+addr); }
103 
104  void writeMemByte(uint_least16_t addr, uint8_t value) override { ramBank.poke(addr, value); }
105  void writeMemWord(uint_least16_t addr, uint_least16_t value) override { endian_little16(ramBank.ram+addr, value); }
106 
107  void fillRam(uint_least16_t start, uint8_t value, unsigned int size) override
108  {
109  memset(ramBank.ram+start, value, size);
110  }
111  void fillRam(uint_least16_t start, const uint8_t* source, unsigned int size) override
112  {
113  memcpy(ramBank.ram+start, source, size);
114  }
115 
116  // SID specific hacks
117  void installResetHook(uint_least16_t addr) override { kernalRomBank.installResetHook(addr); }
118 
119  void installBasicTrap(uint_least16_t addr) override { basicRomBank.installTrap(addr); }
120 
121  void setBasicSubtune(uint8_t tune) override { basicRomBank.setSubtune(tune); }
122 
129  uint8_t cpuRead(uint_least16_t addr) const { return cpuReadMap[addr >> 12]->peek(addr); }
130 
137  void cpuWrite(uint_least16_t addr, uint8_t data) { cpuWriteMap[addr >> 12]->poke(addr, data); }
138 };
139 
140 }
141 
142 #endif
libsidplayfp::MMU::cpuRead
uint8_t cpuRead(uint_least16_t addr) const
Definition: mmu.h:129
libsidplayfp::MMU::setBasicSubtune
void setBasicSubtune(uint8_t tune) override
Definition: mmu.h:121
libsidplayfp::MMU::writeMemWord
void writeMemWord(uint_least16_t addr, uint_least16_t value) override
Definition: mmu.h:105
libsidplayfp::IOBank
Definition: IOBank.h:42
libsidplayfp::MMU::readMemWord
uint_least16_t readMemWord(uint_least16_t addr) override
Definition: mmu.h:102
libsidplayfp::MMU
Definition: mmu.h:50
libsidplayfp::MMU::cpuWrite
void cpuWrite(uint_least16_t addr, uint8_t data)
Definition: mmu.h:137
libsidplayfp::KernalRomBank::installResetHook
void installResetHook(uint_least16_t addr)
Definition: SystemROMBanks.h:137
libsidplayfp::Bank
Definition: Bank.h:36
libsidplayfp::Bank::peek
virtual uint8_t peek(uint_least16_t address)=0
libsidplayfp::romBank::set
void set(const uint8_t *source)
Definition: SystemROMBanks.h:67
libsidplayfp::ZeroRAMBank
Definition: ZeroRAMBank.h:145
libsidplayfp::sidmemory
Definition: sidmemory.h:34
libsidplayfp::EventScheduler
Definition: EventScheduler.h:62
libsidplayfp::MMU::installBasicTrap
void installBasicTrap(uint_least16_t addr) override
Definition: mmu.h:119
libsidplayfp::EventScheduler::getTime
event_clock_t getTime(event_phase_t phase) const
Definition: EventScheduler.h:162
libsidplayfp::SystemRAMBank
Definition: SystemRAMBank.h:41
libsidplayfp::SystemRAMBank::peek
uint8_t peek(uint_least16_t address) override
Definition: SystemRAMBank.h:61
libsidplayfp::MMU::fillRam
void fillRam(uint_least16_t start, uint8_t value, unsigned int size) override
Definition: mmu.h:107
libsidplayfp::BasicRomBank::installTrap
void installTrap(uint_least16_t addr)
Definition: SystemROMBanks.h:179
libsidplayfp::BasicRomBank
Definition: SystemROMBanks.h:150
libsidplayfp::PLA
Definition: ZeroRAMBank.h:42
libsidplayfp::KernalRomBank
Definition: SystemROMBanks.h:86
libsidplayfp::MMU::installResetHook
void installResetHook(uint_least16_t addr) override
Definition: mmu.h:117
libsidplayfp::MMU::readMemByte
uint8_t readMemByte(uint_least16_t addr) override
Definition: mmu.h:101
libsidplayfp::CharacterRomBank
Definition: SystemROMBanks.h:207
libsidplayfp::MMU::fillRam
void fillRam(uint_least16_t start, const uint8_t *source, unsigned int size) override
Definition: mmu.h:111
libsidplayfp::SystemRAMBank::poke
void poke(uint_least16_t address, uint8_t value) override
Definition: SystemRAMBank.h:66
libsidplayfp::Bank::poke
virtual void poke(uint_least16_t address, uint8_t value)=0
libsidplayfp::MMU::writeMemByte
void writeMemByte(uint_least16_t addr, uint8_t value) override
Definition: mmu.h:104