home *** CD-ROM | disk | FTP | other *** search
/ Fujiology Archive / fujiology_archive_v1_0.iso / !FALCON / LINEOUT / OUT.ZIP / SOURCE.ZIP / FSCR2.I < prev    next >
Text File  |  2003-12-08  |  21KB  |  1,005 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    $ffff8265.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)+,$ffff8265.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*200 highcolor screen.
  365. ; INPUT:
  366. ; d0.l=color (double hc word)
  367. ; a0: screenaddress
  368. WIPE_320200TSCR:
  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    #123-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*200*2,a0
  383. .loop:
  384.     REPT    20
  385.     movem.l    d0-d6/a1-a6,-(a0)
  386.     ENDR
  387.     dbra    d7,.loop
  388.     movem.l    d0-d6/a1-a6,-(a0)
  389.     movem.l    d0-d6,-(a0)
  390.     rts
  391.  
  392. * Clears a 320*100 highcolor screen.
  393. * INPUT:
  394. * a0: screenaddress
  395. CLEAR_320100TSCR:
  396.     moveq    #0,d0
  397.     move.l    d0,d1
  398.     move.l    d0,d2
  399.     move.l    d1,d3
  400.     move.l    d2,d4
  401.     move.l    d3,d5
  402.     move.l    d4,d6
  403.     moveq    #100-1,d7
  404.     move.l    d0,a1
  405.     move.l    d1,a2
  406.     move.l    d2,a3
  407.     move.l    d3,a4
  408.     move.l    d4,a5
  409.     move.l    d5,a6
  410.     adda.l    #320*100*2,a0
  411. .loop:
  412.     REPT    12
  413.     movem.l    d0-d6/a1-a6,-(a0)
  414.     ENDR
  415.     movem.l    d0-d3,-(a0)
  416.     dbra    d7,.loop
  417.     rts
  418.  
  419. * Clears a 320*200 8bpp screen.
  420. * INPUT:
  421. * a0: screenaddress
  422. CLEAR_3202008SCR:
  423.     moveq    #0,d0
  424.     move.l    d0,d1
  425.     move.l    d0,d2
  426.     move.l    d1,d3
  427.     move.l    d2,d4
  428.     move.l    d3,d5
  429.     move.l    d4,d6
  430.     moveq    #100-1,d7
  431.     move.l    d0,a1
  432.     move.l    d1,a2
  433.     move.l    d2,a3
  434.     move.l    d3,a4
  435.     move.l    d4,a5
  436.     move.l    d5,a6
  437.     adda.l    #320*100*2,a0
  438. .loop:
  439.     REPT    12
  440.     movem.l    d0-d6/a1-a6,-(a0)
  441.     ENDR
  442.     movem.l    d0-d3,-(a0)
  443.     dbra    d7,.loop
  444.     rts
  445.  
  446. * Copies a 320*200 8bpp screen.
  447. * INPUT:
  448. * a0: destination
  449. * a1: source
  450. COPY_PIC3202008:
  451.     moveq    #100-1,d7
  452. .loop:    movem.l    (a1)+,d0-d6/a2-a6
  453.     movem.l    d0-d6/a2-a6,(a0)
  454.     movem.l    (a1)+,d0-d6/a2-a6
  455.     movem.l    d0-d6/a2-a6,48(a0)
  456.     movem.l    (a1)+,d0-d6/a2-a6
  457.     movem.l    d0-d6/a2-a6,96(a0)
  458.     movem.l    (a1)+,d0-d6/a2-a6
  459.     movem.l    d0-d6/a2-a6,144(a0)
  460.     movem.l    (a1)+,d0-d6/a2-a6
  461.     movem.l    d0-d6/a2-a6,192(a0)
  462.     movem.l    (a1)+,d0-d6/a2-a6
  463.     movem.l    d0-d6/a2-a6,240(a0)
  464.     movem.l    (a1)+,d0-d6/a2-a6
  465.     movem.l    d0-d6/a2-a6,288(a0)
  466.     movem.l    (a1)+,d0-d6/a2-a6
  467.     movem.l    d0-d6/a2-a6,336(a0)
  468.     movem.l    (a1)+,d0-d6/a2-a6
  469.     movem.l    d0-d6/a2-a6,384(a0)
  470.     movem.l    (a1)+,d0-d6/a2-a6
  471.     movem.l    d0-d6/a2-a6,432(a0)
  472.     movem.l    (a1)+,d0-d6/a2-a6
  473.     movem.l    d0-d6/a2-a6,480(a0)
  474.     movem.l    (a1)+,d0-d6/a2-a6
  475.     movem.l    d0-d6/a2-a6,528(a0)
  476.     movem.l    (a1)+,d0-d6/a2-a6
  477.     movem.l    d0-d6/a2-a6,576(a0)
  478.     movem.l    (a1)+,d0-d3
  479.     movem.l    d0-d3,624(a0)
  480.     lea    640(a0),a0
  481.     dbra    d7,.loop
  482.     rts
  483.  
  484. * Copies a 320*200 8bpp screen.
  485. * INPUT:
  486. * a0: destination
  487. * a1: source
  488. COPY_PIC32020016:
  489.     move.w    #200-1,d7
  490. .loop:    movem.l    (a1)+,d0-d6/a2-a6
  491.     movem.l    d0-d6/a2-a6,(a0)
  492.     movem.l    (a1)+,d0-d6/a2-a6
  493.     movem.l    d0-d6/a2-a6,48(a0)
  494.     movem.l    (a1)+,d0-d6/a2-a6
  495.     movem.l    d0-d6/a2-a6,96(a0)
  496.     movem.l    (a1)+,d0-d6/a2-a6
  497.     movem.l    d0-d6/a2-a6,144(a0)
  498.     movem.l    (a1)+,d0-d6/a2-a6
  499.     movem.l    d0-d6/a2-a6,192(a0)
  500.     movem.l    (a1)+,d0-d6/a2-a6
  501.     movem.l    d0-d6/a2-a6,240(a0)
  502.     movem.l    (a1)+,d0-d6/a2-a6
  503.     movem.l    d0-d6/a2-a6,288(a0)
  504.     movem.l    (a1)+,d0-d6/a2-a6
  505.     movem.l    d0-d6/a2-a6,336(a0)
  506.     movem.l    (a1)+,d0-d6/a2-a6
  507.     movem.l    d0-d6/a2-a6,384(a0)
  508.     movem.l    (a1)+,d0-d6/a2-a6
  509.     movem.l    d0-d6/a2-a6,432(a0)
  510.     movem.l    (a1)+,d0-d6/a2-a6
  511.     movem.l    d0-d6/a2-a6,480(a0)
  512.     movem.l    (a1)+,d0-d6/a2-a6
  513.     movem.l    d0-d6/a2-a6,528(a0)
  514.     movem.l    (a1)+,d0-d6/a2-a6
  515.     movem.l    d0-d6/a2-a6,576(a0)
  516.     movem.l    (a1)+,d0-d3
  517.     movem.l    d0-d3,624(a0)
  518.     lea    640(a0),a0
  519.     dbra    d7,.loop
  520.     rts
  521.  
  522. ******** Highcolor pixeldoubling routines
  523.  
  524. * Doubles highcolor bitmap in vertical direction.
  525. * (1*1) -> (1*2)
  526. * INPUT:
  527. * d0.w: width of buffer
  528. * d1.w: height of buffer
  529. * a0: destination buffer
  530. * a1: source buffer
  531. DOUBLE_BUFFERV:
  532.     subq.w    #1,d1
  533.     bmi.s    .end
  534.     move.w    d0,d2
  535.     ble.s    .end
  536.     subq.w    #1,d2
  537.     ext.l    d0
  538.     add.l    d0,d0
  539.     lea    (a0,d0.l),a2
  540.  
  541. .yloop:    move.w    d2,d7
  542.  
  543. .xloop:    move.w    (a1),(a0)+
  544.     move.w    (a1)+,(a2)+
  545.     dbra    d7,.xloop
  546.  
  547.     adda.l    d0,a0
  548.     adda.l    d0,a2
  549.     dbra    d1,.yloop
  550.  
  551. .end:    rts
  552.  
  553. * Doubles highcolor bitmap in horizontal direction.
  554. * (1*1) -> (2*1)
  555. * INPUT:
  556. * d0.w: width of buffer
  557. * d1.w: height of buffer
  558. * a0: destination buffer
  559. * a1: source buffer
  560. DOUBLE_BUFFERH:
  561.     subq.w    #1,d1
  562.     bmi.s    .end
  563.     move.w    d0,d2
  564.     ble.s    .end
  565.     subq.w    #1,d2
  566.  
  567. .yloop:    move.w    d2,d7
  568.  
  569. .xloop:    move.w    (a1),(a0)+
  570.     move.w    (a1)+,(a0)+
  571.     dbra    d7,.xloop
  572.  
  573.     dbra    d1,.yloop
  574.  
  575. .end:    rts
  576.  
  577. * Doubles highcolor bitmap in horizontal and vertical direction.
  578. * (1*1) -> (2*2)
  579. * INPUT:
  580. * d0.w: width of buffer
  581. * d1.w: height of buffer
  582. * a0: destination buffer
  583. * a1: source buffer
  584. DOUBLE_BUFFERHV:
  585.     subq.w    #1,d1
  586.     bmi.s    .end
  587.     move.w    d0,d2
  588.     ble.s    .end
  589.     subq.w    #1,d2
  590.     ext.l    d0
  591.     lsl.l    #2,d0
  592.     lea    (a0,d0.l),a2
  593.  
  594. .yloop:    move.w    d2,d7
  595.  
  596. .xloop:    move.w    (a1)+,d0
  597.     move.w    d0,(a0)+
  598.     move.w    d0,(a0)+
  599.     move.w    d0,(a2)+
  600.     move.w    d0,(a2)+
  601.     dbra    d7,.xloop
  602.  
  603.     adda.l    d0,a0
  604.     adda.l    d0,a2
  605.     dbra    d1,.yloop
  606.  
  607. .end:    rts
  608.  
  609. ; Bitmap conversion routines..
  610.  
  611. ; d7.l=#pixels
  612. ; a0: dst hc pixels (%rrrrrggggggbbbbb)
  613. ; a1: src tc pixels ($rrggbb)
  614. convertTc2FalcTc:
  615.     subq.l    #1,d7
  616.     bmi.s    .end
  617.     swap    d7
  618.     clr.w    d0
  619.  
  620. .outerloop:
  621.     swap    d7
  622.  
  623. .innerloop:
  624.     move.w    (a1)+,(a0)+
  625.     move.b    (a1)+,d0
  626.     move.w    d0,(a0)+
  627.     dbf    d7,.innerloop
  628.  
  629.     swap    d7
  630.     dbf    d7,.outerloop
  631.  
  632. .end:    rts
  633.  
  634. ; INPUT:
  635. ; d7.l=#pixels
  636. ; a0: dst hc pixels (%rrrrrggggggbbbbb)
  637. ; a1: src tc pixels ($rrggbb)
  638. convertTc2Hc:
  639.     subq.l    #1,d7
  640.     bmi.s    .end
  641.     swap    d7
  642.     move.w    #$F800,d3
  643.     move.w    #$07E0,d4
  644.  
  645. .outerloop:
  646.     swap    d7
  647.  
  648. .innerloop:
  649.     clr.l    d1
  650.     move.b    (a1)+,d0
  651.     move.b    (a1)+,d1
  652.     move.b    (a1)+,d2
  653.     lsl.w    #8,d0
  654.     lsl.w    #3,d1
  655.     lsr.b    #3,d2
  656.     and.w    d3,d0
  657.     and.w    d4,d1
  658.     or.w    d1,d0
  659.     or.b    d2,d0
  660.     move.w    d0,(a0)+
  661.     dbf    d7,.innerloop
  662.  
  663.     swap    d7
  664.     dbf    d7,.outerloop
  665.  
  666. .end:    rts
  667.  
  668. ; Converts an interleaved bitplane map to highcolor.
  669. ; INPUT:
  670. ; d0.w=width (in 16pixel planes!!)
  671. ; d1.w=height
  672. ; d2.w=#bitplanes
  673. ; a0: dst
  674. ; a1: src
  675. ; a2: pal (highcolor words, 2^#bitplanes entries)
  676. Bitmap.convIBplToHC:
  677.     subq.w    #1,d1
  678.     bmi.s    .end
  679.     move.w    d0,d7                ; d7.w=width
  680.     beq.s    .end
  681.     subq.w    #1,d7
  682.     subq.w    #1,d2
  683.     movea.w    d2,a6                ; a6=#bitplanes-1
  684.  
  685. .yloop:    move.w    d7,d0
  686.  
  687. .xloop:    moveq    #16-1,d6
  688.  
  689. .pixel_loop:
  690.     move.l    a6,d5                ; d5.w=#bitplanes-1
  691.     lea    2(a1,d5.w*2),a3            ; a3: next chunk
  692.     clr.l    d3                ; d3.b=pixel
  693.  
  694. .plane_loop:
  695.     add.b    d3,d3                ; d3.b=pixel=oldpixel<<1
  696.     move.w    -(a3),d2
  697.     lsr.w    d6,d2
  698.     andi.b    #1,d2                ; d2.w=masked bit
  699.     or.b    d2,d3                ; d3.b=pixel|masked bit
  700.     dbf    d5,.plane_loop
  701.  
  702.     move.w    (a2,d3.l*2),(a0)+        ; Store pixel.
  703.     dbf    d6,.pixel_loop
  704.  
  705.     lea    2(a1,a6.l*2),a1            ; a1: next chunk
  706.     dbf    d0,.xloop
  707.  
  708.     dbf    d1,.yloop
  709.  
  710. .end:    rts
  711.  
  712. ; INPUT:
  713. ; a0: dst truecolor palette (24b)
  714. ; a1: colorflow instruction table 
  715. Pal.makeGradientTc:
  716.     move.w    (a1)+,d7
  717.     moveq    #0,d0
  718.     move.w    (a1)+,d0
  719.     moveq    #1,d6
  720.     lsl.w    d0,d6
  721.     move.w    d7,d5
  722.     mulu.w    d6,d5
  723.     subq.w    #1,d6
  724.     move.w    d6,d5
  725.     subq.w    #1,d7
  726.  
  727. .biglop    move.l    (a1)+,d1
  728.     move.l    (a1),d2
  729.     moveq.l    #0,d3
  730.     move.l    d3,d4
  731.     move.b    d1,d3
  732.     move.b    d2,d4
  733.     swap    d3
  734.     swap    d4
  735.     sub.l    d3,d4
  736.     asr.l    d0,d4
  737.     move.l    a0,a6
  738. .lop1    swap    d3
  739.     move.w    d3,2(a0)
  740.     addq.l    #4,a0
  741.     swap    d3
  742.     add.l    d4,d3
  743.     dbra    d6,.lop1
  744.     move.w    d5,d6
  745.     move.l    a6,a0
  746.     moveq    #0,d3
  747.     move.l    d3,d4
  748.     swap    d1
  749.     swap    d2
  750.     move.b    d1,d3
  751.     move.b    d2,d4
  752.     swap    d3
  753.     swap    d4
  754.     sub.l    d3,d4
  755.     asr.l    d0,d4
  756. .lop2    swap    d3
  757.     move.b    d3,1(a0)
  758.     addq.l    #4,a0
  759.     swap    d3
  760.     add.l    d4,d3
  761.     dbra    d6,.lop2
  762.     move.l    a6,a0
  763.     move.w    d5,d6
  764.     moveq.l    #0,d3
  765.     move.l    d3,d4
  766.     swap    d1
  767.     swap    d2
  768.     rol.l    #8,d1
  769.     rol.l    #8,d2
  770.     move.b    d1,d3
  771.     move.b    d2,d4
  772.     swap    d3
  773.     swap    d4
  774.     sub.l    d3,d4
  775.     asr.l    d0,d4
  776. .lop3    swap    d3
  777.     move.b    d3,(a0)
  778.     addq.l    #4,a0
  779.     swap    d3
  780.     add.l    d4,d3
  781.     dbra    d6,.lop3
  782.     move.w    d5,d6
  783.     dbra    d7,.biglop
  784.     rts
  785.  
  786. ; Generates a highcolor pallette from a (truecolor) flowtable.
  787. ; Note: doubles hc words
  788. ; INPUT:
  789. ; a0: dst highcolor buffer
  790. ; a1: instruction table 
  791. Pal.makeGradient2Hc:
  792.     move.l    a1,-(sp)
  793.     move.l    a0,-(sp)
  794.     bsr.s    Pal.makeGradientHc
  795.     movea.l    (sp)+,a2
  796.     movea.l    (sp)+,a1
  797.  
  798.     move.w    (a1)+,d7
  799.     moveq    #0,d0
  800.     move.w    (a1)+,d0
  801.     moveq    #1,d6
  802.     lsl.w    d0,d6
  803.     move.w    d7,d5
  804.     mulu.w    d6,d5
  805.     lea    (a2,d5.l*4),a2
  806.     subq.w    #1,d5
  807.  
  808. ; a0: src end, a2: dst end
  809. .double_loop:
  810.     move.w    -(a0),-(a2)
  811.     move.w    (a0),-(a2)
  812.     dbf    d5,.double_loop
  813.     
  814.     rts
  815.  
  816. ; Generates a highcolor pallette from a (truecolor) flowtable.
  817. ; INPUT:
  818. ; a0: dst highcolor buffer
  819. ; a1: instruction table 
  820. Pal.makeGradientHc:
  821.     move.w    (a1)+,d7
  822.     moveq    #0,d0
  823.     move.w    (a1)+,d0
  824.     moveq    #1,d6
  825.     lsl.w    d0,d6
  826.     move.w    d7,d5
  827.     mulu.w    d6,d5
  828.     subq.w    #1,d6
  829.     movea.w    d6,a5
  830.     subq.w    #1,d7
  831.  
  832. .loop:    move.l    (a1)+,d1
  833.     move.l    (a1),d2
  834.     move.l    d1,d3
  835.     move.l    d2,d4
  836.     lsr.l    #8,d3
  837.     lsr.l    #8,d4
  838.     clr.w    d3
  839.     clr.w    d4
  840.     sub.l    d3,d4
  841.     asr.l    d0,d4
  842.     move.l    a0,a6
  843.  
  844. .red_loop:
  845.     swap    d3
  846.     move.w    d3,d5
  847.     lsl.w    #8,d5
  848.     andi.w    #$f800,d5
  849.     move.w    d5,(a0)+
  850.     swap    d3
  851.     add.l    d4,d3
  852.     dbf    d6,.red_loop
  853.  
  854.     move.w    a5,d6
  855.     move.l    a6,a0
  856.     move.l    d1,d3
  857.     move.l    d2,d4
  858.     andi.l    #$00ff0000,d3
  859.     andi.l    #$00ff0000,d4
  860.     sub.l    d3,d4
  861.     asr.l    d0,d4
  862.  
  863. .green_loop:
  864.     swap    d3
  865.     move.w    d3,d5
  866.     lsl.w    #3,d5
  867.     andi.w    #$07e0,d5
  868.     or.w    d5,(a0)+
  869.     swap    d3
  870.     add.l    d4,d3
  871.     dbf    d6,.green_loop
  872.  
  873.     move.l    a6,a0
  874.     move.w    a5,d6
  875.     moveq    #0,d3
  876.     moveq    #0,d4
  877.     move.b    d1,d3
  878.     move.b    d2,d4
  879.     swap    d3
  880.     swap    d4
  881.     sub.l    d3,d4
  882.     asr.l    d0,d4
  883.  
  884. .blue_loop:
  885.     swap    d3
  886.     move.w    d3,d5
  887.     lsr.w    #3,d5
  888.     andi.w    #$001f,d5
  889.     or.w    d5,(a0)+
  890.     swap    d3
  891.     add.l    d4,d3
  892.     dbf    d6,.blue_loop
  893.  
  894.     move.w    a5,d6
  895.     dbra    d7,.loop
  896.  
  897.     rts
  898.  
  899. ; INPUT:
  900. ; a0: resolutionsetter routine (null: no change)
  901. ; a1: palette (null: no change)
  902. ; a2: screen
  903. ; OUTPUT:
  904. ; d0.w=0: done, -1: not done, still pending
  905. Screen.requestUpdate:
  906.     moveq    #-1,d0
  907.  
  908. ; If the previous update is still pending, just return.
  909.     tst.w    Screen.updateRequested
  910.     bne.s    .end
  911.     
  912.     move.l    a0,Screen.resRout
  913.     move.l    a1,Screen.palAdr
  914.     move.l    a2,Screen.adr
  915.     st    Screen.updateRequested
  916.     clr.l    d0
  917.  
  918. .end:    rts
  919.  
  920. ; This should be called by the vbl. Uses datastructures set by user to
  921. ; update screenbase, resolution and palette.
  922. Screen.update:
  923.     tst.w    Screen.updateRequested
  924.     beq.s    .end
  925.  
  926. ; Set resolution, if it's not a null.
  927.     move.l    Screen.resRout,d0
  928.     beq.s    .res_done
  929.     movea.l    d0,a0
  930.     jsr    (a0)
  931. .res_done:
  932.  
  933. ; Set screenbase.
  934.     move.l    Screen.adr,d0
  935.     move.l    d0,d1
  936.     lsr.w    #8,d0
  937.     move.l    d0,$FFFF8200.w
  938.     move.b    d1,$FFFF820D.w
  939.  
  940.     IFNE    0
  941.     IFNE    1
  942. ; testshit for videl hc fading, borderproblems, >0 end intensity...
  943. ; also doesn't work well in vga100 160x100.. urgh
  944.     move.w    #0,$FFFF828A.w        ; hde
  945.     ELSE
  946. ;    move.w    #0,$FFFF8284.w
  947.     clr.w    $FFFF8286.w            ; todo: test hbe (0,1,2: inverse of gradient?)
  948. ;    move.w    $FFFF8288.w,$FFFF8284.w        ; todo: test hbb
  949. ;    clr.w    $FFFF828A.w            ; todo: test hde
  950.  
  951. ;    move.w    #133+400,$FFFF82A4.w        ; todo: test vbb
  952. ;    move.w    #133,$FFFF82A6.w        ; vbe: start of gradient in halfscans
  953.     move.w    #0,$FFFF82A6.w            ; vbe: start of gradient in halfscans
  954. ;    move.w    #133+396,$FFFF82AA.w            ; todo: test vde
  955.  
  956.     move.w    $04bc.w,d0
  957.     lsr.w    #3,d0
  958. ;    Do_SinModulo    d0
  959. ;    Get_Sin    sine_tbl,d0,d0
  960. ;    asr.w    #8,d0
  961. ;    addi.b    #$80,d0
  962.     clr.l    d1
  963.     move.b    d0,d1
  964.     lsl.w    #8,d1
  965.     move.b    d0,d1
  966.     swap    d1
  967.     move.b    d0,d1
  968.     move.l    d1,$FFFF9800.w
  969.     ENDC
  970.     ENDC
  971.  
  972. ; Set palette, if it's not a null.
  973.     move.l    Screen.palAdr,d0
  974.     beq.s    .pal_done
  975.     movea.l    d0,a1
  976.     lea    $FFFF9800.w,a0
  977.     moveq    #128-1,d7
  978. .loop:    move.l    (a1)+,(a0)+
  979.     move.l    (a1)+,(a0)+
  980.     dbf    d7,.loop
  981. .pal_done:
  982.  
  983.     clr.l    Screen.resRout            ; Indicate no new res anymore.
  984.     clr.l    Screen.palAdr            ; Indicate no pal anymore.
  985.  
  986. .end:    clr.w    Screen.updateRequested
  987.     rts
  988.  
  989.  
  990.     BSS
  991.  
  992. Screen.updateRequested:
  993.     ds.w    1
  994. Screen.palAdr:
  995.     ds.l    1
  996. Screen.resRout:
  997.     ds.l    1
  998. Screen.adr:
  999.     ds.l    1
  1000.  
  1001. save_fv:
  1002.     DS.W    24
  1003. falcsave_pal:
  1004.     DS.L    256
  1005.