[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]

    >> I need to put a 64k Raw Image onto Page 0 in 320x200 X-Mode.
    >
    > Bas van Gaalen
    >Well, that wasn't too hard. Faster then the following one doesn't seem
    >possible. Don't try to make the f_bufsize too large: it'll probably hang your
    >computer and it won't speed up the picture display. You could, however, set the
    >palette to all black when displaying the picture, and when it's ready, set the
    >colors of the picture correctly.

    Actually, you can make it a lot faster.
    Since I haven't seen the original post, there is no way for me to know what
    you need this for, but to speed up execution speed, I've divided it into
    two files, raw2mxi, and viewmxi.  If it is intended for a viewer (but
    then you wouldn't use mode X at all, I guess), there should be no problems
    rewriting it, sorry for the slow disk read/write routines, but I'm a little
    rusty in Pascal. (Haven't used it the last half year.)
    There is two differences, one I write to the change plane ports 4 times
    while van Gaalen wrote to the ports each time he drew a pixel, and when I
    draw, I just use int 21 (Yes, I know this might be slower, but on slower
    machines, you may actually gain speed on slower systems because the DOS
    file handler uses DMA to write directly to the memory area.

    ---------- cut here ----------- start ---------------- raw2mxi.pas ------------

    {$A+,B-,D+,E+,F-,G+,I+,L+,N+,O-,P-,Q-,R-,S+,T-,V+,X+} { TP7.0 Directives }
    {$M 16384,0,655360}

    PROGRAM OptimizeImageForModeX;
    { Program to optimize raw images for mode X, written by Kjetil Furnes, AKA
      ShadowBeam. E-Mail: hefurnes@online.no
      it assumes that the given file is a raw image without a header (i.e. it
      only contains the pixel color information. I leave it up to the coder to
      add the pallette since he wanted it to be a raw image (for the uninitated,
      a raw image is basically a string of bytes. There is nothing that indicates
      the pallette, the size of the image or anything.

      And yes, I know I could probably optimize this code a lot, but I'm lazy :)
      and this doesn't affect run-time of the other part of the program.
    }

    USES
      CRT, DOS;

    VAR
      f: FILE OF BYTE;
      T: FILE OF BYTE;

      buffer: ARRAY[0..63999] OF BYTE;
      ca, cb, cc: WORD;

    FUNCTION InFile(FileName: PathStr): BOOLEAN;
    BEGIN
      IF FileName = '' THEN BEGIN
        WriteLn('Please supply a raw-image filename.');
        InFile := False;
        Exit;
      END;
      Assign(f, FileName);
      {$I-} Reset(f); {$I+}
      IF IOResult <> 0 THEN BEGIN
        WriteLn(fexpand(filename) + ' not found.');
        InFile := False;
        Exit;
      END;
      ASM
        push DS
        mov BX, SEG f
        mov DS, BX
        lea BX, [f]
        mov BX, [BX]
        pop DS
        lea DX, [buffer]

        mov BX, SI
        mov AH, 3Fh
        mov CX, 16000
        int 21h

      END;
      FOR ca := 0 TO 63999  DO Read(f, buffer[ca]);
      Close(f);
      InFile := True;
    END;

    PROCEDURE OutFile(P: PathStr);
    VAR D: DirStr; N: NameStr; E: ExtStr;

    BEGIN
      FSplit(P, D, N, E);
      E := '.mxi';
      P := D + N + E;
      Assign(T, P);
      rewrite(T);
      FOR cc := 0 TO 3 DO BEGIN
          cb := cc;
        FOR ca := 0 TO 15999 DO BEGIN
            Write(T, buffer[cb]);
            cb := cb + 4;
        END;
      END;
      Close(T);
      WriteLn('File was successfully completed.');
    END;

    BEGIN
      IF InFile(ParamStr(1)) THEN OutFile(ParamStr(1));
    END.

    ---------- cut here ------------ end ----------------- raw2mxi.pas ------------
    ---------- cut here ----------- start ---------------- mxidraw.pas ------------

    {$A+,B-,D+,E+,F-,G+,I+,L+,N+,O-,P-,Q-,R-,S+,T-,V+,X+} { TP7.0 Directives }
    {$M 16384,0,655360}

    PROGRAM DrawModeXImage;
    { Program to display mxi images in mode X 320x200x256, written by Kjetil
      Furnes, AKA ShadowBeam. E-Mail: hefurnes@online.no
      it assumes that the given file is a mxi image, that is, a raw image
      converted by the raw2mxi (and in case you are wondering. Mode X Image)

      Oh, and close an image file before you open another, you don't have an
      endless amount of file allocation space.
    }
    uses
      CRT, DOS;

    var
      f: FILE OF BYTE;
      video    :ARRAY [0..63999] OF BYTE ABSOLUTE $0A000:$0;
      ca, cb, cc: WORD;

    PROCEDURE SetModeX; ASSEMBLER;
    ASM
        mov AX, 13h;
        int 10h;
        mov DX, 3C4h;
        mov AX, 0604h;
        out DX, AX;
        mov AX, 0F02h
        out DX, AX;
        mov CX, 64000;
        mov AX, 0A000h;
        mov ES, AX
        xor AX, AX;
        mov DI, AX;
    rep stosw
        mov DX, 3D4h;
        mov AX, 0014h;
        out DX, AX;
        mov AX, 0E317h;
        out DX, AX;
    END;

    PROCEDURE Retrace; ASSEMBLER;
    ASM
        mov DX, 3DAh;
    @V1:
        in AL, DX;
        test AL, 8;
        jz @V1
    @V2:
        in AL, DX;
        test AL, 8;
        jnz @V2;
    END;

    FUNCTION LoadMXI(FileName: PathStr): BOOLEAN;
    BEGIN
      IF FileName = '' THEN BEGIN
        WriteLn('Please supply a mxi-image filename.');
        LoadMXI := False;
        Exit;
      END;
      Assign(f,FileName);
      {$I-} Reset(f); {$I+}
      IF IOResult <> 0 THEN BEGIN
        WriteLn(fexpand(filename) + ' not found.');
        LoadMXI := False;
        Exit;
      END;
      LoadMXI := True;
    END;

    PROCEDURE DrawMXI;
    BEGIN
      ASM
        push DS
        push SI
        mov SI, SEG f
        mov DS, SI
        lea SI, [f]
        mov SI, [SI]
        mov AX, 0A000h
        mov DS, AX

        mov DX, 03C4h;
        mov AX, 102h;
        out DX, AX;

        xor DX, DX
        mov BX, SI
        mov AH, 3Fh
        mov CX, 16000
        int 21h

        mov DX, 03C4h;
        mov AX, 202h;
        out DX, AX;

        xor DX, DX
        mov BX, SI
        mov AH, 3Fh
        mov CX, 16000
        int 21h

        mov DX, 03C4h;
        mov AX, 402h;
        out DX, AX;

        xor DX, DX
        mov BX, SI
        mov AH, 3Fh
        mov CX, 16000
        int 21h

        mov DX, 03C4h;
        mov AX, 802h;
        out DX, AX;

        xor DX, DX
        mov BX, SI
        mov AH, 3Fh
        mov CX, 16000
        int 21h

        pop SI
        pop DS
      END;
      Reset(f);
    END;

    BEGIN
      IF LoadMXI(ParamStr(1)) = FALSE THEN Exit;
      SetModeX;
      Retrace;

      DrawMXI;

      ReadKey;
      Close(f);
    END.

    ---------- cut here ------------ end ----------------- mxidraw.pas ------------

    That's all I guess.

    Just to be on the safe side:
    I'm allowing anyone to use this code without any restrictions or legalities,
    except that the one who compiles this code takes responsibility for what
    happens with the machine, this code will work if the machine is set up
    correctly, but I don't know how it'll work on a machine without a vga
    compatible device connected since the code write to some of its prots.

    						- Kjetil Furnes

[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]