home *** CD-ROM | disk | FTP | other *** search
-
- {----------------------------------------------------------------------------}
- { }
- { Window Routines - By Marcos Della 12/13/89 }
- { }
- { D&M Enterprises }
- { c/o Marcos R. Della }
- { PO Box 4251 }
- { Santa Rosa, CA 95402 }
- { }
- { This unit is an object oriented system that is designed to have }
- { stackable windows. Enclosed are a few additions to the system so }
- { that you can see how you can add your own routines to the standard }
- { windows object as defined by this unit. Note the end routines that }
- { are NOT object oriented at the end of the code. This is the user }
- { interface made to SIMPLIFY the programmers need for programming. }
- { You can use these for a simple window stack system, or you can }
- { create your own system of complexity for whatever reason you want... }
- { }
- { -------------------------------------------------------------------------- }
- { }
- { (c) Copyright D&M Enterprises, a general parternership, This program }
- { is CONFIDENTIAL, unpublished work of authorship created in 1989. }
- { IT IS A TRADE SECRET WHICH IS THE PROPERTY OF D&M ENTERPRISES, a general }
- { partnership. ALL USE, DISCLOSURE, AND/OR REPRODUCTION NOT SPECIFICALLY }
- { AUTHORIZED BY D&M ENTERPRISES IS PROHIBITED. This program may also be }
- { protected under copyright and similar laws of other countries. }
- { All rights reserved. }
- { }
- { -------------------------------------------------------------------------- }
- { }
- { The major procedures that are included with this unit are openwindow, }
- { closewindow, change_title, change_border, and horizontal_line. }
- { The code to create a stack oriented window system is included. The }
- { procedures change_title, change_border, and horizontal_line are }
- { examples of how you can add to the basic unit. }
- { }
- { To use these procedures, you need the following... }
- { }
- { PROCEDURE openwindow(x1,y1,x2,y2,attr,shadow,borderchar,battr, }
- { title,tattr); }
- { x1,y1 : upper left corner of the window }
- { x2,y2 : lower right corner of the window }
- { attr : foreground/background attributes of the window }
- { shadow : True=creates a shadow effect }
- { borderchar : ┌┐└┘──││┤├ characters. You can use the }
- { constants std_border, dbl_border, or sp1_border}
- { battr : foreground/background attributes of the border }
- { title : title of the window }
- { tattr : fore/background attribute of the title }
- { }
- { PROCEDURE closewindow Removes the current window from the screen }
- { PROCEDURE change_title(title); Changes the title string }
- { PROCEDURE change_border(borderchar); Changes the border characters }
- { PROCEDURE horizontal_line(y,'├─┤'); Creates a horizontal line }
- { }
- { -------------------------------------------------------------------------- }
-
- Unit Windows;
-
- Interface
-
- Uses Crt, Dos;
-
- {- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
- { Note: When you use the "stdopenwindow" these are the standard items that }
- { are used. You can change them from your program to create your }
- { own standards. }
-
- CONST std_border : STRING[13] = '┌┐└┘──││┤├├─┤';
- std_attr : BYTE = blue * 16 + white;
- std_battr : BYTE = blue * 16 + white;
- std_tattr : BYTE = blue * 16 + white;
- std_shadow : BOOLEAN = TRUE;
-
- {- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
- { The following definitions are to be used when you call openwindow and need }
- { a border character design. These are just some that we have come up with }
- { for you to use... }
-
- dbl_border = '╔╗╚╝══║║╡╞╟─╢';
- sp1_border = '╒╕╘╛══││╡╞├─┤';
- sp2_border = '┌┐└┘──││┤├├─┤';
-
- TYPE line = STRING[80];
- bstr = STRING[13];
-
- baseptr = ^base_elm;
- base_elm = OBJECT
- DESTRUCTOR done; VIRTUAL;
- END;
-
- nodeptr = ^node;
- node = OBJECT(base_elm)
- prevptr : nodeptr;
- nextptr : nodeptr;
- END;
-
- nodelptr = ^nodelist;
- nodelist = OBJECT(node)
- head : nodeptr;
- tail : nodeptr;
- FUNCTION first : nodeptr;
- FUNCTION last : nodeptr;
- FUNCTION prev(p : nodeptr) : nodeptr;
- FUNCTION next(p : nodeptr) : nodeptr;
- FUNCTION prev_wrap(p : nodeptr) : nodeptr;
- FUNCTION next_wrap(p : nodeptr) : nodeptr;
- FUNCTION empty : BOOLEAN;
-
- PROCEDURE inserthead(p : nodeptr);
- PROCEDURE inserttail(p : nodeptr);
- PROCEDURE deleteptr(p : nodeptr);
- PROCEDURE initlist;
- PROCEDURE disposelist
- END;
-
- winptr = ^windowelm;
- windowelm = OBJECT(node)
- cursor_x : BYTE;
- cursor_y : BYTE;
- win_min : WORD;
- win_max : WORD;
- text_attr : BYTE;
- { ----------------- }
- x1pos : BYTE;
- y1pos : BYTE;
- x2pos : BYTE;
- y2pos : BYTE;
- x_attr : BYTE;
- shadow : BOOLEAN;
- coverptr : POINTER;
- restore : BOOLEAN;
-
- CONSTRUCTOR openwindow(x1,y1,x2,y2,attr : BYTE; makeshadow : BOOLEAN);
- DESTRUCTOR closewindow; VIRTUAL;
- END;
-
- windowptr = ^windowobj;
- windowobj = OBJECT(windowelm)
- borders : bstr;
- b_attr : BYTE;
- titleptr : ^STRING;
- t_attr : BYTE;
- CONSTRUCTOR openwindow(x1,y1,x2,y2,attr : BYTE;
- makeshadow : BOOLEAN;
- borderchar : bstr; battr : BYTE;
- title : line; tattr : BYTE);
- DESTRUCTOR closewindow; VIRTUAL;
- PROCEDURE change_title(title : line);
- PROCEDURE change_border(borderchar : bstr);
- PROCEDURE horizontal_line(y : BYTE; onoff : BOOLEAN);
- END;
-
- wstackptr = ^wstack;
- wstack = OBJECT(nodelist)
- CONSTRUCTOR initwindow;
- DESTRUCTOR done; VIRTUAL;
- END;
-
- {$F+}
- PROCEDURE setfieldattr (x,y,ln,atr : WORD );
- PROCEDURE setfieldstr (x,y,ln : WORD; s : line);
- PROCEDURE setfieldatrstr (x,y,ln,atr : WORD; s : line);
- PROCEDURE callproc(sub : POINTER);
- {$F-}
- PROCEDURE hidecursor;
- PROCEDURE showcursor;
- PROCEDURE linecursor;
- PROCEDURE bigcursor;
-
- {- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -}
- { The following procedures save a segment of the screen as defined by the }
- { X1,Y1 and X2,Y2 coordinates. The information is saved in the VAR item }
- { and it is the users responsibility to GETMEM and FREEMEM the area. }
-
- PROCEDURE saveseg(X1,Y1,X2,Y2 : BYTE; VAR dest);
- PROCEDURE restoreseg(X1,Y1,X2,Y2 : BYTE; VAR source);
-
- PROCEDURE savescreen(ns : INTEGER);
- PROCEDURE restorescreen(ns : INTEGER);
-
- PROCEDURE fillscr(ch : CHAR);
- PROCEDURE writech(x,y : BYTE; ch : CHAR; attr : BYTE);
- PROCEDURE openwindow(x1,y1,x2,y2,attr : BYTE;
- shadow : BOOLEAN; borderchar : bstr;
- battr : BYTE; title : line; tattr : BYTE);
- PROCEDURE change_title(title : line);
- PROCEDURE change_border(borderchar : bstr);
- PROCEDURE horizontal_line(y : BYTE; onoff : BOOLEAN);
- PROCEDURE popwindow;
- PROCEDURE closewindow;
-
- PROCEDURE stdopenwindow(x1,y1,x2,y2 : BYTE; title : line);
-
- Implementation
-
- {----------------------------------------------------------------------------}
-
- TYPE scrmap = RECORD
- scrch : CHAR;
- scrat : BYTE
- END;
- screen = ARRAY[1..25,1..80] OF scrmap;
-
- VAR reg : REGISTERS;
- screenbase : WORD;
- windowstack : wstack;
- colorscreen : screen ABSOLUTE $B800:$0000;
- monoscreen : screen ABSOLUTE $B000:$0000;
- screenhold : ARRAY[1..10] OF ^screen;
-
- {----------------------------------------------------------------------------}
-
- DESTRUCTOR base_elm.done;
- BEGIN
- END;
-
- { -------------------------------------------------------------------------- }
-
- FUNCTION nodelist.first;
- BEGIN
- first := head
- END;
-
- { -------------------------------------------------------------------------- }
-
- FUNCTION nodelist.last;
- BEGIN
- last := tail
- END;
-
- { -------------------------------------------------------------------------- }
-
- FUNCTION nodelist.prev;
- BEGIN
- IF p = head THEN
- prev := NIL
- ELSE
- prev := p^.prevptr
- END;
-
- { -------------------------------------------------------------------------- }
-
- FUNCTION nodelist.next;
- BEGIN
- IF p = last THEN
- next := NIL
- ELSE
- next := p^.nextptr
- END;
-
- { -------------------------------------------------------------------------- }
-
- FUNCTION nodelist.prev_wrap;
- BEGIN
- prev_wrap := p^.prevptr
- END;
-
- { -------------------------------------------------------------------------- }
-
- FUNCTION nodelist.next_wrap;
- BEGIN
- next_wrap := p^.nextptr
- END;
-
- { -------------------------------------------------------------------------- }
-
- FUNCTION nodelist.empty;
- BEGIN
- empty := (head = NIL)
- END;
-
- { -------------------------------------------------------------------------- }
-
- PROCEDURE nodelist.inserthead;
- BEGIN
- IF head = NIL THEN
- BEGIN
- p^.prevptr := p;
- p^.nextptr := p;
- tail := p
- END
- ELSE
- BEGIN
- p^.nextptr := head;
- p^.prevptr := tail;
- p^.nextptr^.prevptr := p;
- p^.prevptr^.nextptr := p
- END;
- head := p
- END;
-
- { -------------------------------------------------------------------------- }
-
- PROCEDURE nodelist.inserttail;
- BEGIN
- IF tail = NIL THEN
- BEGIN
- p^.prevptr := p;
- p^.nextptr := p;
- head := p
- END
- ELSE
- BEGIN
- p^.nextptr := head;
- p^.prevptr := tail;
- p^.nextptr^.prevptr := p;
- p^.prevptr^.nextptr := p
- END;
- tail := p
- END;
-
- { -------------------------------------------------------------------------- }
-
- PROCEDURE nodelist.deleteptr;
- VAR tptr : nodeptr;
- BEGIN
- IF head <> NIL THEN
- BEGIN
- tptr := head;
- WHILE (tptr^.nextptr <> p) AND (tptr^.nextptr <> head) DO
- tptr := tptr^.nextptr;
- IF tptr^.nextptr = p THEN
- IF p^.nextptr = p THEN
- initlist
- ELSE
- BEGIN
- tptr^.nextptr := p^.nextptr;
- tptr^.nextptr^.prevptr := tptr;
- IF head = p THEN
- BEGIN
- head := p^.nextptr;
- tail := head^.prevptr
- END;
- IF tail = p THEN
- BEGIN
- tail := p^.prevptr;
- head := tail^.nextptr
- END
- END
- END
- END;
-
- { -------------------------------------------------------------------------- }
-
- PROCEDURE nodelist.disposelist;
- VAR p : nodeptr;
- BEGIN
- WHILE head <> NIL DO BEGIN
- p := head;
- deleteptr(p);
- DISPOSE(p,done)
- END
- END;
-
- { -------------------------------------------------------------------------- }
-
- PROCEDURE nodelist.initlist;
- BEGIN
- head := NIL;
- tail := NIL
- END;
-
- { -------------------------------------------------------------------------- }
-
- PROCEDURE writech(x,y : BYTE; ch : CHAR; attr : BYTE);
- BEGIN
- MEM[screenbase:PRED(x) * 2 + 160 * PRED(y)] := ORD(ch);
- MEM[screenbase:PRED(x) * 2 + 160 * PRED(y) + 1] := attr;
- END;
-
- {----------------------------------------------------------------------------}
-
- PROCEDURE saveseg(X1,Y1,X2,Y2 : BYTE; VAR dest);
- VAR i : BYTE;
- width : BYTE;
- saddr : INTEGER;
- BEGIN
- width := SUCC(x2 - x1);
- FOR i := y1 TO y2 DO BEGIN
- saddr := PRED(i) * 160 + PRED(x1) * 2;
- MOVE(MEM[screenbase:saddr],
- MEM[SEG(dest):OFS(dest) + (i - y1) * width * 2],
- width * 2)
- END
- END;
-
- {----------------------------------------------------------------------------}
-
- PROCEDURE restoreseg(X1,Y1,X2,Y2 : BYTE; VAR source);
- VAR i : BYTE;
- width : BYTE;
- saddr : INTEGER;
- BEGIN
- width := SUCC(x2 - x1);
- FOR i := y1 TO y2 DO BEGIN
- saddr := PRED(i) * 160 + PRED(x1) * 2;
- MOVE(MEM[SEG(source):OFS(source) + (i - y1) * width * 2],
- MEM[screenbase:saddr],
- width * 2)
- END
- END;
-
- {----------------------------------------------------------------------------}
-
- PROCEDURE shadowseg(x1,y1,x2,y2 : INTEGER);
- VAR i : BYTE;
- BEGIN
- IF y2 < 24 THEN
- FOR i := x1 + 2 TO x2 DO
- MEM[screenbase:PRED(i * 2) + y2 * 160] := LIGHTGRAY;
-
- IF x2 + 1 < 80 THEN
- FOR i := y1 TO y2 DO BEGIN
- MEM[screenbase:x2 * 2 + i * 160 + 1] := LIGHTGRAY;
- MEM[screenbase:(x2 + 1) * 2 + i * 160 + 1] := LIGHTGRAY
- END;
-
- IF (x2 + 1 < 80) AND (y2 < 24) THEN
- BEGIN
- MEM[screenbase:x2 * 2 + y2 * 160 + 1] := LIGHTGRAY;
- MEM[screenbase:(x2 + 1) * 2 + y2 * 160 + 1] := LIGHTGRAY
- END
- END;
-
- {----------------------------------------------------------------------------}
-
- CONSTRUCTOR windowelm.openwindow;
- VAR size : WORD;
- BEGIN
- cursor_x := wherex;
- cursor_y := wherey;
- win_min := windmin;
- win_max := windmax;
- text_attr := textattr;
- x1pos := x1;
- y1pos := y1;
- x2pos := x2;
- y2pos := y2;
- x_attr := attr;
- shadow := makeshadow;
- coverptr := NIL;
- restore := TRUE;
-
- IF ((x2 > 78) AND (x2 <= 80)) OR (y2 = 25) THEN
- shadow := FALSE;
-
- IF (x1 < 0) OR (x2 > 80) OR
- (y1 < 0) OR (y2 > 25) OR
- (x1 > x2) OR (y1 > y2) OR
- (x2 - x1 < 0) OR (y2 - y1 < 0) THEN
- EXIT;
-
- IF shadow THEN
- BEGIN
- GETMEM(coverptr,SUCC(x2 - x1 + 2) * 2 * SUCC(y2 - y1 + 1));
- saveseg(x1,y1,x2 + 2,y2 + 1,coverptr^)
- END
- ELSE
- BEGIN
- GETMEM(coverptr,SUCC(x2 - x1) * 2 * SUCC(y2 - y1));
- saveseg(x1,y1,x2,y2,coverptr^)
- END;
- IF shadow THEN
- shadowseg(x1,y1,x2,y2);
- WINDOW(x1,y1,x2,y2);
- textattr := attr;
- GOTOXY(1,1);
- clrscr
- END;
-
- { -------------------------------------------------------------------------- }
-
- DESTRUCTOR windowelm.closewindow;
- BEGIN
- IF coverptr = NIL THEN
- EXIT;
-
- IF shadow THEN
- BEGIN
- IF restore THEN
- restoreseg(x1pos,y1pos,x2pos + 2,y2pos + 1,coverptr^);
- FREEMEM(coverptr,SUCC(x2pos - x1pos + 2) * 2 * SUCC(y2pos - y1pos + 1))
- END
- ELSE
- BEGIN
- IF restore THEN
- restoreseg(x1pos,y1pos,x2pos,y2pos,coverptr^);
- FREEMEM(coverptr,SUCC(x2pos - x1pos) * 2 * SUCC(y2pos - y1pos))
- END;
- coverptr := NIL;
- textattr := text_attr;
- windmin := win_min;
- windmax := win_max;
- GOTOXY(cursor_x,cursor_y)
- END;
-
- {----------------------------------------------------------------------------}
-
- CONSTRUCTOR windowobj.openwindow;
- VAR i : BYTE;
- offset : BYTE;
- BEGIN
- windowelm.openwindow(x1,y1,x2,y2,attr,makeshadow);
- IF battr = 0 THEN
- b_attr := attr
- ELSE
- b_attr := battr;
- IF tattr = 0 THEN
- t_attr := attr
- ELSE
- t_attr := tattr;
- GETMEM(titleptr,LENGTH(title) + 1);
- titleptr^ := title;
-
- windowobj.change_border(borderchar);
- END;
-
- { -------------------------------------------------------------------------- }
-
- DESTRUCTOR windowobj.closewindow;
- BEGIN
- FREEMEM(titleptr,LENGTH(titleptr^) + 1);
- windowelm.closewindow
- END;
-
- { -------------------------------------------------------------------------- }
-
- PROCEDURE windowobj.change_title;
- VAR offset : BYTE;
- i : BYTE;
- BEGIN
- FOR i := x1pos + 1 TO x2pos - 1 DO
- writech(i,y1pos,borders[5],b_attr);
- offset := (x2pos - x1pos - LENGTH(title)) DIV 2;
- IF (offset > 0) AND (LENGTH(title) > 0) THEN
- BEGIN
- writech(x1pos + offset,y1pos,borders[9],b_attr);
- writech(x1pos + offset + LENGTH(title) + 1,y1pos,borders[10],b_attr);
- FOR i := 1 TO LENGTH(title) DO
- writech(x1pos + offset + i,y1pos,title[i],t_attr)
- END;
- FREEMEM(titleptr,LENGTH(titleptr^) + 1);
- GETMEM(titleptr,LENGTH(title) + 1);
- titleptr^ := title
- END;
-
- { -------------------------------------------------------------------------- }
-
- PROCEDURE windowobj.change_border;
- VAR i : BYTE;
- BEGIN
- FILLCHAR(borders,SIZEOF(borders),0);
- borders := borderchar;
- IF (LENGTH(borderchar) >= 8) AND (x2pos - x1pos > 2) AND (y2pos - y1pos > 1) THEN
- BEGIN
- writech(x1pos,y1pos,borders[1],b_attr);
- writech(x2pos,y1pos,borders[2],b_attr);
- writech(x1pos,y2pos,borders[3],b_attr);
- writech(x2pos,y2pos,borders[4],b_attr);
- FOR i := x1pos + 1 TO x2pos - 1 DO
- writech(i,y2pos,borders[6],b_attr);
- FOR i := y1pos + 1 TO y2pos - 1 DO BEGIN
- writech(x1pos,i,borders[7],b_attr);
- writech(x2pos,i,borders[8],b_attr)
- END;
- windowobj.change_title(titleptr^);
- WINDOW(x1pos + 1,y1pos + 1,x2pos - 1,y2pos - 1)
- END;
- END;
-
- { -------------------------------------------------------------------------- }
-
- PROCEDURE windowobj.horizontal_line;
- VAR i : BYTE;
- ch : CHAR;
- BEGIN
- IF (y > 0) AND (y < y2pos - y1pos) THEN
- BEGIN
- IF onoff THEN
- IF LENGTH(borders) < 13 THEN
- ch := '─'
- ELSE
- BEGIN
- writech(x1pos,y1pos + y,borders[11],b_attr);
- writech(x2pos,y1pos + y,borders[13],b_attr);
- ch := borders[12]
- END
- ELSE
- BEGIN
- writech(x1pos,y1pos + y,borders[7],b_attr);
- writech(x2pos,y1pos + y,borders[8],b_attr);
- ch := ' '
- END;
- FOR i := x1pos + 1 TO x2pos - 1 DO
- writech(i,y1pos + y,ch,x_attr)
- END
- END;
-
- {----------------------------------------------------------------------------}
-
- CONSTRUCTOR wstack.initwindow;
- BEGIN
- windowstack.initlist
- END;
-
- { -------------------------------------------------------------------------- }
-
- DESTRUCTOR wstack.done;
- BEGIN
- windowstack.disposelist
- END;
-
- {----------------------------------------------------------------------------}
-
- PROCEDURE openwindow;
- VAR p : windowptr;
- BEGIN
- NEW(p,openwindow(x1,y1,x2,y2,attr,shadow,borderchar,battr,title,tattr));
- windowstack.inserttail(p)
- END;
-
- { -------------------------------------------------------------------------- }
-
- PROCEDURE change_title(title : line);
- BEGIN
- windowptr(windowstack.tail)^.change_title(title)
- END;
-
- { -------------------------------------------------------------------------- }
-
- PROCEDURE change_border(borderchar : bstr);
- BEGIN
- windowptr(windowstack.tail)^.change_border(borderchar)
- END;
-
- { -------------------------------------------------------------------------- }
-
- PROCEDURE horizontal_line(y : BYTE; onoff : BOOLEAN);
- BEGIN
- windowptr(windowstack.tail)^.horizontal_line(y,onoff)
- END;
-
- { -------------------------------------------------------------------------- }
-
- PROCEDURE closewindow;
- BEGIN
- IF NOT windowstack.empty THEN
- BEGIN
- windowptr(windowstack.last)^.closewindow;
- windowstack.deleteptr(windowstack.last)
- END
- END;
-
- { -------------------------------------------------------------------------- }
-
- PROCEDURE popwindow;
- BEGIN
- IF windowstack.tail <> NIL THEN
- BEGIN
- winptr(windowstack.tail)^.restore := FALSE;
- closewindow
- END
- END;
-
- { -------------------------------------------------------------------------- }
-
- PROCEDURE stdopenwindow;
- VAR p : windowptr;
- BEGIN
- NEW(p,openwindow(x1,y1,x2,y2,std_attr,std_shadow,
- std_border,std_battr,title,std_tattr));
- windowstack.inserttail(p)
- END;
-
- {----------------------------------------------------------------------------}
-
- PROCEDURE movetoscreen(VAR source,dest; len: INTEGER);
-
- { Similar to Turbo Move but assumes the destination is in video }
- { memory and thus writes only during retrace to avoid snow. }
- { These are used only in Save and Restore Screen routines below. }
- { These routines are very fast and can be used as the basic }
- { building blocks for other direct screen IO. I have used Turbo }
- { Pascals regular Write routines whereever possible because they }
- { are sufficiently fast and much more understandable and stable. }
-
- BEGIN
- len := len SHR 1;
- INLINE($1E/$55/$BA/$DA/$03/$C5/$B6/ source /$C4/$BE/ dest /$8B/$8E/
- len /$FC/$AD/$89/$C5/$B4/$09/$EC/$D0/$D8/$72/$FB/$FA/$EC/
- $20/$E0/$74/$FB/$89/$E8/$AB/$FB/$E2/$EA/$5D/$1F)
- END;
-
- {----------------------------------------------------------------------------}
-
- PROCEDURE movefromscreen(VAR source,dest; len : INTEGER);
-
- { Similar to Turbo Move but assumes the source is in video }
- { memory and thus writes only during retrace to avoid snow. }
-
- BEGIN
- len := len SHR 1;
- INLINE($1E/$55/$BA/$DA/$03/$C5/$B6/ source /$C4/$BE/ dest /$8B/$8E/
- len /$FC/$EC/$D0/$D8/$72/$FB/$FA/$EC/$D0/$D8/$73/$FB/$AD/
- $FB/$AB/$E2/$F0/$5D/$1F)
- END;
-
- {----------------------------------------------------------------------------}
-
- PROCEDURE savescreen(ns : INTEGER);
- BEGIN
- IF screenhold[ns] = NIL THEN
- NEW(screenhold[ns]);
- IF screenbase = $B800 THEN
- movefromscreen(colorscreen,screenhold[ns]^,4000)
- ELSE
- movefromscreen(monoscreen,screenhold[ns]^,4000);
- END;
-
- {----------------------------------------------------------------------------}
-
- PROCEDURE restorescreen(ns : INTEGER);
- BEGIN
- IF screenbase = $B800 THEN
- movetoscreen(screenhold[ns]^,colorscreen,4000)
- ELSE
- movetoscreen(screenhold[ns]^,monoscreen,4000);
- DISPOSE(screenhold[ns]);
- screenhold[ns] := NIL
- END;
-
- {----------------------------------------------------------------------------}
-
- PROCEDURE fillscr(ch : CHAR);
- VAR x,y : WORD;
- BEGIN
- x := windmin;
- y := windmax;
- WINDOW(1,1,80,25);
- GOTOXY(1,1);
- reg.ah := $09;
- reg.al := ORD(ch);
- reg.bx := textattr;
- reg.cx := 1920;
- INTR($10,reg);
- windmin := x;
- windmax := y
- END;
-
- { -------------------------------------------------------------------------- }
-
- {$F+}
- PROCEDURE setfieldattr (x,y,ln,atr : WORD ); EXTERNAL;{$L SETA.OBJ}
- PROCEDURE setfieldstr (x,y,ln : WORD; s : line); EXTERNAL;{$L SETS.OBJ}
- PROCEDURE setfieldatrstr (x,y,ln,atr : WORD; s : line); EXTERNAL;{$L SETAS.OBJ}
-
- PROCEDURE callproc(sub : POINTER);
- BEGIN
- INLINE($FF/$5E/$06)
- END;
- {$F-}
-
- {----------------------------------------------------------------------------}
-
- PROCEDURE hidecursor;
- BEGIN
- reg.ah := $03; { Service 3 }
- INTR($10,reg); { Intr 10. Get scan lines}
- reg.cx := reg.cx OR $2000; { Set bit 5 to 1}
- reg.ah := $01; { Service 1 }
- INTR($10,reg); { Intr 10 resets cursor}
- END;
-
- {----------------------------------------------------------------------------}
-
- PROCEDURE showcursor;
- BEGIN
- reg.ah := $03; { Service 3 }
- INTR($10,reg); { Intr 10. Get scan lines}
- reg.cx := reg.cx AND $DFFF; { Set bit 5 to 0}
- reg.ah := $01; { Service 1 }
- INTR($10,reg); { Intr 10 resets cursor}
- END;
-
- {----------------------------------------------------------------------------}
-
- PROCEDURE linecursor;
- BEGIN
- reg.ah := $01; { Service 1 }
- IF (MEM[0000:1040] AND 48) <> 48 THEN { Check for CGA }
- reg.cx := $0607 { Color Adapter }
- ELSE
- reg.cx := $0C0D; { Mono Adapter }
- INTR($10,reg); { Interrupt 10 }
- END;
-
- {----------------------------------------------------------------------------}
-
- PROCEDURE bigcursor;
- BEGIN
- reg.ah := $01; { Service 1 }
- IF (MEM[0000:1040] AND 48) <> 48 THEN { Check for CGA }
- reg.cx := $0107 { Color Adapter }
- ELSE
- reg.cx := $010D; { Mono Adapter }
- INTR($10,reg); { Interrupt 10 }
- END;
-
- {----------------------------------------------------------------------------}
-
- BEGIN
- FILLCHAR(screenhold,SIZEOF(screenhold),0);
- IF ((MEM[0000:1040] AND 48) <> 48) THEN
- screenbase := $B800
- ELSE
- screenbase := $B000;
- windowstack.initwindow;
- END.