1 /* libspectrum.h: the library for dealing with ZX Spectrum emulator files
2    Copyright (c) 2001-2007 Philip Kendall, Darren Salt, Fredrick Meunier
3 
4    $Id: libspectrum.h.in 4836 2012-12-31 15:40:10Z zubzero $
5 
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2 of the License, or
9    (at your option) any later version.
10 
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15 
16    You should have received a copy of the GNU General Public License along
17    with this program; if not, write to the Free Software Foundation, Inc.,
18    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 
20    Author contact information:
21 
22    E-mail: philip-fuse@shadowmagic.org.uk
23 
24 */
25 
26 /* NB: This file is autogenerated from libspectrum.h.in. Do not edit
27    unless you know what you're doing */
28 
29 #ifndef LIBSPECTRUM_LIBSPECTRUM_H
30 #define LIBSPECTRUM_LIBSPECTRUM_H
31 
32 #ifdef __cplusplus
33 extern "C" {
34 #endif				/* #ifdef __cplusplus */
35 
36 #include <stdarg.h>
37 #include <stddef.h>
38 #include <stdlib.h>
39 #include <stdio.h>
40 
41 #ifdef _WIN32
42 
43 /* Exclude rarely used stuff from Windows headers */
44 #ifndef WIN32_LEAN_AND_MEAN
45 
46 #define WIN32_LEAN_AND_MEAN /**/
47 #include <windows.h>
48 #undef WIN32_LEAN_AND_MEAN
49 
50 #else
51 
52 #include <windows.h>
53 
54 #endif				/* #ifndef WIN32_LEAN_AND_MEAN */
55 
56 #ifdef LIBSPECTRUM_EXPORTS
57 #define WIN32_DLL __declspec( dllexport )
58 #else				/* #ifdef LIBSPECTRUM_EXPORTS */
59 #define WIN32_DLL __declspec( dllimport )
60 #endif				/* #ifdef LIBSPECTRUM_EXPORTS */
61 
62 #else				/* #ifdef _WIN32 */
63 
64 #define WIN32_DLL
65 
66 #endif				/* #ifdef _WIN32 */
67 
68 #undef WIN32_DLL
69 #define WIN32_DLL
70 
71 #ifdef __GNUC__
72 #define DEPRECATED __attribute__((deprecated))
73 #else                           /* #ifdef __GNUC__ */
74 #define DEPRECATED
75 #endif                          /* #ifdef __GNUC__ */
76 
77 
78 /* Standard typedefs */
79 #include <stdint.h>
80 
81 typedef  uint8_t libspectrum_byte;
82 typedef   int8_t libspectrum_signed_byte;
83 typedef uint16_t libspectrum_word;
84 typedef  int16_t libspectrum_signed_word;
85 typedef uint32_t libspectrum_dword;
86 typedef  int32_t libspectrum_signed_dword;
87 typedef uint64_t libspectrum_qword;
88 typedef  int64_t libspectrum_signed_qword;
89 
90 /* glib replacement (if necessary) */
91 #ifndef	FALSE
92 #define	FALSE	(0)
93 #endif
94 
95 #ifndef	TRUE
96 #define	TRUE	(!FALSE)
97 #endif
98 
99 typedef char gchar;
100 typedef int gint;
101 typedef long glong;
102 typedef gint gboolean;
103 typedef unsigned int guint;
104 typedef unsigned long gulong;
105 typedef const void * gconstpointer;
106 typedef void * gpointer;
107 
108 typedef struct _GSList GSList;
109 
110 struct _GSList {
111     gpointer data;
112     GSList *next;
113 };
114 
115 typedef void		(*GFunc)		(gpointer	data,
116 						 gpointer	user_data);
117 
118 typedef gint		(*GCompareFunc)		(gconstpointer	a,
119 						 gconstpointer	b);
120 
121 typedef void           (*GDestroyNotify)       (gpointer       data);
122 
123 typedef void           (*GFreeFunc)            (gpointer       data);
124 
125 
126 WIN32_DLL GSList *g_slist_insert_sorted	(GSList		*list,
127 						 gpointer	 data,
128 						 GCompareFunc	 func);
129 
130 WIN32_DLL GSList *g_slist_insert		(GSList		*list,
131 			 			 gpointer	 data,
132 			 			 gint		 position);
133 
134 WIN32_DLL GSList *g_slist_append		(GSList		*list,
135 						 gpointer	 data);
136 
137 WIN32_DLL GSList *g_slist_prepend		(GSList		*list,
138 						 gpointer	 data);
139 
140 WIN32_DLL GSList *g_slist_remove		(GSList		*list,
141 						 gconstpointer	 data);
142 
143 WIN32_DLL GSList *g_slist_last			(GSList		*list);
144 
145 WIN32_DLL GSList *g_slist_reverse		(GSList		*list);
146 
147 WIN32_DLL GSList *g_slist_delete_link		(GSList		*list,
148 				 		 GSList		*link);
149 
150 WIN32_DLL guint	g_slist_length		(GSList *list);
151 
152 WIN32_DLL void	g_slist_foreach			(GSList		*list,
153 						 GFunc		 func,
154 						 gpointer	 user_data);
155 
156 WIN32_DLL void	g_slist_free			(GSList		*list);
157 
158 WIN32_DLL GSList *g_slist_nth		(GSList		*list,
159 					 guint		n);
160 
161 WIN32_DLL GSList *g_slist_find_custom	(GSList		*list,
162 					 gconstpointer	data,
163 					 GCompareFunc	func );
164 
165 WIN32_DLL gint	g_slist_position	(GSList		*list,
166 					 GSList		*llink);
167 
168 typedef struct _GHashTable	GHashTable;
169 
170 typedef guint		(*GHashFunc)		(gconstpointer	key);
171 
172 typedef void	(*GHFunc)		(gpointer	key,
173 						 gpointer	value,
174 						 gpointer	user_data);
175 
176 typedef gboolean	(*GHRFunc)		(gpointer	key,
177 						 gpointer	value,
178 						 gpointer	user_data);
179 
180 WIN32_DLL gint	g_int_equal (gconstpointer   v,
181 			       gconstpointer   v2);
182 WIN32_DLL guint	g_int_hash  (gconstpointer   v);
183 
184 WIN32_DLL gint	g_str_equal (gconstpointer   v,
185 			       gconstpointer   v2);
186 WIN32_DLL guint	g_str_hash  (gconstpointer   v);
187 
188 WIN32_DLL GHashTable *g_hash_table_new	(GHashFunc	 hash_func,
189 					 GCompareFunc	 key_compare_func);
190 
191 WIN32_DLL GHashTable *g_hash_table_new_full (GHashFunc       hash_func,
192                                              GCompareFunc    key_equal_func,
193                                              GDestroyNotify  key_destroy_func,
194                                              GDestroyNotify  value_destroy_func);
195 
196 WIN32_DLL void	g_hash_table_destroy	(GHashTable	*hash_table);
197 
198 WIN32_DLL void	g_hash_table_insert	(GHashTable	*hash_table,
199 					 gpointer	 key,
200 					 gpointer	 value);
201 
202 WIN32_DLL gpointer g_hash_table_lookup	(GHashTable	*hash_table,
203 					 gconstpointer	 key);
204 
205 WIN32_DLL void	g_hash_table_foreach (GHashTable	*hash_table,
206 						 GHFunc    func,
207 						 gpointer  user_data);
208 
209 WIN32_DLL guint	g_hash_table_foreach_remove	(GHashTable	*hash_table,
210 						 GHRFunc	 func,
211 						 gpointer	 user_data);
212 
213 WIN32_DLL guint	g_hash_table_size (GHashTable	*hash_table);
214 
215 typedef struct _GArray GArray;
216 
217 struct _GArray {
218   /* Public */
219   gchar *data;
220   size_t len;
221 
222   /* Private */
223   guint element_size;
224   size_t allocated;
225 };
226 
227 WIN32_DLL GArray* g_array_new( gboolean zero_terminated, gboolean clear,
228 		      guint element_size );
229 #define g_array_append_val(a,v) g_array_append_vals( a, &(v), 1 );
230 WIN32_DLL GArray* g_array_append_vals( GArray *array, gconstpointer data, guint len );
231 #define g_array_index(a,t,i) (*(((t*)a->data)+i))
232 WIN32_DLL GArray* g_array_set_size( GArray *array, guint length );
233 WIN32_DLL gchar* g_array_free( GArray *array, gboolean free_segment );
234 
235 #define GINT_TO_POINTER(i)      ((gpointer)  (glong)(i))
236 #define GPOINTER_TO_INT(p)      ((gint)   (glong)(p))
237 #define GPOINTER_TO_UINT(p)     ((guint)  (gulong)(p))
238 
239 /*
240  * General libspectrum routines
241  */
242 
243 /* Error handling */
244 
245 /* The various errors which can occur */
246 typedef enum libspectrum_error {
247 
248   LIBSPECTRUM_ERROR_NONE = 0,
249 
250   LIBSPECTRUM_ERROR_WARNING,
251 
252   LIBSPECTRUM_ERROR_MEMORY,
253   LIBSPECTRUM_ERROR_UNKNOWN,
254   LIBSPECTRUM_ERROR_CORRUPT,
255   LIBSPECTRUM_ERROR_SIGNATURE,
256   LIBSPECTRUM_ERROR_SLT,	/* .slt data found at end of a .z80 file */
257   LIBSPECTRUM_ERROR_INVALID,	/* Invalid parameter supplied */
258 
259   LIBSPECTRUM_ERROR_LOGIC = -1,
260 
261 } libspectrum_error;
262 
263 /* Library capabilities */
264 
265 /* Initialisation */
266 
267 WIN32_DLL libspectrum_error libspectrum_init( void );
268 WIN32_DLL void libspectrum_end( void );
269 
270 /* Version checking */
271 
272 WIN32_DLL int libspectrum_check_version( const char *version );
273 WIN32_DLL const char *libspectrum_version( void );
274 WIN32_DLL const char *libspectrum_gcrypt_version( void );
275 
276 /* Error handling */
277 typedef libspectrum_error
278 (*libspectrum_error_function_t)( libspectrum_error error,
279 				 const char *format, va_list ap );
280 
281 extern WIN32_DLL libspectrum_error_function_t libspectrum_error_function;
282 
283 WIN32_DLL libspectrum_error
284 libspectrum_default_error_function( libspectrum_error error,
285 				    const char *format, va_list ap );
286 
287 /* Memory allocators */
288 
289 typedef void* (*libspectrum_malloc_fn_t)( size_t size );
290 typedef void* (*libspectrum_calloc_fn_t)( size_t nmemb, size_t size );
291 typedef void* (*libspectrum_realloc_fn_t)( void *ptr, size_t size );
292 typedef void (*libspectrum_free_fn_t)( void *ptr );
293 
294 typedef struct libspectrum_mem_vtable_t {
295   libspectrum_malloc_fn_t malloc;
296   libspectrum_calloc_fn_t calloc;
297   libspectrum_realloc_fn_t realloc;
298   libspectrum_free_fn_t free;
299 } libspectrum_mem_vtable_t;
300 
301 WIN32_DLL void* libspectrum_malloc( size_t size );
302 WIN32_DLL void* libspectrum_calloc( size_t nmemb, size_t size );
303 WIN32_DLL void* libspectrum_realloc( void *ptr, size_t size );
304 WIN32_DLL void libspectrum_free( void *ptr );
305 
306 WIN32_DLL void libspectrum_mem_set_vtable( libspectrum_mem_vtable_t *table );
307 
308 /* Attempt to identify a given file */
309 
310 /* Various types of file we might manage to identify */
311 typedef enum libspectrum_id_t {
312 
313   /* These types present in all versions of libspectrum */
314 
315   LIBSPECTRUM_ID_UNKNOWN = 0,		/* Unidentified file */
316   LIBSPECTRUM_ID_RECORDING_RZX,		/* RZX input recording */
317   LIBSPECTRUM_ID_SNAPSHOT_SNA,		/* .sna snapshot */
318   LIBSPECTRUM_ID_SNAPSHOT_Z80,		/* .z80 snapshot */
319   LIBSPECTRUM_ID_TAPE_TAP,		/* Z80-style .tap tape image */
320   LIBSPECTRUM_ID_TAPE_TZX,		/* TZX tape image */
321 
322   /* Below here, present only in 0.1.1 and later */
323 
324   /* The next entry is deprecated in favour of the more specific
325      LIBSPECTRUM_ID_DISK_CPC and LIBSPECTRUM_ID_DISK_ECPC */
326   LIBSPECTRUM_ID_DISK_DSK,		/* .dsk +3 disk image */
327 
328   LIBSPECTRUM_ID_DISK_SCL,		/* .scl TR-DOS disk image */
329   LIBSPECTRUM_ID_DISK_TRD,		/* .trd TR-DOS disk image */
330   LIBSPECTRUM_ID_CARTRIDGE_DCK,		/* .dck Timex cartridge image */
331 
332   /* Below here, present only in 0.2.0 and later */
333 
334   LIBSPECTRUM_ID_TAPE_WARAJEVO,		/* Warajevo-style .tap tape image */
335 
336   LIBSPECTRUM_ID_SNAPSHOT_PLUSD,	/* DISCiPLE/+D snapshot */
337   LIBSPECTRUM_ID_SNAPSHOT_SP,		/* .sp snapshot */
338   LIBSPECTRUM_ID_SNAPSHOT_SNP,		/* .snp snapshot */
339   LIBSPECTRUM_ID_SNAPSHOT_ZXS,		/* .zxs snapshot (zx32) */
340   LIBSPECTRUM_ID_SNAPSHOT_SZX,		/* .szx snapshot (Spectaculator) */
341 
342   /* Below here, present only in 0.2.1 and later */
343 
344   LIBSPECTRUM_ID_COMPRESSED_BZ2,	/* bzip2 compressed file */
345   LIBSPECTRUM_ID_COMPRESSED_GZ,		/* gzip compressed file */
346 
347   /* Below here, present only in 0.2.2 and later */
348 
349   LIBSPECTRUM_ID_HARDDISK_HDF,		/* .hdf hard disk image */
350   LIBSPECTRUM_ID_CARTRIDGE_IF2,		/* .rom Interface 2 cartridge image */
351 
352   /* Below here, present only in 0.3.0 and later */
353 
354   LIBSPECTRUM_ID_MICRODRIVE_MDR,	/* .mdr microdrive cartridge */
355   LIBSPECTRUM_ID_TAPE_CSW,		/* .csw tape image */
356   LIBSPECTRUM_ID_TAPE_Z80EM,		/* Z80Em tape image */
357 
358   /* Below here, present only in 0.4.0 and later */
359 
360   LIBSPECTRUM_ID_TAPE_WAV,		/* .wav tape image */
361   LIBSPECTRUM_ID_TAPE_SPC,		/* SP-style .spc tape image */
362   LIBSPECTRUM_ID_TAPE_STA,		/* Speculator-style .sta tape image */
363   LIBSPECTRUM_ID_TAPE_LTP,		/* Nuclear ZX-style .ltp tape image */
364   LIBSPECTRUM_ID_COMPRESSED_XFD,	/* xfdmaster (Amiga) compressed file */
365   LIBSPECTRUM_ID_DISK_IMG,		/* .img DISCiPLE/+D disk image */
366   LIBSPECTRUM_ID_DISK_MGT,		/* .mgt DISCiPLE/+D disk image */
367 
368   /* Below here, present only in 0.5.0 and later */
369 
370   LIBSPECTRUM_ID_DISK_UDI,		/* .udi generic disk image */
371   LIBSPECTRUM_ID_DISK_FDI,		/* .fdi generic disk image */
372   LIBSPECTRUM_ID_DISK_CPC,		/* .dsk plain CPC +3 disk image */
373   LIBSPECTRUM_ID_DISK_ECPC,		/* .dsk extended CPC +3 disk image */
374   LIBSPECTRUM_ID_DISK_SAD,		/* .sad generic disk image */
375   LIBSPECTRUM_ID_DISK_TD0,		/* .td0 generic disk image */
376 
377   LIBSPECTRUM_ID_DISK_OPD,		/* .opu/.opd Opus Discovery disk image */
378 
379   LIBSPECTRUM_ID_TAPE_PZX,		/* PZX tape image */
380 
381   LIBSPECTRUM_ID_AUX_POK,		/* POKE file */
382 
383 } libspectrum_id_t;
384 
385 /* And 'classes' of file */
386 typedef enum libspectrum_class_t {
387 
388   LIBSPECTRUM_CLASS_UNKNOWN,
389 
390   LIBSPECTRUM_CLASS_CARTRIDGE_TIMEX,	/* Timex cartridges */
391   LIBSPECTRUM_CLASS_DISK_PLUS3,		/* +3 disk */
392   LIBSPECTRUM_CLASS_DISK_TRDOS,		/* TR-DOS disk */
393   LIBSPECTRUM_CLASS_DISK_OPUS,		/* Opus Discovery disk*/
394   LIBSPECTRUM_CLASS_RECORDING,		/* Input recording */
395   LIBSPECTRUM_CLASS_SNAPSHOT,		/* Snapshot */
396   LIBSPECTRUM_CLASS_TAPE,		/* Tape */
397 
398   /* Below here, present only in 0.2.1 and later */
399 
400   LIBSPECTRUM_CLASS_COMPRESSED,		/* A compressed file */
401 
402   /* Below here, present only in 0.2.2 and later */
403 
404   LIBSPECTRUM_CLASS_HARDDISK,		/* A hard disk image */
405   LIBSPECTRUM_CLASS_CARTRIDGE_IF2,	/* Interface 2 cartridges */
406 
407   /* Below here, present only in 0.3.0 and later */
408 
409   LIBSPECTRUM_CLASS_MICRODRIVE,		/* Microdrive cartridges */
410 
411   /* Below here, present only in 0.4.0 and later */
412 
413   LIBSPECTRUM_CLASS_DISK_PLUSD,		/* DISCiPLE/+D disk image */
414 
415   /* Below here, present only in 0.5.0 and later */
416 
417   LIBSPECTRUM_CLASS_DISK_GENERIC,	/* generic disk image */
418 
419   LIBSPECTRUM_CLASS_AUXILIARY,	        /* auxiliary supported file */
420 
421 } libspectrum_class_t;
422 
423 WIN32_DLL libspectrum_error
424 libspectrum_identify_file( libspectrum_id_t *type, const char *filename,
425                            const unsigned char *buffer, size_t length );
426 
427 WIN32_DLL libspectrum_error
428 libspectrum_identify_file_with_class(
429   libspectrum_id_t *type, libspectrum_class_t *libspectrum_class,
430   const char *filename, const unsigned char *buffer, size_t length );
431 
432 WIN32_DLL libspectrum_error
433 libspectrum_identify_file_raw( libspectrum_id_t *type, const char *filename,
434 			       const unsigned char *buffer, size_t length );
435 
436 WIN32_DLL libspectrum_error
437 libspectrum_identify_class( libspectrum_class_t *libspectrum_class,
438                             libspectrum_id_t type );
439 
440 /* Different Spectrum variants and their capabilities */
441 
442 /* The machine types we can handle */
443 typedef enum libspectrum_machine {
444 
445   LIBSPECTRUM_MACHINE_48,
446   LIBSPECTRUM_MACHINE_TC2048,
447   LIBSPECTRUM_MACHINE_128,
448   LIBSPECTRUM_MACHINE_PLUS2,
449   LIBSPECTRUM_MACHINE_PENT,
450   LIBSPECTRUM_MACHINE_PLUS2A,
451   LIBSPECTRUM_MACHINE_PLUS3,
452 
453   /* Used by libspectrum_tape_guess_hardware if we can't work out what
454      hardware should be used */
455   LIBSPECTRUM_MACHINE_UNKNOWN,
456 
457   LIBSPECTRUM_MACHINE_16,
458   LIBSPECTRUM_MACHINE_TC2068,
459 
460   LIBSPECTRUM_MACHINE_SCORP,
461   LIBSPECTRUM_MACHINE_PLUS3E,
462   LIBSPECTRUM_MACHINE_SE,
463 
464   LIBSPECTRUM_MACHINE_TS2068,
465 
466   LIBSPECTRUM_MACHINE_PENT512,
467   LIBSPECTRUM_MACHINE_PENT1024,
468 
469   LIBSPECTRUM_MACHINE_48_NTSC,
470 
471   LIBSPECTRUM_MACHINE_128E,
472 
473 } libspectrum_machine;
474 
475 WIN32_DLL const char* libspectrum_machine_name( libspectrum_machine type );
476 
477 /* The various capabilities of the different machines */
478 extern WIN32_DLL const int
479 LIBSPECTRUM_MACHINE_CAPABILITY_AY;                              /* AY-3-8192 */
480 extern WIN32_DLL const int
481 LIBSPECTRUM_MACHINE_CAPABILITY_128_MEMORY;        /* 128-style memory paging */
482 extern WIN32_DLL const int
483 LIBSPECTRUM_MACHINE_CAPABILITY_PLUS3_MEMORY;       /* +3-style memory paging */
484 extern WIN32_DLL const int
485 LIBSPECTRUM_MACHINE_CAPABILITY_PLUS3_DISK;            /* +3-style disk drive */
486 extern WIN32_DLL const int
487 LIBSPECTRUM_MACHINE_CAPABILITY_TIMEX_MEMORY;    /* Timex-style memory paging */
488 extern WIN32_DLL const int
489 LIBSPECTRUM_MACHINE_CAPABILITY_TIMEX_VIDEO;       /* Timex-style video modes */
490 extern WIN32_DLL const int
491 LIBSPECTRUM_MACHINE_CAPABILITY_TRDOS_DISK;         /* TRDOS-style disk drive */
492 extern WIN32_DLL const int
493 LIBSPECTRUM_MACHINE_CAPABILITY_TIMEX_DOCK; /* T[SC]2068-style cartridge port */
494 extern WIN32_DLL const int
495 LIBSPECTRUM_MACHINE_CAPABILITY_SINCLAIR_JOYSTICK;
496                                             /* Sinclair-style joystick ports */
497 extern WIN32_DLL const int
498 LIBSPECTRUM_MACHINE_CAPABILITY_KEMPSTON_JOYSTICK;
499                                             /* Kempston-style joystick ports */
500 extern WIN32_DLL const int
501 LIBSPECTRUM_MACHINE_CAPABILITY_SCORP_MEMORY; /* Scorpion-style memory paging */
502 extern WIN32_DLL const int
503 LIBSPECTRUM_MACHINE_CAPABILITY_EVEN_M1;
504                              /* M1 cycles always start on even tstate counts */
505 extern WIN32_DLL const int
506 LIBSPECTRUM_MACHINE_CAPABILITY_SE_MEMORY;          /* SE-style memory paging */
507 extern WIN32_DLL const int
508 LIBSPECTRUM_MACHINE_CAPABILITY_NTSC;                         /* NTSC display */
509 extern WIN32_DLL const int
510 LIBSPECTRUM_MACHINE_CAPABILITY_PENT512_MEMORY; /* Pentagon 512 memory paging */
511 extern WIN32_DLL const int
512 LIBSPECTRUM_MACHINE_CAPABILITY_PENT1024_MEMORY;
513 					      /* Pentagon 1024 memory paging */
514 
515 /* Get the capabilities of a machine */
516 WIN32_DLL int libspectrum_machine_capabilities( libspectrum_machine type );
517 
518 /* Get the timings of a machine */
519 WIN32_DLL libspectrum_dword
520 libspectrum_timings_processor_speed( libspectrum_machine machine );
521 WIN32_DLL libspectrum_dword
522 libspectrum_timings_ay_speed( libspectrum_machine machine );
523 WIN32_DLL libspectrum_word
524 libspectrum_timings_left_border( libspectrum_machine machine );
525 WIN32_DLL libspectrum_word
526 libspectrum_timings_horizontal_screen( libspectrum_machine machine );
527 WIN32_DLL libspectrum_word
528 libspectrum_timings_right_border( libspectrum_machine machine );
529 WIN32_DLL libspectrum_word
530 libspectrum_timings_horizontal_retrace( libspectrum_machine machine );
531 WIN32_DLL libspectrum_word
532 libspectrum_timings_top_border( libspectrum_machine machine );
533 WIN32_DLL libspectrum_word
534 libspectrum_timings_vertical_screen( libspectrum_machine machine );
535 WIN32_DLL libspectrum_word
536 libspectrum_timings_bottom_border( libspectrum_machine machine );
537 WIN32_DLL libspectrum_word
538 libspectrum_timings_vertical_retrace( libspectrum_machine machine );
539 WIN32_DLL libspectrum_word
540 libspectrum_timings_interrupt_length( libspectrum_machine machine );
541 WIN32_DLL libspectrum_word
542 libspectrum_timings_top_left_pixel( libspectrum_machine machine );
543 WIN32_DLL libspectrum_word
544 libspectrum_timings_tstates_per_line( libspectrum_machine machine );
545 WIN32_DLL libspectrum_word
546 libspectrum_timings_lines_per_frame( libspectrum_machine machine );
547 WIN32_DLL libspectrum_dword
548 libspectrum_timings_tstates_per_frame( libspectrum_machine machine );
549 
550 /* Creator information */
551 
552 typedef struct libspectrum_creator libspectrum_creator;
553 
554 WIN32_DLL libspectrum_creator*
555 libspectrum_creator_alloc( void );
556 WIN32_DLL libspectrum_error
557 libspectrum_creator_free( libspectrum_creator *creator );
558 
559 WIN32_DLL libspectrum_error
560 libspectrum_creator_set_program( libspectrum_creator *creator,
561 				 const char *program );
562 WIN32_DLL const char *
563 libspectrum_creator_program( libspectrum_creator *creator );
564 
565 WIN32_DLL libspectrum_error
566 libspectrum_creator_set_major( libspectrum_creator *creator,
567 			       libspectrum_word major );
568 WIN32_DLL libspectrum_word
569 libspectrum_creator_major( libspectrum_creator *creator );
570 
571 WIN32_DLL libspectrum_error
572 libspectrum_creator_set_minor( libspectrum_creator *creator,
573 			       libspectrum_word minor );
574 WIN32_DLL libspectrum_word
575 libspectrum_creator_minor( libspectrum_creator *creator );
576 
577 WIN32_DLL libspectrum_error
578 libspectrum_creator_set_competition_code( libspectrum_creator *creator,
579 					  libspectrum_dword competition_code );
580 WIN32_DLL libspectrum_dword
581 libspectrum_creator_competition_code( libspectrum_creator *creator );
582 
583 WIN32_DLL libspectrum_error
584 libspectrum_creator_set_custom( libspectrum_creator *creator,
585 				libspectrum_byte *data, size_t length );
586 
587 WIN32_DLL libspectrum_byte *
588 libspectrum_creator_custom( libspectrum_creator *creator );
589 
590 WIN32_DLL size_t
591 libspectrum_creator_custom_length( libspectrum_creator *creator );
592 
593 /*
594  * Snap handling routines
595  */
596 
597 typedef struct libspectrum_snap libspectrum_snap;
598 
599 WIN32_DLL libspectrum_snap* libspectrum_snap_alloc( void );
600 WIN32_DLL libspectrum_error libspectrum_snap_free( libspectrum_snap *snap );
601 
602 /* Read in a snapshot, optionally guessing what type it is */
603 WIN32_DLL libspectrum_error
604 libspectrum_snap_read( libspectrum_snap *snap, const libspectrum_byte *buffer,
605 		       size_t length, libspectrum_id_t type,
606 		       const char *filename );
607 
608 /* Write a snapshot */
609 WIN32_DLL libspectrum_error
610 libspectrum_snap_write( libspectrum_byte **buffer, size_t *length,
611 			int *out_flags, libspectrum_snap *snap,
612 	 		libspectrum_id_t type, libspectrum_creator *creator,
613 			int in_flags );
614 
615 /* The flags that can be given to libspectrum_snap_write() */
616 extern WIN32_DLL const int LIBSPECTRUM_FLAG_SNAPSHOT_NO_COMPRESSION;
617 extern WIN32_DLL const int LIBSPECTRUM_FLAG_SNAPSHOT_ALWAYS_COMPRESS;
618 
619 /* The flags that may be returned from libspectrum_snap_write() */
620 extern WIN32_DLL const int LIBSPECTRUM_FLAG_SNAPSHOT_MINOR_INFO_LOSS;
621 extern WIN32_DLL const int LIBSPECTRUM_FLAG_SNAPSHOT_MAJOR_INFO_LOSS;
622 
623 /* The joystick types we can handle */
624 typedef enum libspectrum_joystick {
625 
626   LIBSPECTRUM_JOYSTICK_NONE,
627 
628   LIBSPECTRUM_JOYSTICK_CURSOR,
629   LIBSPECTRUM_JOYSTICK_KEMPSTON,
630   LIBSPECTRUM_JOYSTICK_SINCLAIR_1,
631   LIBSPECTRUM_JOYSTICK_SINCLAIR_2,
632   LIBSPECTRUM_JOYSTICK_TIMEX_1,
633   LIBSPECTRUM_JOYSTICK_TIMEX_2,
634   LIBSPECTRUM_JOYSTICK_FULLER,
635 
636 } libspectrum_joystick;
637 
638 WIN32_DLL const char* libspectrum_joystick_name( libspectrum_joystick type );
639 
640 extern WIN32_DLL const int LIBSPECTRUM_JOYSTICK_INPUT_NONE;
641 extern WIN32_DLL const int LIBSPECTRUM_JOYSTICK_INPUT_KEYBOARD;
642 extern WIN32_DLL const int LIBSPECTRUM_JOYSTICK_INPUT_JOYSTICK_1;
643 extern WIN32_DLL const int LIBSPECTRUM_JOYSTICK_INPUT_JOYSTICK_2;
644 
645 /* Accessor functions */
646 WIN32_DLL libspectrum_machine libspectrum_snap_machine( libspectrum_snap *snap );
647 WIN32_DLL void libspectrum_snap_set_machine( libspectrum_snap *snap, libspectrum_machine machine );
648 WIN32_DLL libspectrum_byte libspectrum_snap_a( libspectrum_snap *snap );
649 WIN32_DLL void libspectrum_snap_set_a( libspectrum_snap *snap, libspectrum_byte a );
650 WIN32_DLL libspectrum_byte libspectrum_snap_f( libspectrum_snap *snap );
651 WIN32_DLL void libspectrum_snap_set_f( libspectrum_snap *snap, libspectrum_byte f );
652 WIN32_DLL libspectrum_word libspectrum_snap_bc( libspectrum_snap *snap );
653 WIN32_DLL void libspectrum_snap_set_bc( libspectrum_snap *snap, libspectrum_word bc );
654 WIN32_DLL libspectrum_word libspectrum_snap_de( libspectrum_snap *snap );
655 WIN32_DLL void libspectrum_snap_set_de( libspectrum_snap *snap, libspectrum_word de );
656 WIN32_DLL libspectrum_word libspectrum_snap_hl( libspectrum_snap *snap );
657 WIN32_DLL void libspectrum_snap_set_hl( libspectrum_snap *snap, libspectrum_word hl );
658 WIN32_DLL libspectrum_byte libspectrum_snap_a_( libspectrum_snap *snap );
659 WIN32_DLL void libspectrum_snap_set_a_( libspectrum_snap *snap, libspectrum_byte a_ );
660 WIN32_DLL libspectrum_byte libspectrum_snap_f_( libspectrum_snap *snap );
661 WIN32_DLL void libspectrum_snap_set_f_( libspectrum_snap *snap, libspectrum_byte f_ );
662 WIN32_DLL libspectrum_word libspectrum_snap_bc_( libspectrum_snap *snap );
663 WIN32_DLL void libspectrum_snap_set_bc_( libspectrum_snap *snap, libspectrum_word bc_ );
664 WIN32_DLL libspectrum_word libspectrum_snap_de_( libspectrum_snap *snap );
665 WIN32_DLL void libspectrum_snap_set_de_( libspectrum_snap *snap, libspectrum_word de_ );
666 WIN32_DLL libspectrum_word libspectrum_snap_hl_( libspectrum_snap *snap );
667 WIN32_DLL void libspectrum_snap_set_hl_( libspectrum_snap *snap, libspectrum_word hl_ );
668 WIN32_DLL libspectrum_word libspectrum_snap_ix( libspectrum_snap *snap );
669 WIN32_DLL void libspectrum_snap_set_ix( libspectrum_snap *snap, libspectrum_word ix );
670 WIN32_DLL libspectrum_word libspectrum_snap_iy( libspectrum_snap *snap );
671 WIN32_DLL void libspectrum_snap_set_iy( libspectrum_snap *snap, libspectrum_word iy );
672 WIN32_DLL libspectrum_byte libspectrum_snap_i( libspectrum_snap *snap );
673 WIN32_DLL void libspectrum_snap_set_i( libspectrum_snap *snap, libspectrum_byte i );
674 WIN32_DLL libspectrum_byte libspectrum_snap_r( libspectrum_snap *snap );
675 WIN32_DLL void libspectrum_snap_set_r( libspectrum_snap *snap, libspectrum_byte r );
676 WIN32_DLL libspectrum_word libspectrum_snap_sp( libspectrum_snap *snap );
677 WIN32_DLL void libspectrum_snap_set_sp( libspectrum_snap *snap, libspectrum_word sp );
678 WIN32_DLL libspectrum_word libspectrum_snap_pc( libspectrum_snap *snap );
679 WIN32_DLL void libspectrum_snap_set_pc( libspectrum_snap *snap, libspectrum_word pc );
680 WIN32_DLL libspectrum_word libspectrum_snap_memptr( libspectrum_snap *snap );
681 WIN32_DLL void libspectrum_snap_set_memptr( libspectrum_snap *snap, libspectrum_word memptr );
682 WIN32_DLL libspectrum_byte libspectrum_snap_iff1( libspectrum_snap *snap );
683 WIN32_DLL void libspectrum_snap_set_iff1( libspectrum_snap *snap, libspectrum_byte iff1 );
684 WIN32_DLL libspectrum_byte libspectrum_snap_iff2( libspectrum_snap *snap );
685 WIN32_DLL void libspectrum_snap_set_iff2( libspectrum_snap *snap, libspectrum_byte iff2 );
686 WIN32_DLL libspectrum_byte libspectrum_snap_im( libspectrum_snap *snap );
687 WIN32_DLL void libspectrum_snap_set_im( libspectrum_snap *snap, libspectrum_byte im );
688 WIN32_DLL libspectrum_dword libspectrum_snap_tstates( libspectrum_snap *snap );
689 WIN32_DLL void libspectrum_snap_set_tstates( libspectrum_snap *snap, libspectrum_dword tstates );
690 WIN32_DLL int libspectrum_snap_halted( libspectrum_snap *snap );
691 WIN32_DLL void libspectrum_snap_set_halted( libspectrum_snap *snap, int halted );
692 WIN32_DLL int libspectrum_snap_last_instruction_ei( libspectrum_snap *snap );
693 WIN32_DLL void libspectrum_snap_set_last_instruction_ei( libspectrum_snap *snap, int last_instruction_ei );
694 WIN32_DLL int libspectrum_snap_last_instruction_set_f( libspectrum_snap *snap );
695 WIN32_DLL void libspectrum_snap_set_last_instruction_set_f( libspectrum_snap *snap, int last_instruction_set_f );
696 WIN32_DLL libspectrum_byte libspectrum_snap_out_ula( libspectrum_snap *snap );
697 WIN32_DLL void libspectrum_snap_set_out_ula( libspectrum_snap *snap, libspectrum_byte out_ula );
698 WIN32_DLL libspectrum_byte libspectrum_snap_out_128_memoryport( libspectrum_snap *snap );
699 WIN32_DLL void libspectrum_snap_set_out_128_memoryport( libspectrum_snap *snap, libspectrum_byte out_128_memoryport );
700 WIN32_DLL libspectrum_byte libspectrum_snap_out_plus3_memoryport( libspectrum_snap *snap );
701 WIN32_DLL void libspectrum_snap_set_out_plus3_memoryport( libspectrum_snap *snap, libspectrum_byte out_plus3_memoryport );
702 WIN32_DLL libspectrum_byte libspectrum_snap_out_ay_registerport( libspectrum_snap *snap );
703 WIN32_DLL void libspectrum_snap_set_out_ay_registerport( libspectrum_snap *snap, libspectrum_byte out_ay_registerport );
704 WIN32_DLL libspectrum_byte libspectrum_snap_ay_registers( libspectrum_snap *snap, int idx );
705 WIN32_DLL void libspectrum_snap_set_ay_registers( libspectrum_snap *snap, int idx, libspectrum_byte ay_registers );
706 WIN32_DLL libspectrum_byte libspectrum_snap_out_scld_hsr( libspectrum_snap *snap );
707 WIN32_DLL void libspectrum_snap_set_out_scld_hsr( libspectrum_snap *snap, libspectrum_byte out_scld_hsr );
708 WIN32_DLL libspectrum_byte libspectrum_snap_out_scld_dec( libspectrum_snap *snap );
709 WIN32_DLL void libspectrum_snap_set_out_scld_dec( libspectrum_snap *snap, libspectrum_byte out_scld_dec );
710 WIN32_DLL int libspectrum_snap_interface1_active( libspectrum_snap *snap );
711 WIN32_DLL void libspectrum_snap_set_interface1_active( libspectrum_snap *snap, int interface1_active );
712 WIN32_DLL int libspectrum_snap_interface1_paged( libspectrum_snap *snap );
713 WIN32_DLL void libspectrum_snap_set_interface1_paged( libspectrum_snap *snap, int interface1_paged );
714 WIN32_DLL int libspectrum_snap_interface1_drive_count( libspectrum_snap *snap );
715 WIN32_DLL void libspectrum_snap_set_interface1_drive_count( libspectrum_snap *snap, int interface1_drive_count );
716 WIN32_DLL int libspectrum_snap_interface1_custom_rom( libspectrum_snap *snap );
717 WIN32_DLL void libspectrum_snap_set_interface1_custom_rom( libspectrum_snap *snap, int interface1_custom_rom );
718 WIN32_DLL libspectrum_byte * libspectrum_snap_interface1_rom( libspectrum_snap *snap, int idx );
719 WIN32_DLL void libspectrum_snap_set_interface1_rom( libspectrum_snap *snap, int idx, libspectrum_byte* interface1_rom );
720 WIN32_DLL size_t libspectrum_snap_interface1_rom_length( libspectrum_snap *snap, int idx );
721 WIN32_DLL void libspectrum_snap_set_interface1_rom_length( libspectrum_snap *snap, int idx, size_t interface1_rom_length );
722 WIN32_DLL int libspectrum_snap_beta_active( libspectrum_snap *snap );
723 WIN32_DLL void libspectrum_snap_set_beta_active( libspectrum_snap *snap, int beta_active );
724 WIN32_DLL int libspectrum_snap_beta_paged( libspectrum_snap *snap );
725 WIN32_DLL void libspectrum_snap_set_beta_paged( libspectrum_snap *snap, int beta_paged );
726 WIN32_DLL int libspectrum_snap_beta_autoboot( libspectrum_snap *snap );
727 WIN32_DLL void libspectrum_snap_set_beta_autoboot( libspectrum_snap *snap, int beta_autoboot );
728 WIN32_DLL int libspectrum_snap_beta_drive_count( libspectrum_snap *snap );
729 WIN32_DLL void libspectrum_snap_set_beta_drive_count( libspectrum_snap *snap, int beta_drive_count );
730 WIN32_DLL int libspectrum_snap_beta_custom_rom( libspectrum_snap *snap );
731 WIN32_DLL void libspectrum_snap_set_beta_custom_rom( libspectrum_snap *snap, int beta_custom_rom );
732 WIN32_DLL int libspectrum_snap_beta_direction( libspectrum_snap *snap );
733 WIN32_DLL void libspectrum_snap_set_beta_direction( libspectrum_snap *snap, int beta_direction );
734 WIN32_DLL libspectrum_byte libspectrum_snap_beta_system( libspectrum_snap *snap );
735 WIN32_DLL void libspectrum_snap_set_beta_system( libspectrum_snap *snap, libspectrum_byte beta_system );
736 WIN32_DLL libspectrum_byte libspectrum_snap_beta_track( libspectrum_snap *snap );
737 WIN32_DLL void libspectrum_snap_set_beta_track( libspectrum_snap *snap, libspectrum_byte beta_track );
738 WIN32_DLL libspectrum_byte libspectrum_snap_beta_sector( libspectrum_snap *snap );
739 WIN32_DLL void libspectrum_snap_set_beta_sector( libspectrum_snap *snap, libspectrum_byte beta_sector );
740 WIN32_DLL libspectrum_byte libspectrum_snap_beta_data( libspectrum_snap *snap );
741 WIN32_DLL void libspectrum_snap_set_beta_data( libspectrum_snap *snap, libspectrum_byte beta_data );
742 WIN32_DLL libspectrum_byte libspectrum_snap_beta_status( libspectrum_snap *snap );
743 WIN32_DLL void libspectrum_snap_set_beta_status( libspectrum_snap *snap, libspectrum_byte beta_status );
744 WIN32_DLL libspectrum_byte * libspectrum_snap_beta_rom( libspectrum_snap *snap, int idx );
745 WIN32_DLL void libspectrum_snap_set_beta_rom( libspectrum_snap *snap, int idx, libspectrum_byte* beta_rom );
746 WIN32_DLL int libspectrum_snap_plusd_active( libspectrum_snap *snap );
747 WIN32_DLL void libspectrum_snap_set_plusd_active( libspectrum_snap *snap, int plusd_active );
748 WIN32_DLL int libspectrum_snap_plusd_paged( libspectrum_snap *snap );
749 WIN32_DLL void libspectrum_snap_set_plusd_paged( libspectrum_snap *snap, int plusd_paged );
750 WIN32_DLL int libspectrum_snap_plusd_drive_count( libspectrum_snap *snap );
751 WIN32_DLL void libspectrum_snap_set_plusd_drive_count( libspectrum_snap *snap, int plusd_drive_count );
752 WIN32_DLL int libspectrum_snap_plusd_custom_rom( libspectrum_snap *snap );
753 WIN32_DLL void libspectrum_snap_set_plusd_custom_rom( libspectrum_snap *snap, int plusd_custom_rom );
754 WIN32_DLL int libspectrum_snap_plusd_direction( libspectrum_snap *snap );
755 WIN32_DLL void libspectrum_snap_set_plusd_direction( libspectrum_snap *snap, int plusd_direction );
756 WIN32_DLL libspectrum_byte libspectrum_snap_plusd_control( libspectrum_snap *snap );
757 WIN32_DLL void libspectrum_snap_set_plusd_control( libspectrum_snap *snap, libspectrum_byte plusd_control );
758 WIN32_DLL libspectrum_byte libspectrum_snap_plusd_track( libspectrum_snap *snap );
759 WIN32_DLL void libspectrum_snap_set_plusd_track( libspectrum_snap *snap, libspectrum_byte plusd_track );
760 WIN32_DLL libspectrum_byte libspectrum_snap_plusd_sector( libspectrum_snap *snap );
761 WIN32_DLL void libspectrum_snap_set_plusd_sector( libspectrum_snap *snap, libspectrum_byte plusd_sector );
762 WIN32_DLL libspectrum_byte libspectrum_snap_plusd_data( libspectrum_snap *snap );
763 WIN32_DLL void libspectrum_snap_set_plusd_data( libspectrum_snap *snap, libspectrum_byte plusd_data );
764 WIN32_DLL libspectrum_byte libspectrum_snap_plusd_status( libspectrum_snap *snap );
765 WIN32_DLL void libspectrum_snap_set_plusd_status( libspectrum_snap *snap, libspectrum_byte plusd_status );
766 WIN32_DLL libspectrum_byte * libspectrum_snap_plusd_rom( libspectrum_snap *snap, int idx );
767 WIN32_DLL void libspectrum_snap_set_plusd_rom( libspectrum_snap *snap, int idx, libspectrum_byte* plusd_rom );
768 WIN32_DLL libspectrum_byte * libspectrum_snap_plusd_ram( libspectrum_snap *snap, int idx );
769 WIN32_DLL void libspectrum_snap_set_plusd_ram( libspectrum_snap *snap, int idx, libspectrum_byte* plusd_ram );
770 WIN32_DLL int libspectrum_snap_opus_active( libspectrum_snap *snap );
771 WIN32_DLL void libspectrum_snap_set_opus_active( libspectrum_snap *snap, int opus_active );
772 WIN32_DLL int libspectrum_snap_opus_paged( libspectrum_snap *snap );
773 WIN32_DLL void libspectrum_snap_set_opus_paged( libspectrum_snap *snap, int opus_paged );
774 WIN32_DLL int libspectrum_snap_opus_drive_count( libspectrum_snap *snap );
775 WIN32_DLL void libspectrum_snap_set_opus_drive_count( libspectrum_snap *snap, int opus_drive_count );
776 WIN32_DLL int libspectrum_snap_opus_custom_rom( libspectrum_snap *snap );
777 WIN32_DLL void libspectrum_snap_set_opus_custom_rom( libspectrum_snap *snap, int opus_custom_rom );
778 WIN32_DLL int libspectrum_snap_opus_direction( libspectrum_snap *snap );
779 WIN32_DLL void libspectrum_snap_set_opus_direction( libspectrum_snap *snap, int opus_direction );
780 WIN32_DLL libspectrum_byte libspectrum_snap_opus_track( libspectrum_snap *snap );
781 WIN32_DLL void libspectrum_snap_set_opus_track( libspectrum_snap *snap, libspectrum_byte opus_track );
782 WIN32_DLL libspectrum_byte libspectrum_snap_opus_sector( libspectrum_snap *snap );
783 WIN32_DLL void libspectrum_snap_set_opus_sector( libspectrum_snap *snap, libspectrum_byte opus_sector );
784 WIN32_DLL libspectrum_byte libspectrum_snap_opus_data( libspectrum_snap *snap );
785 WIN32_DLL void libspectrum_snap_set_opus_data( libspectrum_snap *snap, libspectrum_byte opus_data );
786 WIN32_DLL libspectrum_byte libspectrum_snap_opus_status( libspectrum_snap *snap );
787 WIN32_DLL void libspectrum_snap_set_opus_status( libspectrum_snap *snap, libspectrum_byte opus_status );
788 WIN32_DLL libspectrum_byte libspectrum_snap_opus_data_reg_a( libspectrum_snap *snap );
789 WIN32_DLL void libspectrum_snap_set_opus_data_reg_a( libspectrum_snap *snap, libspectrum_byte opus_data_reg_a );
790 WIN32_DLL libspectrum_byte libspectrum_snap_opus_data_dir_a( libspectrum_snap *snap );
791 WIN32_DLL void libspectrum_snap_set_opus_data_dir_a( libspectrum_snap *snap, libspectrum_byte opus_data_dir_a );
792 WIN32_DLL libspectrum_byte libspectrum_snap_opus_control_a( libspectrum_snap *snap );
793 WIN32_DLL void libspectrum_snap_set_opus_control_a( libspectrum_snap *snap, libspectrum_byte opus_control_a );
794 WIN32_DLL libspectrum_byte libspectrum_snap_opus_data_reg_b( libspectrum_snap *snap );
795 WIN32_DLL void libspectrum_snap_set_opus_data_reg_b( libspectrum_snap *snap, libspectrum_byte opus_data_reg_b );
796 WIN32_DLL libspectrum_byte libspectrum_snap_opus_data_dir_b( libspectrum_snap *snap );
797 WIN32_DLL void libspectrum_snap_set_opus_data_dir_b( libspectrum_snap *snap, libspectrum_byte opus_data_dir_b );
798 WIN32_DLL libspectrum_byte libspectrum_snap_opus_control_b( libspectrum_snap *snap );
799 WIN32_DLL void libspectrum_snap_set_opus_control_b( libspectrum_snap *snap, libspectrum_byte opus_control_b );
800 WIN32_DLL libspectrum_byte * libspectrum_snap_opus_rom( libspectrum_snap *snap, int idx );
801 WIN32_DLL void libspectrum_snap_set_opus_rom( libspectrum_snap *snap, int idx, libspectrum_byte* opus_rom );
802 WIN32_DLL libspectrum_byte * libspectrum_snap_opus_ram( libspectrum_snap *snap, int idx );
803 WIN32_DLL void libspectrum_snap_set_opus_ram( libspectrum_snap *snap, int idx, libspectrum_byte* opus_ram );
804 WIN32_DLL int libspectrum_snap_custom_rom( libspectrum_snap *snap );
805 WIN32_DLL void libspectrum_snap_set_custom_rom( libspectrum_snap *snap, int custom_rom );
806 WIN32_DLL size_t libspectrum_snap_custom_rom_pages( libspectrum_snap *snap );
807 WIN32_DLL void libspectrum_snap_set_custom_rom_pages( libspectrum_snap *snap, size_t custom_rom_pages );
808 WIN32_DLL libspectrum_byte * libspectrum_snap_roms( libspectrum_snap *snap, int idx );
809 WIN32_DLL void libspectrum_snap_set_roms( libspectrum_snap *snap, int idx, libspectrum_byte* roms );
810 WIN32_DLL size_t libspectrum_snap_rom_length( libspectrum_snap *snap, int idx );
811 WIN32_DLL void libspectrum_snap_set_rom_length( libspectrum_snap *snap, int idx, size_t rom_length );
812 WIN32_DLL libspectrum_byte * libspectrum_snap_pages( libspectrum_snap *snap, int idx );
813 WIN32_DLL void libspectrum_snap_set_pages( libspectrum_snap *snap, int idx, libspectrum_byte* pages );
814 WIN32_DLL libspectrum_byte * libspectrum_snap_slt( libspectrum_snap *snap, int idx );
815 WIN32_DLL void libspectrum_snap_set_slt( libspectrum_snap *snap, int idx, libspectrum_byte* slt );
816 WIN32_DLL size_t libspectrum_snap_slt_length( libspectrum_snap *snap, int idx );
817 WIN32_DLL void libspectrum_snap_set_slt_length( libspectrum_snap *snap, int idx, size_t slt_length );
818 WIN32_DLL libspectrum_byte * libspectrum_snap_slt_screen( libspectrum_snap *snap );
819 WIN32_DLL void libspectrum_snap_set_slt_screen( libspectrum_snap *snap, libspectrum_byte* slt_screen );
820 WIN32_DLL int libspectrum_snap_slt_screen_level( libspectrum_snap *snap );
821 WIN32_DLL void libspectrum_snap_set_slt_screen_level( libspectrum_snap *snap, int slt_screen_level );
822 WIN32_DLL int libspectrum_snap_zxatasp_active( libspectrum_snap *snap );
823 WIN32_DLL void libspectrum_snap_set_zxatasp_active( libspectrum_snap *snap, int zxatasp_active );
824 WIN32_DLL int libspectrum_snap_zxatasp_upload( libspectrum_snap *snap );
825 WIN32_DLL void libspectrum_snap_set_zxatasp_upload( libspectrum_snap *snap, int zxatasp_upload );
826 WIN32_DLL int libspectrum_snap_zxatasp_writeprotect( libspectrum_snap *snap );
827 WIN32_DLL void libspectrum_snap_set_zxatasp_writeprotect( libspectrum_snap *snap, int zxatasp_writeprotect );
828 WIN32_DLL libspectrum_byte libspectrum_snap_zxatasp_port_a( libspectrum_snap *snap );
829 WIN32_DLL void libspectrum_snap_set_zxatasp_port_a( libspectrum_snap *snap, libspectrum_byte zxatasp_port_a );
830 WIN32_DLL libspectrum_byte libspectrum_snap_zxatasp_port_b( libspectrum_snap *snap );
831 WIN32_DLL void libspectrum_snap_set_zxatasp_port_b( libspectrum_snap *snap, libspectrum_byte zxatasp_port_b );
832 WIN32_DLL libspectrum_byte libspectrum_snap_zxatasp_port_c( libspectrum_snap *snap );
833 WIN32_DLL void libspectrum_snap_set_zxatasp_port_c( libspectrum_snap *snap, libspectrum_byte zxatasp_port_c );
834 WIN32_DLL libspectrum_byte libspectrum_snap_zxatasp_control( libspectrum_snap *snap );
835 WIN32_DLL void libspectrum_snap_set_zxatasp_control( libspectrum_snap *snap, libspectrum_byte zxatasp_control );
836 WIN32_DLL size_t libspectrum_snap_zxatasp_pages( libspectrum_snap *snap );
837 WIN32_DLL void libspectrum_snap_set_zxatasp_pages( libspectrum_snap *snap, size_t zxatasp_pages );
838 WIN32_DLL size_t libspectrum_snap_zxatasp_current_page( libspectrum_snap *snap );
839 WIN32_DLL void libspectrum_snap_set_zxatasp_current_page( libspectrum_snap *snap, size_t zxatasp_current_page );
840 WIN32_DLL libspectrum_byte * libspectrum_snap_zxatasp_ram( libspectrum_snap *snap, int idx );
841 WIN32_DLL void libspectrum_snap_set_zxatasp_ram( libspectrum_snap *snap, int idx, libspectrum_byte* zxatasp_ram );
842 WIN32_DLL int libspectrum_snap_zxcf_active( libspectrum_snap *snap );
843 WIN32_DLL void libspectrum_snap_set_zxcf_active( libspectrum_snap *snap, int zxcf_active );
844 WIN32_DLL int libspectrum_snap_zxcf_upload( libspectrum_snap *snap );
845 WIN32_DLL void libspectrum_snap_set_zxcf_upload( libspectrum_snap *snap, int zxcf_upload );
846 WIN32_DLL libspectrum_byte libspectrum_snap_zxcf_memctl( libspectrum_snap *snap );
847 WIN32_DLL void libspectrum_snap_set_zxcf_memctl( libspectrum_snap *snap, libspectrum_byte zxcf_memctl );
848 WIN32_DLL size_t libspectrum_snap_zxcf_pages( libspectrum_snap *snap );
849 WIN32_DLL void libspectrum_snap_set_zxcf_pages( libspectrum_snap *snap, size_t zxcf_pages );
850 WIN32_DLL libspectrum_byte * libspectrum_snap_zxcf_ram( libspectrum_snap *snap, int idx );
851 WIN32_DLL void libspectrum_snap_set_zxcf_ram( libspectrum_snap *snap, int idx, libspectrum_byte* zxcf_ram );
852 WIN32_DLL int libspectrum_snap_interface2_active( libspectrum_snap *snap );
853 WIN32_DLL void libspectrum_snap_set_interface2_active( libspectrum_snap *snap, int interface2_active );
854 WIN32_DLL libspectrum_byte * libspectrum_snap_interface2_rom( libspectrum_snap *snap, int idx );
855 WIN32_DLL void libspectrum_snap_set_interface2_rom( libspectrum_snap *snap, int idx, libspectrum_byte* interface2_rom );
856 WIN32_DLL int libspectrum_snap_dock_active( libspectrum_snap *snap );
857 WIN32_DLL void libspectrum_snap_set_dock_active( libspectrum_snap *snap, int dock_active );
858 WIN32_DLL libspectrum_byte libspectrum_snap_exrom_ram( libspectrum_snap *snap, int idx );
859 WIN32_DLL void libspectrum_snap_set_exrom_ram( libspectrum_snap *snap, int idx, libspectrum_byte exrom_ram );
860 WIN32_DLL libspectrum_byte * libspectrum_snap_exrom_cart( libspectrum_snap *snap, int idx );
861 WIN32_DLL void libspectrum_snap_set_exrom_cart( libspectrum_snap *snap, int idx, libspectrum_byte* exrom_cart );
862 WIN32_DLL libspectrum_byte libspectrum_snap_dock_ram( libspectrum_snap *snap, int idx );
863 WIN32_DLL void libspectrum_snap_set_dock_ram( libspectrum_snap *snap, int idx, libspectrum_byte dock_ram );
864 WIN32_DLL libspectrum_byte * libspectrum_snap_dock_cart( libspectrum_snap *snap, int idx );
865 WIN32_DLL void libspectrum_snap_set_dock_cart( libspectrum_snap *snap, int idx, libspectrum_byte* dock_cart );
866 WIN32_DLL int libspectrum_snap_issue2( libspectrum_snap *snap );
867 WIN32_DLL void libspectrum_snap_set_issue2( libspectrum_snap *snap, int issue2 );
868 WIN32_DLL size_t libspectrum_snap_joystick_active_count( libspectrum_snap *snap );
869 WIN32_DLL void libspectrum_snap_set_joystick_active_count( libspectrum_snap *snap, size_t joystick_active_count );
870 WIN32_DLL libspectrum_joystick libspectrum_snap_joystick_list( libspectrum_snap *snap, int idx );
871 WIN32_DLL void libspectrum_snap_set_joystick_list( libspectrum_snap *snap, int idx, libspectrum_joystick joystick_list );
872 WIN32_DLL int libspectrum_snap_joystick_inputs( libspectrum_snap *snap, int idx );
873 WIN32_DLL void libspectrum_snap_set_joystick_inputs( libspectrum_snap *snap, int idx, int joystick_inputs );
874 WIN32_DLL int libspectrum_snap_kempston_mouse_active( libspectrum_snap *snap );
875 WIN32_DLL void libspectrum_snap_set_kempston_mouse_active( libspectrum_snap *snap, int kempston_mouse_active );
876 WIN32_DLL int libspectrum_snap_simpleide_active( libspectrum_snap *snap );
877 WIN32_DLL void libspectrum_snap_set_simpleide_active( libspectrum_snap *snap, int simpleide_active );
878 WIN32_DLL int libspectrum_snap_divide_active( libspectrum_snap *snap );
879 WIN32_DLL void libspectrum_snap_set_divide_active( libspectrum_snap *snap, int divide_active );
880 WIN32_DLL int libspectrum_snap_divide_eprom_writeprotect( libspectrum_snap *snap );
881 WIN32_DLL void libspectrum_snap_set_divide_eprom_writeprotect( libspectrum_snap *snap, int divide_eprom_writeprotect );
882 WIN32_DLL int libspectrum_snap_divide_paged( libspectrum_snap *snap );
883 WIN32_DLL void libspectrum_snap_set_divide_paged( libspectrum_snap *snap, int divide_paged );
884 WIN32_DLL libspectrum_byte libspectrum_snap_divide_control( libspectrum_snap *snap );
885 WIN32_DLL void libspectrum_snap_set_divide_control( libspectrum_snap *snap, libspectrum_byte divide_control );
886 WIN32_DLL size_t libspectrum_snap_divide_pages( libspectrum_snap *snap );
887 WIN32_DLL void libspectrum_snap_set_divide_pages( libspectrum_snap *snap, size_t divide_pages );
888 WIN32_DLL libspectrum_byte * libspectrum_snap_divide_eprom( libspectrum_snap *snap, int idx );
889 WIN32_DLL void libspectrum_snap_set_divide_eprom( libspectrum_snap *snap, int idx, libspectrum_byte* divide_eprom );
890 WIN32_DLL libspectrum_byte * libspectrum_snap_divide_ram( libspectrum_snap *snap, int idx );
891 WIN32_DLL void libspectrum_snap_set_divide_ram( libspectrum_snap *snap, int idx, libspectrum_byte* divide_ram );
892 WIN32_DLL int libspectrum_snap_fuller_box_active( libspectrum_snap *snap );
893 WIN32_DLL void libspectrum_snap_set_fuller_box_active( libspectrum_snap *snap, int fuller_box_active );
894 WIN32_DLL int libspectrum_snap_melodik_active( libspectrum_snap *snap );
895 WIN32_DLL void libspectrum_snap_set_melodik_active( libspectrum_snap *snap, int melodik_active );
896 WIN32_DLL int libspectrum_snap_specdrum_active( libspectrum_snap *snap );
897 WIN32_DLL void libspectrum_snap_set_specdrum_active( libspectrum_snap *snap, int specdrum_active );
898 WIN32_DLL libspectrum_signed_byte libspectrum_snap_specdrum_dac( libspectrum_snap *snap );
899 WIN32_DLL void libspectrum_snap_set_specdrum_dac( libspectrum_snap *snap, libspectrum_signed_byte specdrum_dac );
900 WIN32_DLL int libspectrum_snap_spectranet_active( libspectrum_snap *snap );
901 WIN32_DLL void libspectrum_snap_set_spectranet_active( libspectrum_snap *snap, int spectranet_active );
902 WIN32_DLL int libspectrum_snap_spectranet_paged( libspectrum_snap *snap );
903 WIN32_DLL void libspectrum_snap_set_spectranet_paged( libspectrum_snap *snap, int spectranet_paged );
904 WIN32_DLL int libspectrum_snap_spectranet_paged_via_io( libspectrum_snap *snap );
905 WIN32_DLL void libspectrum_snap_set_spectranet_paged_via_io( libspectrum_snap *snap, int spectranet_paged_via_io );
906 WIN32_DLL int libspectrum_snap_spectranet_nmi_flipflop( libspectrum_snap *snap );
907 WIN32_DLL void libspectrum_snap_set_spectranet_nmi_flipflop( libspectrum_snap *snap, int spectranet_nmi_flipflop );
908 WIN32_DLL int libspectrum_snap_spectranet_programmable_trap_active( libspectrum_snap *snap );
909 WIN32_DLL void libspectrum_snap_set_spectranet_programmable_trap_active( libspectrum_snap *snap, int spectranet_programmable_trap_active );
910 WIN32_DLL int libspectrum_snap_spectranet_programmable_trap_msb( libspectrum_snap *snap );
911 WIN32_DLL void libspectrum_snap_set_spectranet_programmable_trap_msb( libspectrum_snap *snap, int spectranet_programmable_trap_msb );
912 WIN32_DLL int libspectrum_snap_spectranet_all_traps_disabled( libspectrum_snap *snap );
913 WIN32_DLL void libspectrum_snap_set_spectranet_all_traps_disabled( libspectrum_snap *snap, int spectranet_all_traps_disabled );
914 WIN32_DLL int libspectrum_snap_spectranet_rst8_trap_disabled( libspectrum_snap *snap );
915 WIN32_DLL void libspectrum_snap_set_spectranet_rst8_trap_disabled( libspectrum_snap *snap, int spectranet_rst8_trap_disabled );
916 WIN32_DLL int libspectrum_snap_spectranet_deny_downstream_a15( libspectrum_snap *snap );
917 WIN32_DLL void libspectrum_snap_set_spectranet_deny_downstream_a15( libspectrum_snap *snap, int spectranet_deny_downstream_a15 );
918 WIN32_DLL int libspectrum_snap_spectranet_page_a( libspectrum_snap *snap );
919 WIN32_DLL void libspectrum_snap_set_spectranet_page_a( libspectrum_snap *snap, int spectranet_page_a );
920 WIN32_DLL int libspectrum_snap_spectranet_page_b( libspectrum_snap *snap );
921 WIN32_DLL void libspectrum_snap_set_spectranet_page_b( libspectrum_snap *snap, int spectranet_page_b );
922 WIN32_DLL libspectrum_word libspectrum_snap_spectranet_programmable_trap( libspectrum_snap *snap );
923 WIN32_DLL void libspectrum_snap_set_spectranet_programmable_trap( libspectrum_snap *snap, libspectrum_word spectranet_programmable_trap );
924 WIN32_DLL libspectrum_byte * libspectrum_snap_spectranet_w5100( libspectrum_snap *snap, int idx );
925 WIN32_DLL void libspectrum_snap_set_spectranet_w5100( libspectrum_snap *snap, int idx, libspectrum_byte* spectranet_w5100 );
926 WIN32_DLL libspectrum_byte * libspectrum_snap_spectranet_flash( libspectrum_snap *snap, int idx );
927 WIN32_DLL void libspectrum_snap_set_spectranet_flash( libspectrum_snap *snap, int idx, libspectrum_byte* spectranet_flash );
928 WIN32_DLL libspectrum_byte * libspectrum_snap_spectranet_ram( libspectrum_snap *snap, int idx );
929 WIN32_DLL void libspectrum_snap_set_spectranet_ram( libspectrum_snap *snap, int idx, libspectrum_byte* spectranet_ram );
930 WIN32_DLL int libspectrum_snap_late_timings( libspectrum_snap *snap );
931 WIN32_DLL void libspectrum_snap_set_late_timings( libspectrum_snap *snap, int late_timings );
932 WIN32_DLL int libspectrum_snap_zx_printer_active( libspectrum_snap *snap );
933 WIN32_DLL void libspectrum_snap_set_zx_printer_active( libspectrum_snap *snap, int zx_printer_active );
934 
935 /*
936  * Tape handling routines
937  */
938 
939 /* The various types of block available */
940 typedef enum libspectrum_tape_type {
941 
942   /* Values must be the same as used in the .tzx format */
943 
944   LIBSPECTRUM_TAPE_BLOCK_ROM = 0x10,
945   LIBSPECTRUM_TAPE_BLOCK_TURBO,
946   LIBSPECTRUM_TAPE_BLOCK_PURE_TONE,
947   LIBSPECTRUM_TAPE_BLOCK_PULSES,
948   LIBSPECTRUM_TAPE_BLOCK_PURE_DATA,
949   LIBSPECTRUM_TAPE_BLOCK_RAW_DATA,
950 
951   LIBSPECTRUM_TAPE_BLOCK_GENERALISED_DATA = 0x19,
952 
953   LIBSPECTRUM_TAPE_BLOCK_PAUSE = 0x20,
954   LIBSPECTRUM_TAPE_BLOCK_GROUP_START,
955   LIBSPECTRUM_TAPE_BLOCK_GROUP_END,
956   LIBSPECTRUM_TAPE_BLOCK_JUMP,
957   LIBSPECTRUM_TAPE_BLOCK_LOOP_START,
958   LIBSPECTRUM_TAPE_BLOCK_LOOP_END,
959 
960   LIBSPECTRUM_TAPE_BLOCK_SELECT = 0x28,
961 
962   LIBSPECTRUM_TAPE_BLOCK_STOP48 = 0x2a,
963   LIBSPECTRUM_TAPE_BLOCK_SET_SIGNAL_LEVEL,
964 
965   LIBSPECTRUM_TAPE_BLOCK_COMMENT = 0x30,
966   LIBSPECTRUM_TAPE_BLOCK_MESSAGE,
967   LIBSPECTRUM_TAPE_BLOCK_ARCHIVE_INFO,
968   LIBSPECTRUM_TAPE_BLOCK_HARDWARE,
969 
970   LIBSPECTRUM_TAPE_BLOCK_CUSTOM = 0x35,
971 
972   LIBSPECTRUM_TAPE_BLOCK_CONCAT = 0x5a,
973 
974   /* Past here are block types not in the .tzx format */
975 
976   LIBSPECTRUM_TAPE_BLOCK_RLE_PULSE = 0x100,
977 
978   /* PZX format blocks */
979   LIBSPECTRUM_TAPE_BLOCK_PULSE_SEQUENCE,
980   LIBSPECTRUM_TAPE_BLOCK_DATA_BLOCK,
981 
982 } libspectrum_tape_type;
983 
984 typedef struct libspectrum_tape_block libspectrum_tape_block;
985 typedef struct libspectrum_tape_block_state libspectrum_tape_block_state;
986 typedef struct libspectrum_tape_generalised_data_symbol_table libspectrum_tape_generalised_data_symbol_table;
987 
988 /* Something to step through all the blocks in a tape */
989 typedef struct _GSList *libspectrum_tape_iterator;
990 
991 /* Some flags */
992 extern WIN32_DLL const int LIBSPECTRUM_TAPE_FLAGS_BLOCK;  /* End of block */
993 extern WIN32_DLL const int LIBSPECTRUM_TAPE_FLAGS_STOP;	  /* Stop tape */
994 extern WIN32_DLL const int LIBSPECTRUM_TAPE_FLAGS_STOP48; /* Stop tape if in 48K mode */
995 extern WIN32_DLL const int LIBSPECTRUM_TAPE_FLAGS_NO_EDGE; /* Edge isn't really an edge */
996 extern WIN32_DLL const int LIBSPECTRUM_TAPE_FLAGS_LEVEL_LOW; /* Set level low */
997 extern WIN32_DLL const int LIBSPECTRUM_TAPE_FLAGS_LEVEL_HIGH; /* Set level high */
998 extern WIN32_DLL const int LIBSPECTRUM_TAPE_FLAGS_LENGTH_SHORT;/* Short edge;
999                                                 used for loader acceleration */
1000 extern WIN32_DLL const int LIBSPECTRUM_TAPE_FLAGS_LENGTH_LONG; /* Long edge;
1001                                                 used for loader acceleration */
1002 extern WIN32_DLL const int LIBSPECTRUM_TAPE_FLAGS_TAPE;	/* Tape has finished */
1003 
1004 /* The states which a block can be in */
1005 typedef enum libspectrum_tape_state_type {
1006 
1007   LIBSPECTRUM_TAPE_STATE_INVALID = 0,
1008 
1009   LIBSPECTRUM_TAPE_STATE_PILOT, /* Pilot pulses */
1010   LIBSPECTRUM_TAPE_STATE_SYNC1, /* First sync pulse */
1011   LIBSPECTRUM_TAPE_STATE_SYNC2, /* Second sync pulse */
1012   LIBSPECTRUM_TAPE_STATE_DATA1, /* First edge of a data bit */
1013   LIBSPECTRUM_TAPE_STATE_DATA2, /* Second edge of a data bit */
1014   LIBSPECTRUM_TAPE_STATE_PAUSE, /* The pause at the end of a block */
1015   LIBSPECTRUM_TAPE_STATE_TAIL,  /* The pulse at the end of a block */
1016 
1017 } libspectrum_tape_state_type;
1018 
1019 /* Routines to manipulate tape blocks */
1020 WIN32_DLL libspectrum_tape_block*
1021 libspectrum_tape_block_alloc( libspectrum_tape_type type );
1022 WIN32_DLL libspectrum_error
1023 libspectrum_tape_block_free( libspectrum_tape_block *block );
1024 WIN32_DLL libspectrum_tape_type
1025 libspectrum_tape_block_type( libspectrum_tape_block *block );
1026 WIN32_DLL libspectrum_error
1027 libspectrum_tape_block_set_type( libspectrum_tape_block *block,
1028 				 libspectrum_tape_type type );
1029 
1030 WIN32_DLL libspectrum_error
1031 libspectrum_tape_block_init( libspectrum_tape_block *block,
1032                              libspectrum_tape_block_state *state );
1033 
1034 WIN32_DLL libspectrum_error
1035 libspectrum_tape_block_description( char *buffer, size_t length,
1036 	                            libspectrum_tape_block *block );
1037 
1038 WIN32_DLL int
1039 libspectrum_tape_block_metadata( libspectrum_tape_block *block );
1040 
1041 WIN32_DLL libspectrum_dword
1042 libspectrum_tape_block_length( libspectrum_tape_block *block );
1043 
1044 /* Accessor functions */
1045 WIN32_DLL libspectrum_dword libspectrum_tape_block_bit_length( libspectrum_tape_block *block );
1046 WIN32_DLL libspectrum_error libspectrum_tape_block_set_bit_length( libspectrum_tape_block *block, libspectrum_dword bit_length );
1047 WIN32_DLL libspectrum_dword libspectrum_tape_block_bit0_length( libspectrum_tape_block *block );
1048 WIN32_DLL libspectrum_error libspectrum_tape_block_set_bit0_length( libspectrum_tape_block *block, libspectrum_dword bit0_length );
1049 WIN32_DLL libspectrum_dword libspectrum_tape_block_bit1_length( libspectrum_tape_block *block );
1050 WIN32_DLL libspectrum_error libspectrum_tape_block_set_bit1_length( libspectrum_tape_block *block, libspectrum_dword bit1_length );
1051 WIN32_DLL size_t libspectrum_tape_block_bits_in_last_byte( libspectrum_tape_block *block );
1052 WIN32_DLL libspectrum_error libspectrum_tape_block_set_bits_in_last_byte( libspectrum_tape_block *block, size_t bits_in_last_byte );
1053 WIN32_DLL size_t libspectrum_tape_block_bits_per_data_symbol( libspectrum_tape_block *block );
1054 WIN32_DLL libspectrum_error libspectrum_tape_block_set_bits_per_data_symbol( libspectrum_tape_block *block, size_t bits_per_data_symbol );
1055 WIN32_DLL size_t libspectrum_tape_block_count( libspectrum_tape_block *block );
1056 WIN32_DLL libspectrum_error libspectrum_tape_block_set_count( libspectrum_tape_block *block, size_t count );
1057 WIN32_DLL libspectrum_byte * libspectrum_tape_block_data( libspectrum_tape_block *block );
1058 WIN32_DLL libspectrum_error libspectrum_tape_block_set_data( libspectrum_tape_block *block, libspectrum_byte* data );
1059 WIN32_DLL size_t libspectrum_tape_block_data_length( libspectrum_tape_block *block );
1060 WIN32_DLL libspectrum_error libspectrum_tape_block_set_data_length( libspectrum_tape_block *block, size_t data_length );
1061 WIN32_DLL libspectrum_tape_generalised_data_symbol_table * libspectrum_tape_block_data_table( libspectrum_tape_block *block );
1062 WIN32_DLL libspectrum_error libspectrum_tape_block_set_data_table( libspectrum_tape_block *block, libspectrum_tape_generalised_data_symbol_table* data_table );
1063 WIN32_DLL int libspectrum_tape_block_ids( libspectrum_tape_block *block, size_t idx );
1064 WIN32_DLL libspectrum_error libspectrum_tape_block_set_ids( libspectrum_tape_block *block, int *ids );
1065 WIN32_DLL int libspectrum_tape_block_offset( libspectrum_tape_block *block );
1066 WIN32_DLL libspectrum_error libspectrum_tape_block_set_offset( libspectrum_tape_block *block, int offset );
1067 WIN32_DLL int libspectrum_tape_block_offsets( libspectrum_tape_block *block, size_t idx );
1068 WIN32_DLL libspectrum_error libspectrum_tape_block_set_offsets( libspectrum_tape_block *block, int *offsets );
1069 WIN32_DLL libspectrum_dword libspectrum_tape_block_pause( libspectrum_tape_block *block );
1070 WIN32_DLL libspectrum_error libspectrum_tape_block_set_pause( libspectrum_tape_block *block, libspectrum_dword pause );
1071 WIN32_DLL libspectrum_dword libspectrum_tape_block_pause_tstates( libspectrum_tape_block *block );
1072 WIN32_DLL libspectrum_error libspectrum_tape_block_set_pause_tstates( libspectrum_tape_block *block, libspectrum_dword pause_tstates );
1073 WIN32_DLL libspectrum_dword libspectrum_tape_block_pilot_length( libspectrum_tape_block *block );
1074 WIN32_DLL libspectrum_error libspectrum_tape_block_set_pilot_length( libspectrum_tape_block *block, libspectrum_dword pilot_length );
1075 WIN32_DLL size_t libspectrum_tape_block_pilot_pulses( libspectrum_tape_block *block );
1076 WIN32_DLL libspectrum_error libspectrum_tape_block_set_pilot_pulses( libspectrum_tape_block *block, size_t pilot_pulses );
1077 WIN32_DLL libspectrum_word libspectrum_tape_block_pilot_repeats( libspectrum_tape_block *block, size_t idx );
1078 WIN32_DLL libspectrum_error libspectrum_tape_block_set_pilot_repeats( libspectrum_tape_block *block, libspectrum_word *pilot_repeats );
1079 WIN32_DLL libspectrum_byte libspectrum_tape_block_pilot_symbols( libspectrum_tape_block *block, size_t idx );
1080 WIN32_DLL libspectrum_error libspectrum_tape_block_set_pilot_symbols( libspectrum_tape_block *block, libspectrum_byte *pilot_symbols );
1081 WIN32_DLL libspectrum_tape_generalised_data_symbol_table * libspectrum_tape_block_pilot_table( libspectrum_tape_block *block );
1082 WIN32_DLL libspectrum_error libspectrum_tape_block_set_pilot_table( libspectrum_tape_block *block, libspectrum_tape_generalised_data_symbol_table* pilot_table );
1083 WIN32_DLL libspectrum_dword libspectrum_tape_block_pulse_length( libspectrum_tape_block *block );
1084 WIN32_DLL libspectrum_error libspectrum_tape_block_set_pulse_length( libspectrum_tape_block *block, libspectrum_dword pulse_length );
1085 WIN32_DLL libspectrum_dword libspectrum_tape_block_scale( libspectrum_tape_block *block );
1086 WIN32_DLL libspectrum_error libspectrum_tape_block_set_scale( libspectrum_tape_block *block, libspectrum_dword scale );
1087 WIN32_DLL libspectrum_dword libspectrum_tape_block_pulse_lengths( libspectrum_tape_block *block, size_t idx );
1088 WIN32_DLL libspectrum_error libspectrum_tape_block_set_pulse_lengths( libspectrum_tape_block *block, libspectrum_dword *pulse_lengths );
1089 WIN32_DLL size_t libspectrum_tape_block_pulse_repeats( libspectrum_tape_block *block, size_t idx );
1090 WIN32_DLL libspectrum_error libspectrum_tape_block_set_pulse_repeats( libspectrum_tape_block *block, size_t *pulse_repeats );
1091 WIN32_DLL libspectrum_dword libspectrum_tape_block_sync1_length( libspectrum_tape_block *block );
1092 WIN32_DLL libspectrum_error libspectrum_tape_block_set_sync1_length( libspectrum_tape_block *block, libspectrum_dword sync1_length );
1093 WIN32_DLL libspectrum_dword libspectrum_tape_block_sync2_length( libspectrum_tape_block *block );
1094 WIN32_DLL libspectrum_error libspectrum_tape_block_set_sync2_length( libspectrum_tape_block *block, libspectrum_dword sync2_length );
1095 WIN32_DLL libspectrum_dword libspectrum_tape_block_tail_length( libspectrum_tape_block *block );
1096 WIN32_DLL libspectrum_error libspectrum_tape_block_set_tail_length( libspectrum_tape_block *block, libspectrum_dword tail_length );
1097 WIN32_DLL char * libspectrum_tape_block_text( libspectrum_tape_block *block );
1098 WIN32_DLL libspectrum_error libspectrum_tape_block_set_text( libspectrum_tape_block *block, char* text );
1099 WIN32_DLL char * libspectrum_tape_block_texts( libspectrum_tape_block *block, size_t idx );
1100 WIN32_DLL libspectrum_error libspectrum_tape_block_set_texts( libspectrum_tape_block *block, char* *texts );
1101 WIN32_DLL int libspectrum_tape_block_types( libspectrum_tape_block *block, size_t idx );
1102 WIN32_DLL libspectrum_error libspectrum_tape_block_set_types( libspectrum_tape_block *block, int *types );
1103 WIN32_DLL int libspectrum_tape_block_values( libspectrum_tape_block *block, size_t idx );
1104 WIN32_DLL libspectrum_error libspectrum_tape_block_set_values( libspectrum_tape_block *block, int *values );
1105 WIN32_DLL int libspectrum_tape_block_level( libspectrum_tape_block *block );
1106 WIN32_DLL libspectrum_error libspectrum_tape_block_set_level( libspectrum_tape_block *block, int level );
1107 WIN32_DLL libspectrum_byte libspectrum_tape_block_bit0_pulse_count( libspectrum_tape_block *block );
1108 WIN32_DLL libspectrum_error libspectrum_tape_block_set_bit0_pulse_count( libspectrum_tape_block *block, libspectrum_byte bit0_pulse_count );
1109 WIN32_DLL libspectrum_byte libspectrum_tape_block_bit1_pulse_count( libspectrum_tape_block *block );
1110 WIN32_DLL libspectrum_error libspectrum_tape_block_set_bit1_pulse_count( libspectrum_tape_block *block, libspectrum_byte bit1_pulse_count );
1111 WIN32_DLL libspectrum_word libspectrum_tape_block_bit0_pulses( libspectrum_tape_block *block, size_t idx );
1112 WIN32_DLL libspectrum_error libspectrum_tape_block_set_bit0_pulses( libspectrum_tape_block *block, libspectrum_word *bit0_pulses );
1113 WIN32_DLL libspectrum_word libspectrum_tape_block_bit1_pulses( libspectrum_tape_block *block, size_t idx );
1114 WIN32_DLL libspectrum_error libspectrum_tape_block_set_bit1_pulses( libspectrum_tape_block *block, libspectrum_word *bit1_pulses );
1115 
1116 /* A linked list of tape blocks */
1117 typedef struct libspectrum_tape libspectrum_tape;
1118 
1119 WIN32_DLL libspectrum_tape* libspectrum_tape_alloc( void );
1120 WIN32_DLL libspectrum_error libspectrum_tape_clear( libspectrum_tape *tape );
1121 WIN32_DLL libspectrum_error libspectrum_tape_free( libspectrum_tape *tape );
1122 
1123 /* Read in a tape file, optionally guessing what sort of file it is */
1124 WIN32_DLL libspectrum_error
1125 libspectrum_tape_read( libspectrum_tape *tape, const libspectrum_byte *buffer,
1126 		       size_t length, libspectrum_id_t type,
1127 		       const char *filename );
1128 
1129 /* Write a tape file */
1130 WIN32_DLL libspectrum_error
1131 libspectrum_tape_write( libspectrum_byte **buffer, size_t *length,
1132 			libspectrum_tape *tape, libspectrum_id_t type );
1133 
1134 /* Does this tape structure actually contain a tape? */
1135 WIN32_DLL int libspectrum_tape_present( const libspectrum_tape *tape );
1136 
1137 WIN32_DLL libspectrum_error
1138 libspectrum_tape_get_next_edge( libspectrum_dword *tstates, int *flags,
1139 	                        libspectrum_tape *tape );
1140 
1141 /* Get the current block from the tape */
1142 WIN32_DLL libspectrum_tape_block *
1143 libspectrum_tape_current_block( libspectrum_tape *tape );
1144 
1145 /* Get the state of the active block on the tape */
1146 WIN32_DLL libspectrum_tape_state_type
1147 libspectrum_tape_state( libspectrum_tape *tape );
1148 
1149 /* Set the state of the active block on the tape */
1150 WIN32_DLL libspectrum_error
1151 libspectrum_tape_set_state( libspectrum_tape *tape,
1152                             libspectrum_tape_state_type state );
1153 
1154 /* Peek at the next block on the tape */
1155 WIN32_DLL libspectrum_tape_block *
1156 libspectrum_tape_peek_next_block( libspectrum_tape *tape );
1157 
1158 /* Peek at the last block on the tape */
1159 WIN32_DLL libspectrum_tape_block *
1160 libspectrum_tape_peek_last_block( libspectrum_tape *tape );
1161 
1162 /* Cause the next block on the tape to be active, initialise it
1163    and return it */
1164 WIN32_DLL libspectrum_tape_block *
1165 libspectrum_tape_select_next_block( libspectrum_tape *tape );
1166 
1167 /* Get the position on the tape of the current block */
1168 WIN32_DLL libspectrum_error
1169 libspectrum_tape_position( int *n, libspectrum_tape *tape );
1170 
1171 /* Select the nth block on the tape */
1172 WIN32_DLL libspectrum_error
1173 libspectrum_tape_nth_block( libspectrum_tape *tape, int n );
1174 
1175 /* Append a block to the current tape */
1176 WIN32_DLL void
1177 libspectrum_tape_append_block( libspectrum_tape *tape,
1178 			       libspectrum_tape_block *block );
1179 
1180 WIN32_DLL void
1181 libspectrum_tape_remove_block( libspectrum_tape *tape,
1182 			       libspectrum_tape_iterator it );
1183 
1184 WIN32_DLL libspectrum_error
1185 libspectrum_tape_insert_block( libspectrum_tape *tape,
1186 			       libspectrum_tape_block *block,
1187 			       size_t position );
1188 
1189 /*** Routines for iterating through a tape ***/
1190 
1191 WIN32_DLL libspectrum_tape_block *
1192 libspectrum_tape_iterator_init( libspectrum_tape_iterator *iterator,
1193 				libspectrum_tape *tape );
1194 
1195 WIN32_DLL libspectrum_tape_block *
1196 libspectrum_tape_iterator_current( libspectrum_tape_iterator iterator );
1197 
1198 WIN32_DLL libspectrum_tape_block *
1199 libspectrum_tape_iterator_next( libspectrum_tape_iterator *iterator );
1200 
1201 /*** Routines for handling the TZX generalised data block symbol table
1202      structure ***/
1203 
1204 typedef enum libspectrum_tape_generalised_data_symbol_edge_type {
1205 
1206   LIBSPECTRUM_TAPE_GENERALISED_DATA_SYMBOL_EDGE = 0x00,
1207   LIBSPECTRUM_TAPE_GENERALISED_DATA_SYMBOL_NO_EDGE,
1208   LIBSPECTRUM_TAPE_GENERALISED_DATA_SYMBOL_LOW,
1209   LIBSPECTRUM_TAPE_GENERALISED_DATA_SYMBOL_HIGH,
1210 
1211 } libspectrum_tape_generalised_data_symbol_edge_type;
1212 
1213 typedef struct libspectrum_tape_generalised_data_symbol libspectrum_tape_generalised_data_symbol;
1214 
1215 WIN32_DLL libspectrum_dword libspectrum_tape_generalised_data_symbol_table_symbols_in_block( const libspectrum_tape_generalised_data_symbol_table *table );
1216 WIN32_DLL libspectrum_byte libspectrum_tape_generalised_data_symbol_table_max_pulses( const libspectrum_tape_generalised_data_symbol_table *table );
1217 WIN32_DLL libspectrum_word libspectrum_tape_generalised_data_symbol_table_symbols_in_table( const libspectrum_tape_generalised_data_symbol_table *table );
1218 WIN32_DLL libspectrum_tape_generalised_data_symbol* libspectrum_tape_generalised_data_symbol_table_symbol( const libspectrum_tape_generalised_data_symbol_table *table, size_t which );
1219 
1220 WIN32_DLL libspectrum_tape_generalised_data_symbol_edge_type libspectrum_tape_generalised_data_symbol_type( const libspectrum_tape_generalised_data_symbol *symbol );
1221 WIN32_DLL libspectrum_word libspectrum_tape_generalised_data_symbol_pulse( const libspectrum_tape_generalised_data_symbol *symbol, size_t which );
1222 
1223 
1224 /*
1225  * Input recording routines
1226  */
1227 
1228 typedef struct libspectrum_rzx libspectrum_rzx;
1229 
1230 WIN32_DLL libspectrum_rzx* libspectrum_rzx_alloc( void );
1231 WIN32_DLL libspectrum_error libspectrum_rzx_free( libspectrum_rzx *rzx );
1232 
1233 WIN32_DLL void
1234 libspectrum_rzx_start_input( libspectrum_rzx *rzx, libspectrum_dword tstates );
1235 WIN32_DLL libspectrum_error
1236 libspectrum_rzx_stop_input( libspectrum_rzx *rzx );
1237 WIN32_DLL libspectrum_error
1238 libspectrum_rzx_add_snap( libspectrum_rzx *rzx, libspectrum_snap *snap, int automatic );
1239 WIN32_DLL libspectrum_error
1240 libspectrum_rzx_rollback( libspectrum_rzx *rzx, libspectrum_snap **snap );
1241 WIN32_DLL libspectrum_error
1242 libspectrum_rzx_rollback_to( libspectrum_rzx *rzx, libspectrum_snap **snap,
1243 			     size_t which );
1244 
1245 WIN32_DLL libspectrum_error
1246 libspectrum_rzx_store_frame( libspectrum_rzx *rzx, size_t instructions,
1247 			     size_t count, libspectrum_byte *in_bytes );
1248 
1249 WIN32_DLL libspectrum_error
1250 libspectrum_rzx_start_playback( libspectrum_rzx *rzx, int which,
1251 				libspectrum_snap **snap );
1252 WIN32_DLL libspectrum_error
1253 libspectrum_rzx_playback_frame( libspectrum_rzx *rzx, int *finished, libspectrum_snap **snap );
1254 WIN32_DLL libspectrum_error
1255 libspectrum_rzx_playback( libspectrum_rzx *rzx, libspectrum_byte *byte );
1256 
1257 /* Get and set the tstate counter */
1258 WIN32_DLL size_t libspectrum_rzx_tstates( libspectrum_rzx *rzx );
1259 
1260 /* Get the current frame's instruction count */
1261 WIN32_DLL size_t libspectrum_rzx_instructions( libspectrum_rzx *rzx );
1262 
1263 WIN32_DLL libspectrum_dword libspectrum_rzx_get_keyid( libspectrum_rzx *rzx );
1264 
1265 typedef struct libspectrum_signature {
1266 
1267   /* Where in the buffer is the signed data? */
1268   const libspectrum_byte *start; ptrdiff_t length;
1269 
1270 /* Signature parameters not stored as libgcrypt is not present */
1271 
1272 } libspectrum_signature;
1273 
1274 WIN32_DLL libspectrum_error
1275 libspectrum_rzx_get_signature( libspectrum_rzx *rzx,
1276 			       libspectrum_signature *signature );
1277 
1278 typedef struct libspectrum_rzx_dsa_key {
1279 
1280   /* The standard DSA parameters, represented as hex strings with MSB first.
1281      Set x = NULL for a public key */
1282   const char *p, *q, *g, *y, *x;
1283 
1284 } libspectrum_rzx_dsa_key;
1285 
1286 WIN32_DLL libspectrum_error
1287 libspectrum_rzx_read( libspectrum_rzx *rzx, const libspectrum_byte *buffer,
1288 		      size_t length );
1289 
1290 WIN32_DLL libspectrum_error
1291 libspectrum_rzx_write( libspectrum_byte **buffer, size_t *length,
1292 		       libspectrum_rzx *rzx, libspectrum_id_t snap_format,
1293 		       libspectrum_creator *creator, int compress,
1294 		       libspectrum_rzx_dsa_key *key );
1295 
1296 /* Something to step through all the blocks in an input recording */
1297 typedef struct _GSList *libspectrum_rzx_iterator;
1298 
1299 /* The block types which can appear in RZX files */
1300 typedef enum libspectrum_rzx_block_id {
1301 
1302   LIBSPECTRUM_RZX_CREATOR_BLOCK = 0x10,
1303 
1304   LIBSPECTRUM_RZX_SIGN_START_BLOCK = 0x20,
1305   LIBSPECTRUM_RZX_SIGN_END_BLOCK = 0x21,
1306 
1307   LIBSPECTRUM_RZX_SNAPSHOT_BLOCK = 0x30,
1308 
1309   LIBSPECTRUM_RZX_INPUT_BLOCK = 0x80,
1310 
1311 } libspectrum_rzx_block_id;
1312 
1313 WIN32_DLL void
1314 libspectrum_rzx_insert_snap( libspectrum_rzx *rzx, libspectrum_snap *snap,
1315 			     int where );
1316 
1317 WIN32_DLL libspectrum_rzx_iterator
1318 libspectrum_rzx_iterator_begin( libspectrum_rzx *rzx );
1319 WIN32_DLL libspectrum_rzx_iterator
1320 libspectrum_rzx_iterator_next( libspectrum_rzx_iterator it );
1321 
1322 WIN32_DLL libspectrum_rzx_block_id
1323 libspectrum_rzx_iterator_get_type( libspectrum_rzx_iterator it );
1324 WIN32_DLL size_t
1325 libspectrum_rzx_iterator_get_frames( libspectrum_rzx_iterator it );
1326 
1327 WIN32_DLL void
1328 libspectrum_rzx_iterator_delete( libspectrum_rzx *rzx,
1329 				 libspectrum_rzx_iterator it );
1330 WIN32_DLL libspectrum_snap*
1331 libspectrum_rzx_iterator_get_snap( libspectrum_rzx_iterator it );
1332 WIN32_DLL int
1333 libspectrum_rzx_iterator_snap_is_automatic( libspectrum_rzx_iterator it );
1334 
1335 /*
1336  * Microdrive image handling routines
1337  */
1338 
1339 typedef struct libspectrum_microdrive libspectrum_microdrive;
1340 
1341 #define LIBSPECTRUM_MICRODRIVE_BLOCK_MAX 254
1342 #define LIBSPECTRUM_MICRODRIVE_HEAD_LEN 15
1343 #define LIBSPECTRUM_MICRODRIVE_DATA_LEN 512
1344 #define LIBSPECTRUM_MICRODRIVE_BLOCK_LEN ( LIBSPECTRUM_MICRODRIVE_HEAD_LEN + \
1345 				    LIBSPECTRUM_MICRODRIVE_HEAD_LEN +  \
1346 				    LIBSPECTRUM_MICRODRIVE_DATA_LEN + 1 )
1347 #define LIBSPECTRUM_MICRODRIVE_CARTRIDGE_LENGTH \
1348 	( LIBSPECTRUM_MICRODRIVE_BLOCK_MAX * LIBSPECTRUM_MICRODRIVE_BLOCK_LEN )
1349 
1350 /* Constructor/destructor */
1351 
1352 WIN32_DLL libspectrum_microdrive*
1353 libspectrum_microdrive_alloc( void );
1354 WIN32_DLL libspectrum_error
1355 libspectrum_microdrive_free( libspectrum_microdrive *microdrive );
1356 
1357 /* Accessors */
1358 
1359 WIN32_DLL libspectrum_byte
1360 libspectrum_microdrive_data( const libspectrum_microdrive *microdrive,
1361 			     size_t which );
1362 WIN32_DLL void
1363 libspectrum_microdrive_set_data( libspectrum_microdrive *microdrive,
1364 				 size_t which, libspectrum_byte data );
1365 
1366 WIN32_DLL int
1367 libspectrum_microdrive_write_protect( const libspectrum_microdrive *microdrive );
1368 WIN32_DLL void
1369 libspectrum_microdrive_set_write_protect( libspectrum_microdrive *microdrive,
1370 					  int write_protect );
1371 
1372 WIN32_DLL libspectrum_byte
1373 libspectrum_microdrive_cartridge_len( const libspectrum_microdrive *microdrive );
1374 WIN32_DLL void
1375 libspectrum_microdrive_set_cartridge_len( libspectrum_microdrive *microdrive,
1376 					  libspectrum_byte len );
1377 
1378 /* .mdr format routines */
1379 
1380 WIN32_DLL int
1381 libspectrum_microdrive_checksum( libspectrum_microdrive *microdrive,
1382 				 libspectrum_byte what );
1383 WIN32_DLL libspectrum_error
1384 libspectrum_microdrive_mdr_read( libspectrum_microdrive *microdrive,
1385 				 libspectrum_byte *buffer, size_t length );
1386 WIN32_DLL void
1387 libspectrum_microdrive_mdr_write( const libspectrum_microdrive *microdrive,
1388 				  libspectrum_byte **buffer, size_t *length );
1389 
1390 /*
1391  * Timex DOCK/EXROM handling routines
1392  */
1393 
1394 /* The types of memory which this bank will page into */
1395 typedef enum libspectrum_dck_bank {
1396   LIBSPECTRUM_DCK_BANK_DOCK = 0,
1397   LIBSPECTRUM_DCK_BANK_EXROM = 254,
1398   LIBSPECTRUM_DCK_BANK_HOME = 255
1399 } libspectrum_dck_bank;
1400 
1401 /* The type of one 8Kb page */
1402 typedef enum libspectrum_dck_page_type {
1403   LIBSPECTRUM_DCK_PAGE_NULL = 0,
1404   LIBSPECTRUM_DCK_PAGE_RAM_EMPTY,
1405   LIBSPECTRUM_DCK_PAGE_ROM,
1406   LIBSPECTRUM_DCK_PAGE_RAM
1407 } libspectrum_dck_page_type;
1408 
1409 /* One set of 8 x 8Kb pages */
1410 typedef struct libspectrum_dck_block {
1411   libspectrum_dck_bank bank;
1412   libspectrum_dck_page_type access[8];
1413   libspectrum_byte *pages[8];
1414 } libspectrum_dck_block;
1415 
1416 /* A number of 8 x 8Kb page sets */
1417 /* FIXME: Remove the arbitrary limit on the number of banks */
1418 typedef struct libspectrum_dck {
1419   libspectrum_dck_block *dck[256];	/* dck block data */
1420 } libspectrum_dck;
1421 
1422 WIN32_DLL libspectrum_dck* libspectrum_dck_alloc( void );
1423 WIN32_DLL libspectrum_error
1424 libspectrum_dck_free( libspectrum_dck *dck, int keep_pages );
1425 
1426 /* Read in a DCK file */
1427 
1428 WIN32_DLL libspectrum_error
1429 libspectrum_dck_read( libspectrum_dck *dck, const libspectrum_byte *buffer,
1430                       size_t length );
1431 
1432 WIN32_DLL libspectrum_error
1433 libspectrum_dck_read2( libspectrum_dck *dck, const libspectrum_byte *buffer,
1434                        size_t length, const char *filename );
1435 
1436 /*
1437  * Crypto functions
1438  */
1439 
1440 WIN32_DLL libspectrum_error
1441 libspectrum_verify_signature( libspectrum_signature *signature,
1442 			      libspectrum_rzx_dsa_key *key );
1443 WIN32_DLL libspectrum_error
1444 libspectrum_signature_free( libspectrum_signature *signature );
1445 
1446 /*
1447  * IDE hard disk handling routines
1448  */
1449 
1450 typedef enum libspectrum_ide_databus {
1451 
1452   LIBSPECTRUM_IDE_DATA8,
1453   LIBSPECTRUM_IDE_DATA16,
1454   LIBSPECTRUM_IDE_DATA16_BYTESWAP,
1455   LIBSPECTRUM_IDE_DATA16_DATA2,
1456 
1457 } libspectrum_ide_databus;
1458 
1459 typedef enum libspectrum_ide_unit {
1460 
1461   LIBSPECTRUM_IDE_MASTER = 0,
1462   LIBSPECTRUM_IDE_SLAVE = 1,
1463 
1464 } libspectrum_ide_unit;
1465 
1466 typedef enum libspectrum_ide_register {
1467 
1468   LIBSPECTRUM_IDE_REGISTER_DATA = 0,
1469   LIBSPECTRUM_IDE_REGISTER_ERROR_FEATURE = 1,
1470   LIBSPECTRUM_IDE_REGISTER_SECTOR_COUNT = 2,
1471   LIBSPECTRUM_IDE_REGISTER_SECTOR = 3,
1472   LIBSPECTRUM_IDE_REGISTER_CYLINDER_LOW = 4,
1473   LIBSPECTRUM_IDE_REGISTER_CYLINDER_HIGH = 5,
1474   LIBSPECTRUM_IDE_REGISTER_HEAD_DRIVE = 6,
1475   LIBSPECTRUM_IDE_REGISTER_COMMAND_STATUS = 7,
1476   LIBSPECTRUM_IDE_REGISTER_DATA2 = 8,
1477 
1478 } libspectrum_ide_register;
1479 
1480 typedef struct libspectrum_ide_channel libspectrum_ide_channel;
1481 
1482 WIN32_DLL libspectrum_ide_channel*
1483 libspectrum_ide_alloc( libspectrum_ide_databus databus );
1484 WIN32_DLL libspectrum_error
1485 libspectrum_ide_free( libspectrum_ide_channel *chn );
1486 
1487 WIN32_DLL libspectrum_error
1488 libspectrum_ide_insert( libspectrum_ide_channel *chn,
1489                         libspectrum_ide_unit unit,
1490                         const char *filename );
1491 WIN32_DLL libspectrum_error
1492 libspectrum_ide_commit( libspectrum_ide_channel *chn,
1493 			libspectrum_ide_unit unit );
1494 WIN32_DLL int
1495 libspectrum_ide_dirty( libspectrum_ide_channel *chn,
1496 		       libspectrum_ide_unit unit );
1497 WIN32_DLL libspectrum_error
1498 libspectrum_ide_eject( libspectrum_ide_channel *chn,
1499 		       libspectrum_ide_unit unit );
1500 
1501 WIN32_DLL libspectrum_error
1502 libspectrum_ide_reset( libspectrum_ide_channel *chn );
1503 
1504 WIN32_DLL libspectrum_byte
1505 libspectrum_ide_read( libspectrum_ide_channel *chn,
1506 		      libspectrum_ide_register reg );
1507 
1508 WIN32_DLL void
1509 libspectrum_ide_write( libspectrum_ide_channel *chn,
1510 		       libspectrum_ide_register reg,
1511 		       libspectrum_byte data );
1512 
1513 #ifdef __cplusplus
1514 };
1515 #endif				/* #ifdef __cplusplus */
1516 
1517 #endif				/* #ifndef LIBSPECTRUM_LIBSPECTRUM_H */
1518