passport-test-suite/passport.lua

90 lines
2.0 KiB
Lua

require "lfs"
infiles = {}
fileindex = 0
for f in lfs.dir(".") do
if f:match(".woz$") then
infiles[#infiles + 1] = f
end
end
table.sort(infiles)
function calc(line)
return line % 8 * 1024 + math.floor(line / 64) * 40 + math.floor((line%64) / 8) * 128 + 8192
end
function textcalc(line)
return calc(line * 8) - 8192 + 0x0400
end
function striphibitstring(a)
local b = ""
for i = 1, string.len(a) do
b = b .. string.char(a:byte(i) & 0x7f)
end
return b
end
mainmem = emu.item(manager.machine.devices[":ram"].items["0/m_pointer"]) -- always gets main memory
function getscreenline(i)
return striphibitstring(mainmem:read_block(textcalc(i), 40))
end
function getscreen()
local b = ""
for i = 0, 23 do
b = b .. getscreenline(i) .. "\n"
end
return b
end
function savescreen(outfile)
local h = io.open(outfile, "w")
h:write(getscreen())
h:close()
end
function createblankdsk(outfile)
local h = io.open(outfile, "wb")
for i = 1, 143360 do
h:write(0x00)
end
h:close()
end
state = "waiting_for_main_menu"
function driver()
if state == "waiting_for_main_menu" then
if getscreen():match("rack disk") then
fileindex = fileindex + 1
if fileindex > #infiles then
manager.machine:exit()
return
end
dsk, subcount = infiles[fileindex]:gsub(".woz$", ".dsk")
if subcount == 0 then
print("ERROR unable to parse filename")
return
end
print(infiles[fileindex])
createblankdsk(dsk)
manager.machine.images[":sl6:diskiing:0:525"]:load(infiles[fileindex])
manager.machine.images[":sl6:diskiing:1:525"]:load(dsk)
emu.keypost("C")
state = "waiting_for_process"
end
end
if state == "waiting_for_process" then
if getscreen():match("Press any key") then
log, subcount = infiles[fileindex]:gsub(".woz$", ".log")
savescreen(log)
emu.keypost(" ")
state = "waiting_for_main_menu"
end
end
end
;manager.machine.video.frameskip = 10
;manager.machine.video.throttled = false
emu.register_frame_done(driver)