unit txtwin; INTERFACE type psave=^tsave; tsave=record x1,y1,x2,y2:word; saved:pointer; active:boolean; end; wintype=array[1..6]of char; pwin=^twin; twin=record x1,y1,x2,y2:word; f1,b1:byte; screen:psave; active:boolean; wint:wintype; end; const normal:wintype=('Ú','¿','À','Ù','Ä','³'); double:wintype=('É','»','È','¼','Í','º'); procedure initback(var sav:psave); procedure saveback(var sav:psave;xx1,yy1,xx2,yy2:word); procedure resback(var sav:psave); procedure initwin(var win:pwin); procedure drawwin(var win:pwin; xx1,yy1,xx2,yy2:word; ff1,bb1:byte;wt:wintype); procedure shade(x1,x2,y:word); procedure closewin(var win:pwin); procedure redrawwin(var win:pwin); IMPLEMENTATION procedure initback(var sav:psave); begin with sav^ do begin active:=false; x1:=0; y1:=0; x2:=0; y2:=0; end; end; procedure saveback(var sav:psave;xx1,yy1,xx2,yy2:word); var y,w,o:word; begin with sav^ do begin if(active)then exit; x1:=xx1; y1:=yy1; x2:=xx2; y2:=yy2; w:=succ(x2-x1)*2; getmem(saved,w*succ(y2-y1)); active:=true; o:=0; for y:=y1 to y2 do begin move(mem[segb800:pred(y)*160+pred(x1)],mem[seg(saved^):ofs(saved^)+o],w); inc(o,w); end; end; end; procedure resback(var sav:psave); var y,w,o:word; begin with sav^ do begin if not(active)then exit; w:=succ(x2-x1)*2; o:=0; for y:=y1 to y2 do begin move(mem[seg(saved^):ofs(saved^)+o],mem[segb800:pred(y)*160+pred(x1)],w); inc(o,w); end; freemem(saved,w*succ(y2-y1)); active:=false; x1:=0; y1:=0; x2:=0; y2:=0; end; end; procedure initwin(var win:pwin); begin with win^ do begin x1:=0; y1:=0; x2:=0; y2:=0; f1:=0; b1:=0; active:=false; wint:=normal; end; end; function buildstr(const ch:char;const num:byte):string; assembler; asm xor ch,ch mov al,[num] mov cl,al les di,@result stosb jcxz @@exit mov al,[&ch] mov ah,al shr cl,1 rep stosw adc cl,cl rep stosb @@exit: end; procedure str2scr(const s:string;const x,y:word;const c:byte); assembler; asm push ds dec [x] dec [y] mov es,segb800 mov di,[y] mov bx,di shl di,6 shl bx,4 add di,bx add di,[x] shl di,1 lds si,s xor ch,ch mov cl,ds:[si] inc si mov ah,[c] @@loop: lodsb stosw loop @@loop @@exit: pop ds end; procedure drawwin(var win:pwin; xx1,yy1,xx2,yy2:word; ff1,bb1:byte;wt:wintype); var tmp:string; cnt:byte; begin with win^ do begin if(active)then exit; active:=true; initback(screen); x1:=xx1; y1:=yy1; x2:=xx2; y2:=yy2; f1:=ff1; b1:=bb1; saveback(screen,x1,y1,x2,y2); wint:=wt; end; tmp:=''; tmp:=wt[1]; if((xx2-xx1)>2)then tmp:=concat(tmp,buildstr(wt[5],pred(xx2-xx1))); tmp:=concat(tmp,wt[2]); str2scr(tmp,xx1,yy1,(bb1 shl 4)+ff1); tmp[1]:=wt[3]; tmp[ord(tmp[0])]:=wt[4]; str2scr(tmp,xx1,yy2,(bb1 shl 4)+ff1); tmp:=''; tmp:=wt[6]; if((xx2-xx1)>2)then tmp:=concat(tmp,buildstr(' ',pred(xx2-xx1))); tmp:=concat(tmp,wt[6]); if((yy2-yy1)>2)then begin for cnt:=1 to pred(yy2-yy1)do str2scr(tmp,xx1,yy1+cnt,(bb1 shl 4)+ff1); end; end; procedure shade(x1,x2,y:word); assembler; asm mov es,segb800 dec [x1] dec [y] mov cx,[x2] sub cx,[x1] mov di,[y] mov bx,di shl di,6 shl bx,4 add di,bx shl di,1 add di,[x1] add di,[x1] inc di @@loop: mov al,es:[di] sub al,112 mov es:[di],al add di,2 dec cx jnz @@loop end; procedure closewin(var win:pwin); begin with win^ do begin if not(active)then exit; active:=false; x1:=0; y1:=0; x2:=0; y2:=0; f1:=0; b1:=0; resback(screen); wint:=normal; end; end; procedure redrawwin(var win:pwin); var tmp:string; c:byte; begin with win^ do begin if not(active)then exit; tmp:=''; tmp:=wint[1]; if((x2-x1)>2)then tmp:=concat(tmp,buildstr(wint[5],pred(x2-x1))); tmp:=concat(tmp,wint[2]); str2scr(tmp,x1,y1,(b1 shl 4)+f1); tmp[1]:=wint[3]; tmp[ord(tmp[0])]:=wint[4]; str2scr(tmp,x1,y2,(b1 shl 4)+f1); tmp:=''; tmp:=wint[6]; if((x2-x1)>2)then tmp:=concat(tmp,buildstr(' ',pred(x2-x1))); tmp:=concat(tmp,wint[6]); if((y2-y1)>2)then begin for c:=1 to pred(y2-y1)do str2scr(tmp,x1,y1+c,(b1 shl 4)+f1); end; end; end; begin end.