badline 0.12.1 → 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 (505) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +17 -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 +3 -3
  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} +1 -1
  17. data/lib/badline/c128/bus.rb +18 -17
  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 +14 -9
  27. data/lib/badline/{computer → c64}/attachments.rb +4 -6
  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/{computer → c64}/common.rb +2 -2
  73. data/lib/badline/{computer → c64}/kernal_traps.rb +18 -18
  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 +11 -11
  82. data/lib/badline/{computer.rb → c64.rb} +18 -13
  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 +26 -28
  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 +3 -3
  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/load.rb +5 -5
  262. data/lib/badline/kernal_trap/save.rb +4 -4
  263. data/lib/badline/kernal_trap/serial.rb +7 -7
  264. data/lib/badline/kernal_trap.rb +1 -2
  265. data/lib/badline/machine/clocking.rb +1 -1
  266. data/lib/badline/machine.rb +5 -5
  267. data/lib/badline/media/true_drive.rb +1 -1
  268. data/lib/badline/media/tune.rb +2 -2
  269. data/lib/badline/media.rb +3 -3
  270. data/lib/badline/model.rb +1 -1
  271. data/lib/badline/roms/README +6 -6
  272. data/lib/badline/sdl.rb +1 -0
  273. data/lib/badline/{storage/sid_file.rb → sid_tune/file.rb} +3 -3
  274. data/lib/badline/{storage → sid_tune}/hvsc.rb +7 -7
  275. data/lib/badline/{storage → sid_tune}/song_lengths.rb +2 -2
  276. data/lib/badline/{storage → sid_tune}/stil/credit.rb +1 -1
  277. data/lib/badline/{storage → sid_tune}/stil.rb +3 -3
  278. data/lib/badline/sid_tune.rb +6 -0
  279. data/lib/badline/snapshot/c128_setup.rb +43 -0
  280. data/lib/badline/snapshot/c64_setup.rb +79 -0
  281. data/lib/badline/snapshot/image.rb +5 -25
  282. data/lib/badline/snapshot/machine_state.rb +1 -1
  283. data/lib/badline/snapshot/setup.rb +22 -66
  284. data/lib/badline/snapshot/state.rb +8 -18
  285. data/lib/badline/snapshot/storage_setup.rb +68 -0
  286. data/lib/badline/snapshot/vic20_setup.rb +37 -0
  287. data/lib/badline/snapshot/vice/c64_mem.rb +1 -1
  288. data/lib/badline/snapshot/vice/restore.rb +1 -1
  289. data/lib/badline/snapshot/vice/reu1764.rb +1 -1
  290. data/lib/badline/snapshot/vice/reu_fields.rb +40 -0
  291. data/lib/badline/snapshot/vice.rb +7 -5
  292. data/lib/badline/snapshot.rb +3 -4
  293. data/lib/badline/storage/d64_image.rb +0 -2
  294. data/lib/badline/storage/d71_image.rb +0 -2
  295. data/lib/badline/storage/d81_image.rb +0 -2
  296. data/lib/badline/storage/disk_image.rb +3 -6
  297. data/lib/badline/storage/g64_image.rb +2 -2
  298. data/lib/badline/storage/host_directory.rb +0 -5
  299. data/lib/badline/storage/t64.rb +2 -8
  300. data/lib/badline/storage/unavailable.rb +1 -1
  301. data/lib/badline/storage.rb +0 -37
  302. data/lib/badline/support/c128_checkpoint.rb +39 -0
  303. data/lib/badline/support/checkpoint.rb +108 -0
  304. data/lib/badline/support/vic20_checkpoint.rb +38 -0
  305. data/lib/badline/support.rb +5 -0
  306. data/lib/badline/version.rb +1 -1
  307. data/lib/badline/vic20/attachments.rb +5 -5
  308. data/lib/badline/vic20/bus/saved_state.rb +35 -0
  309. data/lib/badline/vic20/bus.rb +3 -25
  310. data/lib/badline/vic20/cpu.rb +1 -1
  311. data/lib/badline/vic20/port_wiring.rb +4 -4
  312. data/lib/badline/vic20/saved_state.rb +16 -30
  313. data/lib/badline/vic20/user_via_ports.rb +2 -2
  314. data/lib/badline/vic20.rb +19 -14
  315. metadata +245 -221
  316. data/lib/badline/address_bus/extra_sids.rb +0 -30
  317. data/lib/badline/address_bus/fittings.rb +0 -38
  318. data/lib/badline/address_bus/pla.rb +0 -147
  319. data/lib/badline/address_bus/roms.rb +0 -39
  320. data/lib/badline/address_bus/saved_state.rb +0 -66
  321. data/lib/badline/address_bus/sid_slots.rb +0 -42
  322. data/lib/badline/address_bus.rb +0 -216
  323. data/lib/badline/cartridge/action_replay.rb +0 -126
  324. data/lib/badline/cartridge/atomic_power.rb +0 -24
  325. data/lib/badline/cartridge/bank.rb +0 -81
  326. data/lib/badline/cartridge/comal80.rb +0 -50
  327. data/lib/badline/cartridge/dinamic.rb +0 -34
  328. data/lib/badline/cartridge/easy_flash.rb +0 -145
  329. data/lib/badline/cartridge/epyx_fastload.rb +0 -79
  330. data/lib/badline/cartridge/final_cartridge3.rb +0 -89
  331. data/lib/badline/cartridge/flash.rb +0 -306
  332. data/lib/badline/cartridge/freezer.rb +0 -33
  333. data/lib/badline/cartridge/fun_play.rb +0 -38
  334. data/lib/badline/cartridge/g_mod2.rb +0 -74
  335. data/lib/badline/cartridge/game_system.rb +0 -40
  336. data/lib/badline/cartridge/geo_ram.rb +0 -79
  337. data/lib/badline/cartridge/kcs_power.rb +0 -75
  338. data/lib/badline/cartridge/mach5.rb +0 -32
  339. data/lib/badline/cartridge/magic_desk.rb +0 -30
  340. data/lib/badline/cartridge/ocean.rb +0 -35
  341. data/lib/badline/cartridge/pagefox.rb +0 -68
  342. data/lib/badline/cartridge/retro_replay.rb +0 -320
  343. data/lib/badline/cartridge/rex_utility.rb +0 -29
  344. data/lib/badline/cartridge/rgcd.rb +0 -58
  345. data/lib/badline/cartridge/simons_basic.rb +0 -35
  346. data/lib/badline/cartridge/standard.rb +0 -15
  347. data/lib/badline/cartridge/super_games.rb +0 -48
  348. data/lib/badline/cartridge/westermann.rb +0 -30
  349. data/lib/badline/cartridge/zaxxon.rb +0 -66
  350. data/lib/badline/cartridge.rb +0 -303
  351. data/lib/badline/checkpoint.rb +0 -98
  352. data/lib/badline/cia/fast_forward.rb +0 -60
  353. data/lib/badline/cia/interrupt_register.rb +0 -143
  354. data/lib/badline/cia/serial.rb +0 -275
  355. data/lib/badline/cia/state.rb +0 -47
  356. data/lib/badline/cia/timer.rb +0 -206
  357. data/lib/badline/cia.rb +0 -279
  358. data/lib/badline/color_memory.rb +0 -25
  359. data/lib/badline/control_ports.rb +0 -76
  360. data/lib/badline/cpu/addressing.rb +0 -131
  361. data/lib/badline/cpu/boundary.rb +0 -54
  362. data/lib/badline/cpu/core.rb +0 -165
  363. data/lib/badline/cpu/microcode.rb +0 -177
  364. data/lib/badline/cpu/operations.rb +0 -88
  365. data/lib/badline/cpu/saved_state.rb +0 -115
  366. data/lib/badline/cpu/stack_operations.rb +0 -82
  367. data/lib/badline/cpu.rb +0 -10
  368. data/lib/badline/cpu_port.rb +0 -112
  369. data/lib/badline/datasette.rb +0 -161
  370. data/lib/badline/drive/core.rb +0 -147
  371. data/lib/badline/drive/fast_serial.rb +0 -73
  372. data/lib/badline/drive/idle.rb +0 -125
  373. data/lib/badline/drive/idle_cpu.rb +0 -28
  374. data/lib/badline/drive/orbit.rb +0 -79
  375. data/lib/badline/drive/serial_lines.rb +0 -73
  376. data/lib/badline/drive/sleep.rb +0 -112
  377. data/lib/badline/drive/vias.rb +0 -84
  378. data/lib/badline/drive/watch.rb +0 -150
  379. data/lib/badline/drive.rb +0 -11
  380. data/lib/badline/drive1541/bus.rb +0 -86
  381. data/lib/badline/drive1541/byte_ready.rb +0 -48
  382. data/lib/badline/drive1541/cpu.rb +0 -11
  383. data/lib/badline/drive1541/disk.rb +0 -315
  384. data/lib/badline/drive1541/disk_state.rb +0 -86
  385. data/lib/badline/drive1541/disk_via.rb +0 -36
  386. data/lib/badline/drive1541/gcr.rb +0 -57
  387. data/lib/badline/drive1541/mechanism.rb +0 -313
  388. data/lib/badline/drive1541/mechanism_state.rb +0 -68
  389. data/lib/badline/drive1541/rotation.rb +0 -121
  390. data/lib/badline/drive1541/sector_reader.rb +0 -76
  391. data/lib/badline/drive1541/serial_port.rb +0 -18
  392. data/lib/badline/drive1541/track.rb +0 -98
  393. data/lib/badline/drive1541.rb +0 -111
  394. data/lib/badline/drive1571/bus.rb +0 -111
  395. data/lib/badline/drive1571/cpu.rb +0 -11
  396. data/lib/badline/drive1571/serial_port.rb +0 -37
  397. data/lib/badline/drive1571/serial_via.rb +0 -25
  398. data/lib/badline/drive1571/wd1770.rb +0 -120
  399. data/lib/badline/drive1571.rb +0 -175
  400. data/lib/badline/drive1581/bus.rb +0 -137
  401. data/lib/badline/drive1581/cpu.rb +0 -11
  402. data/lib/badline/drive1581/disk.rb +0 -135
  403. data/lib/badline/drive1581/disk_state.rb +0 -87
  404. data/lib/badline/drive1581/mechanism.rb +0 -117
  405. data/lib/badline/drive1581/serial_port.rb +0 -52
  406. data/lib/badline/drive1581/slot.rb +0 -78
  407. data/lib/badline/drive1581/track.rb +0 -100
  408. data/lib/badline/drive1581/track_bytes.rb +0 -75
  409. data/lib/badline/drive1581/wd1772/registers.rb +0 -89
  410. data/lib/badline/drive1581/wd1772/sector_writes.rb +0 -73
  411. data/lib/badline/drive1581/wd1772/sectors.rb +0 -150
  412. data/lib/badline/drive1581/wd1772/state.rb +0 -66
  413. data/lib/badline/drive1581/wd1772/stepping.rb +0 -109
  414. data/lib/badline/drive1581/wd1772/tracks.rb +0 -125
  415. data/lib/badline/drive1581/wd1772/turn.rb +0 -73
  416. data/lib/badline/drive1581/wd1772.rb +0 -216
  417. data/lib/badline/drive1581.rb +0 -233
  418. data/lib/badline/iec_bus.rb +0 -159
  419. data/lib/badline/instruction.rb +0 -334
  420. data/lib/badline/instruction_set/arithmetic.rb +0 -114
  421. data/lib/badline/instruction_set/bitwise.rb +0 -126
  422. data/lib/badline/instruction_set/branch.rb +0 -79
  423. data/lib/badline/instruction_set/flag.rb +0 -63
  424. data/lib/badline/instruction_set/illegal.rb +0 -270
  425. data/lib/badline/instruction_set/inc_dec.rb +0 -69
  426. data/lib/badline/instruction_set/stack.rb +0 -52
  427. data/lib/badline/instruction_set/transfer.rb +0 -137
  428. data/lib/badline/instruction_set.rb +0 -55
  429. data/lib/badline/interrupts.rb +0 -104
  430. data/lib/badline/joystick.rb +0 -25
  431. data/lib/badline/kernal_trap/channel.rb +0 -181
  432. data/lib/badline/keyboard.rb +0 -112
  433. data/lib/badline/ram_expansion/banking.rb +0 -30
  434. data/lib/badline/ram_expansion/plus256k.rb +0 -54
  435. data/lib/badline/ram_expansion/plus60k.rb +0 -43
  436. data/lib/badline/ram_expansion/unexpanded.rb +0 -28
  437. data/lib/badline/ram_expansion.rb +0 -21
  438. data/lib/badline/reu/dma/saved_state.rb +0 -50
  439. data/lib/badline/reu/dma.rb +0 -273
  440. data/lib/badline/reu/ram.rb +0 -107
  441. data/lib/badline/reu/saved_state.rb +0 -80
  442. data/lib/badline/reu/trigger.rb +0 -32
  443. data/lib/badline/reu.rb +0 -289
  444. data/lib/badline/sid/catch_up.rb +0 -120
  445. data/lib/badline/sid/decimator.rb +0 -64
  446. data/lib/badline/sid/envelope/state.rb +0 -68
  447. data/lib/badline/sid/envelope.rb +0 -239
  448. data/lib/badline/sid/filter.rb +0 -263
  449. data/lib/badline/sid/voice.rb +0 -77
  450. data/lib/badline/sid/waveform/combined.rb +0 -126
  451. data/lib/badline/sid/waveform/fast_forward.rb +0 -105
  452. data/lib/badline/sid/waveform/noise_writeback.rb +0 -122
  453. data/lib/badline/sid/waveform/state.rb +0 -66
  454. data/lib/badline/sid/waveform.rb +0 -305
  455. data/lib/badline/sid.rb +0 -303
  456. data/lib/badline/time_of_day.rb +0 -228
  457. data/lib/badline/traps.rb +0 -19
  458. data/lib/badline/via/control_lines.rb +0 -122
  459. data/lib/badline/via/fast_forward.rb +0 -53
  460. data/lib/badline/via/interrupt_register.rb +0 -67
  461. data/lib/badline/via/shift_register.rb +0 -180
  462. data/lib/badline/via/state.rb +0 -42
  463. data/lib/badline/via/timer1.rb +0 -131
  464. data/lib/badline/via/timer2.rb +0 -133
  465. data/lib/badline/via.rb +0 -266
  466. data/lib/badline/vic/bank.rb +0 -133
  467. data/lib/badline/vic/border_mask.rb +0 -86
  468. data/lib/badline/vic/collisions.rb +0 -115
  469. data/lib/badline/vic/color_patches.rb +0 -47
  470. data/lib/badline/vic/display_state.rb +0 -185
  471. data/lib/badline/vic/graphics_mode.rb +0 -164
  472. data/lib/badline/vic/graphics_shifter.rb +0 -207
  473. data/lib/badline/vic/register_log.rb +0 -81
  474. data/lib/badline/vic/registers.rb +0 -195
  475. data/lib/badline/vic/sequencer.rb +0 -275
  476. data/lib/badline/vic/sequencer_output.rb +0 -116
  477. data/lib/badline/vic/sequencer_state.rb +0 -89
  478. data/lib/badline/vic/sprite/internal_bus.rb +0 -68
  479. data/lib/badline/vic/sprite/saved_state.rb +0 -64
  480. data/lib/badline/vic/sprite/shifter.rb +0 -146
  481. data/lib/badline/vic/sprite/timing.rb +0 -56
  482. data/lib/badline/vic/sprite.rb +0 -337
  483. data/lib/badline/vic/sprites.rb +0 -282
  484. data/lib/badline/vic/sprites_state.rb +0 -57
  485. data/lib/badline/vic.rb +0 -853
  486. data/lib/badline/vic20/sound/output.rb +0 -83
  487. data/lib/badline/vic20/sound.rb +0 -233
  488. data/lib/badline/z80/arithmetic.rb +0 -117
  489. data/lib/badline/z80/bit_page.rb +0 -55
  490. data/lib/badline/z80/block_io.rb +0 -58
  491. data/lib/badline/z80/block_transfers.rb +0 -59
  492. data/lib/badline/z80/bus_cycles.rb +0 -111
  493. data/lib/badline/z80/core.rb +0 -113
  494. data/lib/badline/z80/exchanges.rb +0 -50
  495. data/lib/badline/z80/extended_page.rb +0 -89
  496. data/lib/badline/z80/flags.rb +0 -37
  497. data/lib/badline/z80/interrupt_acceptance.rb +0 -46
  498. data/lib/badline/z80/jumps.rb +0 -82
  499. data/lib/badline/z80/loads.rb +0 -98
  500. data/lib/badline/z80/main_page.rb +0 -134
  501. data/lib/badline/z80/registers.rb +0 -120
  502. data/lib/badline/z80/saved_state.rb +0 -69
  503. data/lib/badline/z80/shifts.rb +0 -64
  504. data/lib/badline/z80.rb +0 -11
  505. /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