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,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Badline
4
+ class C64
5
+ class Bus
6
+ # The 6510's port under port.* in a keyed snapshot module
7
+ # (Snapshot::Keyed, BL-CPU), and the bus once its memories, the port
8
+ # and the cartridge are loaded: the banks the CPU and the VIC see are
9
+ # worked out again.
10
+ module KeyedState
11
+ # The RAM expansion fitted, or an Unexpanded stand-in.
12
+ attr_reader :ram_expansion
13
+
14
+ # Takes the cartridge out of the expansion port, as a restore does for
15
+ # a snapshot without one.
16
+ def detach_cartridge
17
+ @cartridge = nil
18
+ update_overlays!
19
+ end
20
+
21
+ # The 6510 port's direction and output registers, and the charge left
22
+ # on its floating bits.
23
+ def port_state = [@cpu_port.ddr, @cpu_port.data, @cpu_port.floating]
24
+
25
+ # Sets the port as port_state reads it, as a snapshot restores it,
26
+ # leaving the RAM under $00 and $01 alone.
27
+ def restore_port(ddr, out, floating)
28
+ @cpu_port.restore(ddr, out, floating)
29
+ end
30
+
31
+ def save_port_fields(out) = @cpu_port.save_fields(out, "port.")
32
+
33
+ def load_port_fields(input) = @cpu_port.load_fields(input, "port.")
34
+
35
+ def restored! = update_overlays!
36
+ end
37
+
38
+ include KeyedState
39
+ end
40
+ end
41
+ end
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "badline/c64/bus/saved_state"
3
+ require "badline/c64/bus/keyed_state"
4
4
  require "badline/c64/bus/sid_slots"
5
5
  require "badline/c64/bus/extra_sids"
6
6
  require "badline/c64/bus/pla"
7
7
  require "badline/c64/bus/roms"
8
8
  require "badline/c64/bus/fittings"
9
+ require "badline/c64/bus/debug_register"
9
10
 
10
11
  module Badline
11
12
  # Memory layout:
@@ -90,6 +91,7 @@ module Badline
90
91
  @cia1.on_port_b4_change { |high| @vic.lightpen_level(high) }
91
92
  @sid = Chips::SID.new(model: sid_model, pots: @control_ports)
92
93
  @sid_slots = []
94
+ @extra_sids = []
93
95
 
94
96
  @datasette = Drives::Datasette.new
95
97
  @datasette.on_flag { @cia1.flag! }
@@ -22,6 +22,10 @@ module Badline
22
22
  include Freezer
23
23
 
24
24
  CONTROL_MODES = %i[rom8k rom16k off ultimax].freeze
25
+
26
+ # Ultimax mode with the RAM at ROML and I/O 2 and the first bank at
27
+ # ROMH, as a freeze leaves the register.
28
+ FREEZE_CONTROL = 0x23
25
29
  IO2_PAGE = 0x1f00
26
30
 
27
31
  def connect(ram:, open_bus:)
@@ -59,25 +63,11 @@ module Badline
59
63
 
60
64
  def freeze!
61
65
  @active = true
62
- @rom = bank(@rom_banks, 0)
63
- select(:ultimax, @isolated, io2_ram: true)
66
+ control(FREEZE_CONTROL)
64
67
  end
65
68
 
66
69
  private
67
70
 
68
- def save_mapper(out)
69
- super
70
- out.int(window_index(@rom, windows)).boolean(@active).boolean(@io2_ram).blob(@ram_data)
71
- end
72
-
73
- def load_mapper(input)
74
- super
75
- @rom = window_at(input.int, windows)
76
- @active = input.boolean?
77
- @io2_ram = input.boolean?
78
- input.blob_into(@ram_data)
79
- end
80
-
81
71
  def windows = [@through, @isolated, @contended, *@rom_banks, EMPTY_BANK]
82
72
 
83
73
  def io2_peek(addr)
@@ -85,6 +75,7 @@ module Badline
85
75
  end
86
76
 
87
77
  def control(value)
78
+ @control = value
88
79
  self.nmi = false if value.anybits?(0x40)
89
80
  @rom = bank(@rom_banks, (value >> 3) & 0x03)
90
81
  configure(value)
@@ -37,6 +37,7 @@ module Badline
37
37
  def windows = [*@roml_banks, *@romh_banks, EMPTY_BANK]
38
38
 
39
39
  def select(number, mode)
40
+ @bank = number
40
41
  @roml = bank(@roml_banks, number)
41
42
  @romh = bank(@romh_banks, number)
42
43
  self.mode = mode
@@ -12,13 +12,15 @@ module Badline
12
12
 
13
13
  def peek(addr)
14
14
  if addr < 0xde10
15
- @roml = bank(@banks, addr & 0x0f)
15
+ @bank = addr & 0x0f
16
+ @roml = bank(@banks, @bank)
16
17
  changed!
17
18
  end
18
19
  open_bus(addr)
19
20
  end
20
21
 
21
22
  def reset
23
+ @bank = 0
22
24
  @roml = bank(@banks, 0)
23
25
  changed!
24
26
  end
@@ -88,21 +88,6 @@ module Badline
88
88
  @romh = @high_flash.window(@bank * BANK_SIZE)
89
89
  end
90
90
 
91
- def save_mapper(out)
92
- out.int(@bank).int(@control).blob(@io_ram)
93
- @low_flash.save_state(out)
94
- @high_flash.save_state(out)
95
- end
96
-
97
- def load_mapper(input)
98
- @bank = input.int
99
- @control = input.int
100
- input.blob_into(@io_ram)
101
- @low_flash.load_state(input)
102
- @high_flash.load_state(input)
103
- map_bank
104
- end
105
-
106
91
  def apply_control
107
92
  game = @control.nobits?(0x04) || @control.anybits?(0x01)
108
93
  exrom = @control.anybits?(0x02)
@@ -57,14 +57,6 @@ module Badline
57
57
 
58
58
  private
59
59
 
60
- def save_mapper(out)
61
- out.int(@discharged_at)
62
- end
63
-
64
- def load_mapper(input)
65
- @discharged_at = input.int
66
- end
67
-
68
60
  def discharge!
69
61
  @discharged_at = @clock ? @clock.call : 0
70
62
  end
@@ -61,21 +61,10 @@ module Badline
61
61
 
62
62
  private
63
63
 
64
- def save_mapper(out)
65
- super
66
- out.boolean(@register_visible).boolean(@phi1_ultimax)
67
- end
68
-
69
- def load_mapper(input)
70
- super
71
- @io_bank = @roml
72
- @register_visible = input.boolean?
73
- @phi1_ultimax = input.boolean?
74
- end
75
-
76
64
  def windows = [*@roml_banks, *@romh_banks, EMPTY_BANK]
77
65
 
78
66
  def select(number)
67
+ @bank = number
79
68
  @io_bank = @roml = bank(@roml_banks, number)
80
69
  @romh = bank(@romh_banks, number)
81
70
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "badline/c64/cartridge/flash/saved_state"
4
-
5
3
  module Badline
6
4
  class C64
7
5
  class Cartridge
@@ -69,7 +67,9 @@ module Badline
69
67
  alias [] peek
70
68
  end
71
69
 
72
- include SavedState
70
+ # The command states, which a snapshot names.
71
+ STATES = %i[read program_setup autoselect programming erase_window erasing suspended chip_erase
72
+ program_error].freeze
73
73
 
74
74
  attr_reader :data, :state
75
75
  attr_writer :clock
@@ -10,7 +10,8 @@ module Badline
10
10
  def poke(addr, value)
11
11
  return if addr > 0xdeff
12
12
 
13
- @roml = bank(@banks, self.class.bank_number(value))
13
+ @bank = self.class.bank_number(value)
14
+ @roml = bank(@banks, @bank)
14
15
  case value & 0xc6
15
16
  when 0x00 then self.mode = :rom8k
16
17
  when 0x86 then self.mode = :off
@@ -48,18 +48,6 @@ module Badline
48
48
  changed!
49
49
  end
50
50
 
51
- def save_mapper(out)
52
- out.int(@bank).boolean(@flash_writes)
53
- @flash.save_state(out)
54
- end
55
-
56
- def load_mapper(input)
57
- @bank = input.int
58
- @flash_writes = input.boolean?
59
- @flash.load_state(input)
60
- @roml = @flash.window(@bank * BANK_SIZE)
61
- end
62
-
63
51
  def install_chips(chips)
64
52
  data = Array.new(BANKS * BANK_SIZE, 0xff)
65
53
  chips.each do |chip|
@@ -27,7 +27,8 @@ module Badline
27
27
  private
28
28
 
29
29
  def select(addr)
30
- @roml = bank(@banks, addr & 0x3f)
30
+ @bank = addr & 0x3f
31
+ @roml = bank(@banks, @bank)
31
32
  changed!
32
33
  end
33
34
 
@@ -53,24 +53,8 @@ module Badline
53
53
  @block = @page = @window = 0
54
54
  end
55
55
 
56
- # A GEO-RAM is built from its size alone.
57
- def save_setup(out)
58
- out.int(GEO_RAM_SETUP).int(@size)
59
- end
60
-
61
56
  private
62
57
 
63
- def save_mapper(out)
64
- out.blob(@ram_data).int(@block).int(@page).int(@window)
65
- end
66
-
67
- def load_mapper(input)
68
- input.blob_into(@ram_data)
69
- @block = input.int
70
- @page = input.int
71
- @window = input.int
72
- end
73
-
74
58
  def install_chips(_chips)
75
59
  @ram_data = Array.new(@size * 1024, 0)
76
60
  reset
@@ -56,14 +56,6 @@ module Badline
56
56
 
57
57
  private
58
58
 
59
- def save_mapper(out)
60
- out.blob(@io_ram)
61
- end
62
-
63
- def load_mapper(input)
64
- input.blob_into(@io_ram)
65
- end
66
-
67
59
  def install_chips(chips)
68
60
  roml, romh = banks_from(chips)
69
61
  @roml = roml.first || EMPTY_BANK