home *** CD-ROM | disk | FTP | other *** search
- (****************************************************************************)
- (************* PCX File Viewer For VGA, SVGA display **********************)
- (********************* by (c) Barba 1992-93 *********************************)
- (****************************************************************************)
-
- {$F-,D-,L-,A-,B-,N-,E-,X+,G+,V-}
-
- TYPE
- header_type = RECORD
- gyarto : Byte;
- verzio : Byte;
- tipus : Byte;
- bit_pix : Byte;
- x_min : Integer;
- y_min : Integer;
- x_max : Integer;
- y_max : Integer;
- felb_h : Integer;
- felb_v : Integer;
- szinskala : ARRAY[ 1..48 ] OF Byte;
- reserved : Byte;
- szinfokozat : Byte;
- byte_sor : Integer;
- szin_szurke : Integer;
- dummy : ARRAY[ 1..58 ] OF Byte;
- END;
-
- puffer_type = ARRAY[ 1..63000 ] OF Byte;
-
- VAR
- IsVga : Boolean;
- error,x,y,x1, y1,
- z, k : Integer;
- x_size, y_size : Word;
- tomb : ARRAY[ 0..767 ] OF Byte;
- puffer : puffer_type;
- f : FILE;
- rek : Byte;
- r,g,b, mode : Byte;
- pp, i : Word;
- fnev : String;
- header : header_type;
- black_white : Boolean;
- param : String;
-
- CONST
- video_segmens : Word = $A000;
- cur_page : Byte = 255;
-
-
- PROCEDURE lapoz;ASSEMBLER;
- ASM
- mov ah, dl
- mov dx, 03C4h
- mov al, 0Eh
- out dx, al
- inc dx
- in al, dx
- and ax, 0FF0h
- xor ah, 2
- or al, ah
- out dx, al
- END;
-
- PROCEDURE DrawPixel( c: Byte; x, y : Word );ASSEMBLER;
- ASM
- pusha
- mov al, c
- mov cl, al (* szin elmentése *)
- mov ax, y
- mul x_size
- add ax, x (* az oszlop pozicio hozzáadása *)
- adc dx, 0 (* [dx:ax] a relativ fizikai cím *)
- mov bx, ax
- cmp cur_page, dl (*ugyanaz a lap, mint az elôzô rajzolásnál ? *)
- je @nem_lapoz (* ha igen , akkor nem kell lapozni *)
- mov cur_page, dl
- call lapoz (* lapozo eljárás *)
- @nem_lapoz:
- mov es, video_segmens
- mov es:[bx], cl (* képpont beírása *)
- popa
- END;
-
- FUNCTION Vga_Present: Boolean;
- VAR
- l,h : Byte;
-
- BEGIN
- IsVga := FALSE;
- ASM
- mov ah, 1Ah { funkcio kód }
- mov al, 00h;
- int 10h
- mov l, al { Aktiv display kod }
- mov h, bl
- END;
- IF ( l = $1A ) THEN { kérés támogatva }
- IF ( h= 7 ) OR ( h=8 ) THEN { VGA mono vagy VGA color }
- IsVGA := TRUE;
- Vga_Present := IsVGA;
- END;
- {--------------------------------------------------------------------------}
-
- {----------------- A fôprogram --------------------------------------------}
- BEGIN
- i := PARAMCOUNT;
- IF ( NOT Vga_Present ) THEN i := 0;
- IF ( i = 0 ) THEN
- BEGIN
- WRITELN('PCX file megjelentô csak TRIDENT VGA-n Version 1.3 1992-93 (c) Barba');
- WRITELN;
- WRITELN('Használat: PCXVIEW név[.PCX ] [grafikus mód] [X,Y] [B]');
- WRITELN;
- WRITELN('grafikus mód: ');
- WRITELN;
- WRITELN(' 0 -» 320 x 200 Video RAM 256 tól 1024 Kbyte -ig ');
- WRITELN(' 1 -» 640 x 400 Video RAM >= 512 Kbyte');
- WRITELN(' 2 -» 640 x 480 Video RAM >= 512 Kbyte');
- WRITELN(' 3 -» 800 x 600 Video RAM >= 1024 Kbyte');
- WRITELN(' 4 -» 1024 x 786 Video RAM >= 1024 Kbyte');
- WRITELN;
- WRITELN(' X,Y : kezdôkoordináta ');
- WRITELN(' B : fekete-fehér megjelenítés ');
- HALT;
- END;
-
- fnev := PARAMSTR(1);
- IF ( POS( '.', fnev ) = 0 ) THEN
- fnev := fnev + '.PCX';
-
- ASSIGN(f,fnev);
- {$I-}
- RESET(f,1);
- error := IoResult;
- IF ( error <> 0 ) THEN BEGIN
- WRITELN('File nem található !');
- EXIT;
- END;
- BlockRead(f, header, SIZEOF( header ),pp);
- CLOSE( f );
- {$I+}
-
- X1 := 0;
- Y1 := 0;
-
- CASE (header.y_max + 1) OF
- 0..200 : mode := 0;
- 201..400 : mode := 1;
- 401..480 : mode := 2;
- 481..600 : mode := 3;
- 601..1024 : mode := 4;
- END;
-
- black_white := FALSE;
-
- param := PARAMSTR(i);
- IF ( UpCASE( param[1] ) = 'B' ) THEN black_white := TRUE;
- CASE i OF
- 2 : BEGIN
- IF NOT black_white THEN VAL( PARAMSTR(2), mode, error );
- END; { case 2 }
- 3 : BEGIN
- IF NOT black_white THEN { x és y koordináta }
- BEGIN
- VAL( PARAMSTR(2), x1, error );
- IF error = 0 THEN
- VAL( PARAMSTR(3), y1, error );
- END
- ELSE VAL( PARAMSTR(2), mode, error );
- END; { case 3 }
- 4 : BEGIN
- IF NOT black_white THEN { mod + x + y }
- BEGIN
- VAL( PARAMSTR(2), mode, error );
- IF error = 0 THEN
- VAL( PARAMSTR(3), x1, error );
- IF error = 0 THEN
- VAL( PARAMSTR(4), y1, error );
- END
- ELSE BEGIN { x, y, fekete, fehér }
- VAL( PARAMSTR(2), x1, error );
- IF error = 0 THEN
- VAL( PARAMSTR(3), y1, error );
- END;
- END; { case 4 }
- 5 : BEGIN { összes paraméter }
- VAL( PARAMSTR(2), mode, error );
- IF error = 0 THEN
- VAL( PARAMSTR(3), x1, error );
- IF error = 0 THEN
- VAL( PARAMSTR(4), y1, error );
- END; { case 5 }
- END; { case i }
-
- IF ( error = 0 ) AND (mode IN[0..4]) THEN
- CASE mode OF
- 0 : BEGIN
- mode := 19;
- x_size := 320;
- y_size := 200;
- END;
- 1 : BEGIN
- mode := 92;
- x_size := 640;
- y_size := 400;
- END;
- 2 : BEGIN
- mode := 93;
- x_size := 640;
- y_size := 480;
- END;
- 3 : BEGIN
- mode := 94;
- x_size := 800;
- y_size := 600;
- END;
- 4 : BEGIN
- mode := 98;
- x_size := 1024;
- y_size := 768;
- END;
- END { case mode }
- ELSE BEGIN
- WRITELN('Rossz sorrend, vagy helytelen paraméter !');
- EXIT;
- END;
-
- {------------------- középre igazítás számítása -----------------------------}
- IF ( x1 = 0 ) AND (y1 = 0 ) THEN
- BEGIN
- X1 := ( x_size - (header.x_max+1)) DIV 2 ;
- IF x1 <0 THEN x1 := 0;
- Y1 := ( y_size - (header.y_max+1)) DIV 2 ;
- IF y1 <0 THEN y1:= 0;
- END;
- {----------------------------------------------------------------------------}
-
- {------------------------ file vizsgálat-------------------------------------}
- IF (header.tipus <> 1 ) THEN { nem pcx }
- BEGIN
- WRITELN( 'Nem PCX file !');
- HALT;
- END;
- {----------------------------------------------------------------------------}
- ASM
- mov ah, 0
- mov al, mode
- int 10h { VGA init }
- END;
-
- IF (header.verzio = 5 ) THEN { ha 3.0 -ás PCX }
- BEGIN
- ASSIGN( f,fnev );
- {$I-}
- RESET( f,1 );
- SEEK(f,FileSize(f)-3*256); { pixelek végén VGA szinskála 768 Byte }
- BlockRead(f,tomb,3*256,pp);
- CLOSE(f);
- {$I+}
-
- FOR x := 0 TO 255 DO
- BEGIN
- tomb[ 3*x ] := tomb[ 3*x ] DIV 4;
- tomb[3*x+1] := tomb[3*x+1] DIV 4;
- tomb[3*x+2] := tomb[3*x+2] DIV 4;
- END;
-
- ASM
- mov dx, seg( tomb )
- mov es, dx
- mov dx, offset( tomb )
- mov ah, 10h
- mov al, 12h
- mov bx, 0
- mov cx, 256
- int 10h { paletta init }
- END;
- END; { if }
-
- IF black_white THEN { fekete, fehér }
- BEGIN
- ASM
- mov ax, 101Bh
- mov bx, 0
- mov cx, 256
- int 10h
- END;
- END;
-
- ASSIGN( f,fnev);
- {$I-}
- RESET(f, 1 );
- BLOCKREAD( f, header, SIZEOF( header), pp);
- x := 0;
- y := 0;
- z := 0;
- i := 0;
-
- BLOCKREAD( f, puffer, SIZEOF( puffer_type ), pp );
- WHILE ( y < ( header.y_max - header.y_min +1 )) DO
- BEGIN
- IF ( i >= pp ) THEN BEGIN
- BLOCKREAD( f, puffer, SIZEOF( puffer_type ), pp );
- i := 0;
- END;
- INC( i );
- rek := puffer[i];
- z := 1;
- IF ( rek > 192 ) THEN {be van kapcsolva a két felsô BIT ? }
- BEGIN
- z := rek - 192;
- IF ( i >= pp ) THEN BEGIN
- BLOCKREAD( f, puffer, SIZEOF( puffer_type ), pp );
- i := 0;
- END;
- INC( i );
- rek := puffer[ i ];
- END;
- WHILE ( z <> 0 ) DO
- BEGIN
- INC( x );
- DrawPixel( rek, x+X1, y+Y1 );
- z := z - 1;
- END;
- IF ( x > header.x_max ) THEN
- BEGIN
- x := 0;
- INC( y );
- END;
- END;
- CLOSE( f );
- {$i+}
- ASM
- mov ah, 0
- int 16h { várokozás }
-
- mov ah, 0
- mov al, 3
- int 10h { TEXT mode 80*25 }
- END;
-
- END.
-