home *** CD-ROM | disk | FTP | other *** search
/ Fujiology Archive / fujiology_archive_v1_0.iso / !FALCON / LINEOUT / DELTA.ZIP / DELTASRC.ZIP / DELTA.SRC / SCREEN.S < prev    next >
Text File  |  2002-12-07  |  4KB  |  212 lines

  1.     bra.w    start
  2.  
  3.     INCLUDE    FSCR2.I
  4.     TEXT
  5.  
  6. start:    move.l    4(sp),a5            * mshrink
  7.     move.l    $0c(a5),d0
  8.     add.l    $14(a5),d0
  9.     add.l    $1c(a5),d0
  10.     addi.l    #$1000,d0
  11.     move.l    a5,d1
  12.     add.l    d0,d1
  13.     andi.b    #%11111110,d1            * even address
  14.     move.l    d1,sp
  15.     move.l    d0,-(sp)
  16.      move.l    a5,-(sp)
  17.     clr.w    -(sp)
  18.     move.w    #$4a,-(sp)
  19.     trap    #1
  20.     lea    12(sp),sp
  21.  
  22. * mxalloc - Reserve stram ONLY for screens.
  23.     clr.w    -(sp)                * ST-RAM only!
  24.     move.l    #320*200*2*3+256,-(sp)        * size of screens..
  25.     move.w    #$44,-(sp)            * Code $44: Mxalloc()
  26.     trap    #1
  27.     addq    #8,sp
  28.     tst.l    d0                * Check if there is ST-RAM enough.
  29.     bgt.s    .ramok
  30. * Not enough ST-RAM free :(
  31.     clr.w    -(sp)
  32.     trap    #1
  33.  
  34. * Initialize screenaddresses..
  35. .ramok:    lea    scr,a0
  36.     move.l    #320*200*2,d1
  37.     addq.l    #3,d0                * / long even
  38.     andi.b    #%11111100,d0            * \ address..
  39.     move.l    d0,(a0)+
  40.     add.l    d1,d0
  41.     move.l    d0,(a0)+
  42.     add.l    d1,d0
  43.     move.l    d0,(a0)+
  44.  
  45. ; Set supervisormode and save old stackpointer..
  46.     clr.l    -(sp)
  47.     move.w    #32,-(sp)
  48.     trap    #1
  49.     addq    #6,sp
  50.     move.l    #ustk,sp            * Install own stack..
  51.  
  52. * Save old screenaddress..
  53.     move.w    #2,-(sp)
  54.     trap    #14
  55.     addq    #2,sp
  56.     move.l    d0,oldscr
  57.  
  58.     move.l    $70.w,oldvbl
  59.     move.l    #NEWVBL,$70.w
  60. ; Save falcon-pallette..
  61.     bsr    SAVE_FALCPAL
  62. * Save resolution..
  63.     bsr    SAVE_FV
  64.  
  65.  
  66. loop:    move.b    $FFFFFC02.w,keycode
  67.  
  68.     cmpi.b    #2,keycode
  69.     bne.s    .next1
  70.     bsr.w    changeTo1
  71. .next1:    cmpi.b    #3,keycode
  72.     bne.s    .next2
  73.     bsr.w    changeTo2
  74. .next2:
  75.  
  76.     cmpi.b    #$39,keycode
  77.     bne    loop
  78.  
  79.     move.l    oldscr,d0
  80.     move.l    d0,d1
  81.     lsr.w    #8,d0
  82.     move.l    d0,$ffff8200.w
  83.     move.b    d1,$ffff820d.w
  84.  
  85.     lea    save_fv,a0
  86.     bsr    CHANGE_FVFAST
  87.     bsr    RESTORE_FALCPAL
  88.  
  89.     move.l    oldvbl,$70.w
  90.  
  91.     clr.w    -(sp)
  92.     trap    #1
  93.  
  94.  
  95.  
  96. changeTo1:
  97.     lea    vga100_16bit_160_100,a0
  98.     suba.l    a1,a1
  99.     movea.l    scr,a2
  100.     bra.w    Screen.registerUpdate
  101.  
  102. changeTo2:
  103.     lea    vga100_8bit_320_200,a0
  104.     lea    pal,a1
  105.     movea.l    scr,a2
  106.     bra.w    Screen.registerUpdate
  107.  
  108. ; INPUT:
  109. ; a0: resolutionsetter routine (null: no change)
  110. ; a1: palette (null: no change)
  111. ; a2: screen
  112. ; OUTPUT:
  113. ; d0.w=0: done, -1: not done, still pending
  114. Screen.registerUpdate:
  115.     moveq    #-1,d0
  116.  
  117. ; If the previous update is still pending, just return.
  118.     tst.w    Screen.updateRequested
  119.     bne.s    .end
  120.     
  121.     move.l    a0,Screen.resRout
  122.     move.l    a1,Screen.palAdr
  123.     move.l    a2,Screen.adr
  124.     st    Screen.updateRequested
  125.     clr.l    d0
  126.  
  127. .end:    rts
  128.  
  129. ; This should be called by the vbl. Uses datastructures set by user to
  130. ; update screenbase, resolution and palette.
  131. Screen.update:
  132.     tst.w    Screen.updateRequested
  133.     beq.s    .end
  134.  
  135. ; Set resolution, if it's not a null.
  136.     move.l    Screen.resRout,d0
  137.     beq.s    .res_done
  138.     movea.l    d0,a0
  139.     jsr    (a0)
  140. .res_done:
  141.  
  142. ; Set screenbase.
  143.     move.l    scr,d0
  144.     move.l    d0,d1
  145.     lsr.w    #8,d0
  146.     move.l    d0,$FFFF8200.w
  147.     move.b    d1,$FFFF820D.w
  148.  
  149. ; Set palette, if it's not a null.
  150.     move.l    Screen.palAdr,d0
  151.     beq.s    .pal_done
  152.     movea.l    d0,a1
  153.     lea    $FFFF9800.w,a0
  154.     moveq    #128-1,d7
  155. .loop:    move.l    (a1)+,(a0)+
  156.     move.l    (a1)+,(a0)+
  157.     dbf    d7,.loop
  158. .pal_done:
  159.  
  160.     clr.l    Screen.resRout            ; Indicate no new res anymore.
  161.     clr.l    Screen.palAdr            ; Indicate no pal anymore.
  162.  
  163. .end:    clr.w    Screen.updateRequested
  164.     rts
  165.  
  166. ******** INTERRUPT ROUTINE CODE ********
  167.  
  168. NEWVBL:    addq.l    #1,$0466.w
  169.     movem.l    d0-a6,-(sp)
  170.     bsr.w    Screen.update
  171.     move.l    vbl_gfx(pc),a0
  172.     jsr    (a0)
  173.     movem.l    (sp)+,d0-a6
  174.     rte
  175.  
  176. vbl_gfx:DC.L    rts
  177.  
  178. rts:    rts
  179.  
  180.  
  181.  
  182.     data
  183.  
  184. pal:    dc.l    $00000000
  185.     dc.l    $FFFF00FF
  186.     dc.l    $FF000000
  187.     dc.l    $000000FF
  188.     rept    252
  189.     dc.l    0
  190.     endr
  191.  
  192.     bss
  193.  
  194. Screen.updateRequested:
  195.     ds.w    1
  196. Screen.palAdr:
  197.     ds.l    1
  198. Screen.resRout:
  199.     ds.l    1
  200. Screen.adr:
  201.     ds.l    1
  202.  
  203. oldscr:    ds.l    1
  204. oldvbl:    ds.l    1
  205. scr:    ds.l    3
  206. keycode:ds.w    1
  207.  
  208.     ds.l    256
  209. ustk:
  210.  
  211.  
  212.