[Home]
[Edit this page]
[Recent Changes]
[Special Pages]
[Help]
DenTut4-Pas
Howdy all! Welcome to the fourth part of this trainer series! It's a little late, but I am sure you will find that the wait was worth it, becase today I am going to show you how to use a very powerful tool : Virtual Screens.
A virtual screen is this : a section of memory set aside that is exactly like the VGA screen on which you do all your working, then "flip" it on to your true screen. In EGA 640x350x16 you automatically have a virtual page, and it is possible to have up to four on the MCGA using a particular tweaked mode, but for our puposes we will set one up using base memory.
.
When you have finished your program, you will want to free the memory taken up by the virtual screen by doing the following :
You will
have noticed that we still can't actually SEE the virtual screen, so on to
the next part ...
Note that most of our other procedures may be altered to support the virtual screen, such as Cls etc. (see Part 1 of this series), using the methoods described above (I have altered the CLS procedure in the sample program given at the end of this Part.)
We of ASPHYXIA have used virtual screens in almost all of our demos. Can you imagine how awful the SoftelDemo would have looked if you had to watch us redrawing the moving background, text and vectorballs for EACH FRAME? The flicker, doubling effects etc would have made it awful! So we used a virtual screen, and are very pleased with the result. Note, though, that to get the speed we needed to get the demo fast enough, we wrote our sprites routines, flip routines, pallette routines etc. all in assembly. The move command is very fast, but not as fast as ASM
, so this is the first part of the trainer series ever
written before 9pm.
I have been asked to do a part on scrolling the screen, so that is probably what I will do for next week. Also, ASPHYXIA will soon be putting up a small demo with source on the local boards. It will use routines that we have discussed in this series, and demonstrate how powerful these routines can be if used in the correct manner.
See you next week - Denthor
[Edit this page] [Page history] [What links here] [Discuss this topic] [Printer Friendly]
DenTut4-Pas
ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
³ W E L C O M E ³
³ To the VGA Trainer Program ³ ³
³ By ³ ³
³ DENTHOR of ASPHYXIA ³ ³ ³
ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ; ³ ³
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
--==[ PART 4 ]==--
- Introduction
Howdy all! Welcome to the fourth part of this trainer series! It's a little late, but I am sure you will find that the wait was worth it, becase today I am going to show you how to use a very powerful tool : Virtual Screens.
- What is a Virtual Screen and why do we need it?
A virtual screen is this : a section of memory set aside that is exactly like the VGA screen on which you do all your working, then "flip" it on to your true screen. In EGA 640x350x16 you automatically have a virtual page, and it is possible to have up to four on the MCGA using a particular tweaked mode, but for our puposes we will set one up using base memory.
- Setting up a virtual screen
VAR Virtual : Array [1..64000] of byte;would be a no-no, as you wouldn't have any space for your other variables. What is the solution? I hear you enquiring minds cry. The answer : pointers! Pointers to not use up the base 64k allocated to you by TP 6.0, it gets space from somewhere else in the base 640k memory of your computer. Here is how you set them up :
Type Virtual = Array [1..64000] of byte; { The size of our Virtual Screen }
VirtPtr = ^Virtual; { Pointer to the virtual screen }
VAR Virscr : VirtPtr; { Our first Virtual screen }
Vaddr : word; { The segment of our virtual screen}
If you put this in a program as it stands, and try to acess VirScr, your
machine will probably crash. Why? Because you have to get the memory for
your pointers before you can acess them! You do that as follows :
Procedure SetUpVirtual; BEGIN GetMem (VirScr,64000); vaddr := seg (virscr^); END;This procedure has got the memory for the screen, then set vaddr to the screens segment. DON'T EVER LEAVE THIS PROCEDURE OUT OF YOUR PROGRAM! If you leave it out, when you write to your virtual screen you will probably be writing over DOS or some such thing. Not a good plan
When you have finished your program, you will want to free the memory taken up by the virtual screen by doing the following :
Procedure ShutDown; BEGIN FreeMem (VirScr,64000); END;If you don't do this your other programs will have less memory to use for themselves.
- Putting a pixel to your virtual screen
Procedure PutPixel (X,Y : Integer; Col : Byte); BEGIN Mem [VGA:X+(Y*320)]:=col; END;For our virtual screen, we do the following :
Procedure VirtPutPixel (X,Y : Integer; Col : Byte); BEGIN Mem [Vaddr:X+(Y*320)]:=col; END;It seems quite wasteful to have two procedures doing exactly the same thing, just to different screens, doesn't it? So why don't we combine the two like this :
Procedure PutPixel (X,Y : Integer; Col : Byte; Where : Word); BEGIN Mem [Where:X+(Y*320)]:=col; END;To use this, you will say something like :
Putpixel (20,20,32,VGA); PutPixel (30,30,64,Vaddr);These two statements draw two pixels ... one to the VGA screen and one to the virtual screen! Doesn't that make you jump with joy!
- How to "Flip" your virtual screen on to the true screen
Move (Virscr^,mem [VGA:0],64000);simple, eh? You may want to wait for a verticle retrace (Part 2) before you do that, as it may make the flip much smoother (and, alas, slower).
Note that most of our other procedures may be altered to support the virtual screen, such as Cls etc. (see Part 1 of this series), using the methoods described above (I have altered the CLS procedure in the sample program given at the end of this Part.)
We of ASPHYXIA have used virtual screens in almost all of our demos. Can you imagine how awful the SoftelDemo would have looked if you had to watch us redrawing the moving background, text and vectorballs for EACH FRAME? The flicker, doubling effects etc would have made it awful! So we used a virtual screen, and are very pleased with the result. Note, though, that to get the speed we needed to get the demo fast enough, we wrote our sprites routines, flip routines, pallette routines etc. all in assembly. The move command is very fast, but not as fast as ASM
- In closing
I have been asked to do a part on scrolling the screen, so that is probably what I will do for next week. Also, ASPHYXIA will soon be putting up a small demo with source on the local boards. It will use routines that we have discussed in this series, and demonstrate how powerful these routines can be if used in the correct manner.
Some projects for you to do :
1) Rewrite the flip statement so that you can say :
flip (Vaddr,VGA);
flip (VGA,Vaddr);
( This is how ASPHYXIAS one works )
2) Put most of the routines (putpixel, cls, pal etc.) into a unit,
so that you do not need to duplicate the procedures in each program
you write. If you need help, leave me mail.
See you next week - Denthor
[Edit this page] [Page history] [What links here] [Discuss this topic] [Printer Friendly]
