home *** CD-ROM | disk | FTP | other *** search
/ The Equalizer BBS / equalizer-bbs-collection_2004.zip / equalizer-bbs-collection / DEMOSCENE-STUFF / BKISSSRC.ZIP / CANCEL.ASM < prev    next >
Assembly Source File  |  1994-02-11  |  7KB  |  195 lines

  1. ideal
  2. locals
  3. jumps
  4. model huge
  5. stack 100h
  6. p386
  7.  
  8. NumFrames = 2500
  9. Layer1XAngleInc = 4
  10. Layer1YAngleInc = 2
  11. Layer2XAngleInc = 3
  12. Layer2YAngleInc = 5
  13. TextMode = 0
  14.  
  15. segment     MyData
  16. FramesLeft  dw NumFrames
  17. Layer1_pos  dw ?
  18. Layer1_x    dw 0
  19. Layer1_y    dw 45
  20. Layer2_pos  dw ?
  21. Layer2_x    dw 180
  22. Layer2_y    dw 270
  23. VisualPage  dw ?                    ;offset of visual page
  24. HiddenPage  dw ?                    ;offset of hidden page
  25. CurrentPal  db 256 dup(0,0,0)
  26. extrn       PaletteData:byte        ;this should be a RGB triplet palette
  27. ends        MyData
  28.  
  29. segment     BitmapSeg
  30. extrn       BitmapData:byte         ;this should be a 320x200x256 bitmap
  31. ends        BitmapSeg
  32.  
  33. segment     MyCode
  34.             assume cs:MyCode, ds:MyData
  35. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  36. include     "sincos.inc"
  37. include     "modex.inc"
  38. FadeHandler = RefreshScreen
  39. include     "palette.inc"
  40. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  41. proc        Start
  42.             ;set up all of the segments
  43.             cld
  44.             mov ax,MyData
  45.             mov ds,ax
  46.  
  47.             ;switch over to graphics mode
  48.             @SetModeX M320x80x256,320
  49.             ScreenWidth = 320
  50.             ScreenHeight = 80
  51.             PageSize = (ScreenWidth*ScreenHeight)/4
  52.             mov [VisualPage],0
  53.             mov [HiddenPage],PageSize
  54.  
  55.             ;load in the palette
  56.             mov si,offset CurrentPal
  57.             mov di,offset PaletteData
  58.             call fade_to
  59.  
  60. @@MainLoop: call RefreshScreen
  61.  
  62.             ;if we've done enough, then quit
  63.             dec [FramesLeft]
  64.             jz @@AllDone
  65.  
  66.             ;get stdio.  If something's been pressed, quit
  67.             mov ah,6
  68.             mov dl,0FFh
  69.             int 21h
  70.             jz @@MainLoop
  71.  
  72. @@AllDone:  call fade_out
  73.  
  74.             ;change back to text mode and quit
  75.             if TextMode ne 0
  76.                 mov ax,0003h
  77.                 int 10h
  78.             endif
  79.             mov ax,4C00h
  80.             int 21h
  81. endp        Start
  82. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  83. proc        RefreshScreen
  84.             ;wait for a retrace to complete (for timing)
  85.             @WaitVertEnd
  86.  
  87.             ;reset the starting offset
  88.             mov bx,[VisualPage]
  89.             @Set_Start_Offset
  90.  
  91.             ;wait for a retrace to start (for timing)
  92.             @WaitVert
  93.  
  94.             call MovePointers
  95.             call RenderBuffer
  96.  
  97.             ;flip to the next page
  98.             mov ax,[VisualPage]
  99.             xchg [HiddenPage],ax
  100.             mov [VisualPage],ax
  101.  
  102.             ret
  103. endp        RefreshScreen
  104. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  105. proc        RenderBuffer
  106.             ;set the active plane
  107.             mov ah,1111b
  108.             @Set_Write_Plane
  109.  
  110.             ;set up our pointers
  111.             mov es,[VGASeg]             ;\ ES:DI ==> hidden page
  112.             mov di,[HiddenPage]         ;/
  113.             mov ax,BitmapSeg
  114.             mov fs,ax
  115.             mov si,[Layer1_pos]
  116.             add si,offset BitmapData
  117.             mov bx,[Layer2_pos]
  118.             add bx,offset BitmapData
  119.  
  120.             ;start doing the work
  121.             mov dx,ScreenHeight
  122. @@RowLoop:      mov cx,ScreenWidth/4
  123. @@ColLoop:          mov al,[byte fs:si]
  124.                     inc si
  125.                     xor al,[byte fs:bx]
  126.                     inc bx
  127.                     mov [byte es:di],al
  128.                     inc di
  129.                 dec cx
  130.                 jnz @@ColLoop
  131.                 add si,(320-ScreenWidth/4)
  132.                 add bx,(320-ScreenWidth/4)
  133.             dec dx
  134.             jnz @@RowLoop
  135.  
  136.             ret
  137. endp        RenderBuffer
  138. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  139. proc        MovePointers
  140.             ;calculate the position
  141.             mov si,[Layer1_y]                   ;\
  142.             shl si,1                            ; \
  143.             movsx eax,[Sine+si]                 ;  \
  144.             sal eax,8                           ;   > AX = row for block
  145.             imul eax,eax,(200-ScreenHeight)/2   ;  /
  146.             shr eax,16                          ; /
  147.             add ax,200/2-(ScreenHeight/2)       ;/
  148.             imul di,ax,320                      ;DI = AX * 320
  149.             mov si,[Layer1_x]                   ;\
  150.             shl si,1                            ; \
  151.             movsx eax,[Cosine+si]               ;  \
  152.             sal eax,8                           ;   > AX = column for block
  153.             imul eax,eax,(320-ScreenWidth/4)/2  ;  /
  154.             shr eax,16                          ; /
  155.             add ax,320/2-(ScreenWidth/4/2)      ;/
  156.             add di,ax                           ;DI = DI + AX
  157.             mov [Layer1_pos],di                 ;save the position
  158.  
  159.             ;update the angles
  160.             add [Layer1_x],Layer1XAngleInc
  161.             and [Layer1_x],1023
  162.             add [Layer1_y],Layer1YAngleInc
  163.             and [Layer1_y],1023
  164.  
  165.             ;calculate the position
  166.             mov si,[Layer2_y]                   ;\
  167.             shl si,1                            ; \
  168.             movsx eax,[Sine+si]                 ;  \
  169.             sal eax,8                           ;   > AX = row for block
  170.             imul eax,eax,(200-ScreenHeight)/2   ;  /
  171.             shr eax,16                          ; /
  172.             add ax,200/2-(ScreenHeight/2)       ;/
  173.             imul di,ax,320                      ;DI = AX * 320
  174.             mov si,[Layer2_x]                   ;\
  175.             shl si,1                            ; \
  176.             movsx eax,[Cosine+si]               ;  \
  177.             sal eax,8                           ;   > AX = column for block
  178.             imul eax,eax,(320-ScreenWidth/4)/2  ;  /
  179.             shr eax,16                          ; /
  180.             add ax,320/2-(ScreenWidth/4/2)      ;/
  181.             add di,ax                           ;DI = DI + AX
  182.             mov [Layer2_pos],di                 ;save the position
  183.  
  184.             ;update the angles
  185.             add [Layer2_x],Layer2XAngleInc
  186.             and [Layer2_x],1023
  187.             add [Layer2_y],Layer2YAngleInc
  188.             and [Layer2_y],1023
  189.  
  190.             ret
  191. endp        MovePointers
  192. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  193. ends        MyCode
  194.             end     Start
  195.