@joezilla/8sim 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +542 -0
- package/dist/8sim.browser.js +4728 -0
- package/dist/bundles/CardBundle.d.ts +83 -0
- package/dist/bundles/CardBundle.d.ts.map +1 -0
- package/dist/bundles/CardBundle.js +41 -0
- package/dist/bundles/CardBundle.js.map +1 -0
- package/dist/bundles/kernels.d.ts +48 -0
- package/dist/bundles/kernels.d.ts.map +1 -0
- package/dist/bundles/kernels.js +132 -0
- package/dist/bundles/kernels.js.map +1 -0
- package/dist/bundles/seed/index.d.ts +24 -0
- package/dist/bundles/seed/index.d.ts.map +1 -0
- package/dist/bundles/seed/index.js +266 -0
- package/dist/bundles/seed/index.js.map +1 -0
- package/dist/bus/Bus.d.ts +21 -0
- package/dist/bus/Bus.d.ts.map +1 -0
- package/dist/bus/Bus.js +62 -0
- package/dist/bus/Bus.js.map +1 -0
- package/dist/bus/BusRegion.d.ts +8 -0
- package/dist/bus/BusRegion.d.ts.map +1 -0
- package/dist/bus/BusRegion.js +8 -0
- package/dist/bus/BusRegion.js.map +1 -0
- package/dist/bus/SnoopBus.d.ts +15 -0
- package/dist/bus/SnoopBus.d.ts.map +1 -0
- package/dist/bus/SnoopBus.js +41 -0
- package/dist/bus/SnoopBus.js.map +1 -0
- package/dist/cards/BankRamCard.d.ts +35 -0
- package/dist/cards/BankRamCard.d.ts.map +1 -0
- package/dist/cards/BankRamCard.js +56 -0
- package/dist/cards/BankRamCard.js.map +1 -0
- package/dist/cards/DazzlerCard.d.ts +42 -0
- package/dist/cards/DazzlerCard.d.ts.map +1 -0
- package/dist/cards/DazzlerCard.js +83 -0
- package/dist/cards/DazzlerCard.js.map +1 -0
- package/dist/cards/DisplaySurface.d.ts +32 -0
- package/dist/cards/DisplaySurface.d.ts.map +1 -0
- package/dist/cards/DisplaySurface.js +11 -0
- package/dist/cards/DisplaySurface.js.map +1 -0
- package/dist/cards/FdcPlusClient.d.ts +35 -0
- package/dist/cards/FdcPlusClient.d.ts.map +1 -0
- package/dist/cards/FdcPlusClient.js +130 -0
- package/dist/cards/FdcPlusClient.js.map +1 -0
- package/dist/cards/ImsaiMioCard.d.ts +36 -0
- package/dist/cards/ImsaiMioCard.d.ts.map +1 -0
- package/dist/cards/ImsaiMioCard.js +48 -0
- package/dist/cards/ImsaiMioCard.js.map +1 -0
- package/dist/cards/ImsaiSioCard.d.ts +19 -0
- package/dist/cards/ImsaiSioCard.d.ts.map +1 -0
- package/dist/cards/ImsaiSioCard.js +54 -0
- package/dist/cards/ImsaiSioCard.js.map +1 -0
- package/dist/cards/KeyboardCard.d.ts +37 -0
- package/dist/cards/KeyboardCard.d.ts.map +1 -0
- package/dist/cards/KeyboardCard.js +79 -0
- package/dist/cards/KeyboardCard.js.map +1 -0
- package/dist/cards/Mc6850Acia.d.ts +68 -0
- package/dist/cards/Mc6850Acia.d.ts.map +1 -0
- package/dist/cards/Mc6850Acia.js +132 -0
- package/dist/cards/Mc6850Acia.js.map +1 -0
- package/dist/cards/Mits2SioCard.d.ts +27 -0
- package/dist/cards/Mits2SioCard.d.ts.map +1 -0
- package/dist/cards/Mits2SioCard.js +36 -0
- package/dist/cards/Mits2SioCard.js.map +1 -0
- package/dist/cards/MitsDcddCard.d.ts +52 -0
- package/dist/cards/MitsDcddCard.d.ts.map +1 -0
- package/dist/cards/MitsDcddCard.js +294 -0
- package/dist/cards/MitsDcddCard.js.map +1 -0
- package/dist/cards/ParallelCard.d.ts +35 -0
- package/dist/cards/ParallelCard.d.ts.map +1 -0
- package/dist/cards/ParallelCard.js +32 -0
- package/dist/cards/ParallelCard.js.map +1 -0
- package/dist/cards/Port8212.d.ts +31 -0
- package/dist/cards/Port8212.d.ts.map +1 -0
- package/dist/cards/Port8212.js +47 -0
- package/dist/cards/Port8212.js.map +1 -0
- package/dist/cards/RtcCard.d.ts +30 -0
- package/dist/cards/RtcCard.d.ts.map +1 -0
- package/dist/cards/RtcCard.js +61 -0
- package/dist/cards/RtcCard.js.map +1 -0
- package/dist/cards/SerialCard.d.ts +31 -0
- package/dist/cards/SerialCard.d.ts.map +1 -0
- package/dist/cards/SerialCard.js +28 -0
- package/dist/cards/SerialCard.js.map +1 -0
- package/dist/cards/Tr1602Uart.d.ts +55 -0
- package/dist/cards/Tr1602Uart.d.ts.map +1 -0
- package/dist/cards/Tr1602Uart.js +102 -0
- package/dist/cards/Tr1602Uart.js.map +1 -0
- package/dist/cards/Usart8251.d.ts +28 -0
- package/dist/cards/Usart8251.d.ts.map +1 -0
- package/dist/cards/Usart8251.js +88 -0
- package/dist/cards/Usart8251.js.map +1 -0
- package/dist/cards/VdmCard.d.ts +27 -0
- package/dist/cards/VdmCard.d.ts.map +1 -0
- package/dist/cards/VdmCard.js +40 -0
- package/dist/cards/VdmCard.js.map +1 -0
- package/dist/clock/ImmediateClock.d.ts +8 -0
- package/dist/clock/ImmediateClock.d.ts.map +1 -0
- package/dist/clock/ImmediateClock.js +13 -0
- package/dist/clock/ImmediateClock.js.map +1 -0
- package/dist/clock/SystemClock.d.ts +45 -0
- package/dist/clock/SystemClock.d.ts.map +1 -0
- package/dist/clock/SystemClock.js +71 -0
- package/dist/clock/SystemClock.js.map +1 -0
- package/dist/cpu/Cpu8080.d.ts +34 -0
- package/dist/cpu/Cpu8080.d.ts.map +1 -0
- package/dist/cpu/Cpu8080.js +126 -0
- package/dist/cpu/Cpu8080.js.map +1 -0
- package/dist/cpu/Decoder.d.ts +12 -0
- package/dist/cpu/Decoder.d.ts.map +1 -0
- package/dist/cpu/Decoder.js +23 -0
- package/dist/cpu/Decoder.js.map +1 -0
- package/dist/cpu/Flags.d.ts +18 -0
- package/dist/cpu/Flags.d.ts.map +1 -0
- package/dist/cpu/Flags.js +33 -0
- package/dist/cpu/Flags.js.map +1 -0
- package/dist/cpu/Registers.d.ts +22 -0
- package/dist/cpu/Registers.d.ts.map +1 -0
- package/dist/cpu/Registers.js +26 -0
- package/dist/cpu/Registers.js.map +1 -0
- package/dist/cpu/instructions/alu.d.ts +3 -0
- package/dist/cpu/instructions/alu.d.ts.map +1 -0
- package/dist/cpu/instructions/alu.js +221 -0
- package/dist/cpu/instructions/alu.js.map +1 -0
- package/dist/cpu/instructions/branch.d.ts +3 -0
- package/dist/cpu/instructions/branch.d.ts.map +1 -0
- package/dist/cpu/instructions/branch.js +117 -0
- package/dist/cpu/instructions/branch.js.map +1 -0
- package/dist/cpu/instructions/control.d.ts +3 -0
- package/dist/cpu/instructions/control.d.ts.map +1 -0
- package/dist/cpu/instructions/control.js +12 -0
- package/dist/cpu/instructions/control.js.map +1 -0
- package/dist/cpu/instructions/data.d.ts +3 -0
- package/dist/cpu/instructions/data.d.ts.map +1 -0
- package/dist/cpu/instructions/data.js +137 -0
- package/dist/cpu/instructions/data.js.map +1 -0
- package/dist/cpu/instructions/io.d.ts +3 -0
- package/dist/cpu/instructions/io.d.ts.map +1 -0
- package/dist/cpu/instructions/io.js +18 -0
- package/dist/cpu/instructions/io.js.map +1 -0
- package/dist/cpu/instructions/logical.d.ts +3 -0
- package/dist/cpu/instructions/logical.d.ts.map +1 -0
- package/dist/cpu/instructions/logical.js +129 -0
- package/dist/cpu/instructions/logical.js.map +1 -0
- package/dist/cpu/instructions/rotate.d.ts +3 -0
- package/dist/cpu/instructions/rotate.d.ts.map +1 -0
- package/dist/cpu/instructions/rotate.js +34 -0
- package/dist/cpu/instructions/rotate.js.map +1 -0
- package/dist/cpu/instructions/stack.d.ts +3 -0
- package/dist/cpu/instructions/stack.d.ts.map +1 -0
- package/dist/cpu/instructions/stack.js +84 -0
- package/dist/cpu/instructions/stack.js.map +1 -0
- package/dist/cpu/status8080.d.ts +33 -0
- package/dist/cpu/status8080.d.ts.map +1 -0
- package/dist/cpu/status8080.js +73 -0
- package/dist/cpu/status8080.js.map +1 -0
- package/dist/cpu/z80/CpuZ80.d.ts +53 -0
- package/dist/cpu/z80/CpuZ80.d.ts.map +1 -0
- package/dist/cpu/z80/CpuZ80.js +168 -0
- package/dist/cpu/z80/CpuZ80.js.map +1 -0
- package/dist/cpu/z80/DecoderZ80.d.ts +26 -0
- package/dist/cpu/z80/DecoderZ80.d.ts.map +1 -0
- package/dist/cpu/z80/DecoderZ80.js +107 -0
- package/dist/cpu/z80/DecoderZ80.js.map +1 -0
- package/dist/cpu/z80/FlagsZ80.d.ts +27 -0
- package/dist/cpu/z80/FlagsZ80.d.ts.map +1 -0
- package/dist/cpu/z80/FlagsZ80.js +47 -0
- package/dist/cpu/z80/FlagsZ80.js.map +1 -0
- package/dist/cpu/z80/RegistersZ80.d.ts +60 -0
- package/dist/cpu/z80/RegistersZ80.d.ts.map +1 -0
- package/dist/cpu/z80/RegistersZ80.js +90 -0
- package/dist/cpu/z80/RegistersZ80.js.map +1 -0
- package/dist/cpu/z80/flagHelpers.d.ts +25 -0
- package/dist/cpu/z80/flagHelpers.d.ts.map +1 -0
- package/dist/cpu/z80/flagHelpers.js +136 -0
- package/dist/cpu/z80/flagHelpers.js.map +1 -0
- package/dist/cpu/z80/instructions/alu16.d.ts +4 -0
- package/dist/cpu/z80/instructions/alu16.d.ts.map +1 -0
- package/dist/cpu/z80/instructions/alu16.js +27 -0
- package/dist/cpu/z80/instructions/alu16.js.map +1 -0
- package/dist/cpu/z80/instructions/alu8.d.ts +4 -0
- package/dist/cpu/z80/instructions/alu8.d.ts.map +1 -0
- package/dist/cpu/z80/instructions/alu8.js +100 -0
- package/dist/cpu/z80/instructions/alu8.js.map +1 -0
- package/dist/cpu/z80/instructions/bits.d.ts +10 -0
- package/dist/cpu/z80/instructions/bits.d.ts.map +1 -0
- package/dist/cpu/z80/instructions/bits.js +164 -0
- package/dist/cpu/z80/instructions/bits.js.map +1 -0
- package/dist/cpu/z80/instructions/block.d.ts +10 -0
- package/dist/cpu/z80/instructions/block.d.ts.map +1 -0
- package/dist/cpu/z80/instructions/block.js +141 -0
- package/dist/cpu/z80/instructions/block.js.map +1 -0
- package/dist/cpu/z80/instructions/control.d.ts +4 -0
- package/dist/cpu/z80/instructions/control.d.ts.map +1 -0
- package/dist/cpu/z80/instructions/control.js +62 -0
- package/dist/cpu/z80/instructions/control.js.map +1 -0
- package/dist/cpu/z80/instructions/ed.d.ts +4 -0
- package/dist/cpu/z80/instructions/ed.d.ts.map +1 -0
- package/dist/cpu/z80/instructions/ed.js +149 -0
- package/dist/cpu/z80/instructions/ed.js.map +1 -0
- package/dist/cpu/z80/instructions/exchange.d.ts +4 -0
- package/dist/cpu/z80/instructions/exchange.d.ts.map +1 -0
- package/dist/cpu/z80/instructions/exchange.js +37 -0
- package/dist/cpu/z80/instructions/exchange.js.map +1 -0
- package/dist/cpu/z80/instructions/io.d.ts +8 -0
- package/dist/cpu/z80/instructions/io.d.ts.map +1 -0
- package/dist/cpu/z80/instructions/io.js +22 -0
- package/dist/cpu/z80/instructions/io.js.map +1 -0
- package/dist/cpu/z80/instructions/jump.d.ts +4 -0
- package/dist/cpu/z80/instructions/jump.d.ts.map +1 -0
- package/dist/cpu/z80/instructions/jump.js +113 -0
- package/dist/cpu/z80/instructions/jump.js.map +1 -0
- package/dist/cpu/z80/instructions/load.d.ts +7 -0
- package/dist/cpu/z80/instructions/load.d.ts.map +1 -0
- package/dist/cpu/z80/instructions/load.js +103 -0
- package/dist/cpu/z80/instructions/load.js.map +1 -0
- package/dist/cpu/z80/instructions/rotate.d.ts +9 -0
- package/dist/cpu/z80/instructions/rotate.d.ts.map +1 -0
- package/dist/cpu/z80/instructions/rotate.js +48 -0
- package/dist/cpu/z80/instructions/rotate.js.map +1 -0
- package/dist/cpu/z80/instructions/stack.d.ts +4 -0
- package/dist/cpu/z80/instructions/stack.d.ts.map +1 -0
- package/dist/cpu/z80/instructions/stack.js +19 -0
- package/dist/cpu/z80/instructions/stack.js.map +1 -0
- package/dist/cpu/z80/regcodes.d.ts +22 -0
- package/dist/cpu/z80/regcodes.d.ts.map +1 -0
- package/dist/cpu/z80/regcodes.js +93 -0
- package/dist/cpu/z80/regcodes.js.map +1 -0
- package/dist/cpu/z80/types.d.ts +59 -0
- package/dist/cpu/z80/types.d.ts.map +1 -0
- package/dist/cpu/z80/types.js +2 -0
- package/dist/cpu/z80/types.js.map +1 -0
- package/dist/cpu/z80/views.d.ts +8 -0
- package/dist/cpu/z80/views.d.ts.map +1 -0
- package/dist/cpu/z80/views.js +40 -0
- package/dist/cpu/z80/views.js.map +1 -0
- package/dist/index.d.ts +67 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/IBus.d.ts +8 -0
- package/dist/interfaces/IBus.d.ts.map +1 -0
- package/dist/interfaces/IBus.js +2 -0
- package/dist/interfaces/IBus.js.map +1 -0
- package/dist/interfaces/IBusObserver.d.ts +7 -0
- package/dist/interfaces/IBusObserver.d.ts.map +1 -0
- package/dist/interfaces/IBusObserver.js +2 -0
- package/dist/interfaces/IBusObserver.js.map +1 -0
- package/dist/interfaces/IClock.d.ts +6 -0
- package/dist/interfaces/IClock.d.ts.map +1 -0
- package/dist/interfaces/IClock.js +2 -0
- package/dist/interfaces/IClock.js.map +1 -0
- package/dist/interfaces/ICpu.d.ts +46 -0
- package/dist/interfaces/ICpu.d.ts.map +1 -0
- package/dist/interfaces/ICpu.js +2 -0
- package/dist/interfaces/ICpu.js.map +1 -0
- package/dist/interfaces/IIODevice.d.ts +7 -0
- package/dist/interfaces/IIODevice.d.ts.map +1 -0
- package/dist/interfaces/IIODevice.js +2 -0
- package/dist/interfaces/IIODevice.js.map +1 -0
- package/dist/interfaces/IInterruptController.d.ts +8 -0
- package/dist/interfaces/IInterruptController.d.ts.map +1 -0
- package/dist/interfaces/IInterruptController.js +2 -0
- package/dist/interfaces/IInterruptController.js.map +1 -0
- package/dist/interfaces/IMemory.d.ts +9 -0
- package/dist/interfaces/IMemory.d.ts.map +1 -0
- package/dist/interfaces/IMemory.js +2 -0
- package/dist/interfaces/IMemory.js.map +1 -0
- package/dist/interfaces/IModule.d.ts +5 -0
- package/dist/interfaces/IModule.d.ts.map +1 -0
- package/dist/interfaces/IModule.js +2 -0
- package/dist/interfaces/IModule.js.map +1 -0
- package/dist/interfaces/IS100Card.d.ts +6 -0
- package/dist/interfaces/IS100Card.d.ts.map +1 -0
- package/dist/interfaces/IS100Card.js +2 -0
- package/dist/interfaces/IS100Card.js.map +1 -0
- package/dist/interfaces/index.d.ts +10 -0
- package/dist/interfaces/index.d.ts.map +1 -0
- package/dist/interfaces/index.js +2 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/interrupt/InterruptController.d.ts +13 -0
- package/dist/interrupt/InterruptController.d.ts.map +1 -0
- package/dist/interrupt/InterruptController.js +36 -0
- package/dist/interrupt/InterruptController.js.map +1 -0
- package/dist/io/IoSpace.d.ts +9 -0
- package/dist/io/IoSpace.d.ts.map +1 -0
- package/dist/io/IoSpace.js +30 -0
- package/dist/io/IoSpace.js.map +1 -0
- package/dist/machine/MachineRunner.d.ts +54 -0
- package/dist/machine/MachineRunner.d.ts.map +1 -0
- package/dist/machine/MachineRunner.js +102 -0
- package/dist/machine/MachineRunner.js.map +1 -0
- package/dist/machine/MachineSpec.d.ts +80 -0
- package/dist/machine/MachineSpec.d.ts.map +1 -0
- package/dist/machine/MachineSpec.js +9 -0
- package/dist/machine/MachineSpec.js.map +1 -0
- package/dist/machine/buildMachine.d.ts +19 -0
- package/dist/machine/buildMachine.d.ts.map +1 -0
- package/dist/machine/buildMachine.js +122 -0
- package/dist/machine/buildMachine.js.map +1 -0
- package/dist/memory/MemoryMappedIOAdapter.d.ts +14 -0
- package/dist/memory/MemoryMappedIOAdapter.d.ts.map +1 -0
- package/dist/memory/MemoryMappedIOAdapter.js +23 -0
- package/dist/memory/MemoryMappedIOAdapter.js.map +1 -0
- package/dist/memory/Ram.d.ts +17 -0
- package/dist/memory/Ram.d.ts.map +1 -0
- package/dist/memory/Ram.js +36 -0
- package/dist/memory/Ram.js.map +1 -0
- package/dist/memory/Rom.d.ts +13 -0
- package/dist/memory/Rom.d.ts.map +1 -0
- package/dist/memory/Rom.js +25 -0
- package/dist/memory/Rom.js.map +1 -0
- package/dist/util/bits.d.ts +11 -0
- package/dist/util/bits.d.ts.map +1 -0
- package/dist/util/bits.js +35 -0
- package/dist/util/bits.js.map +1 -0
- package/dist/util/hostConsole.d.ts +2 -0
- package/dist/util/hostConsole.d.ts.map +1 -0
- package/dist/util/hostConsole.js +4 -0
- package/dist/util/hostConsole.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { setSzyxp } from '../flagHelpers.js';
|
|
2
|
+
import { getRealR, setRealR } from '../regcodes.js';
|
|
3
|
+
/** Apply rotate/shift `kind` (0=RLC..7=SRL) to v, set flags, return result. */
|
|
4
|
+
function rotShift(f, kind, v) {
|
|
5
|
+
let c = 0;
|
|
6
|
+
let r = 0;
|
|
7
|
+
switch (kind) {
|
|
8
|
+
case 0:
|
|
9
|
+
c = (v >> 7) & 1;
|
|
10
|
+
r = ((v << 1) | c) & 0xff;
|
|
11
|
+
break; // RLC
|
|
12
|
+
case 1:
|
|
13
|
+
c = v & 1;
|
|
14
|
+
r = ((v >> 1) | (c << 7)) & 0xff;
|
|
15
|
+
break; // RRC
|
|
16
|
+
case 2:
|
|
17
|
+
c = (v >> 7) & 1;
|
|
18
|
+
r = ((v << 1) | (f.c ? 1 : 0)) & 0xff;
|
|
19
|
+
break; // RL
|
|
20
|
+
case 3:
|
|
21
|
+
c = v & 1;
|
|
22
|
+
r = ((v >> 1) | (f.c ? 0x80 : 0)) & 0xff;
|
|
23
|
+
break; // RR
|
|
24
|
+
case 4:
|
|
25
|
+
c = (v >> 7) & 1;
|
|
26
|
+
r = (v << 1) & 0xff;
|
|
27
|
+
break; // SLA
|
|
28
|
+
case 5:
|
|
29
|
+
c = v & 1;
|
|
30
|
+
r = ((v >> 1) | (v & 0x80)) & 0xff;
|
|
31
|
+
break; // SRA
|
|
32
|
+
case 6:
|
|
33
|
+
c = (v >> 7) & 1;
|
|
34
|
+
r = ((v << 1) | 1) & 0xff;
|
|
35
|
+
break; // SLL (undocumented)
|
|
36
|
+
case 7:
|
|
37
|
+
c = v & 1;
|
|
38
|
+
r = (v >> 1) & 0xff;
|
|
39
|
+
break; // SRL
|
|
40
|
+
}
|
|
41
|
+
setSzyxp(f, r);
|
|
42
|
+
f.h = false;
|
|
43
|
+
f.n = false;
|
|
44
|
+
f.c = c === 1;
|
|
45
|
+
return r;
|
|
46
|
+
}
|
|
47
|
+
/** BIT b test. `xySource` supplies the undocumented X/Y flag bits. */
|
|
48
|
+
function bitTest(f, b, v, xySource) {
|
|
49
|
+
const bit = v & (1 << b);
|
|
50
|
+
f.z = bit === 0;
|
|
51
|
+
f.pv = f.z; // parity flag mirrors zero for BIT
|
|
52
|
+
f.s = b === 7 && bit !== 0;
|
|
53
|
+
f.h = true;
|
|
54
|
+
f.n = false;
|
|
55
|
+
f.y = (xySource & 0x20) !== 0;
|
|
56
|
+
f.x = (xySource & 0x08) !== 0;
|
|
57
|
+
// C is unaffected
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Registers the plain CB table and the DDCB/FDCB (indexed) bodies.
|
|
61
|
+
*
|
|
62
|
+
* Plain CB handlers return the FULL T-state count (the CB dispatcher does not add
|
|
63
|
+
* the prefix). Indexed handlers return the count minus the DD/FD prefix (which
|
|
64
|
+
* step() adds): rot/shift/res/set = 19 (→23), BIT = 16 (→20).
|
|
65
|
+
*/
|
|
66
|
+
export function registerBits(cb, idxCb) {
|
|
67
|
+
// ---- Plain CB (HL/real-register) space ----
|
|
68
|
+
for (let op = 0; op < 0x40; op++) {
|
|
69
|
+
const kind = (op >> 3) & 7;
|
|
70
|
+
const reg = op & 7;
|
|
71
|
+
if (reg === 6) {
|
|
72
|
+
cb[op] = (cpu) => {
|
|
73
|
+
const addr = cpu.regs.hl;
|
|
74
|
+
cpu.bus.write(addr, rotShift(cpu.flags, kind, cpu.bus.read(addr)));
|
|
75
|
+
return 15;
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
cb[op] = (cpu) => {
|
|
80
|
+
setRealR(cpu.regs, reg, rotShift(cpu.flags, kind, getRealR(cpu.regs, reg)));
|
|
81
|
+
return 8;
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// BIT b,r (0x40..0x7F)
|
|
86
|
+
for (let op = 0x40; op <= 0x7f; op++) {
|
|
87
|
+
const b = (op >> 3) & 7;
|
|
88
|
+
const reg = op & 7;
|
|
89
|
+
if (reg === 6) {
|
|
90
|
+
cb[op] = (cpu) => {
|
|
91
|
+
// BIT b,(HL): X/Y come from the high byte of WZ (MEMPTR).
|
|
92
|
+
bitTest(cpu.flags, b, cpu.bus.read(cpu.regs.hl), cpu.regs.wz >> 8);
|
|
93
|
+
return 12;
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
cb[op] = (cpu) => {
|
|
98
|
+
const v = getRealR(cpu.regs, reg);
|
|
99
|
+
bitTest(cpu.flags, b, v, v);
|
|
100
|
+
return 8;
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// RES b,r (0x80..0xBF) and SET b,r (0xC0..0xFF)
|
|
105
|
+
for (let op = 0x80; op <= 0xff; op++) {
|
|
106
|
+
const b = (op >> 3) & 7;
|
|
107
|
+
const reg = op & 7;
|
|
108
|
+
const set = op >= 0xc0;
|
|
109
|
+
const mask = 1 << b;
|
|
110
|
+
if (reg === 6) {
|
|
111
|
+
cb[op] = (cpu) => {
|
|
112
|
+
const addr = cpu.regs.hl;
|
|
113
|
+
const v = cpu.bus.read(addr);
|
|
114
|
+
cpu.bus.write(addr, set ? v | mask : v & ~mask);
|
|
115
|
+
return 15;
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
cb[op] = (cpu) => {
|
|
120
|
+
const v = getRealR(cpu.regs, reg);
|
|
121
|
+
setRealR(cpu.regs, reg, set ? v | mask : v & ~mask);
|
|
122
|
+
return 8;
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// ---- DDCB / FDCB indexed space (address precomputed) ----
|
|
127
|
+
// rot/shift (0x00..0x3F): operate on (addr), write back, and copy the result
|
|
128
|
+
// into register op&7 unless it is 6 (undocumented result-copy variants).
|
|
129
|
+
for (let op = 0; op < 0x40; op++) {
|
|
130
|
+
const kind = (op >> 3) & 7;
|
|
131
|
+
const reg = op & 7;
|
|
132
|
+
idxCb[op] = (cpu, addr) => {
|
|
133
|
+
const r = rotShift(cpu.flags, kind, cpu.bus.read(addr));
|
|
134
|
+
cpu.bus.write(addr, r);
|
|
135
|
+
if (reg !== 6)
|
|
136
|
+
setRealR(cpu.regs, reg, r);
|
|
137
|
+
return 19;
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
// BIT b,(IX+d) (0x40..0x7F): X/Y from the high byte of the effective address.
|
|
141
|
+
for (let op = 0x40; op <= 0x7f; op++) {
|
|
142
|
+
const b = (op >> 3) & 7;
|
|
143
|
+
idxCb[op] = (cpu, addr) => {
|
|
144
|
+
bitTest(cpu.flags, b, cpu.bus.read(addr), addr >> 8);
|
|
145
|
+
return 16;
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
// RES/SET b,(IX+d) (0x80..0xFF): apply, write back, copy to reg op&7 unless 6.
|
|
149
|
+
for (let op = 0x80; op <= 0xff; op++) {
|
|
150
|
+
const b = (op >> 3) & 7;
|
|
151
|
+
const reg = op & 7;
|
|
152
|
+
const set = op >= 0xc0;
|
|
153
|
+
const mask = 1 << b;
|
|
154
|
+
idxCb[op] = (cpu, addr) => {
|
|
155
|
+
const v = cpu.bus.read(addr);
|
|
156
|
+
const r = set ? v | mask : v & ~mask;
|
|
157
|
+
cpu.bus.write(addr, r);
|
|
158
|
+
if (reg !== 6)
|
|
159
|
+
setRealR(cpu.regs, reg, r);
|
|
160
|
+
return 19;
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=bits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bits.js","sourceRoot":"","sources":["../../../../src/cpu/z80/instructions/bits.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Z80Handler } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Block transfer (LDI/LDD/LDIR/LDDR), search (CPI/CPD/CPIR/CPDR), and I/O
|
|
4
|
+
* (INI/IND/INIR/INDR, OUTI/OUTD/OTIR/OTDR).
|
|
5
|
+
*
|
|
6
|
+
* Repeating variants execute one iteration per step() and rewind PC by 2 to
|
|
7
|
+
* re-enter, so interrupts are accepted between iterations (hardware-accurate).
|
|
8
|
+
*/
|
|
9
|
+
export declare function registerBlock(ed: Z80Handler[]): void;
|
|
10
|
+
//# sourceMappingURL=block.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block.d.ts","sourceRoot":"","sources":["../../../../src/cpu/z80/instructions/block.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAW,MAAM,aAAa,CAAC;AAIvD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,IAAI,CAqIpD"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { parityEven } from '../flagHelpers.js';
|
|
2
|
+
import { u16 } from '../../../util/bits.js';
|
|
3
|
+
/**
|
|
4
|
+
* Block transfer (LDI/LDD/LDIR/LDDR), search (CPI/CPD/CPIR/CPDR), and I/O
|
|
5
|
+
* (INI/IND/INIR/INDR, OUTI/OUTD/OTIR/OTDR).
|
|
6
|
+
*
|
|
7
|
+
* Repeating variants execute one iteration per step() and rewind PC by 2 to
|
|
8
|
+
* re-enter, so interrupts are accepted between iterations (hardware-accurate).
|
|
9
|
+
*/
|
|
10
|
+
export function registerBlock(ed) {
|
|
11
|
+
// ---- LDI / LDD / LDIR / LDDR ----
|
|
12
|
+
const ld = (dir) => {
|
|
13
|
+
const v = (cpu) => {
|
|
14
|
+
const byte = cpu.bus.read(cpu.regs.hl);
|
|
15
|
+
cpu.bus.write(cpu.regs.de, byte);
|
|
16
|
+
cpu.regs.hl = u16(cpu.regs.hl + dir);
|
|
17
|
+
cpu.regs.de = u16(cpu.regs.de + dir);
|
|
18
|
+
cpu.regs.bc = u16(cpu.regs.bc - 1);
|
|
19
|
+
const n = (byte + cpu.regs.a) & 0xff;
|
|
20
|
+
const f = cpu.flags;
|
|
21
|
+
f.h = false;
|
|
22
|
+
f.n = false;
|
|
23
|
+
f.pv = cpu.regs.bc !== 0;
|
|
24
|
+
f.y = (n & 0x02) !== 0; // bit 1 → Y
|
|
25
|
+
f.x = (n & 0x08) !== 0; // bit 3 → X
|
|
26
|
+
// S, Z, C unaffected
|
|
27
|
+
};
|
|
28
|
+
// non-repeating (LDI 0xA0 / LDD 0xA8)
|
|
29
|
+
ed[dir === 1 ? 0xa0 : 0xa8] = (cpu) => { v(cpu); return 16; };
|
|
30
|
+
// repeating (LDIR 0xB0 / LDDR 0xB8)
|
|
31
|
+
ed[dir === 1 ? 0xb0 : 0xb8] = (cpu) => {
|
|
32
|
+
v(cpu);
|
|
33
|
+
if (cpu.regs.bc !== 0) {
|
|
34
|
+
cpu.regs.pc = u16(cpu.regs.pc - 2);
|
|
35
|
+
cpu.regs.wz = u16(cpu.regs.pc + 1);
|
|
36
|
+
return 21;
|
|
37
|
+
}
|
|
38
|
+
return 16;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
ld(1);
|
|
42
|
+
ld(-1);
|
|
43
|
+
// ---- CPI / CPD / CPIR / CPDR ----
|
|
44
|
+
const cp = (dir) => {
|
|
45
|
+
const one = (cpu) => {
|
|
46
|
+
const a = cpu.regs.a;
|
|
47
|
+
const val = cpu.bus.read(cpu.regs.hl);
|
|
48
|
+
const result = (a - val) & 0xff;
|
|
49
|
+
cpu.regs.hl = u16(cpu.regs.hl + dir);
|
|
50
|
+
cpu.regs.bc = u16(cpu.regs.bc - 1);
|
|
51
|
+
cpu.regs.wz = u16(cpu.regs.wz + dir);
|
|
52
|
+
const f = cpu.flags;
|
|
53
|
+
f.n = true;
|
|
54
|
+
f.h = ((a & 0xf) - (val & 0xf)) < 0;
|
|
55
|
+
const n = (result - (f.h ? 1 : 0)) & 0xff;
|
|
56
|
+
f.s = (result & 0x80) !== 0;
|
|
57
|
+
f.z = result === 0;
|
|
58
|
+
f.pv = cpu.regs.bc !== 0;
|
|
59
|
+
f.y = (n & 0x02) !== 0;
|
|
60
|
+
f.x = (n & 0x08) !== 0;
|
|
61
|
+
// C unaffected
|
|
62
|
+
};
|
|
63
|
+
ed[dir === 1 ? 0xa1 : 0xa9] = (cpu) => { one(cpu); return 16; };
|
|
64
|
+
ed[dir === 1 ? 0xb1 : 0xb9] = (cpu) => {
|
|
65
|
+
one(cpu);
|
|
66
|
+
if (cpu.regs.bc !== 0 && !cpu.flags.z) {
|
|
67
|
+
cpu.regs.pc = u16(cpu.regs.pc - 2);
|
|
68
|
+
cpu.regs.wz = u16(cpu.regs.pc + 1);
|
|
69
|
+
return 21;
|
|
70
|
+
}
|
|
71
|
+
return 16;
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
cp(1);
|
|
75
|
+
cp(-1);
|
|
76
|
+
// ---- INI / IND / INIR / INDR ----
|
|
77
|
+
const ini = (dir) => {
|
|
78
|
+
const one = (cpu) => {
|
|
79
|
+
const f = cpu.flags;
|
|
80
|
+
cpu.regs.wz = u16(cpu.regs.bc + dir);
|
|
81
|
+
const val = cpu.bus.ioRead(cpu.regs.c) & 0xff;
|
|
82
|
+
cpu.bus.write(cpu.regs.hl, val);
|
|
83
|
+
cpu.regs.hl = u16(cpu.regs.hl + dir);
|
|
84
|
+
cpu.regs.b = (cpu.regs.b - 1) & 0xff;
|
|
85
|
+
const b = cpu.regs.b;
|
|
86
|
+
f.n = (val & 0x80) !== 0;
|
|
87
|
+
f.s = (b & 0x80) !== 0;
|
|
88
|
+
f.z = b === 0;
|
|
89
|
+
f.y = (b & 0x20) !== 0;
|
|
90
|
+
f.x = (b & 0x08) !== 0;
|
|
91
|
+
const k = val + ((cpu.regs.c + dir) & 0xff);
|
|
92
|
+
f.h = k > 0xff;
|
|
93
|
+
f.c = k > 0xff;
|
|
94
|
+
f.pv = parityEven((k & 7) ^ b);
|
|
95
|
+
};
|
|
96
|
+
ed[dir === 1 ? 0xa2 : 0xaa] = (cpu) => { one(cpu); return 16; };
|
|
97
|
+
ed[dir === 1 ? 0xb2 : 0xba] = (cpu) => {
|
|
98
|
+
one(cpu);
|
|
99
|
+
if (cpu.regs.b !== 0) {
|
|
100
|
+
cpu.regs.pc = u16(cpu.regs.pc - 2);
|
|
101
|
+
return 21;
|
|
102
|
+
}
|
|
103
|
+
return 16;
|
|
104
|
+
};
|
|
105
|
+
};
|
|
106
|
+
ini(1);
|
|
107
|
+
ini(-1);
|
|
108
|
+
// ---- OUTI / OUTD / OTIR / OTDR ----
|
|
109
|
+
const outi = (dir) => {
|
|
110
|
+
const one = (cpu) => {
|
|
111
|
+
const f = cpu.flags;
|
|
112
|
+
const val = cpu.bus.read(cpu.regs.hl);
|
|
113
|
+
cpu.regs.b = (cpu.regs.b - 1) & 0xff;
|
|
114
|
+
const b = cpu.regs.b;
|
|
115
|
+
cpu.bus.ioWrite(cpu.regs.c, val);
|
|
116
|
+
cpu.regs.hl = u16(cpu.regs.hl + dir);
|
|
117
|
+
cpu.regs.wz = u16(cpu.regs.bc + dir);
|
|
118
|
+
f.n = (val & 0x80) !== 0;
|
|
119
|
+
f.s = (b & 0x80) !== 0;
|
|
120
|
+
f.z = b === 0;
|
|
121
|
+
f.y = (b & 0x20) !== 0;
|
|
122
|
+
f.x = (b & 0x08) !== 0;
|
|
123
|
+
const k = val + (cpu.regs.l);
|
|
124
|
+
f.h = k > 0xff;
|
|
125
|
+
f.c = k > 0xff;
|
|
126
|
+
f.pv = parityEven((k & 7) ^ b);
|
|
127
|
+
};
|
|
128
|
+
ed[dir === 1 ? 0xa3 : 0xab] = (cpu) => { one(cpu); return 16; };
|
|
129
|
+
ed[dir === 1 ? 0xb3 : 0xbb] = (cpu) => {
|
|
130
|
+
one(cpu);
|
|
131
|
+
if (cpu.regs.b !== 0) {
|
|
132
|
+
cpu.regs.pc = u16(cpu.regs.pc - 2);
|
|
133
|
+
return 21;
|
|
134
|
+
}
|
|
135
|
+
return 16;
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
outi(1);
|
|
139
|
+
outi(-1);
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=block.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block.js","sourceRoot":"","sources":["../../../../src/cpu/z80/instructions/block.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../../../../src/cpu/z80/instructions/control.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGzD,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CA6D3E"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { setSzyxp } from '../flagHelpers.js';
|
|
2
|
+
/** NOP, HALT, DI, EI, DAA, CPL, SCF, CCF (view-independent, live in main table). */
|
|
3
|
+
export function registerControl(table, _view) {
|
|
4
|
+
// NOP
|
|
5
|
+
table[0x00] = (_cpu) => 4;
|
|
6
|
+
// HALT
|
|
7
|
+
table[0x76] = (cpu) => { cpu.halted = true; return 4; };
|
|
8
|
+
// DI
|
|
9
|
+
table[0xf3] = (cpu) => { cpu.iff1 = false; cpu.iff2 = false; cpu.pendingEI = false; return 4; };
|
|
10
|
+
// EI (interrupts become enabled after the following instruction)
|
|
11
|
+
table[0xfb] = (cpu) => { cpu.pendingEI = true; return 4; };
|
|
12
|
+
// DAA
|
|
13
|
+
table[0x27] = (cpu) => {
|
|
14
|
+
const f = cpu.flags;
|
|
15
|
+
const a0 = cpu.regs.a;
|
|
16
|
+
let corr = 0;
|
|
17
|
+
let carry = false;
|
|
18
|
+
if (f.h || (a0 & 0x0f) > 9)
|
|
19
|
+
corr |= 0x06;
|
|
20
|
+
if (f.c || a0 > 0x99) {
|
|
21
|
+
corr |= 0x60;
|
|
22
|
+
carry = true;
|
|
23
|
+
}
|
|
24
|
+
const a = (f.n ? a0 - corr : a0 + corr) & 0xff;
|
|
25
|
+
cpu.regs.a = a;
|
|
26
|
+
f.c = carry;
|
|
27
|
+
f.h = ((a0 ^ a) & 0x10) !== 0;
|
|
28
|
+
setSzyxp(f, a);
|
|
29
|
+
return 4;
|
|
30
|
+
};
|
|
31
|
+
// CPL (complement A)
|
|
32
|
+
table[0x2f] = (cpu) => {
|
|
33
|
+
const f = cpu.flags;
|
|
34
|
+
cpu.regs.a = ~cpu.regs.a & 0xff;
|
|
35
|
+
f.h = true;
|
|
36
|
+
f.n = true;
|
|
37
|
+
f.y = (cpu.regs.a & 0x20) !== 0;
|
|
38
|
+
f.x = (cpu.regs.a & 0x08) !== 0;
|
|
39
|
+
return 4;
|
|
40
|
+
};
|
|
41
|
+
// SCF (set carry)
|
|
42
|
+
table[0x37] = (cpu) => {
|
|
43
|
+
const f = cpu.flags;
|
|
44
|
+
f.c = true;
|
|
45
|
+
f.h = false;
|
|
46
|
+
f.n = false;
|
|
47
|
+
f.y = (cpu.regs.a & 0x20) !== 0;
|
|
48
|
+
f.x = (cpu.regs.a & 0x08) !== 0;
|
|
49
|
+
return 4;
|
|
50
|
+
};
|
|
51
|
+
// CCF (complement carry)
|
|
52
|
+
table[0x3f] = (cpu) => {
|
|
53
|
+
const f = cpu.flags;
|
|
54
|
+
f.h = f.c;
|
|
55
|
+
f.c = !f.c;
|
|
56
|
+
f.n = false;
|
|
57
|
+
f.y = (cpu.regs.a & 0x20) !== 0;
|
|
58
|
+
f.x = (cpu.regs.a & 0x08) !== 0;
|
|
59
|
+
return 4;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=control.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control.js","sourceRoot":"","sources":["../../../../src/cpu/z80/instructions/control.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ed.d.ts","sourceRoot":"","sources":["../../../../src/cpu/z80/instructions/ed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAW,MAAM,aAAa,CAAC;AA4BvD,oFAAoF;AACpF,wBAAgB,UAAU,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,IAAI,CA2HjD"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { adc16, sbc16, sub8, setSzyxp } from '../flagHelpers.js';
|
|
2
|
+
import { getRealR, setRealR } from '../regcodes.js';
|
|
3
|
+
import { u16 } from '../../../util/bits.js';
|
|
4
|
+
function read16(cpu, addr) {
|
|
5
|
+
return cpu.bus.read(addr) | (cpu.bus.read(u16(addr + 1)) << 8);
|
|
6
|
+
}
|
|
7
|
+
function write16(cpu, addr, v) {
|
|
8
|
+
cpu.bus.write(addr, v & 0xff);
|
|
9
|
+
cpu.bus.write(u16(addr + 1), (v >> 8) & 0xff);
|
|
10
|
+
}
|
|
11
|
+
/** LD A,I / LD A,R flag behavior: PV takes the value of IFF2. */
|
|
12
|
+
function ldAToIR(cpu, v) {
|
|
13
|
+
const f = cpu.flags;
|
|
14
|
+
cpu.regs.a = v & 0xff;
|
|
15
|
+
f.s = (v & 0x80) !== 0;
|
|
16
|
+
f.z = (v & 0xff) === 0;
|
|
17
|
+
f.y = (v & 0x20) !== 0;
|
|
18
|
+
f.x = (v & 0x08) !== 0;
|
|
19
|
+
f.h = false;
|
|
20
|
+
f.n = false;
|
|
21
|
+
f.pv = cpu.iff2;
|
|
22
|
+
// C unaffected
|
|
23
|
+
}
|
|
24
|
+
/** ED-prefixed instructions (excluding the block ops, which block.ts registers). */
|
|
25
|
+
export function registerEd(ed) {
|
|
26
|
+
const pairGet = {
|
|
27
|
+
0: (cpu) => cpu.regs.bc,
|
|
28
|
+
1: (cpu) => cpu.regs.de,
|
|
29
|
+
2: (cpu) => cpu.regs.hl,
|
|
30
|
+
3: (cpu) => cpu.regs.sp,
|
|
31
|
+
};
|
|
32
|
+
const pairSet = {
|
|
33
|
+
0: (cpu, v) => { cpu.regs.bc = v; },
|
|
34
|
+
1: (cpu, v) => { cpu.regs.de = v; },
|
|
35
|
+
2: (cpu, v) => { cpu.regs.hl = v; },
|
|
36
|
+
3: (cpu, v) => { cpu.regs.sp = v; },
|
|
37
|
+
};
|
|
38
|
+
for (let p = 0; p < 4; p++) {
|
|
39
|
+
// SBC HL,rr (ED 42/52/62/72)
|
|
40
|
+
ed[0x42 | (p << 4)] = (cpu) => {
|
|
41
|
+
const hl = cpu.regs.hl;
|
|
42
|
+
cpu.regs.wz = u16(hl + 1);
|
|
43
|
+
cpu.regs.hl = sbc16(cpu.flags, hl, pairGet[p](cpu), cpu.flags.c ? 1 : 0);
|
|
44
|
+
return 15;
|
|
45
|
+
};
|
|
46
|
+
// ADC HL,rr (ED 4A/5A/6A/7A)
|
|
47
|
+
ed[0x4a | (p << 4)] = (cpu) => {
|
|
48
|
+
const hl = cpu.regs.hl;
|
|
49
|
+
cpu.regs.wz = u16(hl + 1);
|
|
50
|
+
cpu.regs.hl = adc16(cpu.flags, hl, pairGet[p](cpu), cpu.flags.c ? 1 : 0);
|
|
51
|
+
return 15;
|
|
52
|
+
};
|
|
53
|
+
// LD (nn),rr (ED 43/53/63/73)
|
|
54
|
+
ed[0x43 | (p << 4)] = (cpu) => {
|
|
55
|
+
const nn = cpu.fetchWord();
|
|
56
|
+
write16(cpu, nn, pairGet[p](cpu));
|
|
57
|
+
cpu.regs.wz = u16(nn + 1);
|
|
58
|
+
return 20;
|
|
59
|
+
};
|
|
60
|
+
// LD rr,(nn) (ED 4B/5B/6B/7B)
|
|
61
|
+
ed[0x4b | (p << 4)] = (cpu) => {
|
|
62
|
+
const nn = cpu.fetchWord();
|
|
63
|
+
pairSet[p](cpu, read16(cpu, nn));
|
|
64
|
+
cpu.regs.wz = u16(nn + 1);
|
|
65
|
+
return 20;
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
// NEG (ED 44) and its undocumented duplicates.
|
|
69
|
+
const neg = (cpu) => {
|
|
70
|
+
cpu.regs.a = sub8(cpu.flags, 0, cpu.regs.a, 0);
|
|
71
|
+
return 8;
|
|
72
|
+
};
|
|
73
|
+
for (const op of [0x44, 0x4c, 0x54, 0x5c, 0x64, 0x6c, 0x74, 0x7c])
|
|
74
|
+
ed[op] = neg;
|
|
75
|
+
// RETN (ED 45 + dups) and RETI (ED 4D): both restore IFF1 from IFF2.
|
|
76
|
+
const retn = (cpu) => {
|
|
77
|
+
cpu.iff1 = cpu.iff2;
|
|
78
|
+
const pc = cpu.pop16();
|
|
79
|
+
cpu.regs.pc = pc;
|
|
80
|
+
cpu.regs.wz = pc;
|
|
81
|
+
return 14;
|
|
82
|
+
};
|
|
83
|
+
for (const op of [0x45, 0x55, 0x5d, 0x65, 0x6d, 0x75, 0x7d])
|
|
84
|
+
ed[op] = retn;
|
|
85
|
+
ed[0x4d] = retn; // RETI
|
|
86
|
+
// IM 0/1/2 (ED 46/56/5E) + undocumented duplicates.
|
|
87
|
+
const setIm = (mode) => (cpu) => { cpu.im = mode; return 8; };
|
|
88
|
+
ed[0x46] = setIm(0);
|
|
89
|
+
ed[0x4e] = setIm(0);
|
|
90
|
+
ed[0x66] = setIm(0);
|
|
91
|
+
ed[0x6e] = setIm(0);
|
|
92
|
+
ed[0x56] = setIm(1);
|
|
93
|
+
ed[0x76] = setIm(1);
|
|
94
|
+
ed[0x5e] = setIm(2);
|
|
95
|
+
ed[0x7e] = setIm(2);
|
|
96
|
+
// LD I,A / LD R,A / LD A,I / LD A,R
|
|
97
|
+
ed[0x47] = (cpu) => { cpu.regs.i = cpu.regs.a; return 9; };
|
|
98
|
+
ed[0x4f] = (cpu) => { cpu.regs.r = cpu.regs.a; return 9; };
|
|
99
|
+
ed[0x57] = (cpu) => { ldAToIR(cpu, cpu.regs.i); return 9; };
|
|
100
|
+
ed[0x5f] = (cpu) => { ldAToIR(cpu, cpu.regs.r); return 9; };
|
|
101
|
+
// RRD (ED 67) / RLD (ED 6F)
|
|
102
|
+
ed[0x67] = (cpu) => {
|
|
103
|
+
const hl = cpu.regs.hl;
|
|
104
|
+
const m = cpu.bus.read(hl);
|
|
105
|
+
const a = cpu.regs.a;
|
|
106
|
+
cpu.bus.write(hl, ((a << 4) | (m >> 4)) & 0xff);
|
|
107
|
+
cpu.regs.a = (a & 0xf0) | (m & 0x0f);
|
|
108
|
+
setSzyxp(cpu.flags, cpu.regs.a);
|
|
109
|
+
cpu.flags.h = false;
|
|
110
|
+
cpu.flags.n = false;
|
|
111
|
+
cpu.regs.wz = u16(hl + 1);
|
|
112
|
+
return 18;
|
|
113
|
+
};
|
|
114
|
+
ed[0x6f] = (cpu) => {
|
|
115
|
+
const hl = cpu.regs.hl;
|
|
116
|
+
const m = cpu.bus.read(hl);
|
|
117
|
+
const a = cpu.regs.a;
|
|
118
|
+
cpu.bus.write(hl, ((m << 4) | (a & 0x0f)) & 0xff);
|
|
119
|
+
cpu.regs.a = (a & 0xf0) | ((m >> 4) & 0x0f);
|
|
120
|
+
setSzyxp(cpu.flags, cpu.regs.a);
|
|
121
|
+
cpu.flags.h = false;
|
|
122
|
+
cpu.flags.n = false;
|
|
123
|
+
cpu.regs.wz = u16(hl + 1);
|
|
124
|
+
return 18;
|
|
125
|
+
};
|
|
126
|
+
// IN r,(C) (ED 40/48/50/58/60/68/70/78) — 0x70 is IN (C): flags only, no store.
|
|
127
|
+
for (let r = 0; r < 8; r++) {
|
|
128
|
+
ed[0x40 | (r << 3)] = (cpu) => {
|
|
129
|
+
const v = cpu.bus.ioRead(cpu.regs.c) & 0xff;
|
|
130
|
+
if (r !== 6)
|
|
131
|
+
setRealR(cpu.regs, r, v);
|
|
132
|
+
setSzyxp(cpu.flags, v);
|
|
133
|
+
cpu.flags.h = false;
|
|
134
|
+
cpu.flags.n = false;
|
|
135
|
+
cpu.regs.wz = u16(cpu.regs.bc + 1);
|
|
136
|
+
return 12;
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
// OUT (C),r (ED 41/49/51/59/61/69/71/79) — 0x71 is OUT (C),0.
|
|
140
|
+
for (let r = 0; r < 8; r++) {
|
|
141
|
+
ed[0x41 | (r << 3)] = (cpu) => {
|
|
142
|
+
const v = r === 6 ? 0 : getRealR(cpu.regs, r);
|
|
143
|
+
cpu.bus.ioWrite(cpu.regs.c, v);
|
|
144
|
+
cpu.regs.wz = u16(cpu.regs.bc + 1);
|
|
145
|
+
return 12;
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=ed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ed.js","sourceRoot":"","sources":["../../../../src/cpu/z80/instructions/ed.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exchange.d.ts","sourceRoot":"","sources":["../../../../src/cpu/z80/instructions/exchange.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGzD,oCAAoC;AACpC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CAoC3E"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { u16 } from '../../../util/bits.js';
|
|
2
|
+
/** EX/EXX exchange instructions. */
|
|
3
|
+
export function registerExchange(table, view) {
|
|
4
|
+
// EX DE,HL — NOT index-affected (a DD/FD prefix still swaps DE and the real HL).
|
|
5
|
+
table[0xeb] = (cpu) => {
|
|
6
|
+
const de = cpu.regs.de;
|
|
7
|
+
cpu.regs.de = cpu.regs.hl;
|
|
8
|
+
cpu.regs.hl = de;
|
|
9
|
+
return 4;
|
|
10
|
+
};
|
|
11
|
+
// EX AF,AF'
|
|
12
|
+
table[0x08] = (cpu) => {
|
|
13
|
+
const a = cpu.regs.a;
|
|
14
|
+
const f = cpu.flags.toByte();
|
|
15
|
+
cpu.regs.a = cpu.regs.a2;
|
|
16
|
+
cpu.flags.fromByte(cpu.regs.f2);
|
|
17
|
+
cpu.regs.a2 = a;
|
|
18
|
+
cpu.regs.f2 = f;
|
|
19
|
+
return 4;
|
|
20
|
+
};
|
|
21
|
+
// EXX
|
|
22
|
+
table[0xd9] = (cpu) => { cpu.regs.exx(); return 4; };
|
|
23
|
+
// EX (SP),HL / EX (SP),IX / EX (SP),IY
|
|
24
|
+
table[0xe3] = (cpu) => {
|
|
25
|
+
const sp = cpu.regs.sp;
|
|
26
|
+
const lo = cpu.bus.read(sp);
|
|
27
|
+
const hi = cpu.bus.read(u16(sp + 1));
|
|
28
|
+
const val = view.getPair(cpu.regs);
|
|
29
|
+
cpu.bus.write(sp, val & 0xff);
|
|
30
|
+
cpu.bus.write(u16(sp + 1), (val >> 8) & 0xff);
|
|
31
|
+
const swapped = (hi << 8) | lo;
|
|
32
|
+
view.setPair(cpu.regs, swapped);
|
|
33
|
+
cpu.regs.wz = swapped;
|
|
34
|
+
return 19;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=exchange.js.map
|