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
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Badline
|
|
4
|
-
class VIC
|
|
5
|
-
# The graphics shift register, pixel by pixel, for the groups where a
|
|
6
|
-
# mode or XSCROLL change lands (VICE x64sc `draw_graphics`). The
|
|
7
|
-
# sequencer paints whole bytes everywhere else, which comes to the same
|
|
8
|
-
# thing while nothing changes.
|
|
9
|
-
#
|
|
10
|
-
# The byte a group draws loads at pixel XSCROLL. ECM and BMM take hold at
|
|
11
|
-
# pixel 4 as they rise and at pixel 6 as they fall (the 6569's colour
|
|
12
|
-
# latency), except that BMM falls at pixel 5 out of any mode but hi-res
|
|
13
|
-
# bitmap. MCM takes hold at pixel 4 for the colour lookup but only at
|
|
14
|
-
# pixel 7 for how the register is read, where a rising MCM also resets
|
|
15
|
-
# the multicolour flip-flop. An MCM that falls out of the invalid
|
|
16
|
-
# ECM+MCM mode is a pixel later on both counts: the lookup changes at
|
|
17
|
-
# pixel 5 and the read at the next group's pixel 0. The mode bits are
|
|
18
|
-
# the sequencer's: ECM 4, BMM 2, MCM 1.
|
|
19
|
-
#
|
|
20
|
-
# The 8565 has no colour latency: ECM and BMM take hold, rising or
|
|
21
|
-
# falling, at the next group's pixel 0, and an MCM that falls out of
|
|
22
|
-
# ECM+MCM does so on time. Where that pixel 0 takes the group out of an
|
|
23
|
-
# invalid mode, it is still black into hi-res text, and so is a
|
|
24
|
-
# background pixel into multicolour bitmap.
|
|
25
|
-
class GraphicsShifter
|
|
26
|
-
ECM = 0b100
|
|
27
|
-
ECM_BMM = 0b110
|
|
28
|
-
MULTICOLOR_BITMAP = 0b011
|
|
29
|
-
ECM_MCM = 0b101
|
|
30
|
-
BMM = 0b010
|
|
31
|
-
|
|
32
|
-
# The group #draw painted, and which of its pixels are foreground.
|
|
33
|
-
attr_reader :colors, :fg
|
|
34
|
-
|
|
35
|
-
def initialize(registers, model: :mos6569)
|
|
36
|
-
@registers = registers
|
|
37
|
-
@latency = model != :mos8565
|
|
38
|
-
@next_ecm_bmm = 0
|
|
39
|
-
@black_below = 0
|
|
40
|
-
@colors = Array.new(8, 0)
|
|
41
|
-
@fg = Array.new(8, false)
|
|
42
|
-
@gbuf = 0
|
|
43
|
-
@vbuf = 0
|
|
44
|
-
@cbuf = 0
|
|
45
|
-
@flop = 0
|
|
46
|
-
@pixel = 0
|
|
47
|
-
@mode_lookup = 0
|
|
48
|
-
@mode_read = 0
|
|
49
|
-
@late_mcm = false
|
|
50
|
-
@late_read = false
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def save_state(out)
|
|
54
|
-
out.int(@next_ecm_bmm).int(@black_below).ints(@colors).booleans(@fg)
|
|
55
|
-
out.int(@gbuf).int(@vbuf).int(@cbuf).int(@flop).int(@pixel)
|
|
56
|
-
out.int(@mode_lookup).int(@mode_read).boolean(@late_mcm).boolean(@late_read)
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def load_state(input)
|
|
60
|
-
@next_ecm_bmm = input.int
|
|
61
|
-
@black_below = input.int
|
|
62
|
-
input.ints_into(@colors)
|
|
63
|
-
input.booleans_into(@fg)
|
|
64
|
-
load_buffers(input)
|
|
65
|
-
@mode_lookup = input.int
|
|
66
|
-
@mode_read = input.int
|
|
67
|
-
@late_mcm = input.boolean?
|
|
68
|
-
@late_read = input.boolean?
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
# Rebuilds the state at the end of a group that painted whole bytes:
|
|
72
|
-
# the byte loaded at pixel shift under an unchanging mode.
|
|
73
|
-
def prime(data, screencode, color, shift, mode)
|
|
74
|
-
@mode_lookup = mode
|
|
75
|
-
@next_ecm_bmm = mode & ECM_BMM
|
|
76
|
-
@mode_read = mode & 1
|
|
77
|
-
@late_read = false
|
|
78
|
-
load(data, screencode, color)
|
|
79
|
-
(8 - shift).times { read_pixel }
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
# Draws one group, loading the byte at pixel shift.
|
|
83
|
-
def draw(data, screencode, color, shift, mode)
|
|
84
|
-
i = 0
|
|
85
|
-
while i < 8
|
|
86
|
-
step_mode(i, mode)
|
|
87
|
-
load(data, screencode, color) if i == shift
|
|
88
|
-
pixel = read_pixel
|
|
89
|
-
@colors[i] = pixel < @black_below ? 0 : lookup(pixel)
|
|
90
|
-
@black_below = 0
|
|
91
|
-
@fg[i] = pixel >= 2
|
|
92
|
-
i += 1
|
|
93
|
-
end
|
|
94
|
-
@next_ecm_bmm = mode & ECM_BMM
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
private
|
|
98
|
-
|
|
99
|
-
def load_buffers(input)
|
|
100
|
-
@gbuf = input.int
|
|
101
|
-
@vbuf = input.int
|
|
102
|
-
@cbuf = input.int
|
|
103
|
-
@flop = input.int
|
|
104
|
-
@pixel = input.int
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
def step_mode(pixel, mode)
|
|
108
|
-
case pixel
|
|
109
|
-
when 0 then start_group
|
|
110
|
-
when 4 then step_lookup(mode)
|
|
111
|
-
when 5 then step_early_fall(mode)
|
|
112
|
-
when 6 then @mode_lookup &= mode | 1 if @latency
|
|
113
|
-
when 7 then step_read
|
|
114
|
-
end
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
def start_group
|
|
118
|
-
end_late_read
|
|
119
|
-
return if @latency
|
|
120
|
-
|
|
121
|
-
invalid = @mode_lookup > ECM
|
|
122
|
-
@mode_lookup = (@mode_lookup & ~ECM_BMM) | @next_ecm_bmm
|
|
123
|
-
@black_below = black_pixels_out_of_invalid if invalid
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
# The pixel values below which pixel 0 stays black as the group leaves
|
|
127
|
-
# an invalid mode: all four into hi-res text, the background ones into
|
|
128
|
-
# multicolour bitmap.
|
|
129
|
-
def black_pixels_out_of_invalid
|
|
130
|
-
case @mode_lookup
|
|
131
|
-
when 0 then 4
|
|
132
|
-
when MULTICOLOR_BITMAP then 2
|
|
133
|
-
else 0
|
|
134
|
-
end
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
def step_lookup(mode)
|
|
138
|
-
@late_mcm = @latency && @mode_lookup.allbits?(ECM_MCM) && mode.nobits?(1)
|
|
139
|
-
rising = @latency ? mode & ECM_BMM : 0
|
|
140
|
-
@mode_lookup = (@mode_lookup & ~1) | (mode & 1) | (@late_mcm ? 1 : 0) | rising
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
def step_early_fall(mode)
|
|
144
|
-
@mode_lookup &= ~1 if @late_mcm
|
|
145
|
-
@mode_lookup &= mode | ~BMM if @latency && @mode_lookup != BMM
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
def step_read
|
|
149
|
-
return @late_read = true if @late_mcm
|
|
150
|
-
|
|
151
|
-
mcm = @mode_lookup & 1
|
|
152
|
-
@flop = 0 if mcm == 1 && @mode_read.zero?
|
|
153
|
-
@mode_read = mcm
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
def end_late_read
|
|
157
|
-
return unless @late_read
|
|
158
|
-
|
|
159
|
-
@mode_read = 0
|
|
160
|
-
@late_read = false
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
def load(data, screencode, color)
|
|
164
|
-
@gbuf = data
|
|
165
|
-
@vbuf = screencode
|
|
166
|
-
@cbuf = color & 0x0f
|
|
167
|
-
@flop = 1
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
def read_pixel
|
|
171
|
-
multicolor = multicolor?
|
|
172
|
-
if @mode_read == 1 && multicolor
|
|
173
|
-
@pixel = @gbuf >> 6 if @flop == 1
|
|
174
|
-
elsif @gbuf.anybits?(0x80)
|
|
175
|
-
@pixel = multicolor && @mode_read.zero? ? 2 : 3
|
|
176
|
-
else
|
|
177
|
-
@pixel = 0
|
|
178
|
-
end
|
|
179
|
-
@gbuf = (@gbuf << 1) & 0xff
|
|
180
|
-
@flop ^= 1
|
|
181
|
-
@pixel
|
|
182
|
-
end
|
|
183
|
-
|
|
184
|
-
def multicolor? = @mode_lookup.anybits?(BMM) || @cbuf.anybits?(0x08)
|
|
185
|
-
|
|
186
|
-
def lookup(pixel)
|
|
187
|
-
case @mode_lookup
|
|
188
|
-
when 0 then pixel < 2 ? @registers.background : @cbuf
|
|
189
|
-
when 1 then pixel == 3 ? @cbuf & 0x07 : @registers.background(pixel)
|
|
190
|
-
when 2 then pixel < 2 ? @vbuf & 0x0f : @vbuf >> 4
|
|
191
|
-
when 3 then multicolor_bitmap(pixel)
|
|
192
|
-
when 4 then pixel < 2 ? @registers.background(@vbuf >> 6) : @cbuf
|
|
193
|
-
else 0
|
|
194
|
-
end
|
|
195
|
-
end
|
|
196
|
-
|
|
197
|
-
def multicolor_bitmap(pixel)
|
|
198
|
-
case pixel
|
|
199
|
-
when 0 then @registers.background
|
|
200
|
-
when 1 then @vbuf >> 4
|
|
201
|
-
when 2 then @vbuf & 0x0f
|
|
202
|
-
else @cbuf
|
|
203
|
-
end
|
|
204
|
-
end
|
|
205
|
-
end
|
|
206
|
-
end
|
|
207
|
-
end
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Badline
|
|
4
|
-
class VIC
|
|
5
|
-
# Mid-line writes to the sprite registers, keyed by the pixel at which
|
|
6
|
-
# they become visible. Compositing replays the line through the log, so
|
|
7
|
-
# each pixel is drawn with the register values that were in effect when
|
|
8
|
-
# the VIC reached it.
|
|
9
|
-
class RegisterLog
|
|
10
|
-
def initialize(registers)
|
|
11
|
-
@registers = registers
|
|
12
|
-
@entries = []
|
|
13
|
-
@seed = []
|
|
14
|
-
@values = Array.new(2**6, 0)
|
|
15
|
-
@cursor = 0
|
|
16
|
-
@next_x = 0
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
# The pixel at which the next logged write takes effect.
|
|
20
|
-
attr_reader :next_x
|
|
21
|
-
|
|
22
|
-
# The entries as pixel, register and value in turn, the seed with -1
|
|
23
|
-
# for a register the line hasn't logged, and a next pixel past the
|
|
24
|
-
# last entry as -1.
|
|
25
|
-
def save_state(out)
|
|
26
|
-
out.ints(@entries.flatten)
|
|
27
|
-
out.ints(@seed.map { |value| value.nil? ? -1 : value })
|
|
28
|
-
out.ints(@values).int(@cursor).int(@next_x.infinite? ? -1 : @next_x)
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def load_state(input)
|
|
32
|
-
@entries.replace(input.ints.each_slice(3).to_a)
|
|
33
|
-
@seed.replace(input.ints.map { |value| value.negative? ? nil : value })
|
|
34
|
-
input.ints_into(@values)
|
|
35
|
-
@cursor = input.int
|
|
36
|
-
next_x = input.int
|
|
37
|
-
@next_x = next_x.negative? ? Float::INFINITY : next_x
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def empty? = @entries.empty?
|
|
41
|
-
def length = @entries.length
|
|
42
|
-
|
|
43
|
-
def clear
|
|
44
|
-
return if @entries.empty?
|
|
45
|
-
|
|
46
|
-
@entries.clear
|
|
47
|
-
@seed.clear
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
def log(pixel_x, reg, old, value)
|
|
51
|
-
@seed[reg] = old if @seed[reg].nil?
|
|
52
|
-
@entries << [pixel_x, reg, value]
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def prepare
|
|
56
|
-
@entries.sort_by! { |entry| entry[0] }
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
# Restart the cursor before the line's first pixel, with every logged
|
|
60
|
-
# register back at the value it held when the line started.
|
|
61
|
-
def rewind
|
|
62
|
-
@values.length.times { |reg| @values[reg] = @registers[reg] }
|
|
63
|
-
@seed.each_with_index { |value, reg| @values[reg] = value unless value.nil? }
|
|
64
|
-
@cursor = 0
|
|
65
|
-
@next_x = @entries.empty? ? Float::INFINITY : @entries[0][0]
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def [](reg) = @values[reg]
|
|
69
|
-
|
|
70
|
-
# Apply every write visible at or before pixel_x.
|
|
71
|
-
def advance(pixel_x)
|
|
72
|
-
while @cursor < @entries.length && @entries[@cursor][0] <= pixel_x
|
|
73
|
-
entry = @entries[@cursor]
|
|
74
|
-
@values[entry[1]] = entry[2]
|
|
75
|
-
@cursor += 1
|
|
76
|
-
end
|
|
77
|
-
@next_x = @cursor < @entries.length ? @entries[@cursor][0] : Float::INFINITY
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
end
|
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Badline
|
|
4
|
-
class VIC
|
|
5
|
-
# = VIC-II Registers
|
|
6
|
-
#
|
|
7
|
-
# == Sprite positions
|
|
8
|
-
#
|
|
9
|
-
# $D000: Sprite 0 X
|
|
10
|
-
# $D001: Sprite 0 Y
|
|
11
|
-
# $D002: Sprite 1 X
|
|
12
|
-
# $D003: Sprite 1 Y
|
|
13
|
-
# $D004: Sprite 2 X
|
|
14
|
-
# $D005: Sprite 2 Y
|
|
15
|
-
# $D006: Sprite 3 X
|
|
16
|
-
# $D007: Sprite 3 Y
|
|
17
|
-
# $D008: Sprite 4 X
|
|
18
|
-
# $D009: Sprite 4 Y
|
|
19
|
-
# $D00A: Sprite 5 X
|
|
20
|
-
# $D00B: Sprite 5 Y
|
|
21
|
-
# $D00C: Sprite 6 X
|
|
22
|
-
# $D00D: Sprite 6 Y
|
|
23
|
-
# $D00E: Sprite 7 X
|
|
24
|
-
# $D00F: Sprite 7 Y
|
|
25
|
-
#
|
|
26
|
-
# $D010: Most Significant Bits of Sprites 0-7 Horizontal Position
|
|
27
|
-
# $D011: Vertical Fine Scrolling and Control Register
|
|
28
|
-
# $D012: Rasterline
|
|
29
|
-
# - Read: Current rasterline
|
|
30
|
-
# - Write: Set rasterline interrupt
|
|
31
|
-
#
|
|
32
|
-
# == Light pen
|
|
33
|
-
#
|
|
34
|
-
# $D013: Light Pen Horizontal Position
|
|
35
|
-
# $D014: Light Pen Vertical Position
|
|
36
|
-
#
|
|
37
|
-
# $D015: Sprite Enable Register
|
|
38
|
-
# $D016: Horizontal Fine Scrolling and Control Register
|
|
39
|
-
# $D017: Sprite Vertical Expansion Register
|
|
40
|
-
# $D018: VIC-II Chip Memory Control Register
|
|
41
|
-
# $D019: VIC Interrupt Flag Register
|
|
42
|
-
# $D01A: IRQ Mask Register
|
|
43
|
-
# $D01B: Sprite to Foreground Display Priority Register
|
|
44
|
-
# $D01C: Sprite Multicolor Registers
|
|
45
|
-
# $D01D: Sprite Horizontal Expansion Register
|
|
46
|
-
#
|
|
47
|
-
# == Sprite collision detection
|
|
48
|
-
#
|
|
49
|
-
# $D01E: Sprite to Sprite Collision Register
|
|
50
|
-
# $D01F: Sprite to Foreground Collision Register
|
|
51
|
-
#
|
|
52
|
-
# == Color registers
|
|
53
|
-
#
|
|
54
|
-
# All color registers are 4bit, bits 4-7 always read 1.
|
|
55
|
-
#
|
|
56
|
-
# $D020: Border color
|
|
57
|
-
# $D021: Background color 0
|
|
58
|
-
# $D022: Background color 1
|
|
59
|
-
# $D023: Background color 2
|
|
60
|
-
# $D024: Background color 3
|
|
61
|
-
# $D025: Sprite multicolor 0
|
|
62
|
-
# $D026: Sprite multicolor 1
|
|
63
|
-
# $D027: Sprite 0 color
|
|
64
|
-
# $D028: Sprite 1 color
|
|
65
|
-
# $D029: Sprite 2 color
|
|
66
|
-
# $D02A: Sprite 3 color
|
|
67
|
-
# $D02B: Sprite 4 color
|
|
68
|
-
# $D02C: Sprite 5 color
|
|
69
|
-
# $D02D: Sprite 6 color
|
|
70
|
-
# $D02E: Sprite 7 color
|
|
71
|
-
#
|
|
72
|
-
# == VIC-IIe (8566 and 8564)
|
|
73
|
-
#
|
|
74
|
-
# $D02F: Extra keyboard lines K0-K2 in bits 0-2, bits 3-7 read 1
|
|
75
|
-
# $D030: FAST (2 MHz) in bit 0 and TEST in bit 1, bits 2-7 read 1
|
|
76
|
-
#
|
|
77
|
-
# $D02F-$D03F: Not in use on the 6569 and 8565, always reads 0xff,
|
|
78
|
-
# and $D031-$D03F on the VIC-IIe
|
|
79
|
-
# $D040-$D3FF: Repeat $D0000 to $D03F every 64 bytes
|
|
80
|
-
class Registers
|
|
81
|
-
include IntegerHelper
|
|
82
|
-
|
|
83
|
-
# The raw register bytes, for the per-column reads on the hot path.
|
|
84
|
-
attr_reader :bytes
|
|
85
|
-
|
|
86
|
-
# Every register powers on as zero, as in VICE. A VIC-IIe reads
|
|
87
|
-
# $D02F and $D030 back as registers.
|
|
88
|
-
def initialize(iie: false)
|
|
89
|
-
@bytes = Array.new(2**6, 0)
|
|
90
|
-
@irq_line = false
|
|
91
|
-
@iie = iie
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
# True while any enabled latch bit is set in $D019/$D01A. Cached and
|
|
95
|
-
# re-evaluated on writes, since it's checked every cycle.
|
|
96
|
-
def irq_line? = @irq_line
|
|
97
|
-
|
|
98
|
-
def [](reg) = @bytes[reg]
|
|
99
|
-
|
|
100
|
-
def read(reg)
|
|
101
|
-
case reg
|
|
102
|
-
when 0x16 then @bytes[reg] | 0xc0 # bits 7-6 unused, read 1
|
|
103
|
-
when 0x18 then @bytes[reg] | 0x01 # bit 0 unused, reads 1
|
|
104
|
-
when 0x1a, 0x20..0x2e then @bytes[reg] | 0xf0
|
|
105
|
-
when 0x1e, 0x1f then read_clear(reg) # collision registers clear on read
|
|
106
|
-
when 0x2f then @iie ? @bytes[reg] | 0xf8 : 0xff
|
|
107
|
-
when 0x30 then @iie ? @bytes[reg] | 0xfc : 0xff
|
|
108
|
-
when 0x31..0x3f then 0xff
|
|
109
|
-
else @bytes[reg]
|
|
110
|
-
end
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
def write(reg, value)
|
|
114
|
-
case reg
|
|
115
|
-
when 0x19 # write 1 to clear
|
|
116
|
-
@bytes[reg] &= ~value
|
|
117
|
-
update_irq_line
|
|
118
|
-
when 0x1a # only the four latch bits
|
|
119
|
-
@bytes[reg] = value & 0x0f
|
|
120
|
-
update_irq_line
|
|
121
|
-
when 0x1e, 0x1f then nil # the collision registers are read-only
|
|
122
|
-
else @bytes[reg] = value
|
|
123
|
-
end
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
# Graphics modes
|
|
127
|
-
def ecm = @bytes[0x11][6]
|
|
128
|
-
def bmm = @bytes[0x11][5]
|
|
129
|
-
def mcm = @bytes[0x16][4]
|
|
130
|
-
# ECM/BMM from $D011 bits 6-5, MCM from $D016 bit 4.
|
|
131
|
-
def mode = ((@bytes[0x11] >> 4) & 0b110) | ((@bytes[0x16] >> 4) & 0b001)
|
|
132
|
-
|
|
133
|
-
def xscroll = @bytes[0x16] & 0b0111
|
|
134
|
-
def yscroll = @bytes[0x11] & 0b0111
|
|
135
|
-
|
|
136
|
-
def rsel? = @bytes[0x11].anybits?(0x08)
|
|
137
|
-
def csel? = @bytes[0x16].anybits?(0x08)
|
|
138
|
-
def display_enabled? = @bytes[0x11].anybits?(0x10)
|
|
139
|
-
|
|
140
|
-
def char_base = (@bytes[0x18] & 0b1110) * 0x400
|
|
141
|
-
def bitmap_base = (@bytes[0x18] & 0b1000) * 0x400
|
|
142
|
-
def screen_base = (@bytes[0x18] >> 4) * 0x400
|
|
143
|
-
|
|
144
|
-
def border = @bytes[0x20] & 0x0f
|
|
145
|
-
def background(index = 0) = @bytes[0x21 + index] & 0x0f
|
|
146
|
-
|
|
147
|
-
# The VIC-IIe's $D02F and $D030 bits. The 6569 and 8565 drive no
|
|
148
|
-
# extra keyboard lines and run at 1 MHz.
|
|
149
|
-
def extra_keyboard_lines = @iie ? @bytes[0x2f] & 0x07 : 0x07
|
|
150
|
-
def fast? = @iie && @bytes[0x30].anybits?(0x01)
|
|
151
|
-
def test? = @iie && @bytes[0x30].anybits?(0x02)
|
|
152
|
-
|
|
153
|
-
# FAST and TEST as bits 0 and 1.
|
|
154
|
-
def clock_bits = @iie ? @bytes[0x30] & 0x03 : 0
|
|
155
|
-
|
|
156
|
-
def raster_target = uint16(@bytes[0x12], (@bytes[0x11] & 0x80) >> 7)
|
|
157
|
-
|
|
158
|
-
def latch_irq!(bit)
|
|
159
|
-
@bytes[0x19] |= bit
|
|
160
|
-
update_irq_line
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
def latch_raster_irq! = latch_irq!(0x01)
|
|
164
|
-
|
|
165
|
-
def save_state(out)
|
|
166
|
-
out.blob(@bytes).boolean(@irq_line)
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
def load_state(input)
|
|
170
|
-
input.blob_into(@bytes)
|
|
171
|
-
@irq_line = input.boolean?
|
|
172
|
-
end
|
|
173
|
-
|
|
174
|
-
def collide!(reg, bits)
|
|
175
|
-
return false if bits.zero?
|
|
176
|
-
|
|
177
|
-
was_zero = @bytes[reg].zero?
|
|
178
|
-
@bytes[reg] |= bits
|
|
179
|
-
was_zero
|
|
180
|
-
end
|
|
181
|
-
|
|
182
|
-
# Works the IRQ line out from $D019 and $D01A again, after the bytes
|
|
183
|
-
# were set directly.
|
|
184
|
-
def update_irq_line
|
|
185
|
-
@irq_line = (@bytes[0x19] & @bytes[0x1a]).anybits?(0x0f)
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
private
|
|
189
|
-
|
|
190
|
-
def read_clear(reg)
|
|
191
|
-
@bytes[reg].tap { @bytes[reg] = 0 }
|
|
192
|
-
end
|
|
193
|
-
end
|
|
194
|
-
end
|
|
195
|
-
end
|