home *** CD-ROM | disk | FTP | other *** search
- {
- I am new to this echo, so here is my offering placed upon
- the alter of exceptence. I have seen a couple of requests
- for help with both scrolling the screen, as well as
- reading/writting directly to/from the screen.
-
- Here is a unit to do both. One note here, this unit is
- assuming a color monitor. It can be used for a (Barrrrrfffffff)
- monocrome monitor by changing the value of
- "cscreen to $B000 : $0000"
-
- If anyone has any questions, I will be monitoring this echo
- from now on and will be happy to answer any questions.
-
-
- Robert Long....
-
- -------------------------[ Cut Here ]--------------------------
- }
-
- Unit screen;
-
- INTERFACE
-
- Uses dos, crt;
-
- Type
- scrp = ^scr;
- scr = array[1..25,1..80] of record
- ch : char;
- at : byte;
- end;
-
- { SCRP : Pointer to a screen record. Used to overlay video
- memory, and so you can create dynamic screens on
- the heap.
- SCR : An array of records that duplicates the video memory.
- You can read any position on the screen like this:
- Character_on_screen:= cscreen[y,x].ch;
- And write to a screen position like this:
- cscreen[y,x].ch:= Character_to_put_on_screen;
- And of course the color attributes would be:
- Attribute_on_screen:= cscreen[y,x].at;
- }
-
- Var
- cscreen : scr absolute $b800 : $0000;
-
- { Cscreen is overlaied on video memory, so it requires ZERO bytes
- of memory. This means what is on the screen is whats in the record
- and vica/versa. What you write to the record is on the screen as
- fast as the refresh rate of your monitor.
- }
-
- procedure setscrl(x1,y1,x2,y2 : byte);
- procedure getscrl(var x1,y1,x2,y2 : byte);
- procedure scrlup(b,f : byte);
- procedure scrldn(b,f : byte);
- procedure scrll(b,f : byte);
- procedure scrlr(b,f : byte);
-
-
- IMPLEMENTATION
-
- const
- setscrlx1 : byte = 1;
- setscrly1 : byte = 1;
- setscrlx2 : byte = 80;
- setscrly2 : byte = 25;
-
- var
- reg : registers;
-
- { The setscrl routine is just for convience. As the routines
- below will expect the upper-left and lower-right corners
- of your scroll window, why not set them once insted of
- every time you call the routine. As they are typed constants
- (see above) the defult window size (in 25X80 mode) is full
- screen, but can be set to any size.
- }
-
- procedure setscrl(x1,y1,x2,y2 : byte);
-
- begin
- setscrlx1:= x1;
- setscrly1:= y1;
- setscrlx2:= x2;
- setscrly2:= y2;
- end;
-
- { Getscrl is used to get the current scroll window size }
-
-
- procedure getscrl(var x1,y1,x2,y2 : byte);
-
- begin
- x1:= setscrlx1;
- y1:= setscrly1;
- x2:= setscrlx2;
- y2:= setscrly2;
- end;
-
- { Scrlup will scroll the scroll window (defigned by setscrl) up
- one line. The passed parameters "b" and "f" are the background
- and foreground colors to set the now blank line at the bottom
- of the scroll window.
- }
-
-
- procedure scrlup(b,f : byte);
-
- begin
- with reg do
- begin
- ah:= 6;
- al:= 1;
- bh:= ((b and 7) * 16) + (f and 15);
- ch:= setscrly1 - 1; cl:= setscrlx1 - 1;
- dh:= setscrly2 - 1; dl:= setscrlx2 - 1;
- end;
- intr(16,reg);
- end;
-
- { Scrldn will scroll the scroll window (defigned by setscrl) down
- one line. The passed parameters "b" and "f" are the background
- and foreground colors to set the now blank line at the top of
- the scroll window.
- }
-
- procedure scrldn(b,f : byte);
-
- begin
- with reg do
- begin
- ah:= 7;
- al:= 1;
- bh:= ((b and 7) * 16) + (f and 15);
- ch:= setscrly1 - 1; cl:= setscrlx1 - 1;
- dh:= setscrly2 - 1; dl:= setscrlx2 - 1;
- end;
- intr(16,reg);
- end;
-
- { Scrll will scroll the scroll window (defigned by setscrl) left
- one line. The passed parameters "b" and "f" are the background
- and foreground colors to set the now blank line at the left of
- the scroll window.
- }
-
- procedure scrll(b,f : byte);
-
- var
- x,y : byte;
-
- begin
- for y:= setscrly1 to setscrly2 do
- for x:= setscrlx1 to setscrlx2 - 1 do
- begin
- cscreen[y,x].at:= cscreen[y,x + 1].at;
- cscreen[y,x].ch:= cscreen[y,x + 1].ch;
- end;
-
- for y:= setscrly1 to setscrly2 do
- begin
- cscreen[y,setscrlx2].at:= b * 16 + f;
- cscreen[y,setscrlx2].ch:= #32;
- end;
- end;
-
- { Scrlr will scroll the scroll window (defigned by setscrl) rigth
- one line. The passed parameters "b" and "f" are the background
- and foreground colors to set the now blank line at the right of
- the scroll window.
- }
-
- procedure scrlr(b,f : byte);
-
- var
- x,y : byte;
-
- begin
- for y:= setscrly1 to setscrly2 do
- for x:= setscrlx2 downto setscrlx1 + 1 do
- begin
- cscreen[y,x].at:= cscreen[y,x - 1].at;
- cscreen[y,x].ch:= cscreen[y,x - 1].ch;
- end;
-
- for y:= setscrly1 to setscrly2 do
- begin
- cscreen[y,setscrlx1].at:= b * 16 + f;
- cscreen[y,setscrlx1].ch:= #32;
- end;
- end;
-
-
- end.