(* This file holds all the BITBLT, Line draw, HW cursor and clock functions *) {Wait for WD engine ready} procedure WD_wait; begin if cv.version=WD_90c33 then repeat until (inp($23CE) and 15)=0 else begin {c31,c24} outpw($23C0,$1001); repeat until (inpw($23C2) and $800)=0; end; end; procedure WD_outl(index:word;l:longint); begin outpw($23C2,index+(l and $FFF)); outpw($23C2,index+$1000+(l shr 12)); end; procedure setHWcurmap(VAR map:CursorType); var x,y,z,w,lbank,x0,y0:word; l,curadr:longint; bm:array[0..127] of byte; mp:record case integer of 0:(b:array[0..2047] of byte); 1:(w:array[0..1023] of word); 2:(l:array[0..511] of longint); end; procedure copyCurMap(bytes:word); var x,y:word; l:longint; begin l:=curadr; if memmode=_PL4 then l:=l shr 2; setbank(l shr 16); if memmode=_PL4 then begin wrinx(GRC,3,0); clrinx(GRC,5,$3); wrinx(GRC,8,$FF); for x:=0 to bytes-1 do begin wrinx(SEQ,2,1 shl (x and 3)); y0:=mem[SegA000:l]; mem[SegA000:l]:=mp.b[x]; if (x and 3)=3 then inc(l); end; end else move(mp,mem[SegA000:l],bytes); end; function al_packmap(map:byte):word; var i,j:word; begin j:=0; for i:=0 to 7 do begin j:=j shl 2+2; if ((map shr i) and 1)>0 then dec(j); end; al_packmap:=j; end; function al_packmap2(map:byte):longint; var i:word; j:longint; begin j:=0; for i:=0 to 7 do begin j:=j shl 4+$A; if ((map shr i) and 1)>0 then dec(j,5); end; al_packmap2:=j; end; function pack8to16(w:word):word; var x,i:word; begin i:=0; for x:=0 to 7 do begin i:=i shl 2; if ((w shl x) and 128)>0 then inc(i,3); end; pack8to16:=i; end; function swapb(b:word):word; var i,j:word; begin j:=0; for i:=0 to 7 do if ((b shr i) and 1)>0 then inc(j,128 shr i); swapb:=j; end; function swapl(l:longint):longint; var x,y:array[0..3] of byte; begin swapl:=(l and $FF0000FF)+((l shl 8) and $FF0000) +((l shr 8) and $FF00) end; begin curadr:=cv.mm*longint(1024)-2048; { if memmode=_pl4 then curadr:=curadr shr 2;} move(map,mp,128); move(map,bm,128); if dacHWcursor then case cv.dactype of _dacBT484,_dacBt485: begin outp(setDACpage(dacSTDwrInx),$80); for x:=0 to 127 do outp(setDACpage(dacBTcMap),not mp.b[x]); outp(setDACpage(dacSTDwrInx),0); for x:=0 to 127 do outp(setDACpage(dacBTcMap),mp.b[x]); modreg(setDACpage(dacBTcmd2),3,2); end; _dacTVP3010,_dacTVP3020,_dacTVP3025: begin fillchar(mp,1024,$AA); y:=124; for x:=127 downto 0 do {repack from 32x32x1 to 64x64x2 map} begin mp.w[y+x]:=swap(pack8to16(bm[x])) or $AAAA; if (x and 3)=0 then dec(y,4); end; wrDACreg(dacTVPindex,6); modDACreg(dacTVPdata,$C0,$40); {TVP302x mode & MS-Win cursor} wrDACreg(dacTVPindex,8); wrDACreg(dacTVPdata,0); wrDACreg(dacTVPindex,9); wrDACreg(dacTVPdata,0); wrDACreg(dacTVPindex,$A); {Select Cursor RAm index} for x:=0 to $3FF do wrDACreg(dacTVPdata,mp.b[x]); wrDACreg(dacTVPindex,4); wrDACreg(dacTVPdata,0); wrDACreg(dacTVPindex,5); wrDACreg(dacTVPdata,0); end; _dacTVP3026: begin fillchar(mp,1024,$AA); y:=124; for x:=127 downto 0 do {repack from 32x32x1 to 64x64x2 map} begin mp.w[y+x]:=swap(pack8to16(bm[x])) or $AAAA; if (x and 3)=0 then dec(y,4); end; wrDACreg(dacTVP6index,6); modDACreg(dacTVP6data,$C0,$40); {TVP302x mode & MS-Win cursor} wrDACreg(dacTVP6index,8); wrDACreg(dacTVP6data,0); wrDACreg(dacTVP6index,9); wrDACreg(dacTVP6data,0); wrDACreg(dacTVP6index,$A); {Select Cursor RAm index} for x:=0 to $3FF do wrDACreg(dacTVP6data,mp.b[x]); wrDACreg(dacTVP6index,4); wrDACreg(dacTVP6data,0); wrDACreg(dacTVP6index,5); wrDACreg(dacTVP6data,0); end; end else case cv.chip of __AGX:begin wrinx(cv.IOadr+10,$36,0); wrinx(cv.IOadr+10,$32,32); wrinx(cv.IOadr+10,$35,32); x:=((cv.mm shr 1)-1) xor $1DF; wrinx(cv.IOadr+10,$6E,x); modinx(cv.IOadr+10,$6F,3,hi(x)); wrinx2(cv.IOadr+10,$60,512); y:=128; for x:=127 downto 0 do begin mp.w[x+y]:=pack8to16(swapb(bm[x])) xor $AAAA; if (x and 3)=0 then dec(y,4); end; for x:=0 to 511 do wrinx(cv.IOadr+10,$6A,mp.b[x]); wrinx(cv.IOadr+10,$36,1); end; __ALG:begin x0:=0; fillchar(mp,1024,$AA); if memmode<=_p8 then begin y:=0; for x:=0 to 127 do begin mp.w[y+x]:=al_packmap(bm[x]); if (x and 3)=3 then inc(y,4); end; end else for x:=0 to 127 do {Double size for 64k mode} mp.l[x]:=al_packmap2(bm[x]); curadr:=(cv.mm-1)*longint(1024); CopyCurMap(1024); w:=cv.mm-1{curadr shr 10}; if cv.version=ALG_2101 then begin wrinx2(crtc,$27,w); end else begin outpw($82C8,w); end; x:=inp(crtc+6); {force ATTR to address mode} x:=inp($3C0); y:=rdinx($3C0,$31); {Must preserve index 11h and 12h} z:=rdinx($3C0,$32); wrinx($3C0,$35,$FF); {Foreground index #} wrinx($3C0,$36,0); wrinx($3C0,$31,y); wrinx($3C0,$32,z); outp($3C0,x); end; __Alli:begin curadr:=2048; for x:=0 to 255 do mp.l[x]:=$55AAFF; CopyCurMap(1024); if mem[SegA000:$D8]=0 then; outpw(SEQ,$1210); setinx(SEQ,$1C,8); modinx(SEQ,$1B,15,1); memw[SegA000:$7944]:=curadr shr 10; memw[SegA000:$794C]:=$2020; mem [SegA000:$7940]:=1; clrinx(SEQ,$1B,7); clrinx(SEQ,$1C,8); end; __ARK:begin {Doesn't work yet} curadr:=cv.mm*longint(1024)-256; for x:=0 to 127 do mp.w[x]:=(bm[x]*$101) xor $FF; CopyCurMap(256); case colbits[memmode] of 15,16:x:=1; 24,32:x:=2; else x:=0; end; wrinx(SEQ,$20,x or 8); wrinx(SEQ,$25,$3F); wrinx2(SEQ,$2C,$0); {Hotspot} end; __chips:if cv.version=CT_452 then begin for x:=255 downto 0 do mp.w[x]:=mp.w[x div 4]; CopyCurMap(512); wrinx(cv.IOadr,$A,0); wrinx2m(cv.IOadr,$30,{cv.mm*longint(64)-$20}curadr shr 4); wrinx(cv.IOadr,$32,$ff); wrinx(cv.IOadr,$37,1); wrinx(cv.IOadr,$38,$FF); wrinx(cv.IOadr,$39,0); wrinx(cv.IOadr,$3A,$FF); {Cursor FG color index} end; __cir54:begin clrinx(SEQ,$12,3); wrinx(GRC,11,$24); move(mp,mp.b[128],128); CopyCurMap(256); setHWcurcol($ff0000,$ff); wrinx(SEQ,$13,$38); {Cursor at End of Ram -2K} end; __Mach32:begin outp($1AEF,255); outpw($1EEE,0); fillchar(mp,1024,$AA); y:=0; for x:=0 to 127 do begin mp.w[y+x]:=al_packmap(bm[x]); if (x and 3)=3 then inc(y,4); end; CopyCurMap(1024); l:={(cv.mm*longint(1024)-1024) div 4}curadr shr 2; outpw($AEE,l); outpw($EEE,(l shr 16) or $8000); end; __Mach64:begin meml[cv.Xseg:$70]:=$200020; meml[cv.Xseg:$68]:=curadr shr 3; y:=4; for x:=0 to 127 do begin mp.w[y+x]:=al_packmap(bm[x]); if (x and 3)=3 then inc(y,4); end; {for x:=0 to 127 do mp.l[x]:=$55AAFF; } CopyCurMap(1024); setreg($66EC,$80); end; __ncr:begin w:=curadr shr 6; {(cv.mm*longint(16))-4; {256 bytes from the end of Vmem.} y:=128; for x:=127 downto 0 do begin mp.b[x+y]:=swapb(mp.b[x]); if (x and 3)=0 then dec(y,4); end; for x:=0 to 31 do mp.l[x*2]:=mp.l[x*2+1] xor $FFFFFFFF; wrinx2m(SEQ,$11,$101); CopyCurMap(256); wrinx(SEQ,$A,$FF); {Fg color} wrinx(SEQ,$B,$0); wrinx2m(SEQ,$13,0); wrinx2m(SEQ,$15,w); wrinx(SEQ,$17,$FF); w:=3; {Enable & 32x32} if cv.version>=NCR_77c22ep then case memmode of _P15,_P16:w:=w or $20; _P24,_P24b:w:=w or $40; _P32,_P32b,_P32c,_P32d:w:=w or $60; end; wrinx(SEQ,$C,w); end; __Oak:if cv.Version>=OAK_083 then begin for x:=0 to 255 do mp.l[x]:=0; y:=384; for x:=127 downto 0 do begin mp.b[x+y]:=swapb(bm[x] xor 255); if (x and 3)=0 then dec(y,12); end; CopyCurMap(1024); wrinx2($3DE,$44,$1f20); {Limit to 32x32} l:=curadr shr 3; wrinx2($3DE,$47,l); wrinx2($3DE,$49,l shr 16); wrinx($3DE,$4A,255); wrinx($3DE,$4B,254); wrinx($3DE,$4C,1); end; __S3:begin wrinx(crtc,$39,$A0); if (memmode>_p8) and (cv.Version<=S3_924) then begin for x:=0 to 127 do begin y:=pack8to16(bm[x]); mp.l[x]:=(longint(lo(y)) shl 24)+(y and $FF00)+$FF00FF; end; for x:=256 to 511 do mp.w[x]:=$ff; end else begin for x:=0 to 255 do mp.l[x]:=$ffff; {Transparent} y:=376; for x:=127 downto 0 do begin mp.b[x+y]:=bm[x]; mp.b[x+y-2]:=not bm[x]; if (x and 1)=0 then dec(y,2); if (x and 3)=0 then dec(y,8); end; if memmode=_pk4a then for x:=0 to 511 do mp.b[x]:=lo((mp.b[x] shl 4)+(mp.b[x] shr 4)); if (cv.Version=S3_801AB) and ((rdinx(crtc,$58) and $10)=0) then for x:=0 to 255 do {What a hack....} mp.l[x]:=(mp.l[x] and $FF0000FF) +((mp.l[x] shl 8) and $FF0000) +((mp.l[x] shr 8) and $FF00); end; CopyCurMap(1024); wrinx(crtc,$39,$A0); {CurMap turns off Ext Regs} if cv.Version>S3_924 then wrinx(crtc,$58,x); wrinx2(crtc,$4E,0); wrinx2m(crtc,$4C,curadr shr 10); wrinx(crtc,$39,0); end; __SiS:begin curadr:=cv.mm*longint(1024)-$4000; for x:=0 to 255 do mp.l[x]:=$AAAAAAAA; y:=124; for x:=127 downto 0 do begin w:=0; for z:=7 downto 0 do begin w:=w shl 2; if ((bm[x] shr z) and 1)=0 then inc(w,2); end; mp.w[x+y]:=swap(w); if (x and 3)=0 then dec(y,4); end; CopyCurMap(1024); if (rdinx(SEQ,6) and $20)>0 then {Interlace} begin inc(curadr,$400); CopyCurMap(1024); end; setinx(SEQ,6,$40); wrinx(SEQ,$1C,0); wrinx(SEQ,$1F,0); end; __Tseng:if cv.version>=ET_4W32 then begin for x:=0 to 255 do mp.l[x]:=$AAAAAAAA; y:=384; begin for x:=127 downto 0 do begin mp.w[x+y]:=al_packmap(bm[x]); if (x and 3)=0 then dec(y,4); end; CopyCurMap(1024); wrinx($217A,$EE,1); wrinx2($217A,$EB,2); {l:=cv.mm*longint(256)-256;} end; wrinx3($217A,$E8,curadr shr 2); wrinx($217A,$EF,2); wrinx($217A,$ED,0); wrinx2($217A,$E2,32); wrinx2($217A,$E6,32); setinx($217A,$F7,$80); end; __Trid:begin for x:=0 to 31 do begin mp.l[x*2 ]:=not map[x]; mp.l[x*2+1]:=map[x]; end; CopyCurMap(256); wrinx2(crtc,$44,curadr shr 10); wrinx2(crtc,$46,0); {Hotspot = 0,0} wrinx(crtc,$50,$80); end; __WD:begin {WD90c24,31,33} WD_wait; outp($23C0,2); for x:=127 downto 0 do mp.w[x]:=mp.b[x] shl 8+$ff; {XOR cursor, how to set fore&bkground colors ?} CopyCurMap(256); { l:=cv.mm*longint(256)-64; } WD_outl($1000,curadr shr 2); if cv.version=WD_90c33 then w:=$C000 else w:=$5000; outpw($23C2,w); if memmode>_p8 then w:=$810 else w:=$860; {Mode 3} outpw($23C2,w); outpw($23C0,1); end; __Cirrus, __Video7:begin for x:=0 to 63 do mp.w[x]:=mp.w[x] xor $FFFF; move(map,mp.b[128],128); CopyCurMap(256); wrinx(SEQ,$94,curadr shr 8); modinx(SEQ,$FF,$60,curadr shr 13); setinx(SEQ,$A5,$80); {Enable cursor} end; __xbe,__xga:begin wrinx(cv.IOadr+10,$36,0); fillchar(mp,1024,$ff); wrinx2(cv.IOadr+10,$60,0); for x:=0 to 1024 do wrinx(cv.IOadr+10,$6A,mp.b[x]); setHWcurcol($ff0000,$ff); wrinx(cv.IOadr+10,$32,0); wrinx(cv.IOadr+10,$35,0); wrinx(cv.IOadr+10,$36,1); end; end; clearDACpage; end; procedure setHWcurcol(fgcol,bkcol:longint); var fgc,bkc:longint; w:word; begin fgc:=rgb(fgcol shr 16,hi(fgcol),lo(fgcol)); bkc:=rgb(bkcol shr 16,hi(bkcol),lo(bkcol)); if dacHWcursor then case cv.dactype of _dacBt484,_dacBt485: begin outp(setDACpage(dacBTcwrInx),1); w:=setDACpage(dacBTcData); outp(w,bkcol shr 16); outp(w,hi(bkcol)); outp(w,lo(bkcol)); outp(w,fgcol shr 16); outp(w,hi(fgcol)); outp(w,lo(fgcol)); end; _dacTVP3010,_dacTVP3020,_dacTVP3025: begin wrDACreg(dacTVPindex,$23); wrDACreg(dacTVPdata,bkcol shr 16); wrDACreg(dacTVPindex,$24); wrDACreg(dacTVPdata,hi(bkcol)); wrDACreg(dacTVPindex,$25); wrDACreg(dacTVPdata,lo(bkcol)); wrDACreg(dacTVPindex,$26); wrDACreg(dacTVPdata,fgcol shr 16); wrDACreg(dacTVPindex,$27); wrDACreg(dacTVPdata,hi(fgcol)); wrDACreg(dacTVPindex,$28); wrDACreg(dacTVPdata,lo(fgcol)); end; _dacTVP3026: begin wrDACreg(dacTVP6index,$23); wrDACreg(dacTVP6data,bkcol shr 16); wrDACreg(dacTVP6index,$24); wrDACreg(dacTVP6data,hi(bkcol)); wrDACreg(dacTVP6index,$25); wrDACreg(dacTVP6data,lo(bkcol)); wrDACreg(dacTVP6index,$26); wrDACreg(dacTVP6data,fgcol shr 16); wrDACreg(dacTVP6index,$27); wrDACreg(dacTVP6data,hi(fgcol)); wrDACreg(dacTVP6index,$28); wrDACreg(dacTVP6data,lo(fgcol)); end; end else case cv.chip of __ARK:begin if (memmode=_P15) or (memmode=_P16) then begin fgcol:=rgb(fgcol shr 16,hi(fgcol),lo(fgcol)); bkcol:=rgb(bkcol shr 16,hi(bkcol),lo(bkcol)); end; wrinx(SEQ,$26,lo(fgcol)); wrinx(SEQ,$27,hi(fgcol)); wrinx(SEQ,$28,fgcol shr 16); wrinx(SEQ,$29,lo(bkcol)); wrinx(SEQ,$2A,hi(bkcol)); wrinx(SEQ,$2B,bkcol shr 16); end; __cir54:begin modinx(SEQ,$12,3,2); outp($3C8,$ff); outp($3C9,lo(fgcol) shr 2); outp($3C9,hi(fgcol) shr 2); outp($3C9,fgcol shr 18); outp($3C8,0); outp($3C9,lo(bkcol) shr 2); outp($3C9,hi(bkcol) shr 2); outp($3C9,bkcol shr 18); modinx(SEQ,$12,3,1); end; __Mach32:begin outp($1AEE,lo(bkcol)); outp($1AEF,lo(fgcol)); if memmode>_p8 then begin outpw($3AEE,bkcol shr 8); outpw($3EEE,fgcol shr 8); end end; __Mach64:begin meml[cv.Xseg:$60]:=(fgcol shl 8)+lo(fgcol); meml[cv.Xseg:$64]:=(bkcol shl 8)+lo(bkcol); end; __S3:begin { wrinx(crtc,$38,$48); } wrinx(crtc,$39,$A0); if memmode>_p8 then begin if rdinx(crtc,$45)=0 then; wrinx(crtc,$4A,fgc); wrinx(crtc,$4A,fgc shr 8); if memmode>=_p24 then wrinx(crtc,$4A,fgc shr 16); if rdinx(crtc,$45)=0 then; wrinx(crtc,$4B,bkc); wrinx(crtc,$4B,bkc shr 8); if memmode>=_p24 then wrinx(crtc,$4B,bkc shr 16); end else begin wrinx(crtc,$E,fgcol); wrinx(crtc,$F,bkcol); end; wrinx(crtc,$39,0); end; __SiS:begin wrinx3(SEQ,$14,fgcol); wrinx3(SEQ,$17,bkcol); end; __WD:begin outp($23C0,2); outpw($23C2,$8000+lo(fgcol)); outp($23C0,1); end; __Oak, __NCR, __AGX, __Tseng:(*if cv.version>=ET_4W32 then *) begin outp($3C8,$FF); outp($3C9,lo(fgcol) shr 2); outp($3C9,hi(fgcol) shr 2); outp($3C9,fgcol shr 18); end; (* __AGX:; *) __xbe,__XGA:begin wrinx3m(cv.IOadr+10,$38,fgcol); wrinx3m(cv.IOadr+10,$3B,bkcol); end; end; clearDACpage; end; procedure HWcuronoff(on:boolean); begin if dacHWcursor then case cv.dactype of _dacBt484,_dacBt485: modreg(setDACpage(dacBTcmd2),3,2*ord(on)); _dacTVP3010,_dacTVP3020,_dacTVP3025: begin wrDACreg(dacTVPindex,6); modDACreg(dacTVPdata,$40,$40*ord(on)); end; _dacTVP3026: begin wrDACreg(dacTVP6index,6); modDACreg(dacTVP6data,$40,$40*ord(on)); end; end else case cv.chip of __Alli:begin if mem[SegA000:$D8]=0 then; outpw(SEQ,$1210); setinx(SEQ,$1C,8); modinx(SEQ,$1B,7,1); mem[SegA000:$7940]:=ord(on); clrinx(SEQ,$1B,7); clrinx(SEQ,$1C,8); end; __ARK:modinx(SEQ,$20,8,8*ord(on)); __Mach32:outp($EEF,$80*ord(on)); __Mach64:modreg($66EC,$80,$80*ord(on)); __oak:if cv.version>=OAK_083 then modinx($3DE,$4C,1,ord(on)); __S3:begin { wrinx(crtc,$38,$48); } wrinx(crtc,$39,$A0); modinx(crtc,$45,3,2+ord(on)); wrinx(crtc,$39,0); end; __SiS:modinx(SEQ,6,$40,ord(on)*$40); __Trid:modinx(crtc,$50,$80,ord(on)*$80); __WD:begin outp($23C0,2); outpw($23C2,ord(on)*$800); end; __AGX, __xbe,__xga:wrinx(cv.IOadr+10,$36,ord(on)); __Cirrus, __Video7:modinx(SEQ,$A5,$80,ord(on)*$80); end; clearDACpage; end; procedure setHWcurpos(X,Y:word); var l:longint; w:word; begin if extpixfact>1 then x:=x*extpixfact; if extlinfact>1 then Y:=Y*extlinfact; if dacHWcursor then case cv.dactype of _dacBt484,_dacBt485: begin inline($fa); outpw(setDACpage(dacBTcurX),x+32); outpw(setDACpage(dacBTcurY),y+32); inline($fb); end; _dacTVP3010,_dacTVP3020,_dacTVP3025: begin wrDACreg(dacTVPindex,0); wrDACreg(dacTVPdata,lo(x)); wrDACreg(dacTVPindex,1); wrDACreg(dacTVPdata,hi(x)); wrDACreg(dacTVPindex,2); wrDACreg(dacTVPdata,lo(y)); wrDACreg(dacTVPindex,3); wrDACreg(dacTVPdata,hi(y)); end; _dacTVP3026: begin wrDACreg(dacTVP6index,0); wrDACreg(dacTVP6data,lo(x)); wrDACreg(dacTVP6index,1); wrDACreg(dacTVP6data,hi(x)); wrDACreg(dacTVP6index,2); wrDACreg(dacTVP6data,lo(y)); wrDACreg(dacTVP6index,3); wrDACreg(dacTVP6data,hi(y)); end; end else case cv.chip of __ALG:if cv.version=ALG_2101 then begin if (rdinx(crtc,$19) and 1)=0 then y:=y*2; if ((memmode=_P8) and ((rdinx(GRC,$C) and $10)=0)) or (memmode>_P8) then x:=x*2; wrinx(crtc,$21,x shr 3); wrinx(crtc,$23,y shr 1); modinx(crtc,$25,$7f,((x and 7) shl 2) + (y shr 9) +((y and 1) shl 6) or $20); end else begin clrinx(crtc,$1A,4); setinx(GRC,$F,$25); outpw($82CA,x); outpw($82CC,y); clrinx(GRC,$F,1); setinx(crtc,$1A,$54); end; __Alli:begin if mem[SegA000:$D8]=0 then; outpw(SEQ,$1210); setinx(SEQ,$1C,8); modinx(SEQ,$1B,15,1); memw[SegA000:$7948]:=x; memw[SegA000:$794A]:=y; clrinx(SEQ,$1B,7); clrinx(SEQ,$1C,8); end; __ARK:begin wrinx2m(SEQ,$21,x); wrinx2m(SEQ,$23,y); end; __chips:if cv.version=CT_452 then begin wrinx2m(cv.IOadr,$33,x); wrinx2m(cv.IOadr,$35,y); end; __CIR54:BEGIN outpw(SEQ,(x shl 5) or $10); outpw(SEQ,(y shl 5) or $11); END; __Mach32:begin outpw($12EE,x); outpw($16EE,y); end; __Mach64:begin memw[cv.Xseg:$6C]:=x; memw[cv.Xseg:$6E]:=y; end; __ncr:begin wrinx2m(SEQ,$D,x); wrinx2m(SEQ,$F,y); end; __Oak:if cv.Version>=OAK_083 then begin wrinx2m($3DE,$40,x and $FFFC); wrinx2m($3DE,$42,y); end; __S3:begin if (curmode=$13) or (curmode=$D) then x:=x*2 else if cv.version=_P24 then x:=x*3 else if (memmode>=_P15) then x:=x*2; end else if (memmode>=_P32) and (cv.version0 then {Interlace} begin if (y and 1)>0 then y:=y+$2000; y:=y shr 1; end; wrinx2(SEQ,$1D,y); end; __Trid:begin wrinx2(crtc,$40,x); wrinx2(crtc,$42,y); end; __Tseng:if cv.version>=ET_4W32 then begin if cv.version=$20) and (cv.subvers<$40) then begin repeat until (inp(crtc+6) and 2)>0; repeat w:=inp(crtc+6) until (w and 2)=0; wrinx2($217A,$E4,y); if (w and $40)=0 then begin outp($3BF,3); outp($3D8,$A0); modinx(crtc,$37,$40,$40); modinx(crtc,$37,$40,0); outp($3D8,$29); outp($3BF,1); end; end else wrinx2($217A,$E4,y); wrinx2($217A,$E6,32); wrinx2($217A,$E0,x); wrinx2($217A,$E2,32); end; (* __AGX:if (inp(cv.IOadr) and 4)>0 then begin wrinx2(cv.IOadr+10,$30,x); wrinx2(cv.IOadr+10,$33,y); end; *) __WD:begin outp($23C0,2); if cv.version=WD_90c33 then begin if (memmode=_p15) or (memmode=_p16) then x:=(x*2) div 3; outpw($23C2,$D000+x); outpw($23C2,$E000+y); end else begin case memmode of _p15,_p16:x:=x*2; _p24:x:=x*3; end; outpw($23C2,$6000+x); outpw($23C2,$7000+y); end; end; __Cirrus, __Video7:begin wrinx2m(SEQ,$9C,X); wrinx2m(SEQ,$9E,Y); end; __AGX,__xbe,__XGA:begin wrinx2(cv.IOadr+10,$30,x); wrinx2(cv.IOadr+10,$33,y); end; end; clearDACpage; end; const S3accelmode:byte=0; {0: unknown, 1: Accell, 2: Frame} {If possible sets up the mode for acceleration ad returns true, false if not} function S3accelON:boolean; begin S3accelON:=true; if (cv.version>S3_924) and (memmode>_PL4) then begin wrinx(crtc,$38,$48); wrinx(crtc,$39,$A5); clrinx(crtc,$58,$14); {Disable Linear adr. & RAC} modinx(crtc,$40,9,1); clrinx(crtc,$53,$F); wrinx(crtc,$54,$A0); outpw($BEE8,$E000); outpw($AAE8,$FFFF); {Enable all planes - } outpw($AEE8,$FFFF); if memmode>=_p24 then begin outpw($BEE8,$E010); outpw($AAE8,$FFFF); {Enable all planes - } outpw($AEE8,$FFFF); end; S3accelmode:=1; end else begin wrinx(crtc,$38,$48); wrinx(crtc,$39,$A5); if (rdinx(crtc,$40) and 1)=0 then S3accelON:=false; wrinx(crtc,$39,0); end; end; procedure S3accelOFF; begin if (cv.version>S3_924) and (memmode>_PL4) then begin wrinx(crtc,$38,$48); wrinx(crtc,$39,$A5); if (rdinx(crtc,$40) and 1)>0 then repeat until (inpw($9AE8) and $200)=0; clrinx(crtc,$40,1); setinx(crtc,$40,8); if (memmode>_pl4) and (curmode<>$13) then setinx(crtc,$58,$10); wrinx(crtc,$39,$5A); wrinx(crtc,$38,$00); S3accelmode:=2; end; end; procedure TridOutB(index,val:word); begin outp(cv.IOadr,index); outp(cv.IOadr+2,val); end; procedure TridOutW(index,val:word); begin outp(cv.IOadr,index); outpw(cv.IOadr+2,val); end; procedure TridOutL(index:word;val:longint); begin outp(cv.IOadr,index); outpw(cv.IOadr+2,val); outpw(cv.IOadr+4,val shr 16); end; (* Wait til ALG ready *) procedure ALG_wait; begin if cv.version=ALG_2101 then repeat until (inp($82AA) and $F)=0 else repeat until (inp($82BA) and $80)=0; end; procedure AL_DstCoor(xst,yst:word); var l:longint; w:word; begin l:=yst*longint(pixels)+xst; ALG_wait; if memmode>_p8 then begin l:=l*2; outpw($828A,pixels*2); end else outpw($828A,pixels); outpw($8286,l); outp( $8288,l shr 16); outpw($829C,xst); outpw($829E,yst); end; procedure AL_BlitArea(dx,dy:word); begin if memmode>_p8 then dx:=dx*2; outpw($828C,dx); outpw($828E,dy); end; procedure AL_SrcCoor(xst,yst:word); var l:longint; w:word; begin l:=yst*longint(pixels)+xst; if memmode>_p8 then begin l:=l*2; outpw($8284,pixels*2); end else outpw($8284,pixels); outpw($8280,l); outp( $8282,l shr 16); end; procedure WD_coor(index,x,y:word); var l,b:longint; begin b:=bytes; if memmode<=_pl4 then b:=b*8; case memmode of _p15,_p16:x:=x*2; _p24:x:=x*3; end; l:=b*y+x; WD_outl(index,l); end; procedure WD_DstCoor(X,Y,dx,dy:word); var b:longint; begin WD_coor($4000,X,Y); b:=bytes; if memmode<=_pl4 then b:=b*8; case memmode of _p15,_p16:dx:=dx*2; _p24:dx:=dx*3; end; outpw($23C2,$6000+dx); outpw($23C2,$7000+dy); outpw($23C2,$8000+b); end; procedure P2000_DstCoor(X,Y,dx,dy,dir:word); var l:longint; begin l:=longint(pixels)*y+x; if memmode>_p8 then begin dx:=dx*2; l:=l*2; wrinx2(GRC,$3A,pixels*2); end else wrinx2(GRC,$3A,pixels); if dir>0 then dy:=dy or $C000; wrinx2(GRC,$33,dx); wrinx3(GRC,$37,l); wrinx2(GRC,$35,dy); end; procedure P2000_SrcCoor(X,Y:word); var l:longint; begin l:=longint(pixels)*y+x; if memmode>_p8 then l:=l*2; if memmode=_pl4 then wrinx(GRC,5,0); {set write mode 0} wrinx3(GRC,$30,l); wrinx2(GRC,$1E,pixels); end; procedure P2000_cmd(cmd:word); begin wrinx(GRC,$3D,cmd); repeat until (rdinx(GRC,$3D) and 1)=0; wrinx(GRC,$3D,0); end; procedure S3_fill(xst,yst,dx,dy:integer;col:longint); begin if (pixels>1024) and (memmode>=_p8) and (cv.Version>=S3_928) and (cv.Version=_p24) then begin outpw($BEE8,$E010); outpw($A6E8,col shr 16); end; repeat until (inp($9AE8) and $FF)=0; outpw($BAE8,$27); outpw($BEE8,dy-1); outpw($BEE8,$A000); outpw($9AE8,$40F1); clrinx(crtc,$40,1); end; procedure fillrect(xst,yst,dx,dy:word;col:longint); const masks:array[0..3] of byte=(0,7,3,1); maske:array[0..3] of byte=($F8,$FC,$FE,$FF); masks4:array[0..7] of byte=(0,$7F,$3F,$1F,$F,7,3,1); maske4:array[0..7] of byte=($80,$C0,$E0,$F0,$F8,$FC,$FE,$FF); var w,w1:word; l:longint; begin case cv.chip of __ALG:begin AL_DstCoor(xst,yst); AL_BlitArea(dx,dy); wrinx(GRC,$D,col); outp( $8290,7); outp( $8292,$D); outp( $82AA,1); end; __ARK:begin repeat until (inp($3CB) and $F)>=7; setinx(SEQ,$10,$1C); wrinx(SEQ,$13,$00); wrinx(SEQ,$14,$C0); memw[SegA800:$02]:=0; memw[SegA800:$08]:=col; memw[SegA800:$18]:=$300; memw[SegA800:$1A]:=$FFFF; meml[SegA800:$58]:=0; meml[SegA800:$5C]:=$FFFFFFFF; repeat until (inp($3CB) and $F)>=7; memw[SegA800:$70]:=Xst; memw[SegA800:$72]:=Yst; memw[SegA800:$74]:=dx; memw[SegA800:$76]:=dy; meml[SegA800:$7C]:=$20400000; clrinx(SEQ,$10,$1C); end; __compaq:begin case usebits[memmode] of 4:col:=(col and 15)*$11111111; 8:col:=lo(col)*$1010101; 15,16:col:=(col and $FFFF)*$10001; end; repeat until (inp($33CE) and 1)=0; if (cv.Version=CPQ_AVGA) or (rdinx(GRC,$F)=$A5) then begin if memmode=_p8 then begin l:=(yst*bytes+xst) shr 2; w:=bytes shr 2; outp($33C0,masks[xst and 3]); outp($33C1,maske[((xst+dx-1) and 3)]); outp($33C8,(-dx) and 3); outp($33C9,masks[dx and 3]); if ((xst and 3)=0) and ((dx and 3)=0) then inc(dx,4); outpw($23C2,(dx +(xst and 3) +3) shr 2); end else begin l:=yst*bytes+(xst shr 3); w:=bytes; outp($33C0,masks4[xst and 7]); outp($33C1,maske4[(xst+dx-1) and 7]); outp($33C8,(-dx) and 7); outp($33C9,masks4[dx and 7]); if ((xst and 7)=0) and ((dx and 7)=0) then inc(dx,8); outpw($23C2,(dx +(xst and 7) +7) shr 3); end; outpw($23C0,l); outpw($23CA,w); outpw($23CC,w); { outpw($33C0,$ffff); } outp($33c7,$c); { outpw($33c8,0); } w:=(l shr 2) and $C000; w:=w or ((dy shl 4) and $3000); outpw($23C4,dy+w); { if (xst and 3)>0 then inc(dx,4); if ((xst+dx-1) and 3)>0 then inc(dx,4); } outp($33CF,$30); end else begin outpw($63CC,xst); outpw($63CE,yst); outpw($23C2,dx); outpw($23C4,dy); outp($33CF,$C0); wrinx(GRC,$5A,2); end; outpw($33CA,col); outpw($33CA,col); outpw($33CC,col shr 16); outpw($33CC,col shr 16); outp($33CE,9); end; __cir54:begin repeat until (rdinx(GRC,$31) and 1)=0; case memmode of _p15,_p16:w:=2; _p24:w:=3; else w:=1; end; wrinx(GRC,1,col); wrinx(GRC,$11,hi(col)); wrinx2(GRC,$20,dx*w); wrinx2(GRC,$22,dy); wrinx3(GRC,$28,Yst*bytes+Xst*w); wrinx3(GRC,$2C,cv.mm*longint(1024)-8); modinx(GRC,$30,$CF,$C0); {PatternCopy + Color Expand} wrinx(GRC,$32,$D); wrinx(GRC,$31,2); end; __Mach32:begin repeat until inpw($9AEE)=0; outpw($A6E8,col); outpw($BAEE,7); outpw($CEEE,$3391); outpw($82E8,yst); outpw($86E8,xst); outpw($A6EE,xst); outpw($AAEE,xst+dx); outpw($AEEE,yst+dy); end; __Mach64:begin repeat until (mem[cv.Xseg:$338] and 1)=0; repeat until memw[cv.Xseg:$310]=0; write32($2C4,col); {Fill color} write32($2D4,$70003); {} write32($2C8,$FFFFFFFF); {Write mask} write32($2D8,$100); {} write32($130,3); {Dest Cntl} write32w($10C,xst,yst); {Dest start X,Y} write32w($118,dy,dx); {Size} end; __NCR:begin repeat until (mem[cv.Xseg:$32] and 1)=1; write32($50,col); write32($4C,col); write32($48,0); write32($44,0); write32($40,pixeladdress(Xst,Yst)); write32w($3C,dy,dx); write32($38,$cc0000); write32($34,$C8C0); {Color Expand, Down&Right} write32($30,1); {Start} end; __P2000:begin wrinx(GRC,$3E,col); P2000_DstCoor(xst,yst,dx,dy,0); P2000_cmd($19); end; __S3:if S3accelON then begin S3_fill(xst,yst,dx,dy,col); if (memmode>_p8) and (cv.version<=S3_924) then S3_fill(xst+1024,yst,dx,dy,hi(col)); S3accelOFF; end; __SiS:begin setinx(SEQ,$B,1); while (mem[SegA000:$82AB] and $80)>0 do; meml[SegA000:$8284]:=xst*bytes+yst; memw[SegA000:$828A]:=bytes; memw[SegA000:$828C]:=8; memw[SegA000:$828E]:=4; mem [SegA000:$8290]:=col; mem [SegA000:$8293]:=$F0; memw[SegA000:$82AA]:=$30; clrinx(SEQ,$B,1); end; __Trid:if cv.Version>=TR_9200CXr then begin while (mem [$BFF0:$20] and $20)>0 do; mem [$BFF0:$27]:=$F0; memw[$BFF0:$2C]:=col; memw[$BFF0:$30]:=col; memw[$BFF0:$38]:=Xst; memw[$BFF0:$3A]:=Yst; memw[$BFF0:$40]:=dx-1; memw[$BFF0:$42]:=dy-1; memw[$BFF0:$28]:=$4000; mem [$BFF0:$24]:=1; end; __Tseng:if cv.version>=ET_4W32 then begin case colbits[memmode] of 8:l:=col*$1010101; 15,16:begin l:=col*$10001; dx:=dx*2; Xst:=Xst*2; end; 24:begin l:=col*$1000001;{Bug!!} dx:=dx*3; Xst:=Xst*3; end; 32:begin l:=col; dx:=dx*4; Xst:=Xst*4; end; end; write32(0,l);write32(4,l); {memL[cv.xseg:0]:=l; {Fill Color} { write32($7F80,cv.mm*longint(1024)-8); {meml[cv.xseg:$7F80]:=cv.mm*longint(1024)-4; {Pattern/Color Data} mem [cv.xseg:$7F8F]:=0; {Direction} memw[cv.xseg:$7F98]:=dx-1; memw[cv.xseg:$7F9A]:=dy-1; mem [cv.xseg:$7F9C]:=0; mem [cv.xseg:$7F9F]:=$F0; write32($7FA0,Yst*bytes+Xst); {meml[cv.xseg:$7FA0]:=Yst*bytes+Xst;} if cv.version_pl4 then w:=w+$100; outpw($23C2,w); WD_wait; if w1>0 then begin WD_DstCoor(xst+dx-1,yst,1,dy); { if cv.version=WD_90c33 then w:=$208 else} w:=$808; if memmode>_pl4 then w:=w+$100; outpw($23C2,w); WD_wait; end; end; __AGX,__xbe,__xga: begin repeat until (mem[cv.xseg:$11] and $80)=0; mem [cv.xseg:$12]:=1; mem [cv.xseg:$48]:=3; {Always Src} meml[cv.xseg:$58]:=col; memw[cv.xseg:$78]:=xst; memw[cv.xseg:$7A]:=yst; memw[cv.xseg:$60]:=dx-1; memw[cv.xseg:$62]:=dy-1; meml[cv.xseg:$7C]:=$8118000; {Cmd (Bitblt)} end; end; end; procedure S3_copy(srcX,srcY,dstX,dstY,dx,dy,dir:word); begin if (pixels>1024) and (memmode>=_p8) and (cv.Version>=S3_928) and (cv.Version0 then outpw($9AE8,$C013) else outpw($9AE8,$C0F3); end; procedure copyrect(srcX,srcY,dstX,dstY,dx,dy:word); var l:longint; w,dir:word; i1,i2:integer; begin if (DstY0 then begin SrcX:=SrcX-dx+1; DstX:=DstX-dx+1; end; AL_DstCoor(DstX,DstY); AL_BlitArea(dx,dy); AL_SrcCoor(SrcX,SrcY); w:=7; if dir>0 then w:=1; outp( $8290,w); outpw($8292,w); outp( $82AA,2); end; __compaq:begin repeat until (inp($33CE) and 1)=0; if (cv.Version=CPQ_AVGA) or (rdinx(GRC,$F)=$A5) then {AVGA} begin l :=srcy*bytes+srcx; w:=256; if (dir>0) then w:=$FF00; { begin l:=l+(dy-1)*bytes+(dx-1); w:=$ff00; end; } i1:=dsty-srcy; i2:=dstx-srcx; outpw($23C0,l shr 2); outpw($23CC,lo(i1)*256+lo(i2 shr 2)); outp($23C2,dx shr 2); outpw($23CA,w{bytes shr 2}); outpw($33C0,$FFFF); outp($33C7,$C); outpw($33C8,0); w:=(w and $C00) or ((l shr 4) and $C000); w:=w or ((i1 shl 4) and $3000); outpw($23C4,dy+w); outp($33CF,$30); end else begin {QVision} outpw($63CC,DstX); outpw($63CE,DstY); outpw($63C0,SrcX); outpw($63C2,SrcY); outpw($23C2,dx); outpw($23C4,dy); outpw($23CC,bytes shr 2); outp($33CF,$C0); wrinx(GRC,$5A,1); end; outp($33CE,$11+(dir shl 6)); end; __cir54:begin repeat until (rdinx(GRC,$31) and 1)=0; case memmode of _p15,_p16:w:=2; _p24:w:=3; else w:=1; end; wrinx2(GRC,$20,dx*w); wrinx2(GRC,$22,dy); wrinx3(GRC,$28,dstY*bytes+dstX*w); wrinx3(GRC,$2C,srcY*bytes+srcX*w); wrinx (GRC,$32,$D); modinx(GRC,$30,$CF,dir); wrinx (GRC,$31,2); end; __Mach32:begin repeat until inpw($9AEE)=0; outpw($BAEE,$7); outpw($CEEE,$7391); outpw($8EE8,SrcX); outpw($8AE8,SrcY); outpw($B2EE,SrcX); outpw($82E8,DstY); outpw($86E8,DstX); outpw($A6EE,DstX); if dir=0 then begin outpw($C2EE,1); outpw($BEEE,SrcX+dx); outpw($AAEE,DstX+dx); outpw($AEEE,DstY+dy); end else begin outpw($C2EE,0); outpw($BEEE,SrcX-dx); outpw($AAEE,DstX-dx); outpw($AEEE,DstY-dy); end; end; __Mach64:begin repeat until (mem[cv.Xseg:$338] and 1)=0; repeat until memw[cv.Xseg:$310]=0; write32($2D4,$70003); {} write32($2C8,$FFFFFFFF); {Write mask} write32($2D8,$300); {} write32($1B4,0); {Src Cntl} write32w($18C,SrcX,SrcY); {Src start X,Y} write32($190,dy); {Src width1} if dir=0 then w:=3 else w:=0; write32($130,w); {Dest Cntl} write32w($10C,DstX,DstY); {Dest start X,Y} write32w($118,dy,dx); {Size} end; __NCR:begin repeat until (mem[cv.Xseg:$32] and 1)=1; write32($44,pixeladdress(SrcX,SrcY)); write32($40,pixeladdress(DstX,DstY)); write32w($3C,dy,dx); write32($38,$CC0000); w:=$C0C0; if dir>0 then w:=$C000; write32($34,w); {Copy, Down&Right} write32($30,1); {Start} end; __P2000:begin if dir>0 then begin SrcX:=SrcX-dx+1; DstX:=DstX-dx+1; end; P2000_SrcCoor(SrcX,SrcY); P2000_DstCoor(DstX,DstY,dx,dy,dir); P2000_Cmd(5); end; __WD:if cv.Version=WD_90c33 then begin WD_wait; outp($23C0,1); outpw($23C2,$2000+SrcX); outpw($23C2,$3000+SrcY); outpw($23C2,$4000+DstX); outpw($23C2,$5000+DstY); outpw($23C2,$6000+dx-1); outpw($23C2,$7000+dy-1); outpw($23C2,$8300); if dir>0 then w:=$380 else w:=$200; outpw($23C2,w); end else begin WD_wait; outpw($23C2,$1000); outpw($23C2,$E0FF); WD_DstCoor(DstX,DstY,dx,dy); WD_Coor($2000,SrcX,SrcY); outpw($23C2,$9300); w:=$800; if memmode>_pl4 then w:=w+$100; if dir>0 then w:=w+$400; outpw($23C2,w); WD_wait; end; __S3:if S3accelON then begin S3_copy(SrcX,SrcY,DstX,DstY,dx,dy,dir); if (memmode>_p8) and (cv.version<=S3_924) then S3_copy(SrcX+1024,SrcY,DstX+1024,DstY,dx,dy,dir); S3accelOFF; end; __Trid:if cv.Version>=TR_9200CXr then begin while (mem [$BFF0:$20] and $20)>0 do; mem [$BFF0:$27]:=$CC; memw[$BFF0:$38]:=DstX; memw[$BFF0:$3A]:=DstY; memw[$BFF0:$3C]:=SrcX; memw[$BFF0:$3E]:=SrcY; memw[$BFF0:$40]:=dx-1; memw[$BFF0:$42]:=dy-1; memw[$BFF0:$28]:=0; mem [$BFF0:$24]:=1; end; __Tseng:if cv.version>=ET_4W32 then begin case colbits[memmode] of 15,16:begin dx:=dx*2; SrcX:=SrcX*2; DstX:=DstX*2; end; 24:begin dx:=dx*3; SrcX:=SrcX*3; DstX:=DstX*3; end; 32:begin dx:=dx*4; SrcX:=SrcX*4; DstX:=DstX*4; end; end; mem [cv.xseg:$7F9F]:=$CC; {Copy} mem [cv.xseg:$7F8F]:=3*dir; {Direction} mem [cv.xseg:$7F9C]:=0; memw[cv.xseg:$7F98]:=dx-1; memw[cv.xseg:$7F9A]:=dy-1; write32($7F84,SrcY*bytes+SrcX); write32($7FA0,DstY*bytes+DstX); if cv.version0 then inc(l,6); meml[cv.xseg:$7C]:=l; {BitBlt cmd} end; end; end; procedure swp(var i,j:integer); var z:integer; begin z:=i; i:=j; j:=z; end; procedure S3_line(x0,y0,x1,y1:integer;col:longint); var w,z:word; begin if (pixels>1024) and (memmode>=_p8) and (cv.Version>=S3_928) and (cv.Version_p16) then begin outpw($BEE8,$E010); outpw($A6E8,col shr 16); end; outpw($BAE8,$27); outpw($BEE8,$A000); outpw($9AE8,$2017+w); end; procedure line(x0,y0,x1,y1:integer;col:longint); var l:longint; z,w:word; dx,dy,mi,ma:integer; begin case cv.chip of __ALG:begin AL_DstCoor(x0,y0); wrinx(GRC,$D,col); outpw($82A8,$FFFF); w:=0; x1:=x1-x0; if x1<0 then begin x1:=-x1; w:=w or $100; end; if memmode>_p8 then x1:=x1*2; y1:=y1-y0; if y1<0 then begin y1:=-y1; w:=w or $200; end; if x1ma then swp(mi,ma); write32w($10C,x0,y0); if x1>x0 then w:=1 else w:=0; if y0ma then swp(mi,ma); outpw($23C8,2*mi); outpw($23CA,2*(mi-ma)); if x0>x1 then inc(ma); outpw($23CC,2*mi-ma); outp($23C0,3); outpw($23C2,$2000+lo(col)); outpw($23C2,$3000+hi(col)); outp($23C0,1); WD_wait; outpw($23C2,$4000+x0); outpw($23C2,$5000+y0); outpw($23C2,$6000+ma); outpw($23C2,$8300); w:=$810; if x0>x1 then w:=w+$100; if y0>y1 then w:=w+$80; if dxma then swp(mi,ma); outpw($23C2,$4000+x0); outpw($23C2,$5000+y0); outpw($23C2,$6000+dx); outpw($23C2,$7000+dy); outpw($23C2,$9300); outpw($23C2,$A000+lo(col)); outpw($23C8,2*mi); outpw($23CA,2*(mi-ma)); if x0>x1 then inc(ma); outpw($23CC,2*mi-ma); w:=$1800; { if x0>x1 then inc(w,$100); } if y0>y1 then inc(w,$100); if dx>dy then inc(w,$200); outpw($23C2,w); outpw($23C2,$910); WD_wait; end; __S3:if S3accelON then begin S3_line(x0,y0,x1,y1,col); if (memmode>_p8) and (cv.Version<=S3_924) then S3_line(x0+1024,y0,x1+1024,y1,hi(col)); S3accelOFF; end; __Tseng:if (cv.version>=ET_4W32) {and (x0<>x1) and (y0<>y1)} then begin case colbits[memmode] of 8:l:=col*$1010101; 15,16:begin l:=col*$10001; X0:=X0*2; X1:=X1*2; end; 24:begin l:=col*$1000001;{Bug!!} X0:=X0*3; X1:=X1*3; end; 32:begin l:=col; X1:=X1*4; X0:=X0*4; end; end; write32(0,l); {memL[cv.xseg:0]:=l; {Fill Color} write32(4,l); {memL[cv.xseg:4]:=l; {Fill Color} l:=cv.mm*longint(1024)-4; {Pattern/Color Data} w:=0; y1:=y1-y0; x1:=x1-x0; if y1=0 then begin if x1<0 then begin x1:=-x1; inc(x0); end; dx:=x1-1; dy:=0; end else if x1=0 then begin if Y1<0 then begin Y1:=-Y1; inc(Y0); end; dx:=0; dy:=y1-1; end else begin w:=$80; if Y1<0 then begin Y1:=-Y1; w:=w or $12; end; if x1<0 then begin x1:=-X1; w:=w or 1; inc(l,3); end; if X1ma then swp(mi,ma); meml[cv.xseg:$58]:=col; mem [cv.xseg:$48]:=3; memw[cv.xseg:$78]:=X0; memw[cv.xseg:$7A]:=Y0; memw[cv.xseg:$24]:=2*mi; memw[cv.xseg:$28]:=2*(mi-ma); if x0>x1 then inc(ma); memw[cv.xseg:$20]:=2*mi-ma; memw[cv.xseg:$60]:=ma-1; memw[cv.xseg:$62]:=dy-1; l:=$5118000; if dy>dx then inc(l,1); if Y0>Y1 then inc(l,2); if X0>X1 then inc(l,4); meml[cv.xseg:$7C]:=l; end; end; end; var ZwinOfs:longint; Zxstep:word; procedure setZoomWindow(Xs,Ys,Xe,Ye:word); begin case cv.chip of __Tseng:if cv.version=ET_3000 then begin case memmode of _Pl4:Xs:=Xs div 8; _pk4:Xs:=Xs shr 1; { _p15,_p16:Xs:=Xs*2; _P24:Xs:=Xs*3; } end; ZwinOfs:=bytes*Ys+Xs; wrinx(crtc,$1B,Xs shr 3); wrinx(crtc,$1C,Xe shr 3); wrinx(crtc,$1D,Ys); wrinx(crtc,$1E,Ye); wrinx(crtc,$1F,hi(Ye)+(hi(Ys) shl 3)); end else if cv.version>=ET_4W32 then begin wrinx2($217A,$E0,Xs); wrinx2($217A,$E2,Xe-Xs+1); wrinx2($217A,$E4,Ys); wrinx2($217A,$E6,Ye-Ys+1); end; end; end; procedure setZoomAdr(AdrX,AdrY:word); var l:longint; begin case memmode of _Pl4:AdrX:=AdrX div 8; _pk4:AdrX:=AdrX shr 1; _p15,_p16:AdrX:=AdrX*2; _P24,_p24b:AdrX:=AdrX*3; end; l:=(bytes*AdrY+AdrX); case cv.chip of __Tseng:if cv.version=ET_3000 then begin l:=(l shr 3)-(ZwinOfs shr 3); wrinx2(crtc,$20,l); modinx(crtc,$23,4,l shr 14); end else if cv.version>=ET_4W32 then wrinx3($217A,$E8,l); end; end; procedure ZoomOnOff(On:boolean); begin case cv.chip of __Tseng:if cv.version=ET_3000 then begin modinx(SEQ,6,$80,ord(On) shl 7); Zxstep:=8; end else if cv.version>=ET_4W32 then begin wrinx($217A,$EF,3); wrinx2($217A,$EB,bytes div 8); modinx($217A,$F7,$80,ord(On) shl 7); end; end; end; procedure setZoomFactor(Fx,Fy:word); begin case cv.chip of __Tseng:if cv.version=ET_3000 then modinx(SEQ,6,$77,Fy+(Fx shl 4)) else if cv.version>=ET_4W32 then wrinx($217A,$EE,3+(Fx shl 6)+(Fy shl 4)); end; end; (* Clock Selection *) procedure setclk(Nbr,divi:word); var x:word; begin if (cv.flags and FLG_StdVGA)>0 then clrinx(crtc,$11,$80); case cv.chip of __AGX:begin if (cv.Version=IIT_AGX1x) then x:=$7F else x:=$77; if Nbr>15 then begin modinx(cv.IOadr+10,x,$30,nbr shl 4); modinx(cv.IOadr+10,$6F,$70,(nbr shl 2) or $40); clrinx(cv.IOadr+10,$70,$80); end else if Nbr>7 then begin modinx(cv.IOadr+10,x,$30,nbr shl 4); clrinx(cv.IOadr+10,$6F,$70); setinx(cv.IOadr+10,$54,$0C); clrinx(cv.IOadr+10,$70,$80); end else begin modinx(cv.IOadr+10,$54,$0C,nbr shl 2); clrinx(cv.IOadr+10,$6F,$70); modinx(cv.IOadr+10,$70,$80,nbr shl 5); end; modinx(cv.IOadr+10,x,$40,divi shl 6); end; __Ahead:begin {Only for the B ??} modinx(GRC,$E,$3,nbr shr 2); if divi>0 then x:=$F0 else x:=0; modinx(GRC,$E,$F0,x); end; __ALG:begin modinx(GRC,$C,$20,Nbr shl 3); modinx(GRC,$1F,$4,Nbr shr 1); modinx(GRC,$B,3,divi); end; __ARK:begin modinx(SEQ,$11,$C0,nbr shl 4); end; __ati:begin if cv.version=ATI_18800 then modinx(cv.IOadr,$B2,64,nbr shl 4) else begin modinx(cv.IOadr,$B9,2,Nbr shr 1); modinx(cv.IOadr,$BE,$10,Nbr shl 1); end; if cv.version3 then nbr:=(nbr-4)*4+2; outp(crtc+6,(inp($3CA) and $FC)+nbr shr 2); end else begin if Nbr>3 then begin x:=Nbr-4; Nbr:=2; end; if (rdinx(cv.IOadr,$51) and 4)>0 then {Panel} modinx(cv.IOadr,$54,$C3,(nbr+(x shl 2)) shl 2) else {CRT} outp(crtc+6,inp($3CA) and $FC + (x and 3)); end; __Compaq:outp($3C2,(inp($3CC) and $EF) + ((nbr and 4) shl 2)); __Genoa:modinx(SEQ,7,1,nbr shr 2); __HMC:modinx(SEQ,$E7,$C0,Nbr shl 4); __Mach32:modreg($4AEE,$3C,nbr shl 2); __Mach64:modreg($4AEC,$7F,(nbr and $F)+((divi and 3) shl 4)+$40); __MXIC:modinx(SEQ,$C4,1,Nbr shr 2); __NCR:if cv.version=NCR_77c32BLT then modinx(SEQ,$1F,$60,Nbr shl 3) else modinx(SEQ,$1F,$60,(Nbr shl 4) or $20); __oak:begin modinx($3DE,$D,$20,Nbr shl 3); modinx($3DE,$6,8,nbr); end; __p2000:modinx(GRC,$14,$30,Nbr shl 2); __WD:begin modinx(GRC,$C,2,Nbr shr 1); if cv.version>WD_90c00 then modinx(SEQ,$12,4,nbr shr 1); if cv.version=WD_90c24 then begin wrinx(SEQ,$35,$50); {Unlock clock regs} modinx(SEQ,$31,$18,nbr shl 1); end; end; __realtek:modinx(GRC,$C,$20,Nbr shl 3); __S3:if nbr<>3 then begin wrinx(crtc,$38,$48); wrinx(crtc,$39,$A5); modinx(crtc,$42,$F,Nbr); outp($3C2,inp($3CC) or $C); wrinx(crtc,$39,$5A); wrinx(crtc,$38,$0); nbr:=3; {Fool std vga} end; __SiS:begin modinx(SEQ,$7,$F,nbr); nbr:=3; end; __Tseng:if cv.version=ET_3000 then modinx(crtc,$24,2,Nbr shr 1) else begin outp($3BF,3); outp(crtc+4,$A0); modinx(crtc,$34,2,Nbr shr 1); modinx(crtc,$31,$C0,Nbr shl 3); end; __Poach, __Trid:begin wrinx(SEQ,$B,0); {Old mode} case cv.version of TR_8900C,TR_9000C,TR_8900CL..TR_GUI9430: modinx(SEQ,$E,$10,Nbr shl 1); end; if rdinx(SEQ,$B)=0 then; {New mode} modinx(SEQ,$D,1,Nbr shr 2); if ((cv.version=TR_9000) or (cv.version=TR_9000i)) then modinx(SEQ,$D,$40,nbr shl 3); modinx(SEQ,$D,6,divi shr 1); end; __UMC:modinx(SEQ,7,1,Nbr shr 2); __Video7:begin modinx(SEQ,$A4,$1C,Nbr shl 2); modinx(SEQ,$F8,1,Nbr shr 3); end; end; if (cv.flags and FLG_StdVGA)>0 then outp($3C2,(inp($3CC) and $F3)+((Nbr and 3) shl 2)); end; {Returns the id of the selected clock and the divisor used on it. The divisor is in 1/12th, Ie. 12 = /1, 24 = /2, 18 = /1.5 divid is an ID for the divisor (0,1..)} function getclk(var divisor,divid:word):word; var x,clknbr:word; const _1_ = 12; _1_5 = 18; _2_ = 24; _3_ = 36; _4_ = 48; triddiv:array[0..3] of word=(_1_,_2_ ,_4_,_1_5); atidiv:array[0..3] of word=(_1_,_2_ ,_3_,_4_); otidiv:array[0..3] of word=(_1_,_2_ ,_3_,_3_); P2000div:array[0..3] of word=(_1_,_4_ ,_2_,_4_); RTGdiv:array[0..3] of word=(_1_,_1_5,_2_,_4_); ALGdiv:array[0..3] of word=(_1_,_2_ ,_4_,_4_); begin divisor:=12; {standard no division} clknbr:=(inp($3CC) shr 2) and 3; divid:=0; case cv.chip of __AGX:begin if (cv.Version=IIT_AGX1x) then x:=$7F else x:=$77; if (rdinx(cv.IOadr+10,$6F) and $40)>0 then begin clknbr:=((rdinx(cv.IOadr+10,x) shr 4) and 3)+16; inc(clknbr,(rdinx(cv.IOadr+10,$6F) and $30) shr 2); end else begin clknbr:=(rdinx(cv.IOadr+10,$54) shr 2) and 3; if (rdinx(cv.IOadr+10,$70) and $80)>0 then inc(clknbr,4); if clknbr=3 then clknbr:=((rdinx(cv.IOadr+10,x) shr 4) and 3)+8; end; if (rdinx(cv.IOadr+10,x) and $40)>0 then begin divisor:=_2_; divid:=1; end; end; __Ahead:begin {Only for the B ??} x:=rdinx(GRC,$E); if ((x shr clknbr) and $10)>0 then begin divid:=1; divisor:=_2_; end; inc(clknbr,(x and 3) shl 2) end; __ALG:begin if (rdinx(GRC,$C) and $20)>0 then inc(clknbr,4); (* if (rdinx(GRC,$B) and 2)>0 then divisor:=24;*) if (rdinx(GRC,$1F) and $4)>0 then inc(clknbr,8); divid:=rdinx(GRC,$B) and 3; if cv.version=ALG_2101 then divisor:=RTGdiv[divid] else divisor:=ALGdiv[divid]; end; __Alli:if clknbr=3 then clknbr:=rgs.xxregs.x[$D8] and $F; __ARK:begin inc(clknbr,(rdinx(SEQ,$11) and $C0) shr 4); end; __ati:begin if cv.version=ATI_18800 then begin if (rdinx(cv.IOadr,$B2) and $40)>0 then inc(clknbr,4); end else begin if (rdinx(cv.IOadr,$B9) and 2)>0 then inc(clknbr,4); if (rdinx(cv.IOadr,$BE) and $10)>0 then inc(clknbr,8); end; if cv.version0 then {Panel} begin clknbr:=(rdinx(cv.IOadr,$54) shr 2) and 3; x :=(rdinx(cv.IOadr,$54) shr 4) and 3; end else {CRT} x:=inp($3CA) and 3; if clknbr>=2 then clknbr:=x+4; end; __Compaq:begin clknbr:=(inp($3CC) shr 2) and 7; if rdinx(GRC,$F)<>$A5 then inc(clknbr,8); end; __Genoa:if (rdinx(SEQ,7) and 1)>0 then inc(clknbr,4); __HMC:inc(clknbr,(rdinx(SEQ,$E7) and $C0) shr 4); __Mach32:begin clknbr:=(inp($4AEE) shr 2) and $F; if (inp($4AEE) and $40)>0 then divisor:=_2_; end; __Mach64:begin clknbr:=inp($4AEC); divid:=(clknbr shr 4) and 3; case divid of 1:divisor:=_2_; 2:divisor:=_4_; end; clknbr:=clknbr and 15; end; __MXIC:if (rdinx(SEQ,$C4) and 1)>0 then inc(clkNbr,4); __NCR:if cv.version=NCR_77c32BLT then inc(ClkNbr,(rdinx(SEQ,$1F) and $60) shr 3) else if (rdinx(SEQ,$1F) and $40)>0 then inc(ClkNbr,4); __oak:begin if (rdinx($3DE,$D) and $20)>0 then inc(clknbr,4); if cv.Version>=OAK_083 then begin if (rdinx($3DE,6) and 8)>0 then inc(clknbr,8); divisor:=otidiv[rdinx($3DE,$21) and 3]; { if (rdinx($3DE,$14) and 1)>0 then divisor:=divisor*3; } end; end; __p2000:begin inc(clknbr,(rdinx(GRC,$14) and $30) shr 2); divisor:=p2000div[(rdinx(GRC,$14) shr 2) and 3]; end; __WD:begin if (rdinx(GRC,$C) and 2)>0 then inc(clknbr,4); if cv.version>WD_90c00 then if (rdinx(SEQ,$12) and 4)>0 then inc(clknbr,8); if cv.version=WD_90c24 then clknbr:=(clknbr and 3)+(rgs.seqregs.x[$31] and $18) shr 1; end; __Realtek:begin if (rdinx(GRC,$C) and $20)>0 then inc(clknbr,4); divisor:=rtgdiv[rdinx(GRC,$B) and 3]; end; __S3:if clknbr=3 then begin wrinx(crtc,$38,$48); wrinx(crtc,$39,$A5); clknbr:=rdinx(crtc,$42) and $F; wrinx(crtc,$39,$5A); wrinx(crtc,$38,$0); end; __SiS:if clknbr=3 then clknbr:=rdinx(SEQ,7) and $F; __Tseng:if cv.version=ET_3000 then begin if (rdinx(crtc,$24) and 2)>0 then inc(clknbr,4); { if (rdinx(SEQ,7) and $40)>0 then divisor:=24; } end else begin if (rdinx(crtc,$34) and 2)>0 then inc(clknbr,4); inc(clknbr,(rdinx(crtc,$31) and $C0) shr 3); case rdinx(SEQ,7) and $42 of $40:divisor:=24; $42:divisor:=48; end; end; __Poach, __Trid:begin wrinx(SEQ,$B,0); {Old mode} case cv.version of TR_8900C,TR_9000C,TR_8900CL..TR_GUI9430: if (rdinx(SEQ,$E) and $10)>0 then inc(clknbr,8); end; if rdinx(SEQ,$B)=0 then; {New mode} if (rdinx(SEQ,$D) and 1)>0 then inc(clknbr,4); if ((cv.version=TR_9000) or (cv.version=TR_9000i)) and ((rdinx(SEQ,$D) and $40)>0) then inc(clknbr,8); divisor:=triddiv[(rdinx(SEQ,$D) shr 1) and 3]; end; __UMC:begin if (rdinx(SEQ,7) and 1)>0 then inc(clkNbr,4); if (rdinx(SEQ,9) and $80)>0 then divisor:=24; end; __Video7:if cv.version>=V7_208A then begin clknbr:=(rdinx(SEQ,$A4) shr 2) and 7; if (rdinx(SEQ,$F8) and 1)>0 then inc(clkNbr,8); end; end; getclk:=clknbr; end; function getClockFreq:longint; {Effective pixel clock in kHz} const wd24clk:array[0..15] of longint=(29979,77408,0,80092,25175,28322 ,65000,36000,39822,50114,42060,44297,31500,35501,75166,50114); var clknbr,divisor,x,reg:word; clk,ref:longint; begin clknbr:=getclk(divisor,x); clk:=(cv.clks[clknbr]*12) div divisor; ref:=(14318*12) div divisor; case cv.clktype of clk_unk:; clk_ICD2061,clk_ICD2061A: if (clknbr and 3)=3 then clk:=0; {Prog clock - Can't read} clk_sdac:(*if clknbr=2 then*) begin clknbr:=(clknbr and 3)*2; clk:=(ref*((rgs.dacinxd.x[clknbr] and 127)+2)) div (((rgs.dacinxd.x[clknbr+1] and 31)+2) shl (rgs.dacinxd.x[clknbr+1] shr 5)); end; clk_STG:begin clknbr:=clknbr*2+$20; clk:=ref*(rgs.dacinxd.x[clknbr]+2) div (((rgs.dacinxd.x[clknbr+1] and $1F)+2) shl (rgs.dacinxd.x[clknbr+1] shr 5)); end; clk_TVP302x:case clknbr and 3 of 0:clk:=(25175*12) div divisor; 1:clk:=(28322*12) div divisor; 2,3:clk:=(ref*8*((rgs.dacinxd.x[$41] and 127)+2)) div (((rgs.dacinxd.x[$40] and 31)+2) shl (rgs.dacinxd.x[$42] and 3)); end; clk_CHRON:begin clknbr:=(clknbr and 15)*2; clk:=(ref*(rgs.dacinxd.x[clknbr]+8)) div ((((rgs.dacinxd.x[clknbr+1] and 63)+2) shl (rgs.dacinxd.x[clknbr+1] shr 6))); end; clk_MUSIC:begin clknbr:=(clknbr and 7)*2; clk:=(ref*((rgs.dacinxd.x[clknbr] and 127)+1)) div ((((rgs.dacinxd.x[clknbr+1] and 15)+1) shl ((rgs.dacinxd.x[clknbr+1] shr 4) and 3))); end; clk_IBM52x:if (rgs.dacinxd.x[$10] and 1)>0 then begin clknbr:=((clknbr and 7)*2)+$20; clk:=(ref*((rgs.dacinxd.x[clknbr] and 63)+65)) div ((rgs.dacinxd.x[clknbr+1] and $1F) shl (3-(rgs.dacinxd.x[clknbr] shr 6))); end else begin (* clknbr:=(clknbr and 15)+$20; clk:=(ref*((rgs.dacinxd.x[clknbr] and 63)+65)) div ((rgs.dacinxd.x[$14] and $1F) shl (3-(rgs.dacinxd.x[clknbr] shr 6))); *) end; else case cv.chip of __Cir54:if (clknbr=0) and (cv.version<=CL_GD5402) then clk:=25175 else begin clk:=(ref*rgs.seqregs.x[$B+clknbr]) div (rgs.seqregs.x[$1B+clknbr] shr 1); if (rgs.seqregs.x[$1B+clknbr] and 1)>0 then clk:=clk div 2; case (rgs.seqregs.x[7] and 6) of 2:clk:=clk div 2; 4:clk:=clk div 3; end; end; __chips:if (cv.version=CT_64300) and (clknbr>=2) then clk:=(ref*2*(rgs.xxregs.x[$31]+2)) div (rgs.xxregs.x[$32]+2); __S3:if (cv.Version=S3_732) or (cv.Version=S3_764) then case clknbr of 0:clk:=(25175*12) div divisor; 1:clk:=(28322*12) div divisor; else clk:=(ref*((rgs.seqregs.x[$13] and $7F)+2)) div (((rgs.seqregs.x[$12] and $1F)+2) shl (rgs.seqregs.x[$12] shr 5)); end; __Trid:if cv.version=TR_GUI9440 then {Not there yet} case clknbr and 3 of 0:clk:=(25175*12) div divisor; 1:clk:=(28322*12) div divisor; 2:begin clknbr:=(((rgs.dacregs[9] shl 1)+(rgs.dacregs[8] shr 7)) and $1F)+1; clk:=((ref*((rgs.dacregs[8] and $7F)+3)) div (clknbr shl (rgs.dacregs[9] shr 4))); end; end; __WD:if cv.version=WD_90c24 then begin {WD90c24 internal clock} if clknbr<>2 then clk:=WD24clk[clknbr] else clk:=(rgs.seqregs.x[$32]*longint(447443)) div 1000; end; end; end; getClockFreq:=clk; end;