VirtualC64 v5.0 beta
Commodore 64 Emulator
Loading...
Searching...
No Matches
Reu.h
1// -----------------------------------------------------------------------------
2// This file is part of VirtualC64
3//
4// Copyright (C) Dirk W. Hoffmann. www.dirkwhoffmann.de
5// This FILE is dual-licensed. You are free to choose between:
6//
7// - The GNU General Public License v3 (or any later version)
8// - The Mozilla Public License v2
9//
10// SPDX-License-Identifier: GPL-3.0-or-later OR MPL-2.0
11// -----------------------------------------------------------------------------
12
13#pragma once
14
15#include "Cartridge.h"
16
17namespace vc64 {
18
19class Reu final : public Cartridge {
20
21 CartridgeTraits traits = {
22
23 .type = CRT_REU,
24 .title = "REU",
25 .memory = 0, // Set in constructor
26 .battery = true
27 };
28
29 virtual const CartridgeTraits &getCartridgeTraits() const override { return traits; }
30
31private:
32
33 //
34 // REU registers
35 //
36
37 // Status register
38 u8 sr;
39
40 // Command register
41 u8 cr;
42
43 // Base address registers
44 u16 c64Base;
45 u32 reuBase;
46
47 // Upper bank bits (used by modded REUs with higher capacities)
48 u32 upperBankBits;
49
50 // Transfer length register
51 u16 tlen;
52
53 // Interrupt mask
54 u8 imr;
55
56 // Address control register
57 u8 acr;
58
59 // Latest value on the data bus
60 u8 bus;
61
62
63 //
64 // Emulation specific variables
65 //
66
67 // Remembers the memory type of the uppermost memory bank
68 MemoryType memTypeF;
69
70
71 //
72 // Initializing
73 //
74
75public:
76
77 Reu(C64 &ref) : Cartridge(ref) { };
78 Reu(C64 &ref, isize kb);
79
80
81 //
82 // Methods from CoreObject
83 //
84
85private:
86
87 void _dump(Category category, std::ostream& os) const override;
88
89
90 //
91 // Methods from CoreComponent
92 //
93
94public:
95
96 Reu& operator= (const Reu& other) {
97
98 Cartridge::operator=(other);
99
100 CLONE(sr)
101 CLONE(cr)
102 CLONE(c64Base)
103 CLONE(reuBase)
104 CLONE(upperBankBits)
105 CLONE(tlen)
106 CLONE(imr)
107 CLONE(acr)
108 CLONE(bus)
109 CLONE(memTypeF)
110
111 return *this;
112 }
113 virtual void clone(const Cartridge &other) override { *this = (const Reu &)other; }
114
115 template <class T>
116 void serialize(T& worker)
117 {
118 if (isResetter(worker)) return;
119
120 worker
121
122 << sr
123 << cr
124 << c64Base
125 << reuBase
126 << upperBankBits
127 << tlen
128 << imr
129 << acr
130 << bus
131 << memTypeF;
132
133 } CARTRIDGE_SERIALIZERS(serialize);
134
135 void _reset(bool hard) override;
136
137
138 //
139 // Querying properties
140 //
141
142 bool isREU1700() const { return getRamCapacity() == KB(128); }
143 bool isREU1764() const { return getRamCapacity() == KB(256); }
144 bool isREU1750() const { return getRamCapacity() >= KB(512); }
145
146 // Returns the bitmask of the REU address register
147 u32 wrapMask() const { return isREU1700() ? 0x1FFFF : 0x7FFFF; }
148
149
150 //
151 // Accessing REU registers
152 //
153
154 bool autoloadEnabled() const { return GET_BIT(cr, 5); }
155 bool ff00Enabled() const { return !GET_BIT(cr, 4); }
156 bool ff00Disabled() const { return GET_BIT(cr, 4); }
157
158 bool irqEnabled() const { return GET_BIT(imr, 7); }
159 bool irqOnEndOfBlock() const { return GET_BIT(imr, 6); }
160 bool irqOnVerifyError() const { return GET_BIT(imr, 5); }
161
162 bool isArmed() const { return GET_BIT(cr, 7) && ff00Enabled(); }
163
164 isize memStep() const { return GET_BIT(acr,7) ? 0 : 1; }
165 isize reuStep() const { return GET_BIT(acr,6) ? 0 : 1; }
166
167
168 //
169 // Accessing cartridge memory
170 //
171
172public:
173
174 u8 peekIO2(u16 addr) override;
175 u8 spypeekIO2(u16 addr) const override;
176 void pokeIO2(u16 addr, u8 value) override;
177 void poke(u16 addr, u8 value) override;
178
179private:
180
181 u8 readFromReuRam(u32 addr);
182 void writeToReuRam(u32 addr, u8 value);
183
184
185 //
186 // Performing DMA
187 //
188
189private:
190
191 void incMemAddr(u16 &addr) { addr = U16_ADD(addr, 1); }
192 void incReuAddr(u32 &addr) { addr = U32_ADD(addr, 1) & wrapMask(); }
193
194 void doDma();
195 void stash(u16 memAddr, u32 reuAddr, isize len);
196 void fetch(u16 memAddr, u32 reuAddr, isize len);
197 void swap(u16 memAddr, u32 reuAddr, isize len);
198 void verify(u16 memAddr, u32 reuAddr, isize len);
199
200
201 //
202 // Managing interrupts
203 //
204
205 void triggerEndOfBlockIrq();
206 void triggerVerifyErrorIrq();
207
208
209 //
210 // Handling delegation calls
211 //
212
213public:
214
215 void updatePeekPokeLookupTables() override;
216
217};
218
219}
VirtualC64 project namespace.
Definition CmdQueue.cpp:16