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,75 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Badline
|
|
4
|
-
class Cartridge
|
|
5
|
-
# The KCS Power Cartridge: 16K of ROM, 128 bytes of RAM and a freeze
|
|
6
|
-
# button. It boots in 16K mode, and any access to I/O 1 sets the lines
|
|
7
|
-
# from address bit 1 and the direction:
|
|
8
|
-
#
|
|
9
|
-
# read, bit 1 clear 8K
|
|
10
|
-
# read, bit 1 set off
|
|
11
|
-
# write, bit 1 clear 16K
|
|
12
|
-
# write, bit 1 set Ultimax
|
|
13
|
-
#
|
|
14
|
-
# A read of I/O 1 returns the second last page of ROML. I/O 2 holds the
|
|
15
|
-
# RAM in its lower half, and the upper half reads the EXROM line in bit 7
|
|
16
|
-
# and GAME in bit 6, which the freezer checks to find the mode it
|
|
17
|
-
# interrupted. A freeze switches to Ultimax and lets go of NMI.
|
|
18
|
-
class KCSPower < Cartridge
|
|
19
|
-
include Freezer
|
|
20
|
-
|
|
21
|
-
IO1_ROM_PAGE = 0x1e00
|
|
22
|
-
|
|
23
|
-
def readable_io_pages
|
|
24
|
-
[0xde, 0xdf]
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def peek(addr)
|
|
28
|
-
if addr < 0xdf00
|
|
29
|
-
select_mode(addr.anybits?(0x02) ? :off : :rom8k)
|
|
30
|
-
@roml.peek(IO1_ROM_PAGE | (addr & 0xff))
|
|
31
|
-
elsif addr.anybits?(0x80)
|
|
32
|
-
(@exrom << 7) | (@game << 6) | (open_bus(addr) & 0x3f)
|
|
33
|
-
else
|
|
34
|
-
@io_ram[addr & 0x7f]
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def poke(addr, value)
|
|
39
|
-
if addr < 0xdf00
|
|
40
|
-
select_mode(addr.anybits?(0x02) ? :ultimax : :rom16k)
|
|
41
|
-
elsif addr.nobits?(0x80)
|
|
42
|
-
@io_ram[addr & 0x7f] = value
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def reset
|
|
47
|
-
self.nmi = false
|
|
48
|
-
select_mode(:rom16k)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def freeze!
|
|
52
|
-
self.nmi = false
|
|
53
|
-
select_mode(:ultimax)
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
private
|
|
57
|
-
|
|
58
|
-
def save_mapper(out)
|
|
59
|
-
out.blob(@io_ram)
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def load_mapper(input)
|
|
63
|
-
input.blob_into(@io_ram)
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
def install_chips(chips)
|
|
67
|
-
roml, romh = banks_from(chips)
|
|
68
|
-
@roml = roml.first || EMPTY_BANK
|
|
69
|
-
@romh = romh.first || EMPTY_BANK
|
|
70
|
-
@io_ram = Array.new(0x80, 0xff)
|
|
71
|
-
reset
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
end
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Badline
|
|
4
|
-
class Cartridge
|
|
5
|
-
# 8K. Writing I/O 1 switches the ROM in, writing I/O 2 switches it out.
|
|
6
|
-
# Both I/O pages read the last 512 bytes of the ROM.
|
|
7
|
-
class Mach5 < Cartridge
|
|
8
|
-
def readable_io_pages
|
|
9
|
-
[0xde, 0xdf]
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def peek(addr)
|
|
13
|
-
@roml.peek(addr)
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def poke(addr, _value)
|
|
17
|
-
select_mode(addr < 0xdf00 ? :rom8k : :off)
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def reset
|
|
21
|
-
select_mode(:rom8k)
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
private
|
|
25
|
-
|
|
26
|
-
def install_chips(chips)
|
|
27
|
-
@roml = banks_from(chips).first.compact.first || EMPTY_BANK
|
|
28
|
-
reset
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
end
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Badline
|
|
4
|
-
class Cartridge
|
|
5
|
-
# Magic Desk: up to 128 8K banks. A write to I/O 1 selects the bank from
|
|
6
|
-
# bits 0-6, masked to the size of the ROM and at least four banks, and
|
|
7
|
-
# switches the ROM out with bit 7.
|
|
8
|
-
class MagicDesk < Cartridge
|
|
9
|
-
def poke(addr, value)
|
|
10
|
-
return if addr > 0xdeff
|
|
11
|
-
|
|
12
|
-
@exrom = value.anybits?(0x80) ? 1 : 0
|
|
13
|
-
@roml = bank(@banks, value & @bank_mask)
|
|
14
|
-
changed!
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def reset
|
|
18
|
-
poke(0xde00, 0)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
private
|
|
22
|
-
|
|
23
|
-
def install_chips(chips)
|
|
24
|
-
@banks = banks_from(chips).first
|
|
25
|
-
@bank_mask = (bank_mask(@banks) | 0x03) & 0x7f
|
|
26
|
-
reset
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Badline
|
|
4
|
-
class Cartridge
|
|
5
|
-
# Ocean: up to 64 8K banks. A write to I/O 1 selects the bank from bits
|
|
6
|
-
# 0-5, masked to the size of the ROM.
|
|
7
|
-
class Ocean < Cartridge
|
|
8
|
-
def poke(addr, value)
|
|
9
|
-
return if addr > 0xdeff
|
|
10
|
-
|
|
11
|
-
select_bank(value & @bank_mask)
|
|
12
|
-
changed!
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def reset
|
|
16
|
-
select_bank(0)
|
|
17
|
-
changed!
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
private
|
|
21
|
-
|
|
22
|
-
# In 16K mode the selected bank shows through ROMH as well.
|
|
23
|
-
def select_bank(number)
|
|
24
|
-
@roml = bank(@banks, number)
|
|
25
|
-
@romh = @roml if game.zero?
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def install_chips(chips)
|
|
29
|
-
@banks = banks_from(chips).first
|
|
30
|
-
@bank_mask = bank_mask(@banks) & 0x3f
|
|
31
|
-
reset
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Badline
|
|
4
|
-
class Cartridge
|
|
5
|
-
# Pagefox: two 32K EPROMs and 32K of RAM, seen 16K at a time. A write to
|
|
6
|
-
# $DE80-$DEFF selects the half with bit 1 and the chip with bits 2-3
|
|
7
|
-
# (EPROM, EPROM, RAM, nothing), and switches the cartridge out with
|
|
8
|
-
# bit 4. Writes to the RAM land in the C64's RAM as well.
|
|
9
|
-
class Pagefox < Cartridge
|
|
10
|
-
RAM_CHIP = 2
|
|
11
|
-
EMPTY_CHIP = 3
|
|
12
|
-
|
|
13
|
-
def connect(ram:, open_bus:)
|
|
14
|
-
super
|
|
15
|
-
@ram_banks.each { |b| b.backing = ram }
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def poke(addr, value)
|
|
19
|
-
return if addr < 0xde80 || addr > 0xdeff
|
|
20
|
-
|
|
21
|
-
select(value)
|
|
22
|
-
changed!
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def reset
|
|
26
|
-
select(0)
|
|
27
|
-
changed!
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
private
|
|
31
|
-
|
|
32
|
-
def save_mapper(out)
|
|
33
|
-
super
|
|
34
|
-
@ram_banks.each { |ram| out.blob(ram.data) }
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def load_mapper(input)
|
|
38
|
-
super
|
|
39
|
-
@ram_banks.each { |ram| input.blob_into(ram.data) }
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def windows = [*@roml_banks, *@romh_banks, *@ram_banks, @open_bus || EMPTY_BANK, EMPTY_BANK]
|
|
43
|
-
|
|
44
|
-
def select(value)
|
|
45
|
-
half = (value >> 1) & 0x01
|
|
46
|
-
chip = (value >> 2) & 0x03
|
|
47
|
-
@roml, @romh = window(chip, half)
|
|
48
|
-
self.mode = value.anybits?(0x10) ? :off : :rom16k
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def window(chip, half)
|
|
52
|
-
case chip
|
|
53
|
-
when RAM_CHIP then @ram_banks[half * 2, 2]
|
|
54
|
-
when EMPTY_CHIP then [@open_bus || EMPTY_BANK] * 2
|
|
55
|
-
else
|
|
56
|
-
number = (chip << 1) | half
|
|
57
|
-
[bank(@roml_banks, number), bank(@romh_banks, number)]
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
def install_chips(chips)
|
|
62
|
-
@roml_banks, @romh_banks = banks_from(chips)
|
|
63
|
-
@ram_banks = Array.new(4) { RAMBank.new }
|
|
64
|
-
reset
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
end
|
|
@@ -1,320 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Badline
|
|
4
|
-
class Cartridge
|
|
5
|
-
# A Retro Replay's registers, RAM and flash, for a snapshot.
|
|
6
|
-
module RetroReplayState
|
|
7
|
-
private
|
|
8
|
-
|
|
9
|
-
def save_jumpers(out)
|
|
10
|
-
out.boolean(true).boolean(@flash_jumper).boolean(@bank_jumper)
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def save_mapper(out)
|
|
14
|
-
[@active, @frozen, @phi1_ultimax, @ram_enabled, @ram_at_a000, @allow_bank, @no_freeze, @reu_mapping,
|
|
15
|
-
@write_once].each { |flag| out.boolean(flag) }
|
|
16
|
-
out.int(@bank).int(RetroReplay::CONTROL_MODES.index(@config))
|
|
17
|
-
@ram_data.each { |data| out.blob(data) }
|
|
18
|
-
@flash.save_state(out)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def load_mapper(input)
|
|
22
|
-
load_flags(input)
|
|
23
|
-
@bank = input.int
|
|
24
|
-
@config = RetroReplay::CONTROL_MODES.fetch(input.int)
|
|
25
|
-
@ram_data.each { |data| input.blob_into(data) }
|
|
26
|
-
@flash.load_state(input)
|
|
27
|
-
map_windows
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def load_flags(input)
|
|
31
|
-
@active = input.boolean?
|
|
32
|
-
@frozen = input.boolean?
|
|
33
|
-
@phi1_ultimax = input.boolean?
|
|
34
|
-
@ram_enabled = input.boolean?
|
|
35
|
-
@ram_at_a000 = input.boolean?
|
|
36
|
-
@allow_bank = input.boolean?
|
|
37
|
-
@no_freeze = input.boolean?
|
|
38
|
-
@reu_mapping = input.boolean?
|
|
39
|
-
@write_once = input.boolean?
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
# Retro Replay: an Am29F010 flash chip of two 64K halves, each eight 8K
|
|
44
|
-
# ROM banks, and four 8K RAM banks, with the Action Replay's register at
|
|
45
|
-
# $DE00 and an extended one at $DE01. The Nordic Replay (subtype 1) adds
|
|
46
|
-
# the Nordic Power configuration. The clock port isn't there.
|
|
47
|
-
#
|
|
48
|
-
# CRT banks 0-7 are the chip's upper half and banks 8-15 its lower half.
|
|
49
|
-
# The cartridge runs from the upper half, or from the lower one with the
|
|
50
|
-
# bank jumper set.
|
|
51
|
-
#
|
|
52
|
-
# $DE00 writes:
|
|
53
|
-
# bit 0 pulls GAME low
|
|
54
|
-
# bit 1 releases EXROM
|
|
55
|
-
# bit 2 switches the registers off until the next freeze or reset
|
|
56
|
-
# bits 3-4,7 bank
|
|
57
|
-
# bit 5 RAM instead of ROM
|
|
58
|
-
# bit 6 acknowledges a freeze: until then the cartridge stays in
|
|
59
|
-
# Ultimax mode with nothing at ROML
|
|
60
|
-
#
|
|
61
|
-
# $DE01 writes the bank again, and once only AllowBank (bit 1), which
|
|
62
|
-
# banks the RAM in I/O as well, NoFreeze (bit 2) and the REU-compatible
|
|
63
|
-
# map (bit 6), which moves the I/O RAM from I/O 2 to I/O 1 above $DE01.
|
|
64
|
-
# $DE00 and $DE01 read back the bank, the write-once bits and the freeze
|
|
65
|
-
# button.
|
|
66
|
-
#
|
|
67
|
-
# The VIC sees Ultimax mode only from a freeze to the next $DE00 write.
|
|
68
|
-
#
|
|
69
|
-
# The RAM at ROML takes writes only in Ultimax mode, except on the Nordic
|
|
70
|
-
# Replay. With RAM and only EXROM released ($22) the Retro Replay maps
|
|
71
|
-
# nothing at ROML and keeps the RAM in I/O, and the Nordic Replay maps
|
|
72
|
-
# the ROM at ROML and the RAM at ROMH, as the Nordic Power does. Frozen
|
|
73
|
-
# in that configuration, the Nordic Replay maps the RAM at $A000.
|
|
74
|
-
#
|
|
75
|
-
# The flash jumper puts the cartridge in flash mode, which starts with
|
|
76
|
-
# the cartridge switched off ($02) and has no freeze. $DE00 selects 8K
|
|
77
|
-
# mode unless it switches the cartridge off, and writes to ROML reach
|
|
78
|
-
# the flash, and the C64's RAM underneath, or the RAM when selected.
|
|
79
|
-
# $DE01 isn't write-once and has no REU-compatible map, and with the
|
|
80
|
-
# bank jumper set its bit 5 clear selects the other half of the flash,
|
|
81
|
-
# until the next $DE00 write. $DE00 reads the flash jumper in bit 0 and
|
|
82
|
-
# the half in bit 5.
|
|
83
|
-
class RetroReplay < Cartridge
|
|
84
|
-
include Freezer
|
|
85
|
-
include RetroReplayState
|
|
86
|
-
|
|
87
|
-
CONTROL_MODES = %i[rom8k rom16k off ultimax].freeze
|
|
88
|
-
IO1_PAGE = 0x1e00
|
|
89
|
-
IO2_PAGE = 0x1f00
|
|
90
|
-
|
|
91
|
-
attr_reader :flash
|
|
92
|
-
|
|
93
|
-
def self.from_jumpers(crt, input)
|
|
94
|
-
input.boolean?
|
|
95
|
-
new(crt, flash_jumper: input.boolean?, bank_jumper: input.boolean?)
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
def initialize(crt, flash_jumper: false, bank_jumper: false)
|
|
99
|
-
@nordic = crt.subtype == 1
|
|
100
|
-
@flash_jumper = flash_jumper
|
|
101
|
-
@bank_jumper = bank_jumper
|
|
102
|
-
super(crt)
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
def clock=(clock)
|
|
106
|
-
super
|
|
107
|
-
@flash.clock = clock
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
def connect(ram:, open_bus:)
|
|
111
|
-
super
|
|
112
|
-
@through.each { |b| b.backing = ram }
|
|
113
|
-
configure
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
def readable_io_pages
|
|
117
|
-
[0xde, 0xdf]
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
def peek(addr)
|
|
121
|
-
return open_bus(addr) unless @active
|
|
122
|
-
|
|
123
|
-
addr < 0xdf00 ? io1_peek(addr) : io2_peek(addr)
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
def poke(addr, value)
|
|
127
|
-
return unless @active
|
|
128
|
-
|
|
129
|
-
low = addr & 0xff
|
|
130
|
-
if addr >= 0xdf00
|
|
131
|
-
io_ram[IO2_PAGE | low] = value if io_ram_writable?(!@reu_mapping)
|
|
132
|
-
elsif low > 1
|
|
133
|
-
io_ram[IO1_PAGE | low] = value if io_ram_writable?(@reu_mapping)
|
|
134
|
-
else
|
|
135
|
-
low.zero? ? control(value) : extended_control(value)
|
|
136
|
-
end
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
def phi1_ultimax? = @phi1_ultimax
|
|
140
|
-
|
|
141
|
-
def ultimax_a000
|
|
142
|
-
@isolated[ram_view_bank] if @nordic && @ram_at_a000 && @frozen
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
# Reset leaves the write-once bits of $DE01 as they are.
|
|
146
|
-
def reset
|
|
147
|
-
@active = true
|
|
148
|
-
@frozen = false
|
|
149
|
-
self.nmi = false
|
|
150
|
-
control(@flash_jumper ? 0x02 : 0x00)
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
def freeze!
|
|
154
|
-
@active = @frozen = @phi1_ultimax = true
|
|
155
|
-
@ram_enabled = false
|
|
156
|
-
@bank = 0
|
|
157
|
-
@config = :ultimax
|
|
158
|
-
configure
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
private
|
|
162
|
-
|
|
163
|
-
def freeze_allowed? = !@no_freeze && !@flash_jumper
|
|
164
|
-
|
|
165
|
-
def status
|
|
166
|
-
((@bank & 0x03) << 3) | ((@bank & 0x04) << 5) | ((@bank & 0x08) << 2) | (@flash_jumper ? 0x01 : 0) |
|
|
167
|
-
(@allow_bank ? 0x02 : 0) | (button_pressed? ? 0x04 : 0) | (@reu_mapping ? 0x40 : 0)
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
def io1_peek(addr)
|
|
171
|
-
return status if (addr & 0xff) < 2
|
|
172
|
-
return open_bus(addr) unless @reu_mapping && !@frozen
|
|
173
|
-
|
|
174
|
-
io_window(addr, IO1_PAGE)
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
def io2_peek(addr)
|
|
178
|
-
return open_bus(addr) if @reu_mapping || @frozen
|
|
179
|
-
|
|
180
|
-
io_window(addr, IO2_PAGE)
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
# The I/O RAM when selected, otherwise the ROM, which 16K and Ultimax
|
|
184
|
-
# mode leave out.
|
|
185
|
-
def io_window(addr, page)
|
|
186
|
-
if @ram_enabled || @ram_at_a000
|
|
187
|
-
io_ram[page | (addr & 0xff)]
|
|
188
|
-
elsif @config == :rom8k || @config == :off
|
|
189
|
-
@rom.peek(addr)
|
|
190
|
-
else
|
|
191
|
-
open_bus(addr)
|
|
192
|
-
end
|
|
193
|
-
end
|
|
194
|
-
|
|
195
|
-
def io_ram
|
|
196
|
-
@ram_data[ram_view_bank]
|
|
197
|
-
end
|
|
198
|
-
|
|
199
|
-
def io_ram_writable?(window)
|
|
200
|
-
window && !@frozen && (@ram_enabled || (@nordic && @ram_at_a000))
|
|
201
|
-
end
|
|
202
|
-
|
|
203
|
-
def ram_view_bank
|
|
204
|
-
@allow_bank ? @bank & 0x03 : 0
|
|
205
|
-
end
|
|
206
|
-
|
|
207
|
-
def control(value)
|
|
208
|
-
value = flash_mode_control(value)
|
|
209
|
-
@bank = bank_bits(value)
|
|
210
|
-
@phi1_ultimax = false
|
|
211
|
-
@config = CONTROL_MODES[value & 0x03]
|
|
212
|
-
@ram_at_a000 = (value & 0x67) == 0x22
|
|
213
|
-
if @nordic && @ram_at_a000
|
|
214
|
-
@config = :rom16k
|
|
215
|
-
@ram_enabled = false
|
|
216
|
-
else
|
|
217
|
-
acknowledge_freeze if value.anybits?(0x40)
|
|
218
|
-
@ram_enabled = value.anybits?(0x20)
|
|
219
|
-
@config = :off if @ram_at_a000
|
|
220
|
-
end
|
|
221
|
-
@config = :ultimax if @frozen
|
|
222
|
-
configure
|
|
223
|
-
@active = false if value.anybits?(0x04)
|
|
224
|
-
end
|
|
225
|
-
|
|
226
|
-
# Flash mode leaves 8K mode only to switch the cartridge off.
|
|
227
|
-
def flash_mode_control(value)
|
|
228
|
-
return value unless @flash_jumper && (value & 0x03) != 0x02
|
|
229
|
-
|
|
230
|
-
value & ~0x03
|
|
231
|
-
end
|
|
232
|
-
|
|
233
|
-
def acknowledge_freeze
|
|
234
|
-
@frozen = false
|
|
235
|
-
self.nmi = false
|
|
236
|
-
end
|
|
237
|
-
|
|
238
|
-
def extended_control(value)
|
|
239
|
-
unless @write_once
|
|
240
|
-
@allow_bank = value.anybits?(0x02)
|
|
241
|
-
@no_freeze = value.anybits?(0x04)
|
|
242
|
-
@reu_mapping = value.anybits?(0x40) && !@flash_jumper
|
|
243
|
-
@write_once = !@flash_jumper
|
|
244
|
-
end
|
|
245
|
-
@bank = bank_bits(value)
|
|
246
|
-
@bank |= 0x08 if @flash_jumper && @bank_jumper && value.nobits?(0x20)
|
|
247
|
-
configure
|
|
248
|
-
end
|
|
249
|
-
|
|
250
|
-
def bank_bits(value)
|
|
251
|
-
((value >> 3) & 0x03) | ((value >> 5) & 0x04)
|
|
252
|
-
end
|
|
253
|
-
|
|
254
|
-
def configure
|
|
255
|
-
map_windows
|
|
256
|
-
changed!
|
|
257
|
-
end
|
|
258
|
-
|
|
259
|
-
def map_windows
|
|
260
|
-
self.mode = @config
|
|
261
|
-
@rom = flash_window(@bank)
|
|
262
|
-
@roml = roml_window
|
|
263
|
-
@romh = romh_window
|
|
264
|
-
end
|
|
265
|
-
|
|
266
|
-
def roml_window
|
|
267
|
-
nothing = @open_bus || EMPTY_BANK
|
|
268
|
-
return @ram_enabled ? WriteOnlyRAM.new(@ram_data[@bank & 0x03], nothing) : nothing if @frozen
|
|
269
|
-
return ram_window(@bank & 0x03) if @ram_enabled
|
|
270
|
-
return flash_writes if (@nordic && @ram_at_a000) || @config != :rom16k
|
|
271
|
-
|
|
272
|
-
nothing
|
|
273
|
-
end
|
|
274
|
-
|
|
275
|
-
# A RAM bank over the flash window takes writes for the chip and the
|
|
276
|
-
# C64's RAM alike.
|
|
277
|
-
def flash_writes
|
|
278
|
-
return @rom unless @flash_jumper
|
|
279
|
-
|
|
280
|
-
RAMBank.new(@rom).tap { |window| window.backing = @ram }
|
|
281
|
-
end
|
|
282
|
-
|
|
283
|
-
def ram_window(number)
|
|
284
|
-
if @config == :ultimax || @flash_jumper
|
|
285
|
-
@isolated[number]
|
|
286
|
-
else
|
|
287
|
-
(@nordic ? @through : @readers)[number]
|
|
288
|
-
end
|
|
289
|
-
end
|
|
290
|
-
|
|
291
|
-
def romh_window
|
|
292
|
-
nordic_ram = @nordic && @ram_at_a000
|
|
293
|
-
return @isolated[ram_view_bank] if nordic_ram && !@frozen
|
|
294
|
-
return @rom if @allow_bank || !(@ram_enabled || nordic_ram)
|
|
295
|
-
|
|
296
|
-
flash_window(@bank & ~0x03)
|
|
297
|
-
end
|
|
298
|
-
|
|
299
|
-
def flash_window(number)
|
|
300
|
-
@flash.window((@bank_jumper ? 0 : 0x10000) + (number * BANK_SIZE))
|
|
301
|
-
end
|
|
302
|
-
|
|
303
|
-
def install_chips(chips)
|
|
304
|
-
data = Array.new(0x20000, 0xff)
|
|
305
|
-
chips.each do |chip|
|
|
306
|
-
bytes = chip.data.first(BANK_SIZE)
|
|
307
|
-
data[((chip.bank & 0x0f) ^ 0x08) * BANK_SIZE, bytes.length] = bytes
|
|
308
|
-
end
|
|
309
|
-
@flash = Flash.new(data, model: Flash::AM29F010)
|
|
310
|
-
@flash.on_change { configure }
|
|
311
|
-
@ram_data = Array.new(4) { Array.new(BANK_SIZE, 0) }
|
|
312
|
-
@through = @ram_data.map { |data| RAMBank.new(data) }
|
|
313
|
-
@isolated = @ram_data.map { |data| RAMBank.new(data) }
|
|
314
|
-
@readers = @ram_data.map { |data| RAMReader.new(data) }
|
|
315
|
-
@allow_bank = @no_freeze = @reu_mapping = @write_once = false
|
|
316
|
-
reset
|
|
317
|
-
end
|
|
318
|
-
end
|
|
319
|
-
end
|
|
320
|
-
end
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Badline
|
|
4
|
-
class Cartridge
|
|
5
|
-
# 8K. Reading $DF00-$DFBF switches the ROM out, reading $DFC0-$DFFF
|
|
6
|
-
# switches it back in.
|
|
7
|
-
class RexUtility < Cartridge
|
|
8
|
-
def readable_io_pages
|
|
9
|
-
[0xdf]
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def peek(addr)
|
|
13
|
-
select_mode((addr & 0xff) < 0xc0 ? :off : :rom8k) if addr >= 0xdf00
|
|
14
|
-
open_bus(addr)
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def reset
|
|
18
|
-
select_mode(:rom8k)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
private
|
|
22
|
-
|
|
23
|
-
def install_chips(chips)
|
|
24
|
-
@roml = banks_from(chips).first.compact.first || EMPTY_BANK
|
|
25
|
-
reset
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Badline
|
|
4
|
-
class Cartridge
|
|
5
|
-
# RGCD: up to eight 8K banks. A write to I/O 1 selects the bank from the
|
|
6
|
-
# low bits, and bit 3 switches the ROM out until reset. The Hucky board
|
|
7
|
-
# (subtype 1) inverts the bank bits and decodes only as many as it has
|
|
8
|
-
# banks.
|
|
9
|
-
class RGCD < Cartridge
|
|
10
|
-
def initialize(crt)
|
|
11
|
-
@hucky = crt.subtype == 1
|
|
12
|
-
super
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def poke(addr, value)
|
|
16
|
-
return if addr > 0xdeff || @disabled
|
|
17
|
-
|
|
18
|
-
select(value)
|
|
19
|
-
changed!
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def reset
|
|
23
|
-
@disabled = false
|
|
24
|
-
self.mode = :rom8k
|
|
25
|
-
select(0)
|
|
26
|
-
changed!
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
private
|
|
30
|
-
|
|
31
|
-
def save_mapper(out)
|
|
32
|
-
super
|
|
33
|
-
out.boolean(@disabled)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def load_mapper(input)
|
|
37
|
-
super
|
|
38
|
-
@disabled = input.boolean?
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def select(value)
|
|
42
|
-
value ^= 0x07 if @hucky
|
|
43
|
-
if value.anybits?(0x08)
|
|
44
|
-
@disabled = true
|
|
45
|
-
self.mode = :off
|
|
46
|
-
else
|
|
47
|
-
@roml = bank(@banks, value & @bank_mask)
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def install_chips(chips)
|
|
52
|
-
@banks = banks_from(chips).first
|
|
53
|
-
@bank_mask = @hucky ? bank_mask(@banks) : 0x07
|
|
54
|
-
reset
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
end
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Badline
|
|
4
|
-
class Cartridge
|
|
5
|
-
# 16K. Reading I/O 1 switches ROMH out (8K mode), writing it switches
|
|
6
|
-
# ROMH back in.
|
|
7
|
-
class SimonsBasic < Cartridge
|
|
8
|
-
def readable_io_pages
|
|
9
|
-
[0xde]
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def peek(addr)
|
|
13
|
-
select_mode(:rom8k) if addr < 0xdf00
|
|
14
|
-
open_bus(addr)
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def poke(addr, _value)
|
|
18
|
-
select_mode(:rom16k) if addr < 0xdf00
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def reset
|
|
22
|
-
select_mode(:rom16k)
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
private
|
|
26
|
-
|
|
27
|
-
def install_chips(chips)
|
|
28
|
-
roml, romh = banks_from(chips)
|
|
29
|
-
@roml = bank(roml, 0)
|
|
30
|
-
@romh = bank(romh, 0)
|
|
31
|
-
reset
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Badline
|
|
4
|
-
class Cartridge
|
|
5
|
-
class Standard < Cartridge
|
|
6
|
-
private
|
|
7
|
-
|
|
8
|
-
def install_chips(chips)
|
|
9
|
-
roml, romh = banks_from(chips)
|
|
10
|
-
@roml = roml.compact.first
|
|
11
|
-
@romh = romh.compact.first
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
end
|