home *** CD-ROM | disk | FTP | other *** search
/ The Party 1994: Try This At Home / disk_image.bin / source / fakesrc / txtfx.asm < prev    next >
Assembly Source File  |  1993-11-19  |  10KB  |  329 lines

  1. ;=============================================================================
  2. ; txtfx.asm - Texture Effect Demostration.
  3. ;                                                    File created: 11/03/93
  4. ; Copyright (c) 1993, Carlos Hasan                  Last modified: 11/04/93
  5. ;
  6. ; Description:
  7. ;   This file implements a texture algorithm that maps repeteadly into
  8. ; screen a picture of 128x128x256 using the tweaked 80x200x256 mode.
  9. ;
  10. ; Portability:
  11. ;   Requires Turbo Assembler 3.2 or better to be assembled.
  12. ;   Dependent on the IBM PC 286 and the VGA graphics card.
  13. ;=============================================================================
  14.  
  15.         ideal
  16.         model   small,pascal
  17.         jumps
  18.         p286
  19.         
  20.         dosseg                  ; Used for Standalone DOS programs.
  21.         stack   1024            ; Sets the Stack with 1KB of space.
  22.         ends                    ; Must close stack segment!
  23.  
  24. ;===================== External Data =========================================
  25.  
  26.         global  PicRaw:far      ; 128x128x256 Image.
  27.         global  PicPal:far      ; RGB Image Palette.
  28.         global  TextFx:proc
  29.  
  30. ;===================== Demo Equates ==========================================
  31.  
  32.         dataseg
  33.  
  34. MAXWIDTH        equ     80      ; Screen Dimensions.
  35. MAXHEIGHT       equ     200
  36. BMPHEIGHT       equ     128     ; Image Bitmap Dimensions.
  37. BMPWIDTH        equ     128
  38. BMPMASK         equ     3FFFh   ; Image Position Mask.
  39. TIMEOUT         equ     1800    ; Max Number of Frames for TimeOut.
  40. ROTSPEED        equ     2       ; Rotation Speed Factor.
  41. AMPSPEED        equ     4       ; Amplify Speed Factor.
  42. FADESPEED       equ     6       ; Fadeout Speed Factor.
  43.  
  44.         include "SinCos.Inc"    ; Sinus/Cosinus Table.
  45.  
  46. ;======================== Demo Routines ======================================
  47.  
  48.         codeseg
  49.  
  50. ;-----------------------------------------------------------------------------
  51. ; SetGraphMode - Sets the tweaked 80x200x256 VGA mode.
  52. ;-----------------------------------------------------------------------------
  53.  
  54. proc    SetGraphMode
  55.         mov     ax,13h          ; Sets VGA 320x200x256 mode.
  56.         int     10h
  57.         mov     dx,3C4h         ; Disable Chain-Four.
  58.         mov     al,04h
  59.         out     dx,al
  60.         inc     dx
  61.         in      al,dx
  62.         and     al,0F7h
  63.         out     dx,al
  64.         mov     dx,3C4h         ; Enable All Planes.
  65.         mov     ax,0F02h
  66.         out     dx,ax
  67.         mov     ax,0A000h       ; Clear Video Memory
  68.         mov     es,ax
  69.         xor     di,di
  70.         xor     ax,ax
  71.         mov     cx,8000h
  72.         cld
  73.         rep     stosw
  74.         mov     dx,3D4h         ; Normal Word Addressing.
  75.         mov     al,14h
  76.         out     dx,al
  77.         inc     dx
  78.         in      al,dx
  79.         and     al,0BFh
  80.         out     dx,al
  81.         dec     dx              ; Address Output Byte Mode.
  82.         mov     al,17h
  83.         out     dx,al
  84.         inc     dx
  85.         in      al,dx
  86.         or      al,40h
  87.         out     dx,al
  88.         ret
  89. endp    SetGraphMode
  90.  
  91.  
  92. ;-----------------------------------------------------------------------------
  93. ; SetTextMode - Restores 80x25x16 text mode.
  94. ;-----------------------------------------------------------------------------
  95.  
  96. proc    SetTextMode
  97.         mov     ax,03h
  98.         int     10h
  99.         ret
  100. endp    SetTextMode
  101.  
  102. ;-----------------------------------------------------------------------------
  103. ; WaitVR - Waits the Next Vertical Retrace.
  104. ;-----------------------------------------------------------------------------
  105.  
  106. proc    WaitVR
  107.         mov     dx,3DAh
  108. WaitNotVRT:
  109.         in      al,dx
  110.         test    al,8
  111.         jne     WaitNotVRT
  112. WaitEndVRT:
  113.         in      al,dx
  114.         test    al,8
  115.         je      WaitEndVRT
  116.         ret
  117. endp    WaitVR
  118.  
  119. ;-----------------------------------------------------------------------------
  120. ; SetPalette - Sets the current VGA color palette.
  121. ; In:
  122. ;  DS:SI - Palette Address.
  123. ;-----------------------------------------------------------------------------
  124.  
  125. proc    SetPalette
  126.         call    WaitVR
  127.         mov     dx,3C8h
  128.         xor     al,al
  129.         out     dx,al
  130.         inc     dx
  131.         mov     cx,768
  132.         cld
  133.         rep     outsb
  134.         ret
  135. endp    SetPalette
  136.  
  137. ;-----------------------------------------------------------------------------
  138. ; FadeOut - Fades out the RGB Palette.
  139. ; In:
  140. ;  DS:SI = Palette Address.
  141. ;-----------------------------------------------------------------------------
  142.  
  143. proc    FadeOut
  144.         push    si
  145.         push    ds
  146.         mov     cx,768
  147.         xor     bx,bx
  148.         mov     di,si
  149. DecPal: sub     [byte ptr di],FADESPEED
  150.         jnc     NotDec
  151.         inc     bx
  152.         mov     [byte ptr di],0
  153. NotDec: inc     di
  154.         loop    DecPal
  155.         push    bx
  156.         call    SetPalette
  157.         pop     bx
  158.         pop     ds
  159.         pop     si
  160.         cmp     bx,768
  161.         jb      FadeOut
  162.         ret
  163. endp    FadeOut
  164.  
  165. ;-----------------------------------------------------------------------------
  166. ; RotImage - Puts on the screen the rotated image.
  167. ; In:
  168. ;  DeltaX,DeltaY = Rotation Parameters.
  169. ;  Image         = Source 128x128x256 Image Bitmap.
  170. ;-----------------------------------------------------------------------------
  171.  
  172. proc    RotImage DeltaX:word,DeltaY:word,Image:word
  173. local   AddX:word:MAXWIDTH,AddY:word:MAXHEIGHT
  174.  
  175.         push    ds
  176.         push    es
  177.  
  178.         shl     [DeltaX],1      ; Makes the Horiz Array
  179.         shl     [DeltaY],1      ; of increments for the
  180.         mov     cx,MAXWIDTH     ; Rotation.
  181.         xor     bl,bl
  182.         xor     dl,dl
  183.         lea     di,[AddX]
  184. MakeAddX:
  185.         xor     bh,bh
  186.         xor     dh,dh
  187.         add     bx,[DeltaX]
  188.         add     dx,[DeltaY]
  189.         mov     al,dh
  190.         cbw
  191.         imul    si,ax,BMPWIDTH
  192.         mov     al,bh
  193.         cbw
  194.         add     ax,si
  195.         mov     [ss:di],ax
  196.         add     di,2
  197.         loop    MakeAddX
  198.  
  199.         sar     [DeltaX],1      ; Makes the Vert Array
  200.         sar     [DeltaY],1      ; of increments for the
  201.         mov     cx,MAXHEIGHT    ; Rotation.
  202.         xor     bl,bl
  203.         xor     dl,dl
  204.         lea     di,[AddY]
  205. MakeAddY:
  206.         xor     bh,bh
  207.         xor     dh,dh
  208.         sub     bx,[DeltaY]
  209.         add     dx,[DeltaX]
  210.         mov     al,dh
  211.         cbw
  212.         imul    si,ax,BMPWIDTH
  213.         mov     al,bh
  214.         cbw
  215.         add     ax,si
  216.         mov     [ss:di],ax
  217.         add     di,2
  218.         loop    MakeAddY
  219.  
  220.         mov     ax,0A000h       ; Start drawing at the top left
  221.         mov     es,ax           ; screen corner.
  222.         xor     di,di
  223.         mov     ds,[Image]      ; Load Source Image Address.
  224.         xor     si,si
  225.         mov     dx,BMPMASK      ; Load Image Position Mask.
  226.         lea     bx,[AddY]
  227.         mov     cx,MAXHEIGHT
  228.         cld
  229. DrawScanLines:
  230.         push    si
  231.         OFF=0                    ; This Loop have been unrolled
  232.         REPT MAXWIDTH/2          ; for fastest drawing.
  233.         and      si,dx           ; Also, the drawwing is done 
  234.         mov      al,[si]         ; putting two pixels at once.
  235.         add      si,[ss:AddX+OFF]
  236.         and      si,dx
  237.         mov      ah,[si]
  238.         add      si,[ss:AddX+OFF+2]
  239.         stosw
  240.         OFF=OFF+4
  241.         ENDM
  242.         pop     si
  243.         add     si,[ss:bx]       ; Next Scan Line. 
  244.         add     bx,2
  245.         dec     cx
  246.         jne     DrawScanLines
  247.         pop     es
  248.         pop     ds
  249.         ret
  250. endp    RotImage
  251.  
  252. ;-----------------------------------------------------------------------------
  253. ; TextFx - Performs the Demostration.
  254. ; In:
  255. ;  DS      = Data Segment.
  256. ;  Image   = Source Image Segment.
  257. ;  Palette = Image RGB Palette.
  258. ;-----------------------------------------------------------------------------
  259.  
  260. proc    TextFx Image:word,Palette:dword
  261.         pusha
  262.         push    ds
  263.         push    es
  264.         call    SetGraphMode    ; Init Graphics Mode.
  265.         push    ds
  266.         lds     si,[Palette]    ; Sets the RGB Palette.
  267.         call    SetPalette
  268.         pop     ds
  269.  
  270.         xor     bx,bx           ; Init Rotation Angle.
  271.         mov     dx,32           ; Init Amplify Factor.
  272. TextFxLoop:
  273.         add     bl,ROTSPEED     ; Increase Rot Angle.
  274.         add     dx,AMPSPEED     ; Increase Amplify Factor.
  275.         mov     cl,[SinTable+bx]
  276.         mov     ch,[CosTable+bx]
  277.         push    bx
  278.         push    dx
  279.         mov     al,cl           ; Amplify Rotation Parameters
  280.         cbw                     ; using the Amplify Factor.
  281.         imul    dx
  282.         mov     al,ah
  283.         mov     ah,dl
  284.         mov     bx,ax
  285.         pop     dx
  286.         push    dx
  287.         mov     al,ch
  288.         cbw
  289.         imul    dx
  290.         mov     al,ah
  291.         mov     ah,dl
  292.         call    RotImage,ax,bx,[Image]
  293.         mov     ah,1            ; Any Key Pressed?
  294.         int     16h
  295.         pop     dx
  296.         pop     bx
  297.         jz      CheckTimeOut
  298.         mov     ah,0
  299.         int     16h
  300.         jmp     TextExit
  301. CheckTimeout:
  302.         cmp     dx,TIMEOUT      ; Enough Frames Showed?
  303.         jb      TextFxLoop
  304. TextExit:
  305.         lds     si,[Palette]    ; Fade out the Palette.
  306.         call    FadeOut
  307.         call    SetTextMode     ; Restores 80x25x16 Text Mode.
  308.         pop     es
  309.         pop     ds
  310.         popa
  311.         ret
  312. endp    TextFx
  313.  
  314. ;-----------------------------------------------------------------------------
  315. ; Start - Startup code called from DOS.
  316. ; In:
  317. ;  ES = Program Segment Prefix.
  318. ;-----------------------------------------------------------------------------
  319.  
  320. proc    Start
  321.         mov     ax,@Data        ; Setup Data Segment.
  322.         mov     ds,ax           ; Do the Demostration.
  323.         call    TextFx,SEG PicRaw,SEG PicPal,OFFSET PicPal
  324.         mov     ax,4C00h
  325.         int     21h             ; Exit to DOS.
  326. endp    Start
  327.  
  328.         end     Start
  329.