home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / CONTRSRC.ZIP / SRC / TYPEONE / MULFIRE.ASM < prev    next >
Assembly Source File  |  1994-11-04  |  14KB  |  578 lines

  1. ;***************************************************
  2. ;* Multi-Fire effect / Type One 1994 TFL-TDV Prod. *
  3. ;***************************************************
  4.  
  5. INCLUDE VIDEO.INC ; Flamoot VGA SetUp
  6. INCLUDE PLAYINFO.INC ; Player structures
  7. INCLUDE KEYBOARD.INC ; Keyboard macros
  8.  
  9. ;-----------------------------------------
  10. ; Déclaration modèle mémoire
  11. .386
  12. DGROUP GROUP _DATA,_BSS
  13. MFIRE_TEXT  SEGMENT DWORD PUBLIC USE16 'CODE'
  14.             ASSUME CS:MFIRE_TEXT,DS:DGROUP
  15. MFIRE_TEXT  ENDS
  16. _DATA  SEGMENT DWORD PUBLIC USE16 'DATA'
  17. _DATA  ENDS
  18. _BSS   SEGMENT DWORD PUBLIC USE16 'BSS'
  19. _BSS   ENDS
  20. ;-----------------------------------------
  21.  
  22. _DATA SEGMENT
  23.  
  24. ; qques constantes ...
  25. Hght=40 
  26. Wdth=80
  27. Meche=2 
  28. Larg=320
  29. Haut=400
  30. Debut=40
  31.  
  32. Screen1 = 0
  33. Screen2 = (Larg*Haut/4)
  34.  
  35. Pal LABEL BYTE                ; fire pal
  36.     i=0
  37.     REPT 32
  38.     DB i*2,i,0                ; red
  39.     i=i+1
  40.     ENDM
  41.     i=0
  42.     REPT 32
  43.     DB 63,32+i,i*2
  44.     i=i+1
  45.     ENDM
  46.  
  47.     i=0
  48.     REPT 32
  49.     DB 0,i,i*2                ; blue
  50.     i=i+1
  51.     ENDM
  52.     i=0
  53.     REPT 32
  54.     DB i*2,32+i,63
  55.     i=i+1
  56.     ENDM
  57.  
  58.     i=0
  59.     REPT 32
  60.     DB i,0,i*2                ; mauf
  61.     i=i+1
  62.     ENDM
  63.     i=0
  64.     REPT 32
  65.     DB 32+i,i,63
  66.     i=i+1
  67.     ENDM
  68.  
  69.     i=0
  70.     REPT 32
  71.     DB 0,i*2,i                ; green
  72.     i=i+1
  73.     ENDM
  74.     i=0
  75.     REPT 32
  76.     DB i,63,32+i
  77.     i=i+1
  78.     ENDM
  79.  
  80. EXTRN _BlackPal: BYTE
  81. EXTRN _WhitePal: BYTE
  82.  
  83. _DATA ENDS
  84.  
  85. ; données non initialisées
  86. ;--------------------------
  87. _BSS SEGMENT
  88.  
  89. ; externes
  90. EXTRN _FrameCounter     : WORD
  91. EXTRN _StartAdr         : WORD 
  92. EXTRN _WorkAdr          : WORD
  93. EXTRN _NextAdr          : WORD
  94. EXTRN _Triple           : WORD
  95. EXTRN _SyncFlag         : WORD
  96. EXTRN _TmpPal           : BYTE
  97. EXTRN _FadeON           : WORD
  98. ;!!!!!!!!!! synchro avec music !!!!!!!!!!!!
  99. EXTRN _MP               : DWORD ; extern ModulePlayer * MB
  100. EXTRN _ReplayInfo       : mpInformation
  101.  
  102.  
  103. ALIGN 4
  104. EVEN
  105. ; fire data
  106. SizeBuf EQU (Hght+2+Meche)*Wdth
  107. BufSeg WORD ?           ; seg of buffer for flames
  108.  
  109. ;---- param pour synchro avec zizik ----
  110. EVEN
  111. DebSong  WORD ?
  112. FinSong  WORD ?
  113.  
  114. Compteur WORD ?
  115.  
  116. EVEN
  117. Timeleft WORD ?        ; temps restant pour execution
  118. FadeFlag WORD ?        ; flag pour fading
  119. FadePtr1 WORD 2 DUP(?) ; ptr sur palette a fader
  120. FadePtr2 WORD 2 DUP(?)
  121. Delai    WORD ?
  122.  
  123. _BSS ENDS
  124.  
  125. MFIRE_TEXT SEGMENT
  126.       EXTRN _GetRandom : FAR 
  127.       EXTRN _AveragePAL : FAR
  128.       PUBLIC _StartMulFire
  129.  
  130.  
  131. ; Point d'entrée de l'intro !!!!!
  132. ;---------------------------------
  133. ALIGN
  134. EVEN
  135. _StartMulFire PROC FAR
  136.  
  137.          push    bp                  ; bâtit le cadre de pile
  138.          mov     bp,sp
  139.          
  140.          pushad
  141.          MPUSH ds,es,fs,gs
  142.  
  143.          STARTUP
  144. ;------- recuperer parametres sur le stack !!!! --------
  145.  
  146.          mov     ax,WORD PTR ss:[bp+6]  ; debut pos
  147.          shl     eax,14        
  148.          or      ax,WORD PTR ss:[bp+8]  ; debut row
  149.          or      ah,al
  150.          shr     eax,8
  151.          mov     DebSong,ax
  152.          mov     ax,WORD PTR ss:[bp+10] ; fin pos
  153.          shl     eax,14 
  154.          or      ax,WORD PTR ss:[bp+12] ; fin row
  155.          or      ah,al
  156.          shr     eax,8
  157.          mov     FinSong,ax
  158.          xor     eax,eax
  159. ;-------------------------------------------------------
  160.  
  161.          push    m320x400x256p
  162.          call    _SetVGA
  163.          add     sp,2
  164.  
  165.          STARTUP
  166. ;--------------------------------------
  167.          call    Mulfire             ; !!!!! multi-fire part !!!!!
  168. ;--------------------------------------
  169.  
  170.          mov     ax,0a000h           ; Clear screen
  171.          mov     es,ax
  172.          mov     dx,3c4h
  173.          mov     ax,0f02h
  174.          out     dx,ax
  175.          xor     eax,eax
  176.          xor     di,di
  177.          mov     cx,65536/4
  178.          rep     stosd
  179.      
  180.          MPOP ds,es,fs,gs
  181.          popad
  182.          nop
  183.  
  184.          leave                       ; restore stack
  185.                                      ; mov sp,bp + pop bp
  186.          retf
  187.  
  188. _StartMulFire ENDP
  189.  
  190. ;*******************
  191. ;* Multi-fire part *
  192. ;*******************
  193. ALIGN
  194. EVEN
  195. Mulfire PROC NEAR
  196.  
  197. ;------------------------------------------------------------------------------
  198.  
  199.          pushad
  200.  
  201.          STARTUP
  202.  
  203.          mov     ah,48h                ; MALLOC
  204.          mov     bx,(SizeBuf SHR 4)+1  ; memory requested
  205.          int     21h
  206.          mov     BufSeg,ax             ; Segment address returned
  207.  
  208.          mov     Timeleft,128          ; val bidon .....
  209.          call    InitBuffer            ; clear flame buffer
  210.  
  211. ;---- wait right position/row in tune ----
  212.  
  213. WaitPos: 
  214.          mov     _ReplayInfo.numChannels,4 ; 4 voices
  215.          
  216.          les     bx,DWORD PTR[_MP]
  217.          push    ds
  218.          push    OFFSET _ReplayInfo
  219.  
  220.          ; _MP->GetInformation(&ReplayInfo)
  221.  
  222.          call    (ModulePlayer PTR es:[bx]).GetInformation
  223.          add     sp,4
  224.  
  225.          mov     ax,_ReplayInfo.pos
  226.          shl     eax,14
  227.          or      ax,_ReplayInfo.row
  228.          or      ah,al
  229.          shr     eax,8
  230.          cmp     ax,WORD PTR[DebSong]  ; is it time ????
  231.          jb      WaitPos
  232.  
  233.          xor     eax,eax   
  234.  
  235. ;------------------------------------------
  236.  
  237.      
  238.          mov     _FadeON,0
  239.          mov     FadeFlag,0
  240.          mov     FadePtr1,OFFSET _BlackPal  ; Black to pic for the beginning !!!
  241.          mov     ax,ds
  242.          mov     FadePtr1+2,ax
  243.          mov     FadePtr2,OFFSET Pal
  244.          mov     ax,ds
  245.          mov     FadePtr2+2,ax
  246. ;         mov     ax,_FrameCounter
  247. ;         mov     Delai,ax
  248.          mov     _FrameCounter,0
  249.          mov     Delai,0
  250.  
  251.          mov     bx,_StartAdr
  252.          mov     WORD PTR[bx],Screen1       ; _StartAdr->base = 0
  253.          mov     bx,_WorkAdr
  254.          mov     WORD PTR[bx],Screen2       ; _WorkAdr->base
  255.          mov     WORD PTR[bx+2],0           ; _WorkAdr->flag=false
  256.          mov     _Triple,0                  ; double buffering
  257.  
  258.          mov     _SyncFlag,1
  259.          VSYNC
  260. EVEN
  261. MainFire: ; -= VSYNC =-
  262. wait_for_VBL:                       ; wait for Sync Flag
  263.          cmp     _SyncFlag,1
  264.          jne      wait_for_VBL
  265.          mov     _SyncFlag,0
  266. wait2frames:
  267.          cmp     _FrameCounter,2    ; REM: assume DS=_DATA
  268.          jb      wait2frames
  269.  
  270.          cmp     FadeFlag,255
  271.          jb      NewFade
  272.          mov     _FadeON,0          ; no more new PAL ....
  273.          jmp     @F
  274. NewFade: mov     ax,FadeFlag        ; average Black-MyPal
  275.          push    ax
  276.          push    ds
  277.          push    OFFSET _TmpPal
  278.          mov     ax,FadePtr1+2
  279.          push    ax         
  280.          mov     ax,FadePtr1
  281.          push    ax
  282.          mov     ax,FadePtr2+2 
  283.          push    ax
  284.          mov     ax,FadePtr2
  285.          push    ax
  286.          call    _AveragePAL
  287.          add     sp,7*2
  288.          mov     _FadeON,1            ; set new PAL during next VR !!!!
  289.          mov     cx,_FrameCounter
  290.          sub     cx,Delai             ; temps chargement
  291.          mov     Delai,0              ; plus delai ....
  292.          test    cx,cx
  293.          jnz     Faddi
  294.          inc     cx
  295. Faddi:   add     FadeFlag,2           ; inc fade ..
  296.          dec     cx
  297.          jnz     Faddi
  298. @@:
  299.  
  300. ;----------- test if we must finish ... ----------
  301.  
  302.          mov     _ReplayInfo.numChannels,4 ; 4 voices
  303.          
  304.          les     bx,DWORD PTR[_MP]
  305.          push    ds
  306.          push    OFFSET _ReplayInfo
  307.  
  308.          ; _MP->GetInformation(&ReplayInfo)
  309.  
  310.          call    (ModulePlayer PTR es:[bx]).GetInformation
  311.          add     sp,4
  312.  
  313.          mov     ax,_ReplayInfo.pos
  314.          shl     eax,14
  315.          or      ax,_ReplayInfo.row
  316.          or      ah,al
  317.          shr     eax,8
  318.          cmp     ax,WORD PTR[FinSong]   ; is it time ????
  319.          jb      PasFin                 ; to stop the fire ????
  320.  
  321.          cmp     Timeleft,0
  322.          je      @F 
  323.          mov     Compteur,64            ; encore 64 pages a calculer ...
  324. @@:  
  325.          mov     Timeleft,0
  326.          xor     eax,eax
  327.  
  328.          dec     Compteur                ; dec compteur de fin
  329.          jz      GoOutFire
  330.  
  331. PasFin:
  332.          mov     _FrameCounter,0 ; set counter to NULL
  333. ;--------------------------------------------------------------------
  334.  
  335.          SHOWTIME 48
  336.  
  337.          call    CalcBuffer          ; average the flame
  338.  
  339.          SHOWTIME 32
  340.    
  341.          call    PutBuffer           ; put it onto screen
  342.  
  343.          SHOWTIME 0
  344.  
  345.          mov    bx,_WorkAdr          ; New screen base
  346.          mov    WORD PTR[bx+2],1     ; _WorkAdr->flag = true
  347.  
  348.  
  349.          LOOP_UNTIL_KEY MainFire
  350.  
  351. GoOutFire:
  352.  
  353.         FLUSH_KEYBUF                  ; Flush keyboard buffer !!! ;-)
  354.  
  355.         mov     _FadeON,0             ; don't set _TmpPal !!!           
  356.  
  357. ;----- EXIT -----
  358.  
  359.         mov     ax,BufSeg             ; segment to free
  360.         mov     es,ax
  361.         mov     ah,49h                ; MFREE
  362.         int     21h
  363.  
  364.         popad
  365.         nop
  366.         ret
  367.  
  368. Mulfire ENDP
  369.  
  370. ;-----------------------------
  371.  
  372. ALIGN
  373. EVEN
  374. InitBuffer PROC NEAR
  375.    MPUSH cx,di,eax,es
  376.  
  377.    mov   cx,Hght*Wdth/4
  378.    mov   ax,BufSeg
  379.    mov   es,ax
  380.    xor   di,di
  381.    xor   eax,eax
  382.    rep   stosd            ; clear flame buffer
  383.  
  384.    MPOP  cx,di,eax,es
  385.    ret
  386. InitBuffer ENDP
  387.  
  388. ;********************************
  389. ; calculate flame averaging ....
  390. ;********************************
  391. ALIGN
  392. EVEN
  393. CalcBuffer PROC NEAR                  ; do a flame into buffer
  394.  
  395.       MPUSH eax,ebx,cx,si,es,ds
  396.  
  397.       cmp   Timeleft,64
  398.       ja    @F
  399.       push  di
  400.       mov   cx,(Wdth/4)*2             ; turn off the fire
  401.       mov   di,Wdth*(Hght+Meche)
  402.       mov   ax,BufSeg
  403.       mov   es,ax
  404.       xor   eax,eax 
  405.       cld
  406.       rep   stosd                     ; water !!! :-)
  407.       pop   di
  408.       jmp   JumpIt
  409.  
  410. @@:
  411.       call  _GetRandom
  412.       mov   bx,ax
  413.       shr   bx,9
  414.  
  415.       mov   cx,Wdth                   ; calculate alea-lines
  416.       mov   si,Wdth*(Hght+Meche)
  417.       mov   ax,BufSeg
  418.       mov   es,ax
  419. EVEN
  420. flam: call  _GetRandom 
  421.       cmp   ax,10000
  422.       ja    @F
  423.       call  _GetRandom 
  424.       mov   bx,ax
  425.       shr   bx,9                      
  426. @@:   mov   BYTE PTR es:[si],bl
  427.       mov   BYTE PTR es:[si+Wdth],bl
  428.       inc   si
  429.       dec   cx                        ; loop  flam
  430.       jnz   flam 
  431.  
  432.  
  433. JumpIt:
  434.  
  435.       push  es
  436.       pop   ds
  437.                                       ; calculate averages
  438.       mov   si,Wdth
  439.       mov   ebx,03f3f3f3fh            ; mask pour parasites
  440.       mov   cx,(Wdth*(Hght+Meche))/4
  441. EVEN
  442. avr:
  443.       lodsd
  444.       add   eax,DWORD PTR[si-1-4]     ; procede by 4 pixels in 1 time
  445.       add   eax,DWORD PTR[si+1-4]
  446.       add   eax,DWORD PTR[si+Wdth-4]
  447.       shr   eax,2                     ; average
  448.       and   eax,ebx
  449.       test  al,al                     ; fade
  450.       jz    @F
  451.       dec   al
  452. @@:   test  ah,ah
  453.       jz    @F
  454.       dec   ah
  455. @@:   ror   eax,16
  456.       test  al,al
  457.       jz    @F
  458.       dec   al
  459. @@:   test  ah,ah
  460.       jz    @F
  461.       dec   ah
  462. @@:   ror   eax,16
  463.   
  464.       mov   DWORD PTR[si-Wdth-4],eax  ; higher !!!
  465.       dec   cx                        ; loop  avr
  466.       jnz   avr
  467.  
  468.       MPOP  eax,ebx,cx,si,es,ds
  469.       ret
  470.  
  471. CalcBuffer ENDP
  472.  
  473. ;************************************
  474. ;* Put the flame buffer onto screen *
  475. ;************************************
  476. ALIGN
  477. EVEN
  478. PutBuffer PROC NEAR
  479.  
  480.       MPUSH eax,bx,cx,dx,ebp,si,di,ds,es,fs
  481.  
  482.       mov   ax,0a000h                 ; put buffer onto screen
  483.       mov   es,ax
  484.  
  485. ; *** first part ***
  486.  
  487.       mov   dx,03c4h
  488.       mov   ax,0a02h
  489.       out   dx,ax                     ; bitplanes 3+1
  490.  
  491.       push  ds
  492.       pop   fs
  493.  
  494.       mov   ax,BufSeg
  495.       mov   ds,ax
  496.       xor   si,si
  497.       mov   di,fs:[_WorkAdr]
  498.       mov   di,WORD PTR fs:[di]       ; screen page
  499.       add   di,Debut*Larg/4 +Wdth*(Hght*2) 
  500.       mov   bx,di
  501.       add   bx,Wdth*(Hght*2)*4-Wdth -Wdth*(Hght*2)*2
  502.  
  503.       mov   ebp,40404040h             ; 4x64
  504.       mov   cx,(Hght*2)/2             ; Flame up/down
  505. EVEN
  506. lbl1:
  507.       mov   dx,cx
  508.       mov   cx,Wdth/4
  509. EVEN
  510. lbl2:
  511.       lodsd
  512.       mov   es:[di+Wdth*2],eax        ; up
  513.       mov   es:[di+Wdth*4],eax
  514.       stosd
  515.       add   eax,ebp                   ; color +64
  516.       mov   es:[bx],eax
  517.       mov   es:[bx-Wdth*2],eax        ; down 
  518.       mov   es:[bx-Wdth*4],eax
  519.       add   bx,4
  520.       dec   cx                        ; loop  lbl2
  521.       jnz   lbl2
  522.       add   di,Wdth*5 
  523.       sub   bx,Wdth*7 
  524.  
  525.       mov   cx,dx
  526.       dec   cx                        ; loop  lbl1
  527.       jnz   lbl1
  528.  
  529. ; *** second part ***
  530.  
  531.       mov   dx,3c4h
  532.       mov   ax,502h                   ; bitplanes 2+0 
  533.       out   dx,ax
  534.  
  535.       mov   di,fs:[_WorkAdr]
  536.       mov   di,WORD PTR fs:[di]       ; screen page
  537.       add   di,Debut*Larg/4 +Wdth/2
  538.       mov   bx,di
  539.       sub   bx,2 
  540.       xor   si,si
  541.       mov   cx,(Hght*2)               ; Flames left/right 
  542. EVEN
  543. lbl4:
  544.       mov   dx,cx
  545.       mov   cx,Wdth/2/2
  546. EVEN
  547. lbl5:
  548.       mov   al,ds:[si]
  549.       mov   ah,ds:[si+Wdth]
  550.       add   ax,8080h                  ; col+128
  551.       mov   es:[di+Wdth*2],ax         ; left
  552.       stosw
  553.       add   ax,4040h                  ; col+128+64
  554.       xchg  al,ah
  555.       mov   es:[bx],ax
  556.       mov   es:[bx+Wdth*2],ax         ; right
  557.       sub   bx,2
  558.       add   si,Wdth*2
  559.       dec   cx                        ; loop  lbl5
  560.       jnz   lbl5
  561.  
  562.       add   di,Wdth*3 +Wdth/2
  563.       add   bx,Wdth*5 -Wdth/2
  564.  
  565.       mov   cx,dx
  566.       sub   si,Wdth*Wdth/2-1 
  567.       dec   cx                        ; loop  lbl4
  568.       jnz   lbl4
  569.  
  570.       MPOP  eax,bx,cx,dx,ebp,si,di,ds,es,fs
  571.       ret
  572.  
  573. PutBuffer ENDP
  574.  
  575. MFIRE_TEXT ENDS
  576.  
  577.       END
  578.