badline 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +25 -0
- data/CLAUDE.md +59 -31
- data/README.md +1 -1
- data/doc/library.md +9 -9
- data/doc/pinned-behaviour.md +105 -105
- data/doc/snapshots.md +1 -4
- data/lib/badline/audio/bare_player.rb +4 -4
- data/lib/badline/audio/cli.rb +6 -6
- data/lib/badline/audio/jukebox.rb +2 -2
- data/lib/badline/audio/machine_player.rb +2 -2
- data/lib/badline/{media → audio}/queue.rb +1 -1
- data/lib/badline/audio/queued_tune.rb +6 -6
- data/lib/badline/audio/renderer.rb +5 -5
- data/lib/badline/audio/stereo.rb +1 -1
- data/lib/badline/c128/{bus_state.rb → bus/saved_state.rb} +6 -6
- data/lib/badline/c128/bus.rb +30 -51
- data/lib/badline/c128/color_lines.rb +2 -2
- data/lib/badline/c128/cpu.rb +1 -1
- data/lib/badline/c128/drives.rb +10 -11
- data/lib/badline/c128/fast_serial.rb +5 -5
- data/lib/badline/c128/mmu_pages.rb +1 -1
- data/lib/badline/c128/modes.rb +2 -2
- data/lib/badline/c128/saved_state.rb +21 -47
- data/lib/badline/c128/z80.rb +2 -2
- data/lib/badline/c128.rb +18 -72
- data/lib/badline/{computer → c64}/attachments.rb +16 -47
- data/lib/badline/c64/banked_ram/banking.rb +32 -0
- data/lib/badline/c64/banked_ram/plus256k.rb +56 -0
- data/lib/badline/c64/banked_ram/plus60k.rb +45 -0
- data/lib/badline/c64/banked_ram/unexpanded.rb +30 -0
- data/lib/badline/c64/banked_ram.rb +23 -0
- data/lib/badline/c64/bus/extra_sids.rb +32 -0
- data/lib/badline/c64/bus/fittings.rb +40 -0
- data/lib/badline/c64/bus/pla.rb +149 -0
- data/lib/badline/c64/bus/roms.rb +41 -0
- data/lib/badline/c64/bus/saved_state.rb +68 -0
- data/lib/badline/c64/bus/sid_slots.rb +44 -0
- data/lib/badline/c64/bus.rb +218 -0
- data/lib/badline/c64/cartridge/action_replay.rb +128 -0
- data/lib/badline/c64/cartridge/atomic_power.rb +26 -0
- data/lib/badline/c64/cartridge/bank.rb +83 -0
- data/lib/badline/c64/cartridge/comal80.rb +52 -0
- data/lib/badline/c64/cartridge/dinamic.rb +36 -0
- data/lib/badline/c64/cartridge/easy_flash.rb +147 -0
- data/lib/badline/c64/cartridge/epyx_fastload.rb +81 -0
- data/lib/badline/c64/cartridge/final_cartridge3.rb +91 -0
- data/lib/badline/c64/cartridge/flash/saved_state.rb +40 -0
- data/lib/badline/c64/cartridge/flash.rb +279 -0
- data/lib/badline/c64/cartridge/freezer.rb +35 -0
- data/lib/badline/c64/cartridge/fun_play.rb +40 -0
- data/lib/badline/c64/cartridge/g_mod2.rb +76 -0
- data/lib/badline/c64/cartridge/game_system.rb +42 -0
- data/lib/badline/c64/cartridge/geo_ram.rb +81 -0
- data/lib/badline/c64/cartridge/kcs_power.rb +77 -0
- data/lib/badline/c64/cartridge/mach5.rb +34 -0
- data/lib/badline/c64/cartridge/magic_desk.rb +32 -0
- data/lib/badline/c64/cartridge/ocean.rb +37 -0
- data/lib/badline/c64/cartridge/pagefox.rb +70 -0
- data/lib/badline/c64/cartridge/retro_replay/saved_state.rb +47 -0
- data/lib/badline/c64/cartridge/retro_replay.rb +286 -0
- data/lib/badline/c64/cartridge/rex_utility.rb +31 -0
- data/lib/badline/c64/cartridge/rgcd.rb +60 -0
- data/lib/badline/c64/cartridge/saved_state.rb +63 -0
- data/lib/badline/c64/cartridge/simons_basic.rb +37 -0
- data/lib/badline/c64/cartridge/standard.rb +17 -0
- data/lib/badline/c64/cartridge/super_games.rb +50 -0
- data/lib/badline/c64/cartridge/westermann.rb +32 -0
- data/lib/badline/c64/cartridge/zaxxon.rb +68 -0
- data/lib/badline/c64/cartridge.rb +258 -0
- data/lib/badline/c64/color_memory.rb +27 -0
- data/lib/badline/c64/common.rb +34 -0
- data/lib/badline/c64/kernal_traps.rb +89 -0
- data/lib/badline/c64/reu/dma/saved_state.rb +52 -0
- data/lib/badline/c64/reu/dma.rb +275 -0
- data/lib/badline/c64/reu/ram.rb +109 -0
- data/lib/badline/c64/reu/saved_state.rb +55 -0
- data/lib/badline/c64/reu/trigger.rb +34 -0
- data/lib/badline/c64/reu.rb +291 -0
- data/lib/badline/{computer → c64}/saved_state.rb +13 -18
- data/lib/badline/{computer → c64}/true_drives.rb +20 -31
- data/lib/badline/{computer.rb → c64.rb} +22 -80
- data/lib/badline/chips/cia/fast_forward.rb +62 -0
- data/lib/badline/chips/cia/interrupt_register.rb +145 -0
- data/lib/badline/chips/cia/saved_state.rb +49 -0
- data/lib/badline/chips/cia/serial/saved_state.rb +45 -0
- data/lib/badline/chips/cia/serial.rb +250 -0
- data/lib/badline/chips/cia/time_of_day.rb +232 -0
- data/lib/badline/chips/cia/timer.rb +208 -0
- data/lib/badline/chips/cia.rb +281 -0
- data/lib/badline/chips/cpu/addressing.rb +133 -0
- data/lib/badline/chips/cpu/boundary.rb +56 -0
- data/lib/badline/chips/cpu/core.rb +167 -0
- data/lib/badline/chips/cpu/instruction.rb +338 -0
- data/lib/badline/chips/cpu/instruction_set/arithmetic.rb +118 -0
- data/lib/badline/chips/cpu/instruction_set/bitwise.rb +130 -0
- data/lib/badline/chips/cpu/instruction_set/branch.rb +83 -0
- data/lib/badline/chips/cpu/instruction_set/flag.rb +67 -0
- data/lib/badline/chips/cpu/instruction_set/illegal.rb +274 -0
- data/lib/badline/chips/cpu/instruction_set/inc_dec.rb +73 -0
- data/lib/badline/chips/cpu/instruction_set/stack.rb +56 -0
- data/lib/badline/chips/cpu/instruction_set/transfer.rb +141 -0
- data/lib/badline/chips/cpu/instruction_set.rb +59 -0
- data/lib/badline/chips/cpu/interrupts.rb +108 -0
- data/lib/badline/chips/cpu/microcode.rb +179 -0
- data/lib/badline/chips/cpu/operations.rb +90 -0
- data/lib/badline/chips/cpu/port.rb +116 -0
- data/lib/badline/chips/cpu/saved_state.rb +117 -0
- data/lib/badline/chips/cpu/stack_operations.rb +84 -0
- data/lib/badline/chips/cpu/traps.rb +23 -0
- data/lib/badline/chips/cpu.rb +12 -0
- data/lib/badline/chips/sid/catch_up.rb +122 -0
- data/lib/badline/chips/sid/decimator.rb +66 -0
- data/lib/badline/chips/sid/envelope/saved_state.rb +70 -0
- data/lib/badline/chips/sid/envelope.rb +241 -0
- data/lib/badline/chips/sid/filter/saved_state.rb +42 -0
- data/lib/badline/chips/sid/filter.rb +241 -0
- data/lib/badline/chips/sid/saved_state.rb +52 -0
- data/lib/badline/chips/sid/voice.rb +79 -0
- data/lib/badline/chips/sid/waveform/combined.rb +128 -0
- data/lib/badline/chips/sid/waveform/fast_forward.rb +107 -0
- data/lib/badline/chips/sid/waveform/noise_writeback.rb +124 -0
- data/lib/badline/chips/sid/waveform/saved_state.rb +68 -0
- data/lib/badline/chips/sid/waveform.rb +307 -0
- data/lib/badline/chips/sid.rb +265 -0
- data/lib/badline/{c128 → chips}/vdc/memory.rb +1 -1
- data/lib/badline/{c128 → chips}/vdc/painter.rb +1 -1
- data/lib/badline/{c128 → chips}/vdc/raster.rb +1 -1
- data/lib/badline/chips/vdc/saved_state.rb +36 -0
- data/lib/badline/{c128 → chips}/vdc/window.rb +1 -1
- data/lib/badline/{c128 → chips}/vdc.rb +7 -31
- data/lib/badline/chips/via/control_lines.rb +124 -0
- data/lib/badline/chips/via/fast_forward.rb +55 -0
- data/lib/badline/chips/via/interrupt_register.rb +69 -0
- data/lib/badline/chips/via/saved_state.rb +44 -0
- data/lib/badline/chips/via/shift_register.rb +182 -0
- data/lib/badline/chips/via/timer1.rb +133 -0
- data/lib/badline/chips/via/timer2.rb +135 -0
- data/lib/badline/chips/via.rb +268 -0
- data/lib/badline/chips/vic/bank.rb +135 -0
- data/lib/badline/chips/vic/border_mask.rb +88 -0
- data/lib/badline/chips/vic/collisions.rb +117 -0
- data/lib/badline/chips/vic/color_patches.rb +49 -0
- data/lib/badline/chips/vic/display_state.rb +187 -0
- data/lib/badline/chips/vic/graphics_mode.rb +166 -0
- data/lib/badline/chips/vic/graphics_shifter/saved_state.rb +40 -0
- data/lib/badline/chips/vic/graphics_shifter.rb +187 -0
- data/lib/badline/chips/vic/register_log.rb +83 -0
- data/lib/badline/chips/vic/registers.rb +197 -0
- data/lib/badline/chips/vic/saved_state.rb +82 -0
- data/lib/badline/chips/vic/sequencer/saved_state.rb +91 -0
- data/lib/badline/chips/vic/sequencer.rb +277 -0
- data/lib/badline/chips/vic/sequencer_output.rb +118 -0
- data/lib/badline/chips/vic/sprite/internal_bus.rb +70 -0
- data/lib/badline/chips/vic/sprite/saved_state.rb +66 -0
- data/lib/badline/chips/vic/sprite/shifter.rb +148 -0
- data/lib/badline/chips/vic/sprite/timing.rb +58 -0
- data/lib/badline/chips/vic/sprite.rb +339 -0
- data/lib/badline/chips/vic/sprites/saved_state.rb +59 -0
- data/lib/badline/chips/vic/sprites.rb +284 -0
- data/lib/badline/chips/vic.rb +783 -0
- data/lib/badline/chips/vic_i/painter/saved_state.rb +40 -0
- data/lib/badline/{vic20/vic → chips/vic_i}/painter.rb +6 -30
- data/lib/badline/{vic20/vic → chips/vic_i}/saved_state.rb +2 -2
- data/lib/badline/chips/vic_i/sound/output.rb +85 -0
- data/lib/badline/chips/vic_i/sound.rb +235 -0
- data/lib/badline/{vic20/vic → chips/vic_i}/text_window.rb +2 -2
- data/lib/badline/{vic20/vic.rb → chips/vic_i.rb} +5 -5
- data/lib/badline/chips/z80/arithmetic.rb +119 -0
- data/lib/badline/chips/z80/bit_page.rb +57 -0
- data/lib/badline/chips/z80/block_io.rb +60 -0
- data/lib/badline/chips/z80/block_transfers.rb +61 -0
- data/lib/badline/chips/z80/bus_cycles.rb +113 -0
- data/lib/badline/chips/z80/core.rb +115 -0
- data/lib/badline/chips/z80/exchanges.rb +52 -0
- data/lib/badline/chips/z80/extended_page.rb +91 -0
- data/lib/badline/chips/z80/flags.rb +39 -0
- data/lib/badline/chips/z80/interrupt_acceptance.rb +48 -0
- data/lib/badline/chips/z80/jumps.rb +84 -0
- data/lib/badline/chips/z80/loads.rb +100 -0
- data/lib/badline/chips/z80/main_page.rb +136 -0
- data/lib/badline/chips/z80/registers.rb +122 -0
- data/lib/badline/chips/z80/saved_state.rb +71 -0
- data/lib/badline/chips/z80/shifts.rb +66 -0
- data/lib/badline/chips/z80.rb +13 -0
- data/lib/badline/core.rb +27 -29
- data/lib/badline/drives/datasette/saved_state.rb +37 -0
- data/lib/badline/drives/datasette.rb +140 -0
- data/lib/badline/drives/engine/core.rb +149 -0
- data/lib/badline/drives/engine/fast_serial.rb +75 -0
- data/lib/badline/drives/engine/idle.rb +127 -0
- data/lib/badline/drives/engine/idle_cpu.rb +30 -0
- data/lib/badline/drives/engine/orbit.rb +81 -0
- data/lib/badline/drives/engine/serial_lines.rb +75 -0
- data/lib/badline/drives/engine/sleep.rb +114 -0
- data/lib/badline/drives/engine/vias.rb +86 -0
- data/lib/badline/drives/engine/watch.rb +152 -0
- data/lib/badline/drives/engine.rb +11 -0
- data/lib/badline/drives/model1541/bus.rb +88 -0
- data/lib/badline/drives/model1541/byte_ready.rb +50 -0
- data/lib/badline/drives/model1541/cpu.rb +13 -0
- data/lib/badline/drives/model1541/disk/saved_state.rb +88 -0
- data/lib/badline/drives/model1541/disk.rb +317 -0
- data/lib/badline/drives/model1541/disk_via.rb +38 -0
- data/lib/badline/drives/model1541/gcr.rb +59 -0
- data/lib/badline/drives/model1541/mechanism/saved_state.rb +72 -0
- data/lib/badline/drives/model1541/mechanism.rb +315 -0
- data/lib/badline/drives/model1541/rotation.rb +123 -0
- data/lib/badline/drives/model1541/saved_state.rb +44 -0
- data/lib/badline/drives/model1541/sector_reader.rb +78 -0
- data/lib/badline/drives/model1541/serial_port.rb +20 -0
- data/lib/badline/drives/model1541/track.rb +100 -0
- data/lib/badline/drives/model1541.rb +81 -0
- data/lib/badline/drives/model1571/bus.rb +113 -0
- data/lib/badline/drives/model1571/cpu.rb +13 -0
- data/lib/badline/drives/model1571/saved_state.rb +47 -0
- data/lib/badline/drives/model1571/serial_port.rb +39 -0
- data/lib/badline/drives/model1571/serial_via.rb +27 -0
- data/lib/badline/drives/model1571/wd1770.rb +122 -0
- data/lib/badline/drives/model1571.rb +142 -0
- data/lib/badline/drives/model1581/bus.rb +139 -0
- data/lib/badline/drives/model1581/cpu.rb +13 -0
- data/lib/badline/drives/model1581/disk/saved_state.rb +89 -0
- data/lib/badline/drives/model1581/disk.rb +137 -0
- data/lib/badline/drives/model1581/mechanism.rb +119 -0
- data/lib/badline/drives/model1581/saved_state.rb +42 -0
- data/lib/badline/drives/model1581/serial_port.rb +54 -0
- data/lib/badline/drives/model1581/slot.rb +79 -0
- data/lib/badline/drives/model1581/track.rb +102 -0
- data/lib/badline/drives/model1581/track_bytes.rb +77 -0
- data/lib/badline/drives/model1581/wd1772/registers.rb +91 -0
- data/lib/badline/drives/model1581/wd1772/saved_state.rb +68 -0
- data/lib/badline/drives/model1581/wd1772/sector_writes.rb +75 -0
- data/lib/badline/drives/model1581/wd1772/sectors.rb +152 -0
- data/lib/badline/drives/model1581/wd1772/stepping.rb +111 -0
- data/lib/badline/drives/model1581/wd1772/tracks.rb +127 -0
- data/lib/badline/drives/model1581/wd1772/turn.rb +75 -0
- data/lib/badline/drives/model1581/wd1772.rb +218 -0
- data/lib/badline/drives/model1581.rb +206 -0
- data/lib/badline/drives/serial_bus.rb +161 -0
- data/lib/badline/frontend/boot.rb +10 -61
- data/lib/badline/frontend/machine_window.rb +3 -1
- data/lib/badline/frontend/player/filter_view.rb +1 -1
- data/lib/badline/frontend/player/player_controller.rb +2 -2
- data/lib/badline/frontend/player/player_screen.rb +1 -0
- data/lib/badline/frontend/player/theme.rb +7 -7
- data/lib/badline/frontend/timeline.rb +3 -3
- data/lib/badline/input/control_ports.rb +78 -0
- data/lib/badline/input/joystick.rb +27 -0
- data/lib/badline/input/keyboard.rb +114 -0
- data/lib/badline/input.rb +3 -0
- data/lib/badline/kernal_trap/{drive → dos}/block_commands.rb +1 -1
- data/lib/badline/kernal_trap/dos/channel.rb +183 -0
- data/lib/badline/kernal_trap/{drive → dos}/channels.rb +1 -1
- data/lib/badline/kernal_trap/{drive → dos}/memory.rb +1 -1
- data/lib/badline/kernal_trap/{drive → dos}/parameters.rb +1 -1
- data/lib/badline/kernal_trap/{drive → dos}/status.rb +1 -1
- data/lib/badline/kernal_trap/{drive → dos}/write_file.rb +1 -1
- data/lib/badline/kernal_trap/{drive → dos}/writes.rb +1 -1
- data/lib/badline/kernal_trap/{drive.rb → dos.rb} +11 -10
- data/lib/badline/kernal_trap/{file.rb → file_routine.rb} +1 -1
- data/lib/badline/kernal_trap/load.rb +6 -6
- data/lib/badline/kernal_trap/save.rb +5 -5
- data/lib/badline/kernal_trap/serial.rb +7 -7
- data/lib/badline/kernal_trap.rb +2 -3
- data/lib/badline/machine/clocking.rb +50 -0
- data/lib/badline/machine.rb +63 -7
- data/lib/badline/media/boot_disk.rb +2 -2
- data/lib/badline/media/disk_list.rb +3 -3
- data/lib/badline/media/disk_set.rb +1 -1
- data/lib/badline/media/extensions.rb +33 -0
- data/lib/badline/media/program.rb +28 -0
- data/lib/badline/media/true_drive.rb +4 -3
- data/lib/badline/media/tune.rb +35 -0
- data/lib/badline/media/vic20_cartridge.rb +1 -7
- data/lib/badline/media/vic20_media.rb +38 -80
- data/lib/badline/media.rb +84 -81
- data/lib/badline/model.rb +1 -1
- data/lib/badline/options/event.rb +3 -1
- data/lib/badline/roms/README +6 -6
- data/lib/badline/sdl.rb +1 -0
- data/lib/badline/{storage/sid_file.rb → sid_tune/file.rb} +3 -3
- data/lib/badline/{storage → sid_tune}/hvsc.rb +7 -7
- data/lib/badline/{storage → sid_tune}/song_lengths.rb +2 -2
- data/lib/badline/{storage → sid_tune}/stil/credit.rb +1 -1
- data/lib/badline/{storage → sid_tune}/stil.rb +3 -3
- data/lib/badline/sid_tune.rb +6 -0
- data/lib/badline/snapshot/c128_setup.rb +43 -0
- data/lib/badline/snapshot/c64_setup.rb +79 -0
- data/lib/badline/snapshot/image.rb +5 -25
- data/lib/badline/snapshot/machine_state.rb +10 -2
- data/lib/badline/snapshot/setup.rb +22 -66
- data/lib/badline/snapshot/state.rb +8 -17
- data/lib/badline/snapshot/storage_setup.rb +68 -0
- data/lib/badline/snapshot/vic20_setup.rb +37 -0
- data/lib/badline/snapshot/vice/c64_mem.rb +1 -1
- data/lib/badline/snapshot/vice/restore.rb +1 -1
- data/lib/badline/snapshot/vice/reu1764.rb +1 -1
- data/lib/badline/snapshot/vice/reu_fields.rb +40 -0
- data/lib/badline/snapshot/vice.rb +7 -5
- data/lib/badline/snapshot.rb +13 -12
- data/lib/badline/storage/d64_image.rb +15 -9
- data/lib/badline/storage/d71_image.rb +0 -2
- data/lib/badline/storage/d81_image.rb +0 -2
- data/lib/badline/storage/disk_image/writing.rb +2 -2
- data/lib/badline/storage/disk_image.rb +3 -6
- data/lib/badline/storage/g64_image.rb +2 -2
- data/lib/badline/storage/host_directory.rb +0 -5
- data/lib/badline/storage/t64.rb +2 -8
- data/lib/badline/storage/unavailable.rb +1 -1
- data/lib/badline/storage.rb +0 -37
- data/lib/badline/support/c128_checkpoint.rb +39 -0
- data/lib/badline/support/checkpoint.rb +108 -0
- data/lib/badline/support/vic20_checkpoint.rb +38 -0
- data/lib/badline/support.rb +5 -0
- data/lib/badline/version.rb +1 -1
- data/lib/badline/vic20/attachments.rb +11 -81
- data/lib/badline/vic20/bus/saved_state.rb +35 -0
- data/lib/badline/vic20/bus.rb +3 -25
- data/lib/badline/vic20/cpu.rb +1 -1
- data/lib/badline/vic20/port_wiring.rb +4 -4
- data/lib/badline/vic20/saved_state.rb +16 -60
- data/lib/badline/vic20/user_via_ports.rb +2 -2
- data/lib/badline/vic20.rb +20 -51
- metadata +250 -221
- data/lib/badline/address_bus/extra_sids.rb +0 -30
- data/lib/badline/address_bus/fittings.rb +0 -38
- data/lib/badline/address_bus/pla.rb +0 -147
- data/lib/badline/address_bus/roms.rb +0 -39
- data/lib/badline/address_bus/saved_state.rb +0 -72
- data/lib/badline/address_bus/sid_slots.rb +0 -42
- data/lib/badline/address_bus.rb +0 -235
- data/lib/badline/cartridge/action_replay.rb +0 -126
- data/lib/badline/cartridge/atomic_power.rb +0 -24
- data/lib/badline/cartridge/bank.rb +0 -81
- data/lib/badline/cartridge/comal80.rb +0 -50
- data/lib/badline/cartridge/dinamic.rb +0 -34
- data/lib/badline/cartridge/easy_flash.rb +0 -145
- data/lib/badline/cartridge/epyx_fastload.rb +0 -79
- data/lib/badline/cartridge/final_cartridge3.rb +0 -89
- data/lib/badline/cartridge/flash.rb +0 -306
- data/lib/badline/cartridge/freezer.rb +0 -33
- data/lib/badline/cartridge/fun_play.rb +0 -38
- data/lib/badline/cartridge/g_mod2.rb +0 -74
- data/lib/badline/cartridge/game_system.rb +0 -40
- data/lib/badline/cartridge/geo_ram.rb +0 -79
- data/lib/badline/cartridge/kcs_power.rb +0 -75
- data/lib/badline/cartridge/mach5.rb +0 -32
- data/lib/badline/cartridge/magic_desk.rb +0 -30
- data/lib/badline/cartridge/ocean.rb +0 -35
- data/lib/badline/cartridge/pagefox.rb +0 -68
- data/lib/badline/cartridge/retro_replay.rb +0 -320
- data/lib/badline/cartridge/rex_utility.rb +0 -29
- data/lib/badline/cartridge/rgcd.rb +0 -58
- data/lib/badline/cartridge/simons_basic.rb +0 -35
- data/lib/badline/cartridge/standard.rb +0 -15
- data/lib/badline/cartridge/super_games.rb +0 -48
- data/lib/badline/cartridge/westermann.rb +0 -30
- data/lib/badline/cartridge/zaxxon.rb +0 -66
- data/lib/badline/cartridge.rb +0 -303
- data/lib/badline/checkpoint.rb +0 -98
- data/lib/badline/cia/fast_forward.rb +0 -60
- data/lib/badline/cia/interrupt_register.rb +0 -143
- data/lib/badline/cia/serial.rb +0 -275
- data/lib/badline/cia/state.rb +0 -47
- data/lib/badline/cia/timer.rb +0 -206
- data/lib/badline/cia.rb +0 -279
- data/lib/badline/color_memory.rb +0 -25
- data/lib/badline/computer/kernal_traps.rb +0 -29
- data/lib/badline/control_ports.rb +0 -76
- data/lib/badline/cpu/addressing.rb +0 -131
- data/lib/badline/cpu/boundary.rb +0 -54
- data/lib/badline/cpu/core.rb +0 -165
- data/lib/badline/cpu/microcode.rb +0 -177
- data/lib/badline/cpu/operations.rb +0 -88
- data/lib/badline/cpu/saved_state.rb +0 -115
- data/lib/badline/cpu/stack_operations.rb +0 -82
- data/lib/badline/cpu.rb +0 -10
- data/lib/badline/cycleable.rb +0 -38
- data/lib/badline/datasette.rb +0 -161
- data/lib/badline/drive/core.rb +0 -147
- data/lib/badline/drive/fast_serial.rb +0 -73
- data/lib/badline/drive/idle.rb +0 -125
- data/lib/badline/drive/idle_cpu.rb +0 -28
- data/lib/badline/drive/orbit.rb +0 -79
- data/lib/badline/drive/serial_lines.rb +0 -73
- data/lib/badline/drive/sleep.rb +0 -112
- data/lib/badline/drive/vias.rb +0 -84
- data/lib/badline/drive/watch.rb +0 -150
- data/lib/badline/drive.rb +0 -11
- data/lib/badline/drive1541/bus.rb +0 -86
- data/lib/badline/drive1541/byte_ready.rb +0 -48
- data/lib/badline/drive1541/cpu.rb +0 -11
- data/lib/badline/drive1541/disk.rb +0 -318
- data/lib/badline/drive1541/disk_state.rb +0 -94
- data/lib/badline/drive1541/disk_via.rb +0 -36
- data/lib/badline/drive1541/gcr.rb +0 -57
- data/lib/badline/drive1541/mechanism.rb +0 -313
- data/lib/badline/drive1541/mechanism_state.rb +0 -68
- data/lib/badline/drive1541/rotation.rb +0 -121
- data/lib/badline/drive1541/sector_reader.rb +0 -76
- data/lib/badline/drive1541/serial_port.rb +0 -18
- data/lib/badline/drive1541/track.rb +0 -98
- data/lib/badline/drive1541.rb +0 -111
- data/lib/badline/drive1571/bus.rb +0 -111
- data/lib/badline/drive1571/cpu.rb +0 -11
- data/lib/badline/drive1571/serial_port.rb +0 -37
- data/lib/badline/drive1571/serial_via.rb +0 -25
- data/lib/badline/drive1571/wd1770.rb +0 -120
- data/lib/badline/drive1571.rb +0 -175
- data/lib/badline/drive1581/bus.rb +0 -137
- data/lib/badline/drive1581/cpu.rb +0 -11
- data/lib/badline/drive1581/disk.rb +0 -135
- data/lib/badline/drive1581/disk_state.rb +0 -87
- data/lib/badline/drive1581/mechanism.rb +0 -117
- data/lib/badline/drive1581/serial_port.rb +0 -52
- data/lib/badline/drive1581/slot.rb +0 -78
- data/lib/badline/drive1581/track.rb +0 -100
- data/lib/badline/drive1581/track_bytes.rb +0 -75
- data/lib/badline/drive1581/wd1772/registers.rb +0 -89
- data/lib/badline/drive1581/wd1772/sector_writes.rb +0 -73
- data/lib/badline/drive1581/wd1772/sectors.rb +0 -150
- data/lib/badline/drive1581/wd1772/state.rb +0 -66
- data/lib/badline/drive1581/wd1772/stepping.rb +0 -109
- data/lib/badline/drive1581/wd1772/tracks.rb +0 -125
- data/lib/badline/drive1581/wd1772/turn.rb +0 -73
- data/lib/badline/drive1581/wd1772.rb +0 -216
- data/lib/badline/drive1581.rb +0 -233
- data/lib/badline/iec_bus.rb +0 -159
- data/lib/badline/instruction.rb +0 -334
- data/lib/badline/instruction_set/arithmetic.rb +0 -114
- data/lib/badline/instruction_set/bitwise.rb +0 -126
- data/lib/badline/instruction_set/branch.rb +0 -79
- data/lib/badline/instruction_set/flag.rb +0 -63
- data/lib/badline/instruction_set/illegal.rb +0 -270
- data/lib/badline/instruction_set/inc_dec.rb +0 -69
- data/lib/badline/instruction_set/stack.rb +0 -52
- data/lib/badline/instruction_set/transfer.rb +0 -137
- data/lib/badline/instruction_set.rb +0 -55
- data/lib/badline/interrupts.rb +0 -104
- data/lib/badline/joystick.rb +0 -25
- data/lib/badline/kernal_trap/channel.rb +0 -181
- data/lib/badline/keyboard.rb +0 -112
- data/lib/badline/ram_expansion/banking.rb +0 -30
- data/lib/badline/ram_expansion/plus256k.rb +0 -54
- data/lib/badline/ram_expansion/plus60k.rb +0 -43
- data/lib/badline/ram_expansion/unexpanded.rb +0 -28
- data/lib/badline/ram_expansion.rb +0 -21
- data/lib/badline/reu/dma/saved_state.rb +0 -50
- data/lib/badline/reu/dma.rb +0 -273
- data/lib/badline/reu/ram.rb +0 -107
- data/lib/badline/reu/saved_state.rb +0 -80
- data/lib/badline/reu/trigger.rb +0 -32
- data/lib/badline/reu.rb +0 -289
- data/lib/badline/sid/catch_up.rb +0 -120
- data/lib/badline/sid/decimator.rb +0 -64
- data/lib/badline/sid/envelope/state.rb +0 -68
- data/lib/badline/sid/envelope.rb +0 -239
- data/lib/badline/sid/filter.rb +0 -263
- data/lib/badline/sid/voice.rb +0 -77
- data/lib/badline/sid/waveform/combined.rb +0 -126
- data/lib/badline/sid/waveform/fast_forward.rb +0 -105
- data/lib/badline/sid/waveform/noise_writeback.rb +0 -122
- data/lib/badline/sid/waveform/state.rb +0 -66
- data/lib/badline/sid/waveform.rb +0 -305
- data/lib/badline/sid.rb +0 -303
- data/lib/badline/time_of_day.rb +0 -228
- data/lib/badline/traps.rb +0 -19
- data/lib/badline/via/control_lines.rb +0 -122
- data/lib/badline/via/fast_forward.rb +0 -53
- data/lib/badline/via/interrupt_register.rb +0 -67
- data/lib/badline/via/shift_register.rb +0 -180
- data/lib/badline/via/state.rb +0 -42
- data/lib/badline/via/timer1.rb +0 -131
- data/lib/badline/via/timer2.rb +0 -133
- data/lib/badline/via.rb +0 -266
- data/lib/badline/vic/bank.rb +0 -133
- data/lib/badline/vic/border_mask.rb +0 -86
- data/lib/badline/vic/collisions.rb +0 -115
- data/lib/badline/vic/color_patches.rb +0 -47
- data/lib/badline/vic/display_state.rb +0 -185
- data/lib/badline/vic/graphics_mode.rb +0 -164
- data/lib/badline/vic/graphics_shifter.rb +0 -207
- data/lib/badline/vic/register_log.rb +0 -81
- data/lib/badline/vic/registers.rb +0 -195
- data/lib/badline/vic/sequencer.rb +0 -275
- data/lib/badline/vic/sequencer_output.rb +0 -116
- data/lib/badline/vic/sequencer_state.rb +0 -89
- data/lib/badline/vic/sprite/internal_bus.rb +0 -68
- data/lib/badline/vic/sprite/saved_state.rb +0 -64
- data/lib/badline/vic/sprite/shifter.rb +0 -146
- data/lib/badline/vic/sprite/timing.rb +0 -56
- data/lib/badline/vic/sprite.rb +0 -337
- data/lib/badline/vic/sprites.rb +0 -282
- data/lib/badline/vic/sprites_state.rb +0 -57
- data/lib/badline/vic.rb +0 -852
- data/lib/badline/vic20/sound/output.rb +0 -83
- data/lib/badline/vic20/sound.rb +0 -233
- data/lib/badline/z80/arithmetic.rb +0 -117
- data/lib/badline/z80/bit_page.rb +0 -55
- data/lib/badline/z80/block_io.rb +0 -58
- data/lib/badline/z80/block_transfers.rb +0 -59
- data/lib/badline/z80/bus_cycles.rb +0 -111
- data/lib/badline/z80/core.rb +0 -113
- data/lib/badline/z80/exchanges.rb +0 -50
- data/lib/badline/z80/extended_page.rb +0 -89
- data/lib/badline/z80/flags.rb +0 -37
- data/lib/badline/z80/interrupt_acceptance.rb +0 -46
- data/lib/badline/z80/jumps.rb +0 -82
- data/lib/badline/z80/loads.rb +0 -98
- data/lib/badline/z80/main_page.rb +0 -134
- data/lib/badline/z80/registers.rb +0 -120
- data/lib/badline/z80/saved_state.rb +0 -69
- data/lib/badline/z80/shifts.rb +0 -64
- data/lib/badline/z80.rb +0 -11
- /data/lib/badline/snapshot/{fields.rb → vice/fields.rb} +0 -0
data/lib/badline/reu.rb
DELETED
|
@@ -1,289 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "badline/reu/ram"
|
|
4
|
-
require "badline/reu/dma"
|
|
5
|
-
require "badline/reu/trigger"
|
|
6
|
-
require "badline/reu/saved_state"
|
|
7
|
-
|
|
8
|
-
module Badline
|
|
9
|
-
# A RAM Expansion Unit: the Commodore 1700 (128K), 1764 (256K) and 1750
|
|
10
|
-
# (512K), and the bigger units built around the same 8726 RAM Expansion
|
|
11
|
-
# Controller (REC), such as the CMD 1750XL, up to 16M.
|
|
12
|
-
#
|
|
13
|
-
# The REC's eleven registers sit in I/O 2 from $DF00, repeated every 32
|
|
14
|
-
# bytes up to $DFFF, as the 1764 and 1750 manuals map them. It moves
|
|
15
|
-
# bytes between the C64 and its RAM by DMA, one bus cycle each, with the
|
|
16
|
-
# CPU held off the bus. A command with the execute bit set starts a
|
|
17
|
-
# transfer, or with bit 4 clear arms the REC to start one on the next
|
|
18
|
-
# write to $FF00, so a program can bank the ROMs out first. A transfer
|
|
19
|
-
# waits for the CPU's next read cycle with BA high, and Computer then
|
|
20
|
-
# clocks it through #dma_cycle! until it hands the bus back.
|
|
21
|
-
class REU
|
|
22
|
-
include SavedState
|
|
23
|
-
|
|
24
|
-
SIZES_KB = [128, 256, 512, 1024, 2048, 4096, 8192, 16_384].freeze
|
|
25
|
-
|
|
26
|
-
# The registers, by offset.
|
|
27
|
-
STATUS = 0x00
|
|
28
|
-
COMMAND = 0x01
|
|
29
|
-
C64_LOW = 0x02
|
|
30
|
-
C64_HIGH = 0x03
|
|
31
|
-
EXPANSION_LOW = 0x04
|
|
32
|
-
EXPANSION_HIGH = 0x05
|
|
33
|
-
EXPANSION_BANK = 0x06
|
|
34
|
-
LENGTH_LOW = 0x07
|
|
35
|
-
LENGTH_HIGH = 0x08
|
|
36
|
-
INTERRUPT_MASK = 0x09
|
|
37
|
-
ADDRESS_CONTROL = 0x0a
|
|
38
|
-
|
|
39
|
-
# Status: an interrupt is pending, the block ended, a verify found a
|
|
40
|
-
# difference (the manual's fault bit), and the unit is built from 256K
|
|
41
|
-
# chips, which only the 1700 isn't. Reading the status clears the top
|
|
42
|
-
# three.
|
|
43
|
-
INTERRUPT_PENDING = 0x80
|
|
44
|
-
END_OF_BLOCK = 0x40
|
|
45
|
-
FAULT = 0x20
|
|
46
|
-
CHIPS_256K = 0x10
|
|
47
|
-
|
|
48
|
-
# Command: execute, reload the registers after the transfer, don't wait
|
|
49
|
-
# for $FF00, and the transfer type in the bottom two bits.
|
|
50
|
-
EXECUTE = 0x80
|
|
51
|
-
AUTOLOAD = 0x20
|
|
52
|
-
NO_FF00_TRIGGER = 0x10
|
|
53
|
-
TRANSFER_TYPE = 0x03
|
|
54
|
-
|
|
55
|
-
# Interrupt mask: interrupts on at all, then on the end of a block and
|
|
56
|
-
# on a fault. The low five bits aren't there and read as 1.
|
|
57
|
-
INTERRUPTS_ON = 0x80
|
|
58
|
-
INTERRUPT_ON_END = 0x40
|
|
59
|
-
INTERRUPT_ON_FAULT = 0x20
|
|
60
|
-
|
|
61
|
-
# Address control: hold the C64 address or the expansion address where
|
|
62
|
-
# it is. The low six bits aren't there and read as 1.
|
|
63
|
-
FIX_C64 = 0x80
|
|
64
|
-
FIX_EXPANSION = 0x40
|
|
65
|
-
|
|
66
|
-
# The REC's bank register has three bits, and the other five read as
|
|
67
|
-
# 1. A unit past 512K latches all eight onto its own address lines.
|
|
68
|
-
BANK_STUCK = 0xf8
|
|
69
|
-
|
|
70
|
-
attr_reader :trigger
|
|
71
|
-
|
|
72
|
-
# bus is the bus the REC reaches C64 memory through, and vic the VIC,
|
|
73
|
-
# whose phi1 fetch is what a register read finds on the bus during a
|
|
74
|
-
# transfer.
|
|
75
|
-
def initialize(size_kb, bus:, vic:)
|
|
76
|
-
raise ArgumentError, "No #{size_kb}K REU. Pick one of #{SIZES_KB.join(', ')}." unless SIZES_KB.include?(size_kb)
|
|
77
|
-
|
|
78
|
-
# The 1700's REC counts 17 address bits, the others' 19.
|
|
79
|
-
span = size_kb == 128 ? 0x20000 : 0x80000
|
|
80
|
-
@size_kb = size_kb
|
|
81
|
-
size = size_kb * 1024
|
|
82
|
-
@address_mask = [size, span].max - 1
|
|
83
|
-
@bank_bits = size > span ? 0xff : 0x07
|
|
84
|
-
@chips = size_kb == 128 ? 0 : CHIPS_256K
|
|
85
|
-
@ram = RAM.new(size, span)
|
|
86
|
-
@dma = DMA.new(@ram, span, bus)
|
|
87
|
-
@trigger = Trigger.new(self)
|
|
88
|
-
@vic = vic
|
|
89
|
-
@on_irq_change = nil
|
|
90
|
-
@on_dma = nil
|
|
91
|
-
@irq = false
|
|
92
|
-
reset!
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
def on_irq_change(&block)
|
|
96
|
-
@on_irq_change = block
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
# Called when the REC asks for the bus.
|
|
100
|
-
def on_dma(&block)
|
|
101
|
-
@on_dma = block
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
def irq? = @irq
|
|
105
|
-
|
|
106
|
-
# From the moment the REC asks for the bus until it hands it back.
|
|
107
|
-
def dma? = @requested || @running
|
|
108
|
-
|
|
109
|
-
# Whether the REC ran a transfer on the last cycle clocked, which it
|
|
110
|
-
# goes on doing until the cycle it lets go of the bus.
|
|
111
|
-
def holds_bus? = @running
|
|
112
|
-
|
|
113
|
-
def reset!
|
|
114
|
-
@status = @chips
|
|
115
|
-
@command = NO_FF00_TRIGGER
|
|
116
|
-
@c64 = @c64_start = 0
|
|
117
|
-
@expansion = @expansion_start = 0
|
|
118
|
-
@bank = @bank_start = 0
|
|
119
|
-
@length = @length_start = 0xffff
|
|
120
|
-
@interrupt_mask = 0x1f
|
|
121
|
-
@address_control = 0x3f
|
|
122
|
-
@armed = @requested = @running = @ba_was_low = false
|
|
123
|
-
interrupt(false)
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
def peek(addr)
|
|
127
|
-
return @vic.phi1_data if @running
|
|
128
|
-
|
|
129
|
-
register = addr & 0x1f
|
|
130
|
-
value = register_value(register)
|
|
131
|
-
read_status if register == STATUS
|
|
132
|
-
value
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
def poke(addr, value)
|
|
136
|
-
return if @running
|
|
137
|
-
|
|
138
|
-
register = addr & 0x1f
|
|
139
|
-
case register
|
|
140
|
-
when COMMAND then write_command(value)
|
|
141
|
-
when C64_LOW, C64_HIGH then @c64 = @c64_start = with_byte(@c64_start, value, register == C64_HIGH)
|
|
142
|
-
when EXPANSION_LOW, EXPANSION_HIGH
|
|
143
|
-
@expansion = @expansion_start = with_byte(@expansion_start, value, register == EXPANSION_HIGH)
|
|
144
|
-
when EXPANSION_BANK then @bank = @bank_start = value & @bank_bits
|
|
145
|
-
when LENGTH_LOW, LENGTH_HIGH
|
|
146
|
-
@length = @length_start = with_byte(@length_start, value, register == LENGTH_HIGH)
|
|
147
|
-
when INTERRUPT_MASK then write_interrupt_mask(value)
|
|
148
|
-
when ADDRESS_CONTROL then @address_control = value | 0x3f
|
|
149
|
-
end
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
# A write to $FF00 starts the transfer the command register armed.
|
|
153
|
-
def ff00_written
|
|
154
|
-
return unless @armed
|
|
155
|
-
|
|
156
|
-
@armed = false
|
|
157
|
-
request_bus
|
|
158
|
-
end
|
|
159
|
-
|
|
160
|
-
# Clocks the REC for a cycle, given the VIC's BA line. A requested
|
|
161
|
-
# transfer starts on the first cycle with BA high as the REC sees it,
|
|
162
|
-
# even one the CPU writes on. Pinned by REU/rmw-trigger. A fetch
|
|
163
|
-
# requested on the cycle before BA falls writes its first byte on the
|
|
164
|
-
# first BA-low cycle as well, and again when it starts. Pinned by
|
|
165
|
-
# REU/badoublewrite.
|
|
166
|
-
def dma_cycle!(ba_low)
|
|
167
|
-
late = ba_low && @vic.reu_ba_late?
|
|
168
|
-
if @requested
|
|
169
|
-
return hold_off if ba_low && !late
|
|
170
|
-
|
|
171
|
-
start_transfer
|
|
172
|
-
end
|
|
173
|
-
@dma.cycle!(ba_low, late, ba_low && @vic.reu_ba_handed_on?)
|
|
174
|
-
end_transfer unless @dma.holds_bus?
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
# The REU's RAM, at an address as the REC's registers give it.
|
|
178
|
-
def ram_peek(addr) = @ram.peek(addr)
|
|
179
|
-
|
|
180
|
-
def ram_poke(addr, value) = @ram.poke(addr, value)
|
|
181
|
-
|
|
182
|
-
private
|
|
183
|
-
|
|
184
|
-
def register_value(register)
|
|
185
|
-
case register
|
|
186
|
-
when STATUS then @status
|
|
187
|
-
when COMMAND then @command
|
|
188
|
-
when C64_LOW then @c64 & 0xff
|
|
189
|
-
when C64_HIGH then @c64 >> 8
|
|
190
|
-
when EXPANSION_LOW then @expansion & 0xff
|
|
191
|
-
when EXPANSION_HIGH then @expansion >> 8
|
|
192
|
-
when EXPANSION_BANK then @bank | BANK_STUCK
|
|
193
|
-
when LENGTH_LOW then @length & 0xff
|
|
194
|
-
when LENGTH_HIGH then @length >> 8
|
|
195
|
-
when INTERRUPT_MASK then @interrupt_mask
|
|
196
|
-
when ADDRESS_CONTROL then @address_control
|
|
197
|
-
else 0xff
|
|
198
|
-
end
|
|
199
|
-
end
|
|
200
|
-
|
|
201
|
-
def read_status
|
|
202
|
-
@status &= CHIPS_256K
|
|
203
|
-
interrupt(false)
|
|
204
|
-
end
|
|
205
|
-
|
|
206
|
-
# Writing either byte of an address or the length sets the value the
|
|
207
|
-
# transfer starts from, and puts the counter back to it.
|
|
208
|
-
def with_byte(word, value, high)
|
|
209
|
-
high ? (word & 0x00ff) | (value << 8) : (word & 0xff00) | value
|
|
210
|
-
end
|
|
211
|
-
|
|
212
|
-
def write_command(value)
|
|
213
|
-
@command = value
|
|
214
|
-
return if value.nobits?(EXECUTE)
|
|
215
|
-
|
|
216
|
-
@armed = value.nobits?(NO_FF00_TRIGGER)
|
|
217
|
-
request_bus unless @armed
|
|
218
|
-
end
|
|
219
|
-
|
|
220
|
-
# An interrupt enabled over a block that already ended, or a fault
|
|
221
|
-
# already found, fires at once.
|
|
222
|
-
def write_interrupt_mask(value)
|
|
223
|
-
@interrupt_mask = value | 0x1f
|
|
224
|
-
interrupt_on(@status)
|
|
225
|
-
end
|
|
226
|
-
|
|
227
|
-
def interrupt_on(events)
|
|
228
|
-
return unless @interrupt_mask.anybits?(INTERRUPTS_ON)
|
|
229
|
-
return unless (events.anybits?(END_OF_BLOCK) && @interrupt_mask.anybits?(INTERRUPT_ON_END)) ||
|
|
230
|
-
(events.anybits?(FAULT) && @interrupt_mask.anybits?(INTERRUPT_ON_FAULT))
|
|
231
|
-
|
|
232
|
-
@status |= INTERRUPT_PENDING
|
|
233
|
-
interrupt(true)
|
|
234
|
-
end
|
|
235
|
-
|
|
236
|
-
def interrupt(level)
|
|
237
|
-
return if @irq == level
|
|
238
|
-
|
|
239
|
-
@irq = level
|
|
240
|
-
@on_irq_change&.call(level)
|
|
241
|
-
end
|
|
242
|
-
|
|
243
|
-
def request_bus
|
|
244
|
-
@requested = true
|
|
245
|
-
@ba_was_low = @vic.ba_low?
|
|
246
|
-
@on_dma&.call
|
|
247
|
-
end
|
|
248
|
-
|
|
249
|
-
def hold_off
|
|
250
|
-
@dma.write_ahead(@command & TRANSFER_TYPE, @c64, @expansion | (@bank << 16)) unless @ba_was_low
|
|
251
|
-
@ba_was_low = true
|
|
252
|
-
end
|
|
253
|
-
|
|
254
|
-
def start_transfer
|
|
255
|
-
@requested = false
|
|
256
|
-
@running = true
|
|
257
|
-
@dma.start(@command & TRANSFER_TYPE, @c64, @expansion | (@bank << 16), @length, @address_control)
|
|
258
|
-
end
|
|
259
|
-
|
|
260
|
-
# The execute bit drops and the $FF00 trigger turns off. With autoload
|
|
261
|
-
# the addresses and the length go back to where the transfer started,
|
|
262
|
-
# and otherwise they stay where it stopped.
|
|
263
|
-
def end_transfer
|
|
264
|
-
@running = false
|
|
265
|
-
@command = (@command & ~EXECUTE & 0xff) | NO_FF00_TRIGGER
|
|
266
|
-
events = @dma.events
|
|
267
|
-
@status |= events
|
|
268
|
-
@command.anybits?(AUTOLOAD) ? reload : keep_counters
|
|
269
|
-
interrupt_on(events)
|
|
270
|
-
end
|
|
271
|
-
|
|
272
|
-
def reload
|
|
273
|
-
@c64 = @c64_start
|
|
274
|
-
@expansion = @expansion_start
|
|
275
|
-
@bank = @bank_start
|
|
276
|
-
@length = @length_start
|
|
277
|
-
end
|
|
278
|
-
|
|
279
|
-
def keep_counters
|
|
280
|
-
@c64 = @dma.c64 if @address_control.nobits?(FIX_C64)
|
|
281
|
-
@length = @dma.length & 0xffff
|
|
282
|
-
return if @address_control.anybits?(FIX_EXPANSION)
|
|
283
|
-
|
|
284
|
-
address = @dma.expansion & @address_mask
|
|
285
|
-
@expansion = address & 0xffff
|
|
286
|
-
@bank = (address >> 16) & 0xff
|
|
287
|
-
end
|
|
288
|
-
end
|
|
289
|
-
end
|
data/lib/badline/sid/catch_up.rb
DELETED
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Badline
|
|
4
|
-
class SID
|
|
5
|
-
# Running the DSP over the cycles that have passed since it last caught
|
|
6
|
-
# up, in spans that fast-forward the voices and end on a whole cycle.
|
|
7
|
-
module CatchUp
|
|
8
|
-
private
|
|
9
|
-
|
|
10
|
-
# Runs the cycles that have passed, landing each queued write on the
|
|
11
|
-
# cycle the CPU wrote it on.
|
|
12
|
-
def catch_up
|
|
13
|
-
replayed = 0
|
|
14
|
-
i = 0
|
|
15
|
-
while i < @deferred_writes.length
|
|
16
|
-
cycle = @deferred_writes[i]
|
|
17
|
-
run(cycle - replayed)
|
|
18
|
-
replayed = cycle
|
|
19
|
-
apply_write(@deferred_writes[i + 1], @deferred_writes[i + 2])
|
|
20
|
-
i += 3
|
|
21
|
-
end
|
|
22
|
-
run(@pending_cycles - replayed)
|
|
23
|
-
@deferred_writes.clear
|
|
24
|
-
@pending_cycles = 0
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def run(cycles)
|
|
28
|
-
while cycles != 0
|
|
29
|
-
span = span(cycles)
|
|
30
|
-
fast_forward(span - 1) if span > 1
|
|
31
|
-
clock!(span)
|
|
32
|
-
cycles -= span
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
# The longest stretch that can be fast-forwarded. A combined waveform
|
|
37
|
-
# feeding back into its own oscillator steps cycle by cycle, and a span
|
|
38
|
-
# never runs past an MSB rise that hard-syncs the next voice, so both
|
|
39
|
-
# land on a whole cycle.
|
|
40
|
-
def span(cycles)
|
|
41
|
-
return 1 if @stepped
|
|
42
|
-
|
|
43
|
-
span = @synthesizing ? synthesis_span(cycles) : cycles
|
|
44
|
-
return span unless @synced
|
|
45
|
-
|
|
46
|
-
span = sync_span(@waveform1, span)
|
|
47
|
-
span = sync_span(@waveform2, span)
|
|
48
|
-
sync_span(@waveform3, span)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
# The filter steps at most @filter_chunk cycles at a time, and never
|
|
52
|
-
# across the end of a recorded sample.
|
|
53
|
-
def synthesis_span(cycles)
|
|
54
|
-
span = [cycles, @filter_chunk].min
|
|
55
|
-
return span unless @decimator
|
|
56
|
-
|
|
57
|
-
[@decimator.cycles_to_close, span].min
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
# Whether a span has to step, or watch for hard sync, only changes with
|
|
61
|
-
# a voice's control register.
|
|
62
|
-
def update_span_rules
|
|
63
|
-
@stepped = @voices.any? { |voice| voice.waveform.stepped?(@synthesizing) }
|
|
64
|
-
@synced = @voices.any? { |voice| voice.waveform.sync? }
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
def sync_span(waveform, span)
|
|
68
|
-
return span unless waveform.sync_dest.sync?
|
|
69
|
-
|
|
70
|
-
rise = waveform.cycles_to_msb_rise
|
|
71
|
-
rise && rise < span ? rise : span
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
# Unrolled over the three voices: the per-cycle block calls cost
|
|
75
|
-
# measurably on the synthesis path.
|
|
76
|
-
def fast_forward(cycles)
|
|
77
|
-
@voice1.fast_forward(cycles)
|
|
78
|
-
@voice2.fast_forward(cycles)
|
|
79
|
-
@voice3.fast_forward(cycles)
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
# The last cycle of a span, run whole. The filter integrates the span
|
|
83
|
-
# from the voices' output at its end.
|
|
84
|
-
def clock!(span)
|
|
85
|
-
@voice1.cycle!
|
|
86
|
-
@voice2.cycle!
|
|
87
|
-
@voice3.cycle!
|
|
88
|
-
@waveform1.synchronize!
|
|
89
|
-
@waveform2.synchronize!
|
|
90
|
-
@waveform3.synchronize!
|
|
91
|
-
return unless @synthesizing
|
|
92
|
-
|
|
93
|
-
@filter.cycle!(@voices, span)
|
|
94
|
-
record_sample(span) if @decimator
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
def record_sample(span)
|
|
98
|
-
sample = @decimator.push(current_sample, span)
|
|
99
|
-
return unless sample
|
|
100
|
-
|
|
101
|
-
@samples << sample
|
|
102
|
-
record_voices if @voice_samples
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
def record_voices
|
|
106
|
-
voice_samples = @voice_samples
|
|
107
|
-
voice_samples << (@voice1.output >> 7)
|
|
108
|
-
voice_samples << (@voice2.output >> 7)
|
|
109
|
-
voice_samples << (@voice3.output >> 7)
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
def current_sample
|
|
113
|
-
sample = @filter.output / SAMPLE_DIVISOR
|
|
114
|
-
return sample unless sample < -0x8000 || sample > 0x7fff
|
|
115
|
-
|
|
116
|
-
sample.clamp(-0x8000, 0x7fff)
|
|
117
|
-
end
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
end
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Badline
|
|
4
|
-
class SID
|
|
5
|
-
# Reduces the SID's one-sample-per-cycle stream to an audio rate by
|
|
6
|
-
# averaging each window. Point sampling would be cheaper, but the pulse
|
|
7
|
-
# and noise waveforms carry enough energy above the output Nyquist to
|
|
8
|
-
# alias audibly.
|
|
9
|
-
#
|
|
10
|
-
# A sample can stand for several cycles at once, when the DSP has run
|
|
11
|
-
# them as one step.
|
|
12
|
-
class Decimator
|
|
13
|
-
def initialize(clock_hz:, rate:)
|
|
14
|
-
@clock_hz = clock_hz
|
|
15
|
-
@rate = rate
|
|
16
|
-
@phase = 0
|
|
17
|
-
@sum = 0
|
|
18
|
-
@count = 0
|
|
19
|
-
@cycles_to_close = window_cycles
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
# Cycles until the current window closes, counting the next one as 1.
|
|
23
|
-
attr_reader :cycles_to_close
|
|
24
|
-
|
|
25
|
-
# How far the current window has got. The clock and the rate are the
|
|
26
|
-
# host's.
|
|
27
|
-
def save_state(out)
|
|
28
|
-
out.int(@phase).int(@sum).int(@count).int(@cycles_to_close)
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def load_state(input)
|
|
32
|
-
@phase = input.int
|
|
33
|
-
@sum = input.int
|
|
34
|
-
@count = input.int
|
|
35
|
-
@cycles_to_close = input.int
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
# Returns the averaged sample when these cycles close a window, and
|
|
39
|
-
# nil otherwise. They must not run past the window's end.
|
|
40
|
-
def push(sample, cycles = 1)
|
|
41
|
-
@sum += sample * cycles
|
|
42
|
-
@count += cycles
|
|
43
|
-
@phase += @rate * cycles
|
|
44
|
-
@cycles_to_close -= cycles
|
|
45
|
-
return unless @phase >= @clock_hz
|
|
46
|
-
|
|
47
|
-
@phase -= @clock_hz
|
|
48
|
-
@cycles_to_close = window_cycles
|
|
49
|
-
average
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
private
|
|
53
|
-
|
|
54
|
-
def window_cycles = (@clock_hz - @phase + @rate - 1) / @rate
|
|
55
|
-
|
|
56
|
-
def average
|
|
57
|
-
value = @sum.fdiv(@count).round
|
|
58
|
-
@sum = 0
|
|
59
|
-
@count = 0
|
|
60
|
-
value
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
end
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Badline
|
|
4
|
-
class SID
|
|
5
|
-
class Envelope
|
|
6
|
-
# A snapshot of an envelope: its rates, the gate, the state and the
|
|
7
|
-
# counters and pipelines between them, and the same fields as reSID
|
|
8
|
-
# keeps them, for VICE's SIDEXTENDED module.
|
|
9
|
-
module State
|
|
10
|
-
# The fields reSID keeps for an envelope between cycles: the rate and
|
|
11
|
-
# exponential counters, the level, the state as an index into STATES,
|
|
12
|
-
# whether it holds at zero, the two periods and the pipeline.
|
|
13
|
-
def resid_fields
|
|
14
|
-
[@rate_counter, @exponential_counter, @counter, STATES.index(@state).to_i, @hold_zero ? 1 : 0,
|
|
15
|
-
@rate_period, @exponential_period, @envelope_pipeline]
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
# Takes the fields resid_fields gives from `fields`, from `at` on.
|
|
19
|
-
def restore_resid_fields(fields, at)
|
|
20
|
-
@rate_counter = fields[at]
|
|
21
|
-
@exponential_counter = fields[at + 1]
|
|
22
|
-
@counter = @env3 = fields[at + 2]
|
|
23
|
-
state = fields[at + 3]
|
|
24
|
-
@state = @next_state = STATES.fetch(state.clamp(0, STATES.length - 1)).to_sym
|
|
25
|
-
@hold_zero = fields[at + 4] != 0
|
|
26
|
-
@rate_period = fields[at + 5]
|
|
27
|
-
@exponential_period = fields[at + 6]
|
|
28
|
-
@envelope_pipeline = fields[at + 7]
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def save_state(out)
|
|
32
|
-
[@attack, @decay, @sustain, @release].each { |rate| out.int(rate) }
|
|
33
|
-
out.boolean(@gate).int(STATES.index(@state)).int(STATES.index(@next_state))
|
|
34
|
-
out.int(@counter).int(@env3).int(@rate_counter).int(@rate_period).boolean(@reset_rate_counter)
|
|
35
|
-
out.int(@exponential_counter).int(@exponential_period)
|
|
36
|
-
out.int(@state_pipeline).int(@envelope_pipeline).int(@exponential_pipeline).boolean(@hold_zero)
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def load_state(input)
|
|
40
|
-
@attack = input.int
|
|
41
|
-
@decay = input.int
|
|
42
|
-
@sustain = input.int
|
|
43
|
-
@release = input.int
|
|
44
|
-
@gate = input.boolean?
|
|
45
|
-
@state = STATES.fetch(input.int).to_sym
|
|
46
|
-
@next_state = STATES.fetch(input.int).to_sym
|
|
47
|
-
load_counters(input)
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
private
|
|
51
|
-
|
|
52
|
-
def load_counters(input)
|
|
53
|
-
@counter = input.int
|
|
54
|
-
@env3 = input.int
|
|
55
|
-
@rate_counter = input.int
|
|
56
|
-
@rate_period = input.int
|
|
57
|
-
@reset_rate_counter = input.boolean?
|
|
58
|
-
@exponential_counter = input.int
|
|
59
|
-
@exponential_period = input.int
|
|
60
|
-
@state_pipeline = input.int
|
|
61
|
-
@envelope_pipeline = input.int
|
|
62
|
-
@exponential_pipeline = input.int
|
|
63
|
-
@hold_zero = input.boolean?
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
end
|