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

  1.  
  2. ;*************************************************
  3. ; ELEPHANT PIC (C) 1994 Type One / TFL-TDV Prod.
  4. ; GFX by Fred
  5. ;*************************************************
  6.  
  7. INCLUDE PDFIK.INC ; DataFile Manager
  8. INCLUDE VIDEO.INC ; Flamoot VGA SetUp
  9. INCLUDE PLAYINFO.INC ; Player structures
  10. INCLUDE KEYBOARD.INC ; Keyboard macros 
  11.  
  12. ;-----------------------------------------
  13. ; Déclaration modèle mémoire
  14. .386
  15. DGROUP GROUP _DATA,_BSS
  16. ELEPH_TEXT  SEGMENT DWORD PUBLIC USE16 'CODE'
  17.             ASSUME CS:ELEPH_TEXT,DS:DGROUP
  18. ELEPH_TEXT  ENDS
  19. _DATA  SEGMENT DWORD PUBLIC USE16 'DATA'
  20. _DATA  ENDS
  21. _BSS   SEGMENT DWORD PUBLIC USE16 'BSS'
  22. _BSS   ENDS
  23. ;-----------------------------------------
  24.  
  25. _DATA SEGMENT
  26.  
  27.  
  28. Screen1 = 0
  29. Screen2 = (320*200/4)
  30. Screen3 = (320*200/4*2)
  31.  
  32.  
  33. ;-- donnees pattern --
  34. EXTRN _Datafile  : BYTE
  35. EXTRN _OfsinDta  : DWORD
  36. Picname   BYTE 'elephant.raw',0
  37. Picparam  PARAM_STRUC<2,_DATA,OFFSET _Datafile,OFFSET Picname,0,0,0,,,0>
  38.  
  39. cumul_step_lo DD 0
  40. cumul_step_hi DD 0
  41. cumul_old_lo  DD 0
  42. cumul_old_hi  DD 0
  43. factor        DW 256
  44.  
  45. EXTRN _BlackPal: BYTE
  46. EXTRN _WhitePal: BYTE
  47.  
  48. _DATA ENDS
  49.  
  50. ;données non initialisées
  51. _BSS SEGMENT
  52.  
  53. EXTRN _FrameCounter     : WORD
  54. EXTRN _StartAdr         : WORD
  55. EXTRN _WorkAdr          : WORD
  56. EXTRN _NextAdr          : WORD
  57. EXTRN _Triple           : WORD
  58. EXTRN _SyncFlag         : WORD
  59. EXTRN _TmpPal           : BYTE
  60. EXTRN _FadeON           : WORD
  61. ;!!!!!!!!!! synchro avec music !!!!!!!!!!!!
  62. EXTRN _MP               : DWORD ; extern ModulePlayer * MB
  63. EXTRN _ReplayInfo       : mpInformation
  64.  
  65. ;---- param pour synchro avec zizik ----
  66. EVEN
  67. DebSong  WORD ?
  68. FinSong  WORD ?
  69.  
  70.  
  71.  
  72. EVEN
  73. Dest DW ?
  74.  
  75. EVEN
  76. Picseg    WORD ?        ; seg for pattern
  77.  
  78. FadeFlag WORD ?        ; flag pour fading
  79. FadePtr1 WORD 2 DUP(?) ; ptr sur palette a fader
  80. FadePtr2 WORD 2 DUP(?)
  81. Delai    WORD ?
  82. Termine  WORD ?        ; flag pour terminer !!!
  83.  
  84. CurStep WORD ?         ; current step !!!
  85.  
  86.  
  87. _BSS ENDS
  88.  
  89. ELEPH_TEXT SEGMENT
  90.      PUBLIC _StartEleph
  91.      EXTRN _AveragePAL : FAR
  92.  
  93. ; Point d'entrée de l'intro !!!!!
  94. ;---------------------------------
  95. ALIGN
  96. EVEN
  97. _StartEleph PROC FAR
  98.  
  99.          push    bp                  ; bâtit le cadre de pile
  100.          mov     bp,sp
  101.  
  102.          pushad
  103.          MPUSH ds,es,fs,gs
  104.  
  105.          STARTUP
  106. ;------- recuperer parametres sur le stack !!!! --------
  107.  
  108.          mov     ax,WORD PTR ss:[bp+6]  ; debut pos
  109.          shl     eax,14
  110.          or      ax,WORD PTR ss:[bp+8]  ; debut row
  111.          or      ah,al
  112.          shr     eax,8
  113.          mov     DebSong,ax
  114.          mov     ax,WORD PTR ss:[bp+10] ; fin pos
  115.          shl     eax,14
  116.          or      ax,WORD PTR ss:[bp+12] ; fin row
  117.          or      ah,al
  118.          shr     eax,8
  119.          mov     FinSong,ax
  120.          xor     eax,eax
  121. ;-------------------------------------------------------
  122.  
  123.          push    m320x200x256p ;m320x100x256c   ; set 320x200x256 col/chained 60hz
  124.          call    _SetVGA
  125.          add     sp,2
  126.  
  127.          STARTUP
  128. ;--------------------------------------
  129.          call    DoEleph             ; !!!!! title part !!!!!
  130. ;--------------------------------------
  131.  
  132.          mov  dx,3c4h
  133.          mov  ax,0f02h
  134.          out  dx,ax
  135.          mov  ax,0a000h              ; clear screen
  136.          mov  es,ax
  137.          xor  eax,eax
  138.          xor  di,di
  139.          mov  cx,65536/4
  140.          rep  stosd
  141.  
  142.          MPOP ds,es,fs,gs
  143.          popad
  144.          nop
  145.  
  146.          leave                       ; restore stack
  147.                                      ; mov sp,bp + pop bp
  148.          retf
  149.  
  150. _StartEleph ENDP
  151.  
  152. ;==============================================================================
  153. ;============================ Eleph part ======================================
  154. ;==============================================================================
  155.  
  156. ALIGN
  157. EVEN
  158. DoEleph PROC NEAR
  159.  
  160. ; some macros 
  161.  
  162. ;-------------------------------------------------------------------------------
  163.  
  164. NEXTSTEP MACRO
  165.         LOCAL lbl1
  166.  
  167. ;------------ FrameCounter manip ------------
  168.         MPUSH  eax,ebx,ecx,edx
  169.  
  170.         mov    cx,_FrameCounter
  171.         test   cx,cx
  172.         jnz    lbl1
  173.         mov    cx,1
  174.  
  175. lbl1:   xor    eax,eax
  176.     ;;    mov    ah,cl ; frame*256
  177.         mov    ax,factor           ; take factor
  178.         mul    cx
  179.  
  180.         mov    ecx,cumul_step_lo   ; save old cumulated step (64 bits)
  181.         mov    cumul_old_lo,ecx
  182.         mov    ecx,cumul_step_hi
  183.         mov    cumul_old_hi,ecx   
  184.      
  185.         add    cumul_step_lo,eax   ; multiprecision
  186.         adc    cumul_step_hi,0
  187.  
  188.         mov    ecx,cumul_step_hi
  189.         mov    eax,cumul_step_lo
  190.         shrd   eax,ecx,8           ; / 256
  191.         mov    edx,cumul_old_hi
  192.         mov    ebx,cumul_old_lo
  193.         shrd   ebx,edx,8
  194.  
  195.         sub    eax,ebx
  196. ;        sbb    ecx,edx
  197.  
  198.         mov    CurStep,ax  ; CurStep = factor * FrameCounter
  199.  
  200.         mov    _FrameCounter,0
  201.  
  202.         MPOP   eax,ebx,ecx,edx
  203. ;--------------------------------------------
  204.  
  205. ENDM
  206.  
  207.  
  208. NEWCOORD MACRO
  209.          LOCAL   lbl2,lbl3,lobl1,lobl2,majSize,okscal
  210.          MPUSH   ax,cx
  211.  
  212.          mov     ax,CurStep
  213.  
  214.          add     cs:[DXsize],ax
  215.          cmp     cs:[DXsize],319 
  216.          jae     lbl2
  217.          jmp     lobl1
  218. lbl2:    mov     cs:[DXsize],319
  219.          inc     factor
  220.          sub     cs:[SXsize],ax
  221.          cmp     cs:[SXsize],1  ; jusque 1 pixel de large !!!!
  222.          jge     lobl1
  223.          mov     cs:[SXsize],1
  224. lobl1:   add     cs:[DYsize],ax
  225.          cmp     cs:[DYsize],199 
  226.          jae     lbl3
  227.          jmp     lobl2
  228. lbl3:    mov     cs:[DYsize],199
  229.          inc     factor         ; accelere
  230.         ; add     factor,2
  231.          sub     cs:[SYsize],ax
  232.          cmp     cs:[SYsize],1  
  233.          jge     lobl2
  234.          mov     cs:[SYsize],1
  235. lobl2:
  236.  
  237.          MPOP    ax,cx
  238. ENDM
  239.  
  240. ;------------------------------------
  241.  
  242. TESTFADE MACRO
  243.          LOCAL BNewFade2,BFaddi,lbl1
  244.  
  245.          cmp     FadeFlag,255
  246.          jb      BNewFade2
  247.          cmp     Termine,1    ; Terminer si dernier fade fini
  248.          je      GoOut
  249.  
  250.          mov     _FadeON,0    ; don't set _TmpPal anymore ...
  251.          jmp     lbl1
  252. BNewFade2:
  253.          MPUSH   ax,cx
  254.  
  255.          mov     ax,FadeFlag  ; average Black-MyPal
  256.          push    ax
  257.          push    ds
  258.          push    OFFSET _TmpPal
  259.          mov     ax,FadePtr1+2
  260.          push    ax
  261.          mov     ax,FadePtr1
  262.          push    ax
  263.          mov     ax,FadePtr2+2
  264.          push    ax
  265.          mov     ax,FadePtr2
  266.          push    ax
  267.          call    _AveragePAL
  268.          add     sp,7*2
  269.          mov     _FadeON,1            ; set new PAL during next VR !!!
  270.          mov     cx,CurStep
  271.          sub     cx,Delai             ; temps chargement
  272.          mov     Delai,0              ; plus delai ....
  273.          test    cx,cx
  274.          jnz     BFaddi
  275.          inc     cx
  276. BFaddi:  add     FadeFlag,4           ; inc fade ..
  277.          dec     cx
  278.          jnz     BFaddi
  279.  
  280.          MPOP    ax,cx
  281. lbl1:
  282.  
  283. ENDM
  284.  
  285. ;----------------------------
  286.  
  287. TESTFINISH MACRO
  288.          LOCAL   lbl1
  289.          MPUSH   eax,bx,es
  290.  
  291. ;----------- test if we must finish ... ----------
  292.  
  293.          mov     _ReplayInfo.numChannels,4 ; 4 voices
  294.  
  295.          les     bx,DWORD PTR[_MP]
  296.          push    ds
  297.          push    OFFSET _ReplayInfo
  298.  
  299.          ; _MP->GetInformation(&ReplayInfo)
  300.  
  301.          call    (ModulePlayer PTR es:[bx]).GetInformation
  302.          add     sp,4
  303.  
  304.          mov     ax,_ReplayInfo.pos
  305.          shl     eax,14
  306.          or      ax,_ReplayInfo.row
  307.          or      ah,al
  308.          shr     eax,8
  309.  
  310.          cmp     ax,WORD PTR[FinSong]    ; is it time ????
  311.          jb      lbl1                    ; to fade off ???
  312.  
  313.          mov     Termine,1
  314.  
  315.          cmp     FadePtr2,OFFSET _BlackPal
  316.          je      lbl1
  317.          mov     FadeFlag,0
  318.          mov     eax,DWORD PTR[FadePtr2]
  319.          mov     DWORD PTR[FadePtr1],eax   ; fade to black !!!!
  320.          mov     ax,ds
  321.          mov     FadePtr2+2,ax
  322.          mov     FadePtr2,OFFSET _BlackPal
  323.  
  324. lbl1:      
  325.  
  326.          MPOP    eax,bx,es
  327.         
  328. ENDM
  329.  
  330.  
  331.  
  332. ;------------------------------------------------------------------------------
  333.          pushad
  334.  
  335.          mov     eax,_OfsinDta         ; OFFSET in Datafile
  336.          mov     Picparam.OfsInPdf,eax
  337.          mov     ax,_DATA              ; prepare for PDFIK call
  338.          mov     es,ax
  339.          mov     bx,OFFSET Picparam
  340.          pusha
  341.          call    PDFIK_ASM             ; call function 2 (extract+alloc)
  342.          popa
  343.          mov     ax,Picparam.BufSeg ; where is the file in mem ?
  344.          mov     Picseg,ax
  345.  
  346.          push    ds
  347.          push    es
  348.          mov     ax,Picseg
  349.          mov     ds,ax                 ; 32 bytes for Alchemy Header
  350.          mov     si,32                 ; palette offset
  351.          mov     es,ax
  352.          mov     di,32
  353.  
  354.          mov     cx,768                ; 256*3 components
  355. @@:      lodsb
  356.          shr     al,2                  ; 8 to 6 bits conversion
  357.          stosb
  358.          dec     cx
  359.          jnz     @B
  360.  
  361.          pop     es
  362.          pop     ds
  363.  
  364. ;---------------
  365.  
  366.          STARTUP
  367.  
  368.  
  369. ;---- wait right position/row in tune ----
  370.  
  371. WaitPos:
  372.          mov     _ReplayInfo.numChannels,4 ; 4 voices
  373.  
  374.          les     bx,DWORD PTR[_MP]
  375.          push    ds
  376.          push    OFFSET _ReplayInfo
  377.  
  378.          ; _MP->GetInformation(&ReplayInfo)
  379.  
  380.          call    (ModulePlayer PTR es:[bx]).GetInformation
  381.          add     sp,4
  382.  
  383.          mov     ax,_ReplayInfo.pos
  384.          shl     eax,14
  385.          or      ax,_ReplayInfo.row
  386.          or      ah,al
  387.          shr     eax,8
  388.          cmp     ax,WORD PTR[DebSong]  ; is it time ????
  389.          jb      WaitPos
  390.  
  391.          xor     eax,eax
  392. ;------------------------------------------
  393.  
  394.          mov     Termine,0 ; pas encore terminer !!!
  395.  
  396.          mov     _FadeON,0
  397.          mov     FadeFlag,0
  398.          mov     FadePtr1,OFFSET _BlackPal  ; Black to pic for the beginning !!!
  399.          mov     ax,ds
  400.          mov     FadePtr1+2,ax
  401.          mov     FadePtr2,32
  402.          mov     ax,Picseg
  403.          mov     FadePtr2+2,ax
  404. ;         mov     ax,_FrameCounter
  405. ;         mov     Delai,ax
  406.          mov     _FrameCounter,0
  407.          mov     Delai,0
  408.  
  409.  
  410.          mov     bx,_StartAdr
  411.          mov     WORD PTR[bx],Screen1   ; _StartAdr->base = 0
  412.          mov     WORD PTR[bx+2],0       ; _StartAdr->flag = false
  413.          mov     bx,_WorkAdr
  414.          mov     WORD PTR[bx],Screen2   ; _WorkAdr->base
  415.          mov     WORD PTR[bx+2],0       ; _WorkAdr->flag = false
  416.          mov     bx,_NextAdr
  417.          mov     WORD PTR[bx],Screen3   ; _NextAdr->base
  418.          mov     WORD PTR[bx+2],0       ; _NextAdr->flag = false
  419.          mov     _Triple,1              ; triple buffering
  420.  
  421.          VSYNC
  422.  
  423.  
  424. EVEN
  425. Main: ; -= VSYNC =-
  426.  
  427. ;***** 2nd page *****
  428. Do_a_frame:
  429.          mov  di,_WorkAdr
  430.          cmp  WORD PTR[di+2],1 ; _WorkAdr->flag true (previous _NextAdr) ?
  431.          je   NextFrame        ; then construct next frame
  432.  
  433.          NEXTSTEP                   ; new step !!!
  434.  
  435.          TESTFADE                   ; prepare for fading
  436.  
  437.          NEWCOORD                   ; new coordinates !!!
  438.  
  439.          TESTFINISH                 ; test if end
  440.  
  441.          mov  Dest,di               ; save pointer
  442.  
  443.          SHOWTIME 32
  444.          call    ZoomEleph          ; zoom elephant
  445.          SHOWTIME 0
  446.  
  447.          mov    di,_NextAdr         ; save adr of next buffer
  448.  
  449.          mov    bx,Dest
  450.          mov    WORD PTR[bx+2],1    ; _WorkAdr->flag = true
  451.  
  452.          jmp  Nexxxt
  453.  
  454. ;******** 3rd page *********
  455. NextFrame:
  456.          mov  di,_NextAdr
  457.          cmp  WORD PTR[di+2],1 ; _NextAdr true ?
  458.          je   NextFrame
  459.     
  460. Nexxxt:
  461.          NEXTSTEP                   ; new step !
  462.  
  463.          TESTFADE                   ; prepare for fading
  464.  
  465.          NEWCOORD
  466.  
  467.          TESTFINISH                 ; test if end
  468.  
  469.          mov  Dest,di               ; save pointer
  470.  
  471.          SHOWTIME 32
  472.          call    ZoomEleph          ; zoom elephant
  473.          SHOWTIME 0
  474.  
  475.  
  476.          mov    bx,Dest
  477.          mov    WORD PTR[bx+2],1     ; _NextAdr->flag = true
  478.  
  479.  
  480.          LOOP_UNTIL_KEY Main
  481.  
  482. ;===============================================================
  483.  
  484. GoOut:
  485.  
  486.  
  487.         FLUSH_KEYBUF                  ; Flush keyboard buffer !!! ;-)
  488.  
  489.         mov     _FadeON,0             ; to be sure ....
  490.  
  491. ;----- EXIT -----
  492.  
  493.         STARTUP
  494.         mov     ax,Picseg             ; segment to free
  495.         mov     es,ax
  496.         mov     ah,49h                ; MFREE
  497.         int     21h
  498.  
  499.         popad
  500.         nop
  501.         ret
  502.  
  503. DoEleph   ENDP
  504.  
  505.  
  506. ;******** Zoom Elephant *********
  507. ZoomEleph PROC NEAR
  508.  
  509.           MPUSH ax,cx,dx,si,di,bp,ds,es
  510.  
  511.           mov   ax,0a000h             ; video base
  512.           mov   es,ax
  513.  
  514.           mov  bx,[Dest]                   ; begin by the beginning
  515.           mov  bx,WORD PTR [bx]            ; _WorkAdr->base
  516.  
  517. ;          -- centrage -- 
  518.           mov   di,cs:DYsize
  519.           shr   di,1
  520.           sub   di,100 
  521.           neg   di                    ; 100 - Y/2
  522.           mov   ax,80
  523.           mul   di                    ; ahurk !!!!
  524.           mov   di,ax
  525.           mov   ax,cs:DXsize
  526.           shr   ax,1 
  527.           sub   ax,160                ; 160 - X/2
  528.           neg   ax
  529.           mov   cs:Centre,ax
  530.           shr   ax,2
  531.           add   di,ax
  532.  
  533.           add   di,bx                 ; + StartAdr !!! 
  534.  
  535.           mov   bx,cs:[SYsize]
  536.           shr   bx,1
  537.           sub   bx,128
  538.           neg   bx
  539.           sal   bx,8
  540.           mov   cs:Patch4+1,bx
  541.           mov   bx,cs:[SXsize]
  542.           shr   bx,1
  543.           sub   bx,128 ;113
  544.           neg   bx
  545.           sal   bx,8
  546.           mov   cs:Patch5+1,bx
  547.  
  548. ;         -----------------
  549.  
  550.           mov   ax,Picseg
  551.           add   ax,(768+32) SHR 4
  552.           mov   ds,ax                 ; DS=adr pic
  553.  
  554.           mov   cs:Patch2+2,80        ; len of line
  555.           mov   ax,cs:DXsize
  556.           shr   ax,2
  557.           test  ax,ax
  558.           jnz   @F
  559.           inc   ax
  560. @@:
  561.           mov   cs:[Nbloop1],ax
  562.           and   ax,0fffeh  
  563.           jnz   @F
  564.           add   ax,2  
  565. @@:
  566.           sub   cs:Patch2+2,ax        ; - len of bitmap
  567.           shr   ax,1 
  568.           mov   cs:[Nbloop2],ax
  569.  
  570.           xor   dx,dx
  571.           mov   ax,cs:SXsize          ; source X-Width
  572.           sal   ax,8 
  573.           rcl   dx,8  
  574.           div   cs:DXsize             ; calculate X-ratio
  575.           mov   si,ax                 ; increment
  576.  
  577.           mov   cx,cs:[Centre]
  578.           and   cx,3
  579.           jz    skiper
  580. @@:       sub   cs:[Patch5+1],si
  581.           dec   cx                    ; align 
  582.           jnz   @B
  583. skiper:
  584.           jmp   $+2                   ; flush prefetch queue
  585.           
  586.  
  587. Patch4    LABEL  WORD
  588.           mov   cx,1234h              ; y point fixe
  589.  
  590.           mov   bp,cs:DYsize          ; nb plots in height 
  591. Haut:     push  bp
  592.  
  593.           push  di                    ; save di
  594.           xor   di,di 
  595.  
  596.           mov   bp,cs:[Nbloop1]       ; nb plots/line
  597. Patch5    LABEL  WORD 
  598.           mov   dx,1234h              ; x point fixe
  599.           mov   bh,ch                 ; new index
  600. Larg:
  601.           mov   bl,dh
  602.           mov   al,BYTE PTR[bx]       ; take corresponding pixel
  603.           mov   BYTE PTR cs:[di+Plan1],al
  604.           add   dx,si
  605.           mov   bl,dh
  606.           mov   al,BYTE PTR[bx]
  607.           mov   BYTE PTR cs:[di+Plan2],al
  608.           add   dx,si
  609.           mov   bl,dh
  610.           mov   al,BYTE PTR[bx]
  611.           mov   BYTE PTR cs:[di+Plan3],al
  612.           add   dx,si
  613.           mov   bl,dh
  614.           mov   al,BYTE PTR[bx]
  615.           mov   BYTE PTR cs:[di+Plan4],al
  616.           add   dx,si                 ; next point
  617.           inc   di 
  618.           dec   bp
  619.           jnz   Larg
  620.           
  621.           jmp   $+2 ; flush prefetch queue
  622.  
  623. ; one line done ....
  624.  
  625.           pop   di
  626.  
  627.           MPUSH cx,dx,si,ds  ; copy onto screen
  628.  
  629.           mov   dx,3c4h
  630.           mov   ax,0102h ; 1st bitplane
  631.           out   dx,ax
  632.           inc   dl
  633.        
  634.           mov   bx,cs:[Nbloop2]
  635.           mov   bp,di
  636.  
  637.           push  cs
  638.           pop   ds
  639.  
  640.           mov   si,OFFSET Plan1
  641.           mov   cx,bx
  642.           rep   movsw           ; copy 1 line ....
  643.           mov   di,bp
  644.  
  645.           mov   al,02h
  646.           out   dx,al
  647.           mov   si,OFFSET Plan2
  648.           mov   cx,bx
  649.           rep   movsw
  650.           mov   di,bp
  651.  
  652.           mov   al,04h
  653.           out   dx,al
  654.           mov   si,OFFSET Plan3
  655.           mov   cx,bx
  656.           rep   movsw 
  657.           mov   di,bp
  658.  
  659.           mov   al,08h
  660.           out   dx,al
  661.           mov   si,OFFSET Plan4
  662.           mov   cx,bx
  663.           rep   movsw
  664.  
  665.           MPOP  cx,dx,si,ds 
  666.  
  667. Patch2    LABEL WORD
  668.           add   di,1234h 
  669.           add   cx,si                 ; next line          
  670.  
  671.           pop   bp
  672.           dec   bp
  673.           jnz   Haut
  674.  
  675.           MPOP  ax,cx,dx,si,di,bp,ds,es
  676.           ret
  677.  
  678. ;----------------------------------------
  679.  
  680. SXsize DW 255    ; source sizes
  681. SYsize DW 226
  682. DXsize DW 7      ; dest sizes
  683. DYsize DW 6 
  684. Centre DW 0
  685. Nbloop1 DW 0
  686. Nbloop2 DW 0
  687.  
  688. Plan1 DB 84 DUP(0)
  689. Plan2 DB 84 DUP(0)
  690. Plan3 DB 84 DUP(0)
  691. Plan4 DB 84 DUP(0)
  692.  
  693. ZoomEleph ENDP
  694.  
  695. ;==============================================================================
  696.  
  697. ELEPH_TEXT ENDS
  698.  
  699.      END
  700.  
  701.