badline 0.12.0 → 0.13.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 (516) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +25 -0
  3. data/CLAUDE.md +59 -31
  4. data/README.md +1 -1
  5. data/doc/library.md +9 -9
  6. data/doc/pinned-behaviour.md +105 -105
  7. data/doc/snapshots.md +1 -4
  8. data/lib/badline/audio/bare_player.rb +4 -4
  9. data/lib/badline/audio/cli.rb +6 -6
  10. data/lib/badline/audio/jukebox.rb +2 -2
  11. data/lib/badline/audio/machine_player.rb +2 -2
  12. data/lib/badline/{media → audio}/queue.rb +1 -1
  13. data/lib/badline/audio/queued_tune.rb +6 -6
  14. data/lib/badline/audio/renderer.rb +5 -5
  15. data/lib/badline/audio/stereo.rb +1 -1
  16. data/lib/badline/c128/{bus_state.rb → bus/saved_state.rb} +6 -6
  17. data/lib/badline/c128/bus.rb +30 -51
  18. data/lib/badline/c128/color_lines.rb +2 -2
  19. data/lib/badline/c128/cpu.rb +1 -1
  20. data/lib/badline/c128/drives.rb +10 -11
  21. data/lib/badline/c128/fast_serial.rb +5 -5
  22. data/lib/badline/c128/mmu_pages.rb +1 -1
  23. data/lib/badline/c128/modes.rb +2 -2
  24. data/lib/badline/c128/saved_state.rb +21 -47
  25. data/lib/badline/c128/z80.rb +2 -2
  26. data/lib/badline/c128.rb +18 -72
  27. data/lib/badline/{computer → c64}/attachments.rb +16 -47
  28. data/lib/badline/c64/banked_ram/banking.rb +32 -0
  29. data/lib/badline/c64/banked_ram/plus256k.rb +56 -0
  30. data/lib/badline/c64/banked_ram/plus60k.rb +45 -0
  31. data/lib/badline/c64/banked_ram/unexpanded.rb +30 -0
  32. data/lib/badline/c64/banked_ram.rb +23 -0
  33. data/lib/badline/c64/bus/extra_sids.rb +32 -0
  34. data/lib/badline/c64/bus/fittings.rb +40 -0
  35. data/lib/badline/c64/bus/pla.rb +149 -0
  36. data/lib/badline/c64/bus/roms.rb +41 -0
  37. data/lib/badline/c64/bus/saved_state.rb +68 -0
  38. data/lib/badline/c64/bus/sid_slots.rb +44 -0
  39. data/lib/badline/c64/bus.rb +218 -0
  40. data/lib/badline/c64/cartridge/action_replay.rb +128 -0
  41. data/lib/badline/c64/cartridge/atomic_power.rb +26 -0
  42. data/lib/badline/c64/cartridge/bank.rb +83 -0
  43. data/lib/badline/c64/cartridge/comal80.rb +52 -0
  44. data/lib/badline/c64/cartridge/dinamic.rb +36 -0
  45. data/lib/badline/c64/cartridge/easy_flash.rb +147 -0
  46. data/lib/badline/c64/cartridge/epyx_fastload.rb +81 -0
  47. data/lib/badline/c64/cartridge/final_cartridge3.rb +91 -0
  48. data/lib/badline/c64/cartridge/flash/saved_state.rb +40 -0
  49. data/lib/badline/c64/cartridge/flash.rb +279 -0
  50. data/lib/badline/c64/cartridge/freezer.rb +35 -0
  51. data/lib/badline/c64/cartridge/fun_play.rb +40 -0
  52. data/lib/badline/c64/cartridge/g_mod2.rb +76 -0
  53. data/lib/badline/c64/cartridge/game_system.rb +42 -0
  54. data/lib/badline/c64/cartridge/geo_ram.rb +81 -0
  55. data/lib/badline/c64/cartridge/kcs_power.rb +77 -0
  56. data/lib/badline/c64/cartridge/mach5.rb +34 -0
  57. data/lib/badline/c64/cartridge/magic_desk.rb +32 -0
  58. data/lib/badline/c64/cartridge/ocean.rb +37 -0
  59. data/lib/badline/c64/cartridge/pagefox.rb +70 -0
  60. data/lib/badline/c64/cartridge/retro_replay/saved_state.rb +47 -0
  61. data/lib/badline/c64/cartridge/retro_replay.rb +286 -0
  62. data/lib/badline/c64/cartridge/rex_utility.rb +31 -0
  63. data/lib/badline/c64/cartridge/rgcd.rb +60 -0
  64. data/lib/badline/c64/cartridge/saved_state.rb +63 -0
  65. data/lib/badline/c64/cartridge/simons_basic.rb +37 -0
  66. data/lib/badline/c64/cartridge/standard.rb +17 -0
  67. data/lib/badline/c64/cartridge/super_games.rb +50 -0
  68. data/lib/badline/c64/cartridge/westermann.rb +32 -0
  69. data/lib/badline/c64/cartridge/zaxxon.rb +68 -0
  70. data/lib/badline/c64/cartridge.rb +258 -0
  71. data/lib/badline/c64/color_memory.rb +27 -0
  72. data/lib/badline/c64/common.rb +34 -0
  73. data/lib/badline/c64/kernal_traps.rb +89 -0
  74. data/lib/badline/c64/reu/dma/saved_state.rb +52 -0
  75. data/lib/badline/c64/reu/dma.rb +275 -0
  76. data/lib/badline/c64/reu/ram.rb +109 -0
  77. data/lib/badline/c64/reu/saved_state.rb +55 -0
  78. data/lib/badline/c64/reu/trigger.rb +34 -0
  79. data/lib/badline/c64/reu.rb +291 -0
  80. data/lib/badline/{computer → c64}/saved_state.rb +13 -18
  81. data/lib/badline/{computer → c64}/true_drives.rb +20 -31
  82. data/lib/badline/{computer.rb → c64.rb} +22 -80
  83. data/lib/badline/chips/cia/fast_forward.rb +62 -0
  84. data/lib/badline/chips/cia/interrupt_register.rb +145 -0
  85. data/lib/badline/chips/cia/saved_state.rb +49 -0
  86. data/lib/badline/chips/cia/serial/saved_state.rb +45 -0
  87. data/lib/badline/chips/cia/serial.rb +250 -0
  88. data/lib/badline/chips/cia/time_of_day.rb +232 -0
  89. data/lib/badline/chips/cia/timer.rb +208 -0
  90. data/lib/badline/chips/cia.rb +281 -0
  91. data/lib/badline/chips/cpu/addressing.rb +133 -0
  92. data/lib/badline/chips/cpu/boundary.rb +56 -0
  93. data/lib/badline/chips/cpu/core.rb +167 -0
  94. data/lib/badline/chips/cpu/instruction.rb +338 -0
  95. data/lib/badline/chips/cpu/instruction_set/arithmetic.rb +118 -0
  96. data/lib/badline/chips/cpu/instruction_set/bitwise.rb +130 -0
  97. data/lib/badline/chips/cpu/instruction_set/branch.rb +83 -0
  98. data/lib/badline/chips/cpu/instruction_set/flag.rb +67 -0
  99. data/lib/badline/chips/cpu/instruction_set/illegal.rb +274 -0
  100. data/lib/badline/chips/cpu/instruction_set/inc_dec.rb +73 -0
  101. data/lib/badline/chips/cpu/instruction_set/stack.rb +56 -0
  102. data/lib/badline/chips/cpu/instruction_set/transfer.rb +141 -0
  103. data/lib/badline/chips/cpu/instruction_set.rb +59 -0
  104. data/lib/badline/chips/cpu/interrupts.rb +108 -0
  105. data/lib/badline/chips/cpu/microcode.rb +179 -0
  106. data/lib/badline/chips/cpu/operations.rb +90 -0
  107. data/lib/badline/chips/cpu/port.rb +116 -0
  108. data/lib/badline/chips/cpu/saved_state.rb +117 -0
  109. data/lib/badline/chips/cpu/stack_operations.rb +84 -0
  110. data/lib/badline/chips/cpu/traps.rb +23 -0
  111. data/lib/badline/chips/cpu.rb +12 -0
  112. data/lib/badline/chips/sid/catch_up.rb +122 -0
  113. data/lib/badline/chips/sid/decimator.rb +66 -0
  114. data/lib/badline/chips/sid/envelope/saved_state.rb +70 -0
  115. data/lib/badline/chips/sid/envelope.rb +241 -0
  116. data/lib/badline/chips/sid/filter/saved_state.rb +42 -0
  117. data/lib/badline/chips/sid/filter.rb +241 -0
  118. data/lib/badline/chips/sid/saved_state.rb +52 -0
  119. data/lib/badline/chips/sid/voice.rb +79 -0
  120. data/lib/badline/chips/sid/waveform/combined.rb +128 -0
  121. data/lib/badline/chips/sid/waveform/fast_forward.rb +107 -0
  122. data/lib/badline/chips/sid/waveform/noise_writeback.rb +124 -0
  123. data/lib/badline/chips/sid/waveform/saved_state.rb +68 -0
  124. data/lib/badline/chips/sid/waveform.rb +307 -0
  125. data/lib/badline/chips/sid.rb +265 -0
  126. data/lib/badline/{c128 → chips}/vdc/memory.rb +1 -1
  127. data/lib/badline/{c128 → chips}/vdc/painter.rb +1 -1
  128. data/lib/badline/{c128 → chips}/vdc/raster.rb +1 -1
  129. data/lib/badline/chips/vdc/saved_state.rb +36 -0
  130. data/lib/badline/{c128 → chips}/vdc/window.rb +1 -1
  131. data/lib/badline/{c128 → chips}/vdc.rb +7 -31
  132. data/lib/badline/chips/via/control_lines.rb +124 -0
  133. data/lib/badline/chips/via/fast_forward.rb +55 -0
  134. data/lib/badline/chips/via/interrupt_register.rb +69 -0
  135. data/lib/badline/chips/via/saved_state.rb +44 -0
  136. data/lib/badline/chips/via/shift_register.rb +182 -0
  137. data/lib/badline/chips/via/timer1.rb +133 -0
  138. data/lib/badline/chips/via/timer2.rb +135 -0
  139. data/lib/badline/chips/via.rb +268 -0
  140. data/lib/badline/chips/vic/bank.rb +135 -0
  141. data/lib/badline/chips/vic/border_mask.rb +88 -0
  142. data/lib/badline/chips/vic/collisions.rb +117 -0
  143. data/lib/badline/chips/vic/color_patches.rb +49 -0
  144. data/lib/badline/chips/vic/display_state.rb +187 -0
  145. data/lib/badline/chips/vic/graphics_mode.rb +166 -0
  146. data/lib/badline/chips/vic/graphics_shifter/saved_state.rb +40 -0
  147. data/lib/badline/chips/vic/graphics_shifter.rb +187 -0
  148. data/lib/badline/chips/vic/register_log.rb +83 -0
  149. data/lib/badline/chips/vic/registers.rb +197 -0
  150. data/lib/badline/chips/vic/saved_state.rb +82 -0
  151. data/lib/badline/chips/vic/sequencer/saved_state.rb +91 -0
  152. data/lib/badline/chips/vic/sequencer.rb +277 -0
  153. data/lib/badline/chips/vic/sequencer_output.rb +118 -0
  154. data/lib/badline/chips/vic/sprite/internal_bus.rb +70 -0
  155. data/lib/badline/chips/vic/sprite/saved_state.rb +66 -0
  156. data/lib/badline/chips/vic/sprite/shifter.rb +148 -0
  157. data/lib/badline/chips/vic/sprite/timing.rb +58 -0
  158. data/lib/badline/chips/vic/sprite.rb +339 -0
  159. data/lib/badline/chips/vic/sprites/saved_state.rb +59 -0
  160. data/lib/badline/chips/vic/sprites.rb +284 -0
  161. data/lib/badline/chips/vic.rb +783 -0
  162. data/lib/badline/chips/vic_i/painter/saved_state.rb +40 -0
  163. data/lib/badline/{vic20/vic → chips/vic_i}/painter.rb +6 -30
  164. data/lib/badline/{vic20/vic → chips/vic_i}/saved_state.rb +2 -2
  165. data/lib/badline/chips/vic_i/sound/output.rb +85 -0
  166. data/lib/badline/chips/vic_i/sound.rb +235 -0
  167. data/lib/badline/{vic20/vic → chips/vic_i}/text_window.rb +2 -2
  168. data/lib/badline/{vic20/vic.rb → chips/vic_i.rb} +5 -5
  169. data/lib/badline/chips/z80/arithmetic.rb +119 -0
  170. data/lib/badline/chips/z80/bit_page.rb +57 -0
  171. data/lib/badline/chips/z80/block_io.rb +60 -0
  172. data/lib/badline/chips/z80/block_transfers.rb +61 -0
  173. data/lib/badline/chips/z80/bus_cycles.rb +113 -0
  174. data/lib/badline/chips/z80/core.rb +115 -0
  175. data/lib/badline/chips/z80/exchanges.rb +52 -0
  176. data/lib/badline/chips/z80/extended_page.rb +91 -0
  177. data/lib/badline/chips/z80/flags.rb +39 -0
  178. data/lib/badline/chips/z80/interrupt_acceptance.rb +48 -0
  179. data/lib/badline/chips/z80/jumps.rb +84 -0
  180. data/lib/badline/chips/z80/loads.rb +100 -0
  181. data/lib/badline/chips/z80/main_page.rb +136 -0
  182. data/lib/badline/chips/z80/registers.rb +122 -0
  183. data/lib/badline/chips/z80/saved_state.rb +71 -0
  184. data/lib/badline/chips/z80/shifts.rb +66 -0
  185. data/lib/badline/chips/z80.rb +13 -0
  186. data/lib/badline/core.rb +27 -29
  187. data/lib/badline/drives/datasette/saved_state.rb +37 -0
  188. data/lib/badline/drives/datasette.rb +140 -0
  189. data/lib/badline/drives/engine/core.rb +149 -0
  190. data/lib/badline/drives/engine/fast_serial.rb +75 -0
  191. data/lib/badline/drives/engine/idle.rb +127 -0
  192. data/lib/badline/drives/engine/idle_cpu.rb +30 -0
  193. data/lib/badline/drives/engine/orbit.rb +81 -0
  194. data/lib/badline/drives/engine/serial_lines.rb +75 -0
  195. data/lib/badline/drives/engine/sleep.rb +114 -0
  196. data/lib/badline/drives/engine/vias.rb +86 -0
  197. data/lib/badline/drives/engine/watch.rb +152 -0
  198. data/lib/badline/drives/engine.rb +11 -0
  199. data/lib/badline/drives/model1541/bus.rb +88 -0
  200. data/lib/badline/drives/model1541/byte_ready.rb +50 -0
  201. data/lib/badline/drives/model1541/cpu.rb +13 -0
  202. data/lib/badline/drives/model1541/disk/saved_state.rb +88 -0
  203. data/lib/badline/drives/model1541/disk.rb +317 -0
  204. data/lib/badline/drives/model1541/disk_via.rb +38 -0
  205. data/lib/badline/drives/model1541/gcr.rb +59 -0
  206. data/lib/badline/drives/model1541/mechanism/saved_state.rb +72 -0
  207. data/lib/badline/drives/model1541/mechanism.rb +315 -0
  208. data/lib/badline/drives/model1541/rotation.rb +123 -0
  209. data/lib/badline/drives/model1541/saved_state.rb +44 -0
  210. data/lib/badline/drives/model1541/sector_reader.rb +78 -0
  211. data/lib/badline/drives/model1541/serial_port.rb +20 -0
  212. data/lib/badline/drives/model1541/track.rb +100 -0
  213. data/lib/badline/drives/model1541.rb +81 -0
  214. data/lib/badline/drives/model1571/bus.rb +113 -0
  215. data/lib/badline/drives/model1571/cpu.rb +13 -0
  216. data/lib/badline/drives/model1571/saved_state.rb +47 -0
  217. data/lib/badline/drives/model1571/serial_port.rb +39 -0
  218. data/lib/badline/drives/model1571/serial_via.rb +27 -0
  219. data/lib/badline/drives/model1571/wd1770.rb +122 -0
  220. data/lib/badline/drives/model1571.rb +142 -0
  221. data/lib/badline/drives/model1581/bus.rb +139 -0
  222. data/lib/badline/drives/model1581/cpu.rb +13 -0
  223. data/lib/badline/drives/model1581/disk/saved_state.rb +89 -0
  224. data/lib/badline/drives/model1581/disk.rb +137 -0
  225. data/lib/badline/drives/model1581/mechanism.rb +119 -0
  226. data/lib/badline/drives/model1581/saved_state.rb +42 -0
  227. data/lib/badline/drives/model1581/serial_port.rb +54 -0
  228. data/lib/badline/drives/model1581/slot.rb +79 -0
  229. data/lib/badline/drives/model1581/track.rb +102 -0
  230. data/lib/badline/drives/model1581/track_bytes.rb +77 -0
  231. data/lib/badline/drives/model1581/wd1772/registers.rb +91 -0
  232. data/lib/badline/drives/model1581/wd1772/saved_state.rb +68 -0
  233. data/lib/badline/drives/model1581/wd1772/sector_writes.rb +75 -0
  234. data/lib/badline/drives/model1581/wd1772/sectors.rb +152 -0
  235. data/lib/badline/drives/model1581/wd1772/stepping.rb +111 -0
  236. data/lib/badline/drives/model1581/wd1772/tracks.rb +127 -0
  237. data/lib/badline/drives/model1581/wd1772/turn.rb +75 -0
  238. data/lib/badline/drives/model1581/wd1772.rb +218 -0
  239. data/lib/badline/drives/model1581.rb +206 -0
  240. data/lib/badline/drives/serial_bus.rb +161 -0
  241. data/lib/badline/frontend/boot.rb +10 -61
  242. data/lib/badline/frontend/machine_window.rb +3 -1
  243. data/lib/badline/frontend/player/filter_view.rb +1 -1
  244. data/lib/badline/frontend/player/player_controller.rb +2 -2
  245. data/lib/badline/frontend/player/player_screen.rb +1 -0
  246. data/lib/badline/frontend/player/theme.rb +7 -7
  247. data/lib/badline/frontend/timeline.rb +3 -3
  248. data/lib/badline/input/control_ports.rb +78 -0
  249. data/lib/badline/input/joystick.rb +27 -0
  250. data/lib/badline/input/keyboard.rb +114 -0
  251. data/lib/badline/input.rb +3 -0
  252. data/lib/badline/kernal_trap/{drive → dos}/block_commands.rb +1 -1
  253. data/lib/badline/kernal_trap/dos/channel.rb +183 -0
  254. data/lib/badline/kernal_trap/{drive → dos}/channels.rb +1 -1
  255. data/lib/badline/kernal_trap/{drive → dos}/memory.rb +1 -1
  256. data/lib/badline/kernal_trap/{drive → dos}/parameters.rb +1 -1
  257. data/lib/badline/kernal_trap/{drive → dos}/status.rb +1 -1
  258. data/lib/badline/kernal_trap/{drive → dos}/write_file.rb +1 -1
  259. data/lib/badline/kernal_trap/{drive → dos}/writes.rb +1 -1
  260. data/lib/badline/kernal_trap/{drive.rb → dos.rb} +11 -10
  261. data/lib/badline/kernal_trap/{file.rb → file_routine.rb} +1 -1
  262. data/lib/badline/kernal_trap/load.rb +6 -6
  263. data/lib/badline/kernal_trap/save.rb +5 -5
  264. data/lib/badline/kernal_trap/serial.rb +7 -7
  265. data/lib/badline/kernal_trap.rb +2 -3
  266. data/lib/badline/machine/clocking.rb +50 -0
  267. data/lib/badline/machine.rb +63 -7
  268. data/lib/badline/media/boot_disk.rb +2 -2
  269. data/lib/badline/media/disk_list.rb +3 -3
  270. data/lib/badline/media/disk_set.rb +1 -1
  271. data/lib/badline/media/extensions.rb +33 -0
  272. data/lib/badline/media/program.rb +28 -0
  273. data/lib/badline/media/true_drive.rb +4 -3
  274. data/lib/badline/media/tune.rb +35 -0
  275. data/lib/badline/media/vic20_cartridge.rb +1 -7
  276. data/lib/badline/media/vic20_media.rb +38 -80
  277. data/lib/badline/media.rb +84 -81
  278. data/lib/badline/model.rb +1 -1
  279. data/lib/badline/options/event.rb +3 -1
  280. data/lib/badline/roms/README +6 -6
  281. data/lib/badline/sdl.rb +1 -0
  282. data/lib/badline/{storage/sid_file.rb → sid_tune/file.rb} +3 -3
  283. data/lib/badline/{storage → sid_tune}/hvsc.rb +7 -7
  284. data/lib/badline/{storage → sid_tune}/song_lengths.rb +2 -2
  285. data/lib/badline/{storage → sid_tune}/stil/credit.rb +1 -1
  286. data/lib/badline/{storage → sid_tune}/stil.rb +3 -3
  287. data/lib/badline/sid_tune.rb +6 -0
  288. data/lib/badline/snapshot/c128_setup.rb +43 -0
  289. data/lib/badline/snapshot/c64_setup.rb +79 -0
  290. data/lib/badline/snapshot/image.rb +5 -25
  291. data/lib/badline/snapshot/machine_state.rb +10 -2
  292. data/lib/badline/snapshot/setup.rb +22 -66
  293. data/lib/badline/snapshot/state.rb +8 -17
  294. data/lib/badline/snapshot/storage_setup.rb +68 -0
  295. data/lib/badline/snapshot/vic20_setup.rb +37 -0
  296. data/lib/badline/snapshot/vice/c64_mem.rb +1 -1
  297. data/lib/badline/snapshot/vice/restore.rb +1 -1
  298. data/lib/badline/snapshot/vice/reu1764.rb +1 -1
  299. data/lib/badline/snapshot/vice/reu_fields.rb +40 -0
  300. data/lib/badline/snapshot/vice.rb +7 -5
  301. data/lib/badline/snapshot.rb +13 -12
  302. data/lib/badline/storage/d64_image.rb +15 -9
  303. data/lib/badline/storage/d71_image.rb +0 -2
  304. data/lib/badline/storage/d81_image.rb +0 -2
  305. data/lib/badline/storage/disk_image/writing.rb +2 -2
  306. data/lib/badline/storage/disk_image.rb +3 -6
  307. data/lib/badline/storage/g64_image.rb +2 -2
  308. data/lib/badline/storage/host_directory.rb +0 -5
  309. data/lib/badline/storage/t64.rb +2 -8
  310. data/lib/badline/storage/unavailable.rb +1 -1
  311. data/lib/badline/storage.rb +0 -37
  312. data/lib/badline/support/c128_checkpoint.rb +39 -0
  313. data/lib/badline/support/checkpoint.rb +108 -0
  314. data/lib/badline/support/vic20_checkpoint.rb +38 -0
  315. data/lib/badline/support.rb +5 -0
  316. data/lib/badline/version.rb +1 -1
  317. data/lib/badline/vic20/attachments.rb +11 -81
  318. data/lib/badline/vic20/bus/saved_state.rb +35 -0
  319. data/lib/badline/vic20/bus.rb +3 -25
  320. data/lib/badline/vic20/cpu.rb +1 -1
  321. data/lib/badline/vic20/port_wiring.rb +4 -4
  322. data/lib/badline/vic20/saved_state.rb +16 -60
  323. data/lib/badline/vic20/user_via_ports.rb +2 -2
  324. data/lib/badline/vic20.rb +20 -51
  325. metadata +250 -221
  326. data/lib/badline/address_bus/extra_sids.rb +0 -30
  327. data/lib/badline/address_bus/fittings.rb +0 -38
  328. data/lib/badline/address_bus/pla.rb +0 -147
  329. data/lib/badline/address_bus/roms.rb +0 -39
  330. data/lib/badline/address_bus/saved_state.rb +0 -72
  331. data/lib/badline/address_bus/sid_slots.rb +0 -42
  332. data/lib/badline/address_bus.rb +0 -235
  333. data/lib/badline/cartridge/action_replay.rb +0 -126
  334. data/lib/badline/cartridge/atomic_power.rb +0 -24
  335. data/lib/badline/cartridge/bank.rb +0 -81
  336. data/lib/badline/cartridge/comal80.rb +0 -50
  337. data/lib/badline/cartridge/dinamic.rb +0 -34
  338. data/lib/badline/cartridge/easy_flash.rb +0 -145
  339. data/lib/badline/cartridge/epyx_fastload.rb +0 -79
  340. data/lib/badline/cartridge/final_cartridge3.rb +0 -89
  341. data/lib/badline/cartridge/flash.rb +0 -306
  342. data/lib/badline/cartridge/freezer.rb +0 -33
  343. data/lib/badline/cartridge/fun_play.rb +0 -38
  344. data/lib/badline/cartridge/g_mod2.rb +0 -74
  345. data/lib/badline/cartridge/game_system.rb +0 -40
  346. data/lib/badline/cartridge/geo_ram.rb +0 -79
  347. data/lib/badline/cartridge/kcs_power.rb +0 -75
  348. data/lib/badline/cartridge/mach5.rb +0 -32
  349. data/lib/badline/cartridge/magic_desk.rb +0 -30
  350. data/lib/badline/cartridge/ocean.rb +0 -35
  351. data/lib/badline/cartridge/pagefox.rb +0 -68
  352. data/lib/badline/cartridge/retro_replay.rb +0 -320
  353. data/lib/badline/cartridge/rex_utility.rb +0 -29
  354. data/lib/badline/cartridge/rgcd.rb +0 -58
  355. data/lib/badline/cartridge/simons_basic.rb +0 -35
  356. data/lib/badline/cartridge/standard.rb +0 -15
  357. data/lib/badline/cartridge/super_games.rb +0 -48
  358. data/lib/badline/cartridge/westermann.rb +0 -30
  359. data/lib/badline/cartridge/zaxxon.rb +0 -66
  360. data/lib/badline/cartridge.rb +0 -303
  361. data/lib/badline/checkpoint.rb +0 -98
  362. data/lib/badline/cia/fast_forward.rb +0 -60
  363. data/lib/badline/cia/interrupt_register.rb +0 -143
  364. data/lib/badline/cia/serial.rb +0 -275
  365. data/lib/badline/cia/state.rb +0 -47
  366. data/lib/badline/cia/timer.rb +0 -206
  367. data/lib/badline/cia.rb +0 -279
  368. data/lib/badline/color_memory.rb +0 -25
  369. data/lib/badline/computer/kernal_traps.rb +0 -29
  370. data/lib/badline/control_ports.rb +0 -76
  371. data/lib/badline/cpu/addressing.rb +0 -131
  372. data/lib/badline/cpu/boundary.rb +0 -54
  373. data/lib/badline/cpu/core.rb +0 -165
  374. data/lib/badline/cpu/microcode.rb +0 -177
  375. data/lib/badline/cpu/operations.rb +0 -88
  376. data/lib/badline/cpu/saved_state.rb +0 -115
  377. data/lib/badline/cpu/stack_operations.rb +0 -82
  378. data/lib/badline/cpu.rb +0 -10
  379. data/lib/badline/cycleable.rb +0 -38
  380. data/lib/badline/datasette.rb +0 -161
  381. data/lib/badline/drive/core.rb +0 -147
  382. data/lib/badline/drive/fast_serial.rb +0 -73
  383. data/lib/badline/drive/idle.rb +0 -125
  384. data/lib/badline/drive/idle_cpu.rb +0 -28
  385. data/lib/badline/drive/orbit.rb +0 -79
  386. data/lib/badline/drive/serial_lines.rb +0 -73
  387. data/lib/badline/drive/sleep.rb +0 -112
  388. data/lib/badline/drive/vias.rb +0 -84
  389. data/lib/badline/drive/watch.rb +0 -150
  390. data/lib/badline/drive.rb +0 -11
  391. data/lib/badline/drive1541/bus.rb +0 -86
  392. data/lib/badline/drive1541/byte_ready.rb +0 -48
  393. data/lib/badline/drive1541/cpu.rb +0 -11
  394. data/lib/badline/drive1541/disk.rb +0 -318
  395. data/lib/badline/drive1541/disk_state.rb +0 -94
  396. data/lib/badline/drive1541/disk_via.rb +0 -36
  397. data/lib/badline/drive1541/gcr.rb +0 -57
  398. data/lib/badline/drive1541/mechanism.rb +0 -313
  399. data/lib/badline/drive1541/mechanism_state.rb +0 -68
  400. data/lib/badline/drive1541/rotation.rb +0 -121
  401. data/lib/badline/drive1541/sector_reader.rb +0 -76
  402. data/lib/badline/drive1541/serial_port.rb +0 -18
  403. data/lib/badline/drive1541/track.rb +0 -98
  404. data/lib/badline/drive1541.rb +0 -111
  405. data/lib/badline/drive1571/bus.rb +0 -111
  406. data/lib/badline/drive1571/cpu.rb +0 -11
  407. data/lib/badline/drive1571/serial_port.rb +0 -37
  408. data/lib/badline/drive1571/serial_via.rb +0 -25
  409. data/lib/badline/drive1571/wd1770.rb +0 -120
  410. data/lib/badline/drive1571.rb +0 -175
  411. data/lib/badline/drive1581/bus.rb +0 -137
  412. data/lib/badline/drive1581/cpu.rb +0 -11
  413. data/lib/badline/drive1581/disk.rb +0 -135
  414. data/lib/badline/drive1581/disk_state.rb +0 -87
  415. data/lib/badline/drive1581/mechanism.rb +0 -117
  416. data/lib/badline/drive1581/serial_port.rb +0 -52
  417. data/lib/badline/drive1581/slot.rb +0 -78
  418. data/lib/badline/drive1581/track.rb +0 -100
  419. data/lib/badline/drive1581/track_bytes.rb +0 -75
  420. data/lib/badline/drive1581/wd1772/registers.rb +0 -89
  421. data/lib/badline/drive1581/wd1772/sector_writes.rb +0 -73
  422. data/lib/badline/drive1581/wd1772/sectors.rb +0 -150
  423. data/lib/badline/drive1581/wd1772/state.rb +0 -66
  424. data/lib/badline/drive1581/wd1772/stepping.rb +0 -109
  425. data/lib/badline/drive1581/wd1772/tracks.rb +0 -125
  426. data/lib/badline/drive1581/wd1772/turn.rb +0 -73
  427. data/lib/badline/drive1581/wd1772.rb +0 -216
  428. data/lib/badline/drive1581.rb +0 -233
  429. data/lib/badline/iec_bus.rb +0 -159
  430. data/lib/badline/instruction.rb +0 -334
  431. data/lib/badline/instruction_set/arithmetic.rb +0 -114
  432. data/lib/badline/instruction_set/bitwise.rb +0 -126
  433. data/lib/badline/instruction_set/branch.rb +0 -79
  434. data/lib/badline/instruction_set/flag.rb +0 -63
  435. data/lib/badline/instruction_set/illegal.rb +0 -270
  436. data/lib/badline/instruction_set/inc_dec.rb +0 -69
  437. data/lib/badline/instruction_set/stack.rb +0 -52
  438. data/lib/badline/instruction_set/transfer.rb +0 -137
  439. data/lib/badline/instruction_set.rb +0 -55
  440. data/lib/badline/interrupts.rb +0 -104
  441. data/lib/badline/joystick.rb +0 -25
  442. data/lib/badline/kernal_trap/channel.rb +0 -181
  443. data/lib/badline/keyboard.rb +0 -112
  444. data/lib/badline/ram_expansion/banking.rb +0 -30
  445. data/lib/badline/ram_expansion/plus256k.rb +0 -54
  446. data/lib/badline/ram_expansion/plus60k.rb +0 -43
  447. data/lib/badline/ram_expansion/unexpanded.rb +0 -28
  448. data/lib/badline/ram_expansion.rb +0 -21
  449. data/lib/badline/reu/dma/saved_state.rb +0 -50
  450. data/lib/badline/reu/dma.rb +0 -273
  451. data/lib/badline/reu/ram.rb +0 -107
  452. data/lib/badline/reu/saved_state.rb +0 -80
  453. data/lib/badline/reu/trigger.rb +0 -32
  454. data/lib/badline/reu.rb +0 -289
  455. data/lib/badline/sid/catch_up.rb +0 -120
  456. data/lib/badline/sid/decimator.rb +0 -64
  457. data/lib/badline/sid/envelope/state.rb +0 -68
  458. data/lib/badline/sid/envelope.rb +0 -239
  459. data/lib/badline/sid/filter.rb +0 -263
  460. data/lib/badline/sid/voice.rb +0 -77
  461. data/lib/badline/sid/waveform/combined.rb +0 -126
  462. data/lib/badline/sid/waveform/fast_forward.rb +0 -105
  463. data/lib/badline/sid/waveform/noise_writeback.rb +0 -122
  464. data/lib/badline/sid/waveform/state.rb +0 -66
  465. data/lib/badline/sid/waveform.rb +0 -305
  466. data/lib/badline/sid.rb +0 -303
  467. data/lib/badline/time_of_day.rb +0 -228
  468. data/lib/badline/traps.rb +0 -19
  469. data/lib/badline/via/control_lines.rb +0 -122
  470. data/lib/badline/via/fast_forward.rb +0 -53
  471. data/lib/badline/via/interrupt_register.rb +0 -67
  472. data/lib/badline/via/shift_register.rb +0 -180
  473. data/lib/badline/via/state.rb +0 -42
  474. data/lib/badline/via/timer1.rb +0 -131
  475. data/lib/badline/via/timer2.rb +0 -133
  476. data/lib/badline/via.rb +0 -266
  477. data/lib/badline/vic/bank.rb +0 -133
  478. data/lib/badline/vic/border_mask.rb +0 -86
  479. data/lib/badline/vic/collisions.rb +0 -115
  480. data/lib/badline/vic/color_patches.rb +0 -47
  481. data/lib/badline/vic/display_state.rb +0 -185
  482. data/lib/badline/vic/graphics_mode.rb +0 -164
  483. data/lib/badline/vic/graphics_shifter.rb +0 -207
  484. data/lib/badline/vic/register_log.rb +0 -81
  485. data/lib/badline/vic/registers.rb +0 -195
  486. data/lib/badline/vic/sequencer.rb +0 -275
  487. data/lib/badline/vic/sequencer_output.rb +0 -116
  488. data/lib/badline/vic/sequencer_state.rb +0 -89
  489. data/lib/badline/vic/sprite/internal_bus.rb +0 -68
  490. data/lib/badline/vic/sprite/saved_state.rb +0 -64
  491. data/lib/badline/vic/sprite/shifter.rb +0 -146
  492. data/lib/badline/vic/sprite/timing.rb +0 -56
  493. data/lib/badline/vic/sprite.rb +0 -337
  494. data/lib/badline/vic/sprites.rb +0 -282
  495. data/lib/badline/vic/sprites_state.rb +0 -57
  496. data/lib/badline/vic.rb +0 -852
  497. data/lib/badline/vic20/sound/output.rb +0 -83
  498. data/lib/badline/vic20/sound.rb +0 -233
  499. data/lib/badline/z80/arithmetic.rb +0 -117
  500. data/lib/badline/z80/bit_page.rb +0 -55
  501. data/lib/badline/z80/block_io.rb +0 -58
  502. data/lib/badline/z80/block_transfers.rb +0 -59
  503. data/lib/badline/z80/bus_cycles.rb +0 -111
  504. data/lib/badline/z80/core.rb +0 -113
  505. data/lib/badline/z80/exchanges.rb +0 -50
  506. data/lib/badline/z80/extended_page.rb +0 -89
  507. data/lib/badline/z80/flags.rb +0 -37
  508. data/lib/badline/z80/interrupt_acceptance.rb +0 -46
  509. data/lib/badline/z80/jumps.rb +0 -82
  510. data/lib/badline/z80/loads.rb +0 -98
  511. data/lib/badline/z80/main_page.rb +0 -134
  512. data/lib/badline/z80/registers.rb +0 -120
  513. data/lib/badline/z80/saved_state.rb +0 -69
  514. data/lib/badline/z80/shifts.rb +0 -64
  515. data/lib/badline/z80.rb +0 -11
  516. /data/lib/badline/snapshot/{fields.rb → vice/fields.rb} +0 -0
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Badline
4
+ module Chips
5
+ class Z80
6
+ # Loads, PUSH, and IN and OUT through a port A and n address. The loads
7
+ # through a pointer leave the address after it in WZ, or for a store of
8
+ # A, A and the low byte of that address.
9
+ module Loads
10
+ private
11
+
12
+ # LD r,r' with (HL) as index 6.
13
+ def load_register(target, source)
14
+ if source == 6
15
+ set_plain_register(target, read_byte(operand_address))
16
+ elsif target == 6
17
+ write_byte(operand_address, plain_register(source))
18
+ else
19
+ set_register(target, register(source))
20
+ end
21
+ end
22
+
23
+ # LD r,n, and LD (IX+d),n, which reads n while it adds d.
24
+ def load_immediate(index)
25
+ return set_register(index, fetch_byte) unless index == 6
26
+ return write_byte(hl, fetch_byte) if @prefix.zero?
27
+
28
+ displaced
29
+ value = fetch_byte
30
+ @cycles += 2
31
+ write_byte(@wz, value)
32
+ end
33
+
34
+ def indirect_load(row)
35
+ case row
36
+ when 0 then store_a(bc)
37
+ when 1 then load_a(bc)
38
+ when 2 then store_a(de)
39
+ when 3 then load_a(de)
40
+ when 4 then store_word(hl_or_index)
41
+ when 5 then self.hl_or_index = load_word
42
+ when 6 then store_a(fetch_word)
43
+ else load_a(fetch_word)
44
+ end
45
+ end
46
+
47
+ def load_a(address)
48
+ @a = read_byte(address)
49
+ @wz = (address + 1) & 0xffff
50
+ end
51
+
52
+ def store_a(address)
53
+ write_byte(address, @a)
54
+ @wz = (@a << 8) | ((address + 1) & 0xff)
55
+ end
56
+
57
+ def store_word(value)
58
+ address = fetch_word
59
+ write_word(address, value)
60
+ @wz = (address + 1) & 0xffff
61
+ end
62
+
63
+ def load_word
64
+ address = fetch_word
65
+ @wz = (address + 1) & 0xffff
66
+ read_word(address)
67
+ end
68
+
69
+ def push_pair(index)
70
+ @cycles += 1
71
+ push(stack_pair(index))
72
+ end
73
+
74
+ # RET, EXX, JP (HL) and LD SP,HL.
75
+ def stack_and_exchange(index)
76
+ case index
77
+ when 0 then return_from_call
78
+ when 1 then exchange_alternates
79
+ when 2 then @pc = hl_or_index
80
+ else
81
+ @cycles += 2
82
+ @sp = hl_or_index
83
+ end
84
+ end
85
+
86
+ def output_immediate
87
+ port = (@a << 8) | fetch_byte
88
+ output(port, @a)
89
+ @wz = (port & 0xff00) | ((port + 1) & 0xff)
90
+ end
91
+
92
+ def input_immediate
93
+ port = (@a << 8) | fetch_byte
94
+ @wz = (port + 1) & 0xffff
95
+ @a = input(port)
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,136 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Badline
4
+ module Chips
5
+ class Z80
6
+ # The unprefixed opcodes, which DD and FD reuse with IX or IY for HL.
7
+ # An opcode splits into its quarter (bits 7-6), its row (5-3) and its
8
+ # column (2-0), and each quarter of the page is regular in rows and
9
+ # columns.
10
+ module MainPage
11
+ private
12
+
13
+ def execute(opcode)
14
+ case opcode >> 6
15
+ when 0 then execute_low(opcode)
16
+ when 1 then opcode == 0x76 ? @halted = true : load_register((opcode >> 3) & 7, opcode & 7)
17
+ when 2 then alu((opcode >> 3) & 7, operand(opcode & 7))
18
+ else execute_high(opcode)
19
+ end
20
+ end
21
+
22
+ def execute_low(opcode)
23
+ row = (opcode >> 3) & 7
24
+ case opcode & 7
25
+ when 0 then relative_jump(row)
26
+ when 1 then opcode.nobits?(8) ? set_pair(row >> 1, fetch_word) : add_pair(row >> 1)
27
+ when 2 then indirect_load(row)
28
+ when 3 then step_pair(row)
29
+ when 4 then modify(row, true)
30
+ when 5 then modify(row, false)
31
+ when 6 then load_immediate(row)
32
+ else accumulator_operation(row)
33
+ end
34
+ end
35
+
36
+ def execute_high(opcode)
37
+ row = (opcode >> 3) & 7
38
+ case opcode & 7
39
+ when 0 then conditional_return(row)
40
+ when 1 then opcode.nobits?(8) ? set_stack_pair(row >> 1, pop) : stack_and_exchange(row >> 1)
41
+ when 2 then jump(condition?(row))
42
+ when 3 then miscellaneous(row)
43
+ when 4 then call(condition?(row))
44
+ when 5 then opcode.nobits?(8) ? push_pair(row >> 1) : call_or_prefix(row >> 1)
45
+ when 6 then alu(row, fetch_byte)
46
+ else restart(row << 3)
47
+ end
48
+ end
49
+
50
+ # The operand of the 8-bit ALU opcodes: a register or (HL).
51
+ def operand(index)
52
+ index == 6 ? read_byte(operand_address) : register(index)
53
+ end
54
+
55
+ # INC and DEC on a register or (HL).
56
+ def modify(index, increase)
57
+ if index == 6
58
+ address = operand_address
59
+ value = read_byte(address)
60
+ @cycles += 1
61
+ write_byte(address, increase ? increment(value) : decrement(value))
62
+ else
63
+ set_register(index, increase ? increment(register(index)) : decrement(register(index)))
64
+ end
65
+ end
66
+
67
+ # INC and DEC on a pair, which touch no flags.
68
+ def step_pair(row)
69
+ @cycles += 2
70
+ index = row >> 1
71
+ set_pair(index, (pair(index) + (row.nobits?(1) ? 1 : -1)) & 0xffff)
72
+ end
73
+
74
+ def add_pair(index)
75
+ self.hl_or_index = add16(hl_or_index, pair(index))
76
+ @cycles += 7
77
+ end
78
+
79
+ def accumulator_operation(row)
80
+ case row
81
+ when 0, 1, 2, 3 then rotate_a(row)
82
+ when 4 then daa
83
+ when 5 then complement
84
+ when 6 then assign_flags((@f & (SF | ZF | PF)) | CF | (((@last_q ^ @f) | @a) & XYF))
85
+ else assign_flags((@f & (SF | ZF | PF)) | ((@f & CF) << 4) | ((@f & CF) ^ CF) | (((@last_q ^ @f) | @a) & XYF))
86
+ end
87
+ end
88
+
89
+ def complement
90
+ @a ^= 0xff
91
+ assign_flags((@f & (SF | ZF | PF | CF)) | HF | NF | (@a & XYF))
92
+ end
93
+
94
+ def miscellaneous(row)
95
+ case row
96
+ when 0 then jump(true)
97
+ when 1 then @prefix.zero? ? execute_bits(fetch_opcode) : execute_index_bits
98
+ when 2 then output_immediate
99
+ when 3 then input_immediate
100
+ when 4 then exchange_stack_top
101
+ when 5 then exchange_de_hl
102
+ when 6 then @iff1 = @iff2 = false
103
+ else enable_interrupts
104
+ end
105
+ end
106
+
107
+ def call_or_prefix(index)
108
+ case index
109
+ when 0 then call(true)
110
+ when 1 then index_prefix(1)
111
+ when 2 then extended_prefix
112
+ else index_prefix(2)
113
+ end
114
+ end
115
+
116
+ # DD and FD: the next opcode runs with IX or IY for HL. A prefix
117
+ # after a prefix replaces it.
118
+ def index_prefix(prefix)
119
+ @prefix = prefix
120
+ @last_q = 0
121
+ execute(fetch_opcode)
122
+ end
123
+
124
+ def extended_prefix
125
+ @prefix = 0
126
+ execute_extended(fetch_opcode)
127
+ end
128
+
129
+ def enable_interrupts
130
+ @iff1 = @iff2 = true
131
+ @after_ei = true
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,122 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Badline
4
+ module Chips
5
+ class Z80
6
+ # The register file. Opcodes name 8-bit registers by a 3-bit index,
7
+ # B C D E H L (HL) A, and pairs by a 2-bit one, BC DE HL SP, or BC DE
8
+ # HL AF for PUSH and POP. After a DD or FD prefix, HL means IX or IY
9
+ # and H and L their halves, except beside an (IX+d) operand.
10
+ module Registers
11
+ attr_accessor :a, :f, :b, :c, :d, :e, :h, :l, :i, :r, :pc, :sp, :ix, :iy, :wz, :im, :q,
12
+ :af_alt, :bc_alt, :de_alt, :hl_alt, :iff1, :iff2, :halted, :after_ei, :after_ld_a_ir
13
+
14
+ def af = (@a << 8) | @f
15
+ def bc = (@b << 8) | @c
16
+ def de = (@d << 8) | @e
17
+ def hl = (@h << 8) | @l
18
+
19
+ def af=(value)
20
+ @a = value >> 8
21
+ @f = value & 0xff
22
+ end
23
+
24
+ def bc=(value)
25
+ @b = value >> 8
26
+ @c = value & 0xff
27
+ end
28
+
29
+ def de=(value)
30
+ @d = value >> 8
31
+ @e = value & 0xff
32
+ end
33
+
34
+ def hl=(value)
35
+ @h = value >> 8
36
+ @l = value & 0xff
37
+ end
38
+
39
+ private
40
+
41
+ def register(index)
42
+ case index
43
+ when 0 then @b
44
+ when 1 then @c
45
+ when 2 then @d
46
+ when 3 then @e
47
+ when 4 then @prefix.zero? ? @h : index_register >> 8
48
+ when 5 then @prefix.zero? ? @l : index_register & 0xff
49
+ else @a
50
+ end
51
+ end
52
+
53
+ def set_register(index, value)
54
+ case index
55
+ when 0 then @b = value
56
+ when 1 then @c = value
57
+ when 2 then @d = value
58
+ when 3 then @e = value
59
+ when 4 then @prefix.zero? ? @h = value : self.index_register = (index_register & 0xff) | (value << 8)
60
+ when 5 then @prefix.zero? ? @l = value : self.index_register = (index_register & 0xff00) | value
61
+ else @a = value
62
+ end
63
+ end
64
+
65
+ # The register an (HL) or (IX+d) operand sits beside: H and L are
66
+ # always themselves.
67
+ def plain_register(index)
68
+ case index
69
+ when 4 then @h
70
+ when 5 then @l
71
+ else register(index)
72
+ end
73
+ end
74
+
75
+ def set_plain_register(index, value)
76
+ case index
77
+ when 4 then @h = value
78
+ when 5 then @l = value
79
+ else set_register(index, value)
80
+ end
81
+ end
82
+
83
+ def pair(index)
84
+ case index
85
+ when 0 then bc
86
+ when 1 then de
87
+ when 2 then hl_or_index
88
+ else @sp
89
+ end
90
+ end
91
+
92
+ def set_pair(index, value)
93
+ case index
94
+ when 0 then self.bc = value
95
+ when 1 then self.de = value
96
+ when 2 then self.hl_or_index = value
97
+ else @sp = value
98
+ end
99
+ end
100
+
101
+ # The pairs PUSH and POP name, with AF in place of SP.
102
+ def stack_pair(index) = index == 3 ? af : pair(index)
103
+
104
+ def set_stack_pair(index, value)
105
+ index == 3 ? self.af = value : set_pair(index, value)
106
+ end
107
+
108
+ def hl_or_index = @prefix.zero? ? hl : index_register
109
+
110
+ def hl_or_index=(value)
111
+ @prefix.zero? ? self.hl = value : self.index_register = value
112
+ end
113
+
114
+ def index_register = @prefix == 1 ? @ix : @iy
115
+
116
+ def index_register=(value)
117
+ @prefix == 1 ? @ix = value : @iy = value
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Badline
4
+ module Chips
5
+ class Z80
6
+ # The registers, the T-state count and the interrupt latches for a
7
+ # snapshot, taken between instructions.
8
+ module SavedState
9
+ def save_state(out)
10
+ out.marker("Z80")
11
+ out.int(@a).int(@f).int(@b).int(@c).int(@d).int(@e).int(@h).int(@l)
12
+ out.int(@af_alt).int(@bc_alt).int(@de_alt).int(@hl_alt)
13
+ out.int(@i).int(@r).int(@pc).int(@sp).int(@ix).int(@iy).int(@wz).int(@q).int(@last_q).int(@im)
14
+ out.int(@cycles)
15
+ out.boolean(@iff1).boolean(@iff2).boolean(@halted).boolean(@after_ei).boolean(@after_ld_a_ir)
16
+ out.boolean(@int).boolean(@nmi).boolean(@nmi_pending)
17
+ end
18
+
19
+ def load_state(input)
20
+ input.marker("Z80")
21
+ load_main_registers(input)
22
+ @af_alt = input.int
23
+ @bc_alt = input.int
24
+ @de_alt = input.int
25
+ @hl_alt = input.int
26
+ load_special_registers(input)
27
+ @cycles = input.int
28
+ load_latches(input)
29
+ @prefix = 0
30
+ end
31
+
32
+ private
33
+
34
+ def load_main_registers(input)
35
+ @a = input.int
36
+ @f = input.int
37
+ @b = input.int
38
+ @c = input.int
39
+ @d = input.int
40
+ @e = input.int
41
+ @h = input.int
42
+ @l = input.int
43
+ end
44
+
45
+ def load_special_registers(input)
46
+ @i = input.int
47
+ @r = input.int
48
+ @pc = input.int
49
+ @sp = input.int
50
+ @ix = input.int
51
+ @iy = input.int
52
+ @wz = input.int
53
+ @q = input.int
54
+ @last_q = input.int
55
+ @im = input.int
56
+ end
57
+
58
+ def load_latches(input)
59
+ @iff1 = input.boolean?
60
+ @iff2 = input.boolean?
61
+ @halted = input.boolean?
62
+ @after_ei = input.boolean?
63
+ @after_ld_a_ir = input.boolean?
64
+ @int = input.boolean?
65
+ @nmi = input.boolean?
66
+ @nmi_pending = input.boolean?
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Badline
4
+ module Chips
5
+ class Z80
6
+ # Rotates, shifts and the bit operations.
7
+ module Shifts
8
+ private
9
+
10
+ # RLCA RRCA RLA RRA, which leave S, Z and P/V alone.
11
+ def rotate_a(operation)
12
+ carry = operation.even? ? @a >> 7 : @a & 1
13
+ @a = shifted(operation, @a, carry)
14
+ assign_flags((@f & (SF | ZF | PF)) | (@a & XYF) | carry)
15
+ end
16
+
17
+ # The CB page's rotates and shifts by bits 5-3: RLC RRC RL RR SLA SRA
18
+ # SLL SRL. SLL shifts a 1 in.
19
+ def shift(operation, value)
20
+ carry = operation.even? ? value >> 7 : value & 1
21
+ result = shifted(operation, value, carry)
22
+ assign_flags(SZ53P[result] | carry)
23
+ result
24
+ end
25
+
26
+ def shifted(operation, value, carry)
27
+ case operation
28
+ when 0 then ((value << 1) | carry) & 0xff
29
+ when 1 then (value >> 1) | (carry << 7)
30
+ when 2 then ((value << 1) | (@f & CF)) & 0xff
31
+ when 3 then (value >> 1) | ((@f & CF) << 7)
32
+ when 4 then (value << 1) & 0xff
33
+ when 5 then (value >> 1) | (value & 0x80)
34
+ when 6 then ((value << 1) | 1) & 0xff
35
+ else value >> 1
36
+ end
37
+ end
38
+
39
+ # BIT n tests a bit of +value+ and copies bits 5 and 3 from +source+:
40
+ # the operand for a register, WZ's high byte for a memory operand.
41
+ def bit(number, value, source)
42
+ tested = value & (1 << number)
43
+ flags = (@f & CF) | HF | (source & XYF) | (tested & SF)
44
+ flags |= ZF | PF if tested.zero?
45
+ assign_flags(flags)
46
+ end
47
+
48
+ # RRD and RLD rotate a digit through A and (HL).
49
+ def rotate_digits(left)
50
+ address = hl
51
+ value = read_byte(address)
52
+ @cycles += 4
53
+ if left
54
+ write_byte(address, ((value << 4) | (@a & 0x0f)) & 0xff)
55
+ @a = (@a & 0xf0) | (value >> 4)
56
+ else
57
+ write_byte(address, ((@a << 4) | (value >> 4)) & 0xff)
58
+ @a = (@a & 0xf0) | (value & 0x0f)
59
+ end
60
+ @wz = (address + 1) & 0xffff
61
+ assign_flags((@f & CF) | SZ53P[@a])
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "badline/chips/z80/core"
4
+
5
+ module Badline
6
+ module Chips
7
+ # The Zilog Z80 (NMOS), which the C128 has beside its 8502. It is not
8
+ # part of badline/core, so a machine that has one requires it.
9
+ class Z80
10
+ include Core
11
+ end
12
+ end
13
+ end
data/lib/badline/core.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # The emulator core: the machine, its chips, media and traps, and the
4
- # snapshot state Computer saves and restores with, without the options,
4
+ # snapshot state C64 saves and restores with, without the options,
5
5
  # the rest of the snapshot code, audio or front end. lib/badline.rb and
6
6
  # the Spinel harnesses in spinel/ load it, so a file the core needs is
7
7
  # added here.
@@ -12,42 +12,40 @@ require "badline/timing"
12
12
  require "badline/model"
13
13
  require "badline/addressable"
14
14
  require "badline/memory"
15
- require "badline/color_memory"
15
+ require "badline/c64/color_memory"
16
16
  require "badline/rom"
17
- require "badline/ram_expansion"
18
- require "badline/address_bus"
19
- require "badline/instruction"
20
- require "badline/instruction_set"
17
+ require "badline/c64/banked_ram"
18
+ require "badline/chips/cpu/port"
19
+ require "badline/c64/bus"
20
+ require "badline/chips/cpu/instruction"
21
+ require "badline/chips/cpu/instruction_set"
21
22
  require "badline/status"
22
- require "badline/keyboard"
23
- require "badline/joystick"
24
- require "badline/control_ports"
25
23
  require "badline/input"
26
- require "badline/cycleable"
27
- require "badline/datasette"
28
- require "badline/time_of_day"
29
- require "badline/cia"
30
- require "badline/via"
31
- require "badline/sid"
24
+ require "badline/drives/datasette"
25
+ require "badline/chips/cia/time_of_day"
26
+ require "badline/chips/cia"
27
+ require "badline/chips/via"
28
+ require "badline/chips/sid"
32
29
  require "badline/debug_register"
33
- require "badline/reu"
34
- require "badline/interrupts"
35
- require "badline/traps"
36
- require "badline/cpu"
37
- require "badline/vic"
30
+ require "badline/c64/reu"
31
+ require "badline/chips/cpu/interrupts"
32
+ require "badline/chips/cpu/traps"
33
+ require "badline/chips/cpu"
34
+ require "badline/chips/vic"
38
35
  require "badline/keyboard_buffer"
39
- require "badline/iec_bus"
40
- require "badline/drive1541"
41
- require "badline/drive1581"
42
- require "badline/drive1581/slot"
36
+ require "badline/drives/serial_bus"
37
+ require "badline/drives/model1541"
38
+ require "badline/drives/model1581"
39
+ require "badline/drives/model1581/slot"
43
40
  require "badline/snapshot/state"
44
- require "badline/snapshot/setup"
45
- require "badline/computer"
41
+ require "badline/snapshot/c64_setup"
42
+ require "badline/snapshot/storage_setup"
43
+ require "badline/machine"
44
+ require "badline/c64"
46
45
  require "badline/vic20"
47
- require "badline/checkpoint"
48
46
  require "badline/storage"
49
- require "badline/cartridge"
47
+ require "badline/sid_tune"
48
+ require "badline/c64/cartridge"
50
49
  require "badline/kernal_trap"
51
50
  require "badline/chrout_trap"
52
51
  require "badline/media"
53
- require "badline/machine"
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Badline
4
+ module Drives
5
+ class Datasette
6
+ # The datasette's state for a snapshot.
7
+ module SavedState
8
+ # The keys, the motor, the countdown to the next pulse and the tape:
9
+ # its path, its bytes and how far it has played.
10
+ def save_state(out)
11
+ out.marker("DATASETTE")
12
+ out.boolean(@playing).boolean(@motor).int(@countdown).boolean(!@tape.nil?)
13
+ return unless @tape
14
+
15
+ out.string(@tape.path).blob(@tape.bytes).int(@tape.position)
16
+ end
17
+
18
+ # The tape goes back in from the bytes the state holds, without its
19
+ # host file, unless the tape in is the same one. The sense and flag
20
+ # handlers don't fire.
21
+ def load_state(input)
22
+ input.marker("DATASETTE")
23
+ @playing = input.boolean?
24
+ @motor = input.boolean?
25
+ @countdown = input.int
26
+ return @tape = nil unless input.boolean?
27
+
28
+ path = input.string
29
+ bytes = input.blob
30
+ position = input.int
31
+ @tape = Storage::TAP.new(path, bytes:) unless @tape&.path&.b == path && @tape.bytes == bytes
32
+ @tape.position = position
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end