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
@@ -1,159 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Badline
4
- # The serial bus between the C64 and its drives: ATN, CLK and DATA, each
5
- # an open-collector line with a pull-up. A line is low while any device
6
- # pulls it (wired-AND), and high otherwise. Every read works the levels
7
- # out from what each side drives now.
8
- #
9
- # The C64 drives the lines from CIA 2's port A through 7406 inverters, so
10
- # an output bit of 1 pulls its line low: PA3 ATN, PA4 CLK and PA5 DATA.
11
- # The machine pushes those bits into the bus (host_lines=), which holds
12
- # them. PA6 and PA7 read CLK and DATA directly, 1 for a released line.
13
- # The bus stands in as CIA 2's peripheral for those two inputs.
14
- #
15
- # A drive drives CLK and DATA from VIA 1's PB3 and PB1, the same way. It
16
- # also pulls DATA while ATN IN differs from its ATN acknowledge on PB4
17
- # (an XOR gate), which answers ATN in hardware before the DOS gets to it.
18
- # SerialPort reads the lines back into VIA 1. A drive whose
19
- # serial_output sets DRIVE_ATN_GATED pulls DATA that way only while
20
- # ATN is low, as the 1581's NAND does.
21
- #
22
- # Fast serial adds SRQ, which the C64 leaves alone. A C128 and a 1571
23
- # clock bytes over it from a CIA's CNT, with the bits on DATA from its
24
- # SP, through buffers each side turns towards the bus to send. A pin low
25
- # pulls its line low. Each side pushes the lines it pulls when they
26
- # move: the host through host_fast_lines=, which tells the drives
27
- # (fast_lines_moved), and a drive through drives_fast_moved!, which
28
- # tells the host (on_fast_change).
29
- class IECBus
30
- # CIA 2 port A
31
- HOST_ATN_OUT = 0x08
32
- HOST_CLK_OUT = 0x10
33
- HOST_DATA_OUT = 0x20
34
- HOST_CLK_IN = 0x40
35
- HOST_DATA_IN = 0x80
36
-
37
- # VIA 1 port B
38
- DRIVE_DATA_OUT = 0x02
39
- DRIVE_CLK_OUT = 0x08
40
- DRIVE_ATNA = 0x10
41
-
42
- # The lines pulled low, as ATN, CLK, DATA and SRQ bits
43
- ATN = 0x01
44
- CLK = 0x02
45
- DATA = 0x04
46
- SRQ = 0x08
47
-
48
- # A drive's serial_output bits above VIA 1's port B: its fast serial
49
- # pins pulling DATA and SRQ.
50
- DRIVE_FAST_DATA = 0x100
51
- DRIVE_FAST_SRQ = 0x200
52
-
53
- # A drive's serial_output bit whose ATN acknowledge pulls DATA only
54
- # while ATN is low.
55
- DRIVE_ATN_GATED = 0x400
56
-
57
- attr_reader :drives, :host_lines
58
-
59
- # The lines the host's fast serial pins pull, as DATA and SRQ bits.
60
- attr_reader :host_fast_lines
61
-
62
- def initialize
63
- @drives = []
64
- @host_lines = 0
65
- @host_fast_lines = 0
66
- @drive_fast_lines = 0
67
- @on_fast_change = nil
68
- end
69
-
70
- # The host's fast serial pins moved: +low+ is the lines they pull, as
71
- # DATA and SRQ bits.
72
- def host_fast_lines=(low)
73
- return if low == @host_fast_lines
74
-
75
- @host_fast_lines = low
76
- @drives.each(&:fast_lines_moved)
77
- end
78
-
79
- # A drive's fast serial pins moved (serial_output's fast bits).
80
- def drives_fast_moved!
81
- low = 0
82
- @drives.each do |drive|
83
- output = drive.serial_output
84
- low |= DATA if output.anybits?(DRIVE_FAST_DATA)
85
- low |= SRQ if output.anybits?(DRIVE_FAST_SRQ)
86
- end
87
- return if low == @drive_fast_lines
88
-
89
- @drive_fast_lines = low
90
- @on_fast_change&.call
91
- end
92
-
93
- # Calls the block whenever the drives move their fast serial pins.
94
- def on_fast_change(&block)
95
- @on_fast_change = block
96
- end
97
-
98
- # The machine pushes the lines it pulls, as port A bits, whenever they
99
- # may have moved: its output bits, with input bits floating high as the
100
- # 7406 inputs see them. A bus with only drives on it keeps 0.
101
- def host_lines=(lines)
102
- @host_lines = lines
103
- @drives.each(&:host_written!)
104
- end
105
-
106
- def attach(drive)
107
- @drives << drive unless @drives.include?(drive)
108
- end
109
-
110
- def detach(drive)
111
- @drives.delete(drive)
112
- end
113
-
114
- # One pass over everything on the bus, for a reader that wants more
115
- # than one line, SRQ included. +host+ is the C64's port A lines as the
116
- # reader sees them, which a drive takes a cycle late (see
117
- # Drive::SerialLines).
118
- def low_lines(host = @host_lines)
119
- atn = host.anybits?(HOST_ATN_OUT)
120
- low = @host_fast_lines | @drive_fast_lines
121
- low |= ATN if atn
122
- low |= CLK if host.anybits?(HOST_CLK_OUT)
123
- low |= DATA if host.anybits?(HOST_DATA_OUT)
124
- i = 0
125
- while i < @drives.length
126
- drive = @drives[i].serial_output
127
- low |= CLK if drive.anybits?(DRIVE_CLK_OUT)
128
- low |= DATA if drive.anybits?(DRIVE_DATA_OUT) || acknowledging?(drive, atn)
129
- i += 1
130
- end
131
- low
132
- end
133
-
134
- def atn_low?(host = @host_lines) = host.anybits?(HOST_ATN_OUT)
135
-
136
- # Whether a drive's ATN acknowledge pulls DATA, with its serial_output
137
- # +drive+, while ATN is +atn+.
138
- def acknowledging?(drive, atn)
139
- atn != drive.anybits?(DRIVE_ATNA) && (atn || drive.nobits?(DRIVE_ATN_GATED))
140
- end
141
-
142
- def clk_low? = low_lines.anybits?(CLK)
143
-
144
- def data_low? = low_lines.anybits?(DATA)
145
-
146
- # CIA 2's port A pins as the bus leaves them: CLK IN and DATA IN low
147
- # while their lines are.
148
- def read_a(_port_a, _port_b)
149
- low = low_lines
150
- value = 0xff
151
- value &= ~HOST_CLK_IN if low.anybits?(CLK)
152
- value &= ~HOST_DATA_IN if low.anybits?(DATA)
153
- value
154
- end
155
-
156
- # Port B goes to the user port, not the serial bus.
157
- def read_b(_port_a, _port_b) = 0xff
158
- end
159
- end
@@ -1,334 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Badline
4
- class Instruction
5
- attr_reader :name, :addressing_mode, :operand_length
6
-
7
- def initialize(name, addressing_mode,
8
- illegal: false, boundary_cycle: false)
9
- @name = name
10
- @addressing_mode = addressing_mode
11
- @boundary_cycle = boundary_cycle
12
- @illegal = illegal
13
- @operand_length = compute_operand_length
14
- end
15
-
16
- class << self
17
- def map
18
- @map ||= {
19
- 0x00 => new(:brk, :implied),
20
- 0x01 => new(:ora, :indirect_x),
21
- 0x02 => new(:jam, :implied, illegal: true),
22
- 0x03 => new(:slo, :indirect_x, illegal: true),
23
- 0x04 => new(:nop, :zeropage, illegal: true),
24
- 0x05 => new(:ora, :zeropage),
25
- 0x06 => new(:asl, :zeropage),
26
- 0x07 => new(:slo, :zeropage, illegal: true),
27
- 0x08 => new(:php, :implied),
28
- 0x09 => new(:ora, :immediate),
29
- 0x0a => new(:asl, :accumulator),
30
- 0x0b => new(:anc, :immediate, illegal: true),
31
- 0x0c => new(:nop, :absolute, illegal: true),
32
- 0x0d => new(:ora, :absolute),
33
- 0x0e => new(:asl, :absolute),
34
- 0x0f => new(:slo, :absolute, illegal: true),
35
-
36
- 0x10 => new(:bpl, :relative),
37
- 0x11 => new(:ora, :indirect_y, boundary_cycle: true),
38
- 0x12 => new(:jam, :implied, illegal: true),
39
- 0x13 => new(:slo, :indirect_y, illegal: true),
40
- 0x14 => new(:nop, :zeropage_x, illegal: true),
41
- 0x15 => new(:ora, :zeropage_x),
42
- 0x16 => new(:asl, :zeropage_x),
43
- 0x17 => new(:slo, :zeropage_x, illegal: true),
44
- 0x18 => new(:clc, :implied),
45
- 0x19 => new(:ora, :absolute_y, boundary_cycle: true),
46
- 0x1a => new(:nop, :implied, illegal: true),
47
- 0x1b => new(:slo, :absolute_y, illegal: true),
48
- 0x1c => new(:nop, :absolute_x, boundary_cycle: true, illegal: true),
49
- 0x1d => new(:ora, :absolute_x, boundary_cycle: true),
50
- 0x1e => new(:asl, :absolute_x),
51
- 0x1f => new(:slo, :absolute_x, illegal: true),
52
-
53
- 0x20 => new(:jsr, :absolute),
54
- 0x21 => new(:and, :indirect_x),
55
- 0x22 => new(:jam, :implied, illegal: true),
56
- 0x23 => new(:rla, :indirect_x, illegal: true),
57
- 0x24 => new(:bit, :zeropage),
58
- 0x25 => new(:and, :zeropage),
59
- 0x26 => new(:rol, :zeropage),
60
- 0x27 => new(:rla, :zeropage, illegal: true),
61
- 0x28 => new(:plp, :implied),
62
- 0x29 => new(:and, :immediate),
63
- 0x2a => new(:rol, :accumulator),
64
- 0x2b => new(:anc, :immediate, illegal: true),
65
- 0x2c => new(:bit, :absolute),
66
- 0x2d => new(:and, :absolute),
67
- 0x2e => new(:rol, :absolute),
68
- 0x2f => new(:rla, :absolute, illegal: true),
69
-
70
- 0x30 => new(:bmi, :relative),
71
- 0x31 => new(:and, :indirect_y, boundary_cycle: true),
72
- 0x32 => new(:jam, :implied, illegal: true),
73
- 0x33 => new(:rla, :indirect_y, illegal: true),
74
- 0x34 => new(:nop, :zeropage_x, illegal: true),
75
- 0x35 => new(:and, :zeropage_x),
76
- 0x36 => new(:rol, :zeropage_x),
77
- 0x37 => new(:rla, :zeropage_x, illegal: true),
78
- 0x38 => new(:sec, :implied),
79
- 0x39 => new(:and, :absolute_y, boundary_cycle: true),
80
- 0x3a => new(:nop, :implied, illegal: true),
81
- 0x3b => new(:rla, :absolute_y, illegal: true),
82
- 0x3c => new(:nop, :absolute_x, boundary_cycle: true, illegal: true),
83
- 0x3d => new(:and, :absolute_x, boundary_cycle: true),
84
- 0x3e => new(:rol, :absolute_x),
85
- 0x3f => new(:rla, :absolute_x, illegal: true),
86
-
87
- 0x40 => new(:rti, :implied),
88
- 0x41 => new(:eor, :indirect_x),
89
- 0x42 => new(:jam, :implied, illegal: true),
90
- 0x43 => new(:sre, :indirect_x, illegal: true),
91
- 0x44 => new(:nop, :zeropage, illegal: true),
92
- 0x45 => new(:eor, :zeropage),
93
- 0x46 => new(:lsr, :zeropage),
94
- 0x47 => new(:sre, :zeropage, illegal: true),
95
- 0x48 => new(:pha, :implied),
96
- 0x49 => new(:eor, :immediate),
97
- 0x4a => new(:lsr, :accumulator),
98
- 0x4b => new(:alr, :immediate, illegal: true),
99
- 0x4c => new(:jmp, :absolute),
100
- 0x4d => new(:eor, :absolute),
101
- 0x4e => new(:lsr, :absolute),
102
- 0x4f => new(:sre, :absolute, illegal: true),
103
-
104
- 0x50 => new(:bvc, :relative),
105
- 0x51 => new(:eor, :indirect_y, boundary_cycle: true),
106
- 0x52 => new(:jam, :implied, illegal: true),
107
- 0x53 => new(:sre, :indirect_y, illegal: true),
108
- 0x54 => new(:nop, :zeropage_x, illegal: true),
109
- 0x55 => new(:eor, :zeropage_x),
110
- 0x56 => new(:lsr, :zeropage_x),
111
- 0x57 => new(:sre, :zeropage_x, illegal: true),
112
- 0x58 => new(:cli, :implied),
113
- 0x59 => new(:eor, :absolute_y, boundary_cycle: true),
114
- 0x5a => new(:nop, :implied, illegal: true),
115
- 0x5b => new(:sre, :absolute_y, illegal: true),
116
- 0x5c => new(:nop, :absolute_x, boundary_cycle: true, illegal: true),
117
- 0x5d => new(:eor, :absolute_x, boundary_cycle: true),
118
- 0x5e => new(:lsr, :absolute_x),
119
- 0x5f => new(:sre, :absolute_x, illegal: true),
120
-
121
- 0x60 => new(:rts, :implied),
122
- 0x61 => new(:adc, :indirect_x),
123
- 0x62 => new(:jam, :implied, illegal: true),
124
- 0x63 => new(:rra, :indirect_x, illegal: true),
125
- 0x64 => new(:nop, :zeropage, illegal: true),
126
- 0x65 => new(:adc, :zeropage),
127
- 0x66 => new(:ror, :zeropage),
128
- 0x67 => new(:rra, :zeropage, illegal: true),
129
- 0x68 => new(:pla, :implied),
130
- 0x69 => new(:adc, :immediate),
131
- 0x6a => new(:ror, :accumulator),
132
- 0x6b => new(:arr, :immediate, illegal: true),
133
- 0x6c => new(:jmp, :indirect),
134
- 0x6d => new(:adc, :absolute),
135
- 0x6e => new(:ror, :absolute),
136
- 0x6f => new(:rra, :absolute, illegal: true),
137
-
138
- 0x70 => new(:bvs, :relative),
139
- 0x71 => new(:adc, :indirect_y, boundary_cycle: true),
140
- 0x72 => new(:jam, :implied, illegal: true),
141
- 0x73 => new(:rra, :indirect_y, illegal: true),
142
- 0x74 => new(:nop, :zeropage_x, illegal: true),
143
- 0x75 => new(:adc, :zeropage_x),
144
- 0x76 => new(:ror, :zeropage_x),
145
- 0x77 => new(:rra, :zeropage_x, illegal: true),
146
- 0x78 => new(:sei, :implied),
147
- 0x79 => new(:adc, :absolute_y, boundary_cycle: true),
148
- 0x7a => new(:nop, :implied, illegal: true),
149
- 0x7b => new(:rra, :absolute_y, illegal: true),
150
- 0x7c => new(:nop, :absolute_x, boundary_cycle: true, illegal: true),
151
- 0x7d => new(:adc, :absolute_x, boundary_cycle: true),
152
- 0x7e => new(:ror, :absolute_x),
153
- 0x7f => new(:rra, :absolute_x, illegal: true),
154
-
155
- 0x80 => new(:nop_nocycle, :immediate, illegal: true),
156
- 0x81 => new(:sta, :indirect_x),
157
- 0x82 => new(:nop_nocycle, :immediate, illegal: true),
158
- 0x83 => new(:sax, :indirect_x, illegal: true),
159
- 0x84 => new(:sty, :zeropage),
160
- 0x85 => new(:sta, :zeropage),
161
- 0x86 => new(:stx, :zeropage),
162
- 0x87 => new(:sax, :zeropage, illegal: true),
163
- 0x88 => new(:dey, :implied),
164
- 0x89 => new(:nop_nocycle, :immediate, illegal: true),
165
- 0x8a => new(:txa, :implied),
166
- 0x8b => new(:ane, :immediate, illegal: true),
167
- 0x8c => new(:sty, :absolute),
168
- 0x8d => new(:sta, :absolute),
169
- 0x8e => new(:stx, :absolute),
170
- 0x8f => new(:sax, :absolute, illegal: true),
171
-
172
- 0x90 => new(:bcc, :relative),
173
- 0x91 => new(:sta, :indirect_y),
174
- 0x92 => new(:jam, :implied, illegal: true),
175
- 0x93 => new(:sha, :indirect_y, illegal: true),
176
- 0x94 => new(:sty, :zeropage_x),
177
- 0x95 => new(:sta, :zeropage_x),
178
- 0x96 => new(:stx, :zeropage_y),
179
- 0x97 => new(:sax, :zeropage_y, illegal: true),
180
- 0x98 => new(:tya, :implied),
181
- 0x99 => new(:sta, :absolute_y),
182
- 0x9a => new(:txs, :implied),
183
- 0x9b => new(:tas, :absolute_y, illegal: true),
184
- 0x9c => new(:shy, :absolute_x, illegal: true),
185
- 0x9d => new(:sta, :absolute_x),
186
- 0x9e => new(:shx, :absolute_y, illegal: true),
187
- 0x9f => new(:sha, :absolute_y, illegal: true),
188
-
189
- 0xa0 => new(:ldy, :immediate),
190
- 0xa1 => new(:lda, :indirect_x),
191
- 0xa2 => new(:ldx, :immediate),
192
- 0xa3 => new(:lax, :indirect_x, illegal: true),
193
- 0xa4 => new(:ldy, :zeropage),
194
- 0xa5 => new(:lda, :zeropage),
195
- 0xa6 => new(:ldx, :zeropage),
196
- 0xa7 => new(:lax, :zeropage, illegal: true),
197
- 0xa8 => new(:tay, :implied),
198
- 0xa9 => new(:lda, :immediate),
199
- 0xaa => new(:tax, :implied),
200
- 0xab => new(:lxa, :immediate, illegal: true),
201
- 0xac => new(:ldy, :absolute),
202
- 0xad => new(:lda, :absolute),
203
- 0xae => new(:ldx, :absolute),
204
- 0xaf => new(:lax, :absolute, illegal: true),
205
-
206
- 0xb0 => new(:bcs, :relative),
207
- 0xb1 => new(:lda, :indirect_y, boundary_cycle: true),
208
- 0xb2 => new(:jam, :implied, illegal: true),
209
- 0xb3 => new(:lax, :indirect_y, boundary_cycle: true, illegal: true),
210
- 0xb4 => new(:ldy, :zeropage_x),
211
- 0xb5 => new(:lda, :zeropage_x),
212
- 0xb6 => new(:ldx, :zeropage_y),
213
- 0xb7 => new(:lax, :zeropage_y, illegal: true),
214
- 0xb8 => new(:clv, :implied),
215
- 0xb9 => new(:lda, :absolute_y, boundary_cycle: true),
216
- 0xba => new(:tsx, :implied),
217
- 0xbb => new(:las, :absolute_y, boundary_cycle: true, illegal: true),
218
- 0xbc => new(:ldy, :absolute_x, boundary_cycle: true),
219
- 0xbd => new(:lda, :absolute_x, boundary_cycle: true),
220
- 0xbe => new(:ldx, :absolute_y, boundary_cycle: true),
221
- 0xbf => new(:lax, :absolute_y, boundary_cycle: true, illegal: true),
222
-
223
- 0xc0 => new(:cpy, :immediate),
224
- 0xc1 => new(:cmp, :indirect_x),
225
- 0xc2 => new(:nop_nocycle, :immediate, illegal: true),
226
- 0xc3 => new(:dcp, :indirect_x, illegal: true),
227
- 0xc4 => new(:cpy, :zeropage),
228
- 0xc5 => new(:cmp, :zeropage),
229
- 0xc6 => new(:dec, :zeropage),
230
- 0xc7 => new(:dcp, :zeropage, illegal: true),
231
- 0xc8 => new(:iny, :implied),
232
- 0xc9 => new(:cmp, :immediate),
233
- 0xca => new(:dex, :implied),
234
- 0xcb => new(:sbx, :immediate, illegal: true),
235
- 0xcc => new(:cpy, :absolute),
236
- 0xcd => new(:cmp, :absolute),
237
- 0xce => new(:dec, :absolute),
238
- 0xcf => new(:dcp, :absolute, illegal: true),
239
-
240
- 0xd0 => new(:bne, :relative),
241
- 0xd1 => new(:cmp, :indirect_y, boundary_cycle: true),
242
- 0xd2 => new(:jam, :implied, illegal: true),
243
- 0xd3 => new(:dcp, :indirect_y, illegal: true),
244
- 0xd4 => new(:nop, :zeropage_x, illegal: true),
245
- 0xd5 => new(:cmp, :zeropage_x),
246
- 0xd6 => new(:dec, :zeropage_x),
247
- 0xd7 => new(:dcp, :zeropage_x, illegal: true),
248
- 0xd8 => new(:cld, :implied),
249
- 0xd9 => new(:cmp, :absolute_y, boundary_cycle: true),
250
- 0xda => new(:nop, :implied, illegal: true),
251
- 0xdb => new(:dcp, :absolute_y, illegal: true),
252
- 0xdc => new(:nop, :absolute_x, boundary_cycle: true, illegal: true),
253
- 0xdd => new(:cmp, :absolute_x, boundary_cycle: true),
254
- 0xde => new(:dec, :absolute_x),
255
- 0xdf => new(:dcp, :absolute_x, illegal: true),
256
-
257
- 0xe0 => new(:cpx, :immediate),
258
- 0xe1 => new(:sbc, :indirect_x),
259
- 0xe2 => new(:nop_nocycle, :immediate, illegal: true),
260
- 0xe3 => new(:isc, :indirect_x, illegal: true),
261
- 0xe4 => new(:cpx, :zeropage),
262
- 0xe5 => new(:sbc, :zeropage),
263
- 0xe6 => new(:inc, :zeropage),
264
- 0xe7 => new(:isc, :zeropage, illegal: true),
265
- 0xe8 => new(:inx, :implied),
266
- 0xe9 => new(:sbc, :immediate),
267
- 0xea => new(:nop, :implied),
268
- 0xeb => new(:sbc, :immediate, illegal: true),
269
- 0xec => new(:cpx, :absolute),
270
- 0xed => new(:sbc, :absolute),
271
- 0xee => new(:inc, :absolute),
272
- 0xef => new(:isc, :absolute, illegal: true),
273
-
274
- 0xf0 => new(:beq, :relative),
275
- 0xf1 => new(:sbc, :indirect_y, boundary_cycle: true),
276
- 0xf2 => new(:jam, :implied, illegal: true),
277
- 0xf3 => new(:isc, :indirect_y, illegal: true),
278
- 0xf4 => new(:nop, :zeropage_x, illegal: true),
279
- 0xf5 => new(:sbc, :zeropage_x),
280
- 0xf6 => new(:inc, :zeropage_x),
281
- 0xf7 => new(:isc, :zeropage_x, illegal: true),
282
- 0xf8 => new(:sed, :implied),
283
- 0xf9 => new(:sbc, :absolute_y, boundary_cycle: true),
284
- 0xfa => new(:nop, :implied, illegal: true),
285
- 0xfb => new(:isc, :absolute_y, illegal: true),
286
- 0xfc => new(:nop, :absolute_x, boundary_cycle: true, illegal: true),
287
- 0xfd => new(:sbc, :absolute_x, boundary_cycle: true),
288
- 0xfe => new(:inc, :absolute_x),
289
- 0xff => new(:isc, :absolute_x, illegal: true)
290
- }
291
- end
292
-
293
- def find(opcode)
294
- table[opcode.to_i]
295
- end
296
-
297
- private
298
-
299
- def table
300
- @table ||= Array.new(256) { |opcode| map[opcode] }
301
- end
302
- end
303
-
304
- def boundary_cycle?
305
- @boundary_cycle
306
- end
307
-
308
- def illegal?
309
- @illegal
310
- end
311
-
312
- def length
313
- 1 + operand_length
314
- end
315
-
316
- def operand?
317
- operand_length.positive?
318
- end
319
-
320
- private
321
-
322
- def compute_operand_length
323
- case addressing_mode
324
- when :implied, :accumulator
325
- 0
326
- when :immediate, :relative, :zeropage, :zeropage_x, :zeropage_y,
327
- :indirect_x, :indirect_y
328
- 1
329
- when :absolute, :absolute_x, :absolute_y, :indirect
330
- 2
331
- end
332
- end
333
- end
334
- end
@@ -1,114 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Badline
4
- module InstructionSet
5
- module Arithmetic
6
- # Add memory with carry to accumulator.
7
- #
8
- # Opcodes:
9
- # $61 - indirect_x - 6 cycles
10
- # $65 - zeropage - 3 cycles
11
- # $69 - immediate - 2 cycles
12
- # $6D - absolute - 4 cycles
13
- # $71 - indirect_y - 5+ cycles
14
- # $75 - zeropage_x - 4 cycles
15
- # $79 - absolute_y - 4+ cycles
16
- # $7D - absolute_x - 4+ cycles
17
- def adc(_addr, value)
18
- result = a + value + status.carry
19
- status.zero = result.nobits?(0xff)
20
-
21
- if status.decimal?
22
- result = (a & 0x0f) + (value & 0x0f) + status.carry
23
- result += 0x06 if result > 0x09
24
- c = result > 0x0f ? 1 : 0
25
- result = (a & 0xf0) + (value & 0xf0) + (c << 4) + (result & 0x0f)
26
- update_calculation_flags(value, result)
27
- result += 0x60 if result > 0x9f
28
- else
29
- update_calculation_flags(value, result)
30
- end
31
-
32
- status.carry = result > 0xff
33
- @a = result & 0xff
34
- end
35
-
36
- # Compare memory with accumulator.
37
- #
38
- # Opcodes:
39
- # $C1 - indirect_x - 6 cycles
40
- # $C5 - zeropage - 3 cycles
41
- # $C9 - immediate - 2 cycles
42
- # $CD - absolute - 4 cycles
43
- # $D1 - indirect_y - 5+ cycles
44
- # $D5 - zeropage_x - 4 cycles
45
- # $D9 - absolute_y - 4+ cycles
46
- # $DD - absolute_x - 4+ cycles
47
- def cmp(_addr, value)
48
- status.carry = (@a >= value)
49
- update_number_flags(@a - value)
50
- end
51
-
52
- # Compare memory with X register.
53
- #
54
- # Opcodes:
55
- # $E0 - immediate - 2 cycles
56
- # $E4 - zeropage - 3 cycles
57
- # $EC - absolute - 4 cycles
58
- def cpx(_addr, value)
59
- status.carry = @x >= value
60
- update_number_flags(@x - value)
61
- end
62
-
63
- # Compare memory with Y register.
64
- #
65
- # Opcodes:
66
- # $C0 - immediate - 2 cycles
67
- # $C4 - zeropage - 3 cycles
68
- # $CC - absolute - 4 cycles
69
- def cpy(_addr, value)
70
- status.carry = @y >= value
71
- update_number_flags(@y - value)
72
- end
73
-
74
- # Subtract memory from accumulator with borrow.
75
- #
76
- # Opcodes:
77
- # $E1 - indirect_x - 6 cycles
78
- # $E5 - zeropage - 3 cycles
79
- # $E9 - immediate - 2 cycles
80
- # $ED - absolute - 4 cycles
81
- # $F1 - indirect_y - 5+ cycles
82
- # $F5 - zeropage_x - 4 cycles
83
- # $F9 - absolute_y - 4+ cycles
84
- # $FD - absolute_x - 4+ cycles
85
- def sbc(_addr, value)
86
- inverted = ~value & 0xff
87
- carry = status.carry? ? 0 : -1
88
-
89
- result = a + inverted + status.carry
90
- status.zero = result.nobits?(0xff)
91
- status.carry = result > 0xff
92
- update_calculation_flags(inverted, result)
93
-
94
- if status.decimal?
95
- al = (a & 0x0f) - (value & 0x0f) + carry
96
- al = ((al - 0x06) & 0x0F) - 0x10 if al.negative?
97
-
98
- result = (a & 0xf0) - (value & 0xf0) + al
99
- result -= 0x60 if result.negative?
100
- end
101
-
102
- @a = result & 0xff
103
- end
104
-
105
- private
106
-
107
- def update_calculation_flags(value, result)
108
- status.negative = result.anybits?(0x80)
109
- status.overflow = (a ^ value).nobits?(0x80) &&
110
- (a ^ result).anybits?(0x80)
111
- end
112
- end
113
- end
114
- end