From: <pa...@us...> - 2007-11-30 21:20:26
|
Revision: 3374 http://fuse-emulator.svn.sourceforge.net/fuse-emulator/?rev=3374&view=rev Author: pak21 Date: 2007-11-30 13:20:24 -0800 (Fri, 30 Nov 2007) Log Message: ----------- Add support for Pentagon 512 and 1024 snapshots. Modified Paths: -------------- trunk/libspectrum/hacking/ChangeLog trunk/libspectrum/libspectrum.c trunk/libspectrum/libspectrum.h.in trunk/libspectrum/szx.c Modified: trunk/libspectrum/hacking/ChangeLog =================================================================== --- trunk/libspectrum/hacking/ChangeLog 2007-11-30 13:57:09 UTC (rev 3373) +++ trunk/libspectrum/hacking/ChangeLog 2007-11-30 21:20:24 UTC (rev 3374) @@ -573,3 +573,5 @@ for .spc, .sta and .ltp tape images (feature request #1764995) (Stuart). 20071130 libspectrum.h.in: refer also to the DISCiPLE in comments (Stuart). +20071130 libspectrum.c,libspectrum.h.in,szx.c: add support for Pentagon 512 + and 1024 snapshots. Modified: trunk/libspectrum/libspectrum.c =================================================================== --- trunk/libspectrum/libspectrum.c 2007-11-30 13:57:09 UTC (rev 3373) +++ trunk/libspectrum/libspectrum.c 2007-11-30 21:20:24 UTC (rev 3374) @@ -262,6 +262,10 @@ /* SE-style memory paging */ const int LIBSPECTRUM_MACHINE_CAPABILITY_NTSC = 1 << 13; /* NTSC display */ +const int LIBSPECTRUM_MACHINE_CAPABILITY_PENT512_MEMORY = 1 << 14; + /* Pentagon 512-style memory paging */ +const int LIBSPECTRUM_MACHINE_CAPABILITY_PENT1024_MEMORY = 1 << 15; + /* Pentagon 1024-style memory paging */ /* Given a machine type, what features does it have? */ int @@ -402,6 +406,23 @@ break; } + /* Pentagon 512-style memory paging */ + switch( type ) { + case LIBSPECTRUM_MACHINE_PENT512: + case LIBSPECTRUM_MACHINE_PENT1024: + capabilities |= LIBSPECTRUM_MACHINE_CAPABILITY_PENT512_MEMORY; break; + default: + break; + } + + /* Pentagon 1024-style memory paging */ + switch( type ) { + case LIBSPECTRUM_MACHINE_PENT1024: + capabilities |= LIBSPECTRUM_MACHINE_CAPABILITY_PENT1024_MEMORY; break; + default: + break; + } + return capabilities; } Modified: trunk/libspectrum/libspectrum.h.in =================================================================== --- trunk/libspectrum/libspectrum.h.in 2007-11-30 13:57:09 UTC (rev 3373) +++ trunk/libspectrum/libspectrum.h.in 2007-11-30 21:20:24 UTC (rev 3374) @@ -289,6 +289,11 @@ LIBSPECTRUM_MACHINE_CAPABILITY_SE_MEMORY; /* SE-style memory paging */ extern const int WIN32_DLL LIBSPECTRUM_MACHINE_CAPABILITY_NTSC; /* NTSC display */ +extern const int WIN32_DLL +LIBSPECTRUM_MACHINE_CAPABILITY_PENT512_MEMORY; /* Pentagon 512 memory paging */ +extern const int WIN32_DLL +LIBSPECTRUM_MACHINE_CAPABILITY_PENT1024_MEMORY; + /* Pentagon 1024 memory paging */ /* Get the capabilities of a machine */ int WIN32_DLL libspectrum_machine_capabilities( libspectrum_machine type ); Modified: trunk/libspectrum/szx.c =================================================================== --- trunk/libspectrum/szx.c 2007-11-30 13:57:09 UTC (rev 3373) +++ trunk/libspectrum/szx.c 2007-11-30 21:20:24 UTC (rev 3374) @@ -30,35 +30,6 @@ #include "internals.h" -/* I've had to make some assumptions about the 'right' way to do some - things in the .szx format due to the documentation - <http://www.spectaculator.com/docs/zx-state/intro.shtml> not being - up to scratch: - - * http://www.spectaculator.com/docs/zx-state/header.shtml says - "chMinorVersion - Minor version number of the file format. Currently 1." - - despite the current version of the format being 1.2. libspectrum - writes .szx files with a minor version number of 3 as they contain - blocks not in the v1.2 specification. - - * The ZXSTSPECREGS block says that the ch1ffd member should be set - to zero for machines other than the +2A/+3. libspectrum makes - this field non-zero for Scorpion emulation. - - * In a ZXSTRAMPAGE block, the Timex machines should save the same - pages as the 48K machine, and RAM pages 8-15 are valid for - Scorpion emulation. - - Places where these points are used in the code are marked with - [Assumption]. - - I've mentioned these points to Jonathan Needle ('maintainer' of the - .szx format), but he hasn't replied :-( - -*/ - /* The machine numbers used in the .szx format */ typedef enum szx_machine_type { @@ -76,6 +47,8 @@ SZX_MACHINE_SCORPION, SZX_MACHINE_SE, SZX_MACHINE_TS2068, + SZX_MACHINE_PENTAGON512, + SZX_MACHINE_PENTAGON1024, } szx_machine_type; @@ -1265,6 +1238,14 @@ libspectrum_snap_set_machine( snap, LIBSPECTRUM_MACHINE_SE ); break; + case SZX_MACHINE_PENTAGON512: + libspectrum_snap_set_machine( snap, LIBSPECTRUM_MACHINE_PENT512 ); + break; + + case SZX_MACHINE_PENTAGON1024: + libspectrum_snap_set_machine( snap, LIBSPECTRUM_MACHINE_PENT1024 ); + break; + default: libspectrum_print_error( LIBSPECTRUM_MACHINE_UNKNOWN, @@ -1411,7 +1392,6 @@ memcpy( *ptr, signature, 4 ); *ptr += 4; - /* [Assumption] We currently write version 1.3 files (major, minor) */ *(*ptr)++ = SZX_VERSION_MAJOR; *(*ptr)++ = SZX_VERSION_MINOR; switch( libspectrum_snap_machine( snap ) ) { @@ -1423,16 +1403,14 @@ case LIBSPECTRUM_MACHINE_PLUS2A: **ptr = SZX_MACHINE_PLUS2A; break; case LIBSPECTRUM_MACHINE_PLUS3: **ptr = SZX_MACHINE_PLUS3; break; case LIBSPECTRUM_MACHINE_PLUS3E: **ptr = SZX_MACHINE_PLUS3E; break; - case LIBSPECTRUM_MACHINE_PENT: - case LIBSPECTRUM_MACHINE_PENT512: - case LIBSPECTRUM_MACHINE_PENT1024: - **ptr = SZX_MACHINE_PENTAGON; - break; + case LIBSPECTRUM_MACHINE_PENT: **ptr = SZX_MACHINE_PENTAGON; break; case LIBSPECTRUM_MACHINE_TC2048: **ptr = SZX_MACHINE_TC2048; break; case LIBSPECTRUM_MACHINE_TC2068: **ptr = SZX_MACHINE_TC2068; break; case LIBSPECTRUM_MACHINE_TS2068: **ptr = SZX_MACHINE_TS2068; break; case LIBSPECTRUM_MACHINE_SCORP: **ptr = SZX_MACHINE_SCORPION; break; - case LIBSPECTRUM_MACHINE_SE: **ptr = SZX_MACHINE_SE; break; + case LIBSPECTRUM_MACHINE_SE: **ptr = SZX_MACHINE_SE; break; + case LIBSPECTRUM_MACHINE_PENT512: **ptr = SZX_MACHINE_PENTAGON512; break; + case LIBSPECTRUM_MACHINE_PENT1024: **ptr = SZX_MACHINE_PENTAGON1024; break; case LIBSPECTRUM_MACHINE_UNKNOWN: libspectrum_print_error( LIBSPECTRUM_ERROR_LOGIC, @@ -1553,7 +1531,6 @@ *(*ptr)++ = '\0'; } - /* [Assumption] The Scorpion port 0x1ffd should be written here */ if( capabilities & LIBSPECTRUM_MACHINE_CAPABILITY_PLUS3_MEMORY || capabilities & LIBSPECTRUM_MACHINE_CAPABILITY_SCORP_MEMORY ) { *(*ptr)++ = libspectrum_snap_out_plus3_memoryport( snap ); @@ -1670,7 +1647,7 @@ size_t *length, libspectrum_snap *snap, int compress ) { libspectrum_machine machine; - int capabilities; + int i, capabilities; libspectrum_error error; machine = libspectrum_snap_machine( snap ); @@ -1679,7 +1656,6 @@ error = write_ramp_chunk( buffer, ptr, length, snap, 5, compress ); if( error ) return error; - /* [Assumption] This is the right way to write Timex machine RAM */ if( machine != LIBSPECTRUM_MACHINE_16 ) { error = write_ramp_chunk( buffer, ptr, length, snap, 2, compress ); if( error ) return error; @@ -1699,13 +1675,23 @@ error = write_ramp_chunk( buffer, ptr, length, snap, 7, compress ); if( error ) return error; - /* [Assumption] RAM pages 8-15 are valid here */ if( capabilities & LIBSPECTRUM_MACHINE_CAPABILITY_SCORP_MEMORY ) { - int i; for( i = 8; i < 16; i++ ) { error = write_ramp_chunk( buffer, ptr, length, snap, i, compress ); if( error ) return error; } + } else if( capabilities & LIBSPECTRUM_MACHINE_CAPABILITY_PENT512_MEMORY ) { + for( i = 8; i < 32; i++ ) { + error = write_ramp_chunk( buffer, ptr, length, snap, i, compress ); + if( error ) return error; + } + + if( capabilities & LIBSPECTRUM_MACHINE_CAPABILITY_PENT1024_MEMORY ) { + for( i = 32; i < 64; i++ ) { + error = write_ramp_chunk( buffer, ptr, length, snap, i, compress ); + if( error ) return error; + } + } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |