' 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 c64$ = " !#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
CONST ibm$ = " !#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[œ]^<ÄABCDEFGHIJKLMNOPQRSTUVWXYZÅÝ³ã\ ÝÜÄÄ³±³±/³ÃÉÀ¿ÄÚÁÂ´³ÝÞßßÜÙ»ÈÙ¼þÄABCDEFGHIJKLMNOPQRSTUVWXYZÅÝ³ã\ ÝÜÄÄ³±³±/³ÃÉÀ¿ÄÚÁÂ´³ÝÞßßÜÙ»ÈÙ¼ã"

OPEN "CON" FOR OUTPUT AS 3

PRINT #3,
PRINT #3, "CBM->IBM 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, "Convert CTRL codes to {Up}{Yel}..etc.. or miss out  (C/M) : ";
DO: cv$ = UCASE$(INKEY$): LOOP UNTIL cv$ = "C" OR cv$ = "M" OR cv$ = CHR$(27)
IF cv$ = CHR$(27) THEN PRINT #3, : ER "User termination by ESC key."
PRINT #3, cv$

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(c64$, CHR$(x))
      IF y <> 0 THEN c$ = MID$(ibm$, y, 1)
      IF x = 34 THEN c$ = CHR$(34)
      IF cv$ = "c" AND c$ = "" THEN GOSUB codes
      b$ = b$ + c$
    NEXT i
  PRINT #2, b$
LOOP WHILE EOF(1) = 0

CLOSE 1, 2, 3

END


codes:
SELECT CASE x
  CASE 5: c$ = "{Whi}"
  CASE 13: c$ = "{Ret}"
  CASE 17: c$ = "{Down}"
  CASE 18: c$ = "{Rvon}"
  CASE 19: c$ = "{Home}"
  CASE 20: c$ = "{Del}"
  CASE 28: c$ = "{Red}"
  CASE 29: c$ = "{Rigt}"
  CASE 30: c$ = "{Grn}"
  CASE 31: c$ = "{Blu}"
  CASE 129: c$ = "{Ora}"
  CASE 133: c$ = "{f1}"
  CASE 134: c$ = "{f2}"
  CASE 135: c$ = "{f3}"
  CASE 136: c$ = "{f4}"
  CASE 137: c$ = "{f5}"
  CASE 138: c$ = "{f6}"
  CASE 139: c$ = "{f7}"
  CASE 140: c$ = "{f8}"
  CASE 141: c$ = "{Sh+Ret}"
  CASE 144: c$ = "{Blk}"
  CASE 145: c$ = "{Up}"
  CASE 146: c$ = "{Rvof}"
  CASE 147: c$ = "{Clr}"
  CASE 148: c$ = "{Ins}"
  CASE 149: c$ = "{Bro}"
  CASE 150: c$ = "{LRed}"
  CASE 151: c$ = "{Gy1}"
  CASE 152: c$ = "{Gy2}"
  CASE 153: c$ = "{LGrn}"
  CASE 154: c$ = "{LBlu}"
  CASE 155: c$ = "{Gy3}"
  CASE 156: c$ = "{Pur}"
  CASE 157: c$ = "{Left}"
  CASE 158: c$ = "{Yel}"
  CASE 159: c$ = "{Cyn}"
  CASE ELSE
    IF x < 27 THEN c$ = "{CTRL+" + CHR$(64 + x) + "}"
END SELECT
RETURN

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

