Diff
checker
텍스트
텍스트
이미지
문서
Excel
폴더
Legal
Enterprise
데스크톱
요금제
로그인
데스크톱 앱 다운로드
텍스트 비교
두 텍스트 파일의 차이점을 찾아보세요
도구
기록
표시
레이아웃
나란히 보기
합쳐 보기
실시간 편집
공백 변경 숨기기
변경 없는 행 숨기기
줄바꿈 비활성화
비교 단위
스마트
구문
없음
모양 변경
처리
제외
텍스트 변환
첫 변경으로
수정
Diffchecker Desktop
가장 안전하게 Diffchecker를 사용하는 방법. 데스크톱 앱을 사용하면 비교 데이터가 외부로 전송되지 않습니다!
데스크톱 앱 받기
Untitled diff
생성일
8년 전
비교 결과 만료 없음
초기화
내보내기
공유
설명
13 삭제
행
총
삭제
글자
총
삭제
이 기능을 계속 사용하려면 업그레이드해 주세요
Diff
checker
Pro
요금제 보기
891 행
복사
2 추가
행
총
추가
글자
총
추가
이 기능을 계속 사용하려면 업그레이드해 주세요
Diff
checker
Pro
요금제 보기
892 행
복사
복사
복사됨
복사
복사됨
;
Modded /VISUAL/SMOKE.ASM
;
Original
;****************************************************************************
;****************************************************************************
;*
;*
;* SMOKE.ASM
;* SMOKE.ASM
;*
;*
;* Smoke effects generator.
;* Smoke effects generator.
;*
;*
;* 29.11.1992 - KJB
;* 29.11.1992 - KJB
;* 08.02.1993 - KJB - "air" smoke effects added.
;* 08.02.1993 - KJB - "air" smoke effects added.
;*
;*
;****************************************************************************
;****************************************************************************
OPTION M510 ;<<<<< MASM v5.10 <<<<<
OPTION M510 ;<<<<< MASM v5.10 <<<<<
PUBLIC MakeSmokeEffect
PUBLIC MakeSmokeEffect
PUBLIC ScanSmoke
PUBLIC ScanSmoke
EXTRN RandX:FAR
EXTRN RandX:FAR
EXTRN CalcGndHeight:FAR
EXTRN CalcGndHeight:FAR
EXTRN DrawSmoke:NEAR
EXTRN DrawSmoke:NEAR
EXTRN LastFrame:WORD
EXTRN LastFrame:WORD
EXTRN DeltaTime:WORD
EXTRN DeltaTime:WORD
;============================================================================
;============================================================================
INCLUDE VISDATA.INC
INCLUDE VISDATA.INC
INCLUDE PALETTES.INC
INCLUDE PALETTES.INC
INCLUDE \LIB8086\USEFUL.INC
INCLUDE \LIB8086\USEFUL.INC
;============================================================================
;============================================================================
DATA SEGMENT PARA PUBLIC 'DATA'
DATA SEGMENT PARA PUBLIC 'DATA'
NextSmokePtr DW OFFSET SmokeBuffer
NextSmokePtr DW OFFSET SmokeBuffer
TMP_SMOKE SMOKE <>
TMP_SMOKE SMOKE <>
;* init smoke effect switch
;* init smoke effect switch
InitSmoke DW InitCrater1 ;SMOKE_CRATER1
InitSmoke DW InitCrater1 ;SMOKE_CRATER1
DW InitCrater2 ;SMOKE_CRATER2
DW InitCrater2 ;SMOKE_CRATER2
DW InitCrater3 ;SMOKE_CRATER3
DW InitCrater3 ;SMOKE_CRATER3
DW InitBurning ;SMOKE_BURNING
DW InitBurning ;SMOKE_BURNING
DW InitKickUp ;SMOKE_KICK_UP
DW InitKickUp ;SMOKE_KICK_UP
DW InitAirExplo ;SMOKE_AIR_EXPLO
DW InitAirExplo ;SMOKE_AIR_EXPLO
DW InitAirTrail ;SMOKE_AIR_TRAIL
DW InitAirTrail ;SMOKE_AIR_TRAIL
;* control smoke switch
;* control smoke switch
CtrlSmoke DW CtrlNull ;STYPE_NULL
CtrlSmoke DW CtrlNull ;STYPE_NULL
DW CtrlGnd1 ;STYPE_GND1
DW CtrlGnd1 ;STYPE_GND1
DW CtrlAir1 ;STYPE_AIR1
DW CtrlAir1 ;STYPE_AIR1
DATA ENDS
DATA ENDS
;============================================================================
;============================================================================
SMOKEDATA SEGMENT PARA PUBLIC 'DATA'
SMOKEDATA SEGMENT PARA PUBLIC 'DATA'
;* cyclic buffer for smoke
;* cyclic buffer for smoke
SmokeBuffer LABEL SMOKE
SmokeBuffer LABEL SMOKE
SMOKE NUM_SMOKE DUP(<>)
SMOKE NUM_SMOKE DUP(<>)
SmokeBufEnd LABEL SMOKE
SmokeBufEnd LABEL SMOKE
SMOKEDATA ENDS
SMOKEDATA ENDS
;============================================================================
;============================================================================
VISCODE SEGMENT BYTE PUBLIC 'CODE'
VISCODE SEGMENT BYTE PUBLIC 'CODE'
ASSUME CS:VISCODE
ASSUME CS:VISCODE
ASSUME DS:DATA
ASSUME DS:DATA
;* MakeSmokeEffect
;* MakeSmokeEffect
;*
;*
;* pass: bx = smoke effect type (see VISDATA.INC)
;* pass: bx = smoke effect type (see VISDATA.INC)
;* si -> VIEWPOINT data block
;* si -> VIEWPOINT data block
;* ret : nothing
;* ret : nothing
;* kill: assume all
;* kill: assume all
MakeSmokeEffect PROC FAR
MakeSmokeEffect PROC FAR
;-----------------------
;-----------------------
;* copy viewpoint origin
;* copy viewpoint origin
;-----------------------
;-----------------------
mov ax,[si].VP_XSEC
mov ax,[si].VP_XSEC
mov TMP_SMOKE.SMOKE_XSEC,ax
mov TMP_SMOKE.SMOKE_XSEC,ax
mov ax,[si].VP_YSEC
mov ax,[si].VP_YSEC
mov TMP_SMOKE.SMOKE_YSEC,ax
mov TMP_SMOKE.SMOKE_YSEC,ax
mov ax,[si].VP_XFT
mov ax,[si].VP_XFT
저장된 비교 결과
원본
파일 열기
;Modded /VISUAL/SMOKE.ASM ;**************************************************************************** ;* ;* SMOKE.ASM ;* ;* Smoke effects generator. ;* ;* 29.11.1992 - KJB ;* 08.02.1993 - KJB - "air" smoke effects added. ;* ;**************************************************************************** OPTION M510 ;<<<<< MASM v5.10 <<<<< PUBLIC MakeSmokeEffect PUBLIC ScanSmoke EXTRN RandX:FAR EXTRN CalcGndHeight:FAR EXTRN DrawSmoke:NEAR EXTRN LastFrame:WORD EXTRN DeltaTime:WORD ;============================================================================ INCLUDE VISDATA.INC INCLUDE PALETTES.INC INCLUDE \LIB8086\USEFUL.INC ;============================================================================ DATA SEGMENT PARA PUBLIC 'DATA' NextSmokePtr DW OFFSET SmokeBuffer TMP_SMOKE SMOKE <> ;* init smoke effect switch InitSmoke DW InitCrater1 ;SMOKE_CRATER1 DW InitCrater2 ;SMOKE_CRATER2 DW InitCrater3 ;SMOKE_CRATER3 DW InitBurning ;SMOKE_BURNING DW InitKickUp ;SMOKE_KICK_UP DW InitAirExplo ;SMOKE_AIR_EXPLO DW InitAirTrail ;SMOKE_AIR_TRAIL ;* control smoke switch CtrlSmoke DW CtrlNull ;STYPE_NULL DW CtrlGnd1 ;STYPE_GND1 DW CtrlAir1 ;STYPE_AIR1 DATA ENDS ;============================================================================ SMOKEDATA SEGMENT PARA PUBLIC 'DATA' ;* cyclic buffer for smoke SmokeBuffer LABEL SMOKE SMOKE NUM_SMOKE DUP(<>) SmokeBufEnd LABEL SMOKE SMOKEDATA ENDS ;============================================================================ VISCODE SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:VISCODE ASSUME DS:DATA ;* MakeSmokeEffect ;* ;* pass: bx = smoke effect type (see VISDATA.INC) ;* si -> VIEWPOINT data block ;* ret : nothing ;* kill: assume all MakeSmokeEffect PROC FAR ;----------------------- ;* copy viewpoint origin ;----------------------- mov ax,[si].VP_XSEC mov TMP_SMOKE.SMOKE_XSEC,ax mov ax,[si].VP_YSEC mov TMP_SMOKE.SMOKE_YSEC,ax mov ax,[si].VP_XFT mov TMP_SMOKE.SMOKE_XFT,ax mov ax,[si].VP_YFT mov TMP_SMOKE.SMOKE_YFT,ax mov ax,WORD PTR [si].VP_ZFT_LO mov WORD PTR TMP_SMOKE.SMOKE_ZFT_LO,ax mov ax,WORD PTR [si].VP_ZFT_HI mov WORD PTR TMP_SMOKE.SMOKE_ZFT_HI,ax ;------------------- ;* init smoke effect ;------------------- call InitSmoke[bx] ret MakeSmokeEffect ENDP ;---------------------------------------------------------------------------- ;* MakeSingleSmoke ;* ;* pass: NextSmokePtr ;* TMP_SMOKE data block ;* ret : NextSmokePtr ;* kill: assume all MakeSingleSmoke PROC NEAR mov ax,SMOKEDATA mov es,ax mov si,OFFSET TMP_SMOKE mov di,NextSmokePtr mov cx,SMOKE_REC_SIZE FAST_MOVE mov ax,DATA mov es,ax cmp di,OFFSET SmokeBufEnd ;end of buffer? jb @F ;no -> mov di,OFFSET SmokeBuffer ;wrap around @@: mov NextSmokePtr,di ret MakeSingleSmoke ENDP ;---------------------------------------------------------------------------- ;* RND_SMOKE_COL - set random smoke colour ;* ;* pass: nothing ;* ret : TMP_SMOKE.SMOKE_COL ;* kill: ax, flags RND_SMOKE_COL MACRO call RandX and al,1 add al,COL_SMOKE_GREY1 mov TMP_SMOKE.SMOKE_COL,al ENDM ;---------------------------------------------------------------------------- ;* InitGnd1 - init ground smoke type 1 effects ;* ;* InitCrater1 - init smoke for SMOKE_CRATER1 effect ;* InitCrater2 - init smoke for SMOKE_CRATER2 effect ;* InitCrater3 - init smoke for SMOKE_CRATER3 effect ;* InitBurning - init smoke for SMOKE_BURNING effect ;* InitKickUp - init smoke for SMOKE_KICK_UP effect ;* ;* pass: si -> VIEWPOINT data block ;* TMP_SMOKE ;* ret : TMP_SMOKE ;* kill: assume all ;--------------------------- InitCrater1 LABEL NEAR ;--------------------------- mov TMP_SMOKE.SMOKE_SIB_CNTR,0 mov cx,1 ;number of additional smokes jmp InitGnd1 ;--------------------------- InitCrater2 LABEL NEAR ;--------------------------- mov TMP_SMOKE.SMOKE_SIB_CNTR,0 mov cx,3 ;number of additional smokes jmp InitGnd1 ;--------------------------- InitCrater3 LABEL NEAR ;--------------------------- mov TMP_SMOKE.SMOKE_SIB_CNTR,0 mov cx,7 ;number of additional smokes jmp InitGnd1 ;--------------------------- InitBurning LABEL NEAR ;--------------------------- mov TMP_SMOKE.SMOKE_SIB_CNTR,10 mov cx,9 ;number of additional smokes jmp InitGnd1 ;--------------------------- InitKickUp LABEL NEAR ;--------------------------- mov TMP_SMOKE.SMOKE_SIB_CNTR,0 mov cx,3 ;number of additional smokes ;--------------------------- InitGnd1 PROC NEAR ;--------------------------- ;------------------ ;* init first smoke (always at viewpoint datum) ;------------------ mov TMP_SMOKE.SMOKE_TYPE,STYPE_GND1 RND_SMOKE_COL mov TMP_SMOKE.SMOKE_FLAGS,0 mov TMP_SMOKE.SMOKE_ZFINE,0 mov TMP_SMOKE.SMOKE_RFT,0 mov TMP_SMOKE.SMOKE_TIME,0 call RandX add ax,8 ;128 mov TMP_SMOKE.SMOKE_EXP_TIME,ax push cx push si call MakeSingleSmoke pop si pop cx ;------------------------ ;* init additional smokes ;------------------------ jcxz InitGnd1Exit ;no additional smokes -> AddSmokeLoop: push cx RND_SMOKE_COL call RandX add ax,8;128 mov TMP_SMOKE.SMOKE_EXP_TIME,ax ;* offset xft from origin (keep within sector) call RandX cbw sar ax,1 ;-64ft .. +63ft offset add ax,[si].VP_XFT cmp ax,8191 jle @F mov ax,8191 @@: cmp ax,-8192 jge @F mov ax,-8192 @@: mov TMP_SMOKE.SMOKE_XFT,ax ;* offset yft from origin (keep within sector) call RandX cbw sar ax,1 ;-64ft .. +63ft offset add ax,[si].VP_YFT cmp ax,8191 jle @F mov ax,8191 @@: cmp ax,-8192 jge @F mov ax,-8192 @@: mov TMP_SMOKE.SMOKE_YFT,ax push si call MakeSingleSmoke pop si pop cx loop AddSmokeLoop InitGnd1Exit: ret InitGnd1 ENDP ;---------------------------------------------------------------------------- ;* InitAir1 - init air smoke type 1 effects ;* ;* InitAirExplo - init smoke for SMOKE_AIR_EXPLO effect ;* InitAirTrail - init smoke for SMOKE_AIR_TRAIL effect ;* ;* pass: si -> VIEWPOINT data block ;* TMP_SMOKE ;* ret : TMP_SMOKE ;* kill: assume all ;--------------------------- InitAirExplo LABEL NEAR ;--------------------------- mov cx,15 ;number of additional smokes jmp InitAir1 ;--------------------------- InitAirTrail LABEL NEAR ;--------------------------- mov cx,3 ;number of additional smokes ;--------------------------- InitAir1 PROC NEAR ;--------------------------- push cx push si call CalcGndHeight pop si pop cx mov bp,ax ;bp = ground height ;------------------ ;* init first smoke (always at viewpoint datum) ;------------------ mov TMP_SMOKE.SMOKE_TYPE,STYPE_AIR1 RND_SMOKE_COL mov TMP_SMOKE.SMOKE_FLAGS,0 mov TMP_SMOKE.SMOKE_ZFINE,0 mov TMP_SMOKE.SMOKE_RFT,0 mov TMP_SMOKE.SMOKE_TIME,0 mov TMP_SMOKE.SMOKE_SIB_CNTR,0 call RandX add ax,8;128 mov TMP_SMOKE.SMOKE_EXP_TIME,ax call CheckAirPos push cx push si push bp call MakeSingleSmoke pop bp pop si pop cx ;------------------------ ;* init additional smokes ;------------------------ jcxz InitAir1Exit ;no additional smokes -> AirSmokeLoop: push cx RND_SMOKE_COL call RandX add ax,8;128 mov TMP_SMOKE.SMOKE_EXP_TIME,ax ;* offset xft from origin (keep within sector) call RandX cbw sar ax,1 ;-64ft .. +63ft offset add ax,[si].VP_XFT cmp ax,8191 jle @F mov ax,8191 @@: cmp ax,-8192 jge @F mov ax,-8192 @@: mov TMP_SMOKE.SMOKE_XFT,ax ;* offset yft from origin (keep within sector) call RandX cbw sar ax,1 ;-64ft .. +63ft offset add ax,[si].VP_YFT cmp ax,8191 jle @F mov ax,8191 @@: cmp ax,-8192 jge @F mov ax,-8192 @@: mov TMP_SMOKE.SMOKE_YFT,ax ;* offset zft from origin call RandX cbw sar ax,1 ;-64ft .. +63ft offset cwd add ax,WORD PTR [si].VP_ZFT_LO adc dx,WORD PTR [si].VP_ZFT_HI jns @F xor ax,ax xor dx,dx @@: mov WORD PTR TMP_SMOKE.SMOKE_ZFT_LO,ax mov WORD PTR TMP_SMOKE.SMOKE_ZFT_HI,dx call CheckAirPos push si push bp call MakeSingleSmoke pop bp pop si pop cx loop AirSmokeLoop InitAir1Exit: ret InitAir1 ENDP ;---------------------------------------------------------------------------- ;* CheckAirPos - check air smoke does not penetrate ground ;* ;* pass: TMP_SMOKE ;* bp = ground height ;* ret : TMP_SMOKE ;* kill: ax, dx, flags CheckAirPos PROC NEAR ;* if zft < 65536 then ;* ;* zdiff = zft - ground height ;* ;* if zdiff < 0 then ;* zft = ground height + 32 ;* expand time = 128 ;* else ;* if zdiff < expand time / 4 then ;* expand time = zdiff * 4 ;* if expand time < 128 then ;* zft = ground height + 32 ;* expand time = 128 ;* endif ;* endif ;* endif ;* endif cmp WORD PTR TMP_SMOKE.SMOKE_ZFT_HI,0 ja ExitAirPos mov ax,WORD PTR TMP_SMOKE.SMOKE_ZFT_LO sub ax,bp jb SetMinSize mov dx,TMP_SMOKE.SMOKE_EXP_TIME REPT 2 shr dx,1 ENDM cmp ax,dx jae ExitAirPos REPT 2 shl ax,1 ENDM cmp ax,8;128 jae @F SetMinSize: mov ax,bp add ax,8;32 mov WORD PTR TMP_SMOKE.SMOKE_ZFT_LO,ax mov ax,8;128 @@: mov TMP_SMOKE.SMOKE_EXP_TIME,ax ExitAirPos: ret CheckAirPos ENDP ;---------------------------------------------------------------------------- ;* ScanSmoke - scan smoke buffer and draw smoke ;* ;* pass: nothing ;* ret : nothing ;* kill: assume all ;* ;* note: Smoke circles are low priority objects and could possibly clog the ;* object buffer. Therefore call this routine "later on" in the visual ;* drawing order. ScanSmoke PROC NEAR ;----------- ;* scan loop ;----------- mov cx,NUM_SMOKE mov si,OFFSET SmokeBuffer mov ax,SMOKEDATA mov ds,ax SmokeLoop: cmp [si].SMOKE_TYPE,STYPE_NULL ;smoke active? jne SortSmoke ;yes -> NextSmoke: add si,SMOKE_REC_SIZE loop SmokeLoop mov ax,DATA mov ds,ax ret ;----------------------------------- ;* copy smoke data into working copy ;----------------------------------- SortSmoke: push cx ;store loop count push si ;store smoke ptr mov di,OFFSET TMP_SMOKE mov cx,SMOKE_REC_SIZE FAST_MOVE mov ax,DATA mov ds,ax ;-------------- ;* update smoke ;-------------- mov bx,TMP_SMOKE.SMOKE_TYPE call CtrlSmoke[bx] jc @F ;smoke cleared -> ;------------ ;* draw smoke ;------------ mov si,OFFSET TMP_SMOKE call DrawSmoke ;----------------------------------- ;* copy smoke data from working copy ;----------------------------------- @@: pop di ;smoke ptr push di mov cx,SMOKE_REC_SIZE mov si,OFFSET TMP_SMOKE mov ax,SMOKEDATA mov es,ax FAST_MOVE mov ax,DATA mov es,ax ;------------------------------- ;* prepare to re-enter scan loop ;------------------------------- mov ax,SMOKEDATA mov ds,ax pop si ;restore smoke ptr pop cx ;restore loop count jmp NextSmoke ScanSmoke ENDP ;---------------------------------------------------------------------------- ;* CtrlNull ;* ;* pass: nothing ;* ret : cf = 1 = smoke cleared ;* kill: nothing CtrlNull PROC NEAR stc ret CtrlNull ENDP ;---------------------------------------------------------------------------- ;* CtrlGnd1 - control routine for ground smoke type 1 ;* ;* pass: TMP_SMOKE ;* ret : TMP_SMOKE ;* cf = 0 = smoke ok ;* cf = 1 = smoke cleared ;* kill: assume all (except cf) ;* ;* note: Phase 1: Expand radius keeping base of smoke on crater base. ;* Phase 2: Contract radius and drift upwards until radius is zero. CtrlGnd1 PROC NEAR ;-------------- ;* update timer ;-------------- mov ax,TMP_SMOKE.SMOKE_TIME add ax,LastFrame mov TMP_SMOKE.SMOKE_TIME,ax ;------------ ;* sort phase ;------------ mov dx,TMP_SMOKE.SMOKE_EXP_TIME cmp ax,dx ;expand phase? jbe Gnd1Phase1 ;yes -> sub ax,dx shl dx,1 ;contract phase is double expand phase cmp ax,dx ;contract phase? jbe Gnd1Phase2 ;yes -> ;------------------- ;* end of smoke life ;------------------- mov TMP_SMOKE.SMOKE_TYPE,STYPE_NULL stc ;cf = 1 = smoke cleared ret ;--------------------------- Gnd1Phase1 LABEL NEAR ;expand radius ;--------------------------- REPT 3;2 ;radius = time / 4 shr ax,1 ENDM mov dx,TMP_SMOKE.SMOKE_RFT mov TMP_SMOKE.SMOKE_RFT,ax ;* reset base zft sub WORD PTR TMP_SMOKE.SMOKE_ZFT_LO,dx sbb WORD PTR TMP_SMOKE.SMOKE_ZFT_HI,0 ;* set centre zft wrt radius add WORD PTR TMP_SMOKE.SMOKE_ZFT_LO,ax adc WORD PTR TMP_SMOKE.SMOKE_ZFT_HI,0 clc ;cf = 0 = smoke ok ret ;--------------------------- Gnd1Phase2 LABEL NEAR ;contract radius and drift upwards ;--------------------------- ;* reproduce sibling? test TMP_SMOKE.SMOKE_FLAGS,SFLG_REPRO ;already reproduced? _JNZ SkipRepro ;yes -> cmp TMP_SMOKE.SMOKE_SIB_CNTR,0 ;reproduce any more? _JE SkipRepro ;no -> ;* reproduce push ax push dx dec TMP_SMOKE.SMOKE_SIB_CNTR push WORD PTR TMP_SMOKE.SMOKE_COL ;(col + flags) push WORD PTR TMP_SMOKE.SMOKE_ZFT_LO push WORD PTR TMP_SMOKE.SMOKE_ZFT_HI push TMP_SMOKE.SMOKE_ZFINE push TMP_SMOKE.SMOKE_RFT push TMP_SMOKE.SMOKE_TIME push TMP_SMOKE.SMOKE_EXP_TIME mov ax,TMP_SMOKE.SMOKE_RFT sub WORD PTR TMP_SMOKE.SMOKE_ZFT_LO,ax ;reset base zft sbb WORD PTR TMP_SMOKE.SMOKE_ZFT_HI,0 RND_SMOKE_COL mov TMP_SMOKE.SMOKE_FLAGS,0 mov TMP_SMOKE.SMOKE_ZFINE,0 mov TMP_SMOKE.SMOKE_RFT,0 mov TMP_SMOKE.SMOKE_TIME,0 call RandX add ax,8;128 mov TMP_SMOKE.SMOKE_EXP_TIME,ax call MakeSingleSmoke pop TMP_SMOKE.SMOKE_EXP_TIME pop TMP_SMOKE.SMOKE_TIME pop TMP_SMOKE.SMOKE_RFT pop TMP_SMOKE.SMOKE_ZFINE pop WORD PTR TMP_SMOKE.SMOKE_ZFT_HI pop WORD PTR TMP_SMOKE.SMOKE_ZFT_LO pop WORD PTR TMP_SMOKE.SMOKE_COL ;(col + flags) or TMP_SMOKE.SMOKE_FLAGS,SFLG_REPRO pop dx pop ax SkipRepro: shr dx,1 shr ax,1 sub dx,ax REPT 3;2 ;radius = (expand time - time) / 4 shr dx,1 ENDM mov TMP_SMOKE.SMOKE_RFT,dx ;* drift upwards mov ax,DeltaTime xor dx,dx REPT 6 ;climb rate = 32ft / sec (64 * bin frac) shl ax,1 rcl dx,1 ENDM add TMP_SMOKE.SMOKE_ZFINE,ax add WORD PTR TMP_SMOKE.SMOKE_ZFT_LO,dx adc WORD PTR TMP_SMOKE.SMOKE_ZFT_HI,0 clc ;cf = 0 = smoke ok ret CtrlGnd1 ENDP ;---------------------------------------------------------------------------- ;* CtrlAir1 - control routine for air smoke type 1 ;* ;* pass: TMP_SMOKE ;* ret : TMP_SMOKE ;* cf = 0 = smoke ok ;* cf = 1 = smoke cleared ;* kill: assume all (except cf) ;* ;* note: Phase 1: Expand radius. ;* Phase 2: Contract radius. CtrlAir1 PROC NEAR ;-------------- ;* update timer ;-------------- mov ax,TMP_SMOKE.SMOKE_TIME add ax,LastFrame mov TMP_SMOKE.SMOKE_TIME,ax ;------------ ;* sort phase ;------------ mov dx,TMP_SMOKE.SMOKE_EXP_TIME cmp ax,dx ;expand phase? jbe Air1Phase1 ;yes -> sub ax,dx shl dx,1 ;contract phase is double expand phase cmp ax,dx ;contract phase? jbe Air1Phase2 ;yes -> ;------------------- ;* end of smoke life ;------------------- mov TMP_SMOKE.SMOKE_TYPE,STYPE_NULL stc ;cf = 1 = smoke cleared ret ;--------------------------- Air1Phase1 LABEL NEAR ;expand radius ;--------------------------- REPT 3;2 ;radius = time / 4 shr ax,1 ENDM mov TMP_SMOKE.SMOKE_RFT,ax clc ;cf = 0 = smoke ok ret ;--------------------------- Air1Phase2 LABEL NEAR ;contract radius ;--------------------------- shr dx,1 shr ax,1 sub dx,ax REPT 3;2 ;radius = (expand time - time) / 4 shr dx,1 ENDM mov TMP_SMOKE.SMOKE_RFT,dx clc ;cf = 0 = smoke ok ret CtrlAir1 ENDP VISCODE ENDS ;============================================================================ END
수정본
파일 열기
;Original ;**************************************************************************** ;* ;* SMOKE.ASM ;* ;* Smoke effects generator. ;* ;* 29.11.1992 - KJB ;* 08.02.1993 - KJB - "air" smoke effects added. ;* ;**************************************************************************** OPTION M510 ;<<<<< MASM v5.10 <<<<< PUBLIC MakeSmokeEffect PUBLIC ScanSmoke EXTRN RandX:FAR EXTRN CalcGndHeight:FAR EXTRN DrawSmoke:NEAR EXTRN LastFrame:WORD EXTRN DeltaTime:WORD ;============================================================================ INCLUDE VISDATA.INC INCLUDE PALETTES.INC INCLUDE \LIB8086\USEFUL.INC ;============================================================================ DATA SEGMENT PARA PUBLIC 'DATA' NextSmokePtr DW OFFSET SmokeBuffer TMP_SMOKE SMOKE <> ;* init smoke effect switch InitSmoke DW InitCrater1 ;SMOKE_CRATER1 DW InitCrater2 ;SMOKE_CRATER2 DW InitCrater3 ;SMOKE_CRATER3 DW InitBurning ;SMOKE_BURNING DW InitKickUp ;SMOKE_KICK_UP DW InitAirExplo ;SMOKE_AIR_EXPLO DW InitAirTrail ;SMOKE_AIR_TRAIL ;* control smoke switch CtrlSmoke DW CtrlNull ;STYPE_NULL DW CtrlGnd1 ;STYPE_GND1 DW CtrlAir1 ;STYPE_AIR1 DATA ENDS ;============================================================================ SMOKEDATA SEGMENT PARA PUBLIC 'DATA' ;* cyclic buffer for smoke SmokeBuffer LABEL SMOKE SMOKE NUM_SMOKE DUP(<>) SmokeBufEnd LABEL SMOKE SMOKEDATA ENDS ;============================================================================ VISCODE SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:VISCODE ASSUME DS:DATA ;* MakeSmokeEffect ;* ;* pass: bx = smoke effect type (see VISDATA.INC) ;* si -> VIEWPOINT data block ;* ret : nothing ;* kill: assume all MakeSmokeEffect PROC FAR ;----------------------- ;* copy viewpoint origin ;----------------------- mov ax,[si].VP_XSEC mov TMP_SMOKE.SMOKE_XSEC,ax mov ax,[si].VP_YSEC mov TMP_SMOKE.SMOKE_YSEC,ax mov ax,[si].VP_XFT mov TMP_SMOKE.SMOKE_XFT,ax mov ax,[si].VP_YFT mov TMP_SMOKE.SMOKE_YFT,ax mov ax,WORD PTR [si].VP_ZFT_LO mov WORD PTR TMP_SMOKE.SMOKE_ZFT_LO,ax mov ax,WORD PTR [si].VP_ZFT_HI mov WORD PTR TMP_SMOKE.SMOKE_ZFT_HI,ax ;------------------- ;* init smoke effect ;------------------- call InitSmoke[bx] ret MakeSmokeEffect ENDP ;---------------------------------------------------------------------------- ;* MakeSingleSmoke ;* ;* pass: NextSmokePtr ;* TMP_SMOKE data block ;* ret : NextSmokePtr ;* kill: assume all MakeSingleSmoke PROC NEAR mov ax,SMOKEDATA mov es,ax mov si,OFFSET TMP_SMOKE mov di,NextSmokePtr mov cx,SMOKE_REC_SIZE FAST_MOVE mov ax,DATA mov es,ax cmp di,OFFSET SmokeBufEnd ;end of buffer? jb @F ;no -> mov di,OFFSET SmokeBuffer ;wrap around @@: mov NextSmokePtr,di ret MakeSingleSmoke ENDP ;---------------------------------------------------------------------------- ;* RND_SMOKE_COL - set random smoke colour ;* ;* pass: nothing ;* ret : TMP_SMOKE.SMOKE_COL ;* kill: ax, flags RND_SMOKE_COL MACRO call RandX and al,1 add al,COL_SMOKE_GREY1 mov TMP_SMOKE.SMOKE_COL,al ENDM ;---------------------------------------------------------------------------- ;* InitGnd1 - init ground smoke type 1 effects ;* ;* InitCrater1 - init smoke for SMOKE_CRATER1 effect ;* InitCrater2 - init smoke for SMOKE_CRATER2 effect ;* InitCrater3 - init smoke for SMOKE_CRATER3 effect ;* InitBurning - init smoke for SMOKE_BURNING effect ;* InitKickUp - init smoke for SMOKE_KICK_UP effect ;* ;* pass: si -> VIEWPOINT data block ;* TMP_SMOKE ;* ret : TMP_SMOKE ;* kill: assume all ;--------------------------- InitCrater1 LABEL NEAR ;--------------------------- mov TMP_SMOKE.SMOKE_SIB_CNTR,0 mov cx,1 ;number of additional smokes jmp InitGnd1 ;--------------------------- InitCrater2 LABEL NEAR ;--------------------------- mov TMP_SMOKE.SMOKE_SIB_CNTR,0 mov cx,3 ;number of additional smokes jmp InitGnd1 ;--------------------------- InitCrater3 LABEL NEAR ;--------------------------- mov TMP_SMOKE.SMOKE_SIB_CNTR,0 mov cx,7 ;number of additional smokes jmp InitGnd1 ;--------------------------- InitBurning LABEL NEAR ;--------------------------- mov TMP_SMOKE.SMOKE_SIB_CNTR,10 mov cx,9 ;number of additional smokes jmp InitGnd1 ;--------------------------- InitKickUp LABEL NEAR ;--------------------------- mov TMP_SMOKE.SMOKE_SIB_CNTR,0 mov cx,3 ;number of additional smokes ;--------------------------- InitGnd1 PROC NEAR ;--------------------------- ;------------------ ;* init first smoke (always at viewpoint datum) ;------------------ mov TMP_SMOKE.SMOKE_TYPE,STYPE_GND1 RND_SMOKE_COL mov TMP_SMOKE.SMOKE_FLAGS,0 mov TMP_SMOKE.SMOKE_ZFINE,0 mov TMP_SMOKE.SMOKE_RFT,0 mov TMP_SMOKE.SMOKE_TIME,0 call RandX add ax,128 mov TMP_SMOKE.SMOKE_EXP_TIME,ax push cx push si call MakeSingleSmoke pop si pop cx ;------------------------ ;* init additional smokes ;------------------------ jcxz InitGnd1Exit ;no additional smokes -> AddSmokeLoop: push cx RND_SMOKE_COL call RandX add ax,128 mov TMP_SMOKE.SMOKE_EXP_TIME,ax ;* offset xft from origin (keep within sector) call RandX cbw sar ax,1 ;-64ft .. +63ft offset add ax,[si].VP_XFT cmp ax,8191 jle @F mov ax,8191 @@: cmp ax,-8192 jge @F mov ax,-8192 @@: mov TMP_SMOKE.SMOKE_XFT,ax ;* offset yft from origin (keep within sector) call RandX cbw sar ax,1 ;-64ft .. +63ft offset add ax,[si].VP_YFT cmp ax,8191 jle @F mov ax,8191 @@: cmp ax,-8192 jge @F mov ax,-8192 @@: mov TMP_SMOKE.SMOKE_YFT,ax push si call MakeSingleSmoke pop si pop cx loop AddSmokeLoop InitGnd1Exit: ret InitGnd1 ENDP ;---------------------------------------------------------------------------- ;* InitAir1 - init air smoke type 1 effects ;* ;* InitAirExplo - init smoke for SMOKE_AIR_EXPLO effect ;* InitAirTrail - init smoke for SMOKE_AIR_TRAIL effect ;* ;* pass: si -> VIEWPOINT data block ;* TMP_SMOKE ;* ret : TMP_SMOKE ;* kill: assume all ;--------------------------- InitAirExplo LABEL NEAR ;--------------------------- mov cx,15 ;number of additional smokes jmp InitAir1 ;--------------------------- InitAirTrail LABEL NEAR ;--------------------------- mov cx,3 ;number of additional smokes ;--------------------------- InitAir1 PROC NEAR ;--------------------------- push cx push si call CalcGndHeight pop si pop cx mov bp,ax ;bp = ground height ;------------------ ;* init first smoke (always at viewpoint datum) ;------------------ mov TMP_SMOKE.SMOKE_TYPE,STYPE_AIR1 RND_SMOKE_COL mov TMP_SMOKE.SMOKE_FLAGS,0 mov TMP_SMOKE.SMOKE_ZFINE,0 mov TMP_SMOKE.SMOKE_RFT,0 mov TMP_SMOKE.SMOKE_TIME,0 mov TMP_SMOKE.SMOKE_SIB_CNTR,0 call RandX add ax,128 mov TMP_SMOKE.SMOKE_EXP_TIME,ax call CheckAirPos push cx push si push bp call MakeSingleSmoke pop bp pop si pop cx ;------------------------ ;* init additional smokes ;------------------------ jcxz InitAir1Exit ;no additional smokes -> AirSmokeLoop: push cx RND_SMOKE_COL call RandX add ax,128 mov TMP_SMOKE.SMOKE_EXP_TIME,ax ;* offset xft from origin (keep within sector) call RandX cbw sar ax,1 ;-64ft .. +63ft offset add ax,[si].VP_XFT cmp ax,8191 jle @F mov ax,8191 @@: cmp ax,-8192 jge @F mov ax,-8192 @@: mov TMP_SMOKE.SMOKE_XFT,ax ;* offset yft from origin (keep within sector) call RandX cbw sar ax,1 ;-64ft .. +63ft offset add ax,[si].VP_YFT cmp ax,8191 jle @F mov ax,8191 @@: cmp ax,-8192 jge @F mov ax,-8192 @@: mov TMP_SMOKE.SMOKE_YFT,ax ;* offset zft from origin call RandX cbw sar ax,1 ;-64ft .. +63ft offset cwd add ax,WORD PTR [si].VP_ZFT_LO adc dx,WORD PTR [si].VP_ZFT_HI jns @F xor ax,ax xor dx,dx @@: mov WORD PTR TMP_SMOKE.SMOKE_ZFT_LO,ax mov WORD PTR TMP_SMOKE.SMOKE_ZFT_HI,dx call CheckAirPos push si push bp call MakeSingleSmoke pop bp pop si pop cx loop AirSmokeLoop InitAir1Exit: ret InitAir1 ENDP ;---------------------------------------------------------------------------- ;* CheckAirPos - check air smoke does not penetrate ground ;* ;* pass: TMP_SMOKE ;* bp = ground height ;* ret : TMP_SMOKE ;* kill: ax, dx, flags CheckAirPos PROC NEAR ;* if zft < 65536 then ;* ;* zdiff = zft - ground height ;* ;* if zdiff < 0 then ;* zft = ground height + 32 ;* expand time = 128 ;* else ;* if zdiff < expand time / 4 then ;* expand time = zdiff * 4 ;* if expand time < 128 then ;* zft = ground height + 32 ;* expand time = 128 ;* endif ;* endif ;* endif ;* endif cmp WORD PTR TMP_SMOKE.SMOKE_ZFT_HI,0 ja ExitAirPos mov ax,WORD PTR TMP_SMOKE.SMOKE_ZFT_LO sub ax,bp jb SetMinSize mov dx,TMP_SMOKE.SMOKE_EXP_TIME REPT 2 shr dx,1 ENDM cmp ax,dx jae ExitAirPos REPT 2 shl ax,1 ENDM cmp ax,128 jae @F SetMinSize: mov ax,bp add ax,32 mov WORD PTR TMP_SMOKE.SMOKE_ZFT_LO,ax mov ax,128 @@: mov TMP_SMOKE.SMOKE_EXP_TIME,ax ExitAirPos: ret CheckAirPos ENDP ;---------------------------------------------------------------------------- ;* ScanSmoke - scan smoke buffer and draw smoke ;* ;* pass: nothing ;* ret : nothing ;* kill: assume all ;* ;* note: Smoke circles are low priority objects and could possibly clog the ;* object buffer. Therefore call this routine "later on" in the visual ;* drawing order. ScanSmoke PROC NEAR ;----------- ;* scan loop ;----------- mov cx,NUM_SMOKE mov si,OFFSET SmokeBuffer mov ax,SMOKEDATA mov ds,ax SmokeLoop: cmp [si].SMOKE_TYPE,STYPE_NULL ;smoke active? jne SortSmoke ;yes -> NextSmoke: add si,SMOKE_REC_SIZE loop SmokeLoop mov ax,DATA mov ds,ax ret ;----------------------------------- ;* copy smoke data into working copy ;----------------------------------- SortSmoke: push cx ;store loop count push si ;store smoke ptr mov di,OFFSET TMP_SMOKE mov cx,SMOKE_REC_SIZE FAST_MOVE mov ax,DATA mov ds,ax ;-------------- ;* update smoke ;-------------- mov bx,TMP_SMOKE.SMOKE_TYPE call CtrlSmoke[bx] jc @F ;smoke cleared -> ;------------ ;* draw smoke ;------------ mov si,OFFSET TMP_SMOKE call DrawSmoke ;----------------------------------- ;* copy smoke data from working copy ;----------------------------------- @@: pop di ;smoke ptr push di mov cx,SMOKE_REC_SIZE mov si,OFFSET TMP_SMOKE mov ax,SMOKEDATA mov es,ax FAST_MOVE mov ax,DATA mov es,ax ;------------------------------- ;* prepare to re-enter scan loop ;------------------------------- mov ax,SMOKEDATA mov ds,ax pop si ;restore smoke ptr pop cx ;restore loop count jmp NextSmoke ScanSmoke ENDP ;---------------------------------------------------------------------------- ;* CtrlNull ;* ;* pass: nothing ;* ret : cf = 1 = smoke cleared ;* kill: nothing CtrlNull PROC NEAR stc ret CtrlNull ENDP ;---------------------------------------------------------------------------- ;* CtrlGnd1 - control routine for ground smoke type 1 ;* ;* pass: TMP_SMOKE ;* ret : TMP_SMOKE ;* cf = 0 = smoke ok ;* cf = 1 = smoke cleared ;* kill: assume all (except cf) ;* ;* note: Phase 1: Expand radius keeping base of smoke on crater base. ;* Phase 2: Contract radius and drift upwards until radius is zero. CtrlGnd1 PROC NEAR ;-------------- ;* update timer ;-------------- mov ax,TMP_SMOKE.SMOKE_TIME add ax,LastFrame mov TMP_SMOKE.SMOKE_TIME,ax ;------------ ;* sort phase ;------------ mov dx,TMP_SMOKE.SMOKE_EXP_TIME cmp ax,dx ;expand phase? jbe Gnd1Phase1 ;yes -> sub ax,dx shl dx,1 ;contract phase is double expand phase cmp ax,dx ;contract phase? jbe Gnd1Phase2 ;yes -> ;------------------- ;* end of smoke life ;------------------- mov TMP_SMOKE.SMOKE_TYPE,STYPE_NULL stc ;cf = 1 = smoke cleared ret ;--------------------------- Gnd1Phase1 LABEL NEAR ;expand radius ;--------------------------- REPT 2 ;radius = time / 4 shr ax,1 ENDM mov dx,TMP_SMOKE.SMOKE_RFT mov TMP_SMOKE.SMOKE_RFT,ax ;* reset base zft sub WORD PTR TMP_SMOKE.SMOKE_ZFT_LO,dx sbb WORD PTR TMP_SMOKE.SMOKE_ZFT_HI,0 ;* set centre zft wrt radius add WORD PTR TMP_SMOKE.SMOKE_ZFT_LO,ax adc WORD PTR TMP_SMOKE.SMOKE_ZFT_HI,0 clc ;cf = 0 = smoke ok ret ;--------------------------- Gnd1Phase2 LABEL NEAR ;contract radius and drift upwards ;--------------------------- ;* reproduce sibling? test TMP_SMOKE.SMOKE_FLAGS,SFLG_REPRO ;already reproduced? _JNZ SkipRepro ;yes -> cmp TMP_SMOKE.SMOKE_SIB_CNTR,0 ;reproduce any more? _JE SkipRepro ;no -> ;* reproduce push ax push dx dec TMP_SMOKE.SMOKE_SIB_CNTR push WORD PTR TMP_SMOKE.SMOKE_COL ;(col + flags) push WORD PTR TMP_SMOKE.SMOKE_ZFT_LO push WORD PTR TMP_SMOKE.SMOKE_ZFT_HI push TMP_SMOKE.SMOKE_ZFINE push TMP_SMOKE.SMOKE_RFT push TMP_SMOKE.SMOKE_TIME push TMP_SMOKE.SMOKE_EXP_TIME mov ax,TMP_SMOKE.SMOKE_RFT sub WORD PTR TMP_SMOKE.SMOKE_ZFT_LO,ax ;reset base zft sbb WORD PTR TMP_SMOKE.SMOKE_ZFT_HI,0 RND_SMOKE_COL mov TMP_SMOKE.SMOKE_FLAGS,0 mov TMP_SMOKE.SMOKE_ZFINE,0 mov TMP_SMOKE.SMOKE_RFT,0 mov TMP_SMOKE.SMOKE_TIME,0 call RandX add ax,128 mov TMP_SMOKE.SMOKE_EXP_TIME,ax call MakeSingleSmoke pop TMP_SMOKE.SMOKE_EXP_TIME pop TMP_SMOKE.SMOKE_TIME pop TMP_SMOKE.SMOKE_RFT pop TMP_SMOKE.SMOKE_ZFINE pop WORD PTR TMP_SMOKE.SMOKE_ZFT_HI pop WORD PTR TMP_SMOKE.SMOKE_ZFT_LO pop WORD PTR TMP_SMOKE.SMOKE_COL ;(col + flags) or TMP_SMOKE.SMOKE_FLAGS,SFLG_REPRO pop dx pop ax SkipRepro: shr dx,1 shr ax,1 sub dx,ax REPT 2 ;radius = (expand time - time) / 4 shr dx,1 ENDM mov TMP_SMOKE.SMOKE_RFT,dx ;* drift upwards mov ax,DeltaTime xor dx,dx REPT 6 ;climb rate = 32ft / sec (64 * bin frac) shl ax,1 rcl dx,1 ENDM add TMP_SMOKE.SMOKE_ZFINE,ax add WORD PTR TMP_SMOKE.SMOKE_ZFT_LO,dx adc WORD PTR TMP_SMOKE.SMOKE_ZFT_HI,0 clc ;cf = 0 = smoke ok ret CtrlGnd1 ENDP ;---------------------------------------------------------------------------- ;* CtrlAir1 - control routine for air smoke type 1 ;* ;* pass: TMP_SMOKE ;* ret : TMP_SMOKE ;* cf = 0 = smoke ok ;* cf = 1 = smoke cleared ;* kill: assume all (except cf) ;* ;* note: Phase 1: Expand radius. ;* Phase 2: Contract radius. CtrlAir1 PROC NEAR ;-------------- ;* update timer ;-------------- mov ax,TMP_SMOKE.SMOKE_TIME add ax,LastFrame mov TMP_SMOKE.SMOKE_TIME,ax ;------------ ;* sort phase ;------------ mov dx,TMP_SMOKE.SMOKE_EXP_TIME cmp ax,dx ;expand phase? jbe Air1Phase1 ;yes -> sub ax,dx shl dx,1 ;contract phase is double expand phase cmp ax,dx ;contract phase? jbe Air1Phase2 ;yes -> ;------------------- ;* end of smoke life ;------------------- mov TMP_SMOKE.SMOKE_TYPE,STYPE_NULL stc ;cf = 1 = smoke cleared ret ;--------------------------- Air1Phase1 LABEL NEAR ;expand radius ;--------------------------- REPT 2 ;radius = time / 4 shr ax,1 ENDM mov TMP_SMOKE.SMOKE_RFT,ax clc ;cf = 0 = smoke ok ret ;--------------------------- Air1Phase2 LABEL NEAR ;contract radius ;--------------------------- shr dx,1 shr ax,1 sub dx,ax REPT 2 ;radius = (expand time - time) / 4 shr dx,1 ENDM mov TMP_SMOKE.SMOKE_RFT,dx clc ;cf = 0 = smoke ok ret CtrlAir1 ENDP VISCODE ENDS ;============================================================================ END
비교하기