Files
Sprinter-SDCC/applications/Volkov/tests/mame_p4_copy_hdd.lua
T
snark13 8e389c03f8 Volkov: добавить Sprinter Commander
Реализовать двухпанельный Commander от платформенного PoC до этапов P6-P20: EMM-каталог, сортировку и выбор, операции с файлами и деревьями, транзакционное копирование, метаданные, политику конфликтов и предварительную проверку свободного места.

Добавить проектную документацию, HDD/MAME-сценарии и проверенные артефакты. Расширить libc операцией bank_write_page, исправлением режима O_RDONLY и связанными регрессионными проверками.
2026-09-10 10:45:30 +03:00

143 lines
4.2 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- P4/F5 на HDD D: успех >64 КБ, отказ overwrite и отмена с cleanup.
local KB = ":kbd:ms_naturl:"
local HOLD = 0.06
local events = {}
local function add(t, tag, mask, value)
events[#events + 1] = {t, KB .. tag, mask, value}
end
local function key(t, tag, mask)
add(t, tag, mask, 1)
add(t + HOLD, tag, mask, 0)
end
local function chord(t, mod_tag, mod_mask, key_tag, key_mask)
add(t, mod_tag, mod_mask, 1)
add(t + 0.02, key_tag, key_mask, 1)
add(t + 0.08, key_tag, key_mask, 0)
add(t + 0.10, mod_tag, mod_mask, 0)
end
local chars = {
c={"P1.4",0x08}, d={"P1.4",0x04}, e={"P1.4",0x20}, m={"P2.0",0x10},
p={"P2.3",0x20}, r={"P1.5",0x01}, s={"P1.2",0x08},
x={"P1.2",0x10}, [" "]={"P2.4",0x80}, ["."]={"P2.2",0x10},
["\n"]={"P2.1",0x10}, [":"]={"P2.3",0x02,true}
}
local function type_text(t, value)
for i = 1, #value do
local ch = value:sub(i, i)
local def = chars[ch]
local shifted = false
if not def then
local lower = ch:lower()
def = chars[lower]
shifted = ch ~= lower
else
shifted = def[3] or false
end
if shifted then
chord(t, "P1.7", 0x02, def[1], def[2])
else
key(t, def[1], def[2])
end
t = t + 0.14
end
end
type_text(8.0, "d:\n")
type_text(9.0, "SPRCMD .EXE\n")
key(15.0, "P2.1", 0x10) -- Enter: левая -> COPYFROM.
key(17.0, "P1.6", 0x20) -- Tab: правая панель.
key(18.0, "P2.3", 0x10) -- Down: COPYTO.
key(19.0, "P2.1", 0x10) -- Enter: правая -> COPYTO.
key(21.0, "P1.6", 0x20) -- Tab: левая панель.
-- `..`, CANCEL, EMPTY, EXIST, F65535, F65536, K4095, K4096, LARGE.
for i = 1, 8 do key(22.0 + (i - 1) * 0.20, "P2.3", 0x10) end
key(25.0, "P2.1", 0x40) -- F5: LARGE.BIN (131109 байт).
key(31.0, "P2.5", 0x01) -- Home.
for i = 1, 3 do key(32.0 + (i - 1) * 0.20, "P2.3", 0x10) end
key(33.5, "P2.1", 0x40) -- F5: EXIST.TXT, overwrite запрещён.
key(36.0, "P2.5", 0x01) -- Home.
key(37.0, "P2.3", 0x10) -- CANCEL.BIN.
key(38.0, "P2.1", 0x40) -- F5: начать 4-МБ копирование.
key(41.0, "P1.6", 0x40) -- Esc: отменить между блоками.
key(44.0, "P2.3", 0x10) -- Down: EMPTY.ZRO.
key(44.5, "P2.1", 0x40) -- F5: нулевой файл.
key(48.0, "P2.3", 0x80) -- F10.
key(50.0, "P2.1", 0x10) -- Enter: cleanup и возврат в DSS.
table.sort(events, function(a, b) return a[1] < b[1] end)
local snap_times = {
14.0, -- обе панели в корне D:;
20.5, -- COPYFROM/COPYTO разведены по панелям;
25.8, 28.5, 30.0, -- начало, поздний прогресс и результат LARGE.BIN;
35.0, -- отказ перезаписи EXIST.TXT;
39.5, -- активный прогресс CANCEL.BIN;
43.0, -- отмена и cleanup temp;
46.0, -- нулевой EMPTY.ZRO скопирован;
49.0, -- диалог выхода;
52.0 -- возврат в D:\>.
}
local snaps_done = {}
local start_time = nil
local ports = nil
local index = 1
local field_cache = {}
local function now()
local t = manager.machine.time
return t.seconds + t.attoseconds / 1e18
end
local function field(tag, mask)
local cache_key = tag .. "/" .. mask
if field_cache[cache_key] then return field_cache[cache_key] end
for _, candidate in pairs(ports[tag].fields) do
if candidate.mask == mask then
field_cache[cache_key] = candidate
return candidate
end
end
error("Не найдено поле " .. cache_key)
end
emu.add_machine_reset_notifier(function()
start_time = now()
end)
emu.register_periodic(function()
if not start_time then return end
if not ports then ports = manager.machine.ioport.ports end
local elapsed = now() - start_time
while index <= #events and elapsed >= events[index][1] do
local event = events[index]
field(event[2], event[3]):set_value(event[4])
index = index + 1
end
for _, snap_time in ipairs(snap_times) do
if not snaps_done[snap_time] and elapsed >= snap_time then
snaps_done[snap_time] = true
manager.machine.video:snapshot()
print("[p4-copy-hdd] snapshot t=" .. elapsed)
end
end
if elapsed >= 54.0 then
print("[p4-copy-hdd] exit t=" .. elapsed)
manager.machine:exit()
end
end)