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,126 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Badline
4
- module InstructionSet
5
- module Bitwise
6
- # Performs bitwise AND on accumulator with memory.
7
- #
8
- # Opcodes:
9
- # $21 - indirect_x - 6 cycles
10
- # $25 - zeropage - 3 cycles
11
- # $29 - immediate - 2 cycles
12
- # $2D - absolute - 4 cycles
13
- # $31 - indirect_y - 5+ cycles
14
- # $35 - zeropage_x - 4 cycles
15
- # $39 - absolute_y - 4+ cycles
16
- # $3D - absolute_x - 4+ cycles
17
- def and(_addr, value)
18
- @a &= value
19
- update_number_flags(@a)
20
- end
21
-
22
- # Arithmetic shift left. Shifts bits left by one position.
23
- #
24
- # Opcodes:
25
- # $06 - zeropage - 5 cycles
26
- # $0A - accumulator- 2 cycles
27
- # $0E - absolute - 6 cycles
28
- # $16 - zeropage_x - 6 cycles
29
- # $1E - absolute_x - 7 cycles
30
- def asl(addr, value)
31
- result = (value << 1) & 0xff
32
- status.carry = value[7]
33
- write_modified(addr, result)
34
- update_number_flags(result)
35
- end
36
-
37
- # Tests bits in memory with accumulator.
38
- #
39
- # Opcodes:
40
- # $24 - zeropage - 3 cycles
41
- # $2C - absolute - 4 cycles
42
- def bit(_addr, value)
43
- status.value = ((status.value & 0b00111111) +
44
- (value & 0b11000000)).to_i
45
- status.zero = (a & value).nobits?(0xff)
46
- end
47
-
48
- # Performs bitwise XOR on accumulator with memory.
49
- #
50
- # Opcodes:
51
- # $41 - indirect_x - 6 cycles
52
- # $45 - zeropage - 3 cycles
53
- # $49 - immediate - 2 cycles
54
- # $4D - absolute - 4 cycles
55
- # $51 - indirect_y - 5+ cycles
56
- # $55 - zeropage_x - 4 cycles
57
- # $59 - absolute_y - 4+ cycles
58
- # $5D - absolute_x - 4+ cycles
59
- def eor(_addr, value)
60
- @a = (@a ^ value) & 0xff
61
- update_number_flags(@a)
62
- end
63
-
64
- # Logical shift right. Shifts bits right by one position.
65
- #
66
- # Opcodes:
67
- # $46 - zeropage - 5 cycles
68
- # $4A - accumulator- 2 cycles
69
- # $4E - absolute - 6 cycles
70
- # $56 - zeropage_x - 6 cycles
71
- # $5E - absolute_x - 7 cycles
72
- def lsr(addr, value)
73
- result = (value >> 1) & 0xff
74
- status.carry = value[0]
75
- write_modified(addr, result)
76
- update_number_flags(result)
77
- end
78
-
79
- # Performs bitwise OR on accumulator with memory.
80
- #
81
- # Opcodes:
82
- # $01 - indirect_x - 6 cycles
83
- # $05 - zeropage - 3 cycles
84
- # $09 - immediate - 2 cycles
85
- # $0D - absolute - 4 cycles
86
- # $11 - indirect_y - 5+ cycles
87
- # $15 - zeropage_x - 4 cycles
88
- # $19 - absolute_y - 4+ cycles
89
- # $1D - absolute_x - 4+ cycles
90
- def ora(_addr, value)
91
- @a |= value
92
- update_number_flags(@a)
93
- end
94
-
95
- # Rotate left through carry.
96
- #
97
- # Opcodes:
98
- # $26 - zeropage - 5 cycles
99
- # $2A - accumulator- 2 cycles
100
- # $2E - absolute - 6 cycles
101
- # $36 - zeropage_x - 6 cycles
102
- # $3E - absolute_x - 7 cycles
103
- def rol(addr, value)
104
- result = ((value << 1) + status.carry) & 0xff
105
- status.carry = value[7]
106
- write_modified(addr, result)
107
- update_number_flags(result)
108
- end
109
-
110
- # Rotate right through carry.
111
- #
112
- # Opcodes:
113
- # $66 - zeropage - 5 cycles
114
- # $6A - accumulator- 2 cycles
115
- # $6E - absolute - 6 cycles
116
- # $76 - zeropage_x - 6 cycles
117
- # $7E - absolute_x - 7 cycles
118
- def ror(addr, value)
119
- result = ((value >> 1) + (status.carry? ? 0x80 : 0)) & 0xff
120
- status.carry = value[0]
121
- write_modified(addr, result)
122
- update_number_flags(result)
123
- end
124
- end
125
- end
126
- end
@@ -1,79 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Badline
4
- module InstructionSet
5
- module Branch
6
- # Branch if carry clear (C=0).
7
- #
8
- # Opcodes:
9
- # $90 - relative - 2+ cycles
10
- def bcc(_addr, _value)
11
- take_branch unless status.carry?
12
- end
13
-
14
- # Branch if carry set (C=1).
15
- #
16
- # Opcodes:
17
- # $B0 - relative - 2+ cycles
18
- def bcs(_addr, _value)
19
- take_branch if status.carry?
20
- end
21
-
22
- # Branch if equal (Z=1).
23
- #
24
- # Opcodes:
25
- # $F0 - relative - 2+ cycles
26
- def beq(_addr, _value)
27
- take_branch if status.zero?
28
- end
29
-
30
- # Branch if minus (N=1).
31
- #
32
- # Opcodes:
33
- # $30 - relative - 2+ cycles
34
- def bmi(_addr, _value)
35
- take_branch if status.negative?
36
- end
37
-
38
- # Branch if not equal (Z=0).
39
- #
40
- # Opcodes:
41
- # $D0 - relative - 2+ cycles
42
- def bne(_addr, _value)
43
- take_branch unless status.zero?
44
- end
45
-
46
- # Branch if plus (N=0).
47
- #
48
- # Opcodes:
49
- # $10 - relative - 2+ cycles
50
- def bpl(_addr, _value)
51
- take_branch unless status.negative?
52
- end
53
-
54
- # Branch if overflow clear (V=0).
55
- #
56
- # Opcodes:
57
- # $50 - relative - 2+ cycles
58
- def bvc(_addr, _value)
59
- take_branch unless status.overflow?
60
- end
61
-
62
- # Branch if overflow set (V=1).
63
- #
64
- # Opcodes:
65
- # $70 - relative - 2+ cycles
66
- def bvs(_addr, _value)
67
- take_branch if status.overflow?
68
- end
69
-
70
- private
71
-
72
- # Marks the branch as taken. Operations#op_relative reads the flag
73
- # and runs the extra cycles.
74
- def take_branch
75
- @branch_taken = true
76
- end
77
- end
78
- end
79
- end
@@ -1,63 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Badline
4
- module InstructionSet
5
- module Flag
6
- # Clear carry flag.
7
- #
8
- # Opcodes:
9
- # $18 - implied - 2 cycles
10
- def clc(_addr, _value)
11
- status.carry = false
12
- end
13
-
14
- # Clear decimal mode flag.
15
- #
16
- # Opcodes:
17
- # $D8 - implied - 2 cycles
18
- def cld(_addr, _value)
19
- status.decimal = false
20
- end
21
-
22
- # Clear interrupt disable flag.
23
- #
24
- # Opcodes:
25
- # $58 - implied - 2 cycles
26
- def cli(_addr, _value)
27
- status.interrupt = false
28
- end
29
-
30
- # Clear overflow flag.
31
- #
32
- # Opcodes:
33
- # $B8 - implied - 2 cycles
34
- def clv(_addr, _value)
35
- status.overflow = false
36
- end
37
-
38
- # Set carry flag.
39
- #
40
- # Opcodes:
41
- # $38 - implied - 2 cycles
42
- def sec(_addr, _value)
43
- status.carry = true
44
- end
45
-
46
- # Set decimal mode flag.
47
- #
48
- # Opcodes:
49
- # $F8 - implied - 2 cycles
50
- def sed(_addr, _value)
51
- status.decimal = true
52
- end
53
-
54
- # Set interrupt disable flag.
55
- #
56
- # Opcodes:
57
- # $78 - implied - 2 cycles
58
- def sei(_addr, _value)
59
- status.interrupt = true
60
- end
61
- end
62
- end
63
- end
@@ -1,270 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Badline
4
- module InstructionSet
5
- # Illegal opcodes
6
- module Illegal
7
- # Combination of AND and LSR.
8
- #
9
- # Opcodes:
10
- # $4B - immediate - 2 cycles
11
- def alr(_addr, value)
12
- @a &= value
13
- status.carry = @a[0]
14
- @a = (@a >> 1) & 0xff
15
- update_number_flags(@a)
16
- end
17
-
18
- # Combination of AND where carry is set to bit 7 of result.
19
- #
20
- # Opcodes:
21
- # $0B, $2B - immediate - 2 cycles
22
- def anc(addr, value)
23
- self.and(addr, value)
24
- status.carry = status.negative
25
- end
26
-
27
- # Unstable instruction. AND's value with A|magic_const and X.
28
- # Magic constant varies by CPU. A VIC stall between the opcode and
29
- # operand fetches clears its bits 0 and 4.
30
- #
31
- # Opcodes:
32
- # $8B - immediate - 2 cycles
33
- def ane(_addr, value)
34
- magic_const = stalled_before_this_cycle? ? @ane_constant & 0xee : @ane_constant
35
- @a = (a | magic_const) & x & value
36
- update_number_flags(@a)
37
- end
38
-
39
- # Combination of AND and ROR.
40
- #
41
- # Opcodes:
42
- # $6B - immediate - 2 cycles
43
- def arr(_addr, value)
44
- tmp = a & value
45
- result = (tmp >> 1) | (status.carry? ? 0x80 : 0)
46
- status.zero = result.zero?
47
- status.negative = status.carry
48
-
49
- if status.decimal?
50
- status.overflow = (result ^ tmp).anybits?(0x40)
51
-
52
- # Low nibble
53
- result = (result & 0xf0) | ((result + 0x06) & 0x0f) if ((tmp & 0x0f) + (tmp & 0x01)) > 0x05
54
-
55
- # High nibble + carry
56
- if ((tmp & 0xf0) + (tmp & 0x10)) > 0x50
57
- result = (result & 0x0f) | ((result + 0x60) & 0xf0)
58
- status.carry = true
59
- else
60
- status.carry = false
61
- end
62
- else
63
- status.carry = tmp[7] == 1
64
- status.overflow = tmp[7] ^ tmp[6]
65
- end
66
-
67
- @a = result
68
- end
69
-
70
- # Combination of DEC and CMP operations.
71
- #
72
- # Opcodes:
73
- # $C3 - indirect_x - 8 cycles
74
- # $C7 - zeropage - 5 cycles
75
- # $CF - absolute - 6 cycles
76
- # $D3 - indirect_y - 8 cycles
77
- # $D7 - zeropage_x - 6 cycles
78
- # $DB - absolute_y - 7 cycles
79
- # $DF - absolute_x - 7 cycles
80
- def dcp(addr, value)
81
- cmp(addr, dec(addr, value))
82
- end
83
-
84
- # Combination of INC and SBC operations.
85
- #
86
- # Opcodes:
87
- # $E3 - indirect_x - 8 cycles
88
- # $E7 - zeropage - 5 cycles
89
- # $EF - absolute - 6 cycles
90
- # $F3 - indirect_y - 8 cycles
91
- # $F7 - zeropage_x - 6 cycles
92
- # $FB - absolute_y - 7 cycles
93
- # $FF - absolute_x - 7 cycles
94
- def isc(addr, value)
95
- sbc(addr, inc(addr, value))
96
- end
97
-
98
- # Loads A and S with value AND stack pointer.
99
- #
100
- # Opcodes:
101
- # $BB - absolute_y - 4 cycles
102
- def las(_addr, value)
103
- @a = @x = @stack_pointer = value & stack_pointer
104
- update_number_flags(@a)
105
- end
106
-
107
- # Combination of LDA and LDX with same value.
108
- #
109
- # Opcodes:
110
- # $A3 - indirect_x - 6 cycles
111
- # $A7 - zeropage - 3 cycles
112
- # $AF - absolute - 4 cycles
113
- # $B3 - indirect_y - 5+ cycles
114
- # $B7 - zeropage_y - 4 cycles
115
- # $BF - absolute_y - 4+ cycles
116
- def lax(_addr, value)
117
- @a = @x = value
118
-
119
- update_number_flags(@a)
120
- end
121
-
122
- # Unstable immediate form of LAX. Loads A and X with
123
- # (A | magic_const) AND value. Magic constant varies by CPU.
124
- #
125
- # Opcodes:
126
- # $AB - immediate - 2 cycles
127
- def lxa(_addr, value)
128
- magic_const = 0xee
129
- @a = @x = (a | magic_const) & value
130
- update_number_flags(@a)
131
- end
132
-
133
- # Special no-operation instruction that does not consume a CPU cycle,
134
- # unlike the standard NOP. Used by some illegal opcodes.
135
- #
136
- # Opcodes:
137
- # $80, $82, $89, $C2, $E2 - immediate - 2 cycles
138
- def nop_nocycle(_addr, _value); end
139
-
140
- # Combination of ROL and AND operations.
141
- #
142
- # Opcodes:
143
- # $23 - indirect_x - 8 cycles
144
- # $27 - zeropage - 5 cycles
145
- # $2F - absolute - 6 cycles
146
- # $33 - indirect_y - 8 cycles
147
- # $37 - zeropage_x - 6 cycles
148
- # $3B - absolute_y - 7 cycles
149
- # $3F - absolute_x - 7 cycles
150
- def rla(addr, value)
151
- self.and(addr, rol(addr, value))
152
- end
153
-
154
- # Combination of ROR and ADC operations.
155
- #
156
- # Opcodes:
157
- # $63 - indirect_x - 8 cycles
158
- # $67 - zeropage - 5 cycles
159
- # $6F - absolute - 6 cycles
160
- # $73 - indirect_y - 8 cycles
161
- # $77 - zeropage_x - 6 cycles
162
- # $7B - absolute_y - 7 cycles
163
- # $7F - absolute_x - 7 cycles
164
- def rra(addr, value)
165
- adc(addr, ror(addr, value))
166
- end
167
-
168
- # Store A AND X.
169
- #
170
- # Opcodes:
171
- # $83 - indirect_x - 6 cycles
172
- # $87 - zeropage - 3 cycles
173
- # $8F - absolute - 4 cycles
174
- # $97 - zeropage_y - 4 cycles
175
- def sax(addr, _value)
176
- write_byte(addr, @a & @x)
177
- end
178
-
179
- # AND X register with accumulator and subtract value.
180
- #
181
- # Opcodes:
182
- # $CB - immediate - 2 cycles
183
- def sbx(_addr, value)
184
- result = (@x & @a) - value
185
- status.carry = result >= 0
186
- @x = result & 0xff
187
- update_number_flags(@x)
188
- end
189
-
190
- # Stores A AND X AND (high byte of base address + 1) at addr.
191
- #
192
- # Opcodes:
193
- # $93 - indirect_y - 6 cycles
194
- # $9F - absolute_y - 5 cycles
195
- def sha(addr, _value)
196
- store_high_and(a & x, addr)
197
- end
198
-
199
- # Stores X AND (high byte of base address + 1) at addr.
200
- #
201
- # Opcodes:
202
- # $9E - absolute_y - 5 cycles
203
- def shx(addr, _value)
204
- store_high_and(x, addr)
205
- end
206
-
207
- # Stores Y AND (high byte of base address + 1) at addr.
208
- #
209
- # Opcodes:
210
- # $9C - absolute_x - 5 cycles
211
- def shy(addr, _value)
212
- store_high_and(y, addr)
213
- end
214
-
215
- # Combination of ASL and ORA operations.
216
- #
217
- # Opcodes:
218
- # $03 - indirect_x - 8 cycles
219
- # $07 - zeropage - 5 cycles
220
- # $0F - absolute - 6 cycles
221
- # $13 - indirect_y - 8 cycles
222
- # $17 - zeropage_x - 6 cycles
223
- # $1B - absolute_y - 7 cycles
224
- # $1F - absolute_x - 7 cycles
225
- def slo(addr, value)
226
- ora(addr, asl(addr, value))
227
- end
228
-
229
- # Combination of LSR and EOR operations.
230
- #
231
- # Opcodes:
232
- # $43 - indirect_x - 8 cycles
233
- # $47 - zeropage - 5 cycles
234
- # $4F - absolute - 6 cycles
235
- # $53 - indirect_y - 8 cycles
236
- # $57 - zeropage_x - 6 cycles
237
- # $5B - absolute_y - 7 cycles
238
- # $5F - absolute_x - 7 cycles
239
- def sre(addr, value)
240
- eor(addr, lsr(addr, value))
241
- end
242
-
243
- # Stores A AND X in SP, then stores SP AND (high byte of base + 1) at
244
- # addr.
245
- #
246
- # Opcodes:
247
- # $9B - absolute_y - 5 cycles
248
- def tas(addr, _value)
249
- @stack_pointer = @a & @x
250
- store_high_and(stack_pointer, addr)
251
- end
252
-
253
- private
254
-
255
- # A VIC stall right before the dummy read, the second-to-last cycle,
256
- # drops the & (H+1) from the stored value but not from the high byte
257
- # of a page-crossing target.
258
- def store_high_and(register, addr)
259
- base_high = if boundary_crossed
260
- (high_byte(addr) - 1) & 0xff
261
- else
262
- high_byte(addr)
263
- end
264
- result = register & ((base_high + 1) & 0xff)
265
- target = boundary_crossed ? uint16(low_byte(addr), result) : addr
266
- write_byte(target, stalled_before_previous_cycle? ? register : result)
267
- end
268
- end
269
- end
270
- end
@@ -1,69 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Badline
4
- module InstructionSet
5
- module IncDec
6
- # Decrements memory location by one.
7
- #
8
- # Opcodes:
9
- # $C6 - zeropage - 5 cycles
10
- # $CE - absolute - 6 cycles
11
- # $D6 - zeropage_x - 6 cycles
12
- # $DE - absolute_x - 7 cycles
13
- def dec(addr, value)
14
- result = (value - 1) & 0xff
15
- write_modified(addr, result)
16
- update_number_flags(result)
17
- end
18
-
19
- # Decrements X register by one.
20
- #
21
- # Opcodes:
22
- # $CA - implied - 2 cycles
23
- def dex(_addr, _value)
24
- @x = (@x - 1) & 0xff
25
- update_number_flags(@x)
26
- end
27
-
28
- # Decrements Y register by one.
29
- #
30
- # Opcodes:
31
- # $88 - implied - 2 cycles
32
- def dey(_addr, _value)
33
- @y = (@y - 1) & 0xff
34
- update_number_flags(@y)
35
- end
36
-
37
- # Increments memory location by one.
38
- #
39
- # Opcodes:
40
- # $E6 - zeropage - 5 cycles
41
- # $EE - absolute - 6 cycles
42
- # $F6 - zeropage_x - 6 cycles
43
- # $FE - absolute_x - 7 cycles
44
- def inc(addr, value)
45
- result = (value + 1) & 0xff
46
- write_modified(addr, result)
47
- update_number_flags(result)
48
- end
49
-
50
- # Increments X register by one.
51
- #
52
- # Opcodes:
53
- # $E8 - implied - 2 cycles
54
- def inx(_addr, _value)
55
- @x = (@x + 1) & 0xff
56
- update_number_flags(@x)
57
- end
58
-
59
- # Increments Y register by one.
60
- #
61
- # Opcodes:
62
- # $C8 - implied - 2 cycles
63
- def iny(_addr, _value)
64
- @y = (@y + 1) & 0xff
65
- update_number_flags(@y)
66
- end
67
- end
68
- end
69
- end
@@ -1,52 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Badline
4
- module InstructionSet
5
- module Stack
6
- # Push accumulator onto the stack.
7
- #
8
- # Opcodes:
9
- # $48 - implied - 3 cycles
10
- def pha(_addr, _value)
11
- stack_push(@a)
12
- end
13
-
14
- # Push processor status onto the stack.
15
- #
16
- # Opcodes:
17
- # $08 - implied - 3 cycles
18
- def php(_addr, _value)
19
- stack_push(p | 0b00010000)
20
- end
21
-
22
- # Pull accumulator from stack.
23
- #
24
- # Opcodes:
25
- # $68 - implied - 4 cycles
26
- def pla(_addr, _value)
27
- @a = stack_pull
28
- update_number_flags(@a)
29
- end
30
-
31
- # Pull processor status from stack.
32
- #
33
- # Opcodes:
34
- # $28 - implied - 4 cycles
35
- def plp(_addr, _value)
36
- status.value = stack_pull & 0b11101111
37
- end
38
-
39
- private
40
-
41
- def stack_pull
42
- @stack_pointer = (@stack_pointer + 1) & 0xff
43
- @memory.peek(stack_address)
44
- end
45
-
46
- def stack_push(value)
47
- write_byte(stack_address, value)
48
- @stack_pointer = (@stack_pointer - 1) & 0xff
49
- end
50
- end
51
- end
52
- end