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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +17 -0
- data/CLAUDE.md +59 -31
- data/README.md +1 -1
- data/doc/library.md +9 -9
- data/doc/pinned-behaviour.md +105 -105
- data/doc/snapshots.md +1 -4
- data/lib/badline/audio/bare_player.rb +3 -3
- data/lib/badline/audio/cli.rb +6 -6
- data/lib/badline/audio/jukebox.rb +2 -2
- data/lib/badline/audio/machine_player.rb +2 -2
- data/lib/badline/{media → audio}/queue.rb +1 -1
- data/lib/badline/audio/queued_tune.rb +6 -6
- data/lib/badline/audio/renderer.rb +5 -5
- data/lib/badline/audio/stereo.rb +1 -1
- data/lib/badline/c128/{bus_state.rb → bus/saved_state.rb} +1 -1
- data/lib/badline/c128/bus.rb +18 -17
- data/lib/badline/c128/color_lines.rb +2 -2
- data/lib/badline/c128/cpu.rb +1 -1
- data/lib/badline/c128/drives.rb +10 -11
- data/lib/badline/c128/fast_serial.rb +5 -5
- data/lib/badline/c128/mmu_pages.rb +1 -1
- data/lib/badline/c128/modes.rb +2 -2
- data/lib/badline/c128/saved_state.rb +21 -47
- data/lib/badline/c128/z80.rb +2 -2
- data/lib/badline/c128.rb +14 -9
- data/lib/badline/{computer → c64}/attachments.rb +4 -6
- data/lib/badline/c64/banked_ram/banking.rb +32 -0
- data/lib/badline/c64/banked_ram/plus256k.rb +56 -0
- data/lib/badline/c64/banked_ram/plus60k.rb +45 -0
- data/lib/badline/c64/banked_ram/unexpanded.rb +30 -0
- data/lib/badline/c64/banked_ram.rb +23 -0
- data/lib/badline/c64/bus/extra_sids.rb +32 -0
- data/lib/badline/c64/bus/fittings.rb +40 -0
- data/lib/badline/c64/bus/pla.rb +149 -0
- data/lib/badline/c64/bus/roms.rb +41 -0
- data/lib/badline/c64/bus/saved_state.rb +68 -0
- data/lib/badline/c64/bus/sid_slots.rb +44 -0
- data/lib/badline/c64/bus.rb +218 -0
- data/lib/badline/c64/cartridge/action_replay.rb +128 -0
- data/lib/badline/c64/cartridge/atomic_power.rb +26 -0
- data/lib/badline/c64/cartridge/bank.rb +83 -0
- data/lib/badline/c64/cartridge/comal80.rb +52 -0
- data/lib/badline/c64/cartridge/dinamic.rb +36 -0
- data/lib/badline/c64/cartridge/easy_flash.rb +147 -0
- data/lib/badline/c64/cartridge/epyx_fastload.rb +81 -0
- data/lib/badline/c64/cartridge/final_cartridge3.rb +91 -0
- data/lib/badline/c64/cartridge/flash/saved_state.rb +40 -0
- data/lib/badline/c64/cartridge/flash.rb +279 -0
- data/lib/badline/c64/cartridge/freezer.rb +35 -0
- data/lib/badline/c64/cartridge/fun_play.rb +40 -0
- data/lib/badline/c64/cartridge/g_mod2.rb +76 -0
- data/lib/badline/c64/cartridge/game_system.rb +42 -0
- data/lib/badline/c64/cartridge/geo_ram.rb +81 -0
- data/lib/badline/c64/cartridge/kcs_power.rb +77 -0
- data/lib/badline/c64/cartridge/mach5.rb +34 -0
- data/lib/badline/c64/cartridge/magic_desk.rb +32 -0
- data/lib/badline/c64/cartridge/ocean.rb +37 -0
- data/lib/badline/c64/cartridge/pagefox.rb +70 -0
- data/lib/badline/c64/cartridge/retro_replay/saved_state.rb +47 -0
- data/lib/badline/c64/cartridge/retro_replay.rb +286 -0
- data/lib/badline/c64/cartridge/rex_utility.rb +31 -0
- data/lib/badline/c64/cartridge/rgcd.rb +60 -0
- data/lib/badline/c64/cartridge/saved_state.rb +63 -0
- data/lib/badline/c64/cartridge/simons_basic.rb +37 -0
- data/lib/badline/c64/cartridge/standard.rb +17 -0
- data/lib/badline/c64/cartridge/super_games.rb +50 -0
- data/lib/badline/c64/cartridge/westermann.rb +32 -0
- data/lib/badline/c64/cartridge/zaxxon.rb +68 -0
- data/lib/badline/c64/cartridge.rb +258 -0
- data/lib/badline/c64/color_memory.rb +27 -0
- data/lib/badline/{computer → c64}/common.rb +2 -2
- data/lib/badline/{computer → c64}/kernal_traps.rb +18 -18
- data/lib/badline/c64/reu/dma/saved_state.rb +52 -0
- data/lib/badline/c64/reu/dma.rb +275 -0
- data/lib/badline/c64/reu/ram.rb +109 -0
- data/lib/badline/c64/reu/saved_state.rb +55 -0
- data/lib/badline/c64/reu/trigger.rb +34 -0
- data/lib/badline/c64/reu.rb +291 -0
- data/lib/badline/{computer → c64}/saved_state.rb +13 -18
- data/lib/badline/{computer → c64}/true_drives.rb +11 -11
- data/lib/badline/{computer.rb → c64.rb} +18 -13
- data/lib/badline/chips/cia/fast_forward.rb +62 -0
- data/lib/badline/chips/cia/interrupt_register.rb +145 -0
- data/lib/badline/chips/cia/saved_state.rb +49 -0
- data/lib/badline/chips/cia/serial/saved_state.rb +45 -0
- data/lib/badline/chips/cia/serial.rb +250 -0
- data/lib/badline/chips/cia/time_of_day.rb +232 -0
- data/lib/badline/chips/cia/timer.rb +208 -0
- data/lib/badline/chips/cia.rb +281 -0
- data/lib/badline/chips/cpu/addressing.rb +133 -0
- data/lib/badline/chips/cpu/boundary.rb +56 -0
- data/lib/badline/chips/cpu/core.rb +167 -0
- data/lib/badline/chips/cpu/instruction.rb +338 -0
- data/lib/badline/chips/cpu/instruction_set/arithmetic.rb +118 -0
- data/lib/badline/chips/cpu/instruction_set/bitwise.rb +130 -0
- data/lib/badline/chips/cpu/instruction_set/branch.rb +83 -0
- data/lib/badline/chips/cpu/instruction_set/flag.rb +67 -0
- data/lib/badline/chips/cpu/instruction_set/illegal.rb +274 -0
- data/lib/badline/chips/cpu/instruction_set/inc_dec.rb +73 -0
- data/lib/badline/chips/cpu/instruction_set/stack.rb +56 -0
- data/lib/badline/chips/cpu/instruction_set/transfer.rb +141 -0
- data/lib/badline/chips/cpu/instruction_set.rb +59 -0
- data/lib/badline/chips/cpu/interrupts.rb +108 -0
- data/lib/badline/chips/cpu/microcode.rb +179 -0
- data/lib/badline/chips/cpu/operations.rb +90 -0
- data/lib/badline/chips/cpu/port.rb +116 -0
- data/lib/badline/chips/cpu/saved_state.rb +117 -0
- data/lib/badline/chips/cpu/stack_operations.rb +84 -0
- data/lib/badline/chips/cpu/traps.rb +23 -0
- data/lib/badline/chips/cpu.rb +12 -0
- data/lib/badline/chips/sid/catch_up.rb +122 -0
- data/lib/badline/chips/sid/decimator.rb +66 -0
- data/lib/badline/chips/sid/envelope/saved_state.rb +70 -0
- data/lib/badline/chips/sid/envelope.rb +241 -0
- data/lib/badline/chips/sid/filter/saved_state.rb +42 -0
- data/lib/badline/chips/sid/filter.rb +241 -0
- data/lib/badline/chips/sid/saved_state.rb +52 -0
- data/lib/badline/chips/sid/voice.rb +79 -0
- data/lib/badline/chips/sid/waveform/combined.rb +128 -0
- data/lib/badline/chips/sid/waveform/fast_forward.rb +107 -0
- data/lib/badline/chips/sid/waveform/noise_writeback.rb +124 -0
- data/lib/badline/chips/sid/waveform/saved_state.rb +68 -0
- data/lib/badline/chips/sid/waveform.rb +307 -0
- data/lib/badline/chips/sid.rb +265 -0
- data/lib/badline/{c128 → chips}/vdc/memory.rb +1 -1
- data/lib/badline/{c128 → chips}/vdc/painter.rb +1 -1
- data/lib/badline/{c128 → chips}/vdc/raster.rb +1 -1
- data/lib/badline/chips/vdc/saved_state.rb +36 -0
- data/lib/badline/{c128 → chips}/vdc/window.rb +1 -1
- data/lib/badline/{c128 → chips}/vdc.rb +7 -31
- data/lib/badline/chips/via/control_lines.rb +124 -0
- data/lib/badline/chips/via/fast_forward.rb +55 -0
- data/lib/badline/chips/via/interrupt_register.rb +69 -0
- data/lib/badline/chips/via/saved_state.rb +44 -0
- data/lib/badline/chips/via/shift_register.rb +182 -0
- data/lib/badline/chips/via/timer1.rb +133 -0
- data/lib/badline/chips/via/timer2.rb +135 -0
- data/lib/badline/chips/via.rb +268 -0
- data/lib/badline/chips/vic/bank.rb +135 -0
- data/lib/badline/chips/vic/border_mask.rb +88 -0
- data/lib/badline/chips/vic/collisions.rb +117 -0
- data/lib/badline/chips/vic/color_patches.rb +49 -0
- data/lib/badline/chips/vic/display_state.rb +187 -0
- data/lib/badline/chips/vic/graphics_mode.rb +166 -0
- data/lib/badline/chips/vic/graphics_shifter/saved_state.rb +40 -0
- data/lib/badline/chips/vic/graphics_shifter.rb +187 -0
- data/lib/badline/chips/vic/register_log.rb +83 -0
- data/lib/badline/chips/vic/registers.rb +197 -0
- data/lib/badline/chips/vic/saved_state.rb +82 -0
- data/lib/badline/chips/vic/sequencer/saved_state.rb +91 -0
- data/lib/badline/chips/vic/sequencer.rb +277 -0
- data/lib/badline/chips/vic/sequencer_output.rb +118 -0
- data/lib/badline/chips/vic/sprite/internal_bus.rb +70 -0
- data/lib/badline/chips/vic/sprite/saved_state.rb +66 -0
- data/lib/badline/chips/vic/sprite/shifter.rb +148 -0
- data/lib/badline/chips/vic/sprite/timing.rb +58 -0
- data/lib/badline/chips/vic/sprite.rb +339 -0
- data/lib/badline/chips/vic/sprites/saved_state.rb +59 -0
- data/lib/badline/chips/vic/sprites.rb +284 -0
- data/lib/badline/chips/vic.rb +783 -0
- data/lib/badline/chips/vic_i/painter/saved_state.rb +40 -0
- data/lib/badline/{vic20/vic → chips/vic_i}/painter.rb +6 -30
- data/lib/badline/{vic20/vic → chips/vic_i}/saved_state.rb +2 -2
- data/lib/badline/chips/vic_i/sound/output.rb +85 -0
- data/lib/badline/chips/vic_i/sound.rb +235 -0
- data/lib/badline/{vic20/vic → chips/vic_i}/text_window.rb +2 -2
- data/lib/badline/{vic20/vic.rb → chips/vic_i.rb} +5 -5
- data/lib/badline/chips/z80/arithmetic.rb +119 -0
- data/lib/badline/chips/z80/bit_page.rb +57 -0
- data/lib/badline/chips/z80/block_io.rb +60 -0
- data/lib/badline/chips/z80/block_transfers.rb +61 -0
- data/lib/badline/chips/z80/bus_cycles.rb +113 -0
- data/lib/badline/chips/z80/core.rb +115 -0
- data/lib/badline/chips/z80/exchanges.rb +52 -0
- data/lib/badline/chips/z80/extended_page.rb +91 -0
- data/lib/badline/chips/z80/flags.rb +39 -0
- data/lib/badline/chips/z80/interrupt_acceptance.rb +48 -0
- data/lib/badline/chips/z80/jumps.rb +84 -0
- data/lib/badline/chips/z80/loads.rb +100 -0
- data/lib/badline/chips/z80/main_page.rb +136 -0
- data/lib/badline/chips/z80/registers.rb +122 -0
- data/lib/badline/chips/z80/saved_state.rb +71 -0
- data/lib/badline/chips/z80/shifts.rb +66 -0
- data/lib/badline/chips/z80.rb +13 -0
- data/lib/badline/core.rb +26 -28
- data/lib/badline/drives/datasette/saved_state.rb +37 -0
- data/lib/badline/drives/datasette.rb +140 -0
- data/lib/badline/drives/engine/core.rb +149 -0
- data/lib/badline/drives/engine/fast_serial.rb +75 -0
- data/lib/badline/drives/engine/idle.rb +127 -0
- data/lib/badline/drives/engine/idle_cpu.rb +30 -0
- data/lib/badline/drives/engine/orbit.rb +81 -0
- data/lib/badline/drives/engine/serial_lines.rb +75 -0
- data/lib/badline/drives/engine/sleep.rb +114 -0
- data/lib/badline/drives/engine/vias.rb +86 -0
- data/lib/badline/drives/engine/watch.rb +152 -0
- data/lib/badline/drives/engine.rb +11 -0
- data/lib/badline/drives/model1541/bus.rb +88 -0
- data/lib/badline/drives/model1541/byte_ready.rb +50 -0
- data/lib/badline/drives/model1541/cpu.rb +13 -0
- data/lib/badline/drives/model1541/disk/saved_state.rb +88 -0
- data/lib/badline/drives/model1541/disk.rb +317 -0
- data/lib/badline/drives/model1541/disk_via.rb +38 -0
- data/lib/badline/drives/model1541/gcr.rb +59 -0
- data/lib/badline/drives/model1541/mechanism/saved_state.rb +72 -0
- data/lib/badline/drives/model1541/mechanism.rb +315 -0
- data/lib/badline/drives/model1541/rotation.rb +123 -0
- data/lib/badline/drives/model1541/saved_state.rb +44 -0
- data/lib/badline/drives/model1541/sector_reader.rb +78 -0
- data/lib/badline/drives/model1541/serial_port.rb +20 -0
- data/lib/badline/drives/model1541/track.rb +100 -0
- data/lib/badline/drives/model1541.rb +81 -0
- data/lib/badline/drives/model1571/bus.rb +113 -0
- data/lib/badline/drives/model1571/cpu.rb +13 -0
- data/lib/badline/drives/model1571/saved_state.rb +47 -0
- data/lib/badline/drives/model1571/serial_port.rb +39 -0
- data/lib/badline/drives/model1571/serial_via.rb +27 -0
- data/lib/badline/drives/model1571/wd1770.rb +122 -0
- data/lib/badline/drives/model1571.rb +142 -0
- data/lib/badline/drives/model1581/bus.rb +139 -0
- data/lib/badline/drives/model1581/cpu.rb +13 -0
- data/lib/badline/drives/model1581/disk/saved_state.rb +89 -0
- data/lib/badline/drives/model1581/disk.rb +137 -0
- data/lib/badline/drives/model1581/mechanism.rb +119 -0
- data/lib/badline/drives/model1581/saved_state.rb +42 -0
- data/lib/badline/drives/model1581/serial_port.rb +54 -0
- data/lib/badline/drives/model1581/slot.rb +79 -0
- data/lib/badline/drives/model1581/track.rb +102 -0
- data/lib/badline/drives/model1581/track_bytes.rb +77 -0
- data/lib/badline/drives/model1581/wd1772/registers.rb +91 -0
- data/lib/badline/drives/model1581/wd1772/saved_state.rb +68 -0
- data/lib/badline/drives/model1581/wd1772/sector_writes.rb +75 -0
- data/lib/badline/drives/model1581/wd1772/sectors.rb +152 -0
- data/lib/badline/drives/model1581/wd1772/stepping.rb +111 -0
- data/lib/badline/drives/model1581/wd1772/tracks.rb +127 -0
- data/lib/badline/drives/model1581/wd1772/turn.rb +75 -0
- data/lib/badline/drives/model1581/wd1772.rb +218 -0
- data/lib/badline/drives/model1581.rb +206 -0
- data/lib/badline/drives/serial_bus.rb +161 -0
- data/lib/badline/frontend/boot.rb +3 -3
- data/lib/badline/frontend/machine_window.rb +3 -1
- data/lib/badline/frontend/player/filter_view.rb +1 -1
- data/lib/badline/frontend/player/player_controller.rb +2 -2
- data/lib/badline/frontend/player/player_screen.rb +1 -0
- data/lib/badline/frontend/player/theme.rb +7 -7
- data/lib/badline/frontend/timeline.rb +3 -3
- data/lib/badline/input/control_ports.rb +78 -0
- data/lib/badline/input/joystick.rb +27 -0
- data/lib/badline/input/keyboard.rb +114 -0
- data/lib/badline/input.rb +3 -0
- data/lib/badline/kernal_trap/{drive → dos}/block_commands.rb +1 -1
- data/lib/badline/kernal_trap/dos/channel.rb +183 -0
- data/lib/badline/kernal_trap/{drive → dos}/channels.rb +1 -1
- data/lib/badline/kernal_trap/{drive → dos}/memory.rb +1 -1
- data/lib/badline/kernal_trap/{drive → dos}/parameters.rb +1 -1
- data/lib/badline/kernal_trap/{drive → dos}/status.rb +1 -1
- data/lib/badline/kernal_trap/{drive → dos}/write_file.rb +1 -1
- data/lib/badline/kernal_trap/{drive → dos}/writes.rb +1 -1
- data/lib/badline/kernal_trap/{drive.rb → dos.rb} +11 -10
- data/lib/badline/kernal_trap/load.rb +5 -5
- data/lib/badline/kernal_trap/save.rb +4 -4
- data/lib/badline/kernal_trap/serial.rb +7 -7
- data/lib/badline/kernal_trap.rb +1 -2
- data/lib/badline/machine/clocking.rb +1 -1
- data/lib/badline/machine.rb +5 -5
- data/lib/badline/media/true_drive.rb +1 -1
- data/lib/badline/media/tune.rb +2 -2
- data/lib/badline/media.rb +3 -3
- data/lib/badline/model.rb +1 -1
- data/lib/badline/roms/README +6 -6
- data/lib/badline/sdl.rb +1 -0
- data/lib/badline/{storage/sid_file.rb → sid_tune/file.rb} +3 -3
- data/lib/badline/{storage → sid_tune}/hvsc.rb +7 -7
- data/lib/badline/{storage → sid_tune}/song_lengths.rb +2 -2
- data/lib/badline/{storage → sid_tune}/stil/credit.rb +1 -1
- data/lib/badline/{storage → sid_tune}/stil.rb +3 -3
- data/lib/badline/sid_tune.rb +6 -0
- data/lib/badline/snapshot/c128_setup.rb +43 -0
- data/lib/badline/snapshot/c64_setup.rb +79 -0
- data/lib/badline/snapshot/image.rb +5 -25
- data/lib/badline/snapshot/machine_state.rb +1 -1
- data/lib/badline/snapshot/setup.rb +22 -66
- data/lib/badline/snapshot/state.rb +8 -18
- data/lib/badline/snapshot/storage_setup.rb +68 -0
- data/lib/badline/snapshot/vic20_setup.rb +37 -0
- data/lib/badline/snapshot/vice/c64_mem.rb +1 -1
- data/lib/badline/snapshot/vice/restore.rb +1 -1
- data/lib/badline/snapshot/vice/reu1764.rb +1 -1
- data/lib/badline/snapshot/vice/reu_fields.rb +40 -0
- data/lib/badline/snapshot/vice.rb +7 -5
- data/lib/badline/snapshot.rb +3 -4
- data/lib/badline/storage/d64_image.rb +0 -2
- data/lib/badline/storage/d71_image.rb +0 -2
- data/lib/badline/storage/d81_image.rb +0 -2
- data/lib/badline/storage/disk_image.rb +3 -6
- data/lib/badline/storage/g64_image.rb +2 -2
- data/lib/badline/storage/host_directory.rb +0 -5
- data/lib/badline/storage/t64.rb +2 -8
- data/lib/badline/storage/unavailable.rb +1 -1
- data/lib/badline/storage.rb +0 -37
- data/lib/badline/support/c128_checkpoint.rb +39 -0
- data/lib/badline/support/checkpoint.rb +108 -0
- data/lib/badline/support/vic20_checkpoint.rb +38 -0
- data/lib/badline/support.rb +5 -0
- data/lib/badline/version.rb +1 -1
- data/lib/badline/vic20/attachments.rb +5 -5
- data/lib/badline/vic20/bus/saved_state.rb +35 -0
- data/lib/badline/vic20/bus.rb +3 -25
- data/lib/badline/vic20/cpu.rb +1 -1
- data/lib/badline/vic20/port_wiring.rb +4 -4
- data/lib/badline/vic20/saved_state.rb +16 -30
- data/lib/badline/vic20/user_via_ports.rb +2 -2
- data/lib/badline/vic20.rb +19 -14
- metadata +245 -221
- data/lib/badline/address_bus/extra_sids.rb +0 -30
- data/lib/badline/address_bus/fittings.rb +0 -38
- data/lib/badline/address_bus/pla.rb +0 -147
- data/lib/badline/address_bus/roms.rb +0 -39
- data/lib/badline/address_bus/saved_state.rb +0 -66
- data/lib/badline/address_bus/sid_slots.rb +0 -42
- data/lib/badline/address_bus.rb +0 -216
- data/lib/badline/cartridge/action_replay.rb +0 -126
- data/lib/badline/cartridge/atomic_power.rb +0 -24
- data/lib/badline/cartridge/bank.rb +0 -81
- data/lib/badline/cartridge/comal80.rb +0 -50
- data/lib/badline/cartridge/dinamic.rb +0 -34
- data/lib/badline/cartridge/easy_flash.rb +0 -145
- data/lib/badline/cartridge/epyx_fastload.rb +0 -79
- data/lib/badline/cartridge/final_cartridge3.rb +0 -89
- data/lib/badline/cartridge/flash.rb +0 -306
- data/lib/badline/cartridge/freezer.rb +0 -33
- data/lib/badline/cartridge/fun_play.rb +0 -38
- data/lib/badline/cartridge/g_mod2.rb +0 -74
- data/lib/badline/cartridge/game_system.rb +0 -40
- data/lib/badline/cartridge/geo_ram.rb +0 -79
- data/lib/badline/cartridge/kcs_power.rb +0 -75
- data/lib/badline/cartridge/mach5.rb +0 -32
- data/lib/badline/cartridge/magic_desk.rb +0 -30
- data/lib/badline/cartridge/ocean.rb +0 -35
- data/lib/badline/cartridge/pagefox.rb +0 -68
- data/lib/badline/cartridge/retro_replay.rb +0 -320
- data/lib/badline/cartridge/rex_utility.rb +0 -29
- data/lib/badline/cartridge/rgcd.rb +0 -58
- data/lib/badline/cartridge/simons_basic.rb +0 -35
- data/lib/badline/cartridge/standard.rb +0 -15
- data/lib/badline/cartridge/super_games.rb +0 -48
- data/lib/badline/cartridge/westermann.rb +0 -30
- data/lib/badline/cartridge/zaxxon.rb +0 -66
- data/lib/badline/cartridge.rb +0 -303
- data/lib/badline/checkpoint.rb +0 -98
- data/lib/badline/cia/fast_forward.rb +0 -60
- data/lib/badline/cia/interrupt_register.rb +0 -143
- data/lib/badline/cia/serial.rb +0 -275
- data/lib/badline/cia/state.rb +0 -47
- data/lib/badline/cia/timer.rb +0 -206
- data/lib/badline/cia.rb +0 -279
- data/lib/badline/color_memory.rb +0 -25
- data/lib/badline/control_ports.rb +0 -76
- data/lib/badline/cpu/addressing.rb +0 -131
- data/lib/badline/cpu/boundary.rb +0 -54
- data/lib/badline/cpu/core.rb +0 -165
- data/lib/badline/cpu/microcode.rb +0 -177
- data/lib/badline/cpu/operations.rb +0 -88
- data/lib/badline/cpu/saved_state.rb +0 -115
- data/lib/badline/cpu/stack_operations.rb +0 -82
- data/lib/badline/cpu.rb +0 -10
- data/lib/badline/cpu_port.rb +0 -112
- data/lib/badline/datasette.rb +0 -161
- data/lib/badline/drive/core.rb +0 -147
- data/lib/badline/drive/fast_serial.rb +0 -73
- data/lib/badline/drive/idle.rb +0 -125
- data/lib/badline/drive/idle_cpu.rb +0 -28
- data/lib/badline/drive/orbit.rb +0 -79
- data/lib/badline/drive/serial_lines.rb +0 -73
- data/lib/badline/drive/sleep.rb +0 -112
- data/lib/badline/drive/vias.rb +0 -84
- data/lib/badline/drive/watch.rb +0 -150
- data/lib/badline/drive.rb +0 -11
- data/lib/badline/drive1541/bus.rb +0 -86
- data/lib/badline/drive1541/byte_ready.rb +0 -48
- data/lib/badline/drive1541/cpu.rb +0 -11
- data/lib/badline/drive1541/disk.rb +0 -315
- data/lib/badline/drive1541/disk_state.rb +0 -86
- data/lib/badline/drive1541/disk_via.rb +0 -36
- data/lib/badline/drive1541/gcr.rb +0 -57
- data/lib/badline/drive1541/mechanism.rb +0 -313
- data/lib/badline/drive1541/mechanism_state.rb +0 -68
- data/lib/badline/drive1541/rotation.rb +0 -121
- data/lib/badline/drive1541/sector_reader.rb +0 -76
- data/lib/badline/drive1541/serial_port.rb +0 -18
- data/lib/badline/drive1541/track.rb +0 -98
- data/lib/badline/drive1541.rb +0 -111
- data/lib/badline/drive1571/bus.rb +0 -111
- data/lib/badline/drive1571/cpu.rb +0 -11
- data/lib/badline/drive1571/serial_port.rb +0 -37
- data/lib/badline/drive1571/serial_via.rb +0 -25
- data/lib/badline/drive1571/wd1770.rb +0 -120
- data/lib/badline/drive1571.rb +0 -175
- data/lib/badline/drive1581/bus.rb +0 -137
- data/lib/badline/drive1581/cpu.rb +0 -11
- data/lib/badline/drive1581/disk.rb +0 -135
- data/lib/badline/drive1581/disk_state.rb +0 -87
- data/lib/badline/drive1581/mechanism.rb +0 -117
- data/lib/badline/drive1581/serial_port.rb +0 -52
- data/lib/badline/drive1581/slot.rb +0 -78
- data/lib/badline/drive1581/track.rb +0 -100
- data/lib/badline/drive1581/track_bytes.rb +0 -75
- data/lib/badline/drive1581/wd1772/registers.rb +0 -89
- data/lib/badline/drive1581/wd1772/sector_writes.rb +0 -73
- data/lib/badline/drive1581/wd1772/sectors.rb +0 -150
- data/lib/badline/drive1581/wd1772/state.rb +0 -66
- data/lib/badline/drive1581/wd1772/stepping.rb +0 -109
- data/lib/badline/drive1581/wd1772/tracks.rb +0 -125
- data/lib/badline/drive1581/wd1772/turn.rb +0 -73
- data/lib/badline/drive1581/wd1772.rb +0 -216
- data/lib/badline/drive1581.rb +0 -233
- data/lib/badline/iec_bus.rb +0 -159
- data/lib/badline/instruction.rb +0 -334
- data/lib/badline/instruction_set/arithmetic.rb +0 -114
- data/lib/badline/instruction_set/bitwise.rb +0 -126
- data/lib/badline/instruction_set/branch.rb +0 -79
- data/lib/badline/instruction_set/flag.rb +0 -63
- data/lib/badline/instruction_set/illegal.rb +0 -270
- data/lib/badline/instruction_set/inc_dec.rb +0 -69
- data/lib/badline/instruction_set/stack.rb +0 -52
- data/lib/badline/instruction_set/transfer.rb +0 -137
- data/lib/badline/instruction_set.rb +0 -55
- data/lib/badline/interrupts.rb +0 -104
- data/lib/badline/joystick.rb +0 -25
- data/lib/badline/kernal_trap/channel.rb +0 -181
- data/lib/badline/keyboard.rb +0 -112
- data/lib/badline/ram_expansion/banking.rb +0 -30
- data/lib/badline/ram_expansion/plus256k.rb +0 -54
- data/lib/badline/ram_expansion/plus60k.rb +0 -43
- data/lib/badline/ram_expansion/unexpanded.rb +0 -28
- data/lib/badline/ram_expansion.rb +0 -21
- data/lib/badline/reu/dma/saved_state.rb +0 -50
- data/lib/badline/reu/dma.rb +0 -273
- data/lib/badline/reu/ram.rb +0 -107
- data/lib/badline/reu/saved_state.rb +0 -80
- data/lib/badline/reu/trigger.rb +0 -32
- data/lib/badline/reu.rb +0 -289
- data/lib/badline/sid/catch_up.rb +0 -120
- data/lib/badline/sid/decimator.rb +0 -64
- data/lib/badline/sid/envelope/state.rb +0 -68
- data/lib/badline/sid/envelope.rb +0 -239
- data/lib/badline/sid/filter.rb +0 -263
- data/lib/badline/sid/voice.rb +0 -77
- data/lib/badline/sid/waveform/combined.rb +0 -126
- data/lib/badline/sid/waveform/fast_forward.rb +0 -105
- data/lib/badline/sid/waveform/noise_writeback.rb +0 -122
- data/lib/badline/sid/waveform/state.rb +0 -66
- data/lib/badline/sid/waveform.rb +0 -305
- data/lib/badline/sid.rb +0 -303
- data/lib/badline/time_of_day.rb +0 -228
- data/lib/badline/traps.rb +0 -19
- data/lib/badline/via/control_lines.rb +0 -122
- data/lib/badline/via/fast_forward.rb +0 -53
- data/lib/badline/via/interrupt_register.rb +0 -67
- data/lib/badline/via/shift_register.rb +0 -180
- data/lib/badline/via/state.rb +0 -42
- data/lib/badline/via/timer1.rb +0 -131
- data/lib/badline/via/timer2.rb +0 -133
- data/lib/badline/via.rb +0 -266
- data/lib/badline/vic/bank.rb +0 -133
- data/lib/badline/vic/border_mask.rb +0 -86
- data/lib/badline/vic/collisions.rb +0 -115
- data/lib/badline/vic/color_patches.rb +0 -47
- data/lib/badline/vic/display_state.rb +0 -185
- data/lib/badline/vic/graphics_mode.rb +0 -164
- data/lib/badline/vic/graphics_shifter.rb +0 -207
- data/lib/badline/vic/register_log.rb +0 -81
- data/lib/badline/vic/registers.rb +0 -195
- data/lib/badline/vic/sequencer.rb +0 -275
- data/lib/badline/vic/sequencer_output.rb +0 -116
- data/lib/badline/vic/sequencer_state.rb +0 -89
- data/lib/badline/vic/sprite/internal_bus.rb +0 -68
- data/lib/badline/vic/sprite/saved_state.rb +0 -64
- data/lib/badline/vic/sprite/shifter.rb +0 -146
- data/lib/badline/vic/sprite/timing.rb +0 -56
- data/lib/badline/vic/sprite.rb +0 -337
- data/lib/badline/vic/sprites.rb +0 -282
- data/lib/badline/vic/sprites_state.rb +0 -57
- data/lib/badline/vic.rb +0 -853
- data/lib/badline/vic20/sound/output.rb +0 -83
- data/lib/badline/vic20/sound.rb +0 -233
- data/lib/badline/z80/arithmetic.rb +0 -117
- data/lib/badline/z80/bit_page.rb +0 -55
- data/lib/badline/z80/block_io.rb +0 -58
- data/lib/badline/z80/block_transfers.rb +0 -59
- data/lib/badline/z80/bus_cycles.rb +0 -111
- data/lib/badline/z80/core.rb +0 -113
- data/lib/badline/z80/exchanges.rb +0 -50
- data/lib/badline/z80/extended_page.rb +0 -89
- data/lib/badline/z80/flags.rb +0 -37
- data/lib/badline/z80/interrupt_acceptance.rb +0 -46
- data/lib/badline/z80/jumps.rb +0 -82
- data/lib/badline/z80/loads.rb +0 -98
- data/lib/badline/z80/main_page.rb +0 -134
- data/lib/badline/z80/registers.rb +0 -120
- data/lib/badline/z80/saved_state.rb +0 -69
- data/lib/badline/z80/shifts.rb +0 -64
- data/lib/badline/z80.rb +0 -11
- /data/lib/badline/snapshot/{fields.rb → vice/fields.rb} +0 -0
data/doc/snapshots.md
CHANGED
|
@@ -62,10 +62,7 @@ Every model saves this way, PAL, NTSC, old NTSC and Drean alike, and so
|
|
|
62
62
|
does a machine with an REU, with its RAM, its registers and a transfer
|
|
63
63
|
part way through. A snapshot only restores in the badline version that
|
|
64
64
|
wrote it, into a machine with the same chip models, region, RAM
|
|
65
|
-
expansion, REU, KERNAL, datasette and board.
|
|
66
|
-
recorded the KERNAL and the datasette restores as a machine with the
|
|
67
|
-
C64's KERNAL and a datasette, and one saved before it recorded the board
|
|
68
|
-
restores on a C64's.
|
|
65
|
+
expansion, REU, KERNAL, datasette and board.
|
|
69
66
|
|
|
70
67
|
## The VIC-20
|
|
71
68
|
|
|
@@ -49,13 +49,13 @@ module Badline
|
|
|
49
49
|
def initialize(tune, subtune: nil, sid_models: tune.sid_models)
|
|
50
50
|
@tune = tune
|
|
51
51
|
@subtune = (subtune || tune.start_subtune).clamp(1, tune.subtunes) - 1
|
|
52
|
-
@bus =
|
|
52
|
+
@bus = C64::Bus.new(sid_model: sid_models[0])
|
|
53
53
|
# The CPU port as the KERNAL leaves it, which a PSID tune expects.
|
|
54
54
|
@bus.poke(0x00, 0x2f)
|
|
55
55
|
@bus.poke(0x01, 0x37)
|
|
56
56
|
@bus.poke(VIDEO_STANDARD, tune.ntsc? ? 0 : 1)
|
|
57
57
|
@bus.cia1.timer_a_latch = tune.ntsc? ? NTSC_KERNAL_TIMER : KERNAL_TIMER
|
|
58
|
-
@cpu = CPU.new(@bus)
|
|
58
|
+
@cpu = Chips::CPU.new(@bus)
|
|
59
59
|
@sid = @bus.sid
|
|
60
60
|
@stereo = Stereo.new(@bus, tune, sid_models)
|
|
61
61
|
@extras = @stereo.extras
|
|
@@ -164,7 +164,7 @@ module Badline
|
|
|
164
164
|
|
|
165
165
|
# Tunes live under the ROMs as often as not, so $01 has to bank out
|
|
166
166
|
# whatever covers the routine about to run. An RSID tune banks itself,
|
|
167
|
-
# and `
|
|
167
|
+
# and `SIDTune::File#bank_for` hands back nil for it.
|
|
168
168
|
def dispatch
|
|
169
169
|
bank = @tune.bank_for(@pending)
|
|
170
170
|
@bus.poke(0x01, bank) if bank
|
data/lib/badline/audio/cli.rb
CHANGED
|
@@ -49,8 +49,8 @@ module Badline
|
|
|
49
49
|
def queue
|
|
50
50
|
@queue ||= begin
|
|
51
51
|
paths = @options.tune_paths
|
|
52
|
-
queue =
|
|
53
|
-
|
|
52
|
+
queue = Queue.new(entries(paths, @options.subtune), all_parts: @options.all_subtunes?,
|
|
53
|
+
build: ->(dropped) { entries(dropped) })
|
|
54
54
|
raise Error, "no .sid tunes in #{paths.join(', ')}" if queue.empty? && !paths.empty?
|
|
55
55
|
|
|
56
56
|
queue
|
|
@@ -77,7 +77,7 @@ module Badline
|
|
|
77
77
|
# below the directories, the first starting on `subtune` if given.
|
|
78
78
|
def entries(paths, subtune = nil)
|
|
79
79
|
tunes = []
|
|
80
|
-
|
|
80
|
+
Queue.files(paths, ".sid").each do |path|
|
|
81
81
|
tunes << QueuedTune.new(path, @options, subtune: tunes.empty? ? subtune : nil)
|
|
82
82
|
end
|
|
83
83
|
tunes
|
|
@@ -223,9 +223,9 @@ module Badline
|
|
|
223
223
|
end
|
|
224
224
|
|
|
225
225
|
def stil(entry)
|
|
226
|
-
list =
|
|
227
|
-
hvsc_path = list &&
|
|
228
|
-
hvsc_path && (@stil_lists[list] ||=
|
|
226
|
+
list = SIDTune::STIL.locate(entry.path)
|
|
227
|
+
hvsc_path = list && SIDTune::HVSC.path(entry.path, list)
|
|
228
|
+
hvsc_path && (@stil_lists[list] ||= SIDTune::STIL.new(list)).entry(hvsc_path)
|
|
229
229
|
end
|
|
230
230
|
|
|
231
231
|
def progress(done, total)
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
module Badline
|
|
4
4
|
module Audio
|
|
5
|
-
# Plays a
|
|
5
|
+
# Plays a Audio::Queue of tunes interactively: the console's keys step
|
|
6
6
|
# between tunes and between a tune's subtunes, seek within the subtune, pause,
|
|
7
7
|
# turn the queue's shuffle, loop and all-subtunes modes on and off, and
|
|
8
8
|
# quit, and the status line follows along. Seeking runs the subtune
|
|
@@ -10,7 +10,7 @@ module Badline
|
|
|
10
10
|
# forward, and from the latest of its Checkpoints at or before there to
|
|
11
11
|
# go back, or to go forward when that checkpoint is further on than
|
|
12
12
|
# where the subtune is. A subtune that plays to its end moves on as
|
|
13
|
-
#
|
|
13
|
+
# Audio::Queue#advance says. It stops at the end of the queue, on q, or
|
|
14
14
|
# on Ctrl-C.
|
|
15
15
|
#
|
|
16
16
|
# `renderer` builds the renderer for an entry's subtune at the sink's
|
|
@@ -17,7 +17,7 @@ module Badline
|
|
|
17
17
|
def initialize(tune, subtune: nil, sid_models: tune.sid_models)
|
|
18
18
|
@tune = tune
|
|
19
19
|
@subtune = subtune || tune.start_subtune
|
|
20
|
-
@computer =
|
|
20
|
+
@computer = C64.new(sid_model: sid_models[0])
|
|
21
21
|
@stereo = Stereo.new(@computer.address_bus, tune, sid_models)
|
|
22
22
|
@extras = @stereo.extras
|
|
23
23
|
@multi = !@extras.empty?
|
|
@@ -39,7 +39,7 @@ module Badline
|
|
|
39
39
|
|
|
40
40
|
def clock_hz = @computer.region.clock_hz
|
|
41
41
|
|
|
42
|
-
# The whole machine, as
|
|
42
|
+
# The whole machine, as C64#snapshot takes it, and the extra SIDs,
|
|
43
43
|
# once it plays.
|
|
44
44
|
def save_state(out)
|
|
45
45
|
@computer.save_state(out)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
module Badline
|
|
4
|
-
module
|
|
4
|
+
module Audio
|
|
5
5
|
# An ordered list of media files to go through one at a time, such as
|
|
6
6
|
# the tunes of a player. Each entry is a file and the part of it to
|
|
7
7
|
# start on, counting from 1, out of the parts the file holds: a .sid
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
module Badline
|
|
4
4
|
module Audio
|
|
5
|
-
# A .sid tune in the player's
|
|
5
|
+
# A .sid tune in the player's Audio::Queue, read only once the queue or
|
|
6
6
|
# the player first asks about it, so a queue of a whole collection
|
|
7
7
|
# starts at once. Its subtunes, SID model and lengths follow the options:
|
|
8
8
|
# --subtune picks the subtune to start on, --sid the model and --seconds the
|
|
@@ -11,7 +11,7 @@ module Badline
|
|
|
11
11
|
#
|
|
12
12
|
# A file that won't read as a tune, or lacks the subtune asked for, gets
|
|
13
13
|
# an #error and a single subtune.
|
|
14
|
-
class QueuedTune <
|
|
14
|
+
class QueuedTune < Queue::Entry
|
|
15
15
|
def initialize(path, options, subtune: nil)
|
|
16
16
|
super(path)
|
|
17
17
|
@options = options
|
|
@@ -39,7 +39,7 @@ module Badline
|
|
|
39
39
|
@error
|
|
40
40
|
end
|
|
41
41
|
|
|
42
|
-
def tune = @tune ||=
|
|
42
|
+
def tune = @tune ||= SIDTune::File.new(path)
|
|
43
43
|
|
|
44
44
|
# Lets go of the tune's data, which #tune reads again if asked.
|
|
45
45
|
def release = @tune = nil
|
|
@@ -71,7 +71,7 @@ module Badline
|
|
|
71
71
|
@parts = tune.subtunes
|
|
72
72
|
@part = @subtune || tune.start_subtune
|
|
73
73
|
@error = "no subtune #{@part}: the tune has #{@parts}" if @part > @parts
|
|
74
|
-
rescue
|
|
74
|
+
rescue SIDTune::File::FormatError => e
|
|
75
75
|
@error = e.message
|
|
76
76
|
end
|
|
77
77
|
|
|
@@ -81,8 +81,8 @@ module Badline
|
|
|
81
81
|
return @lengths if @lengths_read
|
|
82
82
|
|
|
83
83
|
@lengths_read = true
|
|
84
|
-
database = @options.songlengths ||
|
|
85
|
-
@lengths = database &&
|
|
84
|
+
database = @options.songlengths || SIDTune::SongLengths.locate(path)
|
|
85
|
+
@lengths = database && SIDTune::SongLengths.new(database).lengths(tune.md5)
|
|
86
86
|
end
|
|
87
87
|
end
|
|
88
88
|
end
|
|
@@ -50,7 +50,7 @@ module Badline
|
|
|
50
50
|
@subtune = subtune
|
|
51
51
|
@rate = rate
|
|
52
52
|
@sid_models = sid_models
|
|
53
|
-
@filter_chunk = SID::FILTER_CHUNK
|
|
53
|
+
@filter_chunk = Chips::SID::FILTER_CHUNK
|
|
54
54
|
@silent_samples = 0
|
|
55
55
|
@level = 0
|
|
56
56
|
@still = 0
|
|
@@ -141,7 +141,7 @@ module Badline
|
|
|
141
141
|
|
|
142
142
|
input = Snapshot::StateReader.new(state)
|
|
143
143
|
played = input.int
|
|
144
|
-
|
|
144
|
+
restore_player(input)
|
|
145
145
|
record
|
|
146
146
|
player.stereo.sids.each { |sid| sid.load_recording(input) }
|
|
147
147
|
@level = input.int
|
|
@@ -159,10 +159,10 @@ module Badline
|
|
|
159
159
|
|
|
160
160
|
# Restores the player as it was, then puts back the SID models chosen
|
|
161
161
|
# for this renderer.
|
|
162
|
-
def
|
|
162
|
+
def restore_player(input)
|
|
163
163
|
sids = player.stereo.sids
|
|
164
164
|
chosen = sids.map(&:model)
|
|
165
|
-
sids.each { |sid| refit(sid, Snapshot::
|
|
165
|
+
sids.each { |sid| refit(sid, Snapshot::C64Setup::SID_MODELS.fetch(input.int)) }
|
|
166
166
|
player.load_state(input)
|
|
167
167
|
sids.each_with_index { |sid, index| refit(sid, chosen[index]) }
|
|
168
168
|
end
|
|
@@ -178,7 +178,7 @@ module Badline
|
|
|
178
178
|
sids = player.stereo.sids
|
|
179
179
|
out = Snapshot::StateWriter.new
|
|
180
180
|
out.int(played)
|
|
181
|
-
sids.each { |sid| out.int(Snapshot::
|
|
181
|
+
sids.each { |sid| out.int(Snapshot::C64Setup::SID_MODELS.index(sid.model) || 0) }
|
|
182
182
|
player.save_state(out)
|
|
183
183
|
sids.each { |sid| sid.save_recording(out) }
|
|
184
184
|
out.int(@level).int(@still)
|
data/lib/badline/audio/stereo.rb
CHANGED
|
@@ -18,7 +18,7 @@ module Badline
|
|
|
18
18
|
@sids = [bus.sid]
|
|
19
19
|
@extras = []
|
|
20
20
|
tune.sid_addresses.each do |address|
|
|
21
|
-
sid = SID.new(model: models[@sids.size], at: address)
|
|
21
|
+
sid = Chips::SID.new(model: models[@sids.size], at: address)
|
|
22
22
|
bus.add_sid(sid)
|
|
23
23
|
@sids << sid
|
|
24
24
|
@extras << sid
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module Badline
|
|
4
4
|
class C128
|
|
5
5
|
class Bus
|
|
6
|
-
# The bus's state for a snapshot, as
|
|
6
|
+
# The bus's state for a snapshot, as C64::Bus::SavedState is the
|
|
7
7
|
# C64's.
|
|
8
8
|
module SavedState
|
|
9
9
|
# The machine's memory, the last access and everything on the bus but
|
data/lib/badline/c128/bus.rb
CHANGED
|
@@ -11,7 +11,7 @@ module Badline
|
|
|
11
11
|
# $FF00-$FF04.
|
|
12
12
|
#
|
|
13
13
|
# In C64 mode the 8721 PLA decodes $01's LORAM, HIRAM and CHAREN and the
|
|
14
|
-
# cartridge's EXROM and GAME as a C64's does (
|
|
14
|
+
# cartridge's EXROM and GAME as a C64's does (C64::Bus::PLA), and the
|
|
15
15
|
# MMU answers nowhere.
|
|
16
16
|
#
|
|
17
17
|
# In both modes the RAM is the bank CR picks, with common RAM in bank 0,
|
|
@@ -34,8 +34,8 @@ module Badline
|
|
|
34
34
|
# Colour RAM has two 1K banks (ColorLines).
|
|
35
35
|
class Bus
|
|
36
36
|
include Addressable
|
|
37
|
-
include
|
|
38
|
-
include
|
|
37
|
+
include C64::Bus::PLA
|
|
38
|
+
include C64::Bus::ROMs
|
|
39
39
|
include MMUPages
|
|
40
40
|
include IOPages
|
|
41
41
|
include Z80Pages
|
|
@@ -48,9 +48,9 @@ module Badline
|
|
|
48
48
|
PORT_FLOATING = 0b1000_1000
|
|
49
49
|
CAPS_LOCK = 0b0100_0000
|
|
50
50
|
|
|
51
|
-
# The C64's power-on pattern (
|
|
51
|
+
# The C64's power-on pattern (C64::Bus::RAM_POWER_ON) in both 64K
|
|
52
52
|
# banks. The C128's own DRAMs' pattern is unmeasured.
|
|
53
|
-
RAM_POWER_ON = Array.new(2**17) { |addr|
|
|
53
|
+
RAM_POWER_ON = Array.new(2**17) { |addr| C64::Bus::RAM_POWER_ON[addr & 0xffff] }.freeze
|
|
54
54
|
|
|
55
55
|
# The VIC's write side: a write to $D02F also drives the extra
|
|
56
56
|
# keyboard lines K0-K2 onto the keyboard's rows 8-10.
|
|
@@ -143,7 +143,7 @@ module Badline
|
|
|
143
143
|
@on_mode_change = nil
|
|
144
144
|
plug_chips(model, sid_model)
|
|
145
145
|
|
|
146
|
-
@datasette = Datasette.new
|
|
146
|
+
@datasette = Badline::Drives::Datasette.new
|
|
147
147
|
@datasette.on_flag { @cia1.flag! }
|
|
148
148
|
@datasette.on_sense_change { @cpu_port.refresh }
|
|
149
149
|
|
|
@@ -151,11 +151,12 @@ module Badline
|
|
|
151
151
|
@color_ram = @color_lines.color_ram(1)
|
|
152
152
|
build_z80_pages
|
|
153
153
|
@vic_writes = VICWrites.new(@vic, @control_ports)
|
|
154
|
-
@open_bus =
|
|
154
|
+
@open_bus = C64::Bus::OpenBus.new(@vic)
|
|
155
155
|
@configuration_reads = ConfigurationPage.new(@mmu, @open_bus)
|
|
156
156
|
@configuration_writes = ConfigurationPage.new(@mmu, @open_bus)
|
|
157
157
|
|
|
158
|
-
@cpu_port =
|
|
158
|
+
@cpu_port = Chips::CPU::Port.new(@datasette, pullups: PORT_PULLUPS, floating: PORT_FLOATING,
|
|
159
|
+
caps_lock: CAPS_LOCK)
|
|
159
160
|
@io_port = @cpu_port.status
|
|
160
161
|
|
|
161
162
|
@read_pages = Array.new(256)
|
|
@@ -274,17 +275,17 @@ module Badline
|
|
|
274
275
|
end
|
|
275
276
|
|
|
276
277
|
def plug_chips(model, sid_model)
|
|
277
|
-
@keyboard = Keyboard.new(matrix: KEYBOARD_MATRIX)
|
|
278
|
-
@joystick1 = Joystick.new
|
|
279
|
-
@joystick2 = Joystick.new
|
|
280
|
-
@control_ports = ControlPorts.new(keyboard: @keyboard, joystick1: @joystick1, joystick2: @joystick2)
|
|
281
|
-
@vic = VIC.new(model: model.vic_model, region: @region)
|
|
282
|
-
@cia1 = CIA.new(start: 0xdc00, peripheral: @control_ports, model: model.cia_model, region: @region)
|
|
283
|
-
@cia2 = CIA.new(start: 0xdd00, model: model.cia_model, region: @region)
|
|
278
|
+
@keyboard = Input::Keyboard.new(matrix: KEYBOARD_MATRIX)
|
|
279
|
+
@joystick1 = Input::Joystick.new
|
|
280
|
+
@joystick2 = Input::Joystick.new
|
|
281
|
+
@control_ports = Input::ControlPorts.new(keyboard: @keyboard, joystick1: @joystick1, joystick2: @joystick2)
|
|
282
|
+
@vic = Chips::VIC.new(model: model.vic_model, region: @region)
|
|
283
|
+
@cia1 = Chips::CIA.new(start: 0xdc00, peripheral: @control_ports, model: model.cia_model, region: @region)
|
|
284
|
+
@cia2 = Chips::CIA.new(start: 0xdd00, model: model.cia_model, region: @region)
|
|
284
285
|
@control_ports.port_a_source = @cia1
|
|
285
286
|
@cia1.on_port_b4_change { |high| @vic.lightpen_level(high) }
|
|
286
|
-
@sid = SID.new(model: sid_model, pots: @control_ports)
|
|
287
|
-
@vdc = VDC.new(model: model.vdc_model, ram_kb: model.vdc_ram_kb, clock_hz: @region.clock_hz)
|
|
287
|
+
@sid = Chips::SID.new(model: sid_model, pots: @control_ports)
|
|
288
|
+
@vdc = Chips::VDC.new(model: model.vdc_model, ram_kb: model.vdc_ram_kb, clock_hz: @region.clock_hz)
|
|
288
289
|
end
|
|
289
290
|
|
|
290
291
|
def update_overlays!
|
|
@@ -13,8 +13,8 @@ module Badline
|
|
|
13
13
|
@cia2 = cia2
|
|
14
14
|
@c64_characters = c64_characters
|
|
15
15
|
@c128_characters = c128_characters
|
|
16
|
-
@bank0 = ColorMemory.new(vic)
|
|
17
|
-
@bank1 = ColorMemory.new(vic)
|
|
16
|
+
@bank0 = C64::ColorMemory.new(vic)
|
|
17
|
+
@bank1 = C64::ColorMemory.new(vic)
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
# Colour RAM bank +number+, 0 or 1.
|
data/lib/badline/c128/cpu.rb
CHANGED
data/lib/badline/c128/drives.rb
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
module Badline
|
|
4
4
|
class C128
|
|
5
|
-
# The true drives on the C128's serial bus: a
|
|
6
|
-
# built-in 1571 (
|
|
5
|
+
# The true drives on the C128's serial bus: a Drives::Model1541, the C128D's
|
|
6
|
+
# built-in 1571 (Drives::Model1571) or a 1581 (Drives::Model1581::Slot), each in a
|
|
7
7
|
# field of its own, so none makes another's per-cycle call a union.
|
|
8
8
|
module Drives
|
|
9
9
|
attr_reader :drive1571
|
|
10
10
|
|
|
11
|
-
# Plugs in a
|
|
11
|
+
# Plugs in a Drives::Model1571, which then runs alongside the C128 on its own
|
|
12
12
|
# clock and talks to it over the serial bus, as attach_drive1541 does
|
|
13
13
|
# for a 1541.
|
|
14
14
|
def attach_drive1571(drive)
|
|
@@ -19,7 +19,7 @@ module Badline
|
|
|
19
19
|
@serial_trap&.device = serial_trap_device
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
-
# Unplugs the
|
|
22
|
+
# Unplugs the Drives::Model1571.
|
|
23
23
|
def detach_drive1571
|
|
24
24
|
return unless @drive1571
|
|
25
25
|
|
|
@@ -35,14 +35,14 @@ module Badline
|
|
|
35
35
|
# returns it.
|
|
36
36
|
def plug_true_drive
|
|
37
37
|
detach_drive1581 if drive1581_on_device8?
|
|
38
|
-
|
|
38
|
+
Badline::Drives::Model1571.new.tap { |drive| attach_drive1571(drive) }
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
private
|
|
42
42
|
|
|
43
43
|
# The serial bus, with no disk in device 8's traps and no true drive.
|
|
44
44
|
def init_drives
|
|
45
|
-
@
|
|
45
|
+
@dos = nil
|
|
46
46
|
@serial_trap = nil
|
|
47
47
|
@save_trap = nil
|
|
48
48
|
@drive1541 = nil
|
|
@@ -61,7 +61,7 @@ module Badline
|
|
|
61
61
|
# A 1581 plugged in holds the machine's on_init handlers back until
|
|
62
62
|
# its DOS has booted, which takes longer than the C128 KERNAL's.
|
|
63
63
|
def drive1581_attached
|
|
64
|
-
@init_threshold = [@init_threshold,
|
|
64
|
+
@init_threshold = [@init_threshold, Badline::Drives::Model1581::BOOT_CYCLES].max if @cycles < @init_threshold
|
|
65
65
|
end
|
|
66
66
|
|
|
67
67
|
# Unplugs the 1541 and the 1571 if either is device 8, for a 1581 to
|
|
@@ -72,10 +72,10 @@ module Badline
|
|
|
72
72
|
detach_drive1571 if @drive1571&.device == device
|
|
73
73
|
end
|
|
74
74
|
|
|
75
|
-
# A true 1541 (
|
|
75
|
+
# A true 1541 (C64::Attachments#save_serial_bus), then a 1571 and
|
|
76
76
|
# a 1581.
|
|
77
77
|
def save_serial_bus(out)
|
|
78
|
-
out.boolean(
|
|
78
|
+
out.boolean(!@drive1541.nil?)
|
|
79
79
|
if @drive1541
|
|
80
80
|
out.int(@drive1541.device)
|
|
81
81
|
@drive1541.save_state(out)
|
|
@@ -89,7 +89,6 @@ module Badline
|
|
|
89
89
|
end
|
|
90
90
|
|
|
91
91
|
def load_serial_bus(input)
|
|
92
|
-
input.boolean?
|
|
93
92
|
load_drive1541(input)
|
|
94
93
|
load_drive1571(input)
|
|
95
94
|
load_drive1581(input)
|
|
@@ -100,7 +99,7 @@ module Badline
|
|
|
100
99
|
|
|
101
100
|
device = input.int
|
|
102
101
|
detach_drive1571 if @drive1571 && @drive1571.device != device
|
|
103
|
-
attach_drive1571(
|
|
102
|
+
attach_drive1571(Badline::Drives::Model1571.new(device:)) unless @drive1571
|
|
104
103
|
@drive1571.load_state(input)
|
|
105
104
|
end
|
|
106
105
|
end
|
|
@@ -6,7 +6,7 @@ module Badline
|
|
|
6
6
|
# through buffers MCR's FSDIR turns round. Outwards, the machine pushes
|
|
7
7
|
# the lines the pins pull into the bus as they move. Inwards, CIA 1
|
|
8
8
|
# hears the lines whenever a drive moves its own fast serial pins
|
|
9
|
-
# (
|
|
9
|
+
# (Drives::SerialBus#on_fast_change).
|
|
10
10
|
module FastSerial
|
|
11
11
|
private
|
|
12
12
|
|
|
@@ -48,15 +48,15 @@ module Badline
|
|
|
48
48
|
serial = @cia1.serial
|
|
49
49
|
return 0 unless serial.output?
|
|
50
50
|
|
|
51
|
-
low = serial.cnt ? 0 :
|
|
52
|
-
serial.sp_out ? low : low |
|
|
51
|
+
low = serial.cnt ? 0 : Badline::Drives::SerialBus::SRQ
|
|
52
|
+
serial.sp_out ? low : low | Badline::Drives::SerialBus::DATA
|
|
53
53
|
end
|
|
54
54
|
|
|
55
55
|
def hear_fast_serial
|
|
56
56
|
low = @iec_bus.low_lines
|
|
57
57
|
serial = @cia1.serial
|
|
58
|
-
serial.cnt_in = low.nobits?(
|
|
59
|
-
serial.sp_in = low.nobits?(
|
|
58
|
+
serial.cnt_in = low.nobits?(Badline::Drives::SerialBus::SRQ)
|
|
59
|
+
serial.sp_in = low.nobits?(Badline::Drives::SerialBus::DATA)
|
|
60
60
|
end
|
|
61
61
|
end
|
|
62
62
|
end
|
|
@@ -6,7 +6,7 @@ module Badline
|
|
|
6
6
|
# What the MMU maps. For the CPU: the RAM bank, common RAM and the
|
|
7
7
|
# pages page 0 and page 1 move to in both modes, and CR's ROMs and I/O
|
|
8
8
|
# in C128 mode. C64 mode lays the PLA's ROMs and I/O over the same RAM
|
|
9
|
-
# (
|
|
9
|
+
# (C64::Bus::PLA).
|
|
10
10
|
module MMUPages
|
|
11
11
|
private
|
|
12
12
|
|
data/lib/badline/c128/modes.rb
CHANGED
|
@@ -33,7 +33,7 @@ module Badline
|
|
|
33
33
|
def mode_changed
|
|
34
34
|
layout = trap_layout
|
|
35
35
|
@capture_output&.layout = layout
|
|
36
|
-
if @
|
|
36
|
+
if @dos
|
|
37
37
|
remove_kernal_traps
|
|
38
38
|
install_kernal_traps(layout)
|
|
39
39
|
end
|
|
@@ -41,7 +41,7 @@ module Badline
|
|
|
41
41
|
|
|
42
42
|
keyboard.release(:cbm)
|
|
43
43
|
@holding_commodore = false
|
|
44
|
-
@init_threshold = @cycles +
|
|
44
|
+
@init_threshold = @cycles + C64::INIT_THRESHOLD if @cycles < @init_threshold
|
|
45
45
|
end
|
|
46
46
|
|
|
47
47
|
# The keyboard buffer of the KERNAL the machine runs: the C64's, or in
|
|
@@ -1,26 +1,17 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "badline/snapshot/c128_setup"
|
|
4
|
+
|
|
3
5
|
module Badline
|
|
4
6
|
class C128
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
# The model, the SID and the mode it resets into of the machine a State
|
|
8
|
-
# from #snapshot was taken of, the arguments C128.new takes.
|
|
9
|
-
def self.setup(state)
|
|
10
|
-
input = Snapshot::StateReader.new(state)
|
|
11
|
-
input.marker(MARKER)
|
|
12
|
-
input.check_stamp
|
|
13
|
-
SavedState.read_setup(input)
|
|
14
|
-
end
|
|
7
|
+
# How the machine a State from #snapshot was taken of was built.
|
|
8
|
+
def self.setup(state) = Snapshot::C128Setup.from(state)
|
|
15
9
|
|
|
16
10
|
# A new machine, built as the one a State from #snapshot was taken of,
|
|
17
11
|
# at that state.
|
|
18
|
-
def self.restored(state)
|
|
19
|
-
setup = setup(state)
|
|
20
|
-
new(model: setup[0], sid_model: setup[1], mode: setup[2]).apply_state(state)
|
|
21
|
-
end
|
|
12
|
+
def self.restored(state) = setup(state).build.apply_state(state)
|
|
22
13
|
|
|
23
|
-
# The whole machine's state for a snapshot, as
|
|
14
|
+
# The whole machine's state for a snapshot, as C64's: the
|
|
24
15
|
# machine's own latches, FAST and TEST as they last took hold, the bus with its RAM, the MMU, the chips and
|
|
25
16
|
# the VDC, the CPU, the cartridge, the disk device 8 serves through the
|
|
26
17
|
# traps and a true 1541. The serial lines go back into the bus from the
|
|
@@ -28,21 +19,6 @@ module Badline
|
|
|
28
19
|
# joysticks, CAPS LOCK and 40/80 DISPLAY, the traps and callbacks, and
|
|
29
20
|
# which chip renders.
|
|
30
21
|
module SavedState
|
|
31
|
-
SID_MODELS = %i[mos6581 mos8580].freeze
|
|
32
|
-
MODES = %i[c64 c128].freeze
|
|
33
|
-
|
|
34
|
-
# The model's name, the SID's model and the mode.
|
|
35
|
-
def self.read_setup(input)
|
|
36
|
-
name = input.string
|
|
37
|
-
known = Model::ALL.any? { |model| model.name == name }
|
|
38
|
-
raise Snapshot::FormatError, "the state names a C128 model badline doesn't know" unless known
|
|
39
|
-
|
|
40
|
-
sid_model = SID_MODELS.fetch(input.int)
|
|
41
|
-
[name, sid_model, MODES.fetch(input.int)]
|
|
42
|
-
rescue IndexError
|
|
43
|
-
raise Snapshot::FormatError, "the state names a SID or a mode badline doesn't know"
|
|
44
|
-
end
|
|
45
|
-
|
|
46
22
|
# How many more on_init handlers the machine a State was taken of had
|
|
47
23
|
# yet to run than this one has. Nil until the machine is restored.
|
|
48
24
|
attr_reader :init_handlers_lost
|
|
@@ -72,8 +48,8 @@ module Badline
|
|
|
72
48
|
end
|
|
73
49
|
|
|
74
50
|
def save_state(out)
|
|
75
|
-
out.marker(MARKER).stamp
|
|
76
|
-
|
|
51
|
+
out.marker(Snapshot::C128Setup::MARKER).stamp
|
|
52
|
+
snapshot_setup.write(out)
|
|
77
53
|
out.int(@cycles).int(@clock_bits).boolean(@nmi_asserted).boolean(@cartridge_nmi).boolean(@restore_pulse)
|
|
78
54
|
out.boolean(!@pending_keys.nil?)
|
|
79
55
|
out.ints(@pending_keys) if @pending_keys
|
|
@@ -83,14 +59,14 @@ module Badline
|
|
|
83
59
|
@cpu.save_state(out)
|
|
84
60
|
@z80.save_state(out)
|
|
85
61
|
out.int(@z80_due).int(@chips_ahead).boolean(@cpu_reset_pending)
|
|
86
|
-
|
|
62
|
+
save_trap_dos(out)
|
|
87
63
|
save_serial_bus(out)
|
|
88
64
|
end
|
|
89
65
|
|
|
90
66
|
def load_state(input)
|
|
91
|
-
input.marker(MARKER)
|
|
67
|
+
input.marker(Snapshot::C128Setup::MARKER)
|
|
92
68
|
input.check_stamp
|
|
93
|
-
check_setup(
|
|
69
|
+
check_setup(Snapshot::C128Setup.read(input))
|
|
94
70
|
@cycles = input.int
|
|
95
71
|
@clock_bits = input.int
|
|
96
72
|
@nmi_asserted = input.boolean?
|
|
@@ -105,24 +81,17 @@ module Badline
|
|
|
105
81
|
push_serial_lines
|
|
106
82
|
@cpu.load_state(input)
|
|
107
83
|
load_z80(input)
|
|
108
|
-
|
|
84
|
+
load_trap_dos(input)
|
|
109
85
|
load_serial_bus(input)
|
|
110
86
|
push_fast_serial
|
|
111
87
|
end
|
|
112
88
|
|
|
113
89
|
private
|
|
114
90
|
|
|
115
|
-
# The Z80 and which CPU has the bus
|
|
116
|
-
#
|
|
117
|
-
# to its CPU without resetting the 8502.
|
|
91
|
+
# The Z80 and which CPU has the bus. The bus, restored before it,
|
|
92
|
+
# hands the bus to its CPU without resetting the 8502.
|
|
118
93
|
def load_z80(input)
|
|
119
94
|
@z80_running = @bus.z80?
|
|
120
|
-
@z80_turn = @z80_running
|
|
121
|
-
@z80_due = @z80.cycles
|
|
122
|
-
@chips_ahead = 0
|
|
123
|
-
@cpu_reset_pending = false
|
|
124
|
-
return unless input.schema > 6
|
|
125
|
-
|
|
126
95
|
@z80.load_state(input)
|
|
127
96
|
@z80_due = input.int
|
|
128
97
|
@chips_ahead = input.int
|
|
@@ -130,11 +99,16 @@ module Badline
|
|
|
130
99
|
@z80_turn = @z80_running || @chips_ahead.positive?
|
|
131
100
|
end
|
|
132
101
|
|
|
102
|
+
# How this machine was built.
|
|
103
|
+
def snapshot_setup
|
|
104
|
+
Snapshot::C128Setup.new(model: @model.name, sid_model: @sid.model, mode: @c64_built ? :c64 : :c128)
|
|
105
|
+
end
|
|
106
|
+
|
|
133
107
|
def check_setup(setup)
|
|
134
|
-
ours =
|
|
108
|
+
ours = snapshot_setup
|
|
135
109
|
return if setup == ours
|
|
136
110
|
|
|
137
|
-
raise Snapshot::FormatError, "the state is of a #{setup
|
|
111
|
+
raise Snapshot::FormatError, "the state is of a #{setup}, not a #{ours}"
|
|
138
112
|
end
|
|
139
113
|
end
|
|
140
114
|
|
data/lib/badline/c128/z80.rb
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require "badline/z80/core"
|
|
3
|
+
require "badline/chips/z80/core"
|
|
4
4
|
|
|
5
5
|
module Badline
|
|
6
6
|
class C128
|
|
7
7
|
# The C128's Z80A, on the Z80's side of the C128::Bus.
|
|
8
8
|
class Z80
|
|
9
|
-
include Badline::Z80::Core
|
|
9
|
+
include Badline::Chips::Z80::Core
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
# The Z80's accesses, through the pages C128::Bus lays out for it
|