clarified how VideoBlack and ZeroBlack are related in the 2600
ZeroBlack is now a generated and cached colour for both legacy and new
colour models, rather than an implied zero RGB value
the result of this is that VideoBlack and ZeroBlack are now affected by
colour adjustment in the same way, as it is on real hardware. this
happens because the 2600 outputs 0.0 IRE for VideoBlack and not 7.5 IRE
as you might expect. the most immediate recent change to colour
generation used a VideoBlack value of 7.5
we don't yet emulate RGB mods that do use 7.5 for VideoBlack
legacy PAL palette corrected so that the four VideoBlack values are zero
television signal split into video and audio signal. The audio signal is
only sent then a new sample from the TIA is ready
realtime mixer concept change. the mixer can be informed of a change of
TV spec. this allows the realtime mixer to make an informed judgement
about the required sample rate
the sample rate is unlikely to be ideal however unless the number of
scanlines in the TV image is the same as given in the basic TV
specification (ie. 262 lines for NTSC, 312 for PAL). because of that,
the realtime mixer can also indirectly regulate the rate of calls to
SetAudio(). the Regulate() function is called by the television which
then alters the call frequency to SetAudio() depending on the regulate
value. this effectively keeps the audio buffer nicely filled - neither
too long which would be audibly laggy, or too short which would result
in clipped audio
the values that control the regulation in both the sdlaudio package and
television package will need tweaking to find the best values
for lack of better evidence changes to NUSIZx was handled towards the
end of the colour clock. however, an example has now been found that
demonstrates that it should happen earlier
for the time being only the missile NUSIZx is treated in this way. a
note has been added to say that the player NUSIZx should also be handled
at the same time. the note goes onto say however, that the player NUSIZx
function has been tuned with the assumption that it happens later. a
very old comment also exists saying that the player NUSIZx function
looks complicated and could probably be simplified. I think that's
correct and the earlier handling is the key to that
the behaviour of the ball reset is slightly different under HMOVE. the
previous condition wasn't quite correct
the condition for missile reset has also been changed, under the
assumption that it behaves the same as the ball. no additional test for
the missile has been identified but the new code passes all existing
test ROMs
- preparation for adding 7800 emulation
cpu (6507) package uncoupled from upstream dependencies
- cpu no longer logs execution of KIL instruction
- randomisation of registers on startup can be handled by the called of
the cpu's Reset() function
- address errors are filtered by an optional IsAddressError() function
in the Memory interface implementation
- Error field removed from execution.Result type
all references to interface{} replaced with any
removed audio overlay due to changes in TIA audio implementation. the
changes could be reflected accurately but the overlay is no longer as
useful as I originally thought
signal history only copied if 'realtime' audio is being used.
the signal history is not required except for mitigations related to
'realtime' audio, so limiting the copy means a marginal performance
improvement for headless operation
TV Signal() implementation split into signalFull() and signalSimple().
the decision as to which is called is made once on instantiation, rather
than on every call to Signal()
small changes to tia/video and arm for clarity purposes
sum of samples is averaged and output twice per scanline for an output
sample rate of 31.4KHz
this fixes issues with ROMs that change the volume of the audio multiple
times per scanline
added *.wav to .gitignore
when I implemented the feature I only knew of Quickstep as
being a problem ROM for some RGB mods. however, there is now
an example of a ROM where the COLUBK register is a problem.
rather than add a new option I simply renamed LateCOLUPF to
LateColor and set it to affect the COLUBK in addition to
COLUPF
changed comparision/diff texture to linear and clamped scaling
comparison window will not be open on following session
if a comparison window was left open on program exit, it remained
open when the program is started again, even if there was no
comparison ROM specified. comparison window will now be closed
under those circumstances
the logger.Permission interface indicates whether the environment making
the logging request is allowed to create new log entries. the
environment.Environment type satisifies the Permission interface
logger.Allow is provided as a convienient way of indicating the the log
entry should always be created
updated QUANTUM and STEP commands to accoodate new quantum
control window changed to support the three quantum options
improved/corrected the conditions under which the ONSTEP command is run
disassembly.ExecutedEntry() updates existing entry
AudioTick() function in tracker interface accepts TrackerEnvironment
instance. tracker implementation differentiates emulation instances and
records AudioTick() information accordingly
better visuals for tracker window
sketched in idea for a tracker "replay" feature that will allow a
selection of audio output to be replayed. it works in principal but is
not currently used
the function no longer returns (uint8, bool) tuple. it instead expects a
function that can be called from the Tick() function itself, in the case
of "success"
this has significant performance improvements due to the frequency of
calls to delay.Event.Tick()
curated package predated the standard errors package introduced in
go1.13
the standard package does a better job of what curated attempted to do
the change of package also gave me a opportunity to clean up the error
messages a little bit
this affects missiles that rely on resetToPlayer(). a really good
demonstration of this is the trucks/cars in "The Official Frogger".
without this fix they would go bezerk after a gameplay rewind
QuickStep() removes all checking for changed memory state. moreover, if
the CPU RDY flag is false, we can say that QuickStep() is always
prefered to Step() because by definition the state of memory cannot have
changed
a small but significant performance improvement. a side effect of this
improvement is that execution speed will increase depending on the
number and length of WSYNCs
small but significant performance improvement. the previous method by
which triggerMissileReset() could be considered a bug as it differed
from the intention. current code is correct with regards to intention
thumbnailer was running in a different goroutine to that which the state
being used to generate the thumbnail was create in. there's no way of
making that safe except through mutexes or similar. that's too much
overhead for something as inconsequential as a timeline thumbnailer
timeline thumbnailer now runs in the same goroutine as the main
emulation, bypassing these problems. scheduling of when thumbnailer runs
is now done manually
"Live" TIA Revision values replaced with atomics. small performance
improvement
added Unplug() function to Peripheral interface. existing peripherals
updated to satisfy interface
volume mix increased. better balance with festival default volume
path to festival is currently hardcoded to be /usr/bin/festival
sharing of preferences between emulation instances is safe due to the
nature of the underlying prefs package.
however for performance purposes the TIA emulation requires plain
variables rather than the goroutine-safe prefs values. this caused
race-errors when two emulation instances were running side by side and
when the TIA revision information was changed
to remedy this, the instance package now makes a copy of the live
revision preference values. the TIA emulation accesses revision
information through the LiveRevisionPreferences type rather than the
RevisionPreferences type directly
addresses and bus interface removed and split into cpubus and chipbus
packages.
ReadZeroPage() no longer has any distinction from normal Read()
function.
INPTx input is masked correctly
RIOT.Ports no longer keep private copies of SWCHA, SWACNT, SWCHB or
SWBCNT. added ChipRefer() to ChipBus interface. this makes the interface
with memory more natural. for example, a POKE command will now correctly
be referred to by the Ports implementation in all instances.