home *** CD-ROM | disk | FTP | other *** search
- {$UNDEF DEBUG}
- {$A+,B-,E+,F-,N-,O-,R-,V-,I-}
- {$IFDEF DEBUG} {$D+,L+,S+} {$ELSE} {$D-,L-,S-} {$ENDIF}
- unit eco_crt;
-
- interface
-
- uses
- eco_adpt
-
- ;
-
- const
- bw40 = 0;{40x25 b/w on cga}
- co40 = 1;{40x25 color on cga}
- bw80 = 2;{80x25 b/w on cga}
- co80 = 3;{80x25 color on cga}
- mono = 7;{80x25 b/w on mda or hgc}
- font8x8 = 256;{43-/50-line mode ega/vga}
- co132x25 = 85;{color 132x25 line mode ega paradise 480}
- co132x43 = 84;{color 132x43 line mode ega paradise 480}
- mo132x25 = 86;{mono 132x25 line mode ega paradise 480}
- mo132x43 = 87;{mono 132x43 line mode ega paradise 480}
- c40 = co40;{for 3.0 compatibility}
- c80 = co80;{for 3.0 compatibility}
-
- black = $00;
- blue = $01;
- green = $02;
- cyan = $03;
- red = $04;
- magenta = $05;
- brown = $06;
- lightgray = $07;
- darkgray = $08;
- lightblue = $09;
- lightgreen = $0a;
- lightcyan = $0b;
- lightred = $0c;
- lightmagenta = $0d;
- yellow = $0e;
- white = $0f;
- blink = $80;
-
- blackbg = $00;
- bluebg = $10;
- greenbg = $20;
- cyanbg = $30;
- redbg = $40;
- magentabg = $50;
- brownbg = $60;
- lightgraybg = $70;
-
-
- type
- adaptertype = (
- none,mda,hercules,cga,egamono,egacolor,mcgamono,mcgacolor,
- vgamono,vgacolor
- );
-
- charset = set of char; {makkelijk}
-
- stscreen = string[132]; {max screen lengte i know is possible}
- bordertypes = (nobrdr,
- spacebrdr,singlebrdr,doublebrdr,
- horizdoublevertsinglebrdr,
- horizsinglevertdoublebrdr,
- hatch1brdr,hatch2brdr,hatch3brdr);
-
- borders = (horiztop, horizbottom,
- vertleft, vertright, horizborders,
- vertborders, allborders);
- borderparts = (tl,tr,bl,br,ht,hb,vr,vl,lc,rc,tc,bc,cc);
- borderarray = array[tl..cc] of char;
-
- const
- borderst : array [spacebrdr..hatch3brdr] of borderarray = (
- '█████████████',
- '┌┐└┘──││├┤┬┴┼',
- '╔╗╚╝══║║╠╣╦╩╬',
- '╒╕╘╛══││╞╡╤╧╪',
- '╓╖╙╜──║║╟╢╥╙╫',
- '░░░░░░░░░░░░░',
- '▒▒▒▒▒▒▒▒▒▒▒▒▒',
- '▓▓▓▓▓▓▓▓▓▓▓▓▓'
- );
-
- type
- largearray = array [1..32000] of word;
-
- savescrptr = ^savescrrec;
- savescrrec = record
- screensize : word;
- savedscr : largearray;
- end;
-
- quickwindowptr = ^quickwindowrec;
- quickwindowrec = record
- previous : quickwindowptr; { is nil when last window }
- windowinfo : savescrptr; { window size,saved screen }
- x1,y1,
- x2,y2 : byte; { absolute screen coordiantes }
- bt : bordertypes;
- sscrolllock : boolean; { saved scrolllock status }
- signorewindow : boolean; { saved ignorewindow }
- sscanlines : word; { cursor scan lines }
- sx,sy : byte; { cursor position }
- swindmin,
- swindmax : word; { saved previous window }
- stextattr : byte; { saved textattr }
- end;
-
-
- var
- checksnow : boolean absolute eco_adpt.checksnow;{for snow on cga}
- textattr : byte;{back and foreground color}
- windmin : word;{window coordinaten}
- windmax : word;
- lastmode : word absolute eco_adpt.currenttextmode;
-
- (* extra vars not in borland's CRT *)
- videopage : byte absolute eco_adpt.videopage;{video page number}
- videocard : adaptertype absolute eco_adpt.videocard; {video kaart}
- maxrows : byte absolute eco_adpt.maxrows;{current max number }
- maxcols : byte absolute eco_adpt.maxcols;{ of colums and lines}
- videoofs : word absolute eco_adpt.videoofs;{offset video memory}
- videoseg : word absolute eco_adpt.videoseg;{start video memory}
- videoptr : pointer absolute eco_adpt.videoptr;
- scrolllockscreen : boolean;{scroll screen;normaal is false}
- startupmode : word absolute eco_adpt.startupmode;{videomode at startup time}
- startupcursorsize : word absolute eco_adpt.startupcursorsize;
- ignorewindow : boolean; { if true abs screen coordinates are in use }
- visiblequickwindow : quickwindowptr; { active quick window }
-
-
- procedure textmode(mode : integer);
-
- procedure window(x1,y1,x2,y2 : byte);
- procedure clrscr;
- procedure clrline(y : byte);
- procedure clreol;
-
- procedure delline;
- procedure insline;
-
- procedure normvideo;
- procedure lowvideo;
- procedure highvideo;
-
- procedure textbackground(color : byte);
- procedure textcolor(color : byte);
-
- procedure gotoxy(x,y : byte);
- function wherey : byte;
- function wherex : byte;
- procedure gotoxyabs(x,y : byte);
- function whereyabs : byte;
- function wherexabs : byte;
-
- function windowcols : byte;
- function windowrows : byte;
-
- function readword : word;
- inline($b8/$00/$00/ { mov ax,0 }
- $cd/$16); { int 16h }
-
- function readkey : char;
- function keypressed : boolean;
-
- procedure delay(ms : word);
- procedure sound(hz : word);
- procedure nosound;
-
- procedure assigncrt(var f : text);
-
- function location(x,y : byte) : word;
- procedure fillword(var dest;width,value : word);
-
- procedure scrollup(x1,y1,x2,y2,color : byte);
- procedure scrolldown(x1,y1,x2,y2,color : byte);
-
- procedure fastwrite(x,y,attr : byte;st : stscreen);
- procedure fastpwrite(x,y : byte;st : stscreen);
- procedure changeattr(x,y,attr,len : byte);
- procedure titleengine(x1,y1,x2,y2 : byte;bt : bordertypes;
- var title : stscreen);
- procedure boxengine(x1,y1,x2,y2,attr : byte;
- bordertype : bordertypes;filled : boolean);
-
- procedure movefromscreen(var source,dest;length : word);
- procedure movetoscreen(var source,dest;length : word);
-
- (* cursor manipulation *)
- procedure normalcursor;
- procedure insertcursor;
- procedure halfcursor;
- procedure hidecursor;
-
- (* screen save/restore procedures *)
- function savepartscreen(x1,y1,x2,y2 : byte) : savescrptr;
- procedure restorepartscreen(var scrptr : savescrptr;x1,y1,x2,y2 : byte);
- procedure disposepartscreen(var scrptr : savescrptr);
-
- (* quick window interface *)
- procedure quickopenwindow(x1,y1,x2,y2,attr : byte;bt : bordertypes;
- st : stscreen);
- procedure quickmovewindow(x,y : byte);
- procedure quickclosewindow;
-
-
-
-
- implementation
-
-
-
-
- const
- fmclosed = $d7b0;
- fminput = $d7b1;
- fmoutput = $d7b2;
- fminout = $d7b3;
-
-
- type
- wordrec = record x,y : byte end;
-
- textbuf = array [0..127] of char;
- textrec = record
- handle : word;
- mode : word;
- bufsize : word;
- private : word;
- bufpos : word;
- bufend : word;
- bufptr : ^textbuf;
- openfunc : pointer;
- inoutfunc : pointer;
- flushfunc : pointer;
- closefunc : pointer;
- userdata : array [1..16] of byte;
- name : array [0..79] of char;
- buffer : textbuf;
- end;
-
-
-
- var
- orginalexitproc : pointer; {saved exit proc of turbo pascal}
-
-
-
-
- (*----------------- start externals ----------------------------------------*)
- {$L CalcOfs.OBJ} {Don't use or call this proc it is of now use to you}
- procedure calcoffset; external; {is near used by screen writes asm routines}
- {$L FillVide.OBJ}
- procedure fillvideo; external; {is near used by screen writes asm routines}
- {$F+}
-
- {$L Window.OBJ}
- procedure window(x1,y1,x2,y2 : byte); external;
-
- {$L ClrScr.OBJ}
- procedure clrscr; external;
-
- {$L ClrEol.OBJ}
- procedure clreol; external;
-
- {$L Color.OBJ}
- procedure getstartupcolor; external;
- procedure normvideo; external;
-
- {$L LowVideo.OBJ}
- procedure lowvideo; external;
-
- {$L HighVide.OBJ}
- procedure highvideo; external;
-
- {$L TXTColor.OBJ}
- procedure textcolor(color : byte); external;
-
- {$L BGColor.OBJ}
- procedure textbackground(color : byte); external;
-
- {$L Cursor.OBJ}
- procedure gotoxy(x,y : byte); external;
- function wherey : byte; external;
- function wherex : byte; external;
-
- {$L AbsCurs.OBJ}
- procedure gotoxyabs(x,y : byte); external;
- function whereyabs : byte; external;
- function wherexabs : byte; external;
-
- {$L Readkey.OBJ}
- function readkey : char; external;
- function keypressed : boolean; external;
-
- {$L Delay.OBJ}
- procedure delay(ms : word); external;
- procedure delayinit; external;
-
- {$L Sound.OBJ}
- procedure sound(hz : word); external;
- procedure nosound; external;
-
- {$L MoveFrom.OBJ}
- procedure movefromscreen(var source,dest;length : word); external;
-
- {$L MoveTo.OBJ}
- procedure movetoscreen(var source,dest;length : word); external;
-
- {$L SwapVar.OBJ}
- procedure swapvar(var p1,p2;size : word); external;
-
- {$L FastWrt.OBJ}
- procedure asmwrite(var scrptr;wid,col,row,attr : byte;st : string); external;
- procedure asmpwrite(var scrptr;wid,col,row : byte;st : string); external;
- procedure asmattr(var scrptr;wid,col,row,attr,len : byte); external;
-
- {$F-}
- (*----------------- end externals -- start inlines -------------------------*)
-
- function location(x,y : byte) : word;
- begin
- inline($8b/$be/y/ { mov di,[bp+y] }
- $8b/$b6/x/ { mov si,[bp+x] }
- $4f/ { dec di }
- $4e/ { dec si }
- $a1/maxcols/ { mov ax,[maxcols] }
- $f7/$e7/ { mul di }
- $01/$f0/ { add ax,si }
- $01/$c0/ { add ax,ax }
- $03/$06/videoofs/ { add ax,[videoofs] }
- $89/$86/location); { mov [bp+location],ax }
- end;
-
- procedure fillword(var dest;width,value : word);
- begin
- if checksnow then
- inline($c4/$be/dest/ { les di,dest[bp] }
- $8b/$8e/width/ { mov cx,width[bp] }
- $8b/$9e/value/ { mov bx,value[bp] }
- $fc/ { cld }
- $e3/$16/ { jcxz ready }
- $ba/$03da/ { mov dx,3dah }
- $b4/$09/ { mov ah,9 }
- $ec/ { test1: in al,dx }
- $d0/$d8/ { rcr al,1 }
- $72/$fb/ { jb test1 }
- $fa/ { cli }
- $ec/ { test2: in al,dx }
- $22/$c4/ { and al,ah }
- $74/$fb/ { jz test2 }
- $8b/$c3/ { mov ax,bx }
- $ab/ { stosw }
- $fb/ { sti }
- $e2/$ef) else { loop test1 }
- { ready: }
- inline($c4/$be/dest/ { les di,dest[bp] }
- $8b/$8e/width/ { mov cx,width[bp] }
- $8b/$86/value/ { mov ax,value[bp] }
- $fc/ { cld }
- $f3/$ab); { rep stosw }
- end;
-
- (*----------------- end inlines --------------------------------------------*)
-
- procedure textmode(mode : integer);
- begin
- settextmode(mode);
- window(1,1,maxcols,maxrows);
- end;
-
- procedure clrline(y : byte);
- var offset : word;
- begin
- if pred(y)<wordrec(windmin).y then exit;
- if pred(y)>wordrec(windmax).y then exit;
-
- offset := location(succ(wordrec(windmin).x),y);
-
- fillword(mem[videoseg:offset],succ(wordrec(windmax).x-wordrec(windmin).x),
- byte(' ')+textattr shl 8);
- end;
-
- procedure scrollup(x1,y1,x2,y2,color : byte);
- var loop : word;
- offset : word;
- len : word;
- maxx : word;
- begin
- len := x2 - pred(x1);
- maxx := maxcols*2;
- offset := location(x1,succ(y1));
-
- for loop := y1 to pred(y2) do
- begin
- movetoscreen(mem[videoseg:offset],
- mem[videoseg:offset-maxx],len);
- inc(offset,maxx); {bereken offset, dit is iets sneller}
- end;
-
- {make last line empty}
- fillword(mem[videoseg:offset-maxx],len,byte(' ')+color shl 8);
- end;
-
- procedure scrolldown(x1,y1,x2,y2,color : byte);
- var loop : word;
- offset : word;
- len : word;
- maxx : word;
- begin
- len := x2 - pred(x1);
- maxx := maxcols*2;
- offset := location(x1,y2); {bereken offset}
-
- for loop := pred(y2) downto y1 do
- begin
- movetoscreen(mem[videoseg:offset-maxx],
- mem[videoseg:offset],len);
- dec(offset,maxx); {bereken offset, dit is iets sneller}
- end;
- {make last line empty}
-
- fillword(mem[videoseg:offset],len,byte(' ')+color shl 8);
- end;
-
- procedure delline;
- var y : byte;
- begin
- y := wherey + wordrec(windmin).y;
-
- scrollup(succ(wordrec(windmin).x),y,
- succ(wordrec(windmax).x),succ(wordrec(windmax).y),
- textattr);
- end;
-
- procedure insline;
- var y : byte;
- begin
- y := wherey + wordrec(windmin).y;
-
- scrolldown(succ(wordrec(windmin).x),y,
- succ(wordrec(windmax).x),succ(wordrec(windmax).y),
- textattr);
- end;
-
- function windowcols : byte;
- begin
- windowcols := succ(wordrec(windmax).x-wordrec(windmin).x);
- end;
-
- function windowrows : byte;
- begin
- windowrows := succ(wordrec(windmax).y-wordrec(windmin).y);
- end;
-
- (*---- device driver for screen writes -------------------------------------*)
- {$F+}
- function crtinput(var f : textrec) : integer;
- label keyboard;
- begin
- keyboard:
- f.bufptr^[0] := readkey;
- if f.bufptr^[0] = #0 then begin
- f.bufptr^[0] := readkey;
- goto keyboard;
- end;
- if f.bufptr^[0] = #8 then goto keyboard;
- if f.bufptr^[0] = #13 then
- begin
- f.bufptr^[1] := #10;
- f.bufend := 2;
- writeln;
- end else begin
- f.bufend := 1;
- write(f.bufptr^[0]);
- end;
-
- f.bufpos := 0;
- crtinput := 0;
- end;
-
- function crtoutput(var f : textrec) : integer;
- var counter : word; {voor een loop}
- ch : byte; {charakter}
- offset : word;
- x,y : byte;
-
- procedure scrollwindowup;
- begin
- if y >= wordrec(windmax).y then
- begin
- if not scrolllockscreen then
- scrollup(succ(wordrec(windmin).x),succ(wordrec(windmin).y),
- succ(wordrec(windmax).x),succ(wordrec(windmax).y),
- textattr);
- end else inc(y);
- end;
-
- begin
- counter := 0;
- x := pred(wherex) + wordrec(windmin).x;
- y := pred(wherey) + wordrec(windmin).y;
-
- while counter <f.bufpos do
- begin
- ch := byte(f.bufptr^[counter]);
- case ch of
- 07 : ; {bell}
- 08 : ; {backspace}
- 10 : scrollwindowup;
- 13 : x := wordrec(windmin).x; {cr}
- else begin
- offset := videoofs + x*2 + y*maxcols*2;
- fillword(mem[videoseg:offset],1,ch+textattr shl 8);
- inc(x);
- if x > wordrec(windmax).x then
- begin
- scrollwindowup;
- x := wordrec(windmin).x;
- end;
- end;
- end;
-
- inc(counter);
- end;
-
- f.bufpos := 0;
- crtoutput := 0;
-
- x := succ(x)-wordrec(windmin).x;
- y := succ(y)-wordrec(windmin).y;
- gotoxy(x,y);
- end;
-
- function crtflush(var f : textrec) : integer;
- begin
- crtflush := 0;
- end;
-
- function crtopen(var f : textrec) : integer;
- begin
- with textrec(f) do
- begin
-
- if mode = fminput then
- begin
- inoutfunc := @crtinput;
- flushfunc := @crtflush;
- end
- else
- begin
- mode := fmoutput;
- inoutfunc := @crtflush;
- flushfunc := @crtoutput;
- end;
-
- closefunc := @crtflush;
- end;
-
- crtopen := 0;
- end;
- {$F-}
-
- procedure assigncrt(var f : text);
- begin
- with textrec(f) do
- begin
- handle := $ffff;
- mode := fmclosed;
- bufsize := sizeof(buffer);
- bufptr := @buffer;
- openfunc := @crtopen;
- name[0] := #0;
- end;
- end;
- (*------ end device driver -------------------------------------------------*)
-
- (* other screen procedures *)
- procedure fastwrite(x,y,attr : byte;st : stscreen);
- begin
- if ignorewindow then asmwrite(videoptr^,maxcols,x,y,attr,st)
- else begin
- st := copy(st,1,succ(wordrec(windmax).x)-pred(x)-wordrec(windmin).x);
- if y+wordrec(windmin).y <= succ(wordrec(windmax).y) then
- asmwrite(videoptr^,maxcols,wordrec(windmin).x+x,wordrec(windmin).y+y,
- attr,st);
- end;
- end;
-
- procedure fastpwrite(x,y : byte;st : stscreen);
- begin
- if ignorewindow then asmpwrite(videoptr^,maxcols,x,y,st)
- else begin
- st := copy(st,1,succ(wordrec(windmax).x)-pred(x)-wordrec(windmin).x);
- if y+wordrec(windmin).y <= succ(wordrec(windmax).y) then
- asmpwrite(videoptr^,maxcols,wordrec(windmin).x+x,wordrec(windmin).y+y,
- st);
- end;
- end;
-
- procedure changeattr(x,y,attr,len : byte);
- begin
- if ignorewindow then asmattr(videoptr^,maxcols,x,y,attr,len)
- else begin
- inc(x,wordrec(windmin).x);
- inc(y,wordrec(windmin).y);
- if (x<=succ(wordrec(windmax).x)) and (y<=succ(wordrec(windmax).y)) then
- begin
- if x+len > succ(wordrec(windmax).x) then
- len := succ(wordrec(windmax).x) - pred(x);
- asmattr(videoptr^,maxcols,x,y,attr,len)
- end;
- end;
- end;
-
- procedure titleengine(x1,y1,x2,y2 : byte;bt : bordertypes;
- var title : stscreen);
- var signorewindow : boolean;
- width : integer;
- optstr : string[4];
- delim : charset;
- dropbox : boolean;
- placestr : (leftpad,rightpad,center);
- xpos,ypos : byte;
- begin
- signorewindow := ignorewindow;
- ignorewindow := true;
- delim := ['_','^','<','>','+','|'];
- ypos := y1;
- placestr := center;
- dropbox := false;
- while (length(title)>0) and (title[1] in delim) do
- begin
- case title[1] of
- '_' : ypos := y2;
- '^' : ypos := y1;
- '<' : placestr := leftpad;
- '>' : placestr := rightpad;
- '+' : placestr := center;
- '|' : dropbox := true;
- end; {case}
- delete(title,1,1);
- end;
-
- if dropbox then width := (x2-x1)-5
- else width := (x2-x1)-3;
-
- if (width>1) and (title<>'') then
- begin
- delete(title,succ(width),255);
-
- case bt of
- doublebrdr : bt := horizdoublevertsinglebrdr;
- horizsinglevertdoublebrdr : bt := singlebrdr;
- end; {case}
-
- case placestr of
- leftpad : xpos := x1 + 2;
- rightpad : begin
- xpos := succ(x2-length(title)) - 2;
- if dropbox then dec(xpos,2);
- end;
- center : if dropbox then
- xpos := ((succ(x2-x1)-(length(title)+2)) div 2) + x1
- else xpos := ((succ(x2-x1)-length(title)) div 2) + x1;
- end; {case}
- if dropbox then
- fastpwrite(xpos,ypos,borderst[bt,rc]+ title +borderst[bt,lc])
- else fastpwrite(xpos,ypos,title)
-
- end;
-
- ignorewindow := signorewindow;
- end;
-
- procedure boxengine(x1,y1,x2,y2,attr : byte;
- bordertype : bordertypes;filled : boolean);
- var signorewindow : boolean;
- loop : byte;
-
- function duplicate(ch : char;times : byte) : string;
- var f : string;
- begin
- fillchar(f,times+1,ch);
- byte(f[0]) := times;
- duplicate := f;
- end;
-
- begin
- signorewindow := ignorewindow;
- ignorewindow := true;
-
- fastwrite(x1,y1,attr,borderst[bordertype,tl] +
- duplicate(borderst[bordertype,ht],pred(x2-x1)) +
- borderst[bordertype,tr]);
-
- if filled then
- for loop := succ(y1) to pred(y2) do
- begin
- fastwrite(x1,loop,attr,borderst[bordertype,vl]+duplicate(' ',pred(x2-x1))+
- borderst[bordertype,vr]);
- end
- else for loop := succ(y1) to pred(y2) do
- begin
- fastwrite(x1,loop,attr,borderst[bordertype,vl]);
- fastwrite(x2,loop,attr,borderst[bordertype,vr]);
- end;
-
- fastwrite(x1,y2,attr,borderst[bordertype,bl] +
- duplicate(borderst[bordertype,hb],pred(x2-x1)) +
- borderst[bordertype,br]);
-
- ignorewindow := signorewindow;
- end;
-
-
- (* cursor mapipulation *)
- procedure normalcursor;
- var size : word;
- begin
- if basescreen=$b800 then size := $0607
- else size := $0b0c;
- setcursorshape(size);
- end;
-
- procedure insertcursor;
- var size : word;
- begin
- if basescreen=$b800 then size := $0507
- else size := $090c;
- setcursorshape(size);
- end;
-
- procedure halfcursor;
- var size : word;
- begin
- if basescreen=$b800 then size := $0407
- else size := $070d;
- setcursorshape(size);
- end;
-
- procedure hidecursor;
- begin
- setcursorshape($2000);
- end;
-
-
- (* quickwindow procedures *)
- function calcsizescreen(x1,y1,x2,y2 : byte) : word;
- begin
- calcsizescreen := ((x2-(x1-1))*(y2-(y1-1)))*2 + 6;
- end;
-
- function savepartscreen(x1,y1,x2,y2 : byte) : savescrptr;
- var tempscrptr : savescrptr;
- loop,
- count,
- tempsize,
- lenline,
- offset : word;
- begin
- tempsize := calcsizescreen(x1,y1,x2,y2);
- if tempsize>maxavail then
- begin
- savepartscreen := nil;
- exit;
- end;
-
- getmem(tempscrptr,tempsize);
- dec(x1);
- with tempscrptr^ do
- begin
- screensize := tempsize;
- count := 1;
- lenline := x2-x1;
- for loop := y1 to y2 do
- begin
- offset := videoofs + (x1*2) + (maxcols*2*(loop-1));
- movefromscreen(mem[videoseg:offset],savedscr[count],lenline);
- inc(count,lenline);
- end;
- end;
- savepartscreen := tempscrptr;
- end;
-
- procedure restorepartscreen(var scrptr : savescrptr;x1,y1,x2,y2 : byte);
- var loop : byte;
- lenline,
- count,
- offset : word;
- begin
- if scrptr=nil then exit;
- dec(x1);
-
- with scrptr^ do
- begin
- count := 1;
- lenline := x2-x1;
- for loop := y1 to y2 do
- begin
- offset := videoofs + (x1*2)+(maxcols*2*(loop-1));
- movetoscreen(savedscr[count],mem[videoseg:offset],lenline);
- count := count + lenline; {*2 voor attr}
- end;
- end;
- end;
-
- procedure disposepartscreen(var scrptr : savescrptr);
- begin
- if scrptr=nil then exit;
-
- freemem(scrptr,scrptr^.screensize);
- scrptr := nil;
- end;
-
- procedure quickopenwindow(x1,y1,x2,y2,attr : byte;bt : bordertypes;
- st : stscreen);
- var tempquickwindow : quickwindowptr;
- begin
- if x1>x2 then exit;
- if y1>y2 then exit;
- if maxavail<sizeof(quickwindowrec)+calcsizescreen(x1,y1,x2,y2) then exit;
-
- new(tempquickwindow); { reserve memory }
- tempquickwindow^.x1 := x1;
- tempquickwindow^.y1 := y1;
- tempquickwindow^.x2 := x2;
- tempquickwindow^.y2 := y2;
- tempquickwindow^.bt := bt;
-
- with tempquickwindow^ do
- begin
- previous := nil;
- windowinfo := savepartscreen(x1,y1,x2,y2);
-
- stextattr := textattr;
- textattr := attr;
- sscrolllock := scrolllockscreen;
- signorewindow := ignorewindow;
- sscanlines := getcursorshape;
- sx := wherex;
- sy := wherey;
- swindmin := windmin;
- swindmax := windmax;
-
- boxengine(x1,y1,x2,y2,textattr,bt,true);
- if bt=nobrdr then window(x1,y1,x2,y2)
- else begin
- titleengine(x1,y1,x2,y2,bt,st);
- window(succ(x1),succ(y1),pred(x2),pred(y2));
- end;
-
- normalcursor;
- end;
-
-
- if visiblequickwindow=nil then visiblequickwindow := tempquickwindow
- else begin
- tempquickwindow^.previous := visiblequickwindow;
- visiblequickwindow := tempquickwindow
- end;
-
- { set defaults }
- scrolllockscreen := false; {scroll screen}
- ignorewindow := false;
- end;
-
- procedure quickmovewindow(x,y : byte);
- var trows,
- tcols,
- srow,
- scol,
- loop : byte;
- lenline,
- count,
- offset : word;
- begin
- with visiblequickwindow^ do
- begin
- { check if it wil fit on screen }
- tcols := x2-x1;
- trows := y2-y1;
- if tcols+x>maxcols then exit;
- if trows+y>maxrows then exit;
- with windowinfo^ do
- begin
- { first underlying restore screen }
- count := 1;
- lenline := x2-pred(x1);
- for loop := y1 to y2 do
- begin
- offset := videoofs + (pred(x1)*2)+(maxcols*2*(loop-1));
- swapvar(savedscr[count],mem[videoseg:offset],lenline*2);
- count := count + lenline; {*2 voor attr}
- end;
- { restore window on new place }
- x1 := x;
- y1 := y;
- x2 := x1+tcols;
- y2 := y1+trows;
- scol := wherex;
- srow := wherey;
- if bt=nobrdr then window(x1,y1,x2,y2)
- else window(succ(x1),succ(y1),pred(x2),pred(y2));
- gotoxy(scol,srow);
- count := 1;
- lenline := x2-pred(x1);
- for loop := y1 to y2 do
- begin
- offset := videoofs + (pred(x1)*2)+(maxcols*2*(loop-1));
- swapvar(savedscr[count],mem[videoseg:offset],lenline*2);
- count := count + lenline; {*2 voor attr}
- end;
- end;
- end;
- end;
-
- procedure quickclosewindow;
- var tempquickwindow : quickwindowptr;
- begin
- if visiblequickwindow=nil then exit;
-
- tempquickwindow := visiblequickwindow;
-
- with tempquickwindow^ do
- begin
- restorepartscreen(windowinfo,x1,y1,x2,y2);
- textattr := stextattr;
- scrolllockscreen := sscrolllock;
- ignorewindow := signorewindow;
- setcursorshape(sscanlines);
- windmin := swindmin;
- windmax := swindmax;
- gotoxy(sx,sy);
- disposepartscreen(windowinfo);
- visiblequickwindow := visiblequickwindow^.previous;
- end;
-
- dispose(tempquickwindow);
- end;
-
- (* crt exit handler *)
-
- {$F+}
- procedure exityncrt;
- var m : byte;
- begin
- exitproc := orginalexitproc;
-
- close(output); {hoeft eigenlijk niet}
- close(input); {hoeft eigenlijk niet}
-
- setcursorshape(startupcursorsize);
- (* return to orginal text mode *)
-
- if (startupmode<>lastmode) then textmode(startupmode);
- end;
- {$F-}
-
-
-
- begin
- orginalexitproc := exitproc;
- exitproc := @exityncrt;
-
- delayinit; {get one microsecond resolution}
-
- scrolllockscreen := false; {scroll screen}
- getstartupcolor; {sets textattr by reading attr from screen}
- wordrec(windmin).x := 0;
- wordrec(windmin).y := 0; { window to entire scr }
- wordrec(windmax).x := pred(maxcols);
- wordrec(windmax).y := pred(maxrows);
- ignorewindow := false;
- (* initialeren van textdevice driver *)
- assigncrt(output); rewrite(output);
- assigncrt(input); reset(input);
-
- visiblequickwindow := nil;
- end.
-