948 lines
39 KiB
C
Vendored
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 */
|