Thomas Harte
cd97617a8a
Bumped the speaker up to the full namespace, since Tape lives there to avoid delegation complexity. Turned the CRT into something the Electron statically owns, fixing a memory leak by simplifying.
2016-01-23 17:45:06 -05:00
Thomas Harte
f4cd0aa38e
Ensured that all relevant information is given to the tape class. Made an attempt not to write to a screen output buffer if we don't have one. Added some debug printing.
2016-01-23 13:09:56 -05:00
Thomas Harte
949c33774a
Fixed failure to set a delegate, slowed tape speed if operating in RAM.
2016-01-23 11:42:14 -05:00
Thomas Harte
43a7d1b7ae
It'll be helpful to be able to isolate the tape interface when I'm faking a fast load. So factored out.
2016-01-23 00:14:44 -05:00
Thomas Harte
0efe4b312c
Disabled my various bits of rate interchange debugging; improved test for when to call update_display due to a RAM write.
2016-01-21 22:16:52 -05:00
Thomas Harte
82cb1c365c
Further simplified inner loops.
2016-01-21 21:35:04 -05:00
Thomas Harte
34640cec93
Started trying to move some logic out of the inner loop.
2016-01-21 21:28:09 -05:00
Thomas Harte
48ddd3c497
Set about documenting the CRT; while doing so decided to add an optional clock divider for input; having done so decided to try to exploit it with the Electron.
2016-01-21 21:17:47 -05:00
Thomas Harte
de7218cdf0
Added a lot of commenting to the CPU6502 definition, simplifying its construction. Added missing nullability modifier to CSElectron. Fixed bad-habit Objective-C style naming on the Electron's Interrupt enum.
2016-01-20 21:55:38 -05:00
Thomas Harte
4c16d34063
Moved set_tape so that the inline definition of get_next_tape_pulse is visible to it. Also eliminated some dead typedefs.
2016-01-20 08:27:25 -05:00
Thomas Harte
280a2292ff
Shushed.
2016-01-19 23:33:15 -05:00
Thomas Harte
9036cf3b7c
Thus did the first UEF load.
2016-01-19 23:03:27 -05:00
Thomas Harte
e65cd4cf06
Some data is marginally reaching the CPU from the tape.
2016-01-19 22:05:34 -05:00
Thomas Harte
956b90e203
Attempted further to improve latency; added view adjustment for non-4:3 output aspect ratios. The 4:3 is currently hardcoded, so further work will be required.
2016-01-18 23:55:52 -05:00
Thomas Harte
e63b6d22ae
As shown by the commented-out code, the aliasing-adaptation seems to be working. So something is wrong somewhere else.
2016-01-14 21:59:37 -05:00
Thomas Harte
383b2be4c6
Fixed one off-by-one error.
2016-01-14 21:33:27 -05:00
Thomas Harte
8bd04a6be4
Switched model for filter subclasses. Implemented test square[-ish] wave to check for obvious stream errors. None is clear.
2016-01-14 21:27:02 -05:00
Thomas Harte
38ffcaa262
Here, at last, is _some_ audio output, at least.
2016-01-14 20:33:22 -05:00
Thomas Harte
439d452e23
Resolved some errors.
2016-01-13 22:11:33 -05:00
Thomas Harte
49e89a4bcb
I'm not yet completely convinced by my approach to time basing, but it'll probably do? If so then this more or less gets me ready for a point-sampled filtering.
2016-01-13 22:02:39 -05:00
Thomas Harte
d9a7ef9e46
Edging towards audio output; the speaker is given appropriate input and output rates, and then updated with current divider and enabled/disabled status.
2016-01-13 21:03:43 -05:00
Thomas Harte
d28abdc037
Made an attempt at correct timing, adding support for additional paged ROMs, added file association for .rom.
2016-01-12 22:34:26 -05:00
Thomas Harte
84ba4e2900
Tidied a little, started working towards supporting speaker output.
2016-01-12 22:19:56 -05:00
Thomas Harte
75d6ec354b
Added some very basic filtering in RGB mode.
2016-01-12 16:27:09 -05:00
Thomas Harte
cba09b5490
Switched display update and RAM write order.
2016-01-11 22:29:16 -05:00
Thomas Harte
650077feac
Pulled a few things out as constants, zoomed in a little. Still in a 4:3 window though.
2016-01-11 22:18:34 -05:00
Thomas Harte
72019d0ea3
Made an attempt to get video output correct.
2016-01-11 22:08:30 -05:00
Thomas Harte
e93dbdb463
Implemented keyboard input.
2016-01-11 19:48:31 -05:00
Thomas Harte
ce916ebd6a
Fixed runaway frame generator.
2016-01-10 23:32:57 -05:00
Thomas Harte
ccf20299a3
Made an attempt at getting some interrupts all up inside this thing.
2016-01-10 19:06:46 -05:00
Thomas Harte
cc5ba8243e
Fixed: turned out the power-on bit was being cleared.
2016-01-10 17:17:39 -05:00
Thomas Harte
d95414b2eb
I'm not really sure what's going wrong with paging yet but this fixes the 0xc000 byte error.
2016-01-10 12:30:24 -05:00
Thomas Harte
e07981c147
Fixed screen start address.
2016-01-09 22:52:08 -05:00
Thomas Harte
1308332a71
Hard-coded to 40 columns of black and white, here's some text, at least.
2016-01-09 22:39:46 -05:00
Thomas Harte
037602765a
This now correctly (I think) decodes information posted to the CRT. But doesn't yet post it correctly. I'm very close now, I hope.
2016-01-09 22:19:00 -05:00
Thomas Harte
07a041d788
Fixed vertical retrace sync.
2016-01-09 21:54:31 -05:00
Thomas Harte
3d6f20b7b9
Output, at last! Though sync is clearly way off.
2016-01-09 21:53:33 -05:00
Thomas Harte
b4f31edea3
Made an attempt to get RGB output mode up and running, and showing at least a box where pixels would be.
2016-01-09 21:32:56 -05:00
Thomas Harte
a900bfed65
Fixed to ensure that frame rendering wraps around, and to properly connect the Electron to its view. Now I need a working pixel shader.
2016-01-09 20:34:22 -05:00
Thomas Harte
7341f5c341
This is intended to be enough to start producing something of an output. But something's obviously still broken.
2016-01-09 20:26:40 -05:00
Thomas Harte
716bb3281b
This at least now connects up a CRT, though it never talks to it.
2016-01-07 22:26:49 -05:00
Thomas Harte
47a7654c00
Added just enough that this is probably a successful boot. I guess I'm going to need to get invested in graphics next? Hmmm.
2016-01-07 21:01:13 -05:00
Thomas Harte
8c1bfa5a05
This is the bare minimum to prove that the ROM is trying properly to boot.
2016-01-07 20:36:27 -05:00
Thomas Harte
0db8938d27
Added the option for the CSCathodeRayView to show only a subsection of the full scan area. Zoomed in a little on the 2600. Put in enough piping to give the Electron sight of its ROMs at least.
2016-01-06 23:14:36 -05:00
Thomas Harte
bfd9957c81
You now get an Electron only if you ask for a new file. That'll do for now while it's the only thing that one might want to start without supplying a file. The 6502 now starts from a defined point — being reset. The Electron is starting to grow the absolute most simple buds of its memory map.
2016-01-06 21:09:49 -05:00
Thomas Harte
ab45c1d530
Started working on a shell for the Electron emulation, including factoring out the common CRT delegate -> Objective-C bridging, serial dispatch queue and frameskipping logic from the Atari 2600 shell.
2016-01-04 23:12:47 -05:00
Thomas Harte
675070c5dd
Very, _very_ minor: switched to normal C++ constructor syntax for simple variable initialisation.
2015-12-06 16:53:37 -05:00
Thomas Harte
5d6bee4927
Of course, being in-phase means being the cosine wave.
2015-09-10 21:30:39 -04:00
Thomas Harte
82aa6d074a
'type' is out, at least for the time being.
2015-09-05 20:25:30 -04:00
Thomas Harte
7fb6c86d9d
Okay, it looks like colour 3 is approximately phase offset 0, and the palette wraps around after 14 entries, not 16. Also got a bit less dependent on floating point accuracy for the step.
2015-09-05 17:10:41 -04:00
Thomas Harte
80cf3d9301
Formally gave the 2600 responsibility for providing the code that decodes one of the things it has put into a buffer into a composite sample.
2015-09-03 12:28:16 -04:00
Thomas Harte
ac8fc9a1a0
Experimenting with pre-encoding luminance and chrominance separation over on the
...
CPU as otherwise the GPU does them repetitively and more awkwardly (as it's working purely in floats). It means uploading twice as much data though, so I don't
know. Still only half as much as the RGBA path of a few days ago. Will experiment.
Also slightly adjusted division of responsibility in the fragment shader per the
desire to have the `sample` function owned externally.
2015-09-03 11:15:23 -04:00
Thomas Harte
cb6e6e8acb
It's the worst fragment shader you'll ever see. The worst. But this attempts NTSC composite video emulation, artefacts included.
2015-09-01 22:36:45 -04:00
Thomas Harte
043d2f9896
It sounds like the two sync signals are exclusive ORd.
2015-08-19 21:36:33 -04:00
Thomas Harte
c5e480cfae
Threw in missile repeats.
2015-08-19 09:46:57 -04:00
Thomas Harte
ca6b54536e
Added fire and reset inputs.
2015-08-18 20:58:05 -04:00
Thomas Harte
bc805a90fe
Wired up joystick directions, at least, and fire button presses get as far as the C++. But there's some latching to figure out before they'll work.
2015-08-18 20:33:24 -04:00
Thomas Harte
d21ccddeef
Fixed: _vBlankExtend is now cleared at the correct moment.
2015-08-17 17:54:36 -04:00
Thomas Harte
a33d31d02a
Fixed to allow loading of ROMs less than 1kb in size.
2015-08-17 00:34:01 -04:00
Thomas Harte
df68aeff5a
Fixed: made sure that _vBlankExtend resets itself even on non-pixel lines.
2015-08-17 00:09:28 -04:00
Thomas Harte
414849f166
Confirmed: pixel counters are not paused by programmatic vertical blank.
2015-08-16 17:34:20 -04:00
Thomas Harte
a693c081f8
Switched on the appropriate compiler warnings re: signed comparisons and implicit conversions. Fixed all less-than-explicit calls.
2015-08-16 16:08:29 -04:00
Thomas Harte
410c09cb35
Made attempt not to touch the _collisions registers (which are instance variables) unless the local variables imply it's potentially necessary. So that's a broad phase on collisions, I guess.
2015-08-16 15:39:40 -04:00
Thomas Harte
40cb1cf60d
... and the ball graphic.
2015-08-16 11:24:33 -04:00
Thomas Harte
afaa86a649
Minor thing: skip the internal counter stuff if we're definitely going to end up with a transparent pixel anyway for the player and missile graphics.
2015-08-16 11:23:46 -04:00
Thomas Harte
4b5aabdd54
Attempted to take even more out of the inner pixel loop.
2015-08-13 23:23:04 +01:00
Thomas Harte
92c7d56cc3
Tiny little speed improvement. Every little helps.
2015-08-13 21:50:24 +01:00
Thomas Harte
17bbe27c9a
As an experiment, performed some very basic moving of playfield composition outside of the pixel loop.
2015-08-13 21:32:22 +01:00
Thomas Harte
033655835a
My understanding now is that object position counting will begin the cycle after the call is made, not that cycle, and that the timer loops just once, with the logic for counter pumping being whether the relevant flag is still set, irregardless of whether the counter is still going.
2015-08-13 18:59:23 +01:00
Thomas Harte
323aa27e13
Fixed: paging is based directly on the access, independent of the read/write line (since it isn't actually exposed to catridges).
2015-08-13 15:04:30 +01:00
Thomas Harte
9838e01cc1
Made a first attempt at paging.
2015-08-13 13:24:02 +01:00
Thomas Harte
9ca57b80a7
Minor steps to help with diagnostics; all commented out or merely to benefit with breakpoint placement.
2015-08-13 08:43:10 +01:00
Thomas Harte
6616265d93
Fixed collision tests, added a few more timing tests.
2015-08-13 03:33:45 +01:00
Thomas Harte
d19f8ed507
Removed the implicit reset upon 6502 startup, adding a reset line. Hence all tests now pass again. Added an empty shell for timing tests, the all-RAM 6502 now counting bus cycles.
2015-08-13 00:51:06 +01:00
Thomas Harte
687816d470
Made some attempted simplifications, implemented collisions.
2015-08-13 00:31:57 +01:00
Thomas Harte
aebf636528
Ensured the PIA timer resumes its normal tick rate after being read; fixed those spaces that had crept in where tabs should be.
2015-08-10 16:55:16 +01:00
Thomas Harte
42677f5f83
Fixed association of motion registers and actual registers.
2015-08-10 16:43:45 +01:00
Thomas Harte
2dde2efff0
Attempted to standardise object counters.
2015-08-10 15:09:40 +01:00
Thomas Harte
a228969655
This should happen every fourth cycle.
2015-08-10 08:16:17 +01:00
Thomas Harte
3c27306a8e
My counter was going the wrong way.
2015-08-10 00:33:37 +01:00
Thomas Harte
a4e52cc4db
Made an attempt to switch to a hardware-accurate object timer model. Without yet perfect success.
2015-08-10 00:20:18 +01:00
Thomas Harte
cd67e31e64
Made a first attempt at switching a little closer to TIA's real internal counter setup.
2015-08-09 22:47:11 +01:00
Thomas Harte
987be65a59
Made a quick attempt at reimplementing skip-to-the-end logic for ready waits.
2015-08-09 02:42:01 -04:00
Thomas Harte
eb23a493e5
Switched back to one texel per colour clock, at least for now. Attempted to break _RGBA assumption within the cathode ray view.
2015-08-05 23:36:04 -04:00
Thomas Harte
fd36f13baf
The cathode ray view no longer hard codes the frame size. So that's one less coupling. Doubled pixel output size to give sufficient sampling detail to capture the NTSC colour clock (ummm, hopefully).
2015-08-05 21:45:47 -04:00
Thomas Harte
5644b3a1cc
Fixed scanline sizing and fill issues, as well as shortening vsync to the correct Atari length.
2015-08-05 20:55:27 -04:00
Thomas Harte
5313b48ebd
I'm ashamed to admit, I: played with numbers until enough things looked stable such that I can investigate other things. Discovery: my PAL autodetection was way off. Fixed, hopefully.
2015-08-02 20:32:18 -04:00
Thomas Harte
5f1d76e855
Can't seem to find any documentation: assumed horizontal sync is generated during vertical.
2015-07-31 18:49:02 -04:00
Thomas Harte
9c91f1a2eb
Added an attempt at NTSC/PAL autodetection, based on number of missed vertical syncs.
2015-07-31 18:04:33 -04:00
Thomas Harte
a5d66e9dd6
Factored out a few more constants, started trying to ensure there's enough slack and the mechanisms in place for the CathodeRayView to hold onto two frames if it desires, for potential phosphor simulation, switched once again to additive blending — much more like a real CRT — and added a sine function across the width of spans per my understanding of how an electron gun actually fires.
...
Why do all this when overall timing is still so far off? It helps me more easily see how overall timing is so far off.
2015-07-31 17:47:10 -04:00
Thomas Harte
c1d1fb65cb
Made an attempt properly to emulate the RDY line and the Atari's use of it.
2015-07-31 16:54:20 -04:00
Thomas Harte
53dd5c8f16
Trying to fix my RDY line emulation. Switched to PAL timings, at least temporarily, since it's starting to make a difference.
2015-07-31 16:44:53 -04:00
Thomas Harte
39bfbf1000
Attempted ball graphics enable delay.
2015-07-30 23:01:28 -04:00
Thomas Harte
78e66d2577
Added an attempt at ball rendering.
2015-07-30 21:30:00 -04:00
Thomas Harte
a95b36a53d
Made first attempt at missile display. In Enduro, at least, one seems to work but the other seems to be absent.
2015-07-30 21:09:18 -04:00
Thomas Harte
1b7846f09b
Made a first attempt at the sprite latches. Hopefully this should make a few more Activision logos, etc, show up correctly.
2015-07-30 20:52:26 -04:00
Thomas Harte
1fa7a77793
Continuing in my attempts to figure out the complete absence of graphics from some games: there are 262 lines on an NTSC screen, not 256. Also ensured that the CRT has a little spare range at the edges so that its generated triangles don't wrap around just because of integer overflow.
2015-07-30 20:07:20 -04:00
Thomas Harte
98efae2536
Reintroduced emergency vertical sync — so that output occurs even when the emulation isn't catching syncs properly — and switched some spaces to tabs.
2015-07-30 17:16:49 -04:00
Thomas Harte
14adcd2096
Had a quick bash at timer overflow.
2015-07-30 16:09:32 -04:00
Thomas Harte
58908b60ac
So, provisionally: this looks like (i) the one cycle to write; plus (ii) the number of cycles to get to the end of the pixels (which is _horizontalTimer+1 for me because _horizontalTimer = 0 is a pixel); plus (iii) one cycle of latency to wake up. Am I making that up? Time will tell.
2015-07-30 15:49:38 -04:00