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

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