/* 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 #include #include /* 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 */