VirtualC64 v5.0 beta
Commodore 64 Emulator
Loading...
Searching...
No Matches
C64Types.h
Go to the documentation of this file.
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// -----------------------------------------------------------------------------
13
14#pragma once
15
16#include "Reflection.h"
17
18namespace vc64 {
19
20//
21// Type aliases
22//
23
24typedef i64 Cycle;
25
26
27//
28// Enumerations
29//
30
41typedef C64_MODEL C64Model;
42
43struct C64ModelEnum : util::Reflection<C64ModelEnum, C64Model> {
44
45 static constexpr long minVal = 0;
46 static constexpr long maxVal = C64_MODEL_NTSC_OLD;
47 static bool isValid(auto value) { return value >= minVal && value <= maxVal; }
48
49 static const char *prefix() { return "C64_MODEL"; }
50 static const char *key(long value)
51 {
52 switch (value) {
53
54 case C64_MODEL_PAL: return "PAL";
55 case C64_MODEL_PAL_II: return "PAL_II";
56 case C64_MODEL_PAL_OLD: return "PAL_OLD";
57 case C64_MODEL_NTSC: return "NTSC";
58 case C64_MODEL_NTSC_II: return "NTSC_II";
59 case C64_MODEL_NTSC_OLD: return "NTSC_OLD";
60 }
61 return "???";
62 }
63};
64
65enum_long(WARP_MODE)
66{
67 WARP_AUTO,
68 WARP_NEVER,
69 WARP_ALWAYS
70};
71typedef WARP_MODE WarpMode;
72
73struct WarpModeEnum : util::Reflection<WarpModeEnum, WarpMode>
74{
75 static constexpr long minVal = 0;
76 static constexpr long maxVal = WARP_ALWAYS;
77 static bool isValid(auto val) { return val >= minVal && val <= maxVal; }
78
79 static const char *prefix() { return "WARP"; }
80 static const char *key(long value)
81 {
82 switch (value) {
83
84 case WARP_AUTO: return "WARP_AUTO";
85 case WARP_NEVER: return "WARP_NEVER";
86 case WARP_ALWAYS: return "WARP_ALWAYS";
87 }
88 return "???";
89 }
90};
91
92enum_long(SLOT)
93{
94 // Primary slots
95 SLOT_CIA1, // CIA 1 execution
96 SLOT_CIA2, // CIA 2 execution
97 SLOT_SEC, // Enables secondary slots
98
99 // Secondary slots
100 SLOT_SER, // Serial port (IEC bus)
101 SLOT_DAT, // Datasette execution
102 SLOT_TER, // Enables tertiary slots
103
104 // Tertiary slots
105 SLOT_AFI1, // Auto-fire (joystick port 1)
106 SLOT_AFI2, // Auto-fire (joystick port 2)
107 SLOT_MOT, // Datasette motor
108 SLOT_DC8, // Disk change (Drive 8)
109 SLOT_DC9, // Disk change (Drive 9)
110 SLOT_SNP, // Snapshots
111 SLOT_RSH, // Retro Shell
112 SLOT_KEY, // Auto-typing
113 SLOT_ALA, // Alarms (set by the GUI)
114 SLOT_INS, // Handles periodic calls to inspect()
115
116 SLOT_COUNT
117};
118typedef SLOT EventSlot;
119
120struct EventSlotEnum : util::Reflection<EventSlotEnum, EventSlot>
121{
122 static constexpr long minVal = 0;
123 static constexpr long maxVal = SLOT_COUNT - 1;
124 static bool isValid(auto val) { return val >= minVal && val <= maxVal; }
125
126 static const char *prefix() { return "SLOT"; }
127 static const char *key(long value)
128 {
129 switch (value) {
130
131 case SLOT_CIA1: return "CIA1";
132 case SLOT_CIA2: return "CIA2";
133 case SLOT_SEC: return "SEC";
134
135 case SLOT_SER: return "SER";
136 case SLOT_DAT: return "DAT";
137 case SLOT_TER: return "TER";
138
139 case SLOT_DC8: return "DC8";
140 case SLOT_DC9: return "DC9";
141 case SLOT_SNP: return "SNP";
142 case SLOT_RSH: return "RSH";
143 case SLOT_KEY: return "KEY";
144 case SLOT_ALA: return "ALA";
145 case SLOT_INS: return "INS";
146
147 case SLOT_COUNT: return "???";
148 }
149 return "???";
150 }
151};
152
153enum_i8(EventID)
154{
155 EVENT_NONE = 0,
156
157 //
158 // Events in the primary event table
159 //
160
161 // CIA slots
162 CIA_EXECUTE = 1,
163 CIA_WAKEUP,
164 CIA_EVENT_COUNT,
165
166 // SEC slot
167 SEC_TRIGGER = 1,
168 SEC_EVENT_COUNT,
169
170 //
171 // Events in secondary event table
172 //
173
174 // SER slot
175 SER_UPDATE = 1,
176 SER_EVENT_COUNT,
177
178 // DAT slot
179 DAT_EXECUTE = 1,
180 DAT_EVENT_COUNT,
181
182 // SEC slot
183 TER_TRIGGER = 1,
184 TER_EVENT_COUNT,
185
186 //
187 // Events in tertiary event table
188 //
189
190 // Auto-fire
191 AFI_FIRE = 1,
192 AFI_EVENT_COUNT,
193
194 // Datasette motor
195 MOT_START = 1,
196 MOT_STOP,
197 MOT_EVENT_COUNT,
198
199 // Disk change
200 DCH_INSERT = 1,
201 DCH_EJECT,
202 DCH_EVENT_COUNT,
203
204 // Snapshots
205 SNP_TAKE = 1,
206 SNP_EVENT_COUNT,
207
208 // Retro shell
209 RSH_WAKEUP = 1,
210 RSH_EVENT_COUNT,
211
212 // Auto typing
213 KEY_AUTO_TYPE = 1,
214 KEY_EVENT_COUNT,
215
216 // Alarm event slot
217 ALA_TRIGGER = 1,
218 ALA_EVENT_COUNT,
219
220 // Inspector slot
221 INS_C64 = 1,
222 INS_CPU,
223 INS_MEM,
224 INS_CIA,
225 INS_VICII,
226 INS_SID,
227 INS_EVENTS,
228 INS_EVENT_COUNT
229};
230
231enum_long(INSPECTION_TARGET)
232{
233 INSPECTION_NONE,
234 INSPECTION_C64,
235 INSPECTION_CPU,
236 INSPECTION_CIA,
237 INSPECTION_MEM,
238 INSPECTION_VICII,
239 INSPECTION_SID,
240 INSPECTION_EVENTS
241
242};
243typedef INSPECTION_TARGET InspectionTarget;
244
245struct InspectionTargetEnum : util::Reflection<InspectionTargetEnum, InspectionTarget> {
246
247 static constexpr long minVal = 0;
248 static constexpr long maxVal = INSPECTION_EVENTS;
249 static bool isValid(auto value) { return value >= minVal && value <= maxVal; }
250
251 static const char *prefix() { return "INSPECTION"; }
252 static const char *key(long value)
253 {
254 switch (value) {
255
256 case INSPECTION_NONE: return "NONE";
257 case INSPECTION_C64: return "C64";
258 case INSPECTION_CPU: return "CPU";
259 case INSPECTION_CIA: return "CIA";
260 case INSPECTION_MEM: return "MEM";
261 case INSPECTION_VICII: return "VICII";
262 case INSPECTION_SID: return "SID";
263 case INSPECTION_EVENTS: return "EVENTS";
264 }
265 return "???";
266 }
267};
268
269//
270// Structures
271//
272
273typedef struct
274{
276 isize warpBoot;
277
279 WarpMode warpMode;
280
282 bool vsync;
283
285 isize speedAdjust;
286
288 bool snapshots;
289
291 isize snapshotDelay;
292
294 isize runAhead;
295}
296C64Config;
297
298typedef struct
299{
300 u32 crc32;
301 u64 fnv64;
302
303 const char *title;
304 const char *subtitle;
305 const char *revision;
306
307 bool isCommodoreRom;
308 bool isPatchedRom;
309 bool isMega65Rom;
310}
311RomInfo;
312
313typedef struct
314{
315 Cycle cpuProgress;
316 Cycle cia1Progress;
317 Cycle cia2Progress;
318 i64 frame;
319 long vpos;
320 long hpos;
321}
322C64Info;
323
324typedef struct
325{
326 EventSlot slot;
327 EventID eventId;
328 const char *eventName;
329
330 // Trigger cycle of the event
331 Cycle trigger;
332 Cycle triggerRel;
333
334 // Trigger frame relative to the current frame
335 long frameRel;
336
337 // The trigger cycle translated to a beam position.
338 long vpos;
339 long hpos;
340}
341EventSlotInfo;
342
343typedef u32 RunLoopFlags;
344
345namespace RL {
346
347constexpr u32 STOP = (1 << 0);
348constexpr u32 WARP_ON = (1 << 1);
349constexpr u32 WARP_OFF = (1 << 2);
350constexpr u32 BREAKPOINT = (1 << 3);
351constexpr u32 WATCHPOINT = (1 << 4);
352constexpr u32 CPU_JAM = (1 << 5);
353constexpr u32 SINGLE_STEP = (1 << 6);
354}
355
356}
VirtualC64 project namespace.
Definition CmdQueue.cpp:16
C64_MODEL
C64 model.
Definition C64Types.h:33
@ C64_MODEL_PAL
C64 (PAL)
Definition C64Types.h:34
@ C64_MODEL_NTSC_OLD
Early C64 (NTSC)
Definition C64Types.h:39
@ C64_MODEL_PAL_OLD
Early C64 (PAL)
Definition C64Types.h:36
@ C64_MODEL_NTSC
C64 (NTSC)
Definition C64Types.h:37
@ C64_MODEL_PAL_II
C64 II (PAL)
Definition C64Types.h:35
@ C64_MODEL_NTSC_II
C64 II (NTSC)
Definition C64Types.h:38