VirtualC64 v5.0 beta
Commodore 64 Emulator
Loading...
Searching...
No Matches
DriveTypes.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#include "ParCableTypes.h"
18
19namespace vc64 {
20
21//
22// Type aliases
23//
24
25typedef isize Cylinder;
26typedef isize Head;
27typedef isize Track;
28typedef isize Halftrack;
29typedef isize Sector;
30typedef isize Block;
31typedef isize HeadPos;
32
33
34//
35// Constants
36//
37
38#define DRIVE8 0L // TODO: DON'T USE PREPROCESSOR DIRECTIVE
39#define DRIVE9 1L // TODO: DON'T USE PREPROCESSOR DIRECTIVE
40
41
42//
43// Enumerations
44//
45
47enum_long(DRIVE_TYPE)
48{
49 DRIVE_VC1541,
50 DRIVE_VC1541C,
51 DRIVE_VC1541II,
52};
53typedef DRIVE_TYPE DriveType;
54
55struct DriveTypeEnum : util::Reflection<DriveTypeEnum, DriveType> {
56
57 static constexpr long minVal = 0;
58 static constexpr long maxVal = DRIVE_VC1541II;
59 static bool isValid(auto value) { return value >= minVal && value <= maxVal; }
60
61 static const char *prefix() { return "DRIVE"; }
62 static const char *key(long value)
63 {
64 switch (value) {
65
66 case DRIVE_VC1541: return "VC1541";
67 case DRIVE_VC1541C: return "VC1541C";
68 case DRIVE_VC1541II: return "VC1541II";
69 }
70 return "???";
71 }
72};
73
74enum_long(DRVRAM)
75{
76 DRVRAM_NONE,
77 DRVRAM_8000_9FFF,
78 DRVRAM_6000_7FFF
79};
80typedef DRVRAM DriveRam;
81
82struct DriveRamEnum : util::Reflection<DriveRamEnum, DriveRam> {
83
84 static constexpr long minVal = 0;
85 static constexpr long maxVal = DRVRAM_6000_7FFF;
86 static bool isValid(auto value) { return value >= minVal && value <= maxVal; }
87
88 static const char *prefix() { return "DRVRAM"; }
89 static const char *key(long value)
90 {
91 switch (value) {
92
93 case DRVRAM_NONE: return "DRVRAM_NONE";
94 case DRVRAM_8000_9FFF: return "DRVRAM_8000_9FFF";
95 case DRVRAM_6000_7FFF: return "DRVRAM_6000_7FFF";
96 }
97 return "???";
98 }
99};
100
101enum_long(DRVMEM_TYPE)
102{
103 DRVMEM_NONE, // Unmapped
104 DRVMEM_RAM,
105 DRVMEM_EXP, // Expansion RAM
106 DRVMEM_ROM,
107 DRVMEM_VIA1,
108 DRVMEM_VIA2,
109 DRVMEM_PIA // Peripheral Interface Adapter (Dolphin3)
110};
111typedef DRVMEM_TYPE DrvMemType;
112
113struct DrvMemTypeEnum : util::Reflection<DrvMemTypeEnum, DrvMemType> {
114
115 static constexpr long minVal = 0;
116 static constexpr long maxVal = DRVMEM_PIA;
117 static bool isValid(auto value) { return value >= minVal && value <= maxVal; }
118
119 static const char *prefix() { return "DRVMEM"; }
120 static const char *key(long value)
121 {
122 switch (value) {
123
124 case DRVMEM_NONE: return "DRVMEM_NONE";
125 case DRVMEM_RAM: return "DRVMEM_RAM";
126 case DRVMEM_EXP: return "DRVMEM_EXP";
127 case DRVMEM_ROM: return "DRVMEM_ROM";
128 case DRVMEM_VIA1: return "DRVMEM_VIA1";
129 case DRVMEM_VIA2: return "DRVMEM_VIA2";
130 case DRVMEM_PIA: return "DRVMEM_PIA";
131 }
132 return "???";
133 }
134};
135
136enum_long(DISK_INSERTION_STATUS)
137{
138 DISK_FULLY_EJECTED,
139 DISK_PARTIALLY_INSERTED,
140 DISK_FULLY_INSERTED,
141 DISK_PARTIALLY_EJECTED
142};
143typedef DISK_INSERTION_STATUS InsertionStatus;
144
145struct InsertionStatusEnum : util::Reflection<InsertionStatusEnum, InsertionStatus> {
146
147 static constexpr long minVal = 0;
148 static constexpr long maxVal = DISK_PARTIALLY_EJECTED;
149 static bool isValid(auto value) { return value >= minVal && value <= maxVal; }
150
151 static const char *prefix() { return "DISK"; }
152 static const char *key(long value)
153 {
154 switch (value) {
155
156 case DISK_FULLY_EJECTED: return "FULLY_EJECTED";
157 case DISK_PARTIALLY_INSERTED: return "PARTIALLY_INSERTED";
158 case DISK_FULLY_INSERTED: return "FULLY_INSERTED";
159 case DISK_PARTIALLY_EJECTED: return "PARTIALLY_EJECTED";
160 }
161 return "???";
162 }
163};
164
165
166//
167// Structures
168//
169
170typedef struct
171{
172 // General
173 bool autoConfig;
174
175 // Hardware
176 DriveType type;
177 DriveRam ram;
178 ParCableType parCable;
179 bool powerSave;
180
181 // State
182 bool connected;
183 bool switchedOn;
184
185 // Disk handling delays
186 isize ejectDelay;
187 isize swapDelay;
188 isize insertDelay;
189
190 // Drive sounds
191 i16 pan;
192 u8 powerVolume;
193 u8 stepVolume;
194 u8 insertVolume;
195 u8 ejectVolume;
196
197 // Save Roms
198 bool saveRoms;
199}
200DriveConfig;
201
202typedef struct
203{
204 isize id;
205
206 bool hasDisk;
207 bool hasUnprotectedDisk;
208 bool hasProtectedDisk;
209 bool hasUnmodifiedDisk;
210 bool hasModifiedDisk;
211
212 bool redLED;
213 bool greenLED;
214
215 bool spinning;
216 bool writing;
217
218 Halftrack halftrack;
219 HeadPos offset;
220}
221DriveInfo;
222
223}
VirtualC64 project namespace.
Definition CmdQueue.cpp:16
DRIVE_TYPE
Drive model.
Definition DriveTypes.h:48