ΥΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΈ
³                                                                           ³
³  *****  FadeCode         *****                                            ³
³                                                                           ³
³    By Esak     (Aug 19, 1994)                                             ³
ΤΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΎ

ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ
A sad legal ***p

  I make no warranty whatsoever regarding this product. I assume no 
 responsiblity for any malicious impact on you, your computer, your red 
 blood cell production, or the sanity of the presidential candidate you 
 supported during the last election, made by the use or misuse of this 
 product.
ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ


Hi there,

  I decided to release the code for a number of different palette effects. 
I will be the first to admit that it's not a Future Crew demo source code, 
or anything vaguely close to earth-shattering. But I belive this release may 
be useful to some beginning programmers. Learn from it if you can. Rip this 
off if you want. You may even include source in your own library as long as 
your library is a freeware as well. I won't ask for any credit. I am not 
overly proud for this release anyway. But if you find this useful, a 
postcard would be nice, though.


ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ
Files
ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ
FADE_C.C            It contains higher level interface routines which calls 
		    some of the routines included in FADE.ASM.
FADE.ASM            This is the main module that contains a bunch of
		    palette manipulating routines. 
*.OBJ               OBJ files. Compiled for large model.
MODEL.INC           Include file for FADE.ASM
		    Change this if you would like to compile under a 
		    different memory model. 
FADE.H              Header file for C


FADEDEMO.C          A sample program demonstrating the use of the included
		    functions. Link with FADE_C.C and FADE.ASM.
FADEDEMO.PRJ        Project file I used to link this program.
FADEDEMO.EXE        The executable.


SCREEN.RAW          320*200 raw image file used by FADEDEMO
PAL1.pal            palette file used by FADEDEMO
PAL2.pal            palette file used by FADEDEMO

READMEOR.ELS        You are reading this.
README.1st          You read it before.


ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ
A quick intro to VGA palette format (For a newbie)
ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ
You (hopefully) know a VGA card can use 256 color at once. A VGA card 
needs three bytes of information for each color. One byte for red
intensity. One byte for green intensity. And one byte for blue intensity.
So data for a complete 256 color VGA color palette amounts to 768 bytes
total.
 However, only six bit from each byte is used. So each byte can have a
value between 0..63.
 Well, that's all I can and need to tell you now.


ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ
Bresenham Algorithm
ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ
One of the tricky problems that arise as you program palette fading is:
  SMOOTH TRANSITION FROM ONE COLOR TO ANOTHER

Simulating fade in etc, requires smooth transition from one color to
another. I have seen someone using floating point math to do this. For
graphic coders, floating point math is an evil that must be avoided.
  So what's the solution? The famous/infamous Bresenham Algorithm. This
is commonly known as line algorithm, but this algorithm pops up almost
every corner in graphics programming world.
  Let's say you need to change the value of a byte from 2 to 23. And you must
do changing 32 times. With floating math, it would be

  the_byte=0;
 loop 32 times begin
  the_byte=the_byte+43/23
 loop end

  However, using Bresenham algorithm, it would be:

  the_byte=2
  Decision_variable=0
  loop 32 times begin 
   Decision_variable=Decision_variable+(23-2)
   if Decision_variable<32 
    begin
     the_byte=the_byte+1
     Decision_variable=Decision_variable-32
    end
  loop end

 It may look more complicated. But using B-algorithm is a LOT faster than
using floating point math. But as you can see, we need one more decision
variable for each variable we want to change. Therefore, many of the routines included
here use additional 768 bytes to implement smooth color transition.



ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ
Functions in FADE_C.C
ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ

 void fade_screen(void far *pal)
   >it calls fade_once() 32 times.
   >the content of the palette array is not preserved.

 void fade_in_screen(void far *pal)
   >it calls fade_in_once() 32 times.
   >the content of the palette array is preserved.

 void bright_screen(void far *pal)
   >it calls bright_once() 32 times
   >the content of the palette array is not preserved.

 void bright_in_screen(void far *pal)
   >it calls bright_in_once() 32 times
   >the content of the palette array is preserved.

 void fade_between_screen(void far *pal,void far *pal_dest)
   >It call fade_between_once() 64 times
   >pal[] and pal_dest[] both have to be 768 bytes (chars) long
   >The content of neither palette array is preserved. However, the
    content of pal_dest[] will be moved to pal[].

Please look at FADEDEMO.C to get a better idea of how to use the routines
in FADE_C.C.



ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ
Functions in FADE.ASM
ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ


 void setPal(void far *pal)
   >*pal points to an array of 768 bytes (chars) that contains

 void fill_pal(void far *pal,char red, char green,char blue);
   >Fills the palette array with the given color information

 void copy_pal(void far *pal,void far *pal_dest);
   >Copies one palette to another

 void rotate_pal(void far *pal,char index,char numCol, char displacement);
   >Note this carefully.
   >This routine DOES preserve the content of pal[]
   >Let me give you some examples to explain how this routine works.

   >rotate_pal(&pal,63,32,0);
    This routine will update palette number from 63-95.
    But no rotation will take place

   >rotate_pal(&pal,63,32,1);
    This routine will also update palette number from 63-95.
    But this time, the color #64 will replace the content of color #63
    and color #65 will replace #66 etc.


 void sub_palette(void far *pal,void far *pal_dest);
   >Subtracts one palette from another. You have to call this function
   >before calling fade_between_once() If you are not going to call 
   >fade_between_once() directly, you have no business calling this 
   >routine.


In most cases, you WON'T have to call the following functions.
I will explain when you have to use these functions. Please look at
FADE_C.C. That would be the best way to learn how to use the following
functions.

 void fade_out_once(void far *pal)
   >Changes the content of the palette array
   >Should be called 32 times to turn the screen completely black.

 void bright_out_once(void far *pal)
   >ditto

 void fade_in_once(void far *pal,void far *pal_dest)
   >ditto
   >*pal shoul point to an array of 768*2 *BLANK* chars, not 768 chars.
   >The second half of pal[768*2] will be used as decision variables
    for Bresenham algorithm.
   >After calling it 32 times, the content of pal[] will be identical
    to the content of pal_dest[]

 void fade_between_once(void far *pal,void far *pal_dest)
   >sub_palette() must be called before calling this function.
   >*pal shoul point to an array of 768*2 chars, not 768 chars.
   >The second half of pal[768*2] will be used as decision variables
    for Bresenham algorithm.
   >After calling it 32 times, the content of pal[] will be identical
    to the content of pal_dest[]


You have to use a *something*_once() routines when you want to
update palette while animating at the same time. What you do is something
like this:

n=32;
do
  animate_sprite_or_whatever();
  ....
  if(n>0)
   fade_once(&pal);
   n=n-1;
  ....
while (not_finished)



ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ
What's to be done.
ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ
First of all, all of the routines included in this file change entire
256 color palette. I didn't write routines which can be used to change
a portion of palette. For most applications, you won't have to. (Especially
since these routine run snow-free on every machine I tested so far.)
  But if you need to, I will leave this task for asn exercize for you. If
you are a half-way descent ASM programmer, it wouldn't be hard.
  Beside, that's what source code is for: to modify. Well, I admit that my
assembly routines could use more documentation, though.
  If anyone ports these codes to 32bit Pmode, please let me know.



ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ
To fellow coders
ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ

I have a very fast local bus VGA card. This toy allowed me to play _Strike
Commander_ on my 486/25. The problem is that many games demos exhibit
intolerable amount of snow when they change palette.

I see strong evidences that many programmers are still sending palette data
byte by byte. (out dx,al) I use this command instead.

    rep   outsb

This rep outsb command format has been around since 80286 came out. For
Christssake, use it!
 I update 128 colors (384 bytes) at once and I get no snow on my video card.
(Updating 256 color at once gave me little snow, though.)

I am getting sick and tired of seeing snow on so many games and demos (Except
for some exceptions like _Zone66_.) If you don't want to use my routine for
palette fading, at least use rep outsb for updating palette.



ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ
About me
ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ
I am a first year computer engineering student (will be a sophomore in
a couple of weeks) attending Carnegie Mellon University, Pittsburgh,
Pennsylvania, USA, North America, Earth, Solar System, Milky Way..
(DAMN, I hate that joke. But this stupid joke always keeps coming back to
my mind..)

Uh well. Anyways, the surest and fastest way to reach me would be through the
Internet.
 My internet e-mail address is:
  Esak+@cmu.edu


Let me know if you have any problems, questions, comments, etc. I will
do my best to reply, but don't get upset if you don't get any. Flames,
outrageous requests, and questions like "I don't know C. What can I do?"
etc, will most likely be ignored. If you need a coder or an artist, don't
hesistate to contact me, especially if it's a paying job. |-)


If you don't have an internet account, or would like to send me a postcard,
a Lamborghini, a chunk of fissionable material, or an alien facehugger, use
the following address. (Valid for 1994-95 school year)

   1060 MOREWOOD AVE.
   Box No. 1504
   PITTSBURGH PA 15213
   USA


The alternate mailing address follows. It's the address of my uncle and
aunt's home.
Just make sure you use my real name (Hyun Yim) so they can forward the mails
correctly.

   37 Blanan Drive
   Chicopee, MA 01020-4803
   USA



Excuse any spelling or grammatical or logical errors.
English is not my first language and it's hard to think clearly at 5:00AM.

Thanks to Draeden of VLA. I didn't use his routines. But his palette
rotation code gave me the idea to code my own.

What else... oh yeah, I used TC++3.0 and TASM 4.0. Use /m2 option when
compiling with TASM.

Well, that's it for now. Watch out for my first game which will be released
sometime before the end of this millenium.


Esak (aka Hyun Yim aka Attila the Hyun)

ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ

My friends are toys. I make them.

  - JF Sebastian, from _BladeRunner_



My sister and I were driving along the other day when she asked me, what
would I like for my computer.
    I thought long and hard about it, and came up with the following
hypothesis. When a girl gets a Barbie doll, she then wants the extra 
ballgown for the doll, then the hairbrush, and the car, and the house, 
and the friends etc.
    When a guy gets a computer, he wants the extra memory, the bigger 
hard drive, the maths co-pro, the better motherboard, the latest software, 
and the bigger monitor etc.
    I told my sister all of this, and finished up with : "So as you can 
see, computers are Barbie dolls for MEN!"
    She called me a chauvinist. And hit me. Hard.

   - Grant Smith, aka DENTHOR of Asphyxia
