Thomas Harte
916eb96b47
Makes buffer size restriction explicit in the Vic-20.
2017-11-10 22:59:11 -05:00
Thomas Harte
d9e56711ce
Corrects order-of-initialisation errors in the Amstrad CPC, Vic-20, Oric, Commodore File, MFM disk controller, UEF and Commodore tape parser.
2017-11-10 22:47:10 -05:00
Thomas Harte
5b6ea35d96
Corrects initialisation ordering for the ZX80/81, C1540 and AY-3-8910.
2017-11-10 22:31:27 -05:00
Thomas Harte
a825da3715
Reinstates missing include file.
2017-11-10 22:02:02 -05:00
Thomas Harte
fabaf4e607
Adds missing include files, corrects bad include paths and eliminates the Clang-specific __undefined
.
2017-11-10 21:56:53 -05:00
Thomas Harte
f7f2736d4d
Corrects missing includes in the SerialBus, Electron Video and Typer.
2017-11-10 20:37:18 -05:00
Thomas Harte
6e1d69581c
Eliminates a variety of end-of-line spaces.
2017-11-07 22:54:22 -05:00
Thomas Harte
f95515ae81
Eliminates a large number of instance of end-of-line tabs.
2017-11-07 22:51:06 -05:00
Thomas Harte
ddcdd07dd0
Modifies the Vic-20 and C1540 to bring them into the realm of self-ROM fetching.
...
Hence enables Vic-20 support within kiosk mode as currently drafted.
2017-11-07 21:19:51 -05:00
Thomas Harte
e983854e71
Converts all uint8_t
and uint16_t
casts to the functional style.
2017-10-21 21:50:53 -04:00
Thomas Harte
ec999446e8
Commutes int
and unsigned
casts to the functional style.
2017-10-21 21:00:40 -04:00
Thomas Harte
5e3e91373a
Switches all unsigned int
and double
casts to functional style.
2017-10-21 19:49:04 -04:00
Thomas Harte
9e0907ee76
Completes clean-up of post-formalisation per-machine keyboard code.
...
At least for now. Standardising on how column + row is encoded might be helpful.
2017-10-21 10:52:35 -04:00
Thomas Harte
9ad4025138
Relocates things that were in Machines/ for machine usage.
...
Leaving only those things intended to be visible interface.
2017-10-21 10:30:02 -04:00
Thomas Harte
405f58d6a3
Corrects write guard names.
2017-10-21 10:21:40 -04:00
Thomas Harte
b2c1b83fcd
Consolidates Vic-20 keyboard code.
2017-10-19 22:27:30 -04:00
Thomas Harte
1825af0dd3
Eliminates dead code in the Vic-20 and Inputs::Joystick.
2017-10-19 22:15:21 -04:00
Thomas Harte
c2f6799f0c
Implements Vic-20 restore key.
2017-10-19 22:02:34 -04:00
Thomas Harte
18798c9886
Corrects joystick memory leaks.
2017-10-15 20:49:47 -04:00
Thomas Harte
ee179aa7bd
Introduces a joystick analogue to the shared keyboard interface, and implements it for the Vic-20.
2017-10-14 22:36:31 -04:00
Thomas Harte
4f289ab10b
Corrects some deficiencies in Vic-20 keyboard mapping.
...
... albeit without yet being clear on the wiring behind restore.
2017-10-12 22:33:00 -04:00
Thomas Harte
78ee46270b
Transfers possession of keyboard mappings from the Mac side over to individual machines.
...
Specifically by establishing an intermediate representation of a useful mix between the American and British IBM and Mac keyboard layouts, and routing through that.
2017-10-12 22:25:02 -04:00
Thomas Harte
698e4fe550
Tidies the Disk
file hierarchy.
2017-09-22 22:39:23 -04:00
Thomas Harte
da082673d7
Drives now have a finite number of heads.
...
The Amstrad volunteers itself to be single sided. Everything else stays as it was.
2017-09-15 21:18:36 -04:00
Thomas Harte
fb9fd26af7
Updates the 1540 for the slightly-more modern world of decoupled drives and disks (!).
2017-09-11 22:08:10 -04:00
Thomas Harte
96bf133924
Withdraws requirement for DiskController users to specify a PLL multiplier or to provide rotation speed.
...
In the latter case because it's no longer of any interest to the controller, and in the former because I'd rather it be picked automatically.
2017-09-10 22:56:05 -04:00
Thomas Harte
0622187ddf
Strips Controller of all capabilities now housed on the Drive.
2017-09-10 19:23:23 -04:00
Thomas Harte
90c7056d12
Started devolving timed event loop logic down to the drives, moving them closer to modelling real life.
2017-09-10 14:43:20 -04:00
Thomas Harte
3b12fca417
Corrects non-recurring-pattern adaptation bug: the 'SerialPortVIA' should keep a reference to its VIA, not a copy of it.
2017-09-05 21:19:56 -04:00
Thomas Harte
8eeb7e73cd
Adds a commented-out printf that I might like to use again later.
2017-09-05 21:15:56 -04:00
Thomas Harte
6547102511
Attempts better to hide C1540 implementation details from the reader.
...
In this case not from the compiler, as it's desireable to keep `run_for` as a non-virtual call, and therefore everything else comes alone for the ride.
2017-09-04 20:58:00 -04:00
Thomas Harte
a49594c6a3
Tweaks Vic20 Machine parent class order so that when turned into a CRTMachine, still successfully dynamically casts as a ConfigurationTarget.
...
More thorough thought is required.
2017-09-04 20:56:00 -04:00
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
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
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
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
42b5b66305
Remove the 6502's use of runtime polymorphism in favour of ordinary templating.
2017-08-16 11:56:52 -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
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
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
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
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
8a2bdb8d22
Converted the TimedEventLoop and the things that sit atop it into ClockReceiver
s.
2017-07-24 21:19:05 -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
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
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
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
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
e01f3f06c8
Completed curly bracket movement.
2017-03-26 14:34:47 -04: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
2003b514aa
Switched the typer to postfix underscores.
2016-12-03 10:55:50 -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
4fab794747
Added a direct-to-two-cycles emulation path for 6522 owners.
2016-10-27 21:13:25 -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
6d7c3f6ac2
Factored out the now-sampling binary-level tape player from the Vic and connected it up to the Oric.
2016-10-15 21:21:18 -04:00
Thomas Harte
cd1ab09701
The Vic-20 now inserts ROMs again.
2016-09-29 20:15:25 -04:00
Thomas Harte
572d5587d9
Made a first stab at enabling multi-disk machines and thereby obeying (some of) the Plus 3's status register.
2016-09-25 21:24:16 -04:00
Thomas Harte
9bbcbd1001
Renamed class, intending to turn a Disk::Drive
into literally just that, and have a thing with a PLL that consumes events be a Controller
.
2016-09-25 20:05:56 -04:00
Thomas Harte
64f2538b1f
Added CRC checking to DFS comprehension; fixed a bunch of places where I'd used Objective-C's #import
rather than #include
.
2016-09-19 08:16:06 -04:00
Thomas Harte
142254a478
Resolved failure to open disks that arrive through analysis.
2016-09-17 18:11:58 -04:00
Thomas Harte
e3571e8b9e
Added insurance against an infinite loop should the tape be exhausted.
2016-09-12 22:22:23 -04:00
Thomas Harte
40660fe680
Made yet another guess at Commodore analysis. Elevated fast tape-related unnatural speed up to the OS-side mechanisms.
2016-09-12 22:06:03 -04:00
Thomas Harte
e54a2326a3
Made attempt to run at zero cost while processing tape input.
2016-09-11 17:34:02 -04:00
Thomas Harte
eeec516fa6
Implemented seeking on tapes, mucked about a bit more with the Commodore analyser, at least temporarily removed cropping from the Vic emulator.
2016-09-11 17:09:00 -04:00
Thomas Harte
8c84f3581a
Attempted to bring some uniformity in application of configurations.
2016-09-08 05:32:17 -04:00
Thomas Harte
50175a9aed
Added logic to try to spot when the first program is BASIC and, if so, what the correct memory model is, then to get that information to the Vic. Though it currently then gets overwritten by the view controller. Grrrr.
2016-09-07 22:17:19 -04:00
Thomas Harte
56c0d70c1f
Gave disks their own namespace.
2016-08-27 17:15:09 -04:00
Thomas Harte
c0402d0c2b
Gave tapes their own namespace.
2016-08-27 17:09:45 -04:00
Thomas Harte
55ada536ac
Added a test call, further mutated result structure.
2016-08-27 14:25:16 -04:00
Thomas Harte
dab3580111
Experimental: can I afford a lower sampling rate if there's a low-pass filter in effect?
2016-08-22 22:18:05 -04:00
Thomas Harte
1541273785
Moved responsibility for throwing in a low-pass filter up to the Vic, appropriately.
2016-08-21 18:13:31 -04:00
Thomas Harte
99157ad6b2
Ensured the 6560 knows its real audio clock on a PAL machine; removed some stray semicolons.
2016-08-19 13:35:34 -04:00
Thomas Harte
e985c72ce8
Removed a dead special case.
2016-08-19 12:23:06 -04:00
Thomas Harte
4edd1214f1
This has now successfully loaded its first PRG-as-a-tape.
2016-08-19 10:58:42 -04:00
Thomas Harte
2935848f35
Adopted header/header/data/data pattern. But still not complete joy.
2016-08-17 08:03:34 -04:00
Thomas Harte
dfe9fb83ef
This proves that bytes are being deposited properly. For the first 36 anyway, and with no announcement.
2016-08-16 21:09:50 -04:00
Thomas Harte
12f8aff65b
Lengths I'd taken seem to have been for dipoles, not single poles. So I just doubled the clock rate. Also I was producing each dipole as high then low, when they should probably be low then high. The Vic now at least recognises that something is happening on the tape.
2016-08-16 19:46:53 -04:00
Thomas Harte
ca2dc6b6c4
Ensured ROMs survive in the new memory model.
2016-08-15 19:56:01 -04:00
Thomas Harte
38aec44d85
Made sufficient changes for the Vic itself to believe it can recast a PRG as a tape and insert it that way. So now the ball is in the court of: how the heck are Commodore tapes encoded?
2016-08-15 19:44:41 -04:00
Thomas Harte
547aefb696
Slightly adjusted PRG strategy, made a note about where next.
2016-08-14 16:36:42 -04:00
Thomas Harte
d9016909ed
Added some wiring for PAL/NTSC mode switching on the Vic, making an attempt to simplify the whole loop of having different clock rates.
2016-08-14 13:33:20 -04:00
Thomas Harte
a547b7e1d8
Took basic steps towards supporting memory expansions.
2016-08-13 17:21:25 -04:00
Thomas Harte
142774be37
Collapsed 6560 template to a more direct loop, albeit with quite a bit still left to fix.
2016-08-09 21:10:53 -04:00
Thomas Harte
12bad8f23f
Turned the 6560 into an ordinary template, similar to the rest of the project, albeit right now with a fairly shonky internal implementation. Fixed a Mac-specific interface sizing issue.
2016-08-09 20:41:05 -04:00
Thomas Harte
285a288c80
Switched to two cycles of options loading, meaning that they get set before files are inserted. Might need some further work?
2016-08-07 21:48:09 -04:00
Thomas Harte
be54d8040e
Made a first stab at having automatic loading be optional. But things are currently arranged such that the machine options are communicated too late to have an effect. So work to do.
2016-08-06 17:39:27 -04:00
Thomas Harte
3e65450a54
Converted the 6560 fully into a template; worked on allowing the typer to run at a much faster rate where hardware has some trigger by which it can request the next key.
2016-08-06 14:33:24 -04:00
Thomas Harte
d832e5e10d
Reduced 1540 PLL to running at 4Mhz. Which is possibly correct (?) Made minor change to avoid divide if possible.
2016-08-02 21:28:50 -04:00
Thomas Harte
5d40d70c92
Fixed 6560 addressing error, added an autotyper for Vic disks (more work potentially needed), fixed semantics for testing whether a 6502 is about to reset.
2016-08-01 10:32:32 -04:00
Thomas Harte
bc10b3ee9a
It appears the problem is as simple as sectors being counted from zero.
2016-08-01 10:08:38 -04:00
Thomas Harte
f5e4ea3351
Some minor tidying, lots more of the caveman stuff as I try to determine what I'm doing wrong.
2016-08-01 09:43:08 -04:00
Thomas Harte
18744cd98b
Slightly updated comments, switched to 1540 ROM so as very slightly to improve loading time.
2016-08-01 04:37:30 -04:00
Thomas Harte
b43a7381ae
Fixed framing and first-byte-after-sync signalling. Hacked together as parts of it are, loading now appears to work!
2016-08-01 04:25:11 -04:00
Thomas Harte
41893b5ef6
Put in the absolute minimum logic for drive motor emulation. Drive appears to be attempting head steps.
2016-07-31 19:38:51 -04:00
Thomas Harte
740ea0b7e2
Added overflow-flag setting logic and ensured disk ROM gets through regardless of ROM/disk installation order.
2016-07-31 19:33:18 -04:00
Thomas Harte
0945049cd3
Made attempt to connect sync detect and then apply appropriate windowing, posting bytes to the appropriate place.
2016-07-31 18:29:44 -04:00
Thomas Harte
198fbbedc7
Reeled back all appropriate pieces of caveman debugging.
2016-07-31 13:42:34 -04:00
Thomas Harte
2332f72875
Formalised clock-rate multiplication within disk drives, discovered that the stepper didn't have ideal behaviour for my timed event loop and hence nailed down the semantics a ilttle more.
...
(obiter: the 1540 now appears to discern the correct sequence of bits. Framing is off in my test printfs but that's neither here nor there).
2016-07-31 13:32:30 -04:00
Thomas Harte
8f62211f5e
Wired up the 1540 as a PLL delegate. Which prima facie means it should start receiving a bit stream. Except that I clearly have something in the timing way off — either my flux transitions are far too short or I need to significantly increase the clock rate on the PLL.
2016-07-29 12:08:18 -04:00
Thomas Harte
89a1881fef
Started turning the 1540 into an actual disk drive.
2016-07-29 11:03:09 -04:00
Thomas Harte
ada2f073e0
Completed handing of the disk all the way to the 1540.
2016-07-10 16:24:46 -04:00
Thomas Harte
6cfc514c2d
Made the rote changes necessary to attempt to open and to supply a G64 to the Vic.
2016-07-10 12:57:17 -04:00
Thomas Harte
4ca6883f7c
Disabled attachment of a 1540 again, as I probably need to move to opening an actual disk image next.
2016-07-10 08:03:36 -04:00
Thomas Harte
824d9ea92b
Added further comments.
2016-07-10 08:01:16 -04:00
Thomas Harte
d8334edf4a
Started trying to clean up, including commuting the C1540 source file name to match its class name but mainly by adding documentation.
2016-07-10 07:46:20 -04:00
Thomas Harte
c0ab45a73d
Disabled a bunch of the caveman debug logging.
2016-07-09 22:29:11 -04:00
Thomas Harte
f589d639db
Okay, so it seems that sync also works the other way around.
2016-07-09 22:25:44 -04:00
Thomas Harte
693c8b2438
After all that, it seems likely that inputs just aren't inverted for the Vic.
2016-07-09 20:03:38 -04:00
Thomas Harte
656cd211d7
Was transmitting bit levels backwards (probably?); 1540 now acknowledges byte received.
2016-07-09 18:06:49 -04:00
Thomas Harte
7cc4bf3fe7
Hit and hope is getting me nowhere. Time to unit test this thing.
2016-07-09 15:40:25 -04:00
Thomas Harte
8827597363
Messier and messier, but I've at least attempted to implement hardware attention acknowledge.
2016-07-08 19:00:39 -04:00
Thomas Harte
9a08ef61cb
Still fumbling in the margins: made an effort not to imply that the 1540 is forever reading syncs.
2016-07-07 22:13:18 -04:00
Thomas Harte
199c0e27e0
Mostly just random guesses now, to be honest. It's approaching the end of my window for the morning.
2016-07-07 07:16:36 -04:00
Thomas Harte
81e6cc34e5
Per the ROM disassembly, the Vic's VIA outputs are inverted for the benefit of the serial bus.
2016-07-07 06:57:21 -04:00
Thomas Harte
c9479f923b
The inversion of truth was clearly just a problematic API. Got explicit. LineLevel might need to become more pervasive.
2016-07-07 06:44:13 -04:00
Thomas Harte
dcb86a027a
Okay, so the 1540 doesn't toggle the actual attention line. I don't know what it does yet but this helps.
2016-07-06 22:31:14 -04:00
Thomas Harte
1baf21827c
Since the ROM is well disassembled, let's actually try to be a 1541 first.
2016-07-06 22:17:32 -04:00
Thomas Harte
f64cd8cfcb
Quick fixes properly to declare the DriveVIA, to ensure its interrupts take effect, and to wire ATN IN to CA1 rather than CB2.
2016-07-06 20:22:46 -04:00
Thomas Harte
428fcdb978
Centralised and improved serial logging.
2016-07-06 07:46:21 -04:00
Thomas Harte
8819711bc8
Threw in the second VIA as a currently clearly incorrect thing.
2016-07-05 22:22:09 -04:00
Thomas Harte
93c2bb80a2
Improved a comment, added independent C[A/B]2 input mode.
2016-07-05 21:11:51 -04:00
Thomas Harte
6c4fa4ec5d
Improved commenting and initial state communication.
2016-07-05 20:57:31 -04:00
Thomas Harte
1e6d90de17
Made an attempt properly to deal with initial bus state.
2016-07-05 20:52:33 -04:00
Thomas Harte
c3b7d24293
It appears that the attention line is also wired to CB2. So the ball is back in the 6522's court.
2016-07-05 19:19:46 -04:00
Thomas Harte
11fc43aa04
Made an attempt to allow the 1540 to talk back to the Vic, and to receive interrupts. Also slightly disambiguated debugging logging.
2016-07-05 19:12:43 -04:00
Thomas Harte
d16b79073e
Further fleshing out: added a serial port for the serial bus.
2016-07-05 17:27:02 -04:00
Thomas Harte
d1eea6943d
Ensured the 1540 ROM gets installed, at least.
2016-07-05 16:54:25 -04:00
Thomas Harte
86dabd007b
Furthered fleshing out of the 1540. Though it doesn't yet receive a ROM so won't even attempt to do anything meaningful.
2016-07-05 16:39:18 -04:00
Thomas Harte
a25fcc7190
Made a first attempt at wiring back serial port input.
2016-07-05 16:10:54 -04:00
Thomas Harte
d2cded7b59
Attempted to separate out the concept of a serial port and a serial bus, since the bus may be shared, and to establish half duplex communications from the Vic.
2016-07-05 14:55:20 -04:00
Thomas Harte
0d3d0fbe4d
Created a namespace for Commodore
and an empty container file for the 1540[/1] implementation.
2016-07-05 13:28:27 -04:00