# Evolution of Tape Backup

If we could just lock the Sony and Fujifilm lawyers in a room together with a pad of paper and a pen, or conversely some melee weapons, I’d be a happier man.

Dms is looking for a good tape changer

Well we did get a 10 disk DVD cloner and just today a iomega Zip100. There’s also that large industrial arm somewhere’s around the space. Be perfect if we hooked it up and got it on the internet…

:D:D

Any particulars? I may be able to get something older donated. It’d likely be something LTO5 or 6 at this point.

I’m not up on the specs we need. I think something that can backup our servers and perhaps a way to archive camera footage that we want to save for some reason or another.

Ill keep my ear to the ground. I have a couple of customers who might be willing to donate something. Probably would be a 24 slot LTO5 unit, which would hold about 30 TB before having to externalize any cartridges. Let’s chat a little about it next time we’re in the same meatspace.

Found a collection of BASICODE apps:

Plus an interpreter in javascript:

There’s even a Base64 library in qbasic thanks to **rpgfan3233**:

```
======
DECLARE FUNCTION bin2decd$ (n AS INTEGER)
DECLARE FUNCTION bin2dece% (n AS STRING)
DECLARE FUNCTION decd$ (n AS STRING)
DECLARE FUNCTION dece$ (n AS INTEGER)
DECLARE FUNCTION decode ()
DECLARE FUNCTION encode ()
DECLARE SUB inputRoutine (dORe$, ascStr$)
DECLARE FUNCTION redo$ ()
CONST key64$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
DIM SHARED key10$
FOR i = 32 TO 175
key10$ = key10$ + CHR$(i)
NEXT i
FOR i = 224 TO 253
key10$ = key10$ + CHR$(i)
NEXT i
DO
CLS
DO
success = 0
LOCATE 3, 1
PRINT "Choose an option or type " + CHR$(39) + "Q" + CHR$(39) + " to quit"
COLOR 15
PRINT "1.";
COLOR 7
PRINT " Encode to base64"
COLOR 15
PRINT "2.";
COLOR 7
PRINT " Decode from base64"
DO
press$ = LCASE$(INKEY$)
LOOP WHILE press$ = ""
IF press$ = "1" OR press$ = "!" THEN
returnValue = encode
success = 1
ELSEIF press$ = "2" OR press$ = "@" THEN
returnValue = decode
success = 1
ELSE
IF press$ <> "q" THEN
LOCATE 1, 1
PRINT "That is not a valid option."
END IF
END IF
LOOP WHILE success = 0 AND press$ <> "q"
r$ = "No"
IF press$ <> "q" AND returnValue <> 0 THEN r$ = redo$
LOOP WHILE INSTR(UCASE$(r$), "Y") <> 0
PRINT "Come back anytime!"
t& = TIMER
DO
LOOP UNTIL ABS(FIX(TIMER + .5) - t&) >= 2
END
FUNCTION bin2decd$ (n AS INTEGER)
FOR i = 1 TO 6
temp$ = LTRIM$(STR$(n MOD 2)) + temp$
n = n \ 2
NEXT i
bin2decd$ = RIGHT$("000000" + temp$, 6)
END FUNCTION
FUNCTION bin2dece% (n AS STRING)
FOR i = 1 TO 6
temp = (VAL(MID$(n, i, 1)) * (2 ^ (6 - i))) + temp
NEXT i
bin2dece% = temp
END FUNCTION
FUNCTION decd$ (n AS STRING)
FOR i = 1 TO 8
temp = VAL(MID$(n, i, 1)) * (2 ^ (8 - i)) + temp
NEXT i
decd$ = CHR$(temp)
END FUNCTION
FUNCTION dece$ (n AS INTEGER)
FOR i = 1 TO 8
temp$ = LTRIM$(STR$(n MOD 2)) + temp$
n = n \ 2
NEXT i
dece$ = RIGHT$("00000000" + temp$, 8)
END FUNCTION
FUNCTION decode
CLS
'validate the input (to prevent errors)
dORe$ = "d"
CALL inputRoutine(dORe$, ascStr$)
IF LEN(ascStr$) = 0 THEN decode = 0: EXIT FUNCTION
DIM bin6 AS STRING, bin8(1 TO LEN(ascStr$) * 8) AS STRING
FOR i = 1 TO LEN(ascStr$)
IF MID$(ascStr$, i, 1) <> "=" THEN newAsc$ = newAsc$ + MID$(ascStr$, i, 1)
NEXT i
FOR i = 1 TO LEN(newAsc$)
bin6 = bin6 + bin2decd$(INSTR(key64$, MID$(newAsc$, i, 1)) - 1)
NEXT i
FOR i = 1 TO LEN(bin6) STEP 8
bin8(i) = RIGHT$("00000000" + MID$(bin6, i, 8), 8)
NEXT i
FOR i = 1 TO LEN(bin6) STEP 8
IF bin8(i) <> "00000000" THEN decStr$ = decStr$ + decd$(bin8(i))
NEXT i
PRINT decStr$: PRINT
decode = -1
END FUNCTION
FUNCTION encode
CLS
'validate the input (to prevent errors)
dORe$ = "e"
CALL inputRoutine(dORe$, ascStr$)
IF LEN(ascStr$) = 0 THEN encode = 0: EXIT FUNCTION
DIM bin6$(1 TO LEN(ascStr$) * 8)
FOR i = 1 TO LEN(ascStr$)
bin8$ = bin8$ + dece$(ASC(MID$(ascStr$, i, 1)))
NEXT i
FOR i = 1 TO LEN(bin8$) STEP 6
newAsc$ = newAsc$ + MID$(key64$, bin2dece%(LEFT$(MID$(bin8$, i, 6) + "000000", 6)) + 1, 1)
NEXT i
FOR i = 1 TO LEN(newAsc$) MOD 4
newAsc$ = newAsc$ + "="
NEXT i
newAsc$ = LEFT$(newAsc$, LEN(newAsc$) - (LEN(newAsc$) MOD 4))
PRINT newAsc$: PRINT
encode = -1
END FUNCTION
SUB inputRoutine (dORe$, ascStr$)
DO
LOCATE 3, 1
IF dORe$ = "d" THEN
PRINT "Enter a message to decode: ";
ELSEIF dORe$ = "e" THEN
PRINT "Enter a message to encode: ";
END IF
row = 3: column = 28
DO
LOCATE row, column
DO
press$ = INKEY$
LOOP UNTIL press$ <> ""
IF dORe$ = "d" THEN
key$ = key64$
ELSEIF dORe$ = "e" THEN
key$ = key10$
END IF
IF INSTR(key$, press$) <> 0 THEN
PRINT press$;
ascStr$ = ascStr$ + press$
valid = 1
IF column = 80 THEN
row = row + 1
column = 1
ELSE
column = column + 1
END IF
ELSEIF press$ = CHR$(8) AND LEN(ascStr$) <> 0 THEN
IF column = 1 THEN
row = row - 1
column = 80
ELSE
column = column - 1
END IF
LOCATE row, column
PRINT CHR$(255);
ascStr$ = LEFT$(ascStr$, LEN(ascStr$) - 1)
ELSEIF press$ = CHR$(27) THEN
valid = 1
END IF
LOOP UNTIL press$ = CHR$(13) OR press$ = CHR$(27)
IF LEN(ascStr$) < 1 AND press$ <> CHR$(27) THEN LOCATE 1, 1: PRINT "It must be at least 1 character!"
LOOP WHILE valid = 0
PRINT
END SUB
FUNCTION redo$
DO
PRINT "Do you wish to decode or encode another base64 string? "
row = CSRLIN - 1: column = 56
DO
LOCATE row, column
DO
press$ = INKEY$
LOOP UNTIL press$ <> ""
key$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
IF INSTR(key$, press$) <> 0 THEN
PRINT press$;
ascStr$ = ascStr$ + press$
valid = 1
IF column = 80 THEN
row = row + 1
column = 1
ELSE
column = column + 1
END IF
ELSEIF press$ = CHR$(8) AND LEN(ascStr$) <> 0 THEN
IF column = 1 THEN
row = row - 1
column = 80
ELSE
column = column - 1
END IF
LOCATE row, column
PRINT CHR$(255);
ascStr$ = LEFT$(ascStr$, LEN(ascStr$) - 1)
ELSEIF press$ = CHR$(27) THEN
valid = 1
END IF
LOOP UNTIL press$ = CHR$(13) OR press$ = CHR$(27)
LOOP WHILE valid = 0
PRINT
redo$ = ascStr$
END FUNCTION
======
```

Darn; how did I forget about SSTV