badline 0.12.1 → 0.14.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 (565) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -1
  3. data/CLAUDE.md +86 -38
  4. data/CONTRIBUTING.md +4 -3
  5. data/README.md +9 -6
  6. data/doc/library.md +9 -9
  7. data/doc/media.md +2 -1
  8. data/doc/pinned-behaviour.md +134 -105
  9. data/doc/snapshot-format.md +1047 -0
  10. data/doc/snapshots.md +73 -43
  11. data/lib/badline/audio/bare_player.rb +53 -20
  12. data/lib/badline/audio/cli.rb +6 -6
  13. data/lib/badline/audio/jukebox.rb +2 -2
  14. data/lib/badline/audio/machine_player.rb +16 -10
  15. data/lib/badline/{media → audio}/queue.rb +1 -1
  16. data/lib/badline/audio/queued_tune.rb +6 -6
  17. data/lib/badline/audio/renderer.rb +33 -22
  18. data/lib/badline/audio/stereo.rb +1 -1
  19. data/lib/badline/c128/banks.rb +6 -3
  20. data/lib/badline/c128/bus/keyed_state.rb +45 -0
  21. data/lib/badline/c128/bus.rb +35 -20
  22. data/lib/badline/c128/color_lines.rb +2 -2
  23. data/lib/badline/c128/cpu.rb +1 -1
  24. data/lib/badline/c128/drives.rb +14 -34
  25. data/lib/badline/c128/fast_serial.rb +5 -5
  26. data/lib/badline/c128/keyed_modules.rb +117 -0
  27. data/lib/badline/c128/keyed_state.rb +91 -0
  28. data/lib/badline/c128/keys.rb +9 -0
  29. data/lib/badline/c128/mmu.rb +9 -8
  30. data/lib/badline/c128/mmu_pages.rb +21 -1
  31. data/lib/badline/c128/modes.rb +21 -11
  32. data/lib/badline/c128/z80.rb +2 -2
  33. data/lib/badline/c128/z80_turns.rb +1 -1
  34. data/lib/badline/c128.rb +21 -16
  35. data/lib/badline/c64/attachments.rb +42 -0
  36. data/lib/badline/c64/banked_ram/banking.rb +32 -0
  37. data/lib/badline/c64/banked_ram/plus256k.rb +64 -0
  38. data/lib/badline/c64/banked_ram/plus60k.rb +47 -0
  39. data/lib/badline/c64/banked_ram/unexpanded.rb +30 -0
  40. data/lib/badline/c64/banked_ram.rb +23 -0
  41. data/lib/badline/c64/bus/debug_register.rb +32 -0
  42. data/lib/badline/c64/bus/extra_sids.rb +32 -0
  43. data/lib/badline/c64/bus/fittings.rb +40 -0
  44. data/lib/badline/c64/bus/keyed_state.rb +41 -0
  45. data/lib/badline/c64/bus/pla.rb +149 -0
  46. data/lib/badline/c64/bus/roms.rb +41 -0
  47. data/lib/badline/c64/bus/sid_slots.rb +44 -0
  48. data/lib/badline/c64/bus.rb +219 -0
  49. data/lib/badline/c64/cartridge/action_replay.rb +115 -0
  50. data/lib/badline/c64/cartridge/atomic_power.rb +26 -0
  51. data/lib/badline/c64/cartridge/bank.rb +83 -0
  52. data/lib/badline/c64/cartridge/comal80.rb +52 -0
  53. data/lib/badline/c64/cartridge/dinamic.rb +36 -0
  54. data/lib/badline/c64/cartridge/easy_flash.rb +132 -0
  55. data/lib/badline/c64/cartridge/epyx_fastload.rb +73 -0
  56. data/lib/badline/c64/cartridge/final_cartridge3.rb +79 -0
  57. data/lib/badline/c64/cartridge/flash.rb +279 -0
  58. data/lib/badline/c64/cartridge/freezer.rb +35 -0
  59. data/lib/badline/c64/cartridge/fun_play.rb +40 -0
  60. data/lib/badline/c64/cartridge/g_mod2.rb +64 -0
  61. data/lib/badline/c64/cartridge/game_system.rb +42 -0
  62. data/lib/badline/c64/cartridge/geo_ram.rb +65 -0
  63. data/lib/badline/c64/cartridge/kcs_power.rb +69 -0
  64. data/lib/badline/c64/cartridge/keyed_state.rb +393 -0
  65. data/lib/badline/c64/cartridge/mach5.rb +34 -0
  66. data/lib/badline/c64/cartridge/magic_desk.rb +32 -0
  67. data/lib/badline/c64/cartridge/ocean.rb +37 -0
  68. data/lib/badline/c64/cartridge/pagefox.rb +60 -0
  69. data/lib/badline/c64/cartridge/retro_replay.rb +278 -0
  70. data/lib/badline/c64/cartridge/rex_utility.rb +31 -0
  71. data/lib/badline/c64/cartridge/rgcd.rb +50 -0
  72. data/lib/badline/c64/cartridge/simons_basic.rb +37 -0
  73. data/lib/badline/c64/cartridge/standard.rb +17 -0
  74. data/lib/badline/c64/cartridge/super_games.rb +40 -0
  75. data/lib/badline/c64/cartridge/westermann.rb +32 -0
  76. data/lib/badline/c64/cartridge/zaxxon.rb +52 -0
  77. data/lib/badline/c64/cartridge.rb +232 -0
  78. data/lib/badline/c64/color_memory.rb +27 -0
  79. data/lib/badline/{computer → c64}/common.rb +2 -2
  80. data/lib/badline/{computer → c64}/kernal_traps.rb +39 -36
  81. data/lib/badline/c64/keyed_modules.rb +111 -0
  82. data/lib/badline/c64/keyed_state.rb +68 -0
  83. data/lib/badline/c64/reu/dma.rb +271 -0
  84. data/lib/badline/c64/reu/keyed_state.rb +140 -0
  85. data/lib/badline/c64/reu/ram.rb +94 -0
  86. data/lib/badline/c64/reu/trigger.rb +34 -0
  87. data/lib/badline/c64/reu.rb +289 -0
  88. data/lib/badline/c64/true_drives.rb +120 -0
  89. data/lib/badline/{computer.rb → c64.rb} +24 -15
  90. data/lib/badline/chips/cia/fast_forward.rb +62 -0
  91. data/lib/badline/chips/cia/interrupt_register.rb +128 -0
  92. data/lib/badline/chips/cia/keyed_parts.rb +213 -0
  93. data/lib/badline/chips/cia/serial.rb +246 -0
  94. data/lib/badline/chips/cia/time_of_day.rb +210 -0
  95. data/lib/badline/chips/cia/timer.rb +188 -0
  96. data/lib/badline/chips/cia.rb +281 -0
  97. data/lib/badline/chips/cpu/addressing.rb +133 -0
  98. data/lib/badline/chips/cpu/boundary.rb +56 -0
  99. data/lib/badline/chips/cpu/core.rb +183 -0
  100. data/lib/badline/chips/cpu/instruction.rb +338 -0
  101. data/lib/badline/chips/cpu/instruction_set/arithmetic.rb +118 -0
  102. data/lib/badline/chips/cpu/instruction_set/bitwise.rb +130 -0
  103. data/lib/badline/chips/cpu/instruction_set/branch.rb +83 -0
  104. data/lib/badline/chips/cpu/instruction_set/flag.rb +67 -0
  105. data/lib/badline/chips/cpu/instruction_set/illegal.rb +274 -0
  106. data/lib/badline/chips/cpu/instruction_set/inc_dec.rb +73 -0
  107. data/lib/badline/chips/cpu/instruction_set/stack.rb +56 -0
  108. data/lib/badline/chips/cpu/instruction_set/transfer.rb +141 -0
  109. data/lib/badline/chips/cpu/instruction_set.rb +59 -0
  110. data/lib/badline/chips/cpu/interrupts.rb +108 -0
  111. data/lib/badline/chips/cpu/keyed_state.rb +177 -0
  112. data/lib/badline/chips/cpu/microcode.rb +195 -0
  113. data/lib/badline/chips/cpu/operations.rb +90 -0
  114. data/lib/badline/chips/cpu/port.rb +133 -0
  115. data/lib/badline/chips/cpu/stack_operations.rb +84 -0
  116. data/lib/badline/chips/cpu/traps.rb +23 -0
  117. data/lib/badline/chips/cpu.rb +17 -0
  118. data/lib/badline/chips/sid/catch_up.rb +122 -0
  119. data/lib/badline/chips/sid/decimator.rb +68 -0
  120. data/lib/badline/chips/sid/envelope.rb +236 -0
  121. data/lib/badline/chips/sid/filter.rb +227 -0
  122. data/lib/badline/chips/sid/keyed_parts.rb +286 -0
  123. data/lib/badline/chips/sid/voice.rb +69 -0
  124. data/lib/badline/chips/sid/waveform/combined.rb +128 -0
  125. data/lib/badline/chips/sid/waveform/fast_forward.rb +107 -0
  126. data/lib/badline/chips/sid/waveform/noise_writeback.rb +124 -0
  127. data/lib/badline/chips/sid/waveform.rb +305 -0
  128. data/lib/badline/chips/sid.rb +264 -0
  129. data/lib/badline/chips/ted/beam.rb +119 -0
  130. data/lib/badline/chips/ted/timers.rb +66 -0
  131. data/lib/badline/chips/ted.rb +143 -0
  132. data/lib/badline/chips/tia.rb +49 -0
  133. data/lib/badline/chips/vdc/keyed_parts.rb +105 -0
  134. data/lib/badline/{c128 → chips}/vdc/memory.rb +1 -1
  135. data/lib/badline/{c128 → chips}/vdc/painter.rb +1 -13
  136. data/lib/badline/{c128 → chips}/vdc/raster.rb +1 -17
  137. data/lib/badline/{c128 → chips}/vdc/window.rb +1 -10
  138. data/lib/badline/{c128 → chips}/vdc.rb +6 -31
  139. data/lib/badline/chips/via/control_lines.rb +109 -0
  140. data/lib/badline/chips/via/fast_forward.rb +55 -0
  141. data/lib/badline/chips/via/interrupt_register.rb +60 -0
  142. data/lib/badline/chips/via/keyed_parts.rb +163 -0
  143. data/lib/badline/chips/via/shift_register.rb +168 -0
  144. data/lib/badline/chips/via/timer1.rb +120 -0
  145. data/lib/badline/chips/via/timer2.rb +117 -0
  146. data/lib/badline/chips/via.rb +267 -0
  147. data/lib/badline/chips/vic/bank.rb +135 -0
  148. data/lib/badline/chips/vic/border_mask.rb +78 -0
  149. data/lib/badline/chips/vic/collisions.rb +106 -0
  150. data/lib/badline/chips/vic/color_patches.rb +38 -0
  151. data/lib/badline/chips/vic/display_state.rb +168 -0
  152. data/lib/badline/chips/vic/graphics_mode.rb +166 -0
  153. data/lib/badline/chips/vic/graphics_shifter.rb +183 -0
  154. data/lib/badline/chips/vic/keyed_parts.rb +228 -0
  155. data/lib/badline/chips/vic/keyed_sprites.rb +225 -0
  156. data/lib/badline/chips/vic/keyed_state.rb +102 -0
  157. data/lib/badline/chips/vic/register_log.rb +65 -0
  158. data/lib/badline/chips/vic/registers.rb +188 -0
  159. data/lib/badline/chips/vic/sequencer.rb +275 -0
  160. data/lib/badline/chips/vic/sequencer_output.rb +118 -0
  161. data/lib/badline/chips/vic/sprite/internal_bus.rb +59 -0
  162. data/lib/badline/chips/vic/sprite/shifter.rb +148 -0
  163. data/lib/badline/chips/vic/sprite/timing.rb +58 -0
  164. data/lib/badline/chips/vic/sprite.rb +337 -0
  165. data/lib/badline/chips/vic/sprites.rb +281 -0
  166. data/lib/badline/chips/vic.rb +787 -0
  167. data/lib/badline/chips/vic_i/keyed_parts.rb +142 -0
  168. data/lib/badline/{vic20/vic → chips/vic_i}/painter.rb +2 -30
  169. data/lib/badline/chips/vic_i/sound/output.rb +85 -0
  170. data/lib/badline/chips/vic_i/sound.rb +227 -0
  171. data/lib/badline/{vic20/vic → chips/vic_i}/text_window.rb +2 -2
  172. data/lib/badline/{vic20/vic.rb → chips/vic_i.rb} +6 -6
  173. data/lib/badline/chips/z80/arithmetic.rb +119 -0
  174. data/lib/badline/chips/z80/bit_page.rb +57 -0
  175. data/lib/badline/chips/z80/block_io.rb +60 -0
  176. data/lib/badline/chips/z80/block_transfers.rb +61 -0
  177. data/lib/badline/chips/z80/bus_cycles.rb +113 -0
  178. data/lib/badline/chips/z80/core.rb +115 -0
  179. data/lib/badline/chips/z80/exchanges.rb +52 -0
  180. data/lib/badline/chips/z80/extended_page.rb +91 -0
  181. data/lib/badline/chips/z80/flags.rb +39 -0
  182. data/lib/badline/chips/z80/interrupt_acceptance.rb +48 -0
  183. data/lib/badline/chips/z80/jumps.rb +84 -0
  184. data/lib/badline/chips/z80/keyed_state.rb +73 -0
  185. data/lib/badline/chips/z80/loads.rb +100 -0
  186. data/lib/badline/chips/z80/main_page.rb +136 -0
  187. data/lib/badline/chips/z80/registers.rb +122 -0
  188. data/lib/badline/chips/z80/shifts.rb +66 -0
  189. data/lib/badline/chips/z80.rb +13 -0
  190. data/lib/badline/chips.rb +10 -0
  191. data/lib/badline/core.rb +13 -32
  192. data/lib/badline/drives/datasette/keyed_state.rb +38 -0
  193. data/lib/badline/drives/datasette.rb +173 -0
  194. data/lib/badline/drives/engine/core.rb +152 -0
  195. data/lib/badline/drives/engine/fast_serial.rb +75 -0
  196. data/lib/badline/drives/engine/idle.rb +127 -0
  197. data/lib/badline/drives/engine/idle_cpu.rb +30 -0
  198. data/lib/badline/drives/engine/orbit.rb +81 -0
  199. data/lib/badline/drives/engine/serial_lines.rb +72 -0
  200. data/lib/badline/drives/engine/sleep.rb +114 -0
  201. data/lib/badline/drives/engine/vias.rb +86 -0
  202. data/lib/badline/drives/engine/watch.rb +152 -0
  203. data/lib/badline/drives/engine.rb +11 -0
  204. data/lib/badline/drives/model1541/bus.rb +75 -0
  205. data/lib/badline/drives/model1541/byte_ready.rb +50 -0
  206. data/lib/badline/drives/model1541/cpu.rb +13 -0
  207. data/lib/badline/drives/model1541/disk.rb +318 -0
  208. data/lib/badline/drives/model1541/disk_via.rb +38 -0
  209. data/lib/badline/drives/model1541/gcr.rb +59 -0
  210. data/lib/badline/drives/model1541/keyed_state.rb +251 -0
  211. data/lib/badline/drives/model1541/mechanism.rb +313 -0
  212. data/lib/badline/drives/model1541/rotation.rb +123 -0
  213. data/lib/badline/drives/model1541/sector_reader.rb +78 -0
  214. data/lib/badline/drives/model1541/serial_port.rb +20 -0
  215. data/lib/badline/drives/model1541/track.rb +100 -0
  216. data/lib/badline/drives/model1541.rb +80 -0
  217. data/lib/badline/drives/model1571/bus.rb +100 -0
  218. data/lib/badline/drives/model1571/cpu.rb +13 -0
  219. data/lib/badline/drives/model1571/keyed_state.rb +108 -0
  220. data/lib/badline/drives/model1571/serial_port.rb +39 -0
  221. data/lib/badline/drives/model1571/serial_via.rb +27 -0
  222. data/lib/badline/drives/model1571/wd1770.rb +108 -0
  223. data/lib/badline/drives/model1571.rb +141 -0
  224. data/lib/badline/drives/model1581/bus.rb +126 -0
  225. data/lib/badline/drives/model1581/cpu.rb +13 -0
  226. data/lib/badline/drives/model1581/disk.rb +133 -0
  227. data/lib/badline/drives/model1581/keyed_state.rb +280 -0
  228. data/lib/badline/drives/model1581/mechanism.rb +98 -0
  229. data/lib/badline/drives/model1581/serial_port.rb +54 -0
  230. data/lib/badline/drives/model1581/slot.rb +61 -0
  231. data/lib/badline/drives/model1581/track.rb +102 -0
  232. data/lib/badline/drives/model1581/track_bytes.rb +77 -0
  233. data/lib/badline/drives/model1581/wd1772/registers.rb +91 -0
  234. data/lib/badline/drives/model1581/wd1772/sector_writes.rb +75 -0
  235. data/lib/badline/drives/model1581/wd1772/sectors.rb +152 -0
  236. data/lib/badline/drives/model1581/wd1772/stepping.rb +111 -0
  237. data/lib/badline/drives/model1581/wd1772/tracks.rb +127 -0
  238. data/lib/badline/drives/model1581/wd1772/turn.rb +75 -0
  239. data/lib/badline/drives/model1581/wd1772.rb +216 -0
  240. data/lib/badline/drives/model1581.rb +206 -0
  241. data/lib/badline/drives/serial_bus.rb +161 -0
  242. data/lib/badline/drives.rb +8 -0
  243. data/lib/badline/frontend/app.rb +3 -3
  244. data/lib/badline/frontend/boot.rb +4 -4
  245. data/lib/badline/frontend/controls.rb +19 -3
  246. data/lib/badline/frontend/drive_led.rb +44 -21
  247. data/lib/badline/frontend/machine_window.rb +3 -1
  248. data/lib/badline/frontend/menu/menu_dialogs.rb +2 -2
  249. data/lib/badline/frontend/player/filter_view.rb +1 -1
  250. data/lib/badline/frontend/player/player_controller.rb +2 -2
  251. data/lib/badline/frontend/player/player_screen.rb +1 -0
  252. data/lib/badline/frontend/player/theme.rb +7 -7
  253. data/lib/badline/frontend/snapshots.rb +12 -1
  254. data/lib/badline/frontend/timeline.rb +30 -12
  255. data/lib/badline/input/control_ports.rb +78 -0
  256. data/lib/badline/input/joystick.rb +27 -0
  257. data/lib/badline/input/keyboard.rb +114 -0
  258. data/lib/badline/input/matrix_typist.rb +98 -0
  259. data/lib/badline/input.rb +4 -0
  260. data/lib/badline/kernal_trap/chrout.rb +45 -0
  261. data/lib/badline/kernal_trap/{drive → dos}/block_commands.rb +1 -1
  262. data/lib/badline/kernal_trap/dos/channel.rb +156 -0
  263. data/lib/badline/kernal_trap/{drive → dos}/channels.rb +1 -26
  264. data/lib/badline/kernal_trap/{drive → dos}/memory.rb +1 -10
  265. data/lib/badline/kernal_trap/{drive → dos}/parameters.rb +1 -1
  266. data/lib/badline/kernal_trap/{drive → dos}/status.rb +1 -9
  267. data/lib/badline/kernal_trap/{drive → dos}/write_file.rb +1 -19
  268. data/lib/badline/kernal_trap/{drive → dos}/writes.rb +1 -1
  269. data/lib/badline/kernal_trap/{drive.rb → dos.rb} +9 -27
  270. data/lib/badline/kernal_trap/file_routine.rb +4 -4
  271. data/lib/badline/kernal_trap/keyed_state.rb +150 -0
  272. data/lib/badline/kernal_trap/layout.rb +75 -11
  273. data/lib/badline/kernal_trap/load.rb +19 -21
  274. data/lib/badline/kernal_trap/routine.rb +12 -0
  275. data/lib/badline/kernal_trap/save.rb +12 -22
  276. data/lib/badline/kernal_trap/serial.rb +8 -24
  277. data/lib/badline/kernal_trap.rb +3 -2
  278. data/lib/badline/machine/clocking.rb +1 -1
  279. data/lib/badline/machine/keyboard_buffer.rb +49 -0
  280. data/lib/badline/machine/settling.rb +29 -0
  281. data/lib/badline/machine.rb +10 -7
  282. data/lib/badline/media/boot_disk.rb +14 -2
  283. data/lib/badline/media/extensions.rb +10 -0
  284. data/lib/badline/media/true_drive.rb +1 -1
  285. data/lib/badline/media/tune.rb +2 -2
  286. data/lib/badline/media.rb +3 -3
  287. data/lib/badline/memory.rb +3 -6
  288. data/lib/badline/model.rb +1 -1
  289. data/lib/badline/options/family.rb +5 -2
  290. data/lib/badline/options/help.rb +42 -16
  291. data/lib/badline/options/table.rb +2 -0
  292. data/lib/badline/options/validation.rb +2 -0
  293. data/lib/badline/options.rb +6 -1
  294. data/lib/badline/plus4/acia.rb +45 -0
  295. data/lib/badline/plus4/bus.rb +312 -0
  296. data/lib/badline/plus4/cpu.rb +10 -0
  297. data/lib/badline/plus4/cpu_port.rb +93 -0
  298. data/lib/badline/plus4/keyboard_port.rb +51 -0
  299. data/lib/badline/plus4/model.rb +38 -0
  300. data/lib/badline/plus4/user_port.rb +31 -0
  301. data/lib/badline/plus4.rb +164 -0
  302. data/lib/badline/roms/README +44 -6
  303. data/lib/badline/roms/plus4/basic.rom +0 -0
  304. data/lib/badline/roms/plus4/function-high.rom +0 -0
  305. data/lib/badline/roms/plus4/function-low.rom +0 -0
  306. data/lib/badline/roms/plus4/kernal-ntsc.rom +0 -0
  307. data/lib/badline/roms/plus4/kernal-pal.rom +0 -0
  308. data/lib/badline/sdl.rb +1 -0
  309. data/lib/badline/{storage/sid_file.rb → sid_tune/file.rb} +3 -3
  310. data/lib/badline/{storage → sid_tune}/hvsc.rb +7 -7
  311. data/lib/badline/{storage → sid_tune}/song_lengths.rb +2 -2
  312. data/lib/badline/{storage → sid_tune}/stil/credit.rb +1 -1
  313. data/lib/badline/{storage → sid_tune}/stil.rb +3 -3
  314. data/lib/badline/sid_tune.rb +6 -0
  315. data/lib/badline/snapshot/c128_setup.rb +32 -0
  316. data/lib/badline/snapshot/c64_setup.rb +83 -0
  317. data/lib/badline/snapshot/container.rb +4 -0
  318. data/lib/badline/snapshot/field_doc/markdown.rb +112 -0
  319. data/lib/badline/snapshot/field_doc.rb +109 -0
  320. data/lib/badline/snapshot/image.rb +132 -46
  321. data/lib/badline/snapshot/keyed/cursor.rb +40 -0
  322. data/lib/badline/snapshot/keyed/modules.rb +66 -0
  323. data/lib/badline/snapshot/keyed/reader.rb +188 -0
  324. data/lib/badline/snapshot/keyed/recorder.rb +88 -0
  325. data/lib/badline/snapshot/keyed/report.rb +26 -0
  326. data/lib/badline/snapshot/keyed/writer.rb +55 -0
  327. data/lib/badline/snapshot/keyed.rb +64 -0
  328. data/lib/badline/snapshot/machine_state.rb +17 -64
  329. data/lib/badline/snapshot/storage_setup.rb +63 -0
  330. data/lib/badline/snapshot/vic20_setup.rb +28 -0
  331. data/lib/badline/snapshot/vice/c64_mem.rb +1 -1
  332. data/lib/badline/snapshot/vice/restore.rb +1 -1
  333. data/lib/badline/snapshot/vice/reu1764.rb +3 -3
  334. data/lib/badline/snapshot/vice/reu_fields.rb +40 -0
  335. data/lib/badline/snapshot/vice.rb +13 -35
  336. data/lib/badline/snapshot.rb +44 -22
  337. data/lib/badline/storage/crt_file.rb +3 -1
  338. data/lib/badline/storage/d64_image.rb +0 -2
  339. data/lib/badline/storage/d71_image.rb +0 -2
  340. data/lib/badline/storage/d81_image.rb +0 -2
  341. data/lib/badline/storage/disk_image.rb +3 -6
  342. data/lib/badline/storage/g64_image.rb +10 -5
  343. data/lib/badline/storage/host_directory.rb +0 -5
  344. data/lib/badline/storage/t64.rb +2 -8
  345. data/lib/badline/storage/tap.rb +43 -15
  346. data/lib/badline/storage/unavailable.rb +1 -1
  347. data/lib/badline/storage.rb +0 -37
  348. data/lib/badline/support/c128_checkpoint.rb +39 -0
  349. data/lib/badline/support/checkpoint.rb +108 -0
  350. data/lib/badline/support/vic20_checkpoint.rb +38 -0
  351. data/lib/badline/support.rb +5 -0
  352. data/lib/badline/version.rb +1 -1
  353. data/lib/badline/vic20/attachments.rb +8 -5
  354. data/lib/badline/vic20/bus/keyed_state.rb +52 -0
  355. data/lib/badline/vic20/bus.rb +2 -25
  356. data/lib/badline/vic20/cpu.rb +1 -1
  357. data/lib/badline/vic20/keyed_modules.rb +73 -0
  358. data/lib/badline/vic20/keyed_state.rb +45 -0
  359. data/lib/badline/vic20/port_wiring.rb +4 -4
  360. data/lib/badline/vic20/user_via_ports.rb +2 -2
  361. data/lib/badline/vic20.rb +22 -17
  362. data/lib/badline.rb +1 -0
  363. metadata +271 -228
  364. data/lib/badline/address_bus/extra_sids.rb +0 -30
  365. data/lib/badline/address_bus/fittings.rb +0 -38
  366. data/lib/badline/address_bus/pla.rb +0 -147
  367. data/lib/badline/address_bus/roms.rb +0 -39
  368. data/lib/badline/address_bus/saved_state.rb +0 -66
  369. data/lib/badline/address_bus/sid_slots.rb +0 -42
  370. data/lib/badline/address_bus.rb +0 -216
  371. data/lib/badline/c128/bus_state.rb +0 -53
  372. data/lib/badline/c128/saved_state.rb +0 -143
  373. data/lib/badline/cartridge/action_replay.rb +0 -126
  374. data/lib/badline/cartridge/atomic_power.rb +0 -24
  375. data/lib/badline/cartridge/bank.rb +0 -81
  376. data/lib/badline/cartridge/comal80.rb +0 -50
  377. data/lib/badline/cartridge/dinamic.rb +0 -34
  378. data/lib/badline/cartridge/easy_flash.rb +0 -145
  379. data/lib/badline/cartridge/epyx_fastload.rb +0 -79
  380. data/lib/badline/cartridge/final_cartridge3.rb +0 -89
  381. data/lib/badline/cartridge/flash.rb +0 -306
  382. data/lib/badline/cartridge/freezer.rb +0 -33
  383. data/lib/badline/cartridge/fun_play.rb +0 -38
  384. data/lib/badline/cartridge/g_mod2.rb +0 -74
  385. data/lib/badline/cartridge/game_system.rb +0 -40
  386. data/lib/badline/cartridge/geo_ram.rb +0 -79
  387. data/lib/badline/cartridge/kcs_power.rb +0 -75
  388. data/lib/badline/cartridge/mach5.rb +0 -32
  389. data/lib/badline/cartridge/magic_desk.rb +0 -30
  390. data/lib/badline/cartridge/ocean.rb +0 -35
  391. data/lib/badline/cartridge/pagefox.rb +0 -68
  392. data/lib/badline/cartridge/retro_replay.rb +0 -320
  393. data/lib/badline/cartridge/rex_utility.rb +0 -29
  394. data/lib/badline/cartridge/rgcd.rb +0 -58
  395. data/lib/badline/cartridge/simons_basic.rb +0 -35
  396. data/lib/badline/cartridge/standard.rb +0 -15
  397. data/lib/badline/cartridge/super_games.rb +0 -48
  398. data/lib/badline/cartridge/westermann.rb +0 -30
  399. data/lib/badline/cartridge/zaxxon.rb +0 -66
  400. data/lib/badline/cartridge.rb +0 -303
  401. data/lib/badline/checkpoint.rb +0 -98
  402. data/lib/badline/chrout_trap.rb +0 -43
  403. data/lib/badline/cia/fast_forward.rb +0 -60
  404. data/lib/badline/cia/interrupt_register.rb +0 -143
  405. data/lib/badline/cia/serial.rb +0 -275
  406. data/lib/badline/cia/state.rb +0 -47
  407. data/lib/badline/cia/timer.rb +0 -206
  408. data/lib/badline/cia.rb +0 -279
  409. data/lib/badline/color_memory.rb +0 -25
  410. data/lib/badline/computer/attachments.rb +0 -88
  411. data/lib/badline/computer/saved_state.rb +0 -117
  412. data/lib/badline/computer/true_drives.rb +0 -69
  413. data/lib/badline/control_ports.rb +0 -76
  414. data/lib/badline/cpu/addressing.rb +0 -131
  415. data/lib/badline/cpu/boundary.rb +0 -54
  416. data/lib/badline/cpu/core.rb +0 -165
  417. data/lib/badline/cpu/microcode.rb +0 -177
  418. data/lib/badline/cpu/operations.rb +0 -88
  419. data/lib/badline/cpu/saved_state.rb +0 -115
  420. data/lib/badline/cpu/stack_operations.rb +0 -82
  421. data/lib/badline/cpu.rb +0 -10
  422. data/lib/badline/cpu_port.rb +0 -112
  423. data/lib/badline/datasette.rb +0 -161
  424. data/lib/badline/debug_register.rb +0 -28
  425. data/lib/badline/drive/core.rb +0 -147
  426. data/lib/badline/drive/fast_serial.rb +0 -73
  427. data/lib/badline/drive/idle.rb +0 -125
  428. data/lib/badline/drive/idle_cpu.rb +0 -28
  429. data/lib/badline/drive/orbit.rb +0 -79
  430. data/lib/badline/drive/serial_lines.rb +0 -73
  431. data/lib/badline/drive/sleep.rb +0 -112
  432. data/lib/badline/drive/vias.rb +0 -84
  433. data/lib/badline/drive/watch.rb +0 -150
  434. data/lib/badline/drive.rb +0 -11
  435. data/lib/badline/drive1541/bus.rb +0 -86
  436. data/lib/badline/drive1541/byte_ready.rb +0 -48
  437. data/lib/badline/drive1541/cpu.rb +0 -11
  438. data/lib/badline/drive1541/disk.rb +0 -315
  439. data/lib/badline/drive1541/disk_state.rb +0 -86
  440. data/lib/badline/drive1541/disk_via.rb +0 -36
  441. data/lib/badline/drive1541/gcr.rb +0 -57
  442. data/lib/badline/drive1541/mechanism.rb +0 -313
  443. data/lib/badline/drive1541/mechanism_state.rb +0 -68
  444. data/lib/badline/drive1541/rotation.rb +0 -121
  445. data/lib/badline/drive1541/sector_reader.rb +0 -76
  446. data/lib/badline/drive1541/serial_port.rb +0 -18
  447. data/lib/badline/drive1541/track.rb +0 -98
  448. data/lib/badline/drive1541.rb +0 -111
  449. data/lib/badline/drive1571/bus.rb +0 -111
  450. data/lib/badline/drive1571/cpu.rb +0 -11
  451. data/lib/badline/drive1571/serial_port.rb +0 -37
  452. data/lib/badline/drive1571/serial_via.rb +0 -25
  453. data/lib/badline/drive1571/wd1770.rb +0 -120
  454. data/lib/badline/drive1571.rb +0 -175
  455. data/lib/badline/drive1581/bus.rb +0 -137
  456. data/lib/badline/drive1581/cpu.rb +0 -11
  457. data/lib/badline/drive1581/disk.rb +0 -135
  458. data/lib/badline/drive1581/disk_state.rb +0 -87
  459. data/lib/badline/drive1581/mechanism.rb +0 -117
  460. data/lib/badline/drive1581/serial_port.rb +0 -52
  461. data/lib/badline/drive1581/slot.rb +0 -78
  462. data/lib/badline/drive1581/track.rb +0 -100
  463. data/lib/badline/drive1581/track_bytes.rb +0 -75
  464. data/lib/badline/drive1581/wd1772/registers.rb +0 -89
  465. data/lib/badline/drive1581/wd1772/sector_writes.rb +0 -73
  466. data/lib/badline/drive1581/wd1772/sectors.rb +0 -150
  467. data/lib/badline/drive1581/wd1772/state.rb +0 -66
  468. data/lib/badline/drive1581/wd1772/stepping.rb +0 -109
  469. data/lib/badline/drive1581/wd1772/tracks.rb +0 -125
  470. data/lib/badline/drive1581/wd1772/turn.rb +0 -73
  471. data/lib/badline/drive1581/wd1772.rb +0 -216
  472. data/lib/badline/drive1581.rb +0 -233
  473. data/lib/badline/iec_bus.rb +0 -159
  474. data/lib/badline/instruction.rb +0 -334
  475. data/lib/badline/instruction_set/arithmetic.rb +0 -114
  476. data/lib/badline/instruction_set/bitwise.rb +0 -126
  477. data/lib/badline/instruction_set/branch.rb +0 -79
  478. data/lib/badline/instruction_set/flag.rb +0 -63
  479. data/lib/badline/instruction_set/illegal.rb +0 -270
  480. data/lib/badline/instruction_set/inc_dec.rb +0 -69
  481. data/lib/badline/instruction_set/stack.rb +0 -52
  482. data/lib/badline/instruction_set/transfer.rb +0 -137
  483. data/lib/badline/instruction_set.rb +0 -55
  484. data/lib/badline/interrupts.rb +0 -104
  485. data/lib/badline/joystick.rb +0 -25
  486. data/lib/badline/kernal_trap/channel.rb +0 -181
  487. data/lib/badline/keyboard.rb +0 -112
  488. data/lib/badline/keyboard_buffer.rb +0 -33
  489. data/lib/badline/ram_expansion/banking.rb +0 -30
  490. data/lib/badline/ram_expansion/plus256k.rb +0 -54
  491. data/lib/badline/ram_expansion/plus60k.rb +0 -43
  492. data/lib/badline/ram_expansion/unexpanded.rb +0 -28
  493. data/lib/badline/ram_expansion.rb +0 -21
  494. data/lib/badline/reu/dma/saved_state.rb +0 -50
  495. data/lib/badline/reu/dma.rb +0 -273
  496. data/lib/badline/reu/ram.rb +0 -107
  497. data/lib/badline/reu/saved_state.rb +0 -80
  498. data/lib/badline/reu/trigger.rb +0 -32
  499. data/lib/badline/reu.rb +0 -289
  500. data/lib/badline/sid/catch_up.rb +0 -120
  501. data/lib/badline/sid/decimator.rb +0 -64
  502. data/lib/badline/sid/envelope/state.rb +0 -68
  503. data/lib/badline/sid/envelope.rb +0 -239
  504. data/lib/badline/sid/filter.rb +0 -263
  505. data/lib/badline/sid/voice.rb +0 -77
  506. data/lib/badline/sid/waveform/combined.rb +0 -126
  507. data/lib/badline/sid/waveform/fast_forward.rb +0 -105
  508. data/lib/badline/sid/waveform/noise_writeback.rb +0 -122
  509. data/lib/badline/sid/waveform/state.rb +0 -66
  510. data/lib/badline/sid/waveform.rb +0 -305
  511. data/lib/badline/sid.rb +0 -303
  512. data/lib/badline/snapshot/setup.rb +0 -75
  513. data/lib/badline/snapshot/state.rb +0 -189
  514. data/lib/badline/time_of_day.rb +0 -228
  515. data/lib/badline/traps.rb +0 -19
  516. data/lib/badline/via/control_lines.rb +0 -122
  517. data/lib/badline/via/fast_forward.rb +0 -53
  518. data/lib/badline/via/interrupt_register.rb +0 -67
  519. data/lib/badline/via/shift_register.rb +0 -180
  520. data/lib/badline/via/state.rb +0 -42
  521. data/lib/badline/via/timer1.rb +0 -131
  522. data/lib/badline/via/timer2.rb +0 -133
  523. data/lib/badline/via.rb +0 -266
  524. data/lib/badline/vic/bank.rb +0 -133
  525. data/lib/badline/vic/border_mask.rb +0 -86
  526. data/lib/badline/vic/collisions.rb +0 -115
  527. data/lib/badline/vic/color_patches.rb +0 -47
  528. data/lib/badline/vic/display_state.rb +0 -185
  529. data/lib/badline/vic/graphics_mode.rb +0 -164
  530. data/lib/badline/vic/graphics_shifter.rb +0 -207
  531. data/lib/badline/vic/register_log.rb +0 -81
  532. data/lib/badline/vic/registers.rb +0 -195
  533. data/lib/badline/vic/sequencer.rb +0 -275
  534. data/lib/badline/vic/sequencer_output.rb +0 -116
  535. data/lib/badline/vic/sequencer_state.rb +0 -89
  536. data/lib/badline/vic/sprite/internal_bus.rb +0 -68
  537. data/lib/badline/vic/sprite/saved_state.rb +0 -64
  538. data/lib/badline/vic/sprite/shifter.rb +0 -146
  539. data/lib/badline/vic/sprite/timing.rb +0 -56
  540. data/lib/badline/vic/sprite.rb +0 -337
  541. data/lib/badline/vic/sprites.rb +0 -282
  542. data/lib/badline/vic/sprites_state.rb +0 -57
  543. data/lib/badline/vic.rb +0 -853
  544. data/lib/badline/vic20/saved_state.rb +0 -124
  545. data/lib/badline/vic20/sound/output.rb +0 -83
  546. data/lib/badline/vic20/sound.rb +0 -233
  547. data/lib/badline/vic20/vic/saved_state.rb +0 -55
  548. data/lib/badline/z80/arithmetic.rb +0 -117
  549. data/lib/badline/z80/bit_page.rb +0 -55
  550. data/lib/badline/z80/block_io.rb +0 -58
  551. data/lib/badline/z80/block_transfers.rb +0 -59
  552. data/lib/badline/z80/bus_cycles.rb +0 -111
  553. data/lib/badline/z80/core.rb +0 -113
  554. data/lib/badline/z80/exchanges.rb +0 -50
  555. data/lib/badline/z80/extended_page.rb +0 -89
  556. data/lib/badline/z80/flags.rb +0 -37
  557. data/lib/badline/z80/interrupt_acceptance.rb +0 -46
  558. data/lib/badline/z80/jumps.rb +0 -82
  559. data/lib/badline/z80/loads.rb +0 -98
  560. data/lib/badline/z80/main_page.rb +0 -134
  561. data/lib/badline/z80/registers.rb +0 -120
  562. data/lib/badline/z80/saved_state.rb +0 -69
  563. data/lib/badline/z80/shifts.rb +0 -64
  564. data/lib/badline/z80.rb +0 -11
  565. /data/lib/badline/snapshot/{fields.rb → vice/fields.rb} +0 -0
@@ -1,207 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Badline
4
- class VIC
5
- # The graphics shift register, pixel by pixel, for the groups where a
6
- # mode or XSCROLL change lands (VICE x64sc `draw_graphics`). The
7
- # sequencer paints whole bytes everywhere else, which comes to the same
8
- # thing while nothing changes.
9
- #
10
- # The byte a group draws loads at pixel XSCROLL. ECM and BMM take hold at
11
- # pixel 4 as they rise and at pixel 6 as they fall (the 6569's colour
12
- # latency), except that BMM falls at pixel 5 out of any mode but hi-res
13
- # bitmap. MCM takes hold at pixel 4 for the colour lookup but only at
14
- # pixel 7 for how the register is read, where a rising MCM also resets
15
- # the multicolour flip-flop. An MCM that falls out of the invalid
16
- # ECM+MCM mode is a pixel later on both counts: the lookup changes at
17
- # pixel 5 and the read at the next group's pixel 0. The mode bits are
18
- # the sequencer's: ECM 4, BMM 2, MCM 1.
19
- #
20
- # The 8565 has no colour latency: ECM and BMM take hold, rising or
21
- # falling, at the next group's pixel 0, and an MCM that falls out of
22
- # ECM+MCM does so on time. Where that pixel 0 takes the group out of an
23
- # invalid mode, it is still black into hi-res text, and so is a
24
- # background pixel into multicolour bitmap.
25
- class GraphicsShifter
26
- ECM = 0b100
27
- ECM_BMM = 0b110
28
- MULTICOLOR_BITMAP = 0b011
29
- ECM_MCM = 0b101
30
- BMM = 0b010
31
-
32
- # The group #draw painted, and which of its pixels are foreground.
33
- attr_reader :colors, :fg
34
-
35
- def initialize(registers, model: :mos6569)
36
- @registers = registers
37
- @latency = model != :mos8565
38
- @next_ecm_bmm = 0
39
- @black_below = 0
40
- @colors = Array.new(8, 0)
41
- @fg = Array.new(8, false)
42
- @gbuf = 0
43
- @vbuf = 0
44
- @cbuf = 0
45
- @flop = 0
46
- @pixel = 0
47
- @mode_lookup = 0
48
- @mode_read = 0
49
- @late_mcm = false
50
- @late_read = false
51
- end
52
-
53
- def save_state(out)
54
- out.int(@next_ecm_bmm).int(@black_below).ints(@colors).booleans(@fg)
55
- out.int(@gbuf).int(@vbuf).int(@cbuf).int(@flop).int(@pixel)
56
- out.int(@mode_lookup).int(@mode_read).boolean(@late_mcm).boolean(@late_read)
57
- end
58
-
59
- def load_state(input)
60
- @next_ecm_bmm = input.int
61
- @black_below = input.int
62
- input.ints_into(@colors)
63
- input.booleans_into(@fg)
64
- load_buffers(input)
65
- @mode_lookup = input.int
66
- @mode_read = input.int
67
- @late_mcm = input.boolean?
68
- @late_read = input.boolean?
69
- end
70
-
71
- # Rebuilds the state at the end of a group that painted whole bytes:
72
- # the byte loaded at pixel shift under an unchanging mode.
73
- def prime(data, screencode, color, shift, mode)
74
- @mode_lookup = mode
75
- @next_ecm_bmm = mode & ECM_BMM
76
- @mode_read = mode & 1
77
- @late_read = false
78
- load(data, screencode, color)
79
- (8 - shift).times { read_pixel }
80
- end
81
-
82
- # Draws one group, loading the byte at pixel shift.
83
- def draw(data, screencode, color, shift, mode)
84
- i = 0
85
- while i < 8
86
- step_mode(i, mode)
87
- load(data, screencode, color) if i == shift
88
- pixel = read_pixel
89
- @colors[i] = pixel < @black_below ? 0 : lookup(pixel)
90
- @black_below = 0
91
- @fg[i] = pixel >= 2
92
- i += 1
93
- end
94
- @next_ecm_bmm = mode & ECM_BMM
95
- end
96
-
97
- private
98
-
99
- def load_buffers(input)
100
- @gbuf = input.int
101
- @vbuf = input.int
102
- @cbuf = input.int
103
- @flop = input.int
104
- @pixel = input.int
105
- end
106
-
107
- def step_mode(pixel, mode)
108
- case pixel
109
- when 0 then start_group
110
- when 4 then step_lookup(mode)
111
- when 5 then step_early_fall(mode)
112
- when 6 then @mode_lookup &= mode | 1 if @latency
113
- when 7 then step_read
114
- end
115
- end
116
-
117
- def start_group
118
- end_late_read
119
- return if @latency
120
-
121
- invalid = @mode_lookup > ECM
122
- @mode_lookup = (@mode_lookup & ~ECM_BMM) | @next_ecm_bmm
123
- @black_below = black_pixels_out_of_invalid if invalid
124
- end
125
-
126
- # The pixel values below which pixel 0 stays black as the group leaves
127
- # an invalid mode: all four into hi-res text, the background ones into
128
- # multicolour bitmap.
129
- def black_pixels_out_of_invalid
130
- case @mode_lookup
131
- when 0 then 4
132
- when MULTICOLOR_BITMAP then 2
133
- else 0
134
- end
135
- end
136
-
137
- def step_lookup(mode)
138
- @late_mcm = @latency && @mode_lookup.allbits?(ECM_MCM) && mode.nobits?(1)
139
- rising = @latency ? mode & ECM_BMM : 0
140
- @mode_lookup = (@mode_lookup & ~1) | (mode & 1) | (@late_mcm ? 1 : 0) | rising
141
- end
142
-
143
- def step_early_fall(mode)
144
- @mode_lookup &= ~1 if @late_mcm
145
- @mode_lookup &= mode | ~BMM if @latency && @mode_lookup != BMM
146
- end
147
-
148
- def step_read
149
- return @late_read = true if @late_mcm
150
-
151
- mcm = @mode_lookup & 1
152
- @flop = 0 if mcm == 1 && @mode_read.zero?
153
- @mode_read = mcm
154
- end
155
-
156
- def end_late_read
157
- return unless @late_read
158
-
159
- @mode_read = 0
160
- @late_read = false
161
- end
162
-
163
- def load(data, screencode, color)
164
- @gbuf = data
165
- @vbuf = screencode
166
- @cbuf = color & 0x0f
167
- @flop = 1
168
- end
169
-
170
- def read_pixel
171
- multicolor = multicolor?
172
- if @mode_read == 1 && multicolor
173
- @pixel = @gbuf >> 6 if @flop == 1
174
- elsif @gbuf.anybits?(0x80)
175
- @pixel = multicolor && @mode_read.zero? ? 2 : 3
176
- else
177
- @pixel = 0
178
- end
179
- @gbuf = (@gbuf << 1) & 0xff
180
- @flop ^= 1
181
- @pixel
182
- end
183
-
184
- def multicolor? = @mode_lookup.anybits?(BMM) || @cbuf.anybits?(0x08)
185
-
186
- def lookup(pixel)
187
- case @mode_lookup
188
- when 0 then pixel < 2 ? @registers.background : @cbuf
189
- when 1 then pixel == 3 ? @cbuf & 0x07 : @registers.background(pixel)
190
- when 2 then pixel < 2 ? @vbuf & 0x0f : @vbuf >> 4
191
- when 3 then multicolor_bitmap(pixel)
192
- when 4 then pixel < 2 ? @registers.background(@vbuf >> 6) : @cbuf
193
- else 0
194
- end
195
- end
196
-
197
- def multicolor_bitmap(pixel)
198
- case pixel
199
- when 0 then @registers.background
200
- when 1 then @vbuf >> 4
201
- when 2 then @vbuf & 0x0f
202
- else @cbuf
203
- end
204
- end
205
- end
206
- end
207
- end
@@ -1,81 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Badline
4
- class VIC
5
- # Mid-line writes to the sprite registers, keyed by the pixel at which
6
- # they become visible. Compositing replays the line through the log, so
7
- # each pixel is drawn with the register values that were in effect when
8
- # the VIC reached it.
9
- class RegisterLog
10
- def initialize(registers)
11
- @registers = registers
12
- @entries = []
13
- @seed = []
14
- @values = Array.new(2**6, 0)
15
- @cursor = 0
16
- @next_x = 0
17
- end
18
-
19
- # The pixel at which the next logged write takes effect.
20
- attr_reader :next_x
21
-
22
- # The entries as pixel, register and value in turn, the seed with -1
23
- # for a register the line hasn't logged, and a next pixel past the
24
- # last entry as -1.
25
- def save_state(out)
26
- out.ints(@entries.flatten)
27
- out.ints(@seed.map { |value| value.nil? ? -1 : value })
28
- out.ints(@values).int(@cursor).int(@next_x.infinite? ? -1 : @next_x)
29
- end
30
-
31
- def load_state(input)
32
- @entries.replace(input.ints.each_slice(3).to_a)
33
- @seed.replace(input.ints.map { |value| value.negative? ? nil : value })
34
- input.ints_into(@values)
35
- @cursor = input.int
36
- next_x = input.int
37
- @next_x = next_x.negative? ? Float::INFINITY : next_x
38
- end
39
-
40
- def empty? = @entries.empty?
41
- def length = @entries.length
42
-
43
- def clear
44
- return if @entries.empty?
45
-
46
- @entries.clear
47
- @seed.clear
48
- end
49
-
50
- def log(pixel_x, reg, old, value)
51
- @seed[reg] = old if @seed[reg].nil?
52
- @entries << [pixel_x, reg, value]
53
- end
54
-
55
- def prepare
56
- @entries.sort_by! { |entry| entry[0] }
57
- end
58
-
59
- # Restart the cursor before the line's first pixel, with every logged
60
- # register back at the value it held when the line started.
61
- def rewind
62
- @values.length.times { |reg| @values[reg] = @registers[reg] }
63
- @seed.each_with_index { |value, reg| @values[reg] = value unless value.nil? }
64
- @cursor = 0
65
- @next_x = @entries.empty? ? Float::INFINITY : @entries[0][0]
66
- end
67
-
68
- def [](reg) = @values[reg]
69
-
70
- # Apply every write visible at or before pixel_x.
71
- def advance(pixel_x)
72
- while @cursor < @entries.length && @entries[@cursor][0] <= pixel_x
73
- entry = @entries[@cursor]
74
- @values[entry[1]] = entry[2]
75
- @cursor += 1
76
- end
77
- @next_x = @cursor < @entries.length ? @entries[@cursor][0] : Float::INFINITY
78
- end
79
- end
80
- end
81
- end
@@ -1,195 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Badline
4
- class VIC
5
- # = VIC-II Registers
6
- #
7
- # == Sprite positions
8
- #
9
- # $D000: Sprite 0 X
10
- # $D001: Sprite 0 Y
11
- # $D002: Sprite 1 X
12
- # $D003: Sprite 1 Y
13
- # $D004: Sprite 2 X
14
- # $D005: Sprite 2 Y
15
- # $D006: Sprite 3 X
16
- # $D007: Sprite 3 Y
17
- # $D008: Sprite 4 X
18
- # $D009: Sprite 4 Y
19
- # $D00A: Sprite 5 X
20
- # $D00B: Sprite 5 Y
21
- # $D00C: Sprite 6 X
22
- # $D00D: Sprite 6 Y
23
- # $D00E: Sprite 7 X
24
- # $D00F: Sprite 7 Y
25
- #
26
- # $D010: Most Significant Bits of Sprites 0-7 Horizontal Position
27
- # $D011: Vertical Fine Scrolling and Control Register
28
- # $D012: Rasterline
29
- # - Read: Current rasterline
30
- # - Write: Set rasterline interrupt
31
- #
32
- # == Light pen
33
- #
34
- # $D013: Light Pen Horizontal Position
35
- # $D014: Light Pen Vertical Position
36
- #
37
- # $D015: Sprite Enable Register
38
- # $D016: Horizontal Fine Scrolling and Control Register
39
- # $D017: Sprite Vertical Expansion Register
40
- # $D018: VIC-II Chip Memory Control Register
41
- # $D019: VIC Interrupt Flag Register
42
- # $D01A: IRQ Mask Register
43
- # $D01B: Sprite to Foreground Display Priority Register
44
- # $D01C: Sprite Multicolor Registers
45
- # $D01D: Sprite Horizontal Expansion Register
46
- #
47
- # == Sprite collision detection
48
- #
49
- # $D01E: Sprite to Sprite Collision Register
50
- # $D01F: Sprite to Foreground Collision Register
51
- #
52
- # == Color registers
53
- #
54
- # All color registers are 4bit, bits 4-7 always read 1.
55
- #
56
- # $D020: Border color
57
- # $D021: Background color 0
58
- # $D022: Background color 1
59
- # $D023: Background color 2
60
- # $D024: Background color 3
61
- # $D025: Sprite multicolor 0
62
- # $D026: Sprite multicolor 1
63
- # $D027: Sprite 0 color
64
- # $D028: Sprite 1 color
65
- # $D029: Sprite 2 color
66
- # $D02A: Sprite 3 color
67
- # $D02B: Sprite 4 color
68
- # $D02C: Sprite 5 color
69
- # $D02D: Sprite 6 color
70
- # $D02E: Sprite 7 color
71
- #
72
- # == VIC-IIe (8566 and 8564)
73
- #
74
- # $D02F: Extra keyboard lines K0-K2 in bits 0-2, bits 3-7 read 1
75
- # $D030: FAST (2 MHz) in bit 0 and TEST in bit 1, bits 2-7 read 1
76
- #
77
- # $D02F-$D03F: Not in use on the 6569 and 8565, always reads 0xff,
78
- # and $D031-$D03F on the VIC-IIe
79
- # $D040-$D3FF: Repeat $D0000 to $D03F every 64 bytes
80
- class Registers
81
- include IntegerHelper
82
-
83
- # The raw register bytes, for the per-column reads on the hot path.
84
- attr_reader :bytes
85
-
86
- # Every register powers on as zero, as in VICE. A VIC-IIe reads
87
- # $D02F and $D030 back as registers.
88
- def initialize(iie: false)
89
- @bytes = Array.new(2**6, 0)
90
- @irq_line = false
91
- @iie = iie
92
- end
93
-
94
- # True while any enabled latch bit is set in $D019/$D01A. Cached and
95
- # re-evaluated on writes, since it's checked every cycle.
96
- def irq_line? = @irq_line
97
-
98
- def [](reg) = @bytes[reg]
99
-
100
- def read(reg)
101
- case reg
102
- when 0x16 then @bytes[reg] | 0xc0 # bits 7-6 unused, read 1
103
- when 0x18 then @bytes[reg] | 0x01 # bit 0 unused, reads 1
104
- when 0x1a, 0x20..0x2e then @bytes[reg] | 0xf0
105
- when 0x1e, 0x1f then read_clear(reg) # collision registers clear on read
106
- when 0x2f then @iie ? @bytes[reg] | 0xf8 : 0xff
107
- when 0x30 then @iie ? @bytes[reg] | 0xfc : 0xff
108
- when 0x31..0x3f then 0xff
109
- else @bytes[reg]
110
- end
111
- end
112
-
113
- def write(reg, value)
114
- case reg
115
- when 0x19 # write 1 to clear
116
- @bytes[reg] &= ~value
117
- update_irq_line
118
- when 0x1a # only the four latch bits
119
- @bytes[reg] = value & 0x0f
120
- update_irq_line
121
- when 0x1e, 0x1f then nil # the collision registers are read-only
122
- else @bytes[reg] = value
123
- end
124
- end
125
-
126
- # Graphics modes
127
- def ecm = @bytes[0x11][6]
128
- def bmm = @bytes[0x11][5]
129
- def mcm = @bytes[0x16][4]
130
- # ECM/BMM from $D011 bits 6-5, MCM from $D016 bit 4.
131
- def mode = ((@bytes[0x11] >> 4) & 0b110) | ((@bytes[0x16] >> 4) & 0b001)
132
-
133
- def xscroll = @bytes[0x16] & 0b0111
134
- def yscroll = @bytes[0x11] & 0b0111
135
-
136
- def rsel? = @bytes[0x11].anybits?(0x08)
137
- def csel? = @bytes[0x16].anybits?(0x08)
138
- def display_enabled? = @bytes[0x11].anybits?(0x10)
139
-
140
- def char_base = (@bytes[0x18] & 0b1110) * 0x400
141
- def bitmap_base = (@bytes[0x18] & 0b1000) * 0x400
142
- def screen_base = (@bytes[0x18] >> 4) * 0x400
143
-
144
- def border = @bytes[0x20] & 0x0f
145
- def background(index = 0) = @bytes[0x21 + index] & 0x0f
146
-
147
- # The VIC-IIe's $D02F and $D030 bits. The 6569 and 8565 drive no
148
- # extra keyboard lines and run at 1 MHz.
149
- def extra_keyboard_lines = @iie ? @bytes[0x2f] & 0x07 : 0x07
150
- def fast? = @iie && @bytes[0x30].anybits?(0x01)
151
- def test? = @iie && @bytes[0x30].anybits?(0x02)
152
-
153
- # FAST and TEST as bits 0 and 1.
154
- def clock_bits = @iie ? @bytes[0x30] & 0x03 : 0
155
-
156
- def raster_target = uint16(@bytes[0x12], (@bytes[0x11] & 0x80) >> 7)
157
-
158
- def latch_irq!(bit)
159
- @bytes[0x19] |= bit
160
- update_irq_line
161
- end
162
-
163
- def latch_raster_irq! = latch_irq!(0x01)
164
-
165
- def save_state(out)
166
- out.blob(@bytes).boolean(@irq_line)
167
- end
168
-
169
- def load_state(input)
170
- input.blob_into(@bytes)
171
- @irq_line = input.boolean?
172
- end
173
-
174
- def collide!(reg, bits)
175
- return false if bits.zero?
176
-
177
- was_zero = @bytes[reg].zero?
178
- @bytes[reg] |= bits
179
- was_zero
180
- end
181
-
182
- # Works the IRQ line out from $D019 and $D01A again, after the bytes
183
- # were set directly.
184
- def update_irq_line
185
- @irq_line = (@bytes[0x19] & @bytes[0x1a]).anybits?(0x0f)
186
- end
187
-
188
- private
189
-
190
- def read_clear(reg)
191
- @bytes[reg].tap { @bytes[reg] = 0 }
192
- end
193
- end
194
- end
195
- end