home *** CD-ROM | disk | FTP | other *** search
/ Fujiology Archive / fujiology_archive_v1_0.iso / !FALCON / LINEOUT / DELTA.ZIP / DELTASRC.ZIP / DELTA.SRC / FSCR2.I < prev    next >
Text File  |  2003-01-04  |  19KB  |  922 lines

  1. ; Falcon screenroutines:
  2. ;
  3. ; + resolutionswitchers
  4. ; + screenclearers
  5. ; + screencopiers
  6. ; + pallettesetters/savers
  7. ; + pixel/linedoublers
  8.  
  9. ; VIDEO-modes available
  10.  
  11. ; VGA (60 & 100Hz)  RGB (50)
  12. ; 320*200 8bit      320*200 8bit
  13. ; 640*400 8bit      640*400 8bit
  14.  
  15. ; 160*100 16bit     320*100 16bit
  16. ; 160*200 16bit
  17. ; 320*100 16bit
  18. ; 320*200 16bit     320*200 16bit
  19.  
  20. ; Notes:
  21. ; All RGB modes are all in "cinemascope" mode for overscan.
  22.  
  23. ; --------------------------------------------------------------
  24. ; ------------- VGA 8bit 60Hz ----------------------------------
  25. ; --------------------------------------------------------------
  26.  
  27. vga60_8bit_320_200:
  28.     move.l    #$c6008D,$ffff8282.w
  29.     move.l    #$15029a,$ffff8286.w
  30.     move.l    #$7b0097,$ffff828a.w
  31.     move.l    #$041903ad,$ffff82a2.w        ;#$41903ff,$ffff82a2.w
  32.     move.l    #$008d008D,$ffff82a6.w        ;#$3f008D,$ffff82a6.w
  33.     move.l    #$03aD0415,$ffff82aa.w        ;#$3aD0415,$ffff82aa.w
  34.     move.w    #$200,$ffff820a.w
  35.     move.w    #$186,$ffff82c0.w
  36.     clr.w    $ffff8266.w
  37.     move.w    #$10,$ffff8266.w
  38.     move.w    #$5,$ffff82c2.w
  39.     move.w    #$a0,$ffff8210.w
  40.     rts
  41.  
  42. vga60_8bit_640_400:
  43.     move.l    #$c6008D,$ffff8282.w
  44.     move.l    #$1502ab,$ffff8286.w
  45.     move.l    #$840097,$ffff828a.w
  46.     move.l    #$41903ff,$ffff82a2.w
  47.     move.l    #$3f008f,$ffff82a6.w
  48.     move.l    #$3af0415,$ffff82aa.w
  49.     move.w    #$200,$ffff820a.w
  50.     move.w    #$186,$ffff82c0.w
  51.     clr.w    $ffff8266.w
  52.     move.w    #$10,$ffff8266.w
  53.     move.w    #$8,$ffff82c2.w
  54.     move.w    #$140,$ffff8210.w
  55.     rts
  56.  
  57. ; --------------------------------------------------------------
  58. ; ------------- VGA 8bit 100Hz ---------------------------------
  59. ; --------------------------------------------------------------
  60.  
  61. vga100_8bit_320_200:
  62.     move.l    #$c6008f,$ffff8282.w
  63.     move.l    #$18029c,$ffff8286.w
  64.     move.l    #$7D0098,$ffff828a.w
  65.     move.l    #$02750215,$ffff82a2.w    ;#$275025b,$ffff82a2.w
  66.     move.l    #$00850085,$ffff82a6.w    ;#$410085,$ffff82a6.w
  67.     move.l    #$02150271,$ffff82aa.w    ;#$2150271,$ffff82aa.w
  68.     move.w    #$200,$ffff820a.w
  69.     move.w    #$186,$ffff82c0.w
  70.     clr.w    $ffff8266.w
  71.     move.w    #$10,$ffff8266.w
  72.     move.w    #$4,$ffff82c2.w
  73.     move.w    #$a0,$ffff8210.w
  74.     rts
  75.  
  76. vga100_8bit_640_400:
  77.     move.l    #$c6008f,$ffff8282.w
  78.     move.l    #$1802aD,$ffff8286.w
  79.     move.l    #$860098,$ffff828a.w
  80.     move.l    #$274025b,$ffff82a2.w
  81.     move.l    #$410084,$ffff82a6.w
  82.     move.l    #$2140271,$ffff82aa.w
  83.     move.w    #$200,$ffff820a.w
  84.     move.w    #$186,$ffff82c0.w
  85.     clr.w    $ffff8266.w
  86.     move.w    #$10,$ffff8266.w
  87.     move.w    #$a,$ffff82c2.w
  88.     move.w    #$140,$ffff8210.w
  89.     rts
  90.  
  91. ; --------------------------------------------------------------
  92. ; ------------- VGA 16bit 60Hz ---------------------------------
  93. ; --------------------------------------------------------------
  94.  
  95. vga60_16bit_160_200:
  96.     move.l    #$620046,$ffff8282.w
  97.     move.l    #$a024D,$ffff8286.w
  98.     move.l    #$46004b,$ffff828a.w
  99.     move.l    #$41903ff,$ffff82a2.w
  100.     move.l    #$3f008D,$ffff82a6.w
  101.     move.l    #$3aD0415,$ffff82aa.w
  102.     move.w    #$200,$ffff820a.w
  103.     move.w    #$186,$ffff82c0.w
  104.     clr.w    $ffff8266.w
  105.     move.w    #$100,$ffff8266.w
  106.     move.w    #$1,$ffff82c2.w
  107.     move.w    #$a0,$ffff8210.w
  108.     rts
  109.  
  110. vga60_16bit_320_200:
  111.     move.l    #$c6008D,$ffff8282.w
  112.     move.l    #$1502ac,$ffff8286.w
  113.     move.l    #$8D0097,$ffff828a.w
  114.     move.l    #$041903ad,$ffff82a2.w        ;#$41903ff,$ffff82a2.w
  115.     move.l    #$008d008d,$ffff82a6.w        ;#$3f008D,$ffff82a6.w
  116.     move.l    #$03aD0415,$ffff82aa.w        ;#$3aD0415,$ffff82aa.w
  117.     move.w    #$200,$ffff820a.w
  118.     move.w    #$186,$ffff82c0.w
  119.     clr.w    $ffff8266.w
  120.     move.w    #$100,$ffff8266.w
  121.     move.w    #$5,$ffff82c2.w
  122.     move.w    #$140,$ffff8210.w
  123.     rts
  124.  
  125. ; --------------------------------------------------------------
  126. ; ------------- VGA 16bit 100Hz --------------------------------
  127. ; --------------------------------------------------------------
  128.  
  129. vga100_16bit_160_100:
  130.     move.l    #$620047,$ffff8282.w
  131.     move.l    #$c024e,$ffff8286.w
  132.     move.l    #$47004c,$ffff828a.w
  133.     move.l    #$275025b,$ffff82a2.w
  134.     move.l    #$410085,$ffff82a6.w
  135.     move.l    #$2150271,$ffff82aa.w
  136.     move.w    #$200,$ffff820a.w
  137.     move.w    #$186,$ffff82c0.w
  138.     clr.w    $ffff8266.w
  139.     move.w    #$100,$ffff8266.w
  140.     move.w    #$1,$ffff82c2.w
  141.     move.w    #$a0,$ffff8210.w
  142.     rts
  143.  
  144. vga100_16bit_320_100:
  145.     move.l  #$c6008f,$ffff8282.w
  146.     move.l  #$1802ae,$ffff8286.w
  147.     move.l  #$8f0098,$ffff828a.w
  148.     move.l  #$02750215,$ffff82a2.w    ;#$275025b,$ffff82a2.w
  149.     move.l  #$00850085,$ffff82a6.w    ;#$410085,$ffff82a6.w
  150.     move.l    #$02150271,$ffff82aa.w     ;#$2150271,$ffff82aa.w
  151.     move.w    #$200,$ffff820a.w
  152.     move.w    #$186,$ffff82c0.w
  153.     clr.w    $ffff8266.w
  154.     move.w    #$100,$ffff8266.w
  155.     move.w    #$5,$ffff82c2.w
  156.     move.w    #$140,$ffff8210.w
  157.     rts
  158.  
  159. vga100_16bit_320_200:
  160.     move.l    #$c6008f,$ffff8282.w
  161.     move.l    #$1802ae,$ffff8286.w
  162.     move.l    #$8f0098,$ffff828a.w
  163.     move.l    #$02750215,$ffff82a2.w    ;#$275025b,$ffff82a2.w
  164.     move.l    #$00850085,$ffff82a6.w    ;#$410085,$ffff82a6.w
  165.     move.l    #$02150271,$ffff82aa.w    ;#$2150271,$ffff82aa.w
  166.     move.w    #$200,$ffff820a.w
  167.     move.w    #$186,$ffff82c0.w
  168.     clr.w    $ffff8266.w
  169.     move.w    #$100,$ffff8266.w
  170.     move.w    #$4,$ffff82c2.w
  171.     move.w    #$140,$ffff8210.w
  172.     rts
  173.  
  174. ; --------------------------------------------------------------
  175. ; ------------- RGB 8bit 50Hz ----------------------------------
  176. ; --------------------------------------------------------------
  177.  
  178. rgb50_8bit_320_200:
  179.     move.l    #$c700a0,$ffff8282.w
  180.     move.l    #$1f02ba,$ffff8286.w
  181.     move.l    #$8900ab,$ffff828a.w
  182.     move.l    #$2710265,$ffff82a2.w
  183.     move.l    #$2f0081,$ffff82a6.w
  184.     move.l    #$211026b,$ffff82aa.w
  185.     move.w    #$200,$ffff820a.w
  186.     move.w    #$185,$ffff82c0.w
  187.     clr.w    $ffff8266.w
  188.     move.w    #$10,$ffff8266.w
  189.     move.w    #$0,$ffff82c2.w
  190.     move.w    #$a0,$ffff8210.w
  191.     rts
  192.  
  193. rgb50_8bit_640_400:
  194.     move.l    #$1900141,$ffff8282.w
  195.     move.l    #$3e0005,$ffff8286.w
  196.     move.l    #$1240156,$ffff828a.w
  197.     move.l    #$2700265,$ffff82a2.w
  198.     move.l    #$2f0080,$ffff82a6.w
  199.     move.l    #$210026b,$ffff82aa.w
  200.     move.w    #$200,$ffff820a.w
  201.     move.w    #$185,$ffff82c0.w
  202.     clr.w    $ffff8266.w
  203.     move.w    #$10,$ffff8266.w
  204.     move.w    #$6,$ffff82c2.w
  205.     move.w    #$140,$ffff8210.w
  206.     rts
  207.  
  208. ; --------------------------------------------------------------
  209. ; ------------- RGB 16bit 50Hz ---------------------------------
  210. ; --------------------------------------------------------------
  211.  
  212. rgb50_16bit_320_100:
  213.     move.l    #$c700a0,$ffff8282.w
  214.     move.l    #$1f0003,$ffff8286.w
  215.     move.l    #$9b00ab,$ffff828a.w
  216.     move.l    #$2710265,$ffff82a2.w
  217.     move.l    #$2f0081,$ffff82a6.w
  218.     move.l    #$211026b,$ffff82aa.w
  219.     move.w    #$200,$ffff820a.w
  220.     move.w    #$185,$ffff82c0.w
  221.     clr.w     $ffff8266.w
  222.     move.w    #$100,$ffff8266.w
  223.     move.w    #$1,$ffff82c2.w
  224.     move.w    #$140,$ffff8210.w
  225.     rts
  226.  
  227. rgb50_16bit_320_200:
  228.     move.l    #$c700a0,$ffff8282.w
  229.     move.l    #$1f0003,$ffff8286.w
  230.     move.l    #$9b00ab,$ffff828a.w
  231.     move.l    #$2710265,$ffff82a2.w
  232.     move.l    #$2f0081,$ffff82a6.w
  233.     move.l    #$211026b,$ffff82aa.w
  234.     move.w    #$200,$ffff820a.w
  235.     move.w    #$185,$ffff82c0.w
  236.     clr.w     $ffff8266.w
  237.     move.w    #$100,$ffff8266.w
  238.     move.w    #$0,$ffff82c2.w
  239.     move.w    #$140,$ffff8210.w
  240.     rts
  241.  
  242.  
  243. ;******* Resolution saving and restoring routines
  244.  
  245. ; Saves the current falcon resolution to an internal buffer.
  246. SAVE_FV:
  247.     lea    save_fv,a0
  248.     move.l    $ffff8282.w,(a0)+        * h-regs
  249.     move.l    $ffff8286.w,(a0)+        *
  250.     move.l    $ffff828a.w,(a0)+        *
  251.     move.l    $ffff82a2.w,(a0)+        * v-regs
  252.     move.l    $ffff82a6.w,(a0)+        *
  253.     move.l    $ffff82aa.w,(a0)+        *
  254.     move.w    $ffff82c0.w,(a0)+        * vco
  255.     move.w    $ffff82c2.w,(a0)+        * c_s
  256.     move.l    $ffff820e.w,(a0)+        * offset
  257.     move.w    $ffff820a.w,(a0)+        * sync
  258.     move.b    $ffff8256.w,(a0)+        * p_o
  259.     clr.b    (a0)                * test of st(e) or falcon mode
  260.     cmp.w    #$b0,$ffff8282.w        * hht kleiner $b0?
  261.     sle     (a0)+                * flag setzen
  262.     move.w    $ffff8266.w,(a0)+        * f_s
  263.     move.w    $ffff8260.w,(a0)+        * st_s
  264.     rts
  265.  
  266. * Changes screenresolution the fast way..
  267. * Note: Takes one vbl, necessary to avoid monochrome sync errors.
  268. * INPUT: a0: address of fv2-buffer
  269. CHANGE_FVFAST:
  270.     clr.w    $ffff8266.w            * falcon-shift clear
  271.     move.l    (a0)+,$ffff8282.w    0    * h-regs
  272.     move.l    (a0)+,$ffff8286.w    4    *
  273.     move.l    (a0)+,$ffff828a.w     8    *
  274.     move.l    (a0)+,$ffff82a2.w    12    * v-regs
  275.     move.l    (a0)+,$ffff82a6.w     16    *
  276.     move.l    (a0)+,$ffff82aa.w     20    *
  277.     move.w    (a0)+,$ffff82c0.w    24    * vco
  278.     move.w    (a0)+,$ffff82c2.w    26    * c_s
  279.     move.l    (a0)+,$ffff820e.w    28    * offset
  280.     move.w    (a0)+,$ffff820a.w    32    * sync
  281.     move.b    (a0)+,$ffff8256.w    34    * p_o
  282.     tst.b    (a0)+            35    * st(e) compatible mode?
  283.     bne.s    .ok            36
  284.     move.w    $468.w,d0            * / wait for vbl
  285. .wait468:                    * | to avoid
  286.     cmp.w    $468.w,d0            * | falcon monomode
  287.     beq.s    .wait468            * \ syncerrors.
  288.     move.w    (a0),$ffff8266.w    38    * falcon-shift
  289.     bra.s    .video_restored
  290. .ok:    move.w    2(a0),$ffff8260.w    40    * st-shift
  291.     move.w    -10(a0),$ffff82c2.w        * c_s
  292.     move.l    -8(a0),$ffff820e.w        * offset        
  293. .video_restored:
  294.     rts
  295.  
  296. ******** Falcon bitplane mode palette routines
  297.  
  298. SAVE_FALCPAL:
  299.     move.w    $468.w,d0
  300. .waitvbl:
  301.     cmp.w    $468.w,d0
  302.     beq.s    .waitvbl
  303.     lea    falcsave_pal,a0
  304.     lea    $ffff9800.w,a1
  305.     moveq    #128-1,d7
  306. .loop:    move.l    (a1)+,(a0)+
  307.     move.l    (a1)+,(a0)+
  308.     dbra    d7,.loop
  309.     rts
  310.  
  311. RESTORE_FALCPAL:
  312.     move.w    $468.w,d0
  313. .waitvbl:
  314.     cmp.w    $468.w,d0
  315.     beq.s    .waitvbl
  316.     lea    falcsave_pal,a1
  317.     lea    $ffff9800.w,a0
  318.     moveq    #128-1,d7
  319. .loop:    move.l    (a1)+,(a0)+
  320.     move.l    (a1)+,(a0)+
  321.     dbra    d7,.loop
  322.     rts
  323.  
  324. ; INPUT:
  325. ; a1: palette
  326. SET_FALCPAL:
  327.     lea    $ffff9800.w,a0
  328.     moveq    #128-1,d7
  329. .loop:    move.l    (a1)+,(a0)+
  330.     move.l    (a1)+,(a0)+
  331.     dbra    d7,.loop
  332.     rts
  333.  
  334. ******** Screenclearers and copiers.
  335.  
  336. * Clears a 320*200 highcolor screen.
  337. * INPUT:
  338. * a0: screenaddress
  339. CLEAR_320200TSCR:
  340.     moveq    #0,d0
  341.     move.l    d0,d1
  342.     move.l    d0,d2
  343.     move.l    d1,d3
  344.     move.l    d2,d4
  345.     move.l    d3,d5
  346.     move.l    d4,d6
  347.     moveq    #123-1,d7
  348.     move.l    d0,a1
  349.     move.l    d1,a2
  350.     move.l    d2,a3
  351.     move.l    d3,a4
  352.     move.l    d4,a5
  353.     move.l    d5,a6
  354.     adda.l    #320*200*2,a0
  355. .loop:
  356.     REPT    20
  357.     movem.l    d0-d6/a1-a6,-(a0)
  358.     ENDR
  359.     dbra    d7,.loop
  360.     movem.l    d0-d6/a1-a6,-(a0)
  361.     movem.l    d0-d6,-(a0)
  362.     rts
  363.  
  364. * Clears a 320*100 highcolor screen.
  365. * INPUT:
  366. * a0: screenaddress
  367. CLEAR_320100TSCR:
  368.     moveq    #0,d0
  369.     move.l    d0,d1
  370.     move.l    d0,d2
  371.     move.l    d1,d3
  372.     move.l    d2,d4
  373.     move.l    d3,d5
  374.     move.l    d4,d6
  375.     moveq    #100-1,d7
  376.     move.l    d0,a1
  377.     move.l    d1,a2
  378.     move.l    d2,a3
  379.     move.l    d3,a4
  380.     move.l    d4,a5
  381.     move.l    d5,a6
  382.     adda.l    #320*100*2,a0
  383. .loop:
  384.     REPT    12
  385.     movem.l    d0-d6/a1-a6,-(a0)
  386.     ENDR
  387.     movem.l    d0-d3,-(a0)
  388.     dbra    d7,.loop
  389.     rts
  390.  
  391. * Clears a 320*200 8bpp screen.
  392. * INPUT:
  393. * a0: screenaddress
  394. CLEAR_3202008SCR:
  395.     moveq    #0,d0
  396.     move.l    d0,d1
  397.     move.l    d0,d2
  398.     move.l    d1,d3
  399.     move.l    d2,d4
  400.     move.l    d3,d5
  401.     move.l    d4,d6
  402.     moveq    #100-1,d7
  403.     move.l    d0,a1
  404.     move.l    d1,a2
  405.     move.l    d2,a3
  406.     move.l    d3,a4
  407.     move.l    d4,a5
  408.     move.l    d5,a6
  409.     adda.l    #320*100*2,a0
  410. .loop:
  411.     REPT    12
  412.     movem.l    d0-d6/a1-a6,-(a0)
  413.     ENDR
  414.     movem.l    d0-d3,-(a0)
  415.     dbra    d7,.loop
  416.     rts
  417.  
  418. * Copies a 320*200 8bpp screen.
  419. * INPUT:
  420. * a0: destination
  421. * a1: source
  422. COPY_PIC3202008:
  423.     moveq    #100-1,d7
  424. .loop:    movem.l    (a1)+,d0-d6/a2-a6
  425.     movem.l    d0-d6/a2-a6,(a0)
  426.     movem.l    (a1)+,d0-d6/a2-a6
  427.     movem.l    d0-d6/a2-a6,48(a0)
  428.     movem.l    (a1)+,d0-d6/a2-a6
  429.     movem.l    d0-d6/a2-a6,96(a0)
  430.     movem.l    (a1)+,d0-d6/a2-a6
  431.     movem.l    d0-d6/a2-a6,144(a0)
  432.     movem.l    (a1)+,d0-d6/a2-a6
  433.     movem.l    d0-d6/a2-a6,192(a0)
  434.     movem.l    (a1)+,d0-d6/a2-a6
  435.     movem.l    d0-d6/a2-a6,240(a0)
  436.     movem.l    (a1)+,d0-d6/a2-a6
  437.     movem.l    d0-d6/a2-a6,288(a0)
  438.     movem.l    (a1)+,d0-d6/a2-a6
  439.     movem.l    d0-d6/a2-a6,336(a0)
  440.     movem.l    (a1)+,d0-d6/a2-a6
  441.     movem.l    d0-d6/a2-a6,384(a0)
  442.     movem.l    (a1)+,d0-d6/a2-a6
  443.     movem.l    d0-d6/a2-a6,432(a0)
  444.     movem.l    (a1)+,d0-d6/a2-a6
  445.     movem.l    d0-d6/a2-a6,480(a0)
  446.     movem.l    (a1)+,d0-d6/a2-a6
  447.     movem.l    d0-d6/a2-a6,528(a0)
  448.     movem.l    (a1)+,d0-d6/a2-a6
  449.     movem.l    d0-d6/a2-a6,576(a0)
  450.     movem.l    (a1)+,d0-d3
  451.     movem.l    d0-d3,624(a0)
  452.     lea    640(a0),a0
  453.     dbra    d7,.loop
  454.     rts
  455.  
  456. * Copies a 320*200 8bpp screen.
  457. * INPUT:
  458. * a0: destination
  459. * a1: source
  460. COPY_PIC32020016:
  461.     move.w    #200-1,d7
  462. .loop:    movem.l    (a1)+,d0-d6/a2-a6
  463.     movem.l    d0-d6/a2-a6,(a0)
  464.     movem.l    (a1)+,d0-d6/a2-a6
  465.     movem.l    d0-d6/a2-a6,48(a0)
  466.     movem.l    (a1)+,d0-d6/a2-a6
  467.     movem.l    d0-d6/a2-a6,96(a0)
  468.     movem.l    (a1)+,d0-d6/a2-a6
  469.     movem.l    d0-d6/a2-a6,144(a0)
  470.     movem.l    (a1)+,d0-d6/a2-a6
  471.     movem.l    d0-d6/a2-a6,192(a0)
  472.     movem.l    (a1)+,d0-d6/a2-a6
  473.     movem.l    d0-d6/a2-a6,240(a0)
  474.     movem.l    (a1)+,d0-d6/a2-a6
  475.     movem.l    d0-d6/a2-a6,288(a0)
  476.     movem.l    (a1)+,d0-d6/a2-a6
  477.     movem.l    d0-d6/a2-a6,336(a0)
  478.     movem.l    (a1)+,d0-d6/a2-a6
  479.     movem.l    d0-d6/a2-a6,384(a0)
  480.     movem.l    (a1)+,d0-d6/a2-a6
  481.     movem.l    d0-d6/a2-a6,432(a0)
  482.     movem.l    (a1)+,d0-d6/a2-a6
  483.     movem.l    d0-d6/a2-a6,480(a0)
  484.     movem.l    (a1)+,d0-d6/a2-a6
  485.     movem.l    d0-d6/a2-a6,528(a0)
  486.     movem.l    (a1)+,d0-d6/a2-a6
  487.     movem.l    d0-d6/a2-a6,576(a0)
  488.     movem.l    (a1)+,d0-d3
  489.     movem.l    d0-d3,624(a0)
  490.     lea    640(a0),a0
  491.     dbra    d7,.loop
  492.     rts
  493.  
  494. ******** Highcolor pixeldoubling routines
  495.  
  496. * Doubles highcolor bitmap in vertical direction.
  497. * (1*1) -> (1*2)
  498. * INPUT:
  499. * d0.w: width of buffer
  500. * d1.w: height of buffer
  501. * a0: destination buffer
  502. * a1: source buffer
  503. DOUBLE_BUFFERV:
  504.     subq.w    #1,d1
  505.     bmi.s    .end
  506.     move.w    d0,d2
  507.     ble.s    .end
  508.     subq.w    #1,d2
  509.     ext.l    d0
  510.     add.l    d0,d0
  511.     lea    (a0,d0.l),a2
  512.  
  513. .yloop:    move.w    d2,d7
  514.  
  515. .xloop:    move.w    (a1),(a0)+
  516.     move.w    (a1)+,(a2)+
  517.     dbra    d7,.xloop
  518.  
  519.     adda.l    d0,a0
  520.     adda.l    d0,a2
  521.     dbra    d1,.yloop
  522.  
  523. .end:    rts
  524.  
  525. * Doubles highcolor bitmap in horizontal direction.
  526. * (1*1) -> (2*1)
  527. * INPUT:
  528. * d0.w: width of buffer
  529. * d1.w: height of buffer
  530. * a0: destination buffer
  531. * a1: source buffer
  532. DOUBLE_BUFFERH:
  533.     subq.w    #1,d1
  534.     bmi.s    .end
  535.     move.w    d0,d2
  536.     ble.s    .end
  537.     subq.w    #1,d2
  538.  
  539. .yloop:    move.w    d2,d7
  540.  
  541. .xloop:    move.w    (a1),(a0)+
  542.     move.w    (a1)+,(a0)+
  543.     dbra    d7,.xloop
  544.  
  545.     dbra    d1,.yloop
  546.  
  547. .end:    rts
  548.  
  549. * Doubles highcolor bitmap in horizontal and vertical direction.
  550. * (1*1) -> (2*2)
  551. * INPUT:
  552. * d0.w: width of buffer
  553. * d1.w: height of buffer
  554. * a0: destination buffer
  555. * a1: source buffer
  556. DOUBLE_BUFFERHV:
  557.     subq.w    #1,d1
  558.     bmi.s    .end
  559.     move.w    d0,d2
  560.     ble.s    .end
  561.     subq.w    #1,d2
  562.     ext.l    d0
  563.     lsl.l    #2,d0
  564.     lea    (a0,d0.l),a2
  565.  
  566. .yloop:    move.w    d2,d7
  567.  
  568. .xloop:    move.w    (a1)+,d0
  569.     move.w    d0,(a0)+
  570.     move.w    d0,(a0)+
  571.     move.w    d0,(a2)+
  572.     move.w    d0,(a2)+
  573.     dbra    d7,.xloop
  574.  
  575.     adda.l    d0,a0
  576.     adda.l    d0,a2
  577.     dbra    d1,.yloop
  578.  
  579. .end:    rts
  580.  
  581. ; Bitmap conversion routines..
  582.  
  583. ; INPUT:
  584. ; d7.l=#pixels
  585. ; a0: dst hc pixels (%rrrrrggggggbbbbb)
  586. ; a1: src tc pixels ($rrggbb)
  587. convertTc2Hc:
  588.     subq.l    #1,d7
  589.     bmi.s    .end
  590.     swap    d7
  591.     move.w    #$F800,d3
  592.     move.w    #$07E0,d4
  593.  
  594. .outerloop:
  595.     swap    d7
  596.  
  597. .innerloop:
  598.     clr.l    d1
  599.     move.b    (a1)+,d0
  600.     move.b    (a1)+,d1
  601.     move.b    (a1)+,d2
  602.     lsl.w    #8,d0
  603.     lsl.w    #3,d1
  604.     lsr.b    #3,d2
  605.     and.w    d3,d0
  606.     and.w    d4,d1
  607.     or.w    d1,d0
  608.     or.b    d2,d0
  609.     move.w    d0,(a0)+
  610.     dbf    d7,.innerloop
  611.  
  612.     swap    d7
  613.     dbf    d7,.outerloop
  614.  
  615. .end:    rts
  616.  
  617. ; Converts an interleaved bitplane map to highcolor.
  618. ; INPUT:
  619. ; d0.w=width (in 16pixel planes!!)
  620. ; d1.w=height
  621. ; d2.w=#bitplanes
  622. ; a0: dst
  623. ; a1: src
  624. ; a2: pal (highcolor words, 2^#bitplanes entries)
  625. Bitmap.convIBplToHC:
  626.     subq.w    #1,d1
  627.     bmi.s    .end
  628.     move.w    d0,d7                ; d7.w=width
  629.     beq.s    .end
  630.     subq.w    #1,d7
  631.     subq.w    #1,d2
  632.     movea.w    d2,a6                ; a6=#bitplanes-1
  633.  
  634. .yloop:    move.w    d7,d0
  635.  
  636. .xloop:    moveq    #16-1,d6
  637.  
  638. .pixel_loop:
  639.     move.l    a6,d5                ; d5.w=#bitplanes-1
  640.     lea    2(a1,d5.w*2),a3            ; a3: next chunk
  641.     clr.l    d3                ; d3.b=pixel
  642.  
  643. .plane_loop:
  644.     add.b    d3,d3                ; d3.b=pixel=oldpixel<<1
  645.     move.w    -(a3),d2
  646.     lsr.w    d6,d2
  647.     andi.b    #1,d2                ; d2.w=masked bit
  648.     or.b    d2,d3                ; d3.b=pixel|masked bit
  649.     dbf    d5,.plane_loop
  650.  
  651.     move.w    (a2,d3.l*2),(a0)+        ; Store pixel.
  652.     dbf    d6,.pixel_loop
  653.  
  654.     lea    2(a1,a6.l*2),a1            ; a1: next chunk
  655.     dbf    d0,.xloop
  656.  
  657.     dbf    d1,.yloop
  658.  
  659. .end:    rts
  660.  
  661. ; INPUT:
  662. ; a0: dst truecolor palette (24b)
  663. ; a1: colorflow instruction table 
  664. Pal.makeGradientTc:
  665.     move.w    (a1)+,d7
  666.     moveq    #0,d0
  667.     move.w    (a1)+,d0
  668.     moveq    #1,d6
  669.     lsl.w    d0,d6
  670.     move.w    d7,d5
  671.     mulu.w    d6,d5
  672.     subq.w    #1,d6
  673.     move.w    d6,d5
  674.     subq.w    #1,d7
  675.  
  676. .biglop    move.l    (a1)+,d1
  677.     move.l    (a1),d2
  678.     moveq.l    #0,d3
  679.     move.l    d3,d4
  680.     move.b    d1,d3
  681.     move.b    d2,d4
  682.     swap    d3
  683.     swap    d4
  684.     sub.l    d3,d4
  685.     asr.l    d0,d4
  686.     move.l    a0,a6
  687. .lop1    swap    d3
  688.     move.w    d3,2(a0)
  689.     addq.l    #4,a0
  690.     swap    d3
  691.     add.l    d4,d3
  692.     dbra    d6,.lop1
  693.     move.w    d5,d6
  694.     move.l    a6,a0
  695.     moveq    #0,d3
  696.     move.l    d3,d4
  697.     swap    d1
  698.     swap    d2
  699.     move.b    d1,d3
  700.     move.b    d2,d4
  701.     swap    d3
  702.     swap    d4
  703.     sub.l    d3,d4
  704.     asr.l    d0,d4
  705. .lop2    swap    d3
  706.     move.b    d3,1(a0)
  707.     addq.l    #4,a0
  708.     swap    d3
  709.     add.l    d4,d3
  710.     dbra    d6,.lop2
  711.     move.l    a6,a0
  712.     move.w    d5,d6
  713.     moveq.l    #0,d3
  714.     move.l    d3,d4
  715.     swap    d1
  716.     swap    d2
  717.     rol.l    #8,d1
  718.     rol.l    #8,d2
  719.     move.b    d1,d3
  720.     move.b    d2,d4
  721.     swap    d3
  722.     swap    d4
  723.     sub.l    d3,d4
  724.     asr.l    d0,d4
  725. .lop3    swap    d3
  726.     move.b    d3,(a0)
  727.     addq.l    #4,a0
  728.     swap    d3
  729.     add.l    d4,d3
  730.     dbra    d6,.lop3
  731.     move.w    d5,d6
  732.     dbra    d7,.biglop
  733.     rts
  734.  
  735. ; Generates a highcolor pallette from a (truecolor) flowtable.
  736. ; Note: doubles hc words
  737. ; INPUT:
  738. ; a0: dst highcolor buffer
  739. ; a1: instruction table 
  740. Pal.makeGradient2Hc:
  741.     move.l    a1,-(sp)
  742.     move.l    a0,-(sp)
  743.     bsr.s    Pal.makeGradientHc
  744.     movea.l    (sp)+,a2
  745.     movea.l    (sp)+,a1
  746.  
  747.     move.w    (a1)+,d7
  748.     moveq    #0,d0
  749.     move.w    (a1)+,d0
  750.     moveq    #1,d6
  751.     lsl.w    d0,d6
  752.     move.w    d7,d5
  753.     mulu.w    d6,d5
  754.     lea    (a2,d5.l*4),a2
  755.     subq.w    #1,d5
  756.  
  757. ; a0: src end, a2: dst end
  758. .double_loop:
  759.     move.w    -(a0),-(a2)
  760.     move.w    (a0),-(a2)
  761.     dbf    d5,.double_loop
  762.     
  763.     rts
  764.  
  765. ; Generates a highcolor pallette from a (truecolor) flowtable.
  766. ; INPUT:
  767. ; a0: dst highcolor buffer
  768. ; a1: instruction table 
  769. Pal.makeGradientHc:
  770.     move.w    (a1)+,d7
  771.     moveq    #0,d0
  772.     move.w    (a1)+,d0
  773.     moveq    #1,d6
  774.     lsl.w    d0,d6
  775.     move.w    d7,d5
  776.     mulu.w    d6,d5
  777.     subq.w    #1,d6
  778.     movea.w    d6,a5
  779.     subq.w    #1,d7
  780.  
  781. .loop:    move.l    (a1)+,d1
  782.     move.l    (a1),d2
  783.     move.l    d1,d3
  784.     move.l    d2,d4
  785.     lsr.l    #8,d3
  786.     lsr.l    #8,d4
  787.     clr.w    d3
  788.     clr.w    d4
  789.     sub.l    d3,d4
  790.     asr.l    d0,d4
  791.     move.l    a0,a6
  792.  
  793. .red_loop:
  794.     swap    d3
  795.     move.w    d3,d5
  796.     lsl.w    #8,d5
  797.     andi.w    #$f800,d5
  798.     move.w    d5,(a0)+
  799.     swap    d3
  800.     add.l    d4,d3
  801.     dbf    d6,.red_loop
  802.  
  803.     move.w    a5,d6
  804.     move.l    a6,a0
  805.     move.l    d1,d3
  806.     move.l    d2,d4
  807.     andi.l    #$00ff0000,d3
  808.     andi.l    #$00ff0000,d4
  809.     sub.l    d3,d4
  810.     asr.l    d0,d4
  811.  
  812. .green_loop:
  813.     swap    d3
  814.     move.w    d3,d5
  815.     lsl.w    #3,d5
  816.     andi.w    #$07e0,d5
  817.     or.w    d5,(a0)+
  818.     swap    d3
  819.     add.l    d4,d3
  820.     dbf    d6,.green_loop
  821.  
  822.     move.l    a6,a0
  823.     move.w    a5,d6
  824.     moveq    #0,d3
  825.     moveq    #0,d4
  826.     move.b    d1,d3
  827.     move.b    d2,d4
  828.     swap    d3
  829.     swap    d4
  830.     sub.l    d3,d4
  831.     asr.l    d0,d4
  832.  
  833. .blue_loop:
  834.     swap    d3
  835.     move.w    d3,d5
  836.     lsr.w    #3,d5
  837.     andi.w    #$001f,d5
  838.     or.w    d5,(a0)+
  839.     swap    d3
  840.     add.l    d4,d3
  841.     dbf    d6,.blue_loop
  842.  
  843.     move.w    a5,d6
  844.     dbra    d7,.loop
  845.  
  846.     rts
  847.  
  848. ; INPUT:
  849. ; a0: resolutionsetter routine (null: no change)
  850. ; a1: palette (null: no change)
  851. ; a2: screen
  852. ; OUTPUT:
  853. ; d0.w=0: done, -1: not done, still pending
  854. Screen.requestUpdate:
  855.     moveq    #-1,d0
  856.  
  857. ; If the previous update is still pending, just return.
  858.     tst.w    Screen.updateRequested
  859.     bne.s    .end
  860.     
  861.     move.l    a0,Screen.resRout
  862.     move.l    a1,Screen.palAdr
  863.     move.l    a2,Screen.adr
  864.     st    Screen.updateRequested
  865.     clr.l    d0
  866.  
  867. .end:    rts
  868.  
  869. ; This should be called by the vbl. Uses datastructures set by user to
  870. ; update screenbase, resolution and palette.
  871. Screen.update:
  872.     tst.w    Screen.updateRequested
  873.     beq.s    .end
  874.  
  875. ; Set resolution, if it's not a null.
  876.     move.l    Screen.resRout,d0
  877.     beq.s    .res_done
  878.     movea.l    d0,a0
  879.     jsr    (a0)
  880. .res_done:
  881.  
  882. ; Set screenbase.
  883.     move.l    Screen.adr,d0
  884.     move.l    d0,d1
  885.     lsr.w    #8,d0
  886.     move.l    d0,$FFFF8200.w
  887.     move.b    d1,$FFFF820D.w
  888.  
  889. ; Set palette, if it's not a null.
  890.     move.l    Screen.palAdr,d0
  891.     beq.s    .pal_done
  892.     movea.l    d0,a1
  893.     lea    $FFFF9800.w,a0
  894.     moveq    #128-1,d7
  895. .loop:    move.l    (a1)+,(a0)+
  896.     move.l    (a1)+,(a0)+
  897.     dbf    d7,.loop
  898. .pal_done:
  899.  
  900.     clr.l    Screen.resRout            ; Indicate no new res anymore.
  901.     clr.l    Screen.palAdr            ; Indicate no pal anymore.
  902.  
  903. .end:    clr.w    Screen.updateRequested
  904.     rts
  905.  
  906.  
  907.     BSS
  908.  
  909. Screen.updateRequested:
  910.     ds.w    1
  911. Screen.palAdr:
  912.     ds.l    1
  913. Screen.resRout:
  914.     ds.l    1
  915. Screen.adr:
  916.     ds.l    1
  917.  
  918. save_fv:
  919.     DS.W    24
  920. falcsave_pal:
  921.     DS.L    256
  922.