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

  1.  
  2. ;*************************************************
  3. ; SINGLE 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. PLASM_TEXT  SEGMENT DWORD PUBLIC USE16 'CODE'
  16.             ASSUME CS:PLASM_TEXT,DS:DGROUP
  17. PLASM_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. _DATA SEGMENT
  25.  
  26. ; Quelques constantes bien utiles ......
  27.  
  28. Larg = 160       ; hauteur de l'écran en pixels
  29. Haut = 100       ; largeur de l'écran en pixels
  30. Windowx = 160    ; largeur fenetre
  31. Windowy = 100    ; hauteur fenetre
  32.  
  33. Screen1 = 0
  34. Screen2 = (Larg*Haut/4)
  35. Screen3 = (Larg*Haut/4)*2
  36.  
  37. ;---------------------------------------------
  38.  
  39. ;-- donnees pattern --
  40. EXTRN _Datafile  : BYTE
  41. EXTRN _OfsinDta  : DWORD
  42. Picname   BYTE 'agrplas.raw',0
  43. Picparam  PARAM_STRUC<2,_DATA,OFFSET _Datafile,OFFSET Picname,0,0,0,,,0>
  44.  
  45. EVEN
  46. ; distorsion parameters
  47. Yptr   WORD 0          ; pointeur sinus en y
  48. Xptr   WORD 0          ; pointeur sinus en x
  49. XSptr  WORD 0          ; pointeur sinus en x-scaling
  50.  
  51. cumul_step_lo DD 0
  52. cumul_step_hi DD 0
  53. cumul_old_lo  DD 0
  54. cumul_old_hi  DD 0
  55.  
  56.  
  57. EXTRN _BlackPal: BYTE
  58. EXTRN _WhitePal: BYTE
  59.  
  60. _DATA ENDS
  61.  
  62. ;données non initialisées
  63. _BSS SEGMENT
  64.  
  65. EXTRN _FrameCounter     : WORD
  66. EXTRN _SinusTbl         : WORD ; table sinus*256
  67. EXTRN _StartAdr         : WORD 
  68. EXTRN _WorkAdr          : WORD
  69. EXTRN _NextAdr          : WORD
  70. EXTRN _Triple           : WORD
  71. EXTRN _SyncFlag         : WORD
  72. EXTRN _TmpPal           : BYTE
  73. EXTRN _FadeON           : WORD
  74. EXTRN _VGAcompatible    : WORD
  75. ;!!!!!!!!!! synchro avec music !!!!!!!!!!!!
  76. EXTRN _MP               : DWORD ; extern ModulePlayer * MB
  77. EXTRN _ReplayInfo       : mpInformation
  78.  
  79. ;---- param pour synchro avec zizik ----
  80. EVEN
  81. DebSong  WORD ?
  82. FinSong  WORD ?
  83.  
  84.  
  85.  
  86. EVEN
  87. Picseg    WORD ?        ; seg for pattern
  88. Timeleft  WORD ?        ; temps restant pour execution
  89.  
  90. Dest DW ?
  91.  
  92. FadeFlag WORD ?        ; flag pour fading
  93. FadePtr1 WORD 2 DUP(?) ; ptr sur palette a fader
  94. FadePtr2 WORD 2 DUP(?)
  95. Delai    WORD ?
  96. Termine  WORD ?        ; flag pour terminer !!!
  97.  
  98. CurStep WORD ?         ; current step !!!
  99.  
  100.  
  101. _BSS ENDS
  102.  
  103. PLASM_TEXT SEGMENT
  104.      PUBLIC _StartPlasma
  105.      EXTRN _AveragePAL : FAR
  106.  
  107.  
  108. ; Point d'entrée de l'intro !!!!!
  109. ;---------------------------------
  110. ALIGN
  111. EVEN
  112. _StartPlasma PROC FAR
  113.  
  114.          push    bp                  ; bâtit le cadre de pile
  115.          mov     bp,sp
  116.          
  117.          pushad
  118.          MPUSH ds,es,fs,gs
  119.  
  120.          STARTUP
  121. ;------- recuperer parametres sur le stack !!!! --------
  122.  
  123.          mov     ax,WORD PTR ss:[bp+6]  ; debut pos
  124.          shl     eax,14        
  125.          or      ax,WORD PTR ss:[bp+8]  ; debut row
  126.          or      ah,al
  127.          shr     eax,8
  128.          mov     DebSong,ax
  129.          mov     ax,WORD PTR ss:[bp+10] ; fin pos
  130.          shl     eax,14 
  131.          or      ax,WORD PTR ss:[bp+12] ; fin row
  132.          or      ah,al
  133.          shr     eax,8
  134.          mov     FinSong,ax
  135.          xor     eax,eax
  136. ;-------------------------------------------------------
  137.  
  138.          cmp     _VGAcompatible,0
  139.          je      @F 
  140.          push    m160x100x256c       ; set 7-mode if full VGA compatible
  141.          jmp     FullVGA
  142. @@:      push    m320x100x256c
  143. FullVGA: call    _SetVGA
  144.          add     sp,2
  145.  
  146.          STARTUP
  147. ;--------------------------------------
  148.          call    Plasma              ; !!!!! plasma part !!!!!
  149. ;--------------------------------------
  150.  
  151.          mov  ax,0a000h              ; clear screen
  152.          mov  es,ax
  153.          xor  eax,eax
  154.          xor  di,di
  155.          mov  cx,65536/4
  156.          rep  stosd
  157.  
  158.          MPOP ds,es,fs,gs
  159.          popad
  160.          nop
  161.  
  162.          leave                       ; restore stack
  163.                                      ; mov sp,bp + pop bp
  164.          retf
  165.  
  166. _StartPlasma ENDP
  167.  
  168. ;==============================================================================
  169. ;============================ Plasma part =====================================
  170. ;==============================================================================
  171.  
  172. ALIGN
  173. EVEN
  174. Plasma 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.          pushad
  222.  
  223.          mov     eax,_OfsinDta         ; OFFSET in Datafile
  224.          mov     Picparam.OfsInPdf,eax
  225.          mov     ax,_DATA              ; prepare for PDFIK call 
  226.          mov     es,ax 
  227.          mov     bx,OFFSET Picparam  
  228.          pusha 
  229.          call    PDFIK_ASM             ; call function 2 (extract+alloc)
  230.          popa
  231.          mov     ax,Picparam.BufSeg ; where is the file in mem ?  
  232.          mov     Picseg,ax
  233.  
  234.          push    ds
  235.          push    es
  236.          mov     ax,Picseg
  237.          mov     ds,ax                 ; 32 bytes for Alchemy Header
  238.          mov     si,32                 ; palette offset 
  239.          mov     es,ax
  240.          mov     di,32
  241.  
  242.          mov     cx,768                ; 256*3 components
  243. @@:      lodsb
  244.          shr     al,2                  ; 8 to 6 bits conversion
  245.          stosb
  246.          dec     cx
  247.          jnz     @B
  248.  
  249.          pop     es
  250.          pop     ds
  251.  
  252. ;---------------
  253.  
  254.          STARTUP
  255.  
  256. ;---- wait right position/row in tune ----
  257.  
  258. WaitPos: 
  259.          mov     _ReplayInfo.numChannels,4 ; 4 voices
  260.          
  261.          les     bx,DWORD PTR[_MP]
  262.          push    ds
  263.          push    OFFSET _ReplayInfo
  264.  
  265.          ; _MP->GetInformation(&ReplayInfo)
  266.  
  267.          call    (ModulePlayer PTR es:[bx]).GetInformation
  268.          add     sp,4
  269.  
  270.          mov     ax,_ReplayInfo.pos
  271.          shl     eax,14
  272.          or      ax,_ReplayInfo.row
  273.          or      ah,al
  274.          shr     eax,8 
  275.          cmp     ax,WORD PTR[DebSong]  ; is it time ????
  276.          jb      WaitPos
  277.  
  278.          xor     eax,eax   
  279. ;------------------------------------------
  280.  
  281.          mov     Termine,0 ; pas encore terminer !!!
  282.  
  283.          mov     _FadeON,0
  284.          mov     FadeFlag,0
  285.          mov     FadePtr1,OFFSET _BlackPal  ; Black to pic for the beginning !!!
  286.          mov     ax,ds
  287.          mov     FadePtr1+2,ax
  288.          mov     FadePtr2,32
  289.          mov     ax,Picseg
  290.          mov     FadePtr2+2,ax
  291. ;         mov     ax,_FrameCounter
  292. ;         mov     Delai,ax
  293.          mov     _FrameCounter,0
  294.          mov     Delai,0
  295.  
  296.          cmp     _VGAcompatible,0
  297.          je      NoCompatible      ; if card doesn't support 7-mode technology
  298.  
  299. ;==================== VGA compatible code =====================
  300. ;        works in 7-mode technology --> hardware pixel doubling (fast!)
  301.  
  302.  
  303.          mov     bx,_StartAdr
  304.          mov     WORD PTR[bx],Screen1   ; _StartAdr->base = 0
  305.          mov     WORD PTR[bx+2],0       ; _StartAdr->flag = false
  306.          mov     bx,_WorkAdr
  307.          mov     WORD PTR[bx],Screen2   ; _WorkAdr->base
  308.          mov     WORD PTR[bx+2],0       ; _WorkAdr->flag = false
  309.          mov     bx,_NextAdr
  310.          mov     WORD PTR[bx],Screen3   ; _NextAdr->base
  311.          mov     WORD PTR[bx+2],0       ; _NextAdr->flag = false
  312.          mov     _Triple,1              ; triple buffering
  313.          VSYNC
  314.  
  315. EVEN
  316. MainPlasma: ; -= VSYNC =-
  317.  
  318. ;***** 2nd page *****
  319. Do_a_frame:
  320.          mov  di,_WorkAdr
  321.          cmp  WORD PTR[di+2],1 ; _WorkAdr->flag true (previous _NextAdr) ?
  322.          je   NextFrame        ; then construct next frame
  323.  
  324.          mov  Dest,di          ; save pointer
  325.  
  326.          NEXTSTEP              ; new step !!!
  327.  
  328.          mov     cx,CurStep    ; nombre de VBLs perdues...
  329. @@:                            ; (incrementer suivant le nb de VBLs)
  330.          add     Yptr,6        ; pointeur sinus vertical (moving)
  331.          and     Yptr,1023
  332.          add     Xptr,4        ; pointeur sinus horizontal (moving)
  333.          and     Xptr,1023
  334.          add     XSptr,8       ; pointeur sinus horizontal (scaling)
  335.          and     XSptr,1023
  336.          dec     cx            ; loop    @B
  337.          jnz     @B
  338.  
  339.          cmp     FadeFlag,255
  340.          jb      NewFade2
  341.          
  342.          cmp     Termine,1    ; Terminer si dernier fade fini
  343.          je      GoOutPlasma
  344.  
  345.          mov     _FadeON,0    ; don't set _TmpPal anymore ...
  346.          jmp     @F
  347. NewFade2:mov     ax,FadeFlag  ; average Black-MyPal
  348.          push    ax
  349.          push    ds
  350.          push    OFFSET _TmpPal
  351.          mov     ax,FadePtr1+2
  352.          push    ax         
  353.          mov     ax,FadePtr1
  354.          push    ax
  355.          mov     ax,FadePtr2+2 
  356.          push    ax
  357.          mov     ax,FadePtr2
  358.          push    ax
  359.          call    _AveragePAL
  360.          add     sp,7*2
  361.          mov     _FadeON,1            ; set new PAL during next VR !!!
  362.          mov     cx,CurStep
  363.          sub     cx,Delai             ; temps chargement
  364.          mov     Delai,0              ; plus delai ....
  365.          test    cx,cx
  366.          jnz     Faddi
  367.          inc     cx
  368. Faddi:   add     FadeFlag,4           ; inc fade ..
  369.          dec     cx
  370.          jnz     Faddi
  371. @@:
  372.  
  373. ;----------- test if we must finish ... ----------
  374.  
  375.          mov     _ReplayInfo.numChannels,4 ; 4 voices
  376.          
  377.          les     bx,DWORD PTR[_MP]
  378.          push    ds
  379.          push    OFFSET _ReplayInfo
  380.  
  381.          ; _MP->GetInformation(&ReplayInfo)
  382.  
  383.          call    (ModulePlayer PTR es:[bx]).GetInformation
  384.          add     sp,4
  385.  
  386.          mov     ax,_ReplayInfo.pos
  387.          shl     eax,14
  388.          or      ax,_ReplayInfo.row
  389.          or      ah,al
  390.          shr     eax,8
  391.  
  392.          cmp     ax,WORD PTR[FinSong]    ; is it time ????
  393.          jb      @F                      ; to fade off ???
  394.  
  395.          mov     Termine,1
  396.  
  397.          cmp     FadePtr2,OFFSET _WhitePal ;_BlackPal
  398.          je      @F
  399.          mov     FadeFlag,0
  400.          mov     eax,DWORD PTR[FadePtr2]
  401.          mov     DWORD PTR[FadePtr1],eax   ; fade to black !!!!
  402.          mov     ax,ds
  403.          mov     FadePtr2+2,ax
  404.          mov     FadePtr2,OFFSET _WhitePal ;_BlackPal
  405.  
  406. @@:      xor     eax,eax
  407. ;--------------------------------------------------------------------
  408.  
  409.          SHOWTIME 32
  410.  
  411.          call    Plasma_It
  412.  
  413.          mov    di,_NextAdr
  414.  
  415.          mov    bx,Dest
  416.          mov    WORD PTR[bx+2],1     ; _WorkAdr->flag = true
  417.  
  418.          SHOWTIME 0
  419.  
  420.          jmp  Nexxxt
  421.  
  422. ;******** 3rd page *********
  423. NextFrame:
  424.          mov  di,_NextAdr
  425.          cmp  WORD PTR[di+2],1 ; _NextAdr true ?
  426.          je   NextFrame
  427.     
  428. Nexxxt:
  429.          mov  Dest,di          ; save pointer
  430.  
  431.          NEXTSTEP              ; new step !!!
  432.  
  433.          mov     cx,CurStep    ; nombre de VBLs perdues...
  434. @@:                            ; (incrementer suivant le nb de VBLs)
  435.          add     Yptr,6        ; pointeur sinus vertical (moving)
  436.          and     Yptr,1023
  437.          add     Xptr,4        ; pointeur sinus horizontal (moving)
  438.          and     Xptr,1023
  439.          add     XSptr,8       ; pointeur sinus horizontal (scaling)
  440.          and     XSptr,1023
  441.          dec     cx            ; loop    @B
  442.          jnz     @B
  443.  
  444.          cmp     FadeFlag,255
  445.          jb      NewFade
  446.          cmp     Termine,1    ; Terminer si dernier fade fini
  447.          je      GoOutPlasma
  448.  
  449.          mov     _FadeON,0    ; don't set _TmpPal anymore ...
  450.          jmp     @F
  451. NewFade: mov     ax,FadeFlag  ; average Black-MyPal
  452.          push    ax
  453.          push    ds
  454.          push    OFFSET _TmpPal
  455.          mov     ax,FadePtr1+2
  456.          push    ax         
  457.          mov     ax,FadePtr1
  458.          push    ax
  459.          mov     ax,FadePtr2+2 
  460.          push    ax
  461.          mov     ax,FadePtr2
  462.          push    ax
  463.          call    _AveragePAL
  464.          add     sp,7*2
  465.          mov     _FadeON,1            ; set new PAL during next VR !!!
  466.          mov     cx,CurStep
  467.          sub     cx,Delai             ; temps chargement
  468.          mov     Delai,0              ; plus delai ....
  469.          test    cx,cx
  470.          jnz     Faddi2
  471.          inc     cx
  472. Faddi2:  add     FadeFlag,4           ; inc fade ..
  473.          dec     cx
  474.          jnz     Faddi2
  475. @@:
  476.  
  477. ;----------- test if we must finish ... ----------
  478.  
  479.          mov     _ReplayInfo.numChannels,4 ; 4 voices
  480.          
  481.          les     bx,DWORD PTR[_MP]
  482.          push    ds
  483.          push    OFFSET _ReplayInfo
  484.  
  485.          ; _MP->GetInformation(&ReplayInfo)
  486.  
  487.          call    (ModulePlayer PTR es:[bx]).GetInformation
  488.          add     sp,4
  489.  
  490.          mov     ax,_ReplayInfo.pos
  491.          shl     eax,14
  492.          or      ax,_ReplayInfo.row
  493.          or      ah,al
  494.          shr     eax,8
  495.  
  496.          cmp     ax,WORD PTR[FinSong]    ; is it time ????
  497.          jb      @F                      ; to fade off ???
  498.  
  499.          mov     Termine,1
  500.  
  501.  
  502.          cmp     FadePtr2,OFFSET _WhitePal ;_BlackPal
  503.          je      @F
  504.          mov     FadeFlag,0
  505.          mov     eax,DWORD PTR[FadePtr2]
  506.          mov     DWORD PTR[FadePtr1],eax   ; fade to black !!!!
  507.          mov     ax,ds
  508.          mov     FadePtr2+2,ax
  509.          mov     FadePtr2,OFFSET _WhitePal ;_BlackPal
  510.  
  511. @@:      xor     eax,eax
  512. ;--------------------------------------------------------------------
  513.  
  514.          SHOWTIME 32
  515.  
  516.          call    Plasma_It
  517.  
  518.          mov    bx,Dest
  519.          mov    WORD PTR[bx+2],1     ; _WorkAdr->flag = true
  520.  
  521.          SHOWTIME 0
  522.  
  523.          LOOP_UNTIL_KEY MainPlasma
  524.  
  525.          jmp     GoOutPlasma
  526.  
  527. ;===============================================================
  528.  
  529. ;===================== No VGA compatible code ==================
  530.  
  531. NoCompatible:  ; works in standard 320 width --> software pixel doubling (slow)
  532.  
  533.          mov     bx,_StartAdr
  534.          mov     WORD PTR[bx],Screen1   ; _StartAdr->base = 0
  535.          mov     bx,_WorkAdr
  536.          mov     WORD PTR[bx],Screen2*2 ; _WorkAdr->base
  537.          mov     WORD PTR[bx+2],0       ; _WorkAdr->flag = false
  538.          mov     _Triple,0              ; double buffering
  539.          mov     _SyncFlag,1
  540.          VSYNC
  541.  
  542. EVEN
  543. BMainPlasma: ; -= VSYNC =-
  544.  
  545. wait_for_VBL:                       ; wait for Sync Flag
  546.          cmp     _SyncFlag,1
  547.          jne      wait_for_VBL
  548.          mov     _SyncFlag,0
  549.  
  550.          NEXTSTEP                   ; new step !!!
  551.  
  552.          mov     cx,CurStep         ; nombre de VBLs perdues...
  553. @@:                           ; (incrementer suivant le nb de VBLs)
  554.          add     Yptr,6       ; pointeur sinus vertical (moving)
  555.          and     Yptr,1023
  556.          add     Xptr,4       ; pointeur sinus horizontal (moving)
  557.          and     Xptr,1023
  558.          add     XSptr,8      ; pointeur sinus horizontal (scaling)
  559.          and     XSptr,1023
  560.          dec     cx           ; loop    @B
  561.          jnz     @B
  562.  
  563.          cmp     FadeFlag,255
  564.          jb      BNewFade2
  565.          cmp     Termine,1    ; Terminer si dernier fade fini
  566.          je      GoOutPlasma
  567.  
  568.          mov     _FadeON,0    ; don't set _TmpPal anymore ...
  569.          jmp     @F
  570. BNewFade2:mov     ax,FadeFlag  ; average Black-MyPal
  571.          push    ax
  572.          push    ds
  573.          push    OFFSET _TmpPal
  574.          mov     ax,FadePtr1+2
  575.          push    ax         
  576.          mov     ax,FadePtr1
  577.          push    ax
  578.          mov     ax,FadePtr2+2 
  579.          push    ax
  580.          mov     ax,FadePtr2
  581.          push    ax
  582.          call    _AveragePAL
  583.          add     sp,7*2
  584.          mov     _FadeON,1            ; set new PAL during next VR !!!
  585.          mov     cx,CurStep
  586.          sub     cx,Delai             ; temps chargement
  587.          mov     Delai,0              ; plus delai ....
  588.          test    cx,cx
  589.          jnz     BFaddi
  590.          inc     cx
  591. BFaddi:  add     FadeFlag,4           ; inc fade ..
  592.          dec     cx
  593.          jnz     BFaddi
  594. @@:
  595.  
  596. ;----------- test if we must finish ... ----------
  597.  
  598.          mov     _ReplayInfo.numChannels,4 ; 4 voices
  599.          
  600.          les     bx,DWORD PTR[_MP]
  601.          push    ds
  602.          push    OFFSET _ReplayInfo
  603.  
  604.          ; _MP->GetInformation(&ReplayInfo)
  605.  
  606.          call    (ModulePlayer PTR es:[bx]).GetInformation
  607.          add     sp,4
  608.  
  609.          mov     ax,_ReplayInfo.pos
  610.          shl     eax,14
  611.          or      ax,_ReplayInfo.row
  612.          or      ah,al
  613.          shr     eax,8
  614.  
  615.          cmp     ax,WORD PTR[FinSong]    ; is it time ????
  616.          jb      @F                      ; to fade off ???
  617.  
  618.          mov     Termine,1
  619.  
  620.          cmp     FadePtr2,OFFSET _WhitePal ;_BlackPal
  621.          je      @F
  622.          mov     FadeFlag,0
  623.          mov     eax,DWORD PTR[FadePtr2]
  624.          mov     DWORD PTR[FadePtr1],eax   ; fade to black !!!!
  625.          mov     ax,ds
  626.          mov     FadePtr2+2,ax
  627.          mov     FadePtr2,OFFSET _WhitePal ;_BlackPal
  628.  
  629. @@:      xor     eax,eax
  630. ;--------------------------------------------------------------------
  631.  
  632.          SHOWTIME 32
  633.  
  634.          mov    di,_WorkAdr
  635.          mov    Dest,di
  636.  
  637.          call   BPlasma_It
  638.  
  639.          mov    bx,_WorkAdr
  640.          mov    WORD PTR[bx+2],1     ; _WorkAdr->flag = true
  641.  
  642.          SHOWTIME 0
  643.  
  644.          LOOP_UNTIL_KEY BMainPlasma
  645.  
  646. ;===============================================================
  647.  
  648. GoOutPlasma:
  649.  
  650.         FLUSH_KEYBUF                  ; Flush keyboard buffer !!! ;-)
  651.  
  652.         mov     _FadeON,0             ; to be sure ....
  653.  
  654. ;----- EXIT -----
  655.  
  656.         STARTUP
  657.         mov     ax,Picseg             ; segment to free
  658.         mov     es,ax
  659.         mov     ah,49h                ; MFREE
  660.         int     21h
  661.  
  662.         popad
  663.         nop
  664.         ret
  665.  
  666. Plasma ENDP
  667.  
  668. ;==============================================================================
  669.  
  670. ;----------------- 7-mode algorithm --> hardware pixel doubling ---------------
  671.  
  672. ALIGN
  673. EVEN
  674. Plasma_It PROC NEAR                   ; mouvement du plasma
  675.  
  676. YSINE TEXTEQU <1234h>
  677.  
  678.         push    ds
  679.  
  680. ; patcher sinus vertical (moving) !!!!
  681.         mov     si,OFFSET _SinusTbl    ; base sinus !
  682.         add     si,Yptr                ; + offset
  683.         mov     di,OFFSET patch_it+2   ; 1er patch !
  684.         xor     dx,dx
  685.         mov     cx,Windowx/2/2         ; pour tous les mov al,[bx+...]
  686. EVEN
  687. @@:
  688.         lodsw                          ; charger sinus*256
  689.         sal     ax,8
  690.         xor     al,al
  691.         add     ax,dx
  692.         mov     cs:[di],ax             ; poker dans le code
  693.         add     di,4
  694.         lodsw                          ; charger sinus*256
  695.         sal     ax,8
  696.         xor     al,al
  697.         add     ax,dx
  698.         mov     cs:[di],ax
  699.         add     di,5                   ; patcher les offsets dans le code !
  700.         lodsw
  701.         sal     ax,8
  702.         xor     al,al
  703.         add     ax,dx
  704.         mov     cs:[di],ax
  705.         add     di,4
  706.         lodsw
  707.         sal     ax,8
  708.         xor     al,al
  709.         add     ax,dx
  710.         inc     dx
  711.         mov     cs:[di],ax
  712.         add     di,5
  713.         dec     cx                     ; loop    @B
  714.         jnz     @B
  715.  
  716. ; patcher sinus horizontal (scaling) !!!!
  717.         mov     si,OFFSET _SinusTbl    ; base sinus !
  718.         add     si,XSptr               ; + offset
  719.         mov     di,OFFSET patch_it+2   ; 1er patch !
  720.         mov     cx,Windowx/2           ; pour tous les mov al,[bx+...]
  721. EVEN
  722. @@:     lodsw                          ; charger sinus*256
  723.         add     cs:[di],ax             ; poker dans le code
  724.         add     di,4
  725.         lodsw
  726.         add     cs:[di],ax
  727.         add     di,5                   ; patcher les offsets dans le code !
  728.         dec     cx                     ; loop    @B
  729.         jnz     @B
  730.  
  731.  
  732. ; 2D plasming
  733.  
  734.         mov     ax,0a000h             ; Screen base
  735.         mov     es,ax
  736.         mov     di,Dest               ; offset 0 (Screen)
  737.         mov     di,WORD PTR[di]
  738.         shl     di,2                  ; *4
  739.         push    ds                    ; mov     ax,ds
  740.         pop     gs                    ; mov     gs,ax
  741.         mov     si,OFFSET _SinusTbl
  742.         add     si,Xptr
  743.         xor     bp,bp
  744.         mov     ax,PicSeg             ; Picture base
  745.         add     ax,(768+32) SHR 4     ; Skip Alchemy header
  746.         mov     ds,ax
  747.  
  748.         mov     cx,Windowy            ; 100 lines
  749. EVEN
  750. Fill:
  751.         mov    bx,gs:[si]             ; pointeur sur table sinus
  752.         add    si,2
  753.         add    bx,bp                  ; nouveau X-sinus
  754.  
  755. ; calcul d'une ligne ...
  756. patch_it LABEL WORD
  757.         REPT   Windowx/2              ; 160 pixels width
  758.         mov    al,[bx+YSINE]          ; prendre valeur sur map
  759.         mov    ah,[bx+YSINE]
  760.         stosw
  761.         ENDM
  762.  
  763.         IF (Larg-Windowx) NE 0
  764.            add di,Larg-Windowx        ; ecart Windows/Screen
  765.         ENDIF
  766.  
  767.         add     bp,256*4              ; ligne suivante
  768.  
  769.         dec     cx
  770.         jnz     Fill
  771.  
  772.         pop     ds
  773.  
  774.         ret
  775.  
  776. Plasma_It ENDP
  777.  
  778. ;----------- No VGA compatible algorithm --> software pixel doubling -----------
  779.  
  780. ALIGN
  781. EVEN
  782. BPlasma_It PROC NEAR                   ; mouvement du plasma
  783.  
  784. YSINE TEXTEQU <1234h>
  785.  
  786.         push    ds
  787.  
  788. ; patcher sinus vertical (moving) !!!!
  789.         mov     si,OFFSET _SinusTbl    ; base sinus !
  790.         add     si,Yptr                ; + offset
  791.         mov     di,OFFSET Bpatch_it+2  ; 1er patch !
  792.         xor     dx,dx
  793.         mov     cx,Windowx/2/2         ; pour tous les mov al,[bx+...]
  794. EVEN
  795. @@:
  796.         REPT    3
  797.         lodsw                          ; charger sinus*256
  798.         sal     ax,8
  799.         xor     al,al
  800.         add     ax,dx
  801.         mov     cs:[di],ax             ; poker dans le code
  802.         add     di,7
  803.         ENDM
  804.         lodsw
  805.         sal     ax,8
  806.         xor     al,al
  807.         add     ax,dx
  808.         inc     dx
  809.         mov     cs:[di],ax
  810.         add     di,7
  811.         dec     cx                     ; loop    @B
  812.         jnz     @B
  813.  
  814.  
  815. ; patcher sinus horizontal (scaling) !!!!
  816.         mov     si,OFFSET _SinusTbl    ; base sinus !
  817.         add     si,XSptr               ; + offset
  818.         mov     di,OFFSET Bpatch_it+2  ; 1er patch !
  819.         mov     cx,Windowx             ; pour tous les mov al,[bx+...]
  820. EVEN
  821. @@:     lodsw                          ; charger sinus*256
  822.         add     cs:[di],ax             ; poker dans le code
  823.         add     di,7
  824.         dec     cx
  825.         jnz     @B
  826.  
  827.  
  828. ; 2D plasming
  829.  
  830.         mov     ax,0a000h             ; Screen base
  831.         mov     es,ax
  832.         mov     di,Dest               ; offset 0 (Screen)
  833.         mov     di,WORD PTR[di]
  834.         shl     di,2                  ; *4
  835.         push    ds                    ; mov     ax,ds
  836.         pop     gs                    ; mov     gs,ax
  837.         mov     si,OFFSET _SinusTbl
  838.         add     si,Xptr
  839.         xor     bp,bp
  840.         mov     ax,PicSeg             ; Picture base
  841.         add     ax,(768+32) SHR 4     ; Skip Alchemy header
  842.         mov     ds,ax
  843.  
  844.         mov     cx,Windowy            ; 100 lines
  845. EVEN
  846. BFill:
  847.         mov    bx,gs:[si]             ; pointeur sur table sinus
  848.         add    si,2
  849.         add    bx,bp                  ; nouveau X-sinus
  850.  
  851. ; calcul d'une ligne ...
  852. Bpatch_it LABEL WORD
  853.         REPT   Windowx                ; 160 pixels width
  854.         mov    al,[bx+YSINE]          ; prendre valeur sur map
  855.         mov    ah,al
  856.         stosw
  857.         ENDM
  858.  
  859.         IF (Larg-Windowx) NE 0
  860.            add di,(Larg-Windowx)*2    ; ecart Windows/Screen
  861.         ENDIF
  862.  
  863.         add     bp,256*4              ; ligne suivante
  864.  
  865.         dec     cx
  866.         jnz     BFill
  867.  
  868.         pop     ds
  869.  
  870.         ret
  871.  
  872. BPlasma_It ENDP
  873.  
  874.  
  875.  
  876. ;==============================================================================
  877.  
  878. PLASM_TEXT ENDS
  879.  
  880.      END
  881.  
  882.