home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / phxass / examples / demosupp.asm next >
Assembly Source File  |  1977-12-31  |  11KB  |  436 lines

  1. **
  2. **    A500/600/1000/1200/2000/3000/4000
  3. **      Kick 1.2,1.3 / OS 2.x/3.x
  4. **        68000/010/020/030/040
  5. **         OCS/ECS/AGA
  6. **
  7. **    ** DEMO SUPPORT FUNCTIONS **
  8. **
  9. **
  10. **      Coded by Frank Wille 1994
  11. **           using PhxAss 4
  12. **
  13. **
  14. **     __MERGED SMALL DATA A4 - VERSION
  15. **   Link with: PhxLnk prog.o DemoSupp.o
  16. **
  17. **
  18. **  10.12.94    demoStartup, demoCleanUp, demoIntVec (created)
  19. **  12.12.94    Switched to __MERGED-SmallData
  20. **  20.12.94    demoStdView, demoBplPtrs (created)
  21. **  22.12.94    demoColors (created), code optimizations in demoStdView
  22. **
  23.  
  24.  
  25. ;=============================================================================
  26. ; Exported Symbols:
  27. ;=============================================================================
  28. ; _SysBase        Pointer to ExecBase structure
  29. ; _GfxBase        Pointer to GfxBase structure
  30. ; PALflag        true: System is in PAL mode
  31. ; AAflag        true: AGA chips are available
  32. ;=============================================================================
  33.  
  34.  
  35. ;=============================================================================
  36. ; Exported Functions:
  37. ;=============================================================================
  38. ;
  39. ; demoStartup
  40. ;    in:    -
  41. ;    out:    Z-Flag = Error! Jump to demoCleanup immediately!
  42. ;        a4 = Small Data Base
  43. ;        a6 = CUSTOM
  44. ;        All other registers are in random state!!!
  45. ;    Small Data initialization. Disable Data Cache. Enable CLI or Workbench
  46. ;    start. Determine VBR, PAL/NTSC mode, Gfx-chips. Save system state.
  47. ;    Allocate Blitter. Turn off all interrupts and DMA channels. Disable
  48. ;    AGA/ECS features. Save interrupt autovectors.
  49. ;
  50. ; demoCleanup
  51. ;    in:    -
  52. ;    out:    d0 = 0 (for return to CLI - no error)
  53. ;        All other registers are in random state!!!
  54. ;    Restores anything which has changed during the demo. Then, the program
  55. ;    may return to CLI or WB without any danger.
  56. ;
  57. ; demoIntVec
  58. ;    in:    d0.w = Number of interrupt level vector to change (1-6)
  59. ;        a0 = Pointer to interrupt routine (terminated by 'rte')
  60. ;             (CAUTION: The 'rte' should be preceded by a 'nop',
  61. ;              because of the 68040's instruction pipeline)
  62. ;    out:    -
  63. ;    Set interrupt autovector.
  64. ;
  65. ; demoStdView
  66. ;    in:    d0.w = Display width in pixels (should be word-aligned)
  67. ;        d1.w = Display height in lines
  68. ;        d2.w = Horizontal start position (std.= $81)
  69. ;        d3.w = Vertical start position (std.= $29)
  70. ;        d4.w = Depth
  71. ;            Bits 2-0 = Number of bitplanes (1-5)
  72. ;            Bit 3     = Interleaved Mode (fast blits)
  73. ;        a0 = Actual copper list pointer
  74. ;        a1 = Display memory pointer
  75. ;    out:    a0 = New copper list pointer
  76. ;        All registers, with the exception of a0, d0 and d1 will be saved
  77. ;    All necessary copper instructions for defining a display of the pre-
  78. ;    fered dimensions will be appended to the specified copper list.
  79. ;    If Width exceeds 384, the HIRES mode will be activated. If Height
  80. ;    exceeds 288 the LACE mode will be activated. Additionally to BPLxPT
  81. ;    the following registers are initialized by these copper instructions:
  82. ;    BPLxMOD, DIWSTRT, DIWSTOP, DDFSTRT, DDFSTOP, BPLCON0.
  83. ;    BPLCON1 and BPLCON2 were already initialized in demoStartup.
  84. ;
  85. ;  demoBplPtrs
  86. ;    in:    a0 = Actual copper list pointer
  87. ;        a1 = Display memory pointer
  88. ;        d0.w = Depth (1-5)
  89. ;        d1 = Plane offset (mode-dependant, e.g. LACE or Interleaved)
  90. ;    out:    a0 = New copper list pointer
  91. ;        All registers but a0 will be saved!
  92. ;    Append copper instructions for bitplane pointer initialization. This
  93. ;    routine will be also called by demoStdView.
  94. ;
  95. ;  demoColors
  96. ;    in:    a0 = Actual copper list pointer
  97. ;        a1 = Color table (RGB4 UWORDs)
  98. ;        d0.w = Number of colors in table (always beginning with COLOR00)
  99. ;    out:    a0 = New copper list pointer
  100. ;    Transfer colors from a UWORD-table directly to copper list.
  101. ;
  102. ;=============================================================================
  103.  
  104.  
  105.     incdir    "include"
  106. **  You should also define an include path for your Commodore **
  107. ** includes or make use of the PHXASSINC environment variable **
  108.  
  109.     include "lib/exec.i"
  110.     include "lib/graphics.i"
  111.  
  112.     include "exec/execbase.i"
  113.     include "exec/libraries.i"
  114.     include "dos/dosextens.i"
  115.     include "graphics/gfxbase.i"
  116.     include "hardware/dmabits.i"
  117.     include "hardware/intbits.i"
  118.     include "hardware/custom_all.i"
  119.  
  120.     IFND    lib_Version
  121. lib_Version    equ    LIB_VERSION
  122.     ENDC
  123.  
  124.  
  125.     near    a4,-2            ; Small Data __MERGED
  126.  
  127.     xref    _DATA_BAS_        ; symbols will be supplied by PhxLnk
  128.     xref    _DATA_LEN_
  129.     xref    _BSS_LEN_
  130.  
  131.  
  132.  
  133.     code
  134.  
  135.  
  136.     xdef    demoStartup
  137. demoStartup:
  138. ; -> a4 = Small Data Base
  139. ; -> a6 = CUSTOM
  140.     move.l    ExecBase.w,a6
  141.     lea    _DATA_BAS_,a0
  142.     lea    32766(a0),a4        ; a4 SmallData Base
  143.     cmp.w    #36,lib_Version(a6)    ; OS2.0+ available?
  144.     bhs.s    2$
  145.     add.l    #_DATA_LEN_,a0
  146.     move.l    #_BSS_LEN_,d0
  147. 1$:    clr.l    (a0)+            ; Initialize BSS area (for Kick 1.x)
  148.     subq.l    #4,d0
  149.     bhi.s    1$
  150.     bra.s    3$
  151. 2$:    move.l    #$100,d2
  152.     moveq    #0,d0
  153.     move.l    d2,d1
  154.     jsr    CacheControl(a6)    ; disable Data Cache
  155.     and.l    d2,d0
  156.     move.l    d0,oldCache(a4)
  157. 3$:    move.l    a6,_SysBase(a4)
  158.     move.l    ThisTask(a6),a2     ; pointer to actual process structure
  159.     move.l    pr_CLI(a2),d0
  160.     bne.s    5$            ; Workbench start?
  161. 4$:    lea    pr_MsgPort(a2),a0
  162.     jsr    WaitPort(a6)        ; get WBStartupMsg
  163.     lea    pr_MsgPort(a2),a0
  164.     jsr    GetMsg(a6)
  165.     move.l    d0,wbStartupMsg(a4)
  166.     beq.s    4$
  167. 5$:    sub.l    a0,a0
  168.     btst    #AFB_68010,AttnFlags+1(a6)
  169.     beq.s    6$
  170.     lea    get_VBR(pc),a5
  171.     jsr    Supervisor(a6)        ; read and save VBR (68010+)
  172. 6$:    move.l    a0,VBReg(a4)
  173.     lea    $64(a0),a0
  174.     lea    autoVecs(a4),a1     ; save Interrupt Autovectors
  175.     moveq    #6-1,d0
  176. 7$:    move.l    (a0)+,(a1)+
  177.     dbf    d0,7$
  178.     lea    GfxName(pc),a1
  179.     moveq    #33,d0
  180.     jsr    OpenLibrary(a6)     ; open graphics.library
  181.     move.l    d0,_GfxBase(a4)
  182.     beq    99$            ; error?
  183.     move.l    d0,a6
  184.     move.l    gb_ActiView(a6),ActiView(a4)
  185.     sub.l    a1,a1
  186.     jsr    LoadView(a6)        ; LoadView(NULL)
  187.     jsr    WaitTOF(a6)
  188.     jsr    WaitTOF(a6)
  189.     jsr    OwnBlitter(a6)        ; allocate Blitter
  190.     jsr    WaitBlit(a6)
  191.     moveq    #0,d2            ; d2 BEAMCON0 (init PAL or NTSC)
  192.     btst    #PALn,gb_DisplayFlags+1(a6)
  193.     beq.s    8$            ; PAL?
  194.     st    PALflag(a4)
  195.     moveq    #$20,d2
  196. 8$:    moveq    #%1100,d0
  197.     and.b    gb_ChipRevBits0(a6),d0
  198.     sne    AAflag(a4)        ; AGA available?
  199.     lea    CUSTOM,a6
  200.     move.w    DMACONR(a6),d0        ; save DMACON and INTENA states
  201.     or.w    #DMAF_SETCLR,d0
  202.     move.w    d0,oldDMACON(a4)
  203.     move.w    INTENAR(a6),d0
  204.     or.w    #INTF_SETCLR|INTF_INTEN,d0
  205.     move.w    d0,oldINTENA(a4)
  206.     movem.l dmaintInit(pc),d0-d1    ; turn off DMA channels, CLXCON=0
  207.     movem.l d0-d1,DMACON(a6)    ; disable interrupts, clear INTREQ
  208.  
  209.     move.w    d2,BEAMCON0(a6)     ; *** disable AGA / ECS features ***
  210.     lea    bplconInit(pc),a0
  211.     lea    BPLCON0(a6),a1        ; init BPLCON0..4, BPL1MOD, BPL2MOD
  212.     moveq    #7-1,d0
  213. 9$:    move.w    (a0)+,(a1)+
  214.     dbf    d0,9$
  215.     lea    SPR0POS(a6),a0        ; clear all sprites
  216.     moveq    #16-1,d1
  217.     moveq    #0,d0
  218. 10$:    move.l    d0,(a0)+
  219.     dbf    d1,10$
  220.     move.w    d0,FMODE(a6)        ; OCS fetch mode
  221.     moveq    #-1,d0
  222. 99$:    rts
  223.  
  224.     machine 68010
  225. get_VBR:
  226.     movec    VBR,a0
  227.     rte
  228.     machine 68000
  229.  
  230. bplconInit:                ; init values for BPLCON0..4, BPL1/2MOD
  231.     dc.w    $0000,$0000,$0024,$0c00,$0000,$0000,$0011
  232. dmaintInit:                ; init DMACON,CLXCON,INTENA,INTREQ
  233.     dc.w    $1fff,$0000,$7fff,$7fff
  234. GfxName:
  235.     dc.b    "graphics.library",0
  236.     even
  237.  
  238.  
  239.     xdef    demoCleanup
  240. demoCleanup:
  241.     move.l    _GfxBase(a4),d0
  242.     beq    3$
  243.     move.l    d0,a6
  244.     jsr    WaitBlit(a6)
  245.     lea    CUSTOM,a5
  246.     movem.l dmaintInit(pc),d0-d1    ; turn off DMA channels, CLXCON=0
  247.     movem.l d0-d1,DMACON(a5)    ; disable interrupts, clear INTREQ
  248.     moveq    #0,d0            ; zero audio volumes
  249.     move.w    d0,AUD0VOL(a5)
  250.     move.w    d0,AUD1VOL(a5)
  251.     move.w    d0,AUD2VOL(a5)
  252.     move.w    d0,AUD3VOL(a5)
  253.     lea    autoVecs(a4),a0
  254.     move.l    VBReg(a4),a1
  255.     lea    $64(a1),a1
  256.     moveq    #6-1,d0
  257. 4$:    move.l    (a0)+,(a1)+        ; restore interrupt autovectors
  258.     dbf    d0,4$
  259.     move.w    oldDMACON(a4),DMACON(a5) ; reactivate DMA channels and interrupts
  260.     move.w    oldINTENA(a4),INTENA(a5)
  261.     bclr    #1,$bfe001        ; turn on LED/filter
  262.     move.l    ActiView(a4),a1
  263.     jsr    LoadView(a6)        ; restore system View
  264.     jsr    DisownBlitter(a6)    ; free Blitter
  265.     move.l    gb_copinit(a6),COP1LC(a5) ; restart system copper lists
  266.     move.l    a6,a1
  267.     move.l    _SysBase(a4),a6
  268.     jsr    CloseLibrary(a6)    ; close graphics.library
  269. 3$:    move.l    _SysBase(a4),a6
  270.     cmp.w    #36,lib_Version(a6)
  271.     blo.s    2$            ; OS2.0+ available?
  272.     moveq    #-1,d0
  273.     move.l    oldCache(a4),d1
  274.     jsr    CacheControl(a6)    ; enable Data Cache (if required)
  275. 2$:    move.l    wbStartupMsg(a4),d0    ; WB start? Reply WB message
  276.     beq.s    1$
  277.     move.l    d0,a1
  278.     jsr    Forbid(a6)
  279.     jsr    ReplyMsg(a6)
  280. 1$:    moveq    #0,d0            ; Finished, return to CLI or Workbench
  281.     rts
  282.  
  283.  
  284.     xdef    demoIntVec
  285.     cnop    0,4
  286. demoIntVec:
  287. ; d0 = Interrupt Level (1-6)
  288. ; a0 = Pointer to interrupt routine
  289.     move.l    VBReg(a4),a1
  290.     add.w    d0,d0
  291.     add.w    d0,d0
  292.     move.l    a0,$60(a1,d0.w)     ; set interrupt autovector
  293.     rts
  294.  
  295.  
  296.     xdef    demoStdView
  297.     cnop    0,4
  298. demoStdView:
  299. ; d0 = Width.w, d1 = Height.w
  300. ; d2 = HStart.w, d3 = VStart.w
  301. ; d4 = Depth.w (Bit 3 = Interleaved)
  302. ; a0 = Copper List
  303. ; a1 = Display Memory
  304. ; -> a0 = new Copper List
  305.     movem.l d2-d7,-(sp)
  306.     move.w    #$0200,d6        ; d6 BPLCON0 Display Mode
  307.     moveq    #0,d7            ; d7 Std Modulo
  308.     move.w    d0,d5
  309.     lsr.w    #3,d5            ; d5 calculate bitplane offset
  310.     cmp.w    #384,d0
  311.     blo.s    1$            ; Width >= 384 -> HIRES
  312.     lsr.w    #1,d0            ;  convert to LoRes-width
  313.     or.w    #$8000,d6
  314. 1$:    cmp.w    #288,d1
  315.     blo.s    2$            ; Height >= 288 -> LACE
  316.     lsr.w    #1,d1
  317.     addq.w    #4,d6
  318.     move.w    d5,d7            ; d7 set Lace Modulo
  319.     bclr    #3,d4            ; Lace-Interleaved?
  320.     beq.s    4$
  321.     mulu    d4,d7
  322.     add.l    d7,d7
  323.     bra.s    3$
  324. 2$:    bclr    #3,d4            ; Interleaved?
  325.     beq.s    4$
  326.     move.w    d5,d7            ; d7 set Interleaved Modulo
  327.     mulu    d4,d7
  328. 3$:    ext.l    d5
  329.     sub.l    d5,d7
  330.     bra.s    5$
  331.  
  332. 7$:    move.w    d3,d7
  333.     lsl.w    #8,d7
  334.     move.b    d2,d7
  335. 6$:    move.w    d0,(a0)+
  336.     move.w    d7,(a0)+
  337.     addq.w    #2,d0
  338.     rts
  339.  
  340. 4$:    mulu    d1,d5
  341. 5$:    exg    d4,d0
  342.     exg    d5,d1
  343.     bsr.s    demoBplPtrs        ; initialize bitplane pointers
  344.     ror.w    #4,d0
  345.     or.w    d0,d6            ; d6 BPLCON0 ready
  346.     move.w    #BPL1MOD,d0
  347.     bsr.s    6$            ; initialize modulos
  348.     bsr.s    6$
  349.     move.w    #DIWSTRT,d0
  350.     bsr.s    7$            ; init DIWSTRT
  351.     move.w    d2,d1
  352.     add.w    d4,d2
  353.     add.w    d5,d3
  354.     bsr.s    7$            ; init DIWSTOP
  355.     moveq    #8,d7
  356.     tst.w    d6            ; HIRES?
  357.     bpl.s    8$
  358.     moveq    #4,d7
  359. 8$:    lsr.w    #1,d1            ; init DDFSTRT
  360.     sub.w    d7,d1
  361.     neg.w    d7
  362.     and.w    d1,d7
  363.     bsr.s    6$
  364.     lsr.w    #1,d4            ; init DFFSTOP
  365.     subq.w    #8,d4
  366.     add.w    d4,d7
  367.     bsr.s    6$
  368.     move.w    #BPLCON0,(a0)+        ; set BPLCON0 (DispMode, Planes)
  369.     move.w    d6,(a0)+
  370.     movem.l (sp)+,d2-d7
  371.     rts
  372.  
  373.  
  374.     xdef    demoBplPtrs
  375.     cnop    0,4
  376. demoBplPtrs:
  377. ; d0 = Depth.w
  378. ; a0 = Copper List
  379. ; a1 = Display Memory
  380. ; d1 = Plane Offset
  381. ; -> d0, d1, a1 will be saved!
  382. ; -> a0 = new Copper List
  383.     movem.l d0-d3,-(sp)
  384.     subq.w    #1,d0
  385.     move.l    a1,d3
  386.     move.w    #BPL1PT,d2
  387. 1$:    bsr.s    2$
  388.     bsr.s    2$
  389.     add.l    d1,d3
  390.     dbf    d0,1$
  391.     movem.l (sp)+,d0-d3
  392.     rts
  393. 2$:    swap    d3
  394.     move.w    d2,(a0)+
  395.     move.w    d3,(a0)+
  396.     addq.w    #2,d2
  397.     rts
  398.  
  399.  
  400.     xdef    demoColors
  401.     cnop    0,4
  402. demoColors:
  403. ; d0 = NumColors.w
  404. ; a0 = Copper List
  405. ; a1 = Color Table
  406. ; -> a0 = new Copper List
  407.     subq.w    #1,d0
  408.     move.w    #COLOR00,d1
  409. 1$:    move.w    d1,(a0)+
  410.     move.w    (a1)+,(a0)+
  411.     addq.w    #2,d1
  412.     dbf    d0,1$
  413.     rts
  414.  
  415.  
  416.  
  417.  
  418.     section "__MERGED",bss
  419.  
  420.  
  421.     xdef    _SysBase,_GfxBase,PALflag,AAflag
  422.  
  423. _SysBase:    ds.l 1
  424. _GfxBase:    ds.l 1
  425. oldCache:    ds.l 1
  426. wbStartupMsg:    ds.l 1
  427. VBReg:        ds.l 1
  428. ActiView:    ds.l 1
  429. oldDMACON:    ds.w 1
  430. oldINTENA:    ds.w 1
  431. autoVecs:    ds.l 6
  432. PALflag:    ds.b 1
  433. AAflag:     ds.b 1
  434.  
  435.     end
  436.