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

  1.  
  2. ;*************************************************
  3. ; DOUBLE PLASMA (C) 1994 Type One / TFL-TDV Prod.
  4. ;*************************************************
  5.                 
  6. INCLUDE PDFIK.INC ; DataFile Manager
  7. INCLUDE VIDEO.INC ; Flamoot VGA SetUp
  8. INCLUDE PLAYINFO.INC ; Player structures
  9. INCLUDE KEYBOARD.INC ; keyboard macros 
  10.  
  11. ;-----------------------------------------
  12. ; Déclaration modèle mémoire
  13. .386
  14. DGROUP GROUP _DATA,_BSS
  15. DPLASM_TEXT  SEGMENT DWORD PUBLIC USE16 'CODE'
  16.              ASSUME CS:DPLASM_TEXT,DS:DGROUP
  17. DPLASM_TEXT  ENDS
  18. _DATA  SEGMENT DWORD PUBLIC USE16 'DATA'
  19. _DATA  ENDS
  20. _BSS   SEGMENT DWORD PUBLIC USE16 'BSS'
  21. _BSS   ENDS
  22. ;-----------------------------------------
  23.  
  24.  
  25. _DATA SEGMENT
  26.  
  27. ; Quelques constantes bien utiles ......
  28.  
  29. Larg = 320       ; hauteur de l'écran en pixels
  30. Haut = 800       ; largeur de l'écran en pixels
  31. Windowx = 320    ; largeur fenetre
  32. Windowy = 800    ; hauteur fenetre
  33.  
  34. Screen1 = 0
  35. Screen2 = (Larg*Haut/2)/4
  36.  
  37. ;---------------------------------------------
  38.  
  39. ;-- donnees pattern --
  40. EXTRN _Datafile  : BYTE
  41. EXTRN _OfsinDta  : DWORD
  42. Picname   BYTE 'plasma.raw',0
  43. Picname2  BYTE 'plasma2.raw',0
  44. Picparam  PARAM_STRUC<2,DGROUP,OFFSET _Datafile,OFFSET Picname,0,0,0,,,0>
  45.  
  46. EVEN
  47. ; plasma parameters
  48. Yptr   WORD 0          ; pointeur sinus en y
  49. Xptr   WORD 0          ; pointeur sinus en x
  50. XSptr  WORD 0          ; pointeur sinus en x-scaling
  51. Yptr2  WORD 0
  52. Xptr2  WORD 0
  53. XSptr2 WORD 0
  54.  
  55. cumul_step_lo DD 0
  56. cumul_step_hi DD 0
  57. cumul_old_lo  DD 0
  58. cumul_old_hi  DD 0
  59.  
  60.  
  61. EXTRN _BlackPal: BYTE
  62. EXTRN _WhitePal: BYTE
  63.  
  64. _DATA ENDS
  65.  
  66. ; données non initialisées
  67. ;--------------------------
  68. _BSS SEGMENT
  69.  
  70. EXTRN _FrameCounter     : WORD
  71. EXTRN _SinusTbl         : WORD  ; table sinus*256
  72. EXTRN _StartAdr         : WORD
  73. EXTRN _WorkAdr          : WORD
  74. EXTRN _NextAdr          : WORD
  75. EXTRN _Triple           : WORD
  76. EXTRN _SyncFlag         : WORD
  77. EXTRN _TmpPal           : BYTE
  78. EXTRN _FadeON           : WORD
  79. ;!!!!!!!!!! synchro avec music !!!!!!!!!!!!
  80. EXTRN _MP               : DWORD ; extern ModulePlayer * MB
  81. EXTRN _ReplayInfo       : mpInformation
  82.  
  83. ;---- param pour synchro avec zizik ----
  84. EVEN
  85. DebSong  WORD ?
  86. FinSong  WORD ?
  87.  
  88.  
  89. EVEN
  90. Picseg    WORD ?   ; ptr vers patterns segments
  91. Picseg2   WORD ?
  92.  
  93. Timeleft  WORD ?        ; temps restant pour execution
  94. FadeFlag WORD ?        ; flag pour fading
  95. FadePtr1 WORD 2 DUP(?) ; ptr sur palette a fader
  96. FadePtr2 WORD 2 DUP(?)
  97. Delai    WORD ?
  98. Termine  WORD ?        ; flag pour terminer !!!
  99.  
  100. CurStep WORD ?         ; current step !!!
  101.  
  102.  
  103. _BSS ENDS
  104.  
  105. DPLASM_TEXT SEGMENT
  106.      PUBLIC _StartDouble
  107.      EXTRN _AveragePAL: FAR
  108.  
  109.  
  110. ALIGN
  111. EVEN
  112. ; Point d'entrée de l'intro !!!!!
  113. ;---------------------------------
  114. _StartDouble PROC FAR
  115.  
  116.          push    bp                  ; bâtit le cadre de pile
  117.          mov     bp,sp
  118.          
  119.          pushad
  120.          MPUSH ds,es,fs,gs
  121.  
  122.          STARTUP
  123. ;------- recuperer parametres sur le stack !!!! --------
  124.  
  125.          mov     ax,WORD PTR ss:[bp+6]  ; debut pos
  126.          shl     eax,14        
  127.          or      ax,WORD PTR ss:[bp+8]  ; debut row
  128.          or      ah,al
  129.          shr     eax,8
  130.          mov     DebSong,ax
  131.          mov     ax,WORD PTR ss:[bp+10] ; fin pos
  132.          shl     eax,14 
  133.          or      ax,WORD PTR ss:[bp+12] ; fin row
  134.          or      ah,al
  135.          shr     eax,8
  136.          mov     FinSong,ax
  137.          xor     eax,eax
  138. ;-------------------------------------------------------
  139.  
  140.          push    m320x400x256p
  141.          call    _SetVGA 
  142.          add     sp,2
  143.  
  144.          STARTUP
  145. ;--------------------------------------
  146.          call    DPlasma             ; !!!!! plasma part !!!!!
  147. ;--------------------------------------
  148.  
  149.          mov     ax,0a000h           ; Clear screen
  150.          mov     es,ax
  151.          mov     dx,3c4h
  152.          mov     ax,0f02h
  153.          out     dx,ax
  154.          xor     eax,eax
  155.          xor     di,di
  156.          mov     cx,65536/4
  157.          rep     stosd
  158.      
  159.          MPOP ds,es,fs,gs
  160.          popad
  161.          nop
  162.  
  163.          leave                       ; restore stack
  164.                                      ; mov sp,bp + pop bp
  165.          retf
  166.  
  167. _StartDouble ENDP
  168.  
  169.  
  170. ;==============================================================================
  171. ;============================ Plasma part =====================================
  172. ;==============================================================================
  173.  
  174. DPlasma PROC NEAR
  175.  
  176. NEXTSTEP MACRO
  177.         LOCAL lbl1
  178.  
  179. ;------------ FrameCounter manip ------------
  180.         MPUSH  eax,ebx,ecx,edx
  181.  
  182.         mov    cx,_FrameCounter
  183.         test   cx,cx
  184.         jnz    lbl1
  185.         mov    cx,1
  186.  
  187. lbl1:   xor    eax,eax
  188.         mov    ah,cl ; frame*256
  189.        ; mov    ax,256 ;307              ; 1.2*256 = factor
  190.        ; mul    cx
  191.  
  192.         mov    ecx,cumul_step_lo   ; save old cumulated step (64 bits)
  193.         mov    cumul_old_lo,ecx
  194.         mov    ecx,cumul_step_hi
  195.         mov    cumul_old_hi,ecx   
  196.      
  197.         add    cumul_step_lo,eax   ; multiprecision
  198.         adc    cumul_step_hi,0
  199.  
  200.         mov    ecx,cumul_step_hi
  201.         mov    eax,cumul_step_lo
  202.         shrd   eax,ecx,8           ; / 256
  203.         mov    edx,cumul_old_hi
  204.         mov    ebx,cumul_old_lo
  205.         shrd   ebx,edx,8
  206.  
  207.         sub    eax,ebx
  208. ;        sbb    ecx,edx
  209.  
  210.         mov    CurStep,ax  ; CurStep = factor * FrameCounter
  211.  
  212.         mov    _FrameCounter,0
  213.  
  214.         MPOP   eax,ebx,ecx,edx
  215. ;--------------------------------------------
  216.  
  217. ENDM
  218.  
  219.  
  220. ;------------------------------------------------------------------------------
  221.  
  222.          pushad
  223.  
  224. ; charger 1ère image
  225.  
  226.          mov     eax,_OfsinDta         ; OFFSET in Datafile
  227.          mov     Picparam.OfsInPdf,eax
  228.          mov     ax,DGROUP             ; prepare for PDFIK call 
  229.          mov     es,ax 
  230.          mov     bx,OFFSET Picparam  
  231.          pusha 
  232.          call    PDFIK_ASM             ; call function 2 (extract+alloc)
  233.          popa
  234.          mov     ax,Picparam.BufSeg ; where is the file in mem ?  
  235.          mov     Picseg,ax
  236.  
  237. ; charger 2ème image
  238.  
  239.          mov     ax,DGROUP
  240.          mov     es,ax
  241.          mov     bx,OFFSET Picparam
  242.          mov     Picparam.DtaOfsFil,OFFSET Picname2 ; name of pic 2
  243.          pusha
  244.          call    PDFIK_ASM
  245.          popa
  246.          mov     ax,Picparam.BufSeg
  247.          mov     Picseg2,ax
  248.  
  249.          push    ds
  250.          push    es
  251.          mov     ax,Picseg
  252.          mov     ds,ax                 ; 32 bytes for Alchemy Header
  253.          mov     si,32                 ; palette offset 
  254.          mov     es,ax
  255.          mov     di,32
  256.  
  257.          mov     cx,768                ; 256*3 components
  258. @@:      lodsb
  259.          shr     al,2                  ; 8 to 6 bits conversion
  260.          stosb
  261.          dec     cx
  262.          jnz     @B
  263.  
  264.          pop     es
  265.          pop     ds
  266.  
  267. ;---------------
  268.  
  269.          STARTUP
  270.  
  271. ;---- wait right position/row in tune ----
  272.  
  273. WaitPos: 
  274.          mov     _ReplayInfo.numChannels,4 ; 4 voices
  275.          
  276.          les     bx,DWORD PTR[_MP]
  277.          push    ds
  278.          push    OFFSET _ReplayInfo
  279.  
  280.          ; _MP->GetInformation(&ReplayInfo)
  281.  
  282.          call    (ModulePlayer PTR es:[bx]).GetInformation
  283.          add     sp,4
  284.  
  285.          mov     ax,_ReplayInfo.pos
  286.          shl     eax,14
  287.          or      ax,_ReplayInfo.row
  288.          or      ah,al
  289.          shr     eax,8 
  290.          cmp     ax,WORD PTR[DebSong]  ; is it time ????
  291.          jb      WaitPos
  292.  
  293.          xor     eax,eax   
  294. ;------------------------------------------
  295.  
  296.          mov     Termine,0 ; pas encore terminer !!!
  297.  
  298.          mov     bx,_StartAdr
  299.          mov     WORD PTR[bx],Screen1         ; _StartAdr->base = 0
  300.          mov     bx,_WorkAdr
  301.          mov     WORD PTR[bx],Screen2         ; _WorkAdr->base
  302.          mov     WORD PTR[bx+2],0             ; _WorkAdr->flag=false
  303.          mov     _Triple,0                    ; double buffering
  304.  
  305.          mov     _FadeON,0
  306.          mov     FadeFlag,0
  307.          mov     FadePtr1,OFFSET _BlackPal  ; Black to pic for the beginning !!!
  308.          mov     ax,ds
  309.          mov     FadePtr1+2,ax
  310.          mov     FadePtr2,32
  311.          mov     ax,Picseg
  312.          mov     FadePtr2+2,ax
  313. ;         mov     ax,_FrameCounter
  314. ;         mov     Delai,ax
  315.          mov     _FrameCounter,0
  316.          mov     Delai,0
  317.  
  318.          mov     _SyncFlag,1
  319.          VSYNC
  320. EVEN
  321. MainPlasma: ; -= VSYNC =-
  322.  
  323. wait_for_VBL:                       ; wait for Sync Flag
  324.          cmp     _SyncFlag,1
  325.          jne      wait_for_VBL
  326.          mov     _SyncFlag,0
  327.  
  328.          NEXTSTEP                   ; new step !!!
  329.  
  330.          mov     cx,CurStep   ; nombre de VBLs perdues...
  331. @@:                           ; (incrementer suivant le nb de VBLs)
  332.          add     Yptr,6       ; pointeur sinus vertical (moving)
  333.          and     Yptr,1023
  334.          add     Xptr,4       ; pointeur sinus horizontal (moving)
  335.          and     Xptr,1023
  336.          add     XSptr,8      ; pointeur sinus horizontal (scaling)
  337.          and     XSptr,1023
  338.          add     Yptr2,4      ; pointeurs 2ème plasma
  339.          and     Yptr2,1023
  340.          add     Xptr2,6
  341.          and     Xptr2,1023
  342.          add     XSptr2,6
  343.          and     XSptr2,1023
  344.          dec     cx           ; loop    @B
  345.          jnz     @B
  346.  
  347.  
  348.          cmp     FadeFlag,255
  349.          jb      NewFade
  350.  
  351.          cmp     Termine,1    ; Terminer si dernier fade fini
  352.          je      GoOutPlasma
  353.  
  354.          mov     _FadeON,0    ; don't set _TmpPal anymore ...
  355.          jmp     @F
  356. NewFade: mov     ax,FadeFlag  ; average Black-MyPal
  357.          push    ax
  358.          push    ds
  359.          push    OFFSET _TmpPal
  360.          mov     ax,FadePtr1+2
  361.          push    ax         
  362.          mov     ax,FadePtr1
  363.          push    ax
  364.          mov     ax,FadePtr2+2 
  365.          push    ax
  366.          mov     ax,FadePtr2
  367.          push    ax
  368.          call    _AveragePAL
  369.          add     sp,7*2
  370.          mov     _FadeON,1            ; set new PAL during next VR !!!!
  371.          mov     cx,CurStep
  372.          sub     cx,Delai             ; temps chargement
  373.          mov     Delai,0              ; plus delai ....
  374.          test    cx,cx
  375.          jnz     Faddi
  376.          inc     cx
  377. Faddi:   add     FadeFlag,4           ; inc fade ..
  378.          dec     cx
  379.          jnz     Faddi
  380. @@:
  381.  
  382. ;----------- test if we must finish ... ----------
  383.  
  384.          mov     _ReplayInfo.numChannels,4 ; 4 voices
  385.          
  386.          les     bx,DWORD PTR[_MP]
  387.          push    ds
  388.          push    OFFSET _ReplayInfo
  389.  
  390.          ; _MP->GetInformation(&ReplayInfo)
  391.  
  392.          call    (ModulePlayer PTR es:[bx]).GetInformation
  393.          add     sp,4
  394.  
  395.          mov     ax,_ReplayInfo.pos
  396.          shl     eax,14
  397.          or      ax,_ReplayInfo.row
  398.          or      ah,al
  399.          shr     eax,8
  400.  
  401.          cmp     ax,WORD PTR[FinSong]    ; is it time ????
  402.          jb      @F                      ; to fade off ???
  403.  
  404.          mov     Termine,1
  405.  
  406.          cmp     FadePtr2,OFFSET _BlackPal
  407.          je      @F
  408.          mov     FadeFlag,0
  409.          mov     eax,DWORD PTR[FadePtr2]
  410.          mov     DWORD PTR[FadePtr1],eax   ; fade to black !!!!
  411.          mov     ax,ds
  412.          mov     FadePtr2+2,ax
  413.          mov     FadePtr2,OFFSET _BlackPal
  414.  
  415. @@:      xor     eax,eax
  416. ;--------------------------------------------------------------------
  417.  
  418.          SHOWTIME 32
  419.  
  420.          call    DPlasma_It
  421.  
  422.          SHOWTIME 0
  423.  
  424.          mov    bx,_WorkAdr          ; New screen base
  425.          mov    WORD PTR[bx+2],1     ; _WorkAdr->flag = true
  426.  
  427.          LOOP_UNTIL_KEY MainPlasma
  428.  
  429. GoOutPlasma:
  430.  
  431.         FLUSH_KEYBUF                  ; Flush keyboard buffer !!! ;-)
  432.  
  433.         mov     _FadeON,0             ; to be sure ....
  434.  
  435. ;----- EXIT -----
  436.  
  437.         STARTUP
  438.  
  439.         mov     ax,Picseg2            ; segment to free
  440.         mov     es,ax
  441.         mov     ah,49h                ; MFREE
  442.         int     21h
  443.  
  444.         mov     ax,Picseg             ; segment to free
  445.         mov     es,ax
  446.         mov     ah,49h                ; MFREE
  447.         int     21h
  448.  
  449.         popad
  450.         nop
  451.         ret
  452.  
  453. DPlasma ENDP
  454.  
  455. ;==============================================================================
  456.  
  457. ALIGN
  458. EVEN
  459. DPlasma_It PROC NEAR                  ; mouvement du plasma
  460.  
  461. YSINE TEXTEQU <1234h>
  462.  
  463.         push    ds
  464.  
  465.  
  466. ; ------- 1st plasma -------
  467.  
  468. ; patcher sinus vertical (moving) !!!!
  469.         mov     si,OFFSET _SinusTbl    ; base sinus !
  470.         add     si,Yptr                ; + offset
  471.         mov     di,OFFSET patch_it+2   ; 1er patch !
  472.         xor     dx,dx
  473.         mov     cx,40                  ; pour tous les mov al,[bx+...]
  474. EVEN
  475. @@:
  476.         lodsw                          ; charger sinus*256
  477.         sal     ax,6
  478.         xor     al,al
  479.         add     ax,dx
  480.         inc     dx
  481.         mov     cs:[di],ax             ; poker dans le code
  482.         add     di,4                   ; patcher les offsets dans le code !
  483.         lodsw
  484.         sal     ax,6
  485.         xor     al,al
  486.         add     ax,dx
  487.         inc     dx
  488.         mov     cs:[di],ax
  489.         add     di,5
  490.         dec     cx                     ; loop    @B
  491.         jnz     @B
  492.  
  493. ; patcher sinus horizontal (scaling) !!!!
  494.         mov     si,OFFSET _SinusTbl    ; base sinus !
  495.         add     si,XSptr               ; + offset
  496.         mov     di,OFFSET patch_it+2   ; 1er patch !
  497.         mov     cx,40                  ; pour tous les mov al,[bx+...]
  498. EVEN
  499. @@:     lodsw                          ; charger sinus*256
  500.         sar     ax,2
  501.         add     cs:[di],ax             ; poker dans le code
  502.         add     di,4                   ; patcher les offsets dans le code !
  503.         lodsw
  504.         sar     ax,2
  505.         add     cs:[di],ax
  506.         add     di,5
  507.         dec     cx                     ; loop    @B
  508.         jnz     @B
  509.  
  510. ; ------- 2nd plasma --------
  511.  
  512. ; patcher sinus vertical (moving) no 2 !!!!
  513.         mov     si,OFFSET _SinusTbl    ; base sinus !
  514.         add     si,Yptr2               ; + offset
  515.         mov     di,OFFSET patch_it2+2  ; 1er patch !
  516.         xor     dx,dx
  517.         mov     cx,40                  ; pour tous les mov al,[bx+...]
  518. EVEN
  519. @@:
  520.         lodsw                          ; charger sinus*256
  521.         sal     ax,6
  522.         xor     al,al
  523.         add     ax,dx
  524.         inc     dx
  525.         mov     cs:[di],ax             ; poker dans le code
  526.         add     di,4                   ; patcher les offsets dans le code !
  527.         lodsw
  528.         sal     ax,6
  529.         xor     al,al
  530.         add     ax,dx
  531.         inc     dx
  532.         mov     cs:[di],ax
  533.         add     di,5
  534.         dec     cx                     ; loop    @B
  535.         jnz     @B
  536.  
  537. ; patcher sinus horizontal (scaling) no 2 !!!!
  538.         mov     si,OFFSET _SinusTbl    ; base sinus !
  539.         add     si,XSptr2              ; + offset
  540.         mov     di,OFFSET patch_it2+2  ; 1er patch !
  541.         mov     cx,40                  ; pour tous les mov al,[bx+...]
  542. EVEN
  543. @@:     lodsw                          ; charger sinus*256
  544.         sar     ax,2
  545.         add     cs:[di],ax             ; poker dans le code
  546.         add     di,4                   ; patcher les offsets dans le code !
  547.         lodsw
  548.         sar     ax,2
  549.         add     cs:[di],ax
  550.         add     di,5
  551.         dec     cx                     ; loop    @B
  552.         jnz     @B 
  553.  
  554.         push    fs
  555.  
  556. ;------------ 1st plasma ---------------
  557.  
  558. ; 2D plasming
  559.  
  560.         mov     ax,0a000h             ; Screen base
  561.         mov     es,ax
  562.         mov     di,_WorkAdr           ; offset 0
  563.         mov     di,WORD PTR[di]       ; screen page
  564.         add     di,50*80
  565.         push    ds                    ; mov     ax,ds
  566.         pop     gs                    ; mov     gs,ax
  567.         mov     si,OFFSET _SinusTbl
  568.         add     si,Xptr
  569.         xor     bp,bp
  570.         mov     ax,PicSeg             ; Picture base
  571.         add     ax,(768+32) SHR 4     ; Skip Alchemy Header
  572.         mov     ds,ax
  573.  
  574.         mov     cx,150                ; 200 lines
  575. EVEN
  576. Fill: ; 1st plasma
  577.  
  578.         mov    bx,gs:[si]             ; pointeur sur table sinus
  579.         sar    bx,2
  580.         add    si,2
  581.         add    bx,bp                  ; nouveau X-sinus
  582.  
  583. ; calcul d'une ligne ...
  584. patch_it LABEL WORD
  585.         REPT   40                     ; 320 pixels width
  586.         mov    al,[bx+YSINE]          ; prendre valeur sur map
  587.         mov    ah,[bx+YSINE]
  588.         stosw
  589.         ENDM
  590.  
  591.         add     bp,256                ; ligne suivante
  592.         add     di,80
  593.  
  594.         dec     cx
  595.         jnz     Fill
  596.  
  597. ; ------------ 2nd plasma -------------
  598.  
  599.         mov     di,WORD PTR gs:[_WorkAdr] ; offset 0
  600.         mov     di,WORD PTR gs:[di]       ; screen page
  601.         add     di,50*80
  602.         mov     si,OFFSET _SinusTbl
  603.         add     si,WORD PTR gs:[Xptr2]
  604.         xor     bp,bp
  605.         mov     ax,gs:WORD PTR[PicSeg2]   ; Picture base no 2
  606.         add     ax,(768+32) SHR 4         ; Skip Alchemy header  
  607.         mov     ds,ax
  608.  
  609.         add     di,80
  610.         mov     cx,150                 ; 200 lines
  611. EVEN
  612. Fill2: ; 2nd plasma
  613.  
  614. ;select new trame
  615.  
  616.         mov    bx,gs:[si]             ; pointeur sur table sinus
  617.         sar    bx,2
  618.         add    si,2
  619.         add    bx,bp                  ; nouveau X-sinus
  620.  
  621. ; calcul d'une ligne ...
  622. patch_it2 LABEL WORD
  623.         REPT   40                     ; 320 pixels width
  624.         mov    al,[bx+YSINE]          ; prendre valeur sur map
  625.         mov    ah,[bx+YSINE]
  626.         stosw
  627.         ENDM
  628.  
  629.         add     bp,256                ; ligne suivante
  630.         add     di,80
  631.  
  632.         dec     cx
  633.         jnz     Fill2
  634.  
  635.         pop     fs
  636.  
  637.         pop     ds
  638.  
  639.         ret
  640.  
  641. DPlasma_It ENDP
  642.  
  643. ;==============================================================================
  644.  
  645. DPLASM_TEXT ENDS
  646.  
  647.      END
  648.  
  649.