badline 0.13.0 → 0.15.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 (286) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +72 -1
  3. data/CLAUDE.md +42 -12
  4. data/CONTRIBUTING.md +4 -3
  5. data/README.md +76 -13
  6. data/doc/media.md +2 -1
  7. data/doc/pinned-behaviour.md +174 -0
  8. data/doc/snapshot-format.md +1197 -0
  9. data/doc/snapshots.md +90 -40
  10. data/lib/badline/audio/bare_player.rb +46 -17
  11. data/lib/badline/audio/machine_player.rb +6 -10
  12. data/lib/badline/audio/renderer.rb +32 -21
  13. data/lib/badline/c128/banks.rb +7 -6
  14. data/lib/badline/c128/bus/keyed_state.rb +45 -0
  15. data/lib/badline/c128/bus.rb +36 -4
  16. data/lib/badline/c128/drives.rb +6 -25
  17. data/lib/badline/c128/keyed_modules.rb +117 -0
  18. data/lib/badline/c128/keyed_state.rb +91 -0
  19. data/lib/badline/c128/keys.rb +9 -0
  20. data/lib/badline/c128/mmu.rb +9 -8
  21. data/lib/badline/c128/mmu_pages.rb +27 -0
  22. data/lib/badline/c128/modes.rb +19 -9
  23. data/lib/badline/c128/z80_turns.rb +1 -1
  24. data/lib/badline/c128.rb +8 -8
  25. data/lib/badline/c64/attachments.rb +0 -44
  26. data/lib/badline/c64/banked_ram/plus256k.rb +18 -10
  27. data/lib/badline/c64/banked_ram/plus60k.rb +8 -6
  28. data/lib/badline/c64/banked_ram/unexpanded.rb +2 -2
  29. data/lib/badline/c64/bus/debug_register.rb +32 -0
  30. data/lib/badline/c64/bus/extra_sids.rb +80 -0
  31. data/lib/badline/c64/bus/keyed_state.rb +41 -0
  32. data/lib/badline/c64/bus.rb +3 -1
  33. data/lib/badline/c64/cartridge/action_replay.rb +6 -15
  34. data/lib/badline/c64/cartridge/comal80.rb +1 -0
  35. data/lib/badline/c64/cartridge/dinamic.rb +3 -1
  36. data/lib/badline/c64/cartridge/easy_flash.rb +0 -15
  37. data/lib/badline/c64/cartridge/epyx_fastload.rb +0 -8
  38. data/lib/badline/c64/cartridge/final_cartridge3.rb +1 -12
  39. data/lib/badline/c64/cartridge/flash.rb +3 -3
  40. data/lib/badline/c64/cartridge/fun_play.rb +2 -1
  41. data/lib/badline/c64/cartridge/g_mod2.rb +0 -12
  42. data/lib/badline/c64/cartridge/game_system.rb +2 -1
  43. data/lib/badline/c64/cartridge/geo_ram.rb +0 -16
  44. data/lib/badline/c64/cartridge/kcs_power.rb +0 -8
  45. data/lib/badline/c64/cartridge/keyed_state.rb +514 -0
  46. data/lib/badline/c64/cartridge/magic_desk.rb +2 -1
  47. data/lib/badline/c64/cartridge/ocean.rb +1 -0
  48. data/lib/badline/c64/cartridge/pagefox.rb +1 -10
  49. data/lib/badline/c64/cartridge/retro_replay.rb +0 -8
  50. data/lib/badline/c64/cartridge/rgcd.rb +2 -11
  51. data/lib/badline/c64/cartridge/super_games.rb +3 -12
  52. data/lib/badline/c64/cartridge/zaxxon.rb +1 -16
  53. data/lib/badline/c64/cartridge.rb +4 -30
  54. data/lib/badline/c64/kernal_traps.rb +28 -25
  55. data/lib/badline/c64/keyed_modules.rb +115 -0
  56. data/lib/badline/c64/keyed_state.rb +68 -0
  57. data/lib/badline/c64/reu/dma.rb +0 -4
  58. data/lib/badline/c64/reu/keyed_state.rb +140 -0
  59. data/lib/badline/c64/reu/ram.rb +0 -15
  60. data/lib/badline/c64/reu.rb +1 -3
  61. data/lib/badline/c64/true_drives.rb +56 -5
  62. data/lib/badline/c64.rb +7 -3
  63. data/lib/badline/chips/cia/interrupt_register.rb +0 -17
  64. data/lib/badline/chips/cia/keyed_parts.rb +213 -0
  65. data/lib/badline/chips/cia/serial.rb +0 -4
  66. data/lib/badline/chips/cia/time_of_day.rb +0 -22
  67. data/lib/badline/chips/cia/timer.rb +0 -20
  68. data/lib/badline/chips/cia.rb +2 -2
  69. data/lib/badline/chips/cpu/core.rb +18 -2
  70. data/lib/badline/chips/cpu/keyed_state.rb +177 -0
  71. data/lib/badline/chips/cpu/microcode.rb +16 -0
  72. data/lib/badline/chips/cpu/port.rb +20 -3
  73. data/lib/badline/chips/cpu.rb +5 -0
  74. data/lib/badline/chips/sid/decimator.rb +10 -8
  75. data/lib/badline/chips/sid/envelope.rb +1 -6
  76. data/lib/badline/chips/sid/filter.rb +0 -14
  77. data/lib/badline/chips/sid/keyed_parts.rb +286 -0
  78. data/lib/badline/chips/sid/voice.rb +0 -10
  79. data/lib/badline/chips/sid/waveform.rb +0 -2
  80. data/lib/badline/chips/sid.rb +1 -2
  81. data/lib/badline/chips/ted/beam.rb +118 -0
  82. data/lib/badline/chips/ted/fetches.rb +199 -0
  83. data/lib/badline/chips/ted/keyed_state.rb +156 -0
  84. data/lib/badline/chips/ted/modes.rb +134 -0
  85. data/lib/badline/chips/ted/palette.rb +43 -0
  86. data/lib/badline/chips/ted/picture.rb +182 -0
  87. data/lib/badline/chips/ted/sound/output.rb +86 -0
  88. data/lib/badline/chips/ted/sound.rb +284 -0
  89. data/lib/badline/chips/ted/timers.rb +66 -0
  90. data/lib/badline/chips/ted.rb +190 -0
  91. data/lib/badline/chips/tia.rb +61 -0
  92. data/lib/badline/chips/vdc/keyed_parts.rb +105 -0
  93. data/lib/badline/chips/vdc/painter.rb +0 -12
  94. data/lib/badline/chips/vdc/raster.rb +0 -16
  95. data/lib/badline/chips/vdc/window.rb +0 -9
  96. data/lib/badline/chips/vdc.rb +1 -2
  97. data/lib/badline/chips/via/control_lines.rb +0 -15
  98. data/lib/badline/chips/via/interrupt_register.rb +0 -9
  99. data/lib/badline/chips/via/keyed_parts.rb +163 -0
  100. data/lib/badline/chips/via/shift_register.rb +0 -14
  101. data/lib/badline/chips/via/timer1.rb +0 -13
  102. data/lib/badline/chips/via/timer2.rb +0 -18
  103. data/lib/badline/chips/via.rb +1 -2
  104. data/lib/badline/chips/vic/border_mask.rb +0 -10
  105. data/lib/badline/chips/vic/collisions.rb +0 -11
  106. data/lib/badline/chips/vic/color_patches.rb +0 -11
  107. data/lib/badline/chips/vic/display_state.rb +0 -19
  108. data/lib/badline/chips/vic/graphics_shifter.rb +0 -4
  109. data/lib/badline/chips/vic/keyed_parts.rb +228 -0
  110. data/lib/badline/chips/vic/keyed_sprites.rb +225 -0
  111. data/lib/badline/chips/vic/keyed_state.rb +102 -0
  112. data/lib/badline/chips/vic/register_log.rb +0 -18
  113. data/lib/badline/chips/vic/registers.rb +0 -9
  114. data/lib/badline/chips/vic/sequencer.rb +0 -2
  115. data/lib/badline/chips/vic/sprite/internal_bus.rb +0 -11
  116. data/lib/badline/chips/vic/sprite.rb +0 -2
  117. data/lib/badline/chips/vic/sprites.rb +0 -3
  118. data/lib/badline/chips/vic.rb +6 -2
  119. data/lib/badline/chips/vic_i/keyed_parts.rb +142 -0
  120. data/lib/badline/chips/vic_i/painter.rb +0 -4
  121. data/lib/badline/chips/vic_i/sound.rb +38 -46
  122. data/lib/badline/chips/vic_i.rb +2 -2
  123. data/lib/badline/chips/z80/core.rb +2 -2
  124. data/lib/badline/chips/z80/keyed_state.rb +73 -0
  125. data/lib/badline/chips.rb +10 -0
  126. data/lib/badline/core.rb +4 -21
  127. data/lib/badline/drives/datasette/keyed_state.rb +43 -0
  128. data/lib/badline/drives/datasette.rb +62 -12
  129. data/lib/badline/drives/engine/core.rb +3 -0
  130. data/lib/badline/drives/engine/serial_lines.rb +4 -7
  131. data/lib/badline/drives/model1541/bus.rb +0 -13
  132. data/lib/badline/drives/model1541/disk.rb +9 -8
  133. data/lib/badline/drives/model1541/keyed_state.rb +251 -0
  134. data/lib/badline/drives/model1541/mechanism.rb +0 -2
  135. data/lib/badline/drives/model1541.rb +1 -2
  136. data/lib/badline/drives/model1571/bus.rb +0 -13
  137. data/lib/badline/drives/model1571/keyed_state.rb +108 -0
  138. data/lib/badline/drives/model1571/wd1770.rb +0 -14
  139. data/lib/badline/drives/model1571.rb +1 -2
  140. data/lib/badline/drives/model1581/bus.rb +0 -13
  141. data/lib/badline/drives/model1581/disk.rb +0 -4
  142. data/lib/badline/drives/model1581/keyed_state.rb +280 -0
  143. data/lib/badline/drives/model1581/mechanism.rb +0 -21
  144. data/lib/badline/drives/model1581/slot.rb +0 -18
  145. data/lib/badline/drives/model1581/wd1772.rb +0 -2
  146. data/lib/badline/drives/model1581.rb +2 -2
  147. data/lib/badline/drives.rb +8 -0
  148. data/lib/badline/frontend/app.rb +3 -3
  149. data/lib/badline/frontend/boot.rb +4 -2
  150. data/lib/badline/frontend/controls.rb +25 -5
  151. data/lib/badline/frontend/drive_led.rb +44 -21
  152. data/lib/badline/frontend/keys.rb +14 -2
  153. data/lib/badline/frontend/media_slots.rb +11 -1
  154. data/lib/badline/frontend/menu/menu_dialogs.rb +4 -3
  155. data/lib/badline/frontend/menu/menu_media.rb +13 -3
  156. data/lib/badline/frontend/menu/menu_pages.rb +8 -8
  157. data/lib/badline/frontend/menu/menu_ports.rb +13 -1
  158. data/lib/badline/frontend/screen.rb +33 -12
  159. data/lib/badline/frontend/screens.rb +2 -1
  160. data/lib/badline/frontend/snapshots.rb +12 -1
  161. data/lib/badline/frontend/sound.rb +4 -4
  162. data/lib/badline/frontend/timeline.rb +43 -12
  163. data/lib/badline/input/matrix_typist.rb +98 -0
  164. data/lib/badline/input.rb +1 -0
  165. data/lib/badline/kernal_trap/chrout.rb +45 -0
  166. data/lib/badline/kernal_trap/dos/channel.rb +0 -27
  167. data/lib/badline/kernal_trap/dos/channels.rb +0 -25
  168. data/lib/badline/kernal_trap/dos/memory.rb +0 -9
  169. data/lib/badline/kernal_trap/dos/status.rb +0 -8
  170. data/lib/badline/kernal_trap/dos/write_file.rb +0 -18
  171. data/lib/badline/kernal_trap/dos.rb +0 -19
  172. data/lib/badline/kernal_trap/file_routine.rb +4 -4
  173. data/lib/badline/kernal_trap/keyed_state.rb +150 -0
  174. data/lib/badline/kernal_trap/layout.rb +75 -11
  175. data/lib/badline/kernal_trap/load.rb +14 -16
  176. data/lib/badline/kernal_trap/routine.rb +12 -0
  177. data/lib/badline/kernal_trap/save.rb +8 -18
  178. data/lib/badline/kernal_trap/serial.rb +1 -17
  179. data/lib/badline/kernal_trap.rb +2 -0
  180. data/lib/badline/machine/keyboard_buffer.rb +49 -0
  181. data/lib/badline/machine/settling.rb +29 -0
  182. data/lib/badline/machine.rb +29 -6
  183. data/lib/badline/media/boot_disk.rb +14 -2
  184. data/lib/badline/media/extensions.rb +10 -0
  185. data/lib/badline/media/plus4_media.rb +68 -0
  186. data/lib/badline/media/program.rb +20 -6
  187. data/lib/badline/media.rb +33 -12
  188. data/lib/badline/memory.rb +3 -6
  189. data/lib/badline/options/family.rb +6 -2
  190. data/lib/badline/options/help.rb +66 -16
  191. data/lib/badline/options/table.rb +17 -2
  192. data/lib/badline/options/validation.rb +26 -2
  193. data/lib/badline/options.rb +42 -9
  194. data/lib/badline/plus4/acia.rb +45 -0
  195. data/lib/badline/plus4/bus.rb +375 -0
  196. data/lib/badline/plus4/cassette_sense.rb +21 -0
  197. data/lib/badline/plus4/cpu.rb +10 -0
  198. data/lib/badline/plus4/cpu_port.rb +93 -0
  199. data/lib/badline/plus4/keyboard_port.rb +76 -0
  200. data/lib/badline/plus4/keyed_modules.rb +99 -0
  201. data/lib/badline/plus4/keyed_parts.rb +143 -0
  202. data/lib/badline/plus4/keyed_state.rb +41 -0
  203. data/lib/badline/plus4/model.rb +38 -0
  204. data/lib/badline/plus4/user_port.rb +31 -0
  205. data/lib/badline/plus4.rb +240 -0
  206. data/lib/badline/roms/README +38 -0
  207. data/lib/badline/roms/plus4/basic.rom +0 -0
  208. data/lib/badline/roms/plus4/function-high.rom +0 -0
  209. data/lib/badline/roms/plus4/function-low.rom +0 -0
  210. data/lib/badline/roms/plus4/kernal-ntsc.rom +0 -0
  211. data/lib/badline/roms/plus4/kernal-pal.rom +0 -0
  212. data/lib/badline/snapshot/c128_setup.rb +9 -20
  213. data/lib/badline/snapshot/c64_setup.rb +28 -24
  214. data/lib/badline/snapshot/container.rb +6 -0
  215. data/lib/badline/snapshot/field_doc/markdown.rb +113 -0
  216. data/lib/badline/snapshot/field_doc.rb +148 -0
  217. data/lib/badline/snapshot/image.rb +143 -28
  218. data/lib/badline/snapshot/keyed/cursor.rb +40 -0
  219. data/lib/badline/snapshot/keyed/modules.rb +66 -0
  220. data/lib/badline/snapshot/keyed/reader.rb +188 -0
  221. data/lib/badline/snapshot/keyed/recorder.rb +88 -0
  222. data/lib/badline/snapshot/keyed/report.rb +26 -0
  223. data/lib/badline/snapshot/keyed/writer.rb +55 -0
  224. data/lib/badline/snapshot/keyed.rb +64 -0
  225. data/lib/badline/snapshot/machine_state.rb +17 -64
  226. data/lib/badline/snapshot/plus4_setup.rb +39 -0
  227. data/lib/badline/snapshot/storage_setup.rb +29 -34
  228. data/lib/badline/snapshot/vic20_setup.rb +6 -15
  229. data/lib/badline/snapshot/vice/reu1764.rb +2 -2
  230. data/lib/badline/snapshot/vice.rb +7 -31
  231. data/lib/badline/snapshot.rb +48 -20
  232. data/lib/badline/storage/crt_file.rb +3 -1
  233. data/lib/badline/storage/g64_image.rb +9 -4
  234. data/lib/badline/storage/tap.rb +57 -20
  235. data/lib/badline/support/checkpoint.rb +3 -2
  236. data/lib/badline/support/plus4_checkpoint.rb +42 -0
  237. data/lib/badline/version.rb +1 -1
  238. data/lib/badline/vic20/attachments.rb +3 -0
  239. data/lib/badline/vic20/bus/keyed_state.rb +52 -0
  240. data/lib/badline/vic20/bus.rb +1 -2
  241. data/lib/badline/vic20/keyed_modules.rb +73 -0
  242. data/lib/badline/vic20/keyed_state.rb +45 -0
  243. data/lib/badline/vic20.rb +5 -5
  244. data/lib/badline.rb +1 -0
  245. metadata +75 -42
  246. data/lib/badline/c128/bus/saved_state.rb +0 -53
  247. data/lib/badline/c128/saved_state.rb +0 -117
  248. data/lib/badline/c64/bus/saved_state.rb +0 -68
  249. data/lib/badline/c64/cartridge/flash/saved_state.rb +0 -40
  250. data/lib/badline/c64/cartridge/retro_replay/saved_state.rb +0 -47
  251. data/lib/badline/c64/cartridge/saved_state.rb +0 -63
  252. data/lib/badline/c64/reu/dma/saved_state.rb +0 -52
  253. data/lib/badline/c64/reu/saved_state.rb +0 -55
  254. data/lib/badline/c64/saved_state.rb +0 -112
  255. data/lib/badline/chips/cia/saved_state.rb +0 -49
  256. data/lib/badline/chips/cia/serial/saved_state.rb +0 -45
  257. data/lib/badline/chips/cpu/saved_state.rb +0 -117
  258. data/lib/badline/chips/sid/envelope/saved_state.rb +0 -70
  259. data/lib/badline/chips/sid/filter/saved_state.rb +0 -42
  260. data/lib/badline/chips/sid/saved_state.rb +0 -52
  261. data/lib/badline/chips/sid/waveform/saved_state.rb +0 -68
  262. data/lib/badline/chips/vdc/saved_state.rb +0 -36
  263. data/lib/badline/chips/via/saved_state.rb +0 -44
  264. data/lib/badline/chips/vic/graphics_shifter/saved_state.rb +0 -40
  265. data/lib/badline/chips/vic/saved_state.rb +0 -82
  266. data/lib/badline/chips/vic/sequencer/saved_state.rb +0 -91
  267. data/lib/badline/chips/vic/sprite/saved_state.rb +0 -66
  268. data/lib/badline/chips/vic/sprites/saved_state.rb +0 -59
  269. data/lib/badline/chips/vic_i/painter/saved_state.rb +0 -40
  270. data/lib/badline/chips/vic_i/saved_state.rb +0 -55
  271. data/lib/badline/chips/z80/saved_state.rb +0 -71
  272. data/lib/badline/chrout_trap.rb +0 -43
  273. data/lib/badline/debug_register.rb +0 -28
  274. data/lib/badline/drives/datasette/saved_state.rb +0 -37
  275. data/lib/badline/drives/model1541/disk/saved_state.rb +0 -88
  276. data/lib/badline/drives/model1541/mechanism/saved_state.rb +0 -72
  277. data/lib/badline/drives/model1541/saved_state.rb +0 -44
  278. data/lib/badline/drives/model1571/saved_state.rb +0 -47
  279. data/lib/badline/drives/model1581/disk/saved_state.rb +0 -89
  280. data/lib/badline/drives/model1581/saved_state.rb +0 -42
  281. data/lib/badline/drives/model1581/wd1772/saved_state.rb +0 -68
  282. data/lib/badline/keyboard_buffer.rb +0 -33
  283. data/lib/badline/snapshot/setup.rb +0 -31
  284. data/lib/badline/snapshot/state.rb +0 -179
  285. data/lib/badline/vic20/bus/saved_state.rb +0 -35
  286. data/lib/badline/vic20/saved_state.rb +0 -110
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Badline
4
+ class Vic20
5
+ # The whole machine as keyed snapshot modules (Snapshot::Keyed), in the
6
+ # order a load applies them, as C64::KeyedModules: BL-MACHINE with the
7
+ # RAM expansion and the bytes each side's data lines hold under bus.*,
8
+ # the memories, a cartridge's ROM chips, the VIC with its sound, both
9
+ # VIAs, the CPU, the datasette, device 8 through the traps and the true
10
+ # drives.
11
+ module KeyedModules
12
+ def save_modules
13
+ bus = @bus
14
+ sections = [Snapshot::Keyed.section("BL-MACHINE") do |out|
15
+ save_machine_fields(out)
16
+ bus.save_fields(out, "bus.")
17
+ end]
18
+ sections << Snapshot::Keyed.section("BL-RAM") { |out| bus.ram.save_fields(out, "ram") }
19
+ sections << Snapshot::Keyed.section("BL-COLORRAM") { |out| bus.color_ram.save_fields(out, "ram") }
20
+ sections << Snapshot::Keyed.section("BL-CART") { |out| bus.save_rom_fields(out) } if bus.cartridge?
21
+ sections << Snapshot::Keyed.section("BL-CPU") { |out| @cpu.save_fields(out) }
22
+ sections << Snapshot::Keyed.section("BL-VICI") { |out| @vic.save_fields(out) }
23
+ sections << Snapshot::Keyed.section("BL-VIA1") { |out| @via1.save_fields(out) }
24
+ sections << Snapshot::Keyed.section("BL-VIA2") { |out| @via2.save_fields(out) }
25
+ sections << Snapshot::Keyed.section("BL-TAPE") { |out| @datasette.save_fields(out) }
26
+ sections << Snapshot::Keyed.section("BL-TRAPDOS") { |out| save_trap_dos_fields(out) } if mounted?
27
+ save_drive_modules(sections)
28
+ end
29
+
30
+ # Raises Snapshot::FormatError for the modules of a VIC-20 with
31
+ # another RAM expansion.
32
+ def load_modules(modules)
33
+ machine = modules.machine
34
+ check_snapshot_setup(Snapshot::Vic20Setup.read_fields(machine))
35
+ load_machine_fields(machine)
36
+ bus = @bus
37
+ bus.load_fields(machine, "bus.")
38
+ bus.ram.load_fields(modules.required("BL-RAM"), "ram")
39
+ bus.color_ram.load_fields(modules.required("BL-COLORRAM"), "ram")
40
+ bus.load_rom_fields(modules.optional("BL-CART") || Snapshot::Keyed::Reader.new("BL-CART"))
41
+ bus.restored!
42
+ @vic.load_fields(modules.required("BL-VICI"))
43
+ @via1.load_fields(modules.required("BL-VIA1"))
44
+ @via2.load_fields(modules.required("BL-VIA2"))
45
+ @cpu.load_fields(modules.required("BL-CPU"))
46
+ @datasette.load_fields(modules.required("BL-TAPE"))
47
+ trap_dos = modules.optional("BL-TRAPDOS")
48
+ trap_dos ? load_trap_dos_fields(trap_dos, detached: modules.detached?) : unmount
49
+ load_drive_modules(modules)
50
+ modules_restored!
51
+ self
52
+ end
53
+
54
+ private
55
+
56
+ def modules_restored!
57
+ @cpu.restored!
58
+ @vic.restored!
59
+ @via1.restored!
60
+ @via2.restored!
61
+ machine_restored!
62
+ end
63
+
64
+ def check_snapshot_setup(setup)
65
+ return if setup.ram == @ram_configuration
66
+
67
+ raise Snapshot::FormatError, "the snapshot is of a VIC-20 with #{setup.ram} RAM, not #{@ram_configuration}"
68
+ end
69
+ end
70
+
71
+ include KeyedModules
72
+ end
73
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Badline
4
+ class Vic20
5
+ # The machine's own fields in a keyed snapshot module (Snapshot::Keyed,
6
+ # BL-MACHINE): the family, its RAM expansion by name, the cycle count,
7
+ # the RESTORE key's NMI, and the host's typing still to feed and on_init
8
+ # handlers still to run under host.*.
9
+ module KeyedState
10
+ # How many more on_init handlers the machine a snapshot was taken of had
11
+ # yet to run than this one has. Nil until the machine is restored.
12
+ attr_reader :init_handlers_lost
13
+
14
+ # Whether a snapshot saves now (Machine::Settling): the CPU between
15
+ # instructions or jammed.
16
+ def settled_for_snapshot? = @cpu.boundary? || @cpu.jammed?
17
+
18
+ # The sound's voices, run up to this cycle.
19
+ def settle_chips_for_snapshot = @sound.catch_up!
20
+
21
+ def save_machine_fields(out)
22
+ out.text("family", "vic20").text("written_by", VERSION)
23
+ Snapshot::Vic20Setup.new(ram: @ram_configuration).write_fields(out)
24
+ out.int("cycles", @cycles).bool("nmi_asserted", @nmi_asserted)
25
+ pending = @pending_keys
26
+ out.ints("host.pending_keys", pending) if pending
27
+ out.int("host.init_pending", @cycles <= @init_threshold ? @init_handlers.length : 0)
28
+ end
29
+
30
+ def load_machine_fields(input)
31
+ @cycles = input.int("cycles", @cycles)
32
+ @nmi_asserted = input.bool("nmi_asserted", @nmi_asserted)
33
+ pending = input.ints("host.pending_keys", [])
34
+ @pending_keys = pending.empty? ? nil : pending.dup
35
+ @init_handlers_lost = [input.int("host.init_pending", 0) - @init_handlers.length, 0].max
36
+ end
37
+
38
+ # The serial bus's lines and the datasette's motor and write line from
39
+ # the VIAs, once they are loaded.
40
+ def machine_restored! = via_written
41
+ end
42
+
43
+ include KeyedState
44
+ end
45
+ end
data/lib/badline/vic20.rb CHANGED
@@ -6,9 +6,9 @@ require "badline/vic20/cpu"
6
6
  require "badline/vic20/keyboard_via_ports"
7
7
  require "badline/vic20/port_wiring"
8
8
  require "badline/vic20/user_via_ports"
9
- require "badline/chips/vic_i"
10
- require "badline/chips/vic_i/sound"
11
- require "badline/vic20/saved_state"
9
+ require "badline/snapshot/vic20_setup"
10
+ require "badline/vic20/keyed_state"
11
+ require "badline/vic20/keyed_modules"
12
12
 
13
13
  module Badline
14
14
  # The Commodore VIC-20 with the PAL 6561: a 6502 at the VIC's clock, the
@@ -22,11 +22,11 @@ module Badline
22
22
  # serves disks through the KERNAL traps or a true 1541.
23
23
  class Vic20
24
24
  include IntegerHelper
25
- include KeyboardBuffer
25
+ include Machine::KeyboardBuffer
26
26
  include Machine::Clocking
27
+ include Machine::Settling
27
28
  include Attachments
28
29
  include PortWiring
29
- include SavedState
30
30
 
31
31
  attr_reader :bus, :cpu, :vic, :via1, :via2, :keyboard, :joystick1, :cycles, :init_threshold, :sound,
32
32
  :drive1541, :iec_bus, :datasette
data/lib/badline.rb CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "badline/core"
4
4
  require "badline/c128"
5
+ require "badline/plus4"
5
6
  require "badline/options"
6
7
  require "badline/data_path"
7
8
  require "badline/snapshot"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: badline
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.0
4
+ version: 0.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Inge Jørgensen
@@ -45,6 +45,7 @@ files:
45
45
  - doc/media.md
46
46
  - doc/pinned-behaviour.md
47
47
  - doc/sid-player.md
48
+ - doc/snapshot-format.md
48
49
  - doc/snapshots.md
49
50
  - exe/badline-ruby
50
51
  - lib/badline.rb
@@ -68,18 +69,19 @@ files:
68
69
  - lib/badline/c128.rb
69
70
  - lib/badline/c128/banks.rb
70
71
  - lib/badline/c128/bus.rb
71
- - lib/badline/c128/bus/saved_state.rb
72
+ - lib/badline/c128/bus/keyed_state.rb
72
73
  - lib/badline/c128/color_lines.rb
73
74
  - lib/badline/c128/cpu.rb
74
75
  - lib/badline/c128/drives.rb
75
76
  - lib/badline/c128/fast_serial.rb
76
77
  - lib/badline/c128/io_pages.rb
78
+ - lib/badline/c128/keyed_modules.rb
79
+ - lib/badline/c128/keyed_state.rb
77
80
  - lib/badline/c128/keys.rb
78
81
  - lib/badline/c128/mmu.rb
79
82
  - lib/badline/c128/mmu_pages.rb
80
83
  - lib/badline/c128/model.rb
81
84
  - lib/badline/c128/modes.rb
82
- - lib/badline/c128/saved_state.rb
83
85
  - lib/badline/c128/z80.rb
84
86
  - lib/badline/c128/z80_pages.rb
85
87
  - lib/badline/c128/z80_turns.rb
@@ -91,11 +93,12 @@ files:
91
93
  - lib/badline/c64/banked_ram/plus60k.rb
92
94
  - lib/badline/c64/banked_ram/unexpanded.rb
93
95
  - lib/badline/c64/bus.rb
96
+ - lib/badline/c64/bus/debug_register.rb
94
97
  - lib/badline/c64/bus/extra_sids.rb
95
98
  - lib/badline/c64/bus/fittings.rb
99
+ - lib/badline/c64/bus/keyed_state.rb
96
100
  - lib/badline/c64/bus/pla.rb
97
101
  - lib/badline/c64/bus/roms.rb
98
- - lib/badline/c64/bus/saved_state.rb
99
102
  - lib/badline/c64/bus/sid_slots.rb
100
103
  - lib/badline/c64/cartridge.rb
101
104
  - lib/badline/c64/cartridge/action_replay.rb
@@ -107,22 +110,20 @@ files:
107
110
  - lib/badline/c64/cartridge/epyx_fastload.rb
108
111
  - lib/badline/c64/cartridge/final_cartridge3.rb
109
112
  - lib/badline/c64/cartridge/flash.rb
110
- - lib/badline/c64/cartridge/flash/saved_state.rb
111
113
  - lib/badline/c64/cartridge/freezer.rb
112
114
  - lib/badline/c64/cartridge/fun_play.rb
113
115
  - lib/badline/c64/cartridge/g_mod2.rb
114
116
  - lib/badline/c64/cartridge/game_system.rb
115
117
  - lib/badline/c64/cartridge/geo_ram.rb
116
118
  - lib/badline/c64/cartridge/kcs_power.rb
119
+ - lib/badline/c64/cartridge/keyed_state.rb
117
120
  - lib/badline/c64/cartridge/mach5.rb
118
121
  - lib/badline/c64/cartridge/magic_desk.rb
119
122
  - lib/badline/c64/cartridge/ocean.rb
120
123
  - lib/badline/c64/cartridge/pagefox.rb
121
124
  - lib/badline/c64/cartridge/retro_replay.rb
122
- - lib/badline/c64/cartridge/retro_replay/saved_state.rb
123
125
  - lib/badline/c64/cartridge/rex_utility.rb
124
126
  - lib/badline/c64/cartridge/rgcd.rb
125
- - lib/badline/c64/cartridge/saved_state.rb
126
127
  - lib/badline/c64/cartridge/simons_basic.rb
127
128
  - lib/badline/c64/cartridge/standard.rb
128
129
  - lib/badline/c64/cartridge/super_games.rb
@@ -131,20 +132,20 @@ files:
131
132
  - lib/badline/c64/color_memory.rb
132
133
  - lib/badline/c64/common.rb
133
134
  - lib/badline/c64/kernal_traps.rb
135
+ - lib/badline/c64/keyed_modules.rb
136
+ - lib/badline/c64/keyed_state.rb
134
137
  - lib/badline/c64/reu.rb
135
138
  - lib/badline/c64/reu/dma.rb
136
- - lib/badline/c64/reu/dma/saved_state.rb
139
+ - lib/badline/c64/reu/keyed_state.rb
137
140
  - lib/badline/c64/reu/ram.rb
138
- - lib/badline/c64/reu/saved_state.rb
139
141
  - lib/badline/c64/reu/trigger.rb
140
- - lib/badline/c64/saved_state.rb
141
142
  - lib/badline/c64/true_drives.rb
143
+ - lib/badline/chips.rb
142
144
  - lib/badline/chips/cia.rb
143
145
  - lib/badline/chips/cia/fast_forward.rb
144
146
  - lib/badline/chips/cia/interrupt_register.rb
145
- - lib/badline/chips/cia/saved_state.rb
147
+ - lib/badline/chips/cia/keyed_parts.rb
146
148
  - lib/badline/chips/cia/serial.rb
147
- - lib/badline/chips/cia/serial/saved_state.rb
148
149
  - lib/badline/chips/cia/time_of_day.rb
149
150
  - lib/badline/chips/cia/timer.rb
150
151
  - lib/badline/chips/cpu.rb
@@ -162,37 +163,45 @@ files:
162
163
  - lib/badline/chips/cpu/instruction_set/stack.rb
163
164
  - lib/badline/chips/cpu/instruction_set/transfer.rb
164
165
  - lib/badline/chips/cpu/interrupts.rb
166
+ - lib/badline/chips/cpu/keyed_state.rb
165
167
  - lib/badline/chips/cpu/microcode.rb
166
168
  - lib/badline/chips/cpu/operations.rb
167
169
  - lib/badline/chips/cpu/port.rb
168
- - lib/badline/chips/cpu/saved_state.rb
169
170
  - lib/badline/chips/cpu/stack_operations.rb
170
171
  - lib/badline/chips/cpu/traps.rb
171
172
  - lib/badline/chips/sid.rb
172
173
  - lib/badline/chips/sid/catch_up.rb
173
174
  - lib/badline/chips/sid/decimator.rb
174
175
  - lib/badline/chips/sid/envelope.rb
175
- - lib/badline/chips/sid/envelope/saved_state.rb
176
176
  - lib/badline/chips/sid/filter.rb
177
- - lib/badline/chips/sid/filter/saved_state.rb
178
- - lib/badline/chips/sid/saved_state.rb
177
+ - lib/badline/chips/sid/keyed_parts.rb
179
178
  - lib/badline/chips/sid/voice.rb
180
179
  - lib/badline/chips/sid/waveform.rb
181
180
  - lib/badline/chips/sid/waveform/combined.rb
182
181
  - lib/badline/chips/sid/waveform/fast_forward.rb
183
182
  - lib/badline/chips/sid/waveform/noise_writeback.rb
184
- - lib/badline/chips/sid/waveform/saved_state.rb
183
+ - lib/badline/chips/ted.rb
184
+ - lib/badline/chips/ted/beam.rb
185
+ - lib/badline/chips/ted/fetches.rb
186
+ - lib/badline/chips/ted/keyed_state.rb
187
+ - lib/badline/chips/ted/modes.rb
188
+ - lib/badline/chips/ted/palette.rb
189
+ - lib/badline/chips/ted/picture.rb
190
+ - lib/badline/chips/ted/sound.rb
191
+ - lib/badline/chips/ted/sound/output.rb
192
+ - lib/badline/chips/ted/timers.rb
193
+ - lib/badline/chips/tia.rb
185
194
  - lib/badline/chips/vdc.rb
195
+ - lib/badline/chips/vdc/keyed_parts.rb
186
196
  - lib/badline/chips/vdc/memory.rb
187
197
  - lib/badline/chips/vdc/painter.rb
188
198
  - lib/badline/chips/vdc/raster.rb
189
- - lib/badline/chips/vdc/saved_state.rb
190
199
  - lib/badline/chips/vdc/window.rb
191
200
  - lib/badline/chips/via.rb
192
201
  - lib/badline/chips/via/control_lines.rb
193
202
  - lib/badline/chips/via/fast_forward.rb
194
203
  - lib/badline/chips/via/interrupt_register.rb
195
- - lib/badline/chips/via/saved_state.rb
204
+ - lib/badline/chips/via/keyed_parts.rb
196
205
  - lib/badline/chips/via/shift_register.rb
197
206
  - lib/badline/chips/via/timer1.rb
198
207
  - lib/badline/chips/via/timer2.rb
@@ -204,24 +213,21 @@ files:
204
213
  - lib/badline/chips/vic/display_state.rb
205
214
  - lib/badline/chips/vic/graphics_mode.rb
206
215
  - lib/badline/chips/vic/graphics_shifter.rb
207
- - lib/badline/chips/vic/graphics_shifter/saved_state.rb
216
+ - lib/badline/chips/vic/keyed_parts.rb
217
+ - lib/badline/chips/vic/keyed_sprites.rb
218
+ - lib/badline/chips/vic/keyed_state.rb
208
219
  - lib/badline/chips/vic/register_log.rb
209
220
  - lib/badline/chips/vic/registers.rb
210
- - lib/badline/chips/vic/saved_state.rb
211
221
  - lib/badline/chips/vic/sequencer.rb
212
- - lib/badline/chips/vic/sequencer/saved_state.rb
213
222
  - lib/badline/chips/vic/sequencer_output.rb
214
223
  - lib/badline/chips/vic/sprite.rb
215
224
  - lib/badline/chips/vic/sprite/internal_bus.rb
216
- - lib/badline/chips/vic/sprite/saved_state.rb
217
225
  - lib/badline/chips/vic/sprite/shifter.rb
218
226
  - lib/badline/chips/vic/sprite/timing.rb
219
227
  - lib/badline/chips/vic/sprites.rb
220
- - lib/badline/chips/vic/sprites/saved_state.rb
221
228
  - lib/badline/chips/vic_i.rb
229
+ - lib/badline/chips/vic_i/keyed_parts.rb
222
230
  - lib/badline/chips/vic_i/painter.rb
223
- - lib/badline/chips/vic_i/painter/saved_state.rb
224
- - lib/badline/chips/vic_i/saved_state.rb
225
231
  - lib/badline/chips/vic_i/sound.rb
226
232
  - lib/badline/chips/vic_i/sound/output.rb
227
233
  - lib/badline/chips/vic_i/text_window.rb
@@ -237,17 +243,16 @@ files:
237
243
  - lib/badline/chips/z80/flags.rb
238
244
  - lib/badline/chips/z80/interrupt_acceptance.rb
239
245
  - lib/badline/chips/z80/jumps.rb
246
+ - lib/badline/chips/z80/keyed_state.rb
240
247
  - lib/badline/chips/z80/loads.rb
241
248
  - lib/badline/chips/z80/main_page.rb
242
249
  - lib/badline/chips/z80/registers.rb
243
- - lib/badline/chips/z80/saved_state.rb
244
250
  - lib/badline/chips/z80/shifts.rb
245
- - lib/badline/chrout_trap.rb
246
251
  - lib/badline/core.rb
247
252
  - lib/badline/data_path.rb
248
- - lib/badline/debug_register.rb
253
+ - lib/badline/drives.rb
249
254
  - lib/badline/drives/datasette.rb
250
- - lib/badline/drives/datasette/saved_state.rb
255
+ - lib/badline/drives/datasette/keyed_state.rb
251
256
  - lib/badline/drives/engine.rb
252
257
  - lib/badline/drives/engine/core.rb
253
258
  - lib/badline/drives/engine/fast_serial.rb
@@ -263,20 +268,18 @@ files:
263
268
  - lib/badline/drives/model1541/byte_ready.rb
264
269
  - lib/badline/drives/model1541/cpu.rb
265
270
  - lib/badline/drives/model1541/disk.rb
266
- - lib/badline/drives/model1541/disk/saved_state.rb
267
271
  - lib/badline/drives/model1541/disk_via.rb
268
272
  - lib/badline/drives/model1541/gcr.rb
273
+ - lib/badline/drives/model1541/keyed_state.rb
269
274
  - lib/badline/drives/model1541/mechanism.rb
270
- - lib/badline/drives/model1541/mechanism/saved_state.rb
271
275
  - lib/badline/drives/model1541/rotation.rb
272
- - lib/badline/drives/model1541/saved_state.rb
273
276
  - lib/badline/drives/model1541/sector_reader.rb
274
277
  - lib/badline/drives/model1541/serial_port.rb
275
278
  - lib/badline/drives/model1541/track.rb
276
279
  - lib/badline/drives/model1571.rb
277
280
  - lib/badline/drives/model1571/bus.rb
278
281
  - lib/badline/drives/model1571/cpu.rb
279
- - lib/badline/drives/model1571/saved_state.rb
282
+ - lib/badline/drives/model1571/keyed_state.rb
280
283
  - lib/badline/drives/model1571/serial_port.rb
281
284
  - lib/badline/drives/model1571/serial_via.rb
282
285
  - lib/badline/drives/model1571/wd1770.rb
@@ -284,16 +287,14 @@ files:
284
287
  - lib/badline/drives/model1581/bus.rb
285
288
  - lib/badline/drives/model1581/cpu.rb
286
289
  - lib/badline/drives/model1581/disk.rb
287
- - lib/badline/drives/model1581/disk/saved_state.rb
290
+ - lib/badline/drives/model1581/keyed_state.rb
288
291
  - lib/badline/drives/model1581/mechanism.rb
289
- - lib/badline/drives/model1581/saved_state.rb
290
292
  - lib/badline/drives/model1581/serial_port.rb
291
293
  - lib/badline/drives/model1581/slot.rb
292
294
  - lib/badline/drives/model1581/track.rb
293
295
  - lib/badline/drives/model1581/track_bytes.rb
294
296
  - lib/badline/drives/model1581/wd1772.rb
295
297
  - lib/badline/drives/model1581/wd1772/registers.rb
296
- - lib/badline/drives/model1581/wd1772/saved_state.rb
297
298
  - lib/badline/drives/model1581/wd1772/sector_writes.rb
298
299
  - lib/badline/drives/model1581/wd1772/sectors.rb
299
300
  - lib/badline/drives/model1581/wd1772/stepping.rb
@@ -350,10 +351,12 @@ files:
350
351
  - lib/badline/input/control_ports.rb
351
352
  - lib/badline/input/joystick.rb
352
353
  - lib/badline/input/keyboard.rb
354
+ - lib/badline/input/matrix_typist.rb
353
355
  - lib/badline/input/mouse1351.rb
354
356
  - lib/badline/input/paddles.rb
355
357
  - lib/badline/integer_helper.rb
356
358
  - lib/badline/kernal_trap.rb
359
+ - lib/badline/kernal_trap/chrout.rb
357
360
  - lib/badline/kernal_trap/dos.rb
358
361
  - lib/badline/kernal_trap/dos/block_commands.rb
359
362
  - lib/badline/kernal_trap/dos/channel.rb
@@ -364,20 +367,23 @@ files:
364
367
  - lib/badline/kernal_trap/dos/write_file.rb
365
368
  - lib/badline/kernal_trap/dos/writes.rb
366
369
  - lib/badline/kernal_trap/file_routine.rb
370
+ - lib/badline/kernal_trap/keyed_state.rb
367
371
  - lib/badline/kernal_trap/layout.rb
368
372
  - lib/badline/kernal_trap/load.rb
369
373
  - lib/badline/kernal_trap/routine.rb
370
374
  - lib/badline/kernal_trap/save.rb
371
375
  - lib/badline/kernal_trap/serial.rb
372
- - lib/badline/keyboard_buffer.rb
373
376
  - lib/badline/machine.rb
374
377
  - lib/badline/machine/clocking.rb
378
+ - lib/badline/machine/keyboard_buffer.rb
379
+ - lib/badline/machine/settling.rb
375
380
  - lib/badline/media.rb
376
381
  - lib/badline/media/boot_disk.rb
377
382
  - lib/badline/media/disk_list.rb
378
383
  - lib/badline/media/disk_set.rb
379
384
  - lib/badline/media/extensions.rb
380
385
  - lib/badline/media/not_disk.rb
386
+ - lib/badline/media/plus4_media.rb
381
387
  - lib/badline/media/program.rb
382
388
  - lib/badline/media/true_drive.rb
383
389
  - lib/badline/media/tune.rb
@@ -393,6 +399,18 @@ files:
393
399
  - lib/badline/options/option.rb
394
400
  - lib/badline/options/table.rb
395
401
  - lib/badline/options/validation.rb
402
+ - lib/badline/plus4.rb
403
+ - lib/badline/plus4/acia.rb
404
+ - lib/badline/plus4/bus.rb
405
+ - lib/badline/plus4/cassette_sense.rb
406
+ - lib/badline/plus4/cpu.rb
407
+ - lib/badline/plus4/cpu_port.rb
408
+ - lib/badline/plus4/keyboard_port.rb
409
+ - lib/badline/plus4/keyed_modules.rb
410
+ - lib/badline/plus4/keyed_parts.rb
411
+ - lib/badline/plus4/keyed_state.rb
412
+ - lib/badline/plus4/model.rb
413
+ - lib/badline/plus4/user_port.rb
396
414
  - lib/badline/region.rb
397
415
  - lib/badline/rom.rb
398
416
  - lib/badline/roms/README
@@ -411,6 +429,11 @@ files:
411
429
  - lib/badline/roms/kernal-pet64.rom
412
430
  - lib/badline/roms/kernal-sx64.rom
413
431
  - lib/badline/roms/kernal.rom
432
+ - lib/badline/roms/plus4/basic.rom
433
+ - lib/badline/roms/plus4/function-high.rom
434
+ - lib/badline/roms/plus4/function-low.rom
435
+ - lib/badline/roms/plus4/kernal-ntsc.rom
436
+ - lib/badline/roms/plus4/kernal-pal.rom
414
437
  - lib/badline/roms/vic20/basic.rom
415
438
  - lib/badline/roms/vic20/character.rom
416
439
  - lib/badline/roms/vic20/kernal-ntsc.rom
@@ -426,10 +449,18 @@ files:
426
449
  - lib/badline/snapshot/c128_setup.rb
427
450
  - lib/badline/snapshot/c64_setup.rb
428
451
  - lib/badline/snapshot/container.rb
452
+ - lib/badline/snapshot/field_doc.rb
453
+ - lib/badline/snapshot/field_doc/markdown.rb
429
454
  - lib/badline/snapshot/image.rb
455
+ - lib/badline/snapshot/keyed.rb
456
+ - lib/badline/snapshot/keyed/cursor.rb
457
+ - lib/badline/snapshot/keyed/modules.rb
458
+ - lib/badline/snapshot/keyed/reader.rb
459
+ - lib/badline/snapshot/keyed/recorder.rb
460
+ - lib/badline/snapshot/keyed/report.rb
461
+ - lib/badline/snapshot/keyed/writer.rb
430
462
  - lib/badline/snapshot/machine_state.rb
431
- - lib/badline/snapshot/setup.rb
432
- - lib/badline/snapshot/state.rb
463
+ - lib/badline/snapshot/plus4_setup.rb
433
464
  - lib/badline/snapshot/storage_setup.rb
434
465
  - lib/badline/snapshot/vic20_setup.rb
435
466
  - lib/badline/snapshot/vice.rb
@@ -467,17 +498,19 @@ files:
467
498
  - lib/badline/support.rb
468
499
  - lib/badline/support/c128_checkpoint.rb
469
500
  - lib/badline/support/checkpoint.rb
501
+ - lib/badline/support/plus4_checkpoint.rb
470
502
  - lib/badline/support/vic20_checkpoint.rb
471
503
  - lib/badline/timing.rb
472
504
  - lib/badline/version.rb
473
505
  - lib/badline/vic20.rb
474
506
  - lib/badline/vic20/attachments.rb
475
507
  - lib/badline/vic20/bus.rb
476
- - lib/badline/vic20/bus/saved_state.rb
508
+ - lib/badline/vic20/bus/keyed_state.rb
477
509
  - lib/badline/vic20/cpu.rb
478
510
  - lib/badline/vic20/keyboard_via_ports.rb
511
+ - lib/badline/vic20/keyed_modules.rb
512
+ - lib/badline/vic20/keyed_state.rb
479
513
  - lib/badline/vic20/port_wiring.rb
480
- - lib/badline/vic20/saved_state.rb
481
514
  - lib/badline/vic20/user_via_ports.rb
482
515
  - packaging/homebrew/badline.rb
483
516
  homepage: https://github.com/elektronaut/badline
@@ -1,53 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Badline
4
- class C128
5
- class Bus
6
- # The bus's state for a snapshot, as C64::Bus::SavedState is the
7
- # C64's.
8
- module SavedState
9
- # The machine's memory, the last access and everything on the bus but
10
- # the keyboard, the joysticks, the pot devices and CAPS LOCK, which the
11
- # host holds. A cartridge is already in the port, built from its setup.
12
- def save_state(out)
13
- out.marker("C128 BUS")
14
- out.int(@cpu_port.ddr).int(@cpu_port.data).int(@cpu_port.floating).int(@address).int(@data)
15
- @mmu.save_state(out)
16
- @ram.save_state(out)
17
- @color_lines.color_ram(0).save_state(out)
18
- @color_lines.color_ram(1).save_state(out)
19
- @cartridge&.save_state(out)
20
- @datasette.save_state(out)
21
- @vic.save_state(out)
22
- @cia1.save_state(out)
23
- @cia2.save_state(out)
24
- @sid.save_state(out)
25
- @vdc.save_state(out)
26
- end
27
-
28
- def load_state(input)
29
- input.marker("C128 BUS")
30
- ddr = input.int
31
- data = input.int
32
- floating = input.int
33
- @address = input.int
34
- @data = input.int
35
- @mmu.load_state(input)
36
- @ram.load_state(input)
37
- @color_lines.color_ram(0).load_state(input)
38
- @color_lines.color_ram(1).load_state(input)
39
- @cartridge&.load_state(input)
40
- @datasette.load_state(input)
41
- @cpu_port.load(ddr, data, floating)
42
- update_overlays!
43
- @vic.load_state(input)
44
- @control_ports.extra_rows = 0xf8 | @vic.extra_keyboard_lines
45
- @cia1.load_state(input)
46
- @cia2.load_state(input)
47
- @sid.load_state(input)
48
- @vdc.load_state(input)
49
- end
50
- end
51
- end
52
- end
53
- end
@@ -1,117 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "badline/snapshot/c128_setup"
4
-
5
- module Badline
6
- class C128
7
- # How the machine a State from #snapshot was taken of was built.
8
- def self.setup(state) = Snapshot::C128Setup.from(state)
9
-
10
- # A new machine, built as the one a State from #snapshot was taken of,
11
- # at that state.
12
- def self.restored(state) = setup(state).build.apply_state(state)
13
-
14
- # The whole machine's state for a snapshot, as C64's: the
15
- # machine's own latches, FAST and TEST as they last took hold, the bus with its RAM, the MMU, the chips and
16
- # the VDC, the CPU, the cartridge, the disk device 8 serves through the
17
- # traps and a true 1541. The serial lines go back into the bus from the
18
- # restored CIA 2. What the host holds stays out: the keyboard, the
19
- # joysticks, CAPS LOCK and 40/80 DISPLAY, the traps and callbacks, and
20
- # which chip renders.
21
- module SavedState
22
- # How many more on_init handlers the machine a State was taken of had
23
- # yet to run than this one has. Nil until the machine is restored.
24
- attr_reader :init_handlers_lost
25
-
26
- def snapshot
27
- out = Snapshot::StateWriter.new
28
- save_state(out)
29
- out.state
30
- end
31
-
32
- # Takes the machine back to a State from #snapshot, trying it on a new
33
- # machine first, so one that fails leaves this machine as it was.
34
- # Raises Snapshot::FormatError for a state of another model or SID.
35
- def restore(state)
36
- check_setup(C128.setup(state))
37
- C128.restored(state)
38
- apply_state(state)
39
- end
40
-
41
- # Puts a State into the machine without trying it on a new one first.
42
- def apply_state(state)
43
- input = Snapshot::StateReader.new(state)
44
- load_state(input)
45
- raise Snapshot::FormatError, "the state goes on past the machine" unless input.finished?
46
-
47
- self
48
- end
49
-
50
- def save_state(out)
51
- out.marker(Snapshot::C128Setup::MARKER).stamp
52
- snapshot_setup.write(out)
53
- out.int(@cycles).int(@clock_bits).boolean(@nmi_asserted).boolean(@cartridge_nmi).boolean(@restore_pulse)
54
- out.boolean(!@pending_keys.nil?)
55
- out.ints(@pending_keys) if @pending_keys
56
- out.int(@cycles <= init_threshold ? @init_handlers.length : 0)
57
- save_cartridge(out)
58
- @bus.save_state(out)
59
- @cpu.save_state(out)
60
- @z80.save_state(out)
61
- out.int(@z80_due).int(@chips_ahead).boolean(@cpu_reset_pending)
62
- save_trap_dos(out)
63
- save_serial_bus(out)
64
- end
65
-
66
- def load_state(input)
67
- input.marker(Snapshot::C128Setup::MARKER)
68
- input.check_stamp
69
- check_setup(Snapshot::C128Setup.read(input))
70
- @cycles = input.int
71
- @clock_bits = input.int
72
- @nmi_asserted = input.boolean?
73
- @cartridge_nmi = input.boolean?
74
- @restore_pulse = input.boolean?
75
- @pending_keys = nil
76
- @pending_keys = input.ints if input.boolean?
77
- @init_handlers_lost = [input.int - @init_handlers.length, 0].max
78
- load_cartridge(input)
79
- @cpu_reset_pending = false
80
- @bus.load_state(input)
81
- push_serial_lines
82
- @cpu.load_state(input)
83
- load_z80(input)
84
- load_trap_dos(input)
85
- load_serial_bus(input)
86
- push_fast_serial
87
- end
88
-
89
- private
90
-
91
- # The Z80 and which CPU has the bus. The bus, restored before it,
92
- # hands the bus to its CPU without resetting the 8502.
93
- def load_z80(input)
94
- @z80_running = @bus.z80?
95
- @z80.load_state(input)
96
- @z80_due = input.int
97
- @chips_ahead = input.int
98
- @cpu_reset_pending = input.boolean?
99
- @z80_turn = @z80_running || @chips_ahead.positive?
100
- end
101
-
102
- # How this machine was built.
103
- def snapshot_setup
104
- Snapshot::C128Setup.new(model: @model.name, sid_model: @sid.model, mode: @c64_built ? :c64 : :c128)
105
- end
106
-
107
- def check_setup(setup)
108
- ours = snapshot_setup
109
- return if setup == ours
110
-
111
- raise Snapshot::FormatError, "the state is of a #{setup}, not a #{ours}"
112
- end
113
- end
114
-
115
- include SavedState
116
- end
117
- end