badline 0.5.1 → 0.6.1
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 +52 -0
- data/CLAUDE.md +10 -9
- data/README.md +82 -10
- data/doc/pinned-behaviour.md +131 -30
- data/exe/badline-ruby +20 -23
- data/lib/badline/address_bus/saved_state.rb +72 -0
- data/lib/badline/address_bus.rb +11 -1
- data/lib/badline/audio/cli.rb +18 -5
- data/lib/badline/audio/console.rb +2 -1
- data/lib/badline/audio.rb +0 -3
- data/lib/badline/cartridge/action_replay.rb +15 -0
- data/lib/badline/cartridge/comal80.rb +8 -0
- data/lib/badline/cartridge/dinamic.rb +8 -0
- data/lib/badline/cartridge/easy_flash.rb +20 -1
- data/lib/badline/cartridge/epyx_fastload.rb +8 -0
- data/lib/badline/cartridge/final_cartridge3.rb +12 -0
- data/lib/badline/cartridge/flash.rb +41 -0
- data/lib/badline/cartridge/fun_play.rb +8 -0
- data/lib/badline/cartridge/g_mod2.rb +12 -0
- data/lib/badline/cartridge/game_system.rb +8 -0
- data/lib/badline/cartridge/geo_ram.rb +16 -0
- data/lib/badline/cartridge/magic_desk.rb +8 -0
- data/lib/badline/cartridge/ocean.rb +8 -0
- data/lib/badline/cartridge/pagefox.rb +12 -0
- data/lib/badline/cartridge/retro_replay.rb +44 -1
- data/lib/badline/cartridge/rgcd.rb +10 -0
- data/lib/badline/cartridge/super_games.rb +10 -0
- data/lib/badline/cartridge/zaxxon.rb +16 -0
- data/lib/badline/cartridge.rb +72 -0
- data/lib/badline/cia/interrupt_register.rb +17 -0
- data/lib/badline/cia/serial.rb +44 -0
- data/lib/badline/cia/state.rb +47 -0
- data/lib/badline/cia/timer.rb +33 -0
- data/lib/badline/cia.rb +8 -0
- data/lib/badline/computer/attachments.rb +132 -0
- data/lib/badline/computer/saved_state.rb +116 -0
- data/lib/badline/computer.rb +13 -33
- data/lib/badline/cpu/boundary.rb +54 -0
- data/lib/badline/cpu/core.rb +165 -0
- data/lib/badline/cpu/microcode.rb +8 -0
- data/lib/badline/cpu/saved_state.rb +115 -0
- data/lib/badline/cpu.rb +3 -212
- data/lib/badline/datasette.rb +27 -0
- data/lib/badline/drive1541/bus.rb +13 -0
- data/lib/badline/drive1541/cpu.rb +29 -0
- data/lib/badline/drive1541/disk.rb +7 -2
- data/lib/badline/drive1541/disk_state.rb +80 -0
- data/lib/badline/drive1541/mechanism.rb +2 -0
- data/lib/badline/drive1541/mechanism_state.rb +67 -0
- data/lib/badline/drive1541/rotation.rb +10 -0
- data/lib/badline/drive1541/serial_port.rb +10 -0
- data/lib/badline/drive1541.rb +35 -0
- data/lib/badline/ffi.rb +157 -0
- data/lib/badline/frontend/app.rb +225 -0
- data/lib/badline/frontend/audio_sink.rb +72 -0
- data/lib/badline/frontend/boot.rb +52 -0
- data/lib/badline/frontend/controls.rb +163 -0
- data/lib/badline/frontend/drive_led.rb +51 -0
- data/lib/badline/frontend/frame_rate.rb +83 -0
- data/lib/badline/frontend/gamepads.rb +76 -0
- data/lib/badline/frontend/keys.rb +48 -0
- data/lib/badline/frontend/pacer.rb +100 -0
- data/lib/badline/frontend/pad_port.rb +61 -0
- data/lib/badline/frontend/screen.rb +65 -0
- data/lib/badline/frontend/screenshot.rb +22 -0
- data/lib/badline/frontend/snapshots.rb +60 -0
- data/lib/badline/frontend/sound.rb +153 -0
- data/lib/badline/frontend/timeline.rb +171 -0
- data/lib/badline/frontend.rb +18 -0
- data/lib/badline/kernal_trap/channel.rb +27 -0
- data/lib/badline/kernal_trap/drive/channels.rb +25 -0
- data/lib/badline/kernal_trap/drive/memory.rb +9 -0
- data/lib/badline/kernal_trap/drive/status.rb +8 -0
- data/lib/badline/kernal_trap/drive/write_file.rb +21 -0
- data/lib/badline/kernal_trap/drive.rb +19 -0
- data/lib/badline/kernal_trap/save.rb +8 -0
- data/lib/badline/kernal_trap/serial.rb +16 -0
- data/lib/badline/memory.rb +8 -0
- data/lib/badline/options/event.rb +94 -0
- data/lib/badline/options/help.rb +78 -0
- data/lib/badline/options/option.rb +29 -0
- data/lib/badline/options/table.rb +62 -0
- data/lib/badline/options.rb +181 -144
- data/lib/badline/ram_expansion/plus256k.rb +16 -0
- data/lib/badline/ram_expansion/plus60k.rb +12 -0
- data/lib/badline/ram_expansion/unexpanded.rb +6 -0
- data/lib/badline/reu/dma/saved_state.rb +50 -0
- data/lib/badline/reu/dma.rb +56 -11
- data/lib/badline/reu/ram.rb +15 -0
- data/lib/badline/reu/saved_state.rb +53 -0
- data/lib/badline/reu.rb +23 -10
- data/lib/badline/sdl.rb +123 -51
- data/lib/badline/sid/envelope/state.rb +68 -0
- data/lib/badline/sid/envelope.rb +7 -0
- data/lib/badline/sid/filter.rb +38 -0
- data/lib/badline/sid/voice.rb +10 -0
- data/lib/badline/sid/waveform/noise_writeback.rb +33 -11
- data/lib/badline/sid/waveform/state.rb +66 -0
- data/lib/badline/sid/waveform.rb +4 -3
- data/lib/badline/sid.rb +34 -0
- data/lib/badline/snapshot/container.rb +117 -0
- data/lib/badline/snapshot/fields.rb +54 -0
- data/lib/badline/snapshot/image.rb +70 -0
- data/lib/badline/snapshot/machine_state.rb +77 -0
- data/lib/badline/snapshot/setup.rb +58 -0
- data/lib/badline/snapshot/state.rb +178 -0
- data/lib/badline/snapshot/vice/c64_mem.rb +53 -0
- data/lib/badline/snapshot/vice/cias.rb +89 -0
- data/lib/badline/snapshot/vice/cias_import.rb +70 -0
- data/lib/badline/snapshot/vice/main_cpu.rb +76 -0
- data/lib/badline/snapshot/vice/peripherals.rb +47 -0
- data/lib/badline/snapshot/vice/restore.rb +125 -0
- data/lib/badline/snapshot/vice/sid_extended.rb +96 -0
- data/lib/badline/snapshot/vice/sid_registers.rb +46 -0
- data/lib/badline/snapshot/vice/vicii.rb +119 -0
- data/lib/badline/snapshot/vice/vicii_import.rb +131 -0
- data/lib/badline/snapshot/vice.rb +74 -0
- data/lib/badline/snapshot.rb +52 -0
- data/lib/badline/storage/crt_file.rb +9 -3
- data/lib/badline/storage/d64_image.rb +2 -0
- data/lib/badline/storage/d71_image.rb +2 -0
- data/lib/badline/storage/d81_image.rb +2 -0
- data/lib/badline/storage/disk_image.rb +11 -2
- data/lib/badline/storage/host_directory.rb +5 -0
- data/lib/badline/storage/t64.rb +6 -0
- data/lib/badline/storage/tap.rb +10 -1
- data/lib/badline/storage/unavailable.rb +20 -0
- data/lib/badline/storage.rb +34 -0
- data/lib/badline/time_of_day.rb +56 -0
- data/lib/badline/version.rb +1 -1
- data/lib/badline/via/control_lines.rb +15 -0
- data/lib/badline/via/interrupt_register.rb +9 -0
- data/lib/badline/via/shift_register.rb +13 -0
- data/lib/badline/via/state.rb +42 -0
- data/lib/badline/via/timer1.rb +13 -0
- data/lib/badline/via/timer2.rb +18 -0
- data/lib/badline/via.rb +2 -0
- data/lib/badline/vic/bank.rb +21 -0
- data/lib/badline/vic/border_mask.rb +10 -0
- data/lib/badline/vic/collisions.rb +11 -0
- data/lib/badline/vic/color_patches.rb +11 -0
- data/lib/badline/vic/display_state.rb +29 -1
- data/lib/badline/vic/graphics_shifter.rb +26 -0
- data/lib/badline/vic/register_log.rb +18 -0
- data/lib/badline/vic/registers.rb +13 -2
- data/lib/badline/vic/sequencer.rb +12 -0
- data/lib/badline/vic/sequencer_state.rb +89 -0
- data/lib/badline/vic/sprite/internal_bus.rb +11 -0
- data/lib/badline/vic/sprite/saved_state.rb +64 -0
- data/lib/badline/vic/sprite.rb +2 -0
- data/lib/badline/vic/sprites.rb +3 -0
- data/lib/badline/vic/sprites_state.rb +57 -0
- data/lib/badline/vic.rb +109 -16
- data/lib/badline.rb +1 -0
- metadata +59 -18
- data/.claude/hooks/session-start.sh +0 -57
- data/.claude/settings.json +0 -14
- data/lib/badline/audio/sdl_sink.rb +0 -70
- data/lib/badline/audio/stream.rb +0 -117
- data/lib/badline/gui/application.rb +0 -216
- data/lib/badline/gui/drive_led_pane.rb +0 -29
- data/lib/badline/gui/gamepads.rb +0 -97
- data/lib/badline/gui/joy_map.rb +0 -27
- data/lib/badline/gui/key_map.rb +0 -39
- data/lib/badline/gui/palette.rb +0 -35
- data/lib/badline/gui/pane.rb +0 -36
- data/lib/badline/gui/screen_pane.rb +0 -46
- data/lib/badline/gui/window.rb +0 -61
- data/lib/badline/gui.rb +0 -13
- data/lib/badline/sdl/events.rb +0 -47
- data/lib/badline/sdl/functions.rb +0 -74
- data/vendor/.gitkeep +0 -0
data/lib/badline/memory.rb
CHANGED
|
@@ -29,6 +29,14 @@ module Badline
|
|
|
29
29
|
Array(bytes).each_with_index { |b, i| poke(addr + i, b) }
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
+
def save_state(out)
|
|
33
|
+
out.blob(@storage)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def load_state(input)
|
|
37
|
+
input.blob_into(@storage)
|
|
38
|
+
end
|
|
39
|
+
|
|
32
40
|
# Refills the whole memory as if newly built with `initial`
|
|
33
41
|
def clear!(initial = [])
|
|
34
42
|
@storage.replace(zero_fill(initial))
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Badline
|
|
4
|
+
class Options
|
|
5
|
+
# One event of --at or --script: what to do, with its argument, once
|
|
6
|
+
# `frame` frames have run. An event given at several frames becomes
|
|
7
|
+
# one Event per frame.
|
|
8
|
+
class Event
|
|
9
|
+
# The actions, and whether each takes an argument.
|
|
10
|
+
ACTIONS = {
|
|
11
|
+
"key" => true, "type" => true, "insert" => true, "eject" => true, "screenshot" => true,
|
|
12
|
+
"reset" => false, "freeze" => false, "quit" => false
|
|
13
|
+
}.freeze
|
|
14
|
+
|
|
15
|
+
# The frames a key or the freeze button is held for.
|
|
16
|
+
HOLD = 5
|
|
17
|
+
|
|
18
|
+
EJECTABLE = %w[disk tape cartridge].freeze
|
|
19
|
+
|
|
20
|
+
# What insert takes: disk images, tapes and cartridges, or a
|
|
21
|
+
# directory to mount as device 8.
|
|
22
|
+
INSERTABLE = %w[.d64 .d71 .d81 .g64 .t64 .tap .crt].freeze
|
|
23
|
+
|
|
24
|
+
attr_reader :frame, :action, :argument
|
|
25
|
+
|
|
26
|
+
def initialize(frame, action, argument)
|
|
27
|
+
@frame = frame
|
|
28
|
+
@action = action
|
|
29
|
+
@argument = argument
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# The events of --at's value, or of --script's file.
|
|
33
|
+
def self.given(flag, value)
|
|
34
|
+
return script(value) if flag == "--script"
|
|
35
|
+
|
|
36
|
+
events = parse(value)
|
|
37
|
+
raise Error, "invalid argument: #{flag} #{value}" if events.empty?
|
|
38
|
+
|
|
39
|
+
events
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# The events of a --script file, one a line in --at's form. Blank
|
|
43
|
+
# lines and lines starting with # are skipped.
|
|
44
|
+
def self.script(path)
|
|
45
|
+
raise Error, "no such file: #{path}" unless File.file?(path)
|
|
46
|
+
|
|
47
|
+
events = []
|
|
48
|
+
File.foreach(path) do |line|
|
|
49
|
+
text = line.strip
|
|
50
|
+
events.concat(given("--script #{path}:", text)) unless text.empty? || text.start_with?("#")
|
|
51
|
+
end
|
|
52
|
+
events
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# The events of `FRAME[,FRAME...]:ACTION[=ARGUMENT]`, or an empty list
|
|
56
|
+
# when the text isn't one.
|
|
57
|
+
def self.parse(text)
|
|
58
|
+
colon = text.index(":")
|
|
59
|
+
numbers = colon.nil? ? [] : frames(text[0, colon])
|
|
60
|
+
return [] if numbers.empty?
|
|
61
|
+
|
|
62
|
+
event = text[colon + 1, text.size - colon - 1]
|
|
63
|
+
equals = event.index("=")
|
|
64
|
+
action = equals.nil? ? event : event[0, equals]
|
|
65
|
+
argument = equals.nil? ? "" : event[equals + 1, event.size - equals - 1]
|
|
66
|
+
return [] unless valid?(action, argument)
|
|
67
|
+
|
|
68
|
+
numbers.map { |frame| new(frame, action, argument) }
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# The frame numbers of `FRAME[,FRAME...]`, or none unless each is a
|
|
72
|
+
# positive number.
|
|
73
|
+
def self.frames(text)
|
|
74
|
+
numbers = text.split(",")
|
|
75
|
+
return [] unless !numbers.empty? && numbers.all? { |number| number.match?(/\A\d+\z/) && number.to_i.positive? }
|
|
76
|
+
|
|
77
|
+
numbers.map(&:to_i)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def self.valid?(action, argument)
|
|
81
|
+
return false unless ACTIONS.key?(action)
|
|
82
|
+
return argument.empty? unless ACTIONS[action]
|
|
83
|
+
return EJECTABLE.include?(argument) if action == "eject"
|
|
84
|
+
return insertable?(argument) if action == "insert"
|
|
85
|
+
|
|
86
|
+
!argument.empty?
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def self.insertable?(path)
|
|
90
|
+
File.directory?(path) || (File.exist?(path) && INSERTABLE.include?(File.extname(path).downcase))
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Badline
|
|
4
|
+
class Options
|
|
5
|
+
# How fast the headless player runs, which the builds' help tells apart.
|
|
6
|
+
NATIVE_SPEED = <<~TEXT.chomp
|
|
7
|
+
Without the window, PSID tunes run on a bare CPU and SID, and RSID
|
|
8
|
+
tunes boot the whole machine. --filter-chunk 1 runs the filter
|
|
9
|
+
cycle by cycle, which is exact but slower.
|
|
10
|
+
TEXT
|
|
11
|
+
|
|
12
|
+
RUBY_SPEED = <<~TEXT.chomp
|
|
13
|
+
Without the window, PSID tunes run on a bare CPU and SID, faster than
|
|
14
|
+
real time. RSID tunes boot the whole machine and run at about half
|
|
15
|
+
real time, so they stutter when played. --filter-chunk 1 runs the
|
|
16
|
+
filter cycle by cycle, which is exact but takes about twice as long.
|
|
17
|
+
TEXT
|
|
18
|
+
|
|
19
|
+
# What --help prints: the usage, then the options this build takes,
|
|
20
|
+
# section by section, laid out as OptionParser did.
|
|
21
|
+
def help
|
|
22
|
+
lines = [banner]
|
|
23
|
+
SECTIONS.each do |section|
|
|
24
|
+
options = TABLE.select { |option| option.section == section && takes?(option) }
|
|
25
|
+
next if options.empty?
|
|
26
|
+
|
|
27
|
+
lines << "" if lines.size > 1
|
|
28
|
+
lines << "#{section}:"
|
|
29
|
+
options.each { |option| lines << " #{option.usage.ljust(32)} #{describe(option)}" }
|
|
30
|
+
end
|
|
31
|
+
"#{lines.join("\n")}\n"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
def describe(option) = @native && option.name == "--sound" ? "#{option.text} (default)" : option.text
|
|
37
|
+
|
|
38
|
+
def banner
|
|
39
|
+
<<~BANNER
|
|
40
|
+
Usage: #{@program} [options] [media]
|
|
41
|
+
#{@program} --headless [options] tune.sid
|
|
42
|
+
#{@program} [options] tune.sid --audio-out FILE
|
|
43
|
+
|
|
44
|
+
Media can be a .prg/.p00 program, a .d64/.d71/.d81 disk image, a
|
|
45
|
+
.g64 disk image for the true 1541, a .t64 tape archive, a .tap
|
|
46
|
+
tape, a .crt cartridge, a .sid tune, a .vsf snapshot, or a directory
|
|
47
|
+
to mount as device 8. It opens in the emulator window, where F11
|
|
48
|
+
saves a snapshot and F12 restores it. Device 8 answers through
|
|
49
|
+
traps on the KERNAL's disk routines, unless --true-drive puts an
|
|
50
|
+
emulated 1541 there, which runs its own DOS and reads .d64 and .g64
|
|
51
|
+
images only.
|
|
52
|
+
|
|
53
|
+
--headless plays a .sid tune on the host's audio device without the
|
|
54
|
+
window, and --audio-out renders it to 16-bit PCM instead. The
|
|
55
|
+
container follows the file's extension, .wav or .aiff. Played on a
|
|
56
|
+
terminal, n or → skips to the next song, p or ← to the previous one,
|
|
57
|
+
space pauses and q quits.
|
|
58
|
+
|
|
59
|
+
A .sid file carries no length of its own. Without --seconds the tune is
|
|
60
|
+
looked up by MD5 in HVSC's Songlengths.md5, taken from --songlengths, from
|
|
61
|
+
the DOCUMENTS directory of an HVSC collection above the tune, or from
|
|
62
|
+
$HVSC_BASE. Failing all of those it runs for #{FALLBACK_SECONDS.to_i} seconds.
|
|
63
|
+
|
|
64
|
+
#{@native ? NATIVE_SPEED : RUBY_SPEED}
|
|
65
|
+
|
|
66
|
+
--at and --script run events once a number of frames has run, as
|
|
67
|
+
in --at 3500:key=space or --at 250,500:screenshot=shot%05d.bmp.
|
|
68
|
+
key=NAME presses a C64 key (space, return, a, f1, run_stop, restore)
|
|
69
|
+
or a joystick's direction or fire (joy1-up, joy2-fire) for #{Event::HOLD}
|
|
70
|
+
frames. type=TEXT types it, with \\n for RETURN. insert=FILE swaps
|
|
71
|
+
in a disk, tape or cartridge, and eject=disk, tape or cartridge
|
|
72
|
+
takes one out. screenshot=FILE saves the frame as a .bmp, with the
|
|
73
|
+
frame's number in place of %d. reset, freeze and quit take no
|
|
74
|
+
argument.
|
|
75
|
+
BANNER
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Badline
|
|
4
|
+
class Options
|
|
5
|
+
# One option of the table: its flags and value as the help shows them
|
|
6
|
+
# (`-s, --song N`), what it does, the help section it's listed in, the
|
|
7
|
+
# mode it needs (:window, :headless or :either), and the build that
|
|
8
|
+
# takes it (:native, :ruby or :both).
|
|
9
|
+
class Option
|
|
10
|
+
attr_reader :usage, :name, :short, :value, :text, :section, :needs, :build
|
|
11
|
+
|
|
12
|
+
def initialize(usage, text, section:, needs: :either, build: :both)
|
|
13
|
+
@usage = usage.start_with?("--") ? " #{usage}" : usage
|
|
14
|
+
words = usage.split
|
|
15
|
+
@short = words.size > 1 && words[1].start_with?("--") ? words[0].delete_suffix(",") : ""
|
|
16
|
+
@name = @short.empty? ? words[0] : words[1]
|
|
17
|
+
@value = words.last.start_with?("-") ? "" : words.last
|
|
18
|
+
@text = text
|
|
19
|
+
@section = section
|
|
20
|
+
@needs = needs
|
|
21
|
+
@build = build
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def valued? = !@value.empty?
|
|
25
|
+
|
|
26
|
+
def named?(flag) = flag == @name || (!@short.empty? && flag == @short)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Badline
|
|
4
|
+
class Options
|
|
5
|
+
DEFAULT_RATE = 44_100
|
|
6
|
+
|
|
7
|
+
SECTIONS = ["Options", "Window options", "Options without the window", "Testing options"].freeze
|
|
8
|
+
|
|
9
|
+
# Every option of both builds, in the order the help lists them.
|
|
10
|
+
TABLE = [
|
|
11
|
+
Option.new("-s, --song N", "Subtune of a .sid, from 1 (default: the tune's own)", section: "Options"),
|
|
12
|
+
Option.new("--sid MODEL", "SID to fit: 6581 or 8580 (default: a .sid tune's own, else 6581)",
|
|
13
|
+
section: "Options"),
|
|
14
|
+
Option.new("--disable-jit", "Run without enabling YJIT", section: "Options", build: :ruby),
|
|
15
|
+
Option.new("-h, --help", "Show this help", section: "Options"),
|
|
16
|
+
Option.new("--version", "Show the version and what built it", section: "Options", build: :native),
|
|
17
|
+
Option.new("--no-autostart", "Boot to READY. instead of running the program",
|
|
18
|
+
section: "Window options", needs: :window),
|
|
19
|
+
Option.new("--read-only", "Mount a disk image write-protected, leaving its file unchanged",
|
|
20
|
+
section: "Window options", needs: :window),
|
|
21
|
+
Option.new("--sound", "Play the SID through the host's audio device (F10 mutes)",
|
|
22
|
+
section: "Window options", needs: :window),
|
|
23
|
+
Option.new("--no-sound", "Don't play the SID", section: "Window options", needs: :window, build: :native),
|
|
24
|
+
Option.new("--true-drive", "Put a true 1541 on device 8 instead of the KERNAL traps",
|
|
25
|
+
section: "Window options", needs: :window),
|
|
26
|
+
Option.new("--reu SIZE", "Plug in an REU of SIZE K: 128, 256, 512 (a 1750) or up to 16384",
|
|
27
|
+
section: "Window options", needs: :window),
|
|
28
|
+
Option.new("--ntsc", "Run an NTSC C64, with the 6567R8 VIC-II, instead of a PAL one",
|
|
29
|
+
section: "Window options", needs: :window),
|
|
30
|
+
Option.new("--no-vsync", "Pace frames by the timer or the sound instead of the display",
|
|
31
|
+
section: "Window options", needs: :window),
|
|
32
|
+
Option.new("--verbose", "Print the display, sound and gamepad setup and the frame timing",
|
|
33
|
+
section: "Window options", needs: :window),
|
|
34
|
+
Option.new("--headless", "Play a .sid tune in the terminal instead of the window",
|
|
35
|
+
section: "Options without the window"),
|
|
36
|
+
Option.new("--audio-out FILE", "Render a .sid tune to a .wav or .aiff file",
|
|
37
|
+
section: "Options without the window"),
|
|
38
|
+
Option.new("--seconds N", "Length to play (default: the tune's own)",
|
|
39
|
+
section: "Options without the window", needs: :headless),
|
|
40
|
+
Option.new("--songlengths PATH", "HVSC Songlengths.md5 to take the length from",
|
|
41
|
+
section: "Options without the window", needs: :headless),
|
|
42
|
+
Option.new("--rate HZ", "Sample rate (default: #{DEFAULT_RATE}, or the audio device's own)",
|
|
43
|
+
section: "Options without the window", needs: :headless),
|
|
44
|
+
Option.new("--filter-chunk N", "Filter step in cycles, 1 is exact (default: 4)",
|
|
45
|
+
section: "Options without the window", needs: :headless),
|
|
46
|
+
Option.new("--quiet", "Don't report progress", section: "Options without the window", needs: :headless),
|
|
47
|
+
Option.new("--no-tui", "Play without the interactive display, even on a terminal",
|
|
48
|
+
section: "Options without the window", needs: :headless),
|
|
49
|
+
Option.new("--frames N", "Quit after N frames", section: "Testing options", needs: :window),
|
|
50
|
+
Option.new("--unpaced", "Run as fast as it can, without vsync or pacing",
|
|
51
|
+
section: "Testing options", needs: :window),
|
|
52
|
+
Option.new("--screenshot FILE", "Save the last frame as a .bmp",
|
|
53
|
+
section: "Testing options", needs: :window),
|
|
54
|
+
Option.new("--save-snapshot FILE", "Save the machine as a .vsf snapshot after the last frame",
|
|
55
|
+
section: "Testing options", needs: :window),
|
|
56
|
+
Option.new("--at FRAME:EVENT", "Run EVENT once FRAME frames have run (see above)",
|
|
57
|
+
section: "Testing options", needs: :window),
|
|
58
|
+
Option.new("--script FILE", "Run the events in FILE, one FRAME:EVENT a line",
|
|
59
|
+
section: "Testing options", needs: :window)
|
|
60
|
+
].freeze
|
|
61
|
+
end
|
|
62
|
+
end
|