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

    {$X+}
    uses crt;

    type
     ModeInfoBlock = record
            ModeAttributes     : word;    { mode attributes                    }
            WinAAttributes     : byte;    { window A attributes                }
            WinBAttributes     : byte;    { window B attributes                }
            WinGranularity     : word;    { window granularity                 }
            WinSize            : word;    { window size                        }
            WinASegment        : word;    { window A start segment             }
            WinBSegment        : word;    { window B start segment             }
            WinFuncPtr         : pointer; { pointer to windor function         }
            BytesPerScanLine   : word;    { bytes per scan line                }
            XResolution        : word;    { horizontal resolution              }
            YResolution        : word;    { vertical resolution                }
            XCharSize          : byte;    { character cell width               }
            YCharSize          : byte;    { character cell height              }
            NumberOfPlanes     : byte;    { number of memory planes            }
            BitsPerPixel       : byte;    { bits per pixel                     }
            NumberOfBanks      : byte;    { number of banks                    }
            MemoryModel        : byte;    { memory model type                  }
            BankSize           : byte;    { bank size in kb                    }
            NumberOfImagePages : byte;    { number of images                   }
            Reserved           : byte;    { reserved for page function         }
            RedMaskSize        : byte;    { size of direct color red mask      }
            RedFieldPosition   : byte;    { bit position of LSB of red mask    }
            GreenMaskSize      : byte;    { size of direct color green mask    }
            GreenFieldPosition : byte;    { bit position of LSB of green mask  }
            BlueMaskSize       : byte;    { size of direct color blue mask     }
            BlueFieldPosition  : byte;    { bit position of LSB of blue mask   }
            RsvdMaskSize       : byte;    { size of direct color reserved mask }
            DirectColorModeInfo: byte;    { Direct Color mode attributes       }
            Reserved2          : array[1..216] of byte; { remainder            }
           end;
     Mogis = ^ModeInfoBlock;

    var
     modeinfo   : Mogis;
     CurBank, i : integer;
     p          : ^pointer;

    procedure GetModeInfo(mode : word; var block : modeinfoblock); Assembler;
    asm
       mov     ax, 4F01h
       mov     cx, mode
       les     di, block
       int     10h
    end;

    procedure BankSwitch(bank : integer); Assembler;
    asm
       mov     ax, bank
       cmp     CurBank, ax
       je      @end
       mov     CurBank, ax
       mov     ax, 4F05h
       xor     bx, bx
       mov     dx, bank
       call    p
     @end:
    end;

    procedure SetVesaMode(mode : word); Assembler;
    asm
       mov     ax, 4F02h
       mov     bx, mode
       int     10h
    end;

    procedure SetText; Assembler;
    asm
       mov     ax, 3
       int     10h
    end;

    begin
     CurBank := 0;
     SetVesaMode($101);
     GetMem(modeinfo, 256);
     GetModeInfo($101, modeinfo^);
     p := modeinfo^.winfuncptr;
     for i := 0 to 4 do
      begin
       BankSwitch(i);
       Fillchar(mem[$a000:0000], $FFFF, i+1);
      end;
     ReadKey;
     SetText;
    end.

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