home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 4: Demo 1 / almathera_demo1.bin / commercial / asmonedemo / asm-one / examples / scrollexample.s < prev    next >
Text File  |  1995-03-16  |  7KB  |  267 lines

  1. ;*******************************************************
  2. ;* Example Of An Scroller Which Uses The Topaz RomFont *
  3. ;*                                                     *
  4. ;*      ASM-One Example Coded By Mads Henriksen.       *
  5. ;*    Non-System Startup Coded by Rune Gram-Madsen     *
  6. ;*                                                     *
  7. ;*       All rights reserved. Copyright (c) 1990       *
  8. ;*******************************************************
  9.  
  10. ;*****************
  11. ;*   Constants   *
  12. ;*****************
  13.  
  14. OldOpenLibrary    = -408
  15. CloseLibrary    = -414
  16. OpenFont    = -72
  17. CloseFont    = -78
  18.  
  19. DMASET=    %1000010111000000
  20. ;     -----a-bcdefghij
  21.  
  22. ;    a: Blitter Nasty
  23. ;    b: Bitplane DMA (if this isn't set, sprites disappear!)
  24. ;    c: Copper DMA
  25. ;    d: Blitter DMA
  26. ;    e: Sprite DMA
  27. ;    f: Disk DMA
  28. ;    g-j: Audio 3-0 DMA
  29.  
  30. START:
  31.     MOVEM.L    D0-D7/A0-A6,-(A7)    ; Put registers on stack
  32.  
  33. ;***********************************
  34. ;*   CLOSE ALL SYSTEM INTERRUPTS   *
  35. ;*                                 *
  36. ;*      START DEMO INTERRUPTS      *
  37. ;***********************************
  38.  
  39.     MOVE.L    $4.W,A6            ; Exec pointer to A6
  40.     LEA.L    GfxName(PC),A1        ; Set library pointer
  41.     MOVEQ    #0,D0
  42.     JSR    OldOpenLibrary(A6)    ; Open graphics.library
  43.     MOVE.L    D0,A1            ; Use Base-pointer
  44.     MOVE.L    $26(A1),OLDCOP1        ; Store copper1 start addr
  45.     MOVE.L    $32(A1),OLDCOP2        ; Store copper1 start addr
  46.     MOVE.L    A1,-(SP)        ; Save The GfxBase Pointer
  47.  
  48. OPENROMFONT:
  49.     MOVE.L    A1,A6            ; Use The GfxBase Pointer
  50.     LEA.L    TxtAttr(PC),A0        ; FontStructure Pointer To A0
  51.     JSR    OpenFont(A6)        ; Open The Font
  52.     MOVE.L    D0,A1            ; Save The Font Pointer
  53.  
  54. FINDROMFONT:
  55.     MOVE.L    34(A1),FONTPTR        ; Save The RomFont Pointer
  56.     MOVE.W    38(A1),FONTMOD        ; Save The RomFont Modulo
  57.  
  58. CLOSEROMFONT
  59.     JSR    CloseFont(A6)        ; Close The Font
  60.  
  61.     MOVE.L    (SP)+,A1        ; Get The GfxBase Pointer
  62.     JSR    CloseLibrary(A6)    ; Close graphics library
  63.  
  64.     LEA    $DFF000,A6
  65.     MOVE.W    $1C(A6),INTENA        ; Store old INTENA
  66.     MOVE.W    $2(A6),DMACON        ; Store old DMACON
  67.     MOVE.W    $10(A6),ADKCON        ; Store old ADKCON
  68.  
  69.     MOVE.W    #$7FFF,$9A(A6)        ; Clear interrupt enable
  70.  
  71.     BSR.L    Wait_Vert_Blank
  72.  
  73.     MOVE.W    #$7FFF,$96(A6)        ; Clear DMA channels
  74.     MOVE.L    #COPLIST,$80(A6)    ; Copper1 start address
  75.     MOVE.W    #DMASET!$8200,$96(A6)    ; DMA kontrol data
  76.     MOVE.L    $6C.W,OldInter        ; Store old inter pointer
  77.     MOVE.L    #INTER,$6C.W        ; Set interrupt pointer
  78.  
  79.     MOVE.W    #$7FFF,$9C(A6)        ; Clear request
  80.     CLR.W    $88(A6)            ; Start copper1
  81.     MOVE.W    #$C020,$9A(A6)        ; Interrupt enable
  82.  
  83. ;************************************
  84. ;*   MAIN LOOP  TEST MOUSE BOTTON   *
  85. ;************************************
  86.  
  87. LOOP:
  88.     BTST    #6,$BFE001        ; Test left mouse button
  89.     BNE.S    LOOP
  90.  
  91. ;*****************************************
  92. ;*                     *
  93. ;*   RESTORE SYSTEM INTERRUPTS ECT ECT   *
  94. ;*                     *
  95. ;*****************************************
  96.  
  97.     LEA    $DFF000,A6
  98.  
  99.     MOVE.W    #$7FFF,$9A(A6)        ; Disable interrupts
  100.  
  101.     BSR.S    Wait_Vert_Blank
  102.  
  103.     MOVE.W    #$7FFF,$96(A6)
  104.     MOVE.L    OldCop1(PC),$80(A6)    ; Restore old copper1
  105.     MOVE.L    OldCop2(PC),$84(A6)    ; Restore old copper1
  106.     MOVE.L    OldInter(PC),$6C.W    ; Restore inter pointer
  107.     MOVE.W    DMACON,D0        ; Restore old DMACON
  108.     OR.W    #$8000,D0
  109.     MOVE.W    D0,$96(A6)        
  110.     MOVE.W    ADKCON,D0        ; Restore old ADKCON
  111.     OR.W    #$8000,D0
  112.     MOVE.W    D0,$9E(A6)
  113.     MOVE.W    INTENA,D0        ; Restore inter data
  114.     OR.W    #$C000,D0
  115.     MOVE.W    #$7FFF,$9C(A6)
  116.     MOVE.W    D0,$9A(A6)
  117.     CLR.W    $88(A6)            ; Restart old copper1
  118.     MOVEM.L    (A7)+,D0-D7/A0-A6    ; Get registers from stack
  119.     RTS
  120.  
  121. ;*** WAIT VERTICAL BLANK ***
  122.  
  123. Wait_Vert_Blank:
  124.     TST.B    $5(A6)
  125.     BEQ.S    Wait_Vert_Blank
  126. .loop    TST.B    $5(A6)
  127.     BNE.S    .loop
  128.     RTS
  129.  
  130. ;*** DATA AREA ***
  131.  
  132. GfxName        DC.B    'graphics.library',0
  133.         even
  134. DosBase        DC.L    0
  135. OldInter    DC.L    0
  136. OldCop1        DC.L    0
  137. OldCop2        DC.L    0
  138. INTENA        DC.W    0
  139. DMACON        DC.W    0
  140. ADKCON        DC.W    0
  141.  
  142. TxtAttr        DC.L    FNTNAME
  143.         DC.W    8
  144.         DC.B    0
  145.         DC.B    0
  146. FntName        DC.B    'topaz.font',0,0
  147.  
  148. FontPtr        DC.L    0
  149. FontMod        DC.W    0
  150.  
  151. SCROLLCOUNT    DC.W    0
  152. SCROLLPTR    DC.L    SCROLLTEXT
  153. SCROLLTEXT    DC.B    'This Is Just A Test...          ',0,0
  154.  
  155. ;**********************************
  156. ;*                  *
  157. ;*   INTERRUPT ROUTINE. LEVEL 3   *
  158. ;*                  *
  159. ;**********************************
  160.  
  161. INTER:
  162.     MOVEM.L    D0-D7/A0-A6,-(A7)    ; Put registers on stack
  163.     LEA.L    $DFF000,A6
  164.     MOVE.L    #SCREEN,$E0(A6)
  165.  
  166. ;---  Place your interrupt routine here  ---
  167.  
  168.     BSR.S    MAKESCROLL        ; Call Our Scroll Routine
  169.  
  170.     MOVE.W    #$4020,$9C(A6)        ; Clear interrupt request
  171.     MOVEM.L    (A7)+,D0-D7/A0-A6     ; Get registers from stack
  172.     RTE
  173.  
  174. ;******  Scroll Routine  ******
  175.  
  176. MAKESCROLL:
  177.     TST.W    SCROLLCOUNT        ; Have There Been Scrolled 8 Times?
  178.     BEQ.S    MAKESCROLL1        ; Yes, Jump To MakeScroll1
  179.     SUBQ.W    #1,SCROLLCOUNT        ; No, Sub ScrollCount
  180.     BRA.S    MAKESCROLL5        ; And Jump To Scroll Routine
  181.  
  182. MAKESCROLL1:
  183.     MOVE.L    SCROLLPTR(PC),A0    ; ScrollText Pointer To A0
  184.     MOVEQ    #0,D0            ; Clear D0
  185.     MOVE.B    (A0)+,D0        ; Get The New Character In D0
  186.     BNE.S    MAKESCROLL2        ; If Not Zero Then Jump To MakeScroll2
  187.     MOVE.L    #SCROLLTEXT,SCROLLPTR    ; If Zero Then Restore Text Pointer
  188.     BRA.S    MAKESCROLL1        ; And Repeat The Same Procedure Again
  189.  
  190. MAKESCROLL2:
  191.     MOVE.L    A0,SCROLLPTR        ; Save The Increased ScrollText Pointer
  192.     MOVE.W    #7,SCROLLCOUNT        ; ScrollCounter = 8/ScrollSpeed-1 ('7')
  193.  
  194. MAKESCROLL3:
  195.     LEA.L    SCREEN+120*42+40,A0    ; Screen Pointer In A0
  196.     MOVE.L    FONTPTR(PC),A1        ; Get The RomFont Pointer In A1
  197.     SUB.B    #32,D0            ; Sub #32 To Fetch The Right Char
  198.     ADD.W    D0,A1            ; And Add To RomFont Pointer In A1
  199.     MOVEQ    #0,D0            ; Clear D0
  200.     MOVEQ    #7,D7            ; FontHeight-1 In D7
  201.  
  202. MAKESCROLL4:
  203.     MOVE.B    (A1,D0.W),(A0)        ; Load Characters To Screen
  204.     ADD.W    FONTMOD(PC),D0        ; Add Font Modulo To D0
  205.     ADD.W    #42,A0            ; And Add ScreenWidth To A0
  206.     DBF    D7,MAKESCROLL4        ; Loop FontHeight Times To MakeScroll4
  207.  
  208. MAKESCROLL5:
  209.     BTST    #14,$02(A6)        ; Test If Blitter Is Finished
  210.     BNE.S    MAKESCROLL5        ; No Sir, And Wait Again
  211.     MOVE.L    #$19F00002,$40(A6)    ; '1' = ScrollSpeed... Look 19 Lines Up
  212.     MOVE.L    #$FFFFFFFF,$44(A6)    ; Source A : First/Last Masking
  213.     MOVE.L    #SCREEN+128*42-2,$50(A6); Source A : Pointer To ScrollArea
  214.     MOVE.L    #SCREEN+128*42-2,$54(A6); Destination : Pointer To ScrollArea
  215.     MOVE.L    #0,$64(A6)        ; Source A And Destination Modulo
  216.     MOVE.W    #8*64+21,$58(A6)    ; BlitterSize And BlitterStart
  217.     RTS                ; Return From This Routine
  218.  
  219. ;*****************************
  220. ;*                 *
  221. ;*      COPPER1 PROGRAM      *
  222. ;*                 *
  223. ;*****************************
  224.  
  225.     SECTION    Copper,DATA_C
  226.  
  227. COPLIST:
  228.     DC.W    $0100,$1200    ; Bit-Plane control reg.
  229.     DC.W    $0102,$0000    ; Hor-Scroll
  230.     DC.W    $0104,$0010    ; Sprite/Gfx priority
  231.     DC.W    $0108,$0002    ; Modolu (odd)
  232.     DC.W    $010A,$0000    ; Modolu (even)
  233.     DC.W    $008E,$2C81    ; Screen Size
  234.     DC.W    $0090,$2CC1    ; Screen Size
  235.     DC.W    $0092,$0038    ; H-start
  236.     DC.W    $0094,$00D0    ; H-stop
  237.     DC.W    $0180,$0000    ; Color #0 = 000 (Black)
  238.     DC.W    $A401,$FFFE    ; And Wait For The Right ScanLine
  239.     DC.W    $0182,$0CDE    ; Now Some Color Exchanging
  240.     DC.W    $A501,$FFFE    ; To Make The Right Scroll Colors.
  241.     DC.W    $0182,$0ABC    ; Bla.Bla.Bla.
  242.     DC.W    $A601,$FFFE    ; Bla.Bla.
  243.     DC.W    $0182,$089A    ; Bla.
  244.     DC.W    $A701,$FFFE
  245.     DC.W    $0182,$0678
  246.     DC.W    $A801,$FFFE
  247.     DC.W    $0182,$0876
  248.     DC.W    $A901,$FFFE
  249.     DC.W    $0182,$0A98
  250.     DC.W    $AA01,$FFFE
  251.     DC.W    $0182,$0CBA
  252.     DC.W    $AB01,$FFFE
  253.     DC.W    $0182,$0EDC
  254.     DC.W    $AC01,$FFFE
  255.     DC.W    $0182,$0FED
  256.     DC.L    $FFFFFFFE    ; This Means : End Of CopperList.
  257.  
  258. ;*****************************
  259. ;*                 *
  260. ;*      SCREEN DATA AREA     *
  261. ;*                 *
  262. ;*****************************
  263.  
  264.     SECTION    Screen,BSS_C
  265.  
  266. SCREEN    DS.B    256*42        ; Clear Our ScrollScreen
  267.