/* libspectrum.h: the library for dealing with ZX Spectrum emulator files Copyright (c) 2001-2007 Philip Kendall, Darren Salt, Fredrick Meunier $Id: libspectrum.h.in,v 1.141.2.2 2007/05/09 20:08:07 pak21 Exp $ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: E-mail: philip-fuse@shadowmagic.org.uk */ /* NB: This file is autogenerated from libspectrum.h.in. Do not edit unless you know what you're doing */ #ifndef LIBSPECTRUM_LIBSPECTRUM_H #define LIBSPECTRUM_LIBSPECTRUM_H #ifdef __cplusplus extern "C" { #endif /* #ifdef __cplusplus */ #include #include #include #include #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN /* Exclude rarely used stuff from Windows headers */ #include #ifdef LIBSPECTRUM_EXPORTS #define WIN32_DLL __declspec( dllexport ) #else /* #ifdef LIBSPECTRUM_EXPORTS */ #define WIN32_DLL __declspec( dllimport ) #endif /* #ifdef LIBSPECTRUM_EXPORTS */ #else /* #ifdef _WIN32 */ #define WIN32_DLL #endif /* #ifdef _WIN32 */ #ifdef __GNUC__ #define DEPRECATED __attribute__((deprecated)) #else /* #ifdef __GNUC__ */ #define DEPRECATED #endif /* #ifdef __GNUC__ */ LIBSPECTRUM_INCLUDE_GCRYPT /* Standard typedefs */ LIBSPECTRUM_DEFINE_TYPES /* glib replacement (if necessary) */ LIBSPECTRUM_GLIB_REPLACEMENT /* Library capabilities */ LIBSPECTRUM_CAPABILITIES /* * General libspectrum routines */ /* Error handling */ /* The various errors which can occur */ typedef enum libspectrum_error { LIBSPECTRUM_ERROR_NONE = 0, LIBSPECTRUM_ERROR_WARNING, LIBSPECTRUM_ERROR_MEMORY, LIBSPECTRUM_ERROR_UNKNOWN, LIBSPECTRUM_ERROR_CORRUPT, LIBSPECTRUM_ERROR_SIGNATURE, LIBSPECTRUM_ERROR_SLT, /* .slt data found at end of a .z80 file */ LIBSPECTRUM_ERROR_INVALID, /* Invalid parameter supplied */ LIBSPECTRUM_ERROR_LOGIC = -1, } libspectrum_error; /* Initialisation */ libspectrum_error WIN32_DLL libspectrum_init( void ); /* Version checking */ int WIN32_DLL libspectrum_check_version( const char *version ); const char WIN32_DLL *libspectrum_version( void ); const char WIN32_DLL *libspectrum_gcrypt_version( void ); /* Error handling */ typedef libspectrum_error (*libspectrum_error_function_t)( libspectrum_error error, const char *format, va_list ap ); extern libspectrum_error_function_t WIN32_DLL libspectrum_error_function; libspectrum_error WIN32_DLL libspectrum_default_error_function( libspectrum_error error, const char *format, va_list ap ); /* Attempt to identify a given file */ /* Various types of file we might manage to identify */ typedef enum libspectrum_id_t { /* These types present in all versions of libspectrum */ LIBSPECTRUM_ID_UNKNOWN = 0, /* Unidentified file */ LIBSPECTRUM_ID_RECORDING_RZX, /* RZX input recording */ LIBSPECTRUM_ID_SNAPSHOT_SNA, /* .sna snapshot */ LIBSPECTRUM_ID_SNAPSHOT_Z80, /* .z80 snapshot */ LIBSPECTRUM_ID_TAPE_TAP, /* Z80-style .tap tape image */ LIBSPECTRUM_ID_TAPE_TZX, /* TZX tape image */ /* Below here, present only in 0.1.1 and later */ LIBSPECTRUM_ID_DISK_DSK, /* .dsk +3 disk image */ LIBSPECTRUM_ID_DISK_SCL, /* .scl TR-DOS disk image */ LIBSPECTRUM_ID_DISK_TRD, /* .trd TR-DOS disk image */ LIBSPECTRUM_ID_CARTRIDGE_DCK, /* .dck Timex cartridge image */ /* Below here, present only in 0.2.0 and later */ LIBSPECTRUM_ID_TAPE_WARAJEVO, /* Warajevo-style .tap tape image */ LIBSPECTRUM_ID_SNAPSHOT_PLUSD, /* +D snapshot */ LIBSPECTRUM_ID_SNAPSHOT_SP, /* .sp snapshot */ LIBSPECTRUM_ID_SNAPSHOT_SNP, /* .snp snapshot */ LIBSPECTRUM_ID_SNAPSHOT_ZXS, /* .zxs snapshot (zx32) */ LIBSPECTRUM_ID_SNAPSHOT_SZX, /* .szx snapshot (Spectaculator) */ /* Below here, present only in 0.2.1 and later */ LIBSPECTRUM_ID_COMPRESSED_BZ2, /* bzip2 compressed file */ LIBSPECTRUM_ID_COMPRESSED_GZ, /* gzip compressed file */ /* Below here, present only in 0.2.2 and later */ LIBSPECTRUM_ID_HARDDISK_HDF, /* .hdf hard disk image */ LIBSPECTRUM_ID_CARTRIDGE_IF2, /* .rom Interface II cartridge image */ /* Below here, present only in 0.3.0 and later */ LIBSPECTRUM_ID_MICRODRIVE_MDR, /* .mdr microdrive cartridge */ LIBSPECTRUM_ID_TAPE_CSW, /* .csw tape image */ LIBSPECTRUM_ID_TAPE_Z80EM /* Z80Em tape image */ } libspectrum_id_t; /* And 'classes' of file */ typedef enum libspectrum_class_t { LIBSPECTRUM_CLASS_UNKNOWN, LIBSPECTRUM_CLASS_CARTRIDGE_TIMEX, /* Timex cartridges */ LIBSPECTRUM_CLASS_DISK_PLUS3, /* +3 disk */ LIBSPECTRUM_CLASS_DISK_TRDOS, /* TR-DOS disk */ LIBSPECTRUM_CLASS_RECORDING, /* Input recording */ LIBSPECTRUM_CLASS_SNAPSHOT, /* Snapshot */ LIBSPECTRUM_CLASS_TAPE, /* Tape */ /* Below here, present only in 0.2.1 and later */ LIBSPECTRUM_CLASS_COMPRESSED, /* A compressed file */ /* Below here, present only in 0.2.2 and later */ LIBSPECTRUM_CLASS_HARDDISK, /* A hard disk image */ LIBSPECTRUM_CLASS_CARTRIDGE_IF2, /* Interface II cartridges */ /* Below here, present only in 0.3.0 and later */ LIBSPECTRUM_CLASS_MICRODRIVE, /* Microdrive cartridges */ } libspectrum_class_t; libspectrum_error WIN32_DLL libspectrum_identify_file( libspectrum_id_t *type, const char *filename, const unsigned char *buffer, size_t length ); libspectrum_error WIN32_DLL libspectrum_identify_file_with_class( libspectrum_id_t *type, libspectrum_class_t *libspectrum_class, const char *filename, const unsigned char *buffer, size_t length ); libspectrum_error WIN32_DLL libspectrum_identify_file_raw( libspectrum_id_t *type, const char *filename, const unsigned char *buffer, size_t length ); libspectrum_error WIN32_DLL libspectrum_identify_class( libspectrum_class_t *libspectrum_class, libspectrum_id_t type ); /* Different Spectrum variants and their capabilities */ /* The machine types we can handle */ typedef enum libspectrum_machine { LIBSPECTRUM_MACHINE_48, LIBSPECTRUM_MACHINE_TC2048, LIBSPECTRUM_MACHINE_128, LIBSPECTRUM_MACHINE_PLUS2, LIBSPECTRUM_MACHINE_PENT, LIBSPECTRUM_MACHINE_PLUS2A, LIBSPECTRUM_MACHINE_PLUS3, /* Used by libspectrum_tape_guess_hardware if we can't work out what hardware should be used */ LIBSPECTRUM_MACHINE_UNKNOWN, LIBSPECTRUM_MACHINE_16, LIBSPECTRUM_MACHINE_TC2068, LIBSPECTRUM_MACHINE_SCORP, LIBSPECTRUM_MACHINE_PLUS3E, LIBSPECTRUM_MACHINE_SE, LIBSPECTRUM_MACHINE_TS2068, } libspectrum_machine; const char* WIN32_DLL libspectrum_machine_name( libspectrum_machine type ); /* The various capabilities of the different machines */ extern const int WIN32_DLL LIBSPECTRUM_MACHINE_CAPABILITY_AY; /* AY-3-8192 */ extern const int WIN32_DLL LIBSPECTRUM_MACHINE_CAPABILITY_128_MEMORY; /* 128-style memory paging */ extern const int WIN32_DLL LIBSPECTRUM_MACHINE_CAPABILITY_PLUS3_MEMORY; /* +3-style memory paging */ extern const int WIN32_DLL LIBSPECTRUM_MACHINE_CAPABILITY_PLUS3_DISK; /* +3-style disk drive */ extern const int WIN32_DLL LIBSPECTRUM_MACHINE_CAPABILITY_TIMEX_MEMORY; /* Timex-style memory paging */ extern const int WIN32_DLL LIBSPECTRUM_MACHINE_CAPABILITY_TIMEX_VIDEO; /* Timex-style video modes */ extern const int WIN32_DLL LIBSPECTRUM_MACHINE_CAPABILITY_TRDOS_DISK; /* TRDOS-style disk drive */ extern const int WIN32_DLL LIBSPECTRUM_MACHINE_CAPABILITY_TIMEX_DOCK; /* T[SC]2068-style cartridge port */ extern const int WIN32_DLL LIBSPECTRUM_MACHINE_CAPABILITY_SINCLAIR_JOYSTICK; /* Sinclair-style joystick ports */ extern const int WIN32_DLL LIBSPECTRUM_MACHINE_CAPABILITY_KEMPSTON_JOYSTICK; /* Kempston-style joystick ports */ extern const int WIN32_DLL LIBSPECTRUM_MACHINE_CAPABILITY_SCORP_MEMORY; /* Scorpion-style memory paging */ extern const int WIN32_DLL LIBSPECTRUM_MACHINE_CAPABILITY_EVEN_M1; /* M1 cycles always start on even tstate counts */ extern const int WIN32_DLL LIBSPECTRUM_MACHINE_CAPABILITY_SE_MEMORY; /* SE-style memory paging */ extern const int WIN32_DLL LIBSPECTRUM_MACHINE_CAPABILITY_NTSC; /* NTSC display */ /* Get the capabilities of a machine */ int WIN32_DLL libspectrum_machine_capabilities( libspectrum_machine type ); /* Get the timings of a machine */ libspectrum_dword WIN32_DLL libspectrum_timings_processor_speed( libspectrum_machine machine ); libspectrum_dword WIN32_DLL libspectrum_timings_ay_speed( libspectrum_machine machine ); libspectrum_word WIN32_DLL libspectrum_timings_left_border( libspectrum_machine machine ); libspectrum_word WIN32_DLL libspectrum_timings_horizontal_screen( libspectrum_machine machine ); libspectrum_word WIN32_DLL libspectrum_timings_right_border( libspectrum_machine machine ); libspectrum_word WIN32_DLL libspectrum_timings_horizontal_retrace( libspectrum_machine machine ); libspectrum_word WIN32_DLL libspectrum_timings_top_border( libspectrum_machine machine ); libspectrum_word WIN32_DLL libspectrum_timings_vertical_screen( libspectrum_machine machine ); libspectrum_word WIN32_DLL libspectrum_timings_bottom_border( libspectrum_machine machine ); libspectrum_word WIN32_DLL libspectrum_timings_vertical_retrace( libspectrum_machine machine ); libspectrum_word WIN32_DLL libspectrum_timings_interrupt_length( libspectrum_machine machine ); libspectrum_word WIN32_DLL libspectrum_timings_top_left_pixel( libspectrum_machine machine ); libspectrum_word WIN32_DLL libspectrum_timings_tstates_per_line( libspectrum_machine machine ); libspectrum_word WIN32_DLL libspectrum_timings_lines_per_frame( libspectrum_machine machine ); libspectrum_dword WIN32_DLL libspectrum_timings_tstates_per_frame( libspectrum_machine machine ); /* Creator information */ typedef struct libspectrum_creator libspectrum_creator; libspectrum_error WIN32_DLL libspectrum_creator_alloc( libspectrum_creator **creator ); libspectrum_error WIN32_DLL libspectrum_creator_free( libspectrum_creator *creator ); libspectrum_error WIN32_DLL libspectrum_creator_set_program( libspectrum_creator *creator, const char *program ); const char WIN32_DLL * libspectrum_creator_program( libspectrum_creator *creator ); libspectrum_error WIN32_DLL libspectrum_creator_set_major( libspectrum_creator *creator, libspectrum_word major ); libspectrum_word WIN32_DLL libspectrum_creator_major( libspectrum_creator *creator ); libspectrum_error WIN32_DLL libspectrum_creator_set_minor( libspectrum_creator *creator, libspectrum_word minor ); libspectrum_word WIN32_DLL libspectrum_creator_minor( libspectrum_creator *creator ); libspectrum_error WIN32_DLL libspectrum_creator_set_competition_code( libspectrum_creator *creator, libspectrum_dword competition_code ); libspectrum_dword WIN32_DLL libspectrum_creator_competition_code( libspectrum_creator *creator ); libspectrum_error WIN32_DLL libspectrum_creator_set_custom( libspectrum_creator *creator, libspectrum_byte *data, size_t length ); libspectrum_byte WIN32_DLL * libspectrum_creator_custom( libspectrum_creator *creator ); size_t WIN32_DLL libspectrum_creator_custom_length( libspectrum_creator *creator ); /* * Snap handling routines */ typedef struct libspectrum_snap libspectrum_snap; libspectrum_error WIN32_DLL libspectrum_snap_alloc( libspectrum_snap **snap ); libspectrum_error WIN32_DLL libspectrum_snap_free( libspectrum_snap *snap ); /* Read in a snapshot, optionally guessing what type it is */ libspectrum_error WIN32_DLL libspectrum_snap_read( libspectrum_snap *snap, const libspectrum_byte *buffer, size_t length, libspectrum_id_t type, const char *filename ); /* Write a snapshot */ libspectrum_error WIN32_DLL libspectrum_snap_write( libspectrum_byte **buffer, size_t *length, int *out_flags, libspectrum_snap *snap, libspectrum_id_t type, libspectrum_creator *creator, int in_flags ); /* The flags that can be given to libspectrum_snap_write() */ extern const int WIN32_DLL LIBSPECTRUM_FLAG_SNAPSHOT_NO_COMPRESSION; extern const int WIN32_DLL LIBSPECTRUM_FLAG_SNAPSHOT_ALWAYS_COMPRESS; /* The flags that may be returned from libspectrum_snap_write() */ extern const int WIN32_DLL LIBSPECTRUM_FLAG_SNAPSHOT_MINOR_INFO_LOSS; extern const int WIN32_DLL LIBSPECTRUM_FLAG_SNAPSHOT_MAJOR_INFO_LOSS; /* The joystick types we can handle */ typedef enum libspectrum_joystick { LIBSPECTRUM_JOYSTICK_NONE, LIBSPECTRUM_JOYSTICK_CURSOR, LIBSPECTRUM_JOYSTICK_KEMPSTON, LIBSPECTRUM_JOYSTICK_SINCLAIR_1, LIBSPECTRUM_JOYSTICK_SINCLAIR_2, LIBSPECTRUM_JOYSTICK_TIMEX_1, LIBSPECTRUM_JOYSTICK_TIMEX_2, LIBSPECTRUM_JOYSTICK_FULLER, } libspectrum_joystick; const char* WIN32_DLL libspectrum_joystick_name( libspectrum_joystick type ); extern const int WIN32_DLL LIBSPECTRUM_JOYSTICK_INPUT_NONE; extern const int WIN32_DLL LIBSPECTRUM_JOYSTICK_INPUT_KEYBOARD; extern const int WIN32_DLL LIBSPECTRUM_JOYSTICK_INPUT_JOYSTICK_1; extern const int WIN32_DLL LIBSPECTRUM_JOYSTICK_INPUT_JOYSTICK_2; /* Accessor functions */ LIBSPECTRUM_SNAP_ACCESSORS /* DEPRECATED: use libspectrum_snap_read() instead */ DEPRECATED libspectrum_error WIN32_DLL libspectrum_sna_read( libspectrum_snap *snap, const libspectrum_byte *buffer, size_t buffer_length ); /* DEPRECATED: use libspectrum_snap_read() instead */ DEPRECATED libspectrum_error WIN32_DLL libspectrum_z80_read( libspectrum_snap *snap, const libspectrum_byte *buffer, size_t buffer_length ); /* DEPRECATED: use libspectrum_snap_write() instead */ DEPRECATED libspectrum_error WIN32_DLL libspectrum_z80_write( libspectrum_byte **buffer, size_t *length, libspectrum_snap *snap ); /* * Tape handling routines */ /* The various types of block available */ typedef enum libspectrum_tape_type { /* Values must be the same as used in the .tzx format */ LIBSPECTRUM_TAPE_BLOCK_ROM = 0x10, LIBSPECTRUM_TAPE_BLOCK_TURBO, LIBSPECTRUM_TAPE_BLOCK_PURE_TONE, LIBSPECTRUM_TAPE_BLOCK_PULSES, LIBSPECTRUM_TAPE_BLOCK_PURE_DATA, LIBSPECTRUM_TAPE_BLOCK_RAW_DATA, LIBSPECTRUM_TAPE_BLOCK_GENERALISED_DATA = 0x19, LIBSPECTRUM_TAPE_BLOCK_PAUSE = 0x20, LIBSPECTRUM_TAPE_BLOCK_GROUP_START, LIBSPECTRUM_TAPE_BLOCK_GROUP_END, LIBSPECTRUM_TAPE_BLOCK_JUMP, LIBSPECTRUM_TAPE_BLOCK_LOOP_START, LIBSPECTRUM_TAPE_BLOCK_LOOP_END, LIBSPECTRUM_TAPE_BLOCK_SELECT = 0x28, LIBSPECTRUM_TAPE_BLOCK_STOP48 = 0x2a, LIBSPECTRUM_TAPE_BLOCK_COMMENT = 0x30, LIBSPECTRUM_TAPE_BLOCK_MESSAGE, LIBSPECTRUM_TAPE_BLOCK_ARCHIVE_INFO, LIBSPECTRUM_TAPE_BLOCK_HARDWARE, LIBSPECTRUM_TAPE_BLOCK_CUSTOM = 0x35, LIBSPECTRUM_TAPE_BLOCK_CONCAT = 0x5a, /* Past here are block types not in the .tzx format */ LIBSPECTRUM_TAPE_BLOCK_RLE_PULSE = 0x100, } libspectrum_tape_type; typedef struct libspectrum_tape_block libspectrum_tape_block; typedef struct libspectrum_tape_generalised_data_symbol_table libspectrum_tape_generalised_data_symbol_table; /* Something to step through all the blocks in a tape */ typedef struct _GSList *libspectrum_tape_iterator; /* Some flags */ extern const int WIN32_DLL LIBSPECTRUM_TAPE_FLAGS_BLOCK; /* End of block */ extern const int WIN32_DLL LIBSPECTRUM_TAPE_FLAGS_STOP; /* Stop tape */ extern const int WIN32_DLL LIBSPECTRUM_TAPE_FLAGS_STOP48; /* Stop tape if in 48K mode */ extern const int WIN32_DLL LIBSPECTRUM_TAPE_FLAGS_NO_EDGE; /* Edge isn't really an edge */ extern const int WIN32_DLL LIBSPECTRUM_TAPE_FLAGS_LEVEL_LOW; /* Set level low */ extern const int WIN32_DLL LIBSPECTRUM_TAPE_FLAGS_LEVEL_HIGH; /* Set level high */ /* The states which a block can be in */ typedef enum libspectrum_tape_state_type { LIBSPECTRUM_TAPE_STATE_INVALID = 0, LIBSPECTRUM_TAPE_STATE_PILOT, /* Pilot pulses */ LIBSPECTRUM_TAPE_STATE_SYNC1, /* First sync pulse */ LIBSPECTRUM_TAPE_STATE_SYNC2, /* Second sync pulse */ LIBSPECTRUM_TAPE_STATE_DATA1, /* First edge of a data bit */ LIBSPECTRUM_TAPE_STATE_DATA2, /* Second edge of a data bit */ LIBSPECTRUM_TAPE_STATE_PAUSE, /* The pause at the end of a block */ } libspectrum_tape_state_type; /* Routines to manipulate tape blocks */ libspectrum_error WIN32_DLL libspectrum_tape_block_alloc( libspectrum_tape_block **block, libspectrum_tape_type type ); libspectrum_error WIN32_DLL libspectrum_tape_block_free( libspectrum_tape_block *block ); libspectrum_tape_type WIN32_DLL libspectrum_tape_block_type( libspectrum_tape_block *block ); libspectrum_error WIN32_DLL libspectrum_tape_block_set_type( libspectrum_tape_block *block, libspectrum_tape_type type ); libspectrum_error WIN32_DLL libspectrum_tape_block_init( libspectrum_tape_block *block ); libspectrum_error WIN32_DLL libspectrum_tape_block_description( char *buffer, size_t length, libspectrum_tape_block *block ); int WIN32_DLL libspectrum_tape_block_metadata( libspectrum_tape_block *block ); /* Accessor functions */ LIBSPECTRUM_TAPE_ACCESSORS /* A linked list of tape blocks */ typedef struct libspectrum_tape libspectrum_tape; libspectrum_error WIN32_DLL libspectrum_tape_alloc( libspectrum_tape **tape ); libspectrum_error WIN32_DLL libspectrum_tape_clear( libspectrum_tape *tape ); libspectrum_error WIN32_DLL libspectrum_tape_free( libspectrum_tape *tape ); /* Read in a tape file, optionally guessing what sort of file it is */ libspectrum_error WIN32_DLL libspectrum_tape_read( libspectrum_tape *tape, const libspectrum_byte *buffer, size_t length, libspectrum_id_t type, const char *filename ); /* Write a tape file */ libspectrum_error WIN32_DLL libspectrum_tape_write( libspectrum_byte **buffer, size_t *length, libspectrum_tape *tape, libspectrum_id_t type ); /* Does this tape structure actually contain a tape? */ int WIN32_DLL libspectrum_tape_present( const libspectrum_tape *tape ); libspectrum_error WIN32_DLL libspectrum_tape_get_next_edge( libspectrum_dword *tstates, int *flags, libspectrum_tape *tape ); /* Get the current block from the tape */ libspectrum_tape_block WIN32_DLL * libspectrum_tape_current_block( libspectrum_tape *tape ); /* Peek at the next block on the tape */ libspectrum_tape_block WIN32_DLL * libspectrum_tape_peek_next_block( libspectrum_tape *tape ); /* Cause the next block on the tape to be active, initialise it and return it */ libspectrum_tape_block WIN32_DLL * libspectrum_tape_select_next_block( libspectrum_tape *tape ); /* Get the position on the tape of the current block */ libspectrum_error WIN32_DLL libspectrum_tape_position( int *n, libspectrum_tape *tape ); /* Select the nth block on the tape */ libspectrum_error WIN32_DLL libspectrum_tape_nth_block( libspectrum_tape *tape, int n ); /* Append a block to the current tape */ libspectrum_error WIN32_DLL libspectrum_tape_append_block( libspectrum_tape *tape, libspectrum_tape_block *block ); libspectrum_error libspectrum_tape_remove_block( libspectrum_tape *tape, libspectrum_tape_iterator it ); libspectrum_error libspectrum_tape_insert_block( libspectrum_tape *tape, libspectrum_tape_block *block, size_t position ); /*** Routines for .tap format files ***/ libspectrum_error WIN32_DLL libspectrum_tap_read( libspectrum_tape *tape, const libspectrum_byte *buffer, const size_t length ); libspectrum_error WIN32_DLL libspectrum_tap_write( libspectrum_byte **buffer, size_t *length, libspectrum_tape *tape ); /*** Routines for .tzx format files ***/ libspectrum_error WIN32_DLL libspectrum_tzx_read( libspectrum_tape *tape, const libspectrum_byte *buffer, const size_t length ); libspectrum_error WIN32_DLL libspectrum_tzx_write( libspectrum_byte **buffer, size_t *length, libspectrum_tape *tape ); /*** Routines for Warajevo .tap format files ***/ libspectrum_error WIN32_DLL libspectrum_warajevo_read( libspectrum_tape *tape, const libspectrum_byte *buffer, size_t length ); /*** Routines for iterating through a tape ***/ libspectrum_tape_block WIN32_DLL * libspectrum_tape_iterator_init( libspectrum_tape_iterator *iterator, libspectrum_tape *tape ); libspectrum_tape_block WIN32_DLL * libspectrum_tape_iterator_next( libspectrum_tape_iterator *iterator ); /*** Routines for handling the TZX generalised data block symbol table structure ***/ typedef enum libspectrum_tape_generalised_data_symbol_edge_type { LIBSPECTRUM_TAPE_GENERALISED_DATA_SYMBOL_EDGE = 0x00, LIBSPECTRUM_TAPE_GENERALISED_DATA_SYMBOL_NO_EDGE, LIBSPECTRUM_TAPE_GENERALISED_DATA_SYMBOL_LOW, LIBSPECTRUM_TAPE_GENERALISED_DATA_SYMBOL_HIGH, } libspectrum_tape_generalised_data_symbol_edge_type; typedef struct libspectrum_tape_generalised_data_symbol libspectrum_tape_generalised_data_symbol; libspectrum_dword WIN32_DLL libspectrum_tape_generalised_data_symbol_table_symbols_in_block( const libspectrum_tape_generalised_data_symbol_table *table ); libspectrum_byte WIN32_DLL libspectrum_tape_generalised_data_symbol_table_max_pulses( const libspectrum_tape_generalised_data_symbol_table *table ); libspectrum_word WIN32_DLL libspectrum_tape_generalised_data_symbol_table_symbols_in_table( const libspectrum_tape_generalised_data_symbol_table *table ); libspectrum_tape_generalised_data_symbol* WIN32_DLL libspectrum_tape_generalised_data_symbol_table_symbol( const libspectrum_tape_generalised_data_symbol_table *table, size_t which ); libspectrum_tape_generalised_data_symbol_edge_type WIN32_DLL libspectrum_tape_generalised_data_symbol_type( const libspectrum_tape_generalised_data_symbol *symbol ); libspectrum_word WIN32_DLL libspectrum_tape_generalised_data_symbol_pulse( const libspectrum_tape_generalised_data_symbol *symbol, size_t which ); /* * Input recording routines */ typedef struct libspectrum_rzx libspectrum_rzx; libspectrum_error WIN32_DLL libspectrum_rzx_alloc( libspectrum_rzx **rzx ); libspectrum_error WIN32_DLL libspectrum_rzx_free( libspectrum_rzx *rzx ); libspectrum_error WIN32_DLL libspectrum_rzx_start_input( libspectrum_rzx *rzx, libspectrum_dword tstates ); libspectrum_error WIN32_DLL libspectrum_rzx_stop_input( libspectrum_rzx *rzx ); libspectrum_error WIN32_DLL libspectrum_rzx_add_snap( libspectrum_rzx *rzx, libspectrum_snap *snap ); libspectrum_error WIN32_DLL libspectrum_rzx_rollback( libspectrum_rzx *rzx, libspectrum_snap **snap ); libspectrum_error WIN32_DLL libspectrum_rzx_rollback_to( libspectrum_rzx *rzx, libspectrum_snap **snap, size_t which ); libspectrum_error WIN32_DLL libspectrum_rzx_store_frame( libspectrum_rzx *rzx, size_t instructions, size_t count, libspectrum_byte *in_bytes ); libspectrum_error WIN32_DLL libspectrum_rzx_start_playback( libspectrum_rzx *rzx, int which, libspectrum_snap **snap ); libspectrum_error WIN32_DLL libspectrum_rzx_playback_frame( libspectrum_rzx *rzx, int *finished, libspectrum_snap **snap ); libspectrum_error WIN32_DLL libspectrum_rzx_playback( libspectrum_rzx *rzx, libspectrum_byte *byte ); /* Get and set the tstate counter */ size_t WIN32_DLL libspectrum_rzx_tstates( libspectrum_rzx *rzx ); /* Get the current frame's instruction count */ size_t WIN32_DLL libspectrum_rzx_instructions( libspectrum_rzx *rzx ); libspectrum_dword WIN32_DLL libspectrum_rzx_get_keyid( libspectrum_rzx *rzx ); typedef struct libspectrum_signature { /* Where in the buffer is the signed data? */ const libspectrum_byte *start; ptrdiff_t length; LIBSPECTRUM_SIGNATURE_PARAMETERS } libspectrum_signature; libspectrum_error WIN32_DLL libspectrum_rzx_get_signature( libspectrum_rzx *rzx, libspectrum_signature *signature ); typedef struct libspectrum_rzx_dsa_key { /* The standard DSA parameters, represented as hex strings with MSB first. Set x = NULL for a public key */ const char *p, *q, *g, *y, *x; } libspectrum_rzx_dsa_key; libspectrum_error WIN32_DLL libspectrum_rzx_read( libspectrum_rzx *rzx, const libspectrum_byte *buffer, size_t length ); libspectrum_error WIN32_DLL libspectrum_rzx_write( libspectrum_byte **buffer, size_t *length, libspectrum_rzx *rzx, libspectrum_id_t snap_format, libspectrum_creator *creator, int compress, libspectrum_rzx_dsa_key *key ); libspectrum_error WIN32_DLL libspectrum_rzx_alloc( libspectrum_rzx **rzx ); /* Something to step through all the blocks in an input recording */ typedef struct _GSList *libspectrum_rzx_iterator; /* The block types which can appear in RZX files */ typedef enum libspectrum_rzx_block_id { LIBSPECTRUM_RZX_CREATOR_BLOCK = 0x10, LIBSPECTRUM_RZX_SIGN_START_BLOCK = 0x20, LIBSPECTRUM_RZX_SIGN_END_BLOCK = 0x21, LIBSPECTRUM_RZX_SNAPSHOT_BLOCK = 0x30, LIBSPECTRUM_RZX_INPUT_BLOCK = 0x80, } libspectrum_rzx_block_id; libspectrum_rzx_iterator WIN32_DLL libspectrum_rzx_iterator_begin( libspectrum_rzx *rzx ); libspectrum_rzx_iterator WIN32_DLL libspectrum_rzx_iterator_next( libspectrum_rzx_iterator it ); libspectrum_rzx_block_id WIN32_DLL libspectrum_rzx_iterator_get_type( libspectrum_rzx_iterator it ); size_t WIN32_DLL libspectrum_rzx_iterator_get_frames( libspectrum_rzx_iterator it ); /* * Microdrive image handling routines */ typedef struct libspectrum_microdrive libspectrum_microdrive; #define LIBSPECTRUM_MICRODRIVE_BLOCK_MAX 254 #define LIBSPECTRUM_MICRODRIVE_HEAD_LEN 15 #define LIBSPECTRUM_MICRODRIVE_DATA_LEN 512 #define LIBSPECTRUM_MICRODRIVE_BLOCK_LEN ( LIBSPECTRUM_MICRODRIVE_HEAD_LEN + \ LIBSPECTRUM_MICRODRIVE_HEAD_LEN + \ LIBSPECTRUM_MICRODRIVE_DATA_LEN + 1 ) #define LIBSPECTRUM_MICRODRIVE_CARTRIDGE_LENGTH \ ( LIBSPECTRUM_MICRODRIVE_BLOCK_MAX * LIBSPECTRUM_MICRODRIVE_BLOCK_LEN ) /* Constructor/destructor */ libspectrum_error WIN32_DLL libspectrum_microdrive_alloc( libspectrum_microdrive **microdrive ); libspectrum_error WIN32_DLL libspectrum_microdrive_free( libspectrum_microdrive *microdrive ); /* Accessors */ libspectrum_byte WIN32_DLL libspectrum_microdrive_data( const libspectrum_microdrive *microdrive, size_t which ); void WIN32_DLL libspectrum_microdrive_set_data( libspectrum_microdrive *microdrive, size_t which, libspectrum_byte data ); int WIN32_DLL libspectrum_microdrive_write_protect( const libspectrum_microdrive *microdrive ); void WIN32_DLL libspectrum_microdrive_set_write_protect( libspectrum_microdrive *microdrive, int write_protect ); libspectrum_byte WIN32_DLL libspectrum_microdrive_cartridge_len( const libspectrum_microdrive *microdrive ); void WIN32_DLL libspectrum_microdrive_set_cartridge_len( libspectrum_microdrive *microdrive, libspectrum_byte len ); /* .mdr format routines */ int WIN32_DLL libspectrum_microdrive_checksum( libspectrum_microdrive *microdrive, libspectrum_byte what ); libspectrum_error WIN32_DLL libspectrum_microdrive_mdr_read( libspectrum_microdrive *microdrive, libspectrum_byte *buffer, size_t length ); libspectrum_error WIN32_DLL libspectrum_microdrive_mdr_write( const libspectrum_microdrive *microdrive, libspectrum_byte **buffer, size_t *length ); /* * Timex DOCK/EXROM handling routines */ /* The types of memory which this bank will page into */ typedef enum libspectrum_dck_bank { LIBSPECTRUM_DCK_BANK_DOCK = 0, LIBSPECTRUM_DCK_BANK_EXROM = 254, LIBSPECTRUM_DCK_BANK_HOME = 255 } libspectrum_dck_bank; /* The type of one 8Kb page */ typedef enum libspectrum_dck_page_type { LIBSPECTRUM_DCK_PAGE_NULL = 0, LIBSPECTRUM_DCK_PAGE_RAM_EMPTY, LIBSPECTRUM_DCK_PAGE_ROM, LIBSPECTRUM_DCK_PAGE_RAM } libspectrum_dck_page_type; /* One set of 8 x 8Kb pages */ typedef struct libspectrum_dck_block { libspectrum_dck_bank bank; libspectrum_dck_page_type access[8]; libspectrum_byte *pages[8]; } libspectrum_dck_block; /* A number of 8 x 8Kb page sets */ /* FIXME: Remove the arbitrary limit on the number of banks */ typedef struct libspectrum_dck { libspectrum_dck_block *dck[256]; /* dck block data */ } libspectrum_dck; libspectrum_error WIN32_DLL libspectrum_dck_alloc( libspectrum_dck **dck ); libspectrum_error WIN32_DLL libspectrum_dck_free( libspectrum_dck *dck, int keep_pages ); /* Read in a DCK file */ libspectrum_error WIN32_DLL libspectrum_dck_read( libspectrum_dck *dck, const libspectrum_byte *buffer, size_t length ); libspectrum_error WIN32_DLL libspectrum_dck_read2( libspectrum_dck *dck, const libspectrum_byte *buffer, size_t length, const char *filename ); /* * Crypto functions */ libspectrum_error WIN32_DLL libspectrum_verify_signature( libspectrum_signature *signature, libspectrum_rzx_dsa_key *key ); libspectrum_error WIN32_DLL libspectrum_signature_free( libspectrum_signature *signature ); /* * IDE hard disk handling routines */ typedef enum libspectrum_ide_databus { LIBSPECTRUM_IDE_DATA8, LIBSPECTRUM_IDE_DATA16, LIBSPECTRUM_IDE_DATA16_BYTESWAP, LIBSPECTRUM_IDE_DATA16_DATA2, } libspectrum_ide_databus; typedef enum libspectrum_ide_unit { LIBSPECTRUM_IDE_MASTER = 0, LIBSPECTRUM_IDE_SLAVE = 1, } libspectrum_ide_unit; typedef enum libspectrum_ide_register { LIBSPECTRUM_IDE_REGISTER_DATA = 0, LIBSPECTRUM_IDE_REGISTER_ERROR_FEATURE = 1, LIBSPECTRUM_IDE_REGISTER_SECTOR_COUNT = 2, LIBSPECTRUM_IDE_REGISTER_SECTOR = 3, LIBSPECTRUM_IDE_REGISTER_CYLINDER_LOW = 4, LIBSPECTRUM_IDE_REGISTER_CYLINDER_HIGH = 5, LIBSPECTRUM_IDE_REGISTER_HEAD_DRIVE = 6, LIBSPECTRUM_IDE_REGISTER_COMMAND_STATUS = 7, LIBSPECTRUM_IDE_REGISTER_DATA2 = 8, } libspectrum_ide_register; typedef struct libspectrum_ide_channel libspectrum_ide_channel; libspectrum_error WIN32_DLL libspectrum_ide_alloc( libspectrum_ide_channel **chn, libspectrum_ide_databus databus ); libspectrum_error WIN32_DLL libspectrum_ide_free( libspectrum_ide_channel *chn ); libspectrum_error WIN32_DLL libspectrum_ide_insert( libspectrum_ide_channel *chn, libspectrum_ide_unit unit, const char *filename ); libspectrum_error WIN32_DLL libspectrum_ide_commit( libspectrum_ide_channel *chn, libspectrum_ide_unit unit ); int WIN32_DLL libspectrum_ide_dirty( libspectrum_ide_channel *chn, libspectrum_ide_unit unit ); libspectrum_error WIN32_DLL libspectrum_ide_eject( libspectrum_ide_channel *chn, libspectrum_ide_unit unit ); libspectrum_error WIN32_DLL libspectrum_ide_reset( libspectrum_ide_channel *chn ); libspectrum_byte WIN32_DLL libspectrum_ide_read( libspectrum_ide_channel *chn, libspectrum_ide_register reg ); void WIN32_DLL libspectrum_ide_write( libspectrum_ide_channel *chn, libspectrum_ide_register reg, libspectrum_byte data ); #ifdef __cplusplus }; #endif /* #ifdef __cplusplus */ #endif /* #ifndef LIBSPECTRUM_LIBSPECTRUM_H */