2001-12-27 19:54:36 +00:00
|
|
|
//============================================================================
|
|
|
|
//
|
|
|
|
// MM MM 6666 555555 0000 2222
|
|
|
|
// MMMM MMMM 66 66 55 00 00 22 22
|
|
|
|
// MM MMM MM 66 55 00 00 22
|
|
|
|
// MM M MM 66666 55555 00 00 22222 -- "A 6502 Microprocessor Emulator"
|
|
|
|
// MM MM 66 66 55 00 00 22
|
|
|
|
// MM MM 66 66 55 55 00 00 22
|
|
|
|
// MM MM 6666 5555 0000 222222
|
|
|
|
//
|
2010-01-10 03:23:32 +00:00
|
|
|
// Copyright (c) 1995-2010 by Bradford W. Mott and the Stella Team
|
2001-12-27 19:54:36 +00:00
|
|
|
//
|
2010-01-10 03:23:32 +00:00
|
|
|
// See the file "License.txt" for information on usage and redistribution of
|
2001-12-27 19:54:36 +00:00
|
|
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
|
|
|
//
|
2009-05-13 13:55:40 +00:00
|
|
|
// $Id$
|
2001-12-27 19:54:36 +00:00
|
|
|
//============================================================================
|
|
|
|
|
|
|
|
#ifndef SYSTEM_HXX
|
|
|
|
#define SYSTEM_HXX
|
|
|
|
|
|
|
|
class Device;
|
|
|
|
class M6502;
|
2008-02-19 12:33:07 +00:00
|
|
|
class M6532;
|
2005-07-09 12:52:46 +00:00
|
|
|
class TIA;
|
2001-12-27 19:54:36 +00:00
|
|
|
class NullDevice;
|
|
|
|
|
|
|
|
#include "bspf.hxx"
|
|
|
|
#include "Device.hxx"
|
|
|
|
#include "NullDev.hxx"
|
2009-11-08 01:39:05 +00:00
|
|
|
#include "Random.hxx"
|
OK, another huge commit. I need to commit this now, because things are
starting to go out of sync on my development machines. OK, where to
begin ...
Changed state file format, so older state files will no longer work. The
changes aren't finalized yet, so expect more breakage.
Added getByte() and putByte() methods to serialized data, resulting in
smaller state files (previously, 1-byte values were stored as 4-byte ints).
Totally reworked controller handling code. Controller state is now
explicitly set with an ::update() method, making it easier to serialize.
Some work is still required on the serialization stuff for more advanced
controllers.
Added a 'Serializable' interface to all carts, device, controllers, etc
that can be (de)serialized. This fixes a long-standing design issue
which I personally caused many years ago.
Console switches state (SWCHB register) is now saved to state files.
Added beginnings of movie support. Basically, this saves an initial
state file, and thereafter continuously saves controller and console
switches state. Support is still somewhat rough and there's no UI for
it, but it does successfully save and later load/play state movies.
Removed specific events for driving controllers, and have them use
joystick events instead. This has the nice side effect that
joystick direction remapping 'just works' for driving controllers too.
Fixed issues with paddle emulation seen in 'Night Driver' ROM. Related
to this, removed a hack wrt paddles when grabmouse is enabled. There's
still some work to do when using the mouse to emulate paddles, but the
Stelladaptor and real paddles work fine.
Added beginnings of TrackBall CX-22 controller emulation. It doesn't
actually do anything yet, but the class is there :)
Probably some other stuff that I'm forgetting ...
git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@1385 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
2007-10-03 21:41:19 +00:00
|
|
|
#include "Serializable.hxx"
|
2001-12-27 19:54:36 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
This class represents a system consisting of a 6502 microprocessor
|
|
|
|
and a set of devices. The devices are mapped into an addressing
|
|
|
|
space of 2^n bytes (1 <= n <= 16). The addressing space is broken
|
|
|
|
into 2^m byte pages (1 <= m <= n), where a page is the smallest unit
|
|
|
|
a device can use when installing itself in the system.
|
|
|
|
|
|
|
|
In general the addressing space will be 8192 (2^13) bytes for a
|
|
|
|
6507 based system and 65536 (2^16) bytes for a 6502 based system.
|
|
|
|
|
|
|
|
TODO: To allow for dynamic code generation we probably need to
|
|
|
|
add a tag to each page that indicates if it is read only
|
|
|
|
memory. We also need to notify the processor anytime a
|
|
|
|
page access method is changed so that it can clear the
|
|
|
|
dynamic code for that page of memory.
|
|
|
|
|
|
|
|
@author Bradford W. Mott
|
2009-05-13 13:55:40 +00:00
|
|
|
@version $Id$
|
2001-12-27 19:54:36 +00:00
|
|
|
*/
|
OK, another huge commit. I need to commit this now, because things are
starting to go out of sync on my development machines. OK, where to
begin ...
Changed state file format, so older state files will no longer work. The
changes aren't finalized yet, so expect more breakage.
Added getByte() and putByte() methods to serialized data, resulting in
smaller state files (previously, 1-byte values were stored as 4-byte ints).
Totally reworked controller handling code. Controller state is now
explicitly set with an ::update() method, making it easier to serialize.
Some work is still required on the serialization stuff for more advanced
controllers.
Added a 'Serializable' interface to all carts, device, controllers, etc
that can be (de)serialized. This fixes a long-standing design issue
which I personally caused many years ago.
Console switches state (SWCHB register) is now saved to state files.
Added beginnings of movie support. Basically, this saves an initial
state file, and thereafter continuously saves controller and console
switches state. Support is still somewhat rough and there's no UI for
it, but it does successfully save and later load/play state movies.
Removed specific events for driving controllers, and have them use
joystick events instead. This has the nice side effect that
joystick direction remapping 'just works' for driving controllers too.
Fixed issues with paddle emulation seen in 'Night Driver' ROM. Related
to this, removed a hack wrt paddles when grabmouse is enabled. There's
still some work to do when using the mouse to emulate paddles, but the
Stelladaptor and real paddles work fine.
Added beginnings of TrackBall CX-22 controller emulation. It doesn't
actually do anything yet, but the class is there :)
Probably some other stuff that I'm forgetting ...
git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@1385 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
2007-10-03 21:41:19 +00:00
|
|
|
class System : public Serializable
|
2001-12-27 19:54:36 +00:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
/**
|
|
|
|
Create a new system with an addressing space of 2^n bytes and
|
|
|
|
pages of 2^m bytes.
|
|
|
|
|
|
|
|
@param n Log base 2 of the addressing space size
|
|
|
|
@param m Log base 2 of the page size
|
|
|
|
*/
|
|
|
|
System(uInt16 n, uInt16 m);
|
|
|
|
|
|
|
|
/**
|
|
|
|
Destructor
|
|
|
|
*/
|
|
|
|
virtual ~System();
|
|
|
|
|
|
|
|
public:
|
|
|
|
/**
|
|
|
|
Reset the system cycle counter, the attached devices, and the
|
|
|
|
attached processor of the system.
|
|
|
|
*/
|
|
|
|
void reset();
|
|
|
|
|
|
|
|
/**
|
|
|
|
Attach the specified device and claim ownership of it. The device
|
|
|
|
will be asked to install itself.
|
|
|
|
|
|
|
|
@param device The device to attach to the system
|
|
|
|
*/
|
|
|
|
void attach(Device* device);
|
|
|
|
|
|
|
|
/**
|
|
|
|
Attach the specified processor and claim ownership of it. The
|
|
|
|
processor will be asked to install itself.
|
|
|
|
|
|
|
|
@param m6502 The 6502 microprocessor to attach to the system
|
|
|
|
*/
|
|
|
|
void attach(M6502* m6502);
|
|
|
|
|
2008-02-19 12:33:07 +00:00
|
|
|
/**
|
|
|
|
Attach the specified processor and claim ownership of it. The
|
|
|
|
processor will be asked to install itself.
|
|
|
|
|
|
|
|
@param m6532 The 6532 microprocessor to attach to the system
|
|
|
|
*/
|
|
|
|
void attach(M6532* m6532);
|
|
|
|
|
2005-07-09 12:52:46 +00:00
|
|
|
/**
|
|
|
|
Attach the specified TIA device and claim ownership of it. The device
|
|
|
|
will be asked to install itself.
|
|
|
|
|
|
|
|
@param tia The TIA device to attach to the system
|
|
|
|
*/
|
|
|
|
void attach(TIA* tia);
|
|
|
|
|
2001-12-27 19:54:36 +00:00
|
|
|
public:
|
|
|
|
/**
|
|
|
|
Answer the 6502 microprocessor attached to the system. If a
|
|
|
|
processor has not been attached calling this function will fail.
|
|
|
|
|
|
|
|
@return The attached 6502 microprocessor
|
|
|
|
*/
|
|
|
|
M6502& m6502()
|
|
|
|
{
|
|
|
|
return *myM6502;
|
|
|
|
}
|
|
|
|
|
2008-02-19 12:33:07 +00:00
|
|
|
/**
|
|
|
|
Answer the 6532 processor attached to the system. If a
|
|
|
|
processor has not been attached calling this function will fail.
|
|
|
|
|
|
|
|
@return The attached 6532 microprocessor
|
|
|
|
*/
|
|
|
|
M6532& m6532()
|
|
|
|
{
|
|
|
|
return *myM6532;
|
|
|
|
}
|
|
|
|
|
2005-07-09 12:52:46 +00:00
|
|
|
/**
|
|
|
|
Answer the TIA device attached to the system.
|
|
|
|
|
|
|
|
@return The attached TIA device
|
|
|
|
*/
|
|
|
|
TIA& tia()
|
|
|
|
{
|
|
|
|
return *myTIA;
|
|
|
|
}
|
|
|
|
|
2009-11-08 01:39:05 +00:00
|
|
|
/**
|
|
|
|
Answer the random generator attached to the system.
|
|
|
|
|
|
|
|
@return The random generator
|
|
|
|
*/
|
|
|
|
Random& randGenerator()
|
|
|
|
{
|
|
|
|
return *myRandom;
|
|
|
|
}
|
|
|
|
|
2001-12-27 19:54:36 +00:00
|
|
|
/**
|
|
|
|
Get the null device associated with the system. Every system
|
|
|
|
has a null device associated with it that's used by pages which
|
|
|
|
aren't mapped to "real" devices.
|
|
|
|
|
|
|
|
@return The null device associated with the system
|
|
|
|
*/
|
|
|
|
NullDevice& nullDevice()
|
|
|
|
{
|
|
|
|
return myNullDevice;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Get the total number of pages available in the system.
|
|
|
|
|
|
|
|
@return The total number of pages available
|
|
|
|
*/
|
|
|
|
uInt16 numberOfPages() const
|
|
|
|
{
|
|
|
|
return myNumberOfPages;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Get the amount to right shift an address by to obtain its page.
|
|
|
|
|
|
|
|
@return The amount to right shift an address by to get its page
|
|
|
|
*/
|
|
|
|
uInt16 pageShift() const
|
|
|
|
{
|
|
|
|
return myPageShift;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Get the mask to apply to an address to obtain its page offset.
|
|
|
|
|
|
|
|
@return The mask to apply to an address to obtain its page offset
|
|
|
|
*/
|
|
|
|
uInt16 pageMask() const
|
|
|
|
{
|
|
|
|
return myPageMask;
|
|
|
|
}
|
|
|
|
|
|
|
|
public:
|
|
|
|
/**
|
|
|
|
Get the number of system cycles which have passed since the last
|
|
|
|
time cycles were reset or the system was reset.
|
|
|
|
|
|
|
|
@return The number of system cycles which have passed
|
|
|
|
*/
|
2006-02-10 13:14:20 +00:00
|
|
|
uInt32 cycles() const
|
2001-12-27 19:54:36 +00:00
|
|
|
{
|
|
|
|
return myCycles;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Increment the system cycles by the specified number of cycles.
|
|
|
|
|
|
|
|
@param amount The amount to add to the system cycles counter
|
|
|
|
*/
|
2006-02-10 13:14:20 +00:00
|
|
|
void incrementCycles(uInt32 amount)
|
2001-12-27 19:54:36 +00:00
|
|
|
{
|
|
|
|
myCycles += amount;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Reset the system cycle count to zero. The first thing that
|
|
|
|
happens is that all devices are notified of the reset by invoking
|
|
|
|
their systemCyclesReset method then the system cycle count is
|
|
|
|
reset to zero.
|
|
|
|
*/
|
|
|
|
void resetCycles();
|
|
|
|
|
|
|
|
public:
|
2001-12-30 18:36:02 +00:00
|
|
|
/**
|
|
|
|
Get the current state of the data bus in the system. The current
|
|
|
|
state is the last data that was accessed by the system.
|
|
|
|
|
2009-11-08 01:39:05 +00:00
|
|
|
@return The data bus state
|
2001-12-30 18:36:02 +00:00
|
|
|
*/
|
OK, another huge commit. I need to commit this now, because things are
starting to go out of sync on my development machines. OK, where to
begin ...
Changed state file format, so older state files will no longer work. The
changes aren't finalized yet, so expect more breakage.
Added getByte() and putByte() methods to serialized data, resulting in
smaller state files (previously, 1-byte values were stored as 4-byte ints).
Totally reworked controller handling code. Controller state is now
explicitly set with an ::update() method, making it easier to serialize.
Some work is still required on the serialization stuff for more advanced
controllers.
Added a 'Serializable' interface to all carts, device, controllers, etc
that can be (de)serialized. This fixes a long-standing design issue
which I personally caused many years ago.
Console switches state (SWCHB register) is now saved to state files.
Added beginnings of movie support. Basically, this saves an initial
state file, and thereafter continuously saves controller and console
switches state. Support is still somewhat rough and there's no UI for
it, but it does successfully save and later load/play state movies.
Removed specific events for driving controllers, and have them use
joystick events instead. This has the nice side effect that
joystick direction remapping 'just works' for driving controllers too.
Fixed issues with paddle emulation seen in 'Night Driver' ROM. Related
to this, removed a hack wrt paddles when grabmouse is enabled. There's
still some work to do when using the mouse to emulate paddles, but the
Stelladaptor and real paddles work fine.
Added beginnings of TrackBall CX-22 controller emulation. It doesn't
actually do anything yet, but the class is there :)
Probably some other stuff that I'm forgetting ...
git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@1385 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
2007-10-03 21:41:19 +00:00
|
|
|
inline uInt8 getDataBusState() const
|
|
|
|
{
|
|
|
|
return myDataBusState;
|
|
|
|
}
|
2001-12-30 18:36:02 +00:00
|
|
|
|
2009-11-08 01:39:05 +00:00
|
|
|
/**
|
|
|
|
Get the current state of the data bus in the system, taking into
|
|
|
|
account that certain bits are in Z-state (undriven). In those
|
|
|
|
cases, the bits are floating, but will usually be the same as the
|
|
|
|
last data bus value (the 'usually' is emulated by randomly driving
|
|
|
|
certain bits high).
|
|
|
|
|
|
|
|
However, some CMOS EPROM chips always drive Z-state bits high.
|
|
|
|
This is emulated by hmask, which specifies to push a specific
|
|
|
|
Z-state bit high.
|
|
|
|
|
|
|
|
@param zmask The bits which are in Z-state
|
|
|
|
@param hmask The bits which should always be driven high
|
|
|
|
@return The data bus state
|
|
|
|
*/
|
|
|
|
inline uInt8 getDataBusState(uInt8 zmask, uInt8 hmask = 0x00)
|
|
|
|
{
|
|
|
|
// For the pins that are floating, randomly decide which are high or low
|
|
|
|
// Otherwise, they're specifically driven high
|
|
|
|
return (myDataBusState | (myRandom->next() | hmask)) & zmask;
|
|
|
|
}
|
|
|
|
|
2001-12-30 18:36:02 +00:00
|
|
|
/**
|
2001-12-27 19:54:36 +00:00
|
|
|
Get the byte at the specified address. No masking of the
|
|
|
|
address occurs before it's sent to the device mapped at
|
|
|
|
the address.
|
|
|
|
|
|
|
|
@return The byte at the specified address
|
|
|
|
*/
|
|
|
|
uInt8 peek(uInt16 address);
|
|
|
|
|
|
|
|
/**
|
|
|
|
Change the byte at the specified address to the given value.
|
|
|
|
No masking of the address occurs before it's sent to the device
|
|
|
|
mapped at the address.
|
|
|
|
|
2010-03-26 00:59:56 +00:00
|
|
|
This method sets the 'page dirty' flag for direct-access pokes.
|
|
|
|
If the device has taken responsibility for handling the poke,
|
|
|
|
it must also update the 'page dirty' flag with a call to
|
|
|
|
System::setDirtyAddress().
|
|
|
|
|
2001-12-27 19:54:36 +00:00
|
|
|
@param address The address where the value should be stored
|
|
|
|
@param value The value to be stored at the address
|
|
|
|
*/
|
|
|
|
void poke(uInt16 address, uInt8 value);
|
|
|
|
|
2005-07-09 23:44:08 +00:00
|
|
|
/**
|
|
|
|
Lock/unlock the data bus. When the bus is locked, peek() and
|
|
|
|
poke() don't update the bus state. The bus should be unlocked
|
|
|
|
while the CPU is running (normal emulation, or when the debugger
|
|
|
|
is stepping/advancing). It should be locked while the debugger
|
|
|
|
is active but not running the CPU. This is so the debugger can
|
|
|
|
use System.peek() to examine memory/registers without changing
|
|
|
|
the state of the system.
|
|
|
|
*/
|
|
|
|
void lockDataBus();
|
|
|
|
void unlockDataBus();
|
|
|
|
|
2001-12-27 19:54:36 +00:00
|
|
|
public:
|
|
|
|
/**
|
|
|
|
Structure used to specify access methods for a page
|
|
|
|
*/
|
|
|
|
struct PageAccess
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
Pointer to a block of memory or the null pointer. The null pointer
|
|
|
|
indicates that the device's peek method should be invoked for reads
|
|
|
|
to this page, while other values are the base address of an array
|
|
|
|
to directly access for reads to this page.
|
|
|
|
*/
|
|
|
|
uInt8* directPeekBase;
|
|
|
|
|
|
|
|
/**
|
|
|
|
Pointer to a block of memory or the null pointer. The null pointer
|
|
|
|
indicates that the device's poke method should be invoked for writes
|
|
|
|
to this page, while other values are the base address of an array
|
|
|
|
to directly access for pokes to this page.
|
|
|
|
*/
|
|
|
|
uInt8* directPokeBase;
|
|
|
|
|
|
|
|
/**
|
|
|
|
Pointer to the device associated with this page or to the system's
|
|
|
|
null device if the page hasn't been mapped to a device
|
|
|
|
*/
|
|
|
|
Device* device;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
Set the page accessing method for the specified page.
|
|
|
|
|
|
|
|
@param page The page accessing methods should be set for
|
|
|
|
@param access The accessing methods to be used by the page
|
|
|
|
*/
|
|
|
|
void setPageAccess(uInt16 page, const PageAccess& access);
|
|
|
|
|
|
|
|
/**
|
|
|
|
Get the page accessing method for the specified page.
|
|
|
|
|
|
|
|
@param page The page to get accessing methods for
|
|
|
|
@return The accessing methods used by the page
|
|
|
|
*/
|
2010-03-26 01:33:40 +00:00
|
|
|
const PageAccess& getPageAccess(uInt16 page) const;
|
2001-12-27 19:54:36 +00:00
|
|
|
|
2010-03-26 00:59:56 +00:00
|
|
|
/**
|
|
|
|
Mark the page containing this address as being dirty.
|
|
|
|
|
|
|
|
@param addr Determines the page that is dirty
|
|
|
|
*/
|
2010-03-26 01:33:40 +00:00
|
|
|
void setDirtyPage(uInt16 addr);
|
2010-03-26 00:59:56 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
Answer whether any pages in given range of addresses have been
|
|
|
|
marked as dirty.
|
|
|
|
|
|
|
|
@param start_addr The start address; determines the start page
|
|
|
|
@param end_addr The end address; determines the end page
|
|
|
|
*/
|
2010-03-26 01:33:40 +00:00
|
|
|
bool isPageDirty(uInt16 start_addr, uInt16 end_addr) const;
|
2010-03-26 00:59:56 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
Mark all pages as clean (ie, turn off the dirty flag).
|
|
|
|
*/
|
2010-03-26 01:33:40 +00:00
|
|
|
void clearDirtyPages();
|
2010-03-26 00:59:56 +00:00
|
|
|
|
OK, another huge commit. I need to commit this now, because things are
starting to go out of sync on my development machines. OK, where to
begin ...
Changed state file format, so older state files will no longer work. The
changes aren't finalized yet, so expect more breakage.
Added getByte() and putByte() methods to serialized data, resulting in
smaller state files (previously, 1-byte values were stored as 4-byte ints).
Totally reworked controller handling code. Controller state is now
explicitly set with an ::update() method, making it easier to serialize.
Some work is still required on the serialization stuff for more advanced
controllers.
Added a 'Serializable' interface to all carts, device, controllers, etc
that can be (de)serialized. This fixes a long-standing design issue
which I personally caused many years ago.
Console switches state (SWCHB register) is now saved to state files.
Added beginnings of movie support. Basically, this saves an initial
state file, and thereafter continuously saves controller and console
switches state. Support is still somewhat rough and there's no UI for
it, but it does successfully save and later load/play state movies.
Removed specific events for driving controllers, and have them use
joystick events instead. This has the nice side effect that
joystick direction remapping 'just works' for driving controllers too.
Fixed issues with paddle emulation seen in 'Night Driver' ROM. Related
to this, removed a hack wrt paddles when grabmouse is enabled. There's
still some work to do when using the mouse to emulate paddles, but the
Stelladaptor and real paddles work fine.
Added beginnings of TrackBall CX-22 controller emulation. It doesn't
actually do anything yet, but the class is there :)
Probably some other stuff that I'm forgetting ...
git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@1385 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
2007-10-03 21:41:19 +00:00
|
|
|
/**
|
|
|
|
Save the current state of this system to the given Serializer.
|
|
|
|
|
|
|
|
@param out The Serializer object to use
|
|
|
|
@return False on any errors, else true
|
|
|
|
*/
|
|
|
|
bool save(Serializer& out) const;
|
|
|
|
|
|
|
|
/**
|
OK, this looks like a huge update, but it's only because of some Serializer
class reworking. Serializer class now handles read/write of state from
files as well as in-memory streams. As a result, Deserializer class has
been removed.
Added state rewinding to the debugger. For now, this is limited to 100
levels of undo, with a new state generated each time a step/trace/frame/
scanline advance is performed. The undo level is 'rolling', in that it
remembers the last 100 levels (so you lose the oldest states when you
start adding more than 100). For now, this is tied to the 'Alt-r' key
in the debugger. Still TODO is add a button for it, and clean up some
TIA output issues when rewinding.
Added support for 6K version of Supercharger ROMs (this fixes issues
with the 6K version of Cubis).
Cleaned up the Serializable infrastructure, making sure that all
classes that need to implement it actually do so now.
Fixed issue with editable widgets in the UI, where pressing Enter
on the keypad wasn't actually being registered.
git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@1849 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
2009-08-05 16:05:34 +00:00
|
|
|
Load the current state of this system from the given Serializer.
|
OK, another huge commit. I need to commit this now, because things are
starting to go out of sync on my development machines. OK, where to
begin ...
Changed state file format, so older state files will no longer work. The
changes aren't finalized yet, so expect more breakage.
Added getByte() and putByte() methods to serialized data, resulting in
smaller state files (previously, 1-byte values were stored as 4-byte ints).
Totally reworked controller handling code. Controller state is now
explicitly set with an ::update() method, making it easier to serialize.
Some work is still required on the serialization stuff for more advanced
controllers.
Added a 'Serializable' interface to all carts, device, controllers, etc
that can be (de)serialized. This fixes a long-standing design issue
which I personally caused many years ago.
Console switches state (SWCHB register) is now saved to state files.
Added beginnings of movie support. Basically, this saves an initial
state file, and thereafter continuously saves controller and console
switches state. Support is still somewhat rough and there's no UI for
it, but it does successfully save and later load/play state movies.
Removed specific events for driving controllers, and have them use
joystick events instead. This has the nice side effect that
joystick direction remapping 'just works' for driving controllers too.
Fixed issues with paddle emulation seen in 'Night Driver' ROM. Related
to this, removed a hack wrt paddles when grabmouse is enabled. There's
still some work to do when using the mouse to emulate paddles, but the
Stelladaptor and real paddles work fine.
Added beginnings of TrackBall CX-22 controller emulation. It doesn't
actually do anything yet, but the class is there :)
Probably some other stuff that I'm forgetting ...
git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@1385 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
2007-10-03 21:41:19 +00:00
|
|
|
|
OK, this looks like a huge update, but it's only because of some Serializer
class reworking. Serializer class now handles read/write of state from
files as well as in-memory streams. As a result, Deserializer class has
been removed.
Added state rewinding to the debugger. For now, this is limited to 100
levels of undo, with a new state generated each time a step/trace/frame/
scanline advance is performed. The undo level is 'rolling', in that it
remembers the last 100 levels (so you lose the oldest states when you
start adding more than 100). For now, this is tied to the 'Alt-r' key
in the debugger. Still TODO is add a button for it, and clean up some
TIA output issues when rewinding.
Added support for 6K version of Supercharger ROMs (this fixes issues
with the 6K version of Cubis).
Cleaned up the Serializable infrastructure, making sure that all
classes that need to implement it actually do so now.
Fixed issue with editable widgets in the UI, where pressing Enter
on the keypad wasn't actually being registered.
git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@1849 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
2009-08-05 16:05:34 +00:00
|
|
|
@param in The Serializer object to use
|
OK, another huge commit. I need to commit this now, because things are
starting to go out of sync on my development machines. OK, where to
begin ...
Changed state file format, so older state files will no longer work. The
changes aren't finalized yet, so expect more breakage.
Added getByte() and putByte() methods to serialized data, resulting in
smaller state files (previously, 1-byte values were stored as 4-byte ints).
Totally reworked controller handling code. Controller state is now
explicitly set with an ::update() method, making it easier to serialize.
Some work is still required on the serialization stuff for more advanced
controllers.
Added a 'Serializable' interface to all carts, device, controllers, etc
that can be (de)serialized. This fixes a long-standing design issue
which I personally caused many years ago.
Console switches state (SWCHB register) is now saved to state files.
Added beginnings of movie support. Basically, this saves an initial
state file, and thereafter continuously saves controller and console
switches state. Support is still somewhat rough and there's no UI for
it, but it does successfully save and later load/play state movies.
Removed specific events for driving controllers, and have them use
joystick events instead. This has the nice side effect that
joystick direction remapping 'just works' for driving controllers too.
Fixed issues with paddle emulation seen in 'Night Driver' ROM. Related
to this, removed a hack wrt paddles when grabmouse is enabled. There's
still some work to do when using the mouse to emulate paddles, but the
Stelladaptor and real paddles work fine.
Added beginnings of TrackBall CX-22 controller emulation. It doesn't
actually do anything yet, but the class is there :)
Probably some other stuff that I'm forgetting ...
git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@1385 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
2007-10-03 21:41:19 +00:00
|
|
|
@return False on any errors, else true
|
|
|
|
*/
|
OK, this looks like a huge update, but it's only because of some Serializer
class reworking. Serializer class now handles read/write of state from
files as well as in-memory streams. As a result, Deserializer class has
been removed.
Added state rewinding to the debugger. For now, this is limited to 100
levels of undo, with a new state generated each time a step/trace/frame/
scanline advance is performed. The undo level is 'rolling', in that it
remembers the last 100 levels (so you lose the oldest states when you
start adding more than 100). For now, this is tied to the 'Alt-r' key
in the debugger. Still TODO is add a button for it, and clean up some
TIA output issues when rewinding.
Added support for 6K version of Supercharger ROMs (this fixes issues
with the 6K version of Cubis).
Cleaned up the Serializable infrastructure, making sure that all
classes that need to implement it actually do so now.
Fixed issue with editable widgets in the UI, where pressing Enter
on the keypad wasn't actually being registered.
git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@1849 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
2009-08-05 16:05:34 +00:00
|
|
|
bool load(Serializer& in);
|
OK, another huge commit. I need to commit this now, because things are
starting to go out of sync on my development machines. OK, where to
begin ...
Changed state file format, so older state files will no longer work. The
changes aren't finalized yet, so expect more breakage.
Added getByte() and putByte() methods to serialized data, resulting in
smaller state files (previously, 1-byte values were stored as 4-byte ints).
Totally reworked controller handling code. Controller state is now
explicitly set with an ::update() method, making it easier to serialize.
Some work is still required on the serialization stuff for more advanced
controllers.
Added a 'Serializable' interface to all carts, device, controllers, etc
that can be (de)serialized. This fixes a long-standing design issue
which I personally caused many years ago.
Console switches state (SWCHB register) is now saved to state files.
Added beginnings of movie support. Basically, this saves an initial
state file, and thereafter continuously saves controller and console
switches state. Support is still somewhat rough and there's no UI for
it, but it does successfully save and later load/play state movies.
Removed specific events for driving controllers, and have them use
joystick events instead. This has the nice side effect that
joystick direction remapping 'just works' for driving controllers too.
Fixed issues with paddle emulation seen in 'Night Driver' ROM. Related
to this, removed a hack wrt paddles when grabmouse is enabled. There's
still some work to do when using the mouse to emulate paddles, but the
Stelladaptor and real paddles work fine.
Added beginnings of TrackBall CX-22 controller emulation. It doesn't
actually do anything yet, but the class is there :)
Probably some other stuff that I'm forgetting ...
git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@1385 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
2007-10-03 21:41:19 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
Get a descriptor for the device name (used in error checking).
|
|
|
|
|
|
|
|
@return The name of the object
|
|
|
|
*/
|
|
|
|
virtual string name() const { return "System"; }
|
|
|
|
|
2001-12-27 19:54:36 +00:00
|
|
|
private:
|
|
|
|
// Mask to apply to an address before accessing memory
|
|
|
|
const uInt16 myAddressMask;
|
|
|
|
|
|
|
|
// Amount to shift an address by to determine what page it's on
|
|
|
|
const uInt16 myPageShift;
|
|
|
|
|
|
|
|
// Mask to apply to an address to obtain its page offset
|
|
|
|
const uInt16 myPageMask;
|
|
|
|
|
|
|
|
// Number of pages in the system
|
|
|
|
const uInt16 myNumberOfPages;
|
|
|
|
|
|
|
|
// Pointer to a dynamically allocated array of PageAccess structures
|
|
|
|
PageAccess* myPageAccessTable;
|
|
|
|
|
2010-03-26 00:59:56 +00:00
|
|
|
// Pointer to a dynamically allocated array for dirty pages
|
|
|
|
bool* myPageIsDirtyTable;
|
|
|
|
|
2001-12-27 19:54:36 +00:00
|
|
|
// Array of all the devices attached to the system
|
|
|
|
Device* myDevices[100];
|
|
|
|
|
|
|
|
// Number of devices attached to the system
|
|
|
|
uInt32 myNumberOfDevices;
|
|
|
|
|
|
|
|
// 6502 processor attached to the system or the null pointer
|
|
|
|
M6502* myM6502;
|
|
|
|
|
2008-02-19 12:33:07 +00:00
|
|
|
// 6532 processor attached to the system or the null pointer
|
|
|
|
M6532* myM6532;
|
|
|
|
|
2005-07-09 12:52:46 +00:00
|
|
|
// TIA device attached to the system or the null pointer
|
|
|
|
TIA* myTIA;
|
|
|
|
|
2009-11-08 01:39:05 +00:00
|
|
|
// Many devices need a source of random numbers, usually for emulating
|
|
|
|
// unknown/undefined behaviour
|
|
|
|
Random* myRandom;
|
|
|
|
|
2001-12-27 19:54:36 +00:00
|
|
|
// Number of system cycles executed since the last reset
|
|
|
|
uInt32 myCycles;
|
|
|
|
|
|
|
|
// Null device to use for page which are not installed
|
|
|
|
NullDevice myNullDevice;
|
|
|
|
|
2001-12-30 18:36:02 +00:00
|
|
|
// The current state of the Data Bus
|
|
|
|
uInt8 myDataBusState;
|
|
|
|
|
2005-07-09 23:44:08 +00:00
|
|
|
// Whether or not peek() updates the data bus state. This
|
|
|
|
// is true during normal emulation, and false when the
|
|
|
|
// debugger is active.
|
|
|
|
bool myDataBusLocked;
|
|
|
|
|
2001-12-27 19:54:36 +00:00
|
|
|
private:
|
|
|
|
// Copy constructor isn't supported by this class so make it private
|
|
|
|
System(const System&);
|
|
|
|
|
|
|
|
// Assignment operator isn't supported by this class so make it private
|
|
|
|
System& operator = (const System&);
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|