' **** VIEWPCX.BAS - Loads a pcx from a DOS Prompt.

' Copyright 1990 Brian C. Giedt
'
' To Compile VIEWPCX.EXE use:
'
' BC VIEWPCX/O;
' BC PCXHEADR/O;
' LINK /E /NOE VIEWPCX+PCXHEADR,,NUL,GW.LIB;


DEFINT A-Z

'$INCLUDE: 'GWDecl.BAS'

DECLARE SUB WhichPCXScreen (Array$, WhichScreen%)
DECLARE SUB HandlePCXPalette (Array$, WhichScreen%)

declare Function WaitKey%
DECLARE FUNCTION CapsLock%
DECLARE FUNCTION FileSize& (filename$)
DECLARE FUNCTION DOSError%

TYPE ICONREC
   Imge(1 TO 258)  AS INTEGER
   Title AS STRING * 20
   Cmd AS STRING * 14
   PW as STRING * 5
END TYPE


'$INCLUDE: 'GetVideo'

'This program is set up to be used as an EXE.  The variable COMMAND$ tells
'the program what parameters where specified on the command line when the
'EXE is executed.  The COMMAND$ can be set using the Run Menu in QuickBASIC.




   Filename$ = COMMAND$
   L=LEN(Filename$)
   M = INSTR(Filename$, " ")

   IF L*M=0 THEN
     cls
     PRINT "SYNTAX:  PCX2ICN pcxfile icnfile"
     end
   END IF
   datfile$=RIGHT$(Filename$,L-M)
   Filename$=LEFT$(Filename$,M-1)

reclen=555

filesz& = FileSize&(datfile$)
IF filesz& < 0 THEN
   CALL FCreate(datfile$)
   IF DOSError THEN
      Print "Error creating file, ";datfile$
      END
   END IF
   filesz& = 0
END IF

norec = filesz& \ reclen
IF filesz& MOD reclen > 1 THEN
   print "Invalid Icon file, ";datfile
   END
END IF

DIM Icon AS ICONREC
DIM Image(1 TO 258)
Icon.Title=Space$(20)
Icon.Cmd=Space$(14)
Icon.PW=Space$(5)

   Array$ = SPACE$(68 + 768)
   IF NOT OpenPCXFile(Filename$, Array$) THEN
     PRINT "File Not Found"
     END
   END IF

   CALL WhichPCXScreen(Array$, WhichScreen)

   IF GPDat(31) = 4 THEN
      IF WhichScreen = 4 OR WhichScreen = 6 THEN
	GPDat(31) = WhichScreen
      ELSEIF WhichScreen = 2 AND (GPMonitor% AND &H1) THEN
	GPDat(31) = WhichScreen
      ELSE
	END
      END IF
   ELSEIF (GPDat(31) = 5) OR (GPDat(31) = 1) THEN
      IF WhichScreen = 6 THEN WhichScreen = 5
      IF WhichScreen = 2 AND (GPMonitor% AND &H1) = 0 THEN END
      IF WhichScreen = 9 THEN END
      GPDat(31) = WhichScreen
   ELSEIF (GPDat(31) = 8) OR (GPDat(31) = 7) THEN
      IF WhichScreen = 6 THEN WhichScreen = 8
      IF WhichScreen = 2 AND (GPMonitor% AND &H1) = 0 THEN END
      GPDat(31) = WhichScreen
   ELSEIF GPDat(31) = 2 THEN
      IF WhichScreen <> 2 THEN END
   END IF

   y = 349
   'Set the proper screen mode
   IF GPDat(31) = 1 THEN
      SCREEN 7
   ELSEIF GPDat(31) = 5 THEN
      SCREEN 9
   ELSEIF GPDat(31) = 8 THEN
      SCREEN 12
      y = 479
   ELSEIF GPDat(31) = 9 THEN
      SCREEN 13
   ELSEIF GPDat(31) = 4 THEN
      SCREEN 1
   ELSEIF GPDat(31) = 6 THEN
      SCREEN 2
   ELSEIF GPDat(31) = 2 THEN
      CALL Screen3(0)
   END IF

   CALL HandlePCXPalette(Array$, WhichScreen)

      CALL DispPCXVE(0)
      V = 0
      U = 0
      W=U+33
      X=V+33
      CALL LineBVE(BYVAL U, BYVAL V, BYVAL W, BYVAL X,6146)
      DO
       I = WaitKey%
       CALL LineBVE(BYVAL U, BYVAL V, BYVAL W, BYVAL X,6146)
         SELECT CASE I
           CASE -72 'up
             if CapsLock% then V=V-5 else V=V-1
           CASE -75 'left
             if CapsLock% then U=U-5 else U=U-1
           CASE -77 'right
             if CapsLock% then U=U+7 else U=U+1
           CASE -80 'down
             if CapsLock% then V=V+5 else V=V+1
           case 13
             IF norec < 32767 THEN
               recno = norec + 1
               GET (U+1,V+1)-(W-1, X-1), Image
               FOR j = 1 TO 258
                   Icon.Imge(j) = Image(j)
               NEXT j
               CALL FOpen(datfile$, Handle%)
               Num& = recno
               CALL FPutRT(Handle%, Icon, Num&, reclen)
               CALL FClose(Handle%)
               IF DOSError THEN goto abort
               filesz& = FileSize&(datfile$)
               norec = filesz& \ reclen
             END IF
         END SELECT
         if V<0 then V=0
         IF U <0 THEN U=0
         IF U > 605 THEN U=605
         if V>445 then V=445
         W=U+33
         X=V+33
         CALL LineBVE(BYVAL U, BYVAL V, BYVAL W, BYVAL X,6146)
      LOOP UNTIL I = 27

abort:
   CALL Screen0(0)
end
