home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / datafiles / text / howtocode / source / startup.asm < prev    next >
Assembly Source File  |  1995-02-27  |  9KB  |  256 lines

  1. * Startup.asm  - A working tested version of startup from Howtocode7
  2. *
  3. * Written by CJ of SAE... Freeware. Share and Enjoy!
  4. *
  5. * This code sets up one of two copperlists (one for PAL and one for NTSC)
  6. * machines. It shows something to celebrate 3(?) years since the Berlin
  7. * wall came down :-) Press left mouse button to return to normality.
  8. * Tested on Amiga 3000 (ECS/V39 Kickstart) and Amiga 1200 (AGA/V39)
  9. *
  10. * $VER: startup.asm V7.tested (17.4.92)
  11. * Valid on day of purchase only. No re-admission. No rain-checks.
  12. * Now less bugs and more likely to work.
  13. *
  14. * Tested with Hisoft Devpac V3 and Argasm V1.09d
  15. *
  16. * Now added OS legal code to switch sprite resolutions. Ok, big deal
  17. * this 'demo' doesn't use any sprites. But that's the sort of effort I
  18. * go to on your behalf!   - CJ
  19.  
  20.         opt     l-,CHKIMM                   ; auto link, optimise on
  21.  
  22.         section mycode,code             ; need not be in chipram
  23.  
  24.         incdir  "include:"
  25.         include "exec/types.i"
  26.         include "exec/funcdef.i"        ; keep code simple and
  27.         include "exec/exec.i"           ; the includes!
  28.         include "libraries/dosextens.i"
  29.         include "graphics/gfxbase.i"
  30.         include "intuition/screens.i"
  31.         include "graphics/videocontrol.i"
  32.  
  33.         include "howtocode:source/include/graphics_lib.i"    ; Well done CBM!
  34.         include "howtocode:source/include/exec_lib.i"        ; They keep on
  35.         include "howtocode:source/include/intuition_lib.i"   ; forgetting these!
  36.  
  37.         include "howtocode:source/include/iconstartup.i"     ; Allows startup from icon
  38.  
  39.  
  40.         move.l  4.w,a6
  41.         sub.l   a1,a1                   ; Zero - Find current task
  42.         jsr     _LVOFindTask(a6)
  43.  
  44.         move.l  d0,a1
  45.         moveq   #127,d0                 ; task priority to very high...
  46.         jsr     _LVOSetTaskPri(a6)
  47.  
  48.         move.l  4.w,a6                  ; get ExecBase
  49.         lea     intname(pc),a1          ;
  50.         moveq   #39,d0                  ; Kickstart 3.0 or higher
  51.         jsr     _LVOOpenLibrary(a6)
  52.         move.l  d0,_IntuitionBase       ; store intuitionbase
  53. ;       Note! if this fails then kickstart is <V39.
  54.  
  55.  
  56.         move.l  4.w,a6                  ; get ExecBase
  57.         lea     gfxname(pc),a1          ; graphics name
  58.         moveq   #33,d0                  ; Kickstart 1.2 or higher
  59.         jsr     _LVOOpenLibrary(a6)
  60.         tst.l   d0
  61.         beq     End                     ; failed to open? Then quit
  62.  
  63.         move.l  d0,_GfxBase
  64.         move.l  d0,a6
  65.         move.l  gb_ActiView(a6),wbview  ; store current view address
  66.  
  67.         tst.l   _IntuitionBase          ; Intuition open? (V39 or higher)
  68.         beq.s   .skip
  69.  
  70.         bsr     FixSpritesSetup         ; fix V39 sprite bug...
  71.  
  72.         move.l  _GfxBase,a6
  73. .skip   sub.l   a1,a1                   ; clear a1
  74.         jsr     _LVOLoadView(a6)        ; Flush View to nothing
  75.         jsr     _LVOWaitTOF(a6)         ; Wait once
  76.         jsr     _LVOWaitTOF(a6)         ; Wait again.
  77.  
  78. ; Note: Something could come along inbetween the LoadView and
  79. ; your copper setup. But only if you decide to run something
  80. ; else after you start loading the demo. That's far to stupid
  81. ; to bother testing for in my opininon!!!  If you want
  82. ; to stop this, then a Forbid() won't work (WaitTOF() disables
  83. ; Forbid state) so you'll have to do Forbid() *and* write your
  84. ; own WaitTOF() replacement. No thanks... I'll stick to running
  85. ; one demo at a time :-)
  86.  
  87.         move.l  4.w,a6
  88.         cmp.w   #36,LIB_VERSION(a6)     ; check for Kickstart 2
  89.         blt.s   .oldks                  ; nope...
  90.  
  91. ; kickstart 2 or higher.. We can check for NTSC properly...
  92.  
  93.         move.l  _GfxBase,a6
  94.         btst    #2,gb_DisplayFlags(a6)  ; Check for PAL
  95.         bne.s   .pal
  96.         bra.s   .ntsc
  97.  
  98. .oldks  ; you really should upgrade!  Check for V1.x kickstart
  99.  
  100.  
  101.         move.l  4.w,a6                  ; execbase
  102.         cmp.b   #50,VBlankFrequency(a6) ; Am I *running* PAL?
  103.         bne.s   .ntsc
  104.  
  105. .pal
  106.         move.l  #mycopper,$dff080.L       ; bang it straight in.
  107.         bra.s   .lp
  108.  
  109. .ntsc
  110.         move.l  #mycopperntsc,$dff080.L
  111.  
  112.  
  113. .lp     btst    #6,$bfe001              ; ok.. I'll do an input
  114.         bne.s   .lp                     ; handler next time.
  115.  
  116. CloseDown:
  117.  
  118.         tst.l   _IntuitionBase          ; Intuiton open?
  119.         beq.s   .sk                     ; if not, skip...
  120.  
  121.         bsr     ReturnSpritesToNormal
  122.  
  123. .sk     move.l  wbview(pc),a1
  124.         move.l  _GfxBase,a6
  125.         jsr     _LVOLoadView(a6)        ; Fix view
  126.         jsr     _LVOWaitTOF(a6)
  127.         jsr     _LVOWaitTOF(a6)         ; wait for LoadView()
  128.  
  129.         move.l  gb_copinit(a6),$dff080.L  ; Kick it into life
  130.  
  131.         move.l   _IntuitionBase,a6
  132.         jsr      _LVORethinkDisplay(a6)     ; and rethink....
  133.  
  134.         move.l  _GfxBase,a1
  135.         move.l  4.w,a6
  136.         jsr     _LVOCloseLibrary(a6)    ; close graphics.library
  137.  
  138.         move.l  _IntuitionBase,d0
  139.         beq.s   End                     ; if not open, don't close!
  140.         move.l  d0,a1
  141.         jsr     _LVOCloseLibrary(a6)
  142.  
  143. End:    moveq   #0,d0                   ; clear d0 for exit
  144.         rts                             ; back to workbench/cli
  145.  
  146.  
  147. ;
  148. ; This bit fixes problems with sprites in V39 kickstart
  149. ; it is only called if intuition.library opens, which in this
  150. ; case is only if V39 or higher kickstart is installed. If you
  151. ; require intuition.library you will need to change the
  152. ; openlibrary code to open V33+ Intuition and add a V39 test before
  153. ; calling this code (which is only required for V39+ Kickstart)
  154. ;
  155.  
  156. FixSpritesSetup:
  157.         move.l   _IntuitionBase,a6          ; open intuition.library first!
  158.         lea      wbname,a0
  159.         jsr      _LVOLockPubScreen(a6)
  160.  
  161.         tst.l    d0                         ; Could I lock Workbench?
  162.         beq.s    .error                     ; if not, error
  163.         move.l   d0,wbscreen
  164.         move.l   d0,a0
  165.  
  166.         move.l   sc_ViewPort+vp_ColorMap(a0),a0
  167.         lea      taglist,a1
  168.         move.l   _GfxBase,a6                ; open graphics.library first!
  169.         jsr      _LVOVideoControl(a6)       ;
  170.  
  171.         move.l   resolution,oldres          ; store old resolution
  172.  
  173.         move.l   #SPRITERESN_140NS,resolution
  174.         move.l   #VTAG_SPRITERESN_SET,taglist
  175.  
  176.         move.l   wbscreen,a0
  177.         move.l   sc_ViewPort+vp_ColorMap(a0),a0
  178.         lea      taglist,a1
  179.         jsr      _LVOVideoControl(a6)       ; set sprites to lores
  180.  
  181.         move.l   wbscreen,a0
  182.         move.l   _IntuitionBase,a6
  183.         jsr      _LVOMakeScreen(a6)
  184.         jsr      _LVORethinkDisplay(a6)     ; and rebuild system copperlists
  185.  
  186. ; Sprites are now set back to 140ns in a system friendly manner!
  187.  
  188. .error
  189.         rts
  190.  
  191. ReturnSpritesToNormal:
  192. ; If you mess with sprite resolution you must return resolution
  193. ; back to workbench standard on return! This code will do that...
  194.  
  195.         move.l   wbscreen,d0
  196.         beq.s    .error
  197.         move.l   d0,a0
  198.  
  199.         move.l   oldres,resolution          ; change taglist
  200.         lea      taglist,a1
  201.         move.l   sc_ViewPort+vp_ColorMap(a0),a0
  202.         move.l   _GfxBase,a6
  203.         jsr      _LVOVideoControl(a6)       ; return sprites to normal.
  204.  
  205.         move.l   _IntuitionBase,a6
  206.         move.l   wbscreen,a0
  207.         jsr      _LVOMakeScreen(a6)         ; and rebuild screen
  208.  
  209.         move.l   wbscreen,a1
  210.         sub.l    a0,a0
  211.         jsr      _LVOUnlockPubScreen(a6)
  212.  
  213. .error
  214.         rts
  215.  
  216.  
  217. wbview          dc.l  0
  218. _GfxBase        dc.l  0
  219. _IntuitionBase  dc.l  0
  220. oldres          dc.l  0
  221. wbscreen        dc.l  0
  222.  
  223. taglist         dc.l  VTAG_SPRITERESN_GET
  224. resolution      dc.l  SPRITERESN_ECS
  225.                 dc.l  TAG_DONE,0
  226.  
  227. wbname          dc.b  "Workbench",0
  228. gfxname         dc.b  "graphics.library",0
  229. intname         dc.b  "intuition.library",0
  230.  
  231.  
  232.  
  233.         section mydata,data_c           ;  keep data & code seperate!
  234.  
  235. mycopper        dc.w    $100,$0200      ; otherwise no display!
  236.                 dc.w    $180,$00
  237.                 dc.w    $8107,$fffe     ; wait for $8107,$fffe
  238.                 dc.w    $180
  239. co              dc.w    $f0f            ; background red
  240.                 dc.w    $d607,$fffe     ; wait for $d607,$fffe
  241.                 dc.w    $180,$ff0       ; background yellow
  242.                 dc.w    $ffff,$fffe
  243.                 dc.w    $ffff,$fffe
  244.  
  245. mycopperntsc
  246.                 dc.w    $100,$0200      ; otherwise no display!
  247.                 dc.w    $180,$00
  248.                 dc.w    $6e07,$fffe     ; wait for $6e07,$fffe
  249.                 dc.w    $180,$f00       ; background red
  250.                 dc.w    $b007,$fffe     ; wait for $b007,$fffe
  251.                 dc.w    $180,$ff0       ; background yellow
  252.                 dc.w    $ffff,$fffe
  253.                 dc.w    $ffff,$fffe
  254.  
  255.          end
  256.