home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / CONTRSRC.ZIP / SRC / TYPEONE / DISTORT.ASM < prev    next >
Encoding:
Assembly Source File  |  1994-11-12  |  24.3 KB  |  865 lines

  1.  
  2. ;**********************************************
  3. ; DISTORSION (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. DIS_TEXT  SEGMENT DWORD PUBLIC USE16 'CODE'
  16.           ASSUME CS:DIS_TEXT,DS:DGROUP
  17. DIS_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 'texture.raw',0
  43. Picparam  PARAM_STRUC<2,DGROUP,OFFSET _Datafile,OFFSET Picname,0,0,0,,,0>
  44.  
  45. ; distorsion parameters
  46. EVEN
  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.  
  80. EVEN
  81. PicSeg   WORD ?        ; ptr vers segment pattern
  82. Timeleft WORD ?        ; temps restant pour execution
  83.  
  84. ;---- param pour synchro avec zizik ----
  85. EVEN
  86. DebSong  WORD ?
  87. FinSong  WORD ?
  88.  
  89.  
  90. Dest DW ?
  91. FadeFlag WORD ?        ; flag pour fading
  92. FadePtr1 WORD 2 DUP(?) ; ptr sur palette a fader
  93. FadePtr2 WORD 2 DUP(?)
  94. Delai    WORD ?
  95. Termine  WORD ?        ; flag pour terminer !!!
  96.  
  97. CurStep WORD ?         ; current step !!!
  98.  
  99.  
  100. _BSS ENDS 
  101.  
  102. DIS_TEXT SEGMENT   
  103.      PUBLIC _StartDistort
  104.      EXTRN _AveragePAL : FAR
  105.  
  106.  
  107. ; Point d'entrée de l'intro !!!!!
  108. ;---------------------------------
  109. ALIGN
  110. EVEN
  111. _StartDistort PROC FAR
  112.  
  113.          push    bp                  ; bâtit le cadre de pile
  114.          mov     bp,sp
  115.          
  116.          pushad
  117.          MPUSH ds,es,fs,gs
  118.  
  119.          STARTUP         
  120. ;------- recuperer parametres sur le stack !!!! --------
  121.  
  122.          mov     ax,WORD PTR ss:[bp+6]  ; debut pos
  123.          shl     eax,14        
  124.          or      ax,WORD PTR ss:[bp+8]  ; debut row
  125.          or      ah,al
  126.          shr     eax,8
  127.          mov     DebSong,ax
  128.          mov     ax,WORD PTR ss:[bp+10] ; fin pos
  129.          shl     eax,14 
  130.          or      ax,WORD PTR ss:[bp+12] ; fin row
  131.          or      ah,al
  132.          shr     eax,8
  133.          mov     FinSong,ax
  134.          xor     eax,eax
  135. ;-------------------------------------------------------
  136.  
  137.          cmp     _VGAcompatible,0
  138.          je      @F 
  139.          push    m160x100x256c       ; set 7-mode if full VGA compatible
  140.          jmp     FullVGA
  141. @@:      push    m320x100x256c
  142. FullVGA: call    _SetVGA
  143.          add     sp,2
  144.  
  145.          STARTUP
  146. ;--------------------------------------
  147.          call    Distort             ; !!!!! plasma part !!!!!
  148. ;--------------------------------------
  149.  
  150.          mov  ax,0a000h              ; clear screen
  151.          mov  es,ax
  152.          xor  eax,eax
  153.          xor  di,di
  154.          mov  cx,65536/4
  155.          rep  stosd
  156.  
  157.          MPOP ds,es,fs,gs
  158.          popad
  159.          nop
  160.  
  161.          leave                             ; restore stack
  162.                                            ; mov sp,bp + pop bp
  163.          retf                              ; C/C++ retirera le param 
  164.  
  165. _StartDistort ENDP
  166.  
  167.  
  168. ;==============================================================================
  169. ;============================ Distort part ====================================
  170. ;==============================================================================
  171.  
  172. ALIGN
  173. EVEN
  174. Distort 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,DGROUP             ; 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 _WhitePal  ; White 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.  
  297.          cmp     _VGAcompatible,0
  298.          je      NoCompatible      ; if card doesn't support 7-mode technology
  299.  
  300. ;==================== VGA compatible code =====================
  301. ;        works in 7-mode technology --> hardware pixel doubling (fast!)
  302.  
  303.  
  304.          mov     bx,_StartAdr
  305.          mov     WORD PTR[bx],Screen1   ; _StartAdr->base = 0
  306.          mov     WORD PTR[bx+2],0       ; _StartAdr->flag = false
  307.          mov     bx,_WorkAdr
  308.          mov     WORD PTR[bx],Screen2   ; _WorkAdr->base
  309.          mov     WORD PTR[bx+2],0       ; _WorkAdr->flag = false
  310.          mov     bx,_NextAdr
  311.          mov     WORD PTR[bx],Screen3   ; _NextAdr->base
  312.          mov     WORD PTR[bx+2],0       ; _NextAdr->flag = false
  313.          mov     _Triple,1              ; triple buffering
  314.          VSYNC
  315.  
  316.          EVEN
  317. MainDistort: ; -= VSYNC =-
  318.  
  319. ;***** 2nd page *****
  320. Do_a_frame:
  321.          mov  di,_WorkAdr
  322.          cmp  WORD PTR[di+2],1 ; _WorkAdr->flag true (previous _NextAdr) ?
  323.          je   NextFrame        ; then construct next frame
  324.  
  325.          mov  Dest,di          ; save pointer
  326.  
  327.          NEXTSTEP              ; new step !!!
  328.  
  329.          mov     cx,CurStep    ; nombre de VBLs perdues...
  330. @@:                           ; (incrementer suivant le nb de VBLs)
  331.          add     Yptr,6       ; pointeur sinus vertical (moving)
  332.          and     Yptr,1023
  333.          add     Xptr,4       ; pointeur sinus horizontal (moving)
  334.          and     Xptr,1023
  335.          add     XSptr,8      ; pointeur sinus horizontal (scaling)
  336.          and     XSptr,1023
  337.          dec     cx
  338.          jnz     @B           ; faster than loop on 386-486
  339.  
  340.          cmp     FadeFlag,255
  341.          jb      NewFade2
  342.          cmp     Termine,1            ; Terminer si dernier fade fini
  343.          je      GoOutDistort
  344.  
  345.          mov     _FadeON,0    ; don't set _TmpPal anymore ...
  346.          jmp     @F
  347. NewFade2:mov     ax,FadeFlag  ; average White-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.          cmp     ax,WORD PTR[FinSong]    ; is it time ????
  392.          jb      @F                      ; to fade off ???
  393.  
  394.          mov     Termine,1
  395.  
  396.          cmp     FadePtr2,OFFSET _BlackPal
  397.          je      @F
  398.          mov     FadeFlag,0
  399.          mov     eax,DWORD PTR[FadePtr2]
  400.          mov     DWORD PTR[FadePtr1],eax   ; fade to black !!!!
  401.          mov     ax,ds
  402.          mov     FadePtr2+2,ax
  403.          mov     FadePtr2,OFFSET _BlackPal
  404.  
  405. @@:      xor     eax,eax
  406. ;--------------------------------------------------------------------
  407.  
  408.          SHOWTIME 32
  409.  
  410.          call    Distort_It
  411.  
  412.          mov    di,_NextAdr
  413.  
  414.          mov    bx,Dest
  415.          mov    WORD PTR[bx+2],1     ; _WorkAdr->flag = true
  416.  
  417.          SHOWTIME 0
  418.  
  419.          jmp  Nexxxt
  420.  
  421. ;******** 3rd page *********
  422. NextFrame:
  423.          mov  di,_NextAdr
  424.          cmp  WORD PTR[di+2],1 ; _NextAdr true ?
  425.          je   NextFrame
  426.     
  427. Nexxxt:
  428.          mov  Dest,di          ; save pointer
  429.  
  430.          NEXTSTEP              ; new step !!!
  431.  
  432.          mov     cx,CurStep    ; nombre de VBLs perdues...
  433. @@:                           ; (incrementer suivant le nb de VBLs)
  434.          add     Yptr,6       ; pointeur sinus vertical (moving)
  435.          and     Yptr,1023
  436.          add     Xptr,4       ; pointeur sinus horizontal (moving)
  437.          and     Xptr,1023
  438.          add     XSptr,8      ; pointeur sinus horizontal (scaling)
  439.          and     XSptr,1023
  440.          dec     cx
  441.          jnz     @B           ; faster than loop on 386-486
  442.  
  443.          cmp     FadeFlag,255
  444.          jb      NewFade
  445.          cmp     Termine,1            ; Terminer si dernier fade fini
  446.          je      GoOutDistort
  447.  
  448.          mov     _FadeON,0    ; don't set _TmpPal anymore ...
  449.          jmp     @F
  450. NewFade: mov     ax,FadeFlag          ; average White-MyPal
  451.          push    ax
  452.          push    ds
  453.          push    OFFSET _TmpPal
  454.          mov     ax,FadePtr1+2
  455.          push    ax         
  456.          mov     ax,FadePtr1
  457.          push    ax
  458.          mov     ax,FadePtr2+2 
  459.          push    ax
  460.          mov     ax,FadePtr2
  461.          push    ax
  462.          call    _AveragePAL
  463.          add     sp,7*2
  464.          mov     _FadeON,1            ; set new PAL during next VR !!!
  465.          mov     cx,CurStep
  466.          sub     cx,Delai             ; temps chargement
  467.          mov     Delai,0              ; plus delai ....
  468.          test    cx,cx
  469.          jnz     Faddi2
  470.          inc     cx
  471. Faddi2:  add     FadeFlag,4           ; inc fade ..
  472.          dec     cx
  473.          jnz     Faddi2
  474. @@:
  475.  
  476. ;----------- test if we must finish ... ----------
  477.  
  478.          mov     _ReplayInfo.numChannels,4 ; 4 voices
  479.          
  480.          les     bx,DWORD PTR[_MP]
  481.          push    ds
  482.          push    OFFSET _ReplayInfo
  483.  
  484.          ; _MP->GetInformation(&ReplayInfo)
  485.  
  486.          call    (ModulePlayer PTR es:[bx]).GetInformation
  487.          add     sp,4
  488.  
  489.          mov     ax,_ReplayInfo.pos
  490.          shl     eax,14
  491.          or      ax,_ReplayInfo.row
  492.          or      ah,al
  493.          shr     eax,8
  494.          cmp     ax,WORD PTR[FinSong]    ; is it time ????
  495.          jb      @F                      ; to fade off ???
  496.  
  497.          mov     Termine,1
  498.  
  499.          cmp     FadePtr2,OFFSET _BlackPal
  500.          je      @F
  501.          mov     FadeFlag,0
  502.          mov     eax,DWORD PTR[FadePtr2]
  503.          mov     DWORD PTR[FadePtr1],eax   ; fade to black !!!!
  504.          mov     ax,ds
  505.          mov     FadePtr2+2,ax
  506.          mov     FadePtr2,OFFSET _BlackPal
  507.  
  508. @@:      xor     eax,eax
  509. ;--------------------------------------------------------------------
  510.  
  511.          SHOWTIME 32
  512.  
  513.          call    Distort_It
  514.  
  515.          mov    bx,Dest
  516.          mov    WORD PTR[bx+2],1     ; _NextAdr->flag = true
  517.  
  518.          SHOWTIME 0
  519.  
  520.          LOOP_UNTIL_KEY MainDistort
  521.  
  522.          jmp     GoOutDistort
  523.  
  524. ;===============================================================
  525.  
  526. ;===================== No VGA compatible code ==================
  527.  
  528. NoCompatible:  ; works in standard 320 width --> software pixel doubling (slow)
  529.  
  530.          mov     bx,_StartAdr
  531.          mov     WORD PTR[bx],Screen1   ; _StartAdr->base = 0
  532.          mov     bx,_WorkAdr
  533.          mov     WORD PTR[bx],Screen2*2 ; _WorkAdr->base
  534.          mov     WORD PTR[bx+2],0       ; _WorkAdr->flag = false
  535.          mov     _Triple,0              ; double buffering
  536.          mov     _SyncFlag,1
  537.          VSYNC
  538.  
  539.          EVEN
  540. BMainDistort: ; -= VSYNC =-
  541.  
  542. wait_for_VBL:                       ; wait for Sync Flag
  543.          cmp     _SyncFlag,1
  544.          jne      wait_for_VBL
  545.          mov     _SyncFlag,0
  546.  
  547.          NEXTSTEP                   ; new step !!!
  548.  
  549.          mov     cx,CurStep         ; nombre de VBLs perdues...
  550. @@:                           ; (incrementer suivant le nb de VBLs)
  551.          add     Yptr,6       ; pointeur sinus vertical (moving)
  552.          and     Yptr,1023
  553.          add     Xptr,4       ; pointeur sinus horizontal (moving)
  554.          and     Xptr,1023
  555.          add     XSptr,8      ; pointeur sinus horizontal (scaling)
  556.          and     XSptr,1023
  557.          dec     cx
  558.          jnz     @B           ; faster than loop on 386-486
  559.  
  560.          cmp     FadeFlag,255
  561.          jb      BNewFade2
  562.          cmp     Termine,1            ; Terminer si dernier fade fini
  563.          je      GoOutDistort
  564.  
  565.          mov     _FadeON,0    ; don't set _TmpPal anymore ...
  566.          jmp     @F
  567. BNewFade2:mov     ax,FadeFlag  ; average White-MyPal
  568.          push    ax
  569.          push    ds
  570.          push    OFFSET _TmpPal
  571.          mov     ax,FadePtr1+2
  572.          push    ax         
  573.          mov     ax,FadePtr1
  574.          push    ax
  575.          mov     ax,FadePtr2+2 
  576.          push    ax
  577.          mov     ax,FadePtr2
  578.          push    ax
  579.          call    _AveragePAL
  580.          add     sp,7*2
  581.          mov     _FadeON,1            ; set new PAL during next VR !!!
  582.          mov     cx,CurStep
  583.          sub     cx,Delai             ; temps chargement
  584.          mov     Delai,0              ; plus delai ....
  585.          test    cx,cx
  586.          jnz     BFaddi
  587.          inc     cx
  588. BFaddi:  add     FadeFlag,4           ; inc fade ..
  589.          dec     cx
  590.          jnz     BFaddi
  591. @@:
  592.  
  593. ;----------- test if we must finish ... ----------
  594.  
  595.          mov     _ReplayInfo.numChannels,4 ; 4 voices
  596.          
  597.          les     bx,DWORD PTR[_MP]
  598.          push    ds
  599.          push    OFFSET _ReplayInfo
  600.  
  601.          ; _MP->GetInformation(&ReplayInfo)
  602.  
  603.          call    (ModulePlayer PTR es:[bx]).GetInformation
  604.          add     sp,4
  605.  
  606.          mov     ax,_ReplayInfo.pos
  607.          shl     eax,14
  608.          or      ax,_ReplayInfo.row
  609.          or      ah,al
  610.          shr     eax,8
  611.          cmp     ax,WORD PTR[FinSong]    ; is it time ????
  612.          jb      @F                      ; to fade off ???
  613.  
  614.          mov     Termine,1
  615.  
  616.          cmp     FadePtr2,OFFSET _BlackPal
  617.          je      @F
  618.          mov     FadeFlag,0
  619.          mov     eax,DWORD PTR[FadePtr2]
  620.          mov     DWORD PTR[FadePtr1],eax   ; fade to black !!!!
  621.          mov     ax,ds
  622.          mov     FadePtr2+2,ax
  623.          mov     FadePtr2,OFFSET _BlackPal
  624.  
  625. @@:      xor     eax,eax
  626. ;--------------------------------------------------------------------
  627.  
  628.          SHOWTIME 32
  629.  
  630.          mov    di,_WorkAdr
  631.          mov    Dest,di          ; save pointer
  632.  
  633.          call    BDistort_It
  634.  
  635.          mov    bx,_WorkAdr
  636.          mov    WORD PTR[bx+2],1     ; _WorkAdr->flag = true
  637.  
  638.          SHOWTIME 0
  639.  
  640.          LOOP_UNTIL_KEY BMainDistort
  641.  
  642. ;===============================================================
  643.  
  644.  
  645. GoOutDistort:
  646.  
  647.         FLUSH_KEYBUF                  ; Flush keyboard buffer !!! ;-)
  648.  
  649.         mov     _FadeON,0             ; to be sure ....
  650.  
  651. ;----- EXIT -----
  652.  
  653.         STARTUP
  654.         mov     ax,Picseg             ; segment to free
  655.         mov     es,ax
  656.         mov     ah,49h                ; MFREE
  657.         int     21h
  658.  
  659.         popad
  660.         nop
  661.         ret
  662.  
  663. Distort ENDP
  664.  
  665.  
  666. ;==============================================================================
  667.  
  668. ;----------------- 7-mode algorithm --> hardware pixel doubling ---------------
  669.  
  670. ALIGN
  671. EVEN
  672. Distort_It PROC NEAR                   ; mouvement du bitmap
  673.  
  674. YSINE TEXTEQU <1234h>
  675.  
  676.         push    ds
  677.  
  678. ; patcher sinus vertical (moving) !!!!
  679.         mov     si,OFFSET _SinusTbl    ; base sinus !
  680.         add     si,Yptr                ; + offset
  681.         mov     di,OFFSET patch_it+2   ; 1er patch !
  682.         xor     dx,dx
  683.         mov     cx,Windowx/2           ; pour tous les mov al,[bx+...]
  684.         EVEN
  685. @@:
  686.         lodsw                          ; charger sinus*256
  687.         sal     ax,8
  688.         xor     al,al
  689.         add     ax,dx
  690.         add     dx,4
  691.         mov     cs:[di],ax             ; poker dans le code
  692.         add     di,4
  693.     
  694.         lodsw
  695.         sal     ax,8
  696.         xor     al,al
  697.         add     ax,dx
  698.         add     dx,4
  699.         mov     cs:[di],ax
  700.         add     di,4+1                 ; patcher les offsets dans le code !
  701.         dec     cx
  702.         jnz     @B                     ; faster on 386-486 than loop @B
  703.  
  704. ; patcher sinus horizontal (scaling) !!!!
  705.         mov     si,OFFSET _SinusTbl    ; base sinus !
  706.         add     si,XSptr               ; + offset
  707.         mov     di,OFFSET patch_it+2   ; 1er patch !
  708.         mov     cx,Windowx/2           ; pour tous les mov al,[bx+...]
  709.         EVEN
  710. @@:     lodsw                          ; charger sinus*256
  711.         add     cs:[di],ax             ; poker dans le code
  712.         add     di,4
  713.         lodsw
  714.         add     cs:[di],ax
  715.         add     di,4+1                 ; patcher les offsets dans le code !
  716.         dec     cx
  717.         jnz     @B                     ; better than loop @B on 386/486
  718.  
  719.  
  720. ; 2D plasming
  721.  
  722.         mov     ax,0a000h             ; Screen base
  723.         mov     es,ax
  724.         mov     di,Dest               ; offset 0 Screen
  725.         mov     di,WORD PTR[di]
  726.         shl     di,2                  ; *4
  727.         push    ds                    ;    mov     ax,ds
  728.         pop     gs                    ;    mov     gs,ax
  729.         mov     si,OFFSET _SinusTbl
  730.         add     si,Xptr
  731.         xor     bp,bp
  732.         mov     ax,PicSeg             ; Picture base
  733.         add     ax,(768+32) SHR 4     ; Skip Alchemy Header
  734.         mov     ds,ax
  735.  
  736.         mov     cx,Windowy            ; 100 lines
  737.         EVEN
  738. Fill:
  739.         mov    bx,gs:[si]             ; pointeur sur table sinus
  740.         add    si,2
  741.         add    bx,bp                  ; nouveau X-sinus
  742.  
  743. ; calcul d'une ligne ...
  744. patch_it LABEL WORD
  745.         REPT   Windowx/2              ; 160 pixels width
  746.         mov    al,[bx+YSINE]          ; prendre valeur sur map
  747.         mov    ah,[bx+YSINE]
  748.         stosw
  749.         ENDM
  750.  
  751.         IF (Larg-Windowx) NE 0
  752.            add di,Larg-Windowx        ; ecart Windows/Screen
  753.         ENDIF
  754.  
  755.         add     bp,256*4              ; ligne suivante
  756.  
  757.         dec     cx
  758.         jnz     Fill                  ; loop Fill
  759.  
  760.  
  761.         pop     ds
  762.  
  763.         ret
  764.  
  765. Distort_It ENDP
  766.  
  767. ;----------- No VGA compatible algorithm --> software pixel doubling -----------
  768.  
  769. ALIGN
  770. EVEN
  771. BDistort_It PROC NEAR                   ; mouvement du bitmap
  772.  
  773. YSINE TEXTEQU <1234h>
  774.  
  775.         push    ds
  776.  
  777. ; patcher sinus vertical (moving) !!!!
  778.         mov     si,OFFSET _SinusTbl    ; base sinus !
  779.         add     si,Yptr                ; + offset
  780.         mov     di,OFFSET Bpatch_it+2  ; 1er patch !
  781.         xor     dx,dx
  782.         mov     cx,Windowx             ; pour tous les mov al,[bx+...]
  783.         EVEN
  784. @@:
  785.         lodsw                          ; charger sinus*256
  786.         sal     ax,8
  787.         xor     al,al
  788.         add     ax,dx
  789.         add     dx,4
  790.         mov     cs:[di],ax             ; poker dans le code
  791.         add     di,7
  792.         dec     cx
  793.         jnz     @B
  794.  
  795. ; patcher sinus horizontal (scaling) !!!!
  796.         mov     si,OFFSET _SinusTbl    ; base sinus !
  797.         add     si,XSptr               ; + offset
  798.         mov     di,OFFSET Bpatch_it+2  ; 1er patch !
  799.         mov     cx,Windowx             ; pour tous les mov al,[bx+...]
  800.         EVEN
  801. @@:     lodsw                          ; charger sinus*256
  802.         add     cs:[di],ax             ; poker dans le code
  803.         add     di,7
  804.         dec     cx
  805.         jnz     @B
  806.  
  807. ; 2D plasming
  808.  
  809.         mov     ax,0a000h             ; Screen base
  810.         mov     es,ax
  811.         mov     di,Dest               ; offset 0 Screen
  812.         mov     di,WORD PTR[di]
  813.         shl     di,2                  ; *4
  814.         push    ds                    ;    mov     ax,ds
  815.         pop     gs                    ;    mov     gs,ax
  816.         mov     si,OFFSET _SinusTbl
  817.         add     si,Xptr
  818.         xor     bp,bp
  819.         mov     ax,PicSeg             ; Picture base
  820.         add     ax,(768+32) SHR 4     ; Skip Alchemy Header
  821.         mov     ds,ax
  822.  
  823.         mov     cx,Windowy            ; 100 lines
  824.         EVEN
  825. BFill:
  826.         mov    bx,gs:[si]             ; pointeur sur table sinus
  827.         add    si,2
  828.         add    bx,bp                  ; nouveau X-sinus
  829.  
  830. ; calcul d'une ligne ...
  831. Bpatch_it LABEL WORD
  832.         REPT   Windowx                ; 160 pixels width
  833.         mov    al,[bx+YSINE]          ; prendre valeur sur map
  834.         mov    ah,al
  835.         stosw
  836.         ENDM
  837.  
  838.         IF (Larg-Windowx) NE 0
  839.            add di,(Larg-Windowx)*2    ; ecart Windows/Screen
  840.         ENDIF
  841.  
  842.         add     bp,256*4              ; ligne suivante
  843.  
  844.         dec     cx
  845.         jnz     BFill                 ; loop Fill
  846.  
  847.  
  848.         pop     ds
  849.  
  850.         ret
  851.  
  852. BDistort_It ENDP
  853.  
  854.  
  855.  
  856. ;==============================================================================
  857.  
  858.  
  859. DIS_TEXT ENDS
  860.  
  861.      END
  862.  
  863.  
  864.  
  865.