@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.
Files changed (320) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +542 -0
  3. package/dist/8sim.browser.js +4728 -0
  4. package/dist/bundles/CardBundle.d.ts +83 -0
  5. package/dist/bundles/CardBundle.d.ts.map +1 -0
  6. package/dist/bundles/CardBundle.js +41 -0
  7. package/dist/bundles/CardBundle.js.map +1 -0
  8. package/dist/bundles/kernels.d.ts +48 -0
  9. package/dist/bundles/kernels.d.ts.map +1 -0
  10. package/dist/bundles/kernels.js +132 -0
  11. package/dist/bundles/kernels.js.map +1 -0
  12. package/dist/bundles/seed/index.d.ts +24 -0
  13. package/dist/bundles/seed/index.d.ts.map +1 -0
  14. package/dist/bundles/seed/index.js +266 -0
  15. package/dist/bundles/seed/index.js.map +1 -0
  16. package/dist/bus/Bus.d.ts +21 -0
  17. package/dist/bus/Bus.d.ts.map +1 -0
  18. package/dist/bus/Bus.js +62 -0
  19. package/dist/bus/Bus.js.map +1 -0
  20. package/dist/bus/BusRegion.d.ts +8 -0
  21. package/dist/bus/BusRegion.d.ts.map +1 -0
  22. package/dist/bus/BusRegion.js +8 -0
  23. package/dist/bus/BusRegion.js.map +1 -0
  24. package/dist/bus/SnoopBus.d.ts +15 -0
  25. package/dist/bus/SnoopBus.d.ts.map +1 -0
  26. package/dist/bus/SnoopBus.js +41 -0
  27. package/dist/bus/SnoopBus.js.map +1 -0
  28. package/dist/cards/BankRamCard.d.ts +35 -0
  29. package/dist/cards/BankRamCard.d.ts.map +1 -0
  30. package/dist/cards/BankRamCard.js +56 -0
  31. package/dist/cards/BankRamCard.js.map +1 -0
  32. package/dist/cards/DazzlerCard.d.ts +42 -0
  33. package/dist/cards/DazzlerCard.d.ts.map +1 -0
  34. package/dist/cards/DazzlerCard.js +83 -0
  35. package/dist/cards/DazzlerCard.js.map +1 -0
  36. package/dist/cards/DisplaySurface.d.ts +32 -0
  37. package/dist/cards/DisplaySurface.d.ts.map +1 -0
  38. package/dist/cards/DisplaySurface.js +11 -0
  39. package/dist/cards/DisplaySurface.js.map +1 -0
  40. package/dist/cards/FdcPlusClient.d.ts +35 -0
  41. package/dist/cards/FdcPlusClient.d.ts.map +1 -0
  42. package/dist/cards/FdcPlusClient.js +130 -0
  43. package/dist/cards/FdcPlusClient.js.map +1 -0
  44. package/dist/cards/ImsaiMioCard.d.ts +36 -0
  45. package/dist/cards/ImsaiMioCard.d.ts.map +1 -0
  46. package/dist/cards/ImsaiMioCard.js +48 -0
  47. package/dist/cards/ImsaiMioCard.js.map +1 -0
  48. package/dist/cards/ImsaiSioCard.d.ts +19 -0
  49. package/dist/cards/ImsaiSioCard.d.ts.map +1 -0
  50. package/dist/cards/ImsaiSioCard.js +54 -0
  51. package/dist/cards/ImsaiSioCard.js.map +1 -0
  52. package/dist/cards/KeyboardCard.d.ts +37 -0
  53. package/dist/cards/KeyboardCard.d.ts.map +1 -0
  54. package/dist/cards/KeyboardCard.js +79 -0
  55. package/dist/cards/KeyboardCard.js.map +1 -0
  56. package/dist/cards/Mc6850Acia.d.ts +68 -0
  57. package/dist/cards/Mc6850Acia.d.ts.map +1 -0
  58. package/dist/cards/Mc6850Acia.js +132 -0
  59. package/dist/cards/Mc6850Acia.js.map +1 -0
  60. package/dist/cards/Mits2SioCard.d.ts +27 -0
  61. package/dist/cards/Mits2SioCard.d.ts.map +1 -0
  62. package/dist/cards/Mits2SioCard.js +36 -0
  63. package/dist/cards/Mits2SioCard.js.map +1 -0
  64. package/dist/cards/MitsDcddCard.d.ts +52 -0
  65. package/dist/cards/MitsDcddCard.d.ts.map +1 -0
  66. package/dist/cards/MitsDcddCard.js +294 -0
  67. package/dist/cards/MitsDcddCard.js.map +1 -0
  68. package/dist/cards/ParallelCard.d.ts +35 -0
  69. package/dist/cards/ParallelCard.d.ts.map +1 -0
  70. package/dist/cards/ParallelCard.js +32 -0
  71. package/dist/cards/ParallelCard.js.map +1 -0
  72. package/dist/cards/Port8212.d.ts +31 -0
  73. package/dist/cards/Port8212.d.ts.map +1 -0
  74. package/dist/cards/Port8212.js +47 -0
  75. package/dist/cards/Port8212.js.map +1 -0
  76. package/dist/cards/RtcCard.d.ts +30 -0
  77. package/dist/cards/RtcCard.d.ts.map +1 -0
  78. package/dist/cards/RtcCard.js +61 -0
  79. package/dist/cards/RtcCard.js.map +1 -0
  80. package/dist/cards/SerialCard.d.ts +31 -0
  81. package/dist/cards/SerialCard.d.ts.map +1 -0
  82. package/dist/cards/SerialCard.js +28 -0
  83. package/dist/cards/SerialCard.js.map +1 -0
  84. package/dist/cards/Tr1602Uart.d.ts +55 -0
  85. package/dist/cards/Tr1602Uart.d.ts.map +1 -0
  86. package/dist/cards/Tr1602Uart.js +102 -0
  87. package/dist/cards/Tr1602Uart.js.map +1 -0
  88. package/dist/cards/Usart8251.d.ts +28 -0
  89. package/dist/cards/Usart8251.d.ts.map +1 -0
  90. package/dist/cards/Usart8251.js +88 -0
  91. package/dist/cards/Usart8251.js.map +1 -0
  92. package/dist/cards/VdmCard.d.ts +27 -0
  93. package/dist/cards/VdmCard.d.ts.map +1 -0
  94. package/dist/cards/VdmCard.js +40 -0
  95. package/dist/cards/VdmCard.js.map +1 -0
  96. package/dist/clock/ImmediateClock.d.ts +8 -0
  97. package/dist/clock/ImmediateClock.d.ts.map +1 -0
  98. package/dist/clock/ImmediateClock.js +13 -0
  99. package/dist/clock/ImmediateClock.js.map +1 -0
  100. package/dist/clock/SystemClock.d.ts +45 -0
  101. package/dist/clock/SystemClock.d.ts.map +1 -0
  102. package/dist/clock/SystemClock.js +71 -0
  103. package/dist/clock/SystemClock.js.map +1 -0
  104. package/dist/cpu/Cpu8080.d.ts +34 -0
  105. package/dist/cpu/Cpu8080.d.ts.map +1 -0
  106. package/dist/cpu/Cpu8080.js +126 -0
  107. package/dist/cpu/Cpu8080.js.map +1 -0
  108. package/dist/cpu/Decoder.d.ts +12 -0
  109. package/dist/cpu/Decoder.d.ts.map +1 -0
  110. package/dist/cpu/Decoder.js +23 -0
  111. package/dist/cpu/Decoder.js.map +1 -0
  112. package/dist/cpu/Flags.d.ts +18 -0
  113. package/dist/cpu/Flags.d.ts.map +1 -0
  114. package/dist/cpu/Flags.js +33 -0
  115. package/dist/cpu/Flags.js.map +1 -0
  116. package/dist/cpu/Registers.d.ts +22 -0
  117. package/dist/cpu/Registers.d.ts.map +1 -0
  118. package/dist/cpu/Registers.js +26 -0
  119. package/dist/cpu/Registers.js.map +1 -0
  120. package/dist/cpu/instructions/alu.d.ts +3 -0
  121. package/dist/cpu/instructions/alu.d.ts.map +1 -0
  122. package/dist/cpu/instructions/alu.js +221 -0
  123. package/dist/cpu/instructions/alu.js.map +1 -0
  124. package/dist/cpu/instructions/branch.d.ts +3 -0
  125. package/dist/cpu/instructions/branch.d.ts.map +1 -0
  126. package/dist/cpu/instructions/branch.js +117 -0
  127. package/dist/cpu/instructions/branch.js.map +1 -0
  128. package/dist/cpu/instructions/control.d.ts +3 -0
  129. package/dist/cpu/instructions/control.d.ts.map +1 -0
  130. package/dist/cpu/instructions/control.js +12 -0
  131. package/dist/cpu/instructions/control.js.map +1 -0
  132. package/dist/cpu/instructions/data.d.ts +3 -0
  133. package/dist/cpu/instructions/data.d.ts.map +1 -0
  134. package/dist/cpu/instructions/data.js +137 -0
  135. package/dist/cpu/instructions/data.js.map +1 -0
  136. package/dist/cpu/instructions/io.d.ts +3 -0
  137. package/dist/cpu/instructions/io.d.ts.map +1 -0
  138. package/dist/cpu/instructions/io.js +18 -0
  139. package/dist/cpu/instructions/io.js.map +1 -0
  140. package/dist/cpu/instructions/logical.d.ts +3 -0
  141. package/dist/cpu/instructions/logical.d.ts.map +1 -0
  142. package/dist/cpu/instructions/logical.js +129 -0
  143. package/dist/cpu/instructions/logical.js.map +1 -0
  144. package/dist/cpu/instructions/rotate.d.ts +3 -0
  145. package/dist/cpu/instructions/rotate.d.ts.map +1 -0
  146. package/dist/cpu/instructions/rotate.js +34 -0
  147. package/dist/cpu/instructions/rotate.js.map +1 -0
  148. package/dist/cpu/instructions/stack.d.ts +3 -0
  149. package/dist/cpu/instructions/stack.d.ts.map +1 -0
  150. package/dist/cpu/instructions/stack.js +84 -0
  151. package/dist/cpu/instructions/stack.js.map +1 -0
  152. package/dist/cpu/status8080.d.ts +33 -0
  153. package/dist/cpu/status8080.d.ts.map +1 -0
  154. package/dist/cpu/status8080.js +73 -0
  155. package/dist/cpu/status8080.js.map +1 -0
  156. package/dist/cpu/z80/CpuZ80.d.ts +53 -0
  157. package/dist/cpu/z80/CpuZ80.d.ts.map +1 -0
  158. package/dist/cpu/z80/CpuZ80.js +168 -0
  159. package/dist/cpu/z80/CpuZ80.js.map +1 -0
  160. package/dist/cpu/z80/DecoderZ80.d.ts +26 -0
  161. package/dist/cpu/z80/DecoderZ80.d.ts.map +1 -0
  162. package/dist/cpu/z80/DecoderZ80.js +107 -0
  163. package/dist/cpu/z80/DecoderZ80.js.map +1 -0
  164. package/dist/cpu/z80/FlagsZ80.d.ts +27 -0
  165. package/dist/cpu/z80/FlagsZ80.d.ts.map +1 -0
  166. package/dist/cpu/z80/FlagsZ80.js +47 -0
  167. package/dist/cpu/z80/FlagsZ80.js.map +1 -0
  168. package/dist/cpu/z80/RegistersZ80.d.ts +60 -0
  169. package/dist/cpu/z80/RegistersZ80.d.ts.map +1 -0
  170. package/dist/cpu/z80/RegistersZ80.js +90 -0
  171. package/dist/cpu/z80/RegistersZ80.js.map +1 -0
  172. package/dist/cpu/z80/flagHelpers.d.ts +25 -0
  173. package/dist/cpu/z80/flagHelpers.d.ts.map +1 -0
  174. package/dist/cpu/z80/flagHelpers.js +136 -0
  175. package/dist/cpu/z80/flagHelpers.js.map +1 -0
  176. package/dist/cpu/z80/instructions/alu16.d.ts +4 -0
  177. package/dist/cpu/z80/instructions/alu16.d.ts.map +1 -0
  178. package/dist/cpu/z80/instructions/alu16.js +27 -0
  179. package/dist/cpu/z80/instructions/alu16.js.map +1 -0
  180. package/dist/cpu/z80/instructions/alu8.d.ts +4 -0
  181. package/dist/cpu/z80/instructions/alu8.d.ts.map +1 -0
  182. package/dist/cpu/z80/instructions/alu8.js +100 -0
  183. package/dist/cpu/z80/instructions/alu8.js.map +1 -0
  184. package/dist/cpu/z80/instructions/bits.d.ts +10 -0
  185. package/dist/cpu/z80/instructions/bits.d.ts.map +1 -0
  186. package/dist/cpu/z80/instructions/bits.js +164 -0
  187. package/dist/cpu/z80/instructions/bits.js.map +1 -0
  188. package/dist/cpu/z80/instructions/block.d.ts +10 -0
  189. package/dist/cpu/z80/instructions/block.d.ts.map +1 -0
  190. package/dist/cpu/z80/instructions/block.js +141 -0
  191. package/dist/cpu/z80/instructions/block.js.map +1 -0
  192. package/dist/cpu/z80/instructions/control.d.ts +4 -0
  193. package/dist/cpu/z80/instructions/control.d.ts.map +1 -0
  194. package/dist/cpu/z80/instructions/control.js +62 -0
  195. package/dist/cpu/z80/instructions/control.js.map +1 -0
  196. package/dist/cpu/z80/instructions/ed.d.ts +4 -0
  197. package/dist/cpu/z80/instructions/ed.d.ts.map +1 -0
  198. package/dist/cpu/z80/instructions/ed.js +149 -0
  199. package/dist/cpu/z80/instructions/ed.js.map +1 -0
  200. package/dist/cpu/z80/instructions/exchange.d.ts +4 -0
  201. package/dist/cpu/z80/instructions/exchange.d.ts.map +1 -0
  202. package/dist/cpu/z80/instructions/exchange.js +37 -0
  203. package/dist/cpu/z80/instructions/exchange.js.map +1 -0
  204. package/dist/cpu/z80/instructions/io.d.ts +8 -0
  205. package/dist/cpu/z80/instructions/io.d.ts.map +1 -0
  206. package/dist/cpu/z80/instructions/io.js +22 -0
  207. package/dist/cpu/z80/instructions/io.js.map +1 -0
  208. package/dist/cpu/z80/instructions/jump.d.ts +4 -0
  209. package/dist/cpu/z80/instructions/jump.d.ts.map +1 -0
  210. package/dist/cpu/z80/instructions/jump.js +113 -0
  211. package/dist/cpu/z80/instructions/jump.js.map +1 -0
  212. package/dist/cpu/z80/instructions/load.d.ts +7 -0
  213. package/dist/cpu/z80/instructions/load.d.ts.map +1 -0
  214. package/dist/cpu/z80/instructions/load.js +103 -0
  215. package/dist/cpu/z80/instructions/load.js.map +1 -0
  216. package/dist/cpu/z80/instructions/rotate.d.ts +9 -0
  217. package/dist/cpu/z80/instructions/rotate.d.ts.map +1 -0
  218. package/dist/cpu/z80/instructions/rotate.js +48 -0
  219. package/dist/cpu/z80/instructions/rotate.js.map +1 -0
  220. package/dist/cpu/z80/instructions/stack.d.ts +4 -0
  221. package/dist/cpu/z80/instructions/stack.d.ts.map +1 -0
  222. package/dist/cpu/z80/instructions/stack.js +19 -0
  223. package/dist/cpu/z80/instructions/stack.js.map +1 -0
  224. package/dist/cpu/z80/regcodes.d.ts +22 -0
  225. package/dist/cpu/z80/regcodes.d.ts.map +1 -0
  226. package/dist/cpu/z80/regcodes.js +93 -0
  227. package/dist/cpu/z80/regcodes.js.map +1 -0
  228. package/dist/cpu/z80/types.d.ts +59 -0
  229. package/dist/cpu/z80/types.d.ts.map +1 -0
  230. package/dist/cpu/z80/types.js +2 -0
  231. package/dist/cpu/z80/types.js.map +1 -0
  232. package/dist/cpu/z80/views.d.ts +8 -0
  233. package/dist/cpu/z80/views.d.ts.map +1 -0
  234. package/dist/cpu/z80/views.js +40 -0
  235. package/dist/cpu/z80/views.js.map +1 -0
  236. package/dist/index.d.ts +67 -0
  237. package/dist/index.d.ts.map +1 -0
  238. package/dist/index.js +49 -0
  239. package/dist/index.js.map +1 -0
  240. package/dist/interfaces/IBus.d.ts +8 -0
  241. package/dist/interfaces/IBus.d.ts.map +1 -0
  242. package/dist/interfaces/IBus.js +2 -0
  243. package/dist/interfaces/IBus.js.map +1 -0
  244. package/dist/interfaces/IBusObserver.d.ts +7 -0
  245. package/dist/interfaces/IBusObserver.d.ts.map +1 -0
  246. package/dist/interfaces/IBusObserver.js +2 -0
  247. package/dist/interfaces/IBusObserver.js.map +1 -0
  248. package/dist/interfaces/IClock.d.ts +6 -0
  249. package/dist/interfaces/IClock.d.ts.map +1 -0
  250. package/dist/interfaces/IClock.js +2 -0
  251. package/dist/interfaces/IClock.js.map +1 -0
  252. package/dist/interfaces/ICpu.d.ts +46 -0
  253. package/dist/interfaces/ICpu.d.ts.map +1 -0
  254. package/dist/interfaces/ICpu.js +2 -0
  255. package/dist/interfaces/ICpu.js.map +1 -0
  256. package/dist/interfaces/IIODevice.d.ts +7 -0
  257. package/dist/interfaces/IIODevice.d.ts.map +1 -0
  258. package/dist/interfaces/IIODevice.js +2 -0
  259. package/dist/interfaces/IIODevice.js.map +1 -0
  260. package/dist/interfaces/IInterruptController.d.ts +8 -0
  261. package/dist/interfaces/IInterruptController.d.ts.map +1 -0
  262. package/dist/interfaces/IInterruptController.js +2 -0
  263. package/dist/interfaces/IInterruptController.js.map +1 -0
  264. package/dist/interfaces/IMemory.d.ts +9 -0
  265. package/dist/interfaces/IMemory.d.ts.map +1 -0
  266. package/dist/interfaces/IMemory.js +2 -0
  267. package/dist/interfaces/IMemory.js.map +1 -0
  268. package/dist/interfaces/IModule.d.ts +5 -0
  269. package/dist/interfaces/IModule.d.ts.map +1 -0
  270. package/dist/interfaces/IModule.js +2 -0
  271. package/dist/interfaces/IModule.js.map +1 -0
  272. package/dist/interfaces/IS100Card.d.ts +6 -0
  273. package/dist/interfaces/IS100Card.d.ts.map +1 -0
  274. package/dist/interfaces/IS100Card.js +2 -0
  275. package/dist/interfaces/IS100Card.js.map +1 -0
  276. package/dist/interfaces/index.d.ts +10 -0
  277. package/dist/interfaces/index.d.ts.map +1 -0
  278. package/dist/interfaces/index.js +2 -0
  279. package/dist/interfaces/index.js.map +1 -0
  280. package/dist/interrupt/InterruptController.d.ts +13 -0
  281. package/dist/interrupt/InterruptController.d.ts.map +1 -0
  282. package/dist/interrupt/InterruptController.js +36 -0
  283. package/dist/interrupt/InterruptController.js.map +1 -0
  284. package/dist/io/IoSpace.d.ts +9 -0
  285. package/dist/io/IoSpace.d.ts.map +1 -0
  286. package/dist/io/IoSpace.js +30 -0
  287. package/dist/io/IoSpace.js.map +1 -0
  288. package/dist/machine/MachineRunner.d.ts +54 -0
  289. package/dist/machine/MachineRunner.d.ts.map +1 -0
  290. package/dist/machine/MachineRunner.js +102 -0
  291. package/dist/machine/MachineRunner.js.map +1 -0
  292. package/dist/machine/MachineSpec.d.ts +80 -0
  293. package/dist/machine/MachineSpec.d.ts.map +1 -0
  294. package/dist/machine/MachineSpec.js +9 -0
  295. package/dist/machine/MachineSpec.js.map +1 -0
  296. package/dist/machine/buildMachine.d.ts +19 -0
  297. package/dist/machine/buildMachine.d.ts.map +1 -0
  298. package/dist/machine/buildMachine.js +122 -0
  299. package/dist/machine/buildMachine.js.map +1 -0
  300. package/dist/memory/MemoryMappedIOAdapter.d.ts +14 -0
  301. package/dist/memory/MemoryMappedIOAdapter.d.ts.map +1 -0
  302. package/dist/memory/MemoryMappedIOAdapter.js +23 -0
  303. package/dist/memory/MemoryMappedIOAdapter.js.map +1 -0
  304. package/dist/memory/Ram.d.ts +17 -0
  305. package/dist/memory/Ram.d.ts.map +1 -0
  306. package/dist/memory/Ram.js +36 -0
  307. package/dist/memory/Ram.js.map +1 -0
  308. package/dist/memory/Rom.d.ts +13 -0
  309. package/dist/memory/Rom.d.ts.map +1 -0
  310. package/dist/memory/Rom.js +25 -0
  311. package/dist/memory/Rom.js.map +1 -0
  312. package/dist/util/bits.d.ts +11 -0
  313. package/dist/util/bits.d.ts.map +1 -0
  314. package/dist/util/bits.js +35 -0
  315. package/dist/util/bits.js.map +1 -0
  316. package/dist/util/hostConsole.d.ts +2 -0
  317. package/dist/util/hostConsole.d.ts.map +1 -0
  318. package/dist/util/hostConsole.js +4 -0
  319. package/dist/util/hostConsole.js.map +1 -0
  320. 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,4 @@
1
+ import type { Z80Handler, IndexView } from '../types.js';
2
+ /** NOP, HALT, DI, EI, DAA, CPL, SCF, CCF (view-independent, live in main table). */
3
+ export declare function registerControl(table: Z80Handler[], _view: IndexView): void;
4
+ //# sourceMappingURL=control.d.ts.map
@@ -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,4 @@
1
+ import type { Z80Handler } from '../types.js';
2
+ /** ED-prefixed instructions (excluding the block ops, which block.ts registers). */
3
+ export declare function registerEd(ed: Z80Handler[]): void;
4
+ //# sourceMappingURL=ed.d.ts.map
@@ -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,4 @@
1
+ import type { Z80Handler, IndexView } from '../types.js';
2
+ /** EX/EXX exchange instructions. */
3
+ export declare function registerExchange(table: Z80Handler[], view: IndexView): void;
4
+ //# sourceMappingURL=exchange.d.ts.map
@@ -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