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

    uses crt;
    {
      Public Domain Code By David Henningsson 1996 (DIWIC)
      Spread it and use it, if you like.
      Written in Turbo Pascal 6.0
      Warning: This stuff is very slow and inoptimal.
      Do some "brain physics" and speed it up yourself!
    }

    const Svgatext:Array[0..4,0..15] of Byte = (
    (0,1,1,0,1,0,1,0,0,1,1,0,0,1,0,0),
    (1,0,0,0,1,0,1,0,1,0,0,0,1,0,1,0),
    (0,1,0,0,1,0,1,0,1,0,1,0,1,1,1,0),
    (0,0,1,0,1,1,1,0,1,0,1,0,1,0,1,0),
    (1,1,0,0,0,1,0,0,0,1,1,0,1,0,1,0));

    var Pro:Procedure;
        CurBank:Byte;

    { Only for 640x480x256 }
    Procedure PutVpixel(X,Y:Word;F:Byte); assembler;
    asm
      mov ax,640
      mul Y
      add ax,X     { If this putpixel routine seems to skip parts of the screen }
      adc dx,0     { or overwrites stuff already written }
      mov bx,4096  { <- try changing this number (to another power of two) }
      div bx   { This line is inoptimal... }
      xchg ax,dx
      push ax
      cmp dl,CurBank
      je @@DontSwitchBanks
      mov CurBank,dl
      mov ax,$4F05
      mov bx,0
      Call Pro
    @@DontSwitchBanks:
      pop di
      mov ax,0A000h
      mov es,ax
      mov al,F
      stosb
    end;

    { Goes a little bit faster, inline bank switching, only for Cirrus Logic }
    { Have tried to optimize it a bit }
    Procedure PutVpixel2(X,Y:Word;F:Byte); assembler;
    asm
      mov ax,640
      mul Y
      add ax,X
      adc dx,0
      mov di,ax
      mov ah,dl
      shl ah,4
      cmp ah,CurBank
      je @@DontSwitchBanks
      mov CurBank,ah
      mov dx,$3CE
    {  in al,dx  }     { These four lines don't seem to be needed. If there is }
    {  mov bl,al }     { trouble, try putting them back in business.}
      mov al,9
      out dx,ax
    {  mov al,bl }
    {  out dx,al }
    @@DontSwitchBanks:
      mov ax,0A000h
      mov es,ax
      mov al,F
      stosb
    end;

    var I,J:Integer;
        K,L,M:Byte;
        Pal:Array[0..255,1..3] of Byte;

    begin
      asm
        mov ax,$4F02
        mov bx,$101
        int 10h     { Set SVGA mode: 640x480x256 }
        mov ax,$4F01
        mov cx,$101
        push ds
        pop es
        mov di,OFFSET Pal
        int 10h
        mov di,OFFSET Pal+12
        mov bx,[di]
        mov cx,[di+2]
        mov WORD [Pro],bx
        mov WORD [Pro+2],cx  { Look up pointer to bank switcher }
      end;
      CurBank := 255; { Will always switch banks the first time }
      Fillchar(Pal,Sizeof(Pal),0);
      For I := 0 to 63 do begin
        Pal[I,1] := I;
        Pal[I+64,1] := 63-I;
        Pal[I+64,2] := I;
        Pal[I+128,2] := 63-I;
        Pal[I+128,3] := I;
        Pal[I+192,3] := 63-I;
      end;
      asm
        cld
        mov si,OFFSET Pal
        mov cx,256*3
        mov dx,$3C8
        mov al,0
        out dx,al
        inc dx
        rep outsb { Set palette }
      end;

    { K is random, since it is uninitialized! }
      For J := 0 to 479 div 6 do begin
        For I := 0 to 639 div 16 do begin
          Inc(K);
          For L := 0 to 4 do
            For M := 0 to 15 do
              If Svgatext[L,M] <> 0 then
                PutVPixel(I*16+M,J*6+L,K); { Here is the inoptimal stuff lying }
        end;
        Dec(K,43);
      end;
      Directvideo := FALSE;
      Textattr := 128;
      WindMax := 30*256+80; { Sets up the CRT unit }
      GotoXY(28,15);
      Writeln('Is this SVGA or aint it?');
      GotoXY(25,17);
      Writeln('Is this 640x480x256 or aint it?');
      REadkey;
      Textmode(3);
    end.

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