4016 lines
87 KiB
NASM
4016 lines
87 KiB
NASM
;
|
|
; Copyright 2020 Electronic Arts Inc.
|
|
;
|
|
; TiberianDawn.DLL and RedAlert.dll and corresponding source code is free
|
|
; software: you can redistribute it and/or modify it under the terms of
|
|
; the GNU General Public License as published by the Free Software Foundation,
|
|
; either version 3 of the License, or (at your option) any later version.
|
|
|
|
; TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed
|
|
; in the hope that it will be useful, but with permitted additional restrictions
|
|
; under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT
|
|
; distributed with this program. You should have received a copy of the
|
|
; GNU General Public License along with permitted additional restrictions
|
|
; with this program. If not, see [https://github.com/electronicarts/CnC_Remastered_Collection]>.
|
|
|
|
;***************************************************************************
|
|
;** C O N F I D E N T I A L --- W E S T W O O D A S S O C I A T E S **
|
|
;***************************************************************************
|
|
;* *
|
|
;* Project Name : Command & Conquer *
|
|
;* *
|
|
;* File Name : KEYFBUFF.ASM *
|
|
;* *
|
|
;* Programmer : David R. Dettmer *
|
|
;* *
|
|
;* Start Date : March 3, 1995 *
|
|
;* *
|
|
;* Last Update : *
|
|
;* *
|
|
;*-------------------------------------------------------------------------*
|
|
;* Functions: *
|
|
;* Buffer_Frame_To_Page -- Copies a linear buffer to a virtual viewport *
|
|
;* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *
|
|
|
|
;********************** Model & Processor Directives ***********************
|
|
;IDEAL
|
|
;P386
|
|
;MODEL USE32 FLAT
|
|
;jumps
|
|
|
|
.MODEL FLAT
|
|
;.386
|
|
|
|
;******************************** Includes *********************************
|
|
;INCLUDE "gbuffer.inc"
|
|
;include "profile.inc"
|
|
|
|
OPTIMAL_BYTE_COPY equ 14
|
|
|
|
GraphicViewPort STRUCT
|
|
GVPOffset DD ? ; offset to virtual viewport
|
|
GVPWidth DD ? ; width of virtual viewport
|
|
GVPHeight DD ? ; height of virtual viewport
|
|
GVPXAdd DD ? ; x mod to get to next line
|
|
GVPXPos DD ? ; x pos relative to Graphic Buff
|
|
GVPYPos DD ? ; y pos relative to Graphic Buff
|
|
GVPPitch dd ? ; modulo of graphic view port
|
|
GVPBuffPtr DD ? ; ptr to associated Graphic Buff
|
|
GraphicViewPort ENDS
|
|
|
|
;******************************** Equates **********************************
|
|
|
|
TRUE equ 1 ; Boolean 'true' value
|
|
FALSE equ 0 ; Boolean 'false' value
|
|
|
|
;*=========================================================================*/
|
|
;* The following are defines used to control what functions are linked *
|
|
;* in for Buffer_Frame_To_Page. *
|
|
;*=========================================================================*/
|
|
;USE_NORMAL EQU TRUE
|
|
;USE_HORZ_REV EQU TRUE
|
|
;USE_VERT_REV EQU TRUE
|
|
;USE_SCALING EQU TRUE
|
|
|
|
|
|
FLAG_NORMAL EQU 0
|
|
FLAG_TRANS EQU 1
|
|
FLAG_GHOST EQU 2
|
|
FLAG_FADING EQU 4
|
|
FLAG_PREDATOR EQU 8
|
|
|
|
FLAG_MASK EQU 0Fh
|
|
|
|
|
|
SHAPE_NORMAL EQU 0000h ; Standard shape
|
|
;SHAPE_HORZ_REV EQU 0001h ; Flipped horizontally
|
|
;SHAPE_VERT_REV EQU 0002h ; Flipped vertically
|
|
;SHAPE_SCALING EQU 0004h ; Scaled (WORD scale_x, WORD scale_y)
|
|
;SHAPE_VIEWPORT_REL EQU 0010h ; Coords are window-relative
|
|
;SHAPE_WIN_REL EQU 0010h ; Coordinates are window relative instead of absolute.
|
|
SHAPE_CENTER EQU 0020h ; Coords are based on shape's center pt
|
|
SHAPE_TRANS EQU 0040h ; has transparency
|
|
|
|
SHAPE_FADING EQU 0100h ; Fading effect (VOID * fading_table,
|
|
; WORD fading_num)
|
|
SHAPE_PREDATOR EQU 0200h ; Transparent warping effect
|
|
;SHAPE_COMPACT EQU 0400h ; Never use this bit
|
|
;SHAPE_PRIORITY EQU 0800h ; Use priority system when drawing
|
|
SHAPE_GHOST EQU 1000h ; Shape is drawn ghosted
|
|
;SHAPE_SHADOW EQU 2000h
|
|
SHAPE_PARTIAL EQU 4000h
|
|
;SHAPE_COLOR EQU 8000h ; Remap the shape's colors
|
|
; (VOID * color_table)
|
|
|
|
|
|
;
|
|
;.......................... Shadow Effect ..................................
|
|
;
|
|
SHADOW_COL EQU 00FFh ; magic number for shadows
|
|
|
|
;......................... Priority System .................................
|
|
;
|
|
CLEAR_UNUSED_BITS EQU 0007h ; and with 0000-0111 to clear
|
|
; non-walkable high bit and
|
|
; scaling id bits
|
|
NON_WALKABLE_BIT EQU 0080h ; and with 1000-0000 to clear all
|
|
; but non-walkable bit
|
|
;
|
|
;......................... Predator Effect .................................
|
|
;
|
|
;PRED_MASK EQU 0007h ; mask used for predator pixel puts
|
|
PRED_MASK EQU 000Eh ; mask used for predator pixel puts
|
|
|
|
|
|
;---------------------------------------------------------------------------
|
|
;
|
|
; Use a macro to make code a little cleaner.
|
|
; The parameter varname is optional.
|
|
; Syntax to use macro is :
|
|
; WANT equ expression
|
|
; USE func [,varname]
|
|
; If the 'varname' is defined, a table declaration is created like:
|
|
; GLOBAL TableName:DWORD
|
|
; Then, the table entry is created:
|
|
; If WANT is true, the table entry is created for the given function:
|
|
; varname DD func
|
|
; If WANT is not TRUE, a Not_Supported entry is put in the table:
|
|
; varname DD Not_Supported
|
|
; The resulting tables look like:
|
|
;
|
|
; GLOBAL ExampTable:DWORD
|
|
; ExampTable DD routine1
|
|
; DD routine2
|
|
; DD routine3
|
|
; ...
|
|
; Thus, each table is an array of function pointers.
|
|
;
|
|
;---------------------------------------------------------------------------
|
|
USE MACRO func, varname
|
|
IF WANT
|
|
varname DD func
|
|
ELSE
|
|
varname DD Not_Supported
|
|
ENDIF
|
|
ENDM
|
|
|
|
prologue macro
|
|
endm
|
|
|
|
|
|
|
|
epilogue macro
|
|
endm
|
|
|
|
|
|
; IFNB <varname>
|
|
; GLOBAL varname:DWORD
|
|
; ENDIF
|
|
|
|
;---------------------------------------------------------------------------
|
|
|
|
|
|
.DATA
|
|
|
|
;---------------------------------------------------------------------------
|
|
; Predator effect variables
|
|
;---------------------------------------------------------------------------
|
|
; make table for negative offset and use the used space for other variables
|
|
|
|
BFPredNegTable DW -1, -3, -2, -5, -2, -4, -3, -1
|
|
; 8 words below calculated
|
|
DW 0, 0, 0, 0, 0, 0, 0, 0 ; index ffffff00
|
|
DD 0, 0, 0, 0 ; index ffffff10
|
|
BFPredOffset DD 0, 0, 0, 0 ; index ffffff20
|
|
DD 0, 0, 0, 0 ; index ffffff30
|
|
; partially faded predator effect value
|
|
BFPartialPred DD 0, 0, 0, 0 ; index ffffff40
|
|
BFPartialCount DD 0, 0, 0, 0 ; index ffffff50
|
|
DD 0, 0, 0, 0 ; index ffffff60
|
|
DD 0, 0, 0, 0 ; index ffffff70
|
|
DD 0, 0, 0, 0 ; index ffffff80
|
|
DD 0, 0, 0, 0 ; index ffffff90
|
|
DD 0, 0, 0, 0 ; index ffffffa0
|
|
DD 0, 0, 0, 0 ; index ffffffb0
|
|
DD 0, 0, 0, 0 ; index ffffffc0
|
|
DD 0, 0, 0, 0 ; index ffffffd0
|
|
DD 0, 0, 0, 0 ; index ffffffe0
|
|
DD 0, 0, 0, 0 ; index fffffff0
|
|
BFPredTable DW 1, 3, 2, 5, 2, 3, 4, 1
|
|
;BFPredTable DB 1, 3, 2, 5, 4, 3, 2, 1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
extern C BigShapeBufferStart:dword
|
|
extern C UseBigShapeBuffer:dword
|
|
extern C TheaterShapeBufferStart:dword
|
|
extern C IsTheaterShape:dword
|
|
;extern C Single_Line_Trans_Entry:near
|
|
;extern C Next_Line:near
|
|
extern C MMX_Done:near
|
|
extern C MMXAvailable:dword
|
|
;extern C EndNewShapeJumpTable:byte
|
|
;extern C NewShapeJumpTable:dword
|
|
|
|
|
|
;**********************************************************************************
|
|
;
|
|
; Jump tables for new line header system
|
|
;
|
|
; Each line of shape data now has a header byte which describes the data on the line.
|
|
;
|
|
|
|
;
|
|
; Header byte control bits
|
|
;
|
|
BLIT_TRANSPARENT =1
|
|
BLIT_GHOST =2
|
|
BLIT_FADING =4
|
|
BLIT_PREDATOR =8
|
|
BLIT_SKIP =16
|
|
BLIT_ALL =BLIT_TRANSPARENT or BLIT_GHOST or BLIT_FADING or BLIT_PREDATOR or BLIT_SKIP
|
|
|
|
|
|
ShapeHeaderType STRUCT
|
|
|
|
draw_flags dd ?
|
|
shape_data dd ?
|
|
shape_buffer dd ?
|
|
|
|
ShapeHeaderType ENDS
|
|
|
|
|
|
|
|
;
|
|
; Global definitions for routines that draw a single line of a shape
|
|
;
|
|
;extern Short_Single_Line_Copy:near
|
|
;extern Single_Line_Trans:near
|
|
;extern Single_Line_Ghost:near
|
|
;extern Single_Line_Ghost_Trans:near
|
|
;extern Single_Line_Fading:near
|
|
;extern Single_Line_Fading_Trans:near
|
|
;extern Single_Line_Ghost_Fading:near
|
|
;extern Single_Line_Ghost_Fading_Trans:near
|
|
;extern Single_Line_Predator:near
|
|
;extern Single_Line_Predator_Trans:near
|
|
;extern Single_Line_Predator_Ghost:near
|
|
;extern Single_Line_Predator_Ghost_Trans:near
|
|
;extern Single_Line_Predator_Fading:near
|
|
;extern Single_Line_Predator_Fading_Trans:near
|
|
;extern Single_Line_Predator_Ghost_Fading:near
|
|
;extern Single_Line_Predator_Ghost_Fading_Trans:near
|
|
;extern Single_Line_Skip:near
|
|
|
|
;extern Single_Line_Single_Fade:near
|
|
;extern Single_Line_Single_Fade_Trans:near
|
|
|
|
;externdef AllFlagsJumpTable:dword
|
|
;
|
|
externdef NewShapeJumpTable:dword
|
|
externdef EndNewShapeJumpTable:byte
|
|
externdef CriticalFadeRedirections:dword
|
|
;externdef BufferFrameTable:dword
|
|
|
|
;externdef CriticalFadeRedirections:dword
|
|
;externdef CriticalFadeRedirections:dword
|
|
;externdef CriticalFadeRedirections:dword
|
|
;externdef BF_Copy:far ptr
|
|
;externdef BF_Trans:dword
|
|
;externdef BF_Ghost:dword
|
|
;externdef BF_Ghost_Trans:dword
|
|
;externdef BF_Fading:dword
|
|
;externdef BF_Fading_Trans:dword
|
|
;externdef BF_Ghost_Fading:dword
|
|
;externdef BF_Ghost_Fading_Trans:dword
|
|
;externdef BF_Predator:dword
|
|
;externdef BF_Predator_Trans:dword
|
|
;externdef BF_Predator_Ghost:dword
|
|
;externdef BF_Predator_Ghost_Trans:dword
|
|
;externdef BF_Predator_Fading:dword
|
|
;externdef BF_Predator_Fading_Trans:dword
|
|
;externdef BF_Predator_Ghost_Fading:dword
|
|
;externdef BF_Predator_Ghost_Fading_Trans:dword
|
|
|
|
externdef C Single_Line_Trans:near
|
|
externdef C Single_Line_Trans_Entry:near
|
|
externdef C Next_Line:near
|
|
|
|
|
|
.CODE
|
|
|
|
|
|
;---------------------------------------------------------------------------
|
|
; Code Segment Tables:
|
|
; This code uses the USE macro to set up tables of function addresses.
|
|
; The tables have the following format:
|
|
; Tables defined are:
|
|
; BufferFrameTable
|
|
;---------------------------------------------------------------------------
|
|
|
|
WANT equ <TRUE>
|
|
USE BF_Copy, BufferFrameTable
|
|
|
|
WANT equ <TRUE>
|
|
USE BF_Trans
|
|
|
|
WANT equ <TRUE>
|
|
USE BF_Ghost
|
|
|
|
WANT equ <TRUE>
|
|
USE BF_Ghost_Trans
|
|
|
|
WANT equ <TRUE>
|
|
USE BF_Fading
|
|
|
|
WANT equ <TRUE>
|
|
USE BF_Fading_Trans
|
|
|
|
WANT equ <TRUE>
|
|
USE BF_Ghost_Fading
|
|
|
|
WANT equ <TRUE>
|
|
USE BF_Ghost_Fading_Trans
|
|
|
|
WANT equ <TRUE>
|
|
USE BF_Predator
|
|
|
|
WANT equ <TRUE>
|
|
USE BF_Predator_Trans
|
|
|
|
WANT equ <TRUE>
|
|
USE BF_Predator_Ghost
|
|
|
|
WANT equ <TRUE>
|
|
USE BF_Predator_Ghost_Trans
|
|
|
|
WANT equ <TRUE>
|
|
USE BF_Predator_Fading
|
|
|
|
WANT equ <TRUE>
|
|
USE BF_Predator_Fading_Trans
|
|
|
|
WANT equ <TRUE>
|
|
USE BF_Predator_Ghost_Fading
|
|
|
|
WANT equ <TRUE>
|
|
USE BF_Predator_Ghost_Fading_Trans
|
|
|
|
|
|
|
|
.DATA
|
|
|
|
;NewShapeJumpTable label near ptr dword
|
|
|
|
;
|
|
; Jumptable for shape line drawing with no flags set
|
|
;
|
|
|
|
NewShapeJumpTable dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
;CriticalFadeRedirections label dword
|
|
CriticalFadeRedirections dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
|
|
|
|
;
|
|
; Jumptable for shape line drawing routines with transparent flags set
|
|
;
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Trans
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Trans
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Trans
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Trans
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Trans
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Trans
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Trans
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Trans
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
|
|
|
|
;
|
|
; Jumptable for shape line drawing routines with ghost flags set
|
|
;
|
|
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Ghost
|
|
dd Single_Line_Ghost
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Ghost
|
|
dd Single_Line_Ghost
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Ghost
|
|
dd Single_Line_Ghost
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Ghost
|
|
dd Single_Line_Ghost
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
|
|
|
|
;
|
|
; Jumptable for shape line drawing routines with ghost and transparent flags set
|
|
;
|
|
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Trans
|
|
dd Single_Line_Ghost
|
|
dd Single_Line_Ghost_Trans
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Trans
|
|
dd Single_Line_Ghost
|
|
dd Single_Line_Ghost_Trans
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Trans
|
|
dd Single_Line_Ghost
|
|
dd Single_Line_Ghost_Trans
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Trans
|
|
dd Single_Line_Ghost
|
|
dd Single_Line_Ghost_Trans
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
|
|
|
|
|
|
|
|
|
|
;
|
|
; Jumptable for shape line drawing routines with fading flag set
|
|
;
|
|
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Single_Fade
|
|
dd Single_Line_Single_Fade
|
|
dd Single_Line_Fading
|
|
dd Single_Line_Fading
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Fading
|
|
dd Single_Line_Fading
|
|
dd Single_Line_Fading
|
|
dd Single_Line_Fading
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
|
|
|
|
;
|
|
; Jumptable for shape line drawing routines with fading and transparent flags set
|
|
;
|
|
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Trans
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Trans
|
|
dd Single_Line_Single_Fade
|
|
dd Single_Line_Single_Fade_Trans
|
|
dd Single_Line_Fading
|
|
dd Single_Line_Fading_Trans
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Trans
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Trans
|
|
dd Single_Line_Fading
|
|
dd Single_Line_Fading_Trans
|
|
dd Single_Line_Fading
|
|
dd Single_Line_Fading_Trans
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
|
|
|
|
;
|
|
; Jumptable for shape line drawing routines with fading and ghost flags set
|
|
;
|
|
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Ghost
|
|
dd Single_Line_Ghost
|
|
dd Single_Line_Single_Fade
|
|
dd Single_Line_Single_Fade
|
|
dd Single_Line_Ghost_Fading
|
|
dd Single_Line_Ghost_Fading
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Ghost
|
|
dd Single_Line_Ghost
|
|
dd Single_Line_Fading
|
|
dd Single_Line_Fading
|
|
dd Single_Line_Ghost_Fading
|
|
dd Single_Line_Ghost_Fading
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
|
|
|
|
|
|
;
|
|
; Jumptable for shape line drawing routines with fading, transparent and ghost flags set
|
|
;
|
|
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Trans
|
|
dd Single_Line_Ghost
|
|
dd Single_Line_Ghost_Trans
|
|
dd Single_Line_Single_Fade
|
|
dd Single_Line_Single_Fade_Trans
|
|
dd Single_Line_Ghost_Fading
|
|
dd Single_Line_Ghost_Fading_Trans
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Trans
|
|
dd Single_Line_Ghost
|
|
dd Single_Line_Ghost_Trans
|
|
dd Single_Line_Fading
|
|
dd Single_Line_Fading_Trans
|
|
dd Single_Line_Ghost_Fading
|
|
dd Single_Line_Ghost_Fading_Trans
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;
|
|
; Jumptable for shape line drawing with predator flag set
|
|
;
|
|
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Predator
|
|
dd Single_Line_Predator
|
|
dd Single_Line_Predator
|
|
dd Single_Line_Predator
|
|
dd Single_Line_Predator
|
|
dd Single_Line_Predator
|
|
dd Single_Line_Predator
|
|
dd Single_Line_Predator
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
|
|
|
|
;
|
|
; Jumptable for shape line drawing routines with transparent and predator flags set
|
|
;
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Trans
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Trans
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Trans
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Trans
|
|
dd Single_Line_Predator
|
|
dd Single_Line_Predator_Trans
|
|
dd Single_Line_Predator
|
|
dd Single_Line_Predator_Trans
|
|
dd Single_Line_Predator
|
|
dd Single_Line_Predator_Trans
|
|
dd Single_Line_Predator
|
|
dd Single_Line_Predator_Trans
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
|
|
|
|
;
|
|
; Jumptable for shape line drawing routines with ghost and predator flags set
|
|
;
|
|
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Ghost
|
|
dd Single_Line_Ghost
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Ghost
|
|
dd Single_Line_Ghost
|
|
dd Single_Line_Predator
|
|
dd Single_Line_Predator
|
|
dd Single_Line_Predator_Ghost
|
|
dd Single_Line_Predator_Ghost
|
|
dd Single_Line_Predator
|
|
dd Single_Line_Predator
|
|
dd Single_Line_Predator_Ghost
|
|
dd Single_Line_Predator_Ghost
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
|
|
|
|
;
|
|
; Jumptable for shape line drawing routines with ghost and transparent and predator flags set
|
|
;
|
|
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Trans
|
|
dd Single_Line_Ghost
|
|
dd Single_Line_Ghost_Trans
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Trans
|
|
dd Single_Line_Ghost
|
|
dd Single_Line_Ghost_Trans
|
|
dd Single_Line_Predator
|
|
dd Single_Line_Predator_Trans
|
|
dd Single_Line_Predator_Ghost
|
|
dd Single_Line_Predator_Ghost_Trans
|
|
dd Single_Line_Predator
|
|
dd Single_Line_Predator_Trans
|
|
dd Single_Line_Predator_Ghost
|
|
dd Single_Line_Predator_Ghost_Trans
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
|
|
|
|
|
|
|
|
|
|
;
|
|
; Jumptable for shape line drawing routines with fading and predator flags set
|
|
;
|
|
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Single_Fade
|
|
dd Single_Line_Single_Fade
|
|
dd Single_Line_Fading
|
|
dd Single_Line_Fading
|
|
dd Single_Line_Predator
|
|
dd Single_Line_Predator
|
|
dd Single_Line_Predator
|
|
dd Single_Line_Predator
|
|
dd Single_Line_Predator_Fading
|
|
dd Single_Line_Predator_Fading
|
|
dd Single_Line_Predator_Fading
|
|
dd Single_Line_Predator_Fading
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
|
|
|
|
;
|
|
; Jumptable for shape line drawing routines with fading and transparent and predator flags set
|
|
;
|
|
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Trans
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Trans
|
|
dd Single_Line_Single_Fade
|
|
dd Single_Line_Single_Fade_Trans
|
|
dd Single_Line_Fading
|
|
dd Single_Line_Fading_Trans
|
|
dd Single_Line_Predator
|
|
dd Single_Line_Predator_Trans
|
|
dd Single_Line_Predator
|
|
dd Single_Line_Predator_Trans
|
|
dd Single_Line_Predator_Fading
|
|
dd Single_Line_Predator_Fading_Trans
|
|
dd Single_Line_Predator_Fading
|
|
dd Single_Line_Predator_Fading_Trans
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
|
|
|
|
;
|
|
; Jumptable for shape line drawing routines with fading and ghost and predator flags set
|
|
;
|
|
|
|
dd Short_Single_Line_Copy
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Ghost
|
|
dd Single_Line_Ghost
|
|
dd Single_Line_Single_Fade
|
|
dd Single_Line_Single_Fade
|
|
dd Single_Line_Ghost_Fading
|
|
dd Single_Line_Ghost_Fading
|
|
dd Single_Line_Predator
|
|
dd Single_Line_Predator
|
|
dd Single_Line_Predator_Ghost
|
|
dd Single_Line_Predator_Ghost
|
|
dd Single_Line_Predator_Fading
|
|
dd Single_Line_Predator_Fading
|
|
dd Single_Line_Predator_Ghost_Fading
|
|
dd Single_Line_Predator_Ghost_Fading
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;
|
|
; Jumptable for shape line drawing routines with all flags set
|
|
;
|
|
|
|
AllFlagsJumpTable label dword
|
|
dd Short_Single_Line_Copy
|
|
dd Single_Line_Trans
|
|
dd Single_Line_Ghost
|
|
dd Single_Line_Ghost_Trans
|
|
dd Single_Line_Single_Fade
|
|
dd Single_Line_Single_Fade_Trans
|
|
dd Single_Line_Ghost_Fading
|
|
dd Single_Line_Ghost_Fading_Trans
|
|
dd Single_Line_Predator
|
|
dd Single_Line_Predator_Trans
|
|
dd Single_Line_Predator_Ghost
|
|
dd Single_Line_Predator_Ghost_Trans
|
|
dd Single_Line_Predator_Fading
|
|
dd Single_Line_Predator_Fading_Trans
|
|
dd Single_Line_Predator_Ghost_Fading
|
|
dd Single_Line_Predator_Ghost_Fading_Trans
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
dd Single_Line_Skip
|
|
|
|
|
|
EndNewShapeJumpTable db 0
|
|
|
|
.CODE
|
|
|
|
|
|
|
|
;---------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
;*********************************************************************************************
|
|
;* Set_Shape_Header -- create the line header bytes for a shape *
|
|
;* *
|
|
;* INPUT: Shape width *
|
|
;* Shape height *
|
|
;* ptr to raw shape data *
|
|
;* ptr to shape headers *
|
|
;* shape flags *
|
|
;* ptr to translucency table *
|
|
;* IsTranslucent *
|
|
;* *
|
|
;* OUTPUT: none *
|
|
;* *
|
|
;* Warnings: *
|
|
;* *
|
|
;* HISTORY: *
|
|
;* 11/29/95 10:09AM ST : Created. *
|
|
;*===========================================================================================*
|
|
|
|
Setup_Shape_Header proc C pixel_width:DWORD, pixel_height:DWORD, src:DWORD, headers:DWORD, flags:DWORD, Translucent:DWORD, IsTranslucent:DWORD
|
|
|
|
;ARG pixel_width :DWORD ; width of rectangle to blit
|
|
;ARG pixel_height :DWORD ; height of rectangle to blit
|
|
;ARG src :DWORD ; this is a member function
|
|
;ARG headers :DWORD
|
|
;ARG flags :DWORD
|
|
;ARG Translucent :DWORD
|
|
;ARG IsTranslucent :DWORD
|
|
LOCAL trans_count :DWORD
|
|
|
|
pushad
|
|
|
|
|
|
mov esi,[src] ;ptr to raw shape data
|
|
mov edi,[headers] ;ptr to headers we are going to set up
|
|
mov eax,[flags]
|
|
and eax,SHAPE_TRANS or SHAPE_FADING or SHAPE_PREDATOR or SHAPE_GHOST
|
|
mov [edi].ShapeHeaderType.draw_flags,eax ;save old flags in header
|
|
add edi,size ShapeHeaderType
|
|
mov edx,[pixel_height] ;number of shape lines to scan
|
|
|
|
outer_loop: mov ecx,[pixel_width] ;number of pixels in shape line
|
|
xor bl,bl ;flag the we dont know anything about this line yet
|
|
mov [trans_count],0 ;we havnt scanned any transparent pixels yet
|
|
|
|
;
|
|
; Scan one shape line to see what kind of data it contains
|
|
;
|
|
inner_loop: xor eax,eax
|
|
mov al,[esi]
|
|
inc esi
|
|
|
|
;
|
|
; Check for transparent pixel
|
|
;
|
|
test al,al
|
|
jnz not_transp
|
|
test [flags],SHAPE_TRANS
|
|
jz not_transp
|
|
or bl,BLIT_TRANSPARENT ;flag that pixel is transparent
|
|
inc [trans_count] ;keep count of the number of transparent pixels on the line
|
|
jmp end_lp
|
|
|
|
;
|
|
; Check for predator effect on this line
|
|
;
|
|
not_transp: test [flags],SHAPE_PREDATOR
|
|
jz not_pred
|
|
or bl,BLIT_PREDATOR
|
|
|
|
;
|
|
; Check for ghost effects
|
|
;
|
|
not_pred: test [flags],SHAPE_GHOST
|
|
jz not_ghost
|
|
push edi
|
|
mov edi,[IsTranslucent]
|
|
cmp byte ptr [edi+eax],-1
|
|
pop edi
|
|
jz not_ghost
|
|
or bl,BLIT_GHOST
|
|
|
|
;
|
|
; Check if fading is required
|
|
;
|
|
not_ghost: test [flags],SHAPE_FADING
|
|
jz end_lp
|
|
or bl,BLIT_FADING
|
|
|
|
end_lp: dec ecx
|
|
jnz inner_loop
|
|
|
|
|
|
;
|
|
; Interpret the info we have collected and decide which routine will be
|
|
; used to draw this line
|
|
;
|
|
xor bh,bh
|
|
|
|
test bl,BLIT_TRANSPARENT
|
|
jz no_transparencies
|
|
or bh,BLIT_TRANSPARENT
|
|
mov ecx,[pixel_width]
|
|
cmp ecx,[trans_count]
|
|
jnz not_all_trans
|
|
|
|
; all pixels in the line were transparent so we dont need to draw it at all
|
|
mov bh,BLIT_SKIP
|
|
jmp got_line_type
|
|
|
|
not_all_trans:
|
|
no_transparencies:
|
|
mov al,bl
|
|
and al,BLIT_PREDATOR
|
|
or bh,al
|
|
mov al,bl
|
|
and al,BLIT_GHOST
|
|
or bh,al
|
|
mov al,bl
|
|
and al,BLIT_FADING
|
|
or bh,al
|
|
|
|
;
|
|
; Save the line header and do the next line
|
|
;
|
|
got_line_type:mov [edi],bh
|
|
inc edi
|
|
|
|
dec edx
|
|
jnz outer_loop
|
|
|
|
|
|
popad
|
|
ret
|
|
|
|
Setup_Shape_Header endp
|
|
|
|
|
|
|
|
|
|
;**************************************************************
|
|
;
|
|
; Macro to fetch the header of the next line and jump to the appropriate routine
|
|
;
|
|
next_line macro
|
|
|
|
add edi , [ dest_adjust_width ] ;add in dest modulo
|
|
dec edx ;line counter
|
|
jz real_out ;return
|
|
mov ecx,[save_ecx] ;ecx is pixel count
|
|
mov eax,[header_pointer] ;ptr to next header byte
|
|
mov al,[eax]
|
|
inc [header_pointer]
|
|
and eax,BLIT_ALL ;Make sure we dont jump to some spurious address
|
|
; if the header is wrong then its better to draw with the wrong
|
|
; shape routine than to die
|
|
shl eax,2
|
|
add eax,[ShapeJumpTableAddress] ;get the address to jump to
|
|
jmp dword ptr [eax] ;do the jump
|
|
|
|
endm
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;***************************************************************************
|
|
;* VVC::TOPAGE -- Copies a linear buffer to a virtual viewport *
|
|
;* *
|
|
;* INPUT: WORD x_pixel - x pixel on viewport to copy from *
|
|
;* WORD y_pixel - y pixel on viewport to copy from *
|
|
;* WORD pixel_width - the width of copy region *
|
|
;* WORD pixel_height - the height of copy region *
|
|
;* BYTE * src - buffer to copy from *
|
|
;* VVPC * dest - virtual viewport to copy to *
|
|
;* *
|
|
;* OUTPUT: none *
|
|
;* *
|
|
;* WARNINGS: Coordinates and dimensions will be adjusted if they exceed *
|
|
;* the boundaries. In the event that no adjustment is *
|
|
;* possible this routine will abort. If the size of the *
|
|
;* region to copy exceeds the size passed in for the buffer *
|
|
;* the routine will automatically abort. *
|
|
;* *
|
|
;* HISTORY: *
|
|
;* 06/15/1994 PWG : Created. *
|
|
;*=========================================================================*
|
|
Buffer_Frame_To_Page proc C public USES eax ebx ecx edx esi edi x_pixel:DWORD, y_pixel:DWORD, pixel_width:DWORD, pixel_height:DWORD, src:DWORD, dest:DWORD, flags:DWORD
|
|
|
|
;USES eax,ebx,ecx,edx,esi,edi
|
|
|
|
;*===================================================================
|
|
;* define the arguements that our function takes.
|
|
;*===================================================================
|
|
;ARG x_pixel :DWORD ; x pixel position in source
|
|
;ARG y_pixel :DWORD ; y pixel position in source
|
|
;ARG pixel_width :DWORD ; width of rectangle to blit
|
|
;ARG pixel_height:DWORD ; height of rectangle to blit
|
|
;ARG src :DWORD ; this is a member function
|
|
;ARG dest :DWORD ; what are we blitting to
|
|
|
|
;ARG flags :DWORD ; flags passed
|
|
|
|
;*===================================================================
|
|
; Define some locals so that we can handle things quickly
|
|
;*===================================================================
|
|
LOCAL IsTranslucent :DWORD ; ptr to the is_translucent table
|
|
LOCAL Translucent :DWORD ; ptr to the actual translucent table
|
|
LOCAL FadingTable :DWORD ; extracted fading table pointer
|
|
LOCAL FadingNum :DWORD ; get the number of times to fade
|
|
|
|
LOCAL StashECX :DWORD ; temp variable for ECX register
|
|
|
|
LOCAL jflags :DWORD ; flags used to goto correct buff frame routine
|
|
LOCAL BufferFrameRout :DWORD ; ptr to the buffer frame routine
|
|
|
|
LOCAL jmp_loc :DWORD ; calculated jump location
|
|
LOCAL loop_cnt :DWORD
|
|
|
|
LOCAL x1_pixel :DWORD
|
|
LOCAL y1_pixel :DWORD
|
|
LOCAL scr_x :DWORD
|
|
LOCAL scr_y :DWORD
|
|
LOCAL dest_adjust_width :DWORD
|
|
LOCAL scr_adjust_width :DWORD
|
|
LOCAL header_pointer :DWORD
|
|
LOCAL use_old_draw :DWORD
|
|
LOCAL save_ecx :DWORD
|
|
LOCAL ShapeJumpTableAddress :DWORD
|
|
LOCAL shape_buffer_start :DWORD
|
|
|
|
prologue
|
|
cmp [ src ] , 0
|
|
jz real_out
|
|
|
|
;
|
|
; Save the line attributes pointers and
|
|
; Modify the src pointer to point to the actual image
|
|
;
|
|
cmp [UseBigShapeBuffer],0
|
|
jz do_args ;just use the old shape drawing system
|
|
|
|
mov edi,[src]
|
|
mov [header_pointer],edi
|
|
|
|
mov eax,[BigShapeBufferStart]
|
|
cmp [edi].ShapeHeaderType.shape_buffer,0
|
|
jz is_ordinary_shape
|
|
mov eax,[TheaterShapeBufferStart]
|
|
is_ordinary_shape:
|
|
mov [shape_buffer_start],eax
|
|
|
|
mov edi,[edi].ShapeHeaderType.shape_data
|
|
add edi,[shape_buffer_start]
|
|
mov [src],edi
|
|
mov [use_old_draw],0
|
|
|
|
|
|
;====================================================================
|
|
; Pull off optional arguments:
|
|
; EDI is used as an offset from the 'flags' parameter, to point
|
|
; to the optional argument currently being processed.
|
|
;====================================================================
|
|
do_args:
|
|
mov edi , 4 ; optional params start past flags
|
|
mov [ jflags ] , 0 ; clear jump flags
|
|
|
|
check_centering:
|
|
;-------------------------------------------------------------------
|
|
; See if we need to center the frame
|
|
;-------------------------------------------------------------------
|
|
test [ flags ] , SHAPE_CENTER ; does this need to be centered?
|
|
je check_trans ; if not the skip over this stuff
|
|
|
|
mov eax , [ pixel_width ]
|
|
mov ebx , [ pixel_height ]
|
|
sar eax , 1
|
|
sar ebx , 1
|
|
sub [ x_pixel ] , eax
|
|
sub [ y_pixel ] , ebx
|
|
|
|
check_trans:
|
|
test [ flags ] , SHAPE_TRANS
|
|
jz check_ghost
|
|
|
|
or [ jflags ] , FLAG_TRANS
|
|
|
|
;--------------------------------------------------------------------
|
|
; SHAPE_GHOST: DWORD is_translucent tbl
|
|
;--------------------------------------------------------------------
|
|
check_ghost:
|
|
test [ flags ] , SHAPE_GHOST ; are we ghosting this shape
|
|
jz check_fading
|
|
|
|
mov eax , [ flags + edi ]
|
|
or [ jflags ] , FLAG_GHOST
|
|
mov [ IsTranslucent ] , eax ; save ptr to is_trans. tbl
|
|
add eax , 0100h ; add 256 for first table
|
|
add edi , 4 ; next argument
|
|
mov [ Translucent ] , eax ; save ptr to translucent tbl
|
|
|
|
|
|
|
|
check_fading:
|
|
;______________________________________________________________________
|
|
; If this is the first time through for this shape then
|
|
; set up the shape header
|
|
;______________________________________________________________________
|
|
pushad
|
|
|
|
cmp [UseBigShapeBuffer],0
|
|
jz new_shape
|
|
|
|
mov edi,[header_pointer]
|
|
cmp [edi].ShapeHeaderType.draw_flags,-1
|
|
jz setup_headers
|
|
mov eax,[flags] ;Redo the shape headers if this shape was
|
|
and eax,SHAPE_TRANS or SHAPE_FADING or SHAPE_PREDATOR or SHAPE_GHOST ;initially set up with different flags
|
|
cmp eax,[edi].ShapeHeaderType.draw_flags
|
|
jz no_header_setup
|
|
new_shape:
|
|
mov [use_old_draw],1
|
|
jmp no_header_setup
|
|
|
|
setup_headers:
|
|
push [IsTranslucent]
|
|
push [Translucent]
|
|
push [flags]
|
|
push [header_pointer]
|
|
push [src]
|
|
push [pixel_height]
|
|
push [pixel_width]
|
|
call Setup_Shape_Header
|
|
add esp,7*4
|
|
mov [ShapeJumpTableAddress], offset AllFlagsJumpTable
|
|
jmp headers_set
|
|
no_header_setup:
|
|
|
|
xor eax,eax
|
|
test [flags],SHAPE_PREDATOR
|
|
jz not_shape_predator
|
|
or al,BLIT_PREDATOR
|
|
|
|
not_shape_predator:
|
|
test [flags],SHAPE_FADING
|
|
jz not_shape_fading
|
|
or al,BLIT_FADING
|
|
|
|
not_shape_fading:
|
|
|
|
test [flags],SHAPE_TRANS
|
|
jz not_shape_transparent
|
|
or al,BLIT_TRANSPARENT
|
|
|
|
not_shape_transparent:
|
|
|
|
test [flags],SHAPE_GHOST
|
|
jz not_shape_ghost
|
|
or al,BLIT_GHOST
|
|
|
|
not_shape_ghost:
|
|
|
|
|
|
shl eax,7
|
|
add eax, offset NewShapeJumpTable
|
|
mov [ShapeJumpTableAddress],eax
|
|
;call Init_New_Shape_Jump_Table_Address
|
|
|
|
|
|
headers_set:
|
|
popad
|
|
|
|
;--------------------------------------------------------------------
|
|
; SHAPE_FADING: DWORD fade_table[256], DWORD fade_count
|
|
;--------------------------------------------------------------------
|
|
test [ flags ] , SHAPE_FADING ; are we fading this shape
|
|
jz check_predator
|
|
|
|
mov eax , [ flags + edi ]
|
|
mov [ FadingTable ] , eax ; save address of fading tbl
|
|
mov eax , [ flags + edi + 4 ] ; get fade num
|
|
or [ jflags ] , FLAG_FADING
|
|
and eax , 03fh ; no need for more than 63
|
|
add edi , 8 ; next argument
|
|
cmp eax , 0 ; check if it's 0
|
|
jnz set_fading ; if not, store fade num
|
|
|
|
and [ flags ] , NOT SHAPE_FADING ; otherwise, don't fade
|
|
|
|
set_fading:
|
|
mov [ FadingNum ] , eax
|
|
|
|
mov ebx,[ShapeJumpTableAddress]
|
|
mov dword ptr [CriticalFadeRedirections-NewShapeJumpTable+ebx],offset Single_Line_Single_Fade
|
|
mov dword ptr [CriticalFadeRedirections-NewShapeJumpTable+ebx+4],offset Single_Line_Single_Fade_Trans
|
|
cmp eax,1
|
|
jz single_fade
|
|
mov dword ptr [CriticalFadeRedirections-NewShapeJumpTable+ebx],offset Single_Line_Fading
|
|
mov dword ptr [CriticalFadeRedirections-NewShapeJumpTable+ebx+4],offset Single_Line_Fading_Trans
|
|
|
|
single_fade:
|
|
|
|
;--------------------------------------------------------------------
|
|
; SHAPE_PREDATOR: DWORD init_pred_lookup_offset (0-7)
|
|
;--------------------------------------------------------------------
|
|
check_predator:
|
|
test [ flags ] , SHAPE_PREDATOR ; is predator effect on
|
|
jz check_partial
|
|
|
|
mov eax , [ flags + edi ] ; pull the partial value
|
|
or [ jflags ] , FLAG_PREDATOR
|
|
shl eax , 1
|
|
cmp eax , 0
|
|
jge check_range
|
|
|
|
neg eax
|
|
mov ebx , -1
|
|
and eax , PRED_MASK ; keep entries within bounds
|
|
mov bl , al
|
|
mov eax , ebx ; will be ffffff00-ffffff07
|
|
jmp pred_cont
|
|
|
|
check_range:
|
|
and eax , PRED_MASK ; keep entries within bounds
|
|
|
|
pred_cont:
|
|
add edi , 4 ; next argument
|
|
mov [ BFPredOffset ] , eax
|
|
mov [ BFPartialCount ] , 0 ; clear the partial count
|
|
mov [ BFPartialPred ] , 100h ; init partial to off
|
|
|
|
pred_neg_init:
|
|
mov esi , [ dest ] ; get ptr to dest
|
|
mov ebx, 7 * 2
|
|
|
|
pred_loop:
|
|
movzx eax , [ WORD PTR BFPredNegTable + ebx ]
|
|
add eax , [esi].GraphicViewPort.GVPWidth ; add width
|
|
add eax , [esi].GraphicViewPort.GVPXAdd ; add x add
|
|
add eax , [esi].GraphicViewPort.GVPPitch ; extra pitch of DD surface ST - 9/29/95 1:08PM
|
|
mov [ WORD PTR BFPredNegTable + 16 + ebx ] , ax
|
|
dec ebx
|
|
dec ebx
|
|
jge pred_loop
|
|
|
|
;--------------------------------------------------------------------
|
|
; SHAPE_PARTIAL: DWORD partial_pred_value (0-255)
|
|
;--------------------------------------------------------------------
|
|
check_partial:
|
|
test [ flags ] , SHAPE_PARTIAL ; is this a partial pred?
|
|
jz setupfunc
|
|
|
|
mov eax , [ flags + edi ] ; pull the partial value
|
|
add edi , 4 ; next argument
|
|
and eax , 0ffh ; make sure 0-255
|
|
mov [ BFPartialPred ] , eax ; store it off
|
|
|
|
setupfunc:
|
|
mov ebx , [ jflags ] ; load flags value
|
|
and ebx , FLAG_MASK ; clip high bits
|
|
add ebx , ebx ; mult by 4 to get DWORD offset
|
|
add ebx , ebx
|
|
mov ebx , dword ptr [ BufferFrameTable + ebx ] ; get table value
|
|
mov dword ptr [ BufferFrameRout ] , ebx ; store it in the function pointer
|
|
|
|
; Clip dest Rectangle against source Window boundaries.
|
|
|
|
mov [ scr_x ] , 0
|
|
mov [ scr_y ] , 0
|
|
mov esi , [ dest ] ; get ptr to dest
|
|
xor ecx , ecx
|
|
xor edx , edx
|
|
mov edi , [esi].GraphicViewPort.GVPWidth ; get width into register
|
|
mov ebx , [ x_pixel ]
|
|
mov eax , [ x_pixel ]
|
|
add ebx , [ pixel_width ]
|
|
shld ecx , eax , 1
|
|
mov [ x1_pixel ] , ebx
|
|
inc edi
|
|
shld edx , ebx , 1
|
|
sub eax , edi
|
|
sub ebx , edi
|
|
shld ecx , eax , 1
|
|
shld edx , ebx , 1
|
|
|
|
mov edi,[esi].GraphicViewPort.GVPHeight ; get height into register
|
|
mov ebx , [ y_pixel ]
|
|
mov eax , [ y_pixel ]
|
|
add ebx , [ pixel_height ]
|
|
shld ecx , eax , 1
|
|
mov [ y1_pixel ] , ebx
|
|
inc edi
|
|
shld edx , ebx , 1
|
|
sub eax , edi
|
|
sub ebx , edi
|
|
shld ecx , eax , 1
|
|
shld edx , ebx , 1
|
|
|
|
xor cl , 5
|
|
xor dl , 5
|
|
mov al , cl
|
|
test dl , cl
|
|
jnz real_out
|
|
|
|
or al , dl
|
|
jz do_blit
|
|
|
|
mov [use_old_draw],1
|
|
test cl , 1000b
|
|
jz dest_left_ok
|
|
|
|
mov eax , [ x_pixel ]
|
|
neg eax
|
|
mov [ x_pixel ] , 0
|
|
mov [ scr_x ] , eax
|
|
|
|
dest_left_ok:
|
|
test cl , 0010b
|
|
jz dest_bottom_ok
|
|
|
|
mov eax , [ y_pixel ]
|
|
neg eax
|
|
mov [ y_pixel ] , 0
|
|
mov [ scr_y ] , eax
|
|
|
|
dest_bottom_ok:
|
|
test dl , 0100b
|
|
jz dest_right_ok
|
|
|
|
mov eax , [esi].GraphicViewPort.GVPWidth ; get width into register
|
|
mov [ x1_pixel ] , eax
|
|
|
|
dest_right_ok:
|
|
test dl , 0001b
|
|
jz do_blit
|
|
|
|
mov eax , [esi].GraphicViewPort.GVPHeight ; get width into register
|
|
mov [ y1_pixel ] , eax
|
|
|
|
do_blit:
|
|
cld
|
|
mov eax , [esi].GraphicViewPort.GVPXAdd
|
|
add eax , [esi].GraphicViewPort.GVPPitch
|
|
add eax , [esi].GraphicViewPort.GVPWidth
|
|
mov edi , [esi].GraphicViewPort.GVPOffset
|
|
|
|
mov ecx , eax
|
|
mul [ y_pixel ]
|
|
add edi , [ x_pixel ]
|
|
add edi , eax
|
|
|
|
add ecx , [ x_pixel ]
|
|
sub ecx , [ x1_pixel ]
|
|
mov [ dest_adjust_width ] , ecx
|
|
|
|
mov esi , [ src ]
|
|
mov eax , [ pixel_width ]
|
|
sub eax , [ x1_pixel ]
|
|
add eax , [ x_pixel ]
|
|
mov [ scr_adjust_width ] , eax
|
|
|
|
mov eax , [ scr_y ]
|
|
mul [ pixel_width ]
|
|
add eax , [ scr_x ]
|
|
add esi , eax
|
|
|
|
;
|
|
; If the shape needs to be clipped then we cant handle it with the new header systen
|
|
; so draw it with the old shape drawer
|
|
;
|
|
cmp [use_old_draw],0
|
|
jnz use_old_stuff
|
|
|
|
add [header_pointer],size ShapeHeaderType
|
|
mov edx,[pixel_height]
|
|
mov ecx,[pixel_width]
|
|
mov eax,[header_pointer]
|
|
mov al,[eax]
|
|
mov [save_ecx],ecx
|
|
inc [header_pointer]
|
|
and eax,BLIT_ALL
|
|
shl eax,2
|
|
add eax,[ShapeJumpTableAddress]
|
|
jmp dword ptr [eax]
|
|
|
|
|
|
use_old_stuff:
|
|
mov edx , [ y1_pixel ]
|
|
mov eax , [ x1_pixel ]
|
|
|
|
sub edx , [ y_pixel ]
|
|
jle real_out
|
|
|
|
sub eax , [ x_pixel ]
|
|
jle real_out
|
|
|
|
jmp [ BufferFrameRout ] ; buffer frame to viewport routine
|
|
|
|
real_out:
|
|
|
|
cmp [MMXAvailable],0
|
|
jz no_mmx_cleanup
|
|
call MMX_Done
|
|
|
|
no_mmx_cleanup:
|
|
epilogue
|
|
|
|
ret
|
|
|
|
|
|
; ********************************************************************
|
|
; Forward bitblit only
|
|
; the inner loop is so efficient that
|
|
; the optimal consept no longer apply because
|
|
; the optimal byte have to by a number greather than 9 bytes
|
|
; ********************************************************************
|
|
;extern BF_Copy:near
|
|
|
|
BF_Copy:
|
|
prologue
|
|
|
|
cmp eax , 10
|
|
jl forward_loop_bytes
|
|
|
|
forward_loop_dword:
|
|
mov ecx , edi
|
|
mov ebx , eax
|
|
neg ecx
|
|
and ecx , 3
|
|
sub ebx , ecx
|
|
rep movsb
|
|
mov ecx , ebx
|
|
shr ecx , 2
|
|
rep movsd
|
|
mov ecx , ebx
|
|
and ecx , 3
|
|
rep movsb
|
|
|
|
add esi , [ scr_adjust_width ]
|
|
add edi , [ dest_adjust_width ]
|
|
dec edx
|
|
jnz forward_loop_dword
|
|
|
|
ret
|
|
|
|
forward_loop_bytes:
|
|
mov ecx , eax
|
|
rep movsb
|
|
add esi , [ scr_adjust_width ]
|
|
add edi , [ dest_adjust_width ]
|
|
dec edx ; decrement the height
|
|
jnz forward_loop_bytes
|
|
|
|
epilogue
|
|
|
|
ret
|
|
|
|
|
|
;********************************************************************
|
|
;********************************************************************
|
|
|
|
; segment code page public use32 'code' ; Need stricter segment alignment
|
|
; for pentium optimisations
|
|
|
|
|
|
;
|
|
; Expand the 'next_line' macro so we can jump to it
|
|
;
|
|
;
|
|
; ST - 12/20/2018 3:48PM
|
|
Next_Line:: next_line
|
|
|
|
|
|
|
|
;*****************************************************************************
|
|
; Draw a single line with transparent pixels
|
|
;
|
|
; 11/29/95 10:21AM - ST
|
|
;
|
|
;align 32
|
|
|
|
Single_Line_Trans::
|
|
prologue
|
|
|
|
Single_Line_Trans_Entry::
|
|
|
|
slt_mask_map_lp: ; Pentium pipeline usage
|
|
;Pipe Cycles
|
|
mov al,[esi] ;U 1
|
|
inc esi ;Vee 1
|
|
|
|
test al,al ;U 1
|
|
jz slt_skip ;Vee 1/5
|
|
|
|
slt_not_trans:mov [edi],al ;u 1
|
|
|
|
inc edi ;vee 1
|
|
dec ecx ;u 1
|
|
|
|
jnz slt_mask_map_lp ;vee (maybe) 1
|
|
|
|
slt_end_line: epilogue
|
|
next_line
|
|
|
|
;align 32
|
|
|
|
slt_skip: inc edi
|
|
dec ecx
|
|
jz slt_skip_end_line
|
|
|
|
mov al,[esi]
|
|
inc esi
|
|
test al,al
|
|
jz slt_skip2
|
|
mov [edi],al
|
|
inc edi
|
|
dec ecx
|
|
jnz slt_mask_map_lp
|
|
|
|
epilogue
|
|
next_line
|
|
|
|
;align 32
|
|
|
|
slt_skip2: inc edi
|
|
dec ecx
|
|
jz slt_end_line
|
|
|
|
;
|
|
; If we have hit two transparent pixels in a row then we go into
|
|
; the transparent optimised bit
|
|
;
|
|
slt_round_again:
|
|
rept 64
|
|
mov al,[esi] ; ;pipe 1
|
|
inc esi ;1 ;pipe 2
|
|
test al,al ; ;pipe 1
|
|
jnz slt_not_trans;pipe 2 (not pairable in 1)
|
|
;2
|
|
inc edi ; ;pipe 1
|
|
dec ecx ;3 ;pipe 2
|
|
jz slt_end_line ;4 ;pipe 1 (not pairable)
|
|
endm ; best case is 4 cycles per iteration
|
|
jmp slt_round_again
|
|
|
|
|
|
|
|
slt_skip_end_line:
|
|
epilogue
|
|
next_line
|
|
|
|
|
|
|
|
;*****************************************************************************
|
|
; Draw a single line with no transparent pixels
|
|
;
|
|
; 11/29/95 10:21AM - ST
|
|
;
|
|
; We have to align the destination for cards that dont bankswitch correctly
|
|
; when you write non-aligned data.
|
|
;
|
|
;align 32
|
|
Long_Single_Line_Copy:
|
|
prologue
|
|
|
|
rept 3
|
|
test edi,3
|
|
jz LSLC_aligned
|
|
movsb
|
|
dec ecx
|
|
endm
|
|
|
|
LSLC_aligned:
|
|
mov ebx,ecx
|
|
|
|
shr ecx,2
|
|
rep movsd
|
|
and ebx,3
|
|
jz proc_out
|
|
movsb
|
|
dec bl
|
|
jz proc_out
|
|
movsb
|
|
dec bl
|
|
jz proc_out
|
|
movsb
|
|
proc_out: epilogue
|
|
next_line
|
|
|
|
|
|
|
|
;*****************************************************************************
|
|
; Draw a single short line with no transparent pixels
|
|
;
|
|
; 11/29/95 10:21AM - ST
|
|
;
|
|
;align 32
|
|
Short_Single_Line_Copy:
|
|
prologue
|
|
cmp ecx,16
|
|
jge Long_Single_Line_Copy
|
|
mov ebx,ecx
|
|
rep movsb
|
|
mov ecx,ebx
|
|
epilogue
|
|
next_line
|
|
|
|
|
|
;*****************************************************************************
|
|
; Skip a line of source that is all transparent
|
|
;
|
|
; 11/29/95 10:21AM - ST
|
|
;
|
|
|
|
;align 32
|
|
Single_Line_Skip:
|
|
prologue
|
|
add esi,ecx
|
|
add edi,ecx
|
|
epilogue
|
|
next_line
|
|
|
|
|
|
|
|
;*****************************************************************************
|
|
; Draw a single line with ghosting
|
|
;
|
|
; 11/29/95 10:21AM - ST
|
|
;
|
|
;align 32
|
|
Single_Line_Ghost:
|
|
|
|
prologue
|
|
xor eax,eax
|
|
slg_loop: mov al,[esi]
|
|
mov ebx,[IsTranslucent]
|
|
inc esi
|
|
mov bh,[eax+ebx]
|
|
cmp bh,-1
|
|
jz slg_store_pixel
|
|
|
|
and ebx,0ff00h
|
|
mov al,[edi]
|
|
add ebx,[Translucent]
|
|
mov al,[eax+ebx]
|
|
|
|
slg_store_pixel:
|
|
mov [edi],al
|
|
|
|
inc edi
|
|
dec ecx
|
|
jnz slg_loop
|
|
epilogue
|
|
next_line
|
|
|
|
|
|
|
|
;*****************************************************************************
|
|
; Draw a single line with transparent pixels and ghosting
|
|
;
|
|
; 11/29/95 10:21AM - ST
|
|
;
|
|
;align 32
|
|
Single_Line_Ghost_Trans:
|
|
prologue
|
|
xor eax,eax
|
|
; cmp ecx,3
|
|
; ja slgt4
|
|
|
|
slgt_loop: mov al,[esi]
|
|
inc esi
|
|
test al,al
|
|
jz slgt_transparent
|
|
|
|
slgt_not_transparent:
|
|
mov ebx,[IsTranslucent]
|
|
mov bh,[eax+ebx]
|
|
cmp bh,-1
|
|
jz slgt_store_pixel
|
|
|
|
and ebx,0ff00h
|
|
mov al,[edi]
|
|
add ebx,[Translucent]
|
|
mov al,[eax+ebx]
|
|
|
|
slgt_store_pixel:
|
|
mov [edi],al
|
|
inc edi
|
|
dec ecx
|
|
jnz slgt_loop
|
|
epilogue
|
|
next_line
|
|
|
|
|
|
;align 32
|
|
|
|
slgt_transparent:
|
|
inc edi ;1
|
|
dec ecx ;2
|
|
jz slgt_out ;1 (not pairable)
|
|
|
|
slgt_round_again:
|
|
rept 64
|
|
mov al,[esi] ; ;pipe 1
|
|
inc esi ;1 ;pipe 2
|
|
test al,al ; ;pipe 1
|
|
jnz slgt_not_transparent ;pipe 2 (not pairable in 1)
|
|
;2
|
|
inc edi ; ;pipe 1
|
|
dec ecx ;3 ;pipe 2
|
|
jz slgt_out ;4 ;pipe 1 (not pairable)
|
|
endm ; best case is 4 cycles per iteration
|
|
jmp slgt_round_again
|
|
|
|
slgt_out: epilogue
|
|
next_line
|
|
|
|
|
|
|
|
;
|
|
; Optimised video memory access version
|
|
;
|
|
;align 32
|
|
|
|
slgt4: push edx
|
|
mov edx,[edi]
|
|
|
|
rept 4
|
|
local slgt4_store1
|
|
local slgt4_trans1
|
|
mov al,[esi]
|
|
inc esi
|
|
test al,al
|
|
jz slgt4_trans1
|
|
|
|
mov ebx,[IsTranslucent]
|
|
mov bh,[eax+ebx]
|
|
cmp bh,-1
|
|
jz slgt4_store1
|
|
|
|
and ebx,0ff00h
|
|
mov al,dl
|
|
add ebx,[Translucent]
|
|
mov al,[eax+ebx]
|
|
|
|
slgt4_store1: mov dl,al
|
|
|
|
slgt4_trans1: ror edx,8
|
|
endm
|
|
mov [edi],edx
|
|
pop edx
|
|
lea edi,[edi+4]
|
|
lea ecx,[ecx+0fffffffch]
|
|
cmp ecx,3
|
|
ja slgt4
|
|
test ecx,ecx
|
|
jnz slgt_loop
|
|
|
|
epilogue
|
|
next_line
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;*****************************************************************************
|
|
; Draw a single line with fading (colour remapping)
|
|
;
|
|
; 11/29/95 10:21AM - ST
|
|
;
|
|
;align 32
|
|
|
|
Single_Line_Fading:
|
|
prologue
|
|
xor eax,eax
|
|
mov ebx,[FadingTable]
|
|
push ebp
|
|
mov ebp,[FadingNum]
|
|
push ebp
|
|
|
|
slf_loop: mov al,[esi]
|
|
inc esi
|
|
|
|
mov ebp,[esp]
|
|
|
|
slf_fade_loop:mov al,[ebx+eax]
|
|
dec ebp
|
|
jnz slf_fade_loop
|
|
|
|
mov [edi],al
|
|
inc edi
|
|
|
|
dec ecx
|
|
jnz slf_loop
|
|
add esp,4
|
|
pop ebp
|
|
epilogue
|
|
next_line
|
|
|
|
|
|
;*****************************************************************************
|
|
; Draw a single line with transparent pixels and fading (colour remapping)
|
|
;
|
|
; 11/29/95 10:21AM - ST
|
|
;
|
|
;align 32
|
|
|
|
Single_Line_Fading_Trans:
|
|
prologue
|
|
xor eax,eax
|
|
mov ebx,[FadingTable]
|
|
push ebp
|
|
mov ebp,[FadingNum]
|
|
push ebp
|
|
|
|
slft_loop: mov al,[esi]
|
|
inc esi
|
|
test al,al
|
|
jz slft_transparent
|
|
|
|
mov ebp,[esp]
|
|
|
|
slft_fade_loop:
|
|
mov al,[ebx+eax]
|
|
dec ebp
|
|
jnz slft_fade_loop
|
|
|
|
mov [edi],al
|
|
slft_transparent:
|
|
inc edi
|
|
|
|
dec ecx
|
|
jnz slft_loop
|
|
add esp,4
|
|
pop ebp
|
|
epilogue
|
|
next_line
|
|
|
|
|
|
|
|
|
|
|
|
;*****************************************************************************
|
|
; Draw a single line with a single fade level (colour remap)
|
|
;
|
|
; 11/29/95 10:21AM - ST
|
|
;
|
|
;align 32
|
|
|
|
Single_Line_Single_Fade:
|
|
prologue
|
|
xor eax,eax
|
|
mov ebx,[FadingTable]
|
|
|
|
slsf_loop: mov al,[esi]
|
|
mov al,[ebx+eax]
|
|
mov [edi],al
|
|
inc esi
|
|
inc edi
|
|
|
|
dec ecx
|
|
jnz slsf_loop
|
|
epilogue
|
|
next_line
|
|
|
|
|
|
|
|
;*****************************************************************************
|
|
; Draw a single line with transparent pixels and a single fade level (colour remap)
|
|
;
|
|
; 11/29/95 10:21AM - ST
|
|
;
|
|
;align 32
|
|
|
|
Single_Line_Single_Fade_Trans:
|
|
prologue
|
|
xor eax,eax
|
|
mov ebx,[FadingTable]
|
|
|
|
slsft_loop: mov al,[esi]
|
|
inc esi
|
|
test al,al
|
|
jz slsft_transparent
|
|
mov al,[ebx+eax]
|
|
mov [edi],al
|
|
inc edi
|
|
dec ecx
|
|
jnz slsft_loop
|
|
epilogue
|
|
next_line
|
|
|
|
;align 32
|
|
|
|
slsft_transparent:
|
|
inc edi
|
|
|
|
dec ecx
|
|
jz slsft_next_line
|
|
mov al,[esi]
|
|
inc esi
|
|
test al,al
|
|
jz slsft_transparent
|
|
mov al,[ebx+eax]
|
|
mov [edi],al
|
|
inc edi
|
|
dec ecx
|
|
jnz slsft_loop
|
|
|
|
slsft_next_line:
|
|
epilogue
|
|
next_line
|
|
|
|
|
|
|
|
|
|
|
|
;*****************************************************************************
|
|
; Draw a single line with ghosting and fading (colour remapping)
|
|
;
|
|
; 11/29/95 10:21AM - ST
|
|
;
|
|
;align 32
|
|
|
|
Single_Line_Ghost_Fading:
|
|
|
|
prologue
|
|
mov [StashECX],ecx
|
|
|
|
SLGF_loop: xor eax,eax
|
|
mov al,[esi]
|
|
mov ebx,[IsTranslucent]
|
|
mov bh,[eax+ebx]
|
|
cmp bh,-1
|
|
jz slgf_do_fading
|
|
|
|
and ebx,0ff00h
|
|
|
|
mov al,[edi]
|
|
add ebx,[Translucent]
|
|
mov al,[ebx+eax]
|
|
|
|
slgf_do_fading:
|
|
mov ebx,[FadingTable]
|
|
mov ecx,[FadingNum]
|
|
|
|
slgf_fade_loop:
|
|
mov al,[eax+ebx]
|
|
dec ecx
|
|
jnz slgf_fade_loop
|
|
|
|
mov [edi],al
|
|
inc esi
|
|
inc edi
|
|
|
|
dec [StashECX]
|
|
jnz SLGF_loop
|
|
epilogue
|
|
next_line
|
|
|
|
|
|
;*****************************************************************************
|
|
; Draw a single line with transparent pixels, ghosting and fading
|
|
;
|
|
; 11/29/95 10:21AM - ST
|
|
;
|
|
;align 32
|
|
|
|
Single_Line_Ghost_Fading_Trans:
|
|
prologue
|
|
mov [StashECX],ecx
|
|
xor eax,eax
|
|
|
|
; cmp ecx,3
|
|
; ja slgft4
|
|
|
|
SLGFT_loop: mov al,[esi]
|
|
inc esi
|
|
test al,al
|
|
jz slgft_trans_pixel
|
|
mov ebx,[IsTranslucent]
|
|
mov bh,[eax+ebx]
|
|
cmp bh,-1
|
|
jz slgft_do_fading
|
|
|
|
and ebx,0ff00h
|
|
|
|
mov al,[edi]
|
|
add ebx,[Translucent]
|
|
mov al,[ebx+eax]
|
|
|
|
slgft_do_fading:
|
|
mov ebx,[FadingTable]
|
|
mov ecx,[FadingNum]
|
|
|
|
slgft_fade_loop:
|
|
mov al,[eax+ebx]
|
|
dec ecx
|
|
jnz slgft_fade_loop
|
|
|
|
mov [edi],al
|
|
slgft_trans_pixel:
|
|
inc edi
|
|
|
|
dec [StashECX]
|
|
jnz SLGFT_loop
|
|
epilogue
|
|
next_line
|
|
|
|
|
|
;align 32
|
|
|
|
slgft4: push edx
|
|
mov edx,[edi]
|
|
|
|
rept 4
|
|
local slgft4_fade
|
|
local slgft4_fade_lp
|
|
local slgft4_trans
|
|
mov al,[esi]
|
|
inc esi
|
|
test al,al
|
|
jz slgft4_trans
|
|
mov ebx,[IsTranslucent]
|
|
mov bh,[eax+ebx]
|
|
cmp bh,-1
|
|
jz slgft4_fade
|
|
|
|
and ebx,0ff00h
|
|
|
|
mov al,dl
|
|
add ebx,[Translucent]
|
|
mov al,[ebx+eax]
|
|
|
|
slgft4_fade: mov ebx,[FadingTable]
|
|
mov ecx,[FadingNum]
|
|
|
|
slgft4_fade_lp: mov al,[eax+ebx]
|
|
dec ecx
|
|
jnz slgft4_fade_lp
|
|
|
|
mov dl,al
|
|
|
|
slgft4_trans: ror edx,8
|
|
endm
|
|
mov [edi],edx
|
|
pop edx
|
|
lea edi,[edi+4]
|
|
sub [StashECX],4
|
|
jz slgft4_out
|
|
cmp [StashECX],3
|
|
ja slgft4
|
|
jmp SLGFT_loop
|
|
|
|
slgft4_out: epilogue
|
|
next_line
|
|
|
|
|
|
;*****************************************************************************
|
|
; Draw a single line with predator effect
|
|
;
|
|
; 11/29/95 10:21AM - ST
|
|
;
|
|
;align 32
|
|
|
|
Single_Line_Predator:
|
|
|
|
prologue
|
|
|
|
slp_loop: mov al,[esi]
|
|
|
|
mov ebx,[BFPartialCount]
|
|
add ebx,[BFPartialPred]
|
|
or bh,bh
|
|
jnz slp_get_pred
|
|
|
|
mov [BFPartialCount] , ebx
|
|
jmp slp_skip_pixel
|
|
|
|
slp_get_pred: xor bh , bh
|
|
mov eax,[BFPredOffset]
|
|
mov [BFPartialCount] , ebx
|
|
add byte ptr [BFPredOffset],2
|
|
mov eax, dword ptr [BFPredTable+eax]
|
|
and byte ptr [BFPredOffset],PRED_MASK
|
|
and eax,0ffffh
|
|
|
|
mov al,[edi+eax]
|
|
mov [edi],al
|
|
|
|
slp_skip_pixel:
|
|
inc esi
|
|
inc edi
|
|
|
|
dec ecx
|
|
jnz slp_loop
|
|
|
|
epilogue
|
|
next_line
|
|
|
|
|
|
|
|
|
|
;*****************************************************************************
|
|
; Draw a single line with transparent pixels and predator effect
|
|
;
|
|
; 11/29/95 10:21AM - ST
|
|
;
|
|
;align 32
|
|
|
|
Single_Line_Predator_Trans:
|
|
|
|
prologue
|
|
|
|
slpt_loop: mov al,[esi]
|
|
inc esi
|
|
test al,al
|
|
jz slpt_skip_pixel
|
|
|
|
mov ebx,[BFPartialCount]
|
|
add ebx,[BFPartialPred]
|
|
or bh,bh
|
|
jnz slpt_get_pred
|
|
|
|
mov [BFPartialCount] , ebx
|
|
jmp slpt_skip_pixel
|
|
|
|
slpt_get_pred:xor bh , bh
|
|
mov eax,[BFPredOffset]
|
|
mov [BFPartialCount] , ebx
|
|
add byte ptr [BFPredOffset],2
|
|
mov eax,dword ptr [BFPredTable+eax]
|
|
and byte ptr [BFPredOffset ] , PRED_MASK
|
|
and eax,0ffffh
|
|
|
|
mov al,[edi+eax]
|
|
mov [edi],al
|
|
|
|
slpt_skip_pixel:
|
|
inc edi
|
|
|
|
dec ecx
|
|
jnz slpt_loop
|
|
|
|
epilogue
|
|
next_line
|
|
|
|
|
|
;*****************************************************************************
|
|
; Draw a single line with predator and ghosting
|
|
;
|
|
; 11/29/95 10:21AM - ST
|
|
;
|
|
;align 32
|
|
|
|
Single_Line_Predator_Ghost:
|
|
|
|
prologue
|
|
|
|
slpg_loop: mov al,[esi]
|
|
mov ebx,[BFPartialCount]
|
|
add ebx,[BFPartialPred]
|
|
test bh,bh
|
|
jnz slpg_get_pred ; is this a predator pixel?
|
|
|
|
mov [BFPartialCount],ebx
|
|
jmp slpg_check_ghost
|
|
|
|
slpg_get_pred:
|
|
xor bh,bh
|
|
mov eax,[BFPredOffset]
|
|
mov [BFPartialCount],ebx
|
|
add byte ptr [BFPredOffset],2
|
|
mov eax,dword ptr [BFPredTable+eax ]
|
|
and byte ptr [BFPredOffset],PRED_MASK
|
|
and eax,0ffffh
|
|
mov al,[edi+eax]
|
|
|
|
slpg_check_ghost:
|
|
mov ebx,[IsTranslucent]
|
|
mov bh,[ebx+eax]
|
|
cmp bh,0ffh
|
|
je slpg_store_pixel
|
|
|
|
xor eax,eax
|
|
and ebx,0FF00h
|
|
|
|
mov al,[edi]
|
|
add ebx,[Translucent]
|
|
|
|
mov al,[ebx+eax]
|
|
|
|
slpg_store_pixel:
|
|
mov [edi],al
|
|
inc esi
|
|
inc edi
|
|
|
|
dec ecx
|
|
jnz slpg_loop
|
|
|
|
epilogue
|
|
next_line
|
|
|
|
|
|
|
|
;*****************************************************************************
|
|
; Draw a single line with transparent pixels, predator and ghosting
|
|
;
|
|
; 11/29/95 10:21AM - ST
|
|
;
|
|
;align 32
|
|
|
|
Single_Line_Predator_Ghost_Trans:
|
|
prologue
|
|
|
|
slpgt_loop: mov al,[esi]
|
|
inc esi
|
|
test al,al
|
|
jz slpgt_transparent
|
|
|
|
mov ebx,[BFPartialCount]
|
|
add ebx,[BFPartialPred]
|
|
test bh,bh
|
|
jnz slpgt_get_pred ; is this a predator pixel?
|
|
|
|
mov [BFPartialCount],ebx
|
|
jmp slpgt_check_ghost
|
|
|
|
slpgt_get_pred:
|
|
xor bh,bh
|
|
mov eax,[BFPredOffset]
|
|
mov [BFPartialCount],ebx
|
|
add byte ptr [BFPredOffset],2
|
|
mov eax,dword ptr [BFPredTable+eax ]
|
|
and byte ptr [BFPredOffset],PRED_MASK
|
|
and eax,0ffffh
|
|
mov al,[edi+eax]
|
|
|
|
slpgt_check_ghost:
|
|
mov ebx,[IsTranslucent]
|
|
mov bh,[ebx+eax]
|
|
cmp bh,0ffh
|
|
je slpgt_store_pixel
|
|
|
|
xor eax,eax
|
|
and ebx,0FF00h
|
|
|
|
mov al,[edi]
|
|
add ebx,[Translucent]
|
|
|
|
mov al,[ebx+eax]
|
|
|
|
slpgt_store_pixel:
|
|
mov [edi],al
|
|
slpgt_transparent:
|
|
inc edi
|
|
|
|
dec ecx
|
|
jnz slpgt_loop
|
|
|
|
pop ecx
|
|
epilogue
|
|
next_line
|
|
|
|
|
|
;*****************************************************************************
|
|
; Draw a single line with predator and fading
|
|
;
|
|
; 11/29/95 10:21AM - ST
|
|
;
|
|
;align 32
|
|
|
|
Single_Line_Predator_Fading:
|
|
|
|
prologue
|
|
mov [StashECX],ecx
|
|
|
|
slpf_loop: mov al,[esi]
|
|
mov ebx,[BFPartialCount]
|
|
inc esi
|
|
add ebx,[BFPartialPred]
|
|
test bh,bh
|
|
jnz slpf_get_pred
|
|
|
|
mov [BFPartialCount],ebx
|
|
jmp slpf_do_fading
|
|
|
|
slpf_get_pred:xor bh,bh
|
|
mov eax,[BFPredOffset]
|
|
mov [BFPartialCount],ebx
|
|
and byte ptr [BFPredOffset],2
|
|
mov eax,dword ptr [BFPredTable+eax]
|
|
and byte ptr [BFPredOffset],PRED_MASK
|
|
|
|
and eax,0ffffh
|
|
mov al,[eax+edi]
|
|
|
|
slpf_do_fading:
|
|
and eax,255
|
|
mov ebx,[FadingTable]
|
|
mov ecx,[FadingNum]
|
|
|
|
slpf_fade_loop:
|
|
mov al,[eax+ebx]
|
|
dec ecx
|
|
jnz slpf_fade_loop
|
|
|
|
mov [edi],al
|
|
inc edi
|
|
|
|
dec [StashECX]
|
|
jnz slpf_loop
|
|
|
|
epilogue
|
|
next_line
|
|
|
|
|
|
|
|
;*****************************************************************************
|
|
; Draw a single line with transparent pixels, fading and predator
|
|
;
|
|
; 11/29/95 10:21AM - ST
|
|
;
|
|
;align 32
|
|
|
|
Single_Line_Predator_Fading_Trans:
|
|
prologue
|
|
mov [StashECX],ecx
|
|
|
|
slpft_loop: mov al,[esi]
|
|
inc esi
|
|
test al,al
|
|
jz slpft_transparent
|
|
mov ebx,[BFPartialCount]
|
|
add ebx,[BFPartialPred]
|
|
test bh,bh
|
|
jnz slpft_get_pred
|
|
|
|
mov [BFPartialCount],ebx
|
|
jmp slpft_do_fading
|
|
|
|
slpft_get_pred:
|
|
xor bh,bh
|
|
mov eax,[BFPredOffset]
|
|
mov [BFPartialCount],ebx
|
|
and byte ptr [BFPredOffset],2
|
|
mov eax,dword ptr [BFPredTable+eax]
|
|
and byte ptr [BFPredOffset],PRED_MASK
|
|
|
|
and eax,0ffffh
|
|
mov al,[eax+edi]
|
|
|
|
slpft_do_fading:
|
|
and eax,255
|
|
mov ebx,[FadingTable]
|
|
mov ecx,[FadingNum]
|
|
|
|
slpft_fade_loop:
|
|
mov al,[eax+ebx]
|
|
dec ecx
|
|
jnz slpft_fade_loop
|
|
|
|
mov [edi],al
|
|
slpft_transparent:
|
|
inc edi
|
|
|
|
dec [StashECX]
|
|
jnz slpft_loop
|
|
|
|
epilogue
|
|
next_line
|
|
|
|
|
|
|
|
;*****************************************************************************
|
|
; Draw a single line with predator, ghosting and fading
|
|
;
|
|
; 11/29/95 10:21AM - ST
|
|
;
|
|
;align 32
|
|
|
|
Single_Line_Predator_Ghost_Fading:
|
|
|
|
prologue
|
|
mov [StashECX],ecx
|
|
|
|
slpgf_loop: mov al,[esi]
|
|
mov ebx,[BFPartialCount]
|
|
inc esi
|
|
add ebx,[BFPartialPred]
|
|
test bh , bh
|
|
jnz slpgf_get_pred ; is this a predator pixel?
|
|
|
|
mov [BFPartialCount],ebx
|
|
jmp slpgf_check_ghost
|
|
|
|
slpgf_get_pred:
|
|
xor bh,bh
|
|
mov eax,[BFPredOffset]
|
|
mov [BFPartialCount],ebx
|
|
add byte ptr [BFPredOffset],2
|
|
mov eax,dword ptr [BFPredTable+eax]
|
|
and byte ptr [BFPredOffset],PRED_MASK
|
|
and eax,0ffffh
|
|
|
|
mov al,[edi+eax]
|
|
|
|
slpgf_check_ghost:
|
|
and eax,255
|
|
mov ebx,[IsTranslucent]
|
|
mov bh,[ebx+eax]
|
|
cmp bh,0ffh
|
|
je slpgf_do_fading
|
|
|
|
and ebx , 0FF00h
|
|
|
|
mov al,[edi]
|
|
add ebx,[Translucent]
|
|
|
|
mov al,[ebx+eax]
|
|
|
|
slpgf_do_fading:
|
|
xor eax,eax
|
|
mov ebx,[FadingTable]
|
|
mov ecx,[FadingNum]
|
|
|
|
slpgf_fade_loop:
|
|
mov al,[ebx+eax]
|
|
dec ecx
|
|
jnz slpgf_fade_loop
|
|
|
|
slpgf_store_pixel:
|
|
mov [edi],al
|
|
inc edi
|
|
|
|
dec [StashECX]
|
|
jnz slpgf_loop
|
|
|
|
epilogue
|
|
next_line
|
|
|
|
|
|
|
|
;*****************************************************************************
|
|
; Draw a single line with transparent pixels, predator, ghosting and fading
|
|
;
|
|
; 11/29/95 10:21AM - ST
|
|
;
|
|
;align 32
|
|
|
|
Single_Line_Predator_Ghost_Fading_Trans:
|
|
|
|
prologue
|
|
mov [StashECX],ecx
|
|
|
|
slpgft_loop: mov al,[esi]
|
|
inc esi
|
|
test al,al
|
|
jz slpgft_transparent
|
|
|
|
mov ebx,[BFPartialCount]
|
|
add ebx,[BFPartialPred]
|
|
test bh , bh
|
|
jnz slpgft_get_pred ; is this a predator pixel?
|
|
|
|
mov [BFPartialCount],ebx
|
|
jmp slpgft_check_ghost
|
|
|
|
slpgft_get_pred:
|
|
xor bh,bh
|
|
mov eax,[BFPredOffset]
|
|
mov [BFPartialCount],ebx
|
|
add byte ptr [BFPredOffset],2
|
|
mov eax,dword ptr [BFPredTable+eax]
|
|
and byte ptr [BFPredOffset],PRED_MASK
|
|
and eax,0ffffh
|
|
|
|
mov al,[edi+eax]
|
|
|
|
slpgft_check_ghost:
|
|
and eax,255
|
|
mov ebx,[IsTranslucent]
|
|
mov bh,[ebx+eax]
|
|
cmp bh,0ffh
|
|
je slpgft_do_fading
|
|
|
|
and ebx , 0FF00h
|
|
|
|
mov al,[edi]
|
|
add ebx,[Translucent]
|
|
|
|
mov al,[ebx+eax]
|
|
|
|
slpgft_do_fading:
|
|
xor eax,eax
|
|
mov ebx,[FadingTable]
|
|
mov ecx,[FadingNum]
|
|
|
|
slpgft_fade_loop:
|
|
mov al,[ebx+eax]
|
|
dec ecx
|
|
jnz slpgft_fade_loop
|
|
|
|
slpgft_store_pixel:
|
|
mov [edi],al
|
|
slpgft_transparent:
|
|
inc edi
|
|
|
|
dec [StashECX]
|
|
jnz slpgft_loop
|
|
|
|
epilogue
|
|
next_line
|
|
|
|
|
|
|
|
|
|
; ends ;end of strict alignment segment
|
|
|
|
; codeseg
|
|
|
|
|
|
|
|
;extern BF_Trans:near
|
|
|
|
BF_Trans:
|
|
|
|
prologue
|
|
; calc the code location to skip to 10 bytes per REPT below!!!!
|
|
mov ecx , eax
|
|
and ecx , 01fh
|
|
lea ecx , [ ecx + ecx * 4 ] ; quick multiply by 5
|
|
neg ecx
|
|
shr eax , 5
|
|
lea ecx , [ trans_reference + ecx * 2 ] ; next multiply by 2
|
|
mov [ loop_cnt ] , eax
|
|
mov [ jmp_loc ] , ecx
|
|
|
|
trans_loop:
|
|
mov ecx , [ loop_cnt ]
|
|
jmp [ jmp_loc ]
|
|
|
|
; the following code should NOT be changed without changing the calculation
|
|
; above!!!!!!
|
|
|
|
trans_line:
|
|
|
|
REPT 32
|
|
local trans_pixel
|
|
mov bl , [ esi ]
|
|
inc esi
|
|
test bl , bl
|
|
jz trans_pixel
|
|
|
|
mov [ edi ] , bl
|
|
|
|
trans_pixel:
|
|
inc edi
|
|
ENDM
|
|
|
|
trans_reference:
|
|
dec ecx
|
|
jge trans_line
|
|
|
|
add esi , [ scr_adjust_width ]
|
|
add edi , [ dest_adjust_width ]
|
|
dec edx
|
|
jnz trans_loop
|
|
epilogue
|
|
|
|
ret
|
|
|
|
;********************************************************************
|
|
;********************************************************************
|
|
|
|
;extern BF_Ghost:near
|
|
BF_Ghost:
|
|
|
|
prologue
|
|
mov ebx , eax ; width
|
|
|
|
; NOTE: the below calculation assumes a group of instructions is
|
|
; less than 256 bytes
|
|
|
|
; get length of the 32 groups of instructions
|
|
|
|
lea ecx, [offset ghost_reference]
|
|
sub ecx, [offset ghost_line]
|
|
|
|
shr ebx , 5 ; width / 32
|
|
shr ecx , 5 ; length of instructions / 32
|
|
and eax , 01fh ; mod of width / 32
|
|
mul cl ; calc offset to start of group
|
|
neg eax ; inverse of width
|
|
mov [ loop_cnt ] , ebx ; save width / 32
|
|
lea ecx , [ ghost_reference + eax ]
|
|
mov eax , 0
|
|
mov [ jmp_loc ] , ecx
|
|
|
|
ghost_loop:
|
|
mov ecx , [ loop_cnt ]
|
|
jmp [ jmp_loc ]
|
|
|
|
ghost_line:
|
|
|
|
REPT 32
|
|
local store_pixel
|
|
mov al , [ esi ]
|
|
inc esi
|
|
mov ebx , [ IsTranslucent ] ; is it a translucent color?
|
|
mov bh , BYTE PTR [ ebx + eax ]
|
|
cmp bh , 0ffh
|
|
je store_pixel
|
|
|
|
and ebx , 0FF00h ; clear all of ebx except bh
|
|
; we have the index to the translation table
|
|
; ((trans_colour * 256) + dest colour)
|
|
mov al , [ edi ] ; mov pixel at destination to al
|
|
add ebx , [ Translucent ] ; get the ptr to it!
|
|
; Add the (trans_color * 256) of the translation equ.
|
|
mov al , BYTE PTR [ ebx + eax ] ; get new pixel in al
|
|
|
|
store_pixel:
|
|
mov [ edi ] , al
|
|
inc edi
|
|
|
|
ENDM
|
|
|
|
ghost_reference:
|
|
dec ecx
|
|
jge ghost_line
|
|
|
|
add esi , [ scr_adjust_width ]
|
|
add edi , [ dest_adjust_width ]
|
|
dec edx
|
|
jnz ghost_loop
|
|
|
|
epilogue
|
|
ret
|
|
|
|
|
|
;********************************************************************
|
|
;********************************************************************
|
|
|
|
;extern BF_Ghost_Trans:near
|
|
BF_Ghost_Trans:
|
|
|
|
prologue
|
|
mov ebx , eax ; width
|
|
|
|
; NOTE: the below calculation assumes a group of instructions is
|
|
; less than 256 bytes
|
|
|
|
; get length of the 32 groups of instructions
|
|
|
|
lea ecx , [ offset ghost_t_reference ]
|
|
sub ecx, [ offset ghost_t_line ]
|
|
|
|
shr ebx , 5 ; width / 32
|
|
shr ecx , 5 ; length of instructions / 32
|
|
and eax , 01fh ; mod of width / 32
|
|
mul cl ; calc offset to start of group
|
|
neg eax ; inverse of width
|
|
mov [ loop_cnt ] , ebx ; save width / 32
|
|
lea ecx , [ ghost_t_reference + eax ]
|
|
mov eax , 0
|
|
mov [ jmp_loc ] , ecx
|
|
|
|
ghost_t_loop:
|
|
mov ecx , [ loop_cnt ]
|
|
jmp [ jmp_loc ]
|
|
|
|
ghost_t_line:
|
|
|
|
REPT 32
|
|
local transp_pixel
|
|
local store_pixel
|
|
mov al , [ esi ]
|
|
inc esi
|
|
test al , al
|
|
jz transp_pixel
|
|
|
|
mov ebx , [ IsTranslucent ] ; is it a translucent color?
|
|
mov bh , BYTE PTR [ ebx + eax ]
|
|
cmp bh , 0ffh
|
|
je store_pixel
|
|
|
|
and ebx , 0FF00h ; clear all of ebx except bh
|
|
; we have the index to the translation table
|
|
; ((trans_colour * 256) + dest colour)
|
|
mov al , [ edi ] ; mov pixel at destination to al
|
|
add ebx , [ Translucent ] ; get the ptr to it!
|
|
; Add the (trans_color * 256) of the translation equ.
|
|
mov al , BYTE PTR [ ebx + eax ] ; get new pixel in al
|
|
|
|
store_pixel:
|
|
mov [ edi ] , al
|
|
|
|
transp_pixel:
|
|
inc edi
|
|
|
|
ENDM
|
|
|
|
ghost_t_reference:
|
|
dec ecx
|
|
jge ghost_t_line
|
|
|
|
add esi , [ scr_adjust_width ]
|
|
add edi , [ dest_adjust_width ]
|
|
dec edx
|
|
jnz ghost_t_loop
|
|
|
|
epilogue
|
|
ret
|
|
|
|
|
|
;********************************************************************
|
|
;********************************************************************
|
|
|
|
;extern BF_Fading:near
|
|
BF_Fading:
|
|
|
|
prologue
|
|
mov ebx , eax ; width
|
|
|
|
; NOTE: the below calculation assumes a group of instructions is
|
|
; less than 256 bytes
|
|
|
|
; get length of the 32 groups of instructions
|
|
|
|
lea ecx , [ offset fading_reference ]
|
|
sub ecx, [ offset fading_line ]
|
|
|
|
shr ebx , 5 ; width / 32
|
|
shr ecx , 5 ; length of instructions / 32
|
|
and eax , 01fh ; mod of width / 32
|
|
mul cl ; calc offset to start of group
|
|
neg eax ; inverse of width
|
|
mov [ loop_cnt ] , ebx ; save width / 32
|
|
lea ecx , [ fading_reference + eax ]
|
|
mov eax , 0
|
|
mov [ jmp_loc ] , ecx
|
|
|
|
fading_loop:
|
|
mov ecx , [ loop_cnt ]
|
|
mov [ StashECX ] , ecx ; preserve ecx for later
|
|
mov ebx , [ FadingTable ] ; run color through fading table
|
|
jmp [ jmp_loc ]
|
|
|
|
fading_line_begin:
|
|
mov [ StashECX ] , ecx ; preserve ecx for later
|
|
|
|
fading_line:
|
|
|
|
REPT 32
|
|
local fade_loop
|
|
mov al , [ esi ]
|
|
inc esi
|
|
mov ecx , [ FadingNum ]
|
|
|
|
fade_loop:
|
|
mov al, byte ptr [ebx + eax]
|
|
dec ecx
|
|
jnz fade_loop
|
|
|
|
mov [ edi ] , al
|
|
inc edi
|
|
|
|
ENDM
|
|
|
|
fading_reference:
|
|
mov ecx , [ StashECX ] ; restore ecx for main draw loop
|
|
dec ecx
|
|
jge fading_line_begin
|
|
|
|
add esi , [ scr_adjust_width ]
|
|
add edi , [ dest_adjust_width ]
|
|
dec edx
|
|
jnz fading_loop
|
|
|
|
epilogue
|
|
ret
|
|
|
|
|
|
;********************************************************************
|
|
;********************************************************************
|
|
|
|
;extern BF_Fading_Trans:near
|
|
BF_Fading_Trans:
|
|
|
|
prologue
|
|
mov ebx , eax ; width
|
|
|
|
; NOTE: the below calculation assumes a group of instructions is
|
|
; less than 256 bytes
|
|
|
|
; get length of the 32 groups of instructions
|
|
|
|
lea ecx , [ offset fading_t_reference ]
|
|
sub ecx, [ offset fading_t_line ]
|
|
|
|
shr ebx , 5 ; width / 32
|
|
shr ecx , 5 ; length of instructions / 32
|
|
and eax , 01fh ; mod of width / 32
|
|
mul cl ; calc offset to start of group
|
|
neg eax ; inverse of width
|
|
mov [ loop_cnt ] , ebx ; save width / 32
|
|
lea ecx , [ fading_t_reference + eax ]
|
|
mov eax , 0
|
|
mov [ jmp_loc ] , ecx
|
|
|
|
fading_t_loop:
|
|
mov ecx , [ loop_cnt ]
|
|
mov [ StashECX ] , ecx ; preserve ecx for later
|
|
mov ebx , [ FadingTable ] ; run color through fading table
|
|
jmp [ jmp_loc ]
|
|
|
|
fading_t_line_begin:
|
|
mov [ StashECX ] , ecx ; preserve ecx for later
|
|
|
|
fading_t_line:
|
|
|
|
REPT 32
|
|
local transp_pixel
|
|
local fade_loop
|
|
mov al , [ esi ]
|
|
inc esi
|
|
test al , al
|
|
jz transp_pixel
|
|
|
|
mov ecx , [ FadingNum ]
|
|
|
|
fade_loop:
|
|
mov al, byte ptr [ebx + eax]
|
|
dec ecx
|
|
jnz fade_loop
|
|
|
|
mov [ edi ] , al
|
|
|
|
transp_pixel:
|
|
inc edi
|
|
|
|
ENDM
|
|
|
|
fading_t_reference:
|
|
mov ecx , [ StashECX ] ; restore ecx for main draw loop
|
|
dec ecx
|
|
jge fading_t_line_begin
|
|
|
|
add esi , [ scr_adjust_width ]
|
|
add edi , [ dest_adjust_width ]
|
|
dec edx
|
|
jnz fading_t_loop
|
|
|
|
epilogue
|
|
ret
|
|
|
|
|
|
;********************************************************************
|
|
;********************************************************************
|
|
|
|
;extern BF_Ghost_Fading:near
|
|
BF_Ghost_Fading:
|
|
|
|
prologue
|
|
mov ebx , eax ; width
|
|
|
|
; NOTE: the below calculation assumes a group of instructions is
|
|
; less than 256 bytes
|
|
|
|
; get length of the 32 groups of instructions
|
|
|
|
lea ecx , [ offset ghost_f_reference ]
|
|
sub ecx, [ offset ghost_f_line ]
|
|
|
|
shr ebx , 5 ; width / 32
|
|
shr ecx , 5 ; length of instructions / 32
|
|
and eax , 01fh ; mod of width / 32
|
|
mul cl ; calc offset to start of group
|
|
neg eax ; inverse of width
|
|
mov [ loop_cnt ] , ebx ; save width / 32
|
|
lea ecx , [ ghost_f_reference + eax ]
|
|
mov eax , 0
|
|
mov [ jmp_loc ] , ecx
|
|
|
|
ghost_f_loop:
|
|
mov ecx , [ loop_cnt ]
|
|
mov [ StashECX ] , ecx ; preserve ecx for later
|
|
jmp [ jmp_loc ]
|
|
|
|
ghost_f_line_begin:
|
|
mov [ StashECX ] , ecx ; preserve ecx for later
|
|
|
|
ghost_f_line:
|
|
|
|
REPT 32
|
|
local store_pixel
|
|
local do_fading
|
|
local fade_loop
|
|
mov al , [ esi ]
|
|
inc esi
|
|
mov ebx , [ IsTranslucent ] ; is it a lucent color?
|
|
mov bh , byte ptr [ ebx + eax ]
|
|
cmp bh , 0ffh
|
|
je do_fading
|
|
|
|
and ebx , 0FF00h ; clear all of ebx except bh
|
|
; we have the index to the lation table
|
|
; ((_colour * 256) + dest colour)
|
|
mov al , [ edi ] ; mov pixel at destination to al
|
|
add ebx , [ Translucent ] ; get the ptr to it!
|
|
; Add the (_color * 256) of the lation equ.
|
|
mov al , byte ptr [ ebx + eax ] ; get new pixel in al
|
|
; DRD jmp store_pixel
|
|
|
|
do_fading:
|
|
mov ebx , [ FadingTable ] ; run color through fading table
|
|
mov ecx , [ FadingNum ]
|
|
|
|
fade_loop:
|
|
mov al, byte ptr [ebx + eax]
|
|
dec ecx
|
|
jnz fade_loop
|
|
|
|
store_pixel:
|
|
mov [ edi ] , al
|
|
inc edi
|
|
|
|
ENDM
|
|
|
|
ghost_f_reference:
|
|
mov ecx , [ StashECX ] ; restore ecx for main draw loop
|
|
dec ecx
|
|
jge ghost_f_line_begin
|
|
|
|
add esi , [ scr_adjust_width ]
|
|
add edi , [ dest_adjust_width ]
|
|
dec edx
|
|
jnz ghost_f_loop
|
|
|
|
epilogue
|
|
ret
|
|
|
|
|
|
;********************************************************************
|
|
;********************************************************************
|
|
|
|
;extern BF_Ghost_Fading_Trans:near
|
|
BF_Ghost_Fading_Trans:
|
|
|
|
prologue
|
|
mov ebx , eax ; width
|
|
|
|
; NOTE: the below calculation assumes a group of instructions is
|
|
; less than 256 bytes
|
|
|
|
; get length of the 32 groups of instructions
|
|
|
|
lea ecx , [ offset ghost_f_t_reference ]
|
|
sub ecx, [ offset ghost_f_t_line ]
|
|
|
|
shr ebx , 5 ; width / 32
|
|
shr ecx , 5 ; length of instructions / 32
|
|
and eax , 01fh ; mod of width / 32
|
|
mul cl ; calc offset to start of group
|
|
neg eax ; inverse of width
|
|
mov [ loop_cnt ] , ebx ; save width / 32
|
|
lea ecx , [ ghost_f_t_reference + eax ]
|
|
mov eax , 0
|
|
mov [ jmp_loc ] , ecx
|
|
|
|
ghost_f_t_loop:
|
|
mov ecx , [ loop_cnt ]
|
|
mov [ StashECX ] , ecx ; preserve ecx for later
|
|
jmp [ jmp_loc ]
|
|
|
|
ghost_f_t_line_begin:
|
|
mov [ StashECX ] , ecx ; preserve ecx for later
|
|
|
|
ghost_f_t_line:
|
|
|
|
REPT 32
|
|
local transp_pixel
|
|
local store_pixel
|
|
local do_fading
|
|
local fade_loop
|
|
mov al , [ esi ]
|
|
inc esi
|
|
test al , al
|
|
jz transp_pixel
|
|
|
|
mov ebx , [ IsTranslucent ] ; is it a translucent color?
|
|
mov bh , byte ptr [ ebx + eax ]
|
|
cmp bh , 0ffh
|
|
je do_fading
|
|
|
|
and ebx , 0FF00h ; clear all of ebx except bh
|
|
; we have the index to the translation table
|
|
; ((trans_colour * 256) + dest colour)
|
|
mov al , [ edi ] ; mov pixel at destination to al
|
|
add ebx , [ Translucent ] ; get the ptr to it!
|
|
; Add the (trans_color * 256) of the translation equ.
|
|
mov al , byte ptr [ ebx + eax ] ; get new pixel in al
|
|
; DRD jmp store_pixel
|
|
|
|
do_fading:
|
|
mov ebx , [ FadingTable ] ; run color through fading table
|
|
mov ecx , [ FadingNum ]
|
|
|
|
fade_loop:
|
|
mov al, byte ptr [ebx + eax]
|
|
dec ecx
|
|
jnz fade_loop
|
|
|
|
store_pixel:
|
|
mov [ edi ] , al
|
|
|
|
transp_pixel:
|
|
inc edi
|
|
|
|
ENDM
|
|
|
|
ghost_f_t_reference:
|
|
mov ecx , [ StashECX ] ; restore ecx for main draw loop
|
|
dec ecx
|
|
jge ghost_f_t_line_begin
|
|
|
|
add esi , [ scr_adjust_width ]
|
|
add edi , [ dest_adjust_width ]
|
|
dec edx
|
|
jnz ghost_f_t_loop
|
|
|
|
epilogue
|
|
ret
|
|
|
|
|
|
;********************************************************************
|
|
;********************************************************************
|
|
|
|
;extern BF_Predator:near
|
|
BF_Predator:
|
|
|
|
prologue
|
|
mov ebx , eax ; width
|
|
|
|
; NOTE: the below calculation assumes a group of instructions is
|
|
; less than 256 bytes
|
|
|
|
; get length of the 32 groups of instructions
|
|
|
|
lea ecx , [ offset predator_reference ]
|
|
sub ecx, [offset predator_line ]
|
|
|
|
shr ebx , 5 ; width / 32
|
|
shr ecx , 5 ; length of instructions / 32
|
|
and eax , 01fh ; mod of width / 32
|
|
mul cl ; calc offset to start of group
|
|
neg eax ; inverse of width
|
|
mov [ loop_cnt ] , ebx ; save width / 32
|
|
lea ecx , [ predator_reference + eax ]
|
|
mov eax , 0
|
|
mov [ jmp_loc ] , ecx
|
|
|
|
predator_loop:
|
|
mov ecx , [ loop_cnt ]
|
|
jmp [ jmp_loc ]
|
|
|
|
predator_line:
|
|
|
|
REPT 32
|
|
local get_pred
|
|
local skip_pixel
|
|
mov al , [ esi ]
|
|
inc esi
|
|
mov ebx , [ BFPartialCount ]
|
|
add ebx , [ BFPartialPred ]
|
|
or bh , bh
|
|
jnz get_pred ; is this a predator pixel?
|
|
|
|
mov [ BFPartialCount ] , ebx
|
|
jmp skip_pixel
|
|
|
|
get_pred:
|
|
xor bh , bh
|
|
mov eax, [ BFPredOffset ]
|
|
mov [ BFPartialCount ] , ebx
|
|
add BYTE PTR [ BFPredOffset ] , 2
|
|
movzx eax , WORD PTR [ BFPredTable + eax ]
|
|
and BYTE PTR [ BFPredOffset ] , PRED_MASK
|
|
; pick up a color offset a pseudo-
|
|
; random amount from the current
|
|
movzx eax , BYTE PTR [ edi + eax ] ; viewport address
|
|
|
|
; xor bh , bh
|
|
; mov eax , [ BFPredValue ] ; pick up a color offset a pseudo-
|
|
; ; random amount from the current
|
|
; mov [ BFPartialCount ] , ebx
|
|
; mov al , [ edi + eax ] ; viewport address
|
|
|
|
mov [ edi ] , al
|
|
|
|
skip_pixel:
|
|
inc edi
|
|
|
|
ENDM
|
|
|
|
predator_reference:
|
|
dec ecx
|
|
jge predator_line
|
|
|
|
add esi , [ scr_adjust_width ]
|
|
add edi , [ dest_adjust_width ]
|
|
dec edx
|
|
jnz predator_loop
|
|
|
|
epilogue
|
|
ret
|
|
|
|
|
|
;********************************************************************
|
|
;********************************************************************
|
|
|
|
;extern BF_Predator_Trans:near
|
|
BF_Predator_Trans:
|
|
|
|
prologue
|
|
mov ebx , eax ; width
|
|
|
|
; NOTE: the below calculation assumes a group of instructions is
|
|
; less than 256 bytes
|
|
|
|
; get length of the 32 groups of instructions
|
|
|
|
lea ecx , [ offset predator_t_reference ]
|
|
sub ecx, [ offset predator_t_line ]
|
|
|
|
shr ebx , 5 ; width / 32
|
|
shr ecx , 5 ; length of instructions / 32
|
|
and eax , 01fh ; mod of width / 32
|
|
mul cl ; calc offset to start of group
|
|
neg eax ; inverse of width
|
|
mov [ loop_cnt ] , ebx ; save width / 32
|
|
lea ecx , [ predator_t_reference + eax ]
|
|
mov eax , 0
|
|
mov [ jmp_loc ] , ecx
|
|
|
|
predator_t_loop:
|
|
mov ecx , [ loop_cnt ]
|
|
jmp [ jmp_loc ]
|
|
|
|
predator_t_line:
|
|
|
|
REPT 32
|
|
local trans_pixel
|
|
local get_pred
|
|
local store_pixel
|
|
mov al , [ esi ]
|
|
inc esi
|
|
test al , al
|
|
jz trans_pixel
|
|
|
|
mov ebx , [ BFPartialCount ]
|
|
add ebx , [ BFPartialPred ]
|
|
or bh , bh
|
|
jnz get_pred ; is this a predator pixel?
|
|
|
|
mov [ BFPartialCount ] , ebx
|
|
jmp store_pixel
|
|
|
|
get_pred:
|
|
xor bh , bh
|
|
mov eax, [ BFPredOffset ]
|
|
mov [ BFPartialCount ] , ebx
|
|
add BYTE PTR [ BFPredOffset ] , 2
|
|
movzx eax , WORD PTR [ BFPredTable + eax ]
|
|
and BYTE PTR [ BFPredOffset ] , PRED_MASK
|
|
; pick up a color offset a pseudo-
|
|
; random amount from the current
|
|
movzx eax , BYTE PTR [ edi + eax ] ; viewport address
|
|
|
|
store_pixel:
|
|
mov [ edi ] , al
|
|
|
|
trans_pixel:
|
|
inc edi
|
|
|
|
ENDM
|
|
|
|
predator_t_reference:
|
|
dec ecx
|
|
jge predator_t_line
|
|
|
|
add esi , [ scr_adjust_width ]
|
|
add edi , [ dest_adjust_width ]
|
|
dec edx
|
|
jnz predator_t_loop
|
|
|
|
epilogue
|
|
ret
|
|
|
|
|
|
;********************************************************************
|
|
;********************************************************************
|
|
|
|
;extern BF_Predator_Ghost:near
|
|
BF_Predator_Ghost:
|
|
|
|
prologue
|
|
mov ebx , eax ; width
|
|
|
|
; NOTE: the below calculation assumes a group of instructions is
|
|
; less than 256 bytes
|
|
|
|
; get length of the 32 groups of instructions
|
|
|
|
lea ecx , [ offset predator_g_reference ]
|
|
sub ecx, [ offset predator_g_line ]
|
|
|
|
shr ebx , 5 ; width / 32
|
|
shr ecx , 5 ; length of instructions / 32
|
|
and eax , 01fh ; mod of width / 32
|
|
mul cl ; calc offset to start of group
|
|
neg eax ; inverse of width
|
|
mov [ loop_cnt ] , ebx ; save width / 32
|
|
lea ecx , [ predator_g_reference + eax ]
|
|
mov eax , 0
|
|
mov [ jmp_loc ] , ecx
|
|
|
|
predator_g_loop:
|
|
mov ecx , [ loop_cnt ]
|
|
jmp [ jmp_loc ]
|
|
|
|
predator_g_line:
|
|
|
|
REPT 32
|
|
local get_pred
|
|
local check_ghost
|
|
local store_pixel
|
|
mov al , [ esi ]
|
|
mov ebx , [ BFPartialCount ]
|
|
inc esi
|
|
add ebx , [ BFPartialPred ]
|
|
or bh , bh
|
|
jnz get_pred ; is this a predator pixel?
|
|
|
|
mov [ BFPartialCount ] , ebx
|
|
jmp check_ghost
|
|
|
|
get_pred:
|
|
xor bh , bh
|
|
mov eax, [ BFPredOffset ]
|
|
mov [ BFPartialCount ] , ebx
|
|
add BYTE PTR [ BFPredOffset ] , 2
|
|
movzx eax , WORD PTR [ BFPredTable + eax ]
|
|
and BYTE PTR [ BFPredOffset ] , PRED_MASK
|
|
; pick up a color offset a pseudo-
|
|
; random amount from the current
|
|
movzx eax , BYTE PTR [ edi + eax ] ; viewport address
|
|
|
|
check_ghost:
|
|
mov ebx , [ IsTranslucent ] ; is it a translucent color?
|
|
mov bh , BYTE PTR [ ebx + eax ]
|
|
cmp bh , 0ffh
|
|
je store_pixel
|
|
|
|
and ebx , 0FF00h ; clear all of ebx except bh
|
|
; we have the index to the translation table
|
|
; ((trans_colour * 256) + dest colour)
|
|
mov al , [ edi ] ; mov pixel at destination to al
|
|
add ebx , [ Translucent ] ; get the ptr to it!
|
|
; Add the (trans_color * 256) of the translation equ.
|
|
mov al , BYTE PTR [ ebx + eax ] ; get new pixel in al
|
|
|
|
store_pixel:
|
|
mov [ edi ] , al
|
|
inc edi
|
|
|
|
ENDM
|
|
|
|
predator_g_reference:
|
|
dec ecx
|
|
jge predator_g_line
|
|
|
|
add esi , [ scr_adjust_width ]
|
|
add edi , [ dest_adjust_width ]
|
|
dec edx
|
|
jnz predator_g_loop
|
|
|
|
epilogue
|
|
ret
|
|
|
|
|
|
;********************************************************************
|
|
;********************************************************************
|
|
|
|
;extern BF_Predator_Ghost_Trans:near
|
|
BF_Predator_Ghost_Trans:
|
|
|
|
prologue
|
|
mov ebx , eax ; width
|
|
|
|
; NOTE: the below calculation assumes a group of instructions is
|
|
; less than 256 bytes
|
|
|
|
; get length of the 32 groups of instructions
|
|
|
|
lea ecx , [ offset predator_g_t_reference ]
|
|
sub ecx, [ offset predator_g_t_line ]
|
|
|
|
shr ebx , 5 ; width / 32
|
|
shr ecx , 5 ; length of instructions / 32
|
|
and eax , 01fh ; mod of width / 32
|
|
mul cl ; calc offset to start of group
|
|
neg eax ; inverse of width
|
|
mov [ loop_cnt ] , ebx ; save width / 32
|
|
lea ecx , [ predator_g_t_reference + eax ]
|
|
mov eax , 0
|
|
mov [ jmp_loc ] , ecx
|
|
|
|
predator_g_t_loop:
|
|
mov ecx , [ loop_cnt ]
|
|
jmp [ jmp_loc ]
|
|
|
|
predator_g_t_line:
|
|
|
|
REPT 32
|
|
local trans_pixel
|
|
local get_pred
|
|
local check_ghost
|
|
local store_pixel
|
|
mov al , [ esi ]
|
|
inc esi
|
|
test al , al
|
|
jz trans_pixel
|
|
|
|
mov ebx , [ BFPartialCount ]
|
|
add ebx , [ BFPartialPred ]
|
|
or bh , bh
|
|
jnz get_pred ; is this a predator pixel?
|
|
|
|
mov [ BFPartialCount ] , ebx
|
|
jmp check_ghost
|
|
|
|
get_pred:
|
|
xor bh , bh
|
|
mov eax, [ BFPredOffset ]
|
|
mov [ BFPartialCount ] , ebx
|
|
add BYTE PTR [ BFPredOffset ] , 2
|
|
movzx eax , WORD PTR [ BFPredTable + eax ]
|
|
and BYTE PTR [ BFPredOffset ] , PRED_MASK
|
|
; pick up a color offset a pseudo-
|
|
; random amount from the current
|
|
movzx eax , BYTE PTR [ edi + eax ] ; viewport address
|
|
|
|
check_ghost:
|
|
mov ebx , [ IsTranslucent ] ; is it a translucent color?
|
|
mov bh , BYTE PTR [ ebx + eax ]
|
|
cmp bh , 0ffh
|
|
je store_pixel
|
|
|
|
and ebx , 0FF00h ; clear all of ebx except bh
|
|
; we have the index to the translation table
|
|
; ((trans_colour * 256) + dest colour)
|
|
mov al , [ edi ] ; mov pixel at destination to al
|
|
add ebx , [ Translucent ] ; get the ptr to it!
|
|
; Add the (trans_color * 256) of the translation equ.
|
|
mov al , BYTE PTR [ ebx + eax ] ; get new pixel in al
|
|
|
|
store_pixel:
|
|
mov [ edi ] , al
|
|
|
|
trans_pixel:
|
|
inc edi
|
|
|
|
ENDM
|
|
|
|
predator_g_t_reference:
|
|
dec ecx
|
|
jge predator_g_t_line
|
|
|
|
add esi , [ scr_adjust_width ]
|
|
add edi , [ dest_adjust_width ]
|
|
dec edx
|
|
jnz predator_g_t_loop
|
|
|
|
epilogue
|
|
ret
|
|
|
|
|
|
;********************************************************************
|
|
;********************************************************************
|
|
|
|
;extern BF_Predator_Fading:near
|
|
BF_Predator_Fading:
|
|
|
|
prologue
|
|
mov ebx , eax ; width
|
|
|
|
; NOTE: the below calculation assumes a group of instructions is
|
|
; less than 256 bytes
|
|
|
|
; get length of the 32 groups of instructions
|
|
|
|
lea ecx , [ offset predator_f_reference ]
|
|
sub ecx, [ offset predator_f_line ]
|
|
|
|
shr ebx , 5 ; width / 32
|
|
shr ecx , 5 ; length of instructions / 32
|
|
and eax , 01fh ; mod of width / 32
|
|
mul cl ; calc offset to start of group
|
|
neg eax ; inverse of width
|
|
mov [ loop_cnt ] , ebx ; save width / 32
|
|
lea ecx , [ predator_f_reference + eax ]
|
|
mov eax , 0
|
|
mov [ jmp_loc ] , ecx
|
|
|
|
predator_f_loop:
|
|
mov ecx , [ loop_cnt ]
|
|
mov [ StashECX ] , ecx ; preserve ecx for later
|
|
jmp [ jmp_loc ]
|
|
|
|
predator_f_line_begin:
|
|
mov [ StashECX ] , ecx ; preserve ecx for later
|
|
|
|
predator_f_line:
|
|
|
|
REPT 32
|
|
local get_pred
|
|
local do_fading
|
|
local fade_loop
|
|
mov al , [ esi ]
|
|
mov ebx , [ BFPartialCount ]
|
|
inc esi
|
|
add ebx , [ BFPartialPred ]
|
|
or bh , bh
|
|
jnz get_pred ; is this a predator pixel?
|
|
|
|
mov [ BFPartialCount ] , ebx
|
|
jmp do_fading
|
|
|
|
get_pred:
|
|
xor bh , bh
|
|
mov eax, [ BFPredOffset ]
|
|
mov [ BFPartialCount ] , ebx
|
|
add BYTE PTR [ BFPredOffset ] , 2
|
|
movzx eax , WORD PTR [ BFPredTable + eax ]
|
|
and BYTE PTR [ BFPredOffset ] , PRED_MASK
|
|
; pick up a color offset a pseudo-
|
|
; random amount from the current
|
|
movzx eax , BYTE PTR [ edi + eax ] ; viewport address
|
|
|
|
do_fading:
|
|
mov ebx , [ FadingTable ] ; run color through fading table
|
|
mov ecx , [ FadingNum ]
|
|
|
|
fade_loop:
|
|
mov al, byte ptr [ebx + eax]
|
|
dec ecx
|
|
jnz fade_loop
|
|
|
|
mov [ edi ] , al
|
|
inc edi
|
|
|
|
ENDM
|
|
|
|
predator_f_reference:
|
|
mov ecx , [ StashECX ] ; restore ecx for main draw loop
|
|
dec ecx
|
|
jge predator_f_line_begin
|
|
|
|
add esi , [ scr_adjust_width ]
|
|
add edi , [ dest_adjust_width ]
|
|
dec edx
|
|
jnz predator_f_loop
|
|
|
|
epilogue
|
|
ret
|
|
|
|
|
|
;********************************************************************
|
|
;********************************************************************
|
|
|
|
;extern BF_Predator_Fading_Trans:near
|
|
BF_Predator_Fading_Trans:
|
|
|
|
prologue
|
|
mov ebx , eax ; width
|
|
|
|
; NOTE: the below calculation assumes a group of instructions is
|
|
; less than 256 bytes
|
|
|
|
; get length of the 32 groups of instructions
|
|
|
|
lea ecx , [ offset predator_f_t_reference ]
|
|
sub ecx, [ offset predator_f_t_line ]
|
|
|
|
shr ebx , 5 ; width / 32
|
|
shr ecx , 5 ; length of instructions / 32
|
|
and eax , 01fh ; mod of width / 32
|
|
mul cl ; calc offset to start of group
|
|
neg eax ; inverse of width
|
|
mov [ loop_cnt ] , ebx ; save width / 32
|
|
lea ecx , [ predator_f_t_reference + eax ]
|
|
mov eax , 0
|
|
mov [ jmp_loc ] , ecx
|
|
|
|
predator_f_t_loop:
|
|
mov ecx , [ loop_cnt ]
|
|
mov [ StashECX ] , ecx ; preserve ecx for later
|
|
jmp [ jmp_loc ]
|
|
|
|
predator_f_t_line_begin:
|
|
mov [ StashECX ] , ecx ; preserve ecx for later
|
|
|
|
predator_f_t_line:
|
|
|
|
REPT 32
|
|
local trans_pixel
|
|
local get_pred
|
|
local do_fading
|
|
local fade_loop
|
|
mov al , [ esi ]
|
|
inc esi
|
|
test al , al
|
|
jz trans_pixel
|
|
|
|
mov ebx , [ BFPartialCount ]
|
|
add ebx , [ BFPartialPred ]
|
|
or bh , bh
|
|
jnz get_pred ; is this a predator pixel?
|
|
|
|
mov [ BFPartialCount ] , ebx
|
|
jmp do_fading
|
|
|
|
get_pred:
|
|
xor bh , bh
|
|
mov eax, [ BFPredOffset ]
|
|
mov [ BFPartialCount ] , ebx
|
|
add BYTE PTR [ BFPredOffset ] , 2
|
|
movzx eax , WORD PTR [ BFPredTable + eax ]
|
|
and BYTE PTR [ BFPredOffset ] , PRED_MASK
|
|
; pick up a color offset a pseudo-
|
|
; random amount from the current
|
|
movzx eax , BYTE PTR [ edi + eax ] ; viewport address
|
|
|
|
do_fading:
|
|
mov ebx , [ FadingTable ] ; run color through fading table
|
|
mov ecx , [ FadingNum ]
|
|
|
|
fade_loop:
|
|
mov al, byte ptr [ebx + eax]
|
|
dec ecx
|
|
jnz fade_loop
|
|
|
|
mov [ edi ] , al
|
|
|
|
trans_pixel:
|
|
inc edi
|
|
|
|
ENDM
|
|
|
|
predator_f_t_reference:
|
|
mov ecx , [ StashECX ] ; restore ecx for main draw loop
|
|
dec ecx
|
|
jge predator_f_t_line_begin
|
|
|
|
add esi , [ scr_adjust_width ]
|
|
add edi , [ dest_adjust_width ]
|
|
dec edx
|
|
jnz predator_f_t_loop
|
|
|
|
epilogue
|
|
ret
|
|
|
|
|
|
;********************************************************************
|
|
;********************************************************************
|
|
|
|
;extern BF_Predator_Ghost_Fading:near
|
|
BF_Predator_Ghost_Fading:
|
|
|
|
prologue
|
|
mov ebx , eax ; width
|
|
|
|
; NOTE: the below calculation assumes a group of instructions is
|
|
; less than 256 bytes
|
|
|
|
; get length of the 32 groups of instructions
|
|
|
|
lea ecx , [ offset predator_g_f_reference ]
|
|
sub ecx, [ offset predator_g_f_line ]
|
|
|
|
shr ebx , 5 ; width / 32
|
|
shr ecx , 5 ; length of instructions / 32
|
|
and eax , 01fh ; mod of width / 32
|
|
mul cl ; calc offset to start of group
|
|
neg eax ; inverse of width
|
|
mov [ loop_cnt ] , ebx ; save width / 32
|
|
lea ecx , [ predator_g_f_reference + eax ]
|
|
mov eax , 0
|
|
mov [ jmp_loc ] , ecx
|
|
|
|
predator_g_f_loop:
|
|
mov ecx , [ loop_cnt ]
|
|
mov [ StashECX ] , ecx ; preserve ecx for later
|
|
jmp [ jmp_loc ]
|
|
|
|
predator_g_f_line_begin:
|
|
mov [ StashECX ] , ecx ; preserve ecx for later
|
|
|
|
predator_g_f_line:
|
|
|
|
REPT 32
|
|
local get_pred
|
|
local check_ghost
|
|
local store_pixel
|
|
local do_fading
|
|
local fade_loop
|
|
mov al , [ esi ]
|
|
mov ebx , [ BFPartialCount ]
|
|
inc esi
|
|
add ebx , [ BFPartialPred ]
|
|
or bh , bh
|
|
jnz get_pred ; is this a predator pixel?
|
|
|
|
mov [ BFPartialCount ] , ebx
|
|
jmp check_ghost
|
|
|
|
get_pred:
|
|
xor bh , bh
|
|
mov eax, [ BFPredOffset ]
|
|
mov [ BFPartialCount ] , ebx
|
|
add BYTE PTR [ BFPredOffset ] , 2
|
|
movzx eax , WORD PTR [ BFPredTable + eax ]
|
|
and BYTE PTR [ BFPredOffset ] , PRED_MASK
|
|
; pick up a color offset a pseudo-
|
|
; random amount from the current
|
|
movzx eax , BYTE PTR [ edi + eax ] ; viewport address
|
|
|
|
check_ghost:
|
|
mov ebx , [ IsTranslucent ] ; is it a translucent color?
|
|
mov bh , BYTE PTR [ ebx + eax ]
|
|
cmp bh , 0ffh
|
|
je do_fading
|
|
|
|
and ebx , 0FF00h ; clear all of ebx except bh
|
|
; we have the index to the translation table
|
|
; ((trans_colour * 256) + dest colour)
|
|
mov al , [ edi ] ; mov pixel at destination to al
|
|
add ebx , [ Translucent ] ; get the ptr to it!
|
|
; Add the (trans_color * 256) of the translation equ.
|
|
mov al , BYTE PTR [ ebx + eax ] ; get new pixel in al
|
|
; DRD jmp store_pixel
|
|
|
|
do_fading:
|
|
mov ebx , [ FadingTable ] ; run color through fading table
|
|
mov ecx , [ FadingNum ]
|
|
|
|
fade_loop:
|
|
mov al, byte ptr [ebx + eax]
|
|
dec ecx
|
|
jnz fade_loop
|
|
|
|
store_pixel:
|
|
mov [ edi ] , al
|
|
inc edi
|
|
|
|
ENDM
|
|
|
|
predator_g_f_reference:
|
|
mov ecx , [ StashECX ] ; restore ecx for main draw loop
|
|
dec ecx
|
|
jge predator_g_f_line_begin
|
|
|
|
add esi , [ scr_adjust_width ]
|
|
add edi , [ dest_adjust_width ]
|
|
dec edx
|
|
jnz predator_g_f_loop
|
|
|
|
epilogue
|
|
ret
|
|
|
|
|
|
;********************************************************************
|
|
;********************************************************************
|
|
|
|
;extern BF_Predator_Ghost_Fading_Trans:near
|
|
BF_Predator_Ghost_Fading_Trans:
|
|
|
|
prologue
|
|
mov ebx , eax ; width
|
|
|
|
; NOTE: the below calculation assumes a group of instructions is
|
|
; less than 256 bytes
|
|
|
|
; get length of the 32 groups of instructions
|
|
|
|
lea ecx , [ offset predator_g_f_t_reference ]
|
|
sub ecx, [ offset predator_g_f_t_line ]
|
|
|
|
shr ebx , 5 ; width / 32
|
|
shr ecx , 5 ; length of instructions / 32
|
|
and eax , 01fh ; mod of width / 32
|
|
mul cl ; calc offset to start of group
|
|
neg eax ; inverse of width
|
|
mov [ loop_cnt ] , ebx ; save width / 32
|
|
lea ecx , [ predator_g_f_t_reference + eax ]
|
|
mov eax , 0
|
|
mov [ jmp_loc ] , ecx
|
|
|
|
predator_g_f_t_loop:
|
|
mov ecx , [ loop_cnt ]
|
|
mov [ StashECX ] , ecx ; preserve ecx for later
|
|
jmp [ jmp_loc ]
|
|
|
|
predator_g_f_t_line_begin:
|
|
mov [ StashECX ] , ecx ; preserve ecx for later
|
|
|
|
predator_g_f_t_line:
|
|
|
|
REPT 32
|
|
local trans_pixel
|
|
local get_pred
|
|
local check_ghost
|
|
local store_pixel
|
|
local do_fading
|
|
local fade_loop
|
|
mov al , [ esi ]
|
|
inc esi
|
|
test al , al
|
|
jz trans_pixel
|
|
|
|
mov ebx , [ BFPartialCount ]
|
|
add ebx , [ BFPartialPred ]
|
|
or bh , bh
|
|
jnz get_pred ; is this a predator pixel?
|
|
|
|
mov [ BFPartialCount ] , ebx
|
|
jmp check_ghost
|
|
|
|
get_pred:
|
|
xor bh , bh
|
|
mov eax, [ BFPredOffset ]
|
|
mov [ BFPartialCount ] , ebx
|
|
add BYTE PTR [ BFPredOffset ] , 2
|
|
movzx eax , WORD PTR [ BFPredTable + eax ]
|
|
and BYTE PTR [ BFPredOffset ] , PRED_MASK
|
|
; pick up a color offset a pseudo-
|
|
; random amount from the current
|
|
movzx eax , BYTE PTR [ edi + eax ] ; viewport address
|
|
|
|
check_ghost:
|
|
mov ebx , [ IsTranslucent ] ; is it a translucent color?
|
|
mov bh , BYTE PTR [ ebx + eax ]
|
|
cmp bh , 0ffh
|
|
je do_fading
|
|
|
|
and ebx , 0FF00h ; clear all of ebx except bh
|
|
; we have the index to the translation table
|
|
; ((trans_colour * 256) + dest colour)
|
|
mov al , [ edi ] ; mov pixel at destination to al
|
|
add ebx , [ Translucent ] ; get the ptr to it!
|
|
; Add the (trans_color * 256) of the translation equ.
|
|
mov al , BYTE PTR [ ebx + eax ] ; get new pixel in al
|
|
; DRD jmp store_pixel
|
|
|
|
do_fading:
|
|
mov ebx , [ FadingTable ] ; run color through fading table
|
|
mov ecx , [ FadingNum ]
|
|
|
|
fade_loop:
|
|
mov al, byte ptr [ebx + eax]
|
|
dec ecx
|
|
jnz fade_loop
|
|
|
|
store_pixel:
|
|
mov [ edi ] , al
|
|
|
|
trans_pixel:
|
|
inc edi
|
|
|
|
ENDM
|
|
|
|
predator_g_f_t_reference:
|
|
mov ecx , [ StashECX ] ; restore ecx for main draw loop
|
|
dec ecx
|
|
jge predator_g_f_t_line_begin
|
|
|
|
add esi , [ scr_adjust_width ]
|
|
add edi , [ dest_adjust_width ]
|
|
dec edx
|
|
jnz predator_g_f_t_loop
|
|
|
|
epilogue
|
|
ret
|
|
|
|
|
|
;********************************************************************
|
|
;********************************************************************
|
|
|
|
Not_Supported:
|
|
ret
|
|
|
|
Buffer_Frame_To_Page ENDP
|
|
|
|
|
|
end
|
|
|