{ Hello, could somone tell me how to fade a screen out.. } { --------------------------------------------------------------------- } { Palette Unit (Text and Graphics modes) } { Author: Geoff Watts, 27-07-92 } { Usable Procedures: } { fadeup -- fade the palette up } { fadedown -- fade the palette down } { getpal256 -- fill the parameter Pal With the palette values } { setpal256 -- fill the palette values With the parameter Pal } { cpuType -- determines wether the cpu is 8086/88 or different } { --------------------------------------------------------------------- } Unit Palette; Interface Uses Dos; { structure in which the palette inFormation is stored } Type PaletteType = Array[0..255,1..3] of Byte; { 256 Red/Green/Blue (RGB) } Var OlPlt : PaletteType; { internal palette structure } { which contains the standard } { palette } SetPal256: Procedure (Var Pal : PaletteType); { the Procedure determined } { at run time } { Forward declarations } Procedure SetPal86 (Var Pal : PaletteType); Procedure SetPal286 (Var Pal : PaletteType); Procedure FadeUp; Procedure FadeDown; Function CpuType : Boolean; Implementation { GetPal256: Load Pal Structure With the 256 RGB palette values. } Procedure GetPal256 (Var Pal : PaletteType); Var loope : Word; begin port[$3C7] := 0; { when a read is made on port $3C9 it increment port $3C7 so no changing } { of the register port ($3C7) needs to be perFormed here } For loope := 0 to 255 do begin Pal[loope,1] := port[$3C9]; { Read red value } Pal[loope,2] := port[$3C9]; { Read green value } Pal[loope,3] := port[$3C9]; { Read blue value } end; end; { SetPal86: Loads the palette Registers With the values in Pal. 86/88 instructions. } Procedure SetPal86 (Var Pal : PaletteType); begin Asm push ds { preserve segment Registers } push es mov cx,256 * 3 { 256 RBG values } mov dx,03DAh { by waiting For the retrace to end it avoids static } { when the palette is altered } @retrace1: in al,dx { wait For no retrace } and al,8 { check For retrace } jnz @retrace1 { so loop Until it goes low } @retrace2: in al,dx { wait For retrace } and al,8 { check For retrace } jz @retrace2 { so loop Until it goes high } lds si, Pal { ds:si = @Pal } mov dx,3c8h { set up For a blitz-white } mov al,0 { from this register } cli { disable interrupts } out dx,al { starting register } inc dx { set up to update DAC } cld { clear direction flag } @outnext: { the following code is what I have found to be the } { most efficient way to emulate the "rep outsb" } { instructions on the 8086/88 } lodsb { load al With ds:[si] } out dx,al { out al to port in dx } loop @outnext { loop cx times } sti { end of critical section } pop es pop ds { restore segment Registers } end; end; {$G+} { turn on 286 instruction generation } { --------------------------------------------------------------------- } { Palette Unit (Text and Graphics modes) } { --------------------------------------------------------------------- } { SetPal286: Loads the palette Registers With the values in Pal. 286+ instructions. } Procedure SetPal286 (Var Pal : PaletteType); begin Asm push ds { preserve segment Registers } push es mov cx,256 * 3 { 256 RBG values } mov dx,03dah { by waiting For the retrace to end it avoids static } { when the palette is altered } @retrace1: in al,dx { wait For no retrace } and al,8 { check For retrace } jnz @retrace1 { so loop Until it goes low } @retrace2: in al,dx { wait For retrace } and al,8 { check For retrace } jz @retrace2 { so loop Until it goes high } lds si, Pal { ds:si = @Pal } mov dx,3c8h { set up For a blitz-white } mov al,0 { from this register } cli { disable interrupts } out dx,al { starting register } inc dx { set up to update DAC } cld { clear direction flag } rep outsb { 768 multiple out's } { rapid update acheived } sti { end of critical section } pop es pop ds { restore segment Registers } end; { Asm } end; { SetPal286 } {$G-} { turn off 286 instructions } { fadedown: fades the palette down With little or no static } Procedure fadedown; Var Plt : PaletteType; i, j, k : Integer; begin plt := olplt; For k := 0 to 63 do begin For j := 0 to 255 do For i := 1 to 3 do if Plt[j,i] <> 0 then dec(Plt[j,i]); { decrease palette numbers gradually } SetPal256(Plt); { gradually fade down the palette } end; end; { fadeup: fades the palette up With little or no static } Procedure fadeup; Var Plt : PaletteType; i, j, k : Integer; begin GetPal256(Plt); { Load current palette } For k := 1 to 63 do begin For j := 0 to 255 do For i := 1 to 3 do if Plt[j,i] <> OlPlt[j,i] then inc(Plt[j,i]); { bring palette back to the norm } SetPal256(Plt); { gradually fades up the palette } { to the normal values } end; end; { CpuType: determines cpu Type so that we can use 286 instructions } Function CpuType : Boolean; Var cpu : Byte; begin Asm push sp pop ax cmp sp,ax { stack Pointer treated differently on } je @cpu8086 { the 8086 Compared to all others } mov cpu,0 jmp @cpufound @cpu8086: mov cpu,1 @cpufound: end; { Asm } cpuType := (cpu = 1); end; begin { determine the cpu Type so that we can use faster routines } if CpuType then SetPal256 := SetPal286 else SetPal256 := SetPal86; { load the standard palette } GetPal256(OlPlt); end.