From: <fr...@us...> - 2012-12-22 12:09:45
|
Revision: 4792 http://fuse-emulator.svn.sourceforge.net/fuse-emulator/?rev=4792&view=rev Author: fredm Date: 2012-12-22 12:09:33 +0000 (Sat, 22 Dec 2012) Log Message: ----------- Split SNET block into SNET, SNEF and SNER so that flash could theoretically be saved separately (patch #3596469) (Fred). Modified Paths: -------------- trunk/libspectrum/hacking/ChangeLog trunk/libspectrum/szx.c Modified: trunk/libspectrum/hacking/ChangeLog =================================================================== --- trunk/libspectrum/hacking/ChangeLog 2012-12-22 11:24:59 UTC (rev 4791) +++ trunk/libspectrum/hacking/ChangeLog 2012-12-22 12:09:33 UTC (rev 4792) @@ -912,3 +912,5 @@ 20121208 configure.ac,libspectrum.h.in: preliminary support for 64-bits binaries for Windows (patch #3591613) (Sergio). 20121208 README: document support for reading PZX files (Sergio). +20121222 szx.c: split SNET block into SNET, SNEF and SNER so that flash could + theoretically be saved separately (patch #3596469) (Fred). Modified: trunk/libspectrum/szx.c =================================================================== --- trunk/libspectrum/szx.c 2012-12-22 11:24:59 UTC (rev 4791) +++ trunk/libspectrum/szx.c 2012-12-22 12:09:33 UTC (rev 4792) @@ -199,9 +199,13 @@ static const libspectrum_word ZXSTSNET_ALL_DISABLED = 16; static const libspectrum_word ZXSTSNET_RST8_DISABLED = 32; static const libspectrum_word ZXSTSNET_DENY_DOWNSTREAM_A15 = 64; -static const libspectrum_word ZXSTSNET_FLASH_COMPRESSED = 128; -static const libspectrum_word ZXSTSNET_RAM_COMPRESSED = 256; +#define ZXSTBID_SPECTRANETFLASHPAGE "SNEF" +static const libspectrum_byte ZXSTSNEF_FLASH_COMPRESSED = 1; + +#define ZXSTBID_SPECTRANETRAMPAGE "SNER" +static const libspectrum_byte ZXSTSNER_RAM_COMPRESSED = 1; + static libspectrum_error read_chunk( libspectrum_snap *snap, libspectrum_word version, const libspectrum_byte **buffer, const libspectrum_byte *end, @@ -292,6 +296,12 @@ static libspectrum_error write_snet_chunk( libspectrum_byte **buffer, libspectrum_byte **ptr, size_t *length, libspectrum_snap *snap, int compress ); +static libspectrum_error +write_snef_chunk( libspectrum_byte **buffer, libspectrum_byte **ptr, + size_t *length, libspectrum_snap *snap, int compress ); +static libspectrum_error +write_sner_chunk( libspectrum_byte **buffer, libspectrum_byte **ptr, + size_t *length, libspectrum_snap *snap, int compress ); #ifdef HAVE_ZLIB_H @@ -1991,12 +2001,9 @@ szx_context *ctx GCC_UNUSED ) { libspectrum_word flags; - int flash_compressed, ram_compressed; - libspectrum_error error; libspectrum_byte *w5100; - size_t data_remaining; - if( data_length < 62 ) { + if( data_length < 54 ) { libspectrum_print_error( LIBSPECTRUM_ERROR_UNKNOWN, "read_snet_chunk: length %lu too short", (unsigned long)data_length @@ -2016,8 +2023,6 @@ libspectrum_snap_set_spectranet_all_traps_disabled( snap, flags & ZXSTSNET_ALL_DISABLED ); libspectrum_snap_set_spectranet_rst8_trap_disabled( snap, flags & ZXSTSNET_RST8_DISABLED ); libspectrum_snap_set_spectranet_deny_downstream_a15( snap, flags & ZXSTSNET_DENY_DOWNSTREAM_A15 ); - flash_compressed = flags & ZXSTSNET_FLASH_COMPRESSED; - ram_compressed = flags & ZXSTSNET_RAM_COMPRESSED; libspectrum_snap_set_spectranet_page_a( snap, **buffer ); (*buffer)++; libspectrum_snap_set_spectranet_page_b( snap, **buffer ); (*buffer)++; @@ -2030,13 +2035,65 @@ memcpy( w5100, *buffer, 0x30 ); (*buffer) += 0x30; - data_remaining = data_length - 54; + return LIBSPECTRUM_ERROR_NONE; +} +static libspectrum_error +read_snef_chunk( libspectrum_snap *snap, libspectrum_word version GCC_UNUSED, + const libspectrum_byte **buffer, + const libspectrum_byte *end GCC_UNUSED, size_t data_length, + szx_context *ctx GCC_UNUSED ) +{ + libspectrum_byte flags; + int flash_compressed; + libspectrum_error error; + size_t data_remaining; + + if( data_length < 5 ) { + libspectrum_print_error( + LIBSPECTRUM_ERROR_UNKNOWN, + "read_snef_chunk: length %lu too short", (unsigned long)data_length + ); + return LIBSPECTRUM_ERROR_UNKNOWN; + } + + flags = **buffer; (*buffer)++; + flash_compressed = flags & ZXSTSNEF_FLASH_COMPRESSED; + + data_remaining = data_length - 1; + error = read_snet_memory( snap, buffer, flash_compressed, &data_remaining, libspectrum_snap_set_spectranet_flash ); if( error ) return error; + return LIBSPECTRUM_ERROR_NONE; +} + +static libspectrum_error +read_sner_chunk( libspectrum_snap *snap, libspectrum_word version GCC_UNUSED, + const libspectrum_byte **buffer, + const libspectrum_byte *end GCC_UNUSED, size_t data_length, + szx_context *ctx GCC_UNUSED ) +{ + libspectrum_byte flags; + int ram_compressed; + libspectrum_error error; + size_t data_remaining; + + if( data_length < 5 ) { + libspectrum_print_error( + LIBSPECTRUM_ERROR_UNKNOWN, + "read_sner_chunk: length %lu too short", (unsigned long)data_length + ); + return LIBSPECTRUM_ERROR_UNKNOWN; + } + + flags = **buffer; (*buffer)++; + ram_compressed = flags & ZXSTSNER_RAM_COMPRESSED; + + data_remaining = data_length - 1; + error = read_snet_memory( snap, buffer, ram_compressed, &data_remaining, libspectrum_snap_set_spectranet_ram ); if( error ) @@ -2066,44 +2123,46 @@ static struct read_chunk_t read_chunks[] = { - { ZXSTBID_AY, read_ay_chunk }, - { ZXSTBID_BETA128, read_b128_chunk }, - { ZXSTBID_BETADISK, skip_chunk }, - { ZXSTBID_COVOX, skip_chunk }, - { ZXSTBID_CREATOR, read_crtr_chunk }, - { ZXSTBID_DIVIDE, read_dide_chunk }, - { ZXSTBID_DIVIDERAMPAGE, read_dirp_chunk }, - { ZXSTBID_DOCK, read_dock_chunk }, - { ZXSTBID_DSKFILE, skip_chunk }, - { ZXSTBID_GS, skip_chunk }, - { ZXSTBID_GSRAMPAGE, skip_chunk }, - { ZXSTBID_IF1, read_if1_chunk }, - { ZXSTBID_IF2ROM, read_if2r_chunk }, - { ZXSTBID_JOYSTICK, read_joy_chunk }, - { ZXSTBID_KEYBOARD, read_keyb_chunk }, - { ZXSTBID_MICRODRIVE, skip_chunk }, - { ZXSTBID_MOUSE, read_amxm_chunk }, - { ZXSTBID_MULTIFACE, skip_chunk }, - { ZXSTBID_OPUS, read_opus_chunk }, - { ZXSTBID_OPUSDISK, skip_chunk }, - { ZXSTBID_PLUS3DISK, skip_chunk }, - { ZXSTBID_PLUSD, read_plsd_chunk }, - { ZXSTBID_PLUSDDISK, skip_chunk }, - { ZXSTBID_RAMPAGE, read_ramp_chunk }, - { ZXSTBID_ROM, read_rom_chunk }, - { ZXSTBID_SIMPLEIDE, read_side_chunk }, - { ZXSTBID_SPECDRUM, read_drum_chunk }, - { ZXSTBID_SPECREGS, read_spcr_chunk }, - { ZXSTBID_SPECTRANET, read_snet_chunk }, - { ZXSTBID_TIMEXREGS, read_scld_chunk }, - { ZXSTBID_USPEECH, skip_chunk }, - { ZXSTBID_Z80REGS, read_z80r_chunk }, - { ZXSTBID_ZXATASPRAMPAGE, read_atrp_chunk }, - { ZXSTBID_ZXATASP, read_zxat_chunk }, - { ZXSTBID_ZXCF, read_zxcf_chunk }, - { ZXSTBID_ZXCFRAMPAGE, read_cfrp_chunk }, - { ZXSTBID_ZXPRINTER, skip_chunk }, - { ZXSTBID_ZXTAPE, skip_chunk }, + { ZXSTBID_AY, read_ay_chunk }, + { ZXSTBID_BETA128, read_b128_chunk }, + { ZXSTBID_BETADISK, skip_chunk }, + { ZXSTBID_COVOX, skip_chunk }, + { ZXSTBID_CREATOR, read_crtr_chunk }, + { ZXSTBID_DIVIDE, read_dide_chunk }, + { ZXSTBID_DIVIDERAMPAGE, read_dirp_chunk }, + { ZXSTBID_DOCK, read_dock_chunk }, + { ZXSTBID_DSKFILE, skip_chunk }, + { ZXSTBID_GS, skip_chunk }, + { ZXSTBID_GSRAMPAGE, skip_chunk }, + { ZXSTBID_IF1, read_if1_chunk }, + { ZXSTBID_IF2ROM, read_if2r_chunk }, + { ZXSTBID_JOYSTICK, read_joy_chunk }, + { ZXSTBID_KEYBOARD, read_keyb_chunk }, + { ZXSTBID_MICRODRIVE, skip_chunk }, + { ZXSTBID_MOUSE, read_amxm_chunk }, + { ZXSTBID_MULTIFACE, skip_chunk }, + { ZXSTBID_OPUS, read_opus_chunk }, + { ZXSTBID_OPUSDISK, skip_chunk }, + { ZXSTBID_PLUS3DISK, skip_chunk }, + { ZXSTBID_PLUSD, read_plsd_chunk }, + { ZXSTBID_PLUSDDISK, skip_chunk }, + { ZXSTBID_RAMPAGE, read_ramp_chunk }, + { ZXSTBID_ROM, read_rom_chunk }, + { ZXSTBID_SIMPLEIDE, read_side_chunk }, + { ZXSTBID_SPECDRUM, read_drum_chunk }, + { ZXSTBID_SPECREGS, read_spcr_chunk }, + { ZXSTBID_SPECTRANET, read_snet_chunk }, + { ZXSTBID_SPECTRANETFLASHPAGE, read_snef_chunk }, + { ZXSTBID_SPECTRANETRAMPAGE, read_sner_chunk }, + { ZXSTBID_TIMEXREGS, read_scld_chunk }, + { ZXSTBID_USPEECH, skip_chunk }, + { ZXSTBID_Z80REGS, read_z80r_chunk }, + { ZXSTBID_ZXATASPRAMPAGE, read_atrp_chunk }, + { ZXSTBID_ZXATASP, read_zxat_chunk }, + { ZXSTBID_ZXCF, read_zxcf_chunk }, + { ZXSTBID_ZXCFRAMPAGE, read_cfrp_chunk }, + { ZXSTBID_ZXPRINTER, skip_chunk }, + { ZXSTBID_ZXTAPE, skip_chunk }, }; @@ -2449,6 +2508,10 @@ if( libspectrum_snap_spectranet_active( snap ) ) { error = write_snet_chunk( buffer, &ptr, length, snap, compress ); if( error ) return error; + error = write_snef_chunk( buffer, &ptr, length, snap, compress ); + if( error ) return error; + error = write_sner_chunk( buffer, &ptr, length, snap, compress ); + if( error ) return error; } /* Set length to be actual length, not allocated length */ @@ -3617,6 +3680,43 @@ write_snet_chunk( libspectrum_byte **buffer, libspectrum_byte **ptr, size_t *length, libspectrum_snap *snap, int compress ) { + size_t block_size = 54; + libspectrum_word flags = 0; + + write_chunk_header( buffer, ptr, length, ZXSTBID_SPECTRANET, block_size ); + + if( libspectrum_snap_spectranet_paged( snap ) ) + flags |= ZXSTSNET_PAGED; + if( libspectrum_snap_spectranet_paged_via_io( snap ) ) + flags |= ZXSTSNET_PAGED_VIA_IO; + if( libspectrum_snap_spectranet_programmable_trap_active( snap ) ) + flags |= ZXSTSNET_PROGRAMMABLE_TRAP_ACTIVE; + if( libspectrum_snap_spectranet_programmable_trap_msb( snap ) ) + flags |= ZXSTSNET_PROGRAMMABLE_TRAP_MSB; + if( libspectrum_snap_spectranet_all_traps_disabled( snap ) ) + flags |= ZXSTSNET_ALL_DISABLED; + if( libspectrum_snap_spectranet_rst8_trap_disabled( snap ) ) + flags |= ZXSTSNET_RST8_DISABLED; + if( libspectrum_snap_spectranet_deny_downstream_a15( snap ) ) + flags |= ZXSTSNET_DENY_DOWNSTREAM_A15; + libspectrum_write_word( ptr, flags ); + + *(*ptr)++ = libspectrum_snap_spectranet_page_a( snap ); + *(*ptr)++ = libspectrum_snap_spectranet_page_b( snap ); + + libspectrum_write_word( ptr, + libspectrum_snap_spectranet_programmable_trap( snap ) ); + + memcpy( *ptr, libspectrum_snap_spectranet_w5100( snap, 0 ), 0x30 ); + (*ptr) += 0x30; + + return LIBSPECTRUM_ERROR_NONE; +} + +static libspectrum_error +write_snef_chunk( libspectrum_byte **buffer, libspectrum_byte **ptr, + size_t *length, libspectrum_snap *snap, int compress ) +{ #ifdef HAVE_ZLIB_H libspectrum_error error; #endif @@ -3626,20 +3726,12 @@ libspectrum_byte *compressed_flash_data = NULL; int flash_compressed = 0; - size_t ram_length; - libspectrum_byte *ram_data; - libspectrum_byte *compressed_ram_data = NULL; - int ram_compressed = 0; - size_t block_size; - libspectrum_word flags = 0; + libspectrum_byte flags = 0; flash_data = libspectrum_snap_spectranet_flash( snap, 0 ); flash_length = 0x20000; - ram_data = libspectrum_snap_spectranet_ram( snap, 0 ); - ram_length = 0x20000; - #ifdef HAVE_ZLIB_H if( compress ) { @@ -3655,13 +3747,58 @@ flash_data = compressed_flash_data; flash_length = compressed_length; } + } +#endif + + block_size = 5 + flash_length; + + write_chunk_header( buffer, ptr, length, ZXSTBID_SPECTRANETFLASHPAGE, + block_size ); + + if( flash_compressed ) + flags |= ZXSTSNEF_FLASH_COMPRESSED; + *(*ptr)++ = flags; + + libspectrum_write_dword( ptr, flash_length ); + memcpy( *ptr, flash_data, flash_length ); *ptr += flash_length; + + if( flash_compressed ) + libspectrum_free( compressed_flash_data ); + + return LIBSPECTRUM_ERROR_NONE; +} + +static libspectrum_error +write_sner_chunk( libspectrum_byte **buffer, libspectrum_byte **ptr, + size_t *length, libspectrum_snap *snap, int compress ) +{ +#ifdef HAVE_ZLIB_H + libspectrum_error error; +#endif + + size_t ram_length; + libspectrum_byte *ram_data; + libspectrum_byte *compressed_ram_data = NULL; + int ram_compressed = 0; + + size_t block_size; + libspectrum_byte flags = 0; + + ram_data = libspectrum_snap_spectranet_ram( snap, 0 ); + ram_length = 0x20000; + +#ifdef HAVE_ZLIB_H + + if( compress ) { + size_t compressed_length; + error = libspectrum_zlib_compress( ram_data, ram_length, &compressed_ram_data, &compressed_length ); if( error ) return error; if( compress & LIBSPECTRUM_FLAG_SNAPSHOT_ALWAYS_COMPRESS || - compressed_length < flash_length ) { + compressed_length < ram_length ) { ram_compressed = 1; ram_data = compressed_ram_data; ram_length = compressed_length; @@ -3670,48 +3807,18 @@ #endif - block_size = 62 + flash_length + ram_length; + block_size = 5 + ram_length; - write_chunk_header( buffer, ptr, length, ZXSTBID_SPECTRANET, block_size ); + write_chunk_header( buffer, ptr, length, ZXSTBID_SPECTRANETRAMPAGE, + block_size ); - if( libspectrum_snap_spectranet_paged( snap ) ) - flags |= ZXSTSNET_PAGED; - if( libspectrum_snap_spectranet_paged_via_io( snap ) ) - flags |= ZXSTSNET_PAGED_VIA_IO; - if( libspectrum_snap_spectranet_programmable_trap_active( snap ) ) - flags |= ZXSTSNET_PROGRAMMABLE_TRAP_ACTIVE; - if( libspectrum_snap_spectranet_programmable_trap_msb( snap ) ) - flags |= ZXSTSNET_PROGRAMMABLE_TRAP_MSB; - if( libspectrum_snap_spectranet_all_traps_disabled( snap ) ) - flags |= ZXSTSNET_ALL_DISABLED; - if( libspectrum_snap_spectranet_rst8_trap_disabled( snap ) ) - flags |= ZXSTSNET_RST8_DISABLED; - if( libspectrum_snap_spectranet_deny_downstream_a15( snap ) ) - flags |= ZXSTSNET_DENY_DOWNSTREAM_A15; - if( flash_compressed ) - flags |= ZXSTSNET_FLASH_COMPRESSED; if( ram_compressed ) - flags |= ZXSTSNET_RAM_COMPRESSED; - libspectrum_write_word( ptr, flags ); + flags |= ZXSTSNER_RAM_COMPRESSED; + *(*ptr)++ = flags; - *(*ptr)++ = libspectrum_snap_spectranet_page_a( snap ); - *(*ptr)++ = libspectrum_snap_spectranet_page_b( snap ); - - libspectrum_write_word( ptr, - libspectrum_snap_spectranet_programmable_trap( snap ) ); - - memcpy( *ptr, libspectrum_snap_spectranet_w5100( snap, 0 ), 0x30 ); - (*ptr) += 0x30; - - libspectrum_write_dword( ptr, flash_length ); - memcpy( *ptr, flash_data, flash_length ); *ptr += flash_length; - libspectrum_write_dword( ptr, ram_length ); memcpy( *ptr, ram_data, ram_length ); *ptr += ram_length; - if( flash_compressed ) - libspectrum_free( compressed_flash_data ); - if( ram_compressed ) libspectrum_free( compressed_ram_data ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |