'===========================================================================
' Subject: EGA PCX VIEWER                     Date: Unknown Date (00:00:00)
'  Author: G.C.Harder                         Code: QB, QBasic, PDS        
'  Origin: EGA,PCX,VIEWER                   Packet: EGAVGA.ABC
'===========================================================================
     'PCX SAVE & PCX LOAD FOR EGA SCREEN 9 (640 x 350, 16 COLOR)          
     'BY G.C.HARDER, RE-ENGINEERED FROM C SOURCE IN
     ' "FRACTAL PROGRAMMING IN C"
    
     DEFINT A-Z
     DECLARE SUB PCXSave (File$, Pal.Array%())
     DECLARE SUB PCXLoad (File$, Pal.Array%())
 
     FileName$ = "Demo4.PCX"
     SCREEN 9, 0, 1, 0
     DIM Pal.Array%(15)
     FOR I% = 0 TO 15: READ Pal.Array%(I%): NEXT
     CLS
     LOCATE 25, 30: PRINT "Loading " + FileName$;
   
     PCXLoad FileName$, Pal.Array%()
     'default Palette Colors                                             
     DATA 0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63                      

SUB PCXLoad (File$, Pal.Array%()) STATIC
        SCREEN 9, 0, 0, 0: OPEN File$ FOR BINARY AS #1: SEEK #1, 17
        DIM Byte AS STRING * 1
        FOR I% = 0 TO 15
           GET #1, , Byte: red% = ASC(Byte) / 85
           GET #1, , Byte: green% = ASC(Byte) / 85
           GET #1, , Byte: Blue% = ASC(Byte) / 85
           red% = ((red% AND 1) * 32) OR ((red% AND 2) * 2)
           green% = ((green% AND 1) * 16) OR (green% AND 2)
           Blue% = ((Blue% AND 1) * 8) OR ((Blue% AND 2) \ 2)
           Hue% = red% OR green% OR Blue%: Pal.Array%(I%) = Hue%
        NEXT
        PALETTE USING Pal.Array%(0): SEEK #1, 129: DEF SEG = &HA000
        FOR k% = 0 TO 349
           A$ = INKEY$: IF A$ = CHR$(27) THEN END
           Addr% = 80 * k%: Line.end% = Addr% + 80: J% = 1
           DO WHILE J% <= 4
              B% = J%
              IF J% = 3 THEN B% = 4
              IF J% = 4 THEN B% = 8
              OUT &H3C4, 2: OUT &H3C5, B%
              GET #1, , Byte: Byte.1% = ASC(Byte)
              IF (Byte.1% AND 192) <> 192 THEN
                 POKE Addr%, Byte.1%: Addr% = Addr% + 1
                 IF Addr% >= Line.end% THEN Addr% = 80 * k%: J% = J% + 1
              ELSE
                 Byte.1% = Byte.1% AND 63
                 GET #1, , Byte: Byte.2% = ASC(Byte)
                 FOR M% = 1 TO Byte.1%
                    B% = J%
                    IF J% = 3 THEN B% = 4
                    IF J% = 4 THEN B% = 8
                    OUT &H3C4, 2: OUT &H3C5, B%: POKE Addr%, Byte.2%
                    Addr% = Addr% + 1
                    IF Addr% >= Line.end% THEN Addr% = 80 * k%: J% = J% + 1
                 NEXT
              END IF
           LOOP
        NEXT
        OUT &H3C4, 2: OUT &H3C5, &HF: DEF SEG ': CLOSE #1
  
     END SUB

