home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Hack-Phreak Scene Programs
/
cleanhpvac.zip
/
cleanhpvac
/
VGADOC4B.ZIP
/
WHATVGA.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1995-09-29
|
79KB
|
2,962 lines
uses dos,crt,supervga,idvga;
const
copyright=' 29/Sep/95 Copyright 1991-95 Finn Thoegersen';
SWversion = 2000; {1495 = 1.49e, 1500 = 1.50, 2000 = 2.00}
menuchars:array[1..55] of char=
'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&()[]{}-_=+/?';
beta_ver=true;
max_clk=17;
clkname:array[0..max_clk] of string[20]=('','Internal','4 Ext Clks'
,'8 Ext Clks','16 Ext Clks','32 Ext Clks','64 Ext Clks'
,'32 Ext Clks (Sigma)','ICD20c61','ICD20c61A','S3 SDAC','TVP302x'
,'ICS2595','SC11412','CH8391/8','STG1703','MUSIC','IBM RGB52x');
var
af_fil:file;
af_buf:array[0..2048] of byte;
af_pos:word;
af_rec:_AT2;
af_cmt:string;
af_tst:_AT3;
af_fail:boolean;
af_filename:string[12];
{Displays the copyright & version info}
function wrVersionNbr:string;
var s:string;
begin
str(SWVersion div 1000,s);
s:=s+'.'+chr((SWversion div 100) mod 10+48)+chr((SWversion div 10) mod 10+48);
if (SWversion mod 10)>0 then s:=s+chr(SWversion mod 10+$60);
if (beta_ver) then s:=s+' (BETA)';
wrVersionNbr:='WHATVGA v. '+s;
end;
function freq(frq:longint):string;
var w:word;
st:string[5];
begin
w:=frq mod 1000;
str(frq div 1000:3,st);
freq:=st+'.'+chr((w div 100)+48)+chr(((w div 10) mod 10)+48)+chr((w mod 10)+48);
end;
{Appends a datablock to the AF buffer}
procedure AddAFbuf(var b;bytes:word);
begin
move(b,af_buf[af_pos],bytes);
inc(af_pos,bytes);
end;
{Writes an AF record to the AF file}
procedure WrAFbuf(typ:byte);
begin
af_buf[0]:=typ;
move(af_pos,af_buf[1],2);
blockwrite(af_fil,af_buf,af_pos);
close(af_fil);
reset(af_fil,1); {Flushes file output}
seek(af_fil,filesize(af_fil));
af_pos:=3;
end;
function Rtext(str:string;wid:integer):string;
begin
while str[length(str)]=' ' do dec(str[0]);
Rtext:=copy(' ',1,wid-length(str))+str;
end;
function getComment(tx:string):string;
var s,s1:string;
begin
writeln('Please enter '+tx+' (max 3 lines):');
s:='';s1:='';
readln(s1);
s1:=strip(s1);
if s1<>'' then
begin
s:=s1;
readln(s1);s1:=strip(s1);
if s1<>'' then
begin
s:=s+' '+s1;
readln(s1);s1:=strip(s1);
if s1<>'' then
begin
s:=s+' '+s1;
writeln;
end;
end;
end;
getComment:=s;
end;
function getYN:boolean;
const YN:array[0..1] of string[3]=('No','Yes');
var ret:integer;
begin
ret:=-1;
repeat
case getkey of
ord('y'),ord('Y'):ret:=1;
ord('n'),ord('N'):ret:=0;
ch_esc:ret:=0;
end;
until ret>-1;
getYn:=boolean(ret);
writeln(YN[ret]);
if ret=0 then af_fail:=true;
end;
procedure InitAFFile(cursel:word);
var x:word;
hdr:_AT0;
mm:byte;
begin
x:=0;
repeat
inc(x); {Find first free file number}
af_filename:='WHVGA'+istr(x)+'.TST';
assign(af_fil,af_filename);
{$i-}
reset(af_fil,1);
{$i+}
if ioresult=0 then close(af_fil) else x:=0;
until x=0;
rewrite(af_fil,1);
af_pos:=3;
af_fail:=false;
hdr.SWvers := SWversion;
hdr.vid_sys:= Vids;
hdr.cur_vid:= cursel;
getFtime(af_fil,hdr.curtime);
AddAFbuf(hdr,sizeof(hdr));
af_cmt:=getComment('your Email address');
AddAFbuf(af_cmt,length(af_cmt)+1);
af_cmt:=getComment('your name & address');
AddAFbuf(af_cmt,length(af_cmt)+1);
af_cmt:=getComment('your video&monitor description');
AddAFbuf(af_cmt,length(af_cmt)+1);
af_cmt:=getComment('your system description');
AddAFbuf(af_cmt,length(af_cmt)+1);
af_cmt:='';
for mm:=_text to _p32d do {Build the Mode Name table}
af_cmt:=af_cmt+copy(mmodenames[mm]+' ',1,4);
AddAFbuf(af_cmt,length(af_cmt)+1);
for x:=1 to max_clk do
AddAFbuf(clkname[x],length(clkname[x])+1);
af_cmt:='';
AddAFbuf(af_cmt,1);
WrAFbuf(AF_header);
end;
function getmenkey:integer;
var x,c:word;
begin
c:=getkey;
if (c>=ord('a')) and (c<=ord('z')) then c:=c-32;
getmenkey:=0;
for x:=1 to 55 do
if chr(c)=menuchars[x] then getmenkey:=x;
if c=Ch_Esc then getmenkey:=-1;
end;
procedure clearmemory;
var x,y,maxbank:word;
begin
case memmode of
_text,_txt2,_txt4:
begin
{mov es,[vseg] cld xor di,di mov ax,$720 mov cx,$4000 rep stosw}
inline($8e/6/>vseg/$fc/$31/$ff/$B8/>$720/$B9/>$4000/$f3/$ab);
end;
_cga1,_cga2:
fillchar(mem[SegB800:0],$8000,0);
_pl2,_pl4:begin
wrinx(GRC,0,0);
wrinx(GRC,1,15); (* planar modes *)
wrinx(GRC,8,255);
modinx(GRC,5,3,0);
maxbank:=pred(cv.mm div 256);
end;
else maxbank:=pred(cv.mm div 64);
end;
if memmode>_cga2 then
for x:=0 to maxbank do
begin
setbank(x);
{mov es,[vseg] cld xor di,di xor ax,ax mov cx,$8000 rep stosw}
inline($8e/6/>vseg/$fc/$31/$ff/$31/$C0/$B9/>$8000/$f3/$ab);
end;
end;
procedure setpix(x,y:word;col:longint);
const
msk:array[0..7] of byte=(128,64,32,16,8,4,2,1);
plane :array[0..1] of byte=(5,10);
plane4:array[0..3] of byte=(1,2,4,8);
mscga4:array[0..3] of byte=($3f,$cf,$f3,$fc);
shcga4:array[0..3] of byte=(6,4,2,0);
var l:longint;
m,z:word;
begin
case memmode of
_cga1:begin
z:=(y shr 1)*bytes+(x shr 3);
if odd(y) then inc(z,8192);
mem[SegB800:z]:=(mem[SegB800:z] and (255 xor msk[x and 7]))
or ((col and 1) shl (7-(x and 7)));
end;
_cga2:begin
z:=(y shr 1)*bytes+(x shr 2);
if odd(y) then inc(z,8192);
mem[SegB800:z]:=(mem[SegB800:z] and mscga4[x and 3])
or (col and 3) shl shcga4[x and 3];
end;
_pl1:begin
l:=y*bytes+(x shr 3);
wrinx(GRC,3,0);
wrinx(GRC,5,2);
wrinx(SEQ,2,1);
wrinx(GRC,8,msk[x and 7]);
setbank(l shr 16);
z:=mem[vseg:word(l)];
mem[vseg:word(l)]:=col;
end;
_pl1e:begin
l:=y*bytes+(x shr 3);
modinx(GRC,5,3,0);
wrinx(SEQ,2,15);
wrinx(GRC,0,col*3);
wrinx(GRC,1,3);
wrinx(GRC,8,msk[x and 7]);
z:=mem[vseg:word(l)];
mem[vseg:word(l)]:=0;
end;
_pl2:begin
l:=y*bytes+(x shr 4);
wrinx(GRC,3,0);
wrinx(GRC,5,2);
wrinx(SEQ,2,plane[(x shr 3) and 1]);
wrinx(GRC,8,msk[x and 7]);
setbank(l shr 16);
z:=mem[vseg:word(l)];
mem[vseg:word(l)]:=col;
end;
_pk2:begin
l:=y*bytes+(x shr 2);
setbank(l shr 16);
z:=mem[vseg:word(l)] and mscga4[x and 3];
mem[vseg:word(l)]:=z or (col shl shcga4[x and 3]);
end;
_pl4:begin
l:=y*bytes+(x shr 3);
wrinx(GRC,3,0);
wrinx(GRC,5,2);
wrinx(GRC,8,msk[x and 7]);
setbank(l shr 16);
z:=mem[vseg:word(l)];
mem[vseg:word(l)]:=col;
end;
_pk4:begin
l:=y*bytes+(x shr 1);
setbank(l shr 16);
z:=mem[vseg:word(l)];
if odd(x) then z:=z and $f0+col
else z:=z and $f+(col shl 4);
mem[vseg:word(l)]:=z;
end;
_pk4a:begin
l:=y*bytes+(x shr 1);
setbank(l shr 16);
z:=mem[vseg:word(l)];
if odd(x) then z:=z and $f+(col shl 4)
else z:=z and $f0+col;
mem[vseg:word(l)]:=z;
end;
_pk4b:begin
case x and 6 of
2:inc(x,2);
4:dec(x,2);
end;
l:=y*bytes+(x shr 1);
setbank(l shr 16);
z:=mem[vseg:word(l)];
if odd(x) then z:=z and $f+(col shl 4)
else z:=z and $f0+col;
mem[vseg:word(l)]:=z;
end;
_p8:begin
l:=y*bytes+x;
setbank(l shr 16);
mem[vseg:word(l)]:=col;
end;
_p15,_p16:
begin
l:=y*bytes+(x shl 1);
setbank(l shr 16);
memw[vseg:word(l)]:=col;
end;
_p24,_p24b:
begin
l:=y*bytes+(x*3);
z:=word(l);
m:=l shr 16;
setbank(m);
if z<$fffe then move(col,mem[vseg:z],3)
else begin
mem[vseg:z]:=lo(col);
if z=$ffff then setbank(m+1);
mem[vseg:z+1]:=lo(col shr 8);
if z=$fffe then setbank(m+1);
mem[vseg:z+2]:=col shr 16;
end;
end;
_p32,_p32b,_p32c,_p32d:
begin
l:=y*bytes+(x shl 2);
setbank(l shr 16);
meml[vseg:word(l)]:=col;
end;
else ;
end;
end;
function whitecol:longint;
var col:longint;
begin
case memmode of
_cga1,_pl1e,
_pl1:col:=1;
_cga2,_pk2
,_pl2:col:=3;
_pk4,_pl4,_PK4a,_pk4b:
col:=15;
_p8:col:=255;
_p15:col:=$7fff;
_p16:col:=$ffff;
_p24,_p24b,_p32,_p32b:
col:=$ffffff;
_p32c,_p32d:col:=$ffffff00;
else
end;
whitecol:=col;
end;
procedure wrtext(x,y:word;txt:string); {write TXT to pos (X,Y)}
type
pchar=array[char] of array[0..15] of byte;
var
p:^pchar;
c:char;
i,j,z,b,lns:integer;
ad,bk:word;
l,v,col:longint;
begin
lns:=15; {Assume full height chars}
ad:=(cv.mm*longint(1024)) div bytes;
if y+14>ad then lns:=ad-y; {Check if we're past the bottom}
rp.bh:=6;
vio($1130);
col:=whitecol;
p:=ptr(rp.es,rp.bp);
for z:=1 to length(txt) do
begin
c:=txt[z];
for j:=0 to lns do
begin
b:=p^[c][j];
for i:=0 to 7 do
begin
if (b and 128)<>0 then v:=col else v:=0;
setpix(x+i,y+j,v);
b:=b shl 1;
end;
end;
inc(x,8);
end;
end;
procedure plotchar(x,y,ch:word);
begin
mem[vseg:(y*pixels+x) shl 1]:=ch;
end;
procedure plotchat(x,y,ch,at:word);
begin
memw[vseg:(y*pixels+x) shl 1]:=at shl 8+ch;
end;
procedure plotstr(x,y:word;s:string);
var z:word;
begin
for z:=1 to length(s) do
plotchar(x+z-1,y,ord(s[z]));
end;
procedure drawtestpattern(nam:string);
{Draw Test pattern.}
var s:string;
l:longint;
x,y,yst:word;
white:longint;
procedure wline(stx,sty,ex,ey:integer;col:longint);
var x,y,d,mx,my:longint;
l:longint;
begin
if sty>ey then
begin
x:=stx;stx:=ex;ex:=x;
x:=sty;sty:=ey;ey:=x;
end;
y:=0;
mx:=abs(ex-stx);
my:=ey-sty;
d:=0;
repeat
if col=0 then l:=rgb(y,y,y) else l:=col;
y:=(y+1) and 255;
setpix(stx,sty,l);
if abs(d+mx)<abs(d-my) then
begin
inc(sty);
d:=d+mx;
end
else begin
d:=d-my;
if ex>stx then inc(stx)
else dec(stx);
end;
until (stx=ex) and (sty=ey);
end;
begin
if memmode<=_TXT4 then
begin
{Text modes}
{ ClearMemory; }
for x:=0 to pixels-1 do
begin
plotchar(x,0,(x mod 10)+ord('0'));
if (x mod 10)=0 then
plotchar(x,1,((x div 10) mod 10)+ord('0'));
plotchar(x,lins-1,ord('.'));
end;
for x:=0 to lins-1 do
begin
plotchar(0,x,(x mod 10)+ord('0'));
if (x mod 10)=0 then
plotstr(0,x,istr(x));
plotchar(pixels-1,x,ord('.'));
end;
plotstr(5,5,nam);
for x:=0 to 255 do
plotchat(x and 15+10,x shr 4+7,65,x);
plotstr((pixels-30) div 2,lins,'This line shouldn''t be seen!!');
end
else begin
white:=whitecol;
wline(50,30,pixels-50,30 ,0);
wline(50,lins-30,pixels-50,lins-30 ,0);
wline(50,30,50,lins-30 ,0);
wline(pixels-50,30,pixels-50,lins-30 ,0);
wline(50,30,pixels-50,lins-30 ,0);
wline(pixels-50,30,50,lins-30 ,0);
if lins>200 then yst:=50 else yst:=18;
wrtext(10,yst,cv.name+' with '+istr(cv.mm)+' Kb.');
wrtext(10,yst+25,nam);
for x:=1 to (pixels-10) div 100 do
begin
for y:=1 to 10 do
setpix(x*100,y,white);
wrtext(x*100+3,1,istr(x));
end;
for x:=1 to (lins-10) div 100 do
begin
for y:=1 to 10 do
setpix(y,x*100,white);
wrtext(1,x*100+2,istr(x));
end;
case colbits[memmode] of
2:for x:=0 to 63 do
for y:=0 to 63 do
setpix(30+x,yst+y+50,y shr 3);
4:for x:=0 to 127 do
if lins<250 then
for y:=0 to 63 do
setpix(30+x,yst+y+50,y shr 2)
else
for y:=0 to 127 do
setpix(30+x,yst+y+50,y shr 3);
8:for x:=0 to 127 do
if lins<250 then
for y:=0 to 63 do
setpix(30+x,yst+50+y,((y shl 2) and 240) +(x shr 3))
else
for y:=0 to 127 do
setpix(30+x,yst+50+y,((y shl 1) and 240)+(x shr 3));
15,16,24,32:if pixels<600 then
begin
for x:=0 to 63 do
begin
for y:=0 to 63 do
begin
setpix(30+x,100+y,rgb(x*4,y*4,0));
setpix(110+x,100+y,rgb(x*4,0,y*4));
setpix(190+x,100+y,rgb(0,x*4,y*4));
end;
end;
for x:=0 to 255 do
for y:=170 to 179 do
begin
setpix(x,y ,rgb(x,0,0));
setpix(x,y+10,rgb(0,x,0));
setpix(x,y+20,rgb(0,0,x));
end;
end
else begin
for x:=0 to 127 do
for y:=0 to 127 do
begin
setpix( 30+x,120+y,rgb(x*2,y*2,0));
setpix(200+x,120+y,rgb(x*2,0,y*2));
setpix(370+x,120+y,rgb(0,x*2,y*2));
end;
for x:=0 to 511 do
for y:=260 to 269 do
begin
setpix(x,y ,rgb(x shr 1,0,0));
setpix(x,y+10,rgb(0,x shr 1,0));
setpix(x,y+20,rgb(0,0,x shr 1));
end;
end;
end;
wline(0,0,10, 0 ,whitecol);
wline(0,0, 0,10 ,whitecol);
wline(0,0,10,10 ,whitecol);
wline(pixels-11, 0,pixels-1, 0 ,whitecol);
wline(pixels-1 , 0,pixels-1,10 ,whitecol);
wline(pixels-11,10,pixels-1, 0 ,whitecol);
wline(0,lins-11, 0,lins-1 ,whitecol);
wline(0,lins-1 ,10,lins-1 ,whitecol);
wline(0,lins-1 ,10,lins-11 ,whitecol);
wline(pixels-11,lins-1 ,pixels-1,lins-1 ,whitecol);
wline(pixels-1 ,lins-11,pixels-1,lins-1 ,whitecol);
wline(pixels-11,lins-11,pixels-1,lins-1 ,whitecol);
end;
end;
(* Writes the string s to 1. line of the mono. screen *)
procedure wrmono(s:string);
var x:word;
begin
for x:=1 to length(s) do
mem[SegB000:x+x]:=ord(s[x]);
end;
(* Ensures that xlow<=x<=xhigh *)
procedure chkrange(var x:integer;xlow,xhigh:integer);
begin
if x<xlow then x:=xlow
else if x>xhigh then x:=xhigh;
end;
var
CurModeIndex:integer; {Index into the ModeTbl array for the current mode}
function testvmode:boolean;
const iltxt:array[boolean] of string[4]=('',' (i)');
var
s:string;
r13,sclins,scpixs,scbytes:word;
x0,y0,x,dlay:integer;
ch:word;
stop,scrollable,nxt:boolean;
begin
testvmode:=true;
s:='Mode: '+hex4(curmode)+'h: '+istr(pixels)+'x'+istr(lins)+' '+mmodenames[memmode];
drawtestpattern(s);
if auto_test then af_rec.flag:=AFF_testok; {Mode Supported}
scrollable:=false;
ch:=getkey;
if (ch<>Ch_Esc) and not (chr(ch) in ['D','F','d','f']) then
begin
if memmode>=_pl4 then
begin
scrollable:=true;
{ Scroll test }
sclins:=lins;
scpixs:=pixels;
scbytes:=bytes;
r13:=rdinx(crtc,$13);
if ((cv.flags and FLG_StdVGA)>0) and ((bytes*lins*planes*5 div 2)<cv.mm*longint(1024))
and (r13<128) and (r13>0) and ((bytes div r13) in [1,2,4,8,16])
and (memmode<>_cga1) and (memmode<>_cga2) then
begin {Can we double the screen?}
wrinx(crtc,$13,r13*2);
bytes:=bytes*2;
pixels:=pixels*2;
end;
case memmode of
_text,_txt2,_txt4:
lins:=32768 div bytes;
_cga1,_cga2:
lins:=16384 div bytes;
_pl1:lins:=cv.mm*longint(256) div bytes;
else lins:=cv.mm*longint(1024) div (bytes*planes);
end;
case memmode of
_cga1,_pl1,
_pl4:pixels:=bytes*8;
_cga2:pixels:=bytes*4;
_pk4,_PK4a,_pk4b:
pixels:=bytes*2;
_p8:pixels:=bytes;
_p15,_p16:pixels:=bytes shr 1;
_p24,_P24b:pixels:=bytes div 3;
_p32,_p32b,_p32c,_p32d:
pixels:=bytes shr 2;
end;
Clearmemory;
drawtestpattern(s);
x0:=0;
y0:=0;
stop:=false;
dlay:=100; {100ms}
if auto_test then pushkey(ord('a'));
repeat
setvstart(x0,y0);
case getkey of
ord('>'):inc(x0);
ord('<'):dec(x0);
Ch_ArUp:y0:=y0-16;
Ch_ArLeft:x0:=x0-16;
Ch_ArRight:x0:=x0+16;
Ch_ArDown:y0:=y0+16;
Ch_PgUp:dec(y0);
Ch_PgDn:inc(y0);
ord('A'),ord('a'):begin
x0:=0;y0:=0;x:=0;
repeat
delay(dlay);
nxt:=false;
case x of
0:if x0+16<=pixels-scpixs then inc(x0,16)
else begin
nxt:=true;
x0:=pixels-scpixs;
end;
1:if y0+16<=lins-sclins then inc(y0,16)
else begin
nxt:=true;
y0:=lins-sclins;
dlay:=50; {Speed up for return trip}
end;
2:if x0>=16 then dec(x0,16)
else begin
nxt:=true;
x0:=0;
dlay:=25; {Speed up for return trip}
end;
3:if y0>=16 then dec(y0,16)
else begin
nxt:=true;
stop:=true;
y0:=0;
end;
end;
setvstart(x0,y0);
if nxt then
begin
inc(x);
delay(500);
end;
if peekkey=Ch_Esc then stop:=true;
until stop;
delay(500);
end;
ord('D'),ord('d'),ord('F'),ord('f'):begin
stop:=true;
repeatkey;
end;
Ch_Esc,Ch_Cr:stop:=true;
ord('R'),ord('r'):begin
stop:=true;
repeatkey;
end;
end;
chkrange(x0,0,pixels-scpixs+10000);
chkrange(y0,0,lins-sclins);
until stop;
setvstart(0,0); {Reset start, some chipsets NEED this}
pixels:=scpixs;
lins:=sclins;
bytes:=scbytes;
end;
SetTextMode;
writeln('Values for mode '+hex4(curmode)+':');
writeln;
writeln(' List: Calc: BlnkS: RetrS: RetrE: BlnkE: Frame:');
writeln('Pixels per scan line:',pixels:6,calcpixels:7,calchblks:7,calchrtrs:7
,calchrtre:7,calchblke:7,calchtot:8);
writeln('Lines in image: ',lins:6 ,calclines:7,calcvblks:7,calcvrtrs:7
,calcvrtre:7,calcvblke:7,calcvtot:8,iltxt[ilace]);
writeln('Bytes per scanline: ',bytes:6 ,calcbytes:7);
writeln('Memory mode: ',strip(mmodenames[memmode]):6,strip(mmodenames[calcmmode]):7);
if memmode<_herc then
writeln('Character cell: ',charwid,'x',charhigh);
if vclk>0 then
begin
writeln;
write('Clocks: Pixel: '+freq(vclk)+' MHz, Line: '+freq(hclk)
,' KHz, Frame: '+freq(fclk)+' Hz');
if ilace then write(' (i)');
writeln;
writeln('Required bandwidth: '+freq(BWlow)+' -'+freq(BWhigh)+' Mb/s');
end;
if auto_test then
begin
pushkey(ch);
writeln;
write('Did the mode display properly (y/n): ');
if getYN then inc(af_rec.flag,AFF_dispok);
if scrollable then
begin
writeln;
write('Did the mode scroll properly (y/n): ');
if getYN then inc(af_rec.flag,AFF_scrollok)
else inc(af_rec.flag,AFF_scroll);
end;
if (af_rec.flag and AFF_dispok)=0 then
begin
write('Disable the mode (y/n): ');
if getYN then inc(af_rec.flag,AFF_canceled);
end;
af_cmt:=GetComment('any comments to the test');
af_rec.vseg :=vseg;
af_rec.Cpixels :=calcpixels;
af_rec.Clins :=calclines;
af_rec.Cbytes :=calcbytes;
af_rec.CMmode :=calcmmode;
af_rec.ChWidth :=charwid;
af_rec.ChHeight:=charhigh;
af_rec.Cvseg :=calcvseg;
af_rec.ExtPixf :=Extpixfact;
af_rec.Extlinf :=Extlinfact;
af_rec.vclk :=vclk;
af_rec.hclk :=hclk;
af_rec.fclk :=fclk;
af_rec.ilace :=ilace;
pushkey(ch_cr);
end;
ch:=getkey;
end;
if (ch=ord('D')) or (ch=ord('d')) then ch:=dumpVGAregs;
case ch of
Ch_Esc:testvmode:=false;
ord('f'),ord('F'):
dumpVGAregfile;
ord('r'),ord('R'):
modetbl[CurModeIndex].flags:=
modetbl[CurModeIndex].flags and (not MFL_enabled);
end;
end;
function InitMode(md:integer):boolean;
begin
CurModeIndex:=md;
memmode:=modetbl[md].memmode;
pixels :=modetbl[md].xres;
lins :=modetbl[md].yres;
bytes :=modetbl[md].bytes;
InitMode:=setmode(modetbl[md].md,true);
end;
procedure testcursor; {Test HardWare Cursor}
var m,x:word;
md:integer;
procedure setXY(x0,y0:word);
begin
SetHWcurpos(x0,y0);
SetHWcurcol(((x0*longint(256) div pixels)*256
+(y0*longint(256) div lins))*256+$ff,0);
end;
procedure tmode(m:word);
const
CurMap:CursorType= {Snipers sight}
($00f81f00,$00800130,$00800130,$00800100
,$00f00f00,$008c3100,$00824100,$00818100
,$80800101,$40800102,$20800104,$21800184
,$11800188,$11800188,$11800188,$ffffffff
,$ffffffff,$11800188,$11800188,$11800188
,$21800184,$20800104,$40800102,$80800101
,$00818100,$00824100,$008C3100,$00f00f00
,$00800100,$00800100,$00800100,$00f81f00);
var x,x0,y0:integer;
fgcol,bkcol:longint;
stop:boolean;
begin
if InitMode(m) then
begin
drawtestpattern('Mode: '+hex4(curmode)+'h: '+istr(pixels)+'x'
+istr(lins)+' '+istr(modecols[memmode])+' colors');
SetHWcurmap(CurMap);
if auto_test then pushkey(ord('A'));
stop:=false;
x0:=100;y0:=150; {Place it in the palette}
repeat
if y0<0 then y0:=0;
if x0+32>pixels then x0:=pixels-32;
if y0+32>lins then y0:=lins-32;
SetXY(x0,y0);
case getkey of
Ch_ArUp:dec(y0,17);
Ch_ArLeft:dec(x0,17);
Ch_ArRight:inc(x0,17);
Ch_ArDown:inc(y0,17);
ord('a'),ord('A'):
begin
x0:=0;
repeat
SetXY(x0,150);
delay(200);
inc(x0,17);
until x0>pixels-32;
x0:=0;
repeat
SetXY(200,x0);
delay(200);
inc(x0,17);
until x0>lins-32;
stop:=true;
end;
Ch_Cr,Ch_Esc:stop:=true;
end;
until stop;
HWcuronoff(false);
if auto_test then
begin
repeat until keypressed;
SetTextMode;
write('Did the Hardware Cursor work properly (y/n) ?');
af_tst.Flag :=ord(getYN)*AFF_testok;
af_cmt:=getComment('any comments to the test');
af_tst.mode :=modetbl[m].md;
af_tst.Mmode:=modetbl[m].memmode;
AddAFbuf(af_tst,sizeof(af_tst));
AddAFbuf(af_cmt,length(af_cmt)+1);
WrAFbuf(AF_Tcursor);
end;
end;
end;
begin
textmode($103); {43/50 line text mode}
writeln('Hardware Cursor test.');
writeln;
if auto_test then
begin
delay(1000);
pushkey(ord('*'));
end
else begin
writeln('Modes:');
writeln;
for m:=1 to nomodes do
if (modetbl[m].flags AND MFL_enGr)=MFL_enGr then
writeln(' '+menuchars[m]+' '+hex4(modetbl[m].md)+'h '+istr(modetbl[m].xres)
+'x'+istr(modetbl[m].yres)+' '+mdtxt[modetbl[m].memmode]);
writeln;
writeln(' * All modes');
writeln;
end;
x:=getmenkey;
for m:=1 to nomodes do
if ((x=0) or (x=m)) and ((modetbl[m].flags AND MFL_enGr)=MFL_enGr) then
tmode(m);
end;
procedure testblit; {Test BitBLT functions}
var m,x:word;
md:integer;
procedure tmode(m:word);
var x,y,x0,y0,siz:integer;
stop:boolean;
begin
if InitMode(m) then
begin
drawtestpattern('Mode: '+hex4(curmode)+'h: '+istr(pixels)+'x'
+istr(lins)+' '+istr(modecols[memmode])+' colors');
if lins>=400 then siz:=8 else siz:=4;
x0:=pixels div 2-8*siz;
y0:=lins div 2-8*siz;
case colbits[memmode] of
4:for x:=0 to 15 do
fillrect(x0,y0+x*siz,16*siz,siz,x);
8:for x:=0 to 255 do
fillrect(x0+(x and 15)*siz,y0+(x div 16)*siz,siz,siz,x);
15,16,24,32:for x:=0 to 63 do
begin
fillrect(x0+(x and 15)*siz,y0+(x div 16)*siz,siz,siz,rgb(x*4,0,0));
fillrect(x0+(x and 15)*siz,y0+siz*4+(x div 16)*siz,siz,siz,rgb(0,x*4,0));
fillrect(x0+(x and 15)*siz,y0+siz*8+(x div 16)*siz,siz,siz,rgb(0,0,x*4));
fillrect(x0+(x and 15)*siz,y0+siz*12+(x div 16)*siz,siz,siz,rgb(x*4,x*4,x*4));
end;
end;
copyrect(x0,y0,x0-siz*15,y0-5 ,siz*16-1,siz*16+1);
copyrect(x0,y0,x0+5 ,y0-siz*15,siz*16-1,siz*16+1);
copyrect(x0,y0,x0+siz*15,y0+5 ,siz*16-1,siz*16+1);
copyrect(x0,y0,x0-5 ,y0+siz*15,siz*16-1,siz*16+1);
if memmode<=_pl4 then {special 16c test pattern}
begin
for y:=1 to 8 do
begin
y0:=y*10+250;
fillrect(100,y0,y,8,y);
x0:=101+y;
for x:=1 to 15 do
begin
fillrect(x0,y0,x,8,y);
x0:=x0+x+1;
end;
fillrect(x0,y0,9-y,8,y);
y0:=y0+10;
end;
{ if readkey='' then; }
for x:=0 to 19 do
begin
x0:=96+x*8;
for y:=0 to 8 do
setpix(x0,259+10*y,15);
end;
end;
if auto_test then
begin
repeat until keypressed;
SetTextMode;
write('Did the BitBLT test work properly (y/n) ?');
af_tst.Flag :=ord(getYN)*AFF_testok;
af_cmt:=getComment('any comments to the test');
af_tst.mode :=modetbl[m].md;
af_tst.Mmode:=modetbl[m].memmode;
AddAFbuf(af_tst,sizeof(af_tst));
AddAFbuf(af_cmt,length(af_cmt)+1);
WrAFbuf(AF_Tbitblt);
end
else if getkey=0 then;
end;
settextmode;
end;
begin
textmode($103);
writeln('Hardware BitBLT test.');
writeln;
if auto_test then
begin
delay(1000);
pushkey(ord('*'));
end
else begin
writeln('Modes:');
writeln;
for m:=1 to nomodes do
if (modetbl[m].flags AND MFL_enGr)=MFL_enGr then
writeln(' '+menuchars[m]+' '+hex4(modetbl[m].md)+'h '+istr(modetbl[m].xres)
+'x'+istr(modetbl[m].yres)+' '+mdtxt[modetbl[m].memmode]);
writeln;
writeln(' * All modes');
writeln;
end;
x:=getmenkey;
for m:=1 to nomodes do
if ((x=0) or (x=m)) and ((modetbl[m].flags AND MFL_enGr)=MFL_enGr) then
tmode(m);
end;
procedure testline; {Test Line Draw functions}
var x,m:word;
md:integer;
procedure tmode(m:word);
var x,x0,y0,linl:integer;
stop:boolean;
col:longint;
zz:array[-10..10] of integer;
begin
if InitMode(m) then
begin
drawtestpattern('Mode: '+hex4(curmode)+'h: '+istr(pixels)+'x'
+istr(lins)+' '+istr(modecols[memmode])+' colors');
x0:=pixels div 2;
y0:=lins div 2;
linl:=lins div 3;
for x:=-10 to 9 do
begin
case colbits[memmode] of
4:col:=(x+11) and 15;
8:col:=x*12+128;
15,16,24,32:col:=rgb(128-x*10,x+128,128+x*5);
end;
line(x0,y0,x0+x*(linl div 10),y0-linl,col);
line(x0,y0,x0+linl ,y0+x*(linl div 10),col);
line(x0,y0,x0-x*(linl div 10),y0+linl,col);
line(x0,y0,x0-linl ,y0-x*(linl div 10),col);
end;
if auto_test then
begin
repeat until keypressed;
SetTextMode;
write('Did the Line Draw test work properly (y/n): ?');
af_tst.Flag :=ord(getYN)*AFF_testok;
af_cmt:=getComment('any comments to the test');
af_tst.mode :=modetbl[m].md;
af_tst.Mmode:=modetbl[m].memmode;
AddAFbuf(af_tst,sizeof(af_tst));
AddAFbuf(af_cmt,length(af_cmt)+1);
WrAFbuf(AF_Tline);
end
else if getkey=0 then;
end;
settextmode;
end;
begin
textmode($103);
writeln('Hardware Line Draw test.');
writeln;
if auto_test then
begin
delay(1000);
pushkey(ord('*'));
end
else begin
writeln('Modes:');
writeln;
for m:=1 to nomodes do
if (modetbl[m].flags AND MFL_enGr)=MFL_enGr then
writeln(' '+menuchars[m]+' '+hex4(modetbl[m].md)+'h '+istr(modetbl[m].xres)
+'x'+istr(modetbl[m].yres)+' '+mdtxt[modetbl[m].memmode]);
writeln;
writeln(' * All modes');
writeln;
end;
x:=getmenkey;
for m:=1 to nomodes do
if ((x=0) or (x=m)) and ((modetbl[m].flags AND MFL_enGr)=MFL_enGr) then
tmode(m);
end;
procedure testRWbank; {Test R/W bank functions}
var x,m:word;
md:integer;
procedure CopyLin(x0,y0,x1,y1,pix:word);
var
pxs,px,x,y:word;
src,dst:longint;
begin
x:=usebits[memmode] div planes;
src:=y0*bytes+(x0*x) div 8;
dst:=y1*bytes+(x1*x) div 8;
pxs:=(pix*x) div 8;
if planes>1 then
begin
wrinx(GRC,3,0);
wrinx(GRC,5,1);
end;
repeat
px:=pxs;
x:=$8000-(src and $7FFF);
if px>x then px:=x;
x:=$8000-(dst and $7FFF);
if px>x then px:=x;
setbank(dst shr 16);
setrbank(src shr 16);
move(mem[vseg:src],mem[vseg:dst],px);
inc(src,px);
inc(dst,px);
dec(pxs,px);
until pxs=0;
end;
procedure tmode(m:word);
var x,wid:integer;
begin
if InitMode(m) then
begin
drawtestpattern('Mode: '+hex4(curmode)+'h: '+istr(pixels)+'x'
+istr(lins)+' '+istr(modecols[memmode])+' colors');
wid:=(pixels div 2)-40;
for x:=0 to lins-1 do
CopyLin(30,x,wid+50,lins-x,wid);
if auto_test then
begin
repeat until keypressed;
SetTextMode;
write('Did the Read/Write bank test work properly (y/n) ?');
af_tst.Flag :=ord(getYN)*AFF_testok;
af_cmt:=getComment('any comments to the test');
af_tst.mode :=modetbl[m].md;
af_tst.Mmode:=modetbl[m].memmode;
AddAFbuf(af_tst,sizeof(af_tst));
AddAFbuf(af_cmt,length(af_cmt)+1);
WrAFbuf(AF_TRWbank);
end
else if getkey=0 then;
end;
settextmode;
end;
begin
textmode($103);
writeln('Seperate Read/Write bank test.');
if auto_test then
begin
delay(1000);
pushkey(ord('*'));
end
else begin
writeln('Modes:');
writeln;
for m:=1 to nomodes do
if (modetbl[m].flags AND MFL_enGr)=MFL_enGr then
writeln(' '+menuchars[m]+' '+hex4(modetbl[m].md)+'h '+istr(modetbl[m].xres)
+'x'+istr(modetbl[m].yres)+' '+mdtxt[modetbl[m].memmode]);
writeln;
writeln(' * All modes');
writeln;
end;
x:=getmenkey;
for m:=1 to nomodes do
if ((x=0) or (x=m)) and ((modetbl[m].flags AND MFL_enGr)=MFL_enGr) then
tmode(m);
end;
procedure testZoom; {Test Pan & Zoom functions}
var x,m:word;
md:integer;
procedure tmode(m:word);
var Xf,Yf,wXs,wXe,wYs,wYe,srcX,srcY:integer;
dirty,stop:boolean;
begin
if InitMode(m) then
begin
drawtestpattern('Mode: '+hex4(curmode)+'h: '+istr(pixels)+'x'
+istr(lins)+' '+istr(modecols[memmode])+' colors');
Xf:=0;Yf:=0;srcX:=0;srcY:=0;
wXs:=100;wXe:=150;wYs:=50;wYe:=75;
ZoomOnOff(true);
stop:=false;dirty:=true;
repeat
if dirty then
begin
if Xf<0 then Xf:=0;
if Xf>3 then Xf:=3;
if Yf<0 then Yf:=0;
if Yf>3 then Yf:=3;
SetZoomFactor(Xf,Yf);
if wXs>wXe then wXe:=wXs;
if wYs>wYe then wYe:=wYs;
SetZoomWindow(wXs,wYs,wXe,wYe);
if srcX<0 then srcX:=0;
if srcX>=pixels then srcX:=pixels-1;
if srcY<0 then srcY:=0;
if srcY>=lins then srcY:=lins-1;
setZoomAdr(srcX,srcY);
end;
dirty:=true;
case getkey of
ord('-'):dec(Yf);
ord('+'):inc(Yf);
ord('/'):dec(Xf);
ord('*'):inc(Xf);
Ch_ArUp:dec(srcY);
Ch_ArLeft:dec(srcX);
Ch_ArRight:inc(srcX);
Ch_ArDown:inc(srcY);
Ch_F1:dec(wXs);
Ch_F2:inc(wXs);
Ch_F3:dec(wXe);
Ch_F4:inc(wXe);
Ch_F5:dec(wYs);
Ch_F6:inc(wYs);
Ch_F7:dec(wYe);
Ch_F8:inc(wYe);
Ch_Esc,Ch_Cr:stop:=true;
else dirty:=false;
end;
until stop;
ZoomOnOff(false);
if auto_test then
begin
repeat until keypressed;
SetTextMode;
write('Did the Pan & Zoom test work properly (y/n) ?');
af_tst.Flag :=ord(getYN)*AFF_testok;
af_cmt:=getComment('any comments to the test');
af_tst.mode :=modetbl[m].md;
af_tst.Mmode:=modetbl[m].memmode;
AddAFbuf(af_tst,sizeof(af_tst));
AddAFbuf(af_cmt,length(af_cmt)+1);
WrAFbuf(AF_Tzoom);
end
else if getkey=0 then;
end;
end;
begin
textmode($103);
writeln('Pan & Zoom test.');
if auto_test then
begin
delay(1000);
pushkey(ord('*'));
end
else begin
writeln('Modes:');
writeln;
for m:=1 to nomodes do
if (modetbl[m].flags AND MFL_enGr)=MFL_enGr then
writeln(' '+menuchars[m]+' '+hex4(modetbl[m].md)+'h '+istr(modetbl[m].xres)
+'x'+istr(modetbl[m].yres)+' '+mdtxt[modetbl[m].memmode]);
writeln;
writeln(' * All modes');
writeln;
end;
x:=getmenkey;
for m:=1 to nomodes do
if ((x=0) or (x=m)) and ((modetbl[m].flags AND MFL_enGr)=MFL_enGr) then
tmode(m);
end;
procedure testbits; {Test register bits}
var m,pt,ix,msk:word;
md,x:integer;
s:string;
function tmode(m:word):boolean;
const
mask:array[0..7] of byte=(1,2,4,8,16,32,64,128);
var
stop:boolean;
x:word;
begin
tmode:=true;
if InitMode(m) then
begin
case memmode of
_text,_txt2,_txt4:
lins:=32768 div bytes;
_cga1,_cga2:
lins:=16384 div bytes;
_pl1:lins:=cv.mm*longint(256) div bytes;
else lins:=cv.mm*longint(1024) div (bytes*planes);
end;
Clearmemory;
clrinx(crtc,$11,$80);
drawtestpattern(s);
stop:=false;
repeat
wrtext(10,180,'Reg '+hex4(pt)+'h index '+hex2(ix)+'h bit '+chr(msk+48));
x:=rdinx(pt,ix);
wrinx(pt,ix,x xor mask[msk]);
wrtext(220,180,'= '+chr(48+(rdinx(pt,ix) shr msk) and 1));
delay(500);
wrinx(pt,ix,x);
wrtext(220,180,'= '+chr(48+(rdinx(pt,ix) shr msk) and 1));
delay(500);
if keypressed then
case getkey of
ord('-'):if msk>0 then dec(msk)
else begin
msk:=7;
dec(ix);
end;
ord('+'):begin
inc(msk);
if msk>7 then
begin
msk:=0;
inc(ix);
end;
end;
ord('*'):begin
inc(ix);
msk:=0;
end;
Ch_Esc:stop:=true;
end;
until stop;
SetTextmode;
end;
end;
begin
textmode($103);
writeln('Test register bits.');
writeln;
write('Base register (hex): ');
readln(s);
pt:=dehex(s);
write('Start Index (hex 0-FFh): ');
readln(s);
ix:=dehex(s);
write('Start Bit (0-7): ');
readln(s);
msk:=ord(s[1]) and 7;
writeln;
writeln('Testing register bits, starting with '+hex4(pt)+'h index '+hex2(ix)+'h bit '+chr(msk+48)+'.');
writeln;
writeln(' + Steps up to the next bit (and possibly next index)');
writeln(' - Steps back to the last bit');
writeln(' * Steps to the next index, bit 0');
writeln(' Esc Terminates the test');
writeln;
writeln('Modes:');
writeln;
for m:=1 to nomodes do
begin
writeln(' '+menuchars[m]+' '+hex4(modetbl[m].md)+'h '+istr(modetbl[m].xres)
+'x'+istr(modetbl[m].yres)+' '+mdtxt[modetbl[m].memmode]);
end;
writeln;
x:=getmenkey;
for m:=1 to nomodes do
if (x=m) then
if not tmode(m) then x:=-1; {stop}
end;
procedure testregs; {Test register Read/Writable}
var m,pt,ix,msk:word;
md,x:integer;
s,IM:string;
function tmode(md:word):boolean;
const
bit:array[0..7] of byte=(1,2,4,8,16,32,64,128);
var
x,y,z,i:word;
msk:array[0..2047] of char;
v0:array[0..255] of byte;
imsk:array[0..7] of char;
procedure writelog;
var x:word;
begin
wrlog('Register test for index '+hex4(pt)+'h Index mask: '
+imsk[0]+imsk[1]+imsk[2]+imsk[3]+imsk[4]+imsk[5]+imsk[6]+imsk[7]);
writeln(' 01234567 01234567 01234567 01234567 01234567 01234567 01234567 01234567');
for x:=0 to 2047 do
begin
if (x and 63)=0 then s:=' '+hex2(x shr 3)+':';
if (x and 7)=0 then s:=s+' ';
s:=s+msk[x];
if (x and 63)=63 then wrlog(s);
end;
closelog;
end;
begin
tmode:=true;
if setMode(md,true) then
begin
clrinx(crtc,$11,$80);
drawtestpattern(s);
fillchar(imsk,8,'W');
y:=inp(pt);z:=0;
for x:=0 to 7 do {Check if each bit of the index register is RW}
begin
outp(pt,y and not bit[x and 7]);
if (inp(pt) and bit[x and 7])>0 then imsk[x]:='1';
outp(pt,y or bit[x and 7]);
if (inp(pt) and bit[x and 7])=0 then imsk[x]:='0';
outp(pt,y);
if IM[x+1]=' ' then im[x+1]:=imsk[x];
end;
z:=0;y:=0;
for x:=1 to 8 do
begin
if (im[x]='0') or (im[x]='1') then z:=z or bit[x-1]*8;
if (im[x]='1') then y:=y or bit[x-1]*8;
end;
fillchar(msk,sizeof(msk),'W'); {Set all bits off}
for x:=0 to 2047 do
if ((x xor y) and z)>0 then msk[x]:='.';
for y:=0 to 255 do v0[y]:=rdinx(pt,y);
for x:=1 to 10 do
for y:=0 to 255 do {Find any bits that changes if read again}
begin
z:=v0[y] xor rdinx(pt,y);
for i:=0 to 7 do {Check each bit}
if (z and bit [i])>0 then msk[y*8+i]:='A';
end;
openlog(false);
wrlog('After re-read test');
writelog;
for x:=0 to 2047 do {Check that each bit is R/W}
if msk[x]='W' then
begin
y:=x shr 3;
wrinx(pt,y,v0[y] and not bit[x and 7]);
if (rdinx(pt,y) and bit[x and 7])>0 then msk[x]:='1';
wrinx(pt,y,v0[y] or bit[x and 7]);
if (rdinx(pt,y) and bit[x and 7])=0 then msk[x]:='0';
wrinx(pt,y,v0[y]);
end;
openlog(false);
wrlog('After R/W test');
writelog;
for x:=1 to 2047 do {Try to change one of the other bits}
if msk[x]='W' then {and see if we changes with it}
begin
y:=x shr 3;
wrinx(pt,y,v0[y] xor bit[x and 7]);
for z:=0 to x-1 do
if (msk[z]='W') and (((v0[z shr 3] xor rdinx(pt,z shr 3))
and bit[z and 7])>0) then msk[z]:='C';
wrinx(pt,y,v0[y]);
for z:=0 to x-1 do
if (msk[z]='W') and (((v0[z shr 3] xor rdinx(pt,z shr 3))
and bit[z and 7])>0) then msk[z]:='C';
end;
openlog(true);
writelog;
if readkey='' then;
end;
end;
begin
SetTextMode;
writeln('Test register bits.');
writeln;
write('Base register (hex): ');
readln(s);
pt:=dehex(s);
writeln;
Write('Index mask (low bit first: 0/1/x/ ): ');
readln(IM);IM:=copy(IM+' ',1,8);
for m:=1 to 8 do
if (IM[m]<>'x') and (IM[m]<>'0') and (IM[m]<>'1') then IM[m]:=' ';
writeln('Testing indexed registers for base='+hex4(pt)+'h.');
writeln;
if (nomodes=0) and tmode($12) then
else begin
writeln('Modes:');
writeln;
for m:=1 to nomodes do
begin
writeln(' '+menuchars[m]+' '+hex4(modetbl[m].md)+'h '+istr(modetbl[m].xres)
+'x'+istr(modetbl[m].yres)+' '+mdtxt[modetbl[m].memmode]);
end;
writeln;
x:=getmenkey;
if (x>0) and (x<=nomodes) and tmode(modetbl[x].md) then; {stop}
end;
end;
procedure testDACgamma;
var i,j,x,colorsh,
redi,redc,grni,grnc,blui,bluc,
gamm,oldgam:integer;
stop:boolean;
red,grn,blu:array[0..255] of byte;
begin
SetTextMode;
writeln('Mode for gamma test:');
for i:=1 to nomodes do
if ((modetbl[i].flags and MFL_enGr)=MFL_enGr)
and (modetbl[i].memmode>_P8) then
writeln(' '+menuchars[i]+' '+hex4(modetbl[i].md)+'h '
+istr(modetbl[i].xres)+'x'+istr(modetbl[i].yres)
+' '+mdtxt[modetbl[i].memmode]);
write('Select mode: ');
i:=getmenkey;
if (i<=0) or (i>nomodes) or (modetbl[i].memmode<=_P8) then i:=0;
if InitMode(i) then
begin
drawtestpattern('Test DAC gamma correction');
wrtext(30,120,'Press + to toggle the gamma correction off/red/green/blue');
wrtext(30,140,'One of the scales will be inverted, the other two unchanged.');
stop:=false;
gamm:=0;
oldgam:=-1;
repeat
if gamm<>oldgam then
begin
if gamm=0 then x:=setDACgamma(false)
else begin
x:=setDACgamma(true);
if (x and GAM_8bit)=0 then colorsh:=4 else colorsh:=1;
redi:=0;grni:=0;
if memmode>=_P24 then
begin
redc:=1;grnc:=1;
end
else begin
redc:=8;grnc:=8;
if (memmode=_P16) then grnc:=4;
if (x and GAM_Left8)>0 then redi:=3;
if (x and GAM_Left8)>0 then redi:=1;
grni:=redi;
if (grni>0) and (memmode=_P16) then dec(grni);
end;
blui:=redi;bluc:=redc;
for i:=0 to 255 do
begin
if gamm=1 then j:=255-i else j:=i; {Check for inversion}
red[i]:=((j shr redi)*redc) div colorsh;
if gamm=2 then j:=255-i else j:=i;
grn[i]:=((j shr grni)*grnc) div colorsh;
if gamm=3 then j:=255-i else j:=i;
blu[i]:=((j shr blui)*bluc) div colorsh;
end;
SetRGBPal(0,0,0,0); {Keep (0,0,0) as black for background}
for i:=1 to 255 do
SetRGBPal(i,red[i],grn[i],blu[i]);
end;
oldgam:=gamm;
end;
if keypressed then
case getkey of
ord('+'):gamm:=(gamm+1) and 3;
Ch_Esc,Ch_Cr:stop:=true;
end;
until stop;
x:=setDACgamma(false); {Remove Gamma}
setdac8(false); {Return to 6bit DAC mode}
SetTextMode;
end;
end;
procedure testdac8(m:word); {Test 8bit DAC mode}
var
stop,dac8,olddac:boolean;
x,y,cmd:word;
mm:byte;
begin
if InitMode(m) then
begin
drawtestpattern('Test 6/8 bit DAC');
wrtext(30,230,'Press + to toggle the DAC mode');
wrtext(30,245,'6bit DAC mode should show the color scales breaking 3 times each');
wrtext(30,260,'8bit DAC mode should show unbroken color scales');
for y:=0 to 127 do
for x:=0 to 255 do
setpix(x+30,y+100,(x shr 2)+(y and $60)*2);
cmd:=0;
stop:=false;
dac8:=false;
olddac:=not dac8;
repeat
if dac8<>olddac then
begin
setdac8(dac8);
for x:=0 to 63 do SetRGBPal(x,x*4,0,0);
for x:=0 to 63 do SetRGBPal(x+$40,0,x*4,0);
for x:=0 to 63 do SetRGBPal(x+$80,0,0,x*4);
for x:=0 to 63 do SetRGBPal(x+$C0,x*4,x*4,x*4);
olddac:=dac8;
end;
if keypressed then
case getkey of
ord('+'):dac8:=not dac8;
Ch_Esc,Ch_Cr:stop:=true;
end;
until stop;
setdac8(false);
SetTextMode;
end;
end;
procedure testdac15(m:word); {Test 8bit DAC mode}
var
stop,dac8,olddac:boolean;
x,y,cmd:word;
mm:byte;
begin
if InitMode(m) then
begin
drawtestpattern('Test 15bit (32Kcolor) DAC mode');
wrtext(30,230,'Press + to toggle the DAC mode');
wrtext(30,248,'The image above is for normal (palette) mode and the one');
wrtext(30,266,'below is for 15bit mode. Both should have the Red stripe');
wrtext(30,284,'at the top, then green, blue and finally white.');
for y:=0 to 127 do
for x:=0 to 255 do
setpix(x+30,y+100,(x shr 2)+(y and $60)*2);
memmode:=_p15;
for y:=0 to 15 do
for x:=0 to 255 do
begin
setpix(x+30,y+305,RGB(x,0,0));
setpix(x+30,y+321,RGB(0,x,0));
setpix(x+30,y+337,RGB(0,0,x));
setpix(x+30,y+353,RGB(x,x,x));
end;
memmode:=_P8;
stop:=false;
dac8:=false;
olddac:=not dac8;
repeat
if dac8<>olddac then
begin
if not dac8 then setDACstd
else if setdac15 then;
olddac:=dac8;
end;
if keypressed then
case getkey of
ord('+'):dac8:=not dac8;
Ch_Esc,Ch_Cr:stop:=true;
end;
until stop;
setdacstd;
SetTextMode;
end;
end;
procedure testdac16(m:word); {Test 8bit DAC mode}
var
stop,dac8,olddac:boolean;
x,y,cmd:word;
mm:byte;
begin
if InitMode(m) then
begin
drawtestpattern('Test 16bit (64Kcolor) DAC mode');
wrtext(30,230,'Press + to toggle the DAC mode');
wrtext(30,248,'The image above is for normal (palette) mode and the one');
wrtext(30,266,'below is for 16bit mode. Both should have the Red stripe');
wrtext(30,284,'at the top, then green, blue and finally white.');
for y:=0 to 127 do
for x:=0 to 255 do
setpix(x+30,y+100,(x shr 2)+(y and $60)*2);
memmode:=_p16;
for y:=0 to 15 do
for x:=0 to 255 do
begin
setpix(x+30,y+305,RGB(x,0,0));
setpix(x+30,y+321,RGB(0,x,0));
setpix(x+30,y+337,RGB(0,0,x));
setpix(x+30,y+353,RGB(x,x,x));
end;
memmode:=_P8;
stop:=false;
dac8:=false;
olddac:=not dac8;
repeat
if dac8<>olddac then
if not dac8 then setDACstd
else if setdac16 then;
olddac:=dac8;
case getkey of
ord('+'):dac8:=not dac8;
Ch_Esc,Ch_Cr:stop:=true;
end;
until stop;
setdacstd;
SetTextMode;
end;
end;
procedure testdac24(m:word); {Test 8bit DAC mode}
var
stop,dac8,olddac:boolean;
x,y,cmd:word;
mm:byte;
begin
if InitMode(m) then
begin
drawtestpattern('Test 24bit (16Mcolor) DAC mode');
wrtext(30,230,'Press + to toggle the DAC mode');
wrtext(30,248,'The image above is for normal (palette) mode and the one');
wrtext(30,266,'below is for 24bit mode. Both should have the Red stripe');
wrtext(30,284,'at the top, then green, blue and finally white.');
for y:=0 to 127 do
for x:=0 to 255 do
setpix(x+30,y+100,(x shr 2)+(y and $60)*2);
memmode:=_p24;
for y:=0 to 15 do
for x:=0 to 255 do
begin
setpix(x+30,y+305,RGB(x,0,0));
setpix(x+30,y+321,RGB(0,x,0));
setpix(x+30,y+337,RGB(0,0,x));
setpix(x+30,y+353,RGB(x,x,x));
end;
memmode:=_P8;
stop:=false;
dac8:=false;
olddac:=not dac8;
repeat
if dac8<>olddac then
begin
if not dac8 then setDACstd
else if setdac24 then;
olddac:=dac8;
end;
if keypressed then
case getkey of
ord('+'):dac8:=not dac8;
Ch_Esc,Ch_Cr:stop:=true;
end;
until stop;
setdacstd;
SetTextMode;
end;
end;
procedure testdac32(m:word); {Test 8bit DAC mode}
var
stop,dac8,olddac:boolean;
x,y,cmd:word;
mm:byte;
begin
if InitMode(m) then
begin
drawtestpattern('Test 32bit (16Mcolor - RGBa) DAC mode');
wrtext(30,230,'Press + to toggle the DAC mode');
wrtext(30,248,'The image above is for normal (palette) mode and the one');
wrtext(30,266,'below is for 32bit mode. Both should have the Red stripe');
wrtext(30,284,'at the top, then green, blue and finally white.');
for y:=0 to 127 do
for x:=0 to 255 do
setpix(x+30,y+100,(x shr 2)+(y and $60)*2);
memmode:=_p32;
for y:=0 to 15 do
for x:=0 to 255 do
begin
setpix(x+30,y+305,RGB(x,0,0));
setpix(x+30,y+321,RGB(0,x,0));
setpix(x+30,y+337,RGB(0,0,x));
setpix(x+30,y+353,RGB(x,x,x));
end;
memmode:=_P8;
stop:=false;
dac8:=false;
olddac:=not dac8;
repeat
if dac8<>olddac then
begin
if not dac8 then setDACstd
else if setdac32 then;
olddac:=dac8;
end;
if keypressed then
case getkey of
ord('+'):dac8:=not dac8;
Ch_Esc,Ch_Cr:stop:=true;
end;
until stop;
setdacstd;
SetTextMode;
end;
end;
{Test the DAC Cmd register}
procedure testdaccmd(m:word);
var
stop:boolean;
x,y,cmd,pel:word;
function bin(w:word):string;
var s:string[10];
i:integer;
begin
s:='';
for i:=7 downto 0 do
s:=s+chr(((w shr i) and 1) +48);
bin:=s;
end;
procedure newcmd(cmd:word);
var x,pel:word;
begin
if cv.chip=__cir54 then
begin
pel:=inp($3C6);
outp($3C6,0);
end;
outp(setDACpage(dacHIcmd),cmd);
clearDACpage;
x:=inp(setDACpage(dacHIcmd)) xor cmd;
clearDACpage;
wrtext(10,10,'DAC Command: '+hex2(cmd)+'h, '+bin(cmd)+'b XOR: '+hex2(x)+'h, '+bin(x)+'b:');
for x:=0 to 63 do
begin
SetRGBPal(x,x*4,0,0);
SetRGBPal(x+$40,0,x*4,0);
SetRGBPal(x+$80,0,0,x*4);
SetRGBPal(x+$C0,x*4,x*4,x*4);
end;
if cv.chip=__cir54 then outp($3C6,pel);
end;
begin
if InitMode(m) then
begin
drawtestpattern('Test DAC Command register');
for y:=100 to 230 do
for x:=30 to 170 do
setpix(x,y,0);
for y:=0 to 63 do
for x:=0 to 255 do
setpix(x+30,y+100,(x shr 2)+(y and $30)*4);
memmode:=_p15;
for y:=0 to 15 do
for x:=0 to 255 do
begin
setpix(x+30,y+180,RGB(x,0,0));
setpix(x+30,y+196,RGB(0,x,0));
setpix(x+30,y+212,RGB(0,0,x));
setpix(x+30,y+228,RGB(x,x,x));
end;
memmode:=_p16;
for y:=0 to 15 do
for x:=0 to 255 do
begin
setpix(x+30,y+260,RGB(x,0,0));
setpix(x+30,y+276,RGB(0,x,0));
setpix(x+30,y+292,RGB(0,0,x));
setpix(x+30,y+308,RGB(x,x,x));
end;
memmode:=_p24;
for y:=0 to 15 do
for x:=0 to 127 do
begin
setpix(x+24,y+340,RGB(x*2,0,0));
setpix(x+24,y+356,RGB(0,x*2,0));
setpix(x+24,y+372,RGB(0,0,x*2));
setpix(x+24,y+388,RGB(x*2,x*2,x*2));
end;
memmode:=_p32;
for y:=0 to 15 do
for x:=0 to 127 do
begin
setpix(x+24,y+420,RGB(x*2,0,0));
setpix(x+24,y+436,RGB(0,x*2,0));
setpix(x+24,y+452,RGB(0,0,x*2));
setpix(x+24,y+468,RGB(x*2,x*2,x*2));
end;
memmode:=_P8;
wrtext(5,180,'15');
wrtext(5,260,'16');
wrtext(5,340,'24');
wrtext(5,420,'32');
wrtext(50,30,'Press F1..F8 to toggle the DAC mode bits 0..7');
stop:=false;
if cv.chip=__cir54 then
begin
pel:=inp($3C6);
outp($3C6,0);
end;
cmd:=inp(SetDACpage(dacHIcmd));
clearDACpage;
if cv.chip=__cir54 then outp($3C6,pel);
repeat
newcmd(cmd);
case getkey of
Ch_F1:cmd:=cmd xor 1;
Ch_F2:cmd:=cmd xor 2;
Ch_F3:cmd:=cmd xor 4;
Ch_F4:cmd:=cmd xor 8;
Ch_F5:cmd:=cmd xor 16;
Ch_F6:cmd:=cmd xor 32;
Ch_F7:cmd:=cmd xor 64;
Ch_F8:cmd:=cmd xor 128;
ord('A'),ord('a'):for x:=0 to 255 do
begin
newcmd(x);
delay(1000);
end;
Ch_Esc,Ch_Cr:stop:=true;
end;
until stop;
clearDACpage;
setdacstd;
SetTextMode;
end;
end;
{Analyse the DAC Cmd register}
procedure testdaccmdAnal(m:word);
const
msk:array[0..3] of byte=($55,$AA,$5A,$A5);
var
stop:boolean;
mask,x,y,z,i,mk,cmd,chg:word;
res0:array[0..39] of byte;
res:array[byte] of byte;
t:text;
s:string;
function DacBit(cmd:integer):integer;
begin
dac2comm;
outp($3C6,cmd);
dac2pel;
dac2comm;
DacBit:=inp($3C6);
dac2pel;
end;
begin
if InitMode(m) then
begin
for x:=0 to 3 do
begin
dac2pel;
outp($3C6,msk[x]);
dac2pel;
for y:=0 to 9 do res0[x*10+y]:=inp($3C6);
dac2pel;
end;
dac2pel;
outp($3C6,$FF);
setdacstd;
SetTextMode;
x:=DacBit(0);
mk:=0;
for x:=0 to 7 do
begin
y:=1 shl x;
z:=DacBit(y);
mk:=mk+(z and y);
end;
clearDACpage;
setdacstd; {Write the data several times in case we lock up...}
SetTextMode;
if cv.chip=__cir54 then i:=$FD else i:=$FF;
if cv.dactype=_dacTR8001 then i:=$FB;
x:=0;y:=255;z:=255;
for cmd:=0 to 255 do
begin
res[cmd]:=DacBit(cmd and i);
x:=x or res[cmd];
y:=y and res[cmd];
z:=z and (res[cmd] xor not cmd);
end;
chg:=z and (x and not y);
mask:=i;
end;
clearDACpage;
setdacstd;
SetTextMode;
OpenLog(true);
wrlog( ' DAC Command register read test:');
wrlog( 'Read: $55 $AA $5A $A5');
for i:=0 to 9 do
wrlog(' '+chr(i+48)+' '+hex2(res0[i])+' '+hex2(res0[i+10])
+' '+hex2(res0[i+20])+' '+hex2(res0[i+30]));
wrlog('');
wrlog('Dac Single Bit Mask: '+hex2(mk));
wrlog('');
wrlog('DAC mask: '+hex2(mask)+'h R/W: '+hex2(z)+'h Chg: '+hex2(chg)
+' Set: '+hex2(y)+'h Clear: '+hex2(not x)+'h');
z:=z or chg;
s:='';
for i:=0 to 255 do
if ((res[i] xor i) and z)<>0 then
s:=s+' '+hex2(i)+' = '+hex2(res[i])+' ';
wrlog(s);
closelog;
if readkey='' then;
end;
{DAC test master menu}
procedure testdac;
var i,md:word;
stop:boolean;
begin
md:=0;
for i:=1 to nomodes do
if ((modetbl[i].flags AND MFL_enGr)=MFL_enGr) AND (modetbl[i].memmode=_p8)
and (modetbl[i].xres=640) and (modetbl[i].yres=480) then md:=i;
stop:=false;
repeat
SetTextMode;
writeln('DAC test options:');
writeln(' 2 - Test 24bit (16Mcolor) mode');
writeln(' 3 - Test 32bit (16Mcolor RGBa) mode');
writeln(' 5 - Test 15bit (32Kcolor) mode');
writeln(' 6 - Test 16bit (64Kcolor) mode');
writeln(' 8 - Test 6/8bit mode');
writeln(' A - DAC Cmd register Analysis');
writeln(' C - Test Command register');
writeln(' G - Test Gamma Correction');
writeln(' M - Select base mode');
writeln(' 0 - Return to main menu');
case getkey of
ord('2'):testdac24(md);
ord('3'):testdac32(md);
ord('5'):testdac15(md);
ord('6'):testdac16(md);
ord('8'):testdac8(md);
ord('a'),ord('A'):testdaccmdAnal(md);
ord('c'),ord('C'):testdaccmd(md);
ord('g'),ord('G'):testDACgamma;
ord('m'),ord('M'):begin
writeln;
for i:=1 to nomodes do
if ((modetbl[i].flags and MFL_enGr)=MFL_enGr)
and (modetbl[i].memmode=_P8) then
writeln(' '+menuchars[i]+' '+hex4(modetbl[i].md)+'h '
+istr(modetbl[i].xres)+'x'+istr(modetbl[i].yres)
+' '+mdtxt[modetbl[i].memmode]);
write('Select mode: ');
i:=getmenkey;
if (i>0) and (i<=nomodes) and (modetbl[i].memmode=_P8) then md:=i;
end;
ord('0'),Ch_Esc:stop:=true;
end;
until stop;
end;
procedure testvgamodes; {Test extended modes}
var m:word;
md,x:integer;
function tmode(m:word):boolean;
begin
tmode:=true;
if auto_test then
begin
fillchar(af_rec,sizeof(af_rec),0);
af_cmt:='';
end;
if InitMode(m) then tmode:=testvmode;
if auto_test then
begin
af_rec.mode :=modetbl[m].md;
af_rec.Mmode :=memmode;
af_rec.pixels:=pixels;
af_rec.lins :=lins;
af_rec.bytes :=bytes;
af_rec.crtc :=crtc;
AddAFBuf(af_rec,sizeof(af_rec));
AddAFbuf(af_cmt,length(af_cmt)+1);
inc(af_pos,FormatRgs(af_buf[af_pos]));
WrAFbuf(AF_modeinfo);
end;
end;
begin
textmode($103);
writeln('Test extended VGA modes.');
writeln('Modes:');
writeln;
for m:=1 to nomodes do {Not the Std VGA modes}
if ((modetbl[m].flags and MFL_enVGA)=MFL_enabled) then
writeln(' '+menuchars[m]+' '+hex4(modetbl[m].md)+'h '+istr(modetbl[m].xres)
+'x'+istr(modetbl[m].yres)+' '+mdtxt[modetbl[m].memmode]);
writeln;
writeln(' * All modes');
if auto_test then pushkey(ord('*'));
writeln;
x:=getmenkey;
for m:=1 to nomodes do
if ((x=0) or (x=m)) and ((modetbl[m].flags and MFL_enGrVGA)=MFL_enGr) then
if not tmode(m) then x:=-1; {stop}
end;
procedure teststdvgamodes; {Test standard VGA modes}
var m:word;
md,x:integer;
function tmode(m:word):boolean;
begin
if auto_test then
begin
fillchar(af_rec,sizeof(af_rec),0);
af_cmt:='';
end;
if InitMode(m) then tmode:=testvmode;
if auto_test then
begin
af_rec.mode :=stdmodetbl[m].md;
af_rec.Mmode :=memmode;
af_rec.pixels:=pixels;
af_rec.lins :=lins;
af_rec.bytes :=bytes;
af_rec.crtc :=crtc;
AddAFBuf(af_rec,sizeof(af_rec));
AddAFbuf(af_cmt,length(af_cmt)+1);
inc(af_pos,FormatRgs(af_buf[af_pos]));
WrAFbuf(AF_modeinfo);
end;
end;
begin
textmode($103);
writeln('Standard VGA mode test.');
writeln;
writeln('Modes:');
writeln;
for m:=1 to novgamodes do
begin
writeln(' '+menuchars[m]+' '+hex4(stdmodetbl[m].md)+'h '+istr(stdmodetbl[m].xres)
+'x'+istr(stdmodetbl[m].yres)+' '+mdtxt[stdmodetbl[m].memmode]);
end;
writeln;
writeln(' * All modes');
writeln;
if auto_test then pushkey(ord('*'));
x:=getmenkey;
for m:=1 to novgamodes do
if (x=0) or (x=m) then
if not tmode(m) then x:=-1;
end;
procedure searchformodes; {Run through all possible modes
and try to id any new ones}
type
regblk=record
base:word;
nbr:word;
x:array[0..255] of byte;
end;
var
md,m,hig,wid,x,y,oldbytes,wordadr:word;
c:char;
ofil:text;
attregs:array[0..31] of byte;
seqregs,grcregs,crtcregs,xxregs:regblk;
stdregs:array[$3C0..$3DF] of byte;
l:longint;
s:string;
stop:boolean;
procedure dumprg(base:word;var rg:regblk);
var six,ix:word;
begin
rg.base:=base;
six:=inp(base);
outp(base,0);
ix:=inp(base) xor 255;
outp(base,255);
ix:=ix and inp(base);
if ix>127 then rg.nbr:=255
else if ix>63 then rg.nbr:=127
else if ix>31 then rg.nbr:=63
else if ix>15 then rg.nbr:=31
else if ix>7 then rg.nbr:=15
else rg.nbr:=7;
for ix:=0 to rg.nbr do
rg.x[ix]:=rdinx(base,ix);
outp(base,six);
end;
begin
md:=$14;
stop:=false;
while (md<$80) and not stop do
begin
textmode(3);
gotoxy(10,10);
write('Testing mode: '+hex2(md));
delay(500);
if setmode(md,true) then
begin
pixels :=calcpixels;
lins :=calclines;
bytes :=calcbytes;
vseg :=calcvseg;
memmode:=calcmmode;
repeat
oldbytes:=bytes;
if setmode(md,true) and testvmode then
begin
{ drawtestpattern('Mode: '+hex2(md)+' ('+istr(pixels)+'x'+istr(lins)+' '
+mmodenames[memmode]+') '+istr(bytes)+' bytes.'); }
end;
(* case getkey of
Ch_PgUp:bytes:=bytes shl 1;
Ch_PgDn:bytes:=bytes shr 1;
Ch_ArUp:inc(bytes);
Ch_ArDown:dec(bytes);
Ch_Esc:stop:=true;
end; *)
until bytes=oldbytes;
end;
inc(md);
end;
textmode(3);
end;
var
stop:boolean;
function ljust(s:string;lnn:word):string;
begin
ljust:=copy(s+' ',1,lnn);
end;
function rjust(s:string;lnn:word):string;
begin
if length(s)<lnn then s:=copy(' ',1,lnn-length(s))+s;
rjust:=s;
end;
function chkptr(w:word):word;
begin
if memw[Seg0000:w+2]=biosseg then chkptr:=memw[Seg0000:w]
else chkptr:=0;
end;
function fntadr(BH:word):word;
begin
rp.bh:=BH;
vio($1130);
if rp.es=biosseg then fntadr:=rp.bp
else fntadr:=0;
end;
procedure wrAFff;
var
rhdr:_ATff;
x,y,z,v:word;
begin
if {af_fail and} (biosseg<>0) then
begin
fillchar(rhdr,sizeof(rhdr),0);
rhdr.base :=biosseg;
rhdr.size :=mem[biosseg:2];
rhdr.int10:=chkptr($40);
rhdr.int6D:=chkptr($1B4);
rhdr.m4A8 :=chkptr($4A8);
rhdr.fnt14 :=fntadr(2);
rhdr.fnt8l :=fntadr(3);
rhdr.fnt8h :=fntadr(4);
rhdr.fnt14x9:=fntadr(5);
rhdr.fnt16 :=fntadr(6);
rhdr.fnt16x9:=fntadr(7);
AddAFbuf(rhdr,sizeof(rhdr));
WrAFbuf(AF_BIOSdmp);
y:=0;z:=0;
for x:=0 to (rhdr.size*512-1) do
begin
v:=mem[biosseg:x];
af_buf[z]:=v-y;
y:=v;
inc(z);
if z>=2000 then
begin
blockwrite(af_fil,af_buf,z);
z:=0;
end;
end;
blockwrite(af_fil,af_buf,z);
end;
end;
procedure ReCalc(rfil:string);
var f:file;
t:text;
at0:_AT0;
at2:_AT2;
buf:array[0..2000] of byte;
hdr:record
typ:byte;
lnn:word;
end;
fpos:longint;
ix,x,y,z,w:word;
s:string[5];
function popb:word;
begin
popb:=buf[ix];
inc(ix);
end;
function popw:word;
var w:word;
begin
move(buf[ix],w,2);
inc(ix,2);
popw:=w;
end;
procedure stinx(base,ix,vl:word);
begin
case base of
$3C0:rgs.attregs[ix]:=vl;
$3C4:begin
rgs.seqregs.x[ix]:=vl;
if ix>rgs.seqregs.nbr then rgs.seqregs.nbr:=ix;
end;
$3CE:begin
rgs.grcregs.x[ix]:=vl;
if ix>rgs.grcregs.nbr then rgs.grcregs.nbr:=ix;
end;
$3B4,
$3D4:begin
rgs.crtcregs.x[ix]:=vl;
if ix>rgs.crtcregs.nbr then rgs.crtcregs.nbr:=ix;
end;
else
rgs.xxregs.base:=base;
rgs.xxregs.x[ix]:=vl;
if ix>rgs.xxregs.nbr then rgs.xxregs.nbr:=ix;
end;
end;
begin
if pos('.',rfil)=0 then rfil:=rfil+'.tst';
assign(f,rfil);
{$i-}
reset(f,1);
{$i+}
if ioresult=0 then
begin
rfil[0]:=chr(pred(pos('.',rfil)));
assign(t,rfil+'.tt');
rewrite(t);
fpos:=0;vids:=0;
repeat
blockread(f,hdr,3);
case hdr.typ of
0:blockread(f,at0,sizeof(_AT0));
1:begin
inc(vids);
blockread(f,vid[vids],sizeof(vid[1]));
if vids=at0.cur_vid then SelectVideo(vids);
end;
2:begin
blockread(f,at2,sizeof(at2));
blockread(f,buf,hdr.lnn-sizeof(at2)-3);
ix:=buf[0]+1;
repeat
w:=popw;
case w of
1:begin
w:=popw;
x:=popb;y:=popb;
for x:=x to y do stinx(w,x,popb);
end;
2..$FE:begin
x:=popw;
for x:=x to x+w-1 do
begin
y:=popb;
if (x>=$3C0) and (x<$3DF) then rgs.stdregs[x]:=y;
if (x>=$3B0) and (x<$3BF) then rgs.stdregs[x+$20]:=y;
end;
end;
$ff:begin
w:=popw;
x:=popb;
case w of
0:rgs.tridold0d:=x;
1:rgs.tridold0e:=x;
end;
end;
else
x:=popb;
if (w>=$3C0) and (w<$3DF) then rgs.stdregs[w]:=x;
if (w>=$3B0) and (w<$3BF) then rgs.stdregs[w+$20]:=x;
end;
until w=0;
if (at2.flag and 1)>0 then
begin
CalcRegisters;
if (at2.mmode=rgs.mmode) and (at2.pixels=rgs.pixels)
and (at2.lins=rgs.lins) and (at2.bytes=rgs.bytes) then s:=' Ok' else s:='';
writeln(t,hex4(at2.mode),at2.pixels:5,at2.lins:5,at2.bytes:5
,' '+mmodenames[at2.mmode]+' vs. '
,rgs.pixels:5,rgs.lins:5,rgs.bytes:5
,' '+mmodenames[rgs.mmode]+s);
end;
end;
end;
inc(fpos,hdr.lnn);
seek(f,fpos);
until hdr.typ>2;
close(t);
close(f);
end;
end;
procedure testdacbits;
var
dac0,dac1,dac2,dac3:byte;
pt,ix,i,old:integer;
s:string;
begin
settextmode;
write('Base register (hex): ');
readln(s);
pt:=dehex(s);
write('Index (hex 0-FFh): ');
readln(s);
ix:=dehex(s);
dac0:=inp($3C8);
dac1:=inp($3C9);
dac2:=inp($3C6);
dac3:=inp($3C7);
old:=rdinx(pt,Ix);
writeln('Original: '+hex2(dac0)+' '+hex2(dac1)+' '+hex2(dac2)+' '+hex2(dac3));
for i:=0 to 7 do
begin
wrinx(pt,Ix,old xor (1 shl i));
dac0:=inp($3C8);
dac1:=inp($3C9);
dac2:=inp($3C6);
dac3:=inp($3C7);
wrinx(pt,Ix,old);
writeln(' Bit ',i,': '+hex2(dac0)+' '+hex2(dac1)+' '+hex2(dac2)+' '+hex2(dac3));
end;
if readkey='' then;
end;
var
chp:byte;
md,x,y,b:integer;
s,fea:string;
iteration,err,sel,clks:word;
t:text;
ok:boolean;
devs:array[1..10] of string[80];
rcfil:string;
ignlist:string; {Chips we ignore}
PCIenable:boolean;
function mmode(s:string):integer;
var x:byte;
begin
mmode:=__None;
for x:=_text to _p32d do {Remember to update}
if s=strip(mmodenames[x]) then
mmode:=x;
end;
function FindChp(s:string):integer;
var chp:integer;
begin
FindChp:=__None;
s:=strip(upstr(s));
for chp:=__none to max_chip do
if upstr(header[chp])=s then
FindChp:=chp;
end;
procedure initcfg; {Reset the configuration}
begin
force_mm:=0;
force_chip:=__none;
force_version:=0;
auto_test:=false;
clocktest:=true; {allow clock testing}
debug:=false;
PCIenable:=true;
ignlist:='';
fillchar(dotest,sizeof(dotest),ord(true)); {allow test for all chips}
noumodes:=0;
end;
begin
{$ifdef ver70}
test8086:=1; {force 286, 386 mode buggy}
{$endif}
initcfg;
clrscr;
assign(t,'whatvga.cfg');
{$i-}
reset(t); {Check if the file exists}
{$i+}
if ioresult=0 then
begin
cv.chip:=__None;
writeln('Configuration file found!');
while not eof(t) do
begin
readln(t,s);
if cv.chip=__None then {Initial section}
begin
x:=pos('=',s);
if x>0 then
begin
fea:=upstr(strip(copy(s,1,x-1))); {keyword}
s:=strip(copy(s,x+1,255)); {value}
if (upstr(s)='YES') or (upstr(s)='ON') or
(upstr(s)='Y') or (upstr(s)='1') then ok:=true
else ok:=false;
if fea='AUTOTEST' then auto_test:=ok;
if fea='CLOCKTEST' then clocktest:=ok;
if fea='DEBUG' then debug:=ok;
if fea='PCITEST' then PCIenable:=ok;
if fea='MEMORY' then val(s,force_mm,err);
if fea='IGNORE' then
begin
chp:=FindChp(upstr(s));
if chp<>__None then
begin
dotest[chp]:=false;
ignlist:=ignlist+' '+header[chp];
end;
end;
if fea='CHIPSET' then
begin
chp:=FindChp(upstr(s));
fillchar(dotest,sizeof(dotest),ord(false)); {Disable all tests}
if chp<>__None then
begin
dotest[chp]:=true;
force_chip:=chp;
end;
end;
end;
end
else
if s[1]='-' then
begin
delete(s,1,1);
md:=dehex(clipstr(s));
inc(noumodes);
usermodes[noumodes].md :=md;
usermodes[noumodes].memmode:=__None; {Disable}
usermodes[noumodes].flags :=cv.chip;
end
else if s[1]='+' then
begin
delete(s,1,1);
md:=dehex(clipstr(s));
val(clipstr(s),x,err);
val(clipstr(s),y,err);
chp:=mmode(clipstr(s));
val(clipstr(s),b,err);
inc(noumodes);
usermodes[noumodes].md :=md;
usermodes[noumodes].xres :=x;
usermodes[noumodes].yres :=y;
usermodes[noumodes].bytes :=b;
usermodes[noumodes].memmode:=chp;
usermodes[noumodes].flags :=cv.chip;
end;
if s[1]='[' then
cv.chip:=FindChp(copy(s,2,pos(']',s)-2));
end;
close(t);
end;
rcfil:='';
for x:=1 to paramcount do
begin
s:=upstr(paramstr(x))+' ';
case s[1] of
'-':begin
chp:=FindChp(copy(s,2,255));
if chp<>__None then
begin
dotest[chp]:=false;
ignlist:=ignlist+' '+header[chp];
end;
end;
'+':begin
chp:=FindChp(copy(s,2,255));
fillchar(dotest,sizeof(dotest),ord(false));
if chp<>__None then
begin
dotest[chp]:=true;
force_chip:=chp;
end;
end;
'=':val(strip(copy(s,2,255)),force_mm,err);
'/':case upcase(s[2]) of
'A':auto_test:=true;
'C':clocktest:=false;
'I':initcfg;
'D':debug:=true;
'T':rcfil:=strip(copy(s,3,255));
'V':begin
val(strip(copy(s,3,255)),y,err);
if err=0 then force_version:=y;
end;
'P':PCIenable:=false;
end;
end;
end;
if rcfil<>'' then
begin
ReCalc(rcfil);
halt(0);
end;
if (force_mm<>0) or (force_chip<>__none) or (force_version<>0)
or (ignlist<>'') then
begin
if force_mm<>0 then writeln('Memory forced to: '+istr(force_mm)+'K');
if force_chip<>__none then writeln('Chip forced to: '+header[force_chip]);
if force_version<>0 then writeln('Chips version forced to: ',force_version);
if ignlist<>'' then writeln('Chips to ignore:'+ignlist);
writeln;
writeln('Press a key to continue...');
if readkey='' then;
clrscr;
end;
if PCIenable then findPCI;
findvideo;
settextmode;
for x:=1 to vids do
begin
SelectVideo(x);
fea:='';
if (cv.features and ft_cursor)>0 then fea:=' C';
if (cv.features and ft_blit )>0 then fea:=fea+' B';
if (cv.features and ft_line )>0 then fea:=fea+' L';
if (cv.features and ft_rwbank)>0 then fea:=fea+' R';
devs[x]:=' '+istr(x)+' '+ljust(chipnam[cv.chip],9)
+rjust(istr(cv.mm),8)+ljust(fea,8)+' '+vid[x].name;
end;
iteration:=0;
repeat
stop:=false;
if vids<>1 then
begin
SetTextMode;
writeln(wrVersionNbr+copyright);
writeln;
writeln('Multiple Video Interfaces or Adapters found!!');
writeln('Please select the one to test:');
writeln(' Chip: Memory: Feat: Name:');
for x:=1 to vids do writeln(devs[x]);
writeln;
writeln(' 0 Stop');
writeln;
sel:=getkey-ord('0');
if sel=0 then stop:=true;
end
else sel:=1;
if (sel>0) and (sel<=vids) then SelectVideo(sel);
while not stop do
begin
SetTextMode;
writeln(wrVersionNbr+copyright);
writeln;
write('Video system: ',chipnam[cv.chip],' with '+istr(cv.mm)+' Kbytes');
if cv.SubVers<>0 then write(' Version: '+hex4(cv.SubVers));
writeln;
if cv.name<>'' then writeln('Name: '+cv.name);
writeln('Dac: '+cv.dacname);
writeln('Clock: '+clkname[cv.clktype]);
case cv.clktype of
clk_ext2:clks:=4;
clk_ext3:clks:=8;
clk_ext4:clks:=16;
clk_ext5:clks:=32;
clk_ext6:clks:=64;
else clks:=4;
end;
if clks>0 then
begin
for x:=0 to clks-1 do
begin
if (x and 7)=0 then
begin
if x>0 then writeln;
write(' ');
end;
write(cv.clks[x]/1000:8:3);
end;
writeln;
end;
if cv.features<>0 then
begin
write('Special features:');
if (cv.features and ft_cursor)<>0 then write(' Cursor');
if (cv.features and ft_blit)<>0 then write(' BitBlt');
if (cv.features and ft_line)<>0 then write(' Line');
if (cv.features and ft_rwbank)<>0 then write(' RW-bank');
writeln;
end;
writeln;
if (cv.flags and FLG_StdVGA)>0 then
writeln(' 1 Test Standard VGA modes');
writeln(' 2 Test Extended modes');
if (cv.chip<>__vesa) and (cv.chip<>__XBE) then
writeln(' 3 Search for video modes');
if (cv.features and ft_cursor)<>0 then
writeln(' 5 HardWare Cursor test');
if (cv.features and ft_blit)<>0 then
writeln(' 6 HardWare BitBLT test');
if (cv.features and ft_line)<>0 then
writeln(' 7 Line Draw test');
if (cv.features and ft_rwbank)<>0 then
writeln(' 8 R/W bank test');
writeln;
writeln(' B Individual bit functionality');
writeln(' D DAC test submenu');
writeln(' R Read/Writable registers');
writeln;
writeln(' 0 Stop');
writeln;
if auto_test then
begin
inc(iteration);
pushkey(Ch_Cr); {No Operation, just step on}
case iteration of
1:begin
InitAFfile(sel);
for x:=1 to vids do
begin
AddAFbuf(vid[x],sizeof(vid[1]));
WrAFbuf(AF_videosys);
end;
if (cv.chip<>__vesa) and (cv.chip<>__XBE) then pushkey(ord('1'));
end;
2:pushkey(ord('2'));
3:if (cv.features and ft_cursor)<>0 then pushkey(ord('5'));
4:if (cv.features and ft_blit)<>0 then pushkey(ord('6'));
5:if (cv.features and ft_line)<>0 then pushkey(ord('7'));
6:if (cv.features and ft_rwbank)<>0 then pushkey(ord('8'));
7:pushkey(ch_esc);
end;
end;
case getkey of
ord('1'):teststdvgamodes;
ord('2'):testvgamodes;
ord('3'):searchformodes;
ord('5'):testcursor;
ord('6'):testblit;
ord('7'):testline;
ord('8'):testrwbank;
ord('9'):testzoom;
ord('a'),ord('A'):auto_test:=true;
ord('b'),ord('B'):testbits;
ord('d'),ord('D'):testdac;
ord('r'),ord('R'):testregs;
ord('t'),ord('T'):testdacbits;
ord('0'):stop:=true;
Ch_Esc:begin
stop:=true;
sel:=0;
end;
end;
end;
if vids<=1 then sel:=0;
until sel=0;
SetTextMode;
vio(3); {Standard mode 3 80x25 text}
if auto_test then
begin
wrAFff;
close(af_fil);
writeln;
writeln('The test results are in the file: ',af_filename);
writeln;
writeln('For e-mail, modem etc the test file should be compressed');
writeln('(ZIP, ARJ...) savings of >40% are not uncommon.');
writeln;
writeln('For Email transport, remember that the test file is BINARY.');
end;
end.