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
data/lib/badline/drive1581.rb
DELETED
|
@@ -1,233 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "badline/drive"
|
|
4
|
-
require "badline/drive1581/track"
|
|
5
|
-
require "badline/drive1581/track_bytes"
|
|
6
|
-
require "badline/drive1581/disk"
|
|
7
|
-
require "badline/drive1581/mechanism"
|
|
8
|
-
require "badline/drive1581/wd1772"
|
|
9
|
-
require "badline/drive1581/cpu"
|
|
10
|
-
require "badline/drive1581/serial_port"
|
|
11
|
-
require "badline/drive1581/bus"
|
|
12
|
-
|
|
13
|
-
module Badline
|
|
14
|
-
# The 1581 3.5" disk drive: a 6502 at 2 MHz with 8 KB of RAM, an 8520
|
|
15
|
-
# for the serial bus and the mechanism's lines, a WD1772 for the MFM
|
|
16
|
-
# disk, and the DOS in 32 KB of ROM (1581 Service Manual). Drive::Core
|
|
17
|
-
# clocks it against the host.
|
|
18
|
-
#
|
|
19
|
-
# The 8520's port B faces the serial bus as VIA 1's does on the 1541,
|
|
20
|
-
# with the same bits, and ATN reaches its FLAG pin, so ATN going low
|
|
21
|
-
# interrupts the DOS. Its SP and CNT carry fast serial on DATA and SRQ,
|
|
22
|
-
# through buffers PB5 turns round (Drive::FastSerial), as the 1571's
|
|
23
|
-
# 6526 does. The ATN acknowledge differs: a NAND of ATN IN and
|
|
24
|
-
# ATN ACK pulls DATA, so DATA follows ATN only while ATN is asserted
|
|
25
|
-
# and PB4 is high, where the 1541's XOR pulls it whenever the two
|
|
26
|
-
# differ (IECBus::DRIVE_ATN_GATED). Port A drives the motor, the side
|
|
27
|
-
# and the two LEDs, and reads the switches and the mechanism's /RDY and
|
|
28
|
-
# /DISK CHNG (SerialPort). Timer B interrupts every 10 ms for the
|
|
29
|
-
# controller code that runs the WD1772.
|
|
30
|
-
#
|
|
31
|
-
# The 8520 differs from the 6526 in its TOD, a 24-bit binary event
|
|
32
|
-
# counter where the 6526 keeps a BCD clock. The 1581 holds the TOD pin
|
|
33
|
-
# high when it carries a WD1772 (jumper J1 out), so the counter never
|
|
34
|
-
# counts, and the DOS's one use of it, writing $00 to the low byte and
|
|
35
|
-
# reading it back 20 µs later to tell a WD1770 from a WD1772, reads $00
|
|
36
|
-
# on either chip: the drive's CIA gets no TOD pulses (CIA's tod_hz).
|
|
37
|
-
class Drive1581
|
|
38
|
-
include Drive::Core
|
|
39
|
-
include Drive::FastSerial
|
|
40
|
-
|
|
41
|
-
CLOCK_HZ = 2_000_000
|
|
42
|
-
|
|
43
|
-
# Where the DOS's idle loop starts over (see Drive::Idle).
|
|
44
|
-
IDLE_LOOP = 0xb105
|
|
45
|
-
|
|
46
|
-
# The host cycles, at about 1 MHz, by which a 1581 switched on with the
|
|
47
|
-
# machine has run its DOS's reset, the RAM test, the ROM checksum and
|
|
48
|
-
# the controller's half-second wait, and waits on the bus: 2.32 s,
|
|
49
|
-
# with a margin.
|
|
50
|
-
BOOT_CYCLES = 2_700_000
|
|
51
|
-
|
|
52
|
-
# The 8520's port A outputs.
|
|
53
|
-
SIDE = 0x01
|
|
54
|
-
MOTOR = 0x04
|
|
55
|
-
POWER_LED = 0x20
|
|
56
|
-
ACTIVITY_LED = 0x40
|
|
57
|
-
|
|
58
|
-
# Port B's ATN acknowledge, and the fast serial direction.
|
|
59
|
-
ATN_ACK = 0x10
|
|
60
|
-
FAST_SERIAL_OUT = 0x20
|
|
61
|
-
|
|
62
|
-
def cia
|
|
63
|
-
settle!
|
|
64
|
-
@cia
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
def fdc
|
|
68
|
-
settle!
|
|
69
|
-
@fdc
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def model_name = "1581"
|
|
73
|
-
|
|
74
|
-
# +rom+ covers $8000-$FFFF, and defaults to the DOS image in the ROM
|
|
75
|
-
# path. +device+ is the number the switches on port A's PA3 and PA4
|
|
76
|
-
# set, 8 to 11.
|
|
77
|
-
def initialize(rom: nil, host_clock_hz: Drive1541::CLOCK_HZ, device: 8, debug: false)
|
|
78
|
-
@device = device
|
|
79
|
-
@clock_hz = CLOCK_HZ
|
|
80
|
-
@mechanism = Mechanism.new
|
|
81
|
-
@fdc = WD1772.new(@mechanism)
|
|
82
|
-
@serial_port = SerialPort.new(@mechanism, device:)
|
|
83
|
-
@cia = CIA.new(start: 0x4000, peripheral: @serial_port, tod_hz: 0)
|
|
84
|
-
@bus = Bus.new(rom: rom || ROM.load("dos1581.rom", 0x8000), cia: @cia, fdc: @fdc, drive: self)
|
|
85
|
-
@cpu = CPU.new(@bus, debug:)
|
|
86
|
-
@idle_loop = IDLE_LOOP
|
|
87
|
-
@host_clock_hz = host_clock_hz
|
|
88
|
-
@phase = 0
|
|
89
|
-
@cycles = 0
|
|
90
|
-
@serial_bus = nil
|
|
91
|
-
@atn = false
|
|
92
|
-
@activity = false
|
|
93
|
-
@power = false
|
|
94
|
-
init_fast_serial
|
|
95
|
-
init_idle(debug)
|
|
96
|
-
ports_written
|
|
97
|
-
connect(IECBus.new)
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
# The serial bus's RESET line reaches the CPU, the 8520 and the
|
|
101
|
-
# WD1772. RAM keeps its contents.
|
|
102
|
-
def reset!
|
|
103
|
-
settle!
|
|
104
|
-
@cia.reset!
|
|
105
|
-
@fdc.reset!
|
|
106
|
-
ports_written
|
|
107
|
-
@cpu.reset!
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
def insert(disk)
|
|
111
|
-
settle!
|
|
112
|
-
@mechanism.insert(disk, @fdc.now)
|
|
113
|
-
@fdc.spin_changed
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
# Puts in a Disk from the .d81 image at +path+, write-protected with
|
|
117
|
-
# `read_only`.
|
|
118
|
-
def insert_image(path, read_only: false)
|
|
119
|
-
insert(Disk.open(path, read_only:))
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
# Whether the activity LED is lit. The power LED stays lit, and
|
|
123
|
-
# flashes on an error.
|
|
124
|
-
def led_on? = @activity
|
|
125
|
-
|
|
126
|
-
def power_led_on? = @power
|
|
127
|
-
|
|
128
|
-
# The 8520's port B as it drives the serial bus, in VIA 1's bits, the
|
|
129
|
-
# ATN acknowledge turned round for the NAND that gates it, with the
|
|
130
|
-
# fast serial pins above it. It holds still while the drive sleeps, so
|
|
131
|
-
# reading it leaves the drive asleep.
|
|
132
|
-
def serial_output
|
|
133
|
-
lines = @cia.port_b_lines
|
|
134
|
-
output = (lines & (IECBus::DRIVE_DATA_OUT | IECBus::DRIVE_CLK_OUT)) | IECBus::DRIVE_ATN_GATED | @fast_output
|
|
135
|
-
lines.anybits?(ATN_ACK) ? output : output | IECBus::DRIVE_ATNA
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
# The 8520's ports drive the motor, the side, the LEDs and the fast
|
|
139
|
-
# serial buffers: the drive follows them after every write to a port
|
|
140
|
-
# or direction register.
|
|
141
|
-
def ports_written
|
|
142
|
-
fast_serial_out = @cia.port_b_lines.anybits?(FAST_SERIAL_OUT)
|
|
143
|
-
turn_fast_serial(fast_serial_out) if fast_serial_out != @fast_serial_out
|
|
144
|
-
lines = @cia.port_a_lines
|
|
145
|
-
@mechanism.side = lines.anybits?(SIDE) ? 1 : 0
|
|
146
|
-
@activity = lines.anybits?(ACTIVITY_LED)
|
|
147
|
-
@power = lines.anybits?(POWER_LED)
|
|
148
|
-
motor = lines.nobits?(MOTOR)
|
|
149
|
-
return if motor == @mechanism.motor_on?
|
|
150
|
-
|
|
151
|
-
@mechanism.motor(motor, @fdc.now)
|
|
152
|
-
@fdc.spin_changed
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
# The drive's whole state, as the 1541's (Drive1541#save_state), with
|
|
156
|
-
# the 8520 and the WD1772 in place of the VIAs.
|
|
157
|
-
def save_state(out)
|
|
158
|
-
settle!
|
|
159
|
-
out.marker("DRIVE1581")
|
|
160
|
-
out.int(@phase).int(@cycles).boolean(@atn)
|
|
161
|
-
@serial_port.save_state(out)
|
|
162
|
-
@cia.save_state(out)
|
|
163
|
-
@fdc.save_state(out)
|
|
164
|
-
@bus.save_state(out)
|
|
165
|
-
@cpu.save_state(out)
|
|
166
|
-
@mechanism.save_state(out)
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
def load_state(input)
|
|
170
|
-
settle!
|
|
171
|
-
input.marker("DRIVE1581")
|
|
172
|
-
@phase = input.int
|
|
173
|
-
@cycles = input.int
|
|
174
|
-
@atn = input.boolean?
|
|
175
|
-
@serial_port.load_state(input)
|
|
176
|
-
@cia.load_state(input)
|
|
177
|
-
@fdc.load_state(input)
|
|
178
|
-
@bus.load_state(input)
|
|
179
|
-
@cpu.load_state(input)
|
|
180
|
-
@mechanism.load_state(input)
|
|
181
|
-
@fast_serial_out = @cia.port_b_lines.anybits?(FAST_SERIAL_OUT)
|
|
182
|
-
ports_written
|
|
183
|
-
push_fast_output(@fast_serial_out ? fast_pins : 0)
|
|
184
|
-
forget_orbits
|
|
185
|
-
end
|
|
186
|
-
|
|
187
|
-
private
|
|
188
|
-
|
|
189
|
-
# One drive cycle: ATN going low pulls FLAG, the WD1772 and the 8520
|
|
190
|
-
# clock ahead of the CPU, and the 8520 alone pulls IRQ.
|
|
191
|
-
def step
|
|
192
|
-
atn = @serial_port.atn_low?
|
|
193
|
-
if atn != @atn
|
|
194
|
-
@atn = atn
|
|
195
|
-
@cia.flag! if atn
|
|
196
|
-
end
|
|
197
|
-
@fdc.cycle!
|
|
198
|
-
@cia.cycle!
|
|
199
|
-
drive_fast_serial if @fast_serial_out
|
|
200
|
-
@cpu.irq = @cia.interrupted?
|
|
201
|
-
@cpu.cycle!
|
|
202
|
-
@cycles += 1
|
|
203
|
-
end
|
|
204
|
-
|
|
205
|
-
def hear_atn
|
|
206
|
-
@atn = @serial_port.atn_low?
|
|
207
|
-
end
|
|
208
|
-
|
|
209
|
-
# A pass of the idle loop reads and writes RAM alone, so it repeats
|
|
210
|
-
# while the 8520 pulls no IRQ, for as long as the 8520's counters and
|
|
211
|
-
# the WD1772's next phase leave room: until timer B's next interrupt
|
|
212
|
-
# for the controller code. Neither chip changes but by the clock, so
|
|
213
|
-
# only the CPU is compared.
|
|
214
|
-
def busy_for_pass? = @cia.interrupted?
|
|
215
|
-
|
|
216
|
-
def quiet_cycles = [@cia.quiet_cycles, @fdc.quiet_cycles].min
|
|
217
|
-
|
|
218
|
-
def idle_state = [*@cpu.idle_state, @bus.data, @atn]
|
|
219
|
-
|
|
220
|
-
def fast_forward_chips(cycles)
|
|
221
|
-
@cia.fast_forward(cycles)
|
|
222
|
-
@fdc.fast_forward(cycles)
|
|
223
|
-
end
|
|
224
|
-
|
|
225
|
-
# Every timer B interrupt reads the 8520, so no orbit (Drive::Orbit)
|
|
226
|
-
# comes round, and the drive keeps no anchors.
|
|
227
|
-
def anchor = nil
|
|
228
|
-
|
|
229
|
-
def counter_state(_touched) = []
|
|
230
|
-
|
|
231
|
-
def skip_chip_orbits(_cycles, _touched) = nil
|
|
232
|
-
end
|
|
233
|
-
end
|
data/lib/badline/iec_bus.rb
DELETED
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Badline
|
|
4
|
-
# The serial bus between the C64 and its drives: ATN, CLK and DATA, each
|
|
5
|
-
# an open-collector line with a pull-up. A line is low while any device
|
|
6
|
-
# pulls it (wired-AND), and high otherwise. Every read works the levels
|
|
7
|
-
# out from what each side drives now.
|
|
8
|
-
#
|
|
9
|
-
# The C64 drives the lines from CIA 2's port A through 7406 inverters, so
|
|
10
|
-
# an output bit of 1 pulls its line low: PA3 ATN, PA4 CLK and PA5 DATA.
|
|
11
|
-
# The machine pushes those bits into the bus (host_lines=), which holds
|
|
12
|
-
# them. PA6 and PA7 read CLK and DATA directly, 1 for a released line.
|
|
13
|
-
# The bus stands in as CIA 2's peripheral for those two inputs.
|
|
14
|
-
#
|
|
15
|
-
# A drive drives CLK and DATA from VIA 1's PB3 and PB1, the same way. It
|
|
16
|
-
# also pulls DATA while ATN IN differs from its ATN acknowledge on PB4
|
|
17
|
-
# (an XOR gate), which answers ATN in hardware before the DOS gets to it.
|
|
18
|
-
# SerialPort reads the lines back into VIA 1. A drive whose
|
|
19
|
-
# serial_output sets DRIVE_ATN_GATED pulls DATA that way only while
|
|
20
|
-
# ATN is low, as the 1581's NAND does.
|
|
21
|
-
#
|
|
22
|
-
# Fast serial adds SRQ, which the C64 leaves alone. A C128 and a 1571
|
|
23
|
-
# clock bytes over it from a CIA's CNT, with the bits on DATA from its
|
|
24
|
-
# SP, through buffers each side turns towards the bus to send. A pin low
|
|
25
|
-
# pulls its line low. Each side pushes the lines it pulls when they
|
|
26
|
-
# move: the host through host_fast_lines=, which tells the drives
|
|
27
|
-
# (fast_lines_moved), and a drive through drives_fast_moved!, which
|
|
28
|
-
# tells the host (on_fast_change).
|
|
29
|
-
class IECBus
|
|
30
|
-
# CIA 2 port A
|
|
31
|
-
HOST_ATN_OUT = 0x08
|
|
32
|
-
HOST_CLK_OUT = 0x10
|
|
33
|
-
HOST_DATA_OUT = 0x20
|
|
34
|
-
HOST_CLK_IN = 0x40
|
|
35
|
-
HOST_DATA_IN = 0x80
|
|
36
|
-
|
|
37
|
-
# VIA 1 port B
|
|
38
|
-
DRIVE_DATA_OUT = 0x02
|
|
39
|
-
DRIVE_CLK_OUT = 0x08
|
|
40
|
-
DRIVE_ATNA = 0x10
|
|
41
|
-
|
|
42
|
-
# The lines pulled low, as ATN, CLK, DATA and SRQ bits
|
|
43
|
-
ATN = 0x01
|
|
44
|
-
CLK = 0x02
|
|
45
|
-
DATA = 0x04
|
|
46
|
-
SRQ = 0x08
|
|
47
|
-
|
|
48
|
-
# A drive's serial_output bits above VIA 1's port B: its fast serial
|
|
49
|
-
# pins pulling DATA and SRQ.
|
|
50
|
-
DRIVE_FAST_DATA = 0x100
|
|
51
|
-
DRIVE_FAST_SRQ = 0x200
|
|
52
|
-
|
|
53
|
-
# A drive's serial_output bit whose ATN acknowledge pulls DATA only
|
|
54
|
-
# while ATN is low.
|
|
55
|
-
DRIVE_ATN_GATED = 0x400
|
|
56
|
-
|
|
57
|
-
attr_reader :drives, :host_lines
|
|
58
|
-
|
|
59
|
-
# The lines the host's fast serial pins pull, as DATA and SRQ bits.
|
|
60
|
-
attr_reader :host_fast_lines
|
|
61
|
-
|
|
62
|
-
def initialize
|
|
63
|
-
@drives = []
|
|
64
|
-
@host_lines = 0
|
|
65
|
-
@host_fast_lines = 0
|
|
66
|
-
@drive_fast_lines = 0
|
|
67
|
-
@on_fast_change = nil
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
# The host's fast serial pins moved: +low+ is the lines they pull, as
|
|
71
|
-
# DATA and SRQ bits.
|
|
72
|
-
def host_fast_lines=(low)
|
|
73
|
-
return if low == @host_fast_lines
|
|
74
|
-
|
|
75
|
-
@host_fast_lines = low
|
|
76
|
-
@drives.each(&:fast_lines_moved)
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
# A drive's fast serial pins moved (serial_output's fast bits).
|
|
80
|
-
def drives_fast_moved!
|
|
81
|
-
low = 0
|
|
82
|
-
@drives.each do |drive|
|
|
83
|
-
output = drive.serial_output
|
|
84
|
-
low |= DATA if output.anybits?(DRIVE_FAST_DATA)
|
|
85
|
-
low |= SRQ if output.anybits?(DRIVE_FAST_SRQ)
|
|
86
|
-
end
|
|
87
|
-
return if low == @drive_fast_lines
|
|
88
|
-
|
|
89
|
-
@drive_fast_lines = low
|
|
90
|
-
@on_fast_change&.call
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
# Calls the block whenever the drives move their fast serial pins.
|
|
94
|
-
def on_fast_change(&block)
|
|
95
|
-
@on_fast_change = block
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
# The machine pushes the lines it pulls, as port A bits, whenever they
|
|
99
|
-
# may have moved: its output bits, with input bits floating high as the
|
|
100
|
-
# 7406 inputs see them. A bus with only drives on it keeps 0.
|
|
101
|
-
def host_lines=(lines)
|
|
102
|
-
@host_lines = lines
|
|
103
|
-
@drives.each(&:host_written!)
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
def attach(drive)
|
|
107
|
-
@drives << drive unless @drives.include?(drive)
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
def detach(drive)
|
|
111
|
-
@drives.delete(drive)
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
# One pass over everything on the bus, for a reader that wants more
|
|
115
|
-
# than one line, SRQ included. +host+ is the C64's port A lines as the
|
|
116
|
-
# reader sees them, which a drive takes a cycle late (see
|
|
117
|
-
# Drive::SerialLines).
|
|
118
|
-
def low_lines(host = @host_lines)
|
|
119
|
-
atn = host.anybits?(HOST_ATN_OUT)
|
|
120
|
-
low = @host_fast_lines | @drive_fast_lines
|
|
121
|
-
low |= ATN if atn
|
|
122
|
-
low |= CLK if host.anybits?(HOST_CLK_OUT)
|
|
123
|
-
low |= DATA if host.anybits?(HOST_DATA_OUT)
|
|
124
|
-
i = 0
|
|
125
|
-
while i < @drives.length
|
|
126
|
-
drive = @drives[i].serial_output
|
|
127
|
-
low |= CLK if drive.anybits?(DRIVE_CLK_OUT)
|
|
128
|
-
low |= DATA if drive.anybits?(DRIVE_DATA_OUT) || acknowledging?(drive, atn)
|
|
129
|
-
i += 1
|
|
130
|
-
end
|
|
131
|
-
low
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
def atn_low?(host = @host_lines) = host.anybits?(HOST_ATN_OUT)
|
|
135
|
-
|
|
136
|
-
# Whether a drive's ATN acknowledge pulls DATA, with its serial_output
|
|
137
|
-
# +drive+, while ATN is +atn+.
|
|
138
|
-
def acknowledging?(drive, atn)
|
|
139
|
-
atn != drive.anybits?(DRIVE_ATNA) && (atn || drive.nobits?(DRIVE_ATN_GATED))
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
def clk_low? = low_lines.anybits?(CLK)
|
|
143
|
-
|
|
144
|
-
def data_low? = low_lines.anybits?(DATA)
|
|
145
|
-
|
|
146
|
-
# CIA 2's port A pins as the bus leaves them: CLK IN and DATA IN low
|
|
147
|
-
# while their lines are.
|
|
148
|
-
def read_a(_port_a, _port_b)
|
|
149
|
-
low = low_lines
|
|
150
|
-
value = 0xff
|
|
151
|
-
value &= ~HOST_CLK_IN if low.anybits?(CLK)
|
|
152
|
-
value &= ~HOST_DATA_IN if low.anybits?(DATA)
|
|
153
|
-
value
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
# Port B goes to the user port, not the serial bus.
|
|
157
|
-
def read_b(_port_a, _port_b) = 0xff
|
|
158
|
-
end
|
|
159
|
-
end
|