badline 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +25 -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 +4 -4
- 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} +6 -6
- data/lib/badline/c128/bus.rb +30 -51
- 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 +18 -72
- data/lib/badline/{computer → c64}/attachments.rb +16 -47
- 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/c64/common.rb +34 -0
- data/lib/badline/c64/kernal_traps.rb +89 -0
- 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 +20 -31
- data/lib/badline/{computer.rb → c64.rb} +22 -80
- 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 +27 -29
- 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 +10 -61
- 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/{file.rb → file_routine.rb} +1 -1
- data/lib/badline/kernal_trap/load.rb +6 -6
- data/lib/badline/kernal_trap/save.rb +5 -5
- data/lib/badline/kernal_trap/serial.rb +7 -7
- data/lib/badline/kernal_trap.rb +2 -3
- data/lib/badline/machine/clocking.rb +50 -0
- data/lib/badline/machine.rb +63 -7
- data/lib/badline/media/boot_disk.rb +2 -2
- data/lib/badline/media/disk_list.rb +3 -3
- data/lib/badline/media/disk_set.rb +1 -1
- data/lib/badline/media/extensions.rb +33 -0
- data/lib/badline/media/program.rb +28 -0
- data/lib/badline/media/true_drive.rb +4 -3
- data/lib/badline/media/tune.rb +35 -0
- data/lib/badline/media/vic20_cartridge.rb +1 -7
- data/lib/badline/media/vic20_media.rb +38 -80
- data/lib/badline/media.rb +84 -81
- data/lib/badline/model.rb +1 -1
- data/lib/badline/options/event.rb +3 -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 +10 -2
- data/lib/badline/snapshot/setup.rb +22 -66
- data/lib/badline/snapshot/state.rb +8 -17
- 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 +13 -12
- data/lib/badline/storage/d64_image.rb +15 -9
- data/lib/badline/storage/d71_image.rb +0 -2
- data/lib/badline/storage/d81_image.rb +0 -2
- data/lib/badline/storage/disk_image/writing.rb +2 -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 +11 -81
- 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 -60
- data/lib/badline/vic20/user_via_ports.rb +2 -2
- data/lib/badline/vic20.rb +20 -51
- metadata +250 -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 -72
- data/lib/badline/address_bus/sid_slots.rb +0 -42
- data/lib/badline/address_bus.rb +0 -235
- 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/computer/kernal_traps.rb +0 -29
- 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/cycleable.rb +0 -38
- 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 -318
- data/lib/badline/drive1541/disk_state.rb +0 -94
- 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 -852
- 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
|
|
@@ -116,7 +116,7 @@ module Badline
|
|
|
116
116
|
cycles
|
|
117
117
|
end
|
|
118
118
|
|
|
119
|
-
def clock_hz = @tune.ntsc? ? NTSC_CLOCK_HZ :
|
|
119
|
+
def clock_hz = @tune.ntsc? ? NTSC_CLOCK_HZ : Region::PAL.clock_hz
|
|
120
120
|
|
|
121
121
|
private
|
|
122
122
|
|
|
@@ -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
|
|
@@ -11,7 +11,7 @@ module Badline
|
|
|
11
11
|
# host holds. A cartridge is already in the port, built from its setup.
|
|
12
12
|
def save_state(out)
|
|
13
13
|
out.marker("C128 BUS")
|
|
14
|
-
out.int(@
|
|
14
|
+
out.int(@cpu_port.ddr).int(@cpu_port.data).int(@cpu_port.floating).int(@address).int(@data)
|
|
15
15
|
@mmu.save_state(out)
|
|
16
16
|
@ram.save_state(out)
|
|
17
17
|
@color_lines.color_ram(0).save_state(out)
|
|
@@ -27,9 +27,9 @@ module Badline
|
|
|
27
27
|
|
|
28
28
|
def load_state(input)
|
|
29
29
|
input.marker("C128 BUS")
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
ddr = input.int
|
|
31
|
+
data = input.int
|
|
32
|
+
floating = input.int
|
|
33
33
|
@address = input.int
|
|
34
34
|
@data = input.int
|
|
35
35
|
@mmu.load_state(input)
|
|
@@ -38,7 +38,7 @@ module Badline
|
|
|
38
38
|
@color_lines.color_ram(1).load_state(input)
|
|
39
39
|
@cartridge&.load_state(input)
|
|
40
40
|
@datasette.load_state(input)
|
|
41
|
-
@
|
|
41
|
+
@cpu_port.load(ddr, data, floating)
|
|
42
42
|
update_overlays!
|
|
43
43
|
@vic.load_state(input)
|
|
44
44
|
@control_ports.extra_rows = 0xf8 | @vic.extra_keyboard_lines
|
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
|
|
@@ -47,11 +47,10 @@ module Badline
|
|
|
47
47
|
PORT_PULLUPS = 0b0001_0111
|
|
48
48
|
PORT_FLOATING = 0b1000_1000
|
|
49
49
|
CAPS_LOCK = 0b0100_0000
|
|
50
|
-
TAPE_SENSE = 0b0001_0000
|
|
51
50
|
|
|
52
|
-
# The C64's power-on pattern (
|
|
51
|
+
# The C64's power-on pattern (C64::Bus::RAM_POWER_ON) in both 64K
|
|
53
52
|
# banks. The C128's own DRAMs' pattern is unmeasured.
|
|
54
|
-
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
|
|
55
54
|
|
|
56
55
|
# The VIC's write side: a write to $D02F also drives the extra
|
|
57
56
|
# keyboard lines K0-K2 onto the keyboard's rows 8-10.
|
|
@@ -126,9 +125,6 @@ module Badline
|
|
|
126
125
|
# KERNAL and the character ROM's C128 set.
|
|
127
126
|
attr_reader :basic_low_rom, :basic_high_rom, :editor_rom, :c128_kernal_rom, :c128_character_rom
|
|
128
127
|
|
|
129
|
-
# Whether CAPS LOCK is down, holding P6 low.
|
|
130
|
-
attr_reader :caps_lock
|
|
131
|
-
|
|
132
128
|
# The chips +model+, a Model::Profile, names, with the SID
|
|
133
129
|
# +sid_model+. +mode+ is the mode the MMU resets into.
|
|
134
130
|
def initialize(model, sid_model: model.sid_model, mode: :c64)
|
|
@@ -139,7 +135,6 @@ module Badline
|
|
|
139
135
|
@mmu = MMU.new(mode)
|
|
140
136
|
@cartridge = nil
|
|
141
137
|
@debug_page = nil
|
|
142
|
-
@caps_lock = false
|
|
143
138
|
|
|
144
139
|
load_roms
|
|
145
140
|
load_c128_roms
|
|
@@ -148,22 +143,21 @@ module Badline
|
|
|
148
143
|
@on_mode_change = nil
|
|
149
144
|
plug_chips(model, sid_model)
|
|
150
145
|
|
|
151
|
-
@datasette = Datasette.new
|
|
146
|
+
@datasette = Badline::Drives::Datasette.new
|
|
152
147
|
@datasette.on_flag { @cia1.flag! }
|
|
153
|
-
@datasette.on_sense_change { @
|
|
148
|
+
@datasette.on_sense_change { @cpu_port.refresh }
|
|
154
149
|
|
|
155
150
|
@color_lines = ColorLines.new(@vic, @cia2, character_rom, @c128_character_rom)
|
|
156
151
|
@color_ram = @color_lines.color_ram(1)
|
|
157
152
|
build_z80_pages
|
|
158
153
|
@vic_writes = VICWrites.new(@vic, @control_ports)
|
|
159
|
-
@open_bus =
|
|
154
|
+
@open_bus = C64::Bus::OpenBus.new(@vic)
|
|
160
155
|
@configuration_reads = ConfigurationPage.new(@mmu, @open_bus)
|
|
161
156
|
@configuration_writes = ConfigurationPage.new(@mmu, @open_bus)
|
|
162
157
|
|
|
163
|
-
@
|
|
164
|
-
|
|
165
|
-
@
|
|
166
|
-
@io_port = PortStatus.new(%i[basic kernal io tape_out tape_switch tape_motor], value: port_value)
|
|
158
|
+
@cpu_port = Chips::CPU::Port.new(@datasette, pullups: PORT_PULLUPS, floating: PORT_FLOATING,
|
|
159
|
+
caps_lock: CAPS_LOCK)
|
|
160
|
+
@io_port = @cpu_port.status
|
|
167
161
|
|
|
168
162
|
@read_pages = Array.new(256)
|
|
169
163
|
@write_pages = Array.new(256)
|
|
@@ -171,6 +165,7 @@ module Badline
|
|
|
171
165
|
@data = 0
|
|
172
166
|
@io_mapped = false
|
|
173
167
|
@mmu.on_change { update_overlays! }
|
|
168
|
+
@cpu_port.on_change { update_overlays! }
|
|
174
169
|
update_overlays!
|
|
175
170
|
end
|
|
176
171
|
|
|
@@ -191,19 +186,19 @@ module Badline
|
|
|
191
186
|
@ram.clear!(RAM_POWER_ON)
|
|
192
187
|
end
|
|
193
188
|
|
|
194
|
-
# The RES line clears the port's direction and
|
|
195
|
-
#
|
|
189
|
+
# The RES line resets the MMU and clears the port's direction and
|
|
190
|
+
# output registers. The port's floating bit keeps its charge.
|
|
196
191
|
def reset!
|
|
197
|
-
@port_ddr = 0x00
|
|
198
|
-
@port_out = 0x00
|
|
199
192
|
@mmu.reset!
|
|
200
|
-
|
|
193
|
+
@cpu_port.reset!
|
|
201
194
|
end
|
|
202
195
|
|
|
196
|
+
# Whether CAPS LOCK is down, holding P6 low.
|
|
197
|
+
def caps_lock = @cpu_port.caps_lock
|
|
198
|
+
|
|
203
199
|
# Holds CAPS LOCK down, or lets it up.
|
|
204
200
|
def caps_lock=(down)
|
|
205
|
-
@caps_lock = down
|
|
206
|
-
@io_port.value = port_value
|
|
201
|
+
@cpu_port.caps_lock = down
|
|
207
202
|
end
|
|
208
203
|
|
|
209
204
|
# Calls the block whenever MCR bit 6 takes the machine into C64 mode or
|
|
@@ -236,7 +231,7 @@ module Badline
|
|
|
236
231
|
@data = if addr > 0x01
|
|
237
232
|
@read_pages[addr >> 8].peek(addr)
|
|
238
233
|
else
|
|
239
|
-
addr.zero? ? @
|
|
234
|
+
addr.zero? ? @cpu_port.ddr : @io_port.value
|
|
240
235
|
end
|
|
241
236
|
end
|
|
242
237
|
|
|
@@ -254,8 +249,7 @@ module Badline
|
|
|
254
249
|
@data = value
|
|
255
250
|
if addr < 0x02
|
|
256
251
|
@write_pages[0].poke(addr, @vic.phi1_data)
|
|
257
|
-
addr.zero? ? @
|
|
258
|
-
update_port!
|
|
252
|
+
addr.zero? ? @cpu_port.write_ddr(value) : @cpu_port.write_data(value)
|
|
259
253
|
else
|
|
260
254
|
@write_pages[addr >> 8].poke(addr, value)
|
|
261
255
|
end
|
|
@@ -281,32 +275,17 @@ module Badline
|
|
|
281
275
|
end
|
|
282
276
|
|
|
283
277
|
def plug_chips(model, sid_model)
|
|
284
|
-
@keyboard = Keyboard.new(matrix: KEYBOARD_MATRIX)
|
|
285
|
-
@joystick1 = Joystick.new
|
|
286
|
-
@joystick2 = Joystick.new
|
|
287
|
-
@control_ports = ControlPorts.new(keyboard: @keyboard, joystick1: @joystick1, joystick2: @joystick2)
|
|
288
|
-
@vic = VIC.new(model: model.vic_model, region: @region)
|
|
289
|
-
@cia1 = CIA.new(start: 0xdc00, peripheral: @control_ports, model: model.cia_model, region: @region)
|
|
290
|
-
@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)
|
|
291
285
|
@control_ports.port_a_source = @cia1
|
|
292
286
|
@cia1.on_port_b4_change { |high| @vic.lightpen_level(high) }
|
|
293
|
-
@sid = SID.new(model: sid_model, pots: @control_ports)
|
|
294
|
-
@vdc = VDC.new(model: model.vdc_model, ram_kb: model.vdc_ram_kb, clock_hz: @region.clock_hz)
|
|
295
|
-
end
|
|
296
|
-
|
|
297
|
-
def update_port!
|
|
298
|
-
driven = @port_ddr & PORT_FLOATING
|
|
299
|
-
@port_floating = (@port_floating & ~driven) | (@port_out & driven)
|
|
300
|
-
@io_port.value = port_value
|
|
301
|
-
@datasette.motor = !@io_port.tape_motor?
|
|
302
|
-
update_overlays!
|
|
303
|
-
end
|
|
304
|
-
|
|
305
|
-
def port_value
|
|
306
|
-
input = PORT_PULLUPS | (@port_floating & PORT_FLOATING)
|
|
307
|
-
input |= CAPS_LOCK unless @caps_lock
|
|
308
|
-
input &= ~TAPE_SENSE if @datasette.sense_low?
|
|
309
|
-
(@port_out & @port_ddr) | (input & ~@port_ddr & 0xff)
|
|
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)
|
|
310
289
|
end
|
|
311
290
|
|
|
312
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
|