home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / grafik / vgakit / lbmsize / lbmsize.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1991-09-17  |  14.0 KB  |  623 lines

  1.  
  2. PROGRAM LBMSIZE;
  3. {
  4.   PROGRAMM ZUM ERZEUGEN EINES AUSSCHNITTS AUS EINEM DELUXE- PAINT LBM- FILE
  5.  
  6.   Paul Schubert, Rottweiler Str. 8, D6000 Frankfurt /M 1, 069 / 231145
  7.  
  8. }
  9. {$R-}
  10. {$S-}
  11. {$F+}
  12.  
  13. USES  TPCRT,DIRUNIT,TPSTRING
  14.       ,TPENHKBD,TPDOS
  15.       ,SVGA
  16.       ;
  17.  
  18.  
  19. CONST LINLEN   = 2048;
  20.  
  21.  
  22. TYPE  IDTYPE    = ARRAY[1..4] OF CHAR;
  23.       CMAPTYP   = ARRAY[0..255,0..2] OF BYTE;
  24.       BYTEARRAY = ARRAY[0..1] OF BYTE;
  25.  
  26. TYPE  CHUNKTYP = RECORD
  27.         KORR    : BOOLEAN;
  28.         ID      : IDTYPE;
  29.         CASE BOOLEAN OF
  30.           TRUE  : (LEN : LONGINT);
  31.           FALSE : (LBA : ARRAY[1..4] OF BYTE);
  32.       END;
  33.  
  34. TYPE  HDRTYP = RECORD
  35.         WID,HIG   : WORD;
  36.         FILL0     : ARRAY[1..4] OF BYTE;
  37.         BPP       : BYTE;
  38.         AMI1      : BYTE;
  39.         COMPR     : BYTE;
  40.         FILL      : BYTE;
  41.         FGCOL     : BYTE;
  42.         BKCOL     : BYTE;
  43.         XRAT,YRAT : BYTE;
  44.         SCWID     : WORD;
  45.         SCHIG     : WORD;
  46.       END;
  47.  
  48.  
  49. VAR   I,J                  : INTEGER;
  50.       CH1,CH2              : CHAR;
  51.       PATH,FN,FN2          : STRING;
  52.       F,F2                 : FILE;
  53.       CHUNK                : CHUNKTYP;
  54.       FTYP                 : IDTYPE;
  55.       FLEN,CHUNKPOS        : LONGINT;
  56.       CMAPSIZ              : WORD;
  57.       CMAP                 : CMAPTYP;
  58.       PAL                  : VGAPALETTETYP ABSOLUTE CMAP;
  59.       HDR                  : HDRTYP;
  60.       TW,TH                : WORD;
  61.       X,Y,XW               : WORD;
  62.       ILBM,CUT             : BOOLEAN;
  63.       LINBUF               : ARRAY[0..LINLEN] OF BYTE;
  64.       RDWID,DSPWID         : WORD;
  65.  
  66.       NWID,NHIG            : WORD;
  67.       NXSTA,NYSTA          : WORD;
  68.       FIRST,MESSEN         : BOOLEAN;
  69.  
  70.       SSP                  : ^BYTEARRAY;
  71.       COLM                 : COLORVALUE;
  72.  
  73.  
  74. PROCEDURE SAVESCREEN;
  75. BEGIN
  76.   GETMEM(SSP,65535);
  77.   VGATORAM(SSP,0,65535);
  78. END; { SAVESCREEN }
  79.  
  80.  
  81. PROCEDURE RESTORESCREEN;
  82. BEGIN
  83.   RAMTOVGA(SSP,0,65535);
  84.   FREEMEM(SSP,65535);
  85. END; { RESTORESCREEN }
  86.  
  87.  
  88. FUNCTION LSWAP(L:LONGINT):LONGINT;
  89. VAR   B   : ARRAY[0..3] OF BYTE;
  90.       B1  : BYTE;
  91.       L1  : LONGINT ABSOLUTE B;
  92. BEGIN
  93.   MOVE(L,B,4);
  94.   B1 := B[0];
  95.   B[0] := B[3]; B[3] := B1;
  96.   B1 := B[2];
  97.   B[2] := B[1];
  98.   B[1] := B1;
  99.   LSWAP := L1;
  100. END; { LSWAP }
  101.  
  102.  
  103. PROCEDURE WRITEHDR;
  104. VAR   N  : ARRAY[1..4] OF CHAR;
  105.       L  : LONGINT;
  106. BEGIN
  107.   N := 'FORM';
  108.   BLOCKWRITE(F2,N,4);
  109.   L := LONGINT(LONGINT(XWID) * LONGINT(YWID) + LONGINT(48) + LONGINT($300));
  110.   L := LSWAP(L);
  111.   BLOCKWRITE(F2,L,4);
  112.   N := 'PBM ';
  113.   BLOCKWRITE(F2,N,4);
  114.   N := 'BMHD';
  115.   BLOCKWRITE(F2,N,4);
  116.   L := LSWAP(20);
  117.   BLOCKWRITE(F2,L,4);
  118.   FILLCHAR(HDR,SIZEOF(HDR),0);
  119.   WITH HDR DO BEGIN
  120. (*
  121.     WID   := SWAP(XWID);
  122.     HIG   := SWAP(YWID);
  123. *)
  124.     WID   := SWAP(NWID - NXSTA);
  125.     HIG   := SWAP(NHIG - NYSTA);
  126.  
  127.     BPP   := 8;
  128.     COMPR := 0;
  129.     SCWID := SWAP(XWID);
  130.     SCHIG := SWAP(YWID);
  131.   END; { WITH HDR }
  132.   BLOCKWRITE(F2,HDR,SIZEOF(HDR));
  133. END; { WRITEHDR }
  134.  
  135.  
  136. PROCEDURE WRITELBM;
  137. VAR   SEGM,B1,B2  : BYTE;
  138.       X,Y         : WORD;
  139.       N           : ARRAY[1..4] OF CHAR;
  140.       L           : LONGINT;
  141.       I           : INTEGER;
  142. BEGIN
  143.  
  144.   SEGM := PORT[SEGP];
  145.   FOR I := 0 TO 255 DO BEGIN
  146.     FOR J := 0 TO 2 DO BEGIN
  147.       IF CMAP[I,J] <> 0 THEN CMAP[I,J] := (CMAP[I,J] SHL 2) OR 3;
  148.     END; { NEXT J }
  149.   END; { NEXT I }
  150.  
  151.   IF ODD(NWID - NXSTA) THEN INC(NWID);
  152.   IF ODD(NHIG - NYSTA) THEN INC(NHIG);
  153.  
  154.   ASSIGN(F2,FN2);
  155.   REWRITE(F2,1);
  156.   WRITEHDR;
  157.  
  158.   N := 'CMAP';
  159.   BLOCKWRITE(F2,N,4);
  160.   L := LSWAP(LONGINT($300));
  161.   BLOCKWRITE(F2,L,4);
  162.   BLOCKWRITE(F2,PAL,SIZEOF(PAL));
  163.   N := 'BODY';
  164.   BLOCKWRITE(F2,N,4);
  165.   L := LSWAP(LONGINT(LONGINT(NWID - NXSTA) * LONGINT(NHIG - NYSTA)));
  166.   BLOCKWRITE(F2,L,4);
  167.  
  168.   FOR Y := NYSTA TO PRED(NHIG) DO BEGIN
  169.     VGATORAM(@LINBUF,LONGINT(LONGINT(Y) * LONGINT(XWID) + NXSTA),NWID - NXSTA);
  170.     BLOCKWRITE(F2,LINBUF,NWID - NXSTA);
  171.   END; { NEXT Y }
  172.  
  173.   CLOSE(F2);
  174.  
  175.   PORT[SEGP] := SEGM;
  176. END; { WRITELBM }
  177.  
  178.  
  179. PROCEDURE GRAPHEIN(VORGABE:BYTE);
  180. BEGIN { GRAPHEIN }
  181.   SET320X200;
  182.  
  183.   IF VORGABE = 0 THEN BEGIN
  184.     WITH HDR DO BEGIN
  185.       IF WID > 320 THEN BEGIN
  186.         SET640X350;
  187.         IF HIG > 350 THEN SET640X400;
  188.         IF HIG > 400 THEN SET640X480;
  189.         IF HIG > 480 THEN SET800X600;
  190.         IF HIG > 600 THEN SET1024X768;
  191.       END;
  192.       IF WID > 640 THEN BEGIN
  193.         IF HIG <= 600 THEN SET800X600
  194.                       ELSE SET1024X768;
  195.       END;
  196.       IF WID > 800 THEN SET1024X768;
  197.     END; { WITH HDR }
  198.   END ELSE BEGIN
  199.     CASE VORGABE OF
  200.       2 : SET640X350;
  201.       3 : SET640X400;
  202.       4 : SET640X480;
  203.       5 : SET800X600;
  204.       6 : SET1024X768;
  205.     END;
  206.   END;
  207.  
  208.   I := CHECKVGA(VMOD);
  209.   IF I < 0 THEN BEGIN
  210.     TEXTMODE(CO80);
  211.     WRITELN;
  212.     WRITELN('KEINE VGA- KARTE VORHANDEN, ODER DIE VGA UNTERSTÜTZT');
  213.     WRITELN('DEN GEWÜNSCHTEN VIDEO- MODUS NICHT');
  214.     HALT(1);
  215.   END;
  216.   MAXX := PRED(XWID);
  217.   MAXY := PRED(YWID);
  218.  
  219.   VGASETPALETTE(PAL,0,PRED(CMAPSIZ));
  220.  
  221.   DIRECTVIDEO := FALSE;
  222. END; {GRAPHEIN }
  223.  
  224.  
  225. PROCEDURE READCHUNK;
  226. VAR   B  : BYTE;
  227. BEGIN
  228.   WITH CHUNK DO BEGIN
  229.     BLOCKREAD(F,ID,8);
  230.     CHUNKPOS := FILEPOS(F);
  231.     B := LBA[4]; LBA[4] := LBA[1]; LBA[1] := B;
  232.     B := LBA[3]; LBA[3] := LBA[2]; LBA[2] := B;
  233.  
  234.     KORR := ODD(LEN);
  235.     IF KORR THEN INC(LEN);
  236.   END; { WITH CHUNK }
  237. END; { READCHUNK }
  238.  
  239.  
  240. PROCEDURE NXTCHUNK;
  241. BEGIN
  242.   IF (CHUNKPOS+CHUNK.LEN) <= FILESIZE(F) THEN BEGIN
  243.     SEEK(F,CHUNKPOS+CHUNK.LEN);
  244.   END ELSE BEGIN
  245.     WRITE('CHUNK- Größe falsch : ',CHUNKPOS+CHUNK.LEN:8,FILESIZE(F):8);
  246.   END;
  247. END; { NXTCHUNK }
  248.  
  249.  
  250. PROCEDURE PUTLINE;
  251. VAR   I,J,K  : INTEGER;
  252.       W,IDX  : WORD;
  253.       B,MSK  : BYTE;
  254.       OTLN   : ARRAY[0..LINLEN] OF BYTE;
  255. BEGIN
  256.   IF HDR.BPP = 1 THEN BEGIN
  257.  
  258.     I := PRED(XW SHL 3);
  259.     J := PRED(XW);
  260.     REPEAT
  261.       FOR K := 0 TO 7 DO BEGIN
  262.         IF ODD(LINBUF[J]) THEN LINBUF[I] := 1 ELSE LINBUF[I] := 0;
  263.         LINBUF[J] := LINBUF[J] SHR 1;
  264.         DEC(I);
  265.       END; { NEXT K }
  266.       DEC(J);
  267.     UNTIL I < 0;
  268.     RAMTOVGA(@LINBUF,LONGINT(Y) * LONGINT(XWID),DSPWID);
  269.   END ELSE BEGIN
  270.     IF ILBM THEN BEGIN
  271.       IF HDR.BPP = 4 THEN MSK := $F ELSE MSK := $FF;
  272.       W := XW DIV HDR.BPP;
  273.       X := 0;
  274.       I := 0;
  275.       REPEAT
  276.         FOR J := 0 TO 7 DO BEGIN
  277.           B := 0;
  278.           IDX := I;
  279.           FOR K := 0 TO 7 DO BEGIN
  280.             B := (B SHR 1) OR (LINBUF[IDX] AND $80);
  281.             LINBUF[IDX] := LINBUF[IDX] SHL 1;
  282.             INC(IDX,W);
  283.           END;
  284.           OTLN[X] := B AND MSK;
  285.           INC(X);
  286.         END; { NEXT J }
  287.         INC(I);
  288.       UNTIL I >= W;
  289.       RAMTOVGA(@OTLN,LONGINT(Y) * LONGINT(XWID),DSPWID);
  290.     END ELSE
  291.       RAMTOVGA(@LINBUF,LONGINT(Y) * LONGINT(XWID),DSPWID);
  292.   END;
  293.   INC(Y);
  294.   X := 0;
  295. END; { PUTLINE }
  296.  
  297.  
  298. PROCEDURE READLINE;
  299. VAR   B,B2 : BYTE;
  300. BEGIN
  301.   WITH HDR DO BEGIN
  302.     IF COMPR = 0 THEN BEGIN
  303.       BLOCKREAD(F,LINBUF,XW);
  304.       PUTLINE;
  305.     END ELSE BEGIN
  306.       BLOCKREAD(F,B,1);
  307.       IF B > $7F THEN BEGIN
  308.         BLOCKREAD(F,B2,1);
  309.         FILLCHAR(LINBUF[X],257 - B,B2);
  310.         INC(X,257); DEC(X,B);
  311.         IF X >= XW THEN PUTLINE;
  312.       END ELSE BEGIN
  313.         INC(B);
  314.         BLOCKREAD(F,LINBUF[X],B);
  315.         INC(X,B);
  316.         IF X >= XW THEN PUTLINE;
  317.       END;
  318.     END;
  319.   END; { WITH HDR }
  320. END; { READLINE }
  321.  
  322.  
  323. PROCEDURE DISPLAYBODY;
  324. VAR   I,J          : INTEGER;
  325.       X1,X2,Y1,Y2  : INTEGER;
  326.       B,B2         : BYTE;
  327.       CH1,CH2      : CHAR;
  328.       RASTEIN      : BOOLEAN;
  329.  
  330. PROCEDURE TOGCURS;
  331. VAR   Z1  : LONGINT;
  332.       I   : INTEGER;
  333. BEGIN { TOGCURS }
  334.   Z1 := TIMEMS;
  335.   FOR I := 1 TO HDR.WID -2 DO BEGIN
  336.     XPLOT(I,Y1,$FF);
  337.     XPLOT(I,Y2,$FF);
  338.   END;
  339.   FOR I := 1 TO HDR.HIG -2 DO BEGIN
  340.     XPLOT(X1,I,$FF);
  341.     XPLOT(X2,I,$FF);
  342.   END;
  343.   REPEAT UNTIL (TIMEMS - Z1) > 70;
  344. END; { TOGCURS }
  345.  
  346. PROCEDURE RASTER;
  347. VAR   I,J  : INTEGER;
  348. BEGIN { RASTER }
  349.   RASTEIN := NOT RASTEIN;
  350.   I := 10;
  351.   REPEAT
  352.     J := 10;
  353.     REPEAT
  354.       XPLOT(J,I,255);
  355.       IF (I MOD 50) = 0 THEN BEGIN
  356.         XPLOT(J+5,I,255);
  357.       END;
  358.       IF (I MOD 100) = 0 THEN BEGIN
  359.         XPLOT(J+2,I,255);
  360.         XPLOT(J+8,I,255);
  361.       END;
  362.  
  363.       IF (J MOD 50) = 0 THEN BEGIN
  364.         XPLOT(J,I+5,255);
  365.       END;
  366.       IF (J MOD 100) = 0 THEN BEGIN
  367.         XPLOT(J,I+2,255);
  368.         XPLOT(J,I+8,255);
  369.       END;
  370.  
  371.       INC(J,10);
  372.     UNTIL J >= (HDR.WID - 10);
  373.     INC(I,10);
  374.   UNTIL I >= (HDR.HIG - 10);
  375. END; { RASTER }
  376.  
  377. BEGIN { DISPLAYBODY }
  378.   RASTEIN := FALSE;
  379.   WITH HDR DO BEGIN
  380.     CASE BPP OF
  381.       1 : XW := RDWID SHR 3;
  382.       4 : XW := RDWID SHR 1;
  383.       8 : XW := RDWID;
  384.     ELSE
  385.       EXIT;
  386.     END;
  387.     GRAPHEIN(0);
  388.     DSPWID := WID;
  389.     IF DSPWID > XWID THEN DSPWID := XWID;
  390.     X  := 0;
  391.     Y  := 0;
  392.     REPEAT
  393.       READLINE;
  394.     UNTIL Y >= HIG;
  395.   END; { WITH HDR }
  396.   IF MESSEN THEN BEGIN
  397.     RASTER;
  398.  
  399.     X1 := NXSTA;
  400.     X2 := PRED(HDR.WID);
  401.     Y1 := NYSTA;
  402.     Y2 := PRED(HDR.HIG);
  403.  
  404.     REPEAT
  405.       WHILE NOT KEYPRESSED DO BEGIN
  406.         TOGCURS;
  407.         TOGCURS;
  408.       END; { WHILE NOT KEYPRESSED }
  409.       CH1 := READKEY; IF CH1 = #0 THEN CH2 := READKEY ELSE CH2 := #0;
  410.       CASE CH2 OF
  411. {LINKS} #75 : BEGIN
  412.                 IF X1 > 0 THEN DEC(X1);
  413.               END;
  414. {RECHTS}#77 : BEGIN
  415.                 IF X1 <= (X2 - 8) THEN INC(X1);
  416.               END;
  417. {AUF}   #72 : BEGIN
  418.                 IF Y1 > 0 THEN DEC(Y1);
  419.               END;
  420. {AB}    #80 : BEGIN
  421.                 IF Y1 <= (Y2 - 8) THEN INC(Y1);
  422.               END;
  423.  
  424. {END}   #79 : BEGIN
  425.                 IF FN2 <> '' THEN BEGIN
  426.                   IF RASTEIN THEN RASTER;
  427.                   NWID  := SUCC(X2);
  428.                   NHIG  := SUCC(Y2);
  429.                   NXSTA := X1;
  430.                   NYSTA := Y1;
  431.                   WRITELBM;
  432.                   EXIT;
  433.                 END ELSE WRITE(#7);
  434.               END;
  435. {HOME}  #71 : BEGIN
  436.                 RASTER;
  437.               END;
  438.  
  439. {F1}    #59 : BEGIN
  440.                 SAVESCREEN;
  441. COLM := PAL[15];
  442. FILLCHAR(PAL[15],3,63);
  443. VGASETPALETTE(PAL,15,16);
  444.  
  445. TEXTCOLOR(15);
  446. GOTOXY(1,1);
  447. WRITELN(X1:5,Y1:5,' ');
  448. WRITELN(SUCC(X2-X1):5,SUCC(Y2-Y1):5,' ');
  449.                 IF READKEY = #0 THEN IF READKEY = ' ' THEN;
  450. PAL[15] := COLM;
  451. VGASETPALETTE(PAL,15,16);
  452.                 RESTORESCREEN;
  453.               END;
  454.  
  455. {C-LI} #115 : BEGIN
  456.                 IF X2 >= (X1 - 8) THEN DEC(X2);
  457.               END;
  458. {C-RE} #116 : BEGIN
  459.                 IF X2 < HDR.WID THEN INC(X2);
  460.               END;
  461. {C-AUF}#141 : BEGIN
  462.                 IF Y2 >= (Y1 - 8) THEN DEC(Y2);
  463.               END;
  464. {C-AB} #145 : BEGIN
  465.                 IF Y2 < HDR.HIG THEN INC(Y2);
  466.               END;
  467.       END; { CASE CH2 }
  468.     UNTIL CH1 = ^[;
  469.   END;
  470. END; { DISPLAYBODY }
  471.  
  472.  
  473. PROCEDURE DISPLAYCHUNK;
  474. VAR   I,J  : INTEGER;
  475. BEGIN
  476.   IF FIRST AND (CHUNK.ID <> 'FORM') THEN BEGIN
  477.     WRITELN('Der 1. Chunk muß Typ ''FORM'' sein !');
  478.     HALT;
  479.   END;
  480.   FIRST := FALSE;
  481.  
  482.   IF CHUNK.ID = 'CRNG' THEN BEGIN
  483.     NXTCHUNK;
  484.     EXIT;
  485.   END;
  486.  
  487.   IF CHUNK.ID = 'FORM' THEN BEGIN
  488.     FLEN := CHUNK.LEN;
  489.     BLOCKREAD(F,FTYP,4);
  490.     ILBM := (FTYP = 'ILBM');
  491.     EXIT;
  492.   END;
  493.  
  494.   IF CHUNK.ID = 'TINY' THEN BEGIN
  495.     BLOCKREAD(F,TW,2); TW := SWAP(TW); WRITE(TW:6);
  496.     BLOCKREAD(F,TH,2); TH := SWAP(TH); WRITE(TH:6);
  497.   END;
  498.  
  499.   IF CHUNK.ID = 'CMAP' THEN BEGIN
  500.     CMAPSIZ := CHUNK.LEN;
  501.     BLOCKREAD(F,CMAP,CMAPSIZ);
  502.     CMAPSIZ := CMAPSIZ DIV 3;
  503.     FOR I := 0 TO PRED(CMAPSIZ) DO BEGIN
  504.       FOR J := 0 TO 2 DO CMAP[I][J] := CMAP[I][J] SHR 2;
  505.     END;
  506.     EXIT;
  507.   END;
  508.  
  509.   IF CHUNK.ID = 'BMHD' THEN BEGIN
  510.     BLOCKREAD(F,HDR,SIZEOF(HDR));
  511.     WITH HDR DO BEGIN
  512.       CUT := (WID < SCWID) OR (HIG < SCHIG);
  513.  
  514.       WID := SWAP(WID);
  515.       RDWID := WID;
  516.       IF ODD(RDWID) THEN INC(RDWID);
  517.       IF ILBM AND (BPP > 1) THEN BEGIN
  518.         IF ((RDWID AND 2) > 0) THEN INC(RDWID,2);
  519.         IF ((RDWID AND 4) > 0) THEN INC(RDWID,4);
  520.         IF ((RDWID AND 8) > 0) THEN INC(RDWID,8);
  521.       END;
  522.       HIG := SWAP(HIG);
  523.       SCWID := SWAP(SCWID);
  524.       SCHIG := SWAP(SCHIG);
  525.     END; { WITH HDR }
  526.   END;
  527.  
  528.   IF CHUNK.ID = 'BODY' THEN BEGIN
  529.     DISPLAYBODY;
  530.     IF MESSEN THEN BEGIN
  531.       NWID := HDR.WID;
  532.       NWID := HDR.HIG;
  533.     END ELSE BEGIN
  534.       IF NWID > HDR.WID THEN NWID := HDR.WID;
  535.       IF NHIG > HDR.HIG THEN NWID := HDR.HIG;
  536.       WRITELBM;
  537.     END;
  538.   END;
  539.  
  540.   NXTCHUNK;
  541. END; { DISPLAYCHUNK }
  542.  
  543.  
  544. PROCEDURE AUS;
  545. BEGIN
  546.   TEXTMODE(CO80);
  547.   HALT(3);
  548. END; { AUS }
  549.  
  550.  
  551. PROCEDURE ERKLAERE;
  552. BEGIN
  553.   WRITELN;
  554.   WRITELN('LBMSIZE Inputfile[.LBM] Outputfile[.LBM] Breite Höhe [X-Startwert [Y-Startwert]]');
  555.   WRITELN;
  556.   WRITELN('oder LBMSIZE Inputfile[.LBM] Outputfile[.LBM]  zum Vermessen des Bildes');
  557.   HALT;
  558. END; { ERKLAERE }
  559.  
  560.  
  561. BEGIN { MAIN }
  562.  
  563.   IF (PARAMCOUNT = 0) OR (PARAMCOUNT = 3) THEN ERKLAERE;
  564.  
  565.   FN := PARAMSTR(1);
  566.   IF POS('.',FN) = 0 THEN FN := FN + '.LBM';
  567.   NXSTA := 0;
  568.   NYSTA := 0;
  569.  
  570.   IF PARAMCOUNT = 2 THEN BEGIN
  571.     FN2 := PARAMSTR(2);
  572.     IF POS('.',FN2) = 0 THEN FN2 := FN2 + '.LBM';
  573.   END ELSE FN2 := '';
  574.  
  575.   IF (PARAMCOUNT < 3) THEN BEGIN
  576.     MESSEN := TRUE;
  577.   END ELSE BEGIN
  578.     MESSEN := FALSE;
  579.  
  580.     FN2 := PARAMSTR(2);
  581.     IF POS('.',FN2) = 0 THEN FN2 := FN2 + '.LBM';
  582.  
  583.     VAL(PARAMSTR(3),NWID,I);
  584.     IF (I <> 0) OR (NWID < 8) OR (NWID > 1024) THEN BEGIN
  585.       WRITELN('FALSCHE BILDBREITE ',PARAMSTR(3));
  586.       HALT;
  587.     END;
  588.     VAL(PARAMSTR(4),NHIG,I);
  589.     IF (I <> 0) OR (NHIG < 8) OR (NHIG > 768) THEN BEGIN
  590.       WRITELN('FALSCHE BILDBREITE ',PARAMSTR(4));
  591.       HALT;
  592.     END;
  593.  
  594.     IF PARAMCOUNT > 4 THEN BEGIN
  595.       VAL(PARAMSTR(5),NXSTA,I);
  596.       IF (I <> 0) OR (NXSTA >= NWID) THEN BEGIN
  597.         WRITELN('FALSCHER X- START- WERT ',PARAMSTR(5));
  598.         HALT;
  599.       END;
  600.     END;
  601.     IF PARAMCOUNT > 5 THEN BEGIN
  602.       VAL(PARAMSTR(6),NYSTA,I);
  603.       IF (I <> 0) OR (NYSTA >= NHIG) THEN BEGIN
  604.         WRITELN('FALSCHER Y- START- WERT ',PARAMSTR(6));
  605.         HALT;
  606.       END;
  607.     END;
  608.   END;
  609.  
  610.   FIRST := TRUE;
  611.   ASSIGN(F,FN);
  612.   RESET(F,1);
  613.   REPEAT
  614.     READCHUNK;
  615.     DISPLAYCHUNK;
  616.   UNTIL EOF(F);
  617.   CLOSE(F);
  618.  
  619.   TEXTMODE(CO80);
  620. END.
  621.  
  622.  
  623.