mos_hardware/mega65/
iomap.rs

1// copyright 2022 mikael lund aka wombat
2//
3// licensed under the apache license, version 2.0 (the "license");
4// you may not use this file except in compliance with the license.
5// you may obtain a copy of the license at
6//
7//     http://www.apache.org/licenses/license-2.0
8//
9// unless required by applicable law or agreed to in writing, software
10// distributed under the license is distributed on an "as is" basis,
11// without warranties or conditions of any kind, either express or implied.
12// see the license for the specific language governing permissions and
13// limitations under the license.
14
15//! Automatically generated constants from `iomap.txt`
16//!
17//! The `iomap.txt` file is found in the
18//! [`mega65-core`](https://github.com/MEGA65/mega65-core/blob/development/iomap.txt) repository.
19//! The core is still under development so expect the contained values and
20//! names to change over time.
21
22pub mod audio {
23
24    /// Audio Mixer register select [0xD6F4: MIXREGSEL]
25    pub const AUDIO_MIXER_REGISTER_SELECT: *mut u8 = (0xD6F4) as *mut u8;
26
27    /// Audio Mixer register read port [0xD6F5: MIXREGDATA]
28    pub const AUDIO_MIXER_REGISTER_READ_PORT: *mut u8 = (0xD6F5) as *mut u8;
29
30    /// Digital audio, left channel, LSB [0xD6F8: DIGILEFTLSB]
31    pub const DIGITAL_AUDIO: *mut u8 = (0xD6F8) as *mut u8;
32
33    /// 16-bit digital audio out (left LSB) [0xD6F8: DIGILLSB]
34    pub const OUT_DIGITAL_AUDIO_16_BIT: *mut u8 = (0xD6F8) as *mut u8;
35
36    /// audio read-back LSB (source selected by $D6F4) [0xD6FC: READBACKLSB]
37    pub const AUDIO_READ_BACK_LSB: *mut u8 = (0xD6FC) as *mut u8;
38
39    /// audio read-back MSB (source selected by $D6F4) [0xD6FD: READBACKMSB]
40    pub const AUDIO_READ_BACK_MSB: *mut u8 = (0xD6FD) as *mut u8;
41
42    /// PWM/PDM audio encoding select [0xD711: PWMPDM]
43    pub const PWM_SLASH_PDM_AUDIO_ENCODING_SELECT_MASK: u8 = 0b00001000;
44}
45
46pub mod audiomix {
47
48    /// Enable DC offset subtraction in audio mixer [0xD63C: DCTRKEN]
49    pub const ENABLE_DC_OFFSET_SUBTRACTION_IN_AUDIO_MIXER_MASK: u8 = 0b00010000;
50
51    /// Audio mixer DC-estimation time step. Lower values = faster updating of DC estimation, at the cost of making low-frequencies quieter. [0xD63D: DCTIME]
52    pub const AUDIO_MIXER_DC_ESTIMATION_TIME_STEP: *mut u8 = (0xD63D) as *mut u8;
53
54    /// Audio Mixer register write port [0xD6F5: REGWDATA]
55    pub const AUDIO_MIXER_REGISTER_WRITE_PORT: *mut u8 = (0xD6F5) as *mut u8;
56}
57
58pub mod auxfpga {
59
60    /// LSB of Auxilliary (MAX10) FPGA design date stamp (days since 1 Jan 2020) [0xD636: FWDATEL]
61    pub const LSB_OF_AUXILLIARY: *mut u8 = (0xD636) as *mut u8;
62
63    /// MSB of Auxilliary (MAX10) FPGA design date stamp (days since 1 Jan 2020) [0xD637: MFWDATEH]
64    pub const MSB_OF_AUXILLIARY: *mut u8 = (0xD637) as *mut u8;
65
66    /// 2nd byte of Auxilliary (MAX10) FPGA design git commit [0xD639: FWGIT0]
67    pub const AUXILLIARY_BYTE_OF_2ND: *mut u8 = (0xD639) as *mut u8;
68
69    /// 3rd byte of Auxilliary (MAX10) FPGA design git commit [0xD63A: FWGIT0]
70    pub const AUXILLIARY_BYTE_OF_3RD: *mut u8 = (0xD63A) as *mut u8;
71}
72
73pub mod cia1 {
74
75    /// Port A [0xDC00: PORTA]
76    pub const PORT_A: *mut u8 = (0xDC00) as *mut u8;
77
78    /// Port B [0xDC01: PORTB]
79    pub const PORT_B: *mut u8 = (0xDC01) as *mut u8;
80
81    /// Port A DDR [0xDC02: DDRA]
82    pub const PORT_A_DDR: *mut u8 = (0xDC02) as *mut u8;
83
84    /// Port B DDR [0xDC03: DDRB]
85    pub const PORT_B_DDR: *mut u8 = (0xDC03) as *mut u8;
86
87    /// Timer A counter (16 bit) [0xDC04: TIMERA]
88    pub const TIMER_A_COUNTER: *mut u8 = (0xDC04) as *mut u8;
89
90    /// Timer B counter (16 bit) [0xDC06: TIMERB]
91    pub const TIMER_B_COUNTER: *mut u8 = (0xDC06) as *mut u8;
92
93    /// TOD tenths of seconds [0xDC08: TODJIF]
94    pub const TOD_TENTHS_OF_SECONDS_MASK: u8 = 0b00001111;
95
96    /// TOD seconds [0xDC09: TODSEC]
97    pub const TOD_SECONDS_MASK: u8 = 0b00111111;
98
99    /// TOD minutes [0xDC0A: TODMIN]
100    pub const TOD_MINUTES_MASK: u8 = 0b00111111;
101
102    /// TOD hours [0xDC0B: TODHOUR]
103    pub const TOD_HOURS_MASK: u8 = 0b00011111;
104
105    /// TOD PM flag [0xDC0B: TOD]
106    pub const TOD_PM_FLAG_MASK: u8 = 0b10000000;
107
108    /// shift register data register(writing starts sending) [0xDC0C: SDR]
109    pub const SHIFT_REGISTER_DATA_REGISTER: *mut u8 = (0xDC0C) as *mut u8;
110
111    /// Timer A underflow [0xDC0D: TA]
112    pub const TIMER_A_UNDERFLOW_MASK: u8 = 0b00000001;
113
114    /// Timer B underflow [0xDC0D: TB]
115    pub const TIMER_B_UNDERFLOW_MASK: u8 = 0b00000010;
116
117    /// TOD alarm [0xDC0D: ALRM]
118    pub const TOD_ALARM_MASK: u8 = 0b00000100;
119
120    /// shift register full/empty [0xDC0D: SP]
121    pub const SHIFT_REGISTER_FULL_SLASH_EMPTY_MASK: u8 = 0b00001000;
122
123    /// FLAG edge detected [0xDC0D: FLG]
124    pub const FLAG_EDGE_DETECTED_MASK: u8 = 0b00010000;
125
126    /// Placeholder - Reading clears events [0xDC0D: ISRCLR]
127    pub const PLACEHOLDER___READING_CLEARS_EVENTS_MASK: u8 = 0b00000011;
128
129    /// Interrupt flag [0xDC0D: IR]
130    pub const INTERRUPT_FLAG_MASK: u8 = 0b10000000;
131
132    /// Timer A start [0xDC0E: STRTA]
133    pub const TIMER_A_START_MASK: u8 = 0b00000001;
134
135    /// Timer A PB6 out [0xDC0E: PBONA]
136    pub const TIMER_A_PB6_OUT_MASK: u8 = 0b00000010;
137
138    /// Timer A toggle or pulse [0xDC0E: OMODA]
139    pub const TIMER_A_TOGGLE_OR_PULSE_MASK: u8 = 0b00000100;
140
141    /// Timer A one-shot mode [0xDC0E: RMODA]
142    pub const TIMER_A_ONE_SHOT_MODE_MASK: u8 = 0b00001000;
143
144    /// Timer A Timer A tick source [0xDC0E: IMODA]
145    pub const TIMER_A_TIMER_A_TICK_SOURCE_MASK: u8 = 0b00100000;
146
147    /// Serial port direction [0xDC0E: SPMOD]
148    pub const SERIAL_PORT_DIRECTION_MASK: u8 = 0b01000000;
149
150    /// 50/60Hz select for TOD clock [0xDC0E: TOD50]
151    pub const CLOCK_SELECT_FOR_TOD_50_SLASH_60HZ_MASK: u8 = 0b10000000;
152
153    /// Timer B start [0xDC0F: STRTB]
154    pub const TIMER_B_START_MASK: u8 = 0b00000001;
155
156    /// Timer B PB7 out [0xDC0F: PBONB]
157    pub const TIMER_B_PB7_OUT_MASK: u8 = 0b00000010;
158
159    /// Timer B toggle or pulse [0xDC0F: OMODB]
160    pub const TIMER_B_TOGGLE_OR_PULSE_MASK: u8 = 0b00000100;
161
162    /// Timer B one-shot mode [0xDC0F: RMODB]
163    pub const TIMER_B_ONE_SHOT_MODE_MASK: u8 = 0b00001000;
164
165    /// Strobe input to force-load timers [0xDC0F: LOAD]
166    pub const STROBE_INPUT_TO_FORCE_LOAD_TIMERS_MASK: u8 = 0b00010000;
167
168    /// Timer B Timer A tick source [0xDC0F: IMODB]
169    pub const TIMER_B_TIMER_A_TICK_SOURCE_MASK: u8 = 0b00000011;
170
171    /// TOD alarm edit [0xDC0F: TODEDIT]
172    pub const TOD_ALARM_EDIT_MASK: u8 = 0b10000000;
173
174    /// Timer A latch value (16 bit) [0xDC10: TALATCH]
175    pub const TIMER_A_LATCH_VALUE: *mut u8 = (0xDC10) as *mut u8;
176
177    /// Timer B latch value (16 bit) [0xDC12: TALATCH]
178    pub const TIMER_B_LATCH_VALUE: *mut u8 = (0xDC12) as *mut u8;
179
180    /// Timer A current value (16 bit) [0xDC14: TALATCH]
181    pub const TIMER_A_CURRENT_VALUE: *mut u8 = (0xDC14) as *mut u8;
182
183    /// Timer B current value (16 bit) [0xDC16: TALATCH]
184    pub const TIMER_B_CURRENT_VALUE: *mut u8 = (0xDC16) as *mut u8;
185
186    /// TOD 10ths of seconds value [0xDC18: TOD]
187    pub const TOD_10THS_OF_SECONDS_VALUE_MASK: u8 = 0b00001111;
188
189    /// Interrupt mask for Timer B [0xDC18: IMTB]
190    pub const INTERRUPT_MASK_FOR_TIMER_B_MASK: u8 = 0b00010000;
191
192    /// Interrupt mask for TOD alarm [0xDC18: IM]
193    pub const INTERRUPT_MASK_FOR_TOD_ALARM_MASK: u8 = 0b00100000;
194
195    /// Interrupt mask for shift register (serial port) [0xDC18: IMSP]
196    pub const INTERRUPT_MASK_FOR_SHIFT_REGISTER_MASK: u8 = 0b01000000;
197
198    /// Interrupt mask for FLAG line [0xDC18: IMFLG]
199    pub const INTERRUPT_MASK_FOR_FLAG_LINE_MASK: u8 = 0b10000000;
200
201    /// TOD Alarm seconds value [0xDC19: TODSEC]
202    pub const TOD_ALARM_SECONDS_VALUE: *mut u8 = (0xDC19) as *mut u8;
203
204    /// TOD Alarm minutes value [0xDC1A: TODMIN]
205    pub const TOD_ALARM_MINUTES_VALUE: *mut u8 = (0xDC1A) as *mut u8;
206
207    /// TOD hours value [0xDC1B: TOD]
208    pub const TOD_HOURS_VALUE_MASK: u8 = 0b01111111;
209
210    /// TOD AM/PM flag [0xDC1B: TOD]
211    pub const TOD_AM_SLASH_PM_FLAG_MASK: u8 = 0b10000000;
212
213    /// TOD Alarm 10ths of seconds value (actually all 8 bits) [0xDC1C: ALRMJIF]
214    pub const TOD_ALARM_10THS_OF_SECONDS_VALUE_MASK: u8 = 0b01111111;
215
216    /// Enable delaying writes to $DD00 by 3 cycles to match real 6502 timing [0xDC1C: DD00]
217    pub const ENABLE_DELAYING_WRITES_TO_0XDD00_BY_3_CYCLES_TO_MATCH_REAL_6502_TIMING_MASK: u8 =
218        0b10000000;
219
220    /// TOD Alarm hours value [0xDC1F: ALRM]
221    pub const TOD_ALARM_HOURS_VALUE_MASK: u8 = 0b01111111;
222
223    /// TOD Alarm AM/PM flag [0xDC1F: ALRM]
224    pub const TOD_ALARM_AM_SLASH_PM_FLAG_MASK: u8 = 0b10000000;
225}
226
227pub mod cpu {
228
229    /// 6510/45GS10 CPU port DDR [0x0000000: PORTDDR]
230    pub const DDR_CPU_PORT_6510_SLASH_45GS10: *mut u8 = (0x0000000) as *mut u8;
231
232    /// 6510/45GS10 CPU port data [0x0000001: PORT]
233    pub const DATA_CPU_PORT_6510_SLASH_45GS10: *mut u8 = (0x0000001) as *mut u8;
234
235    /// Writing triggers hypervisor trap \$XX [0xD640: HTRAP00]
236    pub const WRITING_TRIGGERS_HYPERVISOR_TRAP_0XXX: *mut u8 = (0xD640) as *mut u8;
237
238    /// @HTRAPXX [0xD641: HTRAP01]
239    pub const HTRAPXX: *mut u8 = (0xD641) as *mut u8;
240
241    /// 1=charge extra cycle(s) for branches taken [0xD710: BRCOST]
242    pub const CHARGE_EXTRA_CYCLE_MASK: u8 = 0b00001000;
243
244    /// Cost of badlines minus 40. ie. 00=40 cycles, 11 = 43 cycles. [0xD710: BADEXTRA]
245    pub const COST_OF_BADLINES_MINUS_40_MASK: u8 = 0b00000011;
246
247    /// IEC bus is active [0xD7F1: IECBUSACT]
248    pub const IEC_BUS_IS_ACTIVE_MASK: u8 = 0b00000001;
249
250    /// Count the number of PHI cycles per video frame (LSB) [0xD7F2: PHIPERFRAME]
251    pub const COUNT_THE_NUMBER_OF_PHI_CYCLES_PER_VIDEO_FRAME: *mut u8 = (0xD7F2) as *mut u8;
252
253    /// Count the number of usable (proceed=1) CPU cycles per video frame (LSB) [0xD7F6: CYCPERFRAME]
254    pub const COUNT_THE_NUMBER_OF_USABLE: *mut u8 = (0xD7F6) as *mut u8;
255
256    /// Count number of elapsed video frames [0xD7FA: FRAMECOUNT]
257    pub const COUNT_NUMBER_OF_ELAPSED_VIDEO_FRAMES: *mut u8 = (0xD7FA) as *mut u8;
258
259    /// 1= enable cartridges [0xD7FB: CARTEN]
260    pub const ENABLE_CARTRIDGES_MASK: u8 = 0b00000010;
261
262    /// Set to zero to power off computer on supported systems. WRITE ONLY. [0xD7FD: POWEREN]
263    pub const SET_TO_ZERO_TO_POWER_OFF_COMPUTER_ON_SUPPORTED_SYSTEMS_MASK: u8 = 0b00000001;
264
265    /// Override for /GAME : Must be 0 to enable /GAME signal [0xD7FD: NOGAME]
266    pub const OVERRIDE_FOR__SLASH_GAME_MASK: u8 = 0b01000000;
267
268    /// Override for /EXROM : Must be 0 to enable /EXROM signal [0xD7FD: NOEXROM]
269    pub const OVERRIDE_FOR__SLASH_EXROM_MASK: u8 = 0b10000000;
270
271    /// Enable expansion RAM pre-fetch logic [0xD7FE: PREFETCH]
272    pub const ENABLE_EXPANSION_RAM_PRE_FETCH_LOGIC_MASK: u8 = 0b00000001;
273
274    /// Enable Ocean Type A cartridge emulation [0xD7FE: OCEANA]
275    pub const ENABLE_OCEAN_TYPE_A_CARTRIDGE_EMULATION_MASK: u8 = 0b00000010;
276}
277
278pub mod debug {
279
280    /// Sprite/bitplane first X DEBUG WILL BE REMOVED [0xD067: SBPDEBUG]
281    pub const SPRITE_SLASH_BITPLANE_FIRST_X_DEBUG_WILL_BE_REMOVED: *mut u8 = (0xD067) as *mut u8;
282
283    /// VIC-IV debug value read-back (read only) [0xD07D: DEBUGOUT]
284    pub const VIC_IV_DEBUG_VALUE_READ_BACK: *mut u8 = (0xD07D) as *mut u8;
285
286    /// VIC-IV debug X position (LSB) (write only) [0xD07D: DEBUGX]
287    pub const VIC_IV_DEBUG_X_POSITION: *mut u8 = (0xD07D) as *mut u8;
288
289    /// VIC-IV debug Y position (LSB) [0xD07E: DEBUGY]
290    pub const VIC_IV_DEBUG_Y_POSITION: *mut u8 = (0xD07E) as *mut u8;
291
292    /// VIC-IV debug out-of-frame signal enable [0xD07F: DEBUGOOF]
293    pub const VIC_IV_DEBUG_OUT_OF_FRAME_SIGNAL_ENABLE_MASK: u8 = 0b10000000;
294
295    /// Count of cartridge port memory accesses (read only) [0xD613: CRTACSCNT]
296    pub const COUNT_OF_CARTRIDGE_PORT_MEMORY_ACCESSES: *mut u8 = (0xD613) as *mut u8;
297
298    /// 8-bit segment of combined keyboard matrix (READ) [0xD614: KEYMATRIXPEEK]
299    pub const MATRIX_SEGMENT_OF_COMBINED_KEYBOARD_8_BIT: *mut u8 = (0xD614) as *mut u8;
300
301    /// READ 1351/amiga mouse auto detection DEBUG [0xD61B: AMIMOUSDETECT]
302    pub const READ_1351_SLASH_AMIGA_MOUSE_AUTO_DETECTION_DEBUG: *mut u8 = (0xD61B) as *mut u8;
303
304    /// internal 1541 PC LSB [0xD61C: PCLSB_1541]
305    pub const INTERNAL_1541_PC_LSB: *mut u8 = (0xD61C) as *mut u8;
306
307    /// DUPLICATE Modifier key state (hardware accelerated keyboard scanner). [0xD61F: BUCKYCOPY]
308    pub const DUPLICATE_MODIFIER_KEY_STATE: *mut u8 = (0xD61F) as *mut u8;
309
310    /// READ ONLY flags for paddles. See c65uart.vhdl for more information. [0xD624: POTDEBUG]
311    pub const READ_ONLY_FLAGS_FOR_PADDLES: *mut u8 = (0xD624) as *mut u8;
312
313    /// Source of last CPU reset [0xD63C: RESETSRC]
314    pub const SOURCE_OF_LAST_CPU_RESET_MASK: u8 = 0b00000111;
315
316    /// Status of M65 R3 J21 pins [0xD69B: J21INL]
317    pub const STATUS_OF_M65_R3_J21_PINS: *mut u8 = (0xD69B) as *mut u8;
318
319    /// Status of M65 R3 DIP switches [0xD69D: DIPSW]
320    pub const STATUS_OF_M65_R3_DIP_SWITCHES: *mut u8 = (0xD69D) as *mut u8;
321
322    /// Status of switches 0 to 7 [0xD69E: SWSTATUS]
323    pub const STATUS_OF_SWITCHES_0_TO_7: *mut u8 = (0xD69E) as *mut u8;
324
325    /// Status of switches 8 to 15 [0xD69F: SWSTATUS]
326    pub const STATUS_OF_SWITCHES_8_TO_15: *mut u8 = (0xD69F) as *mut u8;
327}
328
329pub mod dma {
330
331    /// DMAgic DMA list address LSB, and trigger DMA (when written) [0xD700: ADDRLSBTRIG]
332    pub const DMAGIC_DMA_LIST_ADDRESS_LSB: *mut u8 = (0xD700) as *mut u8;
333
334    /// DMA list address high byte (address bits 8 -- 15). [0xD701: ADDRMSB]
335    pub const DMA_LIST_ADDRESS_HIGH_BYTE: *mut u8 = (0xD701) as *mut u8;
336
337    /// DMA list address bank (address bits 16 -- 22). Writing clears \$D704. [0xD702: ADDRBANK]
338    pub const DMA_LIST_ADDRESS_BANK: *mut u8 = (0xD702) as *mut u8;
339
340    /// DMA enable F018B mode (adds sub-command byte) [0xD703: EN018B]
341    pub const DMA_ENABLE_F018B_MODE_MASK: u8 = 0b00000001;
342
343    /// DMA list address mega-byte [0xD704: ADDRMB]
344    pub const DMA_LIST_ADDRESS_MEGA_BYTE: *mut u8 = (0xD704) as *mut u8;
345
346    /// Set low-order byte of DMA list address, and trigger Enhanced DMA job, with list address specified as 28-bit flat address (uses DMA option list) [0xD705: ETRIG]
347    pub const SET_LOW_ORDER_BYTE_OF_DMA_LIST_ADDRESS: *mut u8 = (0xD705) as *mut u8;
348
349    /// DMA list address low byte (address bits 0 -- 7) WITHOUT STARTING A DMA JOB (used by Hypervisor for unfreezing DMA-using tasks) [0xD70E: ADDRLSB]
350    pub const DMA_LIST_ADDRESS_LOW_BYTE: *mut u8 = (0xD70E) as *mut u8;
351
352    /// Audio DMA block timeout (read only) DEBUG [0xD711: AUD]
353    pub const AUDIO_DMA_BLOCK_TIMEOUT_MASK: u8 = 0b00000111;
354
355    /// Audio DMA bypasses audio mixer [0xD711: NOMIX]
356    pub const AUDIO_DMA_BYPASSES_AUDIO_MIXER_MASK: u8 = 0b00010000;
357
358    /// Audio DMA block writes (samples still get read) [0xD711: AUD]
359    pub const AUDIO_DMA_BLOCK_WRITES_MASK: u8 = 0b00100000;
360
361    /// Audio DMA blocked (read only) DEBUG [0xD711: BLKD]
362    pub const AUDIO_DMA_BLOCKED_MASK: u8 = 0b01000000;
363
364    /// Enable Audio DMA [0xD711: AUDEN]
365    pub const ENABLE_AUDIO_DMA_MASK: u8 = 0b10000000;
366
367    /// Audio DMA channel 0 right channel volume [0xD71C: CH0RVOL]
368    pub const AUDIO_DMA_CHANNEL_0_RIGHT_CHANNEL_VOLUME: *mut u8 = (0xD71C) as *mut u8;
369
370    /// Audio DMA channel 1 right channel volume [0xD71D: CH1RVOL]
371    pub const AUDIO_DMA_CHANNEL_1_RIGHT_CHANNEL_VOLUME: *mut u8 = (0xD71D) as *mut u8;
372
373    /// Audio DMA channel 2 left channel volume [0xD71E: CH2LVOL]
374    pub const AUDIO_DMA_CHANNEL_2_LEFT_CHANNEL_VOLUME: *mut u8 = (0xD71E) as *mut u8;
375
376    /// Audio DMA channel 3 left channel volume [0xD71F: CH3LVOL]
377    pub const AUDIO_DMA_CHANNEL_3_LEFT_CHANNEL_VOLUME: *mut u8 = (0xD71F) as *mut u8;
378
379    /// Audio DMA channel X sample bits (11=16, 10=8, 01=upper nybl, 00=lower nybl) [0xD720: CH0]
380    pub const AUDIO_DMA_CHANNEL_X_SAMPLE_BITS_MASK: u8 = 0b00000011;
381
382    /// Audio DMA channel X stop flag [0xD720: CH0]
383    pub const AUDIO_DMA_CHANNEL_X_STOP_FLAG_MASK: u8 = 0b00001000;
384
385    /// Audio DMA channel X play 32-sample sine wave instead of DMA data [0xD720: CH0]
386    pub const AUDIO_DMA_CHANNEL_X_PLAY_32_SAMPLE_SINE_WAVE_INSTEAD_OF_DMA_DATA_MASK: u8 =
387        0b00010000;
388
389    /// Enable Audio DMA channel X signed samples [0xD720: CH0]
390    pub const ENABLE_AUDIO_DMA_CHANNEL_X_SIGNED_SAMPLES_MASK: u8 = 0b00100000;
391
392    /// Enable Audio DMA channel X looping [0xD720: CH0]
393    pub const ENABLE_AUDIO_DMA_CHANNEL_X_LOOPING_MASK: u8 = 0b01000000;
394
395    /// Enable Audio DMA channel X [0xD720: CH0]
396    pub const ENABLE_AUDIO_DMA_CHANNEL_X_MASK: u8 = 0b10000000;
397
398    /// Audio DMA channel X base address LSB [0xD721: CH0BADDRL]
399    pub const AUDIO_DMA_CHANNEL_X_BASE_ADDRESS_LSB: *mut u8 = (0xD721) as *mut u8;
400
401    /// Audio DMA channel X base address middle byte [0xD722: CH0BADDRC]
402    pub const AUDIO_DMA_CHANNEL_X_BASE_ADDRESS_MIDDLE_BYTE: *mut u8 = (0xD722) as *mut u8;
403
404    /// Audio DMA channel X base address MSB [0xD723: CH0BADDRM]
405    pub const AUDIO_DMA_CHANNEL_X_BASE_ADDRESS_MSB: *mut u8 = (0xD723) as *mut u8;
406
407    /// Audio DMA channel X frequency LSB [0xD724: CH0FREQL]
408    pub const AUDIO_DMA_CHANNEL_X_FREQUENCY_LSB: *mut u8 = (0xD724) as *mut u8;
409
410    /// Audio DMA channel X frequency middle byte [0xD725: CH0FREQC]
411    pub const AUDIO_DMA_CHANNEL_X_FREQUENCY_MIDDLE_BYTE: *mut u8 = (0xD725) as *mut u8;
412
413    /// Audio DMA channel X frequency MSB [0xD726: CH0FREQM]
414    pub const AUDIO_DMA_CHANNEL_X_FREQUENCY_MSB: *mut u8 = (0xD726) as *mut u8;
415
416    /// Audio DMA channel X top address LSB [0xD727: CH0TADDRL]
417    pub const AUDIO_DMA_CHANNEL_X_TOP_ADDRESS_LSB: *mut u8 = (0xD727) as *mut u8;
418
419    /// Audio DMA channel X top address MSB [0xD728: CH0TADDRM]
420    pub const AUDIO_DMA_CHANNEL_X_TOP_ADDRESS_MSB: *mut u8 = (0xD728) as *mut u8;
421
422    /// Audio DMA channel X playback volume [0xD729: CH0VOLUME]
423    pub const AUDIO_DMA_CHANNEL_X_PLAYBACK_VOLUME: *mut u8 = (0xD729) as *mut u8;
424
425    /// Audio DMA channel X current address LSB [0xD72A: CH0CURADDRL]
426    pub const AUDIO_DMA_CHANNEL_X_CURRENT_ADDRESS_LSB: *mut u8 = (0xD72A) as *mut u8;
427
428    /// Audio DMA channel X current address middle byte [0xD72B: CH0CURADDRC]
429    pub const AUDIO_DMA_CHANNEL_X_CURRENT_ADDRESS_MIDDLE_BYTE: *mut u8 = (0xD72B) as *mut u8;
430
431    /// Audio DMA channel X current address MSB [0xD72C: CH0CURADDRM]
432    pub const AUDIO_DMA_CHANNEL_X_CURRENT_ADDRESS_MSB: *mut u8 = (0xD72C) as *mut u8;
433
434    /// Audio DMA channel X timing counter LSB [0xD72D: CH0TMRADDRL]
435    pub const AUDIO_DMA_CHANNEL_X_TIMING_COUNTER_LSB: *mut u8 = (0xD72D) as *mut u8;
436
437    /// Audio DMA channel X timing counter middle byte [0xD72E: CH0TMRADDRC]
438    pub const AUDIO_DMA_CHANNEL_X_TIMING_COUNTER_MIDDLE_BYTE: *mut u8 = (0xD72E) as *mut u8;
439
440    /// Audio DMA channel X timing counter MSB [0xD72F: CH0TMRADDRM]
441    pub const AUDIO_DMA_CHANNEL_X_TIMING_COUNTER_MSB: *mut u8 = (0xD72F) as *mut u8;
442
443    /// @CHXSBITS [0xD730: CH1]
444    pub const CHXSBITS_MASK: u8 = 0b00000011;
445
446    /// @CHXSTP [0xD730: CH1]
447    pub const CHXSTP_MASK: u8 = 0b00001000;
448
449    /// @CHXSINE [0xD730: CH1]
450    pub const CHXSINE_MASK: u8 = 0b00010000;
451
452    /// @CHXSGN [0xD730: CH1]
453    pub const CHXSGN_MASK: u8 = 0b00100000;
454
455    /// @CHXLOOP [0xD730: CH1]
456    pub const CHXLOOP_MASK: u8 = 0b01000000;
457
458    /// @CHXEN [0xD730: CH1]
459    pub const CHXEN_MASK: u8 = 0b10000000;
460
461    /// @CHXBADDRL [0xD731: CH1BADDRL]
462    pub const CHXBADDRL: *mut u8 = (0xD731) as *mut u8;
463
464    /// @CHXBADDRC [0xD732: CH1BADDRC]
465    pub const CHXBADDRC: *mut u8 = (0xD732) as *mut u8;
466
467    /// @CHXBADDRM [0xD733: CH1BADDRM]
468    pub const CHXBADDRM: *mut u8 = (0xD733) as *mut u8;
469
470    /// @CHXFREQL [0xD734: CH1FREQL]
471    pub const CHXFREQL: *mut u8 = (0xD734) as *mut u8;
472
473    /// @CHXFREQC [0xD735: CH1FREQC]
474    pub const CHXFREQC: *mut u8 = (0xD735) as *mut u8;
475
476    /// @CHXFREQM [0xD736: CH1FREQM]
477    pub const CHXFREQM: *mut u8 = (0xD736) as *mut u8;
478
479    /// @CHXTADDRL [0xD737: CH1TADDRL]
480    pub const CHXTADDRL: *mut u8 = (0xD737) as *mut u8;
481
482    /// @CHXTADDRM [0xD738: CH1TADDRM]
483    pub const CHXTADDRM: *mut u8 = (0xD738) as *mut u8;
484
485    /// @CHXVOLUME [0xD739: CH1VOLUME]
486    pub const CHXVOLUME: *mut u8 = (0xD739) as *mut u8;
487
488    /// @CHXCURADDRL [0xD73A: CH1CURADDRL]
489    pub const CHXCURADDRL: *mut u8 = (0xD73A) as *mut u8;
490
491    /// @CHXCURADDRC [0xD73B: CH1CURADDRC]
492    pub const CHXCURADDRC: *mut u8 = (0xD73B) as *mut u8;
493
494    /// @CHXCURADDRM [0xD73C: CH1CURADDRM]
495    pub const CHXCURADDRM: *mut u8 = (0xD73C) as *mut u8;
496
497    /// @CHXTMRADDRL [0xD73D: CH1TMRADDRL]
498    pub const CHXTMRADDRL: *mut u8 = (0xD73D) as *mut u8;
499
500    /// @CHXTMRADDRC [0xD73E: CH1TMRADDRC]
501    pub const CHXTMRADDRC: *mut u8 = (0xD73E) as *mut u8;
502
503    /// @CHXTMRADDRM [0xD73F: CH1TMRADDRM]
504    pub const CHXTMRADDRM: *mut u8 = (0xD73F) as *mut u8;
505}
506
507pub mod ethcommand {
508
509    /// Immediately stop transmitting the current ethernet frame.  Will cause a partially sent frame to be received, most likely resulting in the loss of that frame. [0x00: STOPTX]
510    pub const IMMEDIATELY_STOP_TRANSMITTING_THE_CURRENT_ETHERNET_FRAME: *mut u8 = (0x00) as *mut u8;
511
512    /// Transmit packet [0x01: STARTTX]
513    pub const TRANSMIT_PACKET: *mut u8 = (0x01) as *mut u8;
514
515    /// Disable the effects of RXONLYONE [0xD0: RXNORMAL]
516    pub const DISABLE_THE_EFFECTS_OF_RXONLYONE: *mut u8 = (0xD0) as *mut u8;
517
518    /// Select VIC-IV debug stream via ethernet when \$D6E1.3 is set [0xD4: DEBUGVIC]
519    pub const SELECT_VIC_IV_DEBUG_STREAM_VIA_ETHERNET_WHEN_0XD6E1: *mut u8 = (0xD4) as *mut u8;
520
521    /// Select CPU debug stream via ethernet when \$D6E1.3 is set [0xDC: DEBUGCPU]
522    pub const SELECT_CPU_DEBUG_STREAM_VIA_ETHERNET_WHEN_0XD6E1: *mut u8 = (0xDC) as *mut u8;
523
524    /// Receive exactly one ethernet frame only, and keep all signals states (for debugging ethernet sub-system) [0xDE: RXONLYONE]
525    pub const RECEIVE_EXACTLY_ONE_ETHERNET_FRAME_ONLY: *mut u8 = (0xDE) as *mut u8;
526
527    /// Select ~1KiB frames for video/cpu debug stream frames (for receivers that do not support MTUs of greater than 2KiB) [0xF1: FRAME1K]
528    pub const SELECT_1KIB_FRAMES_FOR_VIDEO_SLASH_CPU_DEBUG_STREAM_FRAMES: *mut u8 =
529        (0xF1) as *mut u8;
530
531    /// Select ~2KiB frames for video/cpu debug stream frames, for optimal performance. [0xF2: FRAME2K]
532    pub const SELECT_2KIB_FRAMES_FOR_VIDEO_SLASH_CPU_DEBUG_STREAM_FRAMES: *mut u8 =
533        (0xF2) as *mut u8;
534}
535
536pub mod ethernet {
537
538    /// Write 0 to hold ethernet controller under reset [0xD6E0: RST]
539    pub const WRITE_0_TO_HOLD_ETHERNET_CONTROLLER_UNDER_RESET_MASK: u8 = 0b00000001;
540
541    /// Write 0 to hold ethernet controller transmit sub-system under reset [0xD6E0: TXRST]
542    pub const WRITE_0_TO_HOLD_ETHERNET_CONTROLLER_TRANSMIT_SUB_SYSTEM_UNDER_RESET_MASK: u8 =
543        0b00000010;
544
545    /// Read ethernet RX bits currently on the wire [0xD6E0: DRXD]
546    pub const READ_ETHERNET_RX_BITS_CURRENTLY_ON_THE_WIRE_MASK: u8 = 0b00000100;
547
548    /// Read ethernet RX data valid (debug) [0xD6E0: DRXDV]
549    pub const READ_ETHERNET_RX_DATA_VALID_MASK: u8 = 0b00001000;
550
551    /// Allow remote keyboard input via magic ethernet frames [0xD6E0: KEYEN]
552    pub const ALLOW_REMOTE_KEYBOARD_INPUT_VIA_MAGIC_ETHERNET_FRAMES_MASK: u8 = 0b00010000;
553
554    /// Indicate if ethernet RX is blocked until RX buffers freed [0xD6E0: RXBLKD]
555    pub const INDICATE_IF_ETHERNET_RX_IS_BLOCKED_UNTIL_RX_BUFFERS_FREED_MASK: u8 = 0b01000000;
556
557    /// Ethernet transmit side is idle, i.e., a packet can be sent. [0xD6E0: TXIDLE]
558    pub const ETHERNET_TRANSMIT_SIDE_IS_IDLE_MASK: u8 = 0b10000000;
559
560    /// Number of free receive buffers [0xD6E1: RXBF]
561    pub const NUMBER_OF_FREE_RECEIVE_BUFFERS_MASK: u8 = 0b00000011;
562
563    /// Enable streaming of CPU instruction stream or VIC-IV display on ethernet [0xD6E1: STRM]
564    pub const ENABLE_STREAMING_OF_CPU_INSTRUCTION_STREAM_OR_VIC_IV_DISPLAY_ON_ETHERNET_MASK: u8 =
565        0b00001000;
566
567    /// Ethernet TX IRQ status [0xD6E1: TXQ]
568    pub const ETHERNET_TX_IRQ_STATUS_MASK: u8 = 0b00010000;
569
570    /// Ethernet RX IRQ status [0xD6E1: RXQ]
571    pub const ETHERNET_RX_IRQ_STATUS_MASK: u8 = 0b00100000;
572
573    /// Enable ethernet TX IRQ [0xD6E1: TXQEN]
574    pub const ENABLE_ETHERNET_TX_IRQ_MASK: u8 = 0b01000000;
575
576    /// Enable ethernet RX IRQ [0xD6E1: RXQEN]
577    pub const ENABLE_ETHERNET_RX_IRQ_MASK: u8 = 0b10000000;
578
579    /// TX Packet size (low byte) [0xD6E2: TXSZLSB]
580    pub const TX_PACKET_SIZE: *mut u8 = (0xD6E2) as *mut u8;
581
582    /// Ethernet command register (write only) [0xD6E4: COMMAND]
583    pub const ETHERNET_COMMAND_REGISTER: *mut u8 = (0xD6E4) as *mut u8;
584
585    /// Ethernet disable promiscuous mode [0xD6E5: NOPROM]
586    pub const ETHERNET_DISABLE_PROMISCUOUS_MODE_MASK: u8 = 0b00000001;
587
588    /// Disable CRC check for received packets [0xD6E5: NOCRC]
589    pub const DISABLE_CRC_CHECK_FOR_RECEIVED_PACKETS_MASK: u8 = 0b00000010;
590
591    /// Ethernet RX clock phase adjust [0xD6E5: RXPH]
592    pub const ETHERNET_RX_CLOCK_PHASE_ADJUST_MASK: u8 = 0b00000011;
593
594    /// Ethernet TX clock phase adjust [0xD6E5: TXPH]
595    pub const ETHERNET_TX_CLOCK_PHASE_ADJUST_MASK: u8 = 0b00000011;
596
597    /// Accept broadcast frames [0xD6E5: BCST]
598    pub const ACCEPT_BROADCAST_FRAMES_MASK: u8 = 0b00010000;
599
600    /// Accept multicast frames [0xD6E5: MCST]
601    pub const ACCEPT_MULTICAST_FRAMES_MASK: u8 = 0b00100000;
602
603    /// Ethernet MIIM register number [0xD6E6: MIIMREG]
604    pub const ETHERNET_MIIM_REGISTER_NUMBER_MASK: u8 = 0b00011111;
605
606    /// Ethernet MIIM PHY number (use 0 for Nexys4, 1 for MEGA65 r1 PCBs) [0xD6E6: MIIMPHY]
607    pub const ETHERNET_MIIM_PHY_NUMBER_MASK: u8 = 0b00000111;
608
609    /// Ethernet MIIM register value (LSB) [0xD6E7: MIIMVLSB]
610    pub const ETHERNET_MIIM_REGISTER_VALUE: *mut u8 = (0xD6E7) as *mut u8;
611
612    /// Ethernet MAC address [0xD6E9: MACADDR1]
613    pub const ETHERNET_MAC_ADDRESS: *mut u8 = (0xD6E9) as *mut u8;
614
615    /// @MACADDRX [0xD6EA: MACADDR2]
616    pub const MACADDRX: *mut u8 = (0xD6EA) as *mut u8;
617
618    /// DEBUG show number of writes to eth RX buffer [0xD6EF: DBGRXWCOUNT]
619    pub const DEBUG_SHOW_NUMBER_OF_WRITES_TO_ETH_RX_BUFFER: *mut u8 = (0xD6EF) as *mut u8;
620
621    /// DEBUG show current ethernet TX state [0xD6EF: DBGTXSTAT]
622    pub const DEBUG_SHOW_CURRENT_ETHERNET_TX_STATE: *mut u8 = (0xD6EF) as *mut u8;
623}
624
625pub mod f011 {
626
627    /// Enable D65 ``MEGA Disk'' for F011 emulated drive 0 [0xD68B: MDISK0]
628    pub const ENABLE_D65_MEGA_DISK_FOR_F011_EMULATED_DRIVE_0_MASK: u8 = 0b01000000;
629
630    /// Enable D65 ``MEGA Disk'' for F011 emulated drive 1 [0xD68B: MDISK0]
631    pub const ENABLE_D65_MEGA_DISK_FOR_F011_EMULATED_DRIVE_1_MASK: u8 = 0b10000000;
632
633    /// Diskimage sector number (bits 0-7) [0xD68C: DISKADDR0]
634    pub const DISKIMAGE_SECTOR_NUMBER: *mut u8 = (0xD68C) as *mut u8;
635
636    /// Diskimage 2 sector number (bits 0-7) [0xD690: DISK2ADDR0]
637    pub const DISKIMAGE_2_SECTOR_NUMBER: *mut u8 = (0xD690) as *mut u8;
638
639    /// Enable automatic track seeking for sector reads and writes [0xD696: AUTOTUNE]
640    pub const ENABLE_AUTOMATIC_TRACK_SEEKING_FOR_SECTOR_READS_AND_WRITES: *mut u8 =
641        (0xD696) as *mut u8;
642
643    /// Use real floppy drive instead of SD card for 1st floppy drive [0xD6A1: DRV0EN]
644    pub const USE_REAL_FLOPPY_DRIVE_INSTEAD_OF_SD_CARD_FOR_1ST_FLOPPY_DRIVE_MASK: u8 = 0b00000001;
645
646    /// Use real floppy drive instead of SD card for 2nd floppy drive [0xD6A1: DRV2EN]
647    pub const USE_REAL_FLOPPY_DRIVE_INSTEAD_OF_SD_CARD_FOR_2ND_FLOPPY_DRIVE_MASK: u8 = 0b00000100;
648}
649
650pub mod fdc {
651
652    /// Drive select (0 to 7). Internal drive is 0. Second floppy drive on internal cable is 1. Other values reserved for C1565 external drive interface. [0xD080: DS]
653    pub const DRIVE_SELECT_MASK: u8 = 0b00000111;
654
655    /// Directly controls the SIDE signal to the floppy drive, i.e., selecting which side of the media is active. [0xD080: SIDE]
656    pub const DIRECTLY_CONTROLS_THE_SIDE_SIGNAL_TO_THE_FLOPPY_DRIVE_MASK: u8 = 0b00001000;
657
658    /// Swap upper and lower halves of data buffer (i.e. invert bit 8 of the sector buffer) [0xD080: SWAP]
659    pub const SWAP_UPPER_AND_LOWER_HALVES_OF_DATA_BUFFER_MASK: u8 = 0b00010000;
660
661    /// Activates drive motor and LED (unless LED signal is also set, causing the drive LED to blink) [0xD080: MOTOR]
662    pub const ACTIVATES_DRIVE_MOTOR_AND_LED_MASK: u8 = 0b00100000;
663
664    /// Drive LED blinks when set [0xD080: LED]
665    pub const DRIVE_LED_BLINKS_WHEN_SET_MASK: u8 = 0b01000000;
666
667    /// Reset the sector buffer read/write pointers [0xD081: NOBUF]
668    pub const RESET_THE_SECTOR_BUFFER_READ_SLASH_WRITE_POINTERS_MASK: u8 = 0b00000001;
669
670    /// Selects alternate DPLL read recovery method (not implemented) [0xD081: ALT]
671    pub const SELECTS_ALTERNATE_DPLL_READ_RECOVERY_METHOD_MASK: u8 = 0b00000010;
672
673    /// Selects reading and writing algorithm (currently ignored). [0xD081: ALGO]
674    pub const SELECTS_READING_AND_WRITING_ALGORITHM_MASK: u8 = 0b00000100;
675
676    /// Sets the stepping direction (inward vs [0xD081: DIR]
677    pub const SETS_THE_STEPPING_DIRECTION_MASK: u8 = 0b00001000;
678
679    /// Writing 1 causes the head to step in the indicated direction [0xD081: STEP]
680    pub const WRITING_1_CAUSES_THE_HEAD_TO_STEP_IN_THE_INDICATED_DIRECTION_MASK: u8 = 0b00010000;
681
682    /// Command is a free-format (low level) operation [0xD081: FREE]
683    pub const COMMAND_IS_A_FREE_FORMAT_MASK: u8 = 0b00100000;
684
685    /// Command is a read operation if set [0xD081: RDCMD]
686    pub const COMMAND_IS_A_READ_OPERATION_IF_SET_MASK: u8 = 0b01000000;
687
688    /// Command is a write operation if set [0xD081: WRCMD]
689    pub const COMMAND_IS_A_WRITE_OPERATION_IF_SET_MASK: u8 = 0b10000000;
690
691    /// F011 FDC command register [0xD081: COMMAND]
692    pub const F011_FDC_COMMAND_REGISTER: *mut u8 = (0xD081) as *mut u8;
693
694    /// F011 Head is over track 0 flag (read only) [0xD082: TK0]
695    pub const F011_HEAD_IS_OVER_TRACK_0_FLAG_MASK: u8 = 0b00000001;
696
697    /// F011 Disk write protect flag (read only) [0xD082: PROT]
698    pub const F011_DISK_WRITE_PROTECT_FLAG_MASK: u8 = 0b00000010;
699
700    /// F011 LOST flag (data was lost during transfer, i.e., CPU did not read data fast enough) (read only) [0xD082: LOST]
701    pub const F011_LOST_FLAG_MASK: u8 = 0b00000100;
702
703    /// F011 FDC CRC check failure flag (read only) [0xD082: CRC]
704    pub const F011_FDC_CRC_CHECK_FAILURE_FLAG_MASK: u8 = 0b00001000;
705
706    /// F011 FDC Request Not Found (RNF), i.e., a sector read or write operation did not find the requested sector (read only) [0xD082: RNF]
707    pub const F011_FDC_REQUEST_NOT_FOUND_MASK: u8 = 0b00010000;
708
709    /// F011 FDC CPU and disk pointers to sector buffer are equal, indicating that the sector buffer is either full or empty. (read only) [0xD082: EQ]
710    pub const F011_FDC_CPU_AND_DISK_POINTERS_TO_SECTOR_BUFFER_ARE_EQUAL_MASK: u8 = 0b00100000;
711
712    /// F011 FDC DRQ flag (one or more bytes of data are ready) (read only) [0xD082: DRQ]
713    pub const F011_FDC_DRQ_FLAG_MASK: u8 = 0b01000000;
714
715    /// F011 FDC busy flag (command is being executed) (read only) [0xD082: BUSY]
716    pub const F011_FDC_BUSY_FLAG_MASK: u8 = 0b10000000;
717
718    /// F011 disk change sense (read only) [0xD083: DSKCHG]
719    pub const F011_DISK_CHANGE_SENSE_MASK: u8 = 0b00000001;
720
721    /// The floppy controller has generated an interrupt (read only). Note that interrupts are not currently implemented on the 45GS27. [0xD083: IRQ]
722    pub const THE_FLOPPY_CONTROLLER_HAS_GENERATED_AN_INTERRUPT_MASK: u8 = 0b00000010;
723
724    /// F011 Index hole sense (read only) [0xD083: INDEX]
725    pub const F011_INDEX_HOLE_SENSE_MASK: u8 = 0b00000100;
726
727    /// F011 Disk sense (read only) [0xD083: DISKIN]
728    pub const F011_DISK_SENSE_MASK: u8 = 0b00001000;
729
730    /// F011 write gate flag. Indicates that the drive is currently writing to media.  Bad things may happen if a write transaction is aborted (read only) [0xD083: WGATE]
731    pub const F011_WRITE_GATE_FLAG_MASK: u8 = 0b00010000;
732
733    /// F011 Successive match.  A synonym of RDREQ on the 45IO47 (read only) [0xD083: RUN]
734    pub const F011_SUCCESSIVE_MATCH_MASK: u8 = 0b00100000;
735
736    /// F011 Write Request flag, i.e., the requested sector was found during a write operation (read only) [0xD083: WTREQ]
737    pub const F011_WRITE_REQUEST_FLAG_MASK: u8 = 0b01000000;
738
739    /// F011 Read Request flag, i.e., the requested sector was found during a read operation (read only) [0xD083: RDREQ]
740    pub const F011_READ_REQUEST_FLAG_MASK: u8 = 0b10000000;
741
742    /// F011 FDC track selection register [0xD084: TRACK]
743    pub const F011_FDC_TRACK_SELECTION_REGISTER: *mut u8 = (0xD084) as *mut u8;
744
745    /// F011 FDC sector selection register [0xD085: SECTOR]
746    pub const F011_FDC_SECTOR_SELECTION_REGISTER: *mut u8 = (0xD085) as *mut u8;
747
748    /// F011 FDC side selection register [0xD086: SIDE]
749    pub const F011_FDC_SIDE_SELECTION_REGISTER: *mut u8 = (0xD086) as *mut u8;
750
751    /// F011 FDC data register (read/write) for accessing the floppy controller's 512 byte sector buffer [0xD087: DATA]
752    pub const F011_FDC_DATA_REGISTER: *mut u8 = (0xD087) as *mut u8;
753
754    /// Set or read the clock pattern to be used when writing address and data marks. Should normally be left $FF [0xD088: CLOCK]
755    pub const SET_OR_READ_THE_CLOCK_PATTERN_TO_BE_USED_WHEN_WRITING_ADDRESS_AND_DATA_MARKS:
756        *mut u8 = (0xD088) as *mut u8;
757
758    /// Set or read the track stepping rate in 62.5 microsecond steps (normally 128, i.e., 8 milliseconds). [0xD089: STEP]
759    pub const SET_OR_READ_THE_TRACK_STEPPING_RATE_IN_62: *mut u8 = (0xD089) as *mut u8;
760
761    /// (Read only) returns the protection code of the most recently read sector. Was intended for rudimentary copy protection. Not implemented. [0xD08A: PCODE]
762    pub const PROTECTION_CODE_OF_THE_MOST_RECENTLY_READ_SECTOR: *mut u8 = (0xD08A) as *mut u8;
763
764    /// Control floppy drive SIDE1 line [0xD6A0: DBGWGATE]
765    pub const CONTROL_FLOPPY_DRIVE_SIDE1_LINE_MASK: u8 = 0b00000001;
766
767    /// Control floppy drive WGATE line [0xD6A0: DBGWGATE]
768    pub const CONTROL_FLOPPY_DRIVE_WGATE_LINE_MASK: u8 = 0b00000010;
769
770    /// Control floppy drive WDATA line [0xD6A0: DBGWDATA]
771    pub const CONTROL_FLOPPY_DRIVE_WDATA_LINE_MASK: u8 = 0b00000100;
772
773    /// Control floppy drive STEP line [0xD6A0: DBGDIR]
774    pub const CONTROL_FLOPPY_DRIVE_STEP_LINE_MASK: u8 = 0b00001000;
775
776    /// Control floppy drive STEPDIR line [0xD6A0: DBGDIR]
777    pub const CONTROL_FLOPPY_DRIVE_STEPDIR_LINE_MASK: u8 = 0b00010000;
778
779    /// Control floppy drive SELECT line [0xD6A0: DBGMOTORA]
780    pub const CONTROL_FLOPPY_DRIVE_SELECT_LINE_MASK: u8 = 0b00100000;
781
782    /// Control floppy drive MOTOR line [0xD6A0: DBGMOTORA]
783    pub const CONTROL_FLOPPY_DRIVE_MOTOR_LINE_MASK: u8 = 0b01000000;
784
785    /// Control floppy drive density select line [0xD6A0: DENSITY]
786    pub const CONTROL_FLOPPY_DRIVE_DENSITY_SELECT_LINE_MASK: u8 = 0b10000000;
787
788    /// Set number of bus cycles per floppy magnetic interval (decrease to increase data rate) [0xD6A2: DATARATE]
789    pub const SET_NUMBER_OF_BUS_CYCLES_PER_FLOPPY_MAGNETIC_INTERVAL: *mut u8 = (0xD6A2) as *mut u8;
790}
791
792pub mod fpga {
793
794    /// LSB of MEGA65 FPGA design date stamp (days since 1 Jan 2020) [0xD630: FWDATEL]
795    pub const LSB_OF_MEGA65_FPGA_DESIGN_DATE_STAMP: *mut u8 = (0xD630) as *mut u8;
796
797    /// MSB of MEGA65 FPGA design date stamp (days since 1 Jan 2020) [0xD631: FWDATEH]
798    pub const MSB_OF_MEGA65_FPGA_DESIGN_DATE_STAMP: *mut u8 = (0xD631) as *mut u8;
799
800    /// LSB of MEGA65 FPGA design git commit [0xD632: FWGIT0]
801    pub const LSB_OF_MEGA65_FPGA_DESIGN_GIT_COMMIT: *mut u8 = (0xD632) as *mut u8;
802
803    /// 2nd byte of MEGA65 FPGA design git commit [0xD633: FWGIT0]
804    pub const COMMIT_BYTE_OF_MEGA65_FPGA_DESIGN_GIT_2ND: *mut u8 = (0xD633) as *mut u8;
805
806    /// 3rd byte of MEGA65 FPGA design git commit [0xD634: FWGIT0]
807    pub const COMMIT_BYTE_OF_MEGA65_FPGA_DESIGN_GIT_3RD: *mut u8 = (0xD634) as *mut u8;
808
809    /// MSB of MEGA65 FPGA design git commit [0xD635: FWGIT0]
810    pub const MSB_OF_MEGA65_FPGA_DESIGN_GIT_COMMIT: *mut u8 = (0xD635) as *mut u8;
811
812    /// Select ICAPE2 FPGA configuration register for reading WRITE ONLY [0xD6C4: REGNUM]
813    pub const SELECT_ICAPE2_FPGA_CONFIGURATION_REGISTER_FOR_READING_WRITE_ONLY: *mut u8 =
814        (0xD6C4) as *mut u8;
815
816    /// Value of selected ICAPE2 register (least significant byte) [0xD6C4: REGVAL]
817    pub const VALUE_OF_SELECTED_ICAPE2_REGISTER: *mut u8 = (0xD6C4) as *mut u8;
818
819    /// Address of bitstream in boot flash for reconfiguration (least significant byte) [0xD6C8: BOOTADDR0]
820    pub const ADDRESS_OF_BITSTREAM_IN_BOOT_FLASH_FOR_RECONFIGURATION: *mut u8 = (0xD6C8) as *mut u8;
821
822    /// Write $42 to Trigger FPGA reconfiguration to switch to alternate bitstream. [0xD6CF: RECONFTRIG]
823    pub const WRITE_0X42_TO_TRIGGER_FPGA_RECONFIGURATION_TO_SWITCH_TO_ALTERNATE_BITSTREAM: *mut u8 =
824        (0xD6CF) as *mut u8;
825
826    /// FPGA die temperature sensor (lower nybl) [0xD6DE: FPGATEMPLSB]
827    pub const FPGA_DIE_TEMPERATURE_SENSOR: *mut u8 = (0xD6DE) as *mut u8;
828}
829
830pub mod hcpu {
831
832    /// Hypervisor A register storage [0xD640: REGA]
833    pub const HYPERVISOR_A_REGISTER_STORAGE: *mut u8 = (0xD640) as *mut u8;
834
835    /// Hypervisor X register storage [0xD641: REGX]
836    pub const HYPERVISOR_X_REGISTER_STORAGE: *mut u8 = (0xD641) as *mut u8;
837
838    /// Hypervisor Z register storage [0xD643: REGZ]
839    pub const HYPERVISOR_Z_REGISTER_STORAGE: *mut u8 = (0xD643) as *mut u8;
840
841    /// Hypervisor B register storage [0xD644: REGB]
842    pub const HYPERVISOR_B_REGISTER_STORAGE: *mut u8 = (0xD644) as *mut u8;
843
844    /// Hypervisor SPL register storage [0xD645: SPL]
845    pub const HYPERVISOR_SPL_REGISTER_STORAGE: *mut u8 = (0xD645) as *mut u8;
846
847    /// Hypervisor SPH register storage [0xD646: SPH]
848    pub const HYPERVISOR_SPH_REGISTER_STORAGE: *mut u8 = (0xD646) as *mut u8;
849
850    /// Hypervisor P register storage [0xD647: PFLAGS]
851    pub const HYPERVISOR_P_REGISTER_STORAGE: *mut u8 = (0xD647) as *mut u8;
852
853    /// Hypervisor PC-low register storage [0xD648: PCL]
854    pub const HYPERVISOR_PC_LOW_REGISTER_STORAGE: *mut u8 = (0xD648) as *mut u8;
855
856    /// Hypervisor PC-high register storage [0xD649: PCH]
857    pub const HYPERVISOR_PC_HIGH_REGISTER_STORAGE: *mut u8 = (0xD649) as *mut u8;
858
859    /// Hypervisor MAPLO register storage (high bits) [0xD64A: MAPLO]
860    pub const HYPERVISOR_MAPLO_REGISTER_STORAGE: *mut u8 = (0xD64A) as *mut u8;
861
862    /// Hypervisor MAPHI register storage (high bits) [0xD64C: MAPHI]
863    pub const HYPERVISOR_MAPHI_REGISTER_STORAGE: *mut u8 = (0xD64C) as *mut u8;
864
865    /// Hypervisor MAPLO mega-byte number register storage [0xD64E: MAPLOMB]
866    pub const HYPERVISOR_MAPLO_MEGA_BYTE_NUMBER_REGISTER_STORAGE: *mut u8 = (0xD64E) as *mut u8;
867
868    /// Hypervisor MAPHI mega-byte number register storage [0xD64F: MAPHIMB]
869    pub const HYPERVISOR_MAPHI_MEGA_BYTE_NUMBER_REGISTER_STORAGE: *mut u8 = (0xD64F) as *mut u8;
870
871    /// Hypervisor CPU port \$00 value [0xD650: PORT00]
872    pub const HYPERVISOR_CPU_PORT_0X00_VALUE: *mut u8 = (0xD650) as *mut u8;
873
874    /// Hypervisor CPU port \$01 value [0xD651: PORT01]
875    pub const HYPERVISOR_CPU_PORT_0X01_VALUE: *mut u8 = (0xD651) as *mut u8;
876
877    /// VIC-II/VIC-III/VIC-IV mode select [0xD652: VICMODE]
878    pub const VIC_II_SLASH_VIC_III_SLASH_VIC_IV_MODE_SELECT_MASK: u8 = 0b00000011;
879
880    /// 0=Use internal SIDs, 1=Use external(1) SIDs [0xD652: EXSID]
881    pub const USE_INTERNAL_SIDS_MASK: u8 = 0b00000100;
882
883    /// Hypervisor DMAgic source MB [0xD653: DMASRCMB]
884    pub const HYPERVISOR_DMAGIC_SOURCE_MB: *mut u8 = (0xD653) as *mut u8;
885
886    /// Hypervisor DMAgic destination MB [0xD654: DMADSTMB]
887    pub const HYPERVISOR_DMAGIC_DESTINATION_MB: *mut u8 = (0xD654) as *mut u8;
888
889    /// Hypervisor DMAGic list address bits 0-7 [0xD655: DMALADDR]
890    pub const HYPERVISOR_DMAGIC_LIST_ADDRESS_BITS_0_7: *mut u8 = (0xD655) as *mut u8;
891
892    /// Hypervisor DMAGic list address bits 15-8 [0xD656: DMALADDR]
893    pub const HYPERVISOR_DMAGIC_LIST_ADDRESS_BITS_15_8: *mut u8 = (0xD656) as *mut u8;
894
895    /// Hypervisor DMAGic list address bits 23-16 [0xD657: DMALADDR]
896    pub const HYPERVISOR_DMAGIC_LIST_ADDRESS_BITS_23_16: *mut u8 = (0xD657) as *mut u8;
897
898    /// Hypervisor DMAGic list address bits 27-24 [0xD658: DMALADDR]
899    pub const HYPERVISOR_DMAGIC_LIST_ADDRESS_BITS_27_24: *mut u8 = (0xD658) as *mut u8;
900
901    /// 1=Virtualise SD/Floppy0 access (usually for access via serial debugger interface) [0xD659: VFLOP]
902    pub const VIRTUALISE_SD_SLASH_FLOPPY0_ACCESS_MASK: u8 = 0b00000001;
903
904    /// 1=Virtualise SD/Floppy1 access (usually for access via serial debugger interface) [0xD659: VFLOP]
905    pub const VIRTUALISE_SD_SLASH_FLOPPY1_ACCESS_MASK: u8 = 0b00000010;
906
907    /// Hypervisor GeoRAM base address (x MB) [0xD670: GEORAMBASE]
908    pub const HYPERVISOR_GEORAM_BASE_ADDRESS: *mut u8 = (0xD670) as *mut u8;
909
910    /// Hypervisor GeoRAM address mask (applied to GeoRAM block register) [0xD671: GEORAMMASK]
911    pub const HYPERVISOR_GEORAM_ADDRESS_MASK: *mut u8 = (0xD671) as *mut u8;
912
913    /// Enable composited Matrix Mode, and disable UART access to serial monitor. [0xD672: MATRIXEN]
914    pub const ENABLE_COMPOSITED_MATRIX_MODE_MASK: u8 = 0b01000000;
915
916    /// (write) Hypervisor write serial output to UART monitor [0xD67C: UARTDATA]
917    pub const _MASK: u8 = 0b11111111;
918
919    /// Hypervisor enable 32-bit JMP/JSR etc [0xD67D: JMP32EN]
920    pub const HYPERVISOR_ENABLE_32_BIT_JMP_SLASH_JSR_ETC_MASK: u8 = 0b00000010;
921
922    /// Hypervisor write protect C65 ROM \$20000-\$3FFFF [0xD67D: ROMPROT]
923    pub const HYPERVISOR_WRITE_PROTECT_C65_ROM_0X20000_0X3FFFF_MASK: u8 = 0b00000100;
924
925    /// Hypervisor enable ASC/DIN CAPS LOCK key to enable/disable CPU slow-down in C64/C128/C65 modes [0xD67D: ASCFAST]
926    pub const HYPERVISOR_ENABLE_ASC_SLASH_DIN_CAPS_LOCK_KEY_TO_ENABLE_SLASH_DISABLE_CPU_SLOW_DOWN_IN_C64_SLASH_C128_SLASH_C65_MODES_MASK: u8 = 0b00001000;
927
928    /// Hypervisor force CPU to 48MHz for userland (userland can override via POKE0) [0xD67D: CPUFAST]
929    pub const HYPERVISOR_FORCE_CPU_TO_48MHZ_FOR_USERLAND_MASK: u8 = 0b00010000;
930
931    /// Hypervisor force CPU to 4502 personality, even in C64 IO mode. [0xD67D: F4502]
932    pub const HYPERVISOR_FORCE_CPU_TO_4502_PERSONALITY_MASK: u8 = 0b00100000;
933
934    /// Hypervisor flag to indicate if an IRQ is pending on exit from the hypervisor / set 1 to force IRQ/NMI deferal for 1,024 cycles on exit from hypervisor. [0xD67D: PIRQ]
935    pub const HYPERVISOR_FLAG_TO_INDICATE_IF_AN_IRQ_IS_PENDING_ON_EXIT_FROM_THE_HYPERVISOR__SLASH__SET_1_TO_FORCE_IRQ_SLASH_NMI_DEFERAL_FOR_1_MASK: u8 = 0b01000000;
936
937    /// Hypervisor flag to indicate if an NMI is pending on exit from the hypervisor. [0xD67D: PNMI]
938    pub const HYPERVISOR_FLAG_TO_INDICATE_IF_AN_NMI_IS_PENDING_ON_EXIT_FROM_THE_HYPERVISOR_MASK:
939        u8 = 0b10000000;
940
941    /// Hypervisor watchdog register: writing any value clears the watch dog [0xD67D: WATCHDOG]
942    pub const HYPERVISOR_WATCHDOG_REGISTER: *mut u8 = (0xD67D) as *mut u8;
943
944    /// Hypervisor already-upgraded bit (writing sets permanently) [0xD67E: HICKED]
945    pub const HYPERVISOR_ALREADY_UPGRADED_BIT: *mut u8 = (0xD67E) as *mut u8;
946
947    /// Writing trigger return from hypervisor [0xD67F: ENTEREXIT]
948    pub const WRITING_TRIGGER_RETURN_FROM_HYPERVISOR: *mut u8 = (0xD67F) as *mut u8;
949}
950
951pub mod kbd {
952
953    /// LSB of keyboard firmware date stamp (days since 1 Jan 2020) [0xD62A: FWDATEL]
954    pub const LSB_OF_KEYBOARD_FIRMWARE_DATE_STAMP: *mut u8 = (0xD62A) as *mut u8;
955
956    /// MSB of keyboard firmware date stamp (days since 1 Jan 2020) [0xD62B: FWDATEH]
957    pub const MSB_OF_KEYBOARD_FIRMWARE_DATE_STAMP: *mut u8 = (0xD62B) as *mut u8;
958
959    /// LSB of keyboard firmware git commit [0xD62C: FWGIT0]
960    pub const LSB_OF_KEYBOARD_FIRMWARE_GIT_COMMIT: *mut u8 = (0xD62C) as *mut u8;
961
962    /// 2nd byte of keyboard firmware git commit [0xD62D: FWGIT0]
963    pub const COMMIT_BYTE_OF_KEYBOARD_FIRMWARE_GIT_2ND: *mut u8 = (0xD62D) as *mut u8;
964
965    /// 3rd byte of keyboard firmware git commit [0xD62E: FWGIT0]
966    pub const COMMIT_BYTE_OF_KEYBOARD_FIRMWARE_GIT_3RD: *mut u8 = (0xD62E) as *mut u8;
967
968    /// MSB of keyboard firmware git commit [0xD62F: FWGIT0]
969    pub const MSB_OF_KEYBOARD_FIRMWARE_GIT_COMMIT: *mut u8 = (0xD62F) as *mut u8;
970}
971
972pub mod math {
973
974    /// Set if hardware multiplier is busy [0xD70F: MULBUSY]
975    pub const SET_IF_HARDWARE_MULTIPLIER_IS_BUSY_MASK: u8 = 0b01000000;
976
977    /// Set if hardware divider is busy [0xD70F: DIVBUSY]
978    pub const SET_IF_HARDWARE_DIVIDER_IS_BUSY_MASK: u8 = 0b10000000;
979
980    /// 64-bit output of MULTINA $\div$ MULTINB [0xD768: DIVOUT]
981    pub const MULTINB_OUTPUT_OF_MULTINA_0XDIV0X_64_BIT: *mut u8 = (0xD768) as *mut u8;
982
983    /// Multiplier input A / Divider numerator (32 bit) [0xD770: MULTINA]
984    pub const MULTIPLIER_INPUT_A__SLASH__DIVIDER_NUMERATOR: *mut u8 = (0xD770) as *mut u8;
985
986    /// Multiplier input B / Divider denominator (32 bit) [0xD774: MULTINB]
987    pub const MULTIPLIER_INPUT_B__SLASH__DIVIDER_DENOMINATOR: *mut u8 = (0xD774) as *mut u8;
988
989    /// 64-bit output of MULTINA $\times$ MULTINB [0xD778: MULTOUT]
990    pub const MULTINB_OUTPUT_OF_MULTINA_0XTIMES0X_64_BIT: *mut u8 = (0xD778) as *mut u8;
991
992    /// Math unit 32-bit input X [0xD780: MATHIN0]
993    pub const MATH_UNIT_32_BIT_INPUT_X: *mut u8 = (0xD780) as *mut u8;
994
995    /// @MATHINX [0xD781: MATHIN0]
996    pub const MATHINX: *mut u8 = (0xD781) as *mut u8;
997
998    /// Select which of the 16 32-bit math registers is input A for Math Function Unit X. [0xD7C0: UNIT0INA]
999    pub const SELECT_WHICH_OF_THE_16_32_BIT_MATH_REGISTERS_IS_INPUT_A_FOR_MATH_FUNCTION_UNIT_X_MASK: u8 = 0b00001111;
1000
1001    /// Select which of the 16 32-bit math registers is input B for Math Function Unit X. [0xD7C0: UNIT0INB]
1002    pub const SELECT_WHICH_OF_THE_16_32_BIT_MATH_REGISTERS_IS_INPUT_B_FOR_MATH_FUNCTION_UNIT_X_MASK: u8 = 0b00001111;
1003
1004    /// @UNITXINA [0xD7C1: UNIT1INA]
1005    pub const UNITXINA_MASK: u8 = 0b00001111;
1006
1007    /// @UNITXINB [0xD7C1: UNIT1INB]
1008    pub const UNITXINB_MASK: u8 = 0b00001111;
1009
1010    /// Select which of the 16 32-bit math registers receives the output of Math Function Unit X [0xD7D0: UNIT0OUT]
1011    pub const SELECT_WHICH_OF_THE_16_32_BIT_MATH_REGISTERS_RECEIVES_THE_OUTPUT_OF_MATH_FUNCTION_UNIT_X_MASK: u8 = 0b00001111;
1012
1013    /// @UNITXOUT [0xD7D1: UNIT1OUT]
1014    pub const UNITXOUT_MASK: u8 = 0b00001111;
1015
1016    /// Latch interval for latched outputs (in CPU cycles) [0xD7E0: LATCHINT]
1017    pub const LATCH_INTERVAL_FOR_LATCHED_OUTPUTS: *mut u8 = (0xD7E0) as *mut u8;
1018
1019    /// Enable setting of math registers (must normally be set) [0xD7E1: WREN]
1020    pub const ENABLE_SETTING_OF_MATH_REGISTERS_MASK: u8 = 0b00000001;
1021
1022    /// Enable committing of output values from math units back to math registers (clearing effectively pauses iterative formulae) [0xD7E1: CALCEN]
1023    pub const ENABLE_COMMITTING_OF_OUTPUT_VALUES_FROM_MATH_UNITS_BACK_TO_MATH_REGISTERS_MASK: u8 =
1024        0b00000010;
1025
1026    /// Iteration Counter (32 bit) [0xD7E4: ITERCNT]
1027    pub const ITERATION_COUNTER: *mut u8 = (0xD7E4) as *mut u8;
1028
1029    /// Math iteration counter comparator (32 bit) [0xD7E8: ITERCMP]
1030    pub const MATH_ITERATION_COUNTER_COMPARATOR: *mut u8 = (0xD7E8) as *mut u8;
1031}
1032
1033pub mod misc {
1034
1035    /// I2C bus select (bus 0 = temp sensor on Nexys4 boardS) [0xD6D0: I2CBUSSELECT]
1036    pub const I2C_BUS_SELECT: *mut u8 = (0xD6D0) as *mut u8;
1037
1038    /// DEBUG SD card last error code LSB [0xD6DA: SDDEBUGERRLSB]
1039    pub const DEBUG_SD_CARD_LAST_ERROR_CODE_LSB: *mut u8 = (0xD6DA) as *mut u8;
1040
1041    /// DEBUG SD card last error code MSB [0xD6DB: SDDEBUGERRMSB]
1042    pub const DEBUG_SD_CARD_LAST_ERROR_CODE_MSB: *mut u8 = (0xD6DB) as *mut u8;
1043
1044    /// Read FPGA five-way buttons [0xD6F2: FPGABUTTONS]
1045    pub const READ_FPGA_FIVE_WAY_BUTTONS: *mut u8 = (0xD6F2) as *mut u8;
1046
1047    /// Accelerometer bit-bash interface [0xD6F3: ACCELBITBASH]
1048    pub const ACCELEROMETER_BIT_BASH_INTERFACE: *mut u8 = (0xD6F3) as *mut u8;
1049
1050    /// Keyboard scan code reader (lower byte) [0xD6F6: PS2KEYSCANLSB]
1051    pub const KEYBOARD_SCAN_CODE_READER: *mut u8 = (0xD6F6) as *mut u8;
1052
1053    /// Select audio channel volume to be set by thumb wheel #3 [0xD6AC: WHEEL3TARGET]
1054    pub const SELECT_AUDIO_CHANNEL_VOLUME_TO_BE_SET_BY_THUMB_WHEEL_3_MASK: u8 = 0b00001111;
1055
1056    /// Enable control of LCD panel brightness via thumb wheel [0xD6AC: WHEELBRIGHTEN]
1057    pub const ENABLE_CONTROL_OF_LCD_PANEL_BRIGHTNESS_VIA_THUMB_WHEEL_MASK: u8 = 0b10000000;
1058
1059    /// Select audio channel volume to be set by thumb wheel #1 [0xD6AD: WHEEL1TARGET]
1060    pub const SELECT_AUDIO_CHANNEL_VOLUME_TO_BE_SET_BY_THUMB_WHEEL_1_MASK: u8 = 0b00001111;
1061
1062    /// Select audio channel volume to be set by thumb wheel #2 [0xD6AD: WHEEL2TARGET]
1063    pub const SELECT_AUDIO_CHANNEL_VOLUME_TO_BE_SET_BY_THUMB_WHEEL_2_MASK: u8 = 0b00001111;
1064
1065    /// Flip X axis of touch interface if set [0xD6B0: TCHFLX]
1066    pub const FLIP_X_AXIS_OF_TOUCH_INTERFACE_IF_SET_MASK: u8 = 0b01000000;
1067
1068    /// Flip Y axis of touch interface if set [0xD6B0: TCHFLX]
1069    pub const FLIP_Y_AXIS_OF_TOUCH_INTERFACE_IF_SET_MASK: u8 = 0b10000000;
1070
1071    /// Set X scale value for touch interface (LSB) [0xD6B1: TCHXSCALE]
1072    pub const SET_X_SCALE_VALUE_FOR_TOUCH_INTERFACE: *mut u8 = (0xD6B1) as *mut u8;
1073
1074    /// Set Y scale value for touch interface (LSB) [0xD6B3: TCHYSCALE]
1075    pub const SET_Y_SCALE_VALUE_FOR_TOUCH_INTERFACE: *mut u8 = (0xD6B3) as *mut u8;
1076
1077    /// Set X delta value for touch interface (LSB) [0xD6B5: TCHXDELTA]
1078    pub const SET_X_DELTA_VALUE_FOR_TOUCH_INTERFACE: *mut u8 = (0xD6B5) as *mut u8;
1079
1080    /// Set Y delta value for touch interface (LSB) [0xD6B7: TCHYDELTA]
1081    pub const SET_Y_DELTA_VALUE_FOR_TOUCH_INTERFACE: *mut u8 = (0xD6B7) as *mut u8;
1082
1083    /// Select byte number for touch panel communications instrumentation [0xD6BF: TCHBYTENUM]
1084    pub const SELECT_BYTE_NUMBER_FOR_TOUCH_PANEL_COMMUNICATIONS_INSTRUMENTATION_MASK: u8 =
1085        0b01111111;
1086
1087    /// Enable/disable touch panel I2C communications [0xD6BF: TCHI2CEN]
1088    pub const ENABLE_SLASH_DISABLE_TOUCH_PANEL_I2C_COMMUNICATIONS_MASK: u8 = 0b10000000;
1089
1090    /// Select I2C bus number (I2C busses vary between MEGA65 and MEGAphone variants) [0xD6D0: I2CBUSSEL]
1091    pub const SELECT_I2C_BUS_NUMBER: *mut u8 = (0xD6D0) as *mut u8;
1092
1093    /// I2C reset [0xD6D1: I2CRST]
1094    pub const I2C_RESET_MASK: u8 = 0b00000001;
1095
1096    /// I2C command latch write strobe (write 1 to trigger command) [0xD6D1: I2CL]
1097    pub const I2C_COMMAND_LATCH_WRITE_STROBE_MASK: u8 = 0b00000010;
1098
1099    /// I2C Select read (1) or write (0) [0xD6D1: I2CRW]
1100    pub const I2C_SELECT_READ_MASK: u8 = 0b00000100;
1101
1102    /// I2C bus 1 swap SDA/SCL pins [0xD6D1: I2CSW]
1103    pub const I2C_BUS_1_SWAP_SDA_SLASH_SCL_PINS_MASK: u8 = 0b00100000;
1104
1105    /// I2C busy flag [0xD6D1: I2CBSY]
1106    pub const I2C_BUSY_FLAG_MASK: u8 = 0b01000000;
1107
1108    /// I2C ack error [0xD6D1: I2CERR]
1109    pub const I2C_ACK_ERROR_MASK: u8 = 0b10000000;
1110
1111    /// I2C address [0xD6D2: I2CADDR]
1112    pub const I2C_ADDRESS_MASK: u8 = 0b01111111;
1113
1114    /// I2C data write register [0xD6D3: I2CWDATA]
1115    pub const I2C_DATA_WRITE_REGISTER: *mut u8 = (0xD6D3) as *mut u8;
1116
1117    /// I2C data read register [0xD6D4: I2CRDATA]
1118    pub const I2C_DATA_READ_REGISTER: *mut u8 = (0xD6D4) as *mut u8;
1119
1120    /// LCD panel brightness control [0xD6F0: LCDBRIGHT]
1121    pub const LCD_PANEL_BRIGHTNESS_CONTROL: *mut u8 = (0xD6F0) as *mut u8;
1122
1123    /// Accelerometer bit-bashing port (debug only) [0xD6F3: ACCELBASH]
1124    pub const ACCELEROMETER_BIT_BASHING_PORT: *mut u8 = (0xD6F3) as *mut u8;
1125}
1126
1127pub mod qspi {
1128
1129    /// Data bits for QSPI flash interface (read/write) [0xD6CC: DB]
1130    pub const DATA_BITS_FOR_QSPI_FLASH_INTERFACE_MASK: u8 = 0b00001111;
1131
1132    /// Clock output line for QSPI flash [0xD6CC: CLOCK]
1133    pub const CLOCK_OUTPUT_LINE_FOR_QSPI_FLASH_MASK: u8 = 0b00100000;
1134
1135    /// Active-low chip-select for QSPI flash [0xD6CC: CSN]
1136    pub const ACTIVE_LOW_CHIP_SELECT_FOR_QSPI_FLASH_MASK: u8 = 0b01000000;
1137
1138    /// Tristate DB0-3 [0xD6CC: TRI]
1139    pub const TRISTATE_DB0_3_MASK: u8 = 0b10000000;
1140
1141    /// Set to cause QSPI clock to free run at CPU clock frequency. [0xD6CD: CLOCKRUN]
1142    pub const SET_TO_CAUSE_QSPI_CLOCK_TO_FREE_RUN_AT_CPU_CLOCK_FREQUENCY_MASK: u8 = 0b00000001;
1143
1144    /// Alternate address for direct manipulation of QSPI CLOCK [0xD6CD: CLOCK]
1145    pub const ALTERNATE_ADDRESS_FOR_DIRECT_MANIPULATION_OF_QSPI_CLOCK_MASK: u8 = 0b00000010;
1146}
1147
1148pub mod rtc {
1149
1150    /// Real-time Clock seconds value (binary coded decimal) [0xFFD7110: RTCSEC]
1151    pub const REAL_TIME_CLOCK_SECONDS_VALUE: *mut u8 = (0xFFD7110u32) as *mut u8;
1152
1153    /// Real-time Clock minutes value (binary coded decimal) [0xFFD7111: RTCMIN]
1154    pub const REAL_TIME_CLOCK_MINUTES_VALUE: *mut u8 = (0xFFD7111u32) as *mut u8;
1155
1156    /// Real-time Clock hours value (binary coded decimal) [0xFFD7112: RTCHOUR]
1157    pub const REAL_TIME_CLOCK_HOURS_VALUE: *mut u8 = (0xFFD7112u32) as *mut u8;
1158
1159    /// Real-time Clock day of month value (binary coded decimal) [0xFFD7113: RTCDAY]
1160    pub const REAL_TIME_CLOCK_DAY_OF_MONTH_VALUE: *mut u8 = (0xFFD7113u32) as *mut u8;
1161
1162    /// Real-time Clock month value (binary coded decimal) [0xFFD7114: RTCMONTH]
1163    pub const REAL_TIME_CLOCK_MONTH_VALUE: *mut u8 = (0xFFD7114u32) as *mut u8;
1164
1165    /// Real-time Clock year value (binary coded decimal) [0xFFD7115: RTCYEAR]
1166    pub const REAL_TIME_CLOCK_YEAR_VALUE: *mut u8 = (0xFFD7115u32) as *mut u8;
1167
1168    /// External Real-time Clock seconds value (binary coded decimal) [0xFFD7400: EXTRTCSEC]
1169    pub const EXTERNAL_REAL_TIME_CLOCK_SECONDS_VALUE: *mut u8 = (0xFFD7400u32) as *mut u8;
1170
1171    /// External Real-time Clock minutes value (binary coded decimal) [0xFFD7401: EXTRTCMIN]
1172    pub const EXTERNAL_REAL_TIME_CLOCK_MINUTES_VALUE: *mut u8 = (0xFFD7401u32) as *mut u8;
1173
1174    /// External Real-time Clock hours value (binary coded decimal) [0xFFD7402: EXTRTCHOUR]
1175    pub const EXTERNAL_REAL_TIME_CLOCK_HOURS_VALUE: *mut u8 = (0xFFD7402u32) as *mut u8;
1176
1177    /// External Real-time Clock day of week value (binary coded decimal) [0xFFD7403: EXTRTCDOW]
1178    pub const EXTERNAL_REAL_TIME_CLOCK_DAY_OF_WEEK_VALUE: *mut u8 = (0xFFD7403u32) as *mut u8;
1179
1180    /// External Real-time Clock day of month value (binary coded decimal) [0xFFD7404: EXTRTCDAY]
1181    pub const EXTERNAL_REAL_TIME_CLOCK_DAY_OF_MONTH_VALUE: *mut u8 = (0xFFD7404u32) as *mut u8;
1182
1183    /// External Real-time Clock month value (binary coded decimal) [0xFFD7405: EXTRTCMONTH]
1184    pub const EXTERNAL_REAL_TIME_CLOCK_MONTH_VALUE: *mut u8 = (0xFFD7405u32) as *mut u8;
1185
1186    /// External Real-time Clock year value (binary coded decimal) [0xFFD7406: EXTRTCYEAR]
1187    pub const EXTERNAL_REAL_TIME_CLOCK_YEAR_VALUE: *mut u8 = (0xFFD7406u32) as *mut u8;
1188
1189    /// External Real-time Clock alarm 1 seconds value (binary coded decimal) [0xFFD7407: EXTRTCA1SEC]
1190    pub const EXTERNAL_REAL_TIME_CLOCK_ALARM_1_SECONDS_VALUE: *mut u8 = (0xFFD7407u32) as *mut u8;
1191
1192    /// External Real-time Clock alarm 1 minutes value (binary coded decimal) [0xFFD7408: EXTRTCA1MIN]
1193    pub const EXTERNAL_REAL_TIME_CLOCK_ALARM_1_MINUTES_VALUE: *mut u8 = (0xFFD7408u32) as *mut u8;
1194
1195    /// External Real-time Clock alarm 1 hours value (binary coded decimal) [0xFFD7409: EXTRTCA1HOUR]
1196    pub const EXTERNAL_REAL_TIME_CLOCK_ALARM_1_HOURS_VALUE: *mut u8 = (0xFFD7409u32) as *mut u8;
1197
1198    /// External Real-time Clock alarm 1 day of week / day of month value (binary coded decimal) [0xFFD740A: EXTRTCA1DAYDATE]
1199    pub const EXTERNAL_REAL_TIME_CLOCK_ALARM_1_DAY_OF_WEEK__SLASH__DAY_OF_MONTH_VALUE: *mut u8 =
1200        (0xFFD740Au32) as *mut u8;
1201
1202    /// External Real-time Clock alarm 2 minutes value (binary coded decimal) [0xFFD740B: EXTRTCA2MIN]
1203    pub const EXTERNAL_REAL_TIME_CLOCK_ALARM_2_MINUTES_VALUE: *mut u8 = (0xFFD740Bu32) as *mut u8;
1204
1205    /// External Real-time Clock alarm 2 hours value (binary coded decimal) [0xFFD740C: EXTRTCA2HOUR]
1206    pub const EXTERNAL_REAL_TIME_CLOCK_ALARM_2_HOURS_VALUE: *mut u8 = (0xFFD740Cu32) as *mut u8;
1207
1208    /// External Real-time Clock alarm 2 day of week / day of month value (binary coded decimal) [0xFFD740D: EXTRTCA2DAYDATE]
1209    pub const EXTERNAL_REAL_TIME_CLOCK_ALARM_2_DAY_OF_WEEK__SLASH__DAY_OF_MONTH_VALUE: *mut u8 =
1210        (0xFFD740Du32) as *mut u8;
1211
1212    /// External Real-time Clock control [0xFFD740E: EXTRTCCTRL]
1213    pub const EXTERNAL_REAL_TIME_CLOCK_CONTROL: *mut u8 = (0xFFD740Eu32) as *mut u8;
1214
1215    /// External Real-time Clock control/status register [0xFFD740F: EXTRTCST]
1216    pub const EXTERNAL_REAL_TIME_CLOCK_CONTROL_SLASH_STATUS_REGISTER: *mut u8 =
1217        (0xFFD740Fu32) as *mut u8;
1218
1219    /// External Real-time Clock aging offset (do not modify) [0xFFD7410: EXTRTCAGINGOFS]
1220    pub const EXTERNAL_REAL_TIME_CLOCK_AGING_OFFSET: *mut u8 = (0xFFD7410u32) as *mut u8;
1221
1222    /// External Real-time Clock temperature (MSB) [0xFFD7411: EXTRTCTEMPMSB]
1223    pub const EXTERNAL_REAL_TIME_CLOCK_TEMPERATURE: *mut u8 = (0xFFD7411u32) as *mut u8;
1224}
1225
1226pub mod sd {
1227
1228    /// SD controller status/command [0xD680: CMDANDSTAT]
1229    pub const SD_CONTROLLER_STATUS_SLASH_COMMAND: *mut u8 = (0xD680) as *mut u8;
1230
1231    /// WRITE ONLY set fill byte for use in fill mode, instead of SD buffer data [0xD686: FILLVAL]
1232    pub const WRITE_ONLY_SET_FILL_BYTE_FOR_USE_IN_FILL_MODE: *mut u8 = (0xD686) as *mut u8;
1233
1234    /// Set/read SD card sd_handshake signal [0xD689: HNDSHK]
1235    pub const SET_SLASH_READ_SD_CARD_SD_HANDSHAKE_SIGNAL_MASK: u8 = 0b00000100;
1236
1237    /// SD Card Data Ready indication [0xD689: DRDY]
1238    pub const SD_CARD_DATA_READY_INDICATION_MASK: u8 = 0b00001000;
1239
1240    /// Set to swap floppy drive 0 (the internal drive) and drive 1 (the drive on the 2nd position on the internal floppy cable). [0xD689: FDCSWAP]
1241    pub const SET_TO_SWAP_FLOPPY_DRIVE_0_MASK: u8 = 0b00100000;
1242
1243    /// Set to switch sector buffer to view SD card direct access, clear for access to the F011 FDC sector buffer. [0xD689: BUFFSEL]
1244    pub const SET_TO_SWITCH_SECTOR_BUFFER_TO_VIEW_SD_CARD_DIRECT_ACCESS_MASK: u8 = 0b10000000;
1245
1246    /// Select floppy encoding (0=MFM, 1=RLL2,7, F=Raw encoding) [0xD6AE: FDC]
1247    pub const SELECT_FLOPPY_ENCODING_MASK: u8 = 0b00001111;
1248
1249    /// Automatically select DD or HD decoder for last sector display [0xD6AE: AUTO]
1250    pub const AUTOMATICALLY_SELECT_DD_OR_HD_DECODER_FOR_LAST_SECTOR_DISPLAY_MASK: u8 = 0b00010000;
1251
1252    /// Enable automatic variable speed selection for floppy controller using Track Information Blocks on MEGA65 HD floppies [0xD6AE: FDC]
1253    pub const ENABLE_AUTOMATIC_VARIABLE_SPEED_SELECTION_FOR_FLOPPY_CONTROLLER_USING_TRACK_INFORMATION_BLOCKS_ON_MEGA65_HD_FLOPPIES_MASK: u8 = 0b00100000;
1254
1255    /// Select HD decoder for last sector display [0xD6AE: FDC]
1256    pub const SELECT_HD_DECODER_FOR_LAST_SECTOR_DISPLAY_MASK: u8 = 0b01000000;
1257
1258    /// Enable use of Track Info Block settings [0xD6AE: FDC]
1259    pub const ENABLE_USE_OF_TRACK_INFO_BLOCK_SETTINGS_MASK: u8 = 0b10000000;
1260
1261    /// Manually set f011_rsector_found signal (indented for virtual F011 mode only) [0xD6AF: VR]
1262    pub const MANUALLY_SET_F011_RSECTOR_FOUND_SIGNAL_MASK: u8 = 0b00000001;
1263
1264    /// Manually set f011_wsector_found signal (indented for virtual F011 mode only) [0xD6AF: VW]
1265    pub const MANUALLY_SET_F011_WSECTOR_FOUND_SIGNAL_MASK: u8 = 0b00000010;
1266
1267    /// Manually set f011_eq_inhibit signal (indented for virtual F011 mode only) [0xD6AF: VEQ]
1268    pub const MANUALLY_SET_F011_EQ_INHIBIT_SIGNAL_MASK: u8 = 0b00000100;
1269
1270    /// Manually set f011_rnf signal (indented for virtual F011 mode only) [0xD6AF: VRNF]
1271    pub const MANUALLY_SET_F011_RNF_SIGNAL_MASK: u8 = 0b00001000;
1272
1273    /// Manually set f011_drq signal (indented for virtual F011 mode only) [0xD6AF: VDRQ]
1274    pub const MANUALLY_SET_F011_DRQ_SIGNAL_MASK: u8 = 0b00010000;
1275
1276    /// Manually set f011_lost signal (indented for virtual F011 mode only) [0xD6AF: VLOST]
1277    pub const MANUALLY_SET_F011_LOST_SIGNAL_MASK: u8 = 0b00100000;
1278}
1279
1280pub mod sdfdc {
1281
1282    /// F011 drive 0 disk image is D64 mega image if set (otherwise 800KiB 1581 or D65 image) [0xD68A: D0D64]
1283    pub const F011_DRIVE_0_DISK_IMAGE_IS_D64_MEGA_IMAGE_IF_SET_MASK: u8 = 0b01000000;
1284
1285    /// F011 drive 1 disk image is D64 image if set (otherwise 800KiB 1581 or D65 image) [0xD68A: D1D64]
1286    pub const F011_DRIVE_1_DISK_IMAGE_IS_D64_IMAGE_IF_SET_MASK: u8 = 0b10000000;
1287
1288    /// F011 drive 0 use disk image if set, otherwise use real floppy drive. [0xD68B: D0IMG]
1289    pub const F011_DRIVE_0_USE_DISK_IMAGE_IF_SET_MASK: u8 = 0b00000001;
1290
1291    /// F011 drive 0 media present [0xD68B: D0P]
1292    pub const F011_DRIVE_0_MEDIA_PRESENT_MASK: u8 = 0b00000010;
1293
1294    /// Write enable F011 drive 0 [0xD68B: D0WP]
1295    pub const WRITE_ENABLE_F011_DRIVE_0_MASK: u8 = 0b00000100;
1296
1297    /// F011 drive 1 use disk image if set, otherwise use real floppy drive. [0xD68B: D1IMG]
1298    pub const F011_DRIVE_1_USE_DISK_IMAGE_IF_SET_MASK: u8 = 0b00001000;
1299
1300    /// F011 drive 1 media present [0xD68B: D1P]
1301    pub const F011_DRIVE_1_MEDIA_PRESENT_MASK: u8 = 0b00010000;
1302
1303    /// Write enable F011 drive 1 [0xD68B: D1WP]
1304    pub const WRITE_ENABLE_F011_DRIVE_1_MASK: u8 = 0b00100000;
1305
1306    /// F011 drive 0 disk image is D65 image if set (otherwise 800KiB 1581 image) [0xD68B: D0MD]
1307    pub const F011_DRIVE_0_DISK_IMAGE_IS_D65_IMAGE_IF_SET_MASK: u8 = 0b01000000;
1308
1309    /// F011 drive 1 disk image is D65 image if set (otherwise 800KiB 1581 image) [0xD68B: D1MD]
1310    pub const F011_DRIVE_1_DISK_IMAGE_IS_D65_IMAGE_IF_SET_MASK: u8 = 0b10000000;
1311
1312    /// Use real floppy drive for drive 0 if set (read-only, except for from hypervisor) [0xD6A1: USEREAL0]
1313    pub const USE_REAL_FLOPPY_DRIVE_FOR_DRIVE_0_IF_SET_MASK: u8 = 0b00000001;
1314
1315    /// Read next sector under head if set, ignoring the requested side, track and sector number. [0xD6A1: TARGANY]
1316    pub const READ_NEXT_SECTOR_UNDER_HEAD_IF_SET_MASK: u8 = 0b00000010;
1317
1318    /// Use real floppy drive for drive 1 if set (read-only, except for from hypervisor) [0xD6A1: USEREAL1]
1319    pub const USE_REAL_FLOPPY_DRIVE_FOR_DRIVE_1_IF_SET_MASK: u8 = 0b00000100;
1320
1321    /// Disable floppy spinning and tracking for SD card operations. [0xD6A1: SILENT]
1322    pub const DISABLE_FLOPPY_SPINNING_AND_TRACKING_FOR_SD_CARD_OPERATIONS_MASK: u8 = 0b00001000;
1323}
1324
1325pub mod sid {
1326
1327    /// Voice X Frequency Low [0xD400: VOICE1]
1328    pub const VOICE_X_FREQUENCY_LOW: *mut u8 = (0xD400) as *mut u8;
1329
1330    /// Voice X Frequency High [0xD401: VOICE1]
1331    pub const VOICE_X_FREQUENCY_HIGH: *mut u8 = (0xD401) as *mut u8;
1332
1333    /// Voice X Pulse Waveform Width Low [0xD402: VOICE1]
1334    pub const VOICE_X_PULSE_WAVEFORM_WIDTH_LOW: *mut u8 = (0xD402) as *mut u8;
1335
1336    /// Voice X Pulse Waveform Width High [0xD403: VOICE1]
1337    pub const VOICE_X_PULSE_WAVEFORM_WIDTH_HIGH_MASK: u8 = 0b00001111;
1338
1339    /// Unused [0xD403: VOICE1]
1340    pub const UNUSED_MASK: u8 = 0b00001111;
1341
1342    /// Voice X Gate Bit (1 = Start, 0 = Release) [0xD404: VOICE1]
1343    pub const VOICE_X_GATE_BIT_MASK: u8 = 0b00000001;
1344
1345    /// Voice 1 Synchronize Osc. 1 with Osc. 3 Frequency [0xD404: VOICE1]
1346    pub const VOICE_1_SYNCHRONIZE_OSC_MASK: u8 = 0b00000010;
1347
1348    /// Voice 1 Ring Modulate Osc. 1 with Osc. 3 Output [0xD404: VOICE1]
1349    pub const VOICE_1_RING_MODULATE_OSC_MASK: u8 = 0b00000100;
1350
1351    /// Voice X Test Bit - Disable Oscillator [0xD404: VOICE1]
1352    pub const VOICE_X_TEST_BIT___DISABLE_OSCILLATOR_MASK: u8 = 0b00001000;
1353
1354    /// Voice X Triangle Waveform [0xD404: VOICE1]
1355    pub const VOICE_X_TRIANGLE_WAVEFORM_MASK: u8 = 0b00010000;
1356
1357    /// Voice X Sawtooth Waveform [0xD404: VOICE1]
1358    pub const VOICE_X_SAWTOOTH_WAVEFORM_MASK: u8 = 0b00100000;
1359
1360    /// Voice X Pulse Waveform [0xD404: VOICE1]
1361    pub const VOICE_X_PULSE_WAVEFORM_MASK: u8 = 0b01000000;
1362
1363    /// Voice X Control Random Noise Waveform [0xD404: VOICE1]
1364    pub const VOICE_X_CONTROL_RANDOM_NOISE_WAVEFORM_MASK: u8 = 0b10000000;
1365
1366    /// Envelope Generator X Decay Cycle Duration [0xD405: ENV1]
1367    pub const ENVELOPE_GENERATOR_X_DECAY_CYCLE_DURATION_MASK: u8 = 0b00001111;
1368
1369    /// Envelope Generator X Attack Cycle Duration [0xD405: ENV1]
1370    pub const ENVELOPE_GENERATOR_X_ATTACK_CYCLE_DURATION_MASK: u8 = 0b00001111;
1371
1372    /// Envelope Generator X Release Cycle Duration [0xD406: ENV1]
1373    pub const ENVELOPE_GENERATOR_X_RELEASE_CYCLE_DURATION_MASK: u8 = 0b00001111;
1374
1375    /// Envelope Generator X Sustain Cycle Duration [0xD406: ENV1]
1376    pub const ENVELOPE_GENERATOR_X_SUSTAIN_CYCLE_DURATION_MASK: u8 = 0b00001111;
1377
1378    /// @VOICEX!FRQLO [0xD407: VOICE2]
1379    pub const VOICEX_FRQLO: *mut u8 = (0xD407) as *mut u8;
1380
1381    /// @VOICEX!FRQHI [0xD408: VOICE2]
1382    pub const VOICEX_FRQHI: *mut u8 = (0xD408) as *mut u8;
1383
1384    /// @VOICEX!PWLO [0xD409: VOICE2]
1385    pub const VOICEX_PWLO: *mut u8 = (0xD409) as *mut u8;
1386
1387    /// @VOICEX!PWHI [0xD40A: VOICE2]
1388    pub const VOICEX_PWHI_MASK: u8 = 0b00001111;
1389
1390    /// @VOICEX!UNSD [0xD40A: VOICE2]
1391    pub const VOICEX_UNSD_MASK: u8 = 0b00001111;
1392
1393    /// @VOICEX!CTRLGATE [0xD40B: VOICE2]
1394    pub const VOICEX_CTRLGATE_MASK: u8 = 0b00000001;
1395
1396    /// Voice 2 Synchronize Osc. 2 with Osc. 1 Frequency [0xD40B: VOICE2]
1397    pub const VOICE_2_SYNCHRONIZE_OSC_MASK: u8 = 0b00000010;
1398
1399    /// Voice 2 Ring Modulate Osc. 2 with Osc. 1 Output [0xD40B: VOICE2]
1400    pub const VOICE_2_RING_MODULATE_OSC_MASK: u8 = 0b00000100;
1401
1402    /// @VOICEX!CTRLTST [0xD40B: VOICE2]
1403    pub const VOICEX_CTRLTST_MASK: u8 = 0b00001000;
1404
1405    /// @VOICEX!CTRLTRI [0xD40B: VOICE2]
1406    pub const VOICEX_CTRLTRI_MASK: u8 = 0b00010000;
1407
1408    /// @VOICEX!CTRLSAW [0xD40B: VOICE2]
1409    pub const VOICEX_CTRLSAW_MASK: u8 = 0b00100000;
1410
1411    /// @VOICEX!CTRLPUL [0xD40B: VOICE2]
1412    pub const VOICEX_CTRLPUL_MASK: u8 = 0b01000000;
1413
1414    /// @VOICEX!CTRLRNW [0xD40B: VOICE2]
1415    pub const VOICEX_CTRLRNW_MASK: u8 = 0b10000000;
1416
1417    /// @ENVX!DECDUR [0xD40C: ENV2]
1418    pub const ENVX_DECDUR_MASK: u8 = 0b00001111;
1419
1420    /// @ENVX!ATTDUR [0xD40C: ENV2]
1421    pub const ENVX_ATTDUR_MASK: u8 = 0b00001111;
1422
1423    /// @ENVX!RELDUR [0xD40D: ENV2]
1424    pub const ENVX_RELDUR_MASK: u8 = 0b00001111;
1425
1426    /// @ENVX!SUSDUR [0xD40D: ENV2]
1427    pub const ENVX_SUSDUR_MASK: u8 = 0b00001111;
1428
1429    /// Voice 3 Synchronize Osc. 3 with Osc. 2 Frequency [0xD412: VOICE3]
1430    pub const VOICE_3_SYNCHRONIZE_OSC_MASK: u8 = 0b00000010;
1431
1432    /// Voice 3 Ring Modulate Osc. 3 with Osc. 2 Output [0xD412: VOICE3]
1433    pub const VOICE_3_RING_MODULATE_OSC_MASK: u8 = 0b00000100;
1434
1435    /// Filter Cutoff Frequency Low [0xD415: FLTR]
1436    pub const FILTER_CUTOFF_FREQUENCY_LOW: *mut u8 = (0xD415) as *mut u8;
1437
1438    /// Filter Cutoff Frequency High [0xD416: FLTR]
1439    pub const FILTER_CUTOFF_FREQUENCY_HIGH: *mut u8 = (0xD416) as *mut u8;
1440
1441    /// @FLTR!VXOUT [0xD417: FLTR]
1442    pub const FLTR_VXOUT_MASK: u8 = 0b00000001;
1443
1444    /// Filter Voice X Output [0xD417: FLTR]
1445    pub const FILTER_VOICE_X_OUTPUT_MASK: u8 = 0b00000100;
1446
1447    /// Filter External Input [0xD417: FLTR]
1448    pub const FILTER_EXTERNAL_INPUT_MASK: u8 = 0b00001000;
1449
1450    /// Filter Resonance [0xD417: FLTR]
1451    pub const FILTER_RESONANCE_MASK: u8 = 0b00001111;
1452
1453    /// Filter Output Volume [0xD418: FLTR]
1454    pub const FILTER_OUTPUT_VOLUME_MASK: u8 = 0b00001111;
1455
1456    /// Filter Low-Pass Mode [0xD418: FLTR]
1457    pub const FILTER_LOW_PASS_MODE_MASK: u8 = 0b00010000;
1458
1459    /// Filter Band-Pass Mode [0xD418: FLTR]
1460    pub const FILTER_BAND_PASS_MODE_MASK: u8 = 0b00100000;
1461
1462    /// Filter High-Pass Mode [0xD418: FLTR]
1463    pub const FILTER_HIGH_PASS_MODE_MASK: u8 = 0b01000000;
1464
1465    /// Filter Cut-Off Voice 3 Output (1 = off) [0xD418: FLTR]
1466    pub const FILTER_CUT_OFF_VOICE_3_OUTPUT_MASK: u8 = 0b10000000;
1467
1468    /// Analog/Digital Converter: Game Paddle 1 (0-255) [0xD419: PADDLE1]
1469    pub const ANALOG_SLASH_DIGITAL_CONVERTER: *mut u8 = (0xD419) as *mut u8;
1470
1471    /// Analog/Digital Converter Game Paddle 2 (0-255) [0xD41A: PADDLE2]
1472    pub const ANALOG_SLASH_DIGITAL_CONVERTER_GAME_PADDLE_2: *mut u8 = (0xD41A) as *mut u8;
1473
1474    /// Oscillator 3 Random Number Generator [0xD41B: OSC3RNG]
1475    pub const OSCILLATOR_3_RANDOM_NUMBER_GENERATOR: *mut u8 = (0xD41B) as *mut u8;
1476
1477    /// Envelope Generator 3 Output [0xD41C: ENV3OUT]
1478    pub const ENVELOPE_GENERATOR_3_OUTPUT: *mut u8 = (0xD41C) as *mut u8;
1479
1480    /// Select SID mode: 0=6581, 1=8580 [0xD63C: SIDMODE]
1481    pub const SELECT_SID_MODE_MASK: u8 = 0b00001111;
1482}
1483
1484pub mod sysctl {
1485
1486    /// Mute digital video audio (MEGA65 R2 only) [0xD61A: AUDMUTE]
1487    pub const MUTE_DIGITAL_VIDEO_AUDIO_MASK: u8 = 0b00000001;
1488
1489    /// Control digital video as DVI (disables audio) [0xD61A: DVI]
1490    pub const CONTROL_DIGITAL_VIDEO_AS_DVI_MASK: u8 = 0b00000010;
1491
1492    /// Visualise audio samples (DEBUG) [0xD61A: AUDDBG]
1493    pub const VISUALISE_AUDIO_SAMPLES_MASK: u8 = 0b00000100;
1494
1495    /// Select 48KHz or 44.1KHz digital video audio sample rate [0xD61A: AUD48K]
1496    pub const SELECT_48KHZ_OR_44_MASK: u8 = 0b00001000;
1497
1498    /// Control LED next to U1 on mother board [0xD61A: LED]
1499    pub const CONTROL_LED_NEXT_TO_U1_ON_MOTHER_BOARD_MASK: u8 = 0b00010000;
1500
1501    /// Invert digital video audio sample values [0xD61A: AUDINV]
1502    pub const INVERT_DIGITAL_VIDEO_AUDIO_SAMPLE_VALUES_MASK: u8 = 0b10000000;
1503}
1504
1505pub mod touch {
1506
1507    /// Touch event 1 is valid [0xD6B0: EV1]
1508    pub const TOUCH_EVENT_1_IS_VALID_MASK: u8 = 0b00000001;
1509
1510    /// Touch event 2 is valid [0xD6B0: EV2]
1511    pub const TOUCH_EVENT_2_IS_VALID_MASK: u8 = 0b00000010;
1512
1513    /// Touch event 1 up/down state [0xD6B0: UPDN1]
1514    pub const TOUCH_EVENT_1_UP_SLASH_DOWN_STATE_MASK: u8 = 0b00000011;
1515
1516    /// Touch event 2 up/down state [0xD6B0: UPDN2]
1517    pub const TOUCH_EVENT_2_UP_SLASH_DOWN_STATE_MASK: u8 = 0b00000011;
1518
1519    /// Invert horizontal axis [0xD6B0: XINV]
1520    pub const INVERT_HORIZONTAL_AXIS_MASK: u8 = 0b01000000;
1521
1522    /// Invert vertical axis [0xD6B0: YINV]
1523    pub const INVERT_VERTICAL_AXIS_MASK: u8 = 0b10000000;
1524
1525    /// Touch pad X scaling LSB [0xD6B1: CALXSCALELSB]
1526    pub const TOUCH_PAD_X_SCALING_LSB: *mut u8 = (0xD6B1) as *mut u8;
1527
1528    /// Touch pad X scaling MSB [0xD6B2: CALXSCALEMSB]
1529    pub const TOUCH_PAD_X_SCALING_MSB: *mut u8 = (0xD6B2) as *mut u8;
1530
1531    /// Touch pad Y scaling LSB [0xD6B3: CALYSCALELSB]
1532    pub const TOUCH_PAD_Y_SCALING_LSB: *mut u8 = (0xD6B3) as *mut u8;
1533
1534    /// Touch pad Y scaling MSB [0xD6B4: CALYSCALEMSB]
1535    pub const TOUCH_PAD_Y_SCALING_MSB: *mut u8 = (0xD6B4) as *mut u8;
1536
1537    /// Touch pad X delta LSB [0xD6B5: CALXDELTALSB]
1538    pub const TOUCH_PAD_X_DELTA_LSB: *mut u8 = (0xD6B5) as *mut u8;
1539
1540    /// Touch pad Y delta LSB [0xD6B7: CALYDELTALSB]
1541    pub const TOUCH_PAD_Y_DELTA_LSB: *mut u8 = (0xD6B7) as *mut u8;
1542
1543    /// Touch pad Y delta MSB [0xD6B8: CALYDELTAMSB]
1544    pub const TOUCH_PAD_Y_DELTA_MSB: *mut u8 = (0xD6B8) as *mut u8;
1545
1546    /// Touch pad touch #1 X LSB [0xD6B9: TOUCH1XLSB]
1547    pub const TOUCH_PAD_TOUCH_1_X_LSB: *mut u8 = (0xD6B9) as *mut u8;
1548
1549    /// Touch pad touch #1 Y LSB [0xD6BA: TOUCH1YLSB]
1550    pub const TOUCH_PAD_TOUCH_1_Y_LSB: *mut u8 = (0xD6BA) as *mut u8;
1551
1552    /// Touch pad touch \#1 X MSBs [0xD6BB: TOUCH1XMSB]
1553    pub const TOUCH_PAD_TOUCH_1_X_MSBS_MASK: u8 = 0b00000011;
1554
1555    /// Touch pad touch \#1 Y MSBs [0xD6BB: TOUCH1YMSB]
1556    pub const TOUCH_PAD_TOUCH_1_Y_MSBS_MASK: u8 = 0b00000011;
1557
1558    /// Touch pad touch \#2 X LSB [0xD6BC: TOUCH2XLSB]
1559    pub const TOUCH_PAD_TOUCH_2_X_LSB: *mut u8 = (0xD6BC) as *mut u8;
1560
1561    /// Touch pad touch \#2 Y LSB [0xD6BD: TOUCH2YLSB]
1562    pub const TOUCH_PAD_TOUCH_2_Y_LSB: *mut u8 = (0xD6BD) as *mut u8;
1563
1564    /// Touch pad touch \#2 X MSBs [0xD6BE: TOUCH2XMSB]
1565    pub const TOUCH_PAD_TOUCH_2_X_MSBS_MASK: u8 = 0b00000011;
1566
1567    /// Touch pad touch \#2 Y MSBs [0xD6BE: TOUCH2YMSB]
1568    pub const TOUCH_PAD_TOUCH_2_Y_MSBS_MASK: u8 = 0b00000011;
1569
1570    /// Touch pad gesture directions (left,right,up,down) [0xD6C0: GESTUREDIR]
1571    pub const TOUCH_PAD_GESTURE_DIRECTIONS_MASK: u8 = 0b00001111;
1572
1573    /// Touch pad gesture ID [0xD6C0: GESTUREID]
1574    pub const TOUCH_PAD_GESTURE_ID_MASK: u8 = 0b00001111;
1575}
1576
1577pub mod tough {
1578
1579    /// Touch pad X delta MSB [0xD6B6: CALXDELTAMSB]
1580    pub const TOUCH_PAD_X_DELTA_MSB: *mut u8 = (0xD6B6) as *mut u8;
1581}
1582
1583pub mod uart {
1584
1585    /// UART data register (read or write) [0xD600: DATA]
1586    pub const UART_DATA_REGISTER: *mut u8 = (0xD600) as *mut u8;
1587
1588    /// UART RX byte ready flag (clear by reading \$D600) [0xD601: RXRDY]
1589    pub const UART_RX_BYTE_READY_FLAG_MASK: u8 = 0b00000001;
1590
1591    /// UART RX overrun flag (clear by reading \$D600) [0xD601: RXOVRRUN]
1592    pub const UART_RX_OVERRUN_FLAG_MASK: u8 = 0b00000010;
1593
1594    /// UART RX parity error flag (clear by reading \$D600) [0xD601: PTYERR]
1595    pub const UART_RX_PARITY_ERROR_FLAG_MASK: u8 = 0b00000100;
1596
1597    /// UART RX framing error flag (clear by reading \$D600) [0xD601: FRMERR]
1598    pub const UART_RX_FRAMING_ERROR_FLAG_MASK: u8 = 0b00001000;
1599
1600    /// UART Parity: 1=even, 0=odd [0xD602: PTYEVEN]
1601    pub const UART_PARITY_MASK: u8 = 0b00000001;
1602
1603    /// UART Parity enable: 1=enabled [0xD602: PTYEN]
1604    pub const UART_PARITY_ENABLE_MASK: u8 = 0b00000010;
1605
1606    /// UART character size: 00=8, 01=7, 10=6, 11=5 bits per byte [0xD602: CHARSZ]
1607    pub const UART_CHARACTER_SIZE_MASK: u8 = 0b00000011;
1608
1609    /// UART synchronisation mode flags (00=RX \& TX both async, 01=RX sync, TX async, 1x=TX sync, RX async (unused on the MEGA65) [0xD602: SYNCMOD]
1610    pub const UART_SYNCHRONISATION_MODE_FLAGS_MASK: u8 = 0b00000011;
1611
1612    /// UART enable receive [0xD602: RXEN]
1613    pub const UART_ENABLE_RECEIVE_MASK: u8 = 0b01000000;
1614
1615    /// UART enable transmit [0xD602: TXEN]
1616    pub const UART_ENABLE_TRANSMIT_MASK: u8 = 0b10000000;
1617
1618    /// UART baud rate divisor (16 bit). Baud rate = 7.09375MHz / DIVISOR, unless MEGA65 fast UART mode is enabled, in which case baud rate = 80MHz / DIVISOR [0xD603: DIVISOR]
1619    pub const UART_BAUD_RATE_DIVISOR: *mut u8 = (0xD603) as *mut u8;
1620
1621    /// UART interrupt mask: NMI on RX (not yet implemented on the MEGA65) [0xD605: IMRXNMI]
1622    pub const UART_INTERRUPT_MASK_MASK: u8 = 0b00010000;
1623
1624    /// UART interrupt flag: NMI on RX (not yet implemented on the MEGA65) [0xD606: IFRXNMI]
1625    pub const UART_INTERRUPT_FLAG_MASK: u8 = 0b00010000;
1626
1627    /// C65 capslock key sense [0xD607: CAPLOCK]
1628    pub const C65_CAPSLOCK_KEY_SENSE_MASK: u8 = 0b00000001;
1629
1630    /// C65 keyboard column 8 select [0xD607: KEYCOL8]
1631    pub const C65_KEYBOARD_COLUMN_8_SELECT_MASK: u8 = 0b00000010;
1632
1633    /// C65 keyboard extra lines Data Direction Register (DDR) [0xD608: PORTEDDR]
1634    pub const C65_KEYBOARD_EXTRA_LINES_DATA_DIRECTION_REGISTER_MASK: u8 = 0b00000011;
1635
1636    /// C65 UART BAUD clock source: 1 = 7.09375MHz, 0 = 80MHz (VIC-IV pixel clock) [0xD609: UFAST]
1637    pub const C65_UART_BAUD_CLOCK_SOURCE_MASK: u8 = 0b00000001;
1638
1639    /// PMOD port A on FPGA board (data) (Nexys4 boards only) [0xD60B: PORTF]
1640    pub const PMOD_PORT_A_ON_FPGA_BOARD_MASK: u8 = 0b00111111;
1641
1642    /// Display hardware zoom of region under first touch point always [0xD60B: OSKZON]
1643    pub const DISPLAY_HARDWARE_ZOOM_OF_REGION_UNDER_FIRST_TOUCH_POINT_ALWAYS_MASK: u8 = 0b01000000;
1644
1645    /// Display hardware zoom of region under first touch point for on-screen keyboard [0xD60B: OSKZEN]
1646    pub const DISPLAY_HARDWARE_ZOOM_OF_REGION_UNDER_FIRST_TOUCH_POINT_FOR_ON_SCREEN_KEYBOARD_MASK: u8 = 0b10000000;
1647
1648    /// On Screen Keyboard (OSK) Zoom Control Data Direction Register (DDR). Must be set to output to control these features. [0xD60C: PORTFDDR]
1649    pub const ON_SCREEN_KEYBOARD_MASK: u8 = 0b00000011;
1650
1651    /// SD card MOSI/MISO [0xD60D: SDDATA]
1652    pub const SD_CARD_MOSI_SLASH_MISO_MASK: u8 = 0b00000100;
1653
1654    /// SD card SCLK [0xD60D: SDCLK]
1655    pub const SD_CARD_SCLK_MASK: u8 = 0b00001000;
1656
1657    /// SD card CS_BO [0xD60D: SDCS]
1658    pub const SD_CARD_CS_BO_MASK: u8 = 0b00010000;
1659
1660    /// Enable SD card bitbash mode [0xD60D: SDBSH]
1661    pub const ENABLE_SD_CARD_BITBASH_MODE_MASK: u8 = 0b00100000;
1662
1663    /// HDMI I2C control interface SDA data line [0xD60D: HDSDA]
1664    pub const HDMI_I2C_CONTROL_INTERFACE_SDA_DATA_LINE_MASK: u8 = 0b01000000;
1665
1666    /// HDMI I2C control interface SCL clock [0xD60D: HDSCL]
1667    pub const HDMI_I2C_CONTROL_INTERFACE_SCL_CLOCK_MASK: u8 = 0b10000000;
1668
1669    /// Data Direction Register (DDR) for \$D60D bit bashing port. [0xD60E: BASHDDR]
1670    pub const DATA_DIRECTION_REGISTER: *mut u8 = (0xD60E) as *mut u8;
1671
1672    /// Directly read C65 Cursor left key [0xD60F: KEYLEFT]
1673    pub const DIRECTLY_READ_C65_CURSOR_LEFT_KEY_MASK: u8 = 0b00000001;
1674
1675    /// Directly read C65 Cursor up key [0xD60F: KEYUP]
1676    pub const DIRECTLY_READ_C65_CURSOR_UP_KEY_MASK: u8 = 0b00000010;
1677
1678    /// Set to 1 if the MEGA65 is running on real hardware, set to 0 if emulated (Xemu) or simulated (ghdl) [0xD60F: REALHW]
1679    pub const SET_TO_1_IF_THE_MEGA65_IS_RUNNING_ON_REAL_HARDWARE_MASK: u8 = 0b00100000;
1680
1681    /// Light or heavy dimming of background material behind on-screen keyboard [0xD60F: OSKDIM]
1682    pub const LIGHT_OR_HEAVY_DIMMING_OF_BACKGROUND_MATERIAL_BEHIND_ON_SCREEN_KEYBOARD_MASK: u8 =
1683        0b01000000;
1684
1685    /// Enable accessible keyboard input via joystick port 2 fire button [0xD60F: ACCESSKEY]
1686    pub const ENABLE_ACCESSIBLE_KEYBOARD_INPUT_VIA_JOYSTICK_PORT_2_FIRE_BUTTON_MASK: u8 =
1687        0b10000000;
1688
1689    /// Last key press as ASCII (hardware accelerated keyboard scanner). Write to clear event ready for next. [0xD610: ASCIIKEY]
1690    pub const LAST_KEY_PRESS_AS_ASCII: *mut u8 = (0xD610) as *mut u8;
1691
1692    /// Right shift key state (hardware accelerated keyboard scanner). [0xD611: MRSHFT]
1693    pub const RIGHT_SHIFT_KEY_STATE_MASK: u8 = 0b00000001;
1694
1695    /// Left shift key state (hardware accelerated keyboard scanner). [0xD611: MLSHFT]
1696    pub const LEFT_SHIFT_KEY_STATE_MASK: u8 = 0b00000010;
1697
1698    /// CTRL key state (hardware accelerated keyboard scanner). [0xD611: MCTRL]
1699    pub const CTRL_KEY_STATE_MASK: u8 = 0b00000100;
1700
1701    /// MEGA/C= key state (hardware accelerated keyboard scanner). [0xD611: MMEGA]
1702    pub const MEGA_SLASH_C_MASK: u8 = 0b00001000;
1703
1704    /// ALT key state (hardware accelerated keyboard scanner). [0xD611: MALT]
1705    pub const ALT_KEY_STATE_MASK: u8 = 0b00010000;
1706
1707    /// NOSCRL key state (hardware accelerated keyboard scanner). [0xD611: MSCRL]
1708    pub const NOSCRL_KEY_STATE_MASK: u8 = 0b00100000;
1709
1710    /// CAPS LOCK key state (hardware accelerated keyboard scanner). [0xD611: MCAPS]
1711    pub const CAPS_LOCK_KEY_STATE_MASK: u8 = 0b01000000;
1712
1713    /// Enable widget board keyboard/joystick input [0xD612: WGTKEY]
1714    pub const ENABLE_WIDGET_BOARD_KEYBOARD_SLASH_JOYSTICK_INPUT_MASK: u8 = 0b00000001;
1715
1716    /// Enable ps2 keyboard/joystick input [0xD612: PS2KEY]
1717    pub const ENABLE_PS2_KEYBOARD_SLASH_JOYSTICK_INPUT_MASK: u8 = 0b00000010;
1718
1719    /// Enable physical keyboard input [0xD612: PHYKEY]
1720    pub const ENABLE_PHYSICAL_KEYBOARD_INPUT_MASK: u8 = 0b00000100;
1721
1722    /// Enable virtual/snythetic keyboard input [0xD612: VRTKEY]
1723    pub const ENABLE_VIRTUAL_SLASH_SNYTHETIC_KEYBOARD_INPUT_MASK: u8 = 0b00001000;
1724
1725    /// Debug OSK overlay (WRITE ONLY) [0xD612: OSKDEBUG]
1726    pub const DEBUG_OSK_OVERLAY_MASK: u8 = 0b00010000;
1727
1728    /// Enable PS/2 / USB keyboard simulated joystick input [0xD612: PS2JOY]
1729    pub const ENABLE_PS_SLASH_2__SLASH__USB_KEYBOARD_SIMULATED_JOYSTICK_INPUT_MASK: u8 = 0b00010000;
1730
1731    /// Exchange joystick ports 1 \& 2 [0xD612: JOYSWAP]
1732    pub const EXCHANGE_JOYSTICK_PORTS_1__AND__2_MASK: u8 = 0b00100000;
1733
1734    /// Rotate inputs of joystick A by 180 degrees (for left handed use) [0xD612: LJOYA]
1735    pub const ROTATE_INPUTS_OF_JOYSTICK_A_BY_180_DEGREES_MASK: u8 = 0b01000000;
1736
1737    /// Rotate inputs of joystick B by 180 degrees (for left handed use) [0xD612: LJOYB]
1738    pub const ROTATE_INPUTS_OF_JOYSTICK_B_BY_180_DEGREES_MASK: u8 = 0b10000000;
1739
1740    /// Set to \$7F for no key down, else specify virtual key press. [0xD615: VIRTKEY1]
1741    pub const SET_TO_0X7F_FOR_NO_KEY_DOWN_MASK: u8 = 0b01111111;
1742
1743    /// Enable display of on-screen keyboard composited overlay [0xD615: OSKEN]
1744    pub const ENABLE_DISPLAY_OF_ON_SCREEN_KEYBOARD_COMPOSITED_OVERLAY_MASK: u8 = 0b10000000;
1745
1746    /// Display alternate on-screen keyboard layout (typically dial pad for MEGA65 telephone) [0xD616: OSKALT]
1747    pub const DISPLAY_ALTERNATE_ON_SCREEN_KEYBOARD_LAYOUT_MASK: u8 = 0b10000000;
1748
1749    /// 1=Display on-screen keyboard at top, 0=Disply on-screen keyboard at bottom of screen. [0xD617: OSKTOP]
1750    pub const DISPLAY_ON_SCREEN_KEYBOARD_AT_TOP_MASK: u8 = 0b10000000;
1751
1752    /// Physical keyboard scan rate (\$00=50MHz, \$FF=~200KHz) [0xD618: KSCNRATE]
1753    pub const PHYSICAL_KEYBOARD_SCAN_RATE: *mut u8 = (0xD618) as *mut u8;
1754
1755    /// Last key press as PETSCII (hardware accelerated keyboard scanner). Write to clear event ready for next. [0xD619: PETSCIIKEY]
1756    pub const LAST_KEY_PRESS_AS_PETSCII: *mut u8 = (0xD619) as *mut u8;
1757
1758    /// System control flags (target specific) [0xD61A: SYSCTL]
1759    pub const SYSTEM_CONTROL_FLAGS: *mut u8 = (0xD61A) as *mut u8;
1760
1761    /// Keyboard LED register select (R,G,B channels x 4 = 0 to 11) [0xD61D: KEYLED]
1762    pub const KEYBOARD_LED_REGISTER_SELECT_MASK: u8 = 0b01111111;
1763
1764    /// Keyboard LED control enable [0xD61D: KEYLED]
1765    pub const KEYBOARD_LED_CONTROL_ENABLE_MASK: u8 = 0b10000000;
1766
1767    /// Keyboard LED register value (write only) [0xD61E: KEYLED]
1768    pub const KEYBOARD_LED_REGISTER_VALUE: *mut u8 = (0xD61E) as *mut u8;
1769
1770    /// Read Port A paddle X, without having to fiddle with SID/CIA settings. [0xD620: POTAX]
1771    pub const READ_PORT_A_PADDLE_X: *mut u8 = (0xD620) as *mut u8;
1772
1773    /// Read Port A paddle Y, without having to fiddle with SID/CIA settings. [0xD621: POTAY]
1774    pub const READ_PORT_A_PADDLE_Y: *mut u8 = (0xD621) as *mut u8;
1775
1776    /// Read Port B paddle X, without having to fiddle with SID/CIA settings. [0xD622: POTBX]
1777    pub const READ_PORT_B_PADDLE_X: *mut u8 = (0xD622) as *mut u8;
1778
1779    /// Read Port B paddle Y, without having to fiddle with SID/CIA settings. [0xD623: POTBY]
1780    pub const READ_PORT_B_PADDLE_Y: *mut u8 = (0xD623) as *mut u8;
1781
1782    /// J21 pins 1 -- 6, 9 -- 10 input/output values [0xD625: J21L]
1783    pub const J21_PINS_1___6: *mut u8 = (0xD625) as *mut u8;
1784
1785    /// J21 pins 11 -- 14 input/output values [0xD626: J21H]
1786    pub const J21_PINS_11___14_INPUT_SLASH_OUTPUT_VALUES: *mut u8 = (0xD626) as *mut u8;
1787
1788    /// J21 pins 11 -- 14 data direction register [0xD628: J21HDDR]
1789    pub const J21_PINS_11___14_DATA_DIRECTION_REGISTER: *mut u8 = (0xD628) as *mut u8;
1790
1791    /// MEGA65 model ID. Can be used to determine the model of MEGA65 a programme is running on, e.g., to enable touch controls on MEGAphone. [0xD629: M65MODEL]
1792    pub const MEGA65_MODEL_ID: *mut u8 = (0xD629) as *mut u8;
1793}
1794
1795pub mod vic2 {
1796
1797    /// sprite N horizontal position [0xD000: S0X]
1798    pub const SPRITE_N_HORIZONTAL_POSITION: *mut u8 = (0xD000) as *mut u8;
1799
1800    /// sprite N vertical position [0xD001: S0Y]
1801    pub const SPRITE_N_VERTICAL_POSITION: *mut u8 = (0xD001) as *mut u8;
1802
1803    /// @SNX [0xD002: S1X]
1804    pub const SNX: *mut u8 = (0xD002) as *mut u8;
1805
1806    /// @SNY [0xD003: S1Y]
1807    pub const SNY: *mut u8 = (0xD003) as *mut u8;
1808
1809    /// sprite horizontal position MSBs [0xD010: SXMSB]
1810    pub const SPRITE_HORIZONTAL_POSITION_MSBS: *mut u8 = (0xD010) as *mut u8;
1811
1812    /// 24/25 vertical smooth scroll [0xD011: YSCL]
1813    pub const SCROLL_VERTICAL_SMOOTH_24_SLASH_25_MASK: u8 = 0b00000111;
1814
1815    /// 24/25 row select [0xD011: RSEL]
1816    pub const SELECT_ROW_24_SLASH_25_MASK: u8 = 0b00001000;
1817
1818    /// disable display [0xD011: BLNK]
1819    pub const DISABLE_DISPLAY_MASK: u8 = 0b00010000;
1820
1821    /// bitmap mode [0xD011: BMM]
1822    pub const BITMAP_MODE_MASK: u8 = 0b00100000;
1823
1824    /// extended background mode [0xD011: ECM]
1825    pub const EXTENDED_BACKGROUND_MODE_MASK: u8 = 0b01000000;
1826
1827    /// raster compare bit 8 [0xD011: RC8]
1828    pub const RASTER_COMPARE_BIT_8_MASK: u8 = 0b10000000;
1829
1830    /// raster compare bits 0 to 7 [0xD012: RC]
1831    pub const RASTER_COMPARE_BITS_0_TO_7: *mut u8 = (0xD012) as *mut u8;
1832
1833    /// Coarse horizontal beam position (was lightpen X) [0xD013: LPX]
1834    pub const COARSE_HORIZONTAL_BEAM_POSITION: *mut u8 = (0xD013) as *mut u8;
1835
1836    /// Coarse vertical beam position (was lightpen Y) [0xD014: LPY]
1837    pub const COARSE_VERTICAL_BEAM_POSITION: *mut u8 = (0xD014) as *mut u8;
1838
1839    /// sprite enable bits [0xD015: SE]
1840    pub const SPRITE_ENABLE_BITS: *mut u8 = (0xD015) as *mut u8;
1841
1842    /// horizontal smooth scroll [0xD016: XSCL]
1843    pub const HORIZONTAL_SMOOTH_SCROLL_MASK: u8 = 0b00000111;
1844
1845    /// 38/40 column select [0xD016: CSEL]
1846    pub const SELECT_COLUMN_38_SLASH_40_MASK: u8 = 0b00001000;
1847
1848    /// Multi-colour mode [0xD016: MCM]
1849    pub const MULTI_COLOUR_MODE_MASK: u8 = 0b00010000;
1850
1851    /// Disables video output on MAX Machine(tm) VIC-II 6566.  Ignored on normal C64s and the MEGA65 [0xD016: RST]
1852    pub const DISABLES_VIDEO_OUTPUT_ON_MAX_MACHINE_MASK: u8 = 0b00100000;
1853
1854    /// sprite vertical expansion enable bits [0xD017: SEXY]
1855    pub const SPRITE_VERTICAL_EXPANSION_ENABLE_BITS: *mut u8 = (0xD017) as *mut u8;
1856
1857    /// character set address location ($\times$ 1KiB) [0xD018: CB]
1858    pub const CHARACTER_SET_ADDRESS_LOCATION_MASK: u8 = 0b00000111;
1859
1860    /// screen address ($\times$ 1KiB) [0xD018: VS]
1861    pub const SCREEN_ADDRESS_MASK: u8 = 0b00001111;
1862
1863    /// raster compare indicate or acknowledge [0xD019: RIRQ]
1864    pub const RASTER_COMPARE_INDICATE_OR_ACKNOWLEDGE_MASK: u8 = 0b00000001;
1865
1866    /// sprite:bitmap collision indicate or acknowledge [0xD019: ISBC]
1867    pub const SPRITE_MASK: u8 = 0b00000010;
1868
1869    /// light pen indicate or acknowledge [0xD019: ILP]
1870    pub const LIGHT_PEN_INDICATE_OR_ACKNOWLEDGE_MASK: u8 = 0b00001000;
1871
1872    /// mask raster IRQ [0xD01A: MRIRQ]
1873    pub const MASK_RASTER_IRQ_MASK: u8 = 0b00000001;
1874
1875    /// mask sprite:bitmap collision IRQ [0xD01A: MISBC]
1876    pub const MASK_SPRITE_MASK: u8 = 0b00000010;
1877
1878    /// sprite background priority bits [0xD01B: BSP]
1879    pub const SPRITE_BACKGROUND_PRIORITY_BITS: *mut u8 = (0xD01B) as *mut u8;
1880
1881    /// sprite multicolour enable bits [0xD01C: SCM]
1882    pub const SPRITE_MULTICOLOUR_ENABLE_BITS: *mut u8 = (0xD01C) as *mut u8;
1883
1884    /// sprite horizontal expansion enable bits [0xD01D: SEXX]
1885    pub const SPRITE_HORIZONTAL_EXPANSION_ENABLE_BITS: *mut u8 = (0xD01D) as *mut u8;
1886
1887    /// sprite/sprite collision indicate bits [0xD01E: SSC]
1888    pub const SPRITE_SLASH_SPRITE_COLLISION_INDICATE_BITS: *mut u8 = (0xD01E) as *mut u8;
1889
1890    /// sprite/foreground collision indicate bits [0xD01F: SBC]
1891    pub const SPRITE_SLASH_FOREGROUND_COLLISION_INDICATE_BITS: *mut u8 = (0xD01F) as *mut u8;
1892
1893    /// display border colour (16 colour) [0xD020: BORDERCOL]
1894    pub const DISPLAY_BORDER_COLOUR_MASK: u8 = 0b00001111;
1895
1896    /// screen colour (16 colour) [0xD021: SCREENCOL]
1897    pub const SCREEN_COLOUR_MASK: u8 = 0b00001111;
1898
1899    /// multi-colour 1 (16 colour) [0xD022: MC1]
1900    pub const MULTI_COLOUR_1_MASK: u8 = 0b00001111;
1901
1902    /// multi-colour 2 (16 colour) [0xD023: MC2]
1903    pub const MULTI_COLOUR_2_MASK: u8 = 0b00001111;
1904
1905    /// multi-colour 3 (16 colour) [0xD024: MC3]
1906    pub const MULTI_COLOUR_3_MASK: u8 = 0b00001111;
1907
1908    /// sprite N colour / 16-colour sprite transparency colour (lower nybl) [0xD027: SPR0COL]
1909    pub const SPRITE_N_COLOUR__SLASH__16_COLOUR_SPRITE_TRANSPARENCY_COLOUR: *mut u8 =
1910        (0xD027) as *mut u8;
1911
1912    /// @SPRNCOL [0xD028: SPR1COL]
1913    pub const SPRNCOL: *mut u8 = (0xD028) as *mut u8;
1914
1915    /// 2MHz select (for C128 2MHz emulation) [0xD030: C128]
1916    pub const SELECT_2MHZ_MASK: u8 = 0b00000001;
1917}
1918
1919pub mod vic3 {
1920
1921    /// Sprite multi-colour 0 (8-bit for selection of any palette colour) [0xD025: SPRMC0]
1922    pub const SPRITE_MULTI_COLOUR_0: *mut u8 = (0xD025) as *mut u8;
1923
1924    /// Sprite multi-colour 1 (8-bit for selection of any palette colour) [0xD026: SPRMC1]
1925    pub const SPRITE_MULTI_COLOUR_1: *mut u8 = (0xD026) as *mut u8;
1926
1927    /// Write $A5 then $96 to enable C65/VIC-III IO registers [0xD02F: KEY]
1928    pub const WRITE_0XA5_THEN_0X96_TO_ENABLE_C65_SLASH_VIC_III_IO_REGISTERS: *mut u8 =
1929        (0xD02F) as *mut u8;
1930
1931    /// Map 2nd KB of colour RAM @ $DC00-$DFFF [0xD030: CRAM2K]
1932    pub const MAP_2ND_KB_OF_COLOUR_RAM__0XDC00_0XDFFF_MASK: u8 = 0b00000001;
1933
1934    /// Enable external video sync (genlock input) [0xD030: EXTSYNC]
1935    pub const ENABLE_EXTERNAL_VIDEO_SYNC_MASK: u8 = 0b00000010;
1936
1937    /// Use PALETTE ROM (0) or RAM (1) entries for colours 0 - 15 [0xD030: PAL]
1938    pub const USE_PALETTE_ROM_MASK: u8 = 0b00000100;
1939
1940    /// Map C65 ROM @ $8000 [0xD030: ROM8]
1941    pub const MAP_C65_ROM__0X8000_MASK: u8 = 0b00001000;
1942
1943    /// Map C65 ROM @ $A000 [0xD030: ROMA]
1944    pub const MAP_C65_ROM__0XA000_MASK: u8 = 0b00010000;
1945
1946    /// Map C65 ROM @ $C000 [0xD030: ROMC]
1947    pub const MAP_C65_ROM__0XC000_MASK: u8 = 0b00100000;
1948
1949    /// Select between C64 and C65 charset. [0xD030: CROM9]
1950    pub const SELECT_BETWEEN_C64_AND_C65_CHARSET_MASK: u8 = 0b01000000;
1951
1952    /// Map C65 ROM @ $E000 [0xD030: ROME]
1953    pub const MAP_C65_ROM__0XE000_MASK: u8 = 0b10000000;
1954
1955    /// Enable VIC-III interlaced mode [0xD031: INT]
1956    pub const ENABLE_VIC_III_INTERLACED_MODE_MASK: u8 = 0b00000001;
1957
1958    /// Enable VIC-III MONO video output (not implemented) [0xD031: MONO]
1959    pub const ENABLE_VIC_III_MONO_VIDEO_OUTPUT_MASK: u8 = 0b00000010;
1960
1961    /// Enable 1280 horizontal pixels (not implemented) [0xD031: H1280]
1962    pub const ENABLE_1280_HORIZONTAL_PIXELS_MASK: u8 = 0b00000100;
1963
1964    /// Enable 400 vertical pixels [0xD031: V400]
1965    pub const ENABLE_400_VERTICAL_PIXELS_MASK: u8 = 0b00001000;
1966
1967    /// Bit-Plane Mode [0xD031: BPM]
1968    pub const BIT_PLANE_MODE_MASK: u8 = 0b00010000;
1969
1970    /// Enable extended attributes and 8 bit colour entries [0xD031: ATTR]
1971    pub const ENABLE_EXTENDED_ATTRIBUTES_AND_8_BIT_COLOUR_ENTRIES_MASK: u8 = 0b00100000;
1972
1973    /// Enable C65 FAST mode (~3.5MHz) [0xD031: FAST]
1974    pub const ENABLE_C65_FAST_MODE_MASK: u8 = 0b01000000;
1975
1976    /// Enable C64 640 horizontal pixels / 80 column mode [0xD031: H640]
1977    pub const ENABLE_C64_640_HORIZONTAL_PIXELS__SLASH__80_COLUMN_MODE_MASK: u8 = 0b10000000;
1978
1979    /// Bitplane X address, even lines [0xD033: B0ADEVN]
1980    pub const BITPLANE_X_ADDRESS_MASK: u8 = 0b00000111;
1981
1982    /// @BXADEVN [0xD034: B1ADEVN]
1983    pub const BXADEVN_MASK: u8 = 0b00000111;
1984
1985    /// @BXADODD [0xD034: B1ADODD]
1986    pub const BXADODD_MASK: u8 = 0b00000111;
1987
1988    /// Complement bitplane flags [0xD03B: BPCOMP]
1989    pub const COMPLEMENT_BITPLANE_FLAGS: *mut u8 = (0xD03B) as *mut u8;
1990
1991    /// Bitplane X Offset [0xD03E: HPOS]
1992    pub const BITPLANE_X_OFFSET: *mut u8 = (0xD03E) as *mut u8;
1993
1994    /// Bitplane Y Offset [0xD03F: VPOS]
1995    pub const BITPLANE_Y_OFFSET: *mut u8 = (0xD03F) as *mut u8;
1996
1997    /// Display Address Translater (DAT) Bitplane N port [0xD040: B0PIX]
1998    pub const DISPLAY_ADDRESS_TRANSLATER: *mut u8 = (0xD040) as *mut u8;
1999
2000    /// @BNPIX [0xD041: B1PIX]
2001    pub const BNPIX: *mut u8 = (0xD041) as *mut u8;
2002}
2003
2004pub mod vic4 {
2005
2006    /// Write $45 then $54 to map 45E100 ethernet controller buffers to $D000-$DFFF [0xD02F: KEY]
2007    pub const WRITE_0X45_THEN_0X54_TO_MAP_45E100_ETHERNET_CONTROLLER_BUFFERS_TO_0XD000_0XDFFF:
2008        *mut u8 = (0xD02F) as *mut u8;
2009
2010    /// Write $47 then $53 to enable C65GS/VIC-IV IO registers [0xD02F: KEY]
2011    pub const WRITE_0X47_THEN_0X53_TO_ENABLE_C65GS_SLASH_VIC_IV_IO_REGISTERS: *mut u8 =
2012        (0xD02F) as *mut u8;
2013
2014    /// top border position [0xD048: TBDRPOS]
2015    pub const TOP_BORDER_POSITION: *mut u8 = (0xD048) as *mut u8;
2016
2017    /// top border position MSB [0xD049: TBDRPOS]
2018    pub const TOP_BORDER_POSITION_MSB_MASK: u8 = 0b00001111;
2019
2020    /// Sprite bitplane-modify-mode enables [0xD049: SPRBPMEN]
2021    pub const SPRITE_BITPLANE_MODIFY_MODE_ENABLES_MASK: u8 = 0b00001111;
2022
2023    /// bottom border position [0xD04A: BBDRPOS]
2024    pub const BOTTOM_BORDER_POSITION: *mut u8 = (0xD04A) as *mut u8;
2025
2026    /// character generator horizontal position [0xD04C: TEXTXPOS]
2027    pub const CHARACTER_GENERATOR_HORIZONTAL_POSITION: *mut u8 = (0xD04C) as *mut u8;
2028
2029    /// Sprite horizontal tile enables. [0xD04D: SPRTILEN]
2030    pub const SPRITE_HORIZONTAL_TILE_ENABLES_MASK: u8 = 0b00001111;
2031
2032    /// Character generator vertical position [0xD04E: TEXTYPOS]
2033    pub const CHARACTER_GENERATOR_VERTICAL_POSITION: *mut u8 = (0xD04E) as *mut u8;
2034
2035    /// Sprite 7-4 horizontal tile enables [0xD04F: SPRTILEN]
2036    pub const SPRITE_7_4_HORIZONTAL_TILE_ENABLES_MASK: u8 = 0b00001111;
2037
2038    /// Read horizontal raster scan position LSB [0xD050: XPOSLSB]
2039    pub const READ_HORIZONTAL_RASTER_SCAN_POSITION_LSB: *mut u8 = (0xD050) as *mut u8;
2040
2041    /// Read horizontal raster scan position MSB [0xD051: XPOSMSB]
2042    pub const READ_HORIZONTAL_RASTER_SCAN_POSITION_MSB_MASK: u8 = 0b00111111;
2043
2044    /// When set, the Raster Rewrite Buffer is only updated every 2nd raster line, limiting resolution to V200, but allowing more cycles for Raster-Rewrite actions. [0xD051: DBLRR]
2045    pub const WHEN_SET_MASK: u8 = 0b01000000;
2046
2047    /// When clear, raster rewrite double buffering is used [0xD051: NORRDEL]
2048    pub const WHEN_CLEAR_MASK: u8 = 0b10000000;
2049
2050    /// Read physical raster position [0xD052: FNRASTERLSB]
2051    pub const READ_PHYSICAL_RASTER_POSITION: *mut u8 = (0xD052) as *mut u8;
2052
2053    /// Enable simulated shadow-mask (PALEMU must also be enabled) [0xD053: SHDEMU]
2054    pub const ENABLE_SIMULATED_SHADOW_MASK_MASK: u8 = 0b01000000;
2055
2056    /// Raster compare source (0=VIC-IV fine raster, 1=VIC-II raster) [0xD053: FNRST]
2057    pub const RASTER_COMPARE_SOURCE_MASK: u8 = 0b10000000;
2058
2059    /// enable 16-bit character numbers (two screen bytes per character) [0xD054: CHR16]
2060    pub const ENABLE_16_BIT_CHARACTER_NUMBERS_MASK: u8 = 0b00000001;
2061
2062    /// enable full-colour mode for character numbers <=$FF [0xD054: FCLRLO]
2063    pub const ENABLE_FULL_COLOUR_MODE_FOR_CHARACTER_NUMBERS_LE0XFF_MASK: u8 = 0b00000010;
2064
2065    /// enable full-colour mode for character numbers >$FF [0xD054: FCLRHI]
2066    pub const ENABLE_FULL_COLOUR_MODE_FOR_CHARACTER_NUMBERS_GT0XFF_MASK: u8 = 0b00000100;
2067
2068    /// video output horizontal smoothing enable [0xD054: SMTH]
2069    pub const VIDEO_OUTPUT_HORIZONTAL_SMOOTHING_ENABLE_MASK: u8 = 0b00001000;
2070
2071    /// Sprite H640 enable [0xD054: SPR]
2072    pub const SPRITE_H640_ENABLE_MASK: u8 = 0b00010000;
2073
2074    /// Enable PAL CRT-like scan-line emulation [0xD054: PALEMU]
2075    pub const ENABLE_PAL_CRT_LIKE_SCAN_LINE_EMULATION_MASK: u8 = 0b00100000;
2076
2077    /// C65GS FAST mode (48MHz) [0xD054: VFAST]
2078    pub const C65GS_FAST_MODE_MASK: u8 = 0b01000000;
2079
2080    /// Alpha compositor enable [0xD054: ALPHEN]
2081    pub const ALPHA_COMPOSITOR_ENABLE_MASK: u8 = 0b10000000;
2082
2083    /// sprite extended height enable (one bit per sprite) [0xD055: SPRHGTEN]
2084    pub const SPRITE_EXTENDED_HEIGHT_ENABLE: *mut u8 = (0xD055) as *mut u8;
2085
2086    /// Sprite extended height size (sprite pixels high) [0xD056: SPRHGHT]
2087    pub const SPRITE_EXTENDED_HEIGHT_SIZE: *mut u8 = (0xD056) as *mut u8;
2088
2089    /// Sprite extended width enables (8 bytes per sprite row = 64 pixels wide for normal sprites or 16 pixels wide for 16-colour sprite mode) [0xD057: SPRX64EN]
2090    pub const SPRITE_EXTENDED_WIDTH_ENABLES: *mut u8 = (0xD057) as *mut u8;
2091
2092    /// number of bytes to advance between each text row (LSB) [0xD058: LINESTEPLSB]
2093    pub const NUMBER_OF_BYTES_TO_ADVANCE_BETWEEN_EACH_TEXT_ROW: *mut u8 = (0xD058) as *mut u8;
2094
2095    /// Horizontal hardware scale of text mode (pixel 120ths per pixel) [0xD05A: CHRXSCL]
2096    pub const HORIZONTAL_HARDWARE_SCALE_OF_TEXT_MODE: *mut u8 = (0xD05A) as *mut u8;
2097
2098    /// Vertical scaling of text mode (number of physical rasters per char text row) [0xD05B: CHRYSCL]
2099    pub const VERTICAL_SCALING_OF_TEXT_MODE: *mut u8 = (0xD05B) as *mut u8;
2100
2101    /// Width of single side border (LSB) [0xD05C: SDBDRWD]
2102    pub const WIDTH_OF_SINGLE_SIDE_BORDER: *mut u8 = (0xD05C) as *mut u8;
2103
2104    /// side border width (MSB) [0xD05D: SDBDRWD]
2105    pub const SIDE_BORDER_WIDTH_MASK: u8 = 0b00111111;
2106
2107    /// Enable raster delay (delays raster counter and interrupts by one line to match output pipeline latency) [0xD05D: RST]
2108    pub const ENABLE_RASTER_DELAY_MASK: u8 = 0b01000000;
2109
2110    /// Enable VIC-II hot registers. When enabled, touching many VIC-II registers causes the VIC-IV to recalculate display parameters, such as border positions and sizes [0xD05D: HOTREG]
2111    pub const ENABLE_VIC_II_HOT_REGISTERS_MASK: u8 = 0b10000000;
2112
2113    /// Number of characters to display per row (LSB) [0xD05E: CHRCOUNT]
2114    pub const NUMBER_OF_CHARACTERS_TO_DISPLAY_PER_ROW: *mut u8 = (0xD05E) as *mut u8;
2115
2116    /// Sprite H640 X Super-MSBs [0xD05F: SPRXSMSBS]
2117    pub const SPRITE_H640_X_SUPER_MSBS: *mut u8 = (0xD05F) as *mut u8;
2118
2119    /// screen RAM precise base address (bits 0 - 7) [0xD060: SCRNPTRLSB]
2120    pub const SCREEN_RAM_PRECISE_BASE_ADDRESS: *mut u8 = (0xD060) as *mut u8;
2121
2122    /// Number of characters to display per [0xD063: CHRCOUNT]
2123    pub const NUMBER_OF_CHARACTERS_TO_DISPLAY_PER_MASK: u8 = 0b00000011;
2124
2125    /// source full-colour character data from expansion RAM [0xD063: EXGLYPH]
2126    pub const SOURCE_FULL_COLOUR_CHARACTER_DATA_FROM_EXPANSION_RAM_MASK: u8 = 0b10000000;
2127
2128    /// colour RAM base address (bits 0 - 7) [0xD064: COLPTRLSB]
2129    pub const COLOUR_RAM_BASE_ADDRESS: *mut u8 = (0xD064) as *mut u8;
2130
2131    /// Character set precise base address (bits 0 - 7) [0xD068: CHARPTRLSB]
2132    pub const CHARACTER_SET_PRECISE_BASE_ADDRESS: *mut u8 = (0xD068) as *mut u8;
2133
2134    /// sprite 16-colour mode enables [0xD06B: SPR16EN]
2135    pub const SPRITE_16_COLOUR_MODE_ENABLES: *mut u8 = (0xD06B) as *mut u8;
2136
2137    /// sprite pointer address (bits 7 - 0) [0xD06C: SPRPTRADRLSB]
2138    pub const SPRITE_POINTER_ADDRESS: *mut u8 = (0xD06C) as *mut u8;
2139
2140    /// 16-bit sprite pointer mode (allows sprites to be located on any 64 byte boundary in chip RAM) [0xD06E: SPR]
2141    pub const MODE_SPRITE_POINTER_16_BIT_MASK: u8 = 0b10000000;
2142
2143    /// first VIC-II raster line [0xD06F: RASLINE0]
2144    pub const FIRST_VIC_II_RASTER_LINE_MASK: u8 = 0b00111111;
2145
2146    /// Select more VGA-compatible mode if set, instead of HDMI/HDTV VIC-II cycle-exact frame timing. May help to produce a functional display on older VGA monitors. [0xD06F: VGAHDTV]
2147    pub const SELECT_MORE_VGA_COMPATIBLE_MODE_IF_SET_MASK: u8 = 0b01000000;
2148
2149    /// NTSC emulation mode (max raster = 262) [0xD06F: PALNTSC]
2150    pub const NTSC_EMULATION_MODE_MASK: u8 = 0b10000000;
2151
2152    /// VIC-IV bitmap/text palette bank (alternate palette) [0xD070: ABTPALSEL]
2153    pub const VIC_IV_BITMAP_SLASH_TEXT_PALETTE_BANK_MASK: u8 = 0b00000011;
2154
2155    /// sprite palette bank [0xD070: SPRPALSEL]
2156    pub const SPRITE_PALETTE_BANK_MASK: u8 = 0b00000011;
2157
2158    /// bitmap/text palette bank [0xD070: BTPALSEL]
2159    pub const BITMAP_SLASH_TEXT_PALETTE_BANK_MASK: u8 = 0b00000011;
2160
2161    /// palette bank mapped at $D100-$D3FF [0xD070: MAPEDPAL]
2162    pub const PALETTE_BANK_MAPPED_AT_0XD100_0XD3FF_MASK: u8 = 0b00000011;
2163
2164    /// VIC-IV 16-colour bitplane enable flags [0xD071: BP16ENS]
2165    pub const VIC_IV_16_COLOUR_BITPLANE_ENABLE_FLAGS: *mut u8 = (0xD071) as *mut u8;
2166
2167    /// Sprite Y position adjustment [0xD072: SPRYADJ]
2168    pub const SPRITE_Y_POSITION_ADJUSTMENT: *mut u8 = (0xD072) as *mut u8;
2169
2170    /// Alpha delay for compositor [0xD073: ALPHADELAY]
2171    pub const ALPHA_DELAY_FOR_COMPOSITOR_MASK: u8 = 0b00001111;
2172
2173    /// physical rasters per VIC-II raster (1 to 16) [0xD073: RASTERHEIGHT]
2174    pub const PHYSICAL_RASTERS_PER_VIC_II_RASTER_MASK: u8 = 0b00001111;
2175
2176    /// Sprite alpha-blend enable [0xD074: SPRENALPHA]
2177    pub const SPRITE_ALPHA_BLEND_ENABLE: *mut u8 = (0xD074) as *mut u8;
2178
2179    /// Sprite alpha-blend value [0xD075: SPRALPHAVAL]
2180    pub const SPRITE_ALPHA_BLEND_VALUE: *mut u8 = (0xD075) as *mut u8;
2181
2182    /// Sprite V400 enables [0xD076: SPRENV400]
2183    pub const SPRITE_V400_ENABLES: *mut u8 = (0xD076) as *mut u8;
2184
2185    /// Sprite V400 Y position MSBs [0xD077: SPRYMSBS]
2186    pub const SPRITE_V400_Y_POSITION_MSBS: *mut u8 = (0xD077) as *mut u8;
2187
2188    /// Sprite V400 Y position super MSBs [0xD078: SPRYSMSBS]
2189    pub const SPRITE_V400_Y_POSITION_SUPER_MSBS: *mut u8 = (0xD078) as *mut u8;
2190
2191    /// Raster compare value [0xD079: RASCMP]
2192    pub const RASTER_COMPARE_VALUE: *mut u8 = (0xD079) as *mut u8;
2193
2194    /// Raster compare value MSB [0xD07A: RASCMP]
2195    pub const RASTER_COMPARE_VALUE_MSB_MASK: u8 = 0b00000111;
2196
2197    /// Continuously monitor sprite pointer, to allow changing sprite data source while a sprite is being drawn [0xD07A: SPTR]
2198    pub const CONTINUOUSLY_MONITOR_SPRITE_POINTER_MASK: u8 = 0b00001000;
2199
2200    /// Reserved. [0xD07A: RESV]
2201    pub const RESERVED_MASK: u8 = 0b00000011;
2202
2203    /// Enable additional IRQ sources, e.g., raster X position. [0xD07A: EXTIRQS]
2204    pub const ENABLE_ADDITIONAL_IRQ_SOURCES_MASK: u8 = 0b01000000;
2205
2206    /// Raster compare is in physical rasters if set, or VIC-II raster if clear [0xD07A: FNRST]
2207    pub const RASTER_COMPARE_IS_IN_PHYSICAL_RASTERS_IF_SET_MASK: u8 = 0b10000000;
2208
2209    /// Number of text rows to display [0xD07B: DISP]
2210    pub const NUMBER_OF_TEXT_ROWS_TO_DISPLAY: *mut u8 = (0xD07B) as *mut u8;
2211
2212    /// Set which 128KB bank bitplanes [0xD07C: BIT]
2213    pub const SET_WHICH_128KB_BANK_BITPLANES_MASK: u8 = 0b00000111;
2214
2215    /// @RESV [0xD07C: RESV]
2216    pub const RESV_MASK: u8 = 0b00001000;
2217
2218    /// hsync polarity [0xD07C: HSYNCP]
2219    pub const HSYNC_POLARITY_MASK: u8 = 0b00010000;
2220
2221    /// vsync polarity [0xD07C: VSYNCP]
2222    pub const VSYNC_POLARITY_MASK: u8 = 0b00100000;
2223
2224    /// VIC-IV debug pixel select red(01), green(10) or blue(11) channel visible in $D07D [0xD07C: DEBUGC]
2225    pub const VIC_IV_DEBUG_PIXEL_SELECT_RED_MASK: u8 = 0b00000011;
2226
2227    /// palette bank selection [0xD070: VIC_IV]
2228    pub const PALETTE_BANK_SELECTION: *mut u8 = (0xD070) as *mut u8;
2229}