badline 0.12.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (516) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +25 -0
  3. data/CLAUDE.md +59 -31
  4. data/README.md +1 -1
  5. data/doc/library.md +9 -9
  6. data/doc/pinned-behaviour.md +105 -105
  7. data/doc/snapshots.md +1 -4
  8. data/lib/badline/audio/bare_player.rb +4 -4
  9. data/lib/badline/audio/cli.rb +6 -6
  10. data/lib/badline/audio/jukebox.rb +2 -2
  11. data/lib/badline/audio/machine_player.rb +2 -2
  12. data/lib/badline/{media → audio}/queue.rb +1 -1
  13. data/lib/badline/audio/queued_tune.rb +6 -6
  14. data/lib/badline/audio/renderer.rb +5 -5
  15. data/lib/badline/audio/stereo.rb +1 -1
  16. data/lib/badline/c128/{bus_state.rb → bus/saved_state.rb} +6 -6
  17. data/lib/badline/c128/bus.rb +30 -51
  18. data/lib/badline/c128/color_lines.rb +2 -2
  19. data/lib/badline/c128/cpu.rb +1 -1
  20. data/lib/badline/c128/drives.rb +10 -11
  21. data/lib/badline/c128/fast_serial.rb +5 -5
  22. data/lib/badline/c128/mmu_pages.rb +1 -1
  23. data/lib/badline/c128/modes.rb +2 -2
  24. data/lib/badline/c128/saved_state.rb +21 -47
  25. data/lib/badline/c128/z80.rb +2 -2
  26. data/lib/badline/c128.rb +18 -72
  27. data/lib/badline/{computer → c64}/attachments.rb +16 -47
  28. data/lib/badline/c64/banked_ram/banking.rb +32 -0
  29. data/lib/badline/c64/banked_ram/plus256k.rb +56 -0
  30. data/lib/badline/c64/banked_ram/plus60k.rb +45 -0
  31. data/lib/badline/c64/banked_ram/unexpanded.rb +30 -0
  32. data/lib/badline/c64/banked_ram.rb +23 -0
  33. data/lib/badline/c64/bus/extra_sids.rb +32 -0
  34. data/lib/badline/c64/bus/fittings.rb +40 -0
  35. data/lib/badline/c64/bus/pla.rb +149 -0
  36. data/lib/badline/c64/bus/roms.rb +41 -0
  37. data/lib/badline/c64/bus/saved_state.rb +68 -0
  38. data/lib/badline/c64/bus/sid_slots.rb +44 -0
  39. data/lib/badline/c64/bus.rb +218 -0
  40. data/lib/badline/c64/cartridge/action_replay.rb +128 -0
  41. data/lib/badline/c64/cartridge/atomic_power.rb +26 -0
  42. data/lib/badline/c64/cartridge/bank.rb +83 -0
  43. data/lib/badline/c64/cartridge/comal80.rb +52 -0
  44. data/lib/badline/c64/cartridge/dinamic.rb +36 -0
  45. data/lib/badline/c64/cartridge/easy_flash.rb +147 -0
  46. data/lib/badline/c64/cartridge/epyx_fastload.rb +81 -0
  47. data/lib/badline/c64/cartridge/final_cartridge3.rb +91 -0
  48. data/lib/badline/c64/cartridge/flash/saved_state.rb +40 -0
  49. data/lib/badline/c64/cartridge/flash.rb +279 -0
  50. data/lib/badline/c64/cartridge/freezer.rb +35 -0
  51. data/lib/badline/c64/cartridge/fun_play.rb +40 -0
  52. data/lib/badline/c64/cartridge/g_mod2.rb +76 -0
  53. data/lib/badline/c64/cartridge/game_system.rb +42 -0
  54. data/lib/badline/c64/cartridge/geo_ram.rb +81 -0
  55. data/lib/badline/c64/cartridge/kcs_power.rb +77 -0
  56. data/lib/badline/c64/cartridge/mach5.rb +34 -0
  57. data/lib/badline/c64/cartridge/magic_desk.rb +32 -0
  58. data/lib/badline/c64/cartridge/ocean.rb +37 -0
  59. data/lib/badline/c64/cartridge/pagefox.rb +70 -0
  60. data/lib/badline/c64/cartridge/retro_replay/saved_state.rb +47 -0
  61. data/lib/badline/c64/cartridge/retro_replay.rb +286 -0
  62. data/lib/badline/c64/cartridge/rex_utility.rb +31 -0
  63. data/lib/badline/c64/cartridge/rgcd.rb +60 -0
  64. data/lib/badline/c64/cartridge/saved_state.rb +63 -0
  65. data/lib/badline/c64/cartridge/simons_basic.rb +37 -0
  66. data/lib/badline/c64/cartridge/standard.rb +17 -0
  67. data/lib/badline/c64/cartridge/super_games.rb +50 -0
  68. data/lib/badline/c64/cartridge/westermann.rb +32 -0
  69. data/lib/badline/c64/cartridge/zaxxon.rb +68 -0
  70. data/lib/badline/c64/cartridge.rb +258 -0
  71. data/lib/badline/c64/color_memory.rb +27 -0
  72. data/lib/badline/c64/common.rb +34 -0
  73. data/lib/badline/c64/kernal_traps.rb +89 -0
  74. data/lib/badline/c64/reu/dma/saved_state.rb +52 -0
  75. data/lib/badline/c64/reu/dma.rb +275 -0
  76. data/lib/badline/c64/reu/ram.rb +109 -0
  77. data/lib/badline/c64/reu/saved_state.rb +55 -0
  78. data/lib/badline/c64/reu/trigger.rb +34 -0
  79. data/lib/badline/c64/reu.rb +291 -0
  80. data/lib/badline/{computer → c64}/saved_state.rb +13 -18
  81. data/lib/badline/{computer → c64}/true_drives.rb +20 -31
  82. data/lib/badline/{computer.rb → c64.rb} +22 -80
  83. data/lib/badline/chips/cia/fast_forward.rb +62 -0
  84. data/lib/badline/chips/cia/interrupt_register.rb +145 -0
  85. data/lib/badline/chips/cia/saved_state.rb +49 -0
  86. data/lib/badline/chips/cia/serial/saved_state.rb +45 -0
  87. data/lib/badline/chips/cia/serial.rb +250 -0
  88. data/lib/badline/chips/cia/time_of_day.rb +232 -0
  89. data/lib/badline/chips/cia/timer.rb +208 -0
  90. data/lib/badline/chips/cia.rb +281 -0
  91. data/lib/badline/chips/cpu/addressing.rb +133 -0
  92. data/lib/badline/chips/cpu/boundary.rb +56 -0
  93. data/lib/badline/chips/cpu/core.rb +167 -0
  94. data/lib/badline/chips/cpu/instruction.rb +338 -0
  95. data/lib/badline/chips/cpu/instruction_set/arithmetic.rb +118 -0
  96. data/lib/badline/chips/cpu/instruction_set/bitwise.rb +130 -0
  97. data/lib/badline/chips/cpu/instruction_set/branch.rb +83 -0
  98. data/lib/badline/chips/cpu/instruction_set/flag.rb +67 -0
  99. data/lib/badline/chips/cpu/instruction_set/illegal.rb +274 -0
  100. data/lib/badline/chips/cpu/instruction_set/inc_dec.rb +73 -0
  101. data/lib/badline/chips/cpu/instruction_set/stack.rb +56 -0
  102. data/lib/badline/chips/cpu/instruction_set/transfer.rb +141 -0
  103. data/lib/badline/chips/cpu/instruction_set.rb +59 -0
  104. data/lib/badline/chips/cpu/interrupts.rb +108 -0
  105. data/lib/badline/chips/cpu/microcode.rb +179 -0
  106. data/lib/badline/chips/cpu/operations.rb +90 -0
  107. data/lib/badline/chips/cpu/port.rb +116 -0
  108. data/lib/badline/chips/cpu/saved_state.rb +117 -0
  109. data/lib/badline/chips/cpu/stack_operations.rb +84 -0
  110. data/lib/badline/chips/cpu/traps.rb +23 -0
  111. data/lib/badline/chips/cpu.rb +12 -0
  112. data/lib/badline/chips/sid/catch_up.rb +122 -0
  113. data/lib/badline/chips/sid/decimator.rb +66 -0
  114. data/lib/badline/chips/sid/envelope/saved_state.rb +70 -0
  115. data/lib/badline/chips/sid/envelope.rb +241 -0
  116. data/lib/badline/chips/sid/filter/saved_state.rb +42 -0
  117. data/lib/badline/chips/sid/filter.rb +241 -0
  118. data/lib/badline/chips/sid/saved_state.rb +52 -0
  119. data/lib/badline/chips/sid/voice.rb +79 -0
  120. data/lib/badline/chips/sid/waveform/combined.rb +128 -0
  121. data/lib/badline/chips/sid/waveform/fast_forward.rb +107 -0
  122. data/lib/badline/chips/sid/waveform/noise_writeback.rb +124 -0
  123. data/lib/badline/chips/sid/waveform/saved_state.rb +68 -0
  124. data/lib/badline/chips/sid/waveform.rb +307 -0
  125. data/lib/badline/chips/sid.rb +265 -0
  126. data/lib/badline/{c128 → chips}/vdc/memory.rb +1 -1
  127. data/lib/badline/{c128 → chips}/vdc/painter.rb +1 -1
  128. data/lib/badline/{c128 → chips}/vdc/raster.rb +1 -1
  129. data/lib/badline/chips/vdc/saved_state.rb +36 -0
  130. data/lib/badline/{c128 → chips}/vdc/window.rb +1 -1
  131. data/lib/badline/{c128 → chips}/vdc.rb +7 -31
  132. data/lib/badline/chips/via/control_lines.rb +124 -0
  133. data/lib/badline/chips/via/fast_forward.rb +55 -0
  134. data/lib/badline/chips/via/interrupt_register.rb +69 -0
  135. data/lib/badline/chips/via/saved_state.rb +44 -0
  136. data/lib/badline/chips/via/shift_register.rb +182 -0
  137. data/lib/badline/chips/via/timer1.rb +133 -0
  138. data/lib/badline/chips/via/timer2.rb +135 -0
  139. data/lib/badline/chips/via.rb +268 -0
  140. data/lib/badline/chips/vic/bank.rb +135 -0
  141. data/lib/badline/chips/vic/border_mask.rb +88 -0
  142. data/lib/badline/chips/vic/collisions.rb +117 -0
  143. data/lib/badline/chips/vic/color_patches.rb +49 -0
  144. data/lib/badline/chips/vic/display_state.rb +187 -0
  145. data/lib/badline/chips/vic/graphics_mode.rb +166 -0
  146. data/lib/badline/chips/vic/graphics_shifter/saved_state.rb +40 -0
  147. data/lib/badline/chips/vic/graphics_shifter.rb +187 -0
  148. data/lib/badline/chips/vic/register_log.rb +83 -0
  149. data/lib/badline/chips/vic/registers.rb +197 -0
  150. data/lib/badline/chips/vic/saved_state.rb +82 -0
  151. data/lib/badline/chips/vic/sequencer/saved_state.rb +91 -0
  152. data/lib/badline/chips/vic/sequencer.rb +277 -0
  153. data/lib/badline/chips/vic/sequencer_output.rb +118 -0
  154. data/lib/badline/chips/vic/sprite/internal_bus.rb +70 -0
  155. data/lib/badline/chips/vic/sprite/saved_state.rb +66 -0
  156. data/lib/badline/chips/vic/sprite/shifter.rb +148 -0
  157. data/lib/badline/chips/vic/sprite/timing.rb +58 -0
  158. data/lib/badline/chips/vic/sprite.rb +339 -0
  159. data/lib/badline/chips/vic/sprites/saved_state.rb +59 -0
  160. data/lib/badline/chips/vic/sprites.rb +284 -0
  161. data/lib/badline/chips/vic.rb +783 -0
  162. data/lib/badline/chips/vic_i/painter/saved_state.rb +40 -0
  163. data/lib/badline/{vic20/vic → chips/vic_i}/painter.rb +6 -30
  164. data/lib/badline/{vic20/vic → chips/vic_i}/saved_state.rb +2 -2
  165. data/lib/badline/chips/vic_i/sound/output.rb +85 -0
  166. data/lib/badline/chips/vic_i/sound.rb +235 -0
  167. data/lib/badline/{vic20/vic → chips/vic_i}/text_window.rb +2 -2
  168. data/lib/badline/{vic20/vic.rb → chips/vic_i.rb} +5 -5
  169. data/lib/badline/chips/z80/arithmetic.rb +119 -0
  170. data/lib/badline/chips/z80/bit_page.rb +57 -0
  171. data/lib/badline/chips/z80/block_io.rb +60 -0
  172. data/lib/badline/chips/z80/block_transfers.rb +61 -0
  173. data/lib/badline/chips/z80/bus_cycles.rb +113 -0
  174. data/lib/badline/chips/z80/core.rb +115 -0
  175. data/lib/badline/chips/z80/exchanges.rb +52 -0
  176. data/lib/badline/chips/z80/extended_page.rb +91 -0
  177. data/lib/badline/chips/z80/flags.rb +39 -0
  178. data/lib/badline/chips/z80/interrupt_acceptance.rb +48 -0
  179. data/lib/badline/chips/z80/jumps.rb +84 -0
  180. data/lib/badline/chips/z80/loads.rb +100 -0
  181. data/lib/badline/chips/z80/main_page.rb +136 -0
  182. data/lib/badline/chips/z80/registers.rb +122 -0
  183. data/lib/badline/chips/z80/saved_state.rb +71 -0
  184. data/lib/badline/chips/z80/shifts.rb +66 -0
  185. data/lib/badline/chips/z80.rb +13 -0
  186. data/lib/badline/core.rb +27 -29
  187. data/lib/badline/drives/datasette/saved_state.rb +37 -0
  188. data/lib/badline/drives/datasette.rb +140 -0
  189. data/lib/badline/drives/engine/core.rb +149 -0
  190. data/lib/badline/drives/engine/fast_serial.rb +75 -0
  191. data/lib/badline/drives/engine/idle.rb +127 -0
  192. data/lib/badline/drives/engine/idle_cpu.rb +30 -0
  193. data/lib/badline/drives/engine/orbit.rb +81 -0
  194. data/lib/badline/drives/engine/serial_lines.rb +75 -0
  195. data/lib/badline/drives/engine/sleep.rb +114 -0
  196. data/lib/badline/drives/engine/vias.rb +86 -0
  197. data/lib/badline/drives/engine/watch.rb +152 -0
  198. data/lib/badline/drives/engine.rb +11 -0
  199. data/lib/badline/drives/model1541/bus.rb +88 -0
  200. data/lib/badline/drives/model1541/byte_ready.rb +50 -0
  201. data/lib/badline/drives/model1541/cpu.rb +13 -0
  202. data/lib/badline/drives/model1541/disk/saved_state.rb +88 -0
  203. data/lib/badline/drives/model1541/disk.rb +317 -0
  204. data/lib/badline/drives/model1541/disk_via.rb +38 -0
  205. data/lib/badline/drives/model1541/gcr.rb +59 -0
  206. data/lib/badline/drives/model1541/mechanism/saved_state.rb +72 -0
  207. data/lib/badline/drives/model1541/mechanism.rb +315 -0
  208. data/lib/badline/drives/model1541/rotation.rb +123 -0
  209. data/lib/badline/drives/model1541/saved_state.rb +44 -0
  210. data/lib/badline/drives/model1541/sector_reader.rb +78 -0
  211. data/lib/badline/drives/model1541/serial_port.rb +20 -0
  212. data/lib/badline/drives/model1541/track.rb +100 -0
  213. data/lib/badline/drives/model1541.rb +81 -0
  214. data/lib/badline/drives/model1571/bus.rb +113 -0
  215. data/lib/badline/drives/model1571/cpu.rb +13 -0
  216. data/lib/badline/drives/model1571/saved_state.rb +47 -0
  217. data/lib/badline/drives/model1571/serial_port.rb +39 -0
  218. data/lib/badline/drives/model1571/serial_via.rb +27 -0
  219. data/lib/badline/drives/model1571/wd1770.rb +122 -0
  220. data/lib/badline/drives/model1571.rb +142 -0
  221. data/lib/badline/drives/model1581/bus.rb +139 -0
  222. data/lib/badline/drives/model1581/cpu.rb +13 -0
  223. data/lib/badline/drives/model1581/disk/saved_state.rb +89 -0
  224. data/lib/badline/drives/model1581/disk.rb +137 -0
  225. data/lib/badline/drives/model1581/mechanism.rb +119 -0
  226. data/lib/badline/drives/model1581/saved_state.rb +42 -0
  227. data/lib/badline/drives/model1581/serial_port.rb +54 -0
  228. data/lib/badline/drives/model1581/slot.rb +79 -0
  229. data/lib/badline/drives/model1581/track.rb +102 -0
  230. data/lib/badline/drives/model1581/track_bytes.rb +77 -0
  231. data/lib/badline/drives/model1581/wd1772/registers.rb +91 -0
  232. data/lib/badline/drives/model1581/wd1772/saved_state.rb +68 -0
  233. data/lib/badline/drives/model1581/wd1772/sector_writes.rb +75 -0
  234. data/lib/badline/drives/model1581/wd1772/sectors.rb +152 -0
  235. data/lib/badline/drives/model1581/wd1772/stepping.rb +111 -0
  236. data/lib/badline/drives/model1581/wd1772/tracks.rb +127 -0
  237. data/lib/badline/drives/model1581/wd1772/turn.rb +75 -0
  238. data/lib/badline/drives/model1581/wd1772.rb +218 -0
  239. data/lib/badline/drives/model1581.rb +206 -0
  240. data/lib/badline/drives/serial_bus.rb +161 -0
  241. data/lib/badline/frontend/boot.rb +10 -61
  242. data/lib/badline/frontend/machine_window.rb +3 -1
  243. data/lib/badline/frontend/player/filter_view.rb +1 -1
  244. data/lib/badline/frontend/player/player_controller.rb +2 -2
  245. data/lib/badline/frontend/player/player_screen.rb +1 -0
  246. data/lib/badline/frontend/player/theme.rb +7 -7
  247. data/lib/badline/frontend/timeline.rb +3 -3
  248. data/lib/badline/input/control_ports.rb +78 -0
  249. data/lib/badline/input/joystick.rb +27 -0
  250. data/lib/badline/input/keyboard.rb +114 -0
  251. data/lib/badline/input.rb +3 -0
  252. data/lib/badline/kernal_trap/{drive → dos}/block_commands.rb +1 -1
  253. data/lib/badline/kernal_trap/dos/channel.rb +183 -0
  254. data/lib/badline/kernal_trap/{drive → dos}/channels.rb +1 -1
  255. data/lib/badline/kernal_trap/{drive → dos}/memory.rb +1 -1
  256. data/lib/badline/kernal_trap/{drive → dos}/parameters.rb +1 -1
  257. data/lib/badline/kernal_trap/{drive → dos}/status.rb +1 -1
  258. data/lib/badline/kernal_trap/{drive → dos}/write_file.rb +1 -1
  259. data/lib/badline/kernal_trap/{drive → dos}/writes.rb +1 -1
  260. data/lib/badline/kernal_trap/{drive.rb → dos.rb} +11 -10
  261. data/lib/badline/kernal_trap/{file.rb → file_routine.rb} +1 -1
  262. data/lib/badline/kernal_trap/load.rb +6 -6
  263. data/lib/badline/kernal_trap/save.rb +5 -5
  264. data/lib/badline/kernal_trap/serial.rb +7 -7
  265. data/lib/badline/kernal_trap.rb +2 -3
  266. data/lib/badline/machine/clocking.rb +50 -0
  267. data/lib/badline/machine.rb +63 -7
  268. data/lib/badline/media/boot_disk.rb +2 -2
  269. data/lib/badline/media/disk_list.rb +3 -3
  270. data/lib/badline/media/disk_set.rb +1 -1
  271. data/lib/badline/media/extensions.rb +33 -0
  272. data/lib/badline/media/program.rb +28 -0
  273. data/lib/badline/media/true_drive.rb +4 -3
  274. data/lib/badline/media/tune.rb +35 -0
  275. data/lib/badline/media/vic20_cartridge.rb +1 -7
  276. data/lib/badline/media/vic20_media.rb +38 -80
  277. data/lib/badline/media.rb +84 -81
  278. data/lib/badline/model.rb +1 -1
  279. data/lib/badline/options/event.rb +3 -1
  280. data/lib/badline/roms/README +6 -6
  281. data/lib/badline/sdl.rb +1 -0
  282. data/lib/badline/{storage/sid_file.rb → sid_tune/file.rb} +3 -3
  283. data/lib/badline/{storage → sid_tune}/hvsc.rb +7 -7
  284. data/lib/badline/{storage → sid_tune}/song_lengths.rb +2 -2
  285. data/lib/badline/{storage → sid_tune}/stil/credit.rb +1 -1
  286. data/lib/badline/{storage → sid_tune}/stil.rb +3 -3
  287. data/lib/badline/sid_tune.rb +6 -0
  288. data/lib/badline/snapshot/c128_setup.rb +43 -0
  289. data/lib/badline/snapshot/c64_setup.rb +79 -0
  290. data/lib/badline/snapshot/image.rb +5 -25
  291. data/lib/badline/snapshot/machine_state.rb +10 -2
  292. data/lib/badline/snapshot/setup.rb +22 -66
  293. data/lib/badline/snapshot/state.rb +8 -17
  294. data/lib/badline/snapshot/storage_setup.rb +68 -0
  295. data/lib/badline/snapshot/vic20_setup.rb +37 -0
  296. data/lib/badline/snapshot/vice/c64_mem.rb +1 -1
  297. data/lib/badline/snapshot/vice/restore.rb +1 -1
  298. data/lib/badline/snapshot/vice/reu1764.rb +1 -1
  299. data/lib/badline/snapshot/vice/reu_fields.rb +40 -0
  300. data/lib/badline/snapshot/vice.rb +7 -5
  301. data/lib/badline/snapshot.rb +13 -12
  302. data/lib/badline/storage/d64_image.rb +15 -9
  303. data/lib/badline/storage/d71_image.rb +0 -2
  304. data/lib/badline/storage/d81_image.rb +0 -2
  305. data/lib/badline/storage/disk_image/writing.rb +2 -2
  306. data/lib/badline/storage/disk_image.rb +3 -6
  307. data/lib/badline/storage/g64_image.rb +2 -2
  308. data/lib/badline/storage/host_directory.rb +0 -5
  309. data/lib/badline/storage/t64.rb +2 -8
  310. data/lib/badline/storage/unavailable.rb +1 -1
  311. data/lib/badline/storage.rb +0 -37
  312. data/lib/badline/support/c128_checkpoint.rb +39 -0
  313. data/lib/badline/support/checkpoint.rb +108 -0
  314. data/lib/badline/support/vic20_checkpoint.rb +38 -0
  315. data/lib/badline/support.rb +5 -0
  316. data/lib/badline/version.rb +1 -1
  317. data/lib/badline/vic20/attachments.rb +11 -81
  318. data/lib/badline/vic20/bus/saved_state.rb +35 -0
  319. data/lib/badline/vic20/bus.rb +3 -25
  320. data/lib/badline/vic20/cpu.rb +1 -1
  321. data/lib/badline/vic20/port_wiring.rb +4 -4
  322. data/lib/badline/vic20/saved_state.rb +16 -60
  323. data/lib/badline/vic20/user_via_ports.rb +2 -2
  324. data/lib/badline/vic20.rb +20 -51
  325. metadata +250 -221
  326. data/lib/badline/address_bus/extra_sids.rb +0 -30
  327. data/lib/badline/address_bus/fittings.rb +0 -38
  328. data/lib/badline/address_bus/pla.rb +0 -147
  329. data/lib/badline/address_bus/roms.rb +0 -39
  330. data/lib/badline/address_bus/saved_state.rb +0 -72
  331. data/lib/badline/address_bus/sid_slots.rb +0 -42
  332. data/lib/badline/address_bus.rb +0 -235
  333. data/lib/badline/cartridge/action_replay.rb +0 -126
  334. data/lib/badline/cartridge/atomic_power.rb +0 -24
  335. data/lib/badline/cartridge/bank.rb +0 -81
  336. data/lib/badline/cartridge/comal80.rb +0 -50
  337. data/lib/badline/cartridge/dinamic.rb +0 -34
  338. data/lib/badline/cartridge/easy_flash.rb +0 -145
  339. data/lib/badline/cartridge/epyx_fastload.rb +0 -79
  340. data/lib/badline/cartridge/final_cartridge3.rb +0 -89
  341. data/lib/badline/cartridge/flash.rb +0 -306
  342. data/lib/badline/cartridge/freezer.rb +0 -33
  343. data/lib/badline/cartridge/fun_play.rb +0 -38
  344. data/lib/badline/cartridge/g_mod2.rb +0 -74
  345. data/lib/badline/cartridge/game_system.rb +0 -40
  346. data/lib/badline/cartridge/geo_ram.rb +0 -79
  347. data/lib/badline/cartridge/kcs_power.rb +0 -75
  348. data/lib/badline/cartridge/mach5.rb +0 -32
  349. data/lib/badline/cartridge/magic_desk.rb +0 -30
  350. data/lib/badline/cartridge/ocean.rb +0 -35
  351. data/lib/badline/cartridge/pagefox.rb +0 -68
  352. data/lib/badline/cartridge/retro_replay.rb +0 -320
  353. data/lib/badline/cartridge/rex_utility.rb +0 -29
  354. data/lib/badline/cartridge/rgcd.rb +0 -58
  355. data/lib/badline/cartridge/simons_basic.rb +0 -35
  356. data/lib/badline/cartridge/standard.rb +0 -15
  357. data/lib/badline/cartridge/super_games.rb +0 -48
  358. data/lib/badline/cartridge/westermann.rb +0 -30
  359. data/lib/badline/cartridge/zaxxon.rb +0 -66
  360. data/lib/badline/cartridge.rb +0 -303
  361. data/lib/badline/checkpoint.rb +0 -98
  362. data/lib/badline/cia/fast_forward.rb +0 -60
  363. data/lib/badline/cia/interrupt_register.rb +0 -143
  364. data/lib/badline/cia/serial.rb +0 -275
  365. data/lib/badline/cia/state.rb +0 -47
  366. data/lib/badline/cia/timer.rb +0 -206
  367. data/lib/badline/cia.rb +0 -279
  368. data/lib/badline/color_memory.rb +0 -25
  369. data/lib/badline/computer/kernal_traps.rb +0 -29
  370. data/lib/badline/control_ports.rb +0 -76
  371. data/lib/badline/cpu/addressing.rb +0 -131
  372. data/lib/badline/cpu/boundary.rb +0 -54
  373. data/lib/badline/cpu/core.rb +0 -165
  374. data/lib/badline/cpu/microcode.rb +0 -177
  375. data/lib/badline/cpu/operations.rb +0 -88
  376. data/lib/badline/cpu/saved_state.rb +0 -115
  377. data/lib/badline/cpu/stack_operations.rb +0 -82
  378. data/lib/badline/cpu.rb +0 -10
  379. data/lib/badline/cycleable.rb +0 -38
  380. data/lib/badline/datasette.rb +0 -161
  381. data/lib/badline/drive/core.rb +0 -147
  382. data/lib/badline/drive/fast_serial.rb +0 -73
  383. data/lib/badline/drive/idle.rb +0 -125
  384. data/lib/badline/drive/idle_cpu.rb +0 -28
  385. data/lib/badline/drive/orbit.rb +0 -79
  386. data/lib/badline/drive/serial_lines.rb +0 -73
  387. data/lib/badline/drive/sleep.rb +0 -112
  388. data/lib/badline/drive/vias.rb +0 -84
  389. data/lib/badline/drive/watch.rb +0 -150
  390. data/lib/badline/drive.rb +0 -11
  391. data/lib/badline/drive1541/bus.rb +0 -86
  392. data/lib/badline/drive1541/byte_ready.rb +0 -48
  393. data/lib/badline/drive1541/cpu.rb +0 -11
  394. data/lib/badline/drive1541/disk.rb +0 -318
  395. data/lib/badline/drive1541/disk_state.rb +0 -94
  396. data/lib/badline/drive1541/disk_via.rb +0 -36
  397. data/lib/badline/drive1541/gcr.rb +0 -57
  398. data/lib/badline/drive1541/mechanism.rb +0 -313
  399. data/lib/badline/drive1541/mechanism_state.rb +0 -68
  400. data/lib/badline/drive1541/rotation.rb +0 -121
  401. data/lib/badline/drive1541/sector_reader.rb +0 -76
  402. data/lib/badline/drive1541/serial_port.rb +0 -18
  403. data/lib/badline/drive1541/track.rb +0 -98
  404. data/lib/badline/drive1541.rb +0 -111
  405. data/lib/badline/drive1571/bus.rb +0 -111
  406. data/lib/badline/drive1571/cpu.rb +0 -11
  407. data/lib/badline/drive1571/serial_port.rb +0 -37
  408. data/lib/badline/drive1571/serial_via.rb +0 -25
  409. data/lib/badline/drive1571/wd1770.rb +0 -120
  410. data/lib/badline/drive1571.rb +0 -175
  411. data/lib/badline/drive1581/bus.rb +0 -137
  412. data/lib/badline/drive1581/cpu.rb +0 -11
  413. data/lib/badline/drive1581/disk.rb +0 -135
  414. data/lib/badline/drive1581/disk_state.rb +0 -87
  415. data/lib/badline/drive1581/mechanism.rb +0 -117
  416. data/lib/badline/drive1581/serial_port.rb +0 -52
  417. data/lib/badline/drive1581/slot.rb +0 -78
  418. data/lib/badline/drive1581/track.rb +0 -100
  419. data/lib/badline/drive1581/track_bytes.rb +0 -75
  420. data/lib/badline/drive1581/wd1772/registers.rb +0 -89
  421. data/lib/badline/drive1581/wd1772/sector_writes.rb +0 -73
  422. data/lib/badline/drive1581/wd1772/sectors.rb +0 -150
  423. data/lib/badline/drive1581/wd1772/state.rb +0 -66
  424. data/lib/badline/drive1581/wd1772/stepping.rb +0 -109
  425. data/lib/badline/drive1581/wd1772/tracks.rb +0 -125
  426. data/lib/badline/drive1581/wd1772/turn.rb +0 -73
  427. data/lib/badline/drive1581/wd1772.rb +0 -216
  428. data/lib/badline/drive1581.rb +0 -233
  429. data/lib/badline/iec_bus.rb +0 -159
  430. data/lib/badline/instruction.rb +0 -334
  431. data/lib/badline/instruction_set/arithmetic.rb +0 -114
  432. data/lib/badline/instruction_set/bitwise.rb +0 -126
  433. data/lib/badline/instruction_set/branch.rb +0 -79
  434. data/lib/badline/instruction_set/flag.rb +0 -63
  435. data/lib/badline/instruction_set/illegal.rb +0 -270
  436. data/lib/badline/instruction_set/inc_dec.rb +0 -69
  437. data/lib/badline/instruction_set/stack.rb +0 -52
  438. data/lib/badline/instruction_set/transfer.rb +0 -137
  439. data/lib/badline/instruction_set.rb +0 -55
  440. data/lib/badline/interrupts.rb +0 -104
  441. data/lib/badline/joystick.rb +0 -25
  442. data/lib/badline/kernal_trap/channel.rb +0 -181
  443. data/lib/badline/keyboard.rb +0 -112
  444. data/lib/badline/ram_expansion/banking.rb +0 -30
  445. data/lib/badline/ram_expansion/plus256k.rb +0 -54
  446. data/lib/badline/ram_expansion/plus60k.rb +0 -43
  447. data/lib/badline/ram_expansion/unexpanded.rb +0 -28
  448. data/lib/badline/ram_expansion.rb +0 -21
  449. data/lib/badline/reu/dma/saved_state.rb +0 -50
  450. data/lib/badline/reu/dma.rb +0 -273
  451. data/lib/badline/reu/ram.rb +0 -107
  452. data/lib/badline/reu/saved_state.rb +0 -80
  453. data/lib/badline/reu/trigger.rb +0 -32
  454. data/lib/badline/reu.rb +0 -289
  455. data/lib/badline/sid/catch_up.rb +0 -120
  456. data/lib/badline/sid/decimator.rb +0 -64
  457. data/lib/badline/sid/envelope/state.rb +0 -68
  458. data/lib/badline/sid/envelope.rb +0 -239
  459. data/lib/badline/sid/filter.rb +0 -263
  460. data/lib/badline/sid/voice.rb +0 -77
  461. data/lib/badline/sid/waveform/combined.rb +0 -126
  462. data/lib/badline/sid/waveform/fast_forward.rb +0 -105
  463. data/lib/badline/sid/waveform/noise_writeback.rb +0 -122
  464. data/lib/badline/sid/waveform/state.rb +0 -66
  465. data/lib/badline/sid/waveform.rb +0 -305
  466. data/lib/badline/sid.rb +0 -303
  467. data/lib/badline/time_of_day.rb +0 -228
  468. data/lib/badline/traps.rb +0 -19
  469. data/lib/badline/via/control_lines.rb +0 -122
  470. data/lib/badline/via/fast_forward.rb +0 -53
  471. data/lib/badline/via/interrupt_register.rb +0 -67
  472. data/lib/badline/via/shift_register.rb +0 -180
  473. data/lib/badline/via/state.rb +0 -42
  474. data/lib/badline/via/timer1.rb +0 -131
  475. data/lib/badline/via/timer2.rb +0 -133
  476. data/lib/badline/via.rb +0 -266
  477. data/lib/badline/vic/bank.rb +0 -133
  478. data/lib/badline/vic/border_mask.rb +0 -86
  479. data/lib/badline/vic/collisions.rb +0 -115
  480. data/lib/badline/vic/color_patches.rb +0 -47
  481. data/lib/badline/vic/display_state.rb +0 -185
  482. data/lib/badline/vic/graphics_mode.rb +0 -164
  483. data/lib/badline/vic/graphics_shifter.rb +0 -207
  484. data/lib/badline/vic/register_log.rb +0 -81
  485. data/lib/badline/vic/registers.rb +0 -195
  486. data/lib/badline/vic/sequencer.rb +0 -275
  487. data/lib/badline/vic/sequencer_output.rb +0 -116
  488. data/lib/badline/vic/sequencer_state.rb +0 -89
  489. data/lib/badline/vic/sprite/internal_bus.rb +0 -68
  490. data/lib/badline/vic/sprite/saved_state.rb +0 -64
  491. data/lib/badline/vic/sprite/shifter.rb +0 -146
  492. data/lib/badline/vic/sprite/timing.rb +0 -56
  493. data/lib/badline/vic/sprite.rb +0 -337
  494. data/lib/badline/vic/sprites.rb +0 -282
  495. data/lib/badline/vic/sprites_state.rb +0 -57
  496. data/lib/badline/vic.rb +0 -852
  497. data/lib/badline/vic20/sound/output.rb +0 -83
  498. data/lib/badline/vic20/sound.rb +0 -233
  499. data/lib/badline/z80/arithmetic.rb +0 -117
  500. data/lib/badline/z80/bit_page.rb +0 -55
  501. data/lib/badline/z80/block_io.rb +0 -58
  502. data/lib/badline/z80/block_transfers.rb +0 -59
  503. data/lib/badline/z80/bus_cycles.rb +0 -111
  504. data/lib/badline/z80/core.rb +0 -113
  505. data/lib/badline/z80/exchanges.rb +0 -50
  506. data/lib/badline/z80/extended_page.rb +0 -89
  507. data/lib/badline/z80/flags.rb +0 -37
  508. data/lib/badline/z80/interrupt_acceptance.rb +0 -46
  509. data/lib/badline/z80/jumps.rb +0 -82
  510. data/lib/badline/z80/loads.rb +0 -98
  511. data/lib/badline/z80/main_page.rb +0 -134
  512. data/lib/badline/z80/registers.rb +0 -120
  513. data/lib/badline/z80/saved_state.rb +0 -69
  514. data/lib/badline/z80/shifts.rb +0 -64
  515. data/lib/badline/z80.rb +0 -11
  516. /data/lib/badline/snapshot/{fields.rb → vice/fields.rb} +0 -0
data/lib/badline/reu.rb DELETED
@@ -1,289 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "badline/reu/ram"
4
- require "badline/reu/dma"
5
- require "badline/reu/trigger"
6
- require "badline/reu/saved_state"
7
-
8
- module Badline
9
- # A RAM Expansion Unit: the Commodore 1700 (128K), 1764 (256K) and 1750
10
- # (512K), and the bigger units built around the same 8726 RAM Expansion
11
- # Controller (REC), such as the CMD 1750XL, up to 16M.
12
- #
13
- # The REC's eleven registers sit in I/O 2 from $DF00, repeated every 32
14
- # bytes up to $DFFF, as the 1764 and 1750 manuals map them. It moves
15
- # bytes between the C64 and its RAM by DMA, one bus cycle each, with the
16
- # CPU held off the bus. A command with the execute bit set starts a
17
- # transfer, or with bit 4 clear arms the REC to start one on the next
18
- # write to $FF00, so a program can bank the ROMs out first. A transfer
19
- # waits for the CPU's next read cycle with BA high, and Computer then
20
- # clocks it through #dma_cycle! until it hands the bus back.
21
- class REU
22
- include SavedState
23
-
24
- SIZES_KB = [128, 256, 512, 1024, 2048, 4096, 8192, 16_384].freeze
25
-
26
- # The registers, by offset.
27
- STATUS = 0x00
28
- COMMAND = 0x01
29
- C64_LOW = 0x02
30
- C64_HIGH = 0x03
31
- EXPANSION_LOW = 0x04
32
- EXPANSION_HIGH = 0x05
33
- EXPANSION_BANK = 0x06
34
- LENGTH_LOW = 0x07
35
- LENGTH_HIGH = 0x08
36
- INTERRUPT_MASK = 0x09
37
- ADDRESS_CONTROL = 0x0a
38
-
39
- # Status: an interrupt is pending, the block ended, a verify found a
40
- # difference (the manual's fault bit), and the unit is built from 256K
41
- # chips, which only the 1700 isn't. Reading the status clears the top
42
- # three.
43
- INTERRUPT_PENDING = 0x80
44
- END_OF_BLOCK = 0x40
45
- FAULT = 0x20
46
- CHIPS_256K = 0x10
47
-
48
- # Command: execute, reload the registers after the transfer, don't wait
49
- # for $FF00, and the transfer type in the bottom two bits.
50
- EXECUTE = 0x80
51
- AUTOLOAD = 0x20
52
- NO_FF00_TRIGGER = 0x10
53
- TRANSFER_TYPE = 0x03
54
-
55
- # Interrupt mask: interrupts on at all, then on the end of a block and
56
- # on a fault. The low five bits aren't there and read as 1.
57
- INTERRUPTS_ON = 0x80
58
- INTERRUPT_ON_END = 0x40
59
- INTERRUPT_ON_FAULT = 0x20
60
-
61
- # Address control: hold the C64 address or the expansion address where
62
- # it is. The low six bits aren't there and read as 1.
63
- FIX_C64 = 0x80
64
- FIX_EXPANSION = 0x40
65
-
66
- # The REC's bank register has three bits, and the other five read as
67
- # 1. A unit past 512K latches all eight onto its own address lines.
68
- BANK_STUCK = 0xf8
69
-
70
- attr_reader :trigger
71
-
72
- # bus is the bus the REC reaches C64 memory through, and vic the VIC,
73
- # whose phi1 fetch is what a register read finds on the bus during a
74
- # transfer.
75
- def initialize(size_kb, bus:, vic:)
76
- raise ArgumentError, "No #{size_kb}K REU. Pick one of #{SIZES_KB.join(', ')}." unless SIZES_KB.include?(size_kb)
77
-
78
- # The 1700's REC counts 17 address bits, the others' 19.
79
- span = size_kb == 128 ? 0x20000 : 0x80000
80
- @size_kb = size_kb
81
- size = size_kb * 1024
82
- @address_mask = [size, span].max - 1
83
- @bank_bits = size > span ? 0xff : 0x07
84
- @chips = size_kb == 128 ? 0 : CHIPS_256K
85
- @ram = RAM.new(size, span)
86
- @dma = DMA.new(@ram, span, bus)
87
- @trigger = Trigger.new(self)
88
- @vic = vic
89
- @on_irq_change = nil
90
- @on_dma = nil
91
- @irq = false
92
- reset!
93
- end
94
-
95
- def on_irq_change(&block)
96
- @on_irq_change = block
97
- end
98
-
99
- # Called when the REC asks for the bus.
100
- def on_dma(&block)
101
- @on_dma = block
102
- end
103
-
104
- def irq? = @irq
105
-
106
- # From the moment the REC asks for the bus until it hands it back.
107
- def dma? = @requested || @running
108
-
109
- # Whether the REC ran a transfer on the last cycle clocked, which it
110
- # goes on doing until the cycle it lets go of the bus.
111
- def holds_bus? = @running
112
-
113
- def reset!
114
- @status = @chips
115
- @command = NO_FF00_TRIGGER
116
- @c64 = @c64_start = 0
117
- @expansion = @expansion_start = 0
118
- @bank = @bank_start = 0
119
- @length = @length_start = 0xffff
120
- @interrupt_mask = 0x1f
121
- @address_control = 0x3f
122
- @armed = @requested = @running = @ba_was_low = false
123
- interrupt(false)
124
- end
125
-
126
- def peek(addr)
127
- return @vic.phi1_data if @running
128
-
129
- register = addr & 0x1f
130
- value = register_value(register)
131
- read_status if register == STATUS
132
- value
133
- end
134
-
135
- def poke(addr, value)
136
- return if @running
137
-
138
- register = addr & 0x1f
139
- case register
140
- when COMMAND then write_command(value)
141
- when C64_LOW, C64_HIGH then @c64 = @c64_start = with_byte(@c64_start, value, register == C64_HIGH)
142
- when EXPANSION_LOW, EXPANSION_HIGH
143
- @expansion = @expansion_start = with_byte(@expansion_start, value, register == EXPANSION_HIGH)
144
- when EXPANSION_BANK then @bank = @bank_start = value & @bank_bits
145
- when LENGTH_LOW, LENGTH_HIGH
146
- @length = @length_start = with_byte(@length_start, value, register == LENGTH_HIGH)
147
- when INTERRUPT_MASK then write_interrupt_mask(value)
148
- when ADDRESS_CONTROL then @address_control = value | 0x3f
149
- end
150
- end
151
-
152
- # A write to $FF00 starts the transfer the command register armed.
153
- def ff00_written
154
- return unless @armed
155
-
156
- @armed = false
157
- request_bus
158
- end
159
-
160
- # Clocks the REC for a cycle, given the VIC's BA line. A requested
161
- # transfer starts on the first cycle with BA high as the REC sees it,
162
- # even one the CPU writes on. Pinned by REU/rmw-trigger. A fetch
163
- # requested on the cycle before BA falls writes its first byte on the
164
- # first BA-low cycle as well, and again when it starts. Pinned by
165
- # REU/badoublewrite.
166
- def dma_cycle!(ba_low)
167
- late = ba_low && @vic.reu_ba_late?
168
- if @requested
169
- return hold_off if ba_low && !late
170
-
171
- start_transfer
172
- end
173
- @dma.cycle!(ba_low, late, ba_low && @vic.reu_ba_handed_on?)
174
- end_transfer unless @dma.holds_bus?
175
- end
176
-
177
- # The REU's RAM, at an address as the REC's registers give it.
178
- def ram_peek(addr) = @ram.peek(addr)
179
-
180
- def ram_poke(addr, value) = @ram.poke(addr, value)
181
-
182
- private
183
-
184
- def register_value(register)
185
- case register
186
- when STATUS then @status
187
- when COMMAND then @command
188
- when C64_LOW then @c64 & 0xff
189
- when C64_HIGH then @c64 >> 8
190
- when EXPANSION_LOW then @expansion & 0xff
191
- when EXPANSION_HIGH then @expansion >> 8
192
- when EXPANSION_BANK then @bank | BANK_STUCK
193
- when LENGTH_LOW then @length & 0xff
194
- when LENGTH_HIGH then @length >> 8
195
- when INTERRUPT_MASK then @interrupt_mask
196
- when ADDRESS_CONTROL then @address_control
197
- else 0xff
198
- end
199
- end
200
-
201
- def read_status
202
- @status &= CHIPS_256K
203
- interrupt(false)
204
- end
205
-
206
- # Writing either byte of an address or the length sets the value the
207
- # transfer starts from, and puts the counter back to it.
208
- def with_byte(word, value, high)
209
- high ? (word & 0x00ff) | (value << 8) : (word & 0xff00) | value
210
- end
211
-
212
- def write_command(value)
213
- @command = value
214
- return if value.nobits?(EXECUTE)
215
-
216
- @armed = value.nobits?(NO_FF00_TRIGGER)
217
- request_bus unless @armed
218
- end
219
-
220
- # An interrupt enabled over a block that already ended, or a fault
221
- # already found, fires at once.
222
- def write_interrupt_mask(value)
223
- @interrupt_mask = value | 0x1f
224
- interrupt_on(@status)
225
- end
226
-
227
- def interrupt_on(events)
228
- return unless @interrupt_mask.anybits?(INTERRUPTS_ON)
229
- return unless (events.anybits?(END_OF_BLOCK) && @interrupt_mask.anybits?(INTERRUPT_ON_END)) ||
230
- (events.anybits?(FAULT) && @interrupt_mask.anybits?(INTERRUPT_ON_FAULT))
231
-
232
- @status |= INTERRUPT_PENDING
233
- interrupt(true)
234
- end
235
-
236
- def interrupt(level)
237
- return if @irq == level
238
-
239
- @irq = level
240
- @on_irq_change&.call(level)
241
- end
242
-
243
- def request_bus
244
- @requested = true
245
- @ba_was_low = @vic.ba_low?
246
- @on_dma&.call
247
- end
248
-
249
- def hold_off
250
- @dma.write_ahead(@command & TRANSFER_TYPE, @c64, @expansion | (@bank << 16)) unless @ba_was_low
251
- @ba_was_low = true
252
- end
253
-
254
- def start_transfer
255
- @requested = false
256
- @running = true
257
- @dma.start(@command & TRANSFER_TYPE, @c64, @expansion | (@bank << 16), @length, @address_control)
258
- end
259
-
260
- # The execute bit drops and the $FF00 trigger turns off. With autoload
261
- # the addresses and the length go back to where the transfer started,
262
- # and otherwise they stay where it stopped.
263
- def end_transfer
264
- @running = false
265
- @command = (@command & ~EXECUTE & 0xff) | NO_FF00_TRIGGER
266
- events = @dma.events
267
- @status |= events
268
- @command.anybits?(AUTOLOAD) ? reload : keep_counters
269
- interrupt_on(events)
270
- end
271
-
272
- def reload
273
- @c64 = @c64_start
274
- @expansion = @expansion_start
275
- @bank = @bank_start
276
- @length = @length_start
277
- end
278
-
279
- def keep_counters
280
- @c64 = @dma.c64 if @address_control.nobits?(FIX_C64)
281
- @length = @dma.length & 0xffff
282
- return if @address_control.anybits?(FIX_EXPANSION)
283
-
284
- address = @dma.expansion & @address_mask
285
- @expansion = address & 0xffff
286
- @bank = (address >> 16) & 0xff
287
- end
288
- end
289
- end
@@ -1,120 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Badline
4
- class SID
5
- # Running the DSP over the cycles that have passed since it last caught
6
- # up, in spans that fast-forward the voices and end on a whole cycle.
7
- module CatchUp
8
- private
9
-
10
- # Runs the cycles that have passed, landing each queued write on the
11
- # cycle the CPU wrote it on.
12
- def catch_up
13
- replayed = 0
14
- i = 0
15
- while i < @deferred_writes.length
16
- cycle = @deferred_writes[i]
17
- run(cycle - replayed)
18
- replayed = cycle
19
- apply_write(@deferred_writes[i + 1], @deferred_writes[i + 2])
20
- i += 3
21
- end
22
- run(@pending_cycles - replayed)
23
- @deferred_writes.clear
24
- @pending_cycles = 0
25
- end
26
-
27
- def run(cycles)
28
- while cycles != 0
29
- span = span(cycles)
30
- fast_forward(span - 1) if span > 1
31
- clock!(span)
32
- cycles -= span
33
- end
34
- end
35
-
36
- # The longest stretch that can be fast-forwarded. A combined waveform
37
- # feeding back into its own oscillator steps cycle by cycle, and a span
38
- # never runs past an MSB rise that hard-syncs the next voice, so both
39
- # land on a whole cycle.
40
- def span(cycles)
41
- return 1 if @stepped
42
-
43
- span = @synthesizing ? synthesis_span(cycles) : cycles
44
- return span unless @synced
45
-
46
- span = sync_span(@waveform1, span)
47
- span = sync_span(@waveform2, span)
48
- sync_span(@waveform3, span)
49
- end
50
-
51
- # The filter steps at most @filter_chunk cycles at a time, and never
52
- # across the end of a recorded sample.
53
- def synthesis_span(cycles)
54
- span = [cycles, @filter_chunk].min
55
- return span unless @decimator
56
-
57
- [@decimator.cycles_to_close, span].min
58
- end
59
-
60
- # Whether a span has to step, or watch for hard sync, only changes with
61
- # a voice's control register.
62
- def update_span_rules
63
- @stepped = @voices.any? { |voice| voice.waveform.stepped?(@synthesizing) }
64
- @synced = @voices.any? { |voice| voice.waveform.sync? }
65
- end
66
-
67
- def sync_span(waveform, span)
68
- return span unless waveform.sync_dest.sync?
69
-
70
- rise = waveform.cycles_to_msb_rise
71
- rise && rise < span ? rise : span
72
- end
73
-
74
- # Unrolled over the three voices: the per-cycle block calls cost
75
- # measurably on the synthesis path.
76
- def fast_forward(cycles)
77
- @voice1.fast_forward(cycles)
78
- @voice2.fast_forward(cycles)
79
- @voice3.fast_forward(cycles)
80
- end
81
-
82
- # The last cycle of a span, run whole. The filter integrates the span
83
- # from the voices' output at its end.
84
- def clock!(span)
85
- @voice1.cycle!
86
- @voice2.cycle!
87
- @voice3.cycle!
88
- @waveform1.synchronize!
89
- @waveform2.synchronize!
90
- @waveform3.synchronize!
91
- return unless @synthesizing
92
-
93
- @filter.cycle!(@voices, span)
94
- record_sample(span) if @decimator
95
- end
96
-
97
- def record_sample(span)
98
- sample = @decimator.push(current_sample, span)
99
- return unless sample
100
-
101
- @samples << sample
102
- record_voices if @voice_samples
103
- end
104
-
105
- def record_voices
106
- voice_samples = @voice_samples
107
- voice_samples << (@voice1.output >> 7)
108
- voice_samples << (@voice2.output >> 7)
109
- voice_samples << (@voice3.output >> 7)
110
- end
111
-
112
- def current_sample
113
- sample = @filter.output / SAMPLE_DIVISOR
114
- return sample unless sample < -0x8000 || sample > 0x7fff
115
-
116
- sample.clamp(-0x8000, 0x7fff)
117
- end
118
- end
119
- end
120
- end
@@ -1,64 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Badline
4
- class SID
5
- # Reduces the SID's one-sample-per-cycle stream to an audio rate by
6
- # averaging each window. Point sampling would be cheaper, but the pulse
7
- # and noise waveforms carry enough energy above the output Nyquist to
8
- # alias audibly.
9
- #
10
- # A sample can stand for several cycles at once, when the DSP has run
11
- # them as one step.
12
- class Decimator
13
- def initialize(clock_hz:, rate:)
14
- @clock_hz = clock_hz
15
- @rate = rate
16
- @phase = 0
17
- @sum = 0
18
- @count = 0
19
- @cycles_to_close = window_cycles
20
- end
21
-
22
- # Cycles until the current window closes, counting the next one as 1.
23
- attr_reader :cycles_to_close
24
-
25
- # How far the current window has got. The clock and the rate are the
26
- # host's.
27
- def save_state(out)
28
- out.int(@phase).int(@sum).int(@count).int(@cycles_to_close)
29
- end
30
-
31
- def load_state(input)
32
- @phase = input.int
33
- @sum = input.int
34
- @count = input.int
35
- @cycles_to_close = input.int
36
- end
37
-
38
- # Returns the averaged sample when these cycles close a window, and
39
- # nil otherwise. They must not run past the window's end.
40
- def push(sample, cycles = 1)
41
- @sum += sample * cycles
42
- @count += cycles
43
- @phase += @rate * cycles
44
- @cycles_to_close -= cycles
45
- return unless @phase >= @clock_hz
46
-
47
- @phase -= @clock_hz
48
- @cycles_to_close = window_cycles
49
- average
50
- end
51
-
52
- private
53
-
54
- def window_cycles = (@clock_hz - @phase + @rate - 1) / @rate
55
-
56
- def average
57
- value = @sum.fdiv(@count).round
58
- @sum = 0
59
- @count = 0
60
- value
61
- end
62
- end
63
- end
64
- end
@@ -1,68 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Badline
4
- class SID
5
- class Envelope
6
- # A snapshot of an envelope: its rates, the gate, the state and the
7
- # counters and pipelines between them, and the same fields as reSID
8
- # keeps them, for VICE's SIDEXTENDED module.
9
- module State
10
- # The fields reSID keeps for an envelope between cycles: the rate and
11
- # exponential counters, the level, the state as an index into STATES,
12
- # whether it holds at zero, the two periods and the pipeline.
13
- def resid_fields
14
- [@rate_counter, @exponential_counter, @counter, STATES.index(@state).to_i, @hold_zero ? 1 : 0,
15
- @rate_period, @exponential_period, @envelope_pipeline]
16
- end
17
-
18
- # Takes the fields resid_fields gives from `fields`, from `at` on.
19
- def restore_resid_fields(fields, at)
20
- @rate_counter = fields[at]
21
- @exponential_counter = fields[at + 1]
22
- @counter = @env3 = fields[at + 2]
23
- state = fields[at + 3]
24
- @state = @next_state = STATES.fetch(state.clamp(0, STATES.length - 1)).to_sym
25
- @hold_zero = fields[at + 4] != 0
26
- @rate_period = fields[at + 5]
27
- @exponential_period = fields[at + 6]
28
- @envelope_pipeline = fields[at + 7]
29
- end
30
-
31
- def save_state(out)
32
- [@attack, @decay, @sustain, @release].each { |rate| out.int(rate) }
33
- out.boolean(@gate).int(STATES.index(@state)).int(STATES.index(@next_state))
34
- out.int(@counter).int(@env3).int(@rate_counter).int(@rate_period).boolean(@reset_rate_counter)
35
- out.int(@exponential_counter).int(@exponential_period)
36
- out.int(@state_pipeline).int(@envelope_pipeline).int(@exponential_pipeline).boolean(@hold_zero)
37
- end
38
-
39
- def load_state(input)
40
- @attack = input.int
41
- @decay = input.int
42
- @sustain = input.int
43
- @release = input.int
44
- @gate = input.boolean?
45
- @state = STATES.fetch(input.int).to_sym
46
- @next_state = STATES.fetch(input.int).to_sym
47
- load_counters(input)
48
- end
49
-
50
- private
51
-
52
- def load_counters(input)
53
- @counter = input.int
54
- @env3 = input.int
55
- @rate_counter = input.int
56
- @rate_period = input.int
57
- @reset_rate_counter = input.boolean?
58
- @exponential_counter = input.int
59
- @exponential_period = input.int
60
- @state_pipeline = input.int
61
- @envelope_pipeline = input.int
62
- @exponential_pipeline = input.int
63
- @hold_zero = input.boolean?
64
- end
65
- end
66
- end
67
- end
68
- end