Thomas Harte
24b3faa427
Deconstitutes the 6522 into component parts, templated and non-templated.
...
Adjusts the Oric, Vic-20 and C-1540 accordingly, albeit with the quickest possible solutions.
2017-09-04 14:26:04 -04:00
Thomas Harte
96648df5fe
Ensures all parts of the Electron have a fully-defined initial state.
...
Specifically to resolve an error with shift being pressed at startup due to a failure to establish a default value for that flag, but applying the same principle across the board.
2017-08-31 22:29:24 -04:00
Thomas Harte
53a88a7e12
Causes the ZX80/81 to omit support for the wait line if being configured as a ZX80.
2017-08-27 16:45:36 -04:00
Thomas Harte
4a66dd9e82
Arranges for the ZX80/81 to get a peek at target configuration prior to construction. I'm as yet undecided on whether to make this the norm.
2017-08-27 16:42:16 -04:00
Thomas Harte
57bfec285f
Makes it optional whether the Z80 supports the wait line. If the wait line isn't in use, runtime costs are decreased because the optional wait cycles need not be iterated over.
2017-08-26 23:08:57 -04:00
Thomas Harte
e7ad79c79a
Breaks apart the CPC's 6845 bus handler to obey phase 1 and phase 2, and now back-dates interrupts when appropriate.
2017-08-26 14:07:51 -04:00
Thomas Harte
6e99169348
Permits the 6845's bus state to be examined by an owner, eliminating the need to buffer it in the bus handler. But more than that it allows the CRTC to decide when it adjusts the various outputs respective to the main phase. So a net effect of the change is that the CPC now sees vsync a cycle earlier, because my current reading of the 6845 datasheet is that it is set at the end of phase 1, not the beginning of the next phase 1.
2017-08-26 12:59:59 -04:00
Thomas Harte
ee71be0e7e
Added the option not to include ready line support in the 6502 core, and took advantage of it in the Electron, Oric and Vic-20 implementations. Also tagged those as forceinline and/or override final where applicable.
2017-08-21 21:56:42 -04:00
Thomas Harte
cde29c4bf4
Added forceinlines and properly declared finals and overrides.
2017-08-21 21:07:10 -04:00
Thomas Harte
e1aded0d95
Allows Z80 users to opt out of support for the bus request line. Which both now do.
2017-08-21 20:43:12 -04:00
Thomas Harte
0cbc1753b9
Quick fixes: the binary tape player now considers talk to the sleep observer only if motor control changes. The Amstrad CPC no longer attempts to use the component argument to identify the caller, since this
will often be that of the superclass and not that of the derived class known to the CPC.
2017-08-20 13:18:46 -04:00
Thomas Harte
8f5ae4a326
The CPC now responds to tape-originating sleeper observations.
2017-08-20 12:21:02 -04:00
Thomas Harte
e88a51e75e
Worked logic all the way down to the CPC. If the 8272 announces that it is asleep, it is now no longer clocked. Also very slightly cut down on IRQ line chatter to the Z80.
2017-08-20 12:05:00 -04:00
Thomas Harte
f2699a3f2b
Okay, even if releasing it is unsafe, I can at least move the typer so that it is no longer called.
2017-08-20 10:24:01 -04:00
Thomas Harte
85253a5876
Sought further to reduce the processing footprint of palette changes by updating only those table entries that are affected by a change.
2017-08-20 10:13:23 -04:00
Thomas Harte
911ee5a0d3
At least added a fast return.
2017-08-19 22:22:51 -04:00
Thomas Harte
57c5b38a6d
Step one towards cutting much of this cost: build only the table that's appropriate for the current mode, and at least declare when a more minimal change would be sufficient.
2017-08-19 22:19:46 -04:00
Thomas Harte
f68565a33f
Split the static analyser functionality so that it's possible just to ask for the set of media implied by a particular file. Extended ConfigurationTarget so that media alone can be pushed to a machine.
2017-08-17 10:48:29 -04:00
Thomas Harte
b476f06524
Slowed the typer, having discovered that otherwise it has problems transitioning from a shifted to an unshifted character.
2017-08-16 22:12:16 -04:00
Thomas Harte
925e774015
Added a decent portion of documentation. But started feeling like I should address my various ownership decisions. Which would justify a separate pull request.
2017-08-16 16:23:33 -04:00
Thomas Harte
4c15e46fd1
Performed the normative removal from public view of Vic-20 implementation details. Which were hefty.
2017-08-16 16:05:30 -04:00
Thomas Harte
75208b0762
Moves the Electron implementation behind a more opaque interface, in line with changes elsewhere.
2017-08-16 15:33:40 -04:00
Thomas Harte
903a17ae11
Corrected typo and removed replication of what's already declared formally.
2017-08-16 14:53:03 -04:00
Thomas Harte
de1c526789
Cut the amount disclosed by the Atari 2600 for public inspection down to the minimum, relocating implementation into the .cpp.
2017-08-16 14:52:40 -04:00
Thomas Harte
148591b7f2
Hid most of the Oric innards, and corrected a potential multi-thread access error emanating from the Mac side of the world.
2017-08-16 14:35:53 -04:00
Thomas Harte
3c148f5721
Fixed clanger of an error.
2017-08-16 14:02:46 -04:00
Thomas Harte
360c8a99a3
Adjusted Atari2600 actually to use the nominated type of bus extender.
2017-08-16 12:57:32 -04:00
Thomas Harte
06e31f5102
Consequential to the 6502 change, severs the Atari 2600's cartridge container from its former attempt at runtime polymorphism, in favour of each cartridge's specific hardware being defined as a 'bus extender'.
2017-08-16 12:39:15 -04:00
Thomas Harte
42b5b66305
Remove the 6502's use of runtime polymorphism in favour of ordinary templating.
2017-08-16 11:56:52 -04:00
Thomas Harte
3947347d88
Introduces active input handling for the AY and uses it in the CPC to give proper, active keyboard input, rather than push-on-select, which was only ever a temporary hack. Also maps a few more keys for the Amstrad.
2017-08-15 22:47:17 -04:00
Thomas Harte
334872d374
Clarified, slightly.
2017-08-14 12:47:11 -04:00
Thomas Harte
7ea703f150
Started making provisions for a DMA-compatible implementation. Re: the CPC, it sounds like DMA acknowledge might be permanently wired, causing DMA mode seemingly to work from the 8272's point of view.
2017-08-14 08:38:00 -04:00
Thomas Harte
3831fbaca2
Ensured the ZX80 and '81 also provide the necessary hook for destruction.
2017-08-11 12:11:01 -04:00
Thomas Harte
1d8edf58dd
Ensured that a virtual destructor is declared, so that the various automatically-generated real constructors get in on the action.
2017-08-11 12:07:48 -04:00
Thomas Harte
4785e316ff
Now with exposition.
2017-08-11 11:36:03 -04:00
Thomas Harte
44da9de5b0
Tweaked typing timing expectations.
2017-08-11 11:35:28 -04:00
Thomas Harte
4ecd093891
Fixed test for termination of a key sequence; the previous error will have seen this reduce all multi-key sequences to just the one, and expand single-key sequences to "probably" two, posting an out-of-bounds code to the machine at completion.
2017-08-11 11:35:14 -04:00
Thomas Harte
dd4bc87d52
Fixed: should be a full-path #ifdef guard, given that this is one of the classes named relative to its namespace.
2017-08-11 11:21:33 -04:00
Thomas Harte
570d25214e
Made an initial attempt at typer support for the CPC.
2017-08-11 11:21:07 -04:00
Thomas Harte
cf810d8357
Minor: ensure the CRT is set to output as a monitor.
2017-08-10 14:42:47 -04:00
Thomas Harte
4961fda2a9
Ensured counter-intuitive CRTC writes get through, taking the opportunity to correct my handling of port IO in general: selecting multiple devices for input results in a logical AND (i.e. open collector mode), and both the CRTC and gate array will receive data from 'input's if applicable.
2017-08-10 12:39:19 -04:00
Thomas Harte
6a6e5ae79c
Forced users of the 6845 to be explicit about which type. So far with no effect.
2017-08-10 12:28:57 -04:00
Thomas Harte
484524d781
Implements RAM paging. The 6128 is now emulated.
2017-08-08 16:01:56 -04:00
Thomas Harte
a7103f9333
Disks are now communicated to the 8272. Which is able to handle four of them.
2017-08-06 13:24:14 -04:00
Thomas Harte
29288b690e
Switched disk controllers to be instantiated explicitly in terms of cycles, created an Amstrad-specific subclass of the 8272 to record the direct programmatic availability of all disk motors bundled together, and otherwise adjusted to ensure the thing is clocked and that the motor is enabled and disabled appropriately. The 8272 is also now formally a subclass of the incoming MDM controller.
2017-08-06 09:45:16 -04:00
Thomas Harte
3e984e75b6
Strung up an empty shell that eventually should contain the 8272, and added appropriate IO decoding to the Amstrad.
2017-08-05 19:45:52 -04:00
Thomas Harte
9e8645ca7a
Fixed ROM paging port decoding. It should have been fd00 if completely decoded, not df00, but also shouldn't be completely decoded.
2017-08-05 19:24:03 -04:00
Thomas Harte
caf3ac0645
Sought: (i) to instruct the CPC that it should be a 664, not a 464, if given a disk image (at least until I have RAM paging implemented for a 6128); (ii) to support ROM selection within the CPC and allow paging in of AMSDOS.
2017-08-05 19:20:38 -04:00
Thomas Harte
4b19cf60df
Added omitted semicolon.
2017-08-05 09:18:55 -04:00
Thomas Harte
b3788fed41
Fixed AY queuing behaviour as handled by the Amstrad. I think I need to come up with clearer semantics here.
2017-08-05 09:12:17 -04:00
Thomas Harte
a63aa80dc9
Merge branch 'master' of github.com:TomHarte/CLK
2017-08-04 16:51:52 -04:00
Thomas Harte
63f57c8c4f
Adjusted visible portion of frame; completely empirical, as I'm chasing a machine that shipped with a monitor.
2017-08-04 16:51:46 -04:00
Thomas Harte
f075fea78c
Introduces filtering of the CRTC's vsync signal into the gate array.
2017-08-04 16:36:55 -04:00
Thomas Harte
c0f0c68f4f
Corrects quick-hack version of border drawing: the assumption that the colour must be the same over a plotted period. Also corrects my entry for colour 15.
2017-08-04 12:13:05 -04:00
Thomas Harte
d9097facf1
Found documentation that makes more sense, and in practice seems to be more correct: the test after vertical sync is for greater than 32, not less. Also I decided to chance my arm on counter reset also resetting interrupt request. The raster effects of Ghouls 'n' Ghosts is now pretty much correct but one line off. I think probably either something is off in my wait-two logic on the post-vsync timer event, or possibly the vsync bit exposed via the PPI doesn't mean exactly what I think it means.
2017-08-04 08:56:09 -04:00
Thomas Harte
b927500487
Clarified code a little, but this is mostly fiddling in the margins.
2017-08-03 22:00:30 -04:00
Thomas Harte
e71eabedf9
Fixed timer clearing tet.
2017-08-03 21:30:04 -04:00
Thomas Harte
33ed27c3ad
Minor tidiness: included missing headers, and spaced out the ROM type and key lists for readability.
2017-08-03 12:45:42 -04:00
Thomas Harte
575b1dba75
Formally declared the ZX80/81 and Amstrad CPC as keyboard machines in their public interface. Which means not having to repeat the meaning of set_key_state and clear_all_keys. So: a minor DRY improvement.
2017-08-03 12:38:22 -04:00
Thomas Harte
bbb17acf3a
Expanded interface so that an external machine caller can request a string be typed without any knowledge of whatever it intends to do re: CharacterMappers. Which is immediately useful in paste functionality.
2017-08-03 11:50:50 -04:00
Thomas Harte
ad3a98387f
Within the Typer
framework: hatched out CharacterMapper
as a distinct thing from the target for keypresses, better to formalise responsibility but also to make it easy cleanly to sever that stuff into its own little part.
2017-08-03 11:42:31 -04:00
Thomas Harte
2f2071be8a
These should actually both be in the public header, as the types are used in an exposed method.
2017-08-02 22:18:30 -04:00
Thomas Harte
6d510e4e70
Made it no longer public knowledge that any sort of Typer is involved in being a ZX80/81.
2017-08-02 22:17:22 -04:00
Thomas Harte
8e0736fbe6
Reinstated typing ability, albeit with an ugly inline insertion. But I think I can defer dealing with typers to another pull request. The whole issue of keyboard mapping probably needs reappraisal.
2017-08-02 22:16:09 -04:00
Thomas Harte
681d1e2f8d
Breaking its typer for now, adapted the ZX80/81 to having a Z80, not being one.
2017-08-02 22:12:59 -04:00
Thomas Harte
42e70ef993
Adjusted slightly as per Z80 change, and to pull everything internally declared into the Amstrad CPC namespace.
2017-08-02 22:11:03 -04:00
Thomas Harte
d3bf8fa53b
Upped the documentation.
2017-08-02 20:37:26 -04:00
Thomas Harte
f5e2dd410e
Constrained output to the centre 90%.
2017-08-02 19:55:44 -04:00
Thomas Harte
e50adf1cc8
Were my TZX support up to it, this would likely be sufficient for tape emulation.
2017-08-02 13:50:14 -04:00
Thomas Harte
dcab10f53e
Ensured the AY's async queue doesn't just fill and fill.
2017-08-02 07:38:35 -04:00
Thomas Harte
f602f9b6ec
Adds an attempt to clock the AY.
2017-08-02 07:21:33 -04:00
Thomas Harte
4d5d5041df
Attempted to ensure a clean startup.
2017-08-01 22:18:42 -04:00
Thomas Harte
587eb3a67c
Factored interrupt counting out of the CRTCBusHandler.
2017-08-01 22:15:39 -04:00
Thomas Harte
8d39a20088
Added proper output of mode 3, were anything ever to try to use it.
2017-08-01 21:51:41 -04:00
Thomas Harte
4b6370eb86
Realised my colour error: mapping the ROM numbers as though they were the hardware numbers. Having fixed that, spotted that I was deserialising R and B the wrong way around and dividing by too much. Colours now appear to be correct.
2017-08-01 21:47:52 -04:00
Thomas Harte
c6e340a8a2
Wired up the vsync signal. Pen 15 no longer flashes like crazy. Still can't figure out why the palette is so askew; was looking for perhaps some sort of detection of a green screen rather than a colour one, but there's no obvious input for that.
2017-08-01 21:21:59 -04:00
Thomas Harte
31c7153301
Corrected bit to colour mapping for modes 0 and 1. The total palette is still way off but there's consistency between modes now.
2017-08-01 20:52:42 -04:00
Thomas Harte
7e04d00cc1
Fixed key values, causing the new set of keys to work, decreased quantity of output and ensured that pixels appear in modes 0 and 2.
2017-08-01 20:39:10 -04:00
Thomas Harte
eca9586a0f
Fixed: input value is no longer overwritten by 0xff. The '0' key now works.
2017-08-01 20:19:02 -04:00
Thomas Harte
2e4577f741
Made a game attempt at implementing a (sticky) keyboard. No effect yet.
2017-08-01 17:52:05 -04:00
Thomas Harte
f5b278d683
Added enough stuff to put the emulated Amstrad CPC in a state of knowing whether its '0' key is pressed.
2017-08-01 17:31:56 -04:00
Thomas Harte
e6854ff8db
Corrected typo: the input to an AY is BDIR, not BCDIR.
2017-08-01 17:06:57 -04:00
Thomas Harte
3b292273c7
Fixed: BC2 is always implicitly set. The machine is now periodically checking the AY's register 14 (i.e. the first input port), so probably there's enough here now to implement keyboard input.
2017-08-01 17:05:11 -04:00
Thomas Harte
cb732e5d5f
Made an attempt to wire in an [unclocked] AY, in an endeavour to get to keyboard reading.
2017-08-01 17:01:58 -04:00
Thomas Harte
08ad35efd9
It's barely an implementation of the 8255, but ensured that data is bounced into the PortHandler, conveniently assuming the interaction mode used by the CPC.
2017-08-01 16:34:13 -04:00
Thomas Harte
58b98267fc
Formally transferred ownership of PIO accesses to an incoming template, and decided to start being explicit about how to specify the interfaces and provide fallbacks for optional behaviour for the new, clean generation of interfaces. A full-project sweep will inevitably occur but I'll try to tie off this branch first.
2017-08-01 16:15:19 -04:00
Thomas Harte
a27946102a
Took a shot at the interrupt counter. Attempts at keyboard reading now recur so it'll probably do for now. I think that next puts me into the realm of needing to implement the 8255.
2017-08-01 15:49:16 -04:00
Thomas Harte
6ac7132799
Had a quick go at properly outputting Mode 1, adding wiring to communicate palette and mode changes to the CRTC bus handler. Colours are off but it's sufficient for now.
2017-08-01 15:16:13 -04:00
Thomas Harte
ca42abab70
Doubled up to ensure that every byte that should be inspected is represented. This makes it clearer that I'm on the right road. A garbled version of 'Amstrad 64k Microcomputer' can be discerned, in a weird grayscale and with the right-hand column missing and skewed output as a result.
2017-08-01 07:56:44 -04:00
Thomas Harte
933d69a256
Fixed slightly: the CPC wiki has a typo. It's 12 and 13 that move up to 14 and 15.
2017-08-01 07:51:13 -04:00
Thomas Harte
10a5581aea
Made first attempt at offering some sort of pictographic of actual RAM contents.
2017-08-01 07:34:12 -04:00
Thomas Harte
3ae699964f
Ensured an actual pixel stream is supplied for pixel regions. Though it's just a long stream of white pixels for now. So visual output is unchanged.
2017-08-01 07:24:29 -04:00
Thomas Harte
9d953421d8
After a quick check, added a couple of other _delegate initialisations. I should probably find a way to template this.
2017-08-01 07:07:43 -04:00
Thomas Harte
763e3b65d1
Ensured a proper initial value for delegate_
.
2017-07-31 22:46:06 -04:00
Thomas Harte
42dd27c9b1
Shunted method bodies inline, given that there's no need for a declaration/definition distinction.
2017-07-31 22:39:25 -04:00
Thomas Harte
3df13cddd4
As per my keenness for cleanliness improvements corresponding to my ever-increasing C++ ability: turned the Amstrad into something that a factory produces, allowing me completely to hide a bunch of implementation details.
2017-07-31 22:32:04 -04:00
Thomas Harte
c2253c1e0f
Fixed multiplier: the dot clock I've used to instantiate the CRT is the pixel clock, not the character clock.
2017-07-31 22:17:46 -04:00
Thomas Harte
f742fd5d4a
Made basic attempt to get something on screen: white where the display is enabled, black for the border.
2017-07-31 22:13:20 -04:00
Thomas Harte
69b99fe127
Transferred ownership of the CRT to the CRTC bus handler, to give it easy access.
2017-07-31 22:04:52 -04:00
Thomas Harte
e28829bd1b
Corrected CRTC timing, gave it someone to talk to and a means with which to talk.
2017-07-31 20:14:46 -04:00
Thomas Harte
68ceeab610
Created a 6845 class and started pushing data at it and clocking it. It doesn't currently have the concept of a bus but will do, hence the in-header implementation.
2017-07-31 19:56:59 -04:00
Thomas Harte
68dca9d047
Made a first attempt at ROM paging, with pretty much the same scheme that'll be needed for 128kb support.
2017-07-31 19:37:28 -04:00
Thomas Harte
d88ca151f4
Added a first attempt at output port decoding. Just logging for now.
2017-07-31 19:25:10 -04:00
Thomas Harte
3c90218c3d
With a very basic stab at something a bit like the memory map (sans paging), execution begins.
2017-07-31 19:15:43 -04:00
Thomas Harte
afd409c883
Ensured that ROM images are loaded and passed to the Amstrad CPC.
2017-07-31 18:44:49 -04:00
Thomas Harte
9c04d851e4
Added the basics necessary to get the CPU ticking over, at a nominal 4Mhz but with the wait states that I currently believe to be accurate.
2017-07-31 07:29:50 -04:00
Thomas Harte
1d6fe11906
Added an instance of Outputs::CRT::CRT
. So progress is now: select CDT, up comes a blank window.
2017-07-31 07:16:51 -04:00
Thomas Harte
c0f1313830
Performed sufficient wiring to get to the point where attempting to load a CDT creates an instance of the Amstrad CPC and then fails only because the thing vends a nullptr
CRT.
2017-07-30 22:05:29 -04:00
Thomas Harte
4abd62e62b
Standardises on const [Half]Cycles
as the thing called and returned, rather than const [Half]Cycles &
as it's explicitly defined to be only one int
in size, so using a reference is overly weighty.
2017-07-27 22:05:29 -04:00
Thomas Harte
968d2bb8ba
Brought Typer
into the new run_for
orthodoxy, making it easier to clock consistently regardless of unit. Which necessitated adding a negative operator for WrappedInts.
2017-07-27 21:53:45 -04:00
Thomas Harte
9ef232157b
Revoked the operator bool() on WrappedInt as providing an indirect means for implicit but incorrect assignment to unwrapped ints. Got explicit about run_for
intention and simplified HalfClockReceiver slightly by building a lossy and a flushing conversion to Cycles into HalfCycles. Adapted the all-RAM Z80 properly to return HalfCycles.
2017-07-27 21:38:50 -04:00
Thomas Harte
8848ebbd4f
Formalised set_interrupt_line's optional parameter as being a count of HalfCycles; corrected PartialMachineCycle.is_wait and effected the proper timing for counter reset on a ZX81.
2017-07-27 21:10:14 -04:00
Thomas Harte
8361756dc4
Switched definitively to the works-for-now approach of requiring an explicit opt-in where somebody wants to clock a whole-cycle receiver from a half-cycle clock.
2017-07-27 07:40:02 -04:00
Thomas Harte
81a3899381
Adjusted the Z80 formally to communicate in terms of half cycles rather than whole.
2017-07-26 19:42:00 -04:00
Thomas Harte
cda223ffc0
Added explicit signedness cast.
2017-07-25 22:49:03 -04:00
Thomas Harte
966b5e6372
Adapted the Z80's perform_machine_cycle
to return Cycles
.
2017-07-25 22:25:44 -04:00
Thomas Harte
279c369a1f
Switched to Cycles as the result from the 6502 perform_bus_operation
, helping slightly to clarify what you're intended to return and reducing type jumping within the 6502 implementation.
2017-07-25 22:21:09 -04:00
Thomas Harte
d9c6b3bcf7
Corrected TIA's WSYNC lookahead to accept Cycles
.
2017-07-25 22:13:41 -04:00
Thomas Harte
296c7cec05
Adopted flush
widely.
2017-07-25 20:42:51 -04:00
Thomas Harte
75d67ee770
Relocated ClockReceiver.hpp as it's a dependency for parts of the static analyser, and therefore needs to be distinct from the actual emulation parts.
2017-07-25 20:20:55 -04:00
Thomas Harte
a1e9a54765
Eliminated redundant uses of ClockReceiver
and sought to ensure that proper run_for
s are inherited all the way down.
2017-07-25 20:09:13 -04:00
Thomas Harte
8d1dacd951
Clean ups along the Electron::Tape line: ensured that the ClockReceiver is opted into only once, and that its run_for
propagates all the way along the chain.
2017-07-25 20:01:30 -04:00
Thomas Harte
40339a12e1
Formalised the use of a cycles count with a divider, bringing a few additional plain-int users into the fold.
2017-07-25 07:15:31 -04:00
Thomas Harte
90bf6565d0
Reduced int/Cycle conversions in the Electron and on the Atari 2600, where the current framework makes it possible to do so.
2017-07-24 22:53:13 -04:00
Thomas Harte
c1527cc9e2
Reduced back-and-forth between Cycles
and int
s within the Oric.
2017-07-24 22:46:31 -04:00
Thomas Harte
c77a83d86f
The 6560 is now a ClockReceiver
. This reduces to zero the number of remaining instances of the text run_for_cycles in this codebase.
2017-07-24 22:38:35 -04:00
Thomas Harte
a6e377aa57
The Electron's video is now a ClockReceiver
.
2017-07-24 22:36:42 -04:00
Thomas Harte
9435c1e12a
The 1540 is now a ClockReceiver
.
2017-07-24 22:32:41 -04:00
Thomas Harte
efdac2ce8c
The 6522 is now a ClockReceiver
.
2017-07-24 22:29:09 -04:00
Thomas Harte
2912d7055b
The 6532 is now a ClockReceiver
.
2017-07-24 21:57:24 -04:00
Thomas Harte
55ecb0c022
Converted the Microdisc into a ClockReceiver
.
2017-07-24 21:51:13 -04:00
Thomas Harte
13f7aa4063
The TIA is now a ClockReceiver
.
2017-07-24 21:48:34 -04:00
Thomas Harte
915f587ef1
Updated the Electron's tape class to be a ClockReceiver
.
2017-07-24 21:36:30 -04:00
Thomas Harte
b7f88e8f61
Filter
is now a ClockReciever
, affecting all sound output devices.
2017-07-24 21:29:13 -04:00
Thomas Harte
8a2bdb8d22
Converted the TimedEventLoop and the things that sit atop it into ClockReceiver
s.
2017-07-24 21:19:05 -04:00
Thomas Harte
b82bef95f3
Decided to follow through on Cycles
and HalfCycles
as complete integer-alikes. Which means giving them the interesting range of operators. Also killed the implicit conversion to int as likely to lead to type confusion.
2017-07-24 20:10:05 -04:00
Thomas Harte
ba088e5545
Adapted the Z80 into a clock receiver, which also vends Cycles
rather than a raw int within its PartialMachineCycle
struct. The objective is to update it to vend HalfCycles within its struct, but I think I need to do some work on cycle/half-cycle arithmetic first.
2017-07-23 22:15:04 -04:00
Thomas Harte
6369138bd1
Converted the Oric's video output into a ClockReceiver
.
2017-07-22 23:11:30 -04:00
Thomas Harte
c2a7dffa7d
Converted the ZX80/81 video component into a ClockReceiver. As it happens, it's most convenient to take the half-cycle bus here.
2017-07-22 23:02:28 -04:00
Thomas Harte
2ff157cf7a
Switched CRTMachine over to use Cycles
as an explicit statement of units, and followed through on the effects of that.
2017-07-22 22:17:29 -04:00
Thomas Harte
83628b285b
Experimentally turned the 6502 into a clock receiver. No problem encountered.
2017-07-22 21:52:21 -04:00
Thomas Harte
1bbb4cb478
Increased documentation.
2017-07-22 17:39:51 -04:00
Thomas Harte
d46da6ac9d
Added documentation.
2017-07-22 17:31:12 -04:00
Thomas Harte
dddb30477b
Used a different inner-loop variable, for clarity.
2017-07-21 21:52:08 -04:00
Thomas Harte
37459a3ebc
Fixed parameter shadowing.
2017-07-21 21:51:18 -04:00
Thomas Harte
3f609e17b3
Factored out the table-lookup approach to being a typer, and adjusted so as definitely to limit myself to positive offset table lookups.
2017-07-21 21:18:51 -04:00
Thomas Harte
2471ef805b
Fixed signed/unsigned comparison and potential negative table reference.
2017-07-21 20:45:49 -04:00
Thomas Harte
a3e0024980
Chopped time accumulation out of the default Tape
process because it's proving to be sufficiently expensive for a TZX as not to be worthwhile. Introduced a cheaper position capturing/restoring method.
2017-07-21 18:55:03 -04:00
Thomas Harte
44e5a03cf2
Removed just-don't-power-the-tape approach to pausing and playing, in favour of being fully communicative.
2017-07-19 19:21:27 -04:00
Thomas Harte
b3861ff755
Reduced copying of Pulses.
2017-07-16 19:49:31 -04:00
Thomas Harte
1d3ae31755
Abstracted the concept of an Acorn shifter away from being a PLLParser. The Acorn tape parser now skips using that class and uses the shifter. The actual Electron also uses the shifter. So the two are completely aligned. Net result: the Electron should successfully load exactly when static analysis was successful.
2017-07-16 19:24:01 -04:00
Thomas Harte
f931cd582d
Switched to use of std::vector
in those few remaining places where I was still using a unique_ptr
to a native type and new
ing for myself. So, some of my earliest bits of code.
2017-07-16 13:54:07 -04:00
Thomas Harte
481487f084
Oh yuck, it looks like I've repeated this same test in two different places. Must figure out where to factor it out to. But in the meantime, the emulated Electron has just loaded its first CSW.
2017-07-13 22:39:30 -04:00
Thomas Harte
ac59dd8b1d
Added enough typing to issue a load command. No thoughts as to running yet though.
2017-07-09 22:07:12 -04:00
Thomas Harte
353c854734
Removed a TODO that is no longer appropriate.
2017-07-09 22:06:50 -04:00
Thomas Harte
3e5c209039
Added basic Typer support for the ZX80 and '81.
2017-07-09 22:00:34 -04:00
Thomas Harte
ed28260aaf
Hardens the ZX80/81 video routines to ensure they never try to push data into the future and don't double-count time when pixels would ostensibly run into sync. You could previously see the CRT being handed negative run lengths if sync interrupted pixels or if a run of more than 320 pixels (my arbitrary buffer size) occurred, with corresponding poor behaviour given my use of unsigned numbers.
2017-07-09 19:33:05 -04:00
Thomas Harte
87658e83c1
Moved line counter reset logic; I think this is actually correct.
2017-07-09 00:05:30 -04:00
Thomas Harte
4509c3ce34
By observation, it appears that disabling vsync occurs on any port output whatsoever, as long as NMI isn't blocking it.
2017-07-08 21:01:52 -04:00
Thomas Harte
30e93979d2
Removed data work if sync is enabled; in that case no data is output.
2017-07-08 21:01:07 -04:00
Thomas Harte
d6b87053bf
Introduced an explicit record of whether a video byte is latched. It's definitely incorrect to treat the latching of 0 as equivalent to no latching, as the byte that will eventually become video is not strongly implied.
2017-07-08 20:40:19 -04:00
Thomas Harte
22389a5d2d
Merge branch 'master' into HiRes
2017-07-08 20:38:25 -04:00
Thomas Harte
54efcb7e2f
Made a game attempt at automatic motor control and ensured setting is initialised correctly from the user defaults.
2017-07-08 19:31:20 -04:00
Thomas Harte
e2575d6de4
Routed tape motor selections through to the C++ side of the world, and ensured that manual tape playback works properly.
2017-07-08 19:21:12 -04:00
Thomas Harte
46fff8e8a2
Ensured bit 8 is uniquely from the latched video byte, not an OR of that with the refresh address.
2017-07-06 22:48:48 -04:00
Thomas Harte
a3684545b5
Added a block on the tape motor for a short period after each time the ROM routine is intercepted for a substituted byte read. To reduce the collision between fast tape and real tape loading.
2017-07-06 22:33:54 -04:00
Thomas Harte
b842c5b8bb
Merge branch 'master' into ZX81FastLoading
2017-07-06 22:03:24 -04:00
Thomas Harte
0c037627fc
Typer fixes: the recipient no longer releases the caller, and a duplicate call to strlen and piece of arithmetic is corrected.
2017-07-06 21:38:56 -04:00
Thomas Harte
a72a2e0a1a
Ensured tape doesn't proceed of its own volition when in fast-loading mode.
2017-06-23 20:21:37 -04:00
Thomas Harte
50375fb373
Ensured tape position is unaffected if the attempt at loading quickly fails.
2017-06-23 20:18:19 -04:00
Thomas Harte
cb105fdeb4
Took a first stab at high-res support.
2017-06-22 22:48:17 -04:00
Thomas Harte
acfd4dde36
Reduced port writes which can adjust programmatic sync, and prevented anything while NMI generation is active. Moved line counter increment from triggered by interrupt acknowledge to triggered by horizontal sync. In both cases, cribbing from my own earlier work. Initial results suggest that sync issues are resolved in third-party software.
2017-06-22 22:44:06 -04:00
Thomas Harte
644ef13acd
Connected up the fast-tape GUI option for the ZX80 and '81.
2017-06-22 20:20:31 -04:00
Thomas Harte
b7c978e078
Added getters for most of the input lines, and attempted to round out the ZX81's wait logic.
2017-06-22 20:11:19 -04:00
Thomas Harte
52d9ddf9e5
Gave the binary tape player a more logical assignment of wave level to output level. Which miraculously appears to have been the issue with the ZX80/81 tape loading — the inconsistency of silences seems to have been the issue.
2017-06-21 22:13:24 -04:00
Thomas Harte
a6810fc3ef
Removed some minor duplicity and ensured that hsync/NMI ends on the nominated cycle, not one afterwards.
2017-06-21 21:44:42 -04:00
Thomas Harte
15f6c51062
Added the most trivial implementation of the ZX81 wait line.
2017-06-21 21:28:14 -04:00
Thomas Harte
e1355d4b62
Restored proper video output.
2017-06-21 21:18:09 -04:00
Thomas Harte
4bf13610ce
Reinstated interrupts by moving the refresh test back into the refresh cycle.
2017-06-21 21:03:39 -04:00
Thomas Harte
0e0ce379b4
Renamed MachineCycle to PartialMachineCycle given that it mostly no longer intends to describe an entire machine cycle.
2017-06-21 20:38:08 -04:00
Thomas Harte
36e8a11505
Sought to simplify the way partial machine cycles are communicated, for ease of machine implementation. Also implemented the wait line.
2017-06-21 20:32:08 -04:00
Thomas Harte
e1a2580b2a
Renamed BusOperation to MachineCycle::Operation.
2017-06-17 21:53:45 -04:00
Thomas Harte
08a542a324
Reenabled the fast-loading hack.
2017-06-15 18:30:12 -04:00
Thomas Harte
9b3d05e05f
Simplified decoding logic.
2017-06-14 22:24:44 -04:00
Thomas Harte
d8e3103a2b
Fixes: switched ZX80 and ZX81 timing to the correct way around, ensured that my wait takes effect if HALT **isn't** set, and made sure to recover from it.
2017-06-13 21:48:17 -04:00
Thomas Harte
76a64d13a0
Made a first attempt at ZX81 emulation.
2017-06-13 21:25:55 -04:00
Thomas Harte
1e975859c2
Started splitting ZX80 and ZX81 paths. Also the '80 fires its horizontal sync a little earlier than the '81, so pulled that back a little.
2017-06-13 20:09:09 -04:00
Thomas Harte
4c5261bfa0
Made first attempt to use the horizontal counter for something; here for sync timing only, even though I've gone exclusively with '81-style timing for now.
2017-06-12 22:28:30 -04:00
Thomas Harte
8b09b4180b
This now at least remembers whether it is meant to be a ZX81 and has storage for a horizontal counter.
2017-06-12 21:33:16 -04:00
Thomas Harte
b9dbb6bcf8
Discovered my timing error: the I/R <-> A loads should take an extra cycle. This means the ZX80 now finally takes the correct 207 cycles per line. Fixed the video output wave to be clocked at the appropriate rate.
2017-06-12 18:55:04 -04:00
Thomas Harte
302c2e94de
Corrected lingering hard-coded mask. So titles for memory configurations above 1kb now load.
2017-06-11 21:27:46 -04:00
Thomas Harte
06fe07932a
While tidying up, killed an unused instance variable.
2017-06-11 21:21:26 -04:00
Thomas Harte
6913c7a018
This also can just use rom_mask_
.
2017-06-11 19:29:20 -04:00
Thomas Harte
6b602c74b7
Made an attempt to support memory maps other than the unexpanded default of 1kb.
2017-06-11 19:29:02 -04:00
Thomas Harte
e40d553045
Bumped the tape parser up into the machine to ensure a maintained state. Temporarily disabled normally-timed tape playback.
2017-06-11 18:31:43 -04:00
Thomas Harte
e5b30cdfbb
Attempted to ensure appropriate resumption of processing after quick-reading a tape byte.
2017-06-11 17:28:47 -04:00
Thomas Harte
ba5f34f827
Narrowed view to the centre 80% of a frame.
2017-06-11 17:24:32 -04:00
Thomas Harte
84d2feb2e6
Cleaned up and implemented fast-tape hack. I've decided it'd be better to test some other software, potentially to give multiple issues to think about, rather than sitting around with just the one.
2017-06-11 16:42:49 -04:00
Thomas Harte
d910a4fd38
Adjusted to signal an interrupt during the refresh cycle rather than weirdly just afterwards. Which cuts video timing down by 4 cycles a line. There still might be a problem here somewhere though, as I'm getting 206 cycles/line and the internet states it should be 207.
...
Also: lots of printfs have grown temporarily as I try to figure out what I'm doing so wrong as to break loading.
2017-06-11 13:32:20 -04:00
Thomas Harte
5626d35bc4
Tried flipping the bit meaning; decided at least to leave it in full-byte form.
2017-06-06 18:38:05 -04:00
Thomas Harte
63e0802f4e
Ensured tape input appears on the returned value.
2017-06-06 18:16:27 -04:00
Thomas Harte
e3ee9604a5
Added comments.
2017-06-06 18:01:33 -04:00
Thomas Harte
8c66e1d99d
Factored out ZX80/81 video and rejigged to ensure it will keep ticking over irrespective of whether the machine is supplying data.
2017-06-06 17:53:23 -04:00
Thomas Harte
ca9e8aecd6
Made a seemingly unsuccessful attempt to add tape input.
2017-06-06 10:13:32 -04:00
Thomas Harte
cc4cb45e9d
Implemented keyboard input and ensured that the signal generated is marked as composite, putting the colour-suppression ball into the CRT's court.
2017-06-06 09:25:18 -04:00
Thomas Harte
ebbf6e6133
Surprisingly, I think this may actually be the correct output: stopped throwing away the I part of the refresh register and flipped black and white.
2017-06-06 09:03:09 -04:00
Thomas Harte
cba07dec7e
Doubled up to display all eight pixels. To confirm that they are the wrong pixels.
2017-06-06 08:59:00 -04:00
Thomas Harte
6f7037b2b1
Made an initial stab at outputting half the correct pixels.
2017-06-06 08:55:07 -04:00
Thomas Harte
ef4b2f963d
Probably more-or-less corrected. But this is all a bit too interdependent.
2017-06-05 23:52:56 -04:00
Thomas Harte
97f3ff03b6
Restored white background and attempted to correct output timing deficiencies. Incomplete success.
2017-06-05 23:50:04 -04:00
Thomas Harte
2fbc7a2869
Made a very basic attempt at getting something that at least demarcates proper graphics output.
2017-06-05 23:32:49 -04:00
Thomas Harte
4983718df7
Got to outputting something to the CRT. Should be just proper syncs and a paper background. It's not synchronising properly, so something is amiss in my timing.
2017-06-05 10:47:42 -04:00
Thomas Harte
23ca00fd9a
Added memory fuzzing as a way to verify state being written by the Z80. Eventually discovered the HALT problem as fixed in the last commit, so have stripped away the caveman stuff again.
2017-06-05 10:36:07 -04:00
Thomas Harte
893f61b490
Attempted specifically to reproduce the 1kb ZX80 memory map in the hope of getting compact lines and in case mirroring is why I'm getting completely empty video reads. Still no action.
2017-06-05 09:38:49 -04:00
Thomas Harte
7e3a46c33e
[Re]discovered that sync may also be a product of the interrupt cycle. So started looking into that.
2017-06-04 21:54:55 -04:00
Thomas Harte
73654d51dd
Wired up actually to run.
2017-06-04 18:37:13 -04:00
Thomas Harte
096551ab3e
Made a first attempt to hash out the ZX80's bus. Video output isn't yet going though. Can't seem to find clarity on whether horizontal sync is really programmatic. Let's see.
2017-06-04 18:32:23 -04:00
Thomas Harte
c485c460f7
Imported the ZX80 and 81 system ROMs (though not publicly), added enough code to post their contents into C++ world.
2017-06-04 18:08:35 -04:00
Thomas Harte
d2637123c4
Added necessary support to get as far as an empty window when attempting to load a piece of ZX80 software.
2017-06-04 17:55:19 -04:00
Thomas Harte
2562306802
Merge branch 'master' into Z80
2017-05-16 21:05:00 -04:00
Thomas Harte
2ee8a7056e
Corrected TIA no longer to assume phase is an automatic quarter askew.
2017-05-16 20:43:28 -04:00
Thomas Harte
a5075d9eb5
Formalised the reasoning behind the colour phase fix-up and made it an opt-in per-caller value. Only the Oric currently needs to opt in.
2017-05-16 20:31:39 -04:00
Thomas Harte
eb8a2de5d6
Settled definitively on flush
as more communicative than synchronise
(and slightly more locale neutral); culled some more duplication from the Z80.
2017-05-15 07:38:59 -04:00
Thomas Harte
0808e9b6fb
Pulled the 6502 into a CPU namespace, making it an instance of something that has micro-opcodes and schedules them, and factoring out the formulation of a register pair.
2017-05-14 22:08:15 -04:00
Thomas Harte
8e35e913bb
Formally withdrew the 'load automatically' option for the Vic, having removed that option elsewhere.
2017-05-14 16:59:24 -04:00
Thomas Harte
5d91a2600d
Permitted ROM-style PRGs that are not a power-of-two in size, and added extra safety checks on loading data from a tape.
2017-05-08 22:15:35 -04:00
Thomas Harte
cb66c7e2dc
Performed some minor tidying.
2017-05-08 21:05:35 -04:00
Thomas Harte
61f8f2f18c
Switched to a more straightforward way of exiting from tape data loading.
2017-05-08 20:58:55 -04:00
Thomas Harte
7b43ae0a92
Implemented a catch for loading the data portion of files.
2017-05-07 22:22:59 -04:00
Thomas Harte
2807e3134f
Implemented speedy header finding. So that's half of it.
2017-05-07 20:32:48 -04:00
Thomas Harte
0771363f3b
Removed one piece of unnecessary logging.
2017-05-06 22:22:03 -04:00
Thomas Harte
2edf73908c
Temporarily disabled the existing fast loading implementation in pursuit of another, and started trying to correct the lack of connection between the userport VIA and the tape drive.
2017-05-06 22:00:12 -04:00
Thomas Harte
ed6b135015
Made final switch to permit high-sampling rate Atari audio.
2017-04-15 21:18:00 -04:00
Thomas Harte
f95015c7f6
Pulled out the divisor for audio.
2017-04-03 21:16:39 -04:00
Thomas Harte
814c0ada13
Fixed action counts for border motion.
2017-03-26 18:33:05 -04:00
Thomas Harte
dfc468f220
Locked down all initial state.
2017-03-26 15:47:04 -04:00
Thomas Harte
e01f3f06c8
Completed curly bracket movement.
2017-03-26 14:34:47 -04:00
Thomas Harte
3229502fa1
Standardised curly bracket placement across the Atari.
2017-03-23 21:59:16 -04:00
Thomas Harte
a26b87f348
Fixed: mistake was failure to count ready cycles.
2017-03-20 20:44:03 -04:00
Thomas Harte
4c3cc42c91
This gives a very noisy version of the real audio.
2017-03-20 20:38:29 -04:00
Thomas Harte
f3f4e1a541
Made a first, hacky, attempt at audio.
2017-03-20 19:35:51 -04:00
Thomas Harte
4722f6b5c4
Fixed sprite disappearance: test should be applied predecrement, not post — it relates to the address being used this access, not the next one.
2017-03-19 18:58:35 -04:00
Thomas Harte
7d8d1c7828
Fixed 'random' number generator.
2017-03-19 18:54:35 -04:00
Thomas Harte
4bb70e7d31
Resetting the mask upon low byte write appears to resolve some issues.
2017-03-19 18:49:37 -04:00
Thomas Harte
321030bb44
Added a slightly faulty but seemingly 'close' version of masking.
2017-03-19 18:28:06 -04:00
Thomas Harte
6c161b1150
This gives something that might be the correct background.
2017-03-19 17:49:48 -04:00
Thomas Harte
d5c37c8619
Shushed a little, so as to be able to see a reasonable amount of output during my lifetime.
2017-03-19 17:38:54 -04:00
Thomas Harte
7c66c36d3f
Attempted at least to manage appropriate data storage.
2017-03-19 17:31:08 -04:00
Thomas Harte
031a68000a
Added a class to contain the Pitfall 2 pager and a skeleton of initial work.
2017-03-18 22:08:47 -04:00
Thomas Harte
c3d82f88a5
Tidied up and commented on the Activision stack implementation.
2017-03-18 21:01:58 -04:00
Thomas Harte
c033bad0b9
Here's MNetwork!
2017-03-18 20:51:49 -04:00
Thomas Harte
c31d85f820
Re-emplaced the MegaBoy. Also cut detritus from the main Atari header.
2017-03-18 19:02:34 -04:00
Thomas Harte
217fbf257e
CBS RAM Plus returns.
2017-03-18 18:56:20 -04:00
Thomas Harte
0b611a14b9
Tigervision paging returns.
2017-03-18 18:50:13 -04:00
Thomas Harte
df6861c9dc
Parker Bros paging is back.
2017-03-18 18:21:01 -04:00
Thomas Harte
a4cd12394e
Reinstated the Activision stack pager.
2017-03-18 18:03:48 -04:00
Thomas Harte
e0bca1e37b
Reinstated the 16 and 32 kb Atari pagers, and ensured the 6532 always starts in a valid state.
2017-03-18 17:34:34 -04:00
Thomas Harte
55ce851bb2
Fixed types of the 8k cartridges, ensured the 6502 starts without an IRQ request history.
2017-03-18 17:04:01 -04:00
Thomas Harte
e8d34f2eb4
Having farmed out the bus, the Atari itself no longer is/owns a 6502.
2017-03-18 16:34:41 -04:00
Thomas Harte
bb3daaa99b
Sought to reintroduce the Atari 8k paging scheme, at the same time deciding to do away with the copy and paste of holding on to ROM data.
2017-03-18 15:04:01 -04:00
Thomas Harte
36b58d03b7
Formalised read bus value guarantee from the 6502, fixed missing clock signal wiring on the Atari cartridge class, reintroduced CommaVid support.
2017-03-18 14:46:46 -04:00
Thomas Harte
7958459db9
In theory unpaged cartridges should now work. Time to debug.
2017-03-18 14:01:04 -04:00
Thomas Harte
14a76af0d3
Started trying to float out bus control to cartridges.
2017-03-17 20:28:07 -04:00
Thomas Harte
afbd9fd41b
Fixed declared line length.
2017-03-14 21:33:38 -04:00
Thomas Harte
7302703039
Implemented the Activision stack paging scheme.
2017-03-14 20:24:05 -04:00
Thomas Harte
97a8a96593
Rejigged how the memory map is handled and implemented MNetwork support.
2017-03-14 20:07:54 -04:00
Thomas Harte
3b29276228
Implemented the MegaBoy paging scheme.
2017-03-14 17:40:01 -04:00
Thomas Harte
b3632a4e86
Institutes CBS RAM Plus emulation.
2017-03-14 17:25:10 -04:00
Thomas Harte
f0d944847b
Fixed setting of the second 1kb.
2017-03-11 18:16:29 -05:00
Thomas Harte
add14fb43a
Made an attempt to implement Tigervision paging.
2017-03-11 17:44:35 -05:00
Thomas Harte
33bda2d40c
Switched to image inspection for RAM guesses rather than disassembly. Which fixes the other Parker Bros titles.
2017-03-11 13:04:23 -05:00
Thomas Harte
2b5e3a600e
Made a first attempt at implementing the Parker Bros pager within the emulation.
2017-03-11 12:43:12 -05:00
Thomas Harte
9c72ce5bd2
Ensured a settling delay is permitted before an NTSC/PAL decision is made. To avoid false switches just due to startup.
2017-03-06 19:37:35 -05:00
Thomas Harte
79784a8e57
Followed tip: missiles are locked to the position after four output pixels, not four input pixels.
2017-03-04 22:23:50 -05:00
Thomas Harte
4751615623
Fixed NTSC colour cycle count, and hence the 2600's reported line lengths and phase offset.
2017-03-04 17:31:39 -05:00
Thomas Harte
d3257c345a
Tested against public ROMs and corrected. Also moved the deferred adjustment into a more canonical place.
2017-03-04 17:00:28 -05:00
Thomas Harte
837cccdf83
Switched to deferred updates for the 6532.
2017-03-04 14:58:28 -05:00
Thomas Harte
93d1573481
Added a fix for certain homebrews.
2017-03-01 07:59:25 -05:00
Thomas Harte
893a5dd007
Added an artificial low pass filter, attempting to capture post-digital effects.
2017-02-28 21:29:55 -05:00
Thomas Harte
06dd98b23c
Pulled the reset time for horizontal blank extend up to position 224.
2017-02-28 20:28:54 -05:00
Thomas Harte
184c8ae707
Extended to emulate the CommaVid.
2017-02-27 20:50:59 -05:00
Thomas Harte
9d7985c1e1
Added Super Chip emulation.
2017-02-26 17:47:29 -05:00
Thomas Harte
e6a84fd26b
Attempted a hardware-correct implementation of missile-to-player latching. This completes the last of the **knowing** inaccuracies. The rest are as-of-yet unwitting.
2017-02-26 15:12:31 -05:00
Thomas Harte
440467ea3e
Started communicating which copy is being requested.
2017-02-26 13:39:25 -05:00
Thomas Harte
98376de9ad
Started returning 'no effect' for pot ports, rather than doing nothing. Still very much TODO though.
2017-02-25 22:58:58 -05:00
Thomas Harte
e61e355251
Moved to the maximum possibly required queue length of 4. Though the emulated 2600 should never need more than 2 slots as per the current calling pattern, it's not a contractual guarantee.
2017-02-25 17:25:10 -05:00
Thomas Harte
c898c8a99e
Ensured the missiles and ball don't attempt to enqueue. Because I don't think they're supposed to.
2017-02-25 17:13:22 -05:00
Thomas Harte
8c9062857c
Added a single-slot queue for player objects to defer drawing, thereby deferring pixel lookup. Which I think is correct. Though more slots might be needed.
2017-02-25 17:10:24 -05:00
Thomas Harte
77ed4ddc05
Slightly simplified ready line release logic.
2017-02-23 21:08:32 -05:00
Thomas Harte
82f392fada
This should be the other way around. I want whichever is later.
2017-02-22 21:54:49 -05:00
Thomas Harte
8291a63d5f
Fixed loss of audio when switching to PAL.
2017-02-22 21:15:37 -05:00
Thomas Harte
6120dae61a
While I'm using the hacky approach to player/missile synchronisation, I need to seed adder.
2017-02-22 07:39:11 -05:00
Thomas Harte
4f5f191cd6
Fixed: will no longer attempt to output pixels from before the pixel part of a line on which sync was disabled abruptly.
2017-02-22 07:33:36 -05:00
Thomas Harte
21abf4e9fc
Enshrined a terminology switch, albeit without any flow change behind it.
2017-02-22 07:29:48 -05:00
Thomas Harte
144d6b70d9
Minor cleaning.
2017-02-22 07:14:30 -05:00
Thomas Harte
b769f22ca0
Switched back to the collision_buffer_ being part of the TIA object, added one more assert.
2017-02-21 22:26:20 -05:00
Thomas Harte
7019d396d0
Threw in some asserts, discovering a bug in missile positioning.
2017-02-21 22:04:27 -05:00
Thomas Harte
f4447fd9cd
Attempted to fix failure of sprites properly to wrap when performing motion.
2017-02-21 21:53:09 -05:00
Thomas Harte
36396b3d62
Made a slightly better, albeit still inaccurate, version of missile-player lock.Enough for Combat to do reasonable things.
2017-02-21 20:45:20 -05:00
Thomas Harte
d1dbf8c21f
Missile to player lock is supposed to be a toggle; also factored out the commonalities of missile and ball drawing.
2017-02-21 07:58:37 -05:00
Thomas Harte
1bde0fed6f
Simplified relationship between Objects and the usage-specific components through inheritance.
2017-02-21 07:37:20 -05:00
Thomas Harte
7ab2358bba
Made an attempt to reintroduce missiles.
2017-02-20 22:22:39 -05:00
Thomas Harte
99547181f1
Attempted to template this thing. Without yet a plan in place for pixel lookup timing.
2017-02-20 21:42:59 -05:00
Thomas Harte
2bf784535c
Simplified calllng.
2017-02-20 18:04:40 -05:00
Thomas Harte
57f434c199
Reorganised state, with an eye towards unifying object motion and triggers.
2017-02-20 17:58:28 -05:00
Thomas Harte
99a35266e1
Attempted to bring frequency-switching logic into the cross-platform realm. Which for now creates an issue with the OpenGL context.
2017-02-19 21:20:37 -05:00
Thomas Harte
51bcaea60c
Disabled incorrect 'optimisations'.
2017-02-19 12:00:04 -05:00
Thomas Harte
e00339ef0a
Attempted to reintroduce the ball.
2017-02-19 08:02:54 -05:00
Thomas Harte
53cd125712
Added stub calls to draw the missiles and ball.
2017-02-19 07:28:24 -05:00
Thomas Harte
04693b067c
Fixed failure of the optimised route to pump the pixel clock; removed optimisation entirely for now.
2017-02-18 21:36:48 -05:00
Thomas Harte
cd7876a746
Reintroduced the extra clocking delay.
2017-02-18 20:18:50 -05:00
Thomas Harte
ed5ff49ef5
Fixed vertical delay, retreated from my previous thought about adding the one extra cycle of sprite delay, at least temporarily.
2017-02-16 20:52:01 -05:00
Thomas Harte
8d502a0b03
Decided not to run before I can walk and switched to storing the motion time and next step explicitly per object.
2017-02-16 20:28:37 -05:00
Thomas Harte
5ea232310f
Added a check against negative runs.
2017-02-16 18:55:58 -05:00
Thomas Harte
09309aa74f
Attempted to prevent extraneous moves.
2017-02-16 18:52:39 -05:00
Thomas Harte
b5357860b9
Made an attempt to split things apart so as to be able to introduce the proper sprite latency.
2017-02-14 20:56:16 -05:00
Thomas Harte
cd90118a0f
Added two, extraordinarily simple tests.
2017-02-12 20:32:53 -05:00
Thomas Harte
25776de59d
I think unit testing this thing is the only way forwards. Started adding appropriate hooks.
2017-02-12 19:55:02 -05:00
Thomas Harte
600bdc9af7
In C++, I think the implicit cast to bool negates the need for any manual collapsing?
2017-02-12 18:18:35 -05:00
Thomas Harte
0c9be2b09e
Shunted the collisions buffer onto a separate area of the heap for the time being, as a debugging aid. Also added a few more initial values.
2017-02-12 18:16:50 -05:00
Thomas Harte
df8a5cbe6d
Made attempts (i) to respect the delay flag; and (ii) to account for border-region sprite clocking.
2017-02-12 17:35:09 -05:00
Thomas Harte
9ce68c38ae
Made an effort to implement proper pixel output for sprites.
2017-02-12 14:01:50 -05:00
Thomas Harte
40954d6a2a
Attempted to factor out parts I expect to reuse for missiles and the ball.
2017-02-12 11:31:17 -05:00
Thomas Harte
ac444a3f34
Corrected both position increments and target time calculation.
2017-02-11 21:24:14 -05:00
Thomas Harte
b8abeced6d
Made an attempt to introduce the proper eventful loop for player output. With debugging yet to occur.
2017-02-11 21:01:58 -05:00
Thomas Harte
aeff59addc
Implemented motion 'correctly', for programs written to do all work outside of the pixel area.
2017-02-11 20:25:49 -05:00
Thomas Harte
aff69dbc34
Resolved spurious static analyser issue; screen mode will always be 0–6 but it doesn't know that. Setting a non-zero divider doesn't feel worth worrying about for a cleaner compile.
2017-02-11 13:35:22 -05:00
Thomas Harte
6381e4e1b0
All that's happened to position is that numbers have been added to it. So it can't be negative, given that it wasn't before. So a regular modulo will do.
2017-02-11 13:34:36 -05:00
Thomas Harte
905ed1f87b
Switched to the more natural type, which is also signed, making my logic less prone to error.
2017-02-11 13:16:53 -05:00
Thomas Harte
8de6caf6ff
Started trying to get into a proper structure here. Chickened out.
2017-02-11 12:59:13 -05:00
Thomas Harte
40d3f5f7f6
Attempted properly to respect start
.
2017-02-11 08:26:09 -05:00
Thomas Harte
64d5712d1d
Added an incorrectly-coded version of horizontal move, at least so that I can verify that information is going into the correct slots.
2017-02-10 07:23:43 -05:00
Thomas Harte
3b20d862f0
Made an initial attempt to mark sprite positions. But without hmove implemented, they're all over the place.
2017-02-09 20:53:42 -05:00
Thomas Harte
2e9ef2b0ef
Took a shot at reinstating the horizontal blank extend flag.
2017-02-09 18:37:19 -05:00
Thomas Harte
70745286a5
Ensured this array is properly aligned for the uin32_t
accesses I intend to make for background drawing.
2017-02-08 20:25:23 -05:00
Thomas Harte
dcb7584060
Added the four-cycle playfield output latency and ensured you can't get smaller-than-usual pixels by rapid register value changing.
2017-02-08 07:30:32 -05:00
Thomas Harte
a477499724
Got a bit more explicit with range returned by get_cycles_until_horizontal_blank
and hence attempted a more thorough (/correct) version of WSYNC.
2017-02-07 22:14:45 -05:00
Thomas Harte
944d835eea
Switched explicitly to an accumulation model for filling the collision buffer.
2017-02-06 21:59:28 -05:00
Thomas Harte
8f5039130c
Changed index naming order to ensure no out-of-bounds accesses.
2017-02-06 21:48:41 -05:00
Thomas Harte
ba165bb70a
Made an attempt properly to populate collision registers from the collision buffer.
2017-02-06 21:15:55 -05:00
Thomas Harte
474e2e8d2c
Fixed once again to respect mid-line palette changes.
2017-02-06 20:09:12 -05:00
Thomas Harte
8b8eb787df
Fixed complete invisibility.
2017-02-06 18:42:58 -05:00
Thomas Harte
66bcdd36f3
Made an attempt to introduce an intermediate buffer that ends up with a bit mask of all graphical components present on it, and to use that to infer collision flags and colours, based on playfield priority and colour palette. Immediately yielding: a blank screen. Good work!
2017-02-06 18:29:00 -05:00
Thomas Harte
6bcf95042c
Started trying to be a bit more explicit about usage, and to divide up drawing responsibility.
2017-02-05 17:51:56 -05:00
Thomas Harte
f2437cb257
Added some additional documentation, started making steps towards returning sprites, fixed a counter bug that would exhibit as incorrect sync.
2017-01-31 20:30:32 -05:00
Thomas Harte
abe04334c2
Attempted to retain more player information, and removed the output cursor from class storage as I think it's acceptable as a temporary.
2017-01-30 22:42:27 -05:00
Thomas Harte
8545707b54
Reinstituted the playfield. Probably needs more buffering though. Time to look into delays.
2017-01-30 21:38:58 -05:00
Thomas Harte
2b08758b2b
Started capturing playfield/ball and background colours.
2017-01-30 08:08:03 -05:00
Thomas Harte
764b528891
Made a first attempt at switching to a model that respects blank and sync.
2017-01-30 07:19:19 -05:00
Thomas Harte
92754ace7a
Some mild fixes get me up to having a rolling screen of vertical lines. Which is what I was hoping for right now!
2017-01-29 22:16:23 -05:00
Thomas Harte
d51f185dc7
Made an attempt to reintroduce the basic horizontal loop.
2017-01-29 15:43:57 -05:00
Thomas Harte
2390358c24
Prevented unbounded CPU usage, albeit without yet deciding who has authority for the clock rate.
2017-01-29 14:19:26 -05:00
Thomas Harte
2432a3b4d7
Fixed condition — >= is smarter.
2017-01-29 14:00:01 -05:00
Thomas Harte
9c3597c7e3
Attempted to reintroduce enough logic to handle [most of] line timing, such that WSYNC works. Initial objective is to get back to having a working background.
2017-01-29 13:47:36 -05:00
Thomas Harte
fba6baaa9c
Stubbed and disabled to get back to building.
2017-01-28 21:56:01 -05:00
Thomas Harte
a246530953
Supposing the TIA were implemented, this is (more or less) what the Atari 2600 would now look like.
2017-01-28 21:46:40 -05:00
Thomas Harte
0ffded72a6
Created a placeholder class for a factored-out TIA. There's a bit more it'll need to do, like vending (or receiving) a CRT but this is the full hardware stuff, I think.
2017-01-28 16:19:08 -05:00
Thomas Harte
6d087ca054
Restored 2600 audio.
2017-01-25 21:29:19 -05:00
Thomas Harte
be1cb2a551
Fixed NTSC phase.
2017-01-11 21:31:24 -05:00
Thomas Harte
6153ada33b
Fixed Electron's support for automatically booting floppy disks.
2017-01-08 14:46:19 -05:00
Thomas Harte
8cd1575891
Similar fix to that over in Oric land: ensure a known, effective initial value for the Plus 3's control register.
2016-12-28 18:52:36 -05:00
Thomas Harte
90151e2094
Fixed to ensure a known initial control register value, which has taken effect.
2016-12-28 18:49:32 -05:00
Thomas Harte
a568172758
Made steps towards proper CRC generation. Am currently comparing against Oric disk images, as — amongst other things — they include precomputed CRCs.
2016-12-28 18:29:37 -05:00
Thomas Harte
4fca30b81f
Made the Plus 3 less chatty, documented invalidate_track
.
2016-12-25 21:06:58 -05:00
Thomas Harte
3805e3d17d
Ensured base address is set properly at construction.
2016-12-22 22:46:02 -05:00
Thomas Harte
63107cd492
Tidied, very slightly.
2016-12-15 19:49:25 -05:00
Thomas Harte
a555c5762a
Rearranged code, hopefully into a more logical grouping.
2016-12-15 19:47:04 -05:00
Thomas Harte
4a7ddaf2e9
Added documentation and a quick note to self.
2016-12-15 19:43:04 -05:00
Thomas Harte
f61176cd7d
Reinstituted something of the don't-do-pixel-work-until-an-affecting-write-occurs optimisation.
2016-12-15 19:20:14 -05:00
Thomas Harte
c1c70a767a
Attempted fully to reinstate proper timing.
2016-12-15 18:52:16 -05:00
Thomas Harte
0326316bb8
Reinstated whole-frame counting. Thereby to reinstate proper interrupts.
2016-12-15 18:09:49 -05:00
Thomas Harte
b58b11fc93
Switched to a table-based dispatch of line-by-line actions, primarily to simplify.
2016-12-15 18:07:46 -05:00
Thomas Harte
fd541e1142
An early draft; dealing with the issue that not all cycles are necessarily consumed in a single call. Incomplete; broken. Committing for cross-machine visibility.
2016-12-12 08:01:10 -05:00
Thomas Harte
be7e05e109
Started attempting to move total responsibility for display-related interrupts and RAM timing into the video.
2016-12-11 18:34:49 -05:00
Thomas Harte
c5cf8d9531
Ensured the video subsystem correctly handles requests to run over a frame boundary.
2016-12-11 16:17:51 -05:00
Thomas Harte
52028432e1
Restored some semblance of output.
2016-12-10 22:19:10 -05:00
Thomas Harte
0aae1bd1ef
Fixed calculation of termination cycle.
2016-12-10 21:35:41 -05:00
Thomas Harte
c43e481a33
Started factoring video out of the Electron.
2016-12-10 21:07:52 -05:00
Thomas Harte
e62be03673
Removed endianness assumption.
2016-12-10 19:10:33 -05:00
Thomas Harte
a5683dfb21
Removed now untrue comment.
2016-12-10 15:19:48 -05:00
Thomas Harte
0e71802b92
Reduced Oric video to single nibble constants. Removed attempt at asynchronous flush as no longer required.
2016-12-10 14:17:46 -05:00
Thomas Harte
580f347727
Fixed Oric SCART mode by having it change what it's giving to the CRT based on which shader it knows will be active.
2016-12-10 13:55:56 -05:00
Thomas Harte
a549fd1ecc
Introduced the ability simply to piggy-back off the CRT's natural phase for the colour burst, thereby eliminating a couple of redundant independent attempts in the Oric and Electron.
2016-12-10 13:42:34 -05:00
Thomas Harte
6cdd41e5a9
Added direct use of the colour ROM, uploading 16 bits per pixel to contain the entire ROM composite wave.
2016-12-09 22:17:10 -05:00
Thomas Harte
3b5962b171
This is an initial attempt at using the actual Oric colour ROM values for composite video generation.
2016-12-09 20:01:27 -05:00
Thomas Harte
c304db0f5a
Deintegrated the busy flag and the interrupt request line, as the latter is reset by status reads. Which also means I can start reporting the WD INTRQ line status directly from the Microdisc. That appears to be correct, rather than honouring the Microdisc IRQ select there.
2016-12-06 21:16:29 -05:00
Thomas Harte
ebb62a2d78
Switched the 2600 to postfix and non-camel-case instance variable names.
2016-12-03 14:07:38 -05:00
Thomas Harte
b81c058c0a
Factored out the Atari 2600's 6532 connection, as a low-hanging fruit.
2016-12-03 13:41:55 -05:00
Thomas Harte
3361d6b93a
Factored out the Atari 2600 speaker and adjusted it to postfix underscores.
2016-12-03 13:39:46 -05:00
Thomas Harte
1b1a8d3e52
Brought the Vic-20 into suffix naming.
2016-12-03 13:30:27 -05:00
Thomas Harte
063a62372f
The Commodore serial bus and C1540 are now postfix underscorers.
2016-12-03 13:14:03 -05:00
Thomas Harte
eb3a1fbfb7
Commuted remaining Electron underscores. It would be nice also to factor out the video, but the time hasn't come yet.
2016-12-03 13:01:01 -05:00
Thomas Harte
4fac538a57
Factored out the Electron's speaker and adjusted instance variable naming.
2016-12-03 12:41:02 -05:00
Thomas Harte
d1d93829cf
Factored out the Tape and switched it to postfix underscores.
2016-12-03 12:18:08 -05:00
Thomas Harte
2003b514aa
Switched the typer to postfix underscores.
2016-12-03 10:55:50 -05:00
Thomas Harte
81ee834530
As well as a bunch of logging, reinstated rotation position preservation across tracks.
2016-12-02 18:36:47 -05:00
Thomas Harte
93c573bfa9
Implemented missing status bits (other than the index hole), and a head loading delay for the Microdisc.
2016-12-01 21:13:16 -05:00
Thomas Harte
442986ee2c
Introduced a head loading path for 1793 machines.
2016-12-01 20:12:22 -05:00
Thomas Harte
82899f2f47
Ensured flag setting is atomic, removed duplication of interrupt request versus busy, found better names for the personality testers, unified delegate protocol.
2016-12-01 07:41:52 -05:00
Thomas Harte
9b6c5e814a
Now that it can be more explicit, this should admit that it's '93-based, not '73.
2016-11-28 16:22:35 -05:00
Thomas Harte
2f459690d4
It would appear the 1770 and 1773 actually differ in relation to the (non-sensical) ability not to spin-up for a Type 2, and whether a side compare can occur. So the WD1770 class now requires a personality to be specified. Which it singly fails to honour.
2016-11-26 23:29:30 +08:00
Thomas Harte
e9d6566e9c
Of course, changing the IRQ enable may immediately change the IRQ line. Signal if so.
2016-11-26 09:35:44 +08:00
Thomas Harte
73d30b9c00
Corrected typo.
2016-11-25 21:30:45 +08:00
Thomas Harte
12956901d6
Filled in some register mirrors.
2016-11-25 21:28:11 +08:00
Thomas Harte
54246c8f1a
Interrupt enabling works the other way around I think, and both registers with only one bit defined should probably return '1' in all other places?
2016-11-25 21:24:59 +08:00
Thomas Harte
8be81f6ebd
Supplied disks are given to the Microdisc.
2016-11-25 20:53:38 +08:00
Thomas Harte
4af678d2ed
Gave the Microdisc a clock signal, added just enough of force interrupt to avoid a spurious belief that a type 3 command has started.
2016-11-25 20:51:39 +08:00
Thomas Harte
5c019ad1c0
Okay, so it looks like both ROM paging flags are the opposite of what I previously had.
2016-11-25 20:42:40 +08:00
Thomas Harte
5be45c6c50
Ensured proper default behaviour.
2016-11-25 20:30:27 +08:00
Thomas Harte
d33f3b9224
This is the broad strokes effort at enabling Microdisc emulation.
2016-11-25 20:15:48 +08:00
Thomas Harte
7c2d9f3752
This seems to be right, per http://wiki.defence-force.org/doku.php?id=oric:hardware:floppy_disk_controller_wd1793
2016-11-22 22:35:43 +08:00
Thomas Harte
5ebc1c63ff
Switched video to postfix underscores, for consistency.
2016-11-22 22:28:45 +08:00
Thomas Harte
707763f80b
Added Microdisc storage to the Oric class, switching all instance storage to postfix underscore while I'm here.
2016-11-22 22:22:00 +08:00
Thomas Harte
0c3644f350
Made a second parse at logic. We'll see.
2016-11-22 22:12:32 +08:00
Thomas Harte
03843bf934
Unified delegates. Let's keep it easy for the caller.
2016-11-22 22:11:11 +08:00
Thomas Harte
13a608a8c2
Added what may be correct paging logic.
2016-11-22 22:09:52 +08:00
Thomas Harte
363db695e8
Started implementation of the Microdisc selection logic.
2016-11-22 08:12:53 +08:00
Thomas Harte
09f965e6a9
Fixed potential bug whereby inserting a disk into a drive that hadn't been lazily allocated yet but had already been selected wouldn't take effect.
2016-11-22 08:11:57 +08:00
Thomas Harte
ea33a28695
Any Oric-format disks that are inserted now make it all the way to the Oric, along with a request to emulate the Microdisc. It has received a copy of the ROM. The ball is entirely in its court now.
2016-11-21 20:59:25 +08:00
Thomas Harte
311f8c0b47
Restored audio.
2016-11-16 11:10:07 +08:00
Thomas Harte
8b40ae03ca
Extended analysis to spot IRQ and NMI vector changes, for titles that simply adjust those then exit. Ensured Oric emulator can type and load quickly on an Oric 1 just as well as on an Atmos.
2016-11-15 11:05:53 +08:00
Thomas Harte
e2cdfae8a7
The emulated Oric now has access to both versions of the BASIC ROM and picks between them based on the static analyser's recommendation.
2016-11-15 10:39:16 +08:00
Thomas Harte
9c550c594a
Moved audio work back into its own thread, but this time it queues up an all happens only upon a flush. Hopefully to resolve synchronisation cost concerns.
2016-11-09 21:17:50 -05:00
Thomas Harte
64827931bf
Switched the Oric implementation simply to rely upon the Storage-level tape parser. So now there's only one, authoritative one of those.
2016-11-07 21:57:58 -05:00
Thomas Harte
45b169f341
Made a few mapping fixes, clarified where the default reset code lives, ensured the Oric and Vic clear their keys when the typer ends.
2016-11-05 15:28:03 -04:00
Thomas Harte
338904fffe
Made similar cleanings of the Electron and Vic.
2016-11-05 15:07:57 -04:00
Thomas Harte
9fb9d92437
Made the typer much more able to help out, and thereby tidied and separated the Oric's typer.
2016-11-05 14:47:09 -04:00
Thomas Harte
626e719fab
Added sanity checks on loading quickly.
2016-11-03 22:50:49 -04:00
Thomas Harte
a7e4c0c3b5
Switched to a ROM trap for typing.
2016-11-03 22:21:05 -04:00
Thomas Harte
8c70dc5891
Implemented typer for the Oric, and I'm starting to think the code is a bit too repetitious. Refactoring will be forthcoming. Added CLOAD"" as the loading command for all Oric software.
2016-11-03 22:14:40 -04:00
Thomas Harte
9c2df231ce
Made fast loading optional.
2016-11-03 07:59:30 -04:00
Thomas Harte
e9f1a6a79d
This appears to be it. The secret? Don't worry about the stop bits. They're just processing time. Latch onto the next start.
2016-11-03 07:34:48 -04:00
Thomas Harte
827a919368
This is an initial attempt at reading actual tape data. It loses sync though.
2016-11-02 22:30:53 -04:00
Thomas Harte
419629ee6e
Completed proof of theory for fast loading. It's just an around-the-back direct-to-file hack for now though.
2016-11-02 21:09:49 -04:00
Thomas Harte
bb58caff52
Merge branch 'master' into FastOricTape
2016-10-31 22:11:03 -04:00
Thomas Harte
21604376e6
Reintroduced clocking of the AY and boxed in the range of the master divider a little further.
2016-10-30 22:51:08 -04:00
Thomas Harte
33512988fb
Added a basic cycle skipper plus some notes.
2016-10-30 22:39:47 -04:00
Thomas Harte
b04ba41951
Moved code out of header.
2016-10-30 20:16:58 -04:00
Thomas Harte
3b52ab0d37
Cut some dead state.
2016-10-30 20:16:52 -04:00
Thomas Harte
58f888c6ad
Limited CRT calls.
2016-10-30 16:21:20 -04:00
Thomas Harte
1ff9b474bf
Made an attempt to make execution flow through this loop more straightforward for a branch predictor.
2016-10-30 15:30:39 -04:00
Thomas Harte
7843a244b0
Ensured emulation doesn't enter an infinite loop if the user attempts to read beyond the end of a tape.
2016-10-28 22:23:25 -04:00
Thomas Harte
4fab794747
Added a direct-to-two-cycles emulation path for 6522 owners.
2016-10-27 21:13:25 -04:00
Thomas Harte
2eda0b3c86
Attempted to simplify the logic behind the most common 6522 usage.
2016-10-27 21:06:31 -04:00
Thomas Harte
30d4a7c662
Fixed: blinking means ink vanishing and appearing. Nothing else.
2016-10-24 21:58:15 -04:00
Thomas Harte
09687a2e2f
Removed errant newline.
2016-10-20 21:30:12 -04:00
Thomas Harte
44910d90ba
Adjusted aberrations in semicolons.
2016-10-20 21:20:13 -04:00
Thomas Harte
6292ac5b26
Yet more .hpp clean(s)ing.
2016-10-20 21:15:21 -04:00
Thomas Harte
c5948ef177
Evicted more header-resident code.
2016-10-20 21:05:32 -04:00
Thomas Harte
d335991e60
Shifted code out of the header.
2016-10-20 20:53:17 -04:00