{ Here is some fade code. It works in graphics mode as well as text mode. I have tested it in 80x25 color text mode and 320 x 200 x 256 color graphics mode (Standard VGA) The Fade unit is followed by example test program that shows fading in text mode. If anyone wants a example for fading in graphics mode, E-MAIL me. The only thing I ask you for using this code is that you E-MAIL me to tell me what you are using it in. (Well, maybe you could give me a little credit in the documentation of your program) I didn't write the SetPalette and GetPalette routines so I don't know what the commented out CLIs and STIs are for. My E-MAIL address is ericbrodsky@pslc.psl.wisc.edu {------------------------------------------------------------------------} {$R-} {Range checking off (Helps the fade speed)} {$G+} {286 instructions must be enabled} unit Fade; interface type TColor = record R, G, B: byte; end; TPalette = array [0..255] of TColor; Proc = procedure; {Passed to fade procedures} procedure SetPalette(Pal: TPalette; First, Last: word); procedure GetPalette(var Pal: TPalette; First, Last: word); procedure BlackenPalette(First, Last: word); {Blackens all colors from First to Last. Make sure you have the} {palette saved in a variable.} procedure FadeIn(Pal: TPalette; First, Last: Word; Speed: byte; AProc: pointer); {AProc is called each palette step} procedure FadeOut(Pal: TPalette; First, Last: Word; Speed: byte; AProc: pointer); {AProc is called each palette step} implementation procedure SetPalette(Pal: TPalette; First, Last: word); assembler; asm MOV DX, 03DAh @Rt: IN AL, DX { wait for no retrace } TEST AL, 8 { this bit is high during a retrace } JZ @Rt { so loop until it goes high } MOV CX, [Last] { CX = last colour to set } MOV AX, [First] { AX = first colour to set } SUB CX, AX INC CX { CX = number of colours to set } MOV DX, 03C8h { Palette Address register } {CLI} OUT DX, AL { set starting register } INC DX { Palette Data register } PUSH DS LDS SI, [Pal] { DS:SI -> palette } ADD SI, AX ADD SI, AX ADD SI, AX { DS:SI -> first entry to set } MOV AX, CX { triple the value in CX } ADD CX, AX ADD CX, AX { CX = total number of bytes to write } REP OUTSB { write palette } {STI} POP DS end; procedure GetPalette(var Pal: TPalette; First, Last: word); assembler; asm MOV CX, [Last] { CX = last colour } MOV AX, [First] { AX = starting colour } SUB CX, AX INC CX { CX = number of colours } MOV DX, 03C7h { Palette Address register } {CLI} OUT DX, AL { set starting register } INC DX INC DX { DX = Palette Data register } LES DI, [Pal] { ES:DI -> palette } ADD DI, AX ADD DI, AX ADD DI, AX { ES:DI -> first entry to read } MOV AX, CX { triple the value in CX } ADD CX, AX ADD CX, AX { CX = total number of bytes to read } REP INSB { Read palette } {STI} end; procedure BlackenPalette(First, Last: word); var Pal: TPalette; i: word; begin for i := First to Last do begin Pal[i].R := 0; Pal[i].G := 0; Pal[i].B := 0; end; SetPalette(Pal, First, Last); end; procedure FadeIn(Pal: TPalette; First, Last: Word; Speed: byte; AProc: pointer); var i, j : Byte; TempPal : TPalette; begin for i := 0 to Speed do begin for j := First to Last do begin TempPal[j].R := Pal[j].R * i div Speed; TempPal[j].G := Pal[j].G * i div Speed; TempPal[j].B := Pal[j].B * i div Speed; end; Setpalette(TempPal, First, Last); if (AProc <> nil) then Proc(AProc); end; end; procedure FadeOut(Pal: TPalette; First, Last: Word; Speed: byte; AProc: pointer); var i, j : Byte; TempPal : TPalette; begin TempPal := Pal; for i := Speed downto 0 do begin for j := First to Last do begin TempPal[j].R := Pal[j].R * i div Speed; TempPal[j].G := Pal[j].G * i div Speed; TempPal[j].B := Pal[j].B * i div Speed; end; Setpalette(TempPal, First, Last); if (AProc <> nil) then Proc(AProc); end; end; end. {---------------------------------------------------------------------} program FadeTest; uses CRT, Fade; const FadeSpeed1 = 64; FadeSpeed2 = 64; var Pal : TPalette; i : longint; procedure aProcedure; far; {This procedure will be called every fade step} begin Inc(i); writeln('Test 2 of Ethan Brodsky''s fade routines: Fade Step #', i); end; begin GetPalette(Pal, 0, 255); {Test part 1} BlackenPalette(0, 255); writeln('Test 1 of Ethan Brodsky''s fade routines'); FadeIn(Pal, 0, 255, FadeSpeed1, nil); FadeOut(Pal, 0, 255, FadeSpeed1, nil); FadeIn(Pal, 0, 255, FadeSpeed1, nil); writeln('Press any key to continue . . .'); repeat until KeyPressed; {Test part 2} i := 0; FadeOut(Pal, 0, 255, FadeSpeed2, @aProcedure); i := 0; FadeIn(Pal, 0, 255, FadeSpeed2, @aProcedure); end.