local component = require("component")
local shell = require("shell")
local buffer_size = 131072
local drive_l_addr = "caea8bb0-4507-438f-bc74-45d24c1d5ec7"
local drive_r_addr = "08fe3266-25c4-4391-afb4-06eed05e3b86"
local drive_l
local drive_r
local function formatKB(num)
return string.format("%02.f",math.floor(num / 1024)).."KB"
end
local function getTapeDrive(address)
--Credits to gamax92 for this
--Taken crom Computronics tape.lua
local tape
if address then
if type(address) ~= "string" then
io.stderr:write("'address' may only be a string")
return
end
local fulladdr = component.get(address)
if fulladdr == nil then
io.stderr:write("No component at this address.")
return
end
if component.type(fulladdr) ~= "tape_drive" then
io.stderr:write("No tape drive at this address.")
return
end
tape = component.proxy(fulladdr)
else
tape = component.tape_drive
end
return tape
end
drive_l = getTapeDrive(drive_l_addr)
drive_r = getTapeDrive(drive_r_addr)
if not drive_l.isReady() then
io.stderr:write("Could not find tape in left drive.")
return
end
if not drive_r.isReady() then
io.stderr:write("Could not find tape in right drive.")
return
end
local srcsize = drive_l.getSize()
local destsize = drive_r.getSize();
if srcsize > destsize then
io.stderr:write("Destination tape is smaller than source tape! Data will be truncated.")
end
drive_r.setLabel(drive_l.getLabel())
drive_l.stop()
drive_l.seek(-srcsize)
drive_l.stop()
drive_r.stop()
drive_r.seek(-drive_r.getSize())
drive_r.stop()
local tread = 0
local written = 0
local bytes_read = 0
local bytes_written = 0
local buffer = {};
local eot = false;
io.write("High-speed dubbing tape "..drive_l.getLabel().." ("..formatKB(srcsize)..") to tape in deck 2 ("..formatKB(drive_r.getSize())..")...\n")
repeat
if not drive_l.isReady() then
io.stderr:write("Could not find tape in left drive.")
end
buffer = drive_l.read(buffer_size,false)
tread = tread + #buffer
if not drive_r.isReady() then
io.stderr:write("Could not find tape in right drive.")
end
drive_r.write(buffer)
written = written + #buffer
io.write("Copying... Tape1 Pos: "..formatKB(tread).." - Tape2 Pos: "..formatKB(written).."\r")
if written >= destsize then
eot = true
end
--if we find three nil bytes in a row, assume silence
if drive_l.read(false) == 0 then
drive_l.seek(1)
if drive_l.read(true) == 0 then
if drive_l.read(true) == 0 then
io.write("\nDetected silence at end of recorded tape...\n")
eot = true
else
--unseek our check bytes
drive_l.seek(-2)
end
else
--unseek our check byte
drive_l.seek(-1)
end
end
until eot
io.write("Wiping the remainder of the destination tape... ")
while written < destsize do
buffer = string.rep("\xAA",buffer_size*2)
drive_r.write(buffer);
written = written + #buffer;
io.write("\rWiping the remainder of the destination tape... "..string.format("%02.f",math.floor(((written / destsize) * 100))).."%\r")
end
drive_l.seek(-drive_l.getSize())
drive_r.seek(-drive_r.getSize())
io.write("\nCopy complete.")
Comments