' TODO: unix version
'
' Compile with qb.lib or remove FileExist function.

DEFINT A-Z
DECLARE FUNCTION FileExist (FileName$)
DECLARE FUNCTION NAME$ ()
DECLARE SUB ER (e$)

TYPE RegTypeX
     ax    AS INTEGER
     bx    AS INTEGER
     cx    AS INTEGER
     dx    AS INTEGER
     bp    AS INTEGER
     si    AS INTEGER
     di    AS INTEGER
     flags AS INTEGER
     ds    AS INTEGER
     es    AS INTEGER
END TYPE

CONST FALSE = 0, TRUE = NOT FALSE
CONST ibm$ = " !#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
CONST c64$ = " !#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[/]^'ABCDEFGHIJKLMNOPQRSTUVWXYZݫcueaaaaceeeiiiAAEaAooouuyOUc\PfaiounN?24!<>ߦݳݮ{{{{ޢabtnEautoond00En=+><fj%=o..jn2 "

OPEN "CON" FOR OUTPUT AS 3

PRINT #3,
PRINT #3, "IBM->CBM text converter by Peter Weighill"
PRINT #3,

PRINT #3, "File IN  : "; : in$ = NAME$
IF in$ = "" THEN
  ER "Filename not specified."
  END
END IF
IF FileExist(in$) = FLASE OR in$ = "." OR in$ = ".." THEN
  ER "File " + in$ + " does not exist."
  END
END IF

PRINT #3, "File OUT : "; : out$ = NAME$
IF out$ = "" THEN
  ER "Filename not specified."
  END
END IF
IF FileExist(out$) = TRUE THEN
  ER "File " + out$ + " already exists."
  END
END IF

PRINT #3,

OPEN in$ FOR INPUT AS 1
OPEN out$ FOR OUTPUT AS 2
PRINT #3, "WORKING.";

count = 0
DO
  LINE INPUT #1, a$
  b$ = ""
    FOR i = 1 TO LEN(a$)
      count = count + 1: IF count = 200 THEN count = 0: PRINT #3, ".";
      c$ = ""
      x = ASC(MID$(a$, i, 1) + CHR$(0))
      y = INSTR(ibm$, CHR$(x))
      IF y <> 0 THEN c$ = MID$(c64$, y, 1)
      IF x = 34 THEN c$ = CHR$(34)
      IF x = 222 THEN c$ = ""
      IF x = 223 THEN c$ = ""
      b$ = b$ + c$
    NEXT i
  PRINT #2, b$; CHR$(13);
LOOP WHILE EOF(1) = 0

PRINT #3,

CLOSE 1, 2, 3
END

SUB ER (e$)

PRINT #3,
PRINT #3, "ERROR: "; e$
PRINT #3,

END

END SUB

FUNCTION FileExist (FileName$)

DIM InRegs AS RegTypeX, OutRegs AS RegTypeX
FileToSet$ = FileName$ + CHR$(0)

InRegs.ax = (256 * &H43) + &H0
InRegs.ds = VARSEG(FileToSet$)
InRegs.dx = SADD(FileToSet$)
CALL INTERRUPTX(&H21, InRegs, OutRegs)

FileExist = (OutRegs.flags AND 1) - 1

END FUNCTION

FUNCTION NAME$

b$ = ""
DO
  DO: a$ = UCASE$(INKEY$): LOOP WHILE a$ = ""
  SELECT CASE a$
    CASE "@" TO "Z", "0" TO "9", "" TO "", "!" TO "-", "."
      IF LEN(b$) < 12 AND a$ <> "*" THEN
        b$ = b$ + a$
        PRINT #3, a$;
      END IF
    CASE CHR$(8)
      IF LEN(b$) > 0 THEN
        b$ = LEFT$(b$, LEN(b$) - 1)
        PRINT #3, CHR$(8); " "; CHR$(8);
      END IF
    CASE CHR$(27)
      PRINT #3,
      ER "User termination by ESC key."
    CASE ELSE
      PRINT #3, ;
  END SELECT
LOOP UNTIL a$ = CHR$(13)

PRINT #3,
NAME$ = b$

END FUNCTION

