//auto generated 2025-12-13 14:04:40

#ifndef ZXDEFINITIONS_H
#define ZXDEFINITIONS_H
#include "Uni/zxsp_types.h"

const cstr	   zxsp_i1_name						   = "ZX Spectrum Issue 1";
const bool	   zxsp_i1_is_supported				   = 1;
const bool	   zxsp_i1_has_zxsp_bus				   = yes;
const bool	   zxsp_i1_has_zx80_bus				   = no;
const isa_id   zxsp_i1_id						   = isa_MachineZxsp;
const cstr	   zxsp_i1_nickname					   = "zxsp_i1";
const cstr	   zxsp_i1_rom_filename				   = "48k.rom";
const cstr	   zxsp_i1_kbd_filename				   = "16k_kbd.png";
const cstr	   zxsp_i1_image_filename			   = "zxsp_i1.jpg";
const Language zxsp_i1_language					   = british;
const uint32   zxsp_i1_ula_cycles_per_second	   = 14000000;
const uint	   zxsp_i1_cpu_clock_predivider		   = 4;
const uint32   zxsp_i1_cpu_cycles_per_second	   = 3500000;
const uint	   zxsp_i1_cpu_cycles_per_line		   = 224;
const uint	   zxsp_i1_lines_before_screen		   = 64;
const uint	   zxsp_i1_lines_in_screen			   = 192;
const uint	   zxsp_i1_lines_after_screen		   = 56;
const uint32   zxsp_i1_cpu_cycles_per_frame		   = 69888;
const double   zxsp_i1_frames_per_second		   = 50.0801282051;
const bool	   zxsp_i1_has_50_60hz_switch		   = 0;
const uint	   zxsp_i1_page_size				   = 16384;
const uint	   zxsp_i1_rom_pages				   = 1;
const uint	   zxsp_i1_ram_pages				   = 1;
const uint32   zxsp_i1_rom_size					   = 16384;
const uint32   zxsp_i1_ram_size					   = 16384;
const uint32   zxsp_i1_contended_rampages		   = 0x80000000;
const uint8	   zxsp_i1_waitmap					   = 0x7e;
const uint32   zxsp_i1_videoram_start			   = 0x0000;
const uint32   zxsp_i1_videoram_start_2			   = 0;
const uint32   zxsp_i1_videoram_size			   = 6912;
const uint	   zxsp_i1_characterram_start		   = 0;
const uint	   zxsp_i1_characterram_size		   = 0;
const float	   zxsp_i1_earin_threshold_mic_lo	   = 0.005;
const float	   zxsp_i1_earin_threshold_mic_hi	   = -0.005;
const uint	   zxsp_i1_tape_load_routine		   = 0x0556;
const uint	   zxsp_i1_tape_save_routine		   = 0x04d0;
const uint	   zxsp_i1_tape_load_ret_addr		   = 0x053f;
const bool	   zxsp_i1_has_port_7ffd			   = no;
const bool	   zxsp_i1_has_port_1ffd			   = no;
const bool	   zxsp_i1_has_port_F4				   = no;
const bool	   zxsp_i1_has_port_FF				   = no;
const bool	   zxsp_i1_has_ay_soundchip			   = no;
const uint32   zxsp_i1_ay_cycles_per_second		   = 1750000;
const bool	   zxsp_i1_has_tape_drive			   = no;
const bool	   zxsp_i1_has_module_port			   = no;
const bool	   zxsp_i1_has_floppy_drive			   = no;
const bool	   zxsp_i1_has_printer_port			   = no;
const uint	   zxsp_i1_has_serial_ports			   = 0;
const uint	   zxsp_i1_has_joystick_ports		   = 0;
const bool	   zxsp_i1_has_kempston_joystick_ports = no;
const bool	   zxsp_i1_has_sinclair_joystick_ports = no;

const cstr	   zxsp_i2_name						   = "ZX Spectrum Issue 2";
const bool	   zxsp_i2_is_supported				   = 1;
const bool	   zxsp_i2_has_zxsp_bus				   = yes;
const bool	   zxsp_i2_has_zx80_bus				   = no;
const isa_id   zxsp_i2_id						   = isa_MachineZxsp;
const cstr	   zxsp_i2_nickname					   = "zxsp_i2";
const cstr	   zxsp_i2_rom_filename				   = "48k.rom";
const cstr	   zxsp_i2_kbd_filename				   = "48k_kbd.png";
const cstr	   zxsp_i2_image_filename			   = "zxsp_i3.jpg";
const Language zxsp_i2_language					   = british;
const uint32   zxsp_i2_ula_cycles_per_second	   = 14000000;
const uint	   zxsp_i2_cpu_clock_predivider		   = 4;
const uint32   zxsp_i2_cpu_cycles_per_second	   = 3500000;
const uint	   zxsp_i2_cpu_cycles_per_line		   = 224;
const uint	   zxsp_i2_lines_before_screen		   = 64;
const uint	   zxsp_i2_lines_in_screen			   = 192;
const uint	   zxsp_i2_lines_after_screen		   = 56;
const uint32   zxsp_i2_cpu_cycles_per_frame		   = 69888;
const double   zxsp_i2_frames_per_second		   = 50.0801282051;
const bool	   zxsp_i2_has_50_60hz_switch		   = 0;
const uint	   zxsp_i2_page_size				   = 16384;
const uint	   zxsp_i2_rom_pages				   = 1;
const uint	   zxsp_i2_ram_pages				   = 3;
const uint32   zxsp_i2_rom_size					   = 16384;
const uint32   zxsp_i2_ram_size					   = 49152;
const uint32   zxsp_i2_contended_rampages		   = 0x80000000;
const uint8	   zxsp_i2_waitmap					   = 0x7e;
const uint32   zxsp_i2_videoram_start			   = 0x0000;
const uint32   zxsp_i2_videoram_start_2			   = 0;
const uint32   zxsp_i2_videoram_size			   = 6912;
const uint	   zxsp_i2_characterram_start		   = 0;
const uint	   zxsp_i2_characterram_size		   = 0;
const float	   zxsp_i2_earin_threshold_mic_lo	   = 0.005;
const float	   zxsp_i2_earin_threshold_mic_hi	   = -0.005;
const uint	   zxsp_i2_tape_load_routine		   = 0x0556;
const uint	   zxsp_i2_tape_save_routine		   = 0x04d0;
const uint	   zxsp_i2_tape_load_ret_addr		   = 0x053f;
const bool	   zxsp_i2_has_port_7ffd			   = no;
const bool	   zxsp_i2_has_port_1ffd			   = no;
const bool	   zxsp_i2_has_port_F4				   = no;
const bool	   zxsp_i2_has_port_FF				   = no;
const bool	   zxsp_i2_has_ay_soundchip			   = no;
const uint32   zxsp_i2_ay_cycles_per_second		   = 1750000;
const bool	   zxsp_i2_has_tape_drive			   = no;
const bool	   zxsp_i2_has_module_port			   = no;
const bool	   zxsp_i2_has_floppy_drive			   = no;
const bool	   zxsp_i2_has_printer_port			   = no;
const uint	   zxsp_i2_has_serial_ports			   = 0;
const uint	   zxsp_i2_has_joystick_ports		   = 0;
const bool	   zxsp_i2_has_kempston_joystick_ports = no;
const bool	   zxsp_i2_has_sinclair_joystick_ports = no;

const cstr	   zxsp_i3_name						   = "ZX Spectrum Issue 3";
const bool	   zxsp_i3_is_supported				   = 1;
const bool	   zxsp_i3_has_zxsp_bus				   = yes;
const bool	   zxsp_i3_has_zx80_bus				   = no;
const isa_id   zxsp_i3_id						   = isa_MachineZxsp;
const cstr	   zxsp_i3_nickname					   = "zxsp_i3";
const cstr	   zxsp_i3_rom_filename				   = "48k.rom";
const cstr	   zxsp_i3_kbd_filename				   = "48k_kbd.png";
const cstr	   zxsp_i3_image_filename			   = "zxsp_i3.jpg";
const Language zxsp_i3_language					   = british;
const uint32   zxsp_i3_ula_cycles_per_second	   = 14000000;
const uint	   zxsp_i3_cpu_clock_predivider		   = 4;
const uint32   zxsp_i3_cpu_cycles_per_second	   = 3500000;
const uint	   zxsp_i3_cpu_cycles_per_line		   = 224;
const uint	   zxsp_i3_lines_before_screen		   = 64;
const uint	   zxsp_i3_lines_in_screen			   = 192;
const uint	   zxsp_i3_lines_after_screen		   = 56;
const uint32   zxsp_i3_cpu_cycles_per_frame		   = 69888;
const double   zxsp_i3_frames_per_second		   = 50.0801282051;
const bool	   zxsp_i3_has_50_60hz_switch		   = 0;
const uint	   zxsp_i3_page_size				   = 16384;
const uint	   zxsp_i3_rom_pages				   = 1;
const uint	   zxsp_i3_ram_pages				   = 3;
const uint32   zxsp_i3_rom_size					   = 16384;
const uint32   zxsp_i3_ram_size					   = 49152;
const uint32   zxsp_i3_contended_rampages		   = 0x80000000;
const uint8	   zxsp_i3_waitmap					   = 0x7e;
const uint32   zxsp_i3_videoram_start			   = 0x0000;
const uint32   zxsp_i3_videoram_start_2			   = 0;
const uint32   zxsp_i3_videoram_size			   = 6912;
const uint	   zxsp_i3_characterram_start		   = 0;
const uint	   zxsp_i3_characterram_size		   = 0;
const float	   zxsp_i3_earin_threshold_mic_lo	   = 0.005;
const float	   zxsp_i3_earin_threshold_mic_hi	   = 0.005;
const uint	   zxsp_i3_tape_load_routine		   = 0x0556;
const uint	   zxsp_i3_tape_save_routine		   = 0x04d0;
const uint	   zxsp_i3_tape_load_ret_addr		   = 0x053f;
const bool	   zxsp_i3_has_port_7ffd			   = no;
const bool	   zxsp_i3_has_port_1ffd			   = no;
const bool	   zxsp_i3_has_port_F4				   = no;
const bool	   zxsp_i3_has_port_FF				   = no;
const bool	   zxsp_i3_has_ay_soundchip			   = no;
const uint32   zxsp_i3_ay_cycles_per_second		   = 1750000;
const bool	   zxsp_i3_has_tape_drive			   = no;
const bool	   zxsp_i3_has_module_port			   = no;
const bool	   zxsp_i3_has_floppy_drive			   = no;
const bool	   zxsp_i3_has_printer_port			   = no;
const uint	   zxsp_i3_has_serial_ports			   = 0;
const uint	   zxsp_i3_has_joystick_ports		   = 0;
const bool	   zxsp_i3_has_kempston_joystick_ports = no;
const bool	   zxsp_i3_has_sinclair_joystick_ports = no;

const cstr	   zxplus_name						  = "ZX Spectrum+";
const bool	   zxplus_is_supported				  = 1;
const bool	   zxplus_has_zxsp_bus				  = yes;
const bool	   zxplus_has_zx80_bus				  = no;
const isa_id   zxplus_id						  = isa_MachineZxsp;
const cstr	   zxplus_nickname					  = "zxplus";
const cstr	   zxplus_rom_filename				  = "48k.rom";
const cstr	   zxplus_kbd_filename				  = "128k_kbd.jpg";
const cstr	   zxplus_image_filename			  = "zxplus.jpg";
const Language zxplus_language					  = british;
const uint32   zxplus_ula_cycles_per_second		  = 14000000;
const uint	   zxplus_cpu_clock_predivider		  = 4;
const uint32   zxplus_cpu_cycles_per_second		  = 3500000;
const uint	   zxplus_cpu_cycles_per_line		  = 224;
const uint	   zxplus_lines_before_screen		  = 64;
const uint	   zxplus_lines_in_screen			  = 192;
const uint	   zxplus_lines_after_screen		  = 56;
const uint32   zxplus_cpu_cycles_per_frame		  = 69888;
const double   zxplus_frames_per_second			  = 50.0801282051;
const bool	   zxplus_has_50_60hz_switch		  = 0;
const uint	   zxplus_page_size					  = 16384;
const uint	   zxplus_rom_pages					  = 1;
const uint	   zxplus_ram_pages					  = 3;
const uint32   zxplus_rom_size					  = 16384;
const uint32   zxplus_ram_size					  = 49152;
const uint32   zxplus_contended_rampages		  = 0x80000000;
const uint8	   zxplus_waitmap					  = 0x7e;
const uint32   zxplus_videoram_start			  = 0x0000;
const uint32   zxplus_videoram_start_2			  = 0;
const uint32   zxplus_videoram_size				  = 6912;
const uint	   zxplus_characterram_start		  = 0;
const uint	   zxplus_characterram_size			  = 0;
const float	   zxplus_earin_threshold_mic_lo	  = 0.005;
const float	   zxplus_earin_threshold_mic_hi	  = 0.001;
const uint	   zxplus_tape_load_routine			  = 0x0556;
const uint	   zxplus_tape_save_routine			  = 0x04d0;
const uint	   zxplus_tape_load_ret_addr		  = 0x053f;
const bool	   zxplus_has_port_7ffd				  = no;
const bool	   zxplus_has_port_1ffd				  = no;
const bool	   zxplus_has_port_F4				  = no;
const bool	   zxplus_has_port_FF				  = no;
const bool	   zxplus_has_ay_soundchip			  = no;
const uint32   zxplus_ay_cycles_per_second		  = 1750000;
const bool	   zxplus_has_tape_drive			  = no;
const bool	   zxplus_has_module_port			  = no;
const bool	   zxplus_has_floppy_drive			  = no;
const bool	   zxplus_has_printer_port			  = no;
const uint	   zxplus_has_serial_ports			  = 0;
const uint	   zxplus_has_joystick_ports		  = 0;
const bool	   zxplus_has_kempston_joystick_ports = no;
const bool	   zxplus_has_sinclair_joystick_ports = no;

const cstr	   zxplus_span_name						   = "investronica ZX Spectrum+ (Spain)";
const bool	   zxplus_span_is_supported				   = 0;
const bool	   zxplus_span_has_zxsp_bus				   = yes;
const bool	   zxplus_span_has_zx80_bus				   = no;
const isa_id   zxplus_span_id						   = isa_MachineZxsp;
const cstr	   zxplus_span_nickname					   = "zxplus_span";
const cstr	   zxplus_span_rom_filename				   = "plus_span.rom";
const cstr	   zxplus_span_kbd_filename				   = "128k_kbd_span.jpg";
const cstr	   zxplus_span_image_filename			   = "zxplus_span.jpg";
const Language zxplus_span_language					   = spanish;
const uint32   zxplus_span_ula_cycles_per_second	   = 17734500;
const uint	   zxplus_span_cpu_clock_predivider		   = 5;
const uint32   zxplus_span_cpu_cycles_per_second	   = 3546900;
const uint	   zxplus_span_cpu_cycles_per_line		   = 224;
const uint	   zxplus_span_lines_before_screen		   = 63;
const uint	   zxplus_span_lines_in_screen			   = 192;
const uint	   zxplus_span_lines_after_screen		   = 56;
const uint32   zxplus_span_cpu_cycles_per_frame		   = 69664;
const double   zxplus_span_frames_per_second		   = 50.9143890675;
const bool	   zxplus_span_has_50_60hz_switch		   = 0;
const uint	   zxplus_span_page_size				   = 16384;
const uint	   zxplus_span_rom_pages				   = 1;
const uint	   zxplus_span_ram_pages				   = 3;
const uint32   zxplus_span_rom_size					   = 16384;
const uint32   zxplus_span_ram_size					   = 49152;
const uint32   zxplus_span_contended_rampages		   = 0;
const uint8	   zxplus_span_waitmap					   = 0;
const uint32   zxplus_span_videoram_start			   = 0x0000;
const uint32   zxplus_span_videoram_start_2			   = 0;
const uint32   zxplus_span_videoram_size			   = 6912;
const uint	   zxplus_span_characterram_start		   = 0;
const uint	   zxplus_span_characterram_size		   = 0;
const float	   zxplus_span_earin_threshold_mic_lo	   = 0.005;
const float	   zxplus_span_earin_threshold_mic_hi	   = 0.005;
const uint	   zxplus_span_tape_load_routine		   = 0x0556;
const uint	   zxplus_span_tape_save_routine		   = 0x04d0;
const uint	   zxplus_span_tape_load_ret_addr		   = 0x053f;
const bool	   zxplus_span_has_port_7ffd			   = no;
const bool	   zxplus_span_has_port_1ffd			   = no;
const bool	   zxplus_span_has_port_F4				   = no;
const bool	   zxplus_span_has_port_FF				   = no;
const bool	   zxplus_span_has_ay_soundchip			   = no;
const uint32   zxplus_span_ay_cycles_per_second		   = 1773450;
const bool	   zxplus_span_has_tape_drive			   = no;
const bool	   zxplus_span_has_module_port			   = no;
const bool	   zxplus_span_has_floppy_drive			   = no;
const bool	   zxplus_span_has_printer_port			   = no;
const uint	   zxplus_span_has_serial_ports			   = 0;
const uint	   zxplus_span_has_joystick_ports		   = 1;
const bool	   zxplus_span_has_kempston_joystick_ports = yes;
const bool	   zxplus_span_has_sinclair_joystick_ports = no;

const cstr	   inves_name						 = "Inves Spectrum+ (Spain)";
const bool	   inves_is_supported				 = 1;
const bool	   inves_has_zxsp_bus				 = yes;
const bool	   inves_has_zx80_bus				 = no;
const isa_id   inves_id							 = isa_MachineInves;
const cstr	   inves_nickname					 = "inves";
const cstr	   inves_rom_filename				 = "plus_span.rom";
const cstr	   inves_kbd_filename				 = "128k_kbd_span.jpg";
const cstr	   inves_image_filename				 = "inves.jpg";
const Language inves_language					 = spanish;
const uint32   inves_ula_cycles_per_second		 = 17734500;
const uint	   inves_cpu_clock_predivider		 = 5;
const uint32   inves_cpu_cycles_per_second		 = 3546900;
const uint	   inves_cpu_cycles_per_line		 = 224;
const uint	   inves_lines_before_screen		 = 63;
const uint	   inves_lines_in_screen			 = 192;
const uint	   inves_lines_after_screen			 = 56;
const uint32   inves_cpu_cycles_per_frame		 = 69664;
const double   inves_frames_per_second			 = 50.9143890675;
const bool	   inves_has_50_60hz_switch			 = 0;
const uint	   inves_page_size					 = 16384;
const uint	   inves_rom_pages					 = 1;
const uint	   inves_ram_pages					 = 3;
const uint32   inves_rom_size					 = 16384;
const uint32   inves_ram_size					 = 49152;
const uint32   inves_contended_rampages			 = 0;
const uint8	   inves_waitmap					 = 0;
const uint32   inves_videoram_start				 = 0x0000;
const uint32   inves_videoram_start_2			 = 0;
const uint32   inves_videoram_size				 = 6912;
const uint	   inves_characterram_start			 = 0;
const uint	   inves_characterram_size			 = 0;
const float	   inves_earin_threshold_mic_lo		 = 0.005;
const float	   inves_earin_threshold_mic_hi		 = 0.005;
const uint	   inves_tape_load_routine			 = 0x0556;
const uint	   inves_tape_save_routine			 = 0x04d0;
const uint	   inves_tape_load_ret_addr			 = 0x053f;
const bool	   inves_has_port_7ffd				 = no;
const bool	   inves_has_port_1ffd				 = no;
const bool	   inves_has_port_F4				 = no;
const bool	   inves_has_port_FF				 = no;
const bool	   inves_has_ay_soundchip			 = no;
const uint32   inves_ay_cycles_per_second		 = 1773450;
const bool	   inves_has_tape_drive				 = no;
const bool	   inves_has_module_port			 = no;
const bool	   inves_has_floppy_drive			 = no;
const bool	   inves_has_printer_port			 = no;
const uint	   inves_has_serial_ports			 = 0;
const uint	   inves_has_joystick_ports			 = 1;
const bool	   inves_has_kempston_joystick_ports = yes;
const bool	   inves_has_sinclair_joystick_ports = no;

const cstr	   zx128_name						 = "Sinclair ZX Spectrum+ 128K";
const bool	   zx128_is_supported				 = 1;
const bool	   zx128_has_zxsp_bus				 = yes;
const bool	   zx128_has_zx80_bus				 = no;
const isa_id   zx128_id							 = isa_MachineZx128;
const cstr	   zx128_nickname					 = "zx128";
const cstr	   zx128_rom_filename				 = "128k.rom";
const cstr	   zx128_kbd_filename				 = "128k_kbd.jpg";
const cstr	   zx128_image_filename				 = "zx128.jpg";
const Language zx128_language					 = british;
const uint32   zx128_ula_cycles_per_second		 = 14187600;
const uint	   zx128_cpu_clock_predivider		 = 4;
const uint32   zx128_cpu_cycles_per_second		 = 3546900;
const uint	   zx128_cpu_cycles_per_line		 = 228;
const uint	   zx128_lines_before_screen		 = 63;
const uint	   zx128_lines_in_screen			 = 192;
const uint	   zx128_lines_after_screen			 = 56;
const uint32   zx128_cpu_cycles_per_frame		 = 70908;
const double   zx128_frames_per_second			 = 50.0211541716;
const bool	   zx128_has_50_60hz_switch			 = 0;
const uint	   zx128_page_size					 = 16384;
const uint	   zx128_rom_pages					 = 2;
const uint	   zx128_ram_pages					 = 8;
const uint32   zx128_rom_size					 = 32768;
const uint32   zx128_ram_size					 = 131072;
const uint32   zx128_contended_rampages			 = 0x55000000;
const uint8	   zx128_waitmap					 = 0xFC;
const uint32   zx128_videoram_start				 = 16 * 1024 * 5;
const uint32   zx128_videoram_start_2			 = 16 * 1024 * 7;
const uint32   zx128_videoram_size				 = 6912;
const uint	   zx128_characterram_start			 = 0;
const uint	   zx128_characterram_size			 = 0;
const float	   zx128_earin_threshold_mic_lo		 = 0.005;
const float	   zx128_earin_threshold_mic_hi		 = 0.005;
const uint	   zx128_tape_load_routine			 = 0x4000 + 0x0556;
const uint	   zx128_tape_save_routine			 = 0x4000 + 0x04D0;
const uint	   zx128_tape_load_ret_addr			 = 0x4000 + 0x053F;
const bool	   zx128_has_port_7ffd				 = yes;
const bool	   zx128_has_port_1ffd				 = no;
const bool	   zx128_has_port_F4				 = no;
const bool	   zx128_has_port_FF				 = no;
const bool	   zx128_has_ay_soundchip			 = yes;
const uint32   zx128_ay_cycles_per_second		 = 1773450;
const bool	   zx128_has_tape_drive				 = no;
const bool	   zx128_has_module_port			 = no;
const bool	   zx128_has_floppy_drive			 = no;
const bool	   zx128_has_printer_port			 = no;
const uint	   zx128_has_serial_ports			 = 2;
const uint	   zx128_has_joystick_ports			 = 0;
const bool	   zx128_has_kempston_joystick_ports = no;
const bool	   zx128_has_sinclair_joystick_ports = no;

const cstr	   zx128_span_name						  = "Sinclair ZX Spectrum+ 128K (Spain)";
const bool	   zx128_span_is_supported				  = 1;
const bool	   zx128_span_has_zxsp_bus				  = yes;
const bool	   zx128_span_has_zx80_bus				  = no;
const isa_id   zx128_span_id						  = isa_MachineZx128;
const cstr	   zx128_span_nickname					  = "zx128_span";
const cstr	   zx128_span_rom_filename				  = "128k_span.rom";
const cstr	   zx128_span_kbd_filename				  = "128k_kbd_span.jpg";
const cstr	   zx128_span_image_filename			  = "zx128_span.jpg";
const Language zx128_span_language					  = spanish;
const uint32   zx128_span_ula_cycles_per_second		  = 17734500;
const uint	   zx128_span_cpu_clock_predivider		  = 5;
const uint32   zx128_span_cpu_cycles_per_second		  = 3546900;
const uint	   zx128_span_cpu_cycles_per_line		  = 228;
const uint	   zx128_span_lines_before_screen		  = 63;
const uint	   zx128_span_lines_in_screen			  = 192;
const uint	   zx128_span_lines_after_screen		  = 56;
const uint32   zx128_span_cpu_cycles_per_frame		  = 70908;
const double   zx128_span_frames_per_second			  = 50.0211541716;
const bool	   zx128_span_has_50_60hz_switch		  = 0;
const uint	   zx128_span_page_size					  = 16384;
const uint	   zx128_span_rom_pages					  = 2;
const uint	   zx128_span_ram_pages					  = 8;
const uint32   zx128_span_rom_size					  = 32768;
const uint32   zx128_span_ram_size					  = 131072;
const uint32   zx128_span_contended_rampages		  = 0x55000000;
const uint8	   zx128_span_waitmap					  = 0xFC;
const uint32   zx128_span_videoram_start			  = 16 * 1024 * 5;
const uint32   zx128_span_videoram_start_2			  = 16 * 1024 * 7;
const uint32   zx128_span_videoram_size				  = 6912;
const uint	   zx128_span_characterram_start		  = 0;
const uint	   zx128_span_characterram_size			  = 0;
const float	   zx128_span_earin_threshold_mic_lo	  = 0.005;
const float	   zx128_span_earin_threshold_mic_hi	  = 0.005;
const uint	   zx128_span_tape_load_routine			  = 0x4000 + 0x0556;
const uint	   zx128_span_tape_save_routine			  = 0x4000 + 0x04D0;
const uint	   zx128_span_tape_load_ret_addr		  = 0x4000 + 0x053F;
const bool	   zx128_span_has_port_7ffd				  = yes;
const bool	   zx128_span_has_port_1ffd				  = no;
const bool	   zx128_span_has_port_F4				  = no;
const bool	   zx128_span_has_port_FF				  = no;
const bool	   zx128_span_has_ay_soundchip			  = yes;
const uint32   zx128_span_ay_cycles_per_second		  = 1773450;
const bool	   zx128_span_has_tape_drive			  = no;
const bool	   zx128_span_has_module_port			  = no;
const bool	   zx128_span_has_floppy_drive			  = no;
const bool	   zx128_span_has_printer_port			  = no;
const uint	   zx128_span_has_serial_ports			  = 2;
const uint	   zx128_span_has_joystick_ports		  = 0;
const bool	   zx128_span_has_kempston_joystick_ports = no;
const bool	   zx128_span_has_sinclair_joystick_ports = no;

const cstr	   zxplus2_name						   = "ZX Spectrum +2";
const bool	   zxplus2_is_supported				   = 1;
const bool	   zxplus2_has_zxsp_bus				   = yes;
const bool	   zxplus2_has_zx80_bus				   = no;
const isa_id   zxplus2_id						   = isa_MachineZxPlus2;
const cstr	   zxplus2_nickname					   = "zxplus2";
const cstr	   zxplus2_rom_filename				   = "plus2.rom";
const cstr	   zxplus2_kbd_filename				   = "plus2_kbd.png";
const cstr	   zxplus2_image_filename			   = "zxplus2.jpg";
const Language zxplus2_language					   = british;
const uint32   zxplus2_ula_cycles_per_second	   = 35469000;
const uint	   zxplus2_cpu_clock_predivider		   = 10;
const uint32   zxplus2_cpu_cycles_per_second	   = 3546900;
const uint	   zxplus2_cpu_cycles_per_line		   = 228;
const uint	   zxplus2_lines_before_screen		   = 63;
const uint	   zxplus2_lines_in_screen			   = 192;
const uint	   zxplus2_lines_after_screen		   = 56;
const uint32   zxplus2_cpu_cycles_per_frame		   = 70908;
const double   zxplus2_frames_per_second		   = 50.0211541716;
const bool	   zxplus2_has_50_60hz_switch		   = 0;
const uint	   zxplus2_page_size				   = 16384;
const uint	   zxplus2_rom_pages				   = 2;
const uint	   zxplus2_ram_pages				   = 8;
const uint32   zxplus2_rom_size					   = 32768;
const uint32   zxplus2_ram_size					   = 131072;
const uint32   zxplus2_contended_rampages		   = 0x55000000;
const uint8	   zxplus2_waitmap					   = 0xFC;
const uint32   zxplus2_videoram_start			   = 16 * 1024 * 5;
const uint32   zxplus2_videoram_start_2			   = 16 * 1024 * 7;
const uint32   zxplus2_videoram_size			   = 6912;
const uint	   zxplus2_characterram_start		   = 0;
const uint	   zxplus2_characterram_size		   = 0;
const float	   zxplus2_earin_threshold_mic_lo	   = 0.005;
const float	   zxplus2_earin_threshold_mic_hi	   = 0.005;
const uint	   zxplus2_tape_load_routine		   = 0x4000 + 0x0556;
const uint	   zxplus2_tape_save_routine		   = 0x4000 + 0x04D0;
const uint	   zxplus2_tape_load_ret_addr		   = 0x4000 + 0x053F;
const bool	   zxplus2_has_port_7ffd			   = yes;
const bool	   zxplus2_has_port_1ffd			   = no;
const bool	   zxplus2_has_port_F4				   = no;
const bool	   zxplus2_has_port_FF				   = no;
const bool	   zxplus2_has_ay_soundchip			   = yes;
const uint32   zxplus2_ay_cycles_per_second		   = 1773450;
const bool	   zxplus2_has_tape_drive			   = yes;
const bool	   zxplus2_has_module_port			   = no;
const bool	   zxplus2_has_floppy_drive			   = no;
const bool	   zxplus2_has_printer_port			   = no;
const uint	   zxplus2_has_serial_ports			   = 2;
const uint	   zxplus2_has_joystick_ports		   = 2;
const bool	   zxplus2_has_kempston_joystick_ports = no;
const bool	   zxplus2_has_sinclair_joystick_ports = yes;

const cstr	   zxplus2_span_name						= "ZX Spectrum +2 (Spain)";
const bool	   zxplus2_span_is_supported				= 1;
const bool	   zxplus2_span_has_zxsp_bus				= yes;
const bool	   zxplus2_span_has_zx80_bus				= no;
const isa_id   zxplus2_span_id							= isa_MachineZxPlus2;
const cstr	   zxplus2_span_nickname					= "zxplus2_span";
const cstr	   zxplus2_span_rom_filename				= "plus2_span.rom";
const cstr	   zxplus2_span_kbd_filename				= "plus2_kbd.png";
const cstr	   zxplus2_span_image_filename				= "zxplus2.jpg";
const Language zxplus2_span_language					= spanish;
const uint32   zxplus2_span_ula_cycles_per_second		= 35469000;
const uint	   zxplus2_span_cpu_clock_predivider		= 10;
const uint32   zxplus2_span_cpu_cycles_per_second		= 3546900;
const uint	   zxplus2_span_cpu_cycles_per_line			= 228;
const uint	   zxplus2_span_lines_before_screen			= 63;
const uint	   zxplus2_span_lines_in_screen				= 192;
const uint	   zxplus2_span_lines_after_screen			= 56;
const uint32   zxplus2_span_cpu_cycles_per_frame		= 70908;
const double   zxplus2_span_frames_per_second			= 50.0211541716;
const bool	   zxplus2_span_has_50_60hz_switch			= 0;
const uint	   zxplus2_span_page_size					= 16384;
const uint	   zxplus2_span_rom_pages					= 2;
const uint	   zxplus2_span_ram_pages					= 8;
const uint32   zxplus2_span_rom_size					= 32768;
const uint32   zxplus2_span_ram_size					= 131072;
const uint32   zxplus2_span_contended_rampages			= 0x55000000;
const uint8	   zxplus2_span_waitmap						= 0xFC;
const uint32   zxplus2_span_videoram_start				= 16 * 1024 * 5;
const uint32   zxplus2_span_videoram_start_2			= 16 * 1024 * 7;
const uint32   zxplus2_span_videoram_size				= 6912;
const uint	   zxplus2_span_characterram_start			= 0;
const uint	   zxplus2_span_characterram_size			= 0;
const float	   zxplus2_span_earin_threshold_mic_lo		= 0.005;
const float	   zxplus2_span_earin_threshold_mic_hi		= 0.005;
const uint	   zxplus2_span_tape_load_routine			= 0x4000 + 0x0556;
const uint	   zxplus2_span_tape_save_routine			= 0x4000 + 0x04D0;
const uint	   zxplus2_span_tape_load_ret_addr			= 0x4000 + 0x053F;
const bool	   zxplus2_span_has_port_7ffd				= yes;
const bool	   zxplus2_span_has_port_1ffd				= no;
const bool	   zxplus2_span_has_port_F4					= no;
const bool	   zxplus2_span_has_port_FF					= no;
const bool	   zxplus2_span_has_ay_soundchip			= yes;
const uint32   zxplus2_span_ay_cycles_per_second		= 1773450;
const bool	   zxplus2_span_has_tape_drive				= yes;
const bool	   zxplus2_span_has_module_port				= no;
const bool	   zxplus2_span_has_floppy_drive			= no;
const bool	   zxplus2_span_has_printer_port			= no;
const uint	   zxplus2_span_has_serial_ports			= 2;
const uint	   zxplus2_span_has_joystick_ports			= 2;
const bool	   zxplus2_span_has_kempston_joystick_ports = no;
const bool	   zxplus2_span_has_sinclair_joystick_ports = yes;

const cstr	   zxplus2_frz_name						   = "ZX Spectrum +2 (France)";
const bool	   zxplus2_frz_is_supported				   = 1;
const bool	   zxplus2_frz_has_zxsp_bus				   = yes;
const bool	   zxplus2_frz_has_zx80_bus				   = no;
const isa_id   zxplus2_frz_id						   = isa_MachineZxPlus2;
const cstr	   zxplus2_frz_nickname					   = "zxplus2_frz";
const cstr	   zxplus2_frz_rom_filename				   = "plus2_frz.rom";
const cstr	   zxplus2_frz_kbd_filename				   = "plus2_kbd.png";
const cstr	   zxplus2_frz_image_filename			   = "zxplus2.jpg";
const Language zxplus2_frz_language					   = french;
const uint32   zxplus2_frz_ula_cycles_per_second	   = 35469000;
const uint	   zxplus2_frz_cpu_clock_predivider		   = 10;
const uint32   zxplus2_frz_cpu_cycles_per_second	   = 3546900;
const uint	   zxplus2_frz_cpu_cycles_per_line		   = 228;
const uint	   zxplus2_frz_lines_before_screen		   = 63;
const uint	   zxplus2_frz_lines_in_screen			   = 192;
const uint	   zxplus2_frz_lines_after_screen		   = 56;
const uint32   zxplus2_frz_cpu_cycles_per_frame		   = 70908;
const double   zxplus2_frz_frames_per_second		   = 50.0211541716;
const bool	   zxplus2_frz_has_50_60hz_switch		   = 0;
const uint	   zxplus2_frz_page_size				   = 16384;
const uint	   zxplus2_frz_rom_pages				   = 2;
const uint	   zxplus2_frz_ram_pages				   = 8;
const uint32   zxplus2_frz_rom_size					   = 32768;
const uint32   zxplus2_frz_ram_size					   = 131072;
const uint32   zxplus2_frz_contended_rampages		   = 0x55000000;
const uint8	   zxplus2_frz_waitmap					   = 0xFC;
const uint32   zxplus2_frz_videoram_start			   = 16 * 1024 * 5;
const uint32   zxplus2_frz_videoram_start_2			   = 16 * 1024 * 7;
const uint32   zxplus2_frz_videoram_size			   = 6912;
const uint	   zxplus2_frz_characterram_start		   = 0;
const uint	   zxplus2_frz_characterram_size		   = 0;
const float	   zxplus2_frz_earin_threshold_mic_lo	   = 0.005;
const float	   zxplus2_frz_earin_threshold_mic_hi	   = 0.005;
const uint	   zxplus2_frz_tape_load_routine		   = 0x4000 + 0x0556;
const uint	   zxplus2_frz_tape_save_routine		   = 0x4000 + 0x04D0;
const uint	   zxplus2_frz_tape_load_ret_addr		   = 0x4000 + 0x053F;
const bool	   zxplus2_frz_has_port_7ffd			   = yes;
const bool	   zxplus2_frz_has_port_1ffd			   = no;
const bool	   zxplus2_frz_has_port_F4				   = no;
const bool	   zxplus2_frz_has_port_FF				   = no;
const bool	   zxplus2_frz_has_ay_soundchip			   = yes;
const uint32   zxplus2_frz_ay_cycles_per_second		   = 1773450;
const bool	   zxplus2_frz_has_tape_drive			   = yes;
const bool	   zxplus2_frz_has_module_port			   = no;
const bool	   zxplus2_frz_has_floppy_drive			   = no;
const bool	   zxplus2_frz_has_printer_port			   = no;
const uint	   zxplus2_frz_has_serial_ports			   = 2;
const uint	   zxplus2_frz_has_joystick_ports		   = 2;
const bool	   zxplus2_frz_has_kempston_joystick_ports = no;
const bool	   zxplus2_frz_has_sinclair_joystick_ports = yes;

const cstr	   zxplus3_name						   = "ZX Spectrum +3";
const bool	   zxplus3_is_supported				   = 1;
const bool	   zxplus3_has_zxsp_bus				   = yes;
const bool	   zxplus3_has_zx80_bus				   = no;
const isa_id   zxplus3_id						   = isa_MachineZxPlus3;
const cstr	   zxplus3_nickname					   = "zxplus3";
const cstr	   zxplus3_rom_filename				   = "plus3_v41.rom";
const cstr	   zxplus3_kbd_filename				   = "plus3_kbd.png";
const cstr	   zxplus3_image_filename			   = "zxplus3.jpg";
const Language zxplus3_language					   = british;
const uint32   zxplus3_ula_cycles_per_second	   = 35469000;
const uint	   zxplus3_cpu_clock_predivider		   = 10;
const uint32   zxplus3_cpu_cycles_per_second	   = 3546900;
const uint	   zxplus3_cpu_cycles_per_line		   = 228;
const uint	   zxplus3_lines_before_screen		   = 63;
const uint	   zxplus3_lines_in_screen			   = 192;
const uint	   zxplus3_lines_after_screen		   = 56;
const uint32   zxplus3_cpu_cycles_per_frame		   = 70908;
const double   zxplus3_frames_per_second		   = 50.0211541716;
const bool	   zxplus3_has_50_60hz_switch		   = 0;
const uint	   zxplus3_page_size				   = 16384;
const uint	   zxplus3_rom_pages				   = 4;
const uint	   zxplus3_ram_pages				   = 8;
const uint32   zxplus3_rom_size					   = 65536;
const uint32   zxplus3_ram_size					   = 131072;
const uint32   zxplus3_contended_rampages		   = 0x0F000000;
const uint8	   zxplus3_waitmap					   = 0xFE;
const uint32   zxplus3_videoram_start			   = 16 * 1024 * 5;
const uint32   zxplus3_videoram_start_2			   = 16 * 1024 * 7;
const uint32   zxplus3_videoram_size			   = 6912;
const uint	   zxplus3_characterram_start		   = 0;
const uint	   zxplus3_characterram_size		   = 0;
const float	   zxplus3_earin_threshold_mic_lo	   = 0.005;
const float	   zxplus3_earin_threshold_mic_hi	   = 0.005;
const uint	   zxplus3_tape_load_routine		   = 0xc000 + 0x0556;
const uint	   zxplus3_tape_save_routine		   = 0xc000 + 0x04D0;
const uint	   zxplus3_tape_load_ret_addr		   = 0xc000 + 0x053F;
const bool	   zxplus3_has_port_7ffd			   = yes;
const bool	   zxplus3_has_port_1ffd			   = yes;
const bool	   zxplus3_has_port_F4				   = no;
const bool	   zxplus3_has_port_FF				   = no;
const bool	   zxplus3_has_ay_soundchip			   = yes;
const uint32   zxplus3_ay_cycles_per_second		   = 1773450;
const bool	   zxplus3_has_tape_drive			   = no;
const bool	   zxplus3_has_module_port			   = no;
const bool	   zxplus3_has_floppy_drive			   = yes;
const bool	   zxplus3_has_printer_port			   = yes;
const uint	   zxplus3_has_serial_ports			   = 2;
const uint	   zxplus3_has_joystick_ports		   = 2;
const bool	   zxplus3_has_kempston_joystick_ports = no;
const bool	   zxplus3_has_sinclair_joystick_ports = yes;

const cstr	   zxplus3_span_name						= "ZX Spectrum +3 (Spain)";
const bool	   zxplus3_span_is_supported				= 1;
const bool	   zxplus3_span_has_zxsp_bus				= yes;
const bool	   zxplus3_span_has_zx80_bus				= no;
const isa_id   zxplus3_span_id							= isa_MachineZxPlus3;
const cstr	   zxplus3_span_nickname					= "zxplus3_span";
const cstr	   zxplus3_span_rom_filename				= "plus3_span.rom";
const cstr	   zxplus3_span_kbd_filename				= "plus3_kbd.png";
const cstr	   zxplus3_span_image_filename				= "zxplus3_span.jpg";
const Language zxplus3_span_language					= spanish;
const uint32   zxplus3_span_ula_cycles_per_second		= 35469000;
const uint	   zxplus3_span_cpu_clock_predivider		= 10;
const uint32   zxplus3_span_cpu_cycles_per_second		= 3546900;
const uint	   zxplus3_span_cpu_cycles_per_line			= 228;
const uint	   zxplus3_span_lines_before_screen			= 63;
const uint	   zxplus3_span_lines_in_screen				= 192;
const uint	   zxplus3_span_lines_after_screen			= 56;
const uint32   zxplus3_span_cpu_cycles_per_frame		= 70908;
const double   zxplus3_span_frames_per_second			= 50.0211541716;
const bool	   zxplus3_span_has_50_60hz_switch			= 0;
const uint	   zxplus3_span_page_size					= 16384;
const uint	   zxplus3_span_rom_pages					= 4;
const uint	   zxplus3_span_ram_pages					= 8;
const uint32   zxplus3_span_rom_size					= 65536;
const uint32   zxplus3_span_ram_size					= 131072;
const uint32   zxplus3_span_contended_rampages			= 0x0F000000;
const uint8	   zxplus3_span_waitmap						= 0xFE;
const uint32   zxplus3_span_videoram_start				= 16 * 1024 * 5;
const uint32   zxplus3_span_videoram_start_2			= 16 * 1024 * 7;
const uint32   zxplus3_span_videoram_size				= 6912;
const uint	   zxplus3_span_characterram_start			= 0;
const uint	   zxplus3_span_characterram_size			= 0;
const float	   zxplus3_span_earin_threshold_mic_lo		= 0.005;
const float	   zxplus3_span_earin_threshold_mic_hi		= 0.005;
const uint	   zxplus3_span_tape_load_routine			= 0xc000 + 0x0556;
const uint	   zxplus3_span_tape_save_routine			= 0xc000 + 0x04D0;
const uint	   zxplus3_span_tape_load_ret_addr			= 0xc000 + 0x053F;
const bool	   zxplus3_span_has_port_7ffd				= yes;
const bool	   zxplus3_span_has_port_1ffd				= yes;
const bool	   zxplus3_span_has_port_F4					= no;
const bool	   zxplus3_span_has_port_FF					= no;
const bool	   zxplus3_span_has_ay_soundchip			= yes;
const uint32   zxplus3_span_ay_cycles_per_second		= 1773450;
const bool	   zxplus3_span_has_tape_drive				= no;
const bool	   zxplus3_span_has_module_port				= no;
const bool	   zxplus3_span_has_floppy_drive			= yes;
const bool	   zxplus3_span_has_printer_port			= yes;
const uint	   zxplus3_span_has_serial_ports			= 2;
const uint	   zxplus3_span_has_joystick_ports			= 2;
const bool	   zxplus3_span_has_kempston_joystick_ports = no;
const bool	   zxplus3_span_has_sinclair_joystick_ports = yes;

const cstr	   zxplus2a_name						= "ZX Spectrum +2A";
const bool	   zxplus2a_is_supported				= 1;
const bool	   zxplus2a_has_zxsp_bus				= yes;
const bool	   zxplus2a_has_zx80_bus				= no;
const isa_id   zxplus2a_id							= isa_MachineZxPlus2a;
const cstr	   zxplus2a_nickname					= "zxplus2a";
const cstr	   zxplus2a_rom_filename				= "plus3_v41.rom";
const cstr	   zxplus2a_kbd_filename				= "plus3_kbd.png";
const cstr	   zxplus2a_image_filename				= "zxplus2a.jpg";
const Language zxplus2a_language					= british;
const uint32   zxplus2a_ula_cycles_per_second		= 35469000;
const uint	   zxplus2a_cpu_clock_predivider		= 10;
const uint32   zxplus2a_cpu_cycles_per_second		= 3546900;
const uint	   zxplus2a_cpu_cycles_per_line			= 228;
const uint	   zxplus2a_lines_before_screen			= 63;
const uint	   zxplus2a_lines_in_screen				= 192;
const uint	   zxplus2a_lines_after_screen			= 56;
const uint32   zxplus2a_cpu_cycles_per_frame		= 70908;
const double   zxplus2a_frames_per_second			= 50.0211541716;
const bool	   zxplus2a_has_50_60hz_switch			= 0;
const uint	   zxplus2a_page_size					= 16384;
const uint	   zxplus2a_rom_pages					= 4;
const uint	   zxplus2a_ram_pages					= 8;
const uint32   zxplus2a_rom_size					= 65536;
const uint32   zxplus2a_ram_size					= 131072;
const uint32   zxplus2a_contended_rampages			= 0x0F000000;
const uint8	   zxplus2a_waitmap						= 0xFE;
const uint32   zxplus2a_videoram_start				= 16 * 1024 * 5;
const uint32   zxplus2a_videoram_start_2			= 16 * 1024 * 7;
const uint32   zxplus2a_videoram_size				= 6912;
const uint	   zxplus2a_characterram_start			= 0;
const uint	   zxplus2a_characterram_size			= 0;
const float	   zxplus2a_earin_threshold_mic_lo		= 0.005;
const float	   zxplus2a_earin_threshold_mic_hi		= 0.005;
const uint	   zxplus2a_tape_load_routine			= 0xc000 + 0x0556;
const uint	   zxplus2a_tape_save_routine			= 0xc000 + 0x04D0;
const uint	   zxplus2a_tape_load_ret_addr			= 0xc000 + 0x053F;
const bool	   zxplus2a_has_port_7ffd				= yes;
const bool	   zxplus2a_has_port_1ffd				= yes;
const bool	   zxplus2a_has_port_F4					= no;
const bool	   zxplus2a_has_port_FF					= no;
const bool	   zxplus2a_has_ay_soundchip			= yes;
const uint32   zxplus2a_ay_cycles_per_second		= 1773450;
const bool	   zxplus2a_has_tape_drive				= yes;
const bool	   zxplus2a_has_module_port				= no;
const bool	   zxplus2a_has_floppy_drive			= no;
const bool	   zxplus2a_has_printer_port			= yes;
const uint	   zxplus2a_has_serial_ports			= 2;
const uint	   zxplus2a_has_joystick_ports			= 2;
const bool	   zxplus2a_has_kempston_joystick_ports = no;
const bool	   zxplus2a_has_sinclair_joystick_ports = yes;

const cstr	   zxplus2a_span_name						 = "ZX Spectrum +2A (Spain)";
const bool	   zxplus2a_span_is_supported				 = 1;
const bool	   zxplus2a_span_has_zxsp_bus				 = yes;
const bool	   zxplus2a_span_has_zx80_bus				 = no;
const isa_id   zxplus2a_span_id							 = isa_MachineZxPlus2a;
const cstr	   zxplus2a_span_nickname					 = "zxplus2a_span";
const cstr	   zxplus2a_span_rom_filename				 = "plus3_span.rom";
const cstr	   zxplus2a_span_kbd_filename				 = "plus3_kbd.png";
const cstr	   zxplus2a_span_image_filename				 = "zxplus2a_span.jpg";
const Language zxplus2a_span_language					 = spanish;
const uint32   zxplus2a_span_ula_cycles_per_second		 = 35469000;
const uint	   zxplus2a_span_cpu_clock_predivider		 = 10;
const uint32   zxplus2a_span_cpu_cycles_per_second		 = 3546900;
const uint	   zxplus2a_span_cpu_cycles_per_line		 = 228;
const uint	   zxplus2a_span_lines_before_screen		 = 63;
const uint	   zxplus2a_span_lines_in_screen			 = 192;
const uint	   zxplus2a_span_lines_after_screen			 = 56;
const uint32   zxplus2a_span_cpu_cycles_per_frame		 = 70908;
const double   zxplus2a_span_frames_per_second			 = 50.0211541716;
const bool	   zxplus2a_span_has_50_60hz_switch			 = 0;
const uint	   zxplus2a_span_page_size					 = 16384;
const uint	   zxplus2a_span_rom_pages					 = 4;
const uint	   zxplus2a_span_ram_pages					 = 8;
const uint32   zxplus2a_span_rom_size					 = 65536;
const uint32   zxplus2a_span_ram_size					 = 131072;
const uint32   zxplus2a_span_contended_rampages			 = 0x0F000000;
const uint8	   zxplus2a_span_waitmap					 = 0xFE;
const uint32   zxplus2a_span_videoram_start				 = 16 * 1024 * 5;
const uint32   zxplus2a_span_videoram_start_2			 = 16 * 1024 * 7;
const uint32   zxplus2a_span_videoram_size				 = 6912;
const uint	   zxplus2a_span_characterram_start			 = 0;
const uint	   zxplus2a_span_characterram_size			 = 0;
const float	   zxplus2a_span_earin_threshold_mic_lo		 = 0.005;
const float	   zxplus2a_span_earin_threshold_mic_hi		 = 0.005;
const uint	   zxplus2a_span_tape_load_routine			 = 0xc000 + 0x0556;
const uint	   zxplus2a_span_tape_save_routine			 = 0xc000 + 0x04D0;
const uint	   zxplus2a_span_tape_load_ret_addr			 = 0xc000 + 0x053F;
const bool	   zxplus2a_span_has_port_7ffd				 = yes;
const bool	   zxplus2a_span_has_port_1ffd				 = yes;
const bool	   zxplus2a_span_has_port_F4				 = no;
const bool	   zxplus2a_span_has_port_FF				 = no;
const bool	   zxplus2a_span_has_ay_soundchip			 = yes;
const uint32   zxplus2a_span_ay_cycles_per_second		 = 1773450;
const bool	   zxplus2a_span_has_tape_drive				 = yes;
const bool	   zxplus2a_span_has_module_port			 = no;
const bool	   zxplus2a_span_has_floppy_drive			 = no;
const bool	   zxplus2a_span_has_printer_port			 = yes;
const uint	   zxplus2a_span_has_serial_ports			 = 2;
const uint	   zxplus2a_span_has_joystick_ports			 = 2;
const bool	   zxplus2a_span_has_kempston_joystick_ports = no;
const bool	   zxplus2a_span_has_sinclair_joystick_ports = yes;

const cstr	   tc2048_name						  = "Timex Computer 2048 (Portugal)";
const bool	   tc2048_is_supported				  = 1;
const bool	   tc2048_has_zxsp_bus				  = yes;
const bool	   tc2048_has_zx80_bus				  = no;
const isa_id   tc2048_id						  = isa_MachineTc2048;
const cstr	   tc2048_nickname					  = "tc2048";
const cstr	   tc2048_rom_filename				  = "tc2048.rom";
const cstr	   tc2048_kbd_filename				  = "tc2048_kbd.png";
const cstr	   tc2048_image_filename			  = "tc2048.jpg";
const Language tc2048_language					  = portuguese;
const uint32   tc2048_ula_cycles_per_second		  = 14112000;
const uint	   tc2048_cpu_clock_predivider		  = 4;
const uint32   tc2048_cpu_cycles_per_second		  = 3528000;
const uint	   tc2048_cpu_cycles_per_line		  = 224;
const uint	   tc2048_lines_before_screen		  = 64;
const uint	   tc2048_lines_in_screen			  = 192;
const uint	   tc2048_lines_after_screen		  = 56;
const uint32   tc2048_cpu_cycles_per_frame		  = 69888;
const double   tc2048_frames_per_second			  = 50.4807692308;
const bool	   tc2048_has_50_60hz_switch		  = 0;
const uint	   tc2048_page_size					  = 8192;
const uint	   tc2048_rom_pages					  = 2;
const uint	   tc2048_ram_pages					  = 6;
const uint32   tc2048_rom_size					  = 16384;
const uint32   tc2048_ram_size					  = 49152;
const uint32   tc2048_contended_rampages		  = 0xc0000000;
const uint8	   tc2048_waitmap					  = 0x7e;
const uint32   tc2048_videoram_start			  = 0x0000;
const uint32   tc2048_videoram_start_2			  = 0x2000;
const uint32   tc2048_videoram_size				  = 6912;
const uint	   tc2048_characterram_start		  = 0;
const uint	   tc2048_characterram_size			  = 0;
const float	   tc2048_earin_threshold_mic_lo	  = 0.005;
const float	   tc2048_earin_threshold_mic_hi	  = 0.005;
const uint	   tc2048_tape_load_routine			  = 0x0556;
const uint	   tc2048_tape_save_routine			  = 0x04d0;
const uint	   tc2048_tape_load_ret_addr		  = 0x053f;
const bool	   tc2048_has_port_7ffd				  = no;
const bool	   tc2048_has_port_1ffd				  = no;
const bool	   tc2048_has_port_F4				  = yes;
const bool	   tc2048_has_port_FF				  = yes;
const bool	   tc2048_has_ay_soundchip			  = no;
const uint32   tc2048_ay_cycles_per_second		  = 1750000;
const bool	   tc2048_has_tape_drive			  = no;
const bool	   tc2048_has_module_port			  = no;
const bool	   tc2048_has_floppy_drive			  = no;
const bool	   tc2048_has_printer_port			  = no;
const uint	   tc2048_has_serial_ports			  = no;
const uint	   tc2048_has_joystick_ports		  = 1;
const bool	   tc2048_has_kempston_joystick_ports = yes;
const bool	   tc2048_has_sinclair_joystick_ports = no;

const cstr	   tc2068_name						  = "Timex Computer 2068 (Portugal)";
const bool	   tc2068_is_supported				  = 1;
const bool	   tc2068_has_zxsp_bus				  = yes;
const bool	   tc2068_has_zx80_bus				  = no;
const isa_id   tc2068_id						  = isa_MachineTc2068;
const cstr	   tc2068_nickname					  = "tc2068";
const cstr	   tc2068_rom_filename				  = "ts2068.rom";
const cstr	   tc2068_kbd_filename				  = "ts2068_kbd.png";
const cstr	   tc2068_image_filename			  = "tc2068.jpg";
const Language tc2068_language					  = portuguese;
const uint32   tc2068_ula_cycles_per_second		  = 14112000;
const uint	   tc2068_cpu_clock_predivider		  = 4;
const uint32   tc2068_cpu_cycles_per_second		  = 3528000;
const uint	   tc2068_cpu_cycles_per_line		  = 224;
const uint	   tc2068_lines_before_screen		  = 64;
const uint	   tc2068_lines_in_screen			  = 192;
const uint	   tc2068_lines_after_screen		  = 56;
const uint32   tc2068_cpu_cycles_per_frame		  = 69888;
const double   tc2068_frames_per_second			  = 50.4807692308;
const bool	   tc2068_has_50_60hz_switch		  = 0;
const uint	   tc2068_page_size					  = 8192;
const uint	   tc2068_rom_pages					  = 3;
const uint	   tc2068_ram_pages					  = 6;
const uint32   tc2068_rom_size					  = 24576;
const uint32   tc2068_ram_size					  = 49152;
const uint32   tc2068_contended_rampages		  = 0xc0000000;
const uint8	   tc2068_waitmap					  = 0x7e;
const uint32   tc2068_videoram_start			  = 0x0000;
const uint32   tc2068_videoram_start_2			  = 0x2000;
const uint32   tc2068_videoram_size				  = 6912;
const uint	   tc2068_characterram_start		  = 0;
const uint	   tc2068_characterram_size			  = 0;
const float	   tc2068_earin_threshold_mic_lo	  = 0.005;
const float	   tc2068_earin_threshold_mic_hi	  = 0.005;
const uint	   tc2068_tape_load_routine			  = 0x40FC;
const uint	   tc2068_tape_save_routine			  = 0x4076;
const uint	   tc2068_tape_load_ret_addr		  = 0x40E5;
const bool	   tc2068_has_port_7ffd				  = no;
const bool	   tc2068_has_port_1ffd				  = no;
const bool	   tc2068_has_port_F4				  = yes;
const bool	   tc2068_has_port_FF				  = yes;
const bool	   tc2068_has_ay_soundchip			  = yes;
const uint32   tc2068_ay_cycles_per_second		  = 1764750;
const bool	   tc2068_has_tape_drive			  = no;
const bool	   tc2068_has_module_port			  = yes;
const bool	   tc2068_has_floppy_drive			  = no;
const bool	   tc2068_has_printer_port			  = no;
const uint	   tc2068_has_serial_ports			  = no;
const uint	   tc2068_has_joystick_ports		  = 2;
const bool	   tc2068_has_kempston_joystick_ports = no;
const bool	   tc2068_has_sinclair_joystick_ports = no;

const cstr	   ts2068_name						  = "Timex Sinclair 2068 (USA)";
const bool	   ts2068_is_supported				  = 1;
const bool	   ts2068_has_zxsp_bus				  = yes;
const bool	   ts2068_has_zx80_bus				  = no;
const isa_id   ts2068_id						  = isa_MachineTs2068;
const cstr	   ts2068_nickname					  = "ts2068";
const cstr	   ts2068_rom_filename				  = "ts2068.rom";
const cstr	   ts2068_kbd_filename				  = "ts2068_kbd.png";
const cstr	   ts2068_image_filename			  = "ts2068.jpg";
const Language ts2068_language					  = american;
const uint32   ts2068_ula_cycles_per_second		  = 14112000;
const uint	   ts2068_cpu_clock_predivider		  = 4;
const uint32   ts2068_cpu_cycles_per_second		  = 3528000;
const uint	   ts2068_cpu_cycles_per_line		  = 224;
const uint	   ts2068_lines_before_screen		  = 34;
const uint	   ts2068_lines_in_screen			  = 192;
const uint	   ts2068_lines_after_screen		  = 34;
const uint32   ts2068_cpu_cycles_per_frame		  = 58240;
const double   ts2068_frames_per_second			  = 60.5769230769;
const bool	   ts2068_has_50_60hz_switch		  = 0;
const uint	   ts2068_page_size					  = 8192;
const uint	   ts2068_rom_pages					  = 3;
const uint	   ts2068_ram_pages					  = 6;
const uint32   ts2068_rom_size					  = 24576;
const uint32   ts2068_ram_size					  = 49152;
const uint32   ts2068_contended_rampages		  = 0xc0000000;
const uint8	   ts2068_waitmap					  = 0x7e;
const uint32   ts2068_videoram_start			  = 0x0000;
const uint32   ts2068_videoram_start_2			  = 0x2000;
const uint32   ts2068_videoram_size				  = 6912;
const uint	   ts2068_characterram_start		  = 0;
const uint	   ts2068_characterram_size			  = 0;
const float	   ts2068_earin_threshold_mic_lo	  = 0.005;
const float	   ts2068_earin_threshold_mic_hi	  = 0.005;
const uint	   ts2068_tape_load_routine			  = 0x40FC;
const uint	   ts2068_tape_save_routine			  = 0x4076;
const uint	   ts2068_tape_load_ret_addr		  = 0x40E5;
const bool	   ts2068_has_port_7ffd				  = no;
const bool	   ts2068_has_port_1ffd				  = no;
const bool	   ts2068_has_port_F4				  = yes;
const bool	   ts2068_has_port_FF				  = yes;
const bool	   ts2068_has_ay_soundchip			  = yes;
const uint32   ts2068_ay_cycles_per_second		  = 1764000;
const bool	   ts2068_has_tape_drive			  = no;
const bool	   ts2068_has_module_port			  = yes;
const bool	   ts2068_has_floppy_drive			  = no;
const bool	   ts2068_has_printer_port			  = no;
const uint	   ts2068_has_serial_ports			  = no;
const uint	   ts2068_has_joystick_ports		  = 2;
const bool	   ts2068_has_kempston_joystick_ports = no;
const bool	   ts2068_has_sinclair_joystick_ports = no;

const cstr	   u2086_name						 = "unipolbrit Komputer 2086 (Poland)";
const bool	   u2086_is_supported				 = 1;
const bool	   u2086_has_zxsp_bus				 = yes;
const bool	   u2086_has_zx80_bus				 = no;
const isa_id   u2086_id							 = isa_MachineUnipol;
const cstr	   u2086_nickname					 = "u2086";
const cstr	   u2086_rom_filename				 = "ts2068.rom";
const cstr	   u2086_kbd_filename				 = "ts2068_kbd.png";
const cstr	   u2086_image_filename				 = "u2086.jpg";
const Language u2086_language					 = british;
const uint32   u2086_ula_cycles_per_second		 = 14112000;
const uint	   u2086_cpu_clock_predivider		 = 4;
const uint32   u2086_cpu_cycles_per_second		 = 3528000;
const uint	   u2086_cpu_cycles_per_line		 = 224;
const uint	   u2086_lines_before_screen		 = 64;
const uint	   u2086_lines_in_screen			 = 192;
const uint	   u2086_lines_after_screen			 = 56;
const uint32   u2086_cpu_cycles_per_frame		 = 69888;
const double   u2086_frames_per_second			 = 50.4807692308;
const bool	   u2086_has_50_60hz_switch			 = 0;
const uint	   u2086_page_size					 = 8192;
const uint	   u2086_rom_pages					 = 3;
const uint	   u2086_ram_pages					 = 6;
const uint32   u2086_rom_size					 = 24576;
const uint32   u2086_ram_size					 = 49152;
const uint32   u2086_contended_rampages			 = 0xc0000000;
const uint8	   u2086_waitmap					 = 0x7e;
const uint32   u2086_videoram_start				 = 0x0000;
const uint32   u2086_videoram_start_2			 = 0x2000;
const uint32   u2086_videoram_size				 = 6912;
const uint	   u2086_characterram_start			 = 0;
const uint	   u2086_characterram_size			 = 0;
const float	   u2086_earin_threshold_mic_lo		 = 0.005;
const float	   u2086_earin_threshold_mic_hi		 = 0.005;
const uint	   u2086_tape_load_routine			 = 0x40FC;
const uint	   u2086_tape_save_routine			 = 0x4076;
const uint	   u2086_tape_load_ret_addr			 = 0x40E5;
const bool	   u2086_has_port_7ffd				 = no;
const bool	   u2086_has_port_1ffd				 = no;
const bool	   u2086_has_port_F4				 = yes;
const bool	   u2086_has_port_FF				 = yes;
const bool	   u2086_has_ay_soundchip			 = yes;
const uint32   u2086_ay_cycles_per_second		 = 1764750;
const bool	   u2086_has_tape_drive				 = no;
const bool	   u2086_has_module_port			 = yes;
const bool	   u2086_has_floppy_drive			 = no;
const bool	   u2086_has_printer_port			 = no;
const uint	   u2086_has_serial_ports			 = no;
const uint	   u2086_has_joystick_ports			 = 2;
const bool	   u2086_has_kempston_joystick_ports = no;
const bool	   u2086_has_sinclair_joystick_ports = no;

const cstr	   tk90x_name						 = "TK 90X color computer (Brazil)";
const bool	   tk90x_is_supported				 = 1;
const bool	   tk90x_has_zxsp_bus				 = yes;
const bool	   tk90x_has_zx80_bus				 = no;
const isa_id   tk90x_id							 = isa_MachineTk90x;
const cstr	   tk90x_nickname					 = "tk90x";
const cstr	   tk90x_rom_filename				 = "tk90x.rom";
const cstr	   tk90x_kbd_filename				 = "tk90x_kbd.jpg";
const cstr	   tk90x_image_filename				 = "tk90x.jpg";
const Language tk90x_language					 = portuguese;
const uint32   tk90x_ula_cycles_per_second		 = 14320000;
const uint	   tk90x_cpu_clock_predivider		 = 4;
const uint32   tk90x_cpu_cycles_per_second		 = 3580000;
const uint	   tk90x_cpu_cycles_per_line		 = 224;
const uint	   tk90x_lines_before_screen		 = 40;
const uint	   tk90x_lines_in_screen			 = 192;
const uint	   tk90x_lines_after_screen			 = 32;
const uint32   tk90x_cpu_cycles_per_frame		 = 59136;
const double   tk90x_frames_per_second			 = 60.5384199134;
const bool	   tk90x_has_50_60hz_switch			 = 1;
const uint	   tk90x_page_size					 = 16384;
const uint	   tk90x_rom_pages					 = 1;
const uint	   tk90x_ram_pages					 = 3;
const uint32   tk90x_rom_size					 = 16384;
const uint32   tk90x_ram_size					 = 49152;
const uint32   tk90x_contended_rampages			 = 0x80000000;
const uint8	   tk90x_waitmap					 = 0x7e;
const uint32   tk90x_videoram_start				 = 0x0000;
const uint32   tk90x_videoram_start_2			 = 0;
const uint32   tk90x_videoram_size				 = 6912;
const uint	   tk90x_characterram_start			 = 0;
const uint	   tk90x_characterram_size			 = 0;
const float	   tk90x_earin_threshold_mic_lo		 = -0.005;
const float	   tk90x_earin_threshold_mic_hi		 = -0.005;
const uint	   tk90x_tape_load_routine			 = 0x0556;
const uint	   tk90x_tape_save_routine			 = 0x04d0;
const uint	   tk90x_tape_load_ret_addr			 = 0x053f;
const bool	   tk90x_has_port_7ffd				 = no;
const bool	   tk90x_has_port_1ffd				 = no;
const bool	   tk90x_has_port_F4				 = no;
const bool	   tk90x_has_port_FF				 = no;
const bool	   tk90x_has_ay_soundchip			 = no;
const uint32   tk90x_ay_cycles_per_second		 = 1790000;
const bool	   tk90x_has_tape_drive				 = 0;
const bool	   tk90x_has_module_port			 = 0;
const bool	   tk90x_has_floppy_drive			 = 0;
const bool	   tk90x_has_printer_port			 = 0;
const uint	   tk90x_has_serial_ports			 = 0;
const uint	   tk90x_has_joystick_ports			 = 1;
const bool	   tk90x_has_kempston_joystick_ports = 0;
const bool	   tk90x_has_sinclair_joystick_ports = 1;

const cstr	   tk95_name						= "TK 95 color computer (Brazil)";
const bool	   tk95_is_supported				= 1;
const bool	   tk95_has_zxsp_bus				= yes;
const bool	   tk95_has_zx80_bus				= no;
const isa_id   tk95_id							= isa_MachineTk95;
const cstr	   tk95_nickname					= "tk95";
const cstr	   tk95_rom_filename				= "tk95.rom";
const cstr	   tk95_kbd_filename				= "tk95_kbd.jpg";
const cstr	   tk95_image_filename				= "tk95.jpg";
const Language tk95_language					= portuguese;
const uint32   tk95_ula_cycles_per_second		= 14320000;
const uint	   tk95_cpu_clock_predivider		= 4;
const uint32   tk95_cpu_cycles_per_second		= 3580000;
const uint	   tk95_cpu_cycles_per_line			= 224;
const uint	   tk95_lines_before_screen			= 40;
const uint	   tk95_lines_in_screen				= 192;
const uint	   tk95_lines_after_screen			= 32;
const uint32   tk95_cpu_cycles_per_frame		= 59136;
const double   tk95_frames_per_second			= 60.5384199134;
const bool	   tk95_has_50_60hz_switch			= 1;
const uint	   tk95_page_size					= 16384;
const uint	   tk95_rom_pages					= 1;
const uint	   tk95_ram_pages					= 3;
const uint32   tk95_rom_size					= 16384;
const uint32   tk95_ram_size					= 49152;
const uint32   tk95_contended_rampages			= 0x80000000;
const uint8	   tk95_waitmap						= 0x7e;
const uint32   tk95_videoram_start				= 0x0000;
const uint32   tk95_videoram_start_2			= 0;
const uint32   tk95_videoram_size				= 6912;
const uint	   tk95_characterram_start			= 0;
const uint	   tk95_characterram_size			= 0;
const float	   tk95_earin_threshold_mic_lo		= -0.005;
const float	   tk95_earin_threshold_mic_hi		= -0.005;
const uint	   tk95_tape_load_routine			= 0x0556;
const uint	   tk95_tape_save_routine			= 0x04d0;
const uint	   tk95_tape_load_ret_addr			= 0x053f;
const bool	   tk95_has_port_7ffd				= no;
const bool	   tk95_has_port_1ffd				= no;
const bool	   tk95_has_port_F4					= no;
const bool	   tk95_has_port_FF					= no;
const bool	   tk95_has_ay_soundchip			= no;
const uint32   tk95_ay_cycles_per_second		= 1790000;
const bool	   tk95_has_tape_drive				= 0;
const bool	   tk95_has_module_port				= 0;
const bool	   tk95_has_floppy_drive			= 0;
const bool	   tk95_has_printer_port			= 0;
const uint	   tk95_has_serial_ports			= 0;
const uint	   tk95_has_joystick_ports			= 1;
const bool	   tk95_has_kempston_joystick_ports = 1;
const bool	   tk95_has_sinclair_joystick_ports = 0;

const cstr	   pentagon128_name						   = "Pentagon 128k (USSR)";
const bool	   pentagon128_is_supported				   = 1;
const bool	   pentagon128_has_zxsp_bus				   = no;
const bool	   pentagon128_has_zx80_bus				   = no;
const isa_id   pentagon128_id						   = isa_MachinePentagon128;
const cstr	   pentagon128_nickname					   = "pentagon128";
const cstr	   pentagon128_rom_filename				   = "pentagon.rom";
const cstr	   pentagon128_kbd_filename				   = "pentagon_kbd.png";
const cstr	   pentagon128_image_filename			   = "pentagon128.jpg";
const Language pentagon128_language					   = british;
const uint32   pentagon128_ula_cycles_per_second	   = 14000000;
const uint	   pentagon128_cpu_clock_predivider		   = 4;
const uint32   pentagon128_cpu_cycles_per_second	   = 3500000;
const uint	   pentagon128_cpu_cycles_per_line		   = 224;
const uint	   pentagon128_lines_before_screen		   = 80;
const uint	   pentagon128_lines_in_screen			   = 192;
const uint	   pentagon128_lines_after_screen		   = 48;
const uint32   pentagon128_cpu_cycles_per_frame		   = 71680;
const double   pentagon128_frames_per_second		   = 48.828125;
const bool	   pentagon128_has_50_60hz_switch		   = 0;
const uint	   pentagon128_page_size				   = 16384;
const uint	   pentagon128_rom_pages				   = 2;
const uint	   pentagon128_ram_pages				   = 8;
const uint32   pentagon128_rom_size					   = 32768;
const uint32   pentagon128_ram_size					   = 131072;
const uint32   pentagon128_contended_rampages		   = 0;
const uint8	   pentagon128_waitmap					   = 0;
const uint32   pentagon128_videoram_start			   = 0x4000 * 5;
const uint32   pentagon128_videoram_start_2			   = 0x4000 * 7;
const uint32   pentagon128_videoram_size			   = 32 * 24 * (8 + 1);
const uint	   pentagon128_characterram_start		   = 0;
const uint	   pentagon128_characterram_size		   = 0;
const float	   pentagon128_earin_threshold_mic_lo	   = 0.005;
const float	   pentagon128_earin_threshold_mic_hi	   = 0.005;
const uint	   pentagon128_tape_load_routine		   = 0x4000 + 0x0556;
const uint	   pentagon128_tape_save_routine		   = 0x4000 + 0x04D0;
const uint	   pentagon128_tape_load_ret_addr		   = 0x4000 + 0x053F;
const bool	   pentagon128_has_port_7ffd			   = yes;
const bool	   pentagon128_has_port_1ffd			   = no;
const bool	   pentagon128_has_port_F4				   = no;
const bool	   pentagon128_has_port_FF				   = no;
const bool	   pentagon128_has_ay_soundchip			   = yes;
const uint32   pentagon128_ay_cycles_per_second		   = 1750000;
const bool	   pentagon128_has_tape_drive			   = 0;
const bool	   pentagon128_has_module_port			   = 0;
const bool	   pentagon128_has_floppy_drive			   = 0;
const bool	   pentagon128_has_printer_port			   = 0;
const uint	   pentagon128_has_serial_ports			   = 0;
const uint	   pentagon128_has_joystick_ports		   = 1;
const bool	   pentagon128_has_kempston_joystick_ports = 1;
const bool	   pentagon128_has_sinclair_joystick_ports = 0;

const cstr	   scorpion_name						= "ZS Scorpion 256k (USSR)";
const bool	   scorpion_is_supported				= 0;
const bool	   scorpion_has_zxsp_bus				= yes;
const bool	   scorpion_has_zx80_bus				= no;
const isa_id   scorpion_id							= isa_MachineZx128;
const cstr	   scorpion_nickname					= "scorpion";
const cstr	   scorpion_rom_filename				= "scorpion.rom";
const cstr	   scorpion_kbd_filename				= "scorpion_kbd.png";
const cstr	   scorpion_image_filename				= "scorpion.jpg";
const Language scorpion_language					= british;
const uint32   scorpion_ula_cycles_per_second		= 14000000;
const uint	   scorpion_cpu_clock_predivider		= 2;
const uint32   scorpion_cpu_cycles_per_second		= 7000000;
const uint	   scorpion_cpu_cycles_per_line			= 224;
const uint	   scorpion_lines_before_screen			= 64;
const uint	   scorpion_lines_in_screen				= 192;
const uint	   scorpion_lines_after_screen			= 56;
const uint32   scorpion_cpu_cycles_per_frame		= 69888;
const double   scorpion_frames_per_second			= 100.1602564103;
const bool	   scorpion_has_50_60hz_switch			= 0;
const uint	   scorpion_page_size					= 16384;
const uint	   scorpion_rom_pages					= 4;
const uint	   scorpion_ram_pages					= 16;
const uint32   scorpion_rom_size					= 65536;
const uint32   scorpion_ram_size					= 262144;
const uint32   scorpion_contended_rampages			= 0;
const uint8	   scorpion_waitmap						= 0;
const uint32   scorpion_videoram_start				= 0x4000 * 5;
const uint32   scorpion_videoram_start_2			= 0x4000 * 7;
const uint32   scorpion_videoram_size				= 32 * 24 * (8 + 1);
const uint	   scorpion_characterram_start			= 0;
const uint	   scorpion_characterram_size			= 0;
const float	   scorpion_earin_threshold_mic_lo		= 0.005;
const float	   scorpion_earin_threshold_mic_hi		= 0.005;
const uint	   scorpion_tape_load_routine			= 0x4000 + 0x0556;
const uint	   scorpion_tape_save_routine			= 0x4000 + 0x04D0;
const uint	   scorpion_tape_load_ret_addr			= 0x4000 + 0x053F;
const bool	   scorpion_has_port_7ffd				= yes;
const bool	   scorpion_has_port_1ffd				= 0;
const bool	   scorpion_has_port_F4					= 0;
const bool	   scorpion_has_port_FF					= 0;
const bool	   scorpion_has_ay_soundchip			= yes;
const uint32   scorpion_ay_cycles_per_second		= 3500000 / 2;
const bool	   scorpion_has_tape_drive				= 0;
const bool	   scorpion_has_module_port				= 0;
const bool	   scorpion_has_floppy_drive			= 0;
const bool	   scorpion_has_printer_port			= 0;
const uint	   scorpion_has_serial_ports			= 0;
const uint	   scorpion_has_joystick_ports			= 1;
const bool	   scorpion_has_kempston_joystick_ports = 1;
const bool	   scorpion_has_sinclair_joystick_ports = 0;

const cstr	   samcoupe_name						= "Sam Coupé";
const bool	   samcoupe_is_supported				= 0;
const bool	   samcoupe_has_zxsp_bus				= no;
const bool	   samcoupe_has_zx80_bus				= no;
const isa_id   samcoupe_id							= isa_MachineZxsp;
const cstr	   samcoupe_nickname					= "samcoupe";
const cstr	   samcoupe_rom_filename				= "coupe.rom";
const cstr	   samcoupe_kbd_filename				= "coupe_kbd.png";
const cstr	   samcoupe_image_filename				= "samcoupe.jpg";
const Language samcoupe_language					= british;
const uint32   samcoupe_ula_cycles_per_second		= 24000000;
const uint	   samcoupe_cpu_clock_predivider		= 4;
const uint32   samcoupe_cpu_cycles_per_second		= 6000000;
const uint	   samcoupe_cpu_cycles_per_line			= 224;
const uint	   samcoupe_lines_before_screen			= 64;
const uint	   samcoupe_lines_in_screen				= 192;
const uint	   samcoupe_lines_after_screen			= 56;
const uint32   samcoupe_cpu_cycles_per_frame		= 69888;
const double   samcoupe_frames_per_second			= 85.8516483516;
const bool	   samcoupe_has_50_60hz_switch			= 0;
const uint	   samcoupe_page_size					= 16384;
const uint	   samcoupe_rom_pages					= 2;
const uint	   samcoupe_ram_pages					= 16;
const uint32   samcoupe_rom_size					= 32768;
const uint32   samcoupe_ram_size					= 262144;
const uint32   samcoupe_contended_rampages			= 0;
const uint8	   samcoupe_waitmap						= 0;
const uint32   samcoupe_videoram_start				= 0x4000 * 5;
const uint32   samcoupe_videoram_start_2			= 0x4000 * 7;
const uint32   samcoupe_videoram_size				= 32 * 24 * (8 + 1);
const uint	   samcoupe_characterram_start			= 0;
const uint	   samcoupe_characterram_size			= 0;
const float	   samcoupe_earin_threshold_mic_lo		= 0.005;
const float	   samcoupe_earin_threshold_mic_hi		= 0.005;
const uint	   samcoupe_tape_load_routine			= 0;
const uint	   samcoupe_tape_save_routine			= 0;
const uint	   samcoupe_tape_load_ret_addr			= 0;
const bool	   samcoupe_has_port_7ffd				= 1;
const bool	   samcoupe_has_port_1ffd				= 0;
const bool	   samcoupe_has_port_F4					= 0;
const bool	   samcoupe_has_port_FF					= 0;
const bool	   samcoupe_has_ay_soundchip			= 1;
const uint32   samcoupe_ay_cycles_per_second		= 6000000 / 4;
const bool	   samcoupe_has_tape_drive				= 0;
const bool	   samcoupe_has_module_port				= 0;
const bool	   samcoupe_has_floppy_drive			= yes /*2*/;
const bool	   samcoupe_has_printer_port			= 0;
const uint	   samcoupe_has_serial_ports			= 1;
const uint	   samcoupe_has_joystick_ports			= 2;
const bool	   samcoupe_has_kempston_joystick_ports = 0;
const bool	   samcoupe_has_sinclair_joystick_ports = 1;

const cstr	   zx80_name						= "Sinclair ZX80";
const bool	   zx80_is_supported				= 1;
const bool	   zx80_has_zxsp_bus				= no;
const bool	   zx80_has_zx80_bus				= yes;
const isa_id   zx80_id							= isa_MachineZx80;
const cstr	   zx80_nickname					= "zx80";
const cstr	   zx80_rom_filename				= "zx80.rom";
const cstr	   zx80_kbd_filename				= "zx80_kbd.png";
const cstr	   zx80_image_filename				= "zx80.jpg";
const Language zx80_language					= british;
const uint32   zx80_ula_cycles_per_second		= 6500000;
const uint	   zx80_cpu_clock_predivider		= 2;
const uint32   zx80_cpu_cycles_per_second		= 3250000;
const uint	   zx80_cpu_cycles_per_line			= 207;
const uint	   zx80_lines_before_screen			= 56;
const uint	   zx80_lines_in_screen				= 192;
const uint	   zx80_lines_after_screen			= 62;
const uint32   zx80_cpu_cycles_per_frame		= 64170;
const double   zx80_frames_per_second			= 50.6467196509;
const bool	   zx80_has_50_60hz_switch			= 1;
const uint	   zx80_page_size					= 1024;
const uint	   zx80_rom_pages					= 4;
const uint	   zx80_ram_pages					= 1;
const uint32   zx80_rom_size					= 4096;
const uint32   zx80_ram_size					= 1024;
const uint32   zx80_contended_rampages			= 0;
const uint8	   zx80_waitmap						= 0;
const uint32   zx80_videoram_start				= 0x0000;
const uint32   zx80_videoram_start_2			= 0;
const uint32   zx80_videoram_size				= 24 * 33;
const uint	   zx80_characterram_start			= 0;
const uint	   zx80_characterram_size			= 0;
const float	   zx80_earin_threshold_mic_lo		= 0.005;
const float	   zx80_earin_threshold_mic_hi		= 0.005;
const uint	   zx80_tape_load_routine			= 0x0207;
const uint	   zx80_tape_save_routine			= 0x01B6 + 1;
const uint	   zx80_tape_load_ret_addr			= 0x0202;
const bool	   zx80_has_port_7ffd				= no;
const bool	   zx80_has_port_1ffd				= no;
const bool	   zx80_has_port_F4					= no;
const bool	   zx80_has_port_FF					= no;
const bool	   zx80_has_ay_soundchip			= 0;
const uint32   zx80_ay_cycles_per_second		= 0;
const bool	   zx80_has_tape_drive				= 0;
const bool	   zx80_has_module_port				= 0;
const bool	   zx80_has_floppy_drive			= 0;
const bool	   zx80_has_printer_port			= 0;
const uint	   zx80_has_serial_ports			= 0;
const uint	   zx80_has_joystick_ports			= 0;
const bool	   zx80_has_kempston_joystick_ports = 0;
const bool	   zx80_has_sinclair_joystick_ports = 0;

const cstr	   zx81_name						= "Sinclair ZX81";
const bool	   zx81_is_supported				= 1;
const bool	   zx81_has_zxsp_bus				= no;
const bool	   zx81_has_zx80_bus				= yes;
const isa_id   zx81_id							= isa_MachineZx81;
const cstr	   zx81_nickname					= "zx81";
const cstr	   zx81_rom_filename				= "zx81.rom";
const cstr	   zx81_kbd_filename				= "zx81_kbd.png";
const cstr	   zx81_image_filename				= "zx81.jpg";
const Language zx81_language					= british;
const uint32   zx81_ula_cycles_per_second		= 6500000;
const uint	   zx81_cpu_clock_predivider		= 2;
const uint32   zx81_cpu_cycles_per_second		= 3250000;
const uint	   zx81_cpu_cycles_per_line			= 207;
const uint	   zx81_lines_before_screen			= 56;
const uint	   zx81_lines_in_screen				= 192;
const uint	   zx81_lines_after_screen			= 62;
const uint32   zx81_cpu_cycles_per_frame		= 64170;
const double   zx81_frames_per_second			= 50.6467196509;
const bool	   zx81_has_50_60hz_switch			= 0;
const uint	   zx81_page_size					= 1024;
const uint	   zx81_rom_pages					= 8;
const uint	   zx81_ram_pages					= 1;
const uint32   zx81_rom_size					= 8192;
const uint32   zx81_ram_size					= 1024;
const uint32   zx81_contended_rampages			= 0;
const uint8	   zx81_waitmap						= 0;
const uint32   zx81_videoram_start				= 0x0000;
const uint32   zx81_videoram_start_2			= 0;
const uint32   zx81_videoram_size				= 24 * 33;
const uint	   zx81_characterram_start			= 0;
const uint	   zx81_characterram_size			= 0;
const float	   zx81_earin_threshold_mic_lo		= 0.005;
const float	   zx81_earin_threshold_mic_hi		= 0.005;
const uint	   zx81_tape_load_routine			= 0x0340 + 7;
const uint	   zx81_tape_save_routine			= 0x02F6 + 6;
const uint	   zx81_tape_load_ret_addr			= 0x0207 + 3;
const bool	   zx81_has_port_7ffd				= no;
const bool	   zx81_has_port_1ffd				= no;
const bool	   zx81_has_port_F4					= no;
const bool	   zx81_has_port_FF					= no;
const bool	   zx81_has_ay_soundchip			= 0;
const uint32   zx81_ay_cycles_per_second		= 0;
const bool	   zx81_has_tape_drive				= 0;
const bool	   zx81_has_module_port				= 0;
const bool	   zx81_has_floppy_drive			= 0;
const bool	   zx81_has_printer_port			= 0;
const uint	   zx81_has_serial_ports			= 0;
const uint	   zx81_has_joystick_ports			= 0;
const bool	   zx81_has_kempston_joystick_ports = 0;
const bool	   zx81_has_sinclair_joystick_ports = 0;

const cstr	   ts1000_name						  = "Timex Sinclair 1000 (USA)";
const bool	   ts1000_is_supported				  = 1;
const bool	   ts1000_has_zxsp_bus				  = no;
const bool	   ts1000_has_zx80_bus				  = yes;
const isa_id   ts1000_id						  = isa_MachineTs1000;
const cstr	   ts1000_nickname					  = "ts1000";
const cstr	   ts1000_rom_filename				  = "zx81.rom";
const cstr	   ts1000_kbd_filename				  = "ts1000_kbd.jpg";
const cstr	   ts1000_image_filename			  = "ts1000.jpg";
const Language ts1000_language					  = american;
const uint32   ts1000_ula_cycles_per_second		  = 6500000;
const uint	   ts1000_cpu_clock_predivider		  = 2;
const uint32   ts1000_cpu_cycles_per_second		  = 3250000;
const uint	   ts1000_cpu_cycles_per_line		  = 207;
const uint	   ts1000_lines_before_screen		  = 32;
const uint	   ts1000_lines_in_screen			  = 192;
const uint	   ts1000_lines_after_screen		  = 38;
const uint32   ts1000_cpu_cycles_per_frame		  = 54234;
const double   ts1000_frames_per_second			  = 59.9255079839;
const bool	   ts1000_has_50_60hz_switch		  = 0;
const uint	   ts1000_page_size					  = 1024;
const uint	   ts1000_rom_pages					  = 8;
const uint	   ts1000_ram_pages					  = 2;
const uint32   ts1000_rom_size					  = 8192;
const uint32   ts1000_ram_size					  = 2048;
const uint32   ts1000_contended_rampages		  = 0;
const uint8	   ts1000_waitmap					  = 0;
const uint32   ts1000_videoram_start			  = 0x0000;
const uint32   ts1000_videoram_start_2			  = 0;
const uint32   ts1000_videoram_size				  = 24 * 33;
const uint	   ts1000_characterram_start		  = 0;
const uint	   ts1000_characterram_size			  = 0;
const float	   ts1000_earin_threshold_mic_lo	  = 0.005;
const float	   ts1000_earin_threshold_mic_hi	  = 0.005;
const uint	   ts1000_tape_load_routine			  = 0x0340 + 7;
const uint	   ts1000_tape_save_routine			  = 0x02F6 + 6;
const uint	   ts1000_tape_load_ret_addr		  = 0x0207 + 3;
const bool	   ts1000_has_port_7ffd				  = no;
const bool	   ts1000_has_port_1ffd				  = no;
const bool	   ts1000_has_port_F4				  = no;
const bool	   ts1000_has_port_FF				  = no;
const bool	   ts1000_has_ay_soundchip			  = 0;
const uint32   ts1000_ay_cycles_per_second		  = 0;
const bool	   ts1000_has_tape_drive			  = 0;
const bool	   ts1000_has_module_port			  = 0;
const bool	   ts1000_has_floppy_drive			  = 0;
const bool	   ts1000_has_printer_port			  = 0;
const uint	   ts1000_has_serial_ports			  = 0;
const uint	   ts1000_has_joystick_ports		  = 0;
const bool	   ts1000_has_kempston_joystick_ports = 0;
const bool	   ts1000_has_sinclair_joystick_ports = 0;

const cstr	   ts1500_name						  = "Timex Sinclair 1500 (USA)";
const bool	   ts1500_is_supported				  = 1;
const bool	   ts1500_has_zxsp_bus				  = no;
const bool	   ts1500_has_zx80_bus				  = yes;
const isa_id   ts1500_id						  = isa_MachineTs1500;
const cstr	   ts1500_nickname					  = "ts1500";
const cstr	   ts1500_rom_filename				  = "ts1500.rom";
const cstr	   ts1500_kbd_filename				  = "ts1500_kbd.jpg";
const cstr	   ts1500_image_filename			  = "ts1500.jpg";
const Language ts1500_language					  = american;
const uint32   ts1500_ula_cycles_per_second		  = 6500000;
const uint	   ts1500_cpu_clock_predivider		  = 2;
const uint32   ts1500_cpu_cycles_per_second		  = 3250000;
const uint	   ts1500_cpu_cycles_per_line		  = 207;
const uint	   ts1500_lines_before_screen		  = 32;
const uint	   ts1500_lines_in_screen			  = 192;
const uint	   ts1500_lines_after_screen		  = 38;
const uint32   ts1500_cpu_cycles_per_frame		  = 54234;
const double   ts1500_frames_per_second			  = 59.9255079839;
const bool	   ts1500_has_50_60hz_switch		  = 0;
const uint	   ts1500_page_size					  = 1024;
const uint	   ts1500_rom_pages					  = 8;
const uint	   ts1500_ram_pages					  = 16;
const uint32   ts1500_rom_size					  = 8192;
const uint32   ts1500_ram_size					  = 16384;
const uint32   ts1500_contended_rampages		  = 0;
const uint8	   ts1500_waitmap					  = 0;
const uint32   ts1500_videoram_start			  = 0x0000;
const uint32   ts1500_videoram_start_2			  = 0;
const uint32   ts1500_videoram_size				  = 24 * 33;
const uint	   ts1500_characterram_start		  = 0;
const uint	   ts1500_characterram_size			  = 0;
const float	   ts1500_earin_threshold_mic_lo	  = 0.005;
const float	   ts1500_earin_threshold_mic_hi	  = 0.005;
const uint	   ts1500_tape_load_routine			  = 0x0340 + 7;
const uint	   ts1500_tape_save_routine			  = 0x02F6 + 6;
const uint	   ts1500_tape_load_ret_addr		  = 0x0207 + 3;
const bool	   ts1500_has_port_7ffd				  = no;
const bool	   ts1500_has_port_1ffd				  = no;
const bool	   ts1500_has_port_F4				  = no;
const bool	   ts1500_has_port_FF				  = no;
const bool	   ts1500_has_ay_soundchip			  = 0;
const uint32   ts1500_ay_cycles_per_second		  = 0;
const bool	   ts1500_has_tape_drive			  = 0;
const bool	   ts1500_has_module_port			  = 0;
const bool	   ts1500_has_floppy_drive			  = 0;
const bool	   ts1500_has_printer_port			  = 0;
const uint	   ts1500_has_serial_ports			  = 0;
const uint	   ts1500_has_joystick_ports		  = 0;
const bool	   ts1500_has_kempston_joystick_ports = 0;
const bool	   ts1500_has_sinclair_joystick_ports = 0;

const cstr	   tk85_name						= "TK85 Personal Computer (Brazil)";
const bool	   tk85_is_supported				= 1;
const bool	   tk85_has_zxsp_bus				= no;
const bool	   tk85_has_zx80_bus				= yes;
const isa_id   tk85_id							= isa_MachineTk85;
const cstr	   tk85_nickname					= "tk85";
const cstr	   tk85_rom_filename				= "tk85.rom";
const cstr	   tk85_kbd_filename				= "tk85_kbd.jpg";
const cstr	   tk85_image_filename				= "tk85.jpg";
const Language tk85_language					= portuguese;
const uint32   tk85_ula_cycles_per_second		= 6500000;
const uint	   tk85_cpu_clock_predivider		= 2;
const uint32   tk85_cpu_cycles_per_second		= 3250000;
const uint	   tk85_cpu_cycles_per_line			= 207;
const uint	   tk85_lines_before_screen			= 32;
const uint	   tk85_lines_in_screen				= 192;
const uint	   tk85_lines_after_screen			= 38;
const uint32   tk85_cpu_cycles_per_frame		= 54234;
const double   tk85_frames_per_second			= 59.9255079839;
const bool	   tk85_has_50_60hz_switch			= 1;
const uint	   tk85_page_size					= 1024;
const uint	   tk85_rom_pages					= 10;
const uint	   tk85_ram_pages					= 16;
const uint32   tk85_rom_size					= 10240;
const uint32   tk85_ram_size					= 16384;
const uint32   tk85_contended_rampages			= 0;
const uint8	   tk85_waitmap						= 0;
const uint32   tk85_videoram_start				= 0x0000;
const uint32   tk85_videoram_start_2			= 0;
const uint32   tk85_videoram_size				= 24 * 33;
const uint	   tk85_characterram_start			= 0;
const uint	   tk85_characterram_size			= 0;
const float	   tk85_earin_threshold_mic_lo		= 0.005;
const float	   tk85_earin_threshold_mic_hi		= 0.005;
const uint	   tk85_tape_load_routine			= 0x0340 + 7;
const uint	   tk85_tape_save_routine			= 0x02F6 + 6;
const uint	   tk85_tape_load_ret_addr			= 0x0207 + 3;
const bool	   tk85_has_port_7ffd				= no;
const bool	   tk85_has_port_1ffd				= no;
const bool	   tk85_has_port_F4					= no;
const bool	   tk85_has_port_FF					= no;
const bool	   tk85_has_ay_soundchip			= 0;
const uint32   tk85_ay_cycles_per_second		= 0;
const bool	   tk85_has_tape_drive				= 0;
const bool	   tk85_has_module_port				= 0;
const bool	   tk85_has_floppy_drive			= 0;
const bool	   tk85_has_printer_port			= 0;
const uint	   tk85_has_serial_ports			= 0;
const uint	   tk85_has_joystick_ports			= yes;
const bool	   tk85_has_kempston_joystick_ports = 0;
const bool	   tk85_has_sinclair_joystick_ports = 0;

const cstr	   jupiter_name						   = "Jupiter ACE";
const bool	   jupiter_is_supported				   = 1;
const bool	   jupiter_has_zxsp_bus				   = no;
const bool	   jupiter_has_zx80_bus				   = no;
const isa_id   jupiter_id						   = isa_MachineJupiter;
const cstr	   jupiter_nickname					   = "jupiter";
const cstr	   jupiter_rom_filename				   = "jupiter.rom";
const cstr	   jupiter_kbd_filename				   = "jupiter_kbd.png";
const cstr	   jupiter_image_filename			   = "jupiter.jpg";
const Language jupiter_language					   = british;
const uint32   jupiter_ula_cycles_per_second	   = 6500000;
const uint	   jupiter_cpu_clock_predivider		   = 2;
const uint32   jupiter_cpu_cycles_per_second	   = 3250000;
const uint	   jupiter_cpu_cycles_per_line		   = 208;
const uint	   jupiter_lines_before_screen		   = 56;
const uint	   jupiter_lines_in_screen			   = 192;
const uint	   jupiter_lines_after_screen		   = 64;
const uint32   jupiter_cpu_cycles_per_frame		   = 64896;
const double   jupiter_frames_per_second		   = 50.0801282051;
const bool	   jupiter_has_50_60hz_switch		   = 1;
const uint	   jupiter_page_size				   = 1024;
const uint	   jupiter_rom_pages				   = 8;
const uint	   jupiter_ram_pages				   = 3;
const uint32   jupiter_rom_size					   = 8192;
const uint32   jupiter_ram_size					   = 3072;
const uint32   jupiter_contended_rampages		   = 0;
const uint8	   jupiter_waitmap					   = 0;
const uint32   jupiter_videoram_start			   = 0x0000;
const uint32   jupiter_videoram_start_2			   = 0;
const uint32   jupiter_videoram_size			   = 24 * 32;
const uint	   jupiter_characterram_start		   = 0x0400;
const uint	   jupiter_characterram_size		   = 128 * 8;
const float	   jupiter_earin_threshold_mic_lo	   = 0.005;
const float	   jupiter_earin_threshold_mic_hi	   = 0.005;
const uint	   jupiter_tape_load_routine		   = 0x18B1;
const uint	   jupiter_tape_save_routine		   = 0x1829;
const uint	   jupiter_tape_load_ret_addr		   = 0x1892;
const bool	   jupiter_has_port_7ffd			   = no;
const bool	   jupiter_has_port_1ffd			   = no;
const bool	   jupiter_has_port_F4				   = no;
const bool	   jupiter_has_port_FF				   = no;
const bool	   jupiter_has_ay_soundchip			   = 0;
const uint32   jupiter_ay_cycles_per_second		   = 0;
const bool	   jupiter_has_tape_drive			   = 0;
const bool	   jupiter_has_module_port			   = 0;
const bool	   jupiter_has_floppy_drive			   = 0;
const bool	   jupiter_has_printer_port			   = 0;
const uint	   jupiter_has_serial_ports			   = 0;
const uint	   jupiter_has_joystick_ports		   = 0;
const bool	   jupiter_has_kempston_joystick_ports = 0;
const bool	   jupiter_has_sinclair_joystick_ports = 0;

#endif
