Files
2026-03-24 22:22:37 +00:00

948 lines
39 KiB
C
Vendored

/* Zeta API - Z/hardware/machine/computer/ZX_Spectrum.h
_ _ _
___________ |_| ___________ ___________ | | ___________ |_| ___________
| _________|| || _______ || _________]| |[_________ || || _________]
| |_________ | || | | || | | | _________| || || |
|_________ || || | | || | | || _______ || || |
_________| || || | | || |_________ | || |_______| || || |
[___________||_||_| |_||___________]|_||___________||_||_|
______ _ __ _____ _
/___ /\ \ / / / ____| _____ ____ ______| |________ _ _ ___ ___
/ / \ \/ / | |____ | __ \ / __ \ / ___|_ _| __| | | | `_ `_ :
/ / > < \____ \| | \ | |__] | | | | | | | | | | | | | | |
/ /___ / /\ \ _____| | |__/ | ___/| |___ | | | | | |__| | | | | | |
/______/_/ \_\ |______/| ___/ \____/ \____| |_| |_| |____,_|_| |_| |_|
|_|
Copyright (C) 2006-2024 Manuel Sainz de Baranda y Goñi.
Released under the terms of the GNU Lesser General Public License v3.
_________________________________
| |
| Name: ZX Spectrum |
| Vendor: Sinclair Research |
| Released: 1982-04-23 |
| CPU: Zilog Z80 @ 3.5 MHz |
| ROM: 16 KiB |
| RAM: 16 KiB / 48 KiB |
| Audio: Internal speaker |
| |
'================================='
__________________________________________________
| ___. __ _ __ . __ |
| __\ || ||__|__|--||| |
| ZX Spectrum |
| |
| ________________________________________________ |
|/________________________________________________\|
| _ _ _ _ _ _ _ _ _ _ |
| [1] [2] [3] [4] [5] [6] [7] [8] [9] [0] |
| _ _ _ _ _ _ _ _ _ _ |
| [Q] [W] [E] [R] [T] [Y] [U] [I] [O] [P] /|
| _ _ _ _ _ _ _ _ _ _____//|
| [A] [S] [D] [F] [G] [H] [J] [K] [L] [ENTER]/|
| _____ _ _ _ _ _ _ _ __ ___////|
| [SHIFT] [Z] [X] [C] [V] [B] [N] [M] [SS] [SPACE] |
|____________________________________________////__|
(__________________________________________________)
_________________________________
| |
| Name: ZX Spectrum + |
| Vendor: Sinclair Research |
| Released: 1984-10 |
| CPU: Zilog Z80 @ 3.5 MHz |
| ROM: 16 KiB |
| RAM: 48 KiB |
| Audio: Internal speaker |
| |
'================================='
____________________________ ___________
| ___. __ _ __ . __ ''''''''''''''''''''''''''''' |
| __\ || ||__|__|--||| |
|--------------------------------------------------------------------|
| ZX Spectrum + |
|--.-----------------------------------------------------.-----------|
| |( )|( )|(1)|(2)|(3)|(4)|(5)|(6)|(7)|(8)|(9)|(0)|(BRK)| |
|--|-----------------------------------------------------|-----------|
| |(DEL)|(1)|(Q)|(W)|(E)|(R)|(T)|(Y)|(U)|(I)|(O)|(P)|.-.| |
|--|-------------------------------------------------'| ||-----------|
| |(EXT)|(ED)|(A)|(S)|(D)|(F)|(G)|(H)|(J)|(K)|(L)|(____'| |
|--|-----------------------------------------------------|-----------|
| |(CAPS S)|( )|(Z)|(X)|(C)|(V)|(B)|(N)|(M)|(.)|(CAPS S)| |
|--|-----------------------------------------------------|-----------|
| |( )|(;)|(")|(_)|(_)|(_______________)|(_)|(_)|(,)|(_)| //// |
|--'-----------------------------------------------------'-----------|
|____________________________________________________________________|
________________________________________________
| |
| Name: ZX Spectrum + 128K |
| Vendor: Sinclair Research - Investronica |
| Released: 1985-09 |
| CPU: Zilog Z80 @ 3.5469 MHz |
| ROM: 48 KiB |
| RAM: 128 KiB |
| Audio: General Instrument AY-3-8912 (PSG) |
| |
'================================================'
_____________________________ ________________
| ___. __ _ __ . __ '''''''''''''''''''''''''''' |====|
| __\ || ||__|__|--||| |====|
|--------------------------------------------------------------------|====|
| ZX Spectrum + |====|
|--.-----------------------------------------------------.-----------|====|
| |( )|( )|(1)|(2)|(3)|(4)|(5)|(6)|(7)|(8)|(9)|(0)|(BRK)| |====|
|--|-----------------------------------------------------|-----------|====|
| |(DEL)|(1)|(Q)|(W)|(E)|(R)|(T)|(Y)|(U)|(I)|(O)|(P)|.-.| |====|
|--|-------------------------------------------------'| ||-----------|====|
| |(EXT)|(ED)|(A)|(S)|(D)|(F)|(G)|(H)|(J)|(K)|(L)|(____'| |====|
|--|-----------------------------------------------------|-----------|====|
| |(CAPS S)|( )|(Z)|(X)|(C)|(V)|(B)|(N)|(M)|(.)|(CAPS S)| |====|
|--|-----------------------------------------------------|-----------|====|
| |( )|(;)|(")|(_)|(_)|(_______________)|(_)|(_)|(,)|(_)| 128K//// |====|
|--'-----------------------------------------------------'-----------|====|
|____________________________________________________________________|====|
________________________________________________
| |
| Name: ZX Spectrum +2 |
| Vendor: Amstrad |
| Released: 1985-09 |
| CPU: Zilog Z80 @ 3.5469 MHz |
| ROM: 48 KiB |
| RAM: 128 KiB |
| Audio: General Instrument AY-3-8912 (PSG) |
| |
'================================================'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| ___. __ _ __ . __ |
| __\ || ||__|__|--||| ___________________________128K = ZX_Spectrum_+2_________ |
| |
|=======================================================================================|
| | | |
|__.---.---.---.---.---.---.---.---.---.---.---.---.-----.___| ___ |__|
| |TRV|INV| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | BRK | | (O)|___|(O) | |
|__.-----.---.---.---.---.---.---.---.---.---.---.---.---.___| --------------------- |__|
| | DEL | GR| Q | W | E | R | T | Y | U | I | O | P | | | _____________________ | |
|__.------.---.---.---.---.---.---.---.---.---.---.--' |___| D A T A C O R D E R |__|
| | EXT | ED| A | S | D | F | G | H | J | K | L | ENTER| '-----------------------' |
|__.--------.---.---.---.---.---.---.---.---.---.--------._____________o________________|
| | C SHIFT| CL| Z | X | C | V | B | N | M | . | C SHIFT| |
|__.---.---.---.---.---.-----------------.---.---.---.---.___.---.---.---.---.---.---.__|
| | SS| ; | " | < | > | | /\| \/| , | SS| | O | > | <<|>> |/\ ||| | |
|__|---|---|---|---|---|-----------------|---|---|---|---|___|---|---|---|---|---|---|__|
| '-----------------------------------------------------' '-----------------------' |
|_______________________________________________________________________________________|
________________________________________________
| |
| Name: ZX Spectrum +2A |
| Vendor: Amstrad |
| Released: 1985-09 |
| CPU: Zilog Z80 @ 3.5469 MHz |
| ROM: 48 KiB |
| RAM: 128 KiB |
| Audio: General Instrument AY-3-8912 (PSG) |
| |
'================================================'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| ___. __ _ __ . __ |
| __\ || ||__|__|--||| ___________________________128K = ZX_Spectrum_+2_________ |
| |
|=======================================================================================|
| | | |
|__.---.---.---.---.---.---.---.---.---.---.---.---.-----.___| ___ |__|
| |TRV|INV| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | BRK | | (O)|___|(O) | |
|__.-----.---.---.---.---.---.---.---.---.---.---.---.---.___| --------------------- |__|
| | DEL | GR| Q | W | E | R | T | Y | U | I | O | P | | | _____________________ | |
|__.------.---.---.---.---.---.---.---.---.---.---.--' |___| D A T A C O R D E R |__|
| | EXT | ED| A | S | D | F | G | H | J | K | L | ENTER| '-----------------------' |
|__.--------.---.---.---.---.---.---.---.---.---.--------._____________o________________|
| | C SHIFT| CL| Z | X | C | V | B | N | M | . | C SHIFT| O > << >> /\ || |
|__.---.---.---.---.---.-----------------.---.---.---.---.___.---.---.---.---.---.---.__|
| | SS| ; | " | < | > | | /\| \/| , | SS| | | | | | | | |
|__|---|---|---|---|---|-----------------|---|---|---|---|___|---|---|---|---|---|---|__|
| '-----------------------------------------------------' '-----------------------' |
|_______________________________________________________________________________________|
________________________________________________
| |
| Name: ZX Spectrum +3 |
| Vendor: Amstrad |
| Released: 1985-09 |
| CPU: Zilog Z80 @ 3.5469 MHz |
| ROM: 48 KiB |
| RAM: 128 KiB |
| Audio: General Instrument AY-3-8912 (PSG) |
| |
'================================================'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| ___. __ _ __ . __ |
| __\ || ||__|__|--||| _______________________________128K = __ZX_Spectrum_+3__ |
| |
|=======================================================================================|
| | |
|______.---.---.---.---.---.---.---.---.---.---.---.---.-----.___|_ __________________ _|
| |TRV|INV| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | BRK | | | _ _ | |
|______.-----.---.---.---.---.---.---.---.---.---.---.---.---.___|_| /|' ](_)|_/ |_|
| | DEL | GR| Q | W | E | R | T | Y | U | I | O | P | | | | | /_(_)| \ | |
|______.------.---.---.---.---.---.---.---.---.---.---.--' |___|_| |_|
| | EXT | ED| A | S | D | F | G | H | J | K | L | ENTER| | | | |
|______.--------.---.---.---.---.---.---.---.---.---.--------.___|_| |_|
| | C SHIFT| CL| Z | X | C | V | B | N | M | . | C SHIFT| | | | |
|______.---.---.---.---.---.-----------------.---.---.---.---.___|_|____ _ _ _ ____|_|
| | SS| ; | " | < | > | | /\| \/| , | SS| | |____|- |_) |_)____| |
|______|---|---|---|---|---|-----------------|---|---|---|---|___|_| FLOPPY DISC DRIVE|_|
| '-----------------------------------------------------' | '------------------' |
|________________________________________________________________|______________________|
______________________________________
| |
| Name: Inves Spectrum + |
| Vendor: Investronica |
| Released: 1986 |
| CPU: Zilog Z80-A @ 3.5469 MHz |
| ROM: 48 KiB |
| RAM: 128 KiB |
| Audio: Internal speaker |
| |
'======================================'
_____________________________ ___________
| o _ _ __ '''''''''''''''''''''''''''' |
| ---'\__| |\/|/_\ |
|--------------------------------------------------------------------|
| Spectrum + |
|--.-----------------------------------------------------.-----------|
| |( )|( )|(1)|(2)|(3)|(4)|(5)|(6)|(7)|(1)|(1)|(1)|(BRK)| |
|--|-----------------------------------------------------|-----------|
| |(DEL)|(1)|(Q)|(W)|(E)|(R)|(T)|(Y)|(U)|(I)|(O)|(P)|.-.| |
|--|-------------------------------------------------'| ||-----------|
| |(EXT)|(ED)|(A)|(S)|(D)|(F)|(G)|(H)|(J)|(K)|(L)|(____'| |
|--|-----------------------------------------------------|-----------|
| |( /\ )|( )|(Z)|(X)|(C)|(V)|(B)|(N)|(M)|(.)|( /\ )| |
|--|-----------------------------------------------------|-----------|
| |( )|(;)|(")|(<)|(>)|(_______________)|(A)|(V)|(,)|(_)| |
|--'-----------------------------------------------------'-----------|
|____________________________________________________________________| */
#ifndef Z_hardware_machine_computer_ZX_Spectrum_H
#define Z_hardware_machine_computer_ZX_Spectrum_H
#include <Z/macros/bit-field.h>
#include <Z/macros/language.h>
#include <Z/types/integral.h>
/* MARK: - Memory map */
/*-------------------------------------------------.
| Region | Size | Type | R/W | Content |
|-----------+------+------+-----+------------------|
| 0000-3FFF | 4000 | ROM | R | Firmware |
|-----------+------+------+-----+------------------|
| 4000-57FF | 1800 | VRAM | R/W | Video characters |
| 5800-5AFF | 300 | VRAM | R/W | Video attributes |
|-----------+------+------+-----+------------------|
| 5B00-FFFF | A500 | RAM | R/W | User programs |
'=================================================='
.-----------------------.
| 0000-3FFF | ROM | ROM |
| Firmware | 0 | 1 |
|-----------|-----+====='
| 4000-7FFF | RAM |
| Screen 1 | 5 |
|-----------|-----|
| 8000-BFFF | RAM |
| | 2 | Screen 2
|-----------|-----+--------------------------------------|--.
| C000-FFFF | RAM | RAM | RAM | RAM | RAM | RAM | RAM | RAM |
| User | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
'==========================================================='
.-----------------------------------.
| 0000-3FFF | RAM | RAM | RAM | RAM |
| User | 0 | 4 | 4 | 4 |
|-----------|-----+-----+-----+-----|
| 4000-7FFF | RAM | RAM | RAM | RAM |
| User | 1 | 5 | 5 | 7 |
|-----------|-----+-----+-----+-----|
| 8000-BFFF | RAM | RAM | RAM | RAM |
| User | 2 | 6 | 6 | 6 |
|-----------|-----+-----+-----+-----|
| C000-FFFF | RAM | RAM | RAM | RAM |
| User | 3 | 7 | 3 | 3 |
'==================================='
*/
#define Z_ZX_SPECTRUM_ADDRESS_ROM 0x0000
#define Z_ZX_SPECTRUM_ADDRESS_RAM 0x4000
#define Z_ZX_SPECTRUM_ADDRESS_VRAM 0x4000
#define Z_ZX_SPECTRUM_ADDRESS_CHARACTER_VRAM 0x4000
#define Z_ZX_SPECTRUM_ADDRESS_ATTRIBUTE_VRAM 0x5800
#define Z_ZX_SPECTRUM_ADDRESS_USER_PROGRAMS 0x5B00
#define Z_ZX_SPECTRUM_SIZE_ROM 0x4000 /* 16 KiB */
#define Z_ZX_SPECTRUM_SIZE_VRAM 0x1B00
#define Z_ZX_SPECTRUM_SIZE_CHARACTER_VRAM 0x1800
#define Z_ZX_SPECTRUM_SIZE_ATTRIBUTE_VRAM 0x300
#define Z_ZX_SPECTRUM_16K_SIZE_MEMORY 0x8000 /* 32 KiB */
#define Z_ZX_SPECTRUM_16K_SIZE_ROM 0x4000 /* 16 KiB */
#define Z_ZX_SPECTRUM_16K_SIZE_RAM 0x4000 /* 16 KiB */
#define Z_ZX_SPECTRUM_48K_SIZE_MEMORY 0x10000 /* 64 KiB */
#define Z_ZX_SPECTRUM_48K_SIZE_ROM 0x4000 /* 16 KiB */
#define Z_ZX_SPECTRUM_48K_SIZE_RAM 0xC000 /* 48 KiB */
#define Z_ZX_SPECTRUM_PLUS_128K_SIZE_MEMORY 0x28000 /* 160 KiB */
#define Z_ZX_SPECTRUM_PLUS_128K_SIZE_ROM 0x8000 /* 32 KiB */
#define Z_ZX_SPECTRUM_PLUS_128K_SIZE_RAM 0x20000 /* 128 KiB */
#define Z_ZX_SPECTRUM_PLUS_128K_SIZE_BANK 0x4000 /* 16 KiB */
#define Z_ZX_SPECTRUM_PLUS3_SIZE_MEMORY 0x30000 /* 160 KiB */
#define Z_ZX_SPECTRUM_PLUS3_SIZE_RAM 0x20000 /* 128 KiB */
#define Z_ZX_SPECTRUM_PLUS3_SIZE_ROM 0x10000 /* 64 KiB */
#define Z_INVES_SPECTRUM_PLUS_SIZE_MEMORY 0x10000 /* 64 KiB */
#define Z_INVES_SPECTRUM_PLUS_SIZE_ROM 0x4000 /* 16 KiB */
#define Z_INVES_SPECTRUM_PLUS_SIZE_RAM 0xC000 /* 48 KiB */
#define Z_TIMEX_SINCLAIR_2068_SIZE_MEMORY 0x12000 /* 72 KiB */
#define Z_TIMEX_SINCLAIR_2068_SIZE_ROM 0x6000 /* 24 KiB */
#define Z_TIMEX_SINCLAIR_2068_SIZE_RAM 0xC000 /* 48 KiB */
#define Z_TIMEX_COMPUTER_2048_SIZE_MEMORY 0x10000 /* 64 KiB */
#define Z_TIMEX_COMPUTER_2048_SIZE_ROM 0x4000 /* 16 KiB */
#define Z_TIMEX_COMPUTER_2048_SIZE_RAM 0xC000 /* 48 KiB */
/* MARK: - Video: Color Attribute */
/*----------------.
| 7 6 5 4 3 2 1 0 |
'-|-|-\___/-\___/-'
| | | '---- ink ----------------.
| | '---------- paper --------. |
| '-------------- bright ---. | |
'---------------- flash | | |
| | | |
.----------------' | | |
| .---------' | |
| | | |
.---------. .------------. .---------------.
| 0 = no | | 0 = normal | | 000 = black |
| 1 = yes | | 1 = bright | | 001 = blue |
'---------' '------------' | 010 = red |
| 011 = magenta |
| 100 = green |
| 101 = cyan |
| 110 = yellow |
| 111 = white |
'--------------*/
#define Z_ZX_SPECTRUM_COLOR_BLACK 0
#define Z_ZX_SPECTRUM_COLOR_BLUE 1
#define Z_ZX_SPECTRUM_COLOR_RED 2
#define Z_ZX_SPECTRUM_COLOR_MAGENTA 3
#define Z_ZX_SPECTRUM_COLOR_GREEN 4
#define Z_ZX_SPECTRUM_COLOR_CYAN 5
#define Z_ZX_SPECTRUM_COLOR_YELLOW 6
#define Z_ZX_SPECTRUM_COLOR_WHITE 7
typedef Z_PACKED_UNION_BEGIN {
zuint8 value;
struct {Z_BIT_FIELD_MEMBERS(8, 4) (
zuint8 flash :1,
zuint8 bright :1,
zuint8 paper :3,
zuint8 ink :3
)} fields;
} Z_PACKED_UNION_END Z_ZXSpectrumColorAttribute;
#define Z_ZX_SPECTRUM_ATTRIBUTE_SQUARE_WIDTH 8
#define Z_ZX_SPECTRUM_ATTRIBUTE_SQUARE_HEIGHT 8
#define Z_ZX_SPECTRUM_BRIGHT_COLOR_PALETTE(rgb) \
rgb(0.0, 0.0, 0.0), /* bright black */ \
rgb(0.0, 0.0, 1.0), /* bright blue */ \
rgb(1.0, 0.0, 0.0), /* bright red */ \
rgb(1.0, 0.0, 1.0), /* bright magenta */ \
rgb(0.0, 1.0, 0.0), /* bright green */ \
rgb(0.0, 1.0, 1.0), /* bright cyan */ \
rgb(1.0, 1.0, 0.0), /* bright yellow */ \
rgb(1.0, 1.0, 1.0) /* bright white */
#define Z_ZX_SPECTRUM_BASIC_COLOR_PALETTE(rgb) \
rgb(0.0, 0.0, 0.0 ), /* black */ \
rgb(0.0, 0.0, 0.84), /* basic blue */ \
rgb(0.84, 0.0, 0.0 ), /* basic red */ \
rgb(0.84, 0.0, 0.84), /* basic magenta */ \
rgb(0.0, 0.84, 0.0 ), /* basic green */ \
rgb(0.0, 0.84, 0.84), /* basic cyan */ \
rgb(0.84, 0.84, 0.0 ), /* basic yellow */ \
rgb(0.84, 0.84, 0.84) /* basic white */
typedef Z_PACKED_STRUCTURE_BEGIN {
zuint8 characters[Z_ZX_SPECTRUM_SIZE_CHARACTER_VRAM];
Z_ZXSpectrumColorAttribute attributes[Z_ZX_SPECTRUM_SIZE_ATTRIBUTE_VRAM];
} Z_PACKED_STRUCTURE_END Z_ZXSpectrumVRAM;
/* MARK: - I/O ports */
#define Z_ZX_SPECTRUM_PMIO_ULA 0x00FE /* R/W */
#define Z_ZX_SPECTRUM_PLUS_128K_PMIO_BANK_SWITCH 0x7FFD /* W */
#define Z_ZX_SPECTRUM_PLUS_128K_PMIO_PSG_DATA_OUTPUT 0xBFFD /* W */
#define Z_ZX_SPECTRUM_PLUS_128K_PMIO_PSG_DATA_INPUT 0xFFFD /* R */
#define Z_ZX_SPECTRUM_PLUS_128K_PMIO_PSG_REGISTER_INDEX 0xFFFD /* W */
#define Z_ZX_SPECTRUM_PLUS2_PMIO_JOYSTICK_1 0xEFFE /* R */
#define Z_ZX_SPECTRUM_PLUS2_PMIO_JOYSTICK_2 0xF7FE /* R */
#define Z_ZX_SPECTRUM_PLUS3_PMIO_CONTROL 0x1FFD /* W */
#define Z_ZX_SPECTRUM_PLUS3_PMIO_FDD_STATUS 0x2FFD /* R */
#define Z_ZX_SPECTRUM_PLUS3_PMIO_FDD_DATA 0x3FFD /* R/W */
#define Z_ZX_SPECTRUM_PLUS3_PMIO_PSG_REGISTER_INDEX_MIRROR 0xBFFD /* ? */
#define Z_ZX_SPECTRUM_UNASSIGNED_PMIO_INPUT 0xFF
/* MARK: - ULA I/O port */
/* HIGH BYTE LOW BYTE
.-----------------.-----------------.
| 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 |
'-\_____________/-'-\___/-|-|-\___/-'
| unused | | '---- border color
keyboard (read) | '-------- MIC / tape output
| '---------- EAR output / speaker
'-------.
|
76543210 0 1 2 3 4
.--------------------------------------------------.
.--------| _______0 | SHIFT | Z | X | C | V |
| |----------+-------+-------+-------+-------+-------|
| .------| ______0_ | A | S | D | F | G |
| | |----------+-------+-------+-------+-------+-------|
| | .----| _____0__ | Q | W | E | R | T |
| | | |----------+-------+-------+-------+-------+-------|
| | | .--| ____0___ | 1 | 2 | 3 | 4 | 5 |
| | | | |----------+-------+-------+-------+-------+-------|
| | | | | ___0____ | 0 | 9 | 8 | 7 | 6 |-------------.
N | | | | |----------+-------+-------+-------+-------+-------| | R
O | | | | | __0_____ | P | O | I | U | Y |-----------. | E
R | | | | |----------+-------+-------+-------+-------+-------| | | V
M | | | | | _0______ | ENTER | L | K | J | H |---------. | | E
A | | | | |----------+-------+-------+-------+-------+-------| | | | R
L | | | | | 0_______ | SPACE | SY/SH | M | N | B |-------. | | | S
| | | | '==================================================' | | | | E
M | | | | | | | | D
A | | | | ____________________________ _______________________ | | | |
T | | | | | ___. __ _ __ . __ /\ / | | | | | M
R | | | | | __\ || ||__|__|--||| / / / | | | | | A
I | | | | | ZX Spectrum / / / | | | | | T
X | | | | | / / / | | | | | R
| | | | | ______________________/ / /__________________________ | | | | | I
| | | | |/_____________________/ / /___________________________\| | | | | I
| | | | | _ _ _ _ _ / / / _ _ _ _ _ | | | | | X
| | | '--> [1] [2] [3] [4] [5] \/ \[6] [7] [8] [9] [0] <-----------------'
| | | | _ _ _ _ _\ \ _ _ _ _ _ | | | |
| | '-------> [Q] [W] [E] [R] [T]\ \ [Y] [U] [I] [O] [P] <------------'
| | | _ _ _ _ _\ \ _ _ _ _ _____//| | |
| '-----------> [A] [S] [D] [F] [G]\ \ [H] [J] [K] [L] [ENTER] <----'
| | _____ _ _ _ _ /\ / _ _ _ __ ___////| |
'--------> [SHIFT] [Z] [X] [C] [V]/ / / [B] [N] [M] [SS] [SPACE] <--'
|_______________________/ / /_____________________////__|
(_______________________\/ \___________________________) */
typedef Z_PACKED_UNION_BEGIN {
zuint8 value;
struct {Z_BIT_FIELD_MEMBERS(8, 4) (
zuint8 unused :3,
zuint8 mic :1,
zuint8 ear :1,
zuint8 border_color :3
)} fields;
} Z_PACKED_UNION_END Z_ZXSpectrumULAIO;
/* MARK: - ULA I/O port: input value */
/*----------------.
| 7 6 5 4 3 2 1 0 |
'-|-|-\_________/-'
1 | key mask
EAR input
.------------------------------------.
| Special keys |
|------------------------------------|
| DELETE = SHIFT + 0 |
| EDIT = SHIFT + 1 |
| CAPS LOCK = SHIFT + 2 |
| TRUE VIDEO = SHIFT + 3 |
| INV VIDEO = SHIFT + 4 |
| ↑ = SHIFT + 7 |
| ↓ = SHIFT + 6 |
| → = SHIFT + 5 |
| ← = SHIFT + 8 |
| GRAPH = SHIFT + 9 |
| BREAK = SHIFT + SPACE |
| EXTEND MODE = SHIFT + SYMBOL SHIFT |
| . = SYMBOL SHIFT + M |
| , = SYMBOL SHIFT + N |
| ; = SYMBOL SHIFT + O |
| " = SYMBOL SHIFT + P |
'===================================*/
typedef Z_PACKED_UNION_BEGIN {
zuint8 value;
struct {Z_BIT_FIELD_MEMBERS(8, 3) (
zuint8 one :1,
zuint8 ear :1,
zuint8 key_mask :6
)} fields;
} Z_PACKED_UNION_END Z_ZXSpectrumULAInput;
#define Z_ZX_SPECTRUM_KEY_MASK_ENTER 0x0F
#define Z_ZX_SPECTRUM_KEY_MASK_SHIFT 0x0F
#define Z_ZX_SPECTRUM_KEY_MASK_SPACE 0x0F
#define Z_ZX_SPECTRUM_KEY_MASK_0 0x0F
#define Z_ZX_SPECTRUM_KEY_MASK_1 0x0F
#define Z_ZX_SPECTRUM_KEY_MASK_2 0x17
#define Z_ZX_SPECTRUM_KEY_MASK_3 0x1B
#define Z_ZX_SPECTRUM_KEY_MASK_4 0x1D
#define Z_ZX_SPECTRUM_KEY_MASK_5 0x1E
#define Z_ZX_SPECTRUM_KEY_MASK_6 0x1E
#define Z_ZX_SPECTRUM_KEY_MASK_7 0x1D
#define Z_ZX_SPECTRUM_KEY_MASK_8 0x1B
#define Z_ZX_SPECTRUM_KEY_MASK_9 0x17
#define Z_ZX_SPECTRUM_KEY_MASK_A 0x0F
#define Z_ZX_SPECTRUM_KEY_MASK_B 0x1E
#define Z_ZX_SPECTRUM_KEY_MASK_C 0x1D
#define Z_ZX_SPECTRUM_KEY_MASK_D 0x1B
#define Z_ZX_SPECTRUM_KEY_MASK_E 0x1B
#define Z_ZX_SPECTRUM_KEY_MASK_F 0x1D
#define Z_ZX_SPECTRUM_KEY_MASK_G 0x1E
#define Z_ZX_SPECTRUM_KEY_MASK_H 0x1E
#define Z_ZX_SPECTRUM_KEY_MASK_I 0x1B
#define Z_ZX_SPECTRUM_KEY_MASK_J 0x1D
#define Z_ZX_SPECTRUM_KEY_MASK_K 0x1B
#define Z_ZX_SPECTRUM_KEY_MASK_L 0x17
#define Z_ZX_SPECTRUM_KEY_MASK_M 0x1B
#define Z_ZX_SPECTRUM_KEY_MASK_N 0x1D
#define Z_ZX_SPECTRUM_KEY_MASK_O 0x17
#define Z_ZX_SPECTRUM_KEY_MASK_P 0x0F
#define Z_ZX_SPECTRUM_KEY_MASK_Q 0x0F
#define Z_ZX_SPECTRUM_KEY_MASK_R 0x1D
#define Z_ZX_SPECTRUM_KEY_MASK_S 0x17
#define Z_ZX_SPECTRUM_KEY_MASK_T 0x1E
#define Z_ZX_SPECTRUM_KEY_MASK_U 0x1D
#define Z_ZX_SPECTRUM_KEY_MASK_V 0x1E
#define Z_ZX_SPECTRUM_KEY_MASK_W 0x17
#define Z_ZX_SPECTRUM_KEY_MASK_X 0x1B
#define Z_ZX_SPECTRUM_KEY_MASK_Y 0x1E
#define Z_ZX_SPECTRUM_KEY_MASK_Z 0x17
#define Z_ZX_SPECTRUM_KEY_MASK_SYMBOL_SHIFT 0x17
#define Z_ZX_SPECTRUM_KEY_ROW_ENTER 6
#define Z_ZX_SPECTRUM_KEY_ROW_SHIFT 0
#define Z_ZX_SPECTRUM_KEY_ROW_SPACE 7
#define Z_ZX_SPECTRUM_KEY_ROW_0 4
#define Z_ZX_SPECTRUM_KEY_ROW_1 3
#define Z_ZX_SPECTRUM_KEY_ROW_2 3
#define Z_ZX_SPECTRUM_KEY_ROW_3 3
#define Z_ZX_SPECTRUM_KEY_ROW_4 3
#define Z_ZX_SPECTRUM_KEY_ROW_5 3
#define Z_ZX_SPECTRUM_KEY_ROW_6 4
#define Z_ZX_SPECTRUM_KEY_ROW_7 4
#define Z_ZX_SPECTRUM_KEY_ROW_8 4
#define Z_ZX_SPECTRUM_KEY_ROW_9 4
#define Z_ZX_SPECTRUM_KEY_ROW_A 1
#define Z_ZX_SPECTRUM_KEY_ROW_B 7
#define Z_ZX_SPECTRUM_KEY_ROW_C 0
#define Z_ZX_SPECTRUM_KEY_ROW_D 1
#define Z_ZX_SPECTRUM_KEY_ROW_E 2
#define Z_ZX_SPECTRUM_KEY_ROW_F 1
#define Z_ZX_SPECTRUM_KEY_ROW_G 1
#define Z_ZX_SPECTRUM_KEY_ROW_H 6
#define Z_ZX_SPECTRUM_KEY_ROW_I 5
#define Z_ZX_SPECTRUM_KEY_ROW_J 6
#define Z_ZX_SPECTRUM_KEY_ROW_K 6
#define Z_ZX_SPECTRUM_KEY_ROW_L 6
#define Z_ZX_SPECTRUM_KEY_ROW_M 7
#define Z_ZX_SPECTRUM_KEY_ROW_N 7
#define Z_ZX_SPECTRUM_KEY_ROW_O 5
#define Z_ZX_SPECTRUM_KEY_ROW_P 5
#define Z_ZX_SPECTRUM_KEY_ROW_Q 2
#define Z_ZX_SPECTRUM_KEY_ROW_R 2
#define Z_ZX_SPECTRUM_KEY_ROW_S 1
#define Z_ZX_SPECTRUM_KEY_ROW_T 2
#define Z_ZX_SPECTRUM_KEY_ROW_U 5
#define Z_ZX_SPECTRUM_KEY_ROW_V 0
#define Z_ZX_SPECTRUM_KEY_ROW_W 2
#define Z_ZX_SPECTRUM_KEY_ROW_X 0
#define Z_ZX_SPECTRUM_KEY_ROW_Y 5
#define Z_ZX_SPECTRUM_KEY_ROW_Z 0
#define Z_ZX_SPECTRUM_KEY_ROW_SYMBOL_SHIFT 7
#define Z_ZX_SPECTRUM_KEY_OFFSET_ENTER 0
#define Z_ZX_SPECTRUM_KEY_OFFSET_SHIFT 0
#define Z_ZX_SPECTRUM_KEY_OFFSET_SPACE 0
#define Z_ZX_SPECTRUM_KEY_OFFSET_0 0
#define Z_ZX_SPECTRUM_KEY_OFFSET_1 0
#define Z_ZX_SPECTRUM_KEY_OFFSET_2 1
#define Z_ZX_SPECTRUM_KEY_OFFSET_3 2
#define Z_ZX_SPECTRUM_KEY_OFFSET_4 3
#define Z_ZX_SPECTRUM_KEY_OFFSET_5 4
#define Z_ZX_SPECTRUM_KEY_OFFSET_6 4
#define Z_ZX_SPECTRUM_KEY_OFFSET_7 3
#define Z_ZX_SPECTRUM_KEY_OFFSET_8 2
#define Z_ZX_SPECTRUM_KEY_OFFSET_9 1
#define Z_ZX_SPECTRUM_KEY_OFFSET_A 0
#define Z_ZX_SPECTRUM_KEY_OFFSET_B 4
#define Z_ZX_SPECTRUM_KEY_OFFSET_C 3
#define Z_ZX_SPECTRUM_KEY_OFFSET_D 2
#define Z_ZX_SPECTRUM_KEY_OFFSET_E 2
#define Z_ZX_SPECTRUM_KEY_OFFSET_F 3
#define Z_ZX_SPECTRUM_KEY_OFFSET_G 4
#define Z_ZX_SPECTRUM_KEY_OFFSET_H 4
#define Z_ZX_SPECTRUM_KEY_OFFSET_I 2
#define Z_ZX_SPECTRUM_KEY_OFFSET_J 3
#define Z_ZX_SPECTRUM_KEY_OFFSET_K 2
#define Z_ZX_SPECTRUM_KEY_OFFSET_L 1
#define Z_ZX_SPECTRUM_KEY_OFFSET_M 2
#define Z_ZX_SPECTRUM_KEY_OFFSET_N 3
#define Z_ZX_SPECTRUM_KEY_OFFSET_O 1
#define Z_ZX_SPECTRUM_KEY_OFFSET_P 0
#define Z_ZX_SPECTRUM_KEY_OFFSET_Q 0
#define Z_ZX_SPECTRUM_KEY_OFFSET_R 3
#define Z_ZX_SPECTRUM_KEY_OFFSET_S 1
#define Z_ZX_SPECTRUM_KEY_OFFSET_T 4
#define Z_ZX_SPECTRUM_KEY_OFFSET_U 3
#define Z_ZX_SPECTRUM_KEY_OFFSET_V 4
#define Z_ZX_SPECTRUM_KEY_OFFSET_W 1
#define Z_ZX_SPECTRUM_KEY_OFFSET_X 2
#define Z_ZX_SPECTRUM_KEY_OFFSET_Y 4
#define Z_ZX_SPECTRUM_KEY_OFFSET_Z 1
#define Z_ZX_SPECTRUM_KEY_OFFSET_SYMBOL_SHIFT 1
/* MARK: - 7FFDh - ZX Spectrum +128K - Bank Switch */
/*----------------.
| 7 6 5 4 3 2 1 0 |
'-\_/-|-|-|-\___/-'
unused| | | '---- user (C000h)
| | '-------- VRAM
| '---------- ROM
'------------ disable */
typedef Z_PACKED_UNION_BEGIN {
zuint8 value;
struct {Z_BIT_FIELD_MEMBERS(8, 5) (
zuint8 unused :2,
zuint8 disable :1,
zuint8 rom :1,
zuint8 vram :1,
zuint8 user :3
)} fields;
} Z_PACKED_UNION_END Z_ZXSpectrumPlus128KBankSwitch;
/* MARK: - 0x1FFD - ZX Spectrum +3 - Control */
/*----------------.
| 7 6 5 4 3 2 1 0 |
'-\___/-|-|-\_/-|-'
unused | | | '--
| | '-----
| '--------
'---------- */
typedef Z_PACKED_UNION_BEGIN {
zuint8 value;
struct {Z_BIT_FIELD_MEMBERS(8, 5) (
zuint8 unused :3,
zuint8 enable_printer_strobe :1,
zuint8 enable_fdd_motor :1,
zuint8 bank_map :2,
zuint8 use_extended_banking :1
)} fields;
} Z_PACKED_UNION_END Z_ZXSpectrumPlus3Control;
/* MARK: - 2FFDh - ZX Spectrum +3 - FDD Status */
/*----------------.
| 7 6 5 4 3 2 1 0 |
'-\___/-|-|-|-|-|-'
unused | | | | '--
| | | '----
| | '------
| '--------
'---------- */
/*typedef Z_PACKED_UNION_BEGIN {
zuint8 value;
struct {Z_BIT_FIELD_MEMBERS(8, 6) (
)} fields;
} Z_PACKED_UNION_END Z_ZXSpectrumPlus3FDDStatus;*/
/* MARK: - 3FFDh - ZX Spectrum +3 - FDD Data */
/*----------------.
| 7 6 5 4 3 2 1 0 |
'-\___/-|-|-|-|-|-'
unused | | | | '-- user (C000h)
| | | '---- VRAM
| | '------ ROM
| '-------- disable
'---------- */
/*typedef Z_PACKED_UNION_BEGIN {
zuint8 value;
struct {Z_BIT_FIELD_MEMBERS(8, 6) (
)} fields;
} Z_PACKED_UNION_END Z_ZXSpectrumPlus3FDDStatus;*/
/* MARK: - Screen */
/*-------------------------------------------------------------------.
| References: |
| https://retrocomputing.stackexchange.com/questions/25107 |
| http://www.zxdesign.info/vidparam.shtml |
| http://zxprojects.com/inves |
| https://www.speccy.pl/forum/index.php?topic=1006.msg14258#msg14258 |
'===================================================================*/
/*
.- - <-INT-> - - - - - - - - - - - - - -. --- ---
: VBLANK + Invisible Top Border : | 16 / 15 |
.---------------------------------.- - -: --- --- |
| Top Border | : | 48 | |
|----.-----------------------.----| : --- | |
|L | |R | : | | |
|e | |i | H : | | |
|f B| |g B| B : | | |
|t o| Paper |h o| L : | 192 | 296 | 312 / 311
| r| |t r| A : | | |
| d| | d| N : | | |
| e| | e| K : | | |
| r| | r| : | | |
|----'-----------------------'----| : --- | |
| Bottom Border | : | 56 | |
'---------------------------------'- - -' --- --- ---
|----|-----------------------|----|
48 256 48
|---------------------------------|
352 */
#define Z_ZX_SPECTRUM_SCREEN_FPS 50
#define Z_ZX_SPECTRUM_SCREEN_WIDTH 352
#define Z_ZX_SPECTRUM_SCREEN_HEIGHT 296
#define Z_ZX_SPECTRUM_SCREEN_PIXELS 104192 /* 352 * 296 */
#define Z_ZX_SPECTRUM_SCREEN_PAPER_WIDTH 256
#define Z_ZX_SPECTRUM_SCREEN_PAPER_HEIGHT 192
#define Z_ZX_SPECTRUM_SCREEN_PAPER_PIXELS 49152 /* 256 * 192 */
#define Z_ZX_SPECTRUM_SCREEN_TOP_BORDER_HEIGHT 48
#define Z_ZX_SPECTRUM_SCREEN_TOP_BORDER_PIXELS 16896
#define Z_ZX_SPECTRUM_SCREEN_BOTTOM_BORDER_HEIGHT 56
#define Z_ZX_SPECTRUM_SCREEN_BOTTOM_BORDER_PIXELS 19712
#define Z_ZX_SPECTRUM_SCREEN_LATERAL_BORDER_WIDTH 48
/* MARK: - Timings */
#define Z_ZX_SPECTRUM_CPU_HZ 3500000
#define Z_ZX_SPECTRUM_CYCLES_PER_FRAME 69888
#define Z_ZX_SPECTRUM_CYCLES_PER_SCANLINE 224
#define Z_ZX_SPECTRUM_CYCLES_PER_HBLANK 48
#define Z_ZX_SPECTRUM_CYCLES_PER_FULL_BORDER_LINE 176
#define Z_ZX_SPECTRUM_CYCLES_PER_LATERAL_BORDER_LINE 24
#define Z_ZX_SPECTRUM_CYCLES_PER_PAPER_LINE 128
#define Z_ZX_SPECTRUM_CYCLES_PER_INT 32
#define Z_ZX_SPECTRUM_CYCLES_AT_VBLANK 0
#define Z_ZX_SPECTRUM_CYCLES_AT_INT 24
#define Z_ZX_SPECTRUM_CYCLES_AT_INT_END 56
#define Z_ZX_SPECTRUM_CYCLES_AT_TOP_BORDER 3584
#define Z_ZX_SPECTRUM_CYCLES_AT_PAPER_REGION 14336
#define Z_ZX_SPECTRUM_CYCLES_AT_PAPER 14360
#define Z_ZX_SPECTRUM_CYCLES_AT_PAPER_END 57272
#define Z_ZX_SPECTRUM_CYCLES_AT_BOTTOM_BORDER 57344
#define Z_ZX_SPECTRUM_PLUS_128K_CPU_HZ 3546900
#define Z_ZX_SPECTRUM_PLUS_128K_PSG_HZ 1773400
#define Z_ZX_SPECTRUM_PLUS_128K_CYCLES_PER_FRAME 70908
#define Z_ZX_SPECTRUM_PLUS_128K_CYCLES_PER_SCANLINE 228
#define Z_ZX_SPECTRUM_PLUS_128K_CYCLES_PER_HBLANK 52
#define Z_ZX_SPECTRUM_PLUS_128K_CYCLES_PER_FULL_BORDER_LINE 176
#define Z_ZX_SPECTRUM_PLUS_128K_CYCLES_PER_LATERAL_BORDER_LINE 24
#define Z_ZX_SPECTRUM_PLUS_128K_CYCLES_PER_PAPER_LINE 128
#define Z_ZX_SPECTRUM_PLUS_128K_CYCLES_PER_INT 36
#define Z_ZX_SPECTRUM_PLUS_128K_CYCLES_AT_VBLANK 0
#define Z_ZX_SPECTRUM_PLUS_128K_CYCLES_AT_INT 24
#define Z_ZX_SPECTRUM_PLUS_128K_CYCLES_AT_INT_END 60
#define Z_ZX_SPECTRUM_PLUS_128K_CYCLES_AT_TOP_BORDER 3420
#define Z_ZX_SPECTRUM_PLUS_128K_CYCLES_AT_PAPER_REGION 14364
#define Z_ZX_SPECTRUM_PLUS_128K_CYCLES_AT_PAPER 14388
#define Z_ZX_SPECTRUM_PLUS_128K_CYCLES_AT_PAPER_END 58064
#define Z_ZX_SPECTRUM_PLUS_128K_CYCLES_AT_BOTTOM_BORDER 58140
#define Z_ZX_SPECTRUM_PLUS3_CPU_HZ 3546900
#define Z_ZX_SPECTRUM_PLUS3_PSG_HZ 1773400
#define Z_ZX_SPECTRUM_PLUS3_CYCLES_PER_FRAME 70908
#define Z_ZX_SPECTRUM_PLUS3_CYCLES_PER_SCANLINE 228
#define Z_ZX_SPECTRUM_PLUS3_CYCLES_PER_HBLANK 52
#define Z_ZX_SPECTRUM_PLUS3_CYCLES_PER_FULL_BORDER_LINE 176
#define Z_ZX_SPECTRUM_PLUS3_CYCLES_PER_LATERAL_BORDER_LINE 24
#define Z_ZX_SPECTRUM_PLUS3_CYCLES_PER_PAPER_LINE 128
#define Z_ZX_SPECTRUM_PLUS3_CYCLES_PER_INT 32
#define Z_ZX_SPECTRUM_PLUS3_CYCLES_AT_VBLANK 0
#define Z_ZX_SPECTRUM_PLUS3_CYCLES_AT_INT 24
#define Z_ZX_SPECTRUM_PLUS3_CYCLES_AT_INT_END 56
#define Z_ZX_SPECTRUM_PLUS3_CYCLES_AT_TOP_BORDER 3420
#define Z_ZX_SPECTRUM_PLUS3_CYCLES_AT_PAPER_REGION 14364
#define Z_ZX_SPECTRUM_PLUS3_CYCLES_AT_PAPER 14388
#define Z_ZX_SPECTRUM_PLUS3_CYCLES_AT_PAPER_END 58064
#define Z_ZX_SPECTRUM_PLUS3_CYCLES_AT_BOTTOM_BORDER 58140
#define Z_INVES_SPECTRUM_PLUS_CPU_HZ 3546900
#define Z_INVES_SPECTRUM_PLUS_PSG_HZ 1773400
#define Z_INVES_SPECTRUM_PLUS_CYCLES_PER_FRAME 70908
#define Z_INVES_SPECTRUM_PLUS_CYCLES_PER_SCANLINE 228
#define Z_INVES_SPECTRUM_PLUS_CYCLES_PER_HBLANK 52
#define Z_INVES_SPECTRUM_PLUS_CYCLES_PER_FULL_BORDER_LINE 176
#define Z_INVES_SPECTRUM_PLUS_CYCLES_PER_LATERAL_BORDER_LINE 24
#define Z_INVES_SPECTRUM_PLUS_CYCLES_PER_PAPER_LINE 128
#define Z_INVES_SPECTRUM_PLUS_CYCLES_PER_INT 32
#define Z_INVES_SPECTRUM_PLUS_CYCLES_AT_VBLANK 0
#define Z_INVES_SPECTRUM_PLUS_CYCLES_AT_TOP_BORDER 3420
#define Z_INVES_SPECTRUM_PLUS_CYCLES_AT_INT 14176
#define Z_INVES_SPECTRUM_PLUS_CYCLES_AT_INT_END 14208
#define Z_INVES_SPECTRUM_PLUS_CYCLES_AT_PAPER_REGION 14364
#define Z_INVES_SPECTRUM_PLUS_CYCLES_AT_BOTTOM_BORDER 58140
#define Z_INVES_SPECTRUM_PLUS_CYCLES_AT_PAPER 14388
#define Z_INVES_SPECTRUM_PLUS_CYCLES_AT_PAPER_END 58064
#define Z_INVES_SPECTRUM_PLUS_MASTER_CLOCK_HZ 177345
#define Z_INVES_SPECTRUM_PLUS_CPU_HZ 3546900
/* http://retrowiki.es/viewtopic.php?t=200032843&start=16#p200078815 */
/* https://worldofspectrum.org/faq/reference/tmxreference.htm */
/* https://sinclair.wiki.zxnet.co.uk/wiki/Timex_2000_series */
#define Z_TIMEX_SINCLAIR_2068_CPU_HZ 3528000 /* OK? */
#define Z_TIMEX_SINCLAIR_2068_PSG_HZ 1764750 /* OK? */
#define Z_TIMEX_SINCLAIR_2068_CYCLES_PER_FRAME 70512 /* OK? */
#define Z_TIMEX_SINCLAIR_2068_CYCLES_PER_SCANLINE 226 /* OK? */
#define Z_TIMEX_SINCLAIR_2068_CYCLES_PER_HBLANK 48
#define Z_TIMEX_SINCLAIR_2068_CYCLES_PER_FULL_BORDER_LINE 176
#define Z_TIMEX_SINCLAIR_2068_CYCLES_PER_LATERAL_BORDER_LINE 24
#define Z_TIMEX_SINCLAIR_2068_CYCLES_PER_PAPER_LINE 128
#define Z_TIMEX_SINCLAIR_2068_CYCLES_PER_INT 32
#define Z_TIMEX_SINCLAIR_2068_CYCLES_AT_VBLANK 0
#define Z_TIMEX_SINCLAIR_2068_CYCLES_AT_INT 24
#define Z_TIMEX_SINCLAIR_2068_CYCLES_AT_INT_END 56
#define Z_TIMEX_SINCLAIR_2068_CYCLES_AT_TOP_BORDER 3584
#define Z_TIMEX_SINCLAIR_2068_CYCLES_AT_PAPER_REGION 14336
#define Z_TIMEX_SINCLAIR_2068_CYCLES_AT_PAPER 14360
#define Z_TIMEX_SINCLAIR_2068_CYCLES_AT_PAPER_END 57272
#define Z_TIMEX_SINCLAIR_2068_CYCLES_AT_BOTTOM_BORDER 57344
#define Z_DIDAKTIK_M_CPU_HZ
#define Z_DIDAKTIK_M_CYCLES_PER_FRAME
#define Z_DIDAKTIK_M_CYCLES_PER_SCANLINE
#define Z_DIDAKTIK_M_CYCLES_PER_HBLANK
#define Z_DIDAKTIK_M_CYCLES_PER_VBLANK
#define Z_DIDAKTIK_M_CYCLES_PER_FULL_BORDER_LINE
#define Z_DIDAKTIK_M_CYCLES_PER_LATERAL_BORDER_LINE
#define Z_DIDAKTIK_M_CYCLES_PER_PAPER_LINE
#define Z_DIDAKTIK_M_CYCLES_PER_INT
#define Z_DIDAKTIK_M_CYCLES_AT_VBLANK
#define Z_DIDAKTIK_M_CYCLES_AT_INT
#define Z_DIDAKTIK_M_CYCLES_AT_TOP_BORDER
#define Z_DIDAKTIK_M_CYCLES_AT_PAPER_REGION
#define Z_DIDAKTIK_M_CYCLES_AT_BOTTOM_BORDER
#define Z_DIDAKTIK_M_CYCLES_AT_PAPER
#define Z_DIDAKTIK_M_CYCLES_AT_PAPER_END
/* MARK: - Firmware ADC */
/*-------------------------------------------------------.
| High _______ _______ |
| | Pulse | Pulse | Pulse | Pulse Square wave |
| | |_______| |_______ ... |
| Low |
|--------------------------------------------------------|
| 1) Pilot |
| ______ |
| | 2168 | 2168 x 8063 times (if block contains header) |
| | |______ x 3223 times (if block contains data) |
|--------------------------------------------------------|
| 2) Sync | 3) Pause |
| _____ | |
| | 667 | 735 | 1 second |
| | |_______ | ____________________________________ |
| |
'=======================================================*/
#define Z_ZX_SPECTRUM_ADC_PULSES_PER_HEADER_PILOT 8063 /* 5 seconds */
#define Z_ZX_SPECTRUM_ADC_PULSES_PER_DATA_PILOT 3223 /* 2 seconds */
#define Z_ZX_SPECTRUM_ADC_CYCLES_PER_PILOT_PULSE 2168 /* 807.2 Hz */
#define Z_ZX_SPECTRUM_ADC_CYCLES_PER_SYNC_HIGH_PULSE 667 /* 2623.7 Hz */
#define Z_ZX_SPECTRUM_ADC_CYCLES_PER_SYNC_LOW_PULSE 735 /* 2381 Hz */
#define Z_ZX_SPECTRUM_ADC_CYCLES_PER_BIT_0_PULSE 855 /* 2046.8 Hz */
#define Z_ZX_SPECTRUM_ADC_CYCLES_PER_BIT_1_PULSE 1710 /* 1023.4 Hz */
#define Z_ZX_SPECTRUM_ADC_CYCLES_PER_TAIL 945
#define Z_ZX_SPECTRUM_ADC_CYCLES_PER_PAUSE 3500000
#define Z_ZX_SPECTRUM_ADC_CYCLES_PER_HEADER_PILOT 17482752 /* 2168 * 8064 */
#define Z_ZX_SPECTRUM_ADC_CYCLES_PER_DATA_PILOT 6989632 /* 2168 * 3224 */
#define Z_ZX_SPECTRUM_ADC_BLOCK_CONTENT_HEADER 0
#define Z_ZX_SPECTRUM_ADC_BLOCK_CONTENT_DATA 255
typedef Z_PACKED_STRUCTURE_BEGIN {
zuint8 file_type;
zuint8 file_name[10];
zuint16 data_size;
union { struct {zuint16 autostart_line;
zuint16 size;
} program;
struct {zuint8 unused1;
zuint8 variable_name;
zuint16 unused2;
} array;
struct {zuint16 start_address;
zuint16 unused;
} code_file;
} parameters;
} Z_PACKED_STRUCTURE_END Z_ZXSpectrumHeaderBlock;
#define Z_ZX_SPECTRUM_FILE_TYPE_PROGRAM 0
#define Z_ZX_SPECTRUM_FILE_TYPE_NUMBER_ARRAY 1
#define Z_ZX_SPECTRUM_FILE_TYPE_CHARACTER_ARRAY 2
#define Z_ZX_SPECTRUM_FILE_TYPE_CODE_FILE 3
#endif /* Z_hardware_machine_computer_ZX_Spectrum_H */