Files
Arhitektura-i-Kompajleri/Computer hardware/VGA documents/SUPERVGA.PAS
T
2026-05-29 00:39:46 +02:00

2128 lines
64 KiB
ObjectPascal

unit supervga;
interface
uses dos,crt;
{$i defvga.pas} {Definitions}
{$i bitblt.pas}
var
curbank:word; {The current bank number. Set by SetBank}
vgran:word;
{Sets the Bank registers in units of 64Kbytes. If the chip has separate
Read/Write Bank registers, both are set}
procedure setbank(bank:word);
var x:word;
l:longint;
begin
if bank=curbank then exit; {Only set bank if diff. from current value}
vseg:=SegA000;
curbank:=bank;
case cv.chip of
__Acer:begin {Read/Write banks or 32K banks?}
wrinx(GRC,$10,bank);
wrinx(GRC,$11,bank);
end;
__ahead:if cv.version=AH_B then wrinx(GRC,13,bank*17)
else begin
wrinx(GRC,13,bank shr 1);
x:=inp($3cc) and $df;
if odd(bank) then inc(x,32);
outp($3c2,x);
end;
__ALG:begin
outp($3d7,bank);
outp($3D6,bank);
end;
__Alli:begin
if mem[SegA000:$D8]=0 then;
outpw(SEQ,$1210);
setinx(SEQ,$1C,8);
modinx(SEQ,$1B,7,1);
memw[SegA000:$C0]:=bank shl 4;
clrinx(SEQ,$1B,7);
clrinx(SEQ,$1C,8);
end;
__ARK:begin
wrinx(SEQ,$15,bank);
wrinx(SEQ,$16,bank);
end;
__Mach32:begin
x:=(bank and 15)*$22; {Roll bank nbr into bit 0}
wrinx(cv.IOadr,$B2,hi(x) or lo(x));
modinx(cv.IOadr,$AE,$F,(bank shr 4)*5);
end;
__Mach64:begin
bank:=bank*2;
outp($56EC,bank);
outp($56EE,bank+1);
outp($5AEC,bank);
outp($56EE,bank+1);
end;
__ati:begin
if cv.version=ATI_18800 then
modinx(cv.IOadr,$B2,$1E,bank shl 1)
else begin
x:=(bank and 15)*$22; {Roll bank nbr into bit 0}
wrinx(cv.IOadr,$B2,hi(x) or lo(x));
end;
if cv.version>=ATI_GUP_3 then
modinx(cv.IOadr,$AE,$F,(bank shr 4)*5);
end;
__chips:if (cv.version<=CT_457) then wrinx(cv.IOadr,$B,bank)
else begin
if memmode<=_pl4 then bank:=bank shl 2;
if cv.version<>CT_452 then bank:=bank shl 2;
wrinx(cv.IOadr,$10,bank shl 2);
if cv.Version=CT_64300 then
modinx(cv.IOadr,$C,$10,bank shr 2);
end;
__cir54:begin
if (rdinx(GRC,$B) and 32)=0 then bank:=bank shl 2;
wrinx(GRC,9,bank shl 2);
end;
__cir64:begin
bank:=bank shl 4;
wrinx(GRC,$E,bank);
wrinx(GRC,$F,bank);
end;
__compaq:begin
wrinx(GRC,$F,5);
bank:=bank shl 1;
if (cv.Version>=CPQ_QV1024) and
((inp($23C7) and $10)>0) then x:=1
else x:=3;
if (cv.version=CPQ_AVGA) and (memmode=_PL4) then x:=5;
wrinx(GRC,$45,bank shl x);
if (rdinx(GRC,$40) and 1)>0 then inc(bank);
wrinx(GRC,$46,(bank) shl x);
end;
__everex:begin
x:=inp($3CC) and $DF;
if (bank and 2)>0 then inc(x,32);
outp($3C2,x);
modinx(SEQ,8,$80,bank shl 7);
end;
__genoa:wrinx(SEQ,6,bank*9+$40);
__HMC:begin
if memmode=_p8 then modinx(SEQ,$EE,$70,bank shl 4)
else if bank=0 then vseg:=SegA000 else vseg:=SegB000;
end;
__Matrox:begin
if memmode<=_pl4 then bank:=bank*4;
modinx($3DE,9,$F,bank);
end;
__mxic:wrinx(SEQ,$c5,bank*17);
__ncr:begin
if memmode<=_pl4 then bank:=bank shl 2;
wrinx(SEQ,$18,bank shl 2);
wrinx(SEQ,$1C,bank shl 2);
end;
__oak:if cv.Version<=OAK_083 then wrinx($3DE,$11,bank*17)
else begin
wrinx($3DE,$23,bank);
wrinx($3DE,$24,bank);
end;
__WD:begin
wrinx(GRC,9,bank shl 4);
wrinx(GRC,$A,bank shl 4);
if cv.version=WD_90c33 then
modinx(SEQ,$14,$C0,((bank shr 4) and 1)*$C0);
end;
__p2000,
__realtek:begin
outp($3d6,bank);
outp($3d7,bank);
end;
__s3:begin
if memmode<=_pl4 then bank:=bank*4;
wrinx(crtc,$39,$A5);
if cv.Version>=S3_864 then wrinx(crtc,$6A,bank)
else begin
wrinx(crtc,$38,$48);
setinx(crtc,$31,9);
modinx(crtc,$35,$F,bank);
if cv.version>S3_924 then modinx(crtc,$51,$C,bank shr 2);
wrinx(crtc,$38,0);
end;
wrinx(crtc,$39,$5A);
end;
__SC:begin
outp($3CD,bank shl 1);
wrinx(SEQ,$15,bank shl 1);
end;
__SiS:begin
outp($3CD,bank);
outp($3CB,bank);
end;
__Poach,
__trid:if cv.version=TR_8800BR then
begin
modinx(SEQ,$E,6,bank);
if (bank and 1)>0 then vseg:=SegB000 else vseg:=SegA000;
end
else if cv.Version>=TR_9000C then
begin
outp($3D8,bank);
outp($3D9,bank);
end
else begin
wrinx(SEQ,$B,0);
if rdinx(SEQ,$B)=0 then; {New mode}
if (memmode<=_pl4) and (bank>1) then inc(bank,2);
modinx(SEQ,$E,$F,bank xor 2);
end;
__Tseng:if cv.Version=ET_3000 then outp($3CD,bank*9+$40)
else begin
outp($3CD,(bank and 15)*17);
if cv.version<>ET_4000 then
outp($3CB,(bank shr 4)*17);
end;
__video7:if cv.Version<V7_208A then
begin
if memmode>_pl4 then
begin
x:=inp($3CC) and $DF;
if (bank and 2)>0 then inc(x,32);
outp($3C2,x);
modinx(SEQ,$F9,1,bank);
bank:=bank shr 2;
end;
modinx(SEQ,$F6,$F,bank*5);
end
else begin
if memmode<=_PL4 then bank:=bank*4;
wrinx(SEQ,$E8,bank shl 4);
{ wrinx(SEQ,$E9,bank shl 4+8); {Don't work ?}
end;
__UMC:wrinx(SEQ,6,bank*17);
__Weitek:outp($3CD,bank*17);
__vesa:begin
rp.bx:=0;
bank:=bank*longint(64) div vgran;
rp.dx:=bank;
vio($4f05);
rp.bx:=1;
rp.dx:=bank;
vio($4f05);
end;
__AGX,__xbe,__xga:
outp(cv.IOadr+8,bank);
__WeitekP9:outp($3CD,bank or $20); {Actually only the W5x86 Vipers}
end;
end;
{Sets the Read Bank register in units of 64Kbytes}
procedure setRbank(bank:word);
var x:word;
begin
curbank:=$FFFF; {always flush}
case cv.chip of
__ahead:if cv.version=AH_B then modinx(GRC,$D,$F,bank);
__ALG:outp($3D6,bank);
__Mach32:begin
x:=(bank and $F) shl 5;
modinx(cv.IOadr,$B2,$E1,hi(x) or lo(x));
modinx(cv.IOadr,$AE,$C,bank shr 2);
end;
__Mach64:begin
bank:=bank shl 1;
mem[cv.Xseg:$B8]:=bank;
mem[cv.Xseg:$BA]:=bank+1;
end;
__ARK:wrinx(SEQ,$16,bank);
__ati:begin {Roll bank nbr into bit 0}
x:=(bank and $F) shl 5;
modinx(cv.IOadr,$B2,$E1,hi(x) or lo(x));
if cv.version>=ATI_GUP_3 then
modinx(cv.IOadr,$AE,$C,bank shr 2);
end;
__cir64:wrinx(GRC,$E,bank shl 4);
__Genoa:modinx(SEQ,6,7,bank);
__mxic:modinx(SEQ,$C5,$F0,bank shl 4);
__ncr:begin
if memmode<=_pl4 then bank:=bank shl 2;
wrinx(SEQ,$1C,bank shl 2);
end;
__oak:if cv.Version<=OAK_083 then modinx($3DE,$11,$F,bank)
else wrinx($3DE,$23,bank);
__WD:begin
wrinx(GRC,9,bank shl 4);
if cv.version=WD_90c33 then
modinx(SEQ,$14,$40,bank shl 2);
end;
__p2000:outp($3D7,bank);
__realtek:outp($3D6,bank);
__SiS:outp($3CB,bank);
__Trid:if cv.Version>=TR_9000C then outp($3D9,bank);
__Tseng:if cv.Version=ET_3000 then modreg($3CD,$38,bank shl 3)
else begin
modreg($3CD,$F0,bank shl 4);
if cv.version<>ET_4000 then
modreg($3CB,$30,bank);
end;
{ __Video7:if cv.Version>=V7_208A then wrinx(SEQ,$E9,(bank shl 4)+8); }
__UMC:modinx(SEQ,6,$F,bank);
__Weitek:modreg($3CD,$F0,bank shl 4);
end;
end;
procedure vesamodeinfo(md:word;var vbedata);
const
width :array[$100..$11b] of word=
(640,640,800,800,1024,1024,1280,1280,80,132,132,132,132
,320,320,320,640,640,640,800,800,800,1024,1024,1024,1280,1280,1280);
height:array[$100..$11b] of word=
(400,480,600,600, 768, 768,1024,1024,60, 25, 43, 50, 60
,200,200,200,480,480,480,600,600,600, 768, 768, 768,1024,1024,1024);
bits :array[$100..$11b] of byte=
( 8, 8, 4, 8, 4, 8, 4, 8, 0, 0, 0, 0, 0
, 15, 16, 24, 15, 16, 24, 15, 16, 24, 15, 16, 24, 15, 16, 24);
swidth :array[0..$13] of word=
( 40, 40, 80, 80,320,320,640, 80,0,0,0,0,0,320,640,640,640,640,640,320);
sheight:array[0..$13] of word=
( 25, 25, 25, 25,200,200,200, 25,0,0,0,0,0,200,200,350,350,480,480,200);
sbytes :array[0..$13] of word=
( 80, 80,160,160, 80, 80, 80,160,0,0,0,0,0, 40, 80, 80, 80, 80, 80,320);
sbits :array[0..$13] of byte=
( 1, 4, 1, 4, 2, 2, 1, 1,0,0,0,0,0, 4, 4, 1, 4, 1, 4, 8);
smode :array[0..$13] of byte=
( 0, 0, 0, 0, 1, 1, 1, 0,0,0,0,0,0, 3, 3, 3, 3, 3, 3, 4);
var
vbxx:_vbe1;
vbe1:^_vbe1;
begin
if @vbedata=NIL then vbe1:=@vbxx
else vbe1:=@vbedata;
fillchar(vbe1^,sizeof(_vbe1),0);
viop($4f01,0,md,0,vbe1);
if rp.ax=$4F then
begin
if ((vbe1^.attr and 2)=0) then
if (md>=$100) and (md<=$11b) then { optional info missing }
begin
vbe1^.width :=width[md];
vbe1^.height:=height[md];
vbe1^.bits :=bits[md];
end;
if (md>=0) and (md<=$13) then {Standard VGA modes - Many VESAs screw
up these modes, so always force them!!}
begin
vbe1^.width :=swidth[md];
vbe1^.height:=sheight[md];
vbe1^.bytes :=sbytes[md];
vbe1^.bits :=sbits[md];
vbe1^.model :=smode[md];
vbe1^.gran:=64;
end;
vgran :=vbe1^.gran;
bytes :=vbe1^.bytes;
pixels:=vbe1^.width;
lins :=vbe1^.height;
end;
end;
procedure initxga;
var xbe1:_xbe1;
x:word;
begin
outp(cv.IOAdr+1,1); {64K aperture at A000h}
clrreg(cv.IOadr+9,8); {Intel pixel format}
x:=(bytes*8) div usebits[memmode];
if pixels=1280 then setinx(cv.IOadr+10,$6D,$C);
mem [cv.xseg:$12]:=1;
meml[cv.xseg:$14]:=cv.phadr;
memw[cv.xseg:$18]:=x-1;
memw[cv.xseg:$1A]:=lins-1;
case memmode of
_pk4:x:=2;
_p8:x:=3;
_p16:x:=4;
_p24:x:=5; {Only AGX?}
end;
mem [cv.xseg:$1C]:=x;
meml[cv.xseg:$50]:=$FFFFFF; {Enable all planes}
meml[cv.xseg:$54]:=$FFFFFF; {Enable all carry planes}
end;
function safemode(md:word):boolean;
var x,y:word;
begin {Checks if we entered a Graph. mode}
safemode:=false;
wrinx(crtc,$11,0);
wrinx(crtc,1,0);
vio(lo(md));
if (rdinx(crtc,1)<>0) or (rdinx(crtc,$11)<>0) then
begin
if (md<=$13) or (mem[Seg0040:$49]<>3) then safemode:=true;
end;
end;
procedure setdacpal(r,g,b:word);
begin
outp($3C9,r);
outp($3C9,g);
outp($3C9,b);
end;
function tsvio(ax,bx:word):boolean; {Tseng 4000 Hicolor mode set}
begin
rp.bx:=bx;
vio(ax);
tsvio:=(rp.ax=16);
end;
{ATI mode set}
function setATImode(md:word):boolean;
begin
rp.bx:=$5506;
rp.bp:=$ffff;
rp.si:=0;
vio($1200+md);
if rp.bp=$ffff then setATImode:=safemode(md) {Try normal modeset}
else begin
vio(md);
setATImode:=true;
end;
end;
procedure SetRGBPal(inx,r,g,b:word);
var i,j:word;
begin
if inp($3C6)=0 then; {delay}
outp(setDACpage(dacSTDwrInx),inx);
if inp($3C6)=0 then; {delay}
inx:=setDACpage(dacSTDpelData);
if inp($3C6)=0 then;
outp(inx,r);
if inp($3C6)=0 then;
outp(inx,g);
if inp($3C6)=0 then;
outp(inx,b);
clearDACpage;
end;
{Halfs all the Horizontal CRTC timings (3d4h index 0/5)}
procedure HalfCRTC;
var r0,r1,r2,r3,r4,r5,old:integer;
begin
old:=rdinx(crtc,$11);
clrinx(crtc,$11,$80);
r0:=rdinx(crtc,0)+5;
r1:=rdinx(crtc,1)+1;
r2:=rdinx(crtc,2);
r3:=rdinx(crtc,3) and $1F;
r4:=rdinx(crtc,4);
r5:=rdinx(crtc,5) and $1F;
if (rdinx(crtc,5) and $80)>0 then inc(r3,$20);
r3:=(r2 and $FFC0)+r3;
if r3<=r2 then inc(r3,$40);
r5:=(r4 and $FFE0)+r5;
if r5<=r4 then inc(r5,$20);
r0:=r0 div 2;
r1:=r1 div 2;
r2:=r2 div 2;
r3:=r3 div 2;
r4:=r4 div 2;
r5:=r5 div 2;
if r3>=r0-1 then dec(r3);
wrinx (crtc,0,r0-5);
wrinx (crtc,1,r1-1);
wrinx (crtc,2,r2);
modinx(crtc,3,$1F,r3);
wrinx (crtc,4,r4);
modinx(crtc,5,$1F,r5);
modinx(crtc,5,$80,r3 shl 2);
wrinx(crtc,$11,old);
end;
const
MachActive:boolean=false;
var
tst:word;
function SetMode(md:word;clear:boolean):boolean;
const
Red: array[0..15] of byte=(0, 0, 0, 0,42,42,42,42,21,21,21,21,63,63,63,63);
Green:array[0..15] of byte=(0, 0,42,42, 0, 0,21,42,21,21,63,63,21,21,63,63);
Blue: array[0..15] of byte=(0,42, 0,42, 0,42, 0,42,21,63,21,63,21,63,21,63);
var x,y,prt:word;
l2,l:longint;
vbe1:_vbe1;
begin
setmode:=true;
dacHWcursor:=((cv.features and ft_cursor)=0) and ((DACflags and DFL_Cursor)>0);
curmode:=md;
if ((cv.flags and FLG_StdVGA)>0) and (md<=$13) then
for x:=1 to novgamodes do
if stdmodetbl[x].md=md then
begin
memmode:=stdmodetbl[x].memmode;
bytes :=stdmodetbl[x].bytes;
pixels :=stdmodetbl[x].xres;
lins :=stdmodetbl[x].yres;
end;
case cv.chip of
__ati:begin
clrinx(cv.IOadr,$B3,$40); {Mach64 doesn't clear this}
setmode:=setATImode(md);
end;
__Mach32:begin
cv.IOadr:=$1CE;
if MachActive then
begin
outp($42EE,0);
{mov ax,0 call c000h:64h mov al,0 call C000h:68h}
inline($B8/>0/$9A/>$64/>SegC000/$B0/0/$9A/>$68/>SegC000);
MachActive:=false;
clrinx(cv.IOadr,$B6,1);
clrinx(cv.IOadr,$BE,8);
end;
if md>=$100 then
begin
{mov ax,[BP+md] mov bx,1 call C000h:64h mov al,1 call C000h:68h}
inline($8B/$46/<md/$BB/>1/$9A/>$64/>SegC000/$B0/1/$9A/>$68/>SegC000);
setmode:=true;
case memmode of
_pk4b:bytes:=((pixels+127) and $FF80) div 2;
_p8:bytes:=(bytes+127) and $FF80;
_p15,_p16:bytes:=((pixels+127) and $FF80)*2;
_p24:bytes:=((pixels+127) and $FF80)*3;
end;
outp($5EEE,inp($5EEE) and $FC); {Disable Memory Aperture}
outp($42EE,0);
inline($B8/>$62/$CD/$10);
setinx(cv.IOadr,$B6,1);
setinx(cv.IOadr,$BE,8);
MachActive:=true;
end
else setmode:=safemode(md);
end;
__Mach64:begin
if MachActive then
begin
vio($100);
{mov al,1 mov cl,0 CALL C000h:64h}
inline($B0/0/$B1/1/$9A/>$64/>SegC000);
MachActive:=false;
end;
{mov al,0 mov cx,[BP+md] CALL C000h:64h}
inline($B0/0/$8B/$4E/<md/$9A/>$64/>SegC000);
VIO($E2); {Set VGA mode}
setreg($6AEC,4);
{mov al,1 mov cl,1 CALL C000h:64h}
inline($B0/1/$B1/1/$9A/>$64/>SegC000);
MachActive:=true;
setmode:=true;
case colbits[memmode] of
15:setmode:=setdac15;
16:setmode:=setdac16;
24:if memmode>=_P32 then setmode:=setdac32
else setmode:=setdac24;
else setmode:=true;
end;
end;
__compaq:begin
setmode:=safemode(md); {HM, what a hack}
if memmode=_p16 then setmode:=setdac16;
{outp($13C8,$38); {Force 64Kcolors}
end;
__everex:begin
rp.bl:=md;
vio($70);
end;
__Matrox:if (md>$13) then
begin
vio($BD00+md);
if rp.ax<>-1 then setmode:=true;
end
else setmode:=safemode(md);
__oak:if safemode(md) then
case memmode of
_p15:setmode:=setdac15;
_p16:setmode:=setdac16;
_p24:setmode:=setdac24; {Hm}
end
else setmode:=false;
__s3:if md<$100 then setmode:=safemode(md)
else begin
rp.bx:=md;
vio($4f02);
if rp.ax=$4f then
begin
if md<$200 then vesamodeinfo(md,vbe1);
if (memmode=_p16) and setdac16 then;
end
else begin
setmode:=false;
dac2comm;
outp($3C6,0);
dac2pel;
end;
end;
__AGX,__Poach,
__trid:if cv.version>=TR_GUI9420 then setmode:=safemode(md)
else begin
vio(md);
if (rp.ah>=$80) then setmode:=false;
if (cv.version=TR_9000i) then
case memmode of {9000i doesn't set HiColor modes}
_p15:if not setdac15 then setmode:=false;
_p16:if not setdac16 then setmode:=false;
end;
end;
__Tseng:case hi(md) of
0:setmode:=safemode(md);
1:if tsvio($10E0,lo(md)) then
begin
{Diamond SpeedStar 24 does not clear memory}
for x:=0 to 15 do {clear memory}
begin
setbank(x);
mem[SegA000:0]:=0;
fillchar(mem[SegA000:1],65535,0);
end;
end else setmode:=false;
2:if tsvio($10f0,md shl 8+$ff) then
begin
if bytes=2048 then
begin {Bug correction for the MEGAVGA BIOS}
outp($3bf,3);
outp(crtc+4,$a0); {enable Tseng 4000 Extensions}
wrinx(crtc,$13,0);
setinx(crtc,$3f,$80);
end
end else setmode:=false;
3:if tsvio($10F0,lo(md)) and setdac15 then
else setmode:=false;
4:if tsvio($10F0,lo(md)) and setdac16 then
else setmode:=false;
5:if not tsvio($10f0,md) then setmode:=false;
end;
__video7:begin
rp.bl:=md;
vio($6f05);
end;
__vesa:begin
vesamodeinfo(md,vbe1);
rp.bx:=md;
vio($4f02);
if rp.ax<>$4f then setmode:=false
else begin
{ vesamodeinfo(md,NIL);}
cv.chip:=__vesa;
end;
end;
__UMC:begin
outp($3BF,$AC);
case memmode of
_p15:clrinx(GRC,$A,4);
_p16:setinx(GRC,$A,4);
end;
setmode:=safemode(md);
if cv.version=UMC_408 then
case memmode of
_p15:setmode:=setdac15;
_p16:setmode:=setdac16;
end;
if md=$51 then clrinx(SEQ,9,$80);
end;
__WD:if (md=$13) and (cv.version=WD_90c33) then
begin
vio($5E);
clrinx(GRC,$E,1);
wrinx(crtc,$13,40); {320 bytes/linbe}
setinx(crtc,9,1); {Double line}
end
else setmode:=safemode(md);
__xbe:begin
viop($4E03,md,0,cv.id,NIL);
if rp.ax<>$4E then setmode:=false;
end;
else setmode:=safemode(md);
end;
if (inp($3CC) and 1)=0 then crtc:=$3B4 else crtc:=$3D4; {Mono/Color}
case colbits[memmode] of
8:begin
if dacis8bit then prt:=4 else prt:=1;
for x:=0 to 63 do
begin
y:=x*prt;
SetRGBPal(x ,y,0,0); { 0- 63: Red}
SetRGBPal(x+64 ,0,y,0); { 64-127: Green}
SetRGBPal(x+128,0,0,y); {128-191: Blue}
SetRGBPal(x+192,y,y,y); {192-255: White}
end;
SetRGBPal(0,0,0,0); {Some cards screw up the first palette entry}
end;
4:for x:=0 to 15 do
begin
SetRGBPal(x,Red[x],Green[x],Blue[x]);
if (cv.flags and FLG_StdVGA)>0 then wrinx($3C0,x,x);
end;
end;
case (rdinx(GRC,6) shr 2) and 3 of
0,1:vseg:=SegA000;
2:vseg:=SegB000;
3:vseg:=SegB800;
end;
{ Enable banks... }
{ if memmode>_CGA2 then}
case cv.chip of
__AGX:if memmode>=_PL4 then
begin
modinx(GRC,6,$C,4);
cv.spcreg:=$1E0-(((rdinx(cv.IOadr+10,$75) and 7)-1) shl 4);
initxga;
end;
__ahead:begin
setinx(GRC,$F,$20);
if (memmode>_cga2) {and (md<>$13)} then setinx(GRC,$C,$20);
if md=$13 then
begin
HalfCRTC;
wrinx(crtc,$13,20);
setinx(GRC,$E,1); {Switches from clock 8 (50.35MHz) to
clock 12 (25.175MHz) - pure luck!!!}
clrinx($3C0,$10,$40);
end;
end;
__ALG:begin
setinx(crtc,$1A,$10); {Enable extensions}
setinx(crtc,$19,2); {Enable >256K}
setinx(GRC,$F,4); {Enable RWbank}
end;
__Alli:begin
wrinx(SEQ,$10,$12);
clrinx(SEQ,$1C,$F);
end;
__ARK:begin
setinx(SEQ,$1D,1); {Enable extensions}
clrinx(crtc,$31,1); {256K wrap}
clrinx(crtc,$43,8);
case colbits[memmode] of
15,16:x:= 8;
24,32:x:=12;
else x:= 4;
end;
modinx(SEQ,$11,$C,x);
case pixels of
800:x:=1;
1024:x:=2;
1280:x:=4;
else x:=0;
end;
modinx(SEQ,$17,7,x);
setinx(SEQ,$10,3); {Enable all of Vmem}
end;
__ati:if memmode>_CGA2 then
begin
if cv.version>=ATI_M64_GX then
begin
setinx(cv.IOadr,$B0,8);
clrreg($6AEC,7);
end;
if cv.version>=ATI_28800_4 then
setinx(cv.IOadr,$B6,1); {enable display >256K}
if cv.version>=ATI_18800_1 then
clrinx(cv.IOadr,$B3,$10); {enable display >256K}
if (cv.Version>=ATI_18800_1) {and (cv.version<ATI_GUP_3)} then
begin
if ((rdinx(cv.IOadr,$B6) and $10)=0) and ((memmode=_pl4)
or (md=$13)) then
begin
if md=$13 then {Fix mode 13h}
begin
setinx(crtc,$17,$40);
clrinx(crtc,$14,$40);
clrinx(GRC,5,$40);
clrinx($3C0,$10,$40);
setinx(SEQ,1,8);
if (cv.version=ATI_18800_1) then
begin
setinx(cv.IOadr,$B0,$30);
end
else begin
setinx(cv.IOadr,$B0,$20);
setinx(cv.IOadr,$B6,4); {Linear addressing}
end;
end
else begin {16color modes (planar)}
setinx(cv.IOadr,$B3,$40);
setinx(cv.IOadr,$B6,$18);
end;
HalfCRTC;
wrinx(crtc,$13,rdinx(crtc,$13) div 2);
if (md=$D) and (cv.version<ATI_M64_GX) then {Mode 0Dh - Arghh}
begin
clrinx(SEQ,1,8); {Switch from /4 to /3 - Arghh}
modinx(cv.IOadr,$B8,$C0,$80); {--}
clrinx(crtc,$11,$80); {Allow CRTC reprogramming}
wrinx(crtc,0,$19);
wrinx(crtc,3,$96); {Reprogram Horizontal Timing}
wrinx(crtc,4,$17);
end;
end;
end;
if cv.version>ATI_18800 then
setinx(cv.IOAdr,$BE,8); {enable RWbanks}
end;
__chips:begin
if cv.version<CT_450 then
begin
prt:=$46E8;
x:=inp(prt);
outp(prt,x or $10); {setup mode}
y:=inp($103);
outp($103,y or $80); {Enable extensions}
outp(prt,x and $EF);
if (y and $40)=0 then cv.IOadr:=$3D6 else cv.IOadr:=$3B6;
end
else cv.IOadr:=$3D6;
wrinx(cv.IOadr,$15,0); {No write protection}
clrinx(cv.IOadr,$14,1); {This bit, if set needs explicit clearing}
setinx(cv.IOadr,$B,1); {Enable banks}
if memmode>_cga2 then
begin
setinx(cv.IOadr,4,4); {Enable bank access}
case cv.version of
CT_450,CT_452,CT_453:
begin
modinx(cv.IOadr,$B,3,1);
clrinx(cv.IOadr,$C,3);
end;
CT_65510,CT_65520,CT_65530:
begin
setinx(cv.IOadr,4,8);
modinx(cv.IOadr,$B,3,1);
clrinx(cv.IOadr,$C,3);
end;
CT_64300:clrinx(cv.IOadr,$B,$10);
end;
if md=$13 then
begin
setinx(cv.IOadr,$B,4); {By 4 addressing}
setinx(crtc,$17,$40);
clrinx(crtc,$14,$40);
end;
end;
end;
__cir54:begin
wrinx(SEQ,6,$12); {Enable Extensions}
setinx(crtc,$1B,2); {Enable mem >256K}
if cv.mm>1024 then
begin
setinx(GRC,11,$20); {Set 16K banks}
setinx(SEQ,$f,$80); {Enable Ext mem}
end;
if md=$13 then
begin
setinx(SEQ,7,1); {Extended Graph mode}
setinx(SEQ,1,8); {Half VClk rate =12.6MHz}
{setinx(crtc,$1B,$20);} {Blanking Ctl ??}
HalfCRTC;
end;
if (cv.Version>=CL_GD5426) and (memmode>_pl4)
and (md<>$13) then {Init BitBlt engine}
begin
wrinx2(GRC,$24,bytes);
wrinx2(GRC,$26,bytes);
case memmode of
_p15,_p16:x:=$10;
_P32:x:=$30; {543x only}
else x:=0;
end;
wrinx(GRC,$30,x);
setbank(cv.mm div 64-1); {Setup Mono image for Fill}
meml[SegA000:$FFF8]:=$FFFFFFFF; {Fill Pattern}
meml[SegA000:$FFFC]:=$FFFFFFFF;
end;
end;
__cir64:begin
wrinx(GRC,$A,$EC); {Enable extensions}
if memmode>_cga2 then setinx(GRC,$D,7);
end;
__compaq:begin
modinx(GRC,$F,$F,5); {Enable extensions}
setinx(GRC,$10,8);
if memmode>=_PL4 then
begin
if rdinx(GRC,$F)<>$A5 then
begin
setreg($23C7,$10);
if pixels>1024 then
begin
modreg($63CB,$C,8);
bytes:=256*usebits[memmode];
end
else if pixels>512 then
begin
modreg($63CB,$C,4);
bytes:=128*usebits[memmode];
end
else begin
modreg($63CB,$C,0);
bytes:=64*usebits[memmode];
end;
wrinx(crtc,$13,bytes shr 3);
modinx(GRC,$42,3,bytes shr 11);
end;
if ((md<>$13) or (cv.version=CPQ_AVGA))
and (memmode>=_P8) then setinx(GRC,$40,$1);
dacHWcursor:=(DACflags and DFL_cursor)>0;
end;
end;
__Genoa:begin
setinx(SEQ,8,$40); {Ext Addressing}
setinx(SEQ,$10,4); {RWbank}
end;
__HMC:if memmode>=_cga2 then
begin
if memmode=_pl4 then
begin
setinx(SEQ,$E7,$4);
clrinx(GRC,6,$C);
end;
if (memmode=_P8) and ((rdinx(SEQ,$E7) and 2)=0) then
begin {Fix mode 13h}
HalfCrtc;
setinx(SEQ,$E7,2);
clrinx(GRC,5,$40);
clrinx($3C0,$10,$40);
setinx(SEQ,1,8);
end;
end;
__Mach32:begin
outpw($DAEE,0); {Clipping}
outpw($E2EE,2047);
outpw($DEEE,0);
outpw($E6EE,2047);
outpw($6EEE,0); {GE Offset}
outpw($72EE,0);
outpw($EEEE,0); {Disable Color Compare}
outpw($AAE8,$FFFF); {Write Mask}
tst:=inpw($8EEE);
end;
__Mach64:begin
modreg($6AEC,7,4);
mem[cv.Xseg:$C5]:=(mem[cv.Xseg:$C5] and $DF); {non-VGA DAC}
setreg($4EEE,$A0); {Reset GUI engine}
outpw($66EC,0);
outpw($66EC,$100);
write32($338,0); {GUI_STAT (needed for PCI)}
write32($310,0); {FIFO_STAT}
outp($4EEE,$FF); {BUS_CNTL: Clear FIFO errors}
outpl($66EC,0);
outpl($66EC,$100);
repeat until memw[cv.Xseg:$310]=0;
case usebits[memmode] of
4:l:=$10101;
8:l:=$20202;
15:l:=$30303;
16:l:=$40404;
24:l:=$50505; {Hm?}
32:l:=$60606;
end;
write32($2D0,l); {Pixel Width}
write32($320,$FFFFFFFF); {Context MAsk}
write32($108,0);
write32($118,0);
write32($124,0);
write32($128,0);
write32($12C,0);
write32($130,3);
write32($18C,0); {Src Y_X}
write32($198,0);
write32($1A4,0);
write32($1B0,0);
write32($1B4,0);
repeat until memw[cv.Xseg:$310]=0;
write32($240,0);
write32($280,0);
write32($284,0);
write32($288,0);
write32w($2A8,pixels-1,0); {Clip left/right}
write32w($2B4,lins-1,0); {Clip top/bot}
write32($2C0,0);
write32($2C4,0);
write32($2C8,$FFFFFFFF); {Write mask}
write32($2D4,$70003); {DP_MIX}
write32($2D8,$100); {Source}
write32($300,0);
write32($304,$FFFFFFFF); {Color Cmp Mask}
write32($308,0); {Color Cmp off}
write32($330,3); {GUI trajetory}
repeat until memw[cv.Xseg:$310]=0;
l:=longint(pixels shr 3) shl 22;
write32($100,l); {Dest Offset & pitch}
write32($180,l);
repeat until (mem[cv.Xseg:$338] and 1)=0;
end;
__Matrox:begin
if md=$13 then {The mode is redefined, but with a 62kHz Hsync!}
begin
setinx($3DE,1,9); {Ext 256color & enable banks}
HalfCRTC;
wrinx(crtc,$13,20);
end;
end;
__mxic:begin
setinx(SEQ,$65,$40);
wrinx(SEQ,$A7,$87); {enable extensions}
setinx(SEQ,$C3,4); {Enable banks}
setinx(SEQ,$F0,8); {Enable display >256k}
end;
__ncr:begin
wrinx(SEQ,5,1);
wrinx(SEQ,$18,0);
wrinx(SEQ,$19,0);
wrinx(SEQ,$1C,0);
wrinx(SEQ,$1D,0);
setinx(SEQ,$1E,$1C);
if cv.version<NCR_77c32blt then
begin
wrinx(SEQ,5,5);
wrinx(SEQ,$1A,0);
wrinx(SEQ,$1B,0);
end;
if md=$13 then
begin
setinx(SEQ,$20,2);
setinx(SEQ,$21,1);
clrinx(GRC,5,$40);
clrinx(SEQ,4,8);
clrinx($3C0,$10,$40);
setinx(crtc,$17,$40);
clrinx(crtc,$14,$40);
setinx(SEQ,$1F,$10);
setinx(SEQ,1,8);
end;
if (cv.version=NCR_77c32BLT) and (memmode>=_PL4) then
begin
wrinx3(SEQ,$31,$0b00);
setinx(SEQ,$30,1); {ACM at BFF0:0}
case memmode of
_P15,_P16:x:=$10;
_P24,_P24b:x:=$20;
else x:=0;
end;
modinx(SEQ,$21,$30,x); {Pixel Width}
cv.Xseg:=SegB000;
end;
end;
__oak:if cv.version<>OAK_037 then
begin
if (memmode>=_pl4) and (cv.mm>256) then
begin
if (md<>$13) and (cv.Version<=OAK_083) then setinx($3DE,$D,$C);
if (memmode=_pl4) then setinx($3DE,$D,$10);
end;
{ if md=$13 then
begin
wrinx(crtc,$14,0);
wrinx(crtc,$13,20);
wrinx(crtc,$17,$c3);
setinx($3DE,$21,5);
HalfCRTC;
end; Creates a 320x200 mode without 64K limitations
however there is no pixel doubling, creating a
"double screen" }
end;
__WD:begin
modinx(GRC,$F,$17,5); {Enable extensions PR0-4}
wrinx(crtc,$29,$85); {Enable extensions 2}
wrinx(SEQ,6,$48); {Enable extended sequencers}
clrinx(GRC,$B,8);
if (md<>$13) or (cv.version<>WD_90c33) then clrinx(crtc,$2F,2);
clrinx(crtc,$2F,$78);
setinx(SEQ,$11,$80); {enable dual bank}
if (cv.Version=WD_90c33) and (memmode>=_pl4) then
begin
{ while (inpw($23CE) and $F)>0 do; }
outpw($23C0,3); {Drw Eng Bank 2}
outpw($23C2,0); {Map BAse}
outpw($23C2,$1000+pixels); {Row Pitch}
outpw($23C2,$AFFF); {Enable all planes}
outpw($23C2,$BFFF);
outpw($23C0,1); {Drw Eng Bank 1}
case memmode of
_pl4:outpw($23C2,$1000);
_p8:outpw($23C2,$1400);
_p15,_p16:outpw($23C2,$1800);
end;
outpw($23C2,$9000);
outpw($23C2,$A000+pixels);
outpw($23C2,$B000);
outpw($23C2,$C000+lins); {Set Clip}
outpw($23CE,$20);
while (inpw($23CE) and $F)>0 do;
outpw($23C2,0);
end;
end;
__p2000:begin
if memmode=_p16 then
begin
dac2comm;
outp($3C6,$C0);
end;
end;
__realtek:begin
if memmode>=_pl1 then setinx(crtc,$19,$A2); {display from upper 512k}
{ setinx(GRC,$C,32); }
setinx(GRC,$F,4); {dual bank}
end;
__s3:if memmode>_CGA2 then
begin
if cv.Version<S3_864 then S3accelOff;
wrinx(crtc,$38,$48);
wrinx(crtc,$39,$A5);
modinx(crtc,$31,$39,9); {Enable access >256K & banking}
wrinx(crtc,$4E,0); {zero cursor offset}
wrinx(crtc,$4F,0);
clrinx(crtc,$45,$3D); {Cursor type}
if bytes=800 then {800x600 P8 appears busted in acc.}
begin {modes on the STB Pegasus, so fixit..}
bytes:=1024;
wrinx(crtc,$13,128);
end;
if cv.version>S3_924 then
begin
clrinx(crtc,$55,$30); {Force MS-Windows cursor & int. DAC}
case memmode of
_p15,_p16:begin
if cv.version<S3_864 then
setinx(crtc,$45,4); {16bit cursor pixels}
x:=$10;
end;
_p24,_p32:begin
if cv.version<S3_864 then
setinx(crtc,$45,8) {32bit cursor pixels}
else
setinx(crtc,$45,4); {16bit cursor pixels}
x:=$30;
end;
else x:=0;
end;
case (bytes*8) div usebits[memmode] of
640:x:=x+$40;
800:x:=x+$80;
1280:x:=x+$C0;
1152:x:=x+$01; {1152/1600 do not work on 801/5 A/B & 928 A-D}
1600:x:=x+$81;
end;
modinx(crtc,$50,$F1,x); {8bpp & 640/800/1024/1280 pixels/line}
if ((rdinx(crtc,$55) and 8)>0)
or ((cv.version>=S3_864) and ((rdinx(crtc,$65) and 2)>0)) then
begin {Piping VRAM directly to the DAC,
internal cursor will NOT work}
dacHWcursor:=true;
setinx(crtc,$45,$20); {Ext DAC Ctrl enable}
setinx(crtc,$55,$20); {Enable Ext HW cur}
end;
end;
clrinx(crtc,$34,$80); {allow Clock change}
wrinx(crtc,$39,$5A);
wrinx(crtc,$38,0);
end;
__SiS:begin
outpw(SEQ,$8605);
setinx(SEQ,$B,8); {Set 3CDh as Write bank, 3CBh as read}
if memmode>_CGA2 then setinx(SEQ,6,2); {Enable banks}
if md=$13 then
begin
clrinx($3C0,$10,$40);
setinx(SEQ,1,8);
HalfCRTC;
end;
end;
__Poach,
__trid:if memmode>_CGA2 then
begin
setinx(crtc,$1E,$80); { Enable 17bit display start }
if (cv.Version=TR_8900C) or (cv.version>=TR_9000C) then
begin
if (cv.mm>512) then
begin
wrinx(SEQ,$B,0);
x:=inp(SEQ+1); {Switch to new mode}
x:=rdinx(SEQ,$E);
wrinx(SEQ,$E,$80);
setinx(SEQ,$C,$20);
wrinx(SEQ,$E,x);
end;
if cv.version<>TR_8900C then
setinx(GRC,$F,5); {Enable ?? & Read/Write}
end;
if cv.version<>TR_8800BR then modinx(GRC,6,$C,4);
if cv.version>=TR_GUI9440 then
wrinx(crtc,$36,$82);
end;
__Tseng:begin
outp($3BF,3);
outp(crtc+4,$A0);
case cv.version of
ET_3000:begin
setinx(SEQ,4,2);
if (((md=$13) or (memmode=_PL4)) and (md<>$D)
and ((rdinx(SEQ,7) and $40)=0)) then
begin
HalfCRTC;
wrinx(crtc,$13,rdinx(crtc,$13) div 2);
if md=$13 then
begin
clrinx(crtc,$14,$40);
clrinx(SEQ,4,8);
wrinx(crtc,$17,$C3);
end
else for x:=0 to 15 do wrinx($3C0,x,x);
setinx($3C0,$16,$10);
clrinx(crtc,$11,$80);
setinx(SEQ,7,$40);
end;
end;
ET_4000:if (cv.dactype=_dacMU1880) and (memmode=_p24) then memmode:=_P24b;
else if memmode>=_pl4 then
begin {W32 series}
setinx(crtc,$36,$28); {Enables MMU registers}
if vseg=SegA000 then cv.Xseg:=SegB800 {setup accelerator MMU}
else cv.Xseg:=SegA800;
{The 32K at either A800 or B800 is divided into
4 ranges: Offset 7F00h-7FFFh holds the memory
mapped registers, 4000h-5FFFh is controlled by MMU2
and is used to transfer CPU data, 2000h-3FFFh is
controlled by MMU1 and holds the Pattern data }
mem [cv.xseg:$7F30]:=0;
mem [cv.xseg:$7F30]:=$10;
while (mem [cv.xseg:$7F36] and 2)>0 do;
mem [cv.xseg:$7F30]:=0;
mem [cv.xseg:$7F35]:=$E; {clear Interrupts}
memw[cv.xseg:$7F34]:=$0; {Disable Interrupts}
mem [cv.xseg:$7F36]:=0;
mem [cv.xseg:$7F9D]:=0; {Reload Off}
mem [cv.xseg:$7F32]:=1; {Wait for Queue'd register to clear}
if cv.Version>=ET_4W32p_a then
begin
mem[cv.xseg:$7F8E]:=0; {Pixel Depth - 8bit}
mem[cv.xseg:$7F31]:=$10; {Startup}
end
else begin
write32($7F94,0);
{meml[cv.xseg:$7F94]:=0; {Reset X,Y position}
mem [cv.xseg:$7F31]:=0;
end;
l:=cv.mm*longint(1024)-8 {4};
write32($7F00,l);
write32($7F80,l);
{meml[cv.xseg:$7F00]:=l; {Adr of pattern in Vmem}
{Had some trouble with two word writes failing to update
the full longword, thus the move() -> rep movsb}
l:=meml[cv.xseg:$7F00];
write32($7F08,0);
{meml[cv.xseg:$7F08]:=0; {Start of Video Memory}
mem [cv.xseg:$7F13]:=4; {MM1 -> pattern (color), MM2 -> 0}
memw[cv.xseg:$7F88]:=3; {Pattern Pitch}
memw[cv.xseg:$7F8A]:=bytes-1; {Source Pitch}
memw[cv.xseg:$7F8C]:=bytes-1; {Dest Width}
mem [cv.xseg:$7F90]:=$12; {4byte x 1line pattern}
mem [cv.xseg:$7F92]:=$77; {Source don't wrap}
end;
end;
end;
__umc:begin
OUTP($3BF,$AC); {Enable extensions}
setinx(SEQ,8,$80); {Enable banks bit0}
clrinx(crtc,$2F,$2); {Enable >256K}
end;
__video7:begin
wrinx(SEQ,6,$EA); {Enable extensions}
if memmode>=_pl4 then
begin
setinx(SEQ,$F6,$C0); {prevent display wrap}
if memmode>=_P8 then modinx(SEQ,$FC,6,4); {Enable 256c banks}
if (cv.version>=V7_216BC) and (memmode=_P8)
and ((rdinx(GRC,5) and $40)>0) then
begin {Force all 256c modes to Ext 256c}
clrinx(GRC,5,$40);
setinx(SEQ,$C8,$10);
modinx($3C0,$10,$C0,$80);
setinx(SEQ,1,8);
HalfCRTC;
end;
{if cv.Version>=V7_208A then
setinx(SEQ,$E0,$80); {Enable Dual bank }
if cv.version>=V7_208A then
setinx(SEQ,$FF,$10); {Enable banks & memory>256K}
end;
end;
__Weitek:begin
x:=WeitekEnable(0);
end;
__xbe,__xga:initxga;
end;
curbank:=$ffff; {Set curbank invalid }
planes:=1;
setinx(SEQ,4,2); {Set "more than 64K" flag}
setvstart(0,0); {Reset start of display}
case memmode of
_text,_txt2,_txt4,
_pl1e,_pl2:planes:=2;
_pl4:planes:=4;
end;
if clear and (vseg=SegA000) then
begin
l:=(cv.mm*longint(1024)-256) shr 1; {#Words to clear}
x:=0; {Leave a few bytes at the end for patterns etc}
while (l>0) do
begin
setbank(x); inc(x);
y:=32768;
if l<y then y:=l;
dec(l,y);
{cld mov cx,[BP+y] mov ax,0A000 mov es,ax xor ax,ax xor di,di rep stosw}
inline($FC/$8B/$4E/<y/$B8/>SegA000/$8E/$C0/$31/$C0/$31/$FF/$F3/$AB);
end;
end;
AnalyseMode;
end;
procedure SetTextMode;
begin
case cv.chip of
__ATI:clrinx(cv.IOadr,$B3,$40); {Mach64 doesn't clear this}
__Mach32:if MachActive then
begin
outp($42EE,0);
{mov ax,0 call c000h:64h mov al,0 call C000h:68h}
inline($B8/>0/$9A/>$64/>$C000/$B0/0/$9A/>$68/>SegC000);
MachActive:=false;
clrinx(cv.IOadr,$B6,1);
clrinx(cv.IOadr,$BE,8);
end;
end;
clearDACpage;
if (DACflags and DFL_CmdReg)>0 then
begin
dac2comm; {Reset DAC}
outp($3c6,0);
dac2pel;
end;
if setmode(3,false) then;
textmode($103);
end;
{const
set15:array[0..13] of byte=(0,0,$A0,$A0,$A0,$A0,$C1,0,$80,$F0,$A0,0,0,0);
msk15:array[0..13] of byte=(0,0,$80,$C0,$FF,$E0,$C7,0,$C0,$FF,$E0,0,0,0);
set16:array[0..13] of byte=(0,0, 0,$E0,$A6,$C0,$C5,0,$C0,$E1,$C0,0,0,0);
msk16:array[0..13] of byte=(0,0, 0,$C0,$FF,$E0,$C7,0,$C0,$FF,$E0,0,0,0);
set24:array[0..13] of byte=(0,0, 0, 0,$9E,$E0,$80,0,$60,$E5,$E0,0,0,0);
msk24:array[0..13] of byte=(0,0, 0, 0,$FF,$E0,$C7,0,$E0,$FF,$E0,0,0,0); }
var
dacpath:integer;
procedure GetDACpath;
begin
dacpath:=8;
case cv.chip of
__ARK:if (cv.version>=ARK_2000PV) and ((rdinx(crtc,$46) and 4)>0) then dacpath:=16;
__SC:if (rdinx(GRC,$C) and 3)=3 then dacpath:=16;
__Tseng:if (cv.version>=ET_4000) and ((rdinx($3C0,$16) and $20)>0) then dacpath:=16;
end;
end;
function prepDAC:word; {Sets DAC up to receive command word}
var x:word;
begin
{ dac2comm; }
{if cv.dactype=_dacss24 then
begin
dac2comm;
x:=8;
while (x>0) and (daccomm<>$8E) do
begin
daccomm:=inp($3C6);
dec(x);
end;
prepDAC:=daccomm;
end
else} begin
prepDAC:=getdaccomm{inp($3C6)};
dac2comm;
end;
end;
procedure dacmode(andmsk,ormsk:word);
var x,pel:word;
begin
ormsk:=ormsk and (not andmsk);
{ if cv.DAC_RS2<>0 then
begin
outp($3C6+cv.DAC_RS2,(inp($3C6+cv.DAC_RS2) and andmsk) or ormsk);
end
else} begin
if cv.chip=__cir54 then
begin
pel:=inp($3C6);
outp($3C6,0);
end;
x:=getdaccomm{prepDAC};
dac2comm;
outp($3C6,(x and andmsk) or ormsk);
dac2pel;
if cv.chip=__cir54 then outp($3C6,pel);
end;
end;
procedure setBt1DAC(mode:word);
begin
{ dac2comm;
outp($3C6,mode);
dac2pel;}
outp(setDACpage(dacBt1cmdA),mode);
{ dacmode(0,mode);}
end;
procedure setSTGdac(mode:word);
var m:word;
begin
m:=inp(SetDACpage(dacHIcmd));
outp(SetDACpage(dacHIcmd),m or 16);
dac2comm;
m:=inp($3C6);
outp($3C6,3);
outp($3C6,0);
outp($3C6,mode);
outp($3C6,mode);
outp($3C6,2);
dacmode(0,$8);
end;
{Sets the standard palette mode}
procedure setDACstd;
begin
case cv.dactype of
_dac15,_dac16,_dacADAC1,_dacATT490,_dacATT491,_dacATT492,_dacATT493,
_dacICS5301,_dacSC15021,_dacSC15025,_dacMU1880,_dacMU4870,_dacMU4910,
_dacMU9910,_dacTR8001,_dacUMC188:
dacmode(0,0);
_dacALG1201,_dacALG1301:
dacmode(0,2);
_dacATT498,_dacATT1498,_dacATT2498,_dacICW498,_dacICW516:
if dacpath=8 then dacmode(0,0) else dacmode(0,$20);
_dacS3_708,_dacS3_716:
clrreg(SetDACpage(dacHIcmd),$60);
_dacSTG1700,_dacSTG1702,_dacSTG1703:
if (inp(SetDACpage(dacHIcmd)) and 8)=0 then dacmode(0,0)
else setSTGdac(5);
_dacBt481,_dacBt482:
setBt1DAC(0);
_dacBt484,_dacBt485,_dacATT504,_dacATT505:
begin
modreg(SetDACpage(dacBTcmd1),$78,$40);
{clrreg(SetDACpage(dacBTcmd2),$20);}
end;
_dacCH8391,_dacCH8398:
dacmode(0,4);
_dacTVP3010,_dacTVP3020,_dacTVP3025:
begin
wrDACreg(dacTVPindex,$18);
wrDACreg(dacTVPdata,$C6);
wrDACreg(dacTVPindex,$E);
setDACreg(dacTVPdata,1);
end;
_dacTVP3026:
begin
wrDACreg(dacTVP6index,$18);
wrDACreg(dacTVP6data,$C6);
wrDACreg(dacTVP6index,$E);
setDACreg(dacTVP6data,1);
end;
_dacATI68860,_dacATI68880:
outp(setDACpage(11),$83);
_dacInt:
case cv.chip of
__chips:clrinx(cv.IOadr,6,$C);
__Cir54:dacmode(0,0);
__WD:clrinx(SEQ,$26,$C);
__S3:begin
outpw(crtc,$A039);
clrinx(crtc,$67,$F0);
outpw(crtc,$39);
end;
__SiS:clrinx(SEQ,6,$1C);
__Trid:dacmode(0,0);
end;
_dacALG1101:
clrinx(crtc,$19,$10);
_dac0,_dac8,_dacCEG:; {not supported/NOP}
end;
clearDACpage;
end;
{Enable DAC Gamma correction}
function setDACgamma(on:boolean):word;
var x:word;
begin
setDACgamma:=GAM_None;
case cv.dactype of
_dacBt484,_dacBt485,_dacATT504,_dacATT505:
begin
setDACreg(6,2); {Enable 8bit LUT}
setDACreg(9,4); {Contigous Gamma curve}
modDACreg(8,$10,$10*ord(not on));
setDACgamma:=GAM_CanDo+GAM_8bit;
end;
_dacSC15021,_dacSC15025:
begin
dac2comm;
x:=inp($3C6);
outp($3C6,x or $10); {Index}
outp($3C7,8);
outp($3C8,1); {8bit LUT}
outp($3C6,(x and $F7) or 8*ord(on)); {Gamma}
dac2pel;
setDACgamma:=GAM_CanDo+GAM_LeftJ+GAM_Left8+GAM_8bit;
end;
end;
end;
{Turns 8bit DAC mode on or off}
procedure setdac8(on:boolean);
var w,x:word;
begin
if cv.chip=__VESA then
begin
if on then rp.bx:=$800
else rp.bx:=$600;
vio($4F08);
end
else
case cv.dactype of
_dacALG1201,_dacALG1301:
dacmode(2,128*ord(on));
_dacATI68860,_dacATI68880:
modreg(setDACpage(12),1,1-ord(on));
_dacATT490,_dacATT491,_dacATT492,_dacATT493,_dacATT498,_dacATT1498,
_dacATT2498,_dacICW498,_dacICW516,_dacSTG1700,_dacSTG1702,_dacSTG1703,
_dacCH8391,_dacTr8001:
dacmode($FD,2*ord(on)); {2:on, 0: off}
_dacBt477,_dacBt484,_dacBt485,_dacATT504,_dacATT505:
modreg(setDACpage(dacBTcmd0),2,2*ord(on));
_dacBt481,_dacBt482:
begin
setreg(setDACpage(dacHIcmd),1); {Indexed}
outp(setDACpage(dacSTDwrInx),dacBtIcmdB);
modreg(setDACpage(dacSTDpelMask),2,2*ord(on));
clrreg(setDACpage(dacHIcmd),1); {Normal}
end;
_dacIBM514,_dacIBM524,_dacIBM525,_dacIBM528:
begin
(* wrDACreg(dacIBMind0,$71);
{ wrDACreg(dacIBMind1,0);}
modDACreg(dacIBMdata,4,4*ord(on)); * )
wrDACreg(dacIBMind0,$71);
x:=rdDACreg(dacIBMdata);
wrDACreg(dacIBMind0,$71);
wrDACreg(dacIBMdata,(x and $FB) or 4*ord(on)); *)
end;
_dacSC15021,_dacSC15025:
begin
dac2comm;
outp($3C6,$10);
outp($3C7,8);
outp($3C8,ord(on)); {1: on, 0: off}
{outp($3C9,0); }
outp($3C6,0);
dac2pel;
end;
_dacTVP3010,_dacTVP3020,_dacTVP3025:
begin
wrDACreg(dacTVPindex,$1E);
modDACreg(dacTVPdata,$C,8*ord(on)+4);
end;
_dacTVP3026:
begin
wrDACreg(dacTVP6index,$1E);
modDACreg(dacTVP6data,$C,8*ord(on)+4);
end;
else
case cv.chip of
__Mach64:modreg($62ED,1,ord(on));
__Mach32,
__ati:begin
w:=inpw($8EEE) and $BFFF;
if on then w:=w or $4000;
outpw($7AEE,w);
end;
__Trid:if cv.version>=TR_9200CXr{=TR_GUI9440} then
dacmode($FD,2*ord(on)); {2:on, 0: off}
{dacmode($F7,8*ord(on)); {2:on, 0: off}
__Video7:begin {Don't know if this works yet}
setinx(SEQ,$C1,1);
outp($46E8,$16);
inline($EE);
outp(SEQ,$D0);
modinx(SEQ,$B,3,ord(on)*2+1);
outp($46E8,$E);
inline($EE);
end;
end;
end;
clearDACpage;
end;
function setdac15:boolean;
var m:word;
begin
setdac15:=true;
GetDACpath;
case cv.dactype of
_dacALG1201,_dacALG1301:
dacmode(0,$A2);
_dac15,_dac16,_dacATT490,_dacATT491,_dacATT492,_dacATT493,_dacICS5301,
_dacSC15021,_dacSC15025,_dacMU1880,_dacMU4910,_dacMU9910,_dacUMC188,
_dacCH8391,_dacTR8001:
dacmode(0,$A0);
_dacADAC1:dacmode($38,$C1);
_dacATT498,_dacATT1498,_dacATT2498,_dacICW498,_dacICW516:
if dacpath=8 then dacmode(0,$A0) else dacmode(0,$10);
_dacS3_708,_dacS3_716:
begin
if (inp(SetDACpage(dacHIcmd)) and $10)>0 then m:=$30
else m:=$20;
modreg(SetDACpage(dacHIcmd),$F0,m);
end;
_dacSTG1700,_dacSTG1702,_dacSTG1703:
if (inp(SetDACpage(dacHIcmd)) and 8)=0 then dacmode(0,$A0)
else setSTGdac(2);
_dacBt481,_dacBt482:
setBt1DAC($A0);
_dacBt484,_dacBt485,_dacATT504,_dacATT505:
modreg(SetDACpage(dacBTcmd1),$78,$30);
_dacCH8398:
if dacpath=8 then dacmode(0,$C4) else dacmode(0,$14);
_dacTVP3010,_dacTVP3020,_dacTVP3025:
begin
wrDACreg(dacTVPindex,$18);
modDACreg(dacTVPdata,$CF,$C);
wrDACreg(dacTVPindex,$E);
clrDACreg(dacTVPdata,1);
end;
_dacTVP3026:
begin
wrDACreg(dacTVP6index,$18);
modDACreg(dacTVP6data,$CF,$C);
wrDACreg(dacTVP6index,$E);
clrDACreg(dacTVP6data,1);
end;
_dacATI68860,_dacATI68880:
outp(setDACpage(11),$A0);
_dacInt:case cv.chip of
__chips:modinx(cv.IOadr,6,$C,4);
__Cir54:dacmode(0,$A0);
__WD:modinx(SEQ,$26,$C,$C);
__S3:begin
outpw(crtc,$A039);
modinx(crtc,$67,$F0,$30);
outpw(crtc,$39);
end;
__SiS:modinx(SEQ,6,$1C,4);
__Trid:if cv.version=TR_GUI9440 then dacmode(0,$10)
else dacmode(0,$A0);
end;
_dac0,_dac8,_dacCEG,_dacALG1101:
setdac15:=false;
end;
clearDACpage;
end;
function setdac16:boolean;
var m:word;
begin
GetDACpath;
setdac16:=true;
case cv.dactype of
_dac16,_dacUMC188,_dacTR8001,_dacSC15021,_dacSC15025:
dacmode(0,$E0);
_dacADAC1:
dacmode($38,$C5);
_dacALG1201,_dacALG1301:
dacmode(0,$C2);
_dacATI68860,_dacATI68880:
outp(setDACpage(11),$A1);
_dacCH8391,
_dacATT490,_dacATT491,_dacATT492,_dacATT493,_dacICS5301,_dacMU4910,_dacMU9910:
dacmode(0,$C0);
_dacATT498,_dacATT1498,_dacATT2498:
if dacpath=8 then dacmode(0,$60) else dacmode(0,$30);
_dacBt481,_dacBt482:
setBt1DAC($E0);
_dacBt484,_dacBt485,_dacATT504,_dacATT505:
modreg(SetDACpage(dacBTcmd1),$78,$38);
_dacCH8398:
if dacpath=8 then dacmode(0,$64) else dacmode(0,$34);
_dacMU1880:
dacmode(0,$A6);
_dacS3_708,_dacS3_716:
begin
if (inp(SetDACpage(dacHIcmd)) and $10)>0 then m:=$50
else m:=$60;
modreg(SetDACpage(dacHIcmd),$F0,m);
end;
_dacSTG1700,_dacSTG1702,_dacSTG1703:
if (inp(SetDACpage(dacHIcmd)) and 8)=0 then dacmode(0,$C0)
else setSTGdac(3);
_dacTVP3010,_dacTVP3020,_dacTVP3025:
begin
wrDACreg(dacTVPindex,$18);
modDACreg(dacTVPdata,$CF,$D);
wrDACreg(dacTVPindex,$E);
clrDACreg(dacTVPdata,1);
end;
_dacTVP3026:
begin
wrDACreg(dacTVP6index,$18);
modDACreg(dacTVP6data,$CF,$D);
wrDACreg(dacTVP6index,$E);
clrDACreg(dacTVP6data,1);
end;
_dacInt:case cv.chip of
__chips:modinx(cv.IOadr,6,$C,$C);
__Cir54:dacmode(0,$E1);
__WD:modinx(SEQ,$26,$C,4);
__S3:begin
outpw(crtc,$A039);
modinx(crtc,$67,$F0,$50);
outpw(crtc,$39);
end;
__SiS:modinx(SEQ,6,$1C,8);
__Trid:if cv.version=TR_GUI9440 then dacmode(0,$30)
else dacmode(0,$E0);
else setdac16:=false;
end;
_dacALG1101:; {Unknown}
_dac0,_dac8,_dacCEG,_dac15:
setdac16:=false;
end;
clearDACpage;
end;
function setdac24:boolean;
var m:word;
begin
GetDACpath;
setdac24:=true;
case cv.dactype of
_dacADAC1:
dacmode($38,$80);
_dacALG1201,_dacALG1301:
dacmode(0,$E2);
_dacATI68860,_dacATI68880:
outp(setDACpage(11),$C0);
_dacCH8391,
_dacATT490,_dacATT491,_dacATT492,_dacATT493,_dacICS5301,_dacMU4910,_dacMU9910:
dacmode(0,$E0);
_dacATT498,_dacATT1498,_dacATT2498,_dacICW498,_dacICW516:
dacmode(0,$50);
_dacBt481,_dacBt482:
setBt1DAC($F0);
_dacBt484,_dacBt485,_dacATT504,_dacATT505:
modreg(SetDACpage(dacBTcmd1),$78,$10);
_dacCH8398:
if dacpath=8 then dacmode(0,$74) else dacmode(0,$B4);
_dacMU1880:
dacmode(0,$9E);
_dacSC15021,_dacSC15025:
dacmode(0,$60);
_dacS3_708,_dacS3_716:
begin
if (inp(SetDACpage(dacHIcmd)) and $10)>0 then m:=$70
else m:=$E0;
modreg(SetDACpage(dacHIcmd),$F0,m);
end;
_dacSTG1700:
if (inp(SetDACpage(dacHIcmd)) and 8)=0 then dacmode(0,$E0);
_dacSTG1702,_dacSTG1703:
if (inp(SetDACpage(dacHIcmd)) and 8)=0 then dacmode(0,$E0)
else setSTGdac(9); {1702/3 only!}
_dacTR8001:
dacmode(0,$C2);
_dacUMC188:
dacmode(0,$F0);
_dacInt:case cv.chip of
__chips:if (cv.chip=__chips) and (cv.Version=CT_64300) then
modinx(cv.IOadr,6,$C,8);
__Cir54:begin
dacmode(0,$E5);
modinx(SEQ,7,$E,4);
end;
__S3:begin
outpw(crtc,$A039);
modinx(crtc,$67,$F0,$D0);
outpw(crtc,$39);
end;
__SiS:modinx(SEQ,6,$1C,$10);
__Trid:if cv.version=TR_GUI9440 then dacmode(0,$D0)
else dacmode(0,$C2);
else setdac24:=false;
end;
_dacBt477,
_dacALG1101,_dac0,_dac8,_dacCEG,_dac15,_dac16:setdac24:=false;
else setdac24:=false;
end;
clearDACpage;
end;
function setdac32:boolean;
var m:word;
begin
setdac32:=true;
case cv.dactype of
_dacATI68860,_dacATI68880:
outp(setDACpage(11),$E3);
_dacATT498,_dacATT1498,_dacATT2498,_dacICW498,_dacICW516:
dacmode(0,$50);
_dacBt484,_dacBt485,_dacATT504,_dacATT505:
modreg(SetDACpage(dacBTcmd1),$78,$10);
_dacS3_708,_dacS3_716:
modreg(SetDACpage(dacHIcmd),$F0,$70);
_dacSC15021,_dacSC15025:
dacmode(0,$40);
_dacSTG1700,_dacSTG1702,_dacSTG1703:
if (inp(SetDACpage(dacHIcmd)) and 8)>0 then setSTGdac(4);
_dacTR8001:
dacmode(0,$C4);
_dacInt:case cv.chip of
__Cir54:begin
dacmode(0,$E5);
modinx(SEQ,7,$E,8);
end;
end;
(* _dacMus,
_dacATT:dacmode(0,$E0);
_dacATT2:dacmode(0,$50);
_dacSC24:dacmode(0,$60);
_dacCL24:begin
dacmode(0,$E5);
setinx(SEQ,7,8);
end;
_dacS3:begin
if (inp(SetDACpage(dacHIcmd)) and $10)>0 then m:=$70
else m:=$E0;
modreg(SetDACpage(dacHIcmd),$F0,m);
end;
_dacCHRON:dacmode(0,$74); {or $54/$B4 for 16bit/clk?}
_dacTVP:begin
modinx(setDACpage(dacTVPindex),$18,$CF,$E);
clrinx(setDACpage(dacTVPindex),$E,$1);
end;
_dacInt:case cv.chip of
__chips:if (cv.chip=__chips) and (cv.Version=CT_64300) then
modinx(cv.IOadr,6,$C,8);
__S3:begin
outpw(crtc,$A039);
modinx(crtc,$67,$F0,$D0);
outpw(crtc,$39);
end;
else setdac32:=false;
end; *)
_dacBt477,
_dacALG1101,_dac0,_dac8,_dacCEG,_dac15,_dac16:setdac32:=false;
else setdac32:=false;
end;
clearDACpage;
end;
{Returns the pixel BIT address}
function pixeladdress(x,y:word):longint;
begin
case memmode of
_pk4,_pk4a,_pk4b:pixeladdress:=(bytes*y*2+x) shl 2;
_p8:pixeladdress:=(bytes*y+x) shl 3;
_p15,_p16:pixeladdress:=(bytes*y+x*2) shl 3;
_p24,_p24b:pixeladdress:=(bytes*y+x*3) shl 3;
_p32.._p32d:pixeladdress:=(bytes*y+x*4) shl 3;
end;
end;
procedure setvstart(x,y:word); {Set the display start address}
var
adr:record {The linear start address (l) is overlayed with
the individual bytes (pel, displ,disph and bank)}
case byte of
0:(l:longint);
1:(pel:byte;disp:word;bank:byte);
end;
stdvga:boolean;
shft:word;
begin
stdvga:=(cv.flags and FLG_StdVGA)>0; {default, can be disabled}
shft:=5;
case cv.chip of
__vesa:begin
rp.bx:=0;
rp.cx:=x;
rp.dx:=y;
vio($4F07);
if rp.ax=0 then;
stdvga:=false;
end;
else
case memmode of
_text,_txt2,_txt4:
adr.l:=(bytes*y+x*2)*2;
_cga2:adr.l:=(bytes*y+(x shr 2))*4;
_cga1,_pl1,_pl2,_pl4:
adr.l:=(bytes*y*8+x) shl 5;
_pk4,_pk4a,_pk4b:adr.l:=(bytes*y*2+x) shl 5;
_p8:adr.l:=(bytes*y+x) shl 6;
_p15,_p16:adr.l:=(bytes*y+x*2) shl 6;
_p24,_p24b:adr.l:=(bytes*y+x*3) shl 6;
_p32.._p32d:adr.l:=(bytes*y+x*4) shl 6;
end;
case cv.chip of
__Acer:modinx(crtc,$81,$30,adr.bank shl 4);
__ahead:begin {Maybe this is only for the B??}
if (memmode=_p8) and ((rdinx(GRC,$C) and $20)>0) then
adr.l:=adr.l shr 1;
modinx(GRC,$1C,3,adr.bank);
end;
__Alli:modinx(crtc,$1C,$F,adr.bank);
__ARK:begin
if (rdinx(crtc,$46) and 4)>0 then adr.l:=adr.l shr 1;
modinx(crtc,$40,7,adr.bank);
end;
__ati:begin
if ((cv.version=ATI_18800_1) and ((rdinx(cv.IOadr,$B3)
and $40)>0)) or ((cv.version>=ATI_18800_1)
and ((rdinx(cv.IOadr,$B0) and $20)>0)) then adr.l:=adr.l shr 1;
modinx(cv.IOadr,$B0,$40,adr.bank shl 6); {DSA bit 16}
if (cv.version>ATI_18800_1) then
modinx(cv.IOadr,$A3,$10,adr.bank shl 3); {DSA bit 17}
if cv.version>=ATI_GUP_3 then
modinx(cv.IOadr,$AD,$C,adr.bank);
if (cv.Version>=ATI_M64_GX) and (memmode<_P8) then shft:=6;
end;
__ALG:begin
if (rdinx(GRC,$C) and $10)<>0 then adr.l:=adr.l shr 1;
modinx(crtc,$20,7,adr.bank);
end;
__chips:begin
wrinx(cv.IOadr,$C,adr.bank);
if (rdinx(cv.IOadr,$28) and $10)>0 then shft:=6;
end;
__cir54:begin
inc(adr.bank,adr.bank and 6); {move bit 1-2 to 2-3}
modinx(crtc,$1B,$D,adr.bank);
if (rdinx(SEQ,7) and 1)>0 then inc(shft);
if (rdinx(SEQ,7) and 6)=6 then inc(shft);
end;
__cir64:wrinx(GRC,$7C,adr.bank);
__compaq:begin
modinx(GRC,$42,$1C,adr.bank shl 2);
if (memmode=_P8) and (curmode<>$13) then shft:=6;
end;
__HMC:begin
if (rdinx(SEQ,$E7) and 1)>0 then adr.l:=adr.l shr 1;
modinx(SEQ,$ED,1,adr.bank);
end;
__AGX:begin
stdvga:=false;
wrinx3(cv.IOadr+10,$40,adr.l shr 8);
end;
__Mach32:begin
outpw($2AEE,adr.disp);
outpw($2EEE,adr.bank);
stdvga:=false;
end;
__Mach64:begin
meml[cv.Xseg:$14]:=(meml[cv.Xseg:$14] and $FFF00000)
or (adr.l shr 9);
stdvga:=false;
end;
__Matrox:begin
if memmode=_p8 then
begin
adr.l:=adr.l shr 1;
clrinx(crtc,$11,$80);
modinx(crtc,8,$60,adr.disp shl 5);
end;
modinx($3DE,$A,$13,adr.bank+$10);
end;
__mxic:begin
modinx(SEQ,$F1,3,adr.bank);
if (memmode>=_p8) and (curmode<>$13) then inc(shft);
end;
__ncr:modinx(crtc,$31,$F,adr.bank);
__oak:if cv.Version<=OAK_083 then
begin
if (memmode>_pl4) and (curmode<>$13) then adr.l:=adr.l shr 1;
modinx($3DE,$14,8,adr.bank shl 3); {lower bit}
modinx($3DE,$16,8,adr.bank shl 2); {upper bit}
end
else begin
if (memmode>_pl4) and ((rdinx($3DE,$21) and 4)>0) then
adr.l:=adr.l shr 1;
modinx($3DE,$17,7,adr.bank);
end;
__p2000:begin
modinx(GRC,$21,$7,adr.bank);
if memmode>=_P8 then inc(shft);
end;
__WD:begin
modinx(GRC,$D,$18,adr.bank shl 3);
if cv.version=WD_90c33 then
begin
x:=rdinx(crtc,$11);
clrinx(crtc,$11,$80); {Must unlock}
modinx(crtc,$3E,$40,adr.bank shl 4);
wrinx(crtc,$11,x);
end;
end;
__realtek:begin
if (rdinx(GRC,$C) and $10)<>0 then adr.l:=adr.l shr 1;
inc(adr.bank,adr.bank and 2); {shift high bit one up.}
modinx(crtc,$19,$50,adr.bank shl 4);
end;
__s3:begin
wrinx(crtc,$38,$48);
modinx(crtc,$31,$30,adr.bank shl 4);
if cv.version>S3_924 then
begin
wrinx(crtc,$39,$A5);
modinx(crtc,$51,3,adr.bank shr 2);
wrinx(crtc,$39,$5A);
end;
wrinx(crtc,$38,0);
end;
__SC:modinx(crtc,$1E,$F,adr.bank);
__SiS:modinx(SEQ,$27,$F,adr.bank);
__trid:begin
if cv.version>TR_8800CS then
begin
wrinx(SEQ,$B,0); {select old mode regs}
if (rdinx(SEQ,$D) and $10)>0 then adr.l:=adr.l shr 1;
if (cv.Version=TR_8900B) or (cv.Version=TR_8900C) then
modinx(SEQ,$E,1,adr.bank shr 1);
if rdinx(SEQ,$B)=0 then; {Select new mode regs}
end;
modinx(crtc,$1E,$20,adr.bank shl 5);
if cv.Version>=TR_9000C then
modinx(crtc,$27,3,adr.bank shr 1);
if (cv.version>=TR_8900CL) and ((rdinx(GRC,$F) and 2)>0) then shft:=6;
end;
__Tseng:if cv.version=ET_3000 then
begin
if (memmode=_p8) or ((rdinx(SEQ,7) and $40)>0) then
begin
adr.l:=adr.l shr 1;
inc(shft);
end;
modinx(crtc,$23,2,adr.bank shl 1);
end
else begin
if cv.version=ET_4000 then x:=3 else x:=$F;
modinx(crtc,$33,x,adr.bank);
if (memmode>=_p8) and (curmode<>$13) then inc(shft);
end;
__UMC:begin
if (rgs.crtcregs.x[$33] and $10)>0 then adr.l:=adr.l shr 1;
modinx(crtc,$33,3,adr.bank);
end;
__video7:begin
modinx(SEQ,$F6,$30,adr.bank shl 4);
if (rdinx(SEQ,$C8) and $10)>0 then shft:=6;
end;
{ __Weitek:begin This doesn't work!!
modinx(SEQ,5,$84,$80+(adr.bank shl 2));
wrinx(crtc,$1A,hi(adr.disp));
wrinx(crtc,$1B,lo(adr.disp));
stdvga:=false;
end; }
__xbe,__xga:begin
stdvga:=false;
wrinx3(cv.IOadr+10,$40,adr.l shr 8);
end;
end;
end;
if stdvga then
begin
clrinx(crtc,$11,$80);
wrinx($3C0,$13,adr.pel shr shft);
outp($3C0,$33);
wrinx(crtc,$D,lo(adr.disp));
wrinx(crtc,$C,hi(adr.disp));
end;
end;
begin
end.