home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 13 / CD_ASCQ_13_0494.iso / news / swag / egavga.swg < prev    next >
Text File  |  1994-03-11  |  289KB  |  1 lines

  1. SWAGOLX.EXE (c) 1993 GDSOFT  ALL RIGHTS RESERVED 00101         EGA/VGA ROUTINES                                                  1      05-28-9313:39ALL                      SWAG SUPPORT TEAM        BESTFADE.PAS             IMPORT              12     Üd.p {πREYNIR STEFANSSONππ     Here is yet another fade-in routine. This one does a proportional fadeπof all colours.π}ππProgram FadeDemo;ππUsesπ  Crt;ππConstπ  PelAddrRgR  = $3C7;π  PelAddrRgW  = $3C8;π  PelDataReg  = $3C9;ππTypeπ  rgb = Recordπ    r, g, b : Byte;π  end;ππVarπ  i   : Integer;π  ch  : Char;π  col : Array[0..63] of rgb;ππProcedure GetCol(C : Byte; Var R, G, B : Byte);πbeginπ  Port[PelAddrRgR] := C;π  R := Port[PelDataReg];π  G := Port[PelDataReg];π  B := Port[PelDataReg];πend;ππProcedure SetCol(C, R, G, B : Byte);πbeginπ  Port[PelAddrRgW] := C;π  Port[PelDataReg] := R;π  Port[PelDataReg] := G;π  Port[PelDataReg] := B;πend;ππProcedure SetInten(b : Byte);πVarπ  i  : Integer;π  fr,π  fg,π  fb : Byte;πbeginπ  For i := 0 to 63 DOπ  beginπ    fr := col[i].r * b div 63;π    fg := col[i].g * b div 63;π    fb := col[i].b * b div 63;π    SetCol(i, fr, fg, fb);π  end;πend;ππbeginπ  TextMode(LastMode);π  For i := 0 to 63 DOπ    GetCol(i, col[i].r, col[i].g, col[i].b);π  For i := 1 to 15 DOπ  beginπ    TextAttr := i;π    WriteLn('Foreground colour = ', i : 2);π  end;π  ch := ReadKey;π  For i := 63 DOWNTO 0 DOπ  beginπ    SetInten(i);π    Delay(20);π  end;π  GotoXY(1, 1);π  For i := 15 DOWNTO 1 DOπ  beginπ    TextAttr := i;π    WriteLn('Foreground colour = ', i : 2);π  end;ππ  For i := 0 to 63 DOπ  beginπ    SetInten(i);π    Delay(20);π  end;π  ch := ReadKey;π  TextMode(LastMode);πend.π  2      05-28-9313:39ALL                      SWAG SUPPORT TEAM        BGIEXE2.PAS              IMPORT              7      Üd±ƒ {π>How do I compile a Graphic Program With the Graph included.ππI think what you'd like to be included in your EXE File are the BGI drivers ;πhere is a sample code to include the EGAVGA.BGI driver in your EXE :π}ππUnit EgaVga;ππInterfaceππUsesπ  Graph;ππImplementationππ{$L EgaVga}πProcedure DriverEgaVga; External;ππbeginπ  If RegisterBGIDriver(@DriverEgaVga)<0 Thenπ    Halt(1);πend.ππ{πWhat you need to do is just include the Unit in your 'Uses' statement.πWell, prior to do this, you'll need to enter the following command atπthe Dos prompt :ππBinObj EGAVGA.BGI EGAVGA.Obj DriverEgaVgaππYou cand do the same For the other .BGI Files, and even For the .CHR (font)πFiles -just replacing RegisterBGIDriver With RegisterBGIFont, I think.π}                             3      05-28-9313:39ALL                      SWAG SUPPORT TEAM        BITFONTS.PAS             IMPORT              130    Üd@j {π>I need to Write some Pascal code For a PC that will allow Text modeπ>fonts to be changed (at least on PC's With VGA adapters).ππ>Prof. Salmi's FAQ lists a book by Porter and Floyd, "Stretchingπ>Turbo Pascal", as having the relevant information, but my localπ>bookstore claims this is out of print.ππYou could try borrowing the book from the library.  For instance oursπwill search For books; I rarely buy books.  STP:v5.5 was an exception.πHere is code (substantially based on Porter and Floyds' code) writtenπfor version 5.x .  Actually, aside from this stuff, the book wasn't asπgood as I thought it would be.  I believe Ken Porter died and parts ofπthe book seem missing.  This code, For instance, isn't well documentedπin the book (althought I think its clear how to use it from theseπPrograms).ππYou know, after playing With this code I thought I knew it all :DπIt turns out that there is a lot more you can do.  For instance, theπintensity bit can be used as an extra Character bit to allowπ512-Character fonts.  I have an aging PC Magazine article (that Iπhaven't gotten around to playing with) that has some Asm code For theπEGA.  (I'm hoping the same code will work For the VGA).π}π{--[rounded.pas]--}ππProgramπ  Rounded;πUsesπ  Crt, BitFonts;ππTypeπ  matrix = Array[0..15] of Byte;ππConstπ  URC : matrix = ($00,$00,$00,$00,$00,$00,$00,$C0,$70,$30,$18,$18,$18,$18,$18,$18);π  LLC : matrix = ($18,$18,$18,$18,$0C,$0E,$03,$00,$00,$00,$00,$00,$00,$00,$00,$00);π  LRC : matrix = ($18,$18,$18,$18,$30,$70,$C0,$00,$00,$00,$00,$00,$00,$00,$00,$00);π  ULC : matrix = ($00,$00,$00,$00,$00,$00,$00,$03,$0E,$0C,$18,$18,$18,$18,$18,$18);π{  ULC : matrix = ($00,$00,$00,$00,$00,$03,$0E,$19,$33,$36,$36,$36,$36,$36,$36,$36);}πVarπ  index,b      : Word;π  package      : fontPackagePtr;π  FontFile     : File of FontPackage;π  EntryFont    : ROMfont;ππ  Procedure TextBox( left, top, right, bottom, style : Integer );π    Constπ      bord : Array[1..2,0..5] of Char = ( ( #196,#179,#218,#191,#217,#192 ),π                                          ( #205,#186,#201,#187,#188,#200 ));π    Var P:Integer;ππ    beginπ      if Style = 0 then Exit; { what the fuck is this For ? }ππ      { verify coordinates are in ( NW,SE ) corner }π      if left > right thenπ        beginπ          p := left; left := right; right := p;π        end;π      if bottom < top thenπ        beginπ          p := top; top := bottom; bottom := p;π        end;ππ      { draw top }π      GotoXY( left,top );π      Write( bord[style,2] );π      For p := left+1 to right-1 doπ        Write( bord[style,0]);π      Write( bord[style,3] );ππ      { draw bottomm }π      GotoXY( left,bottom );π      Write( bord[style,5]);π      For p := left+1 to right-1 doπ        Write( bord[style,0]);π      Write( bord[style,4]);ππ      { draw sides }π      For p := top+1 to bottom-1 doπ        beginπ          GotoXY( left,p );π          Write( bord[style,1] );π          GotoXY( right,p );π          Write( bord[style,1] );π        end;π    end; { Procedure TextBox }ππ  Procedure replace( ASCII:Word; newChar:matrix );π    Var offset,b:Word;π    beginπ      offset := ASCII * VDA.points;π      For b := 0 to VDA.points-1 doπ        package^.ch[offset+b] := newChar[b];π    end;ππbeginπ  if not isEGA thenπ    beginπ      Writeln( 'You can only run this Program on EGA or VGA systems' );π      halt( 1 );π    end;π  {- fetch copy of entry font -}π  EntryFont := CurrentFont;π  Package := FetchHardwareFont( CurrentFont );ππ  {- replace the corner Characters -}π  replace( 191,URC );π  replace( 192,LLC );π  replace( 217,LRC );π  replace( 218,ULC );ππ  {- load and active user-modified font -}π  Sound( 1000 );π  LoadUserFont( package );π  NoSound;ππ  {- Draw a Text box -}π  ClrScr;π{  CursorOff; }π  TextBox( 20,5,60,20,1 );π  GotoXY( 33,12 ); Write( 'rounded corners' );π{  WaitForKey;}π  readln;ππ  {- save user-modified font to File -}π  assign( FontFile, 'HELLO' );π  reWrite( FontFile );π  Write( FontFile,Package^ );π  close( FontFile );ππ  {- clear and quit -}π  SetHardWareFont( EntryFont );π  ClrScr;π{  CursorOn;}ππend.ππ{--[editfnt2.pas]--}ππProgram EditFont;ππUses Crt, Dos, BitFonts;ππConstπ  Block = #220;π  Esc = #27;πVarπ  c,π  Choice : Char;π  EditDone,π  Done,π  Valid  : Boolean;π  Font   : ROMfont;π  package : FontPackagePtr;π  fout : File of FontPackage;π  foutfil : String;ππFunction UpperCase( s:String ): String;π  Var i:Byte;π  beginπ    For i := 1 to length( s ) doπ      s[i] := UpCase( s[i] );π    UpperCase := s;π  end;πππFunction HexByte( b:Byte ):String;π  Const DIGIT : Array[0..15] of Char = '0123456789ABCDEF';π  beginπ    HexByte := Digit[b SHR 4] + Digit[b and $0F];π  end;πππFunction ByteBin( Var bs:String ):Byte;π  Const DIGIT : Array[0..15] of Char = '0123456789ABCDEF';π  Var i,b:Byte;π  beginπ    b := 0;π    For i := 2 to length( bs ) doπ      if bs[i] = '1' thenπ        b := b + 2 SHL (i-1);π    if bs[1] = '1' thenπ      b := b + 1;π    ByteBin := b;π  end;πππProcedure Browse( Font:ROMfont );ππ{π    arrow keys to manueverπ    Esc to acceptπ    Enter or space to toggle bitπ    C or c to clear a rowπ    alt-C or ctl-C to clear whole Charππ}π  Constπ    MapRow = ' - - - - - - - - ';π    MapTop = 7;ππ  Varπ    ASCII,π    row,π    col,π    index,π    bit   : Word;π    f     : Char_table;π    s     : String;π    error : Integer;ππ  Procedure putChar( value:Word );π    Var reg:Registers;π    beginπ      reg.AH := $0A;π      reg.AL := Byte( value );π      reg.BH := 0;π      reg.BL := LightGray;π      reg.CX := 1;π      intr( $10,reg );π      GotoXY( WhereX+1, WhereY );π    end; { proc putChar }ππ  beginπ    GetMem( Package, SizeOf( Package^ ));π    ClrScr;π    Package := FetchHardwareFont( Font );π    Repeatπ      GotoXY( 1,1 );π      Write( 'FONT: ' );π      Case Font ofπ        ROM8x8  : Writeln( '8 x 8' );π        ROM8x14 : Writeln( '8 x 14' );π        ROM8x16 : Writeln( '8 x 16' );π      end;π      Writeln;π      clreol;π      Write( 'ASCII value to examine? (or QUIT to quit) ' );π      readln( s );π      Val( s,ASCII,error );π      if error <> 0 thenπ        if UpperCase( s ) = 'QUIT' thenπ          Done := Trueπ        elseπ          ASCII := Byte( s[1] );ππ      { show the Character image }π      clreol;π      Write( '(Image For ASCII ',ASCII,' is ' );π      putChar( ASCII );π      Writeln( ')' );ππ      { display blank bitmap }π      GotoXY( 1,MapTop );π      For row := 1 to Package^.FontInfo.points doπ        Writeln( maprow );ππ      { explode the image bitmap }π      index := Package^.FontInfo.points * ASCII;π      For row := 0 to Package^.FontInfo.points-1 doπ        beginπ          For bit := 0 to 7 doπ            if (( Package^.Ch[index] SHR bit ) and 1 ) = 1 thenπ              beginπ                col := ( 8 - bit ) * 2;π                GotoXY( col,row+MapTop );π                Write( block );π              end;π          GotoXY( 20,row+MapTop );π          Write( hexByte( Package^.Ch[index] )+ 'h' );π          inc( index );π        end;πππ      { edit font }π      col := 2;π      row := MapTop;π      EditDone := False;π      index := Package^.FontInfo.points * ASCII;ππ      While ( not Done ) and ( not EditDone ) doπ        beginπ          GotoXY( col,row );π          c := ReadKey;π          if c = #0 thenπ            c := ReadKey;ππ          Case c ofππ            #03,         { wipe entire letter }π            #46 : beginπ                    index := Package^.FontInfo.points * ASCII;π                    For row := MapTop to MapTop+Package^.FontInfo.points-1 doπ                      beginπ                        Package^.Ch[index] := 0;π                        col := 2;π                        GotoXY( col,row );π                        Write( '- - - - - - -' );π                        GotoXY( 20,row );π                        Write( hexByte( Package^.Ch[index] )+ 'h' );π                        GotoXY( col,row );π                        inc( index );π                      end;π                  end;ππ            'C',         { wipe row }π            'c' : beginπ                    Package^.Ch[index] := 0;π                    col := 2;π                    GotoXY( col,row );π                    Write( '- - - - - - -' );π                    GotoXY( 20,row );π                    Write( hexByte( Package^.Ch[index] )+ 'h' );π                    GotoXY( col,row );π                  end;πππ            #27 : EditDone := True;  { esc }ππ            #72 : begin  { up }π                    if row >  MapTop thenπ                      beginπ                        dec( row );π                        dec( index );π                      end;π                  end;ππ            #80 : begin  { down }π                    if row < ( MapTop + Package^.FontInfo.points - 1 ) thenπ                      beginπ                        inc( row );π                        inc( index );π                      end;π                  end;ππ            #77 : begin  { right }π                    if col < 16 thenπ                      inc( col,2 );π                  end;ππ            #75 : begin  { left }π                    if col > 3 thenπ                      dec( col,2 );π                  end;ππ            #13,π            #10,π            ' ' : beginπ                    bit := 8 - ( col div 2 );π                    if (( Package^.Ch[index] SHR bit ) and 1 ) = 1 thenπ                      beginπ                        Package^.Ch[index] := ( Package^.Ch[index] ) ANDπ                                               ($FF xor ( 1 SHL bit ));π                        Write( '-' )π                      endπ                    elseπ                      beginπ                        Package^.Ch[index] := Package^.Ch[index] XORπ                                              ( 1 SHL bit );π                        Write( block );π                      end;ππ                    GotoXY( 20,row );π                    Write( hexByte( Package^.Ch[index] )+ 'h' );π                    GotoXY( col,row );π                  end;ππ          end; { Case }ππ          LoadUserFont( Package );ππ        end; { While }ππ    Until Done;ππ    GotoXY( 40,7 );π    Write( 'Save to disk? (Y/n) ');π    Repeatπ      c := UpCase( ReadKey );π    Until c in ['Y','N',#13];π    if c = #13 thenπ      c := 'Y';π    Write( c );ππ    if c = 'Y' thenπ      beginπ        GotoXY( 40,9 );π        ClrEol;π        Write( 'Save as: ');π        readln( foutfil );ππ(*        if fexist( foutfil ) thenπ          beginπ            GotoXY( 40,7 );π            Write( 'OverWrite File ''',foutfil,''' (y/N) ');π            Repeatπ              c := UpCase( ReadKey );π            Until c in ['Y','N',#13];π            if c = #13 thenπ              c := 'N';π            Write( c );π          end;π*)π        {$I-}π        assign( fout,foutfil ); reWrite( fout );π        Write( fout,Package^ );π        close( fout );π        {$I+}π        GotoXY( 40,11 );π        if ioResult <> 0 thenπ          Writeln( 'Write failed!' )π        elseπ          Writeln( 'Wrote font to File ''',foutfil,'''.' );π      end;πππ  end; { proc Browse }πππbeginππ  Done := False;π  { get font to view }π  Repeatπ    Valid := False;π    Repeatπ      ClrScr;π      Writeln( 'Fonts available For examination: ' );π      Writeln( '    1. 8 x 8' );π      if isEGA thenππ        Writeln( '    2. 8 x 14' );π      if isVGA thenπ        Writeln( '    3. 8 x 16' );π      Writeln;π      Write( '    Select by number (or Esc to quit) ' );π      choice := ReadKey;π      if Choice = Esc thenπ        beginπ          ClrScr;π          Exit;π        end;π      if Choice = '1' then Valid := True;π      if ( choice = '2' ) and isEGA then Valid := True;π      if ( Choice = '3' ) and isVGA then Valid := True;π    Until Valid;ππ    { fetch and display selected font }π    Case choice ofπ      '1' : Font := ROM8x8;π      '2' : Font := ROM8x14;π      '3' : Font := ROM8x16;π    end;π    Browse( font );π  Until Done;π  GotoXY( 80,25 );π  Writeln;π  Writeln( 'Thanks you For using EditFont which is based on code from' );π  Writeln( '_Stretching Turbo Pascal_ by Kent Porter and Mike Floyd.' );π  Writeln;π  Writeln( 'This Program was developed 12 Apr 92 by Alan D. Mead.' );πend.ππ{--[bitfonts.pas]--}πππUnit BitFonts;π  { support For bit-mapped Text fonts on EGA/VGA }ππInterfaceππTypeπ              { enumeration of ROM hardware fonts }π  ROMfont = ( ROM8x14, ROM8x8, ROM8x16 );ππ              { Characetr definition table }π  CharDefTable = Array[0..4095] of Byte;π  CharDefPtr   = ^CharDefTable;ππ              { For geting Text Character generators }π  Char_table = Recordπ                 points : Byte;       { Char matrix height }π                 def    : CharDefPtr; { address of table }π               end;ππ              { font format }π  FontPackage = Recordπ                  FontInfo : Char_Table;π                  ch       : CharDefTable;π                end;π  FontPackagePtr = ^FontPackage;ππ              { table maintained by video ROM BIOS at 40h : 84h }π  VideoDataArea = Recordπ                    rows   : Byte;  { Text rows on screem - 1 }π                    points : Word;    { height of Char matrix }π                    info,               { EGA/VGA status info }π                    info_3,           { EGA/VGA configuration }π                    flags  : Word;               { misc flags }π                  end;           { remainder of table ignored }ππ              { globally visible }πVarπ  VDA         : VideoDataArea Absolute $40:$84;   { equipment flags }π  isEGA,π  isVGA,π  isColor     : Boolean;π  CurrentFont : ROMfont; { default hardware font }ππProcedure GetCharGenInfo( font:ROMfont; Var table:Char_table );πProcedure SetHardWareFont( font:ROMfont );πFunction FetchHardwareFont( font:ROMfont ):FontPackagePtr;πProcedure LoadUserFont( pkg:FontPackagePtr );ππ{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }ππImplementationππUses Dos, Crt {, TextScrn} ;ππVar reg:Registers;ππProcedure GetCharGenInfo( font:ROMfont; Var table:Char_table );π  beginπ    if isEGA thenπ      beginπ        reg.AH := $11;π        reg.AL := $30;π        Case font ofπ          ROM8x8  : reg.BH := 3;π          ROM8x14 : reg.BH := 2;π          ROM8x16 : reg.BH := 6;π        end;π        intr( $10,reg );π        table.def := ptr( reg.ES,reg.BP ); { address of definition table }π        Case font ofπ          ROM8x8  : table.points :=  8;π          ROM8x14 : table.points := 14;π          ROM8x16 : table.points := 16;π        end;π      end;π  end; { proc GetCharGenInfo }πππProcedure SetHardWareFont( font:ROMfont );π  beginπ    if isEGA thenπ      beginπ        Case Font ofπ          ROM8x14 : reg.AL := $11;π          ROM8x8  : reg.AL := $12;π          ROM8X16 : if isVGA thenπ                      reg.AL := $14π                    elseπ                      beginπ                        reg.AL := $12;π                        font := ROM8x14;π                      end;π        end;π        reg.BL := 0;π        intr( $10,reg );π        CurrentFont := font;π      end;π  end; { proc SetHardwareFont }πππFunction FetchHardwareFont( font:ROMfont ):FontPackagePtr;π  { Get a hardware font and place it on heap For user modification }π  Var pkg : FontPackagePtr;π  beginπ    new( pkg );π    GetCharGenInfo( font,pkg^.fontinfo );π    pkg^.ch := pkg^.fontinfo.def^;π    FetchHardwareFont := pkg;π  end; { func FetchHardwareFont }πππProcedure LoadUserFont( pkg:FontPackagePtr );π  beginπ    reg.AH := $11;π    Reg.AL := $10;π    reg.ES := seg( pkg^.ch );π    reg.BP := ofs( pkg^.ch );π    reg.BH := pkg^.FontInfo.points;π    reg.BL := 0;π    reg.CX := 256;π    reg.DX := 0;π    intr( $10,reg );π  end; { proc LoadUserFont }πππbegin  { initialize }ππ  { determine adapter Type }π  isEGA := False;π  isVGA := False;π  if VDA.info <> 0 thenπ    beginπ      isEGA := True;π      if ( VDA.flags and 1 ) = 1 thenπ        isVGA := True;π    end;ππ  { determine monitor Type }π  if isEGA thenπ    beginπ      reg.AH := $12;π      reg.BL := $10;π      intr( $10,reg );π      if reg.BH = 0 thenπ        isCOLOR := Trueπ      elseπ        isCOLOR := False;π                                   { ADM: this seems Really shaky! }π      { determine current font }π      if isVGA and ( VDA.rows = 24 ) thenπ        CurrentFont := ROM8x16π      elseπ        if isEGA and ( VDA.rows = 24 ) thenπ          CurrentFont := ROM8x14π        elseπ          CurrentFont := ROM8x8;π    endπend.π                                                                                                  4      05-28-9313:39ALL                      SWAG SUPPORT TEAM        CARDDETC.PAS             IMPORT              18     ÜdR╦ {πEDWIN CALIMBOππ│Can anyone supply me With a routine to determine a Graphics card? I wantπ│the Procedure to return a Variable if the user has a Graphics card lessπ│than an EGA. Anyone have anything quick?ππThe Function below will detect most Graphics (mono/color) card. It'sπa bit long, but is has all the info on how to detect certain card.π}ππUsesπ  Dos;ππTypeπ  CardType = (none,mda,cga,egamono,egacolor,π              vgamono,vgacolor,mcgamono,mcgacolor);ππFunction VideoCard: CardType;πVarπ  code : Byte;π  Regs : Registers;πbeginπ  Regs.AH := $1A;      (* call VGA Identify Adapter Function *)π  Regs.AL := $00;      (* clear AL to 0...*)π  Intr($10, Regs);     (* call BIOS *)π  If Regs.AL = $1A thenπ  beginπ    Case Regs.BL ofπ      $00 : VideoCard := NONE;       (* no Graphic card *)π      $01 : VideoCard := MDA;        (* monochrome *)π      $02 : VideoCard := CGA;        (* cga *)π      $04 : VideoCard := EGAColor;   (* ega color *)π      $05 : VideoCard := EGAMono;    (* ega mono*)π      $07 : VideoCard := VGAMono;    (* vga mono *)π      $08 : VideoCard := VGAColor;   (* vga color *)π      $0A,π      $0C : VideoCard := MCGAColor;  (* mcga color *)π      $0B : VideoCard := MCGAMono;   (* mcga mono *)π      Elseπ        VideoCard := CGAπ    endπ  endπ  Elseπ  beginπ    Regs.AH := $12;         (* use another Function service *)π    Regs.BX := $10;         (* BL = $10 means return EGA info *)π    Intr($10, Regs);        (* call BIOS video Function *)π    If Regs.bx <> $10 Then  (* bx unchanged means EGA is not present *)π    beginπ      Regs.AH := $12;π      Regs.BL := $10;π      Intr($10, Regs);π      If Regs.BH = 0 Thenπ        VideoCard := EGAColorπ      Elseπ        VideoCard := EGAMonoπ    endπ    Elseπ    beginπ      Intr($11, Regs);     (* eguipment determination service *)π      code := (Regs.AL and $30) shr 4;π      If (code = 3) Thenπ        VideoCard := MDAπ      Elseπ        VideoCard := CGAπ    endπ  endπend; (* VideoCard *)ππ(*============================= cut here ==================================*)ππbeginπ  Case VideoCard ofπ    VGAColor : Writeln('VGA Color');π  end;πend.                                                 5      05-28-9313:39ALL                      SWAG SUPPORT TEAM        CIRCLE.PAS               IMPORT              19     Üd ¬ { SC> I had some free time the other day so I decided to play aroundπ SC> With some Graphics.  I am using TRIG Functions to draw aπ SC> circle.  But it's not too fast.  I understand that usingπ SC> Shift operators to multiply and divide will be faster.  Butπ SC> am not sure how to do numbers which are not powers of 2.π SC> Here is the code; how else can we make it faster?ππUsing shifts to multiply things is one way to speed it up but that's difficultπFor generic multiplies and only applies to Integer multiplies.  There's an evenπfaster way to draw a circle if you are interested. <YES he says>  OK, first itπis called the "Bresenham Circle Algorithm" and Uses symmetry about the eightπoctants to plot the circle and Uses only Integer arithmetic throughout.  Hereπis the code.π}πUsesπ  Graph, KASUtils;ππVarπ  Gd, Gm : Integer;ππProcedure DrawCircle(X, Y, Radius:Word; Color:Byte);πVarπ   Xs, Ys    : Integer;π   Da, Db, S : Integer;πbeginπ     if (Radius = 0) thenπ          Exit;ππ     if (Radius = 1) thenπ     beginπ          PutPixel(X, Y, Color);π          Exit;π     end;ππ     Xs := 0;π     Ys := Radius;ππ     Repeatπ           Da := Sqr(Xs+1) + Sqr(Ys) - Sqr(Radius);π           Db := Sqr(Xs+1) + Sqr(Ys - 1) - Sqr(Radius);π           S  := Da + Db;ππ           Xs := Xs+1;π           if (S > 0) thenπ                Ys := Ys - 1;ππ           PutPixel(X+Xs-1, Y-Ys+1, Color);π           PutPixel(X-Xs+1, Y-Ys+1, Color);π           PutPixel(X+Ys-1, Y-Xs+1, Color);π           PutPixel(X-Ys+1, Y-Xs+1, Color);π           PutPixel(X+Xs-1, Y+Ys-1, Color);π           PutPixel(X-Xs+1, Y+Ys-1, Color);π           PutPixel(X+Ys-1, Y+Xs-1, Color);π           PutPixel(X-Ys+1, Y+Xs-1, Color);π     Until (Xs >= Ys);πend;ππ{It Uses Sqr at the moment, but you could code it to use X * X instead of Sqr(X)πif you like since it will probably speed it up.  I haven't had time to optimiseπit yet since it will ultimately be in Assembler.ππHope this comes in handy For what you're doing. :-) Oh BTW it assumes you haveπa PlotDot routine which takes the obvious parameters.π}ππbeginπ  EGAVGA_Exe;π  gd := detect;π  InitGraph(gd,gm,'');π  clearviewport;ππ  drawcircle(100,100,150,yellow);π  readln;πend.                                                                                                        6      05-28-9313:39ALL                      SWAG SUPPORT TEAM        DAC-REGS.PAS             IMPORT              24     Üdÿá {πWould anyone have a Procedure of Function to do a fadein orπfadeout CLXXof a bitmapped image.  if I understand correctly, theseπCLXXfadeins are perFormed by changing the DAC Registers of the CLXXVGAπCards.  Can anyone enlighten me on this as I have CLXXsearched manyπbooks on how to do this and have not found CLXXit.  I know that there isπa utility out there called CLXXFastGraph by Teg Gruber which can doπthis, but short of CLXXbuying it For $200.00 Would one of you good folksπhave a CLXXroutint in Asm or BAsm to do this. CLXXI thank you all inπadvance For your assistance. CLXXChristian Laferriere.π}ππProcedure Pageswitch(X: Byte);πbeginπ  Asmπ    mov ah,5π    mov al,xπ    int 10hπ  end;πend; { Pageswitch }ππ{********************************************}πProcedure FadeIn;ππVarπ  oldp,π  oldp2,π  oldp3       : Byte;π  Palette     : Array[1..255 * 4] of Byte;π  FAKEPalette : Array[1..255 * 4] of Byte;π  I, J : Integer;ππbeginπ  For I := 1 to 255 doπ  beginπ    Port[$3C7] := I;π    Palette[(I - 1) * 4 + 1] := I;π    Palette[(I - 1) * 4 + 2] := Port[$3C9];π    Palette[(I - 1) * 4 + 3] := Port[$3C9];π    Palette[(I - 1) * 4 + 4] := Port[$3C9];π  end;π  For I := 1 to 255 doπ  beginπ    Port[$3C8] := I;π    Port[$3C9] := 0;π    Port[$3C9] := 0;π    Port[$3C9] := 0;π  end;ππ  Pageswitch(0);ππ  For J := 0 to 63 doπ  beginππ    For I := 1 to 255 doπ    beginπ      Port[$3C7] := I;π      oldp  := Port[$3C9];π      oldp2 := Port[$3C9];π      oldp3 := Port[$3C9];π      Port[$3C8] :=I;π      if oldp + 1 <= Palette[(I - 1) * 4 + 2] thenπ        Port[$3C9] := oldp+1π      elseπ        Port[$3C9] := Oldp;π      if oldp2 + 1 <= Palette[(I - 1) * 4 + 3] thenπ        Port[$3C9] := oldp2+1π      elseπ        Port[$3C9] := Oldp2;π      if oldp3 + 1 <= Palette[(I - 1) * 4 + 4] thenπ        Port[$3C9] := oldp3+1π      elseπ        Port[$3C9] := Oldp3;π    end;ππ    For I := 1 to 30000 doπ    beginπ    end;ππ  end;πend; {end of FadeIn}πππProcedure FadeOut;ππVarπ  uoldp,π  uoldp2,π  uoldp3  : Byte;π  I, J : Integer;πbeginπ  Pageswitch(0);ππ  For J := 0 to 63 doπ  beginππ    For I := 1 to 255 doπ    beginπ      Port[$3C7] := I;π      uoldp  := Port[$3C9];π      uoldp2 := Port[$3C9];π      uoldp3 := Port[$3C9];π      Port[$3C8] := I;π      if uoldp - 1 >= 0 thenπ        Port[$3C9] := uoldp - 1π      elseπ        Port[$3C9] := uOldp;π      if uoldp2 - 1 >= 0 thenπ        Port[$3C9] := uoldp2 - 1π      elseπ        Port[$3C9] := uOldp2;π      if uoldp3 - 1 >= 0 thenπ        Port[$3C9] := uoldp3 - 1π      elseπ        Port[$3C9] := uOldp3;π    end;ππ    For I := 1 to 30000 doπ    beginπ    end;ππ  end;πend; {end of FadeOut}ππ{πThat Procedure can FadIn and FadeOut any Text screen or anyπGraphics in Mode $13 With no problems.. Just make sure that youπswitch the video pages at the right time between fadeIns andπFadeouts.. Hope that helped.. LATERπ}ππbeginπ  FadeOut;π  FadeIn;πend.                                            7      05-28-9313:39ALL                      SWAG SUPPORT TEAM        DACCOLOR.PAS             IMPORT              7      Üd¡¬ {π Here is some code to try For Text fading on a vga...π by Sean Palmerπ}ππConstπ  tableReadIndex    = $3C7;π  tableWriteIndex   = $3C8;π  tableDataRegister = $3C9;ππProcedure setColor(color, r, g, b : Byte); Assembler;πAsm {set DAC color}π  mov dx, tableWriteIndex;π  mov al, color;π  out dx, al;π  inc dx;π  mov al, r;π  out dx, al;π  mov al, g;π  out dx, al;π  mov al, b;π  out dx, al;πend; {Write index now points to next color}ππFunction getColor(color : Byte) : LongInt; Assembler;πAsm {get DAC color}π  mov dx, tableReadIndex;π  mov al, color;π  out dx, al;π  add dx, 2;π  cld;π  xor bh, bh;π  in al, dx;π  mov bl, al;π  in al, dx;π  mov ah, al;π  in al, dx;π  mov dx, bx;πend; {read index now points to next color}ππ                                            8      05-28-9313:39ALL                      SWAG SUPPORT TEAM        EGAPALET.PAS             IMPORT              6      Üd8≥ {π> I once saw a Procedure that set the palette With RGB inputs, like theπ> 256- colour palette setter (RGBSetPalette).  It used some SHLsπ> and SHRs to reduce the inputted values For red, green, andπ> blue to 2-bit values (or somewhere around there).π}ππProcedure EGAPalette(c_index, red, green, blue : Byte);πVarπ  i    : Integer;π  regs : Registers;πbeginπ  red   := red SHR 6;π  green := green SHR 6;π  blue  := blue SHR 6;π  i     := (red SHL 4) + (green SHL 2) + blue;π  regs.AH := $10;π  regs.AL := 0;π  regs.BH := i;π  regs.BL := c_index;  { the colour index to change }π  Intr($10, regs);πend;ππ                                    9      05-28-9313:39ALL                      SWAG SUPPORT TEAM        FADE.PAS                 IMPORT              15     ÜdδΓ Program GoodFade;πUsesπ  Crt;ππConstπ  I1II111 = 75;π  IIIIII = 60;ππVarπ  Count, Count2 : Byte;π  Pal1, Pal2 : Array [0..255, 0..2] of Byte;ππProcedure I1I1;πbeginπ  For Count := 0 to 255 DOπ  beginπ    PORT [$03C7] := Count;π    Pal1 [Count, 0] := PORT [$03C9];π    Pal1 [Count, 1] := PORT [$03C9];π    Pal1 [Count, 2] := PORT [$03C9];π   end;π  Pal2 := Pal1;πend;ππProcedure IIIIIII;πbeginπ  For Count := 0 to 255 DOπ  beginπ    PORT [$03C8] := Count;π    PORT [$03C9] := Pal1 [Count, 0];π    PORT [$03C9] := Pal1 [Count, 1];π    PORT [$03C9] :=π    Pal1 [Count, 2];π  end;πend;ππProcedure FadeOut;πbeginπ  For Count := 1 to I1II111 DOπ  beginπ    For Count2 := 0 to 255 DOπ    beginπ      if Pal2 [Count2, 0] > 0 thenπ        DEC (Pal2 [Count2, 0]);π      if Pal2 [Count2, 1] > 0 thenπ        DEC (Pal2 [Count2, 1]);π      if Pal2 [Count2, 2] > 0 thenπ        DEC (Pal2 [Count2, 2]);π      PORT [$03C8] := Count2;π      PORT [$03C9] := Pal2 [Count2, 0];π      PORT [$03C9] := Pal2 [Count2, 1];π      PORT [$03C9] := Pal2 [Count2, 2];π    end;π    Delay (IIIIII);π  end;πend;ππProcedure FadeIn;πbeginπ  For Count := 1 to I1II111 DOπ  beginπ    For Count2 := 0 to 255 DOπ    beginπ      if Pal2 [Count2, 0] < Pal1 [Count2, 0] thenπ        INC (Pal2 [Count2, 0]);π      if Pal2 [Count2, 1] < Pal1 [Count2, 1] thenπ        INC (Pal2 [Count2, 1]);π      if Pal2 [Count2, 2] < Pal1 [Count2, 2] thenπ        INC (Pal2 [Count2, 2]);π      PORT [$03C8] := Count2;π      PORT [$03C9] := Pal2 [Count2, 0];π      PORT [$03C9] := Pal2 [Count2, 1];π      PORT [$03C9] := Pal2 [Count2, 2];π    end;π    Delay (IIIIII);π  end;πend;ππbeginπ  I1I1;π  FadeOut;π  FadeIn;π  IIIIIII;πend.ππ                                                                                                                       10     05-28-9313:39ALL                      SWAG SUPPORT TEAM        FADING.PAS               IMPORT              61     Üd∩ {πEirik Milch Pedersenππ> I too, would appreciate the source for fading colours in 16 colour textπ> mode on a VGA, i've tried my hand at it but can't work out a decentπ> algoritm, i've been using int 10h to set a block of colour regs for speedπ> but can't seem to work out how to fade the colours!ππI replyed to the author of the first fade-question, but I might as well postπmy code to the public. This is a little demo I made in TP60 for fading form aπpalette to another. So techincal you can fade from anything to anything. :-)πThe routine should be fast enough for most computers, but if you start toπsee 'snow' on the screen try to reduce the number of colors that are faded.π}ππ{$G+}πusesπ  crt;ππtypeπ  ColorType = array[0..255] of recordπ                                 R, G, B : byte;π                               end;ππvarπ  Colors,π  White,π  Black   : ColorType;ππprocedure SetMode(Mode : word); assembler;πasmπ  mov  ax, Modeπ  int  010hπend;ππprocedure MakeColors(ColorArray : pointer); assembler;πlabelπ  RLoop, GLoop, BLoop;πasmπ  les  di, ColorArrayππ  mov  cx, 85π  xor  al, alπ RLoop:π  mov  byte ptr es:[di+0], alπ  mov  byte ptr es:[di+1], 0π  mov  byte ptr es:[di+2], 0π  add  di, 3π  inc  alπ  and  al, 03Fhπ  loop Rloopππ  mov  cx, 85π  xor  al, alπ GLoop:π  mov  byte ptr es:[di+0], 0π  mov  byte ptr es:[di+1], alπ  mov  byte ptr es:[di+2], 0π  add  di, 3π  inc  alπ  and  al, 03Fhπ  loop Gloopππ  mov  cx, 86π  xor  al, alπ BLoop:π  mov  byte ptr es:[di+0], 0π  mov  byte ptr es:[di+1], 0π  mov  byte ptr es:[di+2], alπ  add  di, 3π  inc  alπ  and  al, 03Fhπ  loop Bloopπend;ππprocedure DrawBars; assembler;πlabelπ  LineLoop, PixelLoop;πasmπ  mov  ax, 0A000hπ  mov  es, axπ  xor  di, diππ  mov  cx, 200π LineLoop:π  xor  al, alπ  push cxπ  mov  cx, 320π PixelLoop:π  stosbπ  inc  alπ  loop PixelLoopππ  pop  cxπ  loop LineLoopπend;ππprocedure UpdateColorsSlow(ColorBuffer : pointer); assembler;πlabelπ  ColorLoop;πasmπ  push dsππ  lds  si, ColorBufferπ  mov  cx, 3*256ππ  mov  dx, 03C8hπ  xor  al, alπ  out  dx, alπ  inc  dxπ ColorLoop:                         { here is the substitute that }π  lodsb                      { goes round the problem.     }π  out  dx, alπ  loop ColorLoopππ  pop  dsπend;ππprocedure UpdateColorsFast(ColorBuffer : pointer); assembler;πasmπ  push dsππ  lds  si, ColorBufferπ  mov  cx, 3*256ππ  mov  dx, 03C8hπ  xor  al, alπ  out  dx, alπ  inc  dxππ  rep  outsb              { here is the cause of the problem. }ππ  pop  dsπend;πππprocedure FadeColors(FromColors, ToColors : Pointer;π                     StartCol, NoColors, NoSteps : byte); assembler;πlabelπ  Start, DummyPalette, NoColorsX3,π  DummySub, StepLoop, ColorLoop,π    SubLoop, RetrLoop1, RetrLoop2, Over1, Over2;πasmπ    jmp    Startπ DummyPalette:π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π DummySub:π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π  db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0π NoColorsX3 :π  dw      0π Start:π    push dsππ    lds     si, ToColorsπ  les     di, FromColorsπ  xor  ch, chπ  mov     cl, NoColorsπ  shl     cx, 1π  add     cl, NoColorsπ  adc  ch, 0π  mov     word ptr cs:[NoColorsX3], cxπ  mov     bx, 0π  push diπ SubLoop:π    lodsbπ    sub     al, byte ptr es:diπ    mov     byte ptr cs:[DummySub+bx], alπ  inc     diπ  inc     bxπ    loop SubLoopπ  pop     diππ  push csπ  pop     dsπ    mov     dh, 0π  mov  dl, NoStepsπ StepLoop:π  push diπ  mov     cx, word ptr cs:[NoColorsX3]π  mov     bx, 0π ColorLoop:π  xor     ah, ahπ    mov     al, byte ptr cs:[DummySub+bx]π  or     al, alπ  jns     over1π  neg     alπ over1:π  mul     dhπ  div     dlπ  cmp  byte ptr cs:[DummySub+bx], 0π  jge     over2π  neg     alπ over2:π  mov     ah, byte ptr es:[di]π  add     ah, alπ  mov     byte ptr cs:[DummyPalette+bx], ahπ  inc     bxπ  inc     diπ  loop ColorLoopππ  push dxπ  mov  si, offset DummyPaletteπ  mov  cx, word ptr cs:[NoColorsX3]ππ  mov  dx, 03DAhπ retrloop1:π  in      al, dxπ  test al, 8π  jnz  retrloop1π retrloop2:π  in      al, dxπ  test al, 8π  jz   retrloop2ππ  mov  dx, 03C8hπ  mov  al, StartColπ  out  dx, alπ  inc  dxπ  rep     outsbππ  pop     dxππ  pop     diπ  inc     dhπ  cmp     dh, dlπ  jbe     StepLoopππ  pop     dsπend;ππππbeginπ  ClrScr;π  MakeColors(@Colors);π  FillChar(Black, 256 * 3, 0);π  FillChar(White, 256 * 3, 63);ππ  SetMode($13);π  UpdateColorsSlow(@Black);π  DrawBars;ππ  REPEATπ    FadeColors(@Black, @Colors, 0, 255, 100);π    FadeColors(@Colors, @White, 0, 255, 100);π    FadeColors(@White, @Colors, 0, 255, 100);π    FadeColors(@Colors, @Black, 0, 255, 100);π  UNTIL keyPressed;ππ  SetMode($3);πEND.π                                                                                                            11     05-28-9313:39ALL                      SWAG SUPPORT TEAM        FASTRGB.PAS              IMPORT              6      Üdí {πGRADY WERNERπPut these in your code For GREAT, FAST RGB Palette Changing...π}πProcedure ASetRGBPalette(Color, Red, Green, Blue : Byte);πbeginπ  Port[$3C8]:=Color;π  Port[$3C9]:=Red;π  Port[$3C9]:=Green;π  Port[$3C9]:=Blue;πend;ππ{πThis Procedure Changes palette colors about 400% faster than theπbuilt-in routines.  Also, a problem With flicker may have been encounteredπwith Turbo's Putimage Functions.  Call this Procedure RIGHT BEFORE theπputimage is called... Viola... NO Flicker!π}πProcedure WaitScreen;πbeginπ  Repeat Until (Port[$3DA] and $08) = 0;π  Repeat Until (Port[$3DA] and $08) <> 0;πend;π                                   12     05-28-9313:39ALL                      SWAG SUPPORT TEAM        GETMODE1.PAS             IMPORT              6      Üdïò {πHere's a quick proc. to return the current video mode:π}ππUsesπ  Dos;ππFunction CurVidMode : Byte;ππVarπ  Regs : Registers;ππbegin;ππ  Regs.Ah :=$f;π  Intr($10, Regs);π  CurVidMode := Regs.Al;ππend;ππbeginπ  Writeln(CurVidMode);πend.πππ{πYou can use that same color Procedure For the VGA 16 color mode becauseπalthough it can only do 16 colors, it can still change each of the 16πcolors to 64*64*64 (262,144) colors, like the 256 color mode.ππAbout the EGA palette - I'll have to get back to ya, that's moreπcomplex.π}ππ                                                                                                                      13     05-28-9313:39ALL                      SWAG SUPPORT TEAM        GOODFADE.PAS             IMPORT              12     ÜdJi {π>I have a copy of the fade Unit and am having problems getting it to workπ>correctly. I want to fade my Programs screen on Exit, clear it, and showπ>the Dos screen.ππHere's a little fade source, there're some change to made if you're using it inπGraphic or Text mode.π}ππUsesπ  Crt;πππVarπ  count1, count2 : Integer;π  pal1,pal2 : Array[0..255,0..2] of Byte;πππbeginππ  For count1 := 0 to 255 do           {Get the current palette}π  beginπ    Port[$03C7] := count1;π    pal1[count1,0] := Port[$03C9];π    pal1[count1,1] := Port[$03C9];π    pal1[count1,2] := Port[$03C9];π  end;ππ  Pal2:=Pal1;ππ  For Count1 := 1 to 255 do           {this will fade the entire palette}π  begin                               {20 must be enough in Text mode}π    For Count2 := 0 to 255 doπ    beginπ      If Pal2[Count2,0] > 0 thenπ        Dec(Pal2[Count2,0]);π      If Pal2[Count2,1] > 0 thenπ        Dec(Pal2[Count2,1]);π      If Pal2[Count2,2] > 0 thenπ        Dec(Pal2[Count2,2]);π      Port[$03C8] := Count2;π      Port[$03C9] := Pal2[Count2,0];π      Port[$03C9] := Pal2[Count2,1];π      Port[$03C9] := Pal2[Count2,2];π    end;π    Delay(40);         {Change the Delay For a quicker or slower fade}π  end;ππ  For Count1 := 0 to 255 do   {Restore Original palette}π  beginπ    Port[$03C8] := Count1;π    Port[$03C9] := Pal1[Count1,0];π    Port[$03C9] := Pal1[Count1,1];π    Port[$03C9] := Pal1[Count1,2];π  end;ππend.ππ 14     05-28-9313:39ALL                      SWAG SUPPORT TEAM        GREATFAD.PAS             IMPORT              17     Üd_ {πJohn Wongππ>Does anyone out there have any fade-in routines??? Also can anyoneπ>recomend some good books on VGA Programming and Animation???ππThis might be a fade out routine, but you could modify it to fade in.π}π{$G+}πProgram fades;ππUsesπ  Crt, Dos;π                  { TPC /$G+ To Compile }πVarπ  All_RGB : Array[1..256 * 3] Of Byte;π  x,color : Integer;πππProcedure FadeOut2; { This is Hard Cores Fade Out }πbeginπ  {for using Textmode use color 7, or For Graphics}π  x := 1;π  Color := 7;π  Repeat;π    port[$3c8] := color;π    port[$3c9] := 60 - x;π    port[$3c9] := 60 - x;π    port[$3c9] := 60 - x;π    inc(x);π    Delay(75);π  Until x = 60;ππ         { Get The Screen Back ( Change This ) }π  Color := 7;π  port[$3c8] := color;π  port[$3c9] := 60 + x;π  port[$3c9] := 60 + x;π  port[$3c9] := 60 + x;π  inc(x);π  Delay(25);πend;ππProcedure FadeOut;πLabelπ  OneCycle,π  ReadLoop,π  DecLoop,π  Continue,π  Retr,π  Wait,π  Retr2,π  Wait2;πbegin { FadeOut }π  Asmπ    MOV   CX,64π  OneCycle:ππ    MOV     DX,3DAhπ  Wait:   in      AL,DXπ    TEST    AL,08hπ    JZ      Waitπ  Retr:   in      AL,DXπ    TEST    AL,08hπ    JNZ     Retrππ    MOV   DX,03C7hπ    xor   AL,ALπ    OUT   DX,ALπ    INC   DXπ    INC   DXπ    xor   BX,BXπ  ReadLoop:π    in    AL,DXπ    MOV   Byte Ptr All_RGB[BX],ALπ    INC   BXπ    CMP   BX,256*3π    JL    ReadLoopππ    xor   BX,BXπ  DecLoop:π    CMP   Byte Ptr All_RGB[BX],0π    JE    Continueπ    DEC   Byte Ptr All_RGB[BX]ππ  Continue:π    INC   BXπ    CMP   BX,256*3π    JL    DecLoopππ    MOV     DX,3DAhπ  Wait2:   in      AL,DXπ    TEST    AL,08hπ    JZ      Wait2π  Retr2:   in      AL,DXπ    TEST    AL,08hπ    JNZ     Retr2ππ    MOV   DX,03C8hπ    MOV   AL,0π    OUT   DX,ALπ    INC   DXπ    MOV   SI,OFFSET All_RGBπ    CLDπ    PUSH  CXπ    MOV   CX,256*3π    REP   OUTSBπ    POP   CXππ    LOOP  OneCycleππ  end;πend; { FadeOut }πππbeginπ  fadeout;π  NormVideo;π  Fadeout2;πend.π                                                                                                                               15     05-28-9313:39ALL                      SWAG SUPPORT TEAM        GRPHINIT.PAS             IMPORT              18     Üd∞M {πThe following Unit contains one Function.  This Function will initialize theπBorland BGI Interface in a Turbo Pascal Program.  I wrote this Unit in TPπ5.5, but it should work For all versions of TP after 4.0.ππThe Function performs two actions which I think can help Graphics Programsπimmensely.  The first is to obtain the path For the BGI (and CHR) driversπfrom an environmental Variable BGIDIR.  The second action is to edit theπdriver and mode passed to the initialization Unit against what is detectedπby TP.  The Function returns a Boolean to say if it was able to successfullyπinitialize the driver.ππI hope this helps someone.π}ππUnit GrphInit;ππInterfaceππUsesπ    Dos,π    Graph;ππFunction Init_Graphics (Var GraphDriver, GraphMode : Integer) : Boolean;π{    This Function will initialize the Turbo Graphics For the requestedπ    Graphics mode if and only if the requested mode is valid For theπ    machine the Function is run in.  Another feature of this Function isπ    that it will look For an environmental Variable named 'BGIDIR'.  Ifπ    this Variable is found, it will attempt to initialize the Graphicsπ    mode looking For the BGI driver using the String associated With BGIDIRπ    as the path.  If the correct BGI driver is not available, or if there isπ    not BGIDIR Variable in the environment, it will attempt to initializeπ    using the current directory. }πππImplementationππFunction Init_Graphics (Var GraphDriver, GraphMode : Integer) : Boolean;πConstπ    ENV_BGI_PATH = 'BGIDIR';πVarπ    BGI_Path    : String;πbeginπ    { Default to not work }π    Init_Graphics := False;π  BGI_Path := GetEnv(ENV_BGI_PATH);π    InitGraph(GraphDriver,GraphMode,BGI_Path);π    if GraphResult = grOk thenπ         Init_Graphics := Trueπ    Elseπ  begin { Try current Directory }π        InitGraph(GraphDriver,GraphMode,'');π        if GraphResult = grOk thenπ            Init_Graphics := True;π    end; { Try current Directory }πend; { Function Init_Graphics }ππend.πππ{π Example File :ππUsesπ  Graph, GrphInit;ππConstπ  Gd     : Integer = 0;π  Gm     : Integer = 0;πbeginπ  Init_Graphics(Gd, Gm);π  Line(10,10,40,40);π  Readln;πend.π}                                                                                                                    16     05-28-9313:39ALL                      SWAG SUPPORT TEAM        IMAGEPUT.PAS             IMPORT              25     Üdl╜ {Here is a small Program that illustrates the features of GetImage/PutImage thatπyou would like to use:π}π {$A+,B-,D+,E-,F-,G+,I-,L+,N-,O-,R-,S+,V-,X+}π {$M 16384,0,655360}π Uses Graph;π (* Turbo Pascal, Width= 20 Height= 23 Colors= 16 *)π Constπ   Pac: Array[1..282] of Byte = (π          $13,$00,$16,$00,$00,$FE,$00,$00,$FE,$00,π          $00,$FE,$00,$FF,$01,$FF,$03,$FF,$80,$03,π          $FF,$80,$03,$FF,$80,$FC,$00,$7F,$07,$8F,π          $C0,$07,$8F,$C0,$07,$8F,$C0,$F8,$00,$3F,π          $1F,$77,$F0,$1F,$17,$F0,$1F,$17,$E0,$E0,π          $70,$0F,$1F,$77,$E0,$1F,$37,$E0,$1F,$37,π          $C0,$E0,$70,$1F,$3F,$77,$C0,$3F,$17,$C0,π          $3F,$17,$80,$C0,$70,$3F,$7F,$8F,$80,$7F,π          $8F,$80,$7F,$8F,$00,$80,$00,$7F,$7F,$FF,π          $00,$7F,$FF,$00,$7F,$FE,$00,$80,$00,$FF,π          $FF,$FE,$00,$FF,$FE,$00,$FF,$FC,$00,$00,π          $01,$FF,$FF,$FC,$00,$FF,$FC,$00,$FF,$F8,π          $00,$00,$03,$FF,$FF,$F8,$00,$FF,$F8,$00,π          $FF,$F0,$00,$00,$07,$FF,$FF,$F0,$00,$FF,π          $F0,$00,$FF,$E0,$00,$00,$0F,$FF,$FF,$F8,π          $00,$FF,$F8,$00,$FF,$F0,$00,$00,$07,$FF,π          $FF,$FC,$00,$FF,$FC,$00,$FF,$F8,$00,$00,π          $03,$FF,$FF,$FE,$00,$FF,$FE,$00,$FF,$FC,π          $00,$00,$01,$FF,$7F,$FF,$00,$7F,$FF,$00,π          $7F,$FE,$00,$80,$00,$FF,$7F,$FF,$80,$7F,π          $FF,$80,$7F,$FF,$00,$80,$00,$7F,$3F,$FF,π          $C0,$3F,$FF,$C0,$3F,$FF,$80,$C0,$00,$3F,π          $1F,$FF,$E0,$1F,$FF,$E0,$1F,$FF,$C0,$E0,π          $00,$1F,$1F,$FF,$F0,$1F,$FF,$F0,$1F,$FF,π          $E0,$E0,$00,$0F,$07,$FF,$C0,$07,$FF,$C0,π          $07,$FF,$C0,$F8,$00,$3F,$03,$FF,$80,$03,π          $FF,$80,$03,$FF,$80,$FC,$00,$7F,$00,$FE,π          $00,$00,$FE,$00,$00,$FE,$00,$FF,$01,$FF,π          $00,$00);π Var Size,Result: Word;π     Gd, Gm: Integer;π     P: Pointer;π     F: File;π beginπ { Find correct display/card-Type and initiallize stuff }π   Gd := Detect;π   InitGraph(Gd, Gm, 'd:\bp\bgi');π   if GraphResult <> grOk then Halt(1); { Error initialize }π   ClearDevice;ππ   SetFillStyle(SolidFill,Blue);π   Bar(0,0,639,479);π   P := @Pac;                                (* Pass the address of the   *)π                                             (* Pac Constant to a Pointer *)π   PutImage(1,1,P^,NormalPut);               (* Display image             *)ππ   Size := ImageSize(1,1,20,23) { Get size of your picture };π   GetMem(P, Size); { Get memory from heap }π   GetImage(1,1,20,23,P^) { Capture picture itself in P^ };ππ   ClearDevice;ππ   Assign(F,'IMAGE');π   reWrite(F,1);π   BlockWrite(F,P^,Size,Result) { Put picture (from P^) in File F };π   if Ioresult <> 0 then Halt(2) { Error during BlockWrite I/O };π   if Result <> Size then Halt(3) { not enough data written to F };π   close(F);π   if Ioresult <> 0 then Halt(4) { Error during Close of F };ππ   PutImage(1,1,P^,NormalPut);π   FreeMem(P,Size) { Free memory. This is GPP. };π   ReadLn { Hit any key to continue };π   ClearDevice;π   CloseGraph;π end.π                                                                                                                              17     05-28-9313:39ALL                      SWAG SUPPORT TEAM        LINEDRAW.PAS             IMPORT              19     Üd» {1)  An efficient/optimised line-drawing routine (in Pascalπor Asm) based on (or better than) the Bres. Line algorithm.π}ππ{$R-,S-}ππUsesπ  Crt, Dos;ππProcedure PutPixel(X, Y : Word; Color : Byte);πbeginπ  Mem[$A000:Y*320+X] := Colorπend;ππProcedure Switch(Var First, Second : Integer);π{ Exchange the values of First and second }πVarπ  Temp : Integer;πbeginπ  Temp := First;π  First := Second;π  Second := Temp;πend; { Switch }ππProcedure Line(X1, Y1, X2, Y2, Color : Integer);π{ Uses Bressenham's algorithm For drawing a line }πVarπ  LgDelta, ShDelta, LgStep, ShStep, Cycle, PointAddr : Integer;ππbeginπ  LgDelta := X2 - X1;π  ShDelta := Y2 - Y1;π  if LgDelta < 0 thenπ    beginπ      LgDelta := -LgDelta;π      LgStep := -1;π    endπ  elseπ    LgStep := 1;π  if ShDelta < 0 thenπ    beginπ      ShDelta := -ShDelta;π      ShStep := -1;π    endπ  elseπ    ShStep := 1;π  if LgDelta > ShDelta thenπ    beginπ      Cycle := LgDelta shr 1; { LgDelta / 2 }π      While X1 <> X2 doπ      beginπ        Mem[$A000:Y1*320+X1] := Color; { PutPixel(X1, Y1, Color); }π        Inc(X1, LgStep);π        Inc(Cycle, ShDelta);π        if Cycle > LgDelta thenπ        beginπ          Inc(Y1, ShStep);π          Dec(Cycle, LgDelta);π        end;π      end;π    endπ  elseπ    beginπ      Cycle := ShDelta shr 1; { ShDelta / 2 }π      Switch(LgDelta, ShDelta);π      Switch(LgStep, ShStep);π      While Y1 <> Y2 doπ      beginπ        Mem[$A000:Y1*320+X1] := Color; { PutPixel(X1, Y1, Color); }π        Inc(Y1, LgStep);π        Inc(Cycle, ShDelta);π        if Cycle > LgDelta thenπ        beginπ          Inc(X1, ShStep);π          Dec(Cycle, LgDelta);π        end;π      end;π    end;πend; { Line }ππProcedure SetMode(Mode : Byte);π{ Interrupt $10, sub-Function 0 - Set video mode }πVarπ  Regs : Registers;πbeginπ  With Regs doπ  beginπ    AH := 0;π    AL := Mode;π  end;π  Intr($10, Regs);πend; { SetMode }ππVarπ  x,y,d:Word;π  r:Real;ππbegin   { example }π  SetMode($13);  { 320x200 256 color mode For VGA and MCGA cards }π  For d := 0 to 360 * 10 doπ  beginπ     r := (d * PI) * 0.1 / 180;π     x := round(sin(r * 5) * 90) + 160;π     y := round(cos(r) * 90) + 100;π     line(160,100,x,y,x div 4);π  end;π  Repeat Until port[$60] = 1;    { hit esc to end }ππ  SetMode($03) { Text mode }πend.π                         18     05-28-9313:39ALL                      SWAG SUPPORT TEAM        MODE-XY1.PAS             IMPORT              25     Üd⌠■ {πFor people who do not find any xsharp Near them, and who would like to test itπanyway i translated some Assembler-Code (not by me) back to to TP6.πI tested it on a 486/33 With multisynch and a 386/40 With an old bw/vga monitorπboth worked well. Anyway i cannot guarantee that it works With every pc and isπhealthy For every monitor, so be careful.πThis Listing changes to 360x480x256 modex and displays some pixels.πHave fun With it !π}π(*Source: VGAKIT Version 3.4π   Copyright 1988,89,90 John Bridgesπ   Translated to Pascal (why?) by Michael Mrosowski *)ππProgram ModexTest;ππUses Crt,Dos;ππVarπ  maxx,maxy : Word;ππ(*Set Modex 360x480x256 *)ππProcedure SetModex;πConstπ VptLen=17;π Vpt : Array[1..VptLen] of Word =π                    ($6b00 , (* horz total                      *)π                     $5901 , (* horz displayed                  *)π                     $5a02 , (* start horz blanking             *)π                     $8e03 , (* end horz blanking               *)π                     $5e04 , (* start h sync                    *)π                     $8a05 , (* end h sync                      *)π                     $0d06 , (* vertical total                  *)π                     $3e07 , (* overflow                        *)π                     $4009 , (* cell height                     *)π                     $ea10 , (* v sync start                    *)π                     $ac11 , (* v sync end and protect cr0-cr7  *)π                     $df12 , (* vertical displayed              *)π                     $2d13 , (* offset                          *)π                     $0014 , (* turn off dWord mode             *)π                     $e715 , (* v blank start                   *)π                     $0616 , (* v blank end                     *)π                     $e317); (* turn on Byte mode               *)πVarπ  regs:Registers;π  i:Integer;π  cr11:Byte;πbeginπ  maxx:=360;π  maxy:=480;π  regs.ax:=$13;       (*start With standardmode 13h*)π  Intr($10,regs);     (*hi bios!*)ππ  PortW[$3c4]:=$0604; (*alter sequencer Registers: disable chain 4*)π  PortW[$3c4]:=$0F02; (*    set Write plane mask to all bit planes*)π  FillChar(Mem[$a000:0],43200,0); (* Clearscreen *)π                      (*  ((XSIZE*YSIZE)/(4 planes)) *)ππ  PortW[$3c4]:=$0100; (*synchronous reset*)π  Port [$3c2]:=$E7;   (*misc output : use 28 Mhz dot clock*)π  PortW[$3c4]:=$0300; (*sequencer   : restart*)ππ  Port [$3d4]:=$11;   (*select Crtc register cr11*)π  cr11:=Port[$3d5];π  Port [$3d5]:=cr11 and $7F; (*Write protect*)ππ  For i:=1 to vptlen do (*Write Crtc-Registers*)π    PortW[$3d4]:=Vpt[i];πend;πππ(*Put pixel in 360x480 (no check)*)ππProcedure PutPixel(x,y:Word;c:Byte);πbeginπ  PortW[$3c4]:=($100 shl (x and 3))+2; (*set EGA bit plane mask register*)π  Mem[$a000:y*(maxx shr 2) + (x shr 2)]:=c;πend;ππVar c:Char;π    i,j:Integer;ππbeginπ  SetModex;π  For j:=0 to 479 do  (* Nearly SVGA With your good old 256k VGA*)π    For i:=0 to 359 doπ      PutPixel(i,j,(i+j) and $FF);π  c:=ReadKey;π  TextMode(LastMode);πend.                      19     05-28-9313:39ALL                      SWAG SUPPORT TEAM        MODE-XY2.PAS             IMPORT              47     Üd0 {πKai Rohrbacherππ>> Basically,  Mode  Y  works  like  this:  use  the BIOS to switchπ>> into normal 320x200x256  mode,  then reprogram the sequencer toπ>> unchain the 4 bitplanes. This  results  in  a bitplaned VRAM layoutπ>> very similiar to the EGA/VGA's 16 color modes:π>π> By saying 4 bitplanes, are you referering to the pages? I know thatπ> you can specify 4 pages in mode X/Y.ππNo, it just means that with each VRAM address, 4 physically different RAM cellsπcan be addressed: you may think of a "3-dimensional" architecture of your VGA'sπVRAM (ASCII sucks, I know...)π             ____________π            |*  plane3   |π         ___|_________   |π        |*   plane2   |__|π     ___|__________   |π    |*   plane1    |__|π ___|___________   |π|*   plane0     |__|π|               |π|_______________|ππThe upper left corner of each bitplane (marked by a "*") is referenced with theπaddress $A000:0, but refers to 4 pixels! It is quite simple: instead ofπcounting "$A000:0 is the first pixel, $A000:1 is the 2nd, $A000:2 is the 3rd,π$A000:3 is the 4th, $A000:4 is the 5th" (as you would do in the normal BIOSπmode 320x200x256), the pixels now are distributed this way: "$A000:0/plane 0 isπthe 1st, $A000:0/plane 1 is the 2nd, $A000:0/plane 2 is the 3rd, $A000:0/planeπ3 is the 4th, $A000:1/plane 0 is the 5th" and so on.πSo obviously, w/o doing some "bitplane switching", you are always restricted toπwork on one bitplane at a time --the one actually being activated. If this isπplane0, you may only change pixels which (x mod 4) remainder is 0, the otherπones with (x mod 4)=1|2|3 aren't accessible, you have to "switch to the plane"πfirst. Thus the name "bitplane"!ππDT> And what exactly does "unchain" mean, as opposed to "chained". I have theπDT> feeling that they refer to each page(bitplane) being on its own.πHuhh, that would go pretty much into details; a bit simplified, "chained" meansπthat the bitplanes mentioned above are "glued" together for the simple BIOSπmode, so that bitplane switching isn't necessary anymore (that is equivalent inπsaying that one VRAM address refers to one RAM cell). As there are only 65536πaddresses in the $A000 segment and we need 320x200=64000 for a full page, youπonly have 65536/64000=1.024 pages therefore. "Unchaining" means to make eachπbitplane accessible explicitely.ππ> Now here is another problem I don't understand. I am familiar with VGA'sπ> mode 13h which has one byte specifying each pixel on the screen,π> therefore 1 byte = 1 pixel. But this takes up 64k.ππSmall note on this: not 64K, but only 64000 bytes!ππ> But how do you have one address represent 4 pixels, which only occupiesπ> 16000 address bytes, and still be able to specify 256 colours. Won't 4π> bitplanes at 320x200 each take up 64000x4 bytes of space?ππWe have 320x200=64000 pixels=64000 bytes. As each 4 pixels share one address,π16000 address bytes per page suffice. The $A000 segment has 64K address bytes,πthus 4*64K=256K VRAM can be addressed. 64K address bytes = 65536 address bytes;π65536/16000 = 4.096 pages.ππ> How would you go about adjusting the vertical retraces, and memoryπ> location you mentioned.ππAssuming that the DX-register has been set to 3DAh or 3BAh for color/monochromeπdisplay, respectively, you can trace the status of the electronic beam likeπthis:ππ  @WaitNotVSyncLoop:π    in   al, dxπ    and  al, 8π    jnz  @WaitNotVSyncLoopπ  @WaitVSyncLoop:π    in   al, dxπ    and  al, 8π    jz   @WaitVSyncLoopπ  {now change the starting address}π{π(If you use "1" instead of "8" and exchange "jz" <-> "jnz" and vice vs., thenπyou sync on the shorter horizontal retrace (better: horizontal _enable_)πsignal).πThe alteration of the starting address is done by the code I already posted inπmy first mail! (Its done by addressing the registers $C and $D of theπCRT-controller).πNote that reprogramming the starting address isn't restricted to mode X/Y, youπcan have it in normal mode 13h, too: there are 65536 addresses available, butπonly 64000 needed, thus giving a scroll range of 4.8 lines! And to complicateπthings even further, for start addressing purposes, even the BIOS mode isπplaned (that is, a row consists of 320/4 bytes only). Just for the case youπdon't believe...π}πPROGRAM Scroll;πVARπ  CRTAddress,π  StatusReg   : WORD;π  a           : ARRAY[0..199, 0..319] OF BYTE ABSOLUTE $A000 : 0000;π  i, j        : WORD;ππPROCEDURE SetAddress(ad : WORD); ASSEMBLER;πASMπ  MOV BX, adππ  MOV DX, StatusRegπ  @WaitNotVSyncLoop:π    in   al, dxπ    and  al, 8π    jnz  @WaitNotVSyncLoopπ  @WaitVSyncLoop:π    in   al, dxπ    and  al, 8π    jz   @WaitVSyncLoopππ  MOV DX, CRTAddressπ  MOV AL, $0Dπ  CLIπ  OUT DX, ALπ  INC DXπ  MOV AL, BLπ  OUT DX, ALπ  DEC DXπ  MOV AL, $0Cπ  OUT DX, ALπ  INC DXπ  MOV AL, BHπ  OUT DX, ALπ  STIπEND;ππBEGINπ  IF ODD(port[$3CC]) THENπ    CRTAddress := $3D4π  ELSEπ    CRTAddress := $3B4;ππ  StatusReg := CRTAddress + 6;π  ASMπ    MOV AX,13hπ    INT 10hπ  END;ππ  FOR i := 1 TO 1000 DOπ   a[Random(200), Random(320)] := Random(256);ππ  {scroll horizontally by 4 pixels}π  FOR i := 1 TO 383 DOπ    SetAddress(i);π  FOR i := 382 DOWNTO 0 DOπ    SetAddress(i);ππ  {scroll vertically by 1 row}π  FOR j := 1 TO 20 DOπ  BEGINπ    FOR i := 1 TO 4 DOπ      SetAddress(i * 80);π    FOR i := 3 DOWNTO 0 DOπ      SetAddress(i * 80)π  END;ππ  ASM {back to 80x25}π    MOV AX,3π    INT 10hπ  END;ππEND.π{π> Your said you could specify how the memory can be layed out by the user,π> but I am in need of what each PORT does. I know you have to sendπ> different values to the port to program it, but I have no idea what eachπ> port reads.ππThere are incredibly much registers to program! For a good overview of most ofπthem, try to get your hands on a copy of VGADOC*.* by Finn Thoegersenπ(jesperf@daimi.aau.dk) which covers programming a lot of SVGA's chipsets, too.ππ                                                          20     05-28-9313:39ALL                      SWAG SUPPORT TEAM        NICEFADE.PAS             IMPORT              14     ÜdXf {πCHRIS BEISELππHey Terje, here's some stuff to get you started on some ideas For theπgroup.  I threw it together it 3 minutes, so it's not much, but theπassembley code isn't bad... here it is:π}ππProgram palette;ππUsesπ  Crt;ππConstπ  vga_segment = $0A000;π  fade_Delay  = 20;ππVarπ  lcv  : Integer;π  temp : Char;ππProcedure video_mode (mode : Byte); Assembler;πAsmπ  mov  AH,00π  mov  AL,modeπ  int  10hπend;ππProcedure set_color (color, red, green, blue : Byte);πbeginπ  port[$3C8] := color;π  port[$3C9] := red;π  port[$3C9] := green;π  port[$3C9] := blue;πend;ππProcedure wait_4_refresh; Assembler;πLabelπ  wait, retr;πAsmπ  mov  DX,3DAhπ wait:  in   AL,DXπ  test AL,08hπ  jz   waitπ retr:  in   AL,DXπ  test AL,08hπ  jnz  retrπend;ππbeginπ  ClrScr;π  Writeln('Hey Terje, this is pretty cheezy, but it does show how to wait');π  Writeln('for the vertical screen refresh in assembley, as well as how to');π  Writeln('change colors, too... this isn''t the palette scrolling, but some');π  Writeln('fade Type routines that may come in handy.  The video mode routine');π  Writeln('was also written in assembley (obviously)... well, next I''m going');π  Writeln('to work on zooming (It could be a cool effect).  C''ya L8r. ');π  Writeln(' Press a key...');π  temp := ReadKey;π  video_mode($13);π  lcv := 0;π  Repeatπ    While lcv < 63 doπ    beginπ      wait_4_refresh;π      set_color(0, lcv, lcv, lcv);π      lcv := lcv + 1;π      Delay(fade_Delay);π    end;π    While lcv > 0 doπ    beginπ      wait_4_refresh;π      set_color(0, lcv, lcv, lcv);π      lcv := lcv - 1;π      Delay(fade_Delay);π    end;π  Until KeyPressed;π  video_mode(3);πend.ππ               21     05-28-9313:39ALL                      SWAG SUPPORT TEAM        PALETTE.PAS              IMPORT              54     ÜdÇ1 { FD>  Hey Greg, do you think you could tell me how to accessπ FD> Mode-X, preferably the source, if it's no trouble.... :)ππnot a problem....  Mostly I do Graphics and stuff With C, but when it all comesπdown to it, whether you use Pascal or C For the outer shell the main Graphicsπroutines are in Assembler (For speed) or use direct hardware port accessπ(again, For speed).πThe following is a demo of using palette scrolling techniques in Mode 13h (X)πto produce a flashy "bouncing bars" effect often seen in demos:π}ππProgram PaletteTricks;π{ Speccy demo in mode 13h (320x200x256) }ππUses Crt;ππConst CGA_CharSet_Seg = $0F000;     { Location of BIOS CGA Character set }π      CGA_CharSet_ofs = $0FA6E;π      CharLength      = 8;          { Each Char is 8x8 bits,  }π      NumChars        = 256;        { and there are 256 Chars }π      VGA_Segment     = $0A000;     { Start of VGA memory     }π      NumCycles       = 200;        { Cycles/lines per screen }π      Radius          = 80;ππ      DispStr         : String =    ' ...THIS IS A LITTLE '+π      'SCROLLY, DESIGNED to TEST SOME GROOVY PASCAL ROUTinES...'+π      '                                                        ';ππ      { Colours For moving bars... Each bar is 15 pixels thick }π      { Three colours are palette entries For RGB values...    }π      Colours : Array [1..15*3] of Byte =π                 (  7,  7, 63,π                   15, 15, 63,π                   23, 23, 63,π                   31, 31, 63,π                   39, 39, 63,π                   47, 47, 63,π                   55, 55, 63,π                   63, 63, 63,π                   55, 55, 63,π                   47, 47, 63,π                   39, 39, 63,π                   31, 31, 63,π                   23, 23, 63,π                   15, 15, 63,π                    7,  7, 63  );πππType  OneChar = Array [1..CharLength] of Byte;ππVar   CharSet:  Array [1..NumChars] of OneChar;π      Locs:     Array [1..NumCycles] of Integer;π      BarLocs:  Array [1..4] of Integer;         { Location of each bar }π      CurrVert,π      Count:    Integer;π      Key:      Char;π      MemPos:   Word;ππProcedure GetChars;π{ Read/copy BIOS Character set into Array }π  Var NumCounter,π      ByteCounter,π      MemCounter:       Integer;π  beginπ      MemCounter:=0;π      For NumCounter:=1 to NumChars doπ        For ByteCounter:=1 to CharLength doπ          beginππCharSet[NumCounter][ByteCounter]:=Mem[CGA_CharSet_Seg:CGA_CharSet_ofs+MemCounter];π            inC(MemCounter);π          end;π  end;πππProcedure VideoMode ( Mode : Byte );π{ Set the video display mode }π  beginπ      Asmπ        MOV  AH,00π        MOV  AL,Modeπ        inT  10hπ      end;π  end;πππProcedure SetColor ( Color, Red, Green, Blue : Byte );π{ Update the colour palette, to define a new colour }π  beginπ      Port[$3C8] := Color;      { Colour number to redefine }π      Port[$3C9] := Red;        { Red value of new colour   }π      Port[$3C9] := Green;      { Green "   "   "    "      }π      Port[$3C9] := Blue;       { Blue  "   "   "    "      }π  end;πππProcedure DispVert ( Var CurrLine : Integer );π  { Display next vertical 'chunk' of the Character onscreen }π  Var Letter:    OneChar;π      VertLine,π      Count:     Integer;π  beginπ      { Calculate pixel position of start of letter: }π      Letter := CharSet[ord(DispStr[(CurrLine div 8)+1])+1];π      VertLine := (CurrLine-1) Mod 8;ππ      { Push the Character, pixel-by-pixel, to the screen: }π      For Count := 1 to 8 doπ        if Letter[Count] and ($80 Shr VertLine) = 0π          then Mem[VGA_Segment:185*320+(Count-1)*320+319] := 0π          else Mem[VGa_Segment:185*320+(Count-1)*320+319] := 181;π  end;ππProcedure CalcLocs;π{ Calculate the location of the top of bars, based on sine curve }π  Var Count:    Integer;π  beginπ      For Count := 1 to NumCycles doπ        Locs[Count] := Round(Radius*Sin((2*Pi/NumCycles)*Count))+Radius+1;π  end;πππProcedure DoCycle;π{  Display the bars on screen, by updating the palette entries toπ   reflect the values from the COLOUR Array, or black For blank lines }ππ  Label Wait,Retr,BarLoop,PrevIsLast,Continue1,Continue2,Rep1,Rep2;ππ  beginπ       Asmπ          { First, wait For start of vertical retrace: }π          MOV   DX,3DAhπWait:     in    AL,DXπ          TEST  AL,08hπ          JZ    WaitπRetr:     in    AL,DXπ          TEST  AL,08hπ          JNZ   Retrππ          { then do bars: }π           MOV   BX,0πBarLoop:π           PUSH  BXπ           MOV   AX,Word PTR BarLocs[BX]π           MOV   BX,AXπ           DEC   BXπ           SHL   BX,1π           MOV   AX,Word PTR Locs[BX]π           PUSH  AXπ           CMP   BX,0π           JE    PrevIsLastπ           DEC   BXπ           DEC   BXπ           MOV   AX,Word PTR Locs[BX]π           JMP   Continue1ππPrevIsLast:π           MOV   AX,Word PTR Locs[(NumCycles-1)*2]ππContinue1:π           MOV   DX,03C8hπ           OUT   DX,ALπ           inC   DXπ           MOV   CX,15*3π           MOV   AL,0πRep1:π           OUT   DX,ALπ           LOOP  Rep1ππ           DEC   DXπ           POP   AXπ           OUT   DX,ALπ           inC   DXπ           MOV   CX,15*3π           xor   BX,BXπRep2:π           MOV   AL,Byte Ptr Colours[BX]π           OUT   DX,ALπ           inC   BXπ           LOOP  Rep2ππ           POP   BXπ           inC   Word PTR BarLocs[BX]π           CMP   Word PTR BarLocs[BX],NumCyclesπ           JNG   Continue2ππ           MOV   Word PTR BarLocs[BX],1πContinue2:π           inC   BXπ           inC   BXπ           CMP   BX,8π           JNE   BarLoopππ        end;π      end;πππbeginππ    VideoMode($13);             { Set video mode 320x200x256 }π    Port[$3C8] := 1;            { Write palette table entry }π    For Count := 1 to 180 do    { Black out the first 180 colours, }π      SetColor(Count,0,0,0);    { one colour will be used per line }ππ    { Now colour each scan line using the given palette colour: }π    MemPos := 0;π    For Count := 1 to 180 doπ      beginπ        FillChar(Mem[VGA_Segment:MemPos],320,Chr(Count));π        MemPos := MemPos + 320;π      end;ππ    SetColor(181,63,63,0);π    CalcLocs;π    For Count := 1 to 4 doπ      BarLocs[Count] := Count*10;ππ    GetChars;π    CurrVert := 1;π    Repeatπ      DoCycle;π      For Count := 1 to 8 doπ        Move(Mem[VGA_Segment:185*320+(Count-1)*320+1],π             Mem[VGA_Segment:185*320+(Count-1)*320],319);π      DispVert(CurrVert);π      inC(CurrVert);π      if CurrVert > Length(DispStr) * 8π        then CurrVert := 1;ππ    Until KeyPressed;   { Repeat Until a key is pressed... }ππ    Key := ReadKey;     { Absorb the key pressed }π    VideoMode(3);       { Reset video mode back to Textmode } end.πend.π                                                                                                              22     05-28-9313:39ALL                      SWAG SUPPORT TEAM        PUTPIXEL.PAS             IMPORT              4      Üdî6 {πMICHAEL NICOLAIππRe: Plotting a pixel.πIn 320x200x256 mode it's very simple:πx : 0 to 319, y : 0 to 199π}ππProcedure Plot(x,y Word; color : Byte);πbeginπ  mem[$A000 : (y * 200 + x)] := color;πend;ππ{You mean mem[$A000:y*320+x]:=color;  don't you? ????? ($UNTESTED)}π                                                                                                                    23     05-28-9313:39ALL                      SWAG SUPPORT TEAM        READLNXY.PAS             IMPORT              20     Üd┘∞ {πERIC MILLERππ> My question is this: In TP, the outtextxy is supposed to change theπ> CP (current pointer) to the location given in x,y. When you execute aπ> readln after a outtextxy or even and outtext, the program alwaysπ> starts at 0,0.. Is there a way to set the CP where the readln willπ> recognize it?ππ  Here's a demo of a procedure called ReadlnXY; it readsπ  a string in graphics mode using BGI support.π}ππPROGRAM Graphics_Readln;ππUsesπ  Crt, Graph;ππPROCEDURE ReadlnXY(X, Y: Integer; VAR S: String);πVARπ  Ch       : Char;    { key from keyboard }π  Done     : boolean; { our flag for quiting }π  CurColor : word;    { color to write text in }π  OldX     : Integer; { old x }ππBEGINπ  S := '';π  CurColor := GetColor;π  MoveTo(X, Y);π  Done := False;π  WHILE NOT Done  DOπ  BEGINπ    Ch := Readkey;  { get a single key }ππ    CASE Ch ofπ      #0  : { extra key - two chars - let's ignore them }π        Ch := Readkey;ππ      #13 : { return key }π        Done := true; { we got our string, let's go }ππ      #32..#126:  { ASCII 32 (space) through 126 (tilde) }π        BEGINπ          OutText(Ch);π          S := Concat(S, Ch);π        END;ππ      #8  : IF Length(S) > 0 THENπ        BEGINπ          { move back to last character }π          OldX := GetX - TextHeight(S[Length(S)]);π          MoveTo(OldX, GetY);π          { over write last character }π          SetColor(0);π          OutText(S[Length(S)]);π          SetColor(CurColor);π          MoveTo(OldX, GetY);π          { remove last character from the string }π          Delete(S, Length(S), 1);π        END;ππ    END;π  END;πEND; { ReadlnXY }ππππVARπ  GraphMode, GraphDriver: Integer;π  Name, PathToDriver: String;ππBEGINππ  GraphDriver := VGA;            { VGA }π  GraphMode := VGAHi;            { 640x480x16 }π  PathToDriver := 'D:\BP\BGI';   { path to EGAVGA.BGI }π     { you can make this program work with EGA 640x350x16 -π       it  requires 640 wide and 16 colors to work for thisπ       example, but ReadlnXY should work in any graphics mode }π  InitGraph(GraphDriver, GraphMode, PathToDriver); { set graphics mode }ππ  SetTextStyle(DefaultFont, HorizDir, 2);ππ  SetColor(12);ππ  OutTextXY(63, 63, 'Please enter your name: ');π  SetColor(13);π  ReadlnXY(63 ,95, Name);π  CloseGraph;π  Write('The name you entered was: ');π  Writeln(Name);πEND.π                                                                                                           24     05-28-9313:39ALL                      SWAG SUPPORT TEAM        REMAPCGA.PAS             IMPORT              26     Üdn╠ {πAfter several tricks to redefine Characters in EGA and VGA in this echo,πhere is one you can use in CGA mode 4,5,6. You will find an Unit, and aπtest Program.π}ππUnit graftabl;ππ{πreleased into the public domainπauthor : Emmanuel ROUSSINπFIDO   : 2:320/200.21πEmail  : roussin@frmug.fr.mugnet.orgππfor using redefined Characters (128 to 255)πin CGA mode 4,5 and 6 Without using GRAFTABL.EXEπ}ππInterfaceππTypeπ  Tcaractere8 = Array [1..8] of Byte;π  Tgraftabl = Array [128..255] of Tcaractere8;ππ{πif you want to use only one font, define it in this Unit, For example :ππConstπ  the_only_font : Tgraftabl = (π                              (x,x,x,x,x,x,x,x),π                              .π                              .π                              (x,x,x,x,x,x,x,x),π                              (x,x,x,x,x,x,x,x)π                              );ππOr you can in your main Program :ππVarπ  my_font : Tgraftabl;ππand define it afterπ}ππVarπ  seg_graftabl,π  ofs_graftabl : Word;ππ{internal Procedures}ππProcedure get_graftabl(Var segment, offset : Word);πProcedure put_graftabl(segment, offset : Word);ππ{Procedures to use in your Programs}ππProcedure init_graftabl;πProcedure use_graftabl(Var aray : Tgraftabl);πProcedure end_graftabl;ππImplementationππProcedure get_graftabl(Var segment, offset : Word);πbeginπ  segment := memw[0 : $1F * 4 + 2];π  offset  := memw[0 : $1f * 4];πend;ππProcedure put_graftabl(segment, offset : Word);πbeginπ  memw[0 : $1f * 4 + 2] := segment;π  memw[0 : $1f * 4] := offsetπend;ππProcedure init_graftabl;π{ interrupt 1F is a Pointer to bitmaps For high 128 Chars (8 Bytes perπ  Character) defined by GRAFTABL.EXE we save this initial Pointer }πbeginπ  get_graftabl(seg_graftabl, ofs_graftabl);πend;ππProcedure use_graftabl(Var aray : Tgraftabl);π{ we define a new Pointer : the address of an Array }πbeginπ  put_graftabl(seg(aray),ofs(aray));πend;ππProcedure end_graftabl;π{ we restore the original Pointer }πbeginπ  put_graftabl(seg_graftabl,ofs_graftabl);πend;ππend.ππProgram test;ππUsesπ  Graph3, Crt, graftabl;πππVarπ  font    : Tgraftabl;π  i,j,tmp : Byte;π  rid     : Char;ππbeginπ  hires;π  init_graftabl;π  fillChar(font,sizeof(font),0);π  use_graftabl(font);ππ  {$F000:$FA6E is the ROM address where the Characters 0 to 127 are defined}ππ  For i := 1 to 26 doπ    For j := 0 to 7 doπ    beginπ      tmp := mem[$F000 : $FA6E + 97 * 8 + (i - 1) * 8 + j] xor $FF;π      tmp := tmp xor $FF;π      tmp := tmp or (tmp div 2);π      font[i + 127, j + 1] := tmp;π      { Char 128 to 153 are redefined }π    end;ππ  For i := 1 to 26 doπ    For j := 0 to 7 doπ    beginπ      tmp := mem[$F000 : $FA6E + 97 * 8 + (i - 1) * 8 + j] or $55;π      font[i + 153, j + 1 ] := tmp;π      { Char 154 to 181 are redefined }π    end;ππ  Writeln('the normal Characters ($61 to $7A) :');π  Writeln;π  For i := $61 to $7A doπ    Write(chr(i));π  Writeln; Writeln;π  Writeln('now, these same Characters, but thick :');π  Writeln;π  For i := 128 to 153 doπ    Write(chr(i));π  Writeln; Writeln;π  Writeln('the same Characters, but greyed :');π  Writeln;π  For i := 154 to 181 doπ    Write(chr(i));π  rid := ReadKey;π  end_graftabl;π  Textmode(co80);πend.ππ                         25     05-28-9313:39ALL                      SWAG SUPPORT TEAM        SETMODE1.PAS             IMPORT              6      Üd╩q {πWell, there are two basic ways of using Graphics mode.π1) Use the BIOS routines to enter this mode.π2) Use the BGI (Borland Graphics Interface) used With the Graph Unitπ   and the appropriate BGI File (as mentioned by you).ππSince you intend to display PCX Files, I guess you have no businessπwith the Graph Unit and the BGI, so I suggest the first way.ππExample:π}ππProgram Enter256;ππUsesπ  Dos;ππVarπ  Regs : Registers;ππbeginπ  Regs.Ah := 0;π  Regs.Al := $13;π  Intr($10, Regs);ππ  Readln;πend.ππ{π  At the end of this Program you will be in 320x200 256 color mode.π}                                                                   26     05-28-9313:39ALL                      SWAG SUPPORT TEAM        SETMODE2.PAS             IMPORT              26     Üdèá {RV│ok i would like some info on how to remove a tsr added to memory by aπ  │i'd like some info on ext. VGA screens. For examplw i know that inπ  │320x200x256 that one Byte is equal to one pixel. i need this Type ofπ  │info For =< 640x480ππMode $10 (ie 640x350x16)π-------------------------ππIn this mode, the  256K display memory is divided into 4 bit planes ofπ64K each. Each pixel is produced by 4 bits, one from each bit plane, whichπare combined into a 4-bit value that determines which of the 16 colors willπappear on the screen For that pixel.ππThere is a one-to-one correspondense between the bits in each bit plane andπthe pixel on the screen. For example, bit 7 of the first Byte in each bitπplane correspond to the pixel in the upper left-hand corner of the screen.ππThe display memory For the 640x350 Graphics mode is mapped into memory asπa 64K block starting at A000h, With each 64K bit plane occupying the sameπaddress space (ie: in parallel).ππBecause of the one-to-one relationship of bits in bit planes With the pixelsπon the screen, it's straightForward to calculate the address needed toπaccess a particular pixel. There are 640 bits = 80 Bytes per line on theπscreen. Thus the Byte address corresponding to a particular X,Y coordinateπis given by 80*Y + X/8. A desired pixel can then be picked out of the Byteπusing the bit mask register.π}ππProcedure PutPixel(X,Y:Integer; Color:Byte);πVarπ  Byte_address : Word;π  wanted_pixel        : Byte;πbeginπ  Port[$3CE] := 5;        (* mode register *)π  Port[$3CF] := 2;        (* select Write mode 2 *)π  Port[$3CE] := 8;        (* bit mask register *)π                          (* calculate pixel's Byte address *)π  Byte_address := (80 * Y) + (X div 8);π                          (* set the bit we want *)π  wanted_pixel := (1 SHL (7 - (X MOD 8)));π                          (* mask pixel we want *)π  Port[$3CF] := $FF and wanted_pixel;π                          (* turn the pixel we want on *)π  Mem[$A000:Byte_address] := Mem[$A000:Byte_address] or Colorπend; (* PutPixel *)ππFunction ActiveMode : Byte;π  (* Returns the current display mode *)πVarπ  Regs : Registers;     (* Registers from Dos Unit *)πbeginπ  Regs.AH := $0F;       (* get current video mode service *)π  Intr($10,Regs);       (* call bios *)π  ActiveMode := Reg.AL  (* current display mode returns in AL *)πend;ππ{πSome video numbers:ππ  CGA04         = $04;        (* CGA 320x200x4 *)π  CGA06         = $06;        (* CGA 640x200x2 *)ππ  EGA0D         = $0D;        (* 320x200x16,EGA,2 pages (64K), A0000*)π  EGA0E         = $0E;        (* 640x200x16,EGA,4 pages(64K)      " *)π  EGA0F         = $0F;        (* 640x350 B&W,EGA,2 "     "        "  *)π  EGA10         = $10;        (* 640x350x16 EGA,2 "    (128K)     " *)ππ  VGA11         = $11;        (* 640x480x2 B&W VGA, 4 pages (256K) " *)π  VGA12         = $12;        (* 640x480x16  VGA   1 page  (256K) " *)π  VGA13         = $13;        (* 320x200x256 VGA   4 pages (256K) " *)ππExample:ππ  ...π  if (ActiveMode = VGA13) thenπ    beginπ      ....π      ShowPCX256π      ....π    endπ  ...π}π                                                                                                               27     05-28-9313:39ALL                      SWAG SUPPORT TEAM        SETMODE3.PAS             IMPORT              19     Üde {PK>SetVisualPage are Procedures I spent a lot of time investigating withπPK>Really weird results. In fact I locked up Computer several times andππI hate it when that happens <g>.ππPK>then I got frustrated and posted the message hoping there would be someπPK>other way how to go about it. tom Swan's book Mastering Turbo Pascal 6.0ππThere is: Don't use Graph.TPU and Write all your own routines.  In theπfollowing Program, 3 routines SetVidMode, SetPage, and PutPixπillustrate a Graph.TPU-less example of your original requirement.π}ππProgram test0124;πUses Dos;ππConstπ  VidMode = $10;  {..640x350x16 - Supported By VGA and Most EGA }πVarπ  x,y : Integer;π  reg : Registers;ππProcedure SetVidMode(VidMode :Integer);π  beginπ  reg.ah := $00;π  reg.al := VidMode;π  intr($10,reg);π  end;ππProcedure SetPage(Page :Integer);π  beginπ  reg.ah := $05;π  reg.al := page;π  intr($10,reg);π  end;ππProcedure PutPix(Color,Page,x,y : Integer);π  beginπ  reg.ah := $0C;π  reg.al := Color;π  reg.bh := Page;π  reg.cx := x;π  reg.dx := y;π  intr($10,reg);π  end;ππbeginπSetVidMode(VidMode);πSetPage(0);                                {..set active display page }πFor x := 200 to 440 do                     {..use custom PutPix to }π  For y := 100 to 250 do PutPix(3,1,x,y);  {  draw to different page }πWrite(^g);πReadLn;                                    {..press enter to switch }πSetPage(1);                                {  active display page }πReadLn;πend.ππ{πThere are only a few dozen more routines that you need to have theπFunctionality of Graph.TPU - simple stuff like manipulating palettes,πline/circle/polygon algorithms, fill routines, etc., etc....have fun.ππPK>list all video modes and number of pages it is capable of working withπPK>and VGA in 640x480 (that's the mode I have) is supposed to handle onlyπPK>one page. That's is probably the reason why it doesn't work. What isππThat would do it.  From my reference, Advanced MS Dos Programming - RayπDuncan, The best resolution you can get With multiple page support isπ640x350 (Mode $10).ππAbout the ClearViewPort conflict, I experienced similar problems - Iπwent as Far as pixelling out portions of the display to avoid usingπClearViewPort <Sheesh!> - that Graph Unit doesn't make anything easy.π}                                                 28     05-28-9313:39ALL                      SWAG SUPPORT TEAM        SETMODE4.PAS             IMPORT              14     Üd╝ There are basically three ways you can do it, all of them usingπInterrupt 10h (video interrupt). First, set up something in your Varπlike this:ππ  Varπ    Regs : Registers;ππFunction 0 sets the mode, which will also clear the screen.  This isπuseful if you want to set mode and clear screen at the same time.πIt would look like this;ππ  REGS.AH := 0;π  REGS.AL := x; { where x is the mode you want (get a good Dosπ                  reference manual For these) }π  inTR($10,REGS);ππThe other two options are Really inverses of each other...scrollπWindow up and scroll Window down.  The advantage of these is that itπdoesn't clear the border color (set mode does).  The disadvantage isπthere are a lot more parameters to set.  For these, AH = 6 For scroll upπand 7 For scroll down.  AL = 0 (this Forces a clear screen), CH = theπupper row, CL = the left column, DH = the lower row, DL = the rightπcolumn, and BH = the color attribute (Foreground and background).  As Iπsaid, it's a bit more Complicated, but you can set the screen color atπthe same time if you want to (if not, you'll need to get the currentπattribute first and store it in BH).  You'll also have to know theπcurrent screen mode (40 or 80 columns, 25, 35, 43, or 50 lines).ππAs you can see, clearing the screen without using Crt is a bit moreπComplicated, but you can set a lot of options at the same time as well.πIt's up to you.ππJust as an after-note, I'm currently working on a way to useπpage-switching in Crt mode, writing directly to the video memory.  I'mπsick of not being to switch pages without loading Graph (waste of spaceπand memory, just to switch pages).π                            29     05-28-9313:39ALL                      SWAG SUPPORT TEAM        SETMODE5.PAS             IMPORT              19     ÜdΣ▓ {CD>     Can someone tell me how to get 320x200x256 screen mode in TurboπCD>Pascal 5.5.ππYes.π}πProgram DemoMode13;πUses Dos,Crt;πVarπ LM : Word;π CD : Word;ππ{π; Enable 320*200*256, return True if successful, otherwise Falseπ;π; Reasons For False return : Already in mode 13, mode 13 unsupported.π}πFunction Enable13:Boolean;π Varπ  Regs : Registers;π beginπ  LM:=LastMode;π  Regs.AH:=$0F;π  intr($10,Regs);π  if Regs.AL<>$13 then beginπ   Regs.AH:=$03;π   intr($10,Regs);π   CD:=Regs.CX;π   Regs.AX:=$0013;π   intr($10,Regs);π   if (Regs.Flags and 1)=0 then beginπ    Enable13:=True;π   end else beginπ    Enable13:=False;π   end;π  end else beginπ   Enable13:=False;π  end;π end;ππ{π; Exit 310*200*256 mode, True if successful, False if notπ;π; Reasons For False return : not in mode 13.π}πFunction Release13:Boolean;π Varπ  Regs : Registers;π beginπ  Regs.AH:=$0F;π  intr($10,Regs);π  if Regs.AL=$13 then beginπ   TextMode(LM);π   Regs.AH:=$01;π   Regs.CX:=CD;π   intr($10,Regs);π   Release13:=True;π  end else beginπ   Release13:=False;π  end;π end;ππ{π; Plot a pixel in 320*200*256 mode.π;π; This may appear quite obvious at first, but take a closer look if you thinkπ; it is Really simple.  if you read your Turbo Pascal book, though, you areπ; required to only ponder the usage of `Absolute' For a moment.π}πProcedure DrawPixel(X,Y:Word;Colour:Byte);π Varπ  Screen : Array [0..319,0..199] of Byte Absolute $A000:$0000;π beginπ  Screen[Y,X]:=Colour;π end;ππ{π; Main Program.  Draws points in four corners in random colours, reads a likeπ; of Text (odd, but it displays it!) then returns to Text mode and quits.π}πbeginπ Writeln;π CheckBreak:=False;π CheckSnow:=False;π DirectVideo:=False;π if Enable13 then beginπ  Randomize;π  DrawPixel(0,0,Random(255));π  DrawPixel(319,0,Random(255));π  DrawPixel(0,199,Random(255));π  DrawPixel(319,199,Random(255));π  GotoXY(1,2);π  Writeln('Type something then press [Enter]');π  readln;π  if (not enable13) then beginπ   ClrScr;π  end else beginπ   Writeln;π   Writeln('Error Exiting mode 13.');π   Writeln('Enter MODE CO80 or MODE MONO to');π   Writeln('restore your screen to Text mode.');π  end;π end else beginπ  Writeln('Error invoking mode 13');π end;π Writeln;πend.π                                                                                    30     05-28-9313:39ALL                      SWAG SUPPORT TEAM        SETMODE6.PAS             IMPORT              9      Üd<~ {πGreat Thanks Chris. Now For another question, This Function would returnπ0..63 For the 256 color palette right? Can I also use this For the 16πcolor VGA & EGA palettes With the exception of it returning a value betweenπ0 and 3? and if you wouldn't mind I could also use another Function thatπwould tell me what video mode I am in. I am examining a Program that can useπvideo modes of CGA4 ($04), CGA2 ($06), EGA ($10), VGA ($12) and MCGA ($13)πand it Uses this Procedure to set the video mode:π}ππProcedure VideoMode (n: Integer);πbeginπ    Reg.ah := $00;π    Reg.al := n;π    intr ($10, Reg);πend;ππ{πWith the N being the hex numbers from the above video modes.ππNow i know next to nothing about interrupts, and your code looks very similarπto what was done to set each color. Is the way to find out the value of al toπcall the interrupt in the same manner as above without specifying a value Forπal? Would it return the current al value...... or am I in left field on thisπone :)π}                                                31     05-28-9313:39ALL                      SWAG SUPPORT TEAM        SETMODE7.PAS             IMPORT              11     Üd╙ I heard (read?) that you wanted to find out how to do 256-colour Graphics.πHere are some Procedures For you.ππUses Dos;   { if your Program doesn't already :) }ππProcedure SetGrMode(grMode : Byte);  { enters a given Graphics mode }π{ does *not* check For presence of VGA -- use With caution!! }πVarπ   r : Registers;πbeginπ     r.AX := grMode;π     Intr($10, R);πend;ππProcedure PutPixel256(p_x, p_y : Integer; p_c : Byte);πbeginπ     Mem[$A000 : p_y * 320 + p_x] := p_c;πend;ππOK, With the SetGrMode Procedure, to enter 256-colour mode, call the Programπwith a value of $13.  So:  SetGrMode($13);πAnd to return to Text mode, call:  SetGrMode($03);πThe second Procedure is self-explanatory, With a few bits of info required.πThe valid co-ords are 0..319 (horizontal) x 0..199 (vertical), so you can't useπGetMaxX or GetMaxY, unless you define them as Constants in the beginning ofπyour Program.  The colour is in the range 0..255.ππ*WARNING*  These Procedure will not work together With a BGI driver or theπGraph Unit.  If you enter Graphics mode With my Procedure, you will not be ableπto output Text, boxes, circles, etc. unless you Write your own Procedures forπthe above.π                                                                                                        32     05-28-9313:39ALL                      SWAG SUPPORT TEAM        SETPAGE.PAS              IMPORT              14     ÜdÑi {π Hi..  I am trying to do animation by flipping the two images betweenπ the video pages, but I keep getting lines at the bottom of my screen,π and my screen color changes..  What's up here?π Did you synchronize to the {vertical|horizontal retrace beForeπ flipping? I don't know how to do this, so any helpfull code from you willπ be appreciated. I took this out of my ANIVGA-Unit:ππAt the very beginning of your Program, detect the address of the proper portπ(StatusReg is a global Word Variable):π}ππ Asm  {check whether we are running on a monochrome or color monitor}π   MOV DX,3CCh  {ask Output-register:}π   in AL,DXπ   TEST AL,1    {is it a color monitor?}π   MOV DX,3D4hπ   JNZ @L1      {yes}π   MOV DX,3B4h  {no }π  @L1:          {DX=3B4h/3D4h = CrtAddress-register For monochrome/color}π{ MOV CrtAddress,DX  not needed For this purpose}π   ADD DX,6     {DX=3BAh/3DAh = Status-register For monochrome/color}π   MOV StatusReg,DXπ end; {of Asm}ππ{πLater on, when you want to switch pages:ππ   CLI {time critical routine: do not disturb!}π    mov dx,StatusRegπ  @WaitnotVSyncLoop:π    in   al,dxπ    and  al,8π    jnz  @WaitnotVSyncLoopπ  @WaitVSyncLoop:π    in   al,dxπ    and  al,8π    jz   @WaitVSyncLoopπ{π    HERE! SWITCH PAGES NOW!!! IMMEDIATELY! do not USE BIOS-inTS or OTHERπ    TIME-WASTERS!π}π   STIπ{πWell, that's all there is... if you replace the 2 "and al,8" against "and al,1"πand exchange jnz<->jz, you are syncronizing at the horizontal retrace. But thisπsignal is extremely short (at least Compared With the vertical retr.).π}π                                                                                                                 33     05-28-9313:39ALL                      SWAG SUPPORT TEAM        STARS1.PAS               IMPORT              20     Üd*≡ {πBERNIE PALLEKππ> Hmm.. does anyone have an example of a starfield routine in Turbo Pascal..ππOK, here's a sample (I don't know what kind of starfield you're looking for):ππ{EGA/VGA parallax stars}ππUsesπ  Crt, Graph, KasUtils;ππConstπ  starCol : Array[0..2] of Byte = (8, 7, 15);ππTypeπ  StarRec = Recordπ    x : Integer;π    y : Integer;π    d : Integer;  { depth }π  end;ππVarπ  stars : Array[0..31] of StarRec;π  xinc,π  yinc  : Integer;π  ch    : Char;πππProcedure OpenGraph;πVarπ  gd, gm : Integer;πbeginπ  EgaVga_Exe;π  Gd := Detect;π  { this doesn't care if you don't have correct video card or not }π  InitGraph(gd, gm, '');   { put the path to your BGI }πend;ππProcedure InitStars;πVarπ  i : Integer;πbeginπ  For i := 0 to 31 doπ  With stars[i] doπ  beginπ    x := Random(GetMaxX);π    y := Random(GetMaxY);π    d := Random(3);π  end;πend;ππProcedure MoveStars;πVarπ  i : Integer;πbeginπ  For i := 0 to 31 doπ  With stars[i] doπ  beginπ    PutPixel(x, y, 0);π    x := x + xinc * (d + 1);π    if (x < 0) thenπ      x := x + GetMaxX;π    if (x > GetMaxX) thenπ      x := x - GetMaxX;π    y := y + yinc * (d + 1);π    if (y < 0) thenπ      y := y + GetMaxY;π    if (y > GetMaxY) thenπ      y := y - GetMaxY;π    PutPixel(x, y, starCol[d]);π  end;πend;ππbeginπ  OpenGraph;  (* enter Graphics mode *)π  InitStars;π  xinc := 1;π  yinc := 0;π  Repeatπ    MoveStars;π    Delay(10);π    (* Delay here For faster computers *)π  Until KeyPressed;π  ch := ReadKey;π  if (ch = #0) thenπ    ch := ReadKey;  (* get rid of extended keycodes *)π  CloseGraph;πend.ππ{πWhew!  There you have it!  Untested, of course, so you may have to iron out aπfew bugs.ππ**** BIG HINT: You should probably use Real numbers instead of Integer numbersπfor x and y positions and increments, and Round them when PutPixel-ing!  Thisπwill allow you to make smoother transitions, as well as bouncing effects, andπother neat stuff. ****ππYou'll notice (if the thing works) that the stars move horizontally only, andπthe dimmer ones move slower than the bright ones (parallax/multi-layered).  Youπcan add extra layers, but remember to change the StarCol Constant so you haveπthe right number of colours For the stars.ππSorry, I was too lazy to comment it thoroughly; I'm expecting that you'll beπable to figure it out Without too much trouble.  Sorry if you can't; Write meπfor an explanation.  TTYL.π}π                                                           34     05-28-9313:39ALL                      SWAG SUPPORT TEAM        STARS2.PAS               IMPORT              11     Üdτm { DANIEL SCHLENZIG }ππProgram stars;ππConstπ  maxstars = 200;ππVarπ  star  : Array[0..maxstars] of Word;π  speed : Array[0..maxstars] of Byte;π  i     : Word;ππProcedure create;πbeginπ  For i := 0 to maxstars doπ  beginπ    star[i]  := random(320) + random(200) * 320;π    speed[i] := random(3) + 1;π    if mem[$a000 : star[i]] = 0 thenπ      mem[$a000 : star[i]] := 100;π  end;πend;ππProcedure moveit; Assembler;πAsmπ  xor   bp,bpπ  mov   ax,0a000hπ  mov   es,axπ  lea   bx,starπ  lea   si,speedπ  mov   cx,320ππ @l1:π  mov   di,[bx]π  mov   al,es:[di]π  cmp   al,100π  jne   @j1π  xor   al,alπ  stosbπ @j1:π  mov   al,[si]π  xor   ah,ahπ  add   [bx],axπ  mov   ax,bxπ  xor   dx,dxπ  div   cxπ  mul   cxπ  mov   dx,bxπ  sub   dx,axπ  cmp   dx,319π  jle   @j3π  sub   [bx],cxπ @j3:π  mov   di,[bx]π  mov   al,es:[di]π  or    al,alπ  jnz   @j2π  mov   al,100π  stosbπ @j2:π  add   bx,2π  inc   siπ  inc   bpπ  cmp   bp,maxstarsπ  jle   @l1π end;ππbeginπ  Asmπ    mov   ax,13hπ    int   10hπ    call  createππ   @l1:π    mov   dx,3dahπ   @r1:π    in    al,dxπ    test  al,8π    je    @r1ππ    call moveitπ    in   al,60hπ    cmp  al,1π    jne  @l1;π  end;πend.π                                                                                                                         35     05-28-9313:39ALL                      SWAG SUPPORT TEAM        TEXTFADE.PAS             IMPORT              34     Üd±⌡ {πI attempted to Write a Unit For Text FADING, but I don't have it all downπright...  If any one wants to play With the Unit and perfect it I would notπmind!  My problem is that I do not know the correct values to change in theπcolor register For the affect of a fade.  Once all the values are 0 the screenπis black, but on the way there the screen gets some strange colors... Also, ifπyou know how to change the colors, you can implement your own custom colors forπText mode.  I think 256 different colors, but only 16 at a time. (I am onlyπguessing at that last part).   The FADEOUT and FADEIN does work here, but itπgoes through some strange colors on the way!ππRobertπ}ππUnit TextFade; {attempt For implementing Text fading}π{ only works For VGA or SVGA as Far as I know! }ππInterfaceππUses Dos, Crt;ππTypeπ  ColorRegister =π  Recordπ    Red      : Byte;π    Green    : Byte;π    Blue     : Byte;π  end;ππ  ColorRegisterArray    = Array[0..255] of ColorRegister;π  ColorRegisterArrayPtr = ^ColorRegisterArray;ππVarπ  SaveCRAp      : ColorRegisterArrayPtr;ππProcedure SaveColorRegister(Var CRAp : ColorRegisterArrayPtr);π{ given a color register Array ptr, this will save the current }π{ values so you can restore from them later...                 }ππProcedure SetColorRegister(Var CRAp : ColorRegisterArrayPtr);π{ when you adjust the values of a color register set, this     }π{ Procedure will make put the new values into memory           }ππProcedure FadeOut(MS_Delay : Integer);π{ using the global Variable 'SaveCRAp', this will fade the Text}π{ screen out till all the values in the color register Array   }π{ ptr are 0                                                    }ππProcedure FadeIn(MS_Delay : Integer);π{ once again using the global Variable 'SaveCRAp', this will   }π{ fade the screen back in till all values of the current color }π{ register Array ptr are equal to 'SaveCRAp'                   }ππImplementationππProcedure Abort(Msg : String);πbeginπ  Writeln(Msg);π  Halt(1);πend;ππProcedure SaveColorRegister(Var CRAp : ColorRegisterArrayPtr);πVarπ  R : Registers;πbeginπ  With R Doπ  beginπ    ah := $10;π    al := $17;π    bx := $00;π    cx := 256;π    es := Seg(crap^);π    dx := Ofs(crap^);π  end;π  Intr($10,r);πend;ππProcedure SetColorRegister(Var CRAp : ColorREgisterArrayPtr);πVarπ  R : Registers;πbeginπ  With R Doπ  beginπ    ah := $10;π    al := $12;π    bx := $00;π    cx := 256;π    es := Seg(crap^);π    dx := Ofs(crap^);π  end;π  Intr($10,r);πend;ππProcedure FadeOut(MS_Delay : Integer);πVarπ  NewCRAp : ColorRegisterArrayPtr;π  W       : Word;π  T       : Word;πbeginπ  New(NewCRAp);π  If NewCRAp = NIL Thenπ    Abort('Not Enough Memory');π  NewCrap^ := SaveCrap^;π  For T := 1 to 63 Doπ  beginπ    For W := 0 to 255 Doπ    With NewCRAp^[w] Doπ    If Red + Green + Blue > 0 Thenπ    beginπ      Dec(Red);π      Dec(Green);π      Dec(Blue);π    end;π    SetColorRegister(NewCRAp);π    Delay(MS_Delay);π  end;πend;ππProcedure FadeIn(MS_Delay : Integer);πVarπ  NewCRAp : ColorRegisterArrayPtr;π  W       : Word;π  T       : Word;πbeginπ  New(NewCRAp);π  If NewCRAp = Nil Thenπ    Abort('Not Enough Memory');π  FillChar(NewCRAp^,SizeOf(NewCRAp^),0);π  For T := 1 to 63 Doπ  { The values in the color register are not higher than 63 }π  beginπ    For W := 0 to 255 Doπ    If SaveCRAp^[w].Red + SaveCRAp^[w].Green + SaveCRAp^[w].Red > 0 Thenπ    beginπ      If NewCRAp^[w].Red   < SaveCRAp^[w].Red Thenπ        Inc(NewCRAp^[w].Red);π      If NewCRAp^[w].Green < SaveCRAp^[w].Green Thenπ        Inc(NewCRAp^[w].Green);π      If NewCRAp^[w].Blue  < SaveCRAp^[w].Blue Thenπ        Inc(NewCRAp^[w].Blue);π    end;π    SetColorRegister(NewCRAp);π    Delay(MS_Delay);π  end;πend;πππbeginπ  New(SaveCRAp);π  {get memory For the Pointer}π  If SaveCRAp = Nil Then Abort('Not Enough Memory');π  {make sure it actually got some memory}π  SaveColorRegister(SaveCRAp);π  {save the current values into SaveCRAp}πend.ππ---------------8<-----cut here------>8---------ππHere is a demo of how to use it...πππUses TextFADE;ππbeginπ   FADEOUT(10);π   WriteLN(' HOW DOES THIS LOOK');π   FADEIN(10);π   Dispose(SaveCRAp);π   {I just Realized I never got rid of this Pointer before!}πend.π                          36     05-28-9313:39ALL                      SWAG SUPPORT TEAM        VGA Tricks               IMPORT              19     Üdyy {πSorry it took so long - anyway here's a new batch of VGA TRICKS :πFirst there's your basic equipment - synchronizing withπthe vertical Crt retrace.π( You can use this For hardware VGA scrolling synchronisation too, justπsubstitute the Delay(14) in my old routine For a call to thisπProcedure.)π}ππProcedure VRET;Assembler; {works For CGA,EGA and VGA cards}πAsmπ  MOV  DX, $03DAπ  MOV  AH, 8π@Wau: in   AL, DXπ  TEST AL, AHπ  JNZ  @Wau     { wait Until out of retrace }π@Wai: in   AL, DXπ  TEST AL, AHπ  JZ   @Wai     { wait Until inside retrace }πendππ{πThe following is Really new, as Far as I know: breaking the colorπbarrier by displaying more than 64 different colors on a Text modeπscreen. (But it will work For Text and Graphics color modes.)πIt displays the effect For approximately SEC seconds, affectingπthe black background and any black Characters. note that ifπyou have the border set to black too, the bars will expand into it.π}ππProcedure ColorBars(Sec:Byte);Assembler;πAsmπ  MOV AL,Secπ  MOV AH,70      { assume a 70 Hz mode (= 400 lines like mode 3 or $13)}π  MUL AHπ  MOV CX,AXπ  MOV DX,$03DAπ  in AL,DXπ  MOV DX,$03C0   { assume color nr 0 = default Text background.. }π  MOV AL,$20+0   { set color nr 0 .. }π  OUT DX,ALπ  MOV AL,0       { .. to DAC color 0 }π  OUT DX,ALπ@Doscreen:π  xor SI,SIπ  CLIπ  MOV DX,$03DAπ  MOV AH,8π@Wau: in AL,DXπ  TEST AL,AHπ  JNZ @Wau       { wait Until out of retrace }π@Wai: in AL,DXπ  TEST AL,AHπ  JZ @Wai        { wait Until inside retrace }π@Doline:π  STIπ  MOV DX,$03C8  { point to DAC[0] }π  MOV AL,0π  OUT DX,ALπ  inC SI        { line counter }π  MOV BX,SIπ  ADD BX,CX     { prepare For color effect }π  MOV DI,$03C9π  CLIπ  MOV DX,$03DAπ@Whu: in AL,DXπ  RCR AL,1π  JC @Whu       { wait Until out of horizontal retrace }π@Whi: in AL,DXπ  RCR AL,1π  JNC @Whi      { wait Until inside retrace }π  MOV DX,DIπ  XCHG BX,AX  { tinker With these to change the chromatic effect}π  OUT DX,AL   { dynamic Red }π  ADD AL,ALπ  OUT DX,AL   { dynamic Green }π  XCHG SI,AXπ  OUT DX,AL   { static Blue }π  XCHG SI,AXπ  CMP SI,200    { paint 200 lines }π  JBE  @dolineπ  DEC DX         { last line }π  MOV AL,0       { reset to black For remainder of screen }π  OUT DX,ALπ  inC DXπ  OUT DX,ALπ  OUT DX,ALπ  OUT DX,ALπ  STIπLoop @Doscreenπend;ππ                 37     05-28-9313:39ALL                      SWAG SUPPORT TEAM        TWEAKED.PAS              IMPORT              32     ÜdÑi {π Hi, would anyone like to tell me how to get the tweaked videoπ mode With 4 pages to work With because I'm tired of the 16 colorπ 2 page demos I'm making.ππSure, here's an adaptation of some code from Dr. Dobbs magazine on Mode-X.πI've only posted the routine to set the VGA to 360x240x256 With 3 pages ofπGraphics.  Only 3 pages since the increase in resolution Uses more RAM.π}ππProcedure InitVGA360x240;ππConstπ  GC_inDEX    = $03CE;    { VGA Graphics Controller }π  SC_inDEX    = $03C4;    { VGA Sequence controller }π  CrtC_inDEX  = $03D4;    { VGA Crt Controller      }π  MISC_OUTPUT = $03C2;    { VGA Misc Register       }π  MAP_MASK    = $02;      { Map Register #          }π  READ_MAP    = $04;      { Read Map Register #     }ππ  VMODE_DATA  : Array[1..17] of Word =π                   ($6B00,    { Horizontal total          }π                    $5901,    { Horizontal displayed      }π                    $5A02,    { Start horizontal blanking }π                    $8E03,    { end horizontal blanking   }π                    $5E04,    { Start H sync.             }π                    $8A05,    { end H sync.               }π                    $0D06,    { Vertical total            }π                    $3E07,    { Overflow                  }π                    $4109,    { Cell height               }π                    $EA10,    { V sync. start             }π                    $AC11,    { V sync. end/Prot CR0 CR7  }π                    $DF12,    { Vertical displayed        }π                    $2D13,    { offset                    }π                    $0014,    { DWord mode off            }π                    $E715,    { V Blank start             }π                    $0616,    { V Blank end               }π                    $E317);   { Turn on Byte mode         }ππbeginπ  Asmπ   mov   ax, $13π   int   $10ππ   mov   dx, SC_inDEX           { Sequencer Register }π   mov   ax, $0604              { Disable Chain 4 Mode }π   out   dx, axππ   mov   ax, $0100              { (A)synchronous Reset }π   out   dx, axππ   mov   dx, MISC_OUTPUT        { VGA Misc Register }π   mov   al, $E7                { Use 28Mhz Clock & 60Hz }π   out   dx, alππ   mov   dx, SC_inDEX           { Sequencer Register }π   mov   ax, $0300              { Restart Sequencer }π   out   dx, axππ   {π     Diasable Write protect For CrtC Registers 0-7, since we areπ     about to change the horizontal & vertical timing settings.π   }π   mov   dx, CrtC_inDEX         { VGA CrtC Registers }π   mov   al, $11                { CrtC register 11h }π   out   dx, al                 { Load current value }π   inc   dx                     { Point to data }π   in    al, dx                 { Get CrtC register 11h }π   and   al, $7F                { Mask out Write protect }π   out   dx, al                 { and send it back }ππ   { Send CrtC data in VMODE_DATA Array to the CrtC. }π   mov   dx, CrtC_inDEX         { VGA CrtC Registers }π   cld                          { Forward block load }π   mov   si, offset VMODE_DATA  { Get parameter data }π   mov   cx, 17                 { Number of entries in block }ππ   @@1:π     mov   ax, ds:[si]      { Get next parameter value }π     inc   si               { Advance to next Word }π     inc   siπ     out   dx, ax           { Output next value }π     loop  @@1              { Process next value }ππ   { Clear all VGA memory to black. }π   mov   dx, SC_inDEX     { Select all planes }π   mov   ax, $0F02π   out   dx, axππ   mov   ax, VGA_SEG      { Point to VGA memory }π   mov   es, axπ   mov   di, 0ππ   xor   ax, ax           { clear 256K }π   mov   cx, $8000        { 32K * 2 * 4 planes }π   rep   stoswπ  end;πend;π{πThat's about it.  The video memory in this mode is organised a bit differentlyπthan CGA/HERC.  It is a lot like the 16 color modes you're probably used to, inπthat you must go through the EGA/VGA Registers to access the memory, by settingπMAP MASK & PLANE SELECT, etc.π}π                             38     05-28-9313:39ALL                      SWAG SUPPORT TEAM        TXTFADE.PAS              IMPORT              13     Üd√└ { RON CZARNIK }ππUnit TXTFADE;ππInterfaceππProcedure TextFadeIn(Speed : Integer);πProcedure TextFadeOut(Speed : Integer);ππImplementationπUsesπ  Dos, Crt;ππTypeπ  DacType = Array[1..256,1..3] of Byte;ππVarπ  dac1,π  dac2   : DacType;π  x, y,π  i, erg,π  gesamt : Word;πππProcedure Read_DACs(Var Dac : DacType);πVarπ  r : Registers;πbeginπ  r.ax := $1017;π  r.bx := 0;π  r.cx := 256;π  r.es := SEG(Dac);π  r.dx := Ofs(Dac);π  Intr($10, r);πend;ππProcedure Write_DACs(Dac : DacType);πVarπ  r : Registers;πbeginπ r.ax := $1012;π r.bx := 0;π r.cx := 256;π r.es := seg(Dac);π r.dx := Ofs(Dac);π Intr($10, r);πend;ππ{ fade....}πProcedure TextFadeOut(Speed : Integer);πbegin;π  Repeatπ    erg := 0;π    For x := 1 to 256 doπ      For y := 1 to 3 doπ      beginπ        if dac2[x, y] > 0 thenπ          DEC(dac2[x, y]);π        erg := erg + dac2[x, y];π      end;π    Write_Dacs(dac2);π    Delay(Speed);π  Until erg = 0;πend;ππ{ restore....fades also}πProcedure TextFadeIn(Speed : Integer);πbegin;π  Repeatπ    erg := 0;π    For x := 1 to 256 doπ      For y := 1 to 3 doπ      beginπ       if dac2[x, y] < dac1[x, y] thenπ         INC(dac2[x,y]);π       erg := erg + dac2[x, y];π      end;π    Write_Dacs(dac2);π    Delay(Speed);π  Until (erg = gesamt) or (KeyPressed);π  Write_Dacs(dac1);πend;ππbeginπ  Read_Dacs(dac1);π  dac2 := dac1;π  gesamt := 0;π  For x := 1 to 256 doπ    For y := 1 to 3 doπ      gesamt := gesamt + dac1[x, y];ππend.π                                                                                                       39     05-28-9313:39ALL                      SWAG SUPPORT TEAM        VGA-PTR.PAS              IMPORT              19     Üd!┬ {    Make a Pointer, make a Type of the data Type you are dealing with, make asπmany Pointers as you will need data segments (or as commonly practiced amongstπthe Programming elite, make an linked list of the data items), and call theπGETMEM Procedure using the Pointer in the Array... Here is an example I use toπcopy VGA (320x200x256) screens...π}ππTypeπ    ScreenSaveType = Array[0..TheSize] of Byte;πVarπ   TheScreen                    : ScreenSaveType Absolute $A000:0000;π   Screen                       : Array[1..100] of ^ScreenSaveType;ππbeginπ     InitGraphics;π     Count := 0;ππ     Repeatπ           Count := Count + 1;π           GetMem(Screen[Count],Sizeof(ScreenSaveType));π           WriteLn('Memory at Screen ',Count,' : ',MemAvail); {THIS MAKESπ                                                               THE PAGES}π     Until MemAvail < 70000;π     For X := 1 to Count doπ         For A := 1 to TheSize do                   {THE MAKES A SCREEN}π             Screen[X]^[A] := Random(255);π     E := C;π     X := 0;π     GetTime(A,B,C,D);π     C2 := 0;ππ     Repeatπ           X := X + 1;π           GetTime(A,B,C,D);π           if C <> E thenπ              beginπ              C2 := C2 + 1;π              testresults[C2] := X;π              X := 1;π              E := C;π              end;π     TheScreen := Screen[X mod Count + 1]^;π     Move(Scroll2,Scroll1,Sizeof(Scroll2));π     Until KeyPressed;π     WriteLn(Test,'Number of Screens :',Count);π     For X := 1 to C2 doπ         WriteLn(Test,'Number of flips, second #',X,':',testresults[x]);π     Close(Test);πend.ππ{    I didn't try and Compile that, I also edited out the ProcedureπinitGraphics because you aren't Really interested in that end. However whereπit says "THIS MAKES THE PAGES" is what you want to do.. In this particularπversion I made 4 Graphics pages under pascal and 5 outside of pascal, I couldπhave fit more but I have too many TSRS. Using Extended memory I can fit aboutπ20 Graphics pages (I got about 2 megs ram), but you can extend that as Far asπram may go. The MOVE command isn't a bad command either to know. I got whenπrunning a Text mode, 213 Text pages per second. I was even impressed (PSπGraphics people, I got 16 Graphics pages per second in 320x200x256 mode!)...π}π                             40     05-28-9313:39ALL                      SWAG SUPPORT TEAM        VGA BGI & Detect         IMPORT              10     ÜdÅ≤ (*πERIC MILLERππ> Let's suppose that I used VGA256.BGI.  I change it to VGA256.OBJ.  And inπ> my program, I type the following: {$L VGA256.OBJ}ππWell, you can't lin VGA256.BGI into the program that way; for someπreason, if it wasn't included in TP6 it won't register.  You haveπto use the InstallUserDriver function instead of RegisterBGIDriver.πHere is a program that get's into VGA256 mode that way - but ofπcourse you must already know how to do it.π*)ππPROGRAM Vg;ππUsesπ  Graph;ππFUNCTION vgaPresent : boolean; assembler;πasmπ  mov ah,$Fπ  int $10π  mov ax,$1A00π  int $10      {check for VGA/MCGA}π  cmp al,$1Aπ  jne @ERR     {no VGA Bios}π  cmp bl,7π  jb @ERR      {is VGA or better?}π  cmp bl,$FFπ  jnz @OKπ @ERR:π  xor al,alπ  jmp @EXITπ @OK:π  mov al,1π @EXIT:πend;ππ{$F+}πFUNCTION DetectVGA256: Integer;πBEGINπ  IF vgaPresent THENπ    DetectVGA256 := 0π  ELSEπ    DetectVGA256 := grError;πEND;π{$F-}πππVARπ  VGA256: Integer;π  B: Integer;ππBEGINπ  VGA256 := InstallUserDriver('VGA256', @DetectVGA256);π  B := 0;π  InitGraph(VGA256, B, '');π  OutText('In 320x200x256 - press enter');π  Readln;π  CloseGraph;πEND.π                             41     05-28-9313:39ALL                      SWAG SUPPORT TEAM        VGA Detect #1            IMPORT              7      Üd░ {πSEAN PALMERππWell, here are routines to detect a VGA and an EGA adapter...π}πUsesπ  Crt;ππVarπ  OldMode : Byte;ππfunction EGAInstalled : boolean; assembler;πasmπ  mov ax, $1200π  mov bx, $10π  mov cx, $FFFFπ  int $10π  inc cxπ  mov al, clπ  or  al, chπend;ππfunction VgaPresent : boolean; assembler;πasmπ  mov ah, $Fπ  int $10π  mov oldMode, al   {save old Gr mode}π  mov ax, $1A00π  int $10           {check for VGA/MCGA}π  cmp al, $1Aπ  jne @ERR          {no VGA Bios}π  cmp bl, 7π  jb  @ERR          {is VGA or better?}π  cmp bl, $FFπ  jnz @OKπ @ERR:π  xor al, alπ  jmp @EXITπ @OK:π  mov al, 1π @EXIT:πend;ππbeginπ  OldMode := LastMode;π  Writeln(EGAInstalled);π  Writeln(VGAPresent);πend.                                                                          42     05-28-9313:39ALL                      SWAG SUPPORT TEAM        VGA Detect #2            IMPORT              8      ÜdîQ {π> I know how to determine the current mode of a card, but how do a lot ofπ> Programs determine if a VGA is present in the first place? I'd ReallyππMICHAEL NICOLAIπIt's very easy to check if a VGA card is present, 'cause there are someπFunctions which are only supported on VGAs. The best one is this:π}ππUsesπ  Dos;ππFunction Is_VGA_present : Boolean;πVarπ regs : Registers;πbeginπ Is_VGA_present := True;π regs.ax := $1A00;π intr($10, regs);π if (regs.al <> $1A) thenπ  Is_VGA_present := False;πend;πππ{ KELD R. HANSEN }ππFunction VGA : Boolean; Assembler;πAsmπ  MOV     AH,1Ahπ  INT     10hπ  CMP     AL,1Ahπ  MOV     AL,Trueπ  JE      @OUTπ  DEC     AXπ @OUT:πend;ππ{ will return True if a VGA card is installed. }πbeginπ  Writeln(Is_VGA_present);π  Writeln(VGA);πend.                                                                                                                           43     05-28-9313:39ALL                      SWAG SUPPORT TEAM        VGA Fonts from file      IMPORT              21     Üdò≤ {π  Sean Palmerππ> Does anyone know of any way to display a single screen of Graphics onπ> EGA 640x350 mode *quickly*.  It can be VGA as well; I'm just trying toπ> display the screen *fast* from a disk File.  I know, I could have usedπ> the GIF or PCX format (or any other format), but I want to make aπ> proprietary format to deter hacking of the picture.  So, what I want toπ> know is how to read the data from disk directly to screen.  I'veπ> figured out that BlockRead (if I can get it to work) is the best methodπ> of reading the data from the disk, but I don't know of any fast, and Iπ> mean *fast*, methods of writing the data to the screen.  Would it beπ> feasible to use an Array the size of the screen and Move the Array toπ> the screen (I'd need memory locations For that, if possible)?  Anyπ> response (ideas, solutions, code fragments) would be appreciated.ππYou could set up the screen as an Absolute Variable.πThen read in each plane as an Array DIRECTLY from the disk File.πBefore reading each plane, set up Write mode 0 (should be already in mode 0)πand make sure that the enable set/reset register is set to 0 so that the cpuπWrites go directly to the planes. Set the sequencer map mask register forπeach plane so you only Write to them one at a time. and enable the entire BitπMask register ($0F). Then after telling it which plane, read directly fromπthe File. No I haven't tested the following code and most of it's gonna beπfrom memory but give it a try:ππthe File:π  Plane 0π  Plane 1π  Plane 2π  Plane 3ππeach Plane:π  350 rows of 80 Bytes (each bit belongs to a different pixel)π}ππTypeπ  scrRec = Array[0..640 * 350 div 8 - 1] of Byte;πVarπ  screen : scrRec Absolute $A000 : 0000;π  dFile  : File of scrRec;ππConstπ  gcPort  = $3CE;  {EGA/VGA Graphics controller port}π  seqPort = $3C4;  {EGA/VGA sequencer port}ππProcedure readFileToMode10h(s:String);πVarπ  dFile : File of scrRec;π  i     : Byte;πbeginπ  Asmπ    mov ax, $10;π    int $10;π  end;  {set up video mode}π  assign (dFile,s);π  reset(s);  {no error checking 8) }π  portw[gcPort] := $0001;    {clear enable set/reset reg}π  portw[gcPort] := $FF08;    {set entire bit mask (this is the default?)}π  For i := 0 to 3 doπ  beginπ   {set map mask reg to correct plane}π   portw[seqPort] := (1 shl (i + 8)) + $02;π   read(dFile, screen); {load that plane in}π  end;π  portw[seqPort] := $0F02;   {restore stuff to normal}π  portw[gcPort]  := $0F01;π  close(dFile);πend;π                                                                                                             44     05-28-9313:39ALL                      SWAG SUPPORT TEAM        VGA User Fonts           IMPORT              22     Üd╨¿ {π>so it appears nothing happened).  I have seen some Programs that areπ>able to save the Dos font into a buffer in the Program and then justπ>set the video card back to that font when the Program quits.  The problemπ>is, I have not seen any documented Dos interrupt that will allow me toπ>do this.π>  I'm wondering if anyone knows of such an interrupt that I can use toπ>  get the current VGA font and save it to a buffer.π>  Any help would be greatly appreciated!ππ   Interrupt $10 is what you're looking For. Function $11,π   subFunction $30 gets the Character generator info.π   Function $11, subFunction $10 loads user fonts. Function $11 canπ   also be used to Reset to one of the hardware fonts (subFunctionπ   $11 Resets to ROM 8x14, $12 Resets to ROM 8x8, $14 Resets to VGAπ   ROM 8x16)ππ   The structure Types are as follows:π}πTypeππ  { enumerated font Type }π  ROMfont = (ROM8x14, ROM8x8, ROM8x16);ππ  { Character definition table }π  CharDefTable = Array[0..4096] of Byte;π  CharDefPtr   = ^CharDefTable;ππ  { Text Character generator table }π  Char_Table = Recordπ     Points :Byte;π     Def    :CharDefPtr;π  end;ππ  { font Format }π  FontPackage = Recordπ     FontInfo :Char_Table;π     Ch       :CharDefTable;π  end;π  FontPkgPtr = ^FontPackage;ππ{ Here are some handy Procedures to use those Types: }ππProcedure GetCharGenInfo(font: ROMfont; Var Table:Char_Table);πbeginπ  if is_EGA thenπ  beginπ    Reg.AH := $11;π    Reg.AL := $30;π    Case font ofπ      ROM8x8 : Reg.BH := 3;π      ROM8x14: Reg.BH := 2;π      ROM8x16: Reg.BH := 6;π    end;π    Intr($10, Reg);π    Table.Def := Ptr(Reg.ES, Reg.BP);π    Case font ofπ      ROM8x8 : Table.Points := 8;π      ROM8x14: Table.Points := 14;π      ROM8x16: Table.Points := 16;π    end;π  end;πend;ππProcedure SetHardwareFont(Var font :ROMfont);πbeginπ  if is_EGA thenπ  beginπ    Reg,AH := $11;π    Case font ofπ      ROM8x14 : Reg.AL := $11;π      ROM8x8  : Reg.AL := $12;π      ROM8x16 :π        if is_VGA thenπ           Reg.AL := $14 { 8x16 on VGA only }π        elseπ        beginπ           Reg.AL := $12;π           font := ROM8x14;π        end;π    end;π    Reg.BL := 0;π    Intr($10, Reg);π  end;πend;ππFunction FetchHardwareFont(font :ROMfont):FontPkgPtr;πVarπ  pkg :FontPkgPtr;πbeginπ  New(pkg);π  GetCharGenInfo(font, Pkg^.FontInfo);π  Pkg^.Ch := Pkg^.FontInfo.Def^;π  FetchHardwareFont := Pkg;πend;ππProcedure LoadUserFont(pkg :FontPkgPtr);πbeginπ  Reg.AH := $11;π  Reg.AL := $10;π  Reg.ES := Seg(pkg^.ch);π  Reg.BP := Ofs(pkg^.ch);π  Reg.BH := Pkg^.FontInfo.Points;π  Reg.BL := 0;π  Reg.CX := 256;π  Reg.DX := 0;π  Intr($10, Reg);πend;ππ                                                                         45     05-28-9313:39ALL                      SWAG SUPPORT TEAM        VGA ClrScr #1            IMPORT              20     Üdδ  {π Anivga is the best set of Graphics routines i've seen For the PC sinceπ i stopped using my old 4,7 Mhz MSX (which had smooth sprites &π scrolling) and the one With the most extra's.ππWell, here is >ONE< solution For you.  It is one I have used in aπstreetfighter Type game a friend and I have been working on (the friendπis an artist who has been doing the pics While I'm doing the software).πIt turns out, using an index-to-index copy during vertical retrace isπfast enough to get at least (and I mean at LEAST--I've been able to overπDouble this rate) 18.2 frames per second on a 16bit VGA card.ππThe code (in pascal, although the Program itself is written in C++, theπtheory works With TP6.0) would look something like this:π}ππTypeπ  ScreenRec = Array[0..63999] of Byte;π  ScreenPtr = ^ScreenRec;ππVarπ  VGAScreen : ScreenRec Absolute $A000:$0000; {I think thats how you doπ                                               it, been a While since Iπ                                               had to do things this way}ππProcedure VS_PutPixel(x, y: Integer; c:Byte; VS: ScreenPtr);ππbeginπ  VS^[(y*320)+x] := c; {Again, this may be off slightly--my originalπ                        pascal Implementation used a member Variable inπ                        an Object}πend;ππProcedure VS_Write(VS: ScreenPtr);ππVarπ  X : Integer;π  Y : Integer;ππbeginπ  {Wait For a retrace--see a VGA manual For how to do this, it takesπ  monitoring two ports.  if you are already in a retrace, wait For it toπ  end and another one to begin}π  For Y := 0 to 199 doπ    For X := 0 to 319 doπ      VGAScreen[(Y*320)+X] := VS^[(Y*320)+X];πend;ππ{πWith this method, you even have time in the nexted For loops (!) to do aπComparison.  One I typically use (For emulating multiple planes) is ifπVS^[(Y*320)+X] <> 0...  That lets me copy multiple screens.  to give youπan idea of how fast this is, on my 386/25, I can do this during a timerπinterrupt (18.2 times a second) without any problems, and still haveπtime to do full collision detection and multisprite animation withπscrolling backgrounds and Soundblaster Sound.  During the retraceπperiod, you can move quite a bit of inFormation into the VGA card,πbecause memory accesses are MUCH faster (the screen is also not beingπupdated).  This is CompLETELY flicker free using this technique (ifπsmaller sections are chaging, you MIGHT consider only copying parts ofπthe screen).ππ}                  46     05-28-9313:39ALL                      SWAG SUPPORT TEAM        VGA ClrScr #2            IMPORT              14     Üd7Å {   The following Turbo Pascal Program displays HARDWARE SCROLLinGπ   For 100% Compatible VGA cards,in mode $13.π   I'd be grateful if anyone interestedπ   could test this and report the results :π}ππProgram VGASLIDE; {requirements TP6 or higher + register-Compatible VGAπ}ππUses Crt;ππVarπ  t,slide:Word;π  ch:Char;ππProcedure VgaBase(Xscroll,Yscroll:Integer);π  Var dum:Byte;π beginπ  Dec(SLIDE,(Xscroll+320*Yscroll));   { slide scrolling state         }π  Port[$03d4]:=13;                    { LO register of VGAMEM offset  }π  Port[$03d5]:=(SLIDE shr 2) and $FF; { use 8 bits:  [9..2]           }π  Port[$03d4]:=12;                    { HI register of VGAMEM offset  }π  Port[$03d5]:= SLIDE shr 10;         { use 6 bits   [16..10]         }π  Dum:=Port[$03DA];                   { reset to input by dummy read  }π  Port[$03C0]:=$20 or $13;            { smooth pan = register $13     }π  Port[$03C0]:=(SLIDE and 3) Shl 1;   { use bits [1..0], make it 0-2-4-6π}π end;πππbegin {main}ππ  Asm                {inITIALIZE vga mode $13 using BIOS}π  MOV AX,00013hπ  inT 010hπ  end;ππ  SLIDE:=0;ππ  { draw a quick test pattern directly to video memory }π  For T:= 0 to 63999 do MEM[$A000:T]:=(T mod (317 + T div 10000)) and 255;ππ  Repeatπ   Vgabase(-1,-1);  { scroll smoothly in UPPER LEFT direction }π   Delay(14);π  Until KeyPressed;π  ch:=ReadKey;ππ  Repeatπ   Vgabase( 1, 1);  { scroll smoothly in LOWER RIGHT direction }π   Delay(14);π  Until KeyPressed;π  ch:=ReadKey;ππ  Asmπ  MOV AX,00003h   {reset to Textmode}π  inT 010hπ  end;ππend.π                                                                                                                            47     05-28-9313:39ALL                      SWAG SUPPORT TEAM        VGA ClrScr #3            IMPORT              23     Üd' {πI also wanted to put a picture bigger than the screen to scroll overπFor the intro.  --  ANIVGA  --π}ππProgram ScrollExample;π{Demonstrates how to use the VGA's hardware scroll to do some nice opening}π{sequence: the Program loads 3 Graphic pages With data and then scrolls   }π{them by. note that this erases the contents of the background page and   }π{thus shouldn't be used While animating sprites in parallel!}ππUsesπ  ANIVGA, Crt;ππProcedure IntroScroll(n,wait:Word);π{ in: n    = # rows to scroll up using hardware zoom}π{     wait = time (in ms) to wait after each row    }π{rem: Scrolling *always* starts at page 0 (=$A000:0000)   }π{     Thus, issuing "Screen(1-page)" afterwards is a must!}π{     if you put the routine into ANIVGA.PAS, you should delete all the}π{     Constants following this line}πConstπ  StartIndex=0;π  endIndex=StartIndex+3;π  {offsetadressen der Grafikseiten (in Segment $A000):}π  offset_Adr:Array[StartIndex..endIndex] of Word=($0000,$3E80,$7D00,$BB80);π  CrtAddress=$3D4; {if monochrome: $3B4}π  StatusReg =$3DA; {if monochrome: $3BA}πbeginπ  Screen(0);                  {position at $A000:0000}π  Asmπ    xor SI,SI                {use page address 0 }π    and SI,3π    SHL SI,1π    ADD SI,ofFSET offset_Adr-StartIndex*2 {call this "defensive Programming"..}π    LODSWπ    MOV BX,AXπ    MOV CX,nπ    MOV SI,waitπ  @oneline:π    ADD BX,LinESIZEπ    CLI                      {no inTs please!}π    MOV DX,StatusRegπ    @WaitnotHSyncLoop:π      in   al,dxπ      and  al,1π      jz  @WaitnotHSyncLoopπ    @WaitHSyncLoop:π      in   al,dxπ      and  al,1π      jz   @WaitHSyncLoopπ    MOV DX,CrtAddress        {Crt-controller}π    MOV AL,$0D               {LB-startaddress-register}π    OUT DX,ALπ    inC DXππ    MOV AL,BLπ    OUT DX,AL                {set new LB of starting address}π    DEC DXπ    MOV AL,$0Cπ    OUT DX,ALπ    inC DXπ    MOV AL,BH                {dto., HB}π    OUT DX,ALπ    STIππ    PUSH BXπ    PUSH CXπ    PUSH SIπ    PUSH SIπ    CALL Crt.Delayπ    POP SIπ    POP CXπ    POP BXπ    LOOP @onelineπ  end;πend;ππbeginπ InitGraph; {Program VGA into Graphic mode, clear all pages}ππ {--- Start of Intro ---}π Screen(0); {or SCROLLPAGE, just an aesthetic question...}π {Load 3 pages With pics, or draw them:}π LoadPage('1st.PIC',0);π LoadPage('2nd.PIC',1);π LoadPage('3rd.PIC',BackgndPage);π IntroScroll(3*200,20); {scroll up 3 pages, wait 20ms}π Delay(3000); {wait a few seconds}π Screen(1-page); {restore correct mode}π {--- end of Intro ---}ππ {now do your animations as usual}π {...}π CloseRoutines;πend.ππ{πif you adjust LoadPage() to allow loading into Graphic page 3 (=SCROLLPAGE),πtoo, you may easily do a 4 screen hardware scroll!π}π                                                                                                                             48     05-28-9313:39ALL                      SWAG SUPPORT TEAM        MODE XY                  IMPORT              43     Üd║[ {πKAI ROHRBACHERππ> explain MODE X.ππWell,  I don't care much about Mode X (which is 320x240x256), but use Mode Yπ(=320x200x256)  --at least I think that this mode is called "Mode Y" (as farπas  I  know, the terms were introduced by a series of Michael Abrash in "Dr.πDobb's  Journal" (?)). Nevertheless, things are identical With the exceptionπof initialising the VGA card! So here we go; note that the Asm code examplesπwere taken from my ANIVGA-toolkit: the PASCAL-equivalents when given are "onπthe  fly"  Asm->PASCAL  translations  For  improved  clarity (I hope...); inπdoubt, rely on the Asm part.ππMODE Y in a nutshellπ~~~~~~~~~~~~~~~~~~~~ππBasically,  Mode  Y  works  like  this:  use  the BIOS to switch into normalπ320x200x256  mode,  then reProgram the sequencer to unchain the 4 bitplanes.πThis  results  in  a bitplaned VRAM layout very similiar to the EGA/VGA's 16πcolor modes:π}πProcedure InitGraph; Assembler;πAsmπ  MOV AX,0013hπ  INT 10hπ  MOV DX,03C4hπ  MOV AL,04π  OUT DX,ALπ  INC DXπ  in  AL,DXπ  and AL,0F7hπ  or  AL,04π  OUT DX,ALπ  MOV DX,03C4hπ  MOV AL,02π  OUT DX,ALπ  INC DXπ  MOV AL,0Fhπ  OUT DX,ALπ  MOV AX,0A000hπ  MOV ES,AXπ  SUB DI,DIπ  MOV AX,DIπ  MOV CX,8000hπ  CLDπ  REP STOSWππ  MOV DX,CrtAddressπ  MOV AL,14hπ  OUT DX,ALπ  INC DXπ  in  AL,DXπ  and AL,0BFhπ  OUT DX,ALπ  DEC DXπ  MOV AL,17hπ  OUT DX,ALπ  INC DXπ  in  AL,DXπ  or  AL,40hπ  OUT DX,ALπend;ππ{πCrtAddress  and  StatusReg  are the port addresses For the VGA ports needed;πthey  are 3B4h and 3BAh on a monochrome display and 3D4h and 3DAh on a colorπdisplay, but can be determined at run-time, too:π}ππAsmπ  MOV DX,3CChπ  in AL,DXπ  TEST AL,1π  MOV DX,3D4hπ  JNZ @L1π  MOV DX,3B4hπ @L1:π  MOV CrtAddress,DXπ  ADD DX,6π  MOV StatusReg,DXπend;ππ{πThe  VRAM  layout  is  this:  underneath  each  memory  address in the rangeπ$A000:0000..$A000:$FFFF,  there  are  4 Bytes, each representing one pixel'sπcolor.πWhenever you Write to or read from such an address, an internal logic of theπVGA-card determines which one of those 4 pixels is accessed.πA  line  of  320  pixels (=320 Bytes) thus only takes 320/4=80 Bytes addressπspace,  but  to  address  a pixel, you need a) its VRAM address and b) whichπbitplane it's on.πThe  pixels  are arranged linearly: thus, the mapping from point coordinatesπto memory addresses is done by (x,y) <-> mem[$A000: y*80+ (x div 4)] and theπbitplane is determined by (x mod 4).π(Note coordinates start With 0 and that "div 4" can be computed very fast byπ"shr 2"; "mod 4" by "and 3").ππSo  you  computed the proper address and bitplane. If you want to _read_ theπpixel's color, you issue commands like this:π portw[$3CE]:=(bitplane SHL 8)+4; color:=mem[$A000:y*80+(x shr 2)]πOr For better speed & control, do it in Asm:ππ MOV AL,4π MOV AH,bitplaneπ MOV DX,3CEhπ CLIπ OUT DX,AXπ MOV AL,ES:[DI]π STIππ_Writing_  a pixel's color works similiar, but needs an additional step: theπmask is computed by 1 SHL bitplane (that is: 1/2/4/8 For mod4 values 0/1/2/3πrespectively):π portw[$3C4]:=(1 SHL bitplane+8)+2; mem[$A000:y*80+(x shr 2)]:=colorπOr using Asm again:ππ MOV CL,bitplaneπ MOV AH,1π SHL AH,CLπ MOV AL,2π MOV DX,3C4hπ CLIπ OUT DX,AXπ STOSBπ STIππAs  stated  above, one address represents 4 pixels, so 320x200 pixels occupyπ16000  address  Bytes.  We  do  have  65536  (=$A000:0..$A000:$FFFF) though,πtherefore  a  bit  more  than 4 pages are possible. It's up to you to defineπyour  pages,  0..15999=page  0,  16000..31999=page  1,  32000..47999=page 2,π48000..63999=page 3, 64000..65535=unused  is the most obvious layout.ππWhich  part  of  the VRAM is actually displayed can be Programmed by writingπthe  offset  part of the starting address to the Crt-controller (the segmentπpart is implicitly set to $A000):ππAsmπ  MOV DX,CrtAddressπ  MOV AL,$0Dπ  CLIπ  OUT DX,ALπ  INC DXπ  MOV AL,low Byte of starting offsetπ  OUT DX,ALπ  DEC DXπ  MOV AL,$0Cπ  OUT DX,ALπ  INC DXπ  MOV AL,high Byte of starting offsetπ  OUT DX,ALπ  STIπend;ππN.B.: if you reProgram the display's starting address more often than "everyπnow  and  then",  you  better  synchronize  that  to the vertical retrace orπhorizontal  enable  signal  of  your VGA card; otherwise, an annoying screenπflicker will become visible during switching!ππFor  example,  if  you do a "FOR i:=1 to 100 do SetAddress(i*80)", this willπresult  in a blinding fast hardware scroll: With each iteration of the loop,πthe  display will start 80 address Bytes (=320 pixels = 1 row) later, givingπthe impression of the display scrolling upwards.ππNote  that  Mode  X/Y  do  not differ in any other respect than their memoryπlayouts  from  all  the  other  bitplaned VGA modes: palette handling is theπsame,  as  is usage of the VGA's Write modes! In (default) Write mode 0, youπcan access the VRAM by Bytes, Words or dWords. Write mode 1 is handy to copyπthe  contents  of  one  Graphic  page to another: you are restricted to Byteπaccesses, but each one will transfer 4 Bytes at once.πFor example, a sequence like the following...πportw[$3C4]:=$0f02; portw[$3CE]:=$4105;πmove(mem[$a000:0000],mem[$a000:$3e80],16000);πportw[$3CE]:=$4005π...enables  all 4 planes, switches to Write mode 1, copies the (64000 Bytes)πcontents  of  the  2nd Graphic page to the 1st one and then switches back toπWrite mode 0 again.π}                                                                                            49     05-30-9308:57ALL                      SWAG SUPPORT TEAM        Dispaly PIC,PCX,SCI,GIF  IMPORT              64     Üdw> {π>Does anyone know of any way to display a single screen of Graphics on EGAπ>640x350 mode *quickly*.  It can be VGA as well; I'm just trying to display tπ>screen *fast* from a disk File.  I know, I could have used the GIF or PCXππThis would restore a .PIC format File, uncompressed, For 320x200x256πmode $13, With a prepended 256*3 Byte palette entry header.  It shouldπwork- I just wrote this code yesterday to display some unknown .PICπFiles.π}ππProgram dispic;πConstπ  maxpicsize = 320*200;πTypeπ  pbuf = ^abuf;π  abuf=Array[1..maxPICSIZE] of Byte;π  palbuf = ^apalbuf;π  apalbuf=Array[1..256*3] of Byte;π  headerbuf=^aheaderbuf;π  aheaderbuf=Array[1..32] of Byte;πVarπ  f : File;π  i : Byte;π  buf : pbuf;π  pal : palbuf;π  header : headerbuf;π  hsize,vsize,picsize,headersize,palettesize:Word;π  _r,_g,_b,π  cr : Byte;π  nr,ctr : Word;π  fs,overflow : LongInt;π  Filename : String;πππProcedure setcolreg(p:Pointer;start,num:Word);πbeginπ  Asmπ    mov  ah,10hπ    mov  al,12h           { seg block of color Registers }π    mov  bx,startπ    mov  cx,numπ    mov  dx,Word ptr p+2  { get high Word of p (seg) }π    mov  es,dxπ    mov  dx,Word ptr p    { get low Word of p (ofs) }π    int  $10π  end;πend;ππProcedure stop(s:String);πbeginπ  Writeln(s);π  halt;πend;ππbeginπ  Writeln('DISPIC v0.01ß (c)1993 Brian Pape/Jagaer Technologies'+#10#13);π  Writeln(maxavail,' Bytes available.');π  if paramcount < 1 thenπ    stop('no .PIC File specified.');π  Filename := paramstr(1);π  assign(f,Filename);π  {$I-} reset(f,1); {$I+}π  if ioresult <> 0 thenπ    beginπ      Writeln('File '+Filename+' not found.');π      halt;π    end;π  new(header);π  Writeln(maxavail,' Bytes available after header allocate.');π  palettesize := sizeof(pal^);π  headersize := sizeof(header^);ππ  if Filesize(f) < headersize+palettesize then stop('invalid .pic File.');ππ  blockread(f,header^,headersize,nr);π  if nr < sizeof(headersize) thenπ    stop('insufficient header information.')π  elseπ    Writeln('header: ',nr,' Bytes read.');π  hsize := (Word(header^[4]) shl 8) or header^[3];π  vsize := (Word(header^[6]) shl 8) or header^[5];ππ  picsize := (Word(header^[14]) shl 8) or header^[13];π  Writeln('picsize: ',picsize,' Bytes.');π  if picsize > maxpicsize thenπ    beginπ      picsize := maxpicsize;π      Writeln('picture size read overflow. resetting to maxpicsize.');π    end;ππ  dispose(header);π  new(pal);π  Writeln(maxavail,' Bytes available after palette allocate.');ππ  blockread(f,pal^,palettesize,nr);π  if nr < palettesize thenπ    stop('insufficient palette information.')π  elseπ    Writeln('palette: ',nr,' Bytes read.');ππ  new(buf);π  Writeln(maxavail,' Bytes available after buffer allocate.');π  {$I-} blockread(f,buf^,sizeof(buf^),nr); {$I+}π  if ioresult <> 0 then;π  Writeln('picture: ',nr,' Bytes read.');π  Writeln('hsize: ',hsize);π  Writeln('vsize: ',vsize);π  Writeln('press enter.');π  readln;π  close(f);π  Asmπ    mov ah,00π    mov al,$13π    int $10π  end;π  move(buf^,ptr($a000,0)^,nr);ππ  setcolreg(pal,0,256);ππ  dispose(buf);π  dispose(pal);π  readln;π  Asmπ    mov ah,00π    mov al,03π    int $10π  end;πend.ππ{π> Hello is somebody there that knows how to use pictures that Iπ> made in Deluxe paint (.lbm)ππFirst, convert the LBM File to a SCI using For instance VPIC.πI assume you are using VGA/MCGA 320x200x256.. In Case you don't,πthis won't work...:π}πUsesπ  Crt;πVarπ  SCIFile : File;π  r, g, b : Byte;π  i       : Integer;π  VideoM  : Byte Absolute $A000:0000;πbeginπ  Asmπ    mov ax,0013hπ    int 10hπ  end;ππ  Assign(SCIFile, 'MYSCI.SCI');   { Put your own Filename there }π  Reset(SCIFile, 1);ππ  For i := 0 to 255 do beginπ    Port[$3C8] := i;π    BlockRead(SCIFile,r,1);π    BlockRead(SCIFile,g,1);π    BlockRead(SCIFile,b,1);π    Port[$3C9] := r;π    Port[$3C9] := g;π    Port[$3C9] := b;              { Set palette }π   end;ππ  BlockRead(SCIFile,VideoM,64000);π  Repeat Until Port[$60] = 1;     { Wait For ESC }ππ  Asmπ    mov ax,0003hπ    int 10hπ  end;πend.ππ{π> I am looking to create a simple utility to report the size, color, etcπ> of GIFs.π}ππProgram GI;πUsesπ  Dos;ππProcedure ExtractGIFInfo (Name : String);ππConstπ  ColorRez : Array[1..8] of Byte=(1,3,7,15,31,63,127,255);ππTypeπ  GifSigRec = Array[1..6] of Char;ππ  ScreenDiscRec = Recordπ    Width,π    Height:Word;π    GenInfo:Byte;π  end;ππVarπ  F       : File;π  Sig     : GIFSigRec;π  Screen  : ScreenDiscRec;π  Result  : Word;π  Diver,π  X       : Byte;π  Y       : LongInt;π  DirInfo : SearchRec;π  Ratio   : Byte;π  Res     : Word;π  RReal   : Real;ππbeginπ  Assign(F, Name);π  Reset(F, 1);π  BlockRead(F, Sig, SizeOF(Sig), Result);π  BlockRead(F, Screen, SizeOf(Screen), Result);π  Close(F);ππ  If (Sig[1] + Sig[2] + Sig[3] <> 'GIF') Thenπ  beginπ    WriteLn('Not a Valid .GIF File!');π    Exit;π  end;ππ  For X := 1 to 6 doπ    Write(Sig[X]);π  Write(', ', Screen.Width, 'x', Screen.Height, 'x');π  Screen.GenInfo := (Screen.GenInfo and 7) + 1;π  Res := ColorRez[Screen.GenInfo] + 1;π  WriteLn(Res);πend;ππVarπ  Count : Byte;πbeginπ  If ParamCount >= 1 thenπ    For Count := 1 to ParamCount doπ      ExtractGIFInfo (ParamStr(Count))π  elseπ    WriteLn(' Use a Filename geek!');πend.πHad the PCX info:ππZSoft .PCX File HEADER ForMATππByte Item         Size Description/Commentsππ0    Manufacturer  1    Constant Flag, 10 = ZSoft .pcxππ1    Version       1    Version inFormationπ            0 = Version 2.5 of PC Paintbrushπ            2 = Version 2.8 w/palette inFormationπ            3 = Version 2.8 w/o palette inFormationπ            4 = PC Paintbrush For Windows(Plus For Windowsπ                Uses Ver 5)π            5 = Version 3.0 and > of PC Paintbrush andπ                PC Paintbrush +, includes Publisher's Paintbrushππ2    Encoding       1   1 = .PCX run length encodingππ3    BitsPerPixel   1   Number of bits to represent a pixel (perπ                                Plane)- 1, 2, 4, or 8ππ4    Window         8   Image Dimensions: Xmin,Ymin,Xmax,Ymaxππ12   HDpi           2   Horizontal Resolution of image in DPI*ππ14   VDpi           2   Vertical Resolution of image in DPI*ππ16   Colormap       48  Color palette setting, see Textππ64   Reserved       1   Should be set to 0.ππ65   NPlanes        1   Number of color planesππ66   BytesPerLine   2   Number of Bytes to allocate For a scanlineπ                        plane.  MUST be an EVEN number.  Do notπ                        calculate from Xmax-Xmin.ππ68   PaletteInfo    2   How to interpret palette- 1 = Color/BW, 2 =π                                Grayscale (ignored in PB IV/ IV +)ππ70   HscreenSize    2   Horizontal screen size in pixels.ππNew field found only in PB IV/IV Plusππ72   VscreenSize    2   Vertical screen size in pixels.ππNew field found only in PB IV/IV Plusππ74   Filler         54  Blank to fill out 128 Byte header.  Set allπ                        Bytes to 0ππnotES:ππAll sizes are measured in ByteS.ππAll Variables of SIZE 2 are Integers.ππ*HDpi and VDpi represent the Horizontal and Vertical resolutionsπwhich the image was created (either Printer or scanner); i.e. anπimage which was scanned might have 300 and 300 in each of theseπfields.π{π> Does anyone have the format structure For PCX format? I had itπ> once but I lost it... It had a header (big surprise), and usedπ> run-length compression (HAHAHAHAHA!!!!), but it seems the easiest majorπ> format to code.ππ  Here's the header, I haven't fooled much With coding/decoding PCXπbut if I remember right (At least For 256c images) the runπlength-Byte is up to 64 since the most-significant bits signify theπend of a line in the image.  And in 256c images, the last 768 Bytesπshould be the palette.π}ππPCXHeader   =  Recordπ  Signature      :  Char;π  Version        :  Char;π  Encoding       :  Char;π  BitsPerPixel   :  Char;π  XMin,YMin,π  XMax,YMax      :  Integer;π  HRes,VRes      :  Integer;π  Palette        :  Array [0..47] of Byte;π  Reserved       :  Char;π  Planes         :  Char;π  BytesPerLine   :  Integer;π  PaletteType    :  Integer;π  Filler         :  Array [0..57] of Byte;πend;ππ  50     05-31-9308:09ALL                      SWAG SUPPORT TEAM        256 VGA Colors           IMPORT              23     ÜdQc ==============================================================================π BBS: «« The Information and Technology Exchanπ  To: DOUGLAS BAKER                Date: 11-11─91 (20:18)πFrom: WILBERT VAN.LEIJEN         Number: 2147   [101] PASCALπSubj: 256 TEXT COLORS?           Status: Publicπ------------------------------------------------------------------------------πHi Doug,ππ > I was wondering if anyone knows if 256 text colors can be accessedπ > with a VGA adaptor. I figured that since such programs as VGADimmerπ > exist, (to change the brightness) I should be able to change theπ > intensity ofd each color to simulate the 256 colors. Any help and TPπ > 5.5 or 6.0 routines would be appreciated.ππYou can have no more than 16 colours in text mode.  These colours can beπselected on the VGA from 255 registers and changed at will.  Each register canπalso be programmed to hold a specific Red, Blue and Green value ranging fromπ0..63, giving 64*64*64 = 262,144 unique colours.πThe registers are referred to as the 'DAC registers'.ππProgram ShowDoug;ππ{$X+ }ππuses Crt;ππConstπ  MinIntensity = 0;π  MaxIntensity = 63;ππTypeπ  ColourRange  = MinIntensity..MaxIntensity;π  RGBType      = Recordπ                   r, g, b   : ColourRange;π                 end;ππ{ Store colour information to DAC register }ππProcedure SetRegister(register : Byte; colour : ColourRange); Assembler;ππASMπ        MOV     BH, colourπ        MOV     BL, registerπ        MOV     AX, 1000hπ        INT     10hπend;  { SetRegister }ππ{ Store the Red, Green and Blue intensity into a DAC register }ππProcedure SetRGBValue(register : Byte; RGB : RGBType); Assembler;ππASMπ        PUSH    DSπ        LDS     SI, RGBπ        XOR     BX, BXπ        MOV     BL, registerπ        LODSBπ        MOV     DH, ALπ        LODSWπ        XCHG    CX, AXπ        XCHG    CH, CLπ        MOV     AX, 1010hπ        INT     10hπ        POP     DSπend;  { SetRGBValue }ππVarπ  i, j, t : Integer;π  RGB : RGBType;ππBeginπ  ClrScr;π  Randomize;π  TextBackground(black);π  For i := 1 to 25 Doπ    Beginπ      t := 0;π      For j := 1 to 80 Doπ        Beginπ          TextColor(t);π          If j mod 5 = 0 Thenπ            Inc(t);π          If not ((j = 80) and (i = 25)) Thenπ            Write(#219);π      end;π    end;π  Repeat                          { fiddle with the registers }π    SetRegister(Random(16), Random(64));π    Delay(200);π  Until KeyPressed;π  ReadKey;π  Repeat                           { fiddle with the R, G, B values }π    RGB.r := Random(255);π    RGB.g := Random(255);π    RGB.b := Random(255);π    SetRGBValue(Random(64), RGB);π  Until KeyPressed;πend.πππ--- Dutchie V2.91dπ * Origin: Point Wilbert | 'I think, therefore I ASM'. (2:500/12.10956)π                                                                                  51     06-08-9308:27ALL                      SEAN PALMER              Scale Bitmats            IMPORT              13     ÜdΓ/ {π===========================================================================π BBS: Canada Remote SystemsπDate: 05-26-93 (00:24)             Number: 24154πFrom: SEAN PALMER                  Refer#: NONEπ  To: ALL                           Recvd: NOπSubj: SCALING BITMAPS                Conf: (1221) F-PASCALπ---------------------------------------------------------------------------πDon't know if anyone is interested, but here is some code to scaleπbitmaps. I JUST now wrote it, and it's tested, but it hasn't even begunπto be optimized yet (that's why it's still postable in the Pascal Echo,πno .ASM stuff yet)  8)ππworks with VGA mode $13. }ππtypeπ fixed=record case boolean ofπ        true:(l:longint);π        false:(f:word;i:integer);π        end;ππprocedure scaleBitmap(var bitmap;x,y:word;x1,y1,x2,y2:word);πvarπ a,i:word;π sx,sy,cy,s:fixed;π map:array[0..65521]of byte absolute bitmap;πbeginπ sx.l:=(x*$10000)div succ(x2-x1); sy.l:=(y*$10000)div succ(y2-y1);π cy.i:=pred(y); cy.f:=$FFFF;π while cy.i>=0 do beginπ  a:=y2*320+x1;π  s.l:=(cy.i*x)*$10000;π  for i:=x2-x1 downto 0 do beginπ   mem[$A000:a]:=map[s.i];π   inc(a);π   inc(s.l,sx.l);π   end;π  dec(cy.l,sy.l); dec(y2);π  end;π end;ππconstπ bmp:array[0..3,0..3]of byte=π  ((0,1,2,3),π   (1,2,3,4),π   (2,3,4,5),π   (3,4,5,6));πvar i:integer;ππbeginπ asm mov ax,$13; int $10; end;π for i:=1 to 99 doπ  scaleBitMap(bmp,4,4,0,0,i*2,i*2);π asm mov ax,$3; int $10; end;π end.π                                                                                                   52     07-16-9306:06ALL                      SEAN PALMER              Access Video Bios Fonts  IMPORT              23     Üd   ===========================================================================π BBS: Canada Remote SystemsπDate: 07-02-93 (14:00)             Number: 29054πFrom: SEAN PALMER                  Refer#: NONEπ  To: FRANCIS BURIANEK              Recvd: NO  πSubj: DOS FONT                       Conf: (1221) F-PASCALπ---------------------------------------------------------------------------πFB>Would You know, where the Video Bios Fonts are located at? (address),πFB>or a way to access using an interrupt?ππI pulled this off the echo a while back...ππTypeπ  FontBlock    = 0..7;π  CharSetType  = (INT1F, INT43, ROM8x14, ROM8x8lo, ROM8x8hi, ROM9x14,π                 ROM8x16, ROM9x16);ππ{ Get a pointer to one of the eight resident VGA fonts }ππFunction GetFontPtr(charset : CharSetType) : Pointer; Assembler;ASMπ        MOV    BH, charsetπ        MOV    AX,$1130π        INT    $10π        MOV    DX, ESπ        XCHG   AX, BPπend;ππ{ Get font block index of current (resident) and alternate character set.π  Up to two fonts can be active at the same time }ππProcedure GetFontBlock(Var primary, secondary : FontBlock); Assembler;ASMπ  { Get character map select register:π    (VGA sequencer port 3C4h/3C5h index 3)ππ    7  6  5  4  3  2  1  0π          |  |  |  |  |  |π          |  |  |  |  +--+--   Primary font   (lower 2 bits)π          |  |  +--+--------   Secondary font (lower 2 bits)π          |  +--------------   Primary font   (high bit)π          +-----------------   Secondary font (high bit)     }ππ        MOV     AL, 3π        MOV     DX,$3C4π        OUT     DX, ALπ        INC     DXπ        IN      AL, DXπ        MOV     BL, ALπ        PUSH    AXπ  { Get secondary font number: add up bits 5, 3 and 2 }π        SHR     AL, 1π        SHR     AL, 1π        AND     AL, 3π        TEST    BL,$20π        JZ      @1π        ADD     AL, 4π@1:     LES     DI, secondaryπ        STOSBπ  { Get primary font number: add up bits 4, 1 and 0 }π        POP     AXπ        AND     AL, 3π        TEST    BL,$10π        JZ      @2π        ADD     AL, 4π@2:     LES     DI, primaryπ        STOSBπend;ππ{ Store the font block index }ππProcedure SetFontBlock(primary, secondary : FontBlock); Assembler;πConstπ  MapPrimTable : Array[0..7] of Byte = ($00, $01, $02, $03,$10, $11, $12, $13);π  MapSecTable  : Array[0..7] of Byte = ($00, $04, $08, $0C,$20, $24, $28, $2C);πASMπ        MOV     AL, primaryπ        LEA     BX, MapPrimTableπ        XLATπ        MOV     AH, ALπ        MOV     AL, secondaryπ        LEA     BX, MapSecTableπ        XLATπ        ADD     AL, AHπ        MOV     BL, ALπ{ Set block specifier }π        MOV     AX,$1103π        INT     $10πend;πππ * OLX 2.2 * If at first you succeed, hide your astonishment...ππ--- Maximus 2.01wbπ * Origin: >>> Sun Mountain BBS <<< (303)-665-6922 (1:104/123)π           53     07-16-9306:15ALL                      SEAN PALMER              Detect Presents of VGA   IMPORT              12     Üd   ===========================================================================π BBS: Canada Remote SystemsπDate: 06-30-93 (16:12)             Number: 28771πFrom: SEAN PALMER                  Refer#: NONEπ  To: JOHN DAILEY                   Recvd: NOπSubj: VGA INFO                       Conf: (1221) F-PASCALπ---------------------------------------------------------------------------πJD>I'm looking for a quick-and-dirty way of checking to see ifπJD>a user has VGA capability in text mode.  ie. 50 line mode.πJD> Any help is appreciated.ππfunction vgaPresent:boolean;assembler;asmπ mov ah,$F; int $10; mov oldMode,al;  {save old Gr mode}π mov ax,$1A00; int $10;    {check for VGA/MCGA}π cmp al,$1A; jne @ERR;     {no VGA Bios}π cmp bl,7; jb @ERR;        {is VGA or better?}π cmp bl,$FF; jnz @OK;π@ERR: xor al,al; jmp @EXIT;π@OK: mov al,1;π@EXIT:π end;ππotherwise you can check the BIOS save data area for number of rows onπscreen... the EGA and VGA keep this updated, older adapters don't (theyπset it to 0)ππyou can just leave the screen in the mode it was in already this way.ππvarπ lastRow:byte absolute $40:$84;    {newer bios only:rows on screen-1}ππ * OLX 2.2 * Programming is like sex:  one mistake and you support itππ--- Maximus 2.01wbπ * Origin: >>> Sun Mountain BBS <<< (303)-665-6922 (1:104/123)π                                                                                                      54     08-18-9312:23ALL                      JOSE ALMEIDA             Get the active font      IMPORT              9      Üd   { Get the active font table in buffer #0.π  Part of the Heartware Toolkit v2.00 (HTfont.PAS) for Turbo Pascal.π  Author: Jose Almeida. P.O.Box 4185. 1504 Lisboa Codex. Portugal.π          I can also be reached at RIME network, site ->TIB or #5314.π  Feel completely free to use this source code in any way you want, and, ifπ  you do, please don't forget to mention my name, and, give me and Swag theπ  proper credits. }πππtypeπ  Font_Type  = array[1..4096] of byte;ππPROCEDURE Font_Get(var Fnt : Font_Type);ππ{ DESCRIPTION:π    Get the active font table in buffer #0.π  SAMPLE CALL:π    Font_Get(Font_Table);π  RETURNS:π    The font table.π  NOTES:π    Works in VGA only, and with 8x16 fonts }ππvarπ  Regs : registers;ππBEGIN { Font_Get }π  Regs.AH := $11;π  Regs.AL := $30;π  Regs.BH := 6;                        { VGA: 8 x 16 }π  Intr($10,Regs);π  Move(Mem[Regs.ES:Regs.BP],Fnt,4096);πEND; { Font_Get }π                                                                                                                       55     08-18-9312:25ALL                      JOSE ALMEIDA             Get one Char from Font   IMPORT              9      Üd   { Get one char table from font buffer.π  Part of the Heartware Toolkit v2.00 (HTfont.PAS) for Turbo Pascal.π  Author: Jose Almeida. P.O.Box 4185. 1504 Lisboa Codex. Portugal.π          I can also be reached at RIME network, site ->TIB or #5314.π  Feel completely free to use this source code in any way you want, and, ifπ  you do, please don't forget to mention my name, and, give me and Swag theπ  proper credits. }ππtypeπ  Font_Type  = array[1..4096] of byte;π  Char_Type  = array[1..16] of byte;ππPROCEDURE Font_Get_Char(Fnt : Font_Type;π                      Char_ : byte;π            var Char_Buffer : Char_Type);ππ{ DESCRIPTION:π    Get one char table from font buffer.π  SAMPLE CALL:π    Font_Get_Char(Font_Table,176,Char_Table);π  RETURNS:π    Char_Buffer : Specified char table.π  NOTES:π    Works in VGA only, and with 8x16 fonts }ππvarπ  P : word;ππBEGIN { Font_Get_Char }π  P := Succ(16 * Char_);π  Move(Fnt[P],Char_Buffer,16);πEND; { Font_Get_Char }π                                                             56     08-27-9320:52ALL                      GREG ESTABROOKS          43/50 Line Mode          IMPORT              7      Üd   {π> HELP!!!  I cannot figure out how to throw Borland's Turbo Pascalπ> v4.0 into VGA 50linesx80columns mode!ππYou just have to use the Textmode procedure that is in the CRTπunit. The following is an example of how to use it.π}ππPROGRAM TextMode_Demo;          {  June 14/93, Greg Estabrooks  }πUSESπ  CRT;                          {  TextMode, LastMode           }πVARπ  SavedMode : BYTE;             {  Holds Initial Text mode      }ππBEGINπ  SavedMode := LastMode;        {  Save Current Mode for later  }π  TextMode(Font8x8 + Co80);     {  Set to Color 43/50 line mode }π  Writeln('This is 43/50 line mode!');π  Readln;                       {  Wait for user to have a look }π  TextMode(SavedMode);          {  Restore to original textmode }πEND.π                  57     08-27-9321:51ALL                      SWAG SUPPORT TEAM        VGA Wait for retrace     IMPORT              5      Üd   {π> Does anybody know how to wait for the retrace before drawing a newπ> screen to eliminate flicker?ππHere's the procedure from a PD unit called SuperVGA (by Steve Madsen):ππWaits for a verticle retrace to complete before exiting.  Usefulπfor reducing flicker in video intensive operations, like color cycling.π}ππPROCEDURE WaitRetrace;πbeginπ  while ((Port[$3DA] AND 8) > 0) do;π  while ((Port[$3DA] AND 8) = 0) do;πend;π                                                                                         58     08-27-9322:09ALL                      PETER WOKKE              VGA COLOR Unit           IMPORT              9      Üd   {πPETER WOKKEππ> anyone know a way to set the DAC registers that's faster than int $10?π}ππPROGRAM vga_in_mode_13;ππ{ VGA in Mode $13  320 x 200 and 256 Colors for Turbo Pascal 6.0 }ππUSESπ  Dos, Crt;ππProcedure Plot(x, y : Integer; color : Byte);πBeginπ  Mem[$A000 : word(y * 320 + x)] := color;πEnd;ππProcedure set_rgb(reg, Red, Green, Blue : Byte);πBeginπ  Port[$3C8] := reg;π  Inline($FA);π  Port[$3C9] := Red;π  Port[$3C9] := Green;π  Port[$3C9] := Blue;π  Inline($FB);πEnd;ππVarπ  x, y     : Integer;π  reg      : Registers;π  savemode : Byte;π  n        : Byte;πBeginπ  reg.AX := $0F00;π  Intr($10, reg);π  savemode := reg.al;ππ  reg.AX := $0013;π  Intr($10, reg);ππ  For n := 0 TO 63 Doπ    set_rgb(n, n, 0, 0);π  For n := 63 Downto 0 Doπ    set_rgb(127 - n, n, 0, 0);π  For n := 128 TO 191 Doπ    set_rgb(n, 0, 0, n);ππ  For y := 0 TO 191 Doπ     For x := 0 TO 319 Doπ        Plot(x, y, y);π  Readln;ππ  reg.AX := savemode;π  Intr($10, reg);πEND.π                                                                    59     11-02-9308:10ALL                      ANDREW WOOLFSON          VGA Lines                SWAG9311            39     Üd   {πANDREW WOOLFSONππI recall certain people discussing ways of drawing LINES in Pascal.πUnfortunately I'v lost the thread of those messages - BUT thought I couldπadd my endevours to this same task.πI hope this helps someone.ππ}πProgram VGA_Line_Demo;π(***************************************************************************)π(* Designed, thought out and programmed by Andrew Woolfson {using TP v6.0} *)π(*                                                                         *)π(* Because you have lost all those handy Borland Graphic Functions, I have *)π(* had to redesign the second elementary function in graphics : THE LINE   *)π(* This proved very difficult, and so far this program is a example of the *)π(* best I have managed to do (using vector mathematics).                   *)π(*                                                                         *)π(* This program also shows VGA direct screen addressing in 320x200x256     *)π(* mode.                                                                   *)π(*                                                                         *)π(* I have not documented this program, as I feel it it fairly explanatory. *)π(* If you Do not understand any routine, dont hesitate to ask.             *)π(*            Please share your experiments as I have.                     *)π(***************************************************************************)ππUsesπ  Crt, Graph, DOS;ππVarπ  x, y, Loop : Integer;π  Key        : Char;π  Pixels     : Array [0..199,0..319] OF BYTE ABSOLUTE $A000:0000;π                       { NOTE: Y & X Coord's have been swapped }ππProcedure InitializeVGA;πVarπ  GraphDriver  : Integer;π  GraphMode    : Integer;π  PathtoDriver : String[8];π  Regs         : Registers;πBeginπ  GraphDriver := VGA;π  GraphMode   := VGAHi;π  InitGraph(GraphDriver, GraphMode, 'e:\bp\bgi');ππ  Regs.AX := 19;π  intr($10, Regs);     { Interrupt 16 }πEnd;ππProcedure Plot(X, Y, Color : Integer);πBeginπ  Pixels[Y,X] := Color;πEnd;ππProcedure Line(x1, y1, x2, y2, Color : Integer);πVarπ  Loop,π  tx, ty   : Integer;π  Gradiant : Real;πBeginπ  If ((x1 < x2) AND (y1 < y2)) ORπ     ((x1 = x2) AND (y1 < y2)) ORπ     ((x1 < x2) AND (y1 = y2)) Thenπ  Beginπ    If (ABS(y2 - y1) + 1) / (ABS(x2 - x1) + 1) <= 1 Thenπ    Beginπ      Gradiant := (ABS(y2 - y1) + 1) / (ABS(x2 - x1) + 1);π      For Loop := x1 To (x1 + ABS(x2 - x1)) Doπ        Plot(Loop, (y1 + trunc((Loop - x1) * Gradiant)), Color);π    Endπ    elseπ    Beginπ      Gradiant := (ABS(x2 - x1) + 1) / (ABS(y2 - y1) + 1);π      For Loop := y1 To (y1 + ABS(y2 - y1)) Doπ        Plot((x1 + trunc((Loop - y1) * Gradiant)), Loop, Color);π    End;π  End;ππ  If (x1 > x2) AND (y1 < y2) Thenπ  Beginπ    If (ABS(y2 - y1) + 1) / (ABS(x2 - x1) + 1) <= 1 Thenπ    Beginπ      Gradiant := (ABS(y2 - y1) + 1) / (ABS(x2 - x1) + 1);π      For Loop := x2 To x1 Doπ        Plot(Loop, (y1 + trunc((x1 - Loop) * Gradiant)), Color);π    Endπ    elseπ    Beginπ      Gradiant := (ABS(x2 - x1) + 1) / (ABS(y2 - y1) + 1);π      For Loop := y1 To (y1 + ABS(y2 - y1)) Doπ        Plot((x1 + trunc((y1 - Loop) * Gradiant)), Loop, Color);π    End;π  End;ππ  If ((x1 < x2) AND (y1 > y2)) Thenπ  Beginπ    If (ABS(y2 - y1) + 1) / (ABS(x2 - x1) + 1) <= 1 Thenπ    Beginπ      Gradiant := (ABS(y2 - y1) + 1) / (ABS(x2 - x1) + 1);π      For Loop := x1 To (x1 + ABS(x2 - x1)) Doπ        Plot(Loop, y1 + trunc((x1 - Loop) * Gradiant), color);π    Endπ    elseπ    Beginπ      ty := y1;π      y1 := y2;π      y2 := ty;π      Gradiant := (ABS(x2 - x1) + 1) / (ABS(y2 - y1) + 1);π      For Loop := y1 To (y1 + ABS(y2 - y1)) Doπ        Plot(x2 + trunc((y1 - Loop) * Gradiant), Loop, color);π    End;π  End;ππ  If ((x1 > x2) AND (y1 > y2)) ORπ     ((x1 = x2) AND (y1 > y2)) ORπ     ((x1 > x2) AND (y1 = y2)) Thenπ  Beginπ    tx := x1;π    ty := y1;π    x1 := x2;π    y1 := y2;π    x2 := tx;π    y2 := ty;π    If (ABS(y2 - y1) + 1) / (ABS(x2 - x1) + 1) <= 1 Thenπ    Beginπ      Gradiant := (ABS(y2 - y1) + 1) / (ABS(x2 - x1) + 1);π      For Loop := x1 To (x1 + ABS(x2 - x1)) Doπ        Plot(Loop, y1 + trunc((Loop - x1) * Gradiant), color);π    Endπ    elseπ    Beginπ      Gradiant := (ABS(x2 - x1) + 1) / (ABS(y2 - y1) + 1);π      For Loop := y1 To (y1 + ABS(y2 - y1)) Doπ        Plot(x1 + trunc((Loop - y1) * Gradiant), Loop, color);π    End;π  End;ππEnd;ππBeginπ  InitializeVGA;ππ  SetRGBPalette(1,63, 0, 0);   { RED    }π  SetRGBPalette(2, 0,63, 0);   { GREEN  }π  SetRGBPalette(3, 0, 0,63);   { BLUE   }π  SetRGBPalette(4,63,63,63);   { WHITE  }ππ  For x := 50 To 250 Doπ    Line(150, 100, x, 50, 1);π  For y := 50 To 150 Doπ    Line(150, 100, 250, y, 2);π  For x := 250 Downto 50 Doπ    Line(150, 100, x, 150, 3);π  For y := 150 Downto 50 Doπ    Line(150, 100, 50, y, 4);ππ  Readln;πEnd.π                                                                                 60     11-21-9309:25ALL                      BERNIE PALLEK            BitMap Scaler            SWAG9311            18     Üd   πTYPEπ  Fixed = RECORD CASE Boolean OFπ    True  : (w : LongInt); False : (f, i : Word);π  END;ππ{ originally by SEAN PALMER, I just mangled it  :^) }πPROCEDURE ScaleBitmap(VAR bmp2scale; actualx, actualy : Byte;π                      bstrtx, bstrty, bendx, bendy : Word);π{ These are notes I added, so they might be wrong.  :^)     }π{ - bmp2scale is an array [0..actualx, 0..actualy] of byte  }π{   which contains the original bitmap                      }π{ - actualx and actualy are the actual width and height of  }π{   the normal bitmap                                       }π{ - bstrtx and bstrty are the x and y values for the upper- }π{   left-hand corner of the scaled bitmap                   }π{ - bendx and bendy are the lower-right-hand corner of the  }π{   scaled version of the original bitmap                   }π{ - eg. to paste an unscaled version of a bitmap that is    }π{   64x64 pixels in size in the top left-hand corner of the }π{   screen, fill the array with data and call:              }π{     ScaleBitmap(bitmap, 64, 64, 0, 0, 63, 63);            }π{ - apparently, the bitmap is read starting at (0,0) and    }π{   then going to (0,1), then (0,2), etc; meaning that it's }π{   not read horizontally, but vertically                   }πVARπ   bmp_sx, bmp_sy, bmp_cy : Fixed;π   bmp_s, bmp_w, bmp_h    : Word;πBEGINπ     bmp_w := bendx - bstrtx + 1; bmp_h := bendy - bstrty + 1;π     bmp_sx.w := actualx * $10000 DIV bmp_w;π     bmp_sy.w := actualy * $10000 DIV bmp_h;π     bmp_s := 320 - bmp_w; bmp_cy.w := 0;π     ASMπ        PUSH DSπ        MOV DS,WORD PTR bmp2scale + 2π        MOV AX,$A000; MOV ES,AX; CLD; MOV AX,320;π        MUL bstrty; ADD ax,bstrtx; MOV DI,AX;π       @L2:π        MOV AX,bmp_cy.i; MUL actualx; MOV BX,AX;π        ADD BX,WORD PTR bmp2scale;π        MOV CX,bmp_w; MOV SI,0; MOV DX,bmp_sx.f;π       @L:π        MOV AL,[BX]; STOSB; ADD SI,DX; ADC BX,bmp_sx.i;π        LOOP @Lπ        ADD DI,bmp_s; MOV AX,bmp_sy.f; MOV bx,bmp_sy.i;π        ADD bmp_cy.f,AX; ADC bmp_cy.i,BX;π        DEC WORD PTR bmp_h; JNZ @L2; POP DS;π     END;πEND;ππ                                                                                           61     11-02-9310:25ALL                      JAMES SAITO              Using ALL the memory     SWAG9311            19     Üd   {πJAMES SAITOππ> I wonder if I can allocate With GetMem more than 64K, though. You see, I'mπ> interested in creating games With my own code, and the most important partπ> of games is Graphics. You don't want to play some dumb monochrome Textπ> adventure With a little man (@). :) Do you have any tips For outputting aπ> screen of information such as a part of a dungeon? I'd sorta like to keepπ> the Character centered like in Nintendo games.ππWell.  if you want to make a 320x200x256 game, I know the right stuff.  if youπwould like to make the Character centered, and when you pressπup/down/left/right, the whole screen scrolls.  Here is an example on a playingπfield that is umm.  Let's say 1000x200 (200K).π}πVarπ  Field  : Array [0..199] of Pointer;  {The Field}π  P      : Pointer;  {I'll tell you what happens With this}π  Count,π  Count2 : Integer;ππbeginπ  {Init The Graphics}π  Asmπ    MOV AH,00H  {AH = 0}π    MOV AL,13H  {AL = 13H,which is the Graphics mode 320x200x256}π    INT 10H     {Call the Graphics bios services}π  end;ππ  if Mem[$40:$49] <> $13 Thenπ  beginπ    WriteLn('VGA Graphics Required For this game');π    Halt(1);π  end;ππ  For Count := 0 to 199 doπ  beginπ    getmem(field[count],1000);   {Find a chunk of memory For the field}π    For count2 := 0 to 999 doπ      mem[seg(field[count]^) : ofs(field[count]^)] := random(256);π      {Create a random field}π  end;π  getmem(p, 64000);π  For Count2 := 0 to 679 doπ  beginπ    For count := 0 to 199 doπ      Move(mem[seg(field[count]^) : ofs(field[count]^) + Count2],π           mem[seg(p^) : ofs(p^) + count * 320], 320);π    {Now do put your player on, supposing it's a white block}π    For count := 90 to 110 doπ      FillChar(mem[seg(p^) : ofs(p^) + count * 320 + 150], 20, 15);π    move (p^, mem[$A000 : 0], 64000);π    {Now copy that workspace into the video memory}π  end;ππ  {Now time to close the Graphics}π  Asmπ    MOV AH,$00;π    MOV AL,$03;π    INT 10Hπ  end;ππ  {Free all blocks}π  For Count := 0 to 199 doπ    freemem(field[count], 320);π  freemem(p, 64000);πend.π{π  Well.  That's it.  It actually took me 20 minutes to Type this whole thingπright in the message base.  I guess there's a bit of errors.  - James Saitoπ}π                                                                                            62     11-02-9312:14ALL                      JOHN BECK                Set the VGA Palette      SWAG9311            12     Üd   {πJOHN BECKππ> question me is that when I'm using the BIOS block paletteπ> to create a fade in/out, it makes the screen flicker, whichπ> is quite disturbing.  What Info I need is how the VGA portπ> works on setting up the RGB palette.  Thanks.π}ππTypeπ  colorType  = Recordπ    rvalue,π    gvalue,π    bvalue : Byte;π  end;ππ  paletteType = Array [0..255] of colorType;ππProcedure setpal(Var tp : paletteType);πVarπ  palseg,π  palofs : Word;ππLabel wait1 {,wait2};ππbeginπ  palseg := seg(tp);π  palofs := ofs(tp);π  Asmπ    mov  dx, $3DAππ   wait1:π    in   al, dxπ    test al, $08π    jz   wait1ππ { wait2:π    in   al,dxπ    test al,$08π    jnz  wait2 }ππ    mov ax, 1012hπ    xor bx, bxπ    mov cx, 256π    mov es, palsegπ    mov dx, palofsπ    int 10hπ  end;πend;ππProcedure readpal(Var tp : paletteType);πVarπ  palseg,π  palofs : Word;πbeginπ  palseg := seg(tp);π  palofs := ofs(tp);π  Asmπ    mov ax, 1017hπ    xor bx, bxπ    mov cx, 256π    mov es, palsegπ    mov dx, palofsπ    int 10hπ  end;πend;ππ{π   I cheat a little bit in the way that the screen flickering is handled,πbut I find that this way is faster For many animations+palette manipulations /πsecond While still eliminating screen flickering.  Normally there would beπtwo tests for retrace, a 'jz' and a 'jnz', instead this only performs theπ'jz' test. if your monitor still flickers, uncomment the other code.π}π                          63     11-02-9310:35ALL                      KAI ROHRBACHER           VGA Text Mode Demo       SWAG9311            77     Üd   {πKAI ROHRBACHERππ>> VGA Text mode (which is just an all-points-not-addressable mode,π>> whereas the Graphics modes we're all familiar With are called all-π>> points-addressable. The point is that whether all the points areπ>> addressable or not is irrevelant, but rather the "points" areπ>> there period.)ππNo.  The  width  of  a  normal  256  color  Graphics mode counts twiceπcompared  to the pixel frequency of a 16 color mode (Text or Graphic):πa  320  pixel  resolution in 256 colors needs the same clock rate as aπ640 pixel resolution in 16 color mode.ππ>> Anyway, the VGA Text mode consists of 80 Characters wideπ>> each which are 9 points wide. Do you see where I'm going...the VGAπ>> ISSSSS capable of 720 pixels wide.π> I wouldn't doubt it since we've seen 640x480x16 on a regular VGA.π> 720 isn't far from 640.ππThat's  why  it  is  so  easy  to  trick  the  VGA into 360x400x256 orπ360x480x256 modes: 80 Text columns * 9 pixels = 720 pixels. 720/2=360.πHere's  a  small Program, demonstrating some Graphics mode; it's takenπfrom a German computer magazine, I just ported it from "C" to TP.πNote  that  For  the  same reason, I doubt that the claimed resolutionπ640x400x256  will  run  on  a  standard  VGA:  it  would require a dotπfrequency of 1280 pixels in a 16 color mode!π}ππProgram vgademo;ππUsesπ  Dos, Crt;ππConstπ  maxPar = 23;ππTypeπ  parameter = Array [0..maxPar] of Byte;ππConstπ CrtRegVal320x240 : parameter { Static }  =π   (95,79,80,130,84,128,13,62,0,65,0,0,0,0,0,0,234,172,223,40,0,231,6,227);π CrtRegVal320x400 : parameter { Static }  =π   (95,79,80,130,84,128,191,31,0,64,0,0,0,0,0,0,156,142,143,40,0,150,185,227);π CrtRegVal360x480 : parameter { Static }  =π   (107,89,90,142,94,138,13,62,0,64,0,0,0,0,0,0,234,172,223,45,0,231,6,227);π CrtRegVal640x400 : parameter { Static }  =π   (95,79,80,130,84,128,191,31,0,64,0,0,0,0,0,0,156,142,143,40,0,150,185,163);ππ actualMode :Byte = 0;ππ R640x400 = 4;π R360x480 = 3;π R320x400 = 2;π R320x240 = 1;    { die moeglichen Aufloesungen }πππVarπ  ch       : Char;π  VideoRam,π  zb4,           {ein 1/4 der Bytes je Grafikzeile}π  max_X,π  max_Y    : Word;π  regs     : Registers;ππFunction ReadMode : Byte;πbeginπ  regs.ah := $f;π  intr($10, regs);π  ReadMode := regs.al;πend;πππProcedure OldMode(OldMod : Byte);πbeginπ  regs.ah := 0;π  regs.al := OldMod;π  intr($10, regs);πend;πππProcedure Mode(Resolution : Word);πVarπ  Read_1,π  RegNumber : Word;πbeginπ regs.ax := $0012;π intr($10, regs);π regs.ax := $0013;π intr($10, regs);π portw[$3c4] := $0604;π port[$3d4]  := $11;π Read_1      := port[$03d5] And $7f;π port[$03d5] := Read_1;ππ Case Resolution Ofπ   R320x240 :π   beginπ     actualMode   := R320x240;π     portw[$03c4] := $0100;π     port[$03c2]  := $e3;π     portw[$03c4] := $0300;π     For RegNumber := 0 to maxPar DOπ       portw[$03d4] := CrtRegVal320x240[RegNumber] SHL 8 + RegNumber;π     zb4   := 80;π     max_X := 319;π     max_Y := 239;π   end;ππ   R320x400 :π   beginπ     actualMode := R320x400;π     For RegNumber := 0 to maxPar DOπ       portw[$03d4] := CrtRegVal320x400[RegNumber] SHL 8 + RegNumber;π     zb4   := 80;π     max_X := 319;π     max_Y := 399;π   end;ππ   R360x480 :π   beginπ     actualMode := R360x480;π     portw[$03c4] := $0100;π     port[$03c2]  := $e7;π     portw[$03c4] := $0300;π     For RegNumber := 0 to maxPar DOπ       portw[$03d4] := CrtRegVal360x480[RegNumber] SHL 8 + RegNumber;π     zb4   := 90;π     max_X := 359;π     max_Y := 479;π   end;ππ   R640x400 :π   beginπ     actualMode   := R640x400;π     {hier!}π     portw[$03c4] := $0100;π     port[$03c2]  := $e7;π     portw[$03c4] := $0300;π     For RegNumber := 0 to maxPar DOπ       portw[$03d4] := CrtRegVal640x400[RegNumber] SHL 8 + RegNumber;π     zb4   := 160;π     max_X := 639;π     max_Y := 399;π   endπ end;ππ VideoRam := $a000;πend;πππProcedure Paint(Resolution, Side : Word);πbeginπ  Case Resolution Ofπ    R320x240 : Case Side Ofπ                 1  : VideoRam := $a000;π                 2  : VideoRam := $a4b0;π                 3  : VideoRam := $a960;π                 else VideoRam := $a000;π               end;π    R320x400 : Case Side Ofπ                 1  : VideoRam := $a000;π                 2  : VideoRam := $a800;π                 else VideoRam := $a000;π               end;π    R360x480,π    R640x400 : VideoRam := $a000;π    elseπ      VideoRam := $a000;π  end;πend;πππProcedure Show(Resolution, Side : Word);πVarπ  Start : Word;πbeginπ  Case Resolution Ofπ    R320x240 :π    Case Side Ofπ      1 : Start := 0;π      2 : Start := $4b;π      3 : Start := $96;π      else { Default } Start := 0;π    end;ππ    R320x400:π    Case Side Ofπ      1 : Start := 0;π      2 : Start := $80;π      else { Default } Start := 0;π    end;ππ    R360x480,π    R640x400 : Start := 0;ππ    else { Default } Start := 0;π  end;π  portw[$03d4] := Start SHL 8 + $0c;πend;πππProcedure SetPoint(x, y, Color : Word);πVarπ  Offset : Word;πbeginπ{ if actualMode=R640x400π  then Offset:=(y*zb4)+ (x shr 1 and $FE)π  else}π  Offset := (y * zb4) + (x Shr 2);π  portw[$03c4] := (1 Shl ((x And 3) + 8)) + 2;π  mem[VideoRam : Offset] := Color;πend;πππFunction GetPoint(x, y : Word) : Word;πVarπ  Offset : Word;πbeginπ{ if actualMode=R640x400π  then Offset:=(y*zb4)+ (x shr 1 and $FE)π  else}π  Offset := (y * zb4) + (x Shr 2);π  portw[$03ce] := (x And 3) SHL 8 + 4;π  GetPoint := mem[VideoRam : Offset];πend;ππ{ Demo-HauptProgramm }ππProcedure main;πVarπ  x,π  y,π  c,π  OldMod : Word;ππbeginπ  OldMod := ReadMode; { speichert alten Videomodus in Oldmod }π  Writeln('VGASTAR');π  Writeln('320x240 (3 Seiten), 320x400 (2 Seiten ) 360x480 oder');π  Writeln('640x400 Pixel in 256 Farben auf Standard-VGA mit 256K');π  Writeln('1991 Ingo Spitczok von Brisinski, c''t 12/91');π  Writeln(' Modus 1: 320 x 240 Pixel mit 3 Seiten');π  Write('Bitte Return-Taste druecken');π  ch := ReadKey;π  Mode(R320x240);π  Show(R320x240, 1);π  Paint(R320x240, 1);π  x := 0;π  While (x <= max_X) Doπ  beginπ    y := 0;π    While (y <= max_Y) Doπ    beginπ      { male in 256 Farben }π      SetPoint(x, y, ((x + y) And 255));π      y := Succ(y)π    end;π    x := Succ(x)π  end;ππ  Show(R320x240, 2);π  Paint(R320x240, 2);π  x := 100;π  While (x < 201) Doπ  beginπ    y := 100;π    While (y < 201) Doπ    beginπ      { Quadrat 100x100 Pixel }π      SetPoint(x, y, ((x + y) And 255));π      y := Succ(y)π    end;π    x := Succ(x)π  end;ππ  Paint(R320x240, 3);π  c := 0;π  While (c <= max_Y) Doπ  beginπ    SetPoint(c, c, 10);π    c := Succ(c)π  end;ππ  ch := ReadKey;π  Show(R320x240, 3);π  ch := ReadKey;π  Show(R320x240, 1);π  ch := ReadKey;π  OldMode(OldMod);π  Writeln(' Modus 2: 320 x 400 Pixel, 2 Seiten');π  ch := ReadKey;π  Mode(R320x400);π  Show(R320x400, 1);π  Paint(R320x400, 1);π  x := 0;ππ  While (x <= max_X) Doπ  beginπ    y := 0;π    While (y < 200) Doπ    beginπ      SetPoint(x, y, ((x + y) And 255));π      y := Succ(y)π    end;π    x := Succ(x)π  end;ππ  x := 0;π  While (x < 320) Doπ  beginπ    y := 200;π    While (y < 400) Doπ    beginπ      SetPoint(x, y, 22);π      y := Succ(y)π    end;π    x := Succ(x)π  end;ππ  Paint(R320x400, 2);π  x := 80;π  While (x < 220) Doπ  beginπ    y := 0;π    While (y <= max_Y) Doπ    beginπ      SetPoint(x, y, ((x + y) And 255));π      y := Succ(y)π    end;π    x := Succ(x)π  end;ππ  ch := ReadKey;π  Show(R320x400, 2);π  ch := ReadKey;π  Show(R320x400, 3);π  Paint(R320x400, 1);π  x := 100;ππ  While (x < 200) Doπ  beginπ    y := 0;π    While (y < 50) Doπ    beginπ      c := GetPoint(x, y);π      { Lies die Farbe }π      SetPoint(x, y + 250, c);π      { Male die gelesene Farbe } ;π      y := Succ(y)π    end;π    x := Succ(x)π  end { For };ππ  ch := ReadKey;π  OldMode(OldMod);π  Writeln(' Modus 3: 360 x 400 Pixel, 1 Seite');π  ch := ReadKey;π  Mode(R360x480);π  x := 0;ππ  While (x < 320) Doπ  beginπ    y := 0;π    While (y < 200) Doπ    beginπ      SetPoint(x, y, (x And 255));π      y := Succ(y)π    end;π    x := Succ(x)π  end;ππ  x := 0;π  While (x <= max_X) Doπ  beginπ    y := 200;π    While (y <= max_Y) Doπ    beginπ      SetPoint(x, y, y And 255);π      y := Succ(y)π    end;π    x := Succ(x)π  end;ππ  x := 320;π  While (x <= max_X) Doπ  beginπ    y := 0;π    While (y  <=  max_Y) Doπ    beginπ      SetPoint(x, y, 25);π      y  :=  Succ(y)π    end;π    x  :=  Succ(x)π  end;ππ  x  :=  0;π  While (x <= max_X) Doπ  beginπ    y := 400;π    While (y <= max_Y) Doπ    beginπ      SetPoint(x, y, 26);π      y := Succ(y)π    end;π    x := Succ(x)π  end;ππ  ch := ReadKey;π  OldMode(OldMod);π  Writeln(' Modus 4: 640 x 400 Pixel, 1 Seite');π  ch := ReadKey;π  Mode(R640x400);π  x := 0;ππ  While (x <= max_X) Doπ  beginπ    y := 0;π    While (y <= max_Y) Doπ    beginπ      { male in 256 Farben };π      SetPoint(x, y, ((x+y) And 255));π      y := Succ(y)π    end;π    x := Succ(x)π  end;ππ  x := 0;π  While (x < 400) Doπ  beginπ    y := x;π    While (y < 400) Doπ    beginπ      c := GetPoint(x, y);π      SetPoint(x, y, 255-c);π      { aendere Farbe};π      y := Succ(y)π    end;π    x := Succ(x)π  end;π  ch := ReadKey;π  OldMode(OldMod);πend;ππProcedure SetPix(x, y, Color : Word);πVarπ  Offset : Word;πbeginπ  if actualMode = R640x400 thenπ    Offset := (y * zb4) + (x shr 1 and $FE)π  elseπ    Offset := (y * zb4) + (x Shr 2);π  portw[$03c4] := (1 Shl ((x And 3) + 8)) + 2;π  mem[VideoRam : Offset] := Color;πend;πππFunction GetPix(x, y : Word) : Word;πVarπ  Offset : Word;πbeginπ{ if actualMode=R640x400π  then Offset := (y*zb4)+ (x shr 1 and $FE)π  else}π  Offset := (y * zb4) + (x Shr 2);π  portw[$03ce] := (x And 3) SHL 8 + 4;π  GetPix := mem[VideoRam : Offset];πend;ππbeginπ  main;πend.π                                                                                                                      64     11-02-9310:35ALL                      MARC BIR                 Setting Video Mode       SWAG9311            14     Üd   {πMARC BIRππ>My second problem is the video memory.  From my technicalπ>reference manual, it tells me that the address starts at segment A000H,π>offset 0000H.  I've been Programming the VGA 320x200x256 mode quite alot,π>but in the EGA address, whenever I Write to video memory, all I see isπ>black and white, like monochrome.  if I will be happy if I get informationπ>about that.  Another thing that actually question me is that when I'mπ>using the BIOS block palette to create a fade in/out, it makes the screenπ>flicker, which is quite disturbing.  What Info I need is how the VGA portπJS>works on setting up the RGB palette.  Thanks.ππHow do you init. the mode?  Call int 10h With 13h?  if so then usingπA000:0000 is correct.  As far as fading, use the following.π}ππTypeπ PalType = Array [0..255, 0..2] of Byte;ππProcedure SetPalette(Color, Count : Byte; Palette : PalType);πVarπ  Ct, Col : Byte;πbeginπ  Port[$3C8] := Color;     { First color to set, Change this to $3C7 toπ                             read.  And switch the Port=Pal at bottom }π  For Ct := 1 to Count Do  { Count is the total number of DACs to set }π  For Col := 0 to 2 Do     { Sets the Red, Green and Blue }π    Port[$3C9] :=  Palette[Ct, Col];πend;ππProcedure SetMode(Mode : Byte); Assembler;πAsmπ  Mov AH, 0π  Mov AL, Modeπ  Int 10hπend;ππ{You can test your mode set With this }πProcedure TestScreen;πVarπ  X, Y : Integer;πbeginπ For X := 0 to 319 Doπ   For Y := 0 to 199 Doπ     Mem[$A000 : Y * 320 + X] := (X * Y) Mod 256;πend;ππbeginπ  SetMode($13);π  TestScreen;πend.π                                                                                                                   65     09-26-9308:44ALL                      MIGUEL MARTINEZ          80x30 Text Mode ProcedureSWAG9311            16     Üd   (*πFrom: MIGUEL MARTINEZ              Refer#: NONEπSubj: 80x30 Text-Mode Procedure      Conf: (1617) L-Pascalπ---------------------------------------------------------------------------πHello to everyone!. A friend of mine who enjoys Assembler, has developed aπroutine, to provide "another" video mode to all those who develop text-basedπprograms.ππIt's a routine to set a 80x30 text mode, using the 16x8 font of the VGA.πI think is a better mode to work, than the standard 80x25 mode: Moreπinformation on screen, without loosing the pretty 16x8 chars.ππI have translated this routine to Pascal, and here is the result. It willπwork on any standard VGA card.π*)ππ{Procedure to set 80 columns per 30 rows video mode}π{Orignial Author: Ignacio García Pérez}πProcedure Set80x30Mode;πVar CrtcReg:Array[1..8] of Word;π    Offset:Word;π    i,Data:Byte;πBeginπ  CrtcReg[1]:=$0c11;           {Vertical Display End (unprotect regs. 0-7)}π  CrtcReg[2]:=$0d06;           {Vertical Total}π  CrtcReg[3]:=$3e07;           {Overflow}π  CrtcReg[4]:=$ea10;           {Vertical Retrace Start}π  CrtcReg[5]:=$8c11;           {Vertical Retrace End (& protect regs. 0-7)}π  CrtcReg[6]:=$df12;           {Vertical Display Enable End}π  CrtcReg[7]:=$e715;           {Start Vertical Blanking}π  CrtcReg[8]:=$0616;           {End Vertical Blanking}ππ  MemW[$0040:$004c]:=8192;     {Change page size in bytes}π  Mem[$0040:$0084]:=29;        {Change page length}π  Offset:=MemW[$0040:$0063];   {Base of CRTRC}π  Asmπ    cli                        {Clear Interrupts}π  End;ππ  For i:=1 to 8 doπ    PortW[Offset]:=CrtcReg[i]; {Load Registers}ππ  Data:=Port[$03cc];π  Data:=Data And $33;π  Data:=Data Or $C4;π  Port[$03c2]:=Data;π  Asmπ   sti                         {Set Interrupts}π   mov ah,12h                  {Select alternate printing routine}π   mov bl,20hπ   int 10hπ  End;πEnd; {Of Procedure}ππBEGINπSet80X30Mode;πEND.ππ                    66     11-02-9304:44ALL                      SEAN PALMER              50 Line mode             SWAG9311            5      Üd   {πSEAN PALMERππ> Yeah, I almost think I learned assembly just to reProgram the Crtπ> Unit! (except I can't seem to find out how to get to 50-line mode Withπ> assembly)π}ππProcedure set50LineMode; Assembler;πAsmπ  mov ax, $1202π  mov bl, $30π  int $10     {set 400 scan lines}π  mov ax, 3π  int $10     {set Text mode}π  mov ax, $1112π  mov bl, 0π  int $10     {load 8x8 font to page 0 block}πend;ππ                                                                                                                  67     11-26-9317:39ALL                      SWAG SUPPORT GROUP       Wait for RETRACE         SWAG9311            4      Üd     {π  *  PROCEDURE WaitRetraceπ  *π  *  Waits for a verticle retrace to complete before exiting.  Usefulπ  *  for reducing flicker in video intensive operations, like colorπ  *  cycling.π  }π πPROCEDURE WaitRetrace;π beginπ   while ((Port[$3DA] AND 8) > 0) do;π   while ((Port[$3DA] AND 8) = 0) do;π end;π                                                                               68     11-02-9310:32ALL                      SWAG SUPPORT TEAM        PLASMA Fractal           SWAG9311            30     Üd   {π>Do you have Pascal code For generating this PLAsmA fractal? if so,π>then I'd like to snarf a copy of it, if'n you don't mind... Or (if it'sπ>not too large) could you post it as a message? Thanx in advance!π}ππProgram PlAsma;ππUsesπ  Crt, Dos;ππConstπ  f = 2.0;π  EndProgram  : Boolean = False;π  DelayFactor : Byte    = 20;ππTypeπ  ColorValue  = Recordπ    Rvalue,π    Gvalue,π    Bvalue : Byte;π  end;ππ  PaletteType = Array [0..255] of ColorValue;ππVarπ  ch    : Char;π  i     : Integer;π  image : File;π  ok    : Boolean;π  p     : paletteType;ππProcedure SetVGApalette(Var tp : PaletteType);πVarπ  regs : Registers;πbeginπ  With regs doπ  beginπ    AX := $1012;π    BX := 0;π    CX := 256;π    ES := Seg(tp);π    DX := Ofs(tp);π  end;π  Intr($10, regs);πend;ππProcedure PutPixel(x, y : Integer; c : Byte);πbeginπ  mem[$a000 : Word(320 * y + x)] := c;πend;ππFunction GetPixel(x, y : Integer) : Byte;πbeginπ  GetPixel := mem[$a000 : Word(320 * y + x)];πend;ππProcedure adjust(xa, ya, x, y, xb, yb : Integer);πVarπ  d, v : Integer;πbeginπ  if GetPixel(x, y) <> 0 thenπ    Exit;π  d := abs(xa - xb) + abs(ya - yb);π  v := trunc((GetPixel(xa, ya) + GetPixel(xb, yb)) / 2 +π       (random - 0.5) * d * F);π  if v < 1 thenπ    v := 1;π  if v >= 193 thenπ    v := 192;π  putpixel(x, y, v);πend;ππProcedure subDivide(x1, y1, x2, y2 : Integer);πVarπ  x, y : Integer;π  v    : Real;πbeginπ  if KeyPressed thenπ    Exit;π  if (x2 - x1 < 2) and (y2 - y1 < 2) thenπ    Exit;π  x := (x1 + x2) div 2;π  y := (y1 + y2) div 2;π  adjust(x1, y1, x, y1, x2, y1);π  adjust(x2, y1, x2, y, x2, y2);π  adjust(x1, y2, x, y2, x2, y2);π  adjust(x1, y1, x1, y, x1, y2);π  if GetPixel(x, y) = 0 thenπ  beginπ    v := (GetPixel(x1, y1) + GetPixel(x2, y1) + GetPixel(x2, y2) +π          getPixel(x1, y2)) / 4;π    putpixel(x, y, Trunc(v));π  end;ππ  SubDivide(x1, y1, x, y);π  subDivide(x, y1, x2, y);π  subDivide(x, y, x2, y2);π  subDivide(x1, y, x, y2);πend;ππProcedure rotatePalette(Var p : PaletteType; n1, n2, d : Integer);πVarπ  q : PaletteType;πbeginπ  q := p;π  For i := n1 to n2 doπ    p[i] :=q[n1 + (i + d) mod (n2 - n1 + 1)];π  SetVGApalette(p);πend;ππbeginπ  Inline($b8/$13/0/$cd/$10);π  With P[0] doπ  beginπ    Rvalue := 32;π    Gvalue := 32;π    Bvalue := 32;π  end;π  For i := 0 to 63 doπ  beginπ    With p[i + 1] doπ    beginπ      Rvalue := 63-i; { 63 - i }π      Gvalue := 63-i; { 63 - i }π      Bvalue := i+63;    { 0 }π    end;π    With p[i + 65] doπ    beginπ      Rvalue := 0;    { 0 }π      Gvalue := i+63;    { i }π      Bvalue := 63-i;    { 0 }π    end;π    With p[i + 129] doπ    beginπ      Rvalue := i;    { 0 }π      Gvalue := i;    { 0 }π      Bvalue := 63 - i; { 63 - i }π    end;π  end;π  Inline($b8/$13/0/$cd/$10);ππ  SetVGApalette(p);π  Assign(image, 'PLASMA.IMG');π  {$i-}π  Reset(image, 1);π  {$I+}π  ok := (ioResult = 0);π  if not ok or (ParamCount <> 0) thenπ  beginπ    Randomize;π    putpixel(0, 0, 1 + Random(192));π    putpixel(319, 0, 1 + Random(192));π    putpixel(319, 199, 1 + Random(192));π    putpixel(0, 199, 1 + Random(192));π    SubDivide(0, 0, 319, 199);π    ReWrite(image, 1);π    BlockWrite(image, mem[$a000:0], $FA00);π  endπ  elseπ    BlockRead(image, mem[$a000:0], $FA00);ππ  Close(image);π  Repeatπ    rotatePalette(p, 1, 192, + 1);π    Delay(DelayFactor);π    If KeyPressed thenπ    Case ReadKey ofπ      #0 : Case ReadKey ofπ             #80 : If DelayFactor < 255 thenπ                     Inc(DelayFactor);π             #72 : If DelayFactor > 0 thenπ                     Dec(DelayFactor);π           end;π      #113,#81 {Q,q} : EndProgram := True;π    end;π  Until EndProgram;ππ  TextMode(lastmode);πend.π                                                                     69     11-26-9317:48ALL                      SWAG SUPPORT TEAM        VESA Video Support       SWAG9311            67     Üd   Unit VESA;ππInterfaceππType ModeList=Array[1..32] Of Word;  { List of VESA mode numbers }ππ     TVesaMode=Recordπ       Attr     : Word;         { Mode Attributes                   }π       WinA     : Byte;         { Window A attributes               }π       WinB     : Byte;         { Window B attributes               }π       Gran     : Word;         { Window granularity in K bytes     }π       WinSiz   : Word;         { Size of window in K bytes         }π       SegA     : Word;         { Segment address of window A       }π       SegB     : Word;         { Segment address of window B       }π       WinFunc  : Procedure;    { Windows positioning function      }π       Bytes    : Word;         { Number of bytes per line          }π       Width    : Word;         { Number of horizontal pixels       }π       Height   : Word;         { Number of vertical pixels         }π       CharW    : Byte;         { Width of character cell           }π       CharH    : Byte;         { Height of character cell          }π       Planes   : Byte;         { Number of memory planes           }π       Bits     : Byte;         { Number of bits per pixel          }π       nBanks   : Byte;         { Number of banks        (not used) }π       Model    : Byte;         { Memory model type                 }π       Banks    : Byte;         { Size of bank           (not used) }π       Pages    : Byte;         { Number of image pages             }π       Reserved : Byte; { The following are for 15,16,24,32 bit colour modes }π       RedMaskSize   : Byte;    { Size of Red mask in bits          }π       RedFieldPos   : Byte;    { Bit position of LSB of Red mask   }π       GreenMaskSize : Byte;    { Size of Green mask in bits        }π       GreenFieldPos : Byte;    { Bit position of LSB of Green mask }π       BlueMaskSize  : Byte;    { Size of Blue mask in bits         }π       BlueFieldPos  : Byte;    { Bit position of LSB of Blue mask  }π       RsvdMaskSize  : Byte;    { Size of Reserved mask in bits     }π       RsvdFieldPos  : Byte;    { Bit pos. of LSB of Reserved mask  }π       DirColModeInf : Byte;    { Direct Colour mode attributes     }π       Filler   : Array[0..215] Of Byte; { Not used - filler        }π     End;ππ     TVesaInfo=Recordπ       Signature    : LongInt;   { Signature - "VESA"               }π       Version      : Word;      { VESA Version number              }π       OEMName      : PChar;     { Pointer to manufacturer name     }π       Capabilities : Longint;   { Capabilities       (Not used)    }π       List         : ^ModeList; { Pointer to list of VESA modes    }π       TotalMemory  : Word;      { Number of 64k memory blocks on card }π       Filler       : Array[1..238] of Byte;π     End; { 258 byte size due to bug in the Diamond SpeedStar 24X v1.01 BIOS }πππVar  VesaMode : TVesaMode;π                { Contains all info needed for drawing on the screen }π     VesaInfo : TVesaInfo;π                { Contains info on the VESA BIOS Extensions }ππ     vesaon   : Byte;π                { Specifies whether a VESA mode is on or not      }ππFunction  IsVesa:Boolean;π          { Detects whether VESA support is present }πProcedure GetVesaInfo;π          { Get Information on VESA modes, etc }πProcedure GetVesaModeInfo(md:Word);π          { Get Information on a VESA mode (md) }πFunction  SetMode(md:Word):Boolean;π          { Sets a video mode (OEM and VESA) }πFunction  GetMode:Word;π          { Returns the current video mode }πFunction  SizeOfVideoState:Word;π          { Returns the size of the buffer needed to save the video state }πProcedure SaveVideoState(Var buf);π          { Saves the SVGA video state in the buffer }πProcedure RestoreVideoState(Var buf);π          { Restores the SVGA video state from the buffer}πProcedure SetBank(bank:Word);π          { Set the video bank to draw on }πFunction  GetBank:Word;π          { Gets the current active video bank }πProcedure SetLineLength(Var len:Word);π          { Sets the logical scan line length, returns the actual length set }πFunction  GetLineLength:Word;π          { Returns the current logical scan line length }πProcedure SetDisplayStart(pixel,line:Word);π          { Sets the first pixel and line on the display }πProcedure GetDisplayStart(Var pixel,line:Word);π          { Returns the first pixel and line on the display }ππ{---------------------------------------------------------------------------}π{-----------------------------} Implementation {----------------------------}π{---------------------------------------------------------------------------}ππUses Dos;ππVar  rp : Registers;ππFunction IsVesa:Boolean;πBeginπ  rp.ax:=$4F03;π  Intr($10,rp);π  IsVesa:=(rp.al=$4F);πEnd;ππProcedure GetVesaInfo;πBeginπ  rp.ax:=$4F00;π  rp.di:=Ofs(VesaInfo);π  rp.es:=Seg(VesaInfo);π  Intr($10,rp);πEnd;ππProcedure GetVesaModeInfo(md:Word);πBeginπ  rp.ax:=$4F01;π  rp.cx:=md;π  rp.di:=Ofs(VesaMode);π  rp.es:=Seg(VesaMode);π  Intr($10,rp);πEnd;ππFunction SetMode(md:Word):Boolean;πBeginπ  SetMode:=True; vesaon:=1;π  If md>$FF Then Beginπ    rp.bx:=md;π    rp.ax:=$4F02;π    Intr($10,rp);π    If rp.ax<>$4F Then SetMode:=False Else GetVesaModeInfo(md);π  End Else Beginπ    rp.ax:=md;π    Intr($10,rp);π    VesaMode.Gran:=64; vesaon:=0;π    VesaMode.SegA:=$A000;π    Case md Of  { OEM (standard) video modes }π      1..3,7 : Begin { Text modes }π                 VesaMode.Width:=80;  VesaMode.Height:=25;π                 If md=7 Then Beginπ                   VesaMode.Bits:=1;  VesaMode.SegA:=$B000;π                 End Else Beginπ                   VesaMode.Bits:=4;  VesaMode.SegA:=$B800;π                 End;π                 VesaMode.Bytes:=160; VesaMode.Model:=0;π               End;π      $13 : Begin  { 320 x 200 x 256 colours, VGA & MCGA }π              VesaMode.Width:=320; VesaMode.Height:=200;π              VesaMode.Bits:=8;    VesaMode.Model:=4;π              VesaMode.Bytes:=320;π            End;π      $12 : Begin  { 640 x 480 x 16 colours, VGA only }π              VesaMode.Width:=640; VesaMode.Height:=480;π              VesaMode.Bits:=4;    VesaMode.Model:=3;π              VesaMode.Bytes:=80;π            End;π      $10 : Begin  { 640 x 350 x 16 colours, VGA & EGA with 128k+ }π              VesaMode.Width:=640; VesaMode.Height:=350;π              VesaMode.Bits:=4;    VesaMode.Model:=3;π              VesaMode.Bytes:=80;π            End;π      $0E : Begin  { 640 x 200 x 16 colours, VGA & EGA }π              VesaMode.Width:=640; VesaMode.Height:=200;π              VesaMode.Bits:=4;    VesaMode.Model:=3;π              VesaMode.Bytes:=80;π            End;π      $0D : Begin  { 320 x 200 x 16 colours, VGA & EGA }π              VesaMode.Width:=320; VesaMode.Height:=200;π              VesaMode.Bits:=4;    VesaMode.Model:=3;π              VesaMode.Bytes:=40;π            End;π      Else SetMode:=False;π    End;π  End;πEnd;ππFunction GetMode:Word;πBeginπ  rp.ax:=$4F03;π  Intr($10,rp);π  GetMode:=rp.bx;πEnd;ππFunction SizeOfVideoState:Word;πBegin  { Will save/restore all video states }π  rp.ax:=$4F04;π  rp.dl:=0;π  rp.cx:=$0F;  { hardware, BIOS, DAC & SVGA states }π  Intr($10,rp);π  SizeOfVideoState:=rp.bx;πEnd;ππProcedure SaveVideoState(Var buf);πBeginπ  rp.ax:=$4F04;π  rp.dl:=1;π  rp.cx:=$0F;π  rp.es:=Seg(buf);π  rp.bx:=Ofs(buf);π  Intr($10,rp);πEnd;ππProcedure RestoreVideoState(Var buf);πBeginπ  rp.ax:=$4F04;π  rp.dl:=2;π  rp.cx:=$0F;π  rp.es:=Seg(buf);π  rp.bx:=Ofs(buf);π  Intr($10,rp);πEnd;ππProcedure SetBank(bank:Word);πVar winnum:Word;πBeginπ  winnum:=bank*64 Div VesaMode.Gran;π  rp.ax:=$4F05;π  rp.bx:=0;π  rp.dx:=winnum;π  Intr($10,rp);π  rp.ax:=$4F05;π  rp.bx:=1;π  rp.dx:=winnum;π  Intr($10,rp);πEnd;ππFunction GetBank:Word;πBeginπ  rp.ax:=$4F05;π  rp.bx:=$100;π  Intr($10,rp);π  GetBank:=rp.dx;πEnd;ππProcedure SetLineLength(Var len:Word);πBeginπ  rp.ax:=$4F06;π  rp.bl:=0;π  rp.cx:=len;π  Intr($10,rp); { dx:=maximum number of scan lines }π  len:=rp.cx;πEnd;ππFunction GetLineLength:Word;πBeginπ  rp.ax:=$4F06;π  rp.bl:=1;π  Intr($10,rp); { dx:=maximum number of scan lines }π  GetLineLength:=rp.cx;πEnd;ππProcedure SetDisplayStart(pixel,line:Word);πBeginπ  rp.ax:=$4F07;π  rp.bx:=0;π  rp.cx:=pixel;π  rp.dx:=line;π  Intr($10,rp);πEnd;ππProcedure GetDisplayStart(Var pixel,line:Word);πBeginπ  rp.ax:=$4F07;π  rp.bx:=1;π  Intr($10,rp);π  pixel:=rp.cx;π  line:=rp.dx;πEnd;ππEnd.π                                                                                                                   70     11-26-9317:48ALL                      SWAG SUPPORT TEAM        VIDEO MODE               SWAG9311            10     Üd   {πHow can I save and restore the text screen mode (e.g. 132*28 characters)πwhen using BGI calls in a Turbo Pascal program ?πUnfortunately I always have 80*25 after program exit.π}ππfunction get_video_mode : byte;π{ Returns the current video mode (from interrupt $10,$f).π  Byte [$40:$49] also contains this information, but might not alwaysπ  have the correct value.π}π πvarπ  check_b : byte; {video mode byte : absolute $40:$49}π πbegin {get_video_mode}π  asmπ    mov ah, 0fhπ    int 10hπ    mov check_b, alπ  end;π  if check_b > 127π    then get_video_mode:=check_b-128  {last mode change was done withoutπ                                       screen clearing, mode is given by theπ                                       low 7 bits}π    else get_video_mode:=check_b;πend; {get_video_mode}π π πprocedure set_video_mode(m : byte);π{ Sets the given video mode (via interrupt $10,0).π  If high bit is on screen is not cleared (works only for text modes?).π}π πbegin {set_video_mode}π  asmπ    mov ah, 00hπ    mov al, mπ    int 10hπ  end;πend; {set_video_mode}π                                                                                             71     11-02-9305:26ALL                      WILLIAM MCBRINE          Clear Screen in Mode $13 SWAG9311            4      Üd   {πWILLIAM MCBRINEππ> I am looking For a Procedure to clear a screen in mode $13.  Writingπ> black pixels to each position isn't quite fast enough!ππThis assumes that color 0 is black.π}ππProcedure clearmode13; Assembler;πAsmπ  cldπ  mov ax, $A000π  mov es, axπ  xor di, diπ  xor ah, ahπ  mov cx, 32000π  rep stoswπend;ππ                                                                72     10-28-9311:40ALL                      WIM VAN DER VEGT         VGA TEXT Support         SWAG9311            36     Üd   {===========================================================================πDate: 10-09-93 (10:40)πFrom: WIM VAN DER VEGTπSubj: textmodes w/43/50 linesπ---------------------------------------------------------------------------πHere the uncodes sources of some routines I've written to replaceπturbo's internal textmode routines to enable 43 & 50 lines textmodes onπVGA. They use the BIOS and can be combined with normal read/writeπstatements. Just use the unit and call one of the Vgaxxlines routines.ππ{---------------------------------------------------------}π{  Project : Vga Textmode Support                         }π{  By      : G.W. van der Vegt                            }π{---------------------------------------------------------}π{  Date  .time  Revision                                  }π{  931003.2200  Creatie.                                  }π{---------------------------------------------------------}ππUnit Vts_01;ππInterfaceππFunction  MaxX : Byte;ππFunction  MaxY : Byte;ππFunction  WhereX : Byte;ππFunction  WhereY : Byte;ππProcedure GotoXY(x,y : Byte);ππFunction  GetXY(x,y : Byte) : Char;ππProcedure vga50lines;ππProcedure vga43lines;ππProcedure vga25lines;ππ{---------------------------------------------------------}ππImplementationππUsesπ  Dos;ππ{---------------------------------------------------------}ππFunction MaxX : Byte;ππ{----Return horizontal size of textmode in characters}ππVarπ  r      : Registers;ππBeginπ  r.ah:=$0F;π  Intr($10,r);π  MaxX:=r.AH;πEnd; {of MaxX}ππ{---------------------------------------------------------}ππFunction MaxY : Byte;ππ{----Return vertical size of textmode in characters}ππVarπ  r      : Registers;π  buf    : Array[0..63] Of byte;ππBeginπ  r.ah:=$1B;π  r.bx:=$00;π  r.es:=Seg(buf);π  r.di:=Ofs(buf);π  Intr($10,r);π  MaxY:=buf[$22];πEnd; {of MaxY}ππ{---------------------------------------------------------}ππFunction WhereX : Byte;ππ{----WhereX, aware of textmodes larger than 80x25}ππVarπ  r : registers;ππBeginπ  r.ah:=$0f;π  Intr($10,r);π  r.ah:=$03;π  Intr($10,r);π  WhereX:=r.dl;πEnd; {of WhereX}ππ{---------------------------------------------------------}ππFunction WhereY : Byte;ππ{----WhereY, aware of textmodes larger than 80x25}πππVarπ  r : registers;ππBeginπ  r.ah:=$0f;π  Intr($10,r);π  r.ah:=$03;π  Intr($10,r);π  WhereY:=r.dh;πEnd; {of WhereY}ππ{---------------------------------------------------------}ππProcedure GotoXY(x,y : Byte);ππ{----GotoXY, aware of textmodes larger than 80x25}ππVarπ  r : registers;ππBeginπ  r.ah:=$0f;π  Intr($10,r);π  r.ah:=$02;π  r.dh:=y;π  r.dl:=x;π  Intr($10,r);πEnd; {of GotoXY}ππ{---------------------------------------------------------}ππFunction GetXY(x,y : Byte) : Char;ππ{----GetXY, returns char at x,y and is aware of textmodes larger than 80x25}π{           leave cursor unchanged.                                        }ππVarπ  r     : registers;π  xs,ys : Byte;πBeginπ  xs:=WhereX;π  ys:=WhereY;π  GotoXY(x,y);π  r.ah:=$0f;π  Intr($10,r);π  r.ah:=$08;π  Intr($10,r);π  GetXY:=Chr(r.al);π  GotoXY(xs,ys);πEnd; {of GotoXY}ππ{---------------------------------------------------------}ππProcedure vga50lines;ππ{----Put VGA display into 80x50 textmode}ππVarπ  r : registers;π  b : Byte;ππBeginπ{----50 line mode}π  b:=Mem[$40:$87];π  Mem[$40:$87]:=Mem[$40:$87] OR $01;π  r.ah:=$11;π  r.al:=$12; {----8x8 Character set}π  r.bl:=$00;π  Intr($10,r);π  Mem[$40:$87]:=b;ππ{----400 scan lines neccesary}π  r.ah:=$12;π  r.al:=$02; {----400}π  r.bl:=$30;π  Intr($10,r);πEnd; {of Vga50lines}ππ{---------------------------------------------------------}ππProcedure vga43lines;ππ{----Put VGA display into 80x43 (EGA) textmode}ππVarπ  r : registers;π  b : Byte;ππBeginπ{----43 line mode}π  b:=Mem[$40:$87];π  Mem[$40:$87]:=Mem[$40:$87] OR $01;π  r.ah:=$11;π  r.al:=$12; {----8x8 Character set}π  r.bl:=$00;π  Intr($10,r);π  Mem[$40:$87]:=b;ππ{----350 scan lines neccesary}π  r.ah:=$12;π  r.al:=$01; {----350}π  r.bl:=$30;π  Intr($10,r);πEnd; {of Vga43lines}ππ{---------------------------------------------------------}ππProcedure vga25lines;ππ{----Put VGA display into 80x25 textmode}ππVarπ  r : registers;π  b : Byte;ππBeginπ{----25 line mode}π  b:=Mem[$40:$87];π  Mem[$40:$87]:=Mem[$40:$87] OR $01;π  r.ah:=$11;π  r.al:=$11; {----8x14 Character set}π  r.bl:=$00;π  Intr($10,r);π  Mem[$40:$87]:=b;ππ{----400 scan lines neccesary}π  r.ah:=$12;π  r.al:=$02; {----400}π  r.bl:=$30;π  Intr($10,r);πEnd; {of Vga25lines}ππEnd.π                                       73     01-27-9411:52ALL                      MAYNARD PHILBROOK        More Characters          SWAG9402            13     Üd   {π> I know that a double-byte char system exists on the PC forπ> producing characters beyond the 256 ASCII chars. How is this modeπ> initialized and manipulated? I am interested in creating far more thanπ> 256 characters and writing them to the screen in text mode, and thisπ> appears to be the only way.ππ Don't think that can be done in normal Text Block Mode.π But if you flip your Video in Graphics you could always create Displayπ Driver to imulate many charactors.π   There is a mode that lets you change one of the Charactor Attributeπ Bits normal use to be used to select a different charactor set, but whenπ you do this you also lost that option of what that bit was prior.π here is the interrupt callπ}ππProcedure Set512CharSet; Assembler;πAsmπ  Mov     AH, 11H;π  Mov     AL, 03H;π  Mov     BL, $12; {Selects the Charactor Sets VIA Bit 3 in Char Attriπ  { BL must be loaded so the Video COntroler knows which Block to use }π  { Depending on wether Bit 3 of the Charactor Attri is on of Off }π  { The Upper 4 bits selects a block number to use for The On state ofπ  { Bit 3, the ,Lower Four Bits Selects the OF State of Bit 3 }π  Int     10H;πEnd;ππ{π So after this, when ever you use TextColor(8 - 15) you will get theπ Next Charactor set, ou lose the Intensity option..π this means only 7 8 colors. like the Background..π But you can chage the pallets.πINt 10hπFunction 10hπSubfunction 00hπBX = 0712HπINT 10H;π{ Function always loaded in AH reg, Subs in AL. }π                                                                74     01-27-9411:53ALL                      BO BENDTSEN              Bitmap Display           SWAG9402            11     Üd   {π> Does anyone know how to view BIT map picture, thanx......π}ππTypeπ  PBitmapCoreHeader = ^TBitmapCoreHeader;π  TBitmapCoreHeader = recordπ    bcSize: Longint;              { used to get to color table }π    bcWidth: Word;π    bcHeight: Word;π    bcPlanes: Word;π    bcBitCount: Word;π  end;ππ  PBitmapInfoHeader = ^TBitmapInfoHeader;π  TBitmapInfoHeader = recordπ    biSize: Longint;π    biWidth: Longint;π    biHeight: Longint;π    biPlanes: Word;π    biBitCount: Word;π    biCompression: Longint;π    biSizeImage: Longint;π    biXPelsPerMeter: Longint;π    biYPelsPerMeter: Longint;π    biClrUsed: Longint;π    biClrImportant: Longint;π  end;ππ{ Constants for the biCompression field }ππconstπ  bi_RGB  = 0;π  bi_RLE8 = 1;π  bi_RLE4 = 2;ππtypeπ  PBitmapInfo = ^TBitmapInfo;π  TBitmapInfo = recordπ    bmiHeader: TBitmapInfoHeader;π    bmiColors: array[0..0] of TRGBQuad;π  end;ππtypeπ  PBitmapCoreInfo = ^TBitmapCoreInfo;π  TBitmapCoreInfo = recordπ    bmciHeader: TBitmapCoreHeader;π    bmciColors: array[0..0] of TRGBTriple;π  end;ππtypeπ  PBitmapFileHeader = ^TBitmapFileHeader;π  TBitmapFileHeader = recordπ    bfType: Word;π    bfSize: Longint;π    bfReserved1: Word;π    bfReserved2: Word;π    bfOffBits: Longint;π  end;ππ                                               75     01-27-9411:54ALL                      MICHAEL HOENIE           Character Editor         SWAG9402            72     Üd   {πThis program allows you to create characters using the GRAPHICS unitπsupplied otherwise with the SWAG routines. If you have any questionsπon these routines, please let me know.ππMICHAEL HOENIE - Intelec Pascal Moderator.  }ππprogram charedit;ππusesπ  dos, crt;ππconstπ  numnewchars = 1;ππtypeπ  string80 = string[80];ππvar { all variables inside of the game }π  char_map : array [1..16] of string[8];π  xpos,π  ypos,π  x, y, z  : integer;π  out,π  incom    : string[255];π  charout  : char;π  outfile  : text;π  char     : array [1..16] of byte;ππprocedure loadchar;πtypeπ  bytearray = array [0..15] of byte;π  chararray = recordπ    charnum  : byte;π    chardata : bytearray;π  end;πvarπ  regs     : registers;π  newchars : chararray;πbeginπ  with regs doπ  beginπ    ah := $11;   { video sub-Function $11 }π    al := $0;    { Load Chars to table $0 }π    bh := $10;   { number of Bytes per Char $10 }π    bl := $0;    { Character table to edit }π    cx := $1;    { number of Chars we're definig $1}π    dx := 176;π    for x := 0 to 15 doπ      newchars.chardata[x] := char[x + 1];π    es := seg(newchars.chardata);π    bp := ofs(newchars.chardata);π    intr($10, regs);π  end;πend;ππProcedure FastWrite(Col, Row, Attrib : Byte; Str : string80);πbeginπ  inlineπ    ($1E/$1E/$8A/$86/row/$B3/$50/$F6/$E3/$2B/$DB/$8A/$9E/col/π     $03/$C3/$03/$C0/$8B/$F8/$be/$00/$00/$8A/$BE/attrib/π     $8a/$8e/str/$22/$c9/$74/$3e/$2b/$c0/$8E/$D8/$A0/$49/$04/π     $1F/$2C/$07/$74/$22/$BA/$00/$B8/$8E/$DA/$BA/$DA/$03/$46/π     $8a/$9A/str/$EC/$A8/$01/$75/$FB/$FA/$EC/$A8/$01/$74/$FB/π     $89/$1D/$47/$47/$E2/$Ea/$2A/$C0/$74/$10/$BA/$00/$B0/π     $8E/$DA/$46/$8a/$9A/str/$89/$1D/$47/$47/$E2/$F5/$1F);πend;ππprocedure initalize;πbeginπ  for x := 1 to 16 doπ    char[x] := 0;π  xpos := 1;π  ypos := 1;π  for x := 1 to 16 doπ    char_map[x] := '        '; { clear it out }πend;ππprocedure display_screen;πbeginπ  loadchar;π  fastwrite(1,1,$1F,'         CHAREDIT - By Michael S. Hoenie         ');π  fastwrite(1,2, $7,'      12345678   ┌─────Data');π  fastwrite(1,3, $7,'     ▄▄▄▄▄▄▄▄▄▄  │');π  fastwrite(1,4, $7,'   1 █        █ 000');π  fastwrite(1,5, $7,'   2 █        █ 000 Single:  ░');π  fastwrite(1,6, $7,'   3 █        █ 000');π  fastwrite(1,7, $7,'   4 █        █ 000 Multiple:');π  fastwrite(1,8, $7,'   5 █        █ 000');π  fastwrite(1,9, $7,'   6 █        █ 000     ░░░░░░');π  fastwrite(1,10,$7,'   7 █        █ 000     ░░░░░░');π  fastwrite(1,11,$7,'   8 █        █ 000     ░░░░░░');π  fastwrite(1,12,$7,'   9 █        █ 000                    U            ');π  fastwrite(1,13,$7,'  10 █        █ 000 f1=paint spot      │    MOVEMENT');π  fastwrite(1,14,$7,'  11 █        █ 000 f2=erase spot   L──┼──R         ');π  fastwrite(1,15,$7,'  12 █        █ 000  S=save char       │            ');π  fastwrite(1,16,$7,'  13 █        █ 000  Q=quit editor     D');π  fastwrite(1,17,$7,'  14 █        █ 000  C=reset char    r=scroll-right');π  fastwrite(1,18,$7,'  15 █        █ 000  l=scroll-left');π  fastwrite(1,19,$7,'  16 █        █ 000  r=scroll-right');π  fastwrite(1,20,$7,'     ▀▀▀▀▀▀▀▀▀▀      u=scroll-up');πend;ππprocedure calculate_char;πbeginπ  for x := 1 to 16 doπ    char[x] := 0;π  for x := 1 to 16 doπ  beginπ    fastwrite(7, x + 3, $4F, char_map[x]);π    incom := char_map[x];π      y := 0;π    if copy(incom, 1, 1) = '█' then y := y + 1;π    if copy(incom, 2, 1) = '█' then y := y + 2;π    if copy(incom, 3, 1) = '█' then y := y + 4;π    if copy(incom, 4, 1) = '█' then y := y + 8;π    if copy(incom, 5, 1) = '█' then y := y + 16;π    if copy(incom, 6, 1) = '█' then y := y + 32;π    if copy(incom, 7, 1) = '█' then y := y + 64;π    if copy(incom, 8, 1) = '█' then y := y + 128;π    char[x] := y;π  end;π  for x := 1 to 16 doπ  beginπ    str(char[x], incom);π    while length(incom) < 3 doπ      insert(' ', incom, 1);π    fastwrite(17, x + 3, $4E, incom);π  end;π  loadchar;πend;ππprocedure do_online;πvarπ  done : boolean;π  int1,π  int2,π  int3 : integer;πbeginπ  done := false;π  int1 := 0;π  int2 := 0;π  int3 := 0;π  while not done doπ  beginπ    incom := copy(char_map[ypos], xpos, 1);π    int1  := int1 + 1;π    if int1 > 150 thenπ      int2 := int2 + 1;π    if int2 > 4 thenπ    beginπ      int1 := 0;π      int3 := int3 + 1;π      if int3 > 2 thenπ        int3 := 1;π      case int3 ofπ        1 : fastwrite(xpos + 6, ypos + 3, $F, incom);π        2 : fastwrite(xpos + 6, ypos + 3, $F, '');π      end;π    end;ππ    if keypressed thenπ    beginπ      charout := readkey;π      out     := charout;π      if ord(out[1]) = 0 thenπ      beginπ        charout := readkey;π        out     := charout;π        fastwrite(60, 2, $2F, out);ππ        case out[1] ofπ          ';' :π          begin { F1 }π            delete(char_map[ypos], xpos, 1);π            insert('█', char_map[ypos], xpos);π            calculate_char;π          end;ππ          '<':π          begin { F2 }π            delete(char_map[ypos], xpos, 1);π            insert(' ', char_map[ypos], xpos);π            calculate_char;π          end;ππ          'H':π          begin { up }π            ypos := ypos - 1;π            if ypos < 1 thenπ              ypos := 16;π            calculate_char;π          end;ππ          'P':π          begin { down }π            ypos := ypos + 1;π            if ypos > 16 thenπ              ypos := 1;π            calculate_char;π          end;ππ          'K':π          begin { left }π            xpos := xpos - 1;π            if xpos < 1 thenπ              xpos := 8;π            calculate_char;π          end;ππ          'M':π          begin { right }π            xpos := xpos + 1;π            if xpos > 8 thenπ              xpos := 1;π            calculate_char;π          end;π        end;π      endπ      elseπ      begin { regular keys }ππ        case out[1] ofπ          'Q', 'q':π          begin { done }π            clrscr;π            write('Are you SURE you want to quit? (Y/n) ? ');π            readln(incom);π            case incom[1] ofπ              'Y', 'y' : done := true;π            end;π            clrscr;π            display_screen;π            calculate_char;π          end;ππ          'S','s':π          begin { save }π            assign(outfile, 'chardata.txt');π            {$i-} reset(outfile) {$i+};π            if (ioresult) >= 1 thenπ              rewrite(outfile);π            append(outfile);π            writeln(outfile, 'Character Char:');π            writeln(outfile, '');π            writeln(outfile, '       12345678');π            for x := 1 to 16 doπ            beginπ              str(x, out);π              while length(out) < 6 doπ                insert(' ', out, 1);π              writeln(outfile, out + char_map[x]);π            end;π            writeln(outfile, '');π            write(outfile, 'Chardata:');π            for x := 1 to 15 doπ            beginπ              str(char[x], incom);π              write(outfile, incom + ',');π            end;π            str(char[16], incom);π            writeln(outfile, incom);π            writeln(outfile, '-----------------------------');π            close(outfile);π            clrscr;π            writeln('File was saved under CHARDATA.TXT.');π            writeln;π            write('Press ENTER to continue ? ');π            readln(incom);π            clrscr;π            display_screen;π            calculate_char;π          end;ππ          'U','u':π          begin { move entire char up }π            incom := char_map[1];π            for x := 2 to 16 doπ              char_map[x - 1] := char_map[x];π            char_map[16] := incom;π            calculate_char;π          end;ππ          'R','r':π          begin { move entire char to the right }π            for x := 1 to 16 doπ            beginπ              out := copy(char_map[x], 8, 1);π              incom := copy(char_map[x], 1, 7);π              char_map[x] := out + incom;π            end;π            calculate_char;π          end;ππ          'L','l':π          begin { move entire char to the left }π            for x := 1 to 16 doπ            beginπ              out := copy(char_map[x], 1, 1);π              incom := copy(char_map[x], 2, 7);π              char_map[x] := incom + out;π            end;π            calculate_char;π          end;ππ          'D','d':π          begin { move entire char down }π            incom := char_map[16];π            for x := 16 downto 2 doπ              char_map[x] := char_map[x - 1];π            char_map[1] := incom;π            calculate_char;π          end;ππ          'C','c':π          begin { reset }π            clrscr;π            write('Are you SURE you want to clear it? (Y/n) ? ');π            readln(incom);π            case incom[1] ofπ              'Y','y' : initalize;π            end;π            clrscr;π            display_screen;π            calculate_char;π          end;ππ        end;π      end;π    end;π  end;πend;ππbeginπ  textmode(c80);π  initalize;π  display_screen;π  calculate_char;π  do_online;π  clrscr;π  writeln('Thanks for using CHAREDIT!');πend.π                                                                                             76     01-27-9411:56ALL                      THORSTEN BARTH           Color Bars               SWAG9402            12     Üd   {π> im coding a program at the moment that needs to have a scrolly barπ> menu. I have got all the movement's worked out, however! I cannotπ> work out how to have some sort of bar (like in PowerMenu)... you pressπ> enter when the scrolly bar hits your desired selection and itπ> executes another procedure or function...ππAs I understand your problem, you need to know how to display a bar onπthe screen where the screen and text have different colors, and then,πafter moving away, restore the original colors in that bar. I hopeπyou have found out how to handle the cursor keys.π... searching for routines ... loading ... clippingπ}ππProcedure Colorbar(X,Y,Count: Word;Color: Byte); Assembler;πAsmπ  MOV AX,80π  MUL Yπ  ADD AX,Xπ  SHL AX,1π  INC AXπ  MOV DI,AXπ  MOV AX,Vidsegπ  MOV ES,AXπ  MOV CX,Countπ  MOV AL,Colorπ@@1: STOSBπ     INC DIπ   LOOP @@1πEnd;π{ππGive that procedure the vidseg ($B000 for Hercules or $B800 for the rest),πthen call it. It sets a part of the screen to the color given to it.πThe color values are 16*Backgroundcolor + Forgroundcolor, using theπcolor constants of the unit CRT. Add $80 to get it blink.πTo delete the bar, just set the neutral color you have used while drawingπthe screen.πBTW, there is no error checking in that routine, so giving bad values willπcause problems. You can use it for painting many lines by giving a largerπ"count" parameter to it.π}               77     01-27-9411:56ALL                      JENS LARSSON             Retrace Correction       SWAG9402            7      Üd   {π> I think TP is fast enough for that, because your video card needs muchπ> time to display the screen. Perhaps this is a little bit faster onπ> REALLY slow machines :ππ     Actually, that won't do what it's supposed to do...π     When you use the IN instruction the format is like this:ππ     IN op1,op2   That transfers a byte, word or dword from the inπ                  op2 specified port into AL, AX or EAX.ππ> Asmπ>   MOV DX,$03DAπ> @@1:π>   IN  DX,AX     <-----  Therefore, change to: in al,dxπ>   TEST AX,$08   <-----                        test al,8π>   JZ @@1π> @@2:π>   IN  DX,AX     <-----                        in al,dxπ>   TEST AX,$08   <-----                        test al,8π>   JNZ @@2π> End;π}                                                       78     01-27-9411:56ALL                      COLIN BUCKLEY            Read VGA Dacs            SWAG9402            14     Üd   {π>Well, I have a procedure to return the VGA palette registers in BYTEπ>vars called likeππ>GetColor(Color,Red,Green,Blue:BYTE);ππThis will not return anything as they will be removed from the Stack.  Youπcan pass like this, but you can no receive.  You must use Var R,G,B:Byte;ππ>I want to do thgis, but in assembler:ππ>││   PORT[$3C8] := Color;π>││   Red        := PORT[$3C9];π>││   Green      := PORT[$3C9];π>││   Blue       := PORT[$3C9];ππ>but in assembler....argh, any ideas?π}ππProcedure VGAReadDAC(Reg:Byte; Var R,G,B:Byte); Assembler;πASMπ  MOV   DX,3C7h                     {; |Send Starting DAC Register    }π  MOV   AL,[Reg]                    {; |                              }π  OUT   DX,AL                       {;/                               }π  INC   DX                          {; |DX:=DAC Data Address          }π  INC   DX                          {;/                               }π  IN    AL,DX                       {; |Read Red Byte                 }π  LES   DI,[R]                      {; |                              }π  MOV   [ES:DI],AL                  {;/                               }π  IN    AL,DX                       {; |Read Green Byte               }π  LES   DI,[G]                      {; |                              }π  MOV   [ES:DI],AL                  {;/                               }π  IN    AL,DX                       {; |Read Blue Byte                }π  LES   DI,[B]                      {; |                              }π  MOV   [ES:DI],AL                  {;/                               }πEnd;ππ                                                                                                      79     01-27-9411:59ALL                      JAN DOGGEN               EGA/VGA Bitplanes        SWAG9402            39     Üd   {π> Attention: All those who are familiar with graphics portsπ> (ie. Sean Palmer, Jan Doggen, and others I don't yet know).ππDon't consider myself that familiar with 'em, but here are someπsnippets and remarks. BTW I consider phasing out all BGI stuff in myπcode in the first half of '93 or so, which will be a major effort.πAfter that, I'll rank myself among the register-twiddlers. Maybe weπshould team up on this project if you plan on going in that directionπtoo.ππ> Would you mind explaining the EGA map mask (?) andπ> sequencer (?) register ports (I don't know what they areπ> *really* called, but they are the ones that control whichπ> bitplane gets written to in EGA modeπ> 640x350x16, 4 bitplanes) to me (please)?ππThere are several write modes and read modes for EGA/VGA, and theπexact workings of the registers depend on the mode. What you areπtalking about (I assume) is read/write mode 0 which you would useπto pump bytes directly into a bit plane. I use the followingπprocedure for this:πππ(*************************** EGA/VGA bit planes ****************************)π}ππCONSTπ  GDCIndexReg = $3CE;  { Index register of EGA/VGA Graphics Device Controller }π  GDCDataReg  = $3CF;  { Data  register of EGA/VGA Graphics Device Controller }π  SeqIndexReg = $3C4;  { Index register of EGA/VGA Sequencer }π  SeqDataReg  = $3C5;  { Data  register of EGA/VGA Sequencer }ππPROCEDURE PrepareBitPlaneRead(Plane: Byte);π  BEGINπ    Port[GDCIndexReg] := 5;           { Number of Mode register }π    Port[GDCDataReg ] := 0;           { Value of register: 0: read mode 0 }π    Port[GDCIndexReg] := 4;           { Number of Read Map Select register }π    Port[GDCDataReg ] := Plane;       { Value of register: bit for plane toπread }π  END; { PrepareBitPlaneRead }πππPROCEDURE ConcludeBitPlaneRead(Plane: Byte);π  BEGINπ    Port[GDCIndexReg] := 5;           { Number of Mode register }π    Port[GDCDataReg ] := $10;         { Value of register: 10: default forπmodes 10h and 12h }π    Port[GDCIndexReg] := 4;           { Number of Read Map Select register }π    Port[GDCDataReg ] := 0;           { Value of register: plane to read }π  END; { ConcludeBitPlaneRead }πππPROCEDURE PrepareBitPlaneWrite(Plane,PutMode: Byte);π  BEGINπ    Port[GDCIndexReg] := 5;           { Number of Mode register }π    Port[GDCDataReg ] := 0;           { Value of register: 0: write mode 0 }π    Port[GDCIndexReg] := 1;           { Number of Enable Set/Reset register }π    Port[GDCDataReg ] := 0;           { Value of register: 0 }π    Port[GDCIndexReg] := 3;           { Number of Data Rotate/Function Selectπregister }π   (* Bits 3 and 4 from the Rotate/Function Select register mean:π    *          Bit 4  Bit 3   Replacement function:π    *            0      0           Replaceπ    *            0      1           ANDπ    *            1      0           ORπ    *            1      1           XOR    *)π    CASE PutMode OFπ      AndPut : Port[GDCDataReg] :=  8;   { No rotation; AND with buffer }π      OrPut  : Port[GDCDataReg] := 16;   { No rotation; OR  with buffer }π      XORPut : Port[GDCDataReg] := 24    { No rotation; XOR with buffer }π    ELSEπ      Port[GDCDataReg] :=  0;    { No rotation; replace; use this as default }π    END; { CASE }π    Port[GDCIndexReg] := 8;           { Number of BitMask register }π    Port[GDCDataReg ] := $FF;         { Value of register: $FF: use all bits }π    Port[SeqIndexReg] := 2;           { Number of Map Mask register }π    Port[SeqDataReg ] := 1 SHL Plane; { Value of register: plane number }π  END; { PrepareBitPlaneWrite }πππPROCEDURE ConcludeBitPlaneWrite(Plane: Byte);π  BEGINπ    Port[GDCIndexReg] := 1;           { Number of Enable Set/Reset register }π    Port[GDCDataReg ] := 0;           { Value of register: 0 }π    Port[SeqIndexReg] := 2;           { Number of Map Mask register }π    Port[SeqDataReg ] := $0F;         { Value of register: Enable all planes }π    Port[GDCIndexReg] := 3;           { Number of Data Rotate/Function Selectπregister }π    Port[GDCDataReg ] := 0;           { Value of register: No rotation; replaceπ}π  END; { ConcludeBitPlaneWrite }ππ{πA good explanation can be found in:π  Wilton,R - Programmers' guide to PC and PS/2 video systemsπ  Microsoft PressππYou should invest in some books on EGA/VGA programming if you haveπmore of these questions, otherwise you're being 'penny wise, poundπfoolish'.ππThe book by Wilton is considered more or less a 'must have' togetherπwithπ  Ferraro, R.F. - Programmer's guide to the EGA and VGA cardsπ  Addison-WesleyππFerraro gives you detailed register info. It also deals with SuperπVGAs. Because I'll have to expand a program to use VESA super VGAπmodes, I bought this together with:π  Rimmer, S - Super VGA graphics programming secretsπ  WindCrest/McGraw Hillπ}                                                                                           80     01-27-9412:00ALL                      PEDER HERBORG            Fast VGA Routines        SWAG9402            25     Üd   {πI've must say that im not exactly the perfect programmer, but I think I've anπanswer to some of your questions.ππ1. Well to post a whole program who does that is quite complicated. Butπ   if you use the Pelpanning register it's possible to create really fastπ   scrollers even on slow 286 and XT's. Here comes a simple proc just toπ   get the Idea:ππ}ππconst Crtadress:word=$3d4;π      Inputstatus:word=$3DA;πππProcedure Pan(X,Y: Word);assembler;    { This pans the screen } asmπ    mov    bx,320π    mov    ax,yπ    mul    bxπ    add    ax,xπ    push   axπ    pop    bxπ    mov    dx,INPUTSTATUSπ@WaitDE:π    in     al,dxπ    test   al,01hπ    jnz    @WaitDE       {display enable is active?}π    mov    dx,Crtadressπ    mov    al,$0Cπ    mov    ah,bhππ    out    dx,axπ    mov    al,$0Dπ    mov    ah,blπ    out    dx,axπ    MOV    dx,inputstatusπ@wait:π    in      al,dxπ    test    al,8                    {?End Vertical Retrace?}π    jz     @waitπEnd;ππ{πIf you use this, you should realize that if you increase x by one the screenπmoves four pixels. This procedure move the whole screen, so if you want a logoπor something at the screen too you have to use this little procedure, it resetsπthe scanlines at the screen soo it is only the top of the screen that moves.π}ππprocedure vgasplit(whatline:word);πbeginπ  asmπ{VGASplit        Proc    Near}π                 Mov     BX,whatlineπ                 Mov     DX,3DAh-6           {; Port = 3D4H}π                 Mov     AX,BXπ                 Mov     BH,AHπ                 Mov     BL,BHπ                 And     BX,0201Hπ                 Mov     CL,4π                 Shl     BX,CLπ                 Shl     BH,1π                 Mov     AH,ALπ                 Mov     AL,18Hπ                 Out     DX,AXππ                 Mov     AL,7π                 Out     DX,ALππ                 Inc     DXπ                 In      AL,DXππ                 Dec     DXπ                 Mov     AH,ALπ                 And     AH,11101111Bπ                 Or      AH,BLπ                 Mov     AL,7π                 Out     DX,AXππ                 Mov     AL,9π                 Out     DX,ALππ                 Inc     DXπ                 In      AL,DXππ                 Dec     DXπ                 Mov     AH,ALπ                 And     AH,10111111Bπ                 Or      AH,BHπ                 Mov     AL,9π                 Out     DX,AXππ               End;πend;ππ{π2. There are several unit's out there that comes with source so i suggestπ   that you have another look at one of them, There is a really nice oneπ   called ANIVGA.ππ3. Well its almost the same as the first question. Just dont set the vgasplitπ   rutine. And increase the y parameter instead of x.πππAll of the rutines have been written for mode X, but it's also possible to useπthem with standard Vgamode $13.πThats it. I really hope it helped you or/and somebody else a little bit,if youπor anyone else have any questions. Please feel free to write me a Letter.ππ}                                                                                       81     01-27-9412:01ALL                      JOHN BECK                Flames                   SWAG9402            102    Üd   π{$G+}ππprogram flames;ππuses crt;ππ{**************************************************************************}π{*                                                                        *}π{*    FLAMES by M.D.Mackey  (C) 1993                                      *}π{*        This code released into the public domain. It may be freely     *}π{*        used, distributed and modified. I would appreciate it if        *}π{*        credit were given, however. If you have any improvements,       *}π{*        find any bugs etc. mail me at mackey@aqueous.ml.csiro.au        *}π{*        with MARK: in the subject header.                               *}π{*                                                                        *}π{**************************************************************************}ππ{**************************************************************************}π{*                                                                        *}π{*  Modified 12-Dec-93: John M. Beck                                      *}π{*                                                                        *}π{*     Restructured and added wave effect by tracing sin path.            *}π{*                                                                        *}π{**************************************************************************}ππconst palette : array [1..768] of byte = (ππ    0,    0,    0,    0,    0,    24,    0,    0,    24,    0,    0,    28,π    0,    0,   32,    0,    0,    32,    0,    0,    36,    0,    0,    40,π    8,    0,   40,   16,    0,    36,   24,    0,    36,   32,    0,    32,π   40,    0,   28,   48,    0,    28,   56,    0,    24,   64,    0,    20,π   72,    0,   20,   80,    0,    16,   88,    0,    16,   96,    0,    12,π  104,    0,    8,  112,    0,     8,  120,    0,     4,  128,    0,     0,π  128,    0,    0,  132,    0,     0,  136,    0,     0,  140,    0,     0,π  144,    0,    0,  144,    0,     0,  148,    0,     0,  152,    0,     0,π  156,    0,    0,  160,    0,     0,  160,    0,     0,  164,    0,     0,π  168,    0,    0,  172,    0,     0,  176,    0,     0,  180,    0,     0,π  184,    4,    0,  188,    4,     0,  192,    8,     0,  196,    8,     0,π  200,   12,    0,  204,   12,     0,  208,   16,     0,  212,   16,     0,π  216,   20,    0,  220,   20,     0,  224,   24,     0,  228,   24,     0,π  232,   28,    0,  236,   28,     0,  240,   32,     0,  244,   32,     0,π  252,   36,    0,  252,   36,     0,  252,   40,     0,  252,   40,     0,π  252,   44,    0,  252,   44,     0,  252,   48,     0,  252,   48,     0,π  252,   52,    0,  252,   52,     0,  252,   56,     0,  252,   56,     0,π  252,   60,    0,  252,   60,     0,  252,   64,     0,  252,   64,     0,π  252,   68,    0,  252,   68,     0,  252,   72,     0,  252,   72,     0,π  252,   76,    0,  252,   76,     0,  252,   80,     0,  252,   80,     0,π  252,   84,    0,  252,   84,     0,  252,   88,     0,  252,   88,     0,π  252,   92,    0,  252,   96,     0,  252,   96,     0,  252,  100,     0,π  252,  100,    0,  252,  104,     0,  252,  104,     0,  252,  108,     0,π  252,  108,    0,  252,  112,     0,  252,  112,     0,  252,  116,     0,π  252,  116,    0,  252,  120,     0,  252,  120,     0,  252,  124,     0,π  252,  124,    0,  252,  128,     0,  252,  128,     0,  252,  132,     0,π  252,  132,    0,  252,  136,     0,  252,  136,     0,  252,  140,     0,π  252,  140,    0,  252,  144,     0,  252,  144,     0,  252,  148,     0,π  252,  152,    0,  252,  152,     0,  252,  156,     0,  252,  156,     0,π  252,  160,    0,  252,  160,     0,  252,  164,     0,  252,  164,     0,π  252,  168,    0,  252,  168,     0,  252,  172,     0,  252,  172,     0,π  252,  176,    0,  252,  176,     0,  252,  180,     0,  252,  180,     0,π  252,  184,    0,  252,  184,     0,  252,  188,     0,  252,  188,     0,π  252,  192,    0,  252,  192,     0,  252,  196,     0,  252,  196,     0,π  252,  200,    0,  252,  200,     0,  252,  204,     0,  252,  208,     0,π  252,  208,    0,  252,  208,     0,  252,  208,     0,  252,  208,     0,π  252,  212,    0,  252,  212,     0,  252,  212,     0,  252,  212,     0,π  252,  216,    0,  252,  216,     0,  252,  216,     0,  252,  216,     0,π  252,  216,    0,  252,  220,     0,  252,  220,     0,  252,  220,     0,π  252,  220,    0,  252,  224,     0,  252,  224,     0,  252,  224,     0,π  252,  224,    0,  252,  228,     0,  252,  228,     0,  252,  228,     0,π  252,  228,    0,  252,  228,     0,  252,  232,     0,  252,  232,     0,π  252,  232,    0,  252,  232,     0,  252,  236,     0,  252,  236,     0,π  252,  236,    0,  252,  236,     0,  252,  240,     0,  252,  240,     0,π  252,  244,    0,  252,  244,     0,  252,  244,     0,  252,  248,     0,π  252,  248,    0,  252,  248,     0,  252,  248,     0,  252,  252,     0,π  252,  252,    4,  252,  252,     8,  252,  252,    12,  252,  252,    16,π  252,  252,   20,  252,  252,    24,  252,  252,    28,  252,  252,    32,π  252,  252,   36,  252,  252,    40,  252,  252,    40,  252,  252,    44,π  252,  252,   48,  252,  252,    52,  252,  252,    56,  252,  252,    60,π  252,  252,   64,  252,  252,    68,  252,  252,    72,  252,  252,    76,π  252,  252,   80,  252,  252,    84,  252,  252,    84,  252,  252,    88,π  252,  252,   92,  252,  252,    96,  252,  252,   100,  252,  252,   104,π  252,  252,  108,  252,  252,   112,  252,  252,   116,  252,  252,   120,π  252,  252,  124,  252,  252,   124,  252,  252,   128,  252,  252,   132,π  252,  252,  136,  252,  252,   140,  252,  252,   144,  252,  252,   148,π  252,  252,  152,  252,  252,   156,  252,  252,   160,  252,  252,   164,π  252,  252,  168,  252,  252,   168,  252,  252,   172,  252,  252,   176,π  252,  252,  180,  252,  252,   184,  252,  252,   188,  252,  252,   192,π  252,  252,  196,  252,  252,   200,  252,  252,   204,  252,  252,   208,π  252,  252,  208,  252,  252,   212,  252,  252,   216,  252,  252,   220,π  252,  252,  224,  252,  252,   228,  252,  252,   232,  252,  252,   236,π  252,  252,  240,  252,  252,   244,  252,  252,   248,  252,  252,   252,π  252,  252,  240,  252,  252,   244,  252,  252,   248,  252,  252,   252);ππ   radius    = 1.9;π   frequency = 2;π   angleinc  = 3 * pi / frequency;ππvarπ   count       : word;π   delta       : integer;π   path        : array[0..199] of word;π   buffer      : array[0..102,0..159] of integer;ππprocedure buildpath;π   varπ      count     : byte;π      currangle : real;π   beginπ      currangle := pi;π      for count := 0 to 199 doπ         beginπ            path[count] := 320 + round(radius*sin(currangle));ππ            { the sin path _must_ lie on an even number }π            { otherwise the picture will be garbage     }ππ            if path[count] mod 2 <> 0 thenπ               if path[count] > 320 thenπ                  dec(path[count])            { round down }π               elseπ                  inc(path[count]);           { round up   }ππ            { the path is rounded to the closest even number to 320 }ππ            currangle := currangle + angleinc;π         end;π   end;ππbeginπ  randomize;π  buildpath;ππ  asmπ     mov   ax,13h              { ; AX := 13h                            }π     int   10h                 { ; Set Mode 13h (320x200x256)           }ππ     xor   ax,ax               { ; AX := 0                              }π     mov   cx,768              { ; CX := # of palette entries           }π     mov   dx,03C8h            { ; DX := VGA Port                       }π     mov   si,offset palette   { ; SI := palette[0]                     }ππ     out   dx,al               { ; send zero to index port              }π     inc   dx                  { ; inc to write port                    }ππ   @l1:ππ     mov   bl,[si]             { ; set palette entry                    }π     shr   bl,2                { ; divide by 4                          }π     mov   [si],bl             { ; save entry                           }π     outsb                     { ; and write to port                    }π     dec   cx                  { ; CX := CX - 1                         }π     jnz   @l1                 { ; if not done then loop                }ππ     mov   ax,seg buffer       { ; AX := segment of buffer              }π     mov   es,ax               { ; ES := AX                             }π     mov   di,offset buffer    { ; DI := buffer[0]                      }π     mov   cx,8109             { ; CX := sizeof(buffer) div 2           }π     xor   ax,ax               { ; AX := 0                              }π     rep   stosw               { ; clear every element in buffer to zero}π  end;ππ  repeatππ     asmπ        mov   bx,1             { ; BX := 1                              }π        mov   si,offset path   { ; SI := path[0]                        }ππ        mov   cx,16160         { ; CX := # of elements to change        }π        mov   di,offset buffer { ; DI := buffer[0]                      }π        add   di,320           { ; DI := buffer[320] (0,1)              }ππ     @l2:ππ        mov   ax,ds:[di-2]     { ; AX := buffer[DI-2]    (x-1,y)        }π        add   ax,ds:[di]       { ; AX += buffer[DI]      (x  ,y)        }π        add   ax,ds:[di+2]     { ; AX += buffer[DI+2]    (x+1,y)        }π        add   ax,ds:[di+320]   { ; AX += buffer[DI+320]  (x,y+1)        }π        shr   ax,2             { ; AX := AX div 4 (calc average)        }ππ        jz    @l3              { ; if AX = 0 then skip next line        }π        dec   ax               { ; else AX--                            }ππ     @l3:ππ        push  di               { ; save DI                              }π        sub   di,ds:[si]       { ; DI := (x + or - sin,y-1)             }π        mov   word ptr ds:[di],ax { store AX somewhere one line up      }π        pop   di               { ; restore DI                           }ππ        inc   di               { ; DI++                                 }π        inc   di               { ; DI++ (move to next word)             }ππ        inc   bx               { ; BX++                                 }π        cmp   bx,320           { ; if bx <> 320                         }π        jle   @l4              { ; then jump to @l4                     }π        mov   bx,1             { ; else BX := 1 (we're on a new line)   }π        inc   si               { ; point SI to next element in path     }π        inc   si               { ;                                      }ππ     @l4:π        dec   cx               { ; CX--                                 }π        jnz   @l2              { ; if CX <> 0 then loop                 }π     end;ππ     for count := 0 to 159 do {set new bottom line}π        beginπ           if random < 0.4 thenπ              delta := random(2)*255;π           buffer[101,count] := delta;π           buffer[102,count] := delta;π        end;ππ     asmπ        mov   si,offset buffer { ; SI := buffer[0]                      }π        mov   ax,0A000h        { ; AX := 0A000h (vga segment)           }π        mov   es,ax            { ; ES := AX                             }π        xor   di,di            { ; DI := 0                              }π        mov   dx,100           { ; DX := 100 (# of rows div 2)          }ππ     @l5:π        mov   bx,2             { ; BX := 2                              }ππ     @l6:π        mov   cx,160           { ; CX := 160 (# of cols div 2)          }ππ     @l7:π        mov   al,ds:[si]       { ; AL := buffer[si]                     }π        mov   ah,al            { ; AH := AL (replicate byte)            }π        mov   es:[di],ax       { ; store two bytes into video memory    }π        inc   di               { ; move to next word in VRAM            }π        inc   di               { ;                                      }π        inc   si               { ; move to next word in buffer          }π        inc   si               { ;                                      }π        dec   cx               { ; CX--                                 }π        jnz   @l7              { ; repeat until done with column        }ππ        sub   si,320           { ; go back to start of line in buffer   }π        dec   bx               { ; BX--                                 }π        jnz   @l6              { ; repeat until two columns filled      }ππ        add   si,320           { ; restore position in buffer           }π        dec   dx               { ; DX--                                 }π        jnz   @l5              { ; repeat until 100 rows filled         }π     end;ππ  until keypressed;ππ  asmπ     mov   ax,03h              { ; AX := 3h                             }π     int   10h                 { ; restore text mode                    }π  end;ππend.π                                                                                                                      82     01-27-9412:01ALL                      DARRELL STEWART          Font Size                SWAG9402            20     Üd   {πHow does Norton defeat the one vertical scan line dividing itsπcharacters in order to write their alphanumeric menu screens?  I have aπ"user-font" which loads successfully into vga display memory using tp7:π}πtypeπ  bytearray = array[0..maxbytes] of byte;πvarπ  fontarray : bytearray;  { character byte array }πprocedure wrfont(input : bytearray; blknum, numline : byte);  assembler;π{ "input" is an array containing character bit patterns (8x16 character)π  "blknum" is the block numberπ  "numline" is the number of scanlines per character }π  asmπ    push    bp            { save the base point register }π    mov     bl, blknum    { get block number }π    and     bl, 07        { limit to 0-7 block number }π    les     ax, input     { point to "C" buffer es:ax }π    mov     bh, numline   { number of bytes per characters }π    mov     bp, ax        { load offset to "C" buffer es:bp }π    mov     cx, 100h      { do for 256 characters }π    xor     dx, dx        { begin at 0 }π    mov     ax, 1110h     { load font }π    int     10h           { call interrupt }π    pop     bp            { restore the base point register }π  end;π{π    This procedure loads my user-font correctly into display memory;πhowever, I still have one verical scanline between my horizontal lineπcharacters making them basically worthless for my purposes (it "draws"πa dashed line like above).  I thought when alphanumeric characters areπmapped, you need to leave a bit pattern open along the right and bottomπedges in order to separate the characters.  Closing up the right andπbottom edges should "connect" the characters, yet I've found it doesπnot.  I have tried replacing the original ASCII horizontal lineπcharacters and this also fails.π    What information do I need?  How can I connect my font charactersπto display Norton-like menus in alphanumeric 8x16 vga font format (orπfor that matter, any two primitive graphic fonts)?  Does it make anyπdifference with which ASCII characters I replace in my table?π    By the way, I noticed that Norton's alternate font does have aπsmall (anal retentively) defect.  Their upper right box charactersπdo not have a "crisp" corner.  Each one has a pixel "nub" to the right.πI have a feeling this is a clue to answer my problem but I stillπhaven't gotten it right.  Anyone know?π}                                                                                                                          83     01-27-9412:02ALL                      MIGUEL MARTINEZ          Fractals!                SWAG9402            30     Üd   {πFor all of you who are interested on fractals, here is a little program,πtaken from a source code in Modula-2, that will draw a Mandelbrot fractal.ππJust one problem: If your computer doesn't have a math coprocessor, theπprogram will run "a bit" slow :).ππTry modifying all the constants, you'll get strange results :).π}π{$N+}π{$X+ Enable Extended Syntax                                       }πProgram Mandelbrot;     {Using real numbers. For TP 6.0 and above }ππUses Crt;               {Only to use "ReadKey" Function.          }ππConst Colours=255;       {Number of colors to be on the image.     }π      Width=320;        {Width of the image.                      }π      Height=200;       {Height of the image.                     }π      Limit=8.0;        {Until when we calculate.                 }π      XRMin=-2.0;       {Left limit of the fractal.               }π      XRMax=1.0;        {Right limit of the fractal.              }π      YRMin=-1.3;       {Lower limit of the fractal.              }π      YRMax=1.3;        {Upper limit of the fractal.              }ππType Palette=Array[0..767] of Byte;  {MCGA/VGA palette type       }ππVar XPos,YPos:Word;ππ{Sets the desired video mode (13h)                                }πProcedure SetVideoMode(VideoMode:Byte); Assembler;πAsmπ  xor ax,ax                 {BIOS Function 00h: Set Video Mode.   }π  mov al,VideoMode          {Desired Video Mode.                  }π  int 10hπEnd;ππ{Creates a palette: Black --> red --> yellow                      }πProcedure MakePalette;πVar CPal:Palette;π    i:Byte;ππ  {Sets the palette.                                              }π  Procedure SetPalette(Pal:Palette); Assembler;π  Asmπ    push esπ    mov ax,1012h            {BIOS function 10h, subfunction 12h.  }π    xor bx,bx               {first color register.                }π    mov cx,20h              {number of color registers.           }π    les dx,Pal              {ES:DX Segment:Offset of color table. }π    Int 10hπ    pop esπ  End;ππBeginπ  For i:=0 to 15 doπ  Beginπ    CPal[3*i]:=4*i+3; CPal[3*i+1]:=0; CPal[3*i+2]:=0;π    CPal[3*i+48]:=63; CPal[3*i+49]:=4*i+3; CPal[3*i+50]:=0;π  End;π  SetPalette(CPal);πEnd;ππ{Draws a Plot of the desired color on screen.                     }πProcedure DrawPixel(XPos,YPos:Word; PlotColour:Byte);πBeginπ  Mem[$A000:YPos*320+XPos]:=PlotColour;πEnd;ππ{Needs to be explained? ;-)                                       }πProcedure Beep;πBeginπ  Sound(3000); Delay(90); Sound(2500); Delay(90);π  NoSound;πEnd;ππ{Calculates the color for each point.                             }πFunction ComputeColour(XPos,YPos:Word):Byte;πVar RealP,ImagP:Real;π    CurrX,CurrY:Real;π    a2,b2:Real;π    Counter:Byte;ππBeginπCurrX:=XPos/Width*(XRMax-XRMin)+XRMin;π  CurrY:=YPos/Height*(YRMax-YRMin)+YRMin;π  RealP:=0;π  ImagP:=0;π  Counter:=0;π  Repeatπ    a2:=Sqr(RealP);π    b2:=Sqr(ImagP);π    ImagP:=2*RealP*ImagP+CurrY;π    RealP:=a2-b2+CurrX;π    Inc(Counter);π  Until (Counter>=Colours) or (a2+b2>=Limit);π  ComputeColour:=Counter-1;πEnd;ππBeginπ  Writeln('Program to draw Fractals of Mandelbrot.');π  Writeln('Written by Miguel Martínez. ');π  Writeln('Press any key to continue...');π  If ReadKey=#0 Then ReadKey;   {Skip double codes.               }ππ  SetVideoMode(19);             {Set 320x200x256 graphics mode.   }π  MakePalette;π  For YPos:=0 to (Height-1) doπFor XPos:=0 to (Width-1) doπ      DrawPixel(XPos,YPos,ComputeColour(XPos,YPos));π  Beep;                         {Beep when finished.              }π  If ReadKey=#0 Then ReadKey;π  ReadKey;π  SetVideoMode(3);              {Restore text mode.               }πEnd.π                                                                                  84     01-27-9412:07ALL                      FRANK HIRSCH             Screen Images            SWAG9402            12     Üd   {π> I'm trying to find out a way to do GET and PUT of sections of the screenπ> into a variable... but the method I'm using is too slow and I cannot trulyπ> store it in a variable (it does a .INC program that you link with yourπ> files...).ππWell, the most simple attempt would probably be something like....π}ππPROGRAM bitmap_images;ππUSESπ  CRT,π  some_mode13h_routs;ππVARπ  screen : ARRAY [0..199,0..319] OF BYTE ABSOLUTE $a000:0000;π  imgptr : POINTER;π  ch     : CHAR;ππPROCEDURE get_image(p:POINTER;xp,yp:WORD;xs,ys:BYTE);πVARπ  s,o   : WORD;πBEGINπ  s:=SEG(p^);π  o:=OFS(p^);π  FOR yp:=yp TO PRED(yp+ys)π  DO BEGINπ    MOVE(screen[yp,xp],MEM[s:o],xs);π    INC(o,xs);π  END;πEND;ππPROCEDURE put_image(p:POINTER;xp,yp:WORD;xs,ys:BYTE);πVARπ  s,o   : WORD;πBEGINπ  s:=SEG(p^);π  o:=OFS(p^);π  FOR yp:=yp TO PRED(yp+ys)π  DO BEGINπ    MOVE(MEM[s:o],screen[yp,xp],xs);π    INC(o,xs);π  END;πEND;ππBEGINπ  init_mode($13);               { init mode 13h }π  load_piccy('some.gfx');       { load some picture }π  GETMEM(imgptr,160*100);       { allocate memory for bitmap }π  get_image(p,0,0,160,100);     { get left part of screen }π  put_image(p,160,0,160,100);   { copy to right part of screen }π  FREEMEM(imgptr,160*100);      { release memory }π  ch:=READKEY;                  { wait for a key }π  init_mode($03);               { back to textmode }πEND.π                                                    85     01-27-9412:10ALL                      NORBERT IGL              Julia Set                SWAG9402            12     Üd   {π To try out the program, some complex constants you canπ use are -1, -0.1+0.8i, 0.3-0.5i, -1.139+0.238i.  ie, whenπ asked for the real part, enter 0.3.  For the imaginary,π enter -.5 }ππprogram julia;π{$N+,E+}πuses crt;πType Real = double;πvar  cx, cy, xo, yo, x1, y1 : real;π     mx, my, a, b, i, orb   : word;ππlabel XXX;ππprocedure pset ( rx, ry: real; c:byte );πvar a, x, y :word;πbeginπ  x := round(rx);π  y := round(ry);π  a := 320* pred(y) + x;π  mem[$A000:A] := cπend;πbeginπ  write('Real part: ');π  readln(CX);π  write('Imaginary part: ');π  readln(CY);π  asmπ    mov ax, $13π    int 10hπ  end;π  MX := 319; {  ' the box we want to plot on the screen }π  MY := 199;π  FOR A := 1 TO MX  do    {'X screen coordinate}π    FOR B := 1 TO MY do   {'Y screen coordinate  }π    beginπ      XO := -2 + A / (MX / 4); {'X complex plane coordinate}π      YO :=  2 - B / (MY / 4);  {'Y complex plane coordinate}π      Orb := 0;π      FOR I := 1 TO 255 do     {'iterations for 255 colors}π      beginπ        X1 := XO * XO - YO * YO + CX;π        Y1 := 2 * XO * YO + CY;π        IF X1 * X1 + Y1 * Y1 > 4.0 THEN  {'orbit escapes, plot it}π        beginπ          Orb := I;π          GOTO XXX;π        END;π        XO := X1;π        YO := Y1;π      end;πXXX:π      PSET (A, B, Orb);  { 'plot orbit}π    end;π  readln;π  textmode(lastmode);πend.π                                                                   86     01-27-9412:10ALL                      ANDREW KEY               Julia Set                SWAG9402            22     Üd   program Julia;π{program computes and displays a Julia Set using VGA 256 color graphics inπ mode 13h.  written by Andrew Key and released to the public domain.  notπ guaranteed -- use at own risk (but it has been put through limited tests...)π }πusesπ  Crt;ππconstπ  MX = 100;  {horizontal number of pixels}π  MY = 100;  {vertical num. of pixels}ππtypeπ  Complex = record                           {Data type for complex numbers}π              A,Bi: real;π            end;π  VGAMemType = array[1..200,1..320] of byte; {addressed y,x}ππvarπ  Num, C: Complex;π  X,Y,SaveMode,I: integer;π  ch: char;π  VGAMem : VGAMemType Absolute $A000:$0000;  {accesses actual video memory}ππprocedure SetMode(mode: integer); assembler; {sets video card to specifiedπ                                              mode}π  asmπ    mov ax,modeπ    int $10            {Video interrupt}π  end;ππfunction CurrentMode: integer; assembler;    {returns current video mode}π  asmπ    mov ax,$0f00π    int $10π    xor ah,ahπ  end;ππprocedure SqCplx(var N: complex);  {squares a variable of type Complex)}π  varπ    temp: real;π  beginπ    temp:= (N.A * N.A) - (N.Bi * N.Bi);π    N.Bi:= 2 * N.A * N.Bi;π    N.A:= temp;π  end;ππprocedure AddCplx(var X: complex; Y: complex);π{Adds two complex variables -- X := X + Y}π  beginπ    X.A := X.A + Y.A;π    X.Bi:= X.Bi + Y.Bi;π  end;ππfunction SqDist(X: complex): real;π{Computes the square of the distance from the point X to the origin}π  beginπ    SqDist := X.A * X.A + X.Bi * X.Bi;π  end;ππprocedure ClrVidScr; {Clears video screen in mode 13h}π  var x,y: integer;π  beginπ    for x:=1 to 320 doπ      for y:=1 to 200 doπ        VGAMem[y,x]:=0;π  end;ππbeginπ  {Get values for complex constant}π  ClrScr;π  write('Real part: ');π  readln(C.A);π  write('Imaginary part: ');π  readln(C.Bi);ππ  {set video mode to 320*200*256 VGA and clear screen}π  SaveMode:= CurrentMode;  {save current mode}π  SetMode($13);            {set mode 13h}π  ClrVidScr;ππ  {compute julia set}π  for y:= 0 to (MY-1) doπ    for x:= 0 to (MX-1) doπ      beginπ        Num.A := -2 + x / ( MX / 4);  {compute REAL component}π        Num.Bi:= 2 - y / ( MX / 4);   {compute IMAGINARY component}π        I:=0;                         {reset number of iterations}π        repeatπ          SqCplx(Num);                {square the complex number}π          AddCplx(Num,C);             {and add the complex constant}π          Inc(I);π        until ((I>=255) or (SqDist(Num)>4));π        VGAMem[y+1,x+1]:=I;           {plot the point}π      end;ππ  {julia set completed}π  ch:=readkey;                        {wait for a keypress}π  SetMode(SaveMode);                  {return to original mode}πend.π      87     01-27-9412:12ALL                      CHRIS PRIEDE             Font Banks               SWAG9402            13     Üd   {π>have a vga that I want to use the above mentioned interrupt with. Theπ>problem is that I can't seem to get the interrupt to do its thing. Theπ>program seems to go through it with no effect at all. My question is howπ>do I get the results?ππThe following procedures may help you. VGA has 8 font banksπ(0..7). Load your font using LoadFont, then activate that bank withπSelectFont. Selecting two different font banks will let you displayπtwo fonts simultaneously -- intensity bit selects secondary font (youπloose high intensity colors).π}πprocedure SelectFont(Prim, Sec: byte);πvar Tmp: byte;πbeginπ  Tmp := (Prim and $3) or (Prim shl 2 and $10)π  or (Sec shl 2 and $C) or (Sec shl 3 and $20);π  asmπ        mov     bl, Tmpπ        mov     ax, $1103π        int     $10π  end;π  if (Prim and $7) = (Sec and $7) thenπ    Tmp := $Fπ  elseπ    Tmp := $7;π  asmπ        mov     bh, Tmpπ        mov     bl, $12π        mov     ax, $1000π        int     $10π  end;πend;πππprocedure LoadFont(var Buf; Bank, Height: byte; First, Last: char); assembler;πasmπ        mov     dl, Firstπ        xor     dh, dhπ        mov     cl, Lastπ        sub     cl, dlπ        mov     ch, dhπ        inc     cxπ        mov     bl, Bankπ        mov     bh, Heightπ        les     bp, Bufπ        mov     ax, $1100π        int     $10πend;ππvar Buf: array [1..4096] of byte;ππbeginπ  { Load 256 8x16 characters in buffer }π  LoadFont(Buf, 0, 16, #0, #255);π  SelectFont(0, 0);πend.πππ                                                                           88     01-27-9412:16ALL                      BAS VAN GAALEN           Better Julia Set         SWAG9402            15     Üd   {π>   Thanks for writing a working Pascal source.  Hopefully it willπ>   work with 640x480 resolution (320x200 is a bit grainy, specieallyπ>   with the default palette.)ππI changed Norbert's source a little. Now it looks nicer, and I believe it'sπeven a fraction faster (not sure, though, didn't time it):π}ππ{$G+,N+,E-} { if you have no CoPro, set E+ }ππ{ Reals   Complexπ   -1        0π   -0.1      0.8π    0.3     -0.5π   -1.139    0.238π}ππprogram Julia;πconst Gseg : word = $a000;πType real = double;πvar Cx,Cy,Xo,Yo,X1,Y1 : real; Mx,My,A,B,I,Orb : word;ππprocedure Pset(X,Y : word; C : byte); assembler;πasmπ  mov es,Gsegπ  mov ax,[Y]π  shl ax,6π  mov di,axπ  shl ax,2π  add di,axπ  add di,[X]π  mov al,[C]π  mov [es:di],alπend;ππfunction keypressed : boolean; assembler; asmπ  mov ah,0bh; int 21h; and al,0feh; end;ππprocedure Setpalette;πvar I : byte;πbeginπ  for I := 1 to 64 do beginπ    port[$3c8] := I;π    port[$3c9] := 10+I div 3;π    port[$3c9] := 10+I div 3;π    port[$3c9] := 15+round(I/1.306122449);π  end;πend;ππbeginπ  write('Real part: '); readln(Cx);π  write('Imaginary part: '); readln(Cy);π  asm mov ax,13h; int 10h; end;π  Setpalette;π  Mx := 319; My := 199;π  for A := 1 to Mx  doπ    for B := 1 to My do beginπ      Xo := -2+A/(Mx/4); { X complex plane coordinate }π      Yo :=  2-B/(My/4); { Y complex plane coordinate }π      Orb := 0; I := 0;π      repeatπ        X1 := Xo*Xo-Yo*Yo+Cx;π        Y1 := 2*Xo*Yo+Cy;π        Xo := X1;π        Yo := Y1;π        inc(I);π      until (I = 64) or (X1*X1+Y1*Y1 > 4);π      if I <> 64 then Orb := I;π      Pset(A,B,Orb); { Plot orbit }π    end;π  while not keypressed do;π  asm mov ax,3; int 10h; end;πend.ππ                                                                                                                   89     01-27-9412:16ALL                      COLIN BUCKLEY            Reding VGA Palettes      SWAG9402            16     Üd   {π>thanks for the example -- do you have any idea how to read the wholeπ>palette at one time, etc?ππHere you go...  It will work on all computers.  I do not use the 286πstring instructions, as they go too fast for some VL-Bus video cards causingπincorrect colours.  The first part waits for a full vertical retraceπbefore changing the colours to prevent "snow" at the top of the display onπslower computers.  The only time you'll see the snow is if you continuouslyπget or set the palette such as in a screen fade.π}ππProcedure VGAGetPalette(Pal:Pointer); Assembler;πAsmπ  { Wait for Vertical Retrace }π  MOV   DX,3DAhπ@@WaitNotVSync:π  IN    AL,DXπ(91 min left), (H)elp, More?   AND   AL,00001000bπ  JNZ   @@WaitNotVSyncπ@@WaitVSync:π  IN    AL,DXπ  AND   AL,00001000bπ  JZ    @@WaitVSyncππ  LES   DI,[Pal]                    {;ES:DI:=Palette Pointer           }π  XOR   AX,AX                       {;Start with DAC 0                 }π  MOV   CX,256                      {;End with DAC 255                 }π  MOV   DX,3C7h                     {; |Send Starting DAC register     }π  OUT   DX,AL                       {;/                                }π  INC   DX                          {; |DX:=DAC Data register          }π  INC   DX                          {;/                                }π  CLDπ@@DACLoop:π  IN    AL,DX                       {;Read Red Byte                    }π  STOSB                             {;Store Red Byte                   }π  IN    AL,DX                       {;Read Green Byte                  }π  STOSB                             {;Store Green Byte                 }π  IN    AL,DX                       {;Read Blue Byte                   }π  STOSB                             {;Store Blue Byte                  }π  LOOP  @@DACLoop                   {;Loop until CX=0                  }πEnd;ππ                                                                                    90     01-27-9412:21ALL                      JOHN IOZIA               Bank Switching           SWAG9402            2      Üd   πProcedure SetBank(b : byte); Assembler; {vesa}πAsmπ  mov AX, 4f05hπ  xor DX, DXπ  mov Dl, bπ  Int 10hπEND;ππ                   91     01-27-9412:21ALL                      SHAUN ROOT               Shading                  SWAG9402            12     Üd   πProgram Shading;ππUses CRT;ππVarπ  ColorNum, Y : Integer;ππ{--------------------------------------------------------------}ππprocedure setcolors;ππvarπ  Color : Byte;π  A     : Integer;ππBeginπ   For A := 1 to 63 doπ   Beginπ    port[$3c8]:=A;π    port[$3c9]:=1;π    port[$3c9]:=1;π    port[$3c9]:=A;π   End;πend;ππ{----------------------------------------------------------------}ππprocedure horizontal_line (x1,x2,y : integer;color:byte);ππVarπtemp,Counter : Integer;ππbeginπIF X1 > X2 thenπ  beginπ    Temp:=X1;π    X1:=X2;π    X2:=Temp;π  End;ππ     X1:=(y*320)+X1;π     X2:=(y*320)+X2;ππ For Counter := X1 to X2 doππ     mem[$A000:Counter]:=color;πEnd;π{---------------------------------------------------------------}πProcedure Init13h;    {Sets video to 320X200X256}ππBeginππASMπ MOV AH,00π MOV AL,13hπ int 10hπEnd;πEnd;π{----------------------------------------------------------------}πProcedure InitText;   {Sets video to Textmode}ππBeginππASMπ MOV AH,00π MOV AL,3π INT 10hπEnd;πEnd;π{--------------------------------------------------------------------------}ππBegin    {Main}πColorNum:=1;πinit13h;πSetcolors;πFor Y:=1 to 63 doπ  Beginπ   Horizontal_Line(80,239,Y,Colornum);π   ColorNum:=Colornum+1;π  End;πFor Y:=64 to 126 doπ  Beginπ   ColorNum:=ColorNum-1;π   Horizontal_Line(80,239,Y,ColorNum);π  End;πReadkey;πInitText;πEnd.π                                                                  92     01-27-9412:24ALL                      OLAF BARTELT             Vesa Unit                SWAG9402            28     Üd   {π> Any chance you can post that uVesa Unit? Or maybe a routine toπ> set up a Vesa mode, and a Vesa plotPixel routine?π}ππUNIT uVesa;                                    { (c) 1993 by NEBULA-Software }π     { Unterstützung des VESA-Standards      } { Olaf Bartelt & Oliver Carow }ππINTERFACE                                      { Interface-Teil der Unit     }πππTYPE tVesa = OBJECT                            { Objekt für VESA             }π               xmax, ymax : WORD;π               page       : WORD;π               switch_ptr : POINTER;ππ               CONSTRUCTOR init(modus : WORD);π               PROCEDURE   putpixel(x, y : WORD; c : BYTE);  { Longint    }π               FUNCTION    getpixel(x, y : LONGINT) : BYTE;  { wegen Berechn.}π             END;πVAR  vVesa : ^tVesa;πππCONST c640x400  = $100;                        { VESA-Modi                   }π      c640x480  = $101;π      c800x600  = $102;π      c1024x768 = $103;ππFUNCTION vesa_installed : BOOLEAN;πππIMPLEMENTATION                                 { Implementation-Teil d. Unit }ππUSES DOS, CRT;                                 { Units einbinden             }πππVAR regs   : REGISTERS;                        { benötigte Variablen         }πππFUNCTION vesa_installed : BOOLEAN;             { VESA-Treiber vorhanden?     }πBEGINπ  regs.AH := $4F; regs.AL := 0; INTR($10, regs);π  vesa_installed := regs.AL = $4F;πEND;πππCONSTRUCTOR tVesa.init(modus : WORD);πVAR mib  : ARRAY[0..255] OF BYTE;π    s, o : WORD;πBEGINπ  IF vesa_installed = FALSE THENπ  BEGINπ    WRITELN(#7, 'Kein VESA-Treiber installiert! / No VESA-driver installed!');π    HALT(1);π  END;ππ  regs.AX := $4F02; regs.BX := modus; INTR($10, regs);π  regs.AX := $4F01; regs.DI := SEG(mib); regs.ES := OFS(mib); INTR($10, regs);ππ  s := mib[$0C] * 256 + mib[$0D]; o := mib[$0E] * 256 + mib[$0F];π  switch_ptr := PTR(s, o);ππ  CASE modus OFπ    c640x400 : BEGIN xmax := 640; ymax := 400; END;π    c640x480 : BEGIN xmax := 640; ymax := 480; END;π    c800x600 : BEGIN xmax := 800; ymax := 600; END;π    c1024x768: BEGIN xmax := 1024; ymax := 768; END;π  END;ππ  page := 0;π  ASMπ    MOV AX, 4F05hπ    MOV DX, pageπ    INT 10hπ  END;πEND;πππPROCEDURE   tVesa.putpixel(x, y : WORD; c : BYTE);πVAR bank   : WORD;π    offs   : LONGINT;πBEGINπ  offs := LONGINT(y)*640 + x;     { SHL 9+SHL 7 ist auch nicht schneller!! }π  bank := offs SHR 16;π  offs := offs - (bank SHL 16);   { MOD 65536 ist langsamer!! }ππ  IF bank <> page THENπ  BEGINπ    page := bank;π    ASMπ      MOV AX, 4F05hπ      MOV DX, bankπ      INT 10hπ    END;π  END;ππ  ASMπ    MOV AX, 0A000hπ    MOV ES, AXπ    MOV DI, WORD(offs)π    MOV AL, cπ    MOV ES:[DI], ALπ  END;πEND;πππFUNCTION    tVesa.getpixel(x, y : LONGINT) : BYTE;πVAR bank   : WORD;π    offset : LONGINT;πBEGINπ  offset := y SHL 9+y SHL 7+x;π  bank := offset SHR 16;π  offset := offset - (bank SHL 16);ππ  IF bank <> page THENπ  BEGINπ    page := bank;π    ASMπ      MOV AX, 4F05hπ      MOV DX, bankπ      INT 10hπ    END;π  END;ππ  getpixel := MEM[$A000:offset];πEND;πππBEGINπ  NEW(vVesa);πEND.ππ{πThat routine could be faster if one implemented a bank switching routine byπdoing a far call to the vesa bios (the address can be received by a simpleπcall, I just hadn't had time yet to implement it - if you should do it,π*please* post the modified routine for me - thanx!)π}                                                                                                                      93     01-27-9412:25ALL                      SEAN PALMER              Vesa Unit 2!             SWAG9402            78     Üd   {πHere's some VESA routines. The drawing stuff is quite limited right nowπ(to pixels and horizontal lines in 256-color linear modes only) but itπdetects/sets/describes most everything else. Also no save/restore videoπstate yet. It uses direct VESA function calls instead of interrupts, andπtries to optimize where it puts the window based on what the routinesπwill be used for . . .π}ππ{VESA1.PAS}π{by Sean Palmer}π{with help from Ferraro and Olaf Bartlett}ππtypeπ  pModeList = ^tModeList;π  tModeList = Array [0..255] of word; {list of modes terminated by -1}π                                      {VESA modes are >=100h}ππ  modeAttrBits = (modeAvail,π                  modeExtendInfo,π                  modeBIOSsupport,π                  modeColor,π                  modeGraphics,π                  modeBit5,π                  modeBit6,π                  modeBit7,π                  modeBit8);ππ  winAttrBits  = (winSupported,π                  winReadable,π                  winWriteable);ππ  tMemModel    = (modelText,π                  modelCGA,π                  modelHerc,π                  model4Plane,π                  modelPacked,π                  modelModeX,π                  modelRGB);πππvarπ  VESAinfo : recordπ    signature : array [1..4] of char;π    version   : word;π    str       : pChar;π    caps      : longint;π    modeList  : pModeList;π    pad       : array [18..255] of byte;π  end;ππ  modeInfo : recordπ    attr           : set of modeAttrBits;π    winAAttr,π    winBAttr       : set of winAttrBits;π    winGranularity : word;  {in K}π    winSize        : word;         {in K}π    winASeg,π    winBSeg        : word; {segment to access window with}π    winFunct       : procedure;π    scanBytes      : word;       {bytes per scan line}π    extendedInfo   : recordπ      xRes, yRes : word;    {pixels}π      xCharSize,π      yCharSize  : byte;π      planes     : byte;π      bitsPixel  : byte;π      banks      : byte;π      memModel   : tMemModel;π      bankSize   : byte;  {in K}π    end;ππ    pad : array [29..255] of byte;π  end;ππ  xSize,π  ySize,π  xBytes     : word;π  bits       : byte;π  model      : tMemModel;π  window     : byte;π  winSeg     : word;π  granShifts : byte;π  winLo,π  winHi,π  winBytes,π  granMask   : longint;π  funct      : procedure;ππ  m, i : word;ππππfunction getVESAInfo : boolean; assembler;πasmπ  mov ax,4F00hπ  push dsπ  pop esπ  mov di,offset VESAinfoπ  int 10hπ  sub ax,004Fh  {make sure we got 004Fh back}π  cmp ax,1π  sbb al,alπ  cmp word ptr es:[di],'V'or('E'shl 8)  {signature should be 'VESA'}π  jne @@ERRπ  cmp word ptr es:[di+2],'S'or('A'shl 8)π  je @@Xπ @@ERR:π  mov al,0π @@X:πend;πππfunction getModeInfo(mode:word):boolean;assembler;asmπ mov ax,4F01hπ mov cx,modeπ push dsπ pop esπ mov di,offset modeInfoπ int 10hπ sub ax,004Fh   {make sure it's 004Fh}π cmp ax,1π sbb al,alπ end;πππ{if the VESA driver supports info on the regular VGA modes, add them to list}πprocedure includeStandardVGAModes;var p:^word;beginπ p:=pointer(VESAInfo.modeList);π while p^<>$FFFF do inc(p);π if getModeInfo($10) then begin p^:=$10; inc(p);end;π if getModeInfo($12) then begin p^:=$12; inc(p);end;π if getModeInfo($13) then begin p^:=$13; inc(p);end;π p^:=$FFFF;π end;πππfunction setMode(mode:word):boolean;var i:word;beginπ if getModeInfo(mode) then beginπ  with modeInfo do beginπ   if winSupported in winAAttr then begin window:=0; winSeg:=winASeg;endπ   else if winSupported in winBAttr then begin window:=1; winSeg:=winBSeg;endπ   else exit;  {you call this a VESA mode?}π   with extendedInfo do beginπ    xSize:=xRes; ySize:=yRes; xBytes:=scanBytes; bits:=bitsPixel;π    model:=memModel;π    end;π   winBytes:=longint(winSize)*1024;  {wraps to 0 if 64k}π   winLo:=0; winHi:=winBytes;π   i:=winGranularity;π   granShifts:=10; {for 1K}π   while not odd(i) do beginπ    i:=i shr 1;π    inc(granShifts);π    end;π   if i<>1 then begin setMode:=false;exit;end;  {granularity not power of 2}π   granMask:=(longint(1)shl granShifts)-1;π   funct:=winFunct;π   end;π  asmπ   mov ax,4F02hπ   mov bx,modeπ   int 10hπ   sub ax,004Fhπ   cmp ax,1π   sbb al,alπ   mov @RESULT,alπ   end;π  end;π end;ππfunction getMode:word;assembler;asm  {return -1 if error}π mov ax,4F03hπ int 10hπ cmp ax,004Fhπ je @@OKπ mov ax,-1π jmp @@Xπ@@OK: mov ax,bxπ@@X:π end;πππprocedure plot(x, y : word; c : byte);πvarπ  bank : word;π  offs : longint;πbeginπ  offs := longint(y) * xBytes + x;π  if (offs < winLo) or (offs >= winHi) thenπ  beginπ    winLo := (offs - (winBytes shr 1)) and not granMask;π    winHi := winLo + winBytes;π    bank  := winLo shr granShifts;π    asmπ      mov bl, windowπ      mov dx, bankπ      call [funct]π    end;π  end;π  mem[winSeg : word(offs) - word(winLo)] := c;πend;ππprocedure hLin(x,x2,y:word;c:byte);πvar bank,w:word; offs:longint;πbeginπ  w:=x2-x;π  offs:=longint(y)*xBytes+x;π  if (offs<winLo)or(offs+w>=winHi) then beginπ   winLo:=offs and not granMask;π   winHi:=winLo+winBytes;π   bank:=winLo shr granShifts;π   asmπ    mov bl,windowπ    mov dx,bankπ    call [funct]π    end;π   end;π  fillChar(mem[winSeg:word(offs)-word(winLo)],w,c);π  end;ππfunction scrn(x,y:word):byte;πvar bank:word; offs:longint;πbeginπ  offs:=longint(y)*xBytes+x;π  if (offs<winLo)or(offs>=winHi) then beginπ   winLo:=(offs-(winBytes shr 1))and not granMask;π   winHi:=winLo+winBytes;πbank:=winLo shr granShifts;π   asmπ    mov bl,windowπ    mov dx,bankπ    call [funct]π    end;π   end;π  scrn:=mem[winSeg:word(offs)-word(winLo)];π  end;ππ{will find a color graphics mode that matches parms}π{if parm is 0, finds best mode for that parm}πfunction findMode(x,y:word;model:tMemModel;nBits,nPlanes,nBanks:byte):word;πvar p:^word; m:word; gx,gy,gb,lp,lb:word;πbeginπ gx:=0;gy:=0;gb:=0;lp:=255;lb:=255;π p:=pointer(VESAInfo.modeList);π m:=$FFFF;π while p^<>$FFFF do beginπ  if getModeInfo(p^) thenπ   with modeInfo doπ    if attr+[modeAvail,modeExtendInfo,modeColor,modeGraphics]=attr thenπ     with extendedInfo doπif ((xRes=x)or((x=0)and(gx<=xRes)))π      and((yRes=y)or((y=0)and(gy<=yRes)))π      and(memModel=model)π      and((bitsPixel=nBits)or((nBits=0)and(gb<=bitsPixel)))π      and((planes=nPlanes)or((nPlanes=0)and(lp>=planes)))π      and((banks=nBanks)or((nBanks=0)and(lb>=banks)))π      then beginπ       gx:=xRes;gy:=yRes;gb:=bitsPixel;lp:=planes;lb:=banks;π       m:=p^;π       end;π  inc(p);π  end;π if m<>$FFFF then getModeInfo(m);π findMode:=m;  {0FFFFh if not found. Try a standard mode number then.}π end;πππprocedure displayVESAInfo;ππtypeπ  string2=string[2];π  string4=string[4];π  string8=string[8];πconstπ  modelStr : array[tMemModel]of pChar=π    ('Text','CGA','Hercules','EGA','Linear','mode X','RGB');πvarπ  p:^word;ππ  function hexB(n:byte):string2; assembler;asmπ   les di,@RESULT;                    {adr of function result}π  cld; mov al,2; stosb;              {set len}π   mov al,n; mov ah,al;               {save it}π   shr al,1; shr al,1; shr al,1; shr al,1; {high nibble}π   add al,$90; daa; adc al,$40; daa;  {convert hex nibble to ASCII}π   stosb;π   mov al,ah; and al,$F;              {low nibble}π   add al,$90; daa; adc al,$40; daa;π   stosb;π   end;ππ  function hexW(n:word):string4;π  beginπ    hexW:=hexB(hi(n))+hexB(lo(n));π  end;ππ  function hexL(n:longint):string8;π  beginπ    hexL:=hexW(n shr 16)+hexW(n);π  end;ππbeginπ if getVESAInfo thenπ  with VESAinfo do beginπ   includeStandardVGAModes;π   writeln(signature,' Version ',hexB(hi(version)),'.',hexB(version));π   writeln(str);π   writeln('Capabilities: $',hexL(caps));π   p:=pointer(modeList);πwhile p^<>$FFFF do beginπ    write('Mode $',hexW(p^),' = ');π    if getModeInfo(p^) thenπ     with modeInfo do beginπ      if not(modeAvail in attr) then write('Unavailable-');π      if modeColor in attr then write('Color ') else write('Mono ');π      if modeGraphics in attr then write('Graphics') else write('Text');π      if modeBIOSSupport in attr then write('-BIOSsupport');π      writeln;π      if modeExtendInfo in attr thenπ       with extendedInfo do beginπ        write('  ',xRes,'x',yRes,', ',bitsPixel,' bits, ',modelStr[memModel],π                ', ',scanBytes,' bytes per row');π        if not (modeGraphics in attr) thenπ         write(^M^J'  Character size ',xCharSize,'x',yCharSize);π        if planes>1 then write(', ',planes,' planes');π        if banks>1 then write(', ',banks,' banks of ',bankSize,'K');π        writeln;π        endπ      else write('  No extended info available');π      if winSupported in winAAttr then beginπ       write('  Window A: ');π       if winReadable in winAAttr then write('R');πif winWriteable in winAAttr then write('W');π       writeln(' at segment $',hexW(winASeg),', ',winSize,'K, granular by 'π               ,winGranularity,'K, function at $',hexL(longint(@winFunct)));π       end;π      if winSupported in winBAttr then beginπ       write('  Window B: ');π       if winReadable in winBAttr then write('R');π       if winWriteable in winBAttr then write('W');π       writeln(' at segment $',hexW(winBSeg),', ',winSize,'K, granular by 'π               ,winGranularity,'K, function at $',hexL(longint(@winFunct)));π       end;π      endπ    else writeln('ERROR');π    inc(p);π    end;π   endπ else writeln('No VESA driver found');π end;ππbeginπ  writeln;π  displayVESAInfo;π  readln;π  m := findMode(0, 0, modelPacked, 8, 1, 1);π  getModeInfo(m);π  if m <> $FFFF thenπ  with modeInfo.extendedInfo doπ    writeln('Found ', xRes, 'x', yRes, 'x',π            longint(1) shl bitsPixel, ' mode ', m)π  elseπ    exit;ππ  setMode(m);π  for i := 1 to 10000 doπ    plot(random(xSize), random(ySize), random(256));ππ  readln;ππ  for i := 1 to 200 doπ    hlin(random(xSize shr 1), random(xSize shr 1) + xSize shr 1,π                random(ySize), random(256));π  readln;ππ  asmπ    mov ax, 3hπ    int 10hπ  end;πend.π                                                           94     01-27-9417:46ALL                      DARRYL FRIESEN           High Intensity BackgroundSWAG9402            36     Üd   UNIT Lite;π{***************************************************************************}π{*                                                                         *}π{*  Unit Lite - Routines to produce high intensity backgrounds             *}π{*                                                                         *}π{*                         AUTHOR:  Darryl Friesen                         *}π{*                        CREATED:  01-JUN-1991                            *}π{*                  LAST MODIFIED:  06-JAN-1992                            *}π{*                CURRENT VERSION:  Version 1.0.1                          *}π{*                 COMPILED USING:  Turbo Pascal 6.0                       *}π{*                                                                         *}π{*                                                                         *}π{*  UNIT DEPENDANCIES:                                                     *}π{*                                                                         *}π{*           INTERFACE:  [none]                                            *}π{*      IMPLEMENTATION:  DOS                                               *}π{*                                                                         *}π{***************************************************************************}π{*                                                                         *}π{*  REVISION HISTORY                                                       *}π{*  ----------------                                                       *}π{*  01-JUN-1991  - Creation of VERSION 1.00                                *}π{*  06-JAN-1992  - Version 1.0.1                                           *}π{*                   Fixed a bug in the BlinkOn routine.  On a VGA machine *}π{*                   the blink state was turned off instead of on.         *}π{*                                                                         *}π{***************************************************************************}ππ{=========================================================================}πINTERFACEπ{=========================================================================}ππProcedure BlinkOff;πProcedure BlinkOn;πFunction  EGA: Boolean;πππ{=========================================================================}πIMPLEMENTATIONπ{=========================================================================}ππUSES DOS;πππ{================================================================}πPROCEDURE SetBlinkState(State : BOOLEAN);π{================================================================}π{================================================================}ππVARπ  ModeReg     : BYTE;π  ModeRegPort : WORD;ππBeginπ   INLINE($FA); { CLI }π   ModeRegPort:=MEMW[$0040:$0063]+4;π   ModeReg:=MEM[$0040:$0065];π   If State Thenπ     ModeReg:=ModeReg OR $20π   Elseπ     ModeReg:=ModeReg AND $DF;ππ   Port[ModeRegPort] := ModeReg;π   MEM[$0040:$0065]:= ModeReg;π   INLINE($FB) { STI }πEND;πππ{================================================================}πFUNCTION EGA : BOOLEAN;π{================================================================}π{================================================================}ππVARπ  Regs : Registers;ππBeginπ  Regs.AH:=$12;π  Regs.BX:=$FF10;π  INTR( $10, Regs );π  EGA := (Regs.BX AND $FEFC=0)πEnd;πππ{================================================================}πPROCEDURE SetEGABlinkState(State : BOOLEAN);π{================================================================}π{================================================================}ππVARπ  Regs: Registers;ππBeginπ  Regs.AX := $1003;π  Regs.BL := ORD(State);π  INTR( $10, Regs )πEnd;πππ{================================================================}πPROCEDURE BlinkOn;π{================================================================}π{================================================================}ππBeginπ  If EGA Thenπ    SetEGABlinkState(TRUE)π  Elseπ    SetBlinkState(TRUE)πEnd;πππ{================================================================}πPROCEDURE BlinkOff;π{================================================================}π{================================================================}ππBeginπ  If EGA Thenπ    SetEGABlinkState(FALSE)π  Elseπ    SetBlinkState(FALSE)πEnd;πππ{=========================================================================}ππEnd.π                                                                  95     02-03-9410:50ALL                      SWAG SUPPORT TEAM        Detect EGA/VGA in ASM    SWAG9402            7      Üd   program EGAORVGA;π{For TP 6.0 because of assembler code.  Put these functions into a UNITπ for general use.}ππ  FUNCTION IsEGAorVGA : Boolean; Assembler;π  ASMπ    MOV AH, 12hπ    MOV BL, 10hπ    INT 10hπ    MOV AL, 0π    CMP BH, 1π    JA @Nopeπ    CMP BL, 3π    JA @Nopeπ    INC ALπ    @Nope:π  END;ππ  FUNCTION IsVGA : Boolean; Assembler;π  ASMπ    MOV AH, 12hπ    MOV AL, 00hπ    MOV BL, 36hπ    INT 10hπ    MOV AH, 0π    CMP AL, 12hπ    JNZ @Nopeπ    INC AHπ    @Nope:π  END;ππbeginπ  If IsEGAorVGA thenπ  beginπ    Writeln('Programs supporting EGA or VGA will run on this computer.');π    If IsVGA thenπ      Writeln('VGA detected.')π    Elseπ      Writeln('EGA detected.')π  endπ  Elseπ      Writeln('No EGA or VGA detected!');πend.π                             96     02-03-9416:15ALL                      ROB PERELMAN             Change EGA/VGA Font Char SWAG9402            16     Üd   π{OK...for awhile I've been saying I'm going to post my unit for changingπcharacters...well today's the day.  This unit has one procedure calledπProcessChar.  You pass ProcessChar the ordinal value of the characterπyou wish to process (between 0 and 255), the data that holds your newπcharacter or where you want to load the existing character, and if youπwant to load it or save it.  There are also four constants that simulateπa copyright symbol.  One is bigger than the other (that's the onlyπdifference).  You can replace characters with the copyright symbol soπeffectively you can have a legal C-in-a-circle in text mode!!  Although,πI do not know if this is actually legal, so don't mark my words... }πππUnit ModChar;ππ      {                       Unit Name: ModChar                       }π      {                      Author: Rob Perelman                      }ππInterfaceππConst LoadChar=False;π      SaveChar=True;ππType CharPic=Array[1..16] of Byte;ππConst CRLeft: CharPic=(0,31,48,99,198,140,140,140,140,140,140,198,99,48,π        31,0);π      CRRight: CharPic=(0,248,12,198,99,1,1,1,1,1,33,99,198,12,248,0);π      BigCRLeft: CharPic=(31,48,96,195,134,140,140,140,140,140,140,134,π        195,96,48,31);π      BigCRRight: CharPic=(248,12,6,195,97,1,1,1,1,1,33,97,195,6,12,π        248);ππ  Procedure ProcessChar(CharNum: Byte; var Pic: CharPic; Which: Boolean);ππImplementationππUses Dos;ππProcedure ProcessChar(CharNum: Byte; var Pic: CharPic; Which: Boolean);πBeginπ  Inline($FA);π  PortW[$3C4]:=$0402;π  PortW[$3C4]:=$0704;π  PortW[$3CE]:=$0204;π  PortW[$3CE]:=$0005;π  PortW[$3CE]:=$0006;π  If Which then Move(Pic, Mem[$A000:CharNum*32], SizeOf(CharPic))π           Else Move(Mem[$A000:CharNum*32], Pic, SizeOf(CharPic));π  PortW[$3C4]:=$0302;π  PortW[$3C4]:=$0304;π  PortW[$3CE]:=$0004;π  PortW[$3CE]:=$1005;π  PortW[$3CE]:=$0E06;π  Inline($FB);πEnd;ππEnd.π                                             97     02-05-9407:55ALL                      MIRKO HOLZER             Graphical Fades and PaletSWAG9402            14     Üd   {πhere are some routines, with which you can fade the screen in/out.πHow to use:ππ  Fade out: Get the original palette with the GetPal(0,255,pal) command.π            (Of course you have to allocate 768 Bytes Memory for the palπ             pointer first).π            Then call FadePal(Pal,true,steps) and the screen will beπ            faded out.ππ  Fade in: Just pass the target-pal. to the Fade-Routine:ππ             FadePal(Targetpal,false,steps).ππNote: Low step-rates mean high fading speed. }πππProcedure SetPal(Start: byte; Anz: word; pal: pointer); assembler;πasmπ  push dsπ  cldπ  lds si,palπ  mov dx,3c8hπ  mov al,startπ  out dx,alπ  inc dxπ  mov ax,anzπ  mov cx,axπ  add cx,axπ  add cx,axπ  rep outsbπ  pop dsπend;πππProcedure GetPal(Start: byte; Anz: word; pal: pointer); assembler;πasmπ  les di,palπ  mov al,startπ  mov dx,3c7hπ  out dx,alπ  inc dxπ  mov ax,anzπ  mov cx,axπ  add cx,axπ  add cx,axππ  mov dx,3c9hπ  cldπ  rep insbπend;πππProcedure FadePal(OrigPal : pPal; FadeOut : Boolean; steps: byte);πVarπ  r,g,b   : byte;π  Fade    : word;π  Pct     : real;π  I       : byte;πbeginπ  For Fade := 0 to Steps do beginπ    Pct := Fade / Steps;π    If FadeOut then Pct := 1 - Pct;π    For I := 0 to 255 do beginπ      r := Round(OrigPalI].R * Pct);π      g := Round(OrigPalI].G * Pct);π      b := Round(OrigPalI].B * Pct);π      asmπ        mov dx,3c8hπ        mov al,iπ        out dx,alπ        mov dx,3c9hπ        mov al,rπ        out dx,alπ        mov al,gπ        out dx,alπ        mov al,bπ        out dx,alπ      end;π    end;π  end;πend;π                                                                                                 98     02-05-9407:57ALL                      BAS VAN GAALEN           Screen Sweep             SWAG9402            18     Üd   {π WA> I was wondering if anyone could help me out here.  What Iπ WA> would like is a program that sweeps my screen clear or to aπ WA> color then self terminates. Something similar to a radarπ WA> sweep.  I have a limited knowledge of TP 7.ππI guess everyone who programs in Pascal has a limited knowledge of TP.ππAnyway, this is what I just made:ππ--- cut here --- }ππprogram screensweep;πuses crt;πconst vseg : word = $b800; fillchar = 32;πvar x,i,maxx,maxy : integer;ππprocedure retrace;πbeginπ  while (port[$3da] and 8) <> 0 do;π  while (port[$3da] and 8) = 0 do;πend;ππprocedure plot(x,y : integer); beginπ  mem[vseg:y*160+x+x] := fillchar; end;ππprocedure line(x,y,x2,y2 : integer);πvar d,dx,dy,ai,bi,xi,yi : integer;πbeginπ  if x < x2 then begin xi := 1; dx := x2-x; endπ  else begin xi := -1; dx := x-x2; end;π  if y < y2 then begin yi := 1; dy := y2-y; endπ  else begin yi := -1; dy := y-y2; end;π  plot(x,y);π  if dx > dy then beginπ    ai := (dy-dx)*2; bi := dy*2; d := bi-dx;π    repeatπ      if d >= 0 then begin inc(y,yi); inc(d,ai); end else inc(d,bi);π      inc(x,xi); plot(x,y);π    until x = x2;π  endπ  else beginπ    ai := (dx-dy)*2; bi := dx*2; d := bi-dy;π    repeatπ      if d >= 0 then begin inc(x,xi); inc(d,ai); end else inc(d,bi);π      inc(y,yi); plot(x,y);π    until y = y2;π  end;πend;ππbeginπ  if lastmode = 7 then vseg := $b000;π  maxx := lo(windmax); maxy := hi(windmax);ππ  { fill the screen with characters added by G.DAVIS}π  for i := 1 to SUCC(maxy) doπ  beginπ  gotoxy(1,i);π  for x := 1 to SUCC(maxx) do write(Chr(X+32));π  end;ππ  for i := 0 to maxx do beginπ    retrace;π    line(maxx div 2,maxy div 2,i,0);π  end;π  for i := 0 to maxy do beginπ    retrace;π    line(maxx div 2,maxy div 2,maxx,i);π  end;π  for i := maxx downto 0 do beginπ    retrace;π    line(maxx div 2,maxy div 2,i,maxy);π  end;π  for i := maxy downto 0 do beginπ    retrace;π    line(maxx div 2,maxy div 2,0,i);π  end;πend.ππ--- cut here ---ππThe line-routine was taken from Sean Palmers 320x240-mode-x unit (just a littleπre-idented. ;-))ππ                                                                                                                           99     02-09-9411:49ALL                      BAS VAN GAALEN           Video Addresses          SWAG9402            14     Üd   πCONSTπ  { Constants for bit plane, video page, and memory block sizes: }π  MonoBase      = $B000;     { Segment offset of MDA/Herc video buffer  }π  CGABase       = $B800;     { Segment offset of CGA video buffer       }π  EGAVGABase    = $A000;     { Segment offset of EGA/VGA video buffer   }ππ  { Size of one video page buffer in modes 0..3: }π  TxtVidPageSize   : Array[0..3] of Word = ($800,$800,$1000,$1000);π  { Actual number of bytes used in these buffers }π  TxtVidPageFilled : Array[0..3] of Word = (2000,2000,4000,4000);ππ  CGAMemBankSize    = $2000; { Size of one CGA memory bank in modes 4, 5 and 6}π  CGAMemBankFilled  = 8000;  { Actual number of bytes used in that bank       }π  HercMemBankSize   = $2000; { Size of one Hercules memory bank               }π  HercMemBankFilled = 7830;  { Actual number of bytes used in that bank       }π  VGA256MemBankSize = 64000;ππ  MDAPageSize   = 4000;      { Size of MDA text buffer }π  V400PageSize  = 32000;     { Size video page in V400VM mode }πππFUNCTION GetVidMode: Byte;π  VAR Regs : Registers;π  BEGINπ    Regs.AH := $0F;π    Intr($10,Regs);π    GetVidMode := Regs.AL;π  END; { GetVidMode }πππFUNCTION VidAddress: Pointer;π  VAR VM: Byte;π  BEGINπ    VM := GetVidMode;π    CASE VM OFπ      0..3   : VidAddress := Ptr(CGABase,GetVisualPage * TxtVidPageSize[VM]);π      4..6   : VidAddress := Ptr(CGABase,0);π      7      : VidAddress := Ptr(MonoBase,0);  { Also HercVM }π      13..19 : VidAddress := Ptr(EGAVGABase,0);π      V400VM : VidAddress := Ptr(EGAVGABase,GetVisualPage * V400PageSize);π      ELSE     DumBool := CheckError(TRUE,'VIDADDRESS',68);π    END;π  END; { VidAddress }π                100    02-09-9411:49ALL                      WOLFGANG FRINK           Fade and Palette RoutinesSWAG9402            17     Üd   π{$M 16384,0,255360}πuses Dos,crt;ππprocedure waitretrace;assembler; {wait for next vertical retrace}πasmπ  mov dx,$3DAπ  @V1: in al,dx; test al,8; jz @v1;π  @V2: in al,dx; test al,8; jnz @v2;πend;ππtypeπ  rgb = record r, g, b : byte; end;π  paltype = array[0..255]of rgb;πvarπ  i : integer;π  pal : paltype;ππprocedure get_color(var pal : paltype); {save palette}πvarπ  i : integer;πbeginπ  port[$3C7] := $00;π  for i:= 0 to 255 do beginπ    pal[i].r := port[$3C9];π    pal[i].g := port[$3C9];π    pal[i].b := port[$3C9];π  end;πend;ππprocedure set_intensity(intensity : byte);πvarπ  i : integer;πbeginπ  port[$3C8] := $00;π  for i := 0 to 255 do beginπ    port[$3C9] := pal[i].r*intensity div 63;π    port[$3C9] := pal[i].g*intensity div 63;π    port[$3C9] := pal[i].b*intensity div 63;π  end;πend;ππprocedure set_to_color(r,g,b,h: integer);πvarπ  i : integer;πbeginπ  port[$3C8] := $00;π  for i := 0 to 255 do beginπ    port[$3C9] := pal[i].r+(r-pal[i].r)*h div 63;π    port[$3C9] := pal[i].g+(g-pal[i].g)*h div 63;π    port[$3C9] := pal[i].b+(b-pal[i].b)*h div 63;π  end;πend;ππprocedure fade_out(t : integer); {fades from pal to black}πbeginπ  for i := 63 downto 0 do begin waitretrace; set_intensity(i); delay(t); end;πend;ππprocedure fade_in(t : integer);  {fades from black to pal}πbeginπ  for i := 0 to 63 do begin waitretrace; set_intensity(i); delay(t); end;πend;ππprocedure flash_in(r,b,g: byte;t : integer); {fades from pal to color}πbeginπ  for i := 0 to 63 do begin waitretrace; set_to_color(r,b,g,i); delay(t); end;πend;ππprocedure flash_out(r,g,b: byte;t : integer); {fades from color to pal}πbeginπ  for i := 63 downto 0 do begin waitretrace;set_to_color(r,g,b,i);delay(t);end;πend;ππBEGINππ  { Put some stuff on the screen }π  SwapVectors;π  Exec(GetEnv('COMSPEC'),' /c dir \ /w');π  SwapVectors;π  Get_Color(pal);π  fade_out(50);π  fade_in(50);π  Flash_Out(100,16,32,50);π  Flash_In (100,16,32,50);π  ASMπ  MOV AX,00003h   {reset to textmode}π  INT 010hπ  END;ππEND.                                                              101    02-18-9407:00ALL                      BOB SWART                VGA/EGA Multi Line Modes SWAG9402            30     Üd   {πCheck out Hax #179 from PC Techniques vol.4 no.6 Feb/Mar issue (page 70),π(coincidently written by me), where a small program is presented that'll notπonly detect whether a VGA adapter is installed, but is also capable of puttingπthe screen in 80x12, 80x14, 80x21, 80x25, 80x28, 80x43 or 80x50 mode...}ππ{$IFDEF VER70}π{$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,P-,Q-,R-,S+,T-,V-,X-}π{$ELSE}π{$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,R-,S+,V-,X-}π{$ENDIF}π{$M 1024,0,0}π{π  VGA 3.0π  Borland Pascal (Objects) 7.01π  Copr. (c) 7-17-1993 DwarFools & Consultancy drs. Robert E. Swartπ                      P.O. box 799π                      5702 NP  Helmondπ                      The Netherlandsππ  Code size: 3248 Bytesπ  Data size:  676 Bytesπ}πConstπ  VGAInside: Boolean = False; { Assume no VGA-card is installed }ππvar VGALines,i: Integer;ππ    procedure Lines200;π    { Set 200 scanlines on VGA display }π    InLine(π      $B8/$03/$00/  {  mov   AX,$0003  }π      $CD/$10/      {  int   $10       }π      $B8/$00/$12/  {  mov   AX,$1200  }π      $B3/$30/      {  mov   BL,$30    }π      $CD/$10);     {  int   $10       }ππ    procedure Lines350;π    { Set 350 scanlines on VGA display }π    InLine(π      $B8/$03/$00/  {  mov   AX,$0003  }π      $CD/$10/      {  int   $10       }π      $B8/$01/$12/  {  mov   AX,$1201  }π      $B3/$30/      {  mov   BL,$30    }π      $CD/$10);     {  int   $10       }ππ    procedure Lines400;π    { Set 400 scanlines on VGA display }π    InLine(π      $B8/$03/$00/  {  mov   AX,$0003  }π      $CD/$10/      {  int   $10       }π      $B8/$02/$12/  {  mov   AX,$1202  }π      $B3/$30/      {  mov   BL,$30    }π      $CD/$10);     {  int   $10       }ππ    procedure Font8x8;π    { Set 8x8 CGA-font on VGA display. }π    InLine(π      $B8/$03/$00/  {  mov   AX,$0003  }π      $CD/$10/      {  int   $10       }π      $B8/$12/$11/  {  mov   AX,$1112  }π      $B3/$00/      {  mov   BL,0      }π      $CD/$10);     {  int   $10       }ππ    procedure Font8x14;π    { Set 8x14 EGA-font on VGA display }π    InLine(π      $B8/$03/$00/  {  mov   AX,$0003  }π      $CD/$10/      {  int   $10       }π      $B8/$11/$11/  {  mov   AX,$1111  }π      $B3/$00/      {  mov   BL,0      }π      $CD/$10);     {  int   $10       }ππ    procedure Font8x16;π    { Set 8x16 VGA-font on VGA display }π    InLine(π      $B8/$03/$00/  {  mov   AX,$0003  }π      $CD/$10/      {  int   $10       }π      $B8/$14/$11/  {  mov   AX,$1114  }π      $B3/$00/      {  mov   BL,0      }π      $CD/$10);     {  int   $10       }πππbeginπ  writeln('VGALines 3.0 (c) 1993 DwarFools & Consultancy' +π                         ', by drs. Robert E. Swart.'#13#10);π  ASM { Detect VGA display }π        mov   AX,$0F00π        int   $10π        cmp   AL,$03   { TextMode = CO80 }π        jne   @Endπ        mov   AX,$1C00π        mov   CX,$0007π        int   $10π        cmp   AL,$1Cπ        jne   @Endπ        mov   VGAInside,True { VGA display installed }π  @End:π  end { VGA display };ππ  Val(ParamStr(1),VGALines,i);ππ  if not ((ParamCount >= 1) and VGAInside and (i = 0) andπ          (VGALines in [12,14,21,25,28,43,50])) thenπ  beginπ    writeln('Usage: VGALines #Lines [test]'#13#10);π    writeln('Where #Lines is any of [12,14,21,25,28,43,50]':52);π    if not VGAInside thenπ      writeln(#13#10'Error: VGA display required!');π    Haltπ  end;ππ  case VGALines of { first set scan-lines }π  12,14: Lines200;π  21,43: Lines350;π    else Lines400π  end;ππ  case VGALines of { then select the font }π  43,50: Font8x8;π  14,28: Font8x14;π    else Font8x16π  end;ππ  if ParamCount > 1 then { test parameter is used }π  beginπ    for i:=0 to VGALines-1 do writeln(i);π    write(VGALines,' lines set.')π  endπend.π