[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]
{
There is no such thing as an ANSI card. I assume you mean VGA's CGA
text mode emulation? A VGA is VGA is VGA, text mode or graphics. The
CGA emulation only goes as far as the BIOS. Fading out is easy:
}
var All_RGB : array[1..256*3] of byte;
Procedure FadeOut;
Label OneCycle,ReadLoop,DecLoop,Continue,Retr,Wait,Retr2,Wait2;
Begin { FadeOut }
Asm
MOV CX,64
OneCycle:
MOV DX,3DAh
Wait: IN AL,DX
TEST AL,08h
JZ Wait
Retr: IN AL,DX
TEST AL,08h
JNZ Retr
MOV DX,03C7h
XOR AL,AL
OUT DX,AL
INC DX
INC DX
XOR BX,BX
ReadLoop:
IN AL,DX
MOV Byte Ptr All_RGB[BX],AL
INC BX
CMP BX,256*3
JL ReadLoop
XOR BX,BX
DecLoop:
CMP Byte Ptr All_RGB[BX],0
JE Continue
DEC Byte Ptr All_RGB[BX]
Continue:
INC BX
CMP BX,256*3
JL DecLoop
MOV DX,3DAh
Wait2: IN AL,DX
TEST AL,08h
JZ Wait2
Retr2: IN AL,DX
TEST AL,08h
JNZ Retr2
MOV DX,03C8h
MOV AL,0
OUT DX,AL
INC DX
MOV SI,OFFSET All_RGB
CLD
PUSH CX
MOV CX,256*3
REP OUTSB
POP CX
LOOP OneCycle
End;
End; { FadeOut }
That code may be used in any VGA color mode, text or graphics. Even
though it fades all 256 color registers, it will work for the 16 color
modes. You could change it to just fade the first 16 registers (change
all 256*3 to 16*3), but why? As is, this code can be used in all
standard modes.
Fading in is a bit more complex. Since you mentioned ANSI screens, I
assume you want to fade into the CGA text mode pallette. You can get
this pallete by switching to graphics mode, switching back into text
mode, then read the first 16 pallete entries into a [1..16*3] array on
program start up. When you switch into text mode using the VGA BIOS,
the BIOS assumes you want CGA compatibility, so it will initialize the
pallete with the CGA colors and sets the font to the CGA character set.
Once this is done however, the card behaves like the VGA that it is.
After you have stored the pallete values, zero out the pallete. Now,
copy your ANSI to the screen. After you have done this, you will
basically do the opposite of the fade out routine, incrementing each
color part until it reaches the stored value. Remember to wait for
retrace after incrementing the entire pallete. Use a temp array to
store your pallete values so you do not have to read in the pallete with
each loop. You can easily change the DecLoop: section of the above code
to do the fading in. Compare the value from the temp array to the value
in the CGA pallete array (the one you created at program start up)
instead of 0. Change the dec to inc. You also need to change all the
256*3's to 16*3 since you are only working with 16 pallete entries. The
rest of them are undefined when you do that switch, so there's no need
of fading them in. If you have called your pallete CGA_RGB, the changes
to the fade code would look like:
DecLoop:
CMP Byte Ptr All_RGB[BX], Byte Ptr CGA_RGB[BX]
JE Continue
INC Byte Ptr All_RGB[BX]
Of course you do not HAVE to use the CGA color pallete. You can set
your final pallete values to anything you wish, provided they are all
different (or you may have some invisible text due to
background=foreground) for some interesting results. The format for the
pallete array is:
red0, green0, blue0,
red1, green1, blue1,
etc.
They may vary between 0 and 63 inclusive. Color 0 should normally be
black (0,0,0). White would be (63,63,63); this is color 15 by default.
Bright red is (63,0,0), dull red could be (32,0,0), but I'm not sure of
the actual value. If you're curious, it's color 4. Note, however, that
if you change the final pallete values from the CGA values, your "ANSI"
screens will techincally no longer be ANSI. You can get the CGA values
back by changing to graphics mode, then back into text mode on program
exit.
Note that the viewer of your magazine must have a 100% VGA compatible
card for any of the above to work.
BM> And if someone out there wants to be an even greater help, could you
BM> please post in some code that has scrolling ansi and stuff, cuz that
BM> would look really good on my title screen, if i had nice smooth moving
BM> graphics (ansi)
Use the BIOS putchar function instead of a direct screen write. If
using the CRT unit and write(), set directvideo := false.
BM> So if there is someone out there who has either or both of those codes
BM> that i need can you please post them in a message to me.
Of course, I don't know how much you know about VGA programming. If any
or all of this was over your head, let me know. I have a feeling you
may need some code to get the pallete entries, but this message is
getting too long, especially since I don't know how much you know.
Mike Phillips
INTERNET: phil4086@utdallas.edu
[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]