49
edits
(Document the Paul Owens loader.) |
No edit summary |
||
(5 intermediate revisions by the same user not shown) | |||
Line 120: | Line 120: | ||
Again just a one-byte change from the ROM loader, replacing the <code>RET NC</code> with Alkatraz's <code>RET Z</code>. | Again just a one-byte change from the ROM loader, replacing the <code>RET NC</code> with Alkatraz's <code>RET Z</code>. | ||
=== Dinaload === | |||
Used by Dinamic, for example in [https://spectrumcomputing.co.uk/index.php?cat=96&id=295 Astro Marine Corps] and [https://spectrumcomputing.co.uk/index.php?cat=96&id=1863 Freddy Hardest en Manhattan Sur]. | |||
LD-SAMPLE INC B | |||
RET Z | |||
LD A,FF | |||
IN A,(FE) | |||
RRA | |||
RET NC | |||
XOR C | |||
AND 20 | |||
JR Z,LD-SAMPLE | |||
Yet another one-byte change from the ROM loader, this time ensuring that no keyboard half-rows are read, meaning the <code>RET NC</code> will never trigger. | |||
=== Search Loader === | |||
Used in [https://spectrumcomputing.co.uk/index.php?cat=96&id=584 Blood Brothers] and [https://spectrumcomputing.co.uk/index.php?cat=96&id=978 City Slicker]. | |||
LD-SAMPLE INC B | |||
RET Z | |||
LD A,00 | |||
IN A,(FE) | |||
XOR C | |||
AND 40 | |||
RET C | |||
NOP | |||
JR Z,LD-SAMPLE | |||
The first loader which is actually non-trivially different from the ROM loader. The changes here: | |||
* Setting the high byte of the <code>IN</code> to be zero - this causes every keyboard half-row to be read. This is unimportant as all five low bits are masked out later. | |||
* Dropping the <code>RRA</code> of the ROM loader - as we're not checking for any keys being pressed, no need to shift the byte around. This means the EAR bit stays in bit 6 rather than being shifted to bit 5 so the <code>AND</code> changes as well. | |||
* The <code>RET C</code> is a no-op as <code>AND</code> explicitly clears the carry flag. | |||
This code has fairly obviously been constructed to have exactly the same runtime as the ROM code, which explains the always failing <code>RET C</code> and <code>NOP</code> (which replaces the <code>RRA</code> of the ROM routine). All the variants which replace the <code>RET NC</code> with a <code>NOP</code> or similar actually have a different runtime as a failing conditional <code>RET</code> is the ''only'' Z80 instruction which takes 5 t-states. | |||
==== "Variant" Search Loader ==== | |||
Used by some late era Gremlin games; so far seen only in [https://spectrumcomputing.co.uk/index.php?cat=96&id=2937 Lotus Esprit Turbo Challenge] and [https://spectrumcomputing.co.uk/index.php?cat=96&id=4660 Space Crusade]. | |||
LD-SAMPLE INC B | |||
RET Z | |||
LD A,7F | |||
IN A,(FE) | |||
XOR C | |||
AND 40 | |||
JR Z,LD-SAMPLE | |||
While this maintains the distinctive <code>AND 40</code> of the Search Loader, I suspect it's actually an independent derivation. | |||
=== Digital Integration === | |||
Unsurprisingly enough, used by Digital Integration in some of their games, for example [https://spectrumcomputing.co.uk/index.php?cat=96&id=305 ATF] and [https://spectrumcomputing.co.uk/index.php?cat=96&id=5317 Tomahawk]. | |||
LD-SAMPLE DEC B | |||
RET Z | |||
IN A,(FE) | |||
XOR C | |||
AND 40 | |||
JP Z,LD-SAMPLE | |||
This loader has two points of note: it inverts the counter (which just requires the flip of a condition outside this loop when working out whether it's a long or short pulse), and it's probably the minimal loop which is possible while still being anything even vaguely similar to the ROM loader. | |||
== Emulation == | |||
[http://fuse-emulator.sourceforge.net/ Fuse] pattern matches for the above cores to implement its "accelerate loaders" feature. |
edits