home *** CD-ROM | disk | FTP | other *** search
/ ST-Computer Leser 2002 January / STC_CD_01_2002.iso / SCENE / IMATROLL / SRC / SYS / INIT.S < prev    next >
Text File  |  2001-11-28  |  7KB  |  261 lines

  1. ; Falcon demoshell
  2. ; January 24, 2000
  3. ;
  4. ; Anders Eriksson
  5. ; ae@atari.org
  6. ;
  7. ; init.s
  8.         section    text
  9.  
  10. begin:
  11.  
  12. ; --------------------------------------------------------------
  13. ;        reserve stackspace and leave back memory
  14. ; --------------------------------------------------------------
  15.  
  16.         move.l    4(sp),a5                ;address to basepage
  17.         move.l    $0c(a5),d0                ;length of text segment
  18.         add.l    $14(a5),d0                ;length of data segment
  19.         add.l    $1c(a5),d0                ;length of bss segment
  20.         add.l    #$1000+100,d0                ;length of stackpointer+basepage
  21.         move.l    a5,d1                    ;address to basepage
  22.         add.l    d0,d1                    ;end of program
  23.         and.l    #-2,d1                    ;make address even
  24.         move.l    d1,sp                    ;new stackspace
  25.  
  26.         move.l    d0,-(sp)                ;mshrink()
  27.         move.l    a5,-(sp)                ;
  28.         clr.w    -(sp)                    ;
  29.         move.w    #$4a,-(sp)                ;
  30.         trap    #1                    ;
  31.         lea.l    12(sp),sp                ;
  32.  
  33.  
  34. ; --------------------------------------------------------------
  35. ;        audio/dsp testings
  36. ; --------------------------------------------------------------
  37.  
  38.         move.w    #$68,-(sp)                ;Dsp_Lock()
  39.         trap    #14                    ;
  40.         addq.l    #2,sp                    ;
  41.         
  42.         tst.l    d0                    ;dsp locked?
  43.         beq.s    .dsplock                ;ok
  44.         move.l    #exit_dsplocked_text,error_adr        ;error message
  45.         bra.w    exit                    ;
  46.  
  47. .dsplock:    addq.w    #1,runlevel                ;1 restore dsp_lock
  48.  
  49.  
  50.         move.w    #$80,-(sp)                ;Locksnd()
  51.         trap    #14                    ;
  52.         addq.l    #2,sp                    ;
  53.         
  54.         cmp.l    #1,d0                    ;soundsystem lock
  55.         beq.s    .sndlock                ;ok
  56.         move.l    #exit_sndlocked_text,error_adr        ;error message
  57.         bra.w    exit                    ;
  58.  
  59. .sndlock:    addq.w    #1,runlevel                ;2 restore locksnd
  60.  
  61.  
  62.  
  63. ; --------------------------------------------------------------
  64. ;        monitor test
  65. ; --------------------------------------------------------------
  66.  
  67.         move.w    #$59,-(sp)                ;VgetMonitor()
  68.         trap    #14                    ;
  69.         addq.l    #2,sp                    ;
  70.  
  71.         tst.w    d0                    ;mono
  72.         bne.s    .vga                    ;ok
  73.         move.l    #exit_mono_text,error_adr        ;error message
  74.         bra.w    exit                    ;
  75.         
  76. .vga:        cmp.w    #2,d0                    ;vga
  77.         beq.s    .ok                    ;
  78.  
  79.         move.w    #1,monitor                ;rgb/tv
  80. .ok:
  81.  
  82.  
  83. ; --------------------------------------------------------------
  84. ;        demo gem/text init
  85. ; --------------------------------------------------------------
  86.  
  87.         addq.w    #1,runlevel                ;3 restore gem
  88.  
  89.  
  90. ; --------------------------------------------------------------
  91. ;        initiate workscreens
  92. ; --------------------------------------------------------------
  93.  
  94.         clr.w    -(sp)                    ;Mxalloc()
  95.         move.l    #scr_w*scr_h*scr_d*3+256,-(sp)        ;size of all screens
  96.         move.w    #$44,-(sp)                ;
  97.         trap    #1                    ;
  98.         addq.l    #8,sp                    ;
  99.  
  100.         tst.l    d0                    ;ramcheck
  101.         bne.s    .makeeven                ;ok
  102.         move.l    #exit_nostram_text,error_adr        ;error message
  103.         bra.w    exit                    ;
  104.  
  105. .makeeven:    add.l    #256,d0                    ;make even address
  106.         clr.b    d0                    ;
  107.  
  108.         move.l    #scr_w*scr_h*scr_d,d1            ;screensize
  109.         lea.l    screen_adr1,a0                ;screen addresses
  110.         
  111.         move.l    d0,a1                    ;for clear screens
  112.         move.l    d0,(a0)+                ;screen_adr
  113.         add.l    d1,d0                    ;
  114.         move.l    d0,(a0)+                ;screen_adr2
  115.         add.l    d1,d0                    ;
  116.         move.l    d0,(a0)                    ;screen_adr3
  117.  
  118.         move.w    #scr_h*3-1,d7                ;clear screens
  119. .y:        move.w    #scr_w*scr_d/4-1,d6            ;
  120. .x:        clr.l    (a1)+                    ;
  121.         dbra    d6,.x                    ;
  122.         dbra    d7,.y                    ;
  123.  
  124.  
  125.  
  126.  
  127. ; --------------------------------------------------------------
  128. ;        dta save/init
  129. ; --------------------------------------------------------------
  130.  
  131.  
  132.         move.w    #$2f,-(sp)                ;fgetdta()
  133.         trap    #1                    ;save old dta
  134.         addq.l    #2,-(sp)                ;
  135.         move.l    d0,save_dta                ;
  136.  
  137.         move.l    #dta,-(sp)                ;fsetdta()
  138.         move.w    #$1a,-(sp)                ;set new dta
  139.         trap    #1                    ;
  140.         addq.l    #6,sp                    ;
  141.  
  142.         addq.w    #1,runlevel                ;4 restore dta
  143.  
  144.  
  145. ; --------------------------------------------------------------
  146. ;        supervisor
  147. ; --------------------------------------------------------------
  148.  
  149.  
  150.         clr.l    -(sp)                    ;super()
  151.         move.w    #$20,-(sp)                ;
  152.         trap    #1                    ;
  153.         addq.l    #6,sp                    ;
  154.         move.l    d0,save_stack                ;
  155.  
  156.         addq.w    #1,runlevel                ;5 restore super
  157.  
  158.  
  159. ; --------------------------------------------------------------
  160. ;        video save / init
  161. ; --------------------------------------------------------------
  162.  
  163.  
  164.         lea.l    $ffff9800.w,a0                ;save falcon palette
  165.         lea.l    save_pal,a1                ;
  166.         move.w    #256-1,d7                ;
  167. .colloop:    move.l    (a0)+,(a1)+                ;
  168.         dbra    d7,.colloop                ;
  169.  
  170.         movem.l    $ffff8240.w,d0-d7            ;save st palette
  171.         movem.l    d0-d7,(a1)                ;
  172.  
  173.         lea.l    save_video,a0                ;store videomode
  174.         move.l    $ffff8200.w,(a0)+            ;vidhm
  175.         move.w    $ffff820c.w,(a0)+            ;vidl
  176.         move.l    $ffff8282.w,(a0)+            ;h-regs
  177.         move.l    $ffff8286.w,(a0)+            ;
  178.         move.l    $ffff828a.w,(a0)+            ;
  179.         move.l    $ffff82a2.w,(a0)+            ;v-regs
  180.         move.l    $ffff82a6.w,(a0)+            ;
  181.         move.l    $ffff82aa.w,(a0)+            ;
  182.         move.w    $ffff82c0.w,(a0)+            ;vco
  183.         move.w    $ffff82c2.w,(a0)+            ;c_s
  184.         move.l    $ffff820e.w,(a0)+            ;offset
  185.         move.w    $ffff820a.w,(a0)+            ;sync
  186.         move.b  $ffff8256.w,(a0)+            ;p_o
  187.         clr.b   (a0)                    ;test of st(e) or falcon mode
  188.         cmp.w   #$b0,$ffff8282.w            ;hht kleiner $b0?
  189.         sle     (a0)+                    ;flag setzen
  190.         move.w    $ffff8266.w,(a0)+            ;f_s
  191.         move.w    $ffff8260.w,(a0)+            ;st_s
  192.  
  193.  
  194.  
  195.         move.l    screen_adr2,d0                ;set screen
  196.         move.b    d0,d1                    ;
  197.         lsr.w   #8,d0                    ;
  198.         move.b  d0,$ffff8203.w                ;
  199.         swap    d0                    ;
  200.         move.b  d0,$ffff8201.w                ;
  201.         move.b  d1,$ffff820d.w                ;
  202.  
  203.         addq.w    #1,runlevel                ;6 restore video
  204.  
  205.  
  206.  
  207. ; --------------------------------------------------------------
  208. ;        save / remove keyclick
  209. ; --------------------------------------------------------------
  210.  
  211.         move.b    $484.w,save_keymode            ;save keyclick
  212.         bclr    #0,$484                    ;keyclick off
  213.         addq.w    #1,runlevel                ;7 restore keyclick
  214.  
  215.  
  216. ; --------------------------------------------------------------
  217. ;        run the init-list
  218. ; --------------------------------------------------------------
  219.  
  220.  
  221.         lea.l    inits,a0                ;init list
  222. .again:        move.l    (a0)+,a1                ;
  223.         tst.l    a1                    ;
  224.         beq.s    .done                    ;
  225.         move.l    a0,-(sp)                ;
  226.         jsr    (a1)                    ;
  227.         move.l    (sp)+,a0                ;
  228.         bra.s    .again                    ;
  229. .done:                                ;
  230.  
  231.         addq.w    #1,runlevel                ;8 restore sound
  232.  
  233.  
  234. ; --------------------------------------------------------------
  235. ;        init timer-d and vbl
  236. ; --------------------------------------------------------------
  237.  
  238.         addq.w    #1,runlevel                ;9 restore interupts
  239.  
  240.         move.w    sr,d0                    ;save sr
  241.         move.w    #$2700,sr                ;ints off
  242.  
  243.         lea.l    save_mfp,a0                ;save mfp
  244.         move.b    $fffffa09.w,(a0)+            ;
  245.         move.b    $fffffa15.w,(a0)+            ;
  246.         move.b    $fffffa1d.w,(a0)+            ;
  247.         move.b    $fffffa25.w,(a0)+            ;
  248.  
  249.         bset    #4,$fffffa09.w                ;timer-d
  250.         bset    #4,$fffffa15.w                ;
  251.         or.b    #%111,$fffffa1d.w            ;%111 = divide by 200
  252.         move.b    #123,$fffffa25.w            ;2457600/200/123 approx 100 Hz
  253.  
  254.         move.l    $110.w,save_timer_d            ;save timer-d vector
  255.         move.l    #timer_d,$110.w                ;own timer-d
  256.  
  257.         move.l    $70.w,save_vbl                ;save vbl vector
  258.         move.l    #vbl,$70.w                ;own vbl
  259.  
  260.         move.w    d0,sr                    ;ints back
  261.