badline 0.12.1 → 0.14.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 +66 -1
- data/CLAUDE.md +86 -38
- data/CONTRIBUTING.md +4 -3
- data/README.md +9 -6
- data/doc/library.md +9 -9
- data/doc/media.md +2 -1
- data/doc/pinned-behaviour.md +134 -105
- data/doc/snapshot-format.md +1047 -0
- data/doc/snapshots.md +73 -43
- data/lib/badline/audio/bare_player.rb +53 -20
- data/lib/badline/audio/cli.rb +6 -6
- data/lib/badline/audio/jukebox.rb +2 -2
- data/lib/badline/audio/machine_player.rb +16 -10
- data/lib/badline/{media → audio}/queue.rb +1 -1
- data/lib/badline/audio/queued_tune.rb +6 -6
- data/lib/badline/audio/renderer.rb +33 -22
- data/lib/badline/audio/stereo.rb +1 -1
- data/lib/badline/c128/banks.rb +6 -3
- data/lib/badline/c128/bus/keyed_state.rb +45 -0
- data/lib/badline/c128/bus.rb +35 -20
- data/lib/badline/c128/color_lines.rb +2 -2
- data/lib/badline/c128/cpu.rb +1 -1
- data/lib/badline/c128/drives.rb +14 -34
- data/lib/badline/c128/fast_serial.rb +5 -5
- data/lib/badline/c128/keyed_modules.rb +117 -0
- data/lib/badline/c128/keyed_state.rb +91 -0
- data/lib/badline/c128/keys.rb +9 -0
- data/lib/badline/c128/mmu.rb +9 -8
- data/lib/badline/c128/mmu_pages.rb +21 -1
- data/lib/badline/c128/modes.rb +21 -11
- data/lib/badline/c128/z80.rb +2 -2
- data/lib/badline/c128/z80_turns.rb +1 -1
- data/lib/badline/c128.rb +21 -16
- data/lib/badline/c64/attachments.rb +42 -0
- data/lib/badline/c64/banked_ram/banking.rb +32 -0
- data/lib/badline/c64/banked_ram/plus256k.rb +64 -0
- data/lib/badline/c64/banked_ram/plus60k.rb +47 -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/debug_register.rb +32 -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/keyed_state.rb +41 -0
- data/lib/badline/c64/bus/pla.rb +149 -0
- data/lib/badline/c64/bus/roms.rb +41 -0
- data/lib/badline/c64/bus/sid_slots.rb +44 -0
- data/lib/badline/c64/bus.rb +219 -0
- data/lib/badline/c64/cartridge/action_replay.rb +115 -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 +132 -0
- data/lib/badline/c64/cartridge/epyx_fastload.rb +73 -0
- data/lib/badline/c64/cartridge/final_cartridge3.rb +79 -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 +64 -0
- data/lib/badline/c64/cartridge/game_system.rb +42 -0
- data/lib/badline/c64/cartridge/geo_ram.rb +65 -0
- data/lib/badline/c64/cartridge/kcs_power.rb +69 -0
- data/lib/badline/c64/cartridge/keyed_state.rb +393 -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 +60 -0
- data/lib/badline/c64/cartridge/retro_replay.rb +278 -0
- data/lib/badline/c64/cartridge/rex_utility.rb +31 -0
- data/lib/badline/c64/cartridge/rgcd.rb +50 -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 +40 -0
- data/lib/badline/c64/cartridge/westermann.rb +32 -0
- data/lib/badline/c64/cartridge/zaxxon.rb +52 -0
- data/lib/badline/c64/cartridge.rb +232 -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 +39 -36
- data/lib/badline/c64/keyed_modules.rb +111 -0
- data/lib/badline/c64/keyed_state.rb +68 -0
- data/lib/badline/c64/reu/dma.rb +271 -0
- data/lib/badline/c64/reu/keyed_state.rb +140 -0
- data/lib/badline/c64/reu/ram.rb +94 -0
- data/lib/badline/c64/reu/trigger.rb +34 -0
- data/lib/badline/c64/reu.rb +289 -0
- data/lib/badline/c64/true_drives.rb +120 -0
- data/lib/badline/{computer.rb → c64.rb} +24 -15
- data/lib/badline/chips/cia/fast_forward.rb +62 -0
- data/lib/badline/chips/cia/interrupt_register.rb +128 -0
- data/lib/badline/chips/cia/keyed_parts.rb +213 -0
- data/lib/badline/chips/cia/serial.rb +246 -0
- data/lib/badline/chips/cia/time_of_day.rb +210 -0
- data/lib/badline/chips/cia/timer.rb +188 -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 +183 -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/keyed_state.rb +177 -0
- data/lib/badline/chips/cpu/microcode.rb +195 -0
- data/lib/badline/chips/cpu/operations.rb +90 -0
- data/lib/badline/chips/cpu/port.rb +133 -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 +17 -0
- data/lib/badline/chips/sid/catch_up.rb +122 -0
- data/lib/badline/chips/sid/decimator.rb +68 -0
- data/lib/badline/chips/sid/envelope.rb +236 -0
- data/lib/badline/chips/sid/filter.rb +227 -0
- data/lib/badline/chips/sid/keyed_parts.rb +286 -0
- data/lib/badline/chips/sid/voice.rb +69 -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.rb +305 -0
- data/lib/badline/chips/sid.rb +264 -0
- data/lib/badline/chips/ted/beam.rb +119 -0
- data/lib/badline/chips/ted/timers.rb +66 -0
- data/lib/badline/chips/ted.rb +143 -0
- data/lib/badline/chips/tia.rb +49 -0
- data/lib/badline/chips/vdc/keyed_parts.rb +105 -0
- data/lib/badline/{c128 → chips}/vdc/memory.rb +1 -1
- data/lib/badline/{c128 → chips}/vdc/painter.rb +1 -13
- data/lib/badline/{c128 → chips}/vdc/raster.rb +1 -17
- data/lib/badline/{c128 → chips}/vdc/window.rb +1 -10
- data/lib/badline/{c128 → chips}/vdc.rb +6 -31
- data/lib/badline/chips/via/control_lines.rb +109 -0
- data/lib/badline/chips/via/fast_forward.rb +55 -0
- data/lib/badline/chips/via/interrupt_register.rb +60 -0
- data/lib/badline/chips/via/keyed_parts.rb +163 -0
- data/lib/badline/chips/via/shift_register.rb +168 -0
- data/lib/badline/chips/via/timer1.rb +120 -0
- data/lib/badline/chips/via/timer2.rb +117 -0
- data/lib/badline/chips/via.rb +267 -0
- data/lib/badline/chips/vic/bank.rb +135 -0
- data/lib/badline/chips/vic/border_mask.rb +78 -0
- data/lib/badline/chips/vic/collisions.rb +106 -0
- data/lib/badline/chips/vic/color_patches.rb +38 -0
- data/lib/badline/chips/vic/display_state.rb +168 -0
- data/lib/badline/chips/vic/graphics_mode.rb +166 -0
- data/lib/badline/chips/vic/graphics_shifter.rb +183 -0
- data/lib/badline/chips/vic/keyed_parts.rb +228 -0
- data/lib/badline/chips/vic/keyed_sprites.rb +225 -0
- data/lib/badline/chips/vic/keyed_state.rb +102 -0
- data/lib/badline/chips/vic/register_log.rb +65 -0
- data/lib/badline/chips/vic/registers.rb +188 -0
- data/lib/badline/chips/vic/sequencer.rb +275 -0
- data/lib/badline/chips/vic/sequencer_output.rb +118 -0
- data/lib/badline/chips/vic/sprite/internal_bus.rb +59 -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 +337 -0
- data/lib/badline/chips/vic/sprites.rb +281 -0
- data/lib/badline/chips/vic.rb +787 -0
- data/lib/badline/chips/vic_i/keyed_parts.rb +142 -0
- data/lib/badline/{vic20/vic → chips/vic_i}/painter.rb +2 -30
- data/lib/badline/chips/vic_i/sound/output.rb +85 -0
- data/lib/badline/chips/vic_i/sound.rb +227 -0
- data/lib/badline/{vic20/vic → chips/vic_i}/text_window.rb +2 -2
- data/lib/badline/{vic20/vic.rb → chips/vic_i.rb} +6 -6
- 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/keyed_state.rb +73 -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/shifts.rb +66 -0
- data/lib/badline/chips/z80.rb +13 -0
- data/lib/badline/chips.rb +10 -0
- data/lib/badline/core.rb +13 -32
- data/lib/badline/drives/datasette/keyed_state.rb +38 -0
- data/lib/badline/drives/datasette.rb +173 -0
- data/lib/badline/drives/engine/core.rb +152 -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 +72 -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 +75 -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.rb +318 -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/keyed_state.rb +251 -0
- data/lib/badline/drives/model1541/mechanism.rb +313 -0
- data/lib/badline/drives/model1541/rotation.rb +123 -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 +80 -0
- data/lib/badline/drives/model1571/bus.rb +100 -0
- data/lib/badline/drives/model1571/cpu.rb +13 -0
- data/lib/badline/drives/model1571/keyed_state.rb +108 -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 +108 -0
- data/lib/badline/drives/model1571.rb +141 -0
- data/lib/badline/drives/model1581/bus.rb +126 -0
- data/lib/badline/drives/model1581/cpu.rb +13 -0
- data/lib/badline/drives/model1581/disk.rb +133 -0
- data/lib/badline/drives/model1581/keyed_state.rb +280 -0
- data/lib/badline/drives/model1581/mechanism.rb +98 -0
- data/lib/badline/drives/model1581/serial_port.rb +54 -0
- data/lib/badline/drives/model1581/slot.rb +61 -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/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 +216 -0
- data/lib/badline/drives/model1581.rb +206 -0
- data/lib/badline/drives/serial_bus.rb +161 -0
- data/lib/badline/drives.rb +8 -0
- data/lib/badline/frontend/app.rb +3 -3
- data/lib/badline/frontend/boot.rb +4 -4
- data/lib/badline/frontend/controls.rb +19 -3
- data/lib/badline/frontend/drive_led.rb +44 -21
- data/lib/badline/frontend/machine_window.rb +3 -1
- data/lib/badline/frontend/menu/menu_dialogs.rb +2 -2
- 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/snapshots.rb +12 -1
- data/lib/badline/frontend/timeline.rb +30 -12
- 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/matrix_typist.rb +98 -0
- data/lib/badline/input.rb +4 -0
- data/lib/badline/kernal_trap/chrout.rb +45 -0
- data/lib/badline/kernal_trap/{drive → dos}/block_commands.rb +1 -1
- data/lib/badline/kernal_trap/dos/channel.rb +156 -0
- data/lib/badline/kernal_trap/{drive → dos}/channels.rb +1 -26
- data/lib/badline/kernal_trap/{drive → dos}/memory.rb +1 -10
- data/lib/badline/kernal_trap/{drive → dos}/parameters.rb +1 -1
- data/lib/badline/kernal_trap/{drive → dos}/status.rb +1 -9
- data/lib/badline/kernal_trap/{drive → dos}/write_file.rb +1 -19
- data/lib/badline/kernal_trap/{drive → dos}/writes.rb +1 -1
- data/lib/badline/kernal_trap/{drive.rb → dos.rb} +9 -27
- data/lib/badline/kernal_trap/file_routine.rb +4 -4
- data/lib/badline/kernal_trap/keyed_state.rb +150 -0
- data/lib/badline/kernal_trap/layout.rb +75 -11
- data/lib/badline/kernal_trap/load.rb +19 -21
- data/lib/badline/kernal_trap/routine.rb +12 -0
- data/lib/badline/kernal_trap/save.rb +12 -22
- data/lib/badline/kernal_trap/serial.rb +8 -24
- data/lib/badline/kernal_trap.rb +3 -2
- data/lib/badline/machine/clocking.rb +1 -1
- data/lib/badline/machine/keyboard_buffer.rb +49 -0
- data/lib/badline/machine/settling.rb +29 -0
- data/lib/badline/machine.rb +10 -7
- data/lib/badline/media/boot_disk.rb +14 -2
- data/lib/badline/media/extensions.rb +10 -0
- 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/memory.rb +3 -6
- data/lib/badline/model.rb +1 -1
- data/lib/badline/options/family.rb +5 -2
- data/lib/badline/options/help.rb +42 -16
- data/lib/badline/options/table.rb +2 -0
- data/lib/badline/options/validation.rb +2 -0
- data/lib/badline/options.rb +6 -1
- data/lib/badline/plus4/acia.rb +45 -0
- data/lib/badline/plus4/bus.rb +312 -0
- data/lib/badline/plus4/cpu.rb +10 -0
- data/lib/badline/plus4/cpu_port.rb +93 -0
- data/lib/badline/plus4/keyboard_port.rb +51 -0
- data/lib/badline/plus4/model.rb +38 -0
- data/lib/badline/plus4/user_port.rb +31 -0
- data/lib/badline/plus4.rb +164 -0
- data/lib/badline/roms/README +44 -6
- data/lib/badline/roms/plus4/basic.rom +0 -0
- data/lib/badline/roms/plus4/function-high.rom +0 -0
- data/lib/badline/roms/plus4/function-low.rom +0 -0
- data/lib/badline/roms/plus4/kernal-ntsc.rom +0 -0
- data/lib/badline/roms/plus4/kernal-pal.rom +0 -0
- 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 +32 -0
- data/lib/badline/snapshot/c64_setup.rb +83 -0
- data/lib/badline/snapshot/container.rb +4 -0
- data/lib/badline/snapshot/field_doc/markdown.rb +112 -0
- data/lib/badline/snapshot/field_doc.rb +109 -0
- data/lib/badline/snapshot/image.rb +132 -46
- data/lib/badline/snapshot/keyed/cursor.rb +40 -0
- data/lib/badline/snapshot/keyed/modules.rb +66 -0
- data/lib/badline/snapshot/keyed/reader.rb +188 -0
- data/lib/badline/snapshot/keyed/recorder.rb +88 -0
- data/lib/badline/snapshot/keyed/report.rb +26 -0
- data/lib/badline/snapshot/keyed/writer.rb +55 -0
- data/lib/badline/snapshot/keyed.rb +64 -0
- data/lib/badline/snapshot/machine_state.rb +17 -64
- data/lib/badline/snapshot/storage_setup.rb +63 -0
- data/lib/badline/snapshot/vic20_setup.rb +28 -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 +3 -3
- data/lib/badline/snapshot/vice/reu_fields.rb +40 -0
- data/lib/badline/snapshot/vice.rb +13 -35
- data/lib/badline/snapshot.rb +44 -22
- data/lib/badline/storage/crt_file.rb +3 -1
- 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 +10 -5
- data/lib/badline/storage/host_directory.rb +0 -5
- data/lib/badline/storage/t64.rb +2 -8
- data/lib/badline/storage/tap.rb +43 -15
- 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 +8 -5
- data/lib/badline/vic20/bus/keyed_state.rb +52 -0
- data/lib/badline/vic20/bus.rb +2 -25
- data/lib/badline/vic20/cpu.rb +1 -1
- data/lib/badline/vic20/keyed_modules.rb +73 -0
- data/lib/badline/vic20/keyed_state.rb +45 -0
- data/lib/badline/vic20/port_wiring.rb +4 -4
- data/lib/badline/vic20/user_via_ports.rb +2 -2
- data/lib/badline/vic20.rb +22 -17
- data/lib/badline.rb +1 -0
- metadata +271 -228
- 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/c128/bus_state.rb +0 -53
- data/lib/badline/c128/saved_state.rb +0 -143
- 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/chrout_trap.rb +0 -43
- 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/attachments.rb +0 -88
- data/lib/badline/computer/saved_state.rb +0 -117
- data/lib/badline/computer/true_drives.rb +0 -69
- 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/debug_register.rb +0 -28
- 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/keyboard_buffer.rb +0 -33
- 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/snapshot/setup.rb +0 -75
- data/lib/badline/snapshot/state.rb +0 -189
- 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/saved_state.rb +0 -124
- data/lib/badline/vic20/sound/output.rb +0 -83
- data/lib/badline/vic20/sound.rb +0 -233
- data/lib/badline/vic20/vic/saved_state.rb +0 -55
- 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
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 320b4659e6c9945509741f928989b2378d38ae18a51c1dd5bbca706e3b3ada54
|
|
4
|
+
data.tar.gz: 9a6ce80ab26e74e325c8fb660f4ed1fabc64a6e3c1859b723b3816aebe3f4b55
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0f4e3b6c6bc7c35eec18ea3a81165050183e92eeebab3c04b12472970b5b0a87d8ad860ceac81e411a39836c601239b3e708bcffbcb7f4eb6561599c1cda1522
|
|
7
|
+
data.tar.gz: 61d6698127237a45d99febd816088da06d227519b34455188babc7dafebb977613a61c1472ed348c691433a8c02f4dcbab0346f48083b71fc02035f64f7c8549
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,71 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.14.0](https://github.com/elektronaut/badline/compare/v0.13.0...v0.14.0) (2026-10-11)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* add the keyed snapshot record encoding ([1b87aed](https://github.com/elektronaut/badline/commit/1b87aeddea27f81cb1ccedbbef2bba58c2db0bb3))
|
|
9
|
+
* boot the Plus/4 and the C16 to READY headless ([278020e](https://github.com/elektronaut/badline/commit/278020ee0256fa1d085391fd0e7a6679ac80dbcb))
|
|
10
|
+
* bundle the 264 series ROMs and refuse badline plus4 until it runs ([7072ae7](https://github.com/elektronaut/badline/commit/7072ae7cb6e1ccd96a4e02eb1146b7b1bfaf7125))
|
|
11
|
+
* give each machine its keyboard buffer layout ([0b64648](https://github.com/elektronaut/badline/commit/0b64648fec3cd56bbbee1ac4dc8fe446c84dd4b9))
|
|
12
|
+
* keep the KERNAL's file variables in KernalTrap::Layout ([0ca7488](https://github.com/elektronaut/badline/commit/0ca7488505b2b7af9f358bdf6d3e86a1e1c768e3))
|
|
13
|
+
* keyed snapshot fields for device 8 through the KERNAL traps ([cce36f2](https://github.com/elektronaut/badline/commit/cce36f2f740c5337cd2b0a66fe99394114409c32))
|
|
14
|
+
* keyed snapshot fields for each machine's own state and setup ([ff251a6](https://github.com/elektronaut/badline/commit/ff251a62cbad4502f576628a4f4c5d3d6a22eaf8))
|
|
15
|
+
* keyed snapshot fields for the 1541 ([f3f57b7](https://github.com/elektronaut/badline/commit/f3f57b7e24471e198304bfd90ba16c4abb7c4c16))
|
|
16
|
+
* keyed snapshot fields for the 1571 ([5ceb741](https://github.com/elektronaut/badline/commit/5ceb7416a1902252d97c80aff22658a68e4abfb6))
|
|
17
|
+
* keyed snapshot fields for the 1581 ([1c67e29](https://github.com/elektronaut/badline/commit/1c67e298c24e82e92cc5feddcc0153143d4eda8d))
|
|
18
|
+
* keyed snapshot fields for the 6502 cores and the Z80 ([8ee592e](https://github.com/elektronaut/badline/commit/8ee592e5ee5b658c8f452cf4bdf9df044f8c19ab))
|
|
19
|
+
* keyed snapshot fields for the C128's MMU ([aa861ca](https://github.com/elektronaut/badline/commit/aa861cac0a33d79f777b60310f0cb573024f2d60))
|
|
20
|
+
* keyed snapshot fields for the cartridges ([349ae81](https://github.com/elektronaut/badline/commit/349ae81c7c002f5c1b94fa50cc994a6b7ec16915))
|
|
21
|
+
* keyed snapshot fields for the CIA ([b5a6ff8](https://github.com/elektronaut/badline/commit/b5a6ff8b02026daa3ec6247ab4024d35efedb18e))
|
|
22
|
+
* keyed snapshot fields for the datasette and its tape ([37a52f1](https://github.com/elektronaut/badline/commit/37a52f1018ab226a60395e1c98c6a362c0159f01))
|
|
23
|
+
* keyed snapshot fields for the memories, RAM expansions and buses ([14b1a95](https://github.com/elektronaut/badline/commit/14b1a951a44c2bc23871208b9843489d4ca6963c))
|
|
24
|
+
* keyed snapshot fields for the REU ([8088ac5](https://github.com/elektronaut/badline/commit/8088ac52c68667db7d6acdc6e0f0b629e165b0b3))
|
|
25
|
+
* keyed snapshot fields for the SID ([b58f88d](https://github.com/elektronaut/badline/commit/b58f88d1a98346aba4dbec0dead306b3d36b32f7))
|
|
26
|
+
* keyed snapshot fields for the VDC ([b894c3e](https://github.com/elektronaut/badline/commit/b894c3ef0b83988d17f03027b1831e7be3739be3))
|
|
27
|
+
* keyed snapshot fields for the VIA ([52ab12c](https://github.com/elektronaut/badline/commit/52ab12cb129adedc8a3f0b7df469a1440eb72309))
|
|
28
|
+
* keyed snapshot fields for the VIC-I and its sound ([a47d3e8](https://github.com/elektronaut/badline/commit/a47d3e823891e5d597141423f1675962ac266df7))
|
|
29
|
+
* keyed snapshot fields for the VIC-II ([8fc8b4c](https://github.com/elektronaut/badline/commit/8fc8b4c39f8ae5cac781f51f0bbeab5134c3bc9f))
|
|
30
|
+
* latch the VIC's sprite collisions when a snapshot settles ([a1c9429](https://github.com/elektronaut/badline/commit/a1c9429fefdbbc57407fb68baf057209d7163db1))
|
|
31
|
+
* let a unit report its own adjustments when its snapshot loads ([3b3af19](https://github.com/elektronaut/badline/commit/3b3af19ef0d74b0a45fbea96feef107f26db12a6))
|
|
32
|
+
* read Plus/4 CRT images ([450148d](https://github.com/elektronaut/badline/commit/450148db02c8057cc071f6d867707aa45a87c996))
|
|
33
|
+
* read version 2 C16 tapes and time the datasette's read level ([7e78070](https://github.com/elektronaut/badline/commit/7e78070877394a4657e23699a3098f297469be05))
|
|
34
|
+
* report a VIC-II line restarted from another renderer's snapshot ([6cb0607](https://github.com/elektronaut/badline/commit/6cb06075d410e59a8cd6f7d82d29757819e23e67))
|
|
35
|
+
* run the 264 testbench's exitcode rows as testbench-plus4 and testbench-c16 ([862f14b](https://github.com/elektronaut/badline/commit/862f14bd474bdac92017f25a57a057cf1f42a63f))
|
|
36
|
+
* run the Lorenz suite's plus4 build as lorenz-plus4 ([006efdd](https://github.com/elektronaut/badline/commit/006efddeb3a052714b99ff9b11ec18dd85cb6778))
|
|
37
|
+
* save and load snapshots as BL-* modules ([25db1be](https://github.com/elektronaut/badline/commit/25db1be28817d292c314672c5401251d36d11902))
|
|
38
|
+
* save snapshots at the next instruction boundary ([3f9ae3c](https://github.com/elektronaut/badline/commit/3f9ae3cf5392c194a1915801c9da4739832649e3))
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
### Bug Fixes
|
|
42
|
+
|
|
43
|
+
* boot C128 boot sectors on .g64 and .g71 images ([81ad184](https://github.com/elektronaut/badline/commit/81ad1842fdc66b5ddb5d2988eb699409741f376a))
|
|
44
|
+
* draw the true drive's power LED, and the LEDs of a drive plugged in after start ([982c522](https://github.com/elektronaut/badline/commit/982c522c56c46d193ca5d15f49c59f221f04ad8e))
|
|
45
|
+
* drive the datasette's write line from the CPU port's bit 3 ([b90c29d](https://github.com/elektronaut/badline/commit/b90c29dd758eb7867930c5f26dbd0ae510f430af))
|
|
46
|
+
* let a held key go as the key it pressed across a C128 mode switch ([3a8d731](https://github.com/elektronaut/badline/commit/3a8d7313034f0b69057528b58ff247250b7e7168))
|
|
47
|
+
* read the ROMs and I/O a C128 KERNAL bank maps when saving ([3e4db21](https://github.com/elektronaut/badline/commit/3e4db218959237fada950e4b65238203af10e3c6))
|
|
48
|
+
* run the VIC-20's sound voices whether or not the host plays them ([13052c7](https://github.com/elektronaut/badline/commit/13052c7bbb9ca2b4ed678935ec6b88cc84bb2806))
|
|
49
|
+
* take the C128's own keys in --at key= ([428047c](https://github.com/elektronaut/badline/commit/428047cc4eca55b70967048d49579840b90ea946))
|
|
50
|
+
* type --at type= text on the C128's key matrix while the Z80 runs ([39d77ff](https://github.com/elektronaut/badline/commit/39d77ff29989a46c82184cd2dde03e8d470c553b))
|
|
51
|
+
|
|
52
|
+
## [0.13.0](https://github.com/elektronaut/badline/compare/v0.12.1...v0.13.0) (2026-10-11)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
### Features
|
|
56
|
+
|
|
57
|
+
* read and write memory through the machine ([0a71be9](https://github.com/elektronaut/badline/commit/0a71be914fda736bdc10c320b86cf9e0bf91b05b))
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
### Bug Fixes
|
|
61
|
+
|
|
62
|
+
* take dead keys such as ´ on a Mac as key presses ([44bc087](https://github.com/elektronaut/badline/commit/44bc087a0def79a3d1f8837d7e479297aca7094f))
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
### Performance Improvements
|
|
66
|
+
|
|
67
|
+
* type the values a snapshot restores ([71e6e62](https://github.com/elektronaut/badline/commit/71e6e6229880d413adf2071a69263f7930536157))
|
|
68
|
+
|
|
3
69
|
## [0.12.1](https://github.com/elektronaut/badline/compare/v0.12.0...v0.12.1) (2026-10-10)
|
|
4
70
|
|
|
5
71
|
|
|
@@ -64,7 +130,6 @@
|
|
|
64
130
|
* bundle the PET 64's KERNAL, 901246-01 ([9a029ec](https://github.com/elektronaut/badline/commit/9a029ecfe25c0d9a806d8858253c4c172e175b7f))
|
|
65
131
|
|
|
66
132
|
|
|
67
|
-
### Miscellaneous Chores
|
|
68
133
|
|
|
69
134
|
* release 0.10.1 ([9d6f6ba](https://github.com/elektronaut/badline/commit/9d6f6ba71a647f24f00a830fbc772531fbcb4d92))
|
|
70
135
|
|
data/CLAUDE.md
CHANGED
|
@@ -6,42 +6,61 @@ This file covers how to work on the code.
|
|
|
6
6
|
|
|
7
7
|
## Orientation
|
|
8
8
|
|
|
9
|
-
`lib/badline/`
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
- **Machine**: `
|
|
13
|
-
VIC, both CIAs, SID and the datasette, then the CPU unless
|
|
14
|
-
BA low). `
|
|
15
|
-
|
|
16
|
-
`
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
`
|
|
9
|
+
`lib/badline/` is grouped by namespace, and a constant's path follows its
|
|
10
|
+
directory: `chips/vic.rb` is `Badline::Chips::VIC`.
|
|
11
|
+
|
|
12
|
+
- **Machine**: `c64.rb` (`Badline::C64`) clocks everything once per cycle
|
|
13
|
+
(`cycle!`: VIC, both CIAs, SID and the datasette, then the CPU unless
|
|
14
|
+
the VIC holds BA low). `c64/` holds the rest of the C64's board:
|
|
15
|
+
`c64/bus.rb` handles banking and page-table dispatch, and
|
|
16
|
+
`c64/banked_ram.rb` and `c64/banked_ram/` the +60K and +256K boards
|
|
17
|
+
that bank in extra RAM through `$D100`. `vic20.rb` and `vic20/`, and
|
|
18
|
+
`c128.rb` and `c128/`, are the other two families, and `machine.rb`
|
|
19
|
+
builds each by name. Every family reads and writes memory as its CPU
|
|
20
|
+
sees it with `peek` and `poke`
|
|
21
|
+
- **CPU**: `chips/cpu.rb` and `chips/cpu/`: the 6502 core
|
|
22
|
+
(`Chips::CPU::Core`, which each family's and each drive's CPU
|
|
23
|
+
includes), `instruction.rb` and `instruction_set/`, `interrupts.rb`,
|
|
24
|
+
`traps.rb` and the 6510's I/O port, `port.rb`. `chips/z80.rb` is the
|
|
25
|
+
C128's Z80
|
|
26
|
+
- **VIC-II**: `chips/vic.rb` and `chips/vic/`, covering the sequencer,
|
|
27
|
+
sprites, graphics modes, border and register timing. `chips/vic_i.rb`
|
|
28
|
+
is the VIC-20's VIC-I and its sound, and `chips/vdc.rb` the C128's VDC
|
|
29
|
+
- **CIA**: `chips/cia.rb` and `chips/cia/` (timers, serial and the TOD
|
|
30
|
+
clock, `time_of_day.rb`). `chips/via.rb` is the 6522 of the VIC-20 and
|
|
31
|
+
the drives
|
|
32
|
+
- **REU**: `c64/reu.rb` and `c64/reu/`, the RAM Expansion Unit's
|
|
33
|
+
registers and its DMA, which `C64#cycle!` clocks in place of the CPU
|
|
34
|
+
while it holds the bus
|
|
35
|
+
- **SID**: `chips/sid.rb` and `chips/sid/`. `audio/` plays and renders
|
|
36
|
+
tunes for `badline-ruby --headless` and `--audio-out`, and `sid_tune/`
|
|
37
|
+
reads `.sid` files, the HVSC's song lengths and its STIL
|
|
25
38
|
- **Media and host I/O**: `storage/` (disk, tape and cartridge image
|
|
26
|
-
formats), `cartridge/` (mappers), `kernal_trap/` (the LOAD/SAVE
|
|
27
|
-
|
|
28
|
-
`
|
|
39
|
+
formats), `c64/cartridge/` (mappers), `kernal_trap/` (the LOAD/SAVE
|
|
40
|
+
and IEC traps, and `kernal_trap/dos/`, the virtual DOS that stands in
|
|
41
|
+
for a drive), `media.rb` (attach and autostart), `drives/` (the true
|
|
42
|
+
1541, 1571 and 1581, the engine they share, the serial bus and the
|
|
43
|
+
datasette), and `input/` (the keyboard, joysticks, control ports,
|
|
44
|
+
mouse and paddles)
|
|
29
45
|
- **Front end**: `frontend/`, the SDL window both builds run (app loop,
|
|
30
46
|
screen, pacer, sound, controls, gamepads, snapshots), in Spinel's
|
|
31
47
|
subset, over the one binding in `sdl.rb` (`ffi.rb` implements it on
|
|
32
48
|
CRuby)
|
|
33
49
|
- **Native**: `native/` holds the native `badline`, the core and the
|
|
34
50
|
front end compiled with Spinel (`rake native:build`, `native/README.md`).
|
|
35
|
-
`spinel/` holds the Spinel test harnesses
|
|
51
|
+
`spinel/` holds the Spinel test harnesses, and `support/` the
|
|
52
|
+
checkpoints they and `bin/machine_diff` digest a machine with, which
|
|
53
|
+
stay out of the core
|
|
36
54
|
|
|
37
|
-
Timing-critical code lives in `
|
|
38
|
-
in the order `
|
|
55
|
+
Timing-critical code lives in `chips/` (`cpu`, `vic`, `cia` and `sid`) and
|
|
56
|
+
in the order `C64#cycle!` clocks them. Changes there move the test
|
|
39
57
|
suites below. `frontend/` changes move none of them.
|
|
40
58
|
|
|
41
59
|
Namespaced groups live in `lib/badline/<namespace>/`, with a sibling
|
|
42
60
|
`lib/badline/<namespace>.rb` that requires the members, directly or through
|
|
43
61
|
other members. `lib/badline.rb`
|
|
44
|
-
requires only the namespace file.
|
|
62
|
+
requires only the namespace file. `chips/` and `drives/` have no sibling
|
|
63
|
+
file: `core.rb` requires their members one by one.
|
|
45
64
|
|
|
46
65
|
### Oracles
|
|
47
66
|
|
|
@@ -54,7 +73,7 @@ requires only the namespace file.
|
|
|
54
73
|
| VICE testbench | `bin/testbench <subtree>` | `VICII/`, `CIA/`, `interrupts/`, `CPU/`, cartridges with `--carts`, the true 1541 drive with `--drive`, the VIC-20 with `--vic20`, the C128 in C64 mode with `--c128c64`, in C128 mode with `--c128`, and its Z80 with `--c128-z80` |
|
|
55
74
|
| VICE SID testprogs | `bin/sidtests` | SID |
|
|
56
75
|
| Drive scenarios | `bin/drive_scenarios` | The true 1541 running the DOS ROM: save, format, the error channel, idle, write protect and autostart |
|
|
57
|
-
| CIA offline grids | `bundle exec rspec --tag slow spec/badline/cia` | CIA timers and shift register, against a bare CIA in about 2 min |
|
|
76
|
+
| CIA offline grids | `bundle exec rspec --tag slow spec/badline/chips/cia` | CIA timers and shift register, against a bare CIA in about 2 min |
|
|
58
77
|
|
|
59
78
|
The CIA offline grids replay Lorenz's `cia1ta` and `cia1tb` sweeps (about
|
|
60
79
|
8 s) and the `cia-sdr-icr` loop for every timer A latch (about 2 min),
|
|
@@ -67,21 +86,30 @@ documents the baseline format, the suites and how rows are compared.
|
|
|
67
86
|
|
|
68
87
|
`bin/machine_diff <scenario|media> --against <rev>` checks that a change
|
|
69
88
|
leaves emulation alone. It runs the scenario on this tree and on `<rev>`'s
|
|
70
|
-
`lib/` side by side, digests the CPU, RAM,
|
|
71
|
-
|
|
72
|
-
and
|
|
89
|
+
`lib/` side by side, digests each chip every million cycles (the CPU, RAM,
|
|
90
|
+
VIC, CIAs and SID, the VIC-20's VIAs and sound, the C128's VDC, MMU and
|
|
91
|
+
Z80), and names the first component that differs. It builds a C64 unless
|
|
92
|
+
`--family vic20` or `--family c128` (with `--mode c64|c128`) says
|
|
93
|
+
otherwise. Use it for refactors and speed work.
|
|
94
|
+
|
|
95
|
+
`bin/snapshot_check` checks snapshots. For each scenario (`--list`) it saves
|
|
96
|
+
twice, then saves, loads and saves again, and expects the same bytes each
|
|
97
|
+
time. It then runs the saved and the loaded machine side by side and names
|
|
98
|
+
the first difference. `--carts` does the same for every cartridge mapper,
|
|
99
|
+
and `--diff A B` compares two snapshot files module by module. Run it on any
|
|
100
|
+
change to a unit's saved state.
|
|
73
101
|
|
|
74
102
|
## Driving the emulator headlessly
|
|
75
103
|
|
|
76
104
|
`exe/badline-ruby <media>` opens the SDL window, which is no use for checking
|
|
77
|
-
work. Drive a `Badline::
|
|
105
|
+
work. Drive a `Badline::C64` from Ruby instead, as the `bin/` runners do:
|
|
78
106
|
|
|
79
107
|
```ruby
|
|
80
|
-
computer = Badline::
|
|
108
|
+
computer = Badline::C64.new
|
|
81
109
|
Badline::Media.attach(computer, path) # PRG, disk, tape, CRT or directory; autostarts
|
|
82
110
|
computer.on_init { computer.type_text("print 6*7\r") } # after boot (~2.5M cycles)
|
|
83
111
|
3_500_000.times { computer.cycle! }
|
|
84
|
-
computer.
|
|
112
|
+
computer.peek(0x0400) # screen RAM starts at $0400
|
|
85
113
|
```
|
|
86
114
|
|
|
87
115
|
- `computer.capture_output` traps CHROUT and records what the machine prints
|
|
@@ -132,7 +160,7 @@ worktree and owns a different set of files.
|
|
|
132
160
|
|
|
133
161
|
- `rake vendor:checkout` fetches SingleStepTests 65x02, the Z80 sample
|
|
134
162
|
and VICE-testprogs into `vendor/`
|
|
135
|
-
- `bundle exec rspec`: line coverage is about
|
|
163
|
+
- `bundle exec rspec`: line coverage is about 95%. `spec/spec_helper.rb`
|
|
136
164
|
fails a whole-suite run (every spec file, no filters) below 90%, while
|
|
137
165
|
single-file and filtered runs skip the floor. `:slow` specs are excluded
|
|
138
166
|
by default: run them with `bundle exec rspec --tag slow`
|
|
@@ -179,12 +207,25 @@ the rows your change can't reach tell you nothing about it.
|
|
|
179
207
|
`ruby --yjit bin/lorenz [image] [start_test] [max_cycles]` (resumes the
|
|
180
208
|
chain at a named test, and `--stop-after NAME` ends it once that test is
|
|
181
209
|
done). These take seconds to minutes
|
|
182
|
-
- A pull request's CI is the verdict
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
210
|
+
- A pull request's CI is the verdict, and a pull request merges on it
|
|
211
|
+
alone. It runs the specs, Rubocop, Minitest, the harness builds, the
|
|
212
|
+
Spinel checks, the native round trip, and the suites its changed files
|
|
213
|
+
can reach, on the Spinel build, compared row by row against
|
|
214
|
+
`test/baselines/`. `test/support/ci_reach.rb` maps paths to suites, and
|
|
215
|
+
a path it doesn't name runs every suite. A row that moved fails it. A
|
|
216
|
+
pull request that changes only docs, or only a release's version bump,
|
|
217
|
+
skips the specs and suites. A row that moves in a pull request's CI is
|
|
218
|
+
re-recorded in that pull request with its reason; nobody waits for
|
|
219
|
+
`suites.yml` to confirm it. A change that reaches a suite the map
|
|
220
|
+
doesn't name adds the path to `test/support/ci_reach.rb` in the same
|
|
221
|
+
pull request, and a change that adds a directory under `lib/badline/`
|
|
222
|
+
gives it a rule
|
|
223
|
+
- The full suites run on main every two hours (`.github/workflows/suites.yml`).
|
|
224
|
+
Nobody waits for it, polls it or dispatches it to check a pull request.
|
|
225
|
+
Its result is a `suites` commit status and, when red, one `suites-red`
|
|
226
|
+
issue the planner owns. A red main never blocks a merge. A release
|
|
227
|
+
publishes only once its tagged commit is green
|
|
228
|
+
- Re-record only the rows that moved, in the same change:
|
|
188
229
|
`rake "regression:record:<suite>[filter,...]"` (quote it, because zsh
|
|
189
230
|
globs the brackets). It runs only the matching tests on CRuby and
|
|
190
231
|
splices their rows into the baseline, and every other row keeps its
|
|
@@ -196,7 +237,7 @@ the rows your change can't reach tell you nothing about it.
|
|
|
196
237
|
`(suite)` row too. Explain every moved row in the pull request. Never
|
|
197
238
|
re-record just to make a diff go away
|
|
198
239
|
- For a change whose reach you can't bound to a set of filters, such as
|
|
199
|
-
reordering `
|
|
240
|
+
reordering `C64#cycle!` or changing the LOAD trap every suite loads
|
|
200
241
|
through, push and let CI run the suites
|
|
201
242
|
- The Regression workflow runs the suites on CRuby, started by hand from
|
|
202
243
|
the Actions tab, for a person checking that CRuby and Spinel agree.
|
|
@@ -248,6 +289,13 @@ you change code a pinned rule governs, re-derive the rule against its test
|
|
|
248
289
|
and update the doc if the rule moves. A green suite alone isn't enough,
|
|
249
290
|
because the suite can stay green while the rule breaks.
|
|
250
291
|
|
|
292
|
+
## Rubocop
|
|
293
|
+
|
|
294
|
+
The Metrics limits in `.rubocop.yml` are house limits, set with headroom
|
|
295
|
+
above the largest class, module and method in the tree. A change that needs
|
|
296
|
+
more should raise the limit in the same pull request and say why, rather
|
|
297
|
+
than split a class or shorten an unrelated method to fit.
|
|
298
|
+
|
|
251
299
|
## Issues and pull requests
|
|
252
300
|
|
|
253
301
|
Before filing an issue or opening a pull request, read CONTRIBUTING.md and follow it. Use the exact headings from its skeletons. Report only what you observed or verified, and don't include hypotheses about causes. Open an issue before writing non-trivial code; only changes with one obvious fix (typos, broken links, clear-cut fixes) go straight to a pull request.
|
data/CONTRIBUTING.md
CHANGED
|
@@ -91,9 +91,10 @@ bundle exec rubocop
|
|
|
91
91
|
## Tests and commits
|
|
92
92
|
|
|
93
93
|
- Add tests for any behavior you change.
|
|
94
|
-
- CI runs rubocop, the specs and
|
|
95
|
-
request, and fails on any suite row that
|
|
96
|
-
`test/baselines/`.
|
|
94
|
+
- CI runs rubocop, the specs and the regression suites a pull request's
|
|
95
|
+
changes can reach on each pull request, and fails on any suite row that
|
|
96
|
+
differs from its baseline in `test/baselines/`. Every suite runs on
|
|
97
|
+
`main` every two hours. When a change moves rows on purpose, re-record just
|
|
97
98
|
those rows as [test/baselines/README.md](test/baselines/README.md)
|
|
98
99
|
describes, and say why in the pull request.
|
|
99
100
|
- Write commit messages using
|
data/README.md
CHANGED
|
@@ -22,7 +22,7 @@ It comes in two builds of the same emulator:
|
|
|
22
22
|
sound, so it's the one to play games with.
|
|
23
23
|
- **`badline-ruby`**, which comes with the Ruby gem and runs on CRuby. It
|
|
24
24
|
runs slower than a real C64, so its sound is off by default. The gem is
|
|
25
|
-
also a library, which runs a `Badline::
|
|
25
|
+
also a library, which runs a `Badline::C64` from Ruby without a
|
|
26
26
|
window.
|
|
27
27
|
|
|
28
28
|
## Installation
|
|
@@ -107,6 +107,7 @@ differences noted in the table. `--help` lists the options for either.
|
|
|
107
107
|
| `--script FILE` | Run the events in `FILE`, one `FRAME:EVENT` a line |
|
|
108
108
|
| `--screenshot FILE` | Save the last frame as a `.bmp` |
|
|
109
109
|
| `--save-snapshot FILE` | Save the machine as a `.vsf` snapshot after the last frame |
|
|
110
|
+
| `--vice` | Add VICE's modules to `--save-snapshot`'s C64 snapshot, so x64sc opens it too |
|
|
110
111
|
|
|
111
112
|
```sh
|
|
112
113
|
badline --unpaced --frames 12000 --true-drive disk1.d64 \
|
|
@@ -139,7 +140,8 @@ Without `--true-drive`, device 8 is no drive at all but traps on the
|
|
|
139
140
|
KERNAL's disk routines. Loading is instant, but fast loaders and copy
|
|
140
141
|
protection that run code on the drive need `--true-drive`, which puts
|
|
141
142
|
an emulated 1541 there, running its own DOS at a real 1541's speed. Its
|
|
142
|
-
red LED
|
|
143
|
+
red activity LED and green power LED light in the bottom right corner
|
|
144
|
+
of the border. With
|
|
143
145
|
`--true-drive`, a `.d81` goes in an emulated 1581 in place of the 1541.
|
|
144
146
|
[doc/media.md](doc/media.md) has the details, and how to attach media
|
|
145
147
|
from Ruby.
|
|
@@ -225,10 +227,11 @@ snapshots, and x128's `.vsf` files don't load.
|
|
|
225
227
|
badline's data folder, replacing the oldest, and `F12` restores the
|
|
226
228
|
newest, even after badline has quit and started again. badline also
|
|
227
229
|
autosaves every two minutes of play, and the pause menu's Snapshots page
|
|
228
|
-
saves under a name and loads any of them. Snapshots
|
|
229
|
-
VICE's `.vsf` format: badline
|
|
230
|
-
badline's
|
|
231
|
-
|
|
230
|
+
saves under a name and loads any of them. Snapshots from badline 0.14.0
|
|
231
|
+
on load in every later version. They use VICE's `.vsf` format: badline
|
|
232
|
+
opens those x64sc saves, and x64sc opens badline's saved with `--vice`.
|
|
233
|
+
See [doc/snapshots.md](doc/snapshots.md) for where they're kept, what
|
|
234
|
+
they hold and how far the two agree.
|
|
232
235
|
|
|
233
236
|
## Playing and rendering SID tunes
|
|
234
237
|
|
data/doc/library.md
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
# Using badline from Ruby
|
|
2
2
|
|
|
3
|
-
The gem is also a library, which runs a `Badline::
|
|
3
|
+
The gem is also a library, which runs a `Badline::C64` from Ruby
|
|
4
4
|
without a window.
|
|
5
5
|
|
|
6
6
|
```ruby
|
|
7
7
|
require "badline"
|
|
8
8
|
|
|
9
|
-
computer = Badline::
|
|
9
|
+
computer = Badline::C64.new
|
|
10
10
|
Badline::Media.attach(computer, "game.d64") # attaches and autostarts
|
|
11
11
|
computer.on_init { computer.type_text("print 6*7\r") } # once the machine has booted
|
|
12
12
|
3_500_000.times { computer.cycle! }
|
|
13
|
-
computer.
|
|
13
|
+
computer.peek(0x0400) # screen RAM starts at $0400
|
|
14
14
|
```
|
|
15
15
|
|
|
16
16
|
[media.md](media.md) covers attaching and swapping media, and
|
|
@@ -18,7 +18,7 @@ computer.address_bus.peek(0x0400) # screen RAM starts at $0400
|
|
|
18
18
|
|
|
19
19
|
## Building a machine
|
|
20
20
|
|
|
21
|
-
`Badline::
|
|
21
|
+
`Badline::C64.new` builds the default machine: a PAL C64 with the
|
|
22
22
|
6569 VIC-II, 6526 CIAs and a 6581 SID. Its keywords build others, and
|
|
23
23
|
`Badline::Model.named("c64c")` gives the ones `--model` names for each
|
|
24
24
|
model (`Badline::Model::ALL`):
|
|
@@ -41,11 +41,11 @@ model (`Badline::Model::ALL`):
|
|
|
41
41
|
- `reu: 512` plugs in a RAM Expansion Unit of that many K.
|
|
42
42
|
- `kernal: :sx64` fits the SX-64's KERNAL, and `datasette: false`
|
|
43
43
|
leaves the cassette port empty, so inserting a tape raises
|
|
44
|
-
`Badline::Datasette::Missing`. The SX-64 has both.
|
|
44
|
+
`Badline::Drives::Datasette::Missing`. The SX-64 has both.
|
|
45
45
|
- `kernal: :pet64` fits the PET 64's KERNAL, and `board: :pet64` its
|
|
46
46
|
green monochrome monitor: the VIC's `palette` is
|
|
47
|
-
`Badline::VIC::GREEN_PALETTE`, each colour's luminance in
|
|
48
|
-
PET 64 has both.
|
|
47
|
+
`Badline::Chips::VIC::GREEN_PALETTE`, each colour's luminance in
|
|
48
|
+
green. The PET 64 has both.
|
|
49
49
|
- `kernal: :gs` fits the C64GS's BASIC and KERNAL, and `board: :gs` its
|
|
50
50
|
case, which has no keyboard: `computer.keyboard` takes no keys. The
|
|
51
51
|
C64GS has both, and no datasette.
|
|
@@ -68,7 +68,7 @@ Am29F040 EAPI on attach, as VICE does. Flash writes stay in memory and
|
|
|
68
68
|
are lost when the emulator quits: the `.crt` file is never overwritten.
|
|
69
69
|
|
|
70
70
|
A GEO-RAM takes the expansion port, so it can't sit alongside a
|
|
71
|
-
cartridge: `computer.attach_cartridge(Badline::Cartridge::GeoRAM.new(size: 512))`.
|
|
71
|
+
cartridge: `computer.attach_cartridge(Badline::C64::Cartridge::GeoRAM.new(size: 512))`.
|
|
72
72
|
Its contents are lost when the emulator quits.
|
|
73
73
|
|
|
74
74
|
## ROMs
|
|
@@ -79,5 +79,5 @@ directory that holds `kernal.rom`, `basic.rom` and `character.rom`, plus
|
|
|
79
79
|
`kernal-sx64.rom` for the SX-64, `kernal-pet64.rom` for the PET 64,
|
|
80
80
|
`c64gs.rom` for the C64GS and `eapi/eapi-am29f040-14` if you
|
|
81
81
|
attach EasyFlash cartridges.
|
|
82
|
-
`Badline.rom_path = dir` does the same before a `Badline::
|
|
82
|
+
`Badline.rom_path = dir` does the same before a `Badline::C64` is
|
|
83
83
|
built, and `nil` restores the bundled set.
|
data/doc/media.md
CHANGED
|
@@ -31,7 +31,8 @@ own DOS ROM on its own 6502 and talking to the machine over the serial
|
|
|
31
31
|
bus. It reads `.d64` and `.g64` images, which it autostarts with the
|
|
32
32
|
same `LOAD"*",8,1` and `RUN`, but not `.d71`, `.d81` or `.t64` images
|
|
33
33
|
or directories. Loading runs at the speed of a real 1541, and the
|
|
34
|
-
drive's red LED
|
|
34
|
+
drive's red activity LED and green power LED light in the bottom right
|
|
35
|
+
corner of the border. A 1581 flashes its power LED after an error.
|
|
35
36
|
|
|
36
37
|
A `.g64` holds the disk's raw GCR, half tracks and all, so copy
|
|
37
38
|
protection and fast loaders that read it work.
|