home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Hack-Phreak Scene Programs
/
cleanhpvac.zip
/
cleanhpvac
/
CONTRSRC.ZIP
/
SRC
/
TYPEONE
/
DPLASMA.ASM
< prev
next >
Wrap
Assembly Source File
|
1994-11-12
|
18KB
|
649 lines
;*************************************************
; DOUBLE PLASMA (C) 1994 Type One / TFL-TDV Prod.
;*************************************************
INCLUDE PDFIK.INC ; DataFile Manager
INCLUDE VIDEO.INC ; Flamoot VGA SetUp
INCLUDE PLAYINFO.INC ; Player structures
INCLUDE KEYBOARD.INC ; keyboard macros
;-----------------------------------------
; Déclaration modèle mémoire
.386
DGROUP GROUP _DATA,_BSS
DPLASM_TEXT SEGMENT DWORD PUBLIC USE16 'CODE'
ASSUME CS:DPLASM_TEXT,DS:DGROUP
DPLASM_TEXT ENDS
_DATA SEGMENT DWORD PUBLIC USE16 'DATA'
_DATA ENDS
_BSS SEGMENT DWORD PUBLIC USE16 'BSS'
_BSS ENDS
;-----------------------------------------
_DATA SEGMENT
; Quelques constantes bien utiles ......
Larg = 320 ; hauteur de l'écran en pixels
Haut = 800 ; largeur de l'écran en pixels
Windowx = 320 ; largeur fenetre
Windowy = 800 ; hauteur fenetre
Screen1 = 0
Screen2 = (Larg*Haut/2)/4
;---------------------------------------------
;-- donnees pattern --
EXTRN _Datafile : BYTE
EXTRN _OfsinDta : DWORD
Picname BYTE 'plasma.raw',0
Picname2 BYTE 'plasma2.raw',0
Picparam PARAM_STRUC<2,DGROUP,OFFSET _Datafile,OFFSET Picname,0,0,0,,,0>
EVEN
; plasma parameters
Yptr WORD 0 ; pointeur sinus en y
Xptr WORD 0 ; pointeur sinus en x
XSptr WORD 0 ; pointeur sinus en x-scaling
Yptr2 WORD 0
Xptr2 WORD 0
XSptr2 WORD 0
cumul_step_lo DD 0
cumul_step_hi DD 0
cumul_old_lo DD 0
cumul_old_hi DD 0
EXTRN _BlackPal: BYTE
EXTRN _WhitePal: BYTE
_DATA ENDS
; données non initialisées
;--------------------------
_BSS SEGMENT
EXTRN _FrameCounter : WORD
EXTRN _SinusTbl : WORD ; table sinus*256
EXTRN _StartAdr : WORD
EXTRN _WorkAdr : WORD
EXTRN _NextAdr : WORD
EXTRN _Triple : WORD
EXTRN _SyncFlag : WORD
EXTRN _TmpPal : BYTE
EXTRN _FadeON : WORD
;!!!!!!!!!! synchro avec music !!!!!!!!!!!!
EXTRN _MP : DWORD ; extern ModulePlayer * MB
EXTRN _ReplayInfo : mpInformation
;---- param pour synchro avec zizik ----
EVEN
DebSong WORD ?
FinSong WORD ?
EVEN
Picseg WORD ? ; ptr vers patterns segments
Picseg2 WORD ?
Timeleft WORD ? ; temps restant pour execution
FadeFlag WORD ? ; flag pour fading
FadePtr1 WORD 2 DUP(?) ; ptr sur palette a fader
FadePtr2 WORD 2 DUP(?)
Delai WORD ?
Termine WORD ? ; flag pour terminer !!!
CurStep WORD ? ; current step !!!
_BSS ENDS
DPLASM_TEXT SEGMENT
PUBLIC _StartDouble
EXTRN _AveragePAL: FAR
ALIGN
EVEN
; Point d'entrée de l'intro !!!!!
;---------------------------------
_StartDouble PROC FAR
push bp ; bâtit le cadre de pile
mov bp,sp
pushad
MPUSH ds,es,fs,gs
STARTUP
;------- recuperer parametres sur le stack !!!! --------
mov ax,WORD PTR ss:[bp+6] ; debut pos
shl eax,14
or ax,WORD PTR ss:[bp+8] ; debut row
or ah,al
shr eax,8
mov DebSong,ax
mov ax,WORD PTR ss:[bp+10] ; fin pos
shl eax,14
or ax,WORD PTR ss:[bp+12] ; fin row
or ah,al
shr eax,8
mov FinSong,ax
xor eax,eax
;-------------------------------------------------------
push m320x400x256p
call _SetVGA
add sp,2
STARTUP
;--------------------------------------
call DPlasma ; !!!!! plasma part !!!!!
;--------------------------------------
mov ax,0a000h ; Clear screen
mov es,ax
mov dx,3c4h
mov ax,0f02h
out dx,ax
xor eax,eax
xor di,di
mov cx,65536/4
rep stosd
MPOP ds,es,fs,gs
popad
nop
leave ; restore stack
; mov sp,bp + pop bp
retf
_StartDouble ENDP
;==============================================================================
;============================ Plasma part =====================================
;==============================================================================
DPlasma PROC NEAR
NEXTSTEP MACRO
LOCAL lbl1
;------------ FrameCounter manip ------------
MPUSH eax,ebx,ecx,edx
mov cx,_FrameCounter
test cx,cx
jnz lbl1
mov cx,1
lbl1: xor eax,eax
mov ah,cl ; frame*256
; mov ax,256 ;307 ; 1.2*256 = factor
; mul cx
mov ecx,cumul_step_lo ; save old cumulated step (64 bits)
mov cumul_old_lo,ecx
mov ecx,cumul_step_hi
mov cumul_old_hi,ecx
add cumul_step_lo,eax ; multiprecision
adc cumul_step_hi,0
mov ecx,cumul_step_hi
mov eax,cumul_step_lo
shrd eax,ecx,8 ; / 256
mov edx,cumul_old_hi
mov ebx,cumul_old_lo
shrd ebx,edx,8
sub eax,ebx
; sbb ecx,edx
mov CurStep,ax ; CurStep = factor * FrameCounter
mov _FrameCounter,0
MPOP eax,ebx,ecx,edx
;--------------------------------------------
ENDM
;------------------------------------------------------------------------------
pushad
; charger 1ère image
mov eax,_OfsinDta ; OFFSET in Datafile
mov Picparam.OfsInPdf,eax
mov ax,DGROUP ; prepare for PDFIK call
mov es,ax
mov bx,OFFSET Picparam
pusha
call PDFIK_ASM ; call function 2 (extract+alloc)
popa
mov ax,Picparam.BufSeg ; where is the file in mem ?
mov Picseg,ax
; charger 2ème image
mov ax,DGROUP
mov es,ax
mov bx,OFFSET Picparam
mov Picparam.DtaOfsFil,OFFSET Picname2 ; name of pic 2
pusha
call PDFIK_ASM
popa
mov ax,Picparam.BufSeg
mov Picseg2,ax
push ds
push es
mov ax,Picseg
mov ds,ax ; 32 bytes for Alchemy Header
mov si,32 ; palette offset
mov es,ax
mov di,32
mov cx,768 ; 256*3 components
@@: lodsb
shr al,2 ; 8 to 6 bits conversion
stosb
dec cx
jnz @B
pop es
pop ds
;---------------
STARTUP
;---- wait right position/row in tune ----
WaitPos:
mov _ReplayInfo.numChannels,4 ; 4 voices
les bx,DWORD PTR[_MP]
push ds
push OFFSET _ReplayInfo
; _MP->GetInformation(&ReplayInfo)
call (ModulePlayer PTR es:[bx]).GetInformation
add sp,4
mov ax,_ReplayInfo.pos
shl eax,14
or ax,_ReplayInfo.row
or ah,al
shr eax,8
cmp ax,WORD PTR[DebSong] ; is it time ????
jb WaitPos
xor eax,eax
;------------------------------------------
mov Termine,0 ; pas encore terminer !!!
mov bx,_StartAdr
mov WORD PTR[bx],Screen1 ; _StartAdr->base = 0
mov bx,_WorkAdr
mov WORD PTR[bx],Screen2 ; _WorkAdr->base
mov WORD PTR[bx+2],0 ; _WorkAdr->flag=false
mov _Triple,0 ; double buffering
mov _FadeON,0
mov FadeFlag,0
mov FadePtr1,OFFSET _BlackPal ; Black to pic for the beginning !!!
mov ax,ds
mov FadePtr1+2,ax
mov FadePtr2,32
mov ax,Picseg
mov FadePtr2+2,ax
; mov ax,_FrameCounter
; mov Delai,ax
mov _FrameCounter,0
mov Delai,0
mov _SyncFlag,1
VSYNC
EVEN
MainPlasma: ; -= VSYNC =-
wait_for_VBL: ; wait for Sync Flag
cmp _SyncFlag,1
jne wait_for_VBL
mov _SyncFlag,0
NEXTSTEP ; new step !!!
mov cx,CurStep ; nombre de VBLs perdues...
@@: ; (incrementer suivant le nb de VBLs)
add Yptr,6 ; pointeur sinus vertical (moving)
and Yptr,1023
add Xptr,4 ; pointeur sinus horizontal (moving)
and Xptr,1023
add XSptr,8 ; pointeur sinus horizontal (scaling)
and XSptr,1023
add Yptr2,4 ; pointeurs 2ème plasma
and Yptr2,1023
add Xptr2,6
and Xptr2,1023
add XSptr2,6
and XSptr2,1023
dec cx ; loop @B
jnz @B
cmp FadeFlag,255
jb NewFade
cmp Termine,1 ; Terminer si dernier fade fini
je GoOutPlasma
mov _FadeON,0 ; don't set _TmpPal anymore ...
jmp @F
NewFade: mov ax,FadeFlag ; average Black-MyPal
push ax
push ds
push OFFSET _TmpPal
mov ax,FadePtr1+2
push ax
mov ax,FadePtr1
push ax
mov ax,FadePtr2+2
push ax
mov ax,FadePtr2
push ax
call _AveragePAL
add sp,7*2
mov _FadeON,1 ; set new PAL during next VR !!!!
mov cx,CurStep
sub cx,Delai ; temps chargement
mov Delai,0 ; plus delai ....
test cx,cx
jnz Faddi
inc cx
Faddi: add FadeFlag,4 ; inc fade ..
dec cx
jnz Faddi
@@:
;----------- test if we must finish ... ----------
mov _ReplayInfo.numChannels,4 ; 4 voices
les bx,DWORD PTR[_MP]
push ds
push OFFSET _ReplayInfo
; _MP->GetInformation(&ReplayInfo)
call (ModulePlayer PTR es:[bx]).GetInformation
add sp,4
mov ax,_ReplayInfo.pos
shl eax,14
or ax,_ReplayInfo.row
or ah,al
shr eax,8
cmp ax,WORD PTR[FinSong] ; is it time ????
jb @F ; to fade off ???
mov Termine,1
cmp FadePtr2,OFFSET _BlackPal
je @F
mov FadeFlag,0
mov eax,DWORD PTR[FadePtr2]
mov DWORD PTR[FadePtr1],eax ; fade to black !!!!
mov ax,ds
mov FadePtr2+2,ax
mov FadePtr2,OFFSET _BlackPal
@@: xor eax,eax
;--------------------------------------------------------------------
SHOWTIME 32
call DPlasma_It
SHOWTIME 0
mov bx,_WorkAdr ; New screen base
mov WORD PTR[bx+2],1 ; _WorkAdr->flag = true
LOOP_UNTIL_KEY MainPlasma
GoOutPlasma:
FLUSH_KEYBUF ; Flush keyboard buffer !!! ;-)
mov _FadeON,0 ; to be sure ....
;----- EXIT -----
STARTUP
mov ax,Picseg2 ; segment to free
mov es,ax
mov ah,49h ; MFREE
int 21h
mov ax,Picseg ; segment to free
mov es,ax
mov ah,49h ; MFREE
int 21h
popad
nop
ret
DPlasma ENDP
;==============================================================================
ALIGN
EVEN
DPlasma_It PROC NEAR ; mouvement du plasma
YSINE TEXTEQU <1234h>
push ds
; ------- 1st plasma -------
; patcher sinus vertical (moving) !!!!
mov si,OFFSET _SinusTbl ; base sinus !
add si,Yptr ; + offset
mov di,OFFSET patch_it+2 ; 1er patch !
xor dx,dx
mov cx,40 ; pour tous les mov al,[bx+...]
EVEN
@@:
lodsw ; charger sinus*256
sal ax,6
xor al,al
add ax,dx
inc dx
mov cs:[di],ax ; poker dans le code
add di,4 ; patcher les offsets dans le code !
lodsw
sal ax,6
xor al,al
add ax,dx
inc dx
mov cs:[di],ax
add di,5
dec cx ; loop @B
jnz @B
; patcher sinus horizontal (scaling) !!!!
mov si,OFFSET _SinusTbl ; base sinus !
add si,XSptr ; + offset
mov di,OFFSET patch_it+2 ; 1er patch !
mov cx,40 ; pour tous les mov al,[bx+...]
EVEN
@@: lodsw ; charger sinus*256
sar ax,2
add cs:[di],ax ; poker dans le code
add di,4 ; patcher les offsets dans le code !
lodsw
sar ax,2
add cs:[di],ax
add di,5
dec cx ; loop @B
jnz @B
; ------- 2nd plasma --------
; patcher sinus vertical (moving) no 2 !!!!
mov si,OFFSET _SinusTbl ; base sinus !
add si,Yptr2 ; + offset
mov di,OFFSET patch_it2+2 ; 1er patch !
xor dx,dx
mov cx,40 ; pour tous les mov al,[bx+...]
EVEN
@@:
lodsw ; charger sinus*256
sal ax,6
xor al,al
add ax,dx
inc dx
mov cs:[di],ax ; poker dans le code
add di,4 ; patcher les offsets dans le code !
lodsw
sal ax,6
xor al,al
add ax,dx
inc dx
mov cs:[di],ax
add di,5
dec cx ; loop @B
jnz @B
; patcher sinus horizontal (scaling) no 2 !!!!
mov si,OFFSET _SinusTbl ; base sinus !
add si,XSptr2 ; + offset
mov di,OFFSET patch_it2+2 ; 1er patch !
mov cx,40 ; pour tous les mov al,[bx+...]
EVEN
@@: lodsw ; charger sinus*256
sar ax,2
add cs:[di],ax ; poker dans le code
add di,4 ; patcher les offsets dans le code !
lodsw
sar ax,2
add cs:[di],ax
add di,5
dec cx ; loop @B
jnz @B
push fs
;------------ 1st plasma ---------------
; 2D plasming
mov ax,0a000h ; Screen base
mov es,ax
mov di,_WorkAdr ; offset 0
mov di,WORD PTR[di] ; screen page
add di,50*80
push ds ; mov ax,ds
pop gs ; mov gs,ax
mov si,OFFSET _SinusTbl
add si,Xptr
xor bp,bp
mov ax,PicSeg ; Picture base
add ax,(768+32) SHR 4 ; Skip Alchemy Header
mov ds,ax
mov cx,150 ; 200 lines
EVEN
Fill: ; 1st plasma
mov bx,gs:[si] ; pointeur sur table sinus
sar bx,2
add si,2
add bx,bp ; nouveau X-sinus
; calcul d'une ligne ...
patch_it LABEL WORD
REPT 40 ; 320 pixels width
mov al,[bx+YSINE] ; prendre valeur sur map
mov ah,[bx+YSINE]
stosw
ENDM
add bp,256 ; ligne suivante
add di,80
dec cx
jnz Fill
; ------------ 2nd plasma -------------
mov di,WORD PTR gs:[_WorkAdr] ; offset 0
mov di,WORD PTR gs:[di] ; screen page
add di,50*80
mov si,OFFSET _SinusTbl
add si,WORD PTR gs:[Xptr2]
xor bp,bp
mov ax,gs:WORD PTR[PicSeg2] ; Picture base no 2
add ax,(768+32) SHR 4 ; Skip Alchemy header
mov ds,ax
add di,80
mov cx,150 ; 200 lines
EVEN
Fill2: ; 2nd plasma
;select new trame
mov bx,gs:[si] ; pointeur sur table sinus
sar bx,2
add si,2
add bx,bp ; nouveau X-sinus
; calcul d'une ligne ...
patch_it2 LABEL WORD
REPT 40 ; 320 pixels width
mov al,[bx+YSINE] ; prendre valeur sur map
mov ah,[bx+YSINE]
stosw
ENDM
add bp,256 ; ligne suivante
add di,80
dec cx
jnz Fill2
pop fs
pop ds
ret
DPlasma_It ENDP
;==============================================================================
DPLASM_TEXT ENDS
END