home *** CD-ROM | disk | FTP | other *** search
/ Acorn User 10 / AU_CD10.iso / Archived / Updates / Flash / flashplayer / flashlib / s / gfx16 next >
Encoding:
Text File  |  2000-04-09  |  18.2 KB  |  931 lines

  1. ; Use the GET directive to include register definitions as if typed here
  2.  
  3.         GET     h.RegNames
  4.  
  5.         AREA    |C$$Code|, CODE, READONLY
  6.  
  7.  
  8.         EXPORT  mix_alpha16
  9.         EXPORT  fill_line_flat_opaque16
  10.         EXPORT  fill_line_flat16
  11.         EXPORT  fill_line_flat_bitmap16
  12.         EXPORT  fill_line_alpha_chn_bitmap16
  13.         EXPORT  fill_line_alpha_bitmap16
  14.     EXPORT  fill_line_ramp_opaque16
  15.     EXPORT  fill_line_ramp16
  16.     EXPORT  fill_line_ramp_2_opaque16
  17.     EXPORT  fill_line_ramp_2_16
  18.     EXPORT  fill_line_radial_ramp16
  19.     EXPORT  fill_line_radial_ramp_2_16
  20.     EXPORT  get_colour16
  21.     EXPORT  alloc_colour16
  22.  
  23.  
  24. get_colour16
  25. ;on entry    r0  =  colour
  26. ;        r1  => Color structure to fill in
  27. ;               +0    r
  28. ;               +0    g
  29. ;               +0    b
  30. ;               +4..7    0
  31. ;on exit    r2,r3  corrupt
  32.     AND     r2,r0,#31
  33.     MOV     r2,r2,LSL#5
  34.     ORR     r2,r2,r2,LSR#5
  35.     MOV     r3,r0,LSR#5
  36.     AND     r3,r3,#31
  37.     MOV     r3,r3,LSL#3
  38.     ORR     r3,r3,r3,LSR#5
  39.     ORR     r2,r2,r3,LSL#8
  40.     MOV     r3,r0,LSR#10
  41.     AND     r3,r3,#31
  42.     MOV     r3,r3,LSL#3
  43.     ORR     r3,r3,r3,LSR#5
  44.     ORR     r2,r2,r3,LSL#16
  45.     STR     r2,[r1]
  46.     MOVS    pc,r14
  47.  
  48.  
  49. alloc_colour16
  50. ;on entry    r0  => Color structure
  51. ;on exit    r0  =  pixel value (dither pattern)
  52. ;        r1-r3  corrupt
  53.     LDR     r0,[r0]
  54.         ADRL    r1,table8_5_error
  55.  
  56.     AND     r2,r0,#2_11111100
  57.     LDR     r2,[r1,r2]
  58.  
  59.     AND     r3,r0,#2_1111110000000000
  60.     LDR     r3,[r1,r3,LSR#8]
  61.     ORR     r2,r2,r3,LSL#5
  62.  
  63.     AND     r3,r0,#2_111111000000000000000000
  64.     LDR     r3,[r1,r3,LSR#16]
  65.     ORR     r0,r2,r3,LSL#10
  66.  
  67.     MOVS    pc,r14
  68.  
  69.  
  70. fill_line_radial_ramp_2_16
  71. ;on entry    r0  => line
  72. ;        r1  =  no. of pixels
  73. ;        r2  => X
  74. ;        r3  => Y
  75. ;          sp+0  =  dx                 r4
  76. ;          sp+4  =  dy                   r5
  77. ;          sp+8  => ramp                 r6
  78. ;          sp+12 => square-root table    r7
  79.     CMP     r1,#0
  80.     MOVLES  pc,r14
  81.     STMFD    r13!,{r3-r12,r14}
  82.     LDR     r4,[r13,#(11+0)*4]
  83.     LDR     r5,[r13,#(11+1)*4]
  84.     LDR     r6,[r13,#(11+2)*4]
  85.     LDR     r7,[r13,#(11+3)*4]
  86.  
  87.     LDR     r8,[r2]            ;X
  88.     LDR     r9,[r3]             ;Y
  89.  
  90. 00
  91.      CMP    r1,#0
  92.      BLE    %FT01
  93.      MOV    r11,r8,ASR#16
  94.      MOV    r12,r9,ASR#16
  95.      MUL    r10,r11,r11
  96.      MLA    r10,r12,r12,r10
  97.      CMP    r10,#1<<16
  98.      MOVGE  r10,#255
  99.      LDRLTB r10,[r7,r10]
  100.  
  101.      ADD    r10,r6,r10,LSL#3    ;pointer to colour
  102.      STMFD  r13!,{r0-r2}
  103.      LDRB   r2,[r10,#3]
  104.      LDR    r1,[r10,#4]         ;read colour
  105.      LDR    r0,[r0]
  106.      BL     mix_alpha16
  107.      MOV    r10,r0
  108.      LDMFD  r13!,{r0-r2}
  109.      TST    r0,#2
  110.      MOVEQ  r10,r10,LSR#16
  111.      STRB   r10,[r0],#1        ;write colour
  112.      MOV    r10,r10,LSR#8
  113.      STRB   r10,[r0],#1
  114.  
  115.          ADD    r8,r8,r4
  116.          ADD    r9,r9,r5
  117.      SUB    r1,r1,#1
  118.      B      %BT00
  119.  
  120. 01
  121.         STR     r8,[r2]
  122.         STR     r9,[r3]
  123.     LDMFD    r13!,{r3-r12,pc}^
  124.  
  125.  
  126.  
  127. fill_line_radial_ramp16
  128. ;on entry    r0  => line
  129. ;        r1  =  no. of pixels
  130. ;        r2  => X
  131. ;        r3  => Y
  132. ;          sp+0  =  dx                 r4
  133. ;          sp+4  =  dy                   r5
  134. ;          sp+8  => ramp                 r6
  135. ;          sp+12 => square-root table    r7
  136.     CMP     r1,#0
  137.     MOVLES  pc,r14
  138.     STMFD    r13!,{r3-r12,r14}
  139.     LDR     r4,[r13,#(11+0)*4]
  140.     LDR     r5,[r13,#(11+1)*4]
  141.     LDR     r6,[r13,#(11+2)*4]
  142.     LDR     r7,[r13,#(11+3)*4]
  143.  
  144.     LDR     r8,[r2]            ;X
  145.     LDR     r9,[r3]             ;Y
  146.  
  147. 00
  148.      CMP    r1,#0
  149.      BLE    %FT01
  150.      MOV    r11,r8,ASR#16
  151.      MOV    r12,r9,ASR#16
  152.      MUL    r10,r11,r11
  153.      MLA    r10,r12,r12,r10
  154.      CMP    r10,#1<<16
  155.      MOVGE  r10,#255
  156.      LDRLTB r10,[r7,r10]
  157.  
  158.      ADD    r10,r6,r10,LSL#3    ;pointer to colour
  159.      LDR    r10,[r10,#4]         ;read colour
  160.      TST    r0,#2
  161.      MOVEQ  r10,r10,LSR#16
  162.      STRB   r10,[r0],#1        ;write colour
  163.      MOV    r10,r10,LSR#8
  164.      STRB   r10,[r0],#1
  165.  
  166.          ADD    r8,r8,r4
  167.          ADD    r9,r9,r5
  168.      SUB    r1,r1,#1
  169.      B      %BT00
  170.  
  171. 01
  172.         STR     r8,[r2]
  173.         STR     r9,[r3]
  174.     LDMFD    r13!,{r3-r12,pc}^
  175.  
  176.  
  177.  
  178. fill_line_ramp16 ROUT
  179. ;on entry    r0  => line
  180. ;        r1  =  no. of pixels
  181. ;        r2  => ramp
  182. ;        r3  =  r
  183. ;          sp+0  =  dr    r4
  184. ;on exit    r0  =  r
  185.     CMP     r1,#0
  186.     MOVLE   r0,r3
  187.     MOVLES  pc,r14
  188.     STMFD    r13!,{r3-r12,r14}
  189.     LDR     r4,[r13,#11*4]        ;remaining arg
  190.     MOV     r6,r0
  191.     MOV     r7,r1
  192.     MOV     r8,r2
  193.  
  194. 00
  195.          MOV    r5,r3,ASR#10
  196.      ADD    r5,r8,r5,LSL#3        ;pointer to colour
  197.      LDR    r1,[r5,#4]        ;get colour
  198.      LDRB   r2,[r5,#3]        ;get alpha
  199.      LDR    r0,[r6]            ;current pixel
  200.      BL     mix_alpha16
  201.  
  202.      TST    r6,#2
  203.      MOVEQ  r10,r10,LSR#16
  204.      STRB   r0,[r6],#1
  205.      MOV    r0,r0,LSR#8
  206.      STRB   r0,[r6],#1
  207.  
  208.      ADD    r3,r3,r4
  209.  
  210.         SUBS    r7,r7,#1
  211.     BGT     %BT00
  212. 01
  213.     MOV     r0,r3
  214.      LDMFD   r13!,{r3-r12,pc}^
  215.  
  216.  
  217.  
  218.  
  219.  
  220. fill_line_ramp_2_16 ROUT
  221. ;on entry    r0  => line
  222. ;        r1  =  no. of pixels
  223. ;        r2  => ramp
  224. ;        r3  =  r
  225. ;          sp+0  =  dr    r4
  226. ;on exit    r0  =  r
  227.     CMP     r1,#0
  228.     MOVLE   r0,r3
  229.     MOVLES  pc,r14
  230.     STMFD    r13!,{r3-r12,r14}
  231.     LDR     r4,[r13,#11*4]        ;remaining arg
  232.     MOV     r6,r0
  233.     MOV     r7,r1
  234.     MOV     r8,r2
  235.  
  236. 00
  237.          MOVS   r5,r3,ASR#10
  238.      MOVLT  r5,#0
  239.      CMP    r5,#255
  240.      MOVGT  r5,#255
  241.      ADD    r5,r8,r5,LSL#3        ;pointer to colour
  242.      LDR    r1,[r5,#4]        ;get colour
  243.      LDRB   r2,[r5,#3]        ;get alpha
  244.      LDR    r0,[r6]            ;current pixel
  245.      BL     mix_alpha16
  246.  
  247.      TST    r6,#2
  248.      MOVEQ  r0,r0,LSR#16
  249.      STRB   r0,[r6],#1
  250.      MOV    r0,r0,LSR#8
  251.      STRB   r0,[r6],#1
  252.  
  253.      ADD    r3,r3,r4
  254.  
  255.         SUBS    r7,r7,#1
  256.     BGT     %BT00
  257. 01
  258.     MOV     r0,r3
  259.      LDMFD   r13!,{r3-r12,pc}^
  260.  
  261.  
  262.  
  263.  
  264.  
  265. fill_line_ramp_2_opaque16 ROUT
  266. ;on entry    r0  => line
  267. ;        r1  =  no. of pixels
  268. ;        r2  => ramp
  269. ;        r3  =  r
  270. ;          sp+0  =  dr    r4
  271. ;on exit    r0  =  r
  272.     CMP     r1,#0
  273.     MOVLE   r0,r3
  274.     MOVLES  pc,r14
  275.     STMFD    r13!,{r3-r12,r14}
  276.     LDR     r4,[r13,#11*4]        ;remaining arg
  277.  
  278.         TST     r0,#3
  279.     BEQ     %FT00
  280.  
  281.         MOVS    r5,r3,ASR#10
  282.     MOVLT   r5,#0
  283.     CMP     r5,#255
  284.     MOVGT   r5,#255
  285.     ADD     r5,r2,r5,LSL#3        ;pointer to colour
  286.     LDR     r5,[r5,#4]        ;get colour
  287.     STRB    r5,[r0],#1        ;write pixel
  288.     MOV     r5,r5,LSR#8
  289.     STRB    r5,[r0],#1
  290.     SUB     r1,r1,#1
  291.     ADD     r3,r3,r4
  292.  
  293. 00
  294.      CMP    r1,#2
  295.      BLT    %FT01
  296.  
  297.          MOVS   r5,r3,ASR#10
  298.      MOVLT  r5,#0
  299.      CMP    r5,#255
  300.      MOVGT  r5,#255
  301.      ADD    r5,r2,r5,LSL#3        ;pointer to colour
  302.      LDR    r5,[r5,#4]        ;get colour
  303.      MOV    r5,r5,LSR#16
  304.      ADD    r3,r3,r4
  305.  
  306.          MOVS   r6,r3,ASR#10
  307.      MOVLT  r6,#0
  308.      CMP    r6,#255
  309.      MOVGT  r6,#255
  310.      ADD    r6,r2,r6,LSL#3        ;pointer to colour
  311.      LDR    r6,[r6,#4]        ;get colour
  312.      ORR    r5,r5,r6,LSL#16
  313.      ADD    r3,r3,r4
  314.  
  315.      STR    r5,[r0],#4        ;write 2 pixels
  316.  
  317.         SUB     r1,r1,#2
  318.     B       %BT00
  319.  
  320. 01
  321.     CMP     r1,#0
  322.     MOVLE   r0,r3
  323.       LDMLEFD r13!,{r3-r12,pc}^
  324.  
  325.         MOVS    r5,r3,ASR#10
  326.     MOVLT   r5,#0
  327.     CMP     r5,#255
  328.     MOVGT   r5,#255
  329.     ADD     r5,r2,r5,LSL#3        ;pointer to colour
  330.     LDR     r5,[r5,#4]        ;get colour
  331.     STRB    r5,[r0],#1        ;write pixel
  332.     MOV     r5,r5,LSR#8
  333.     STRB    r5,[r0],#1
  334.     ADD     r0,r3,r4
  335.      LDMFD   r13!,{r3-r12,pc}^
  336.  
  337.  
  338.  
  339.  
  340. fill_line_ramp_opaque16 ROUT
  341. ;on entry    r0  => line
  342. ;        r1  =  no. of pixels
  343. ;        r2  => ramp
  344. ;        r3  =  r
  345. ;          sp+0  =  dr    r4
  346. ;on exit    r0  =  r
  347.     CMP     r1,#0
  348.     MOVLE   r0,r3
  349.     MOVLES  pc,r14
  350.     STMFD    r13!,{r3-r12,r14}
  351.     LDR     r4,[r13,#11*4]        ;remaining arg
  352.  
  353.         TST     r0,#3
  354.     BEQ     %FT00
  355.  
  356.         MOV     r5,r3,LSR#10
  357.     ADD     r5,r2,r5,LSL#3        ;pointer to colour
  358.     LDR     r5,[r5,#4]        ;get colour
  359.     STRB    r5,[r0],#1        ;write pixel
  360.     MOV     r5,r5,LSR#8
  361.     STRB    r5,[r0],#1
  362.     SUB     r1,r1,#1
  363.     ADD     r3,r3,r4
  364.  
  365. 00
  366.      CMP    r1,#2
  367.      BLT    %FT01
  368.  
  369.          MOV    r5,r3,LSR#10
  370.      ADD    r5,r2,r5,LSL#3        ;pointer to colour
  371.      LDR    r5,[r5,#4]        ;get colour
  372.      MOV    r5,r5,LSR#16
  373.      ADD    r3,r3,r4
  374.  
  375.          MOV    r6,r3,LSR#10
  376.      ADD    r6,r2,r6,LSL#3        ;pointer to colour
  377.      LDR    r6,[r6,#4]        ;get colour
  378.      ORR    r5,r5,r6,LSL#16
  379.      ADD    r3,r3,r4
  380.  
  381.      STR    r5,[r0],#4        ;write 2 pixels
  382.  
  383.         SUB     r1,r1,#2
  384.     B       %BT00
  385.  
  386. 01
  387.     CMP     r1,#0
  388.     MOVLE   r0,r3
  389.       LDMLEFD r13!,{r3-r12,pc}^
  390.  
  391.         MOV     r5,r3,LSR#10
  392.     ADD     r5,r2,r5,LSL#3        ;pointer to colour
  393.     LDR     r5,[r5,#4]        ;get colour
  394.     STRB    r5,[r0],#1        ;write pixel
  395.     MOV     r5,r5,LSR#8
  396.     STRB    r5,[r0],#1
  397.     ADD     r0,r3,r4
  398.      LDMFD   r13!,{r3-r12,pc}^
  399.  
  400.  
  401.  
  402. fill_line_flat_bitmap16 ROUT
  403. ;on entry    r0  => line
  404. ;        r1  =  no. of pixels
  405. ;        r2  =  colourmap
  406. ;        r3  => bitmap (8bpp)
  407. ;          sp+0  =  bytes per line   r4
  408. ;          sp+4  =  x1        r5
  409. ;          sp+8  =  y1           r6
  410. ;          sp+12 =  dx           r7
  411. ;          sp+16 =  dy           r8
  412. ;          sp+20 =  width        r9
  413. ;          sp+24 =  height       r10
  414. ;          sp+28 =  tiled-flag    r11
  415.     CMP     r1,#0
  416.     MOVLES  pc,r14
  417.     STMFD    r13!,{r3-r12,r14}
  418.     ADD     r12,r13,#11*4        ;remaining args
  419.     LDMIA   r12,{r4-r11}
  420.  
  421.     CMP     r11,#1
  422.     BEQ     fill_line_flat_bitmap16_tiled
  423. ;clipped
  424. 00
  425.     SUBS    r1,r1,#1
  426.     LDMLTFD    r13!,{r3-r12,pc}^
  427.  
  428.     MOVS    r11,r5,ASR#16        ;clip to borders
  429.     MOVLT   r11,#0
  430.     CMP     r11,r9
  431.     SUBGE   r11,r9,#1
  432.  
  433.     MOVS    r12,r6,ASR#16
  434.     MOVLT   r12,#0
  435.     CMP     r12,r10
  436.     SUBGE   r12,r10,#1
  437.  
  438.     MLA     r14,r12,r4,r11        ;pixel no
  439.  
  440.     LDRB    r14,[r3,r14]        ;pixel value
  441.     ADD     r14,r2,r14,LSL#3    ;pointer to colour
  442.     LDR     r14,[r14,#4]        ;read colour
  443.     TST     r0,#2
  444.     MOVEQ   r14,r14,LSR#16
  445.     STRB    r14,[r0,#0]        ;write colour
  446.     MOV     r14,r14,LSR#8
  447.     STRB    r14,[r0,#1]
  448. 01
  449.     ADD     r5,r5,r7
  450.     ADD     r6,r6,r8
  451.     ADD     r0,r0,#2
  452.     B       %BT00
  453.  
  454. fill_line_flat_bitmap16_tiled
  455. 50
  456.     SUBS    r1,r1,#1
  457.     LDMLTFD    r13!,{r3-r12,pc}^
  458.  
  459.     CMP     r5,#0            ;wrap to inside the bitmap
  460.     ADDLT   r5,r5,r9,LSL#16
  461.     CMPGE   r6,#0
  462.     ADDLT   r6,r6,r10,LSL#16
  463.  
  464.     CMP     r9,r5,ASR#16
  465.     SUBLT   r5,r5,r9,LSL#16
  466.     CMP     r10,r6,ASR#16
  467.     SUBLT   r6,r6,r10,LSL#16
  468.  
  469.     MOV     r14,r6,ASR#16
  470.     MUL     r14,r4,r14
  471.     ADD     r14,r14,r5,ASR#16    ;pixel no.
  472.     LDRB    r14,[r3,r14]        ;pixel value
  473.     ADD     r14,r2,r14,LSL#3    ;pointer to colour
  474.     LDR     r14,[r14,#4]        ;read colour
  475.     TST     r0,#2
  476.     MOVEQ   r14,r14,LSR#16
  477.     STRB    r14,[r0,#0]        ;write colour
  478.     MOV     r14,r14,LSR#8
  479.     STRB    r14,[r0,#1]
  480.  
  481.     ADD     r5,r5,r7
  482.     ADD     r6,r6,r8
  483.     ADD     r0,r0,#2
  484.     B       %BT50
  485.  
  486.  
  487.  
  488. fill_line_alpha_chn_bitmap16 ROUT
  489. ;on entry    r0  => line
  490. ;        r1  =  no. of pixels
  491. ;        r2  =  colourmap
  492. ;        r3  => bitmap (8bpp)
  493. ;          sp+0  =  bytes per line   r4
  494. ;          sp+4  =  x1        r5
  495. ;          sp+8  =  y1           r6
  496. ;          sp+12 =  dx           r7
  497. ;          sp+16 =  dy           r8
  498. ;          sp+20 => alpha lookup table
  499. ;          sp+24 => alpha channel bitmap
  500. ;          sp+28 =  width        r11
  501. ;          sp+32 =  height       r12
  502. ;          sp+36 =  tiled-flag
  503.     CMP     r1,#0
  504.     MOVLES  pc,r14
  505.     STMFD    r13!,{r3-r12,r14}
  506.     ADD     r9,r13,#11*4        ;remaining args
  507.     LDMIA   r9,{r4-r8}
  508.     LDR     r11,[r9,#28]
  509.     LDR     r12,[r9,#32]
  510.     MOV     r10,r0
  511.  
  512.     LDR     r0,[r9,#36]
  513.     CMP     r0,#1
  514.     BEQ     fill_line_alpha_chn_bitmap16_tiled
  515. ;clipped
  516. 00
  517.     SUBS    r1,r1,#1
  518.     LDMLTFD    r13!,{r3-r12,pc}^
  519.  
  520.     STMFD   r13!,{r1-r2,r7}
  521.     MOVS    r1,r5,ASR#16        ;clip to inside bitmap
  522.     MOVLT   r1,#0
  523.     CMP     r1,r11
  524.     SUBGE   r1,r11,#1
  525.  
  526.     MOVS    r2,r6,ASR#16
  527.     MOVLT   r2,#0
  528.     CMP     r2,r12
  529.     SUBGE   r2,r12,#1
  530.  
  531.     MLA     r7,r4,r2,r1        ;pixel no.
  532.  
  533.     LDR     r1,[r9,#28]        ;alpha channel bitmap
  534.     LDRB    r2,[r1,r7]        ;alpha channel pixel
  535.     LDR     r1,[r9,#24]        ;alpha table
  536.     LDRB    r2,[r1,r2]
  537.  
  538.     LDRB    r1,[r3,r7]        ;pixel value
  539.     ADD     r1,r2,r1,LSL#3        ;pointer to colour
  540.     LDR     r1,[r1,#4]        ;read colour
  541.  
  542.     LDR     r0,[r10]        ;read current colour
  543.  
  544.     BL      mix_alpha16        ;r0=col1 r1=col2 r2=alpha
  545.     LDMFD   r13!,{r1-r2,r7}
  546.     TST     r10,#2
  547.     MOVEQ   r0,r0,LSR#16
  548.     STRB    r0,[r10,#0]        ;write colour
  549.     MOV     r0,r0,LSR#8
  550.     STRB    r0,[r10,#1]
  551. 01
  552.     ADD     r5,r5,r7
  553.     ADD     r6,r6,r8
  554.     ADD     r10,r10,#2
  555.     B       %BT00
  556.  
  557.  
  558. fill_line_alpha_chn_bitmap16_tiled
  559. 50
  560.     SUBS    r1,r1,#1
  561.     LDMLTFD    r13!,{r3-r12,pc}^
  562.  
  563.     CMP     r5,#0            ;wrap to inside the bitmap
  564.     ADDLT   r5,r5,r11,LSL#16
  565.     CMPGE   r6,#0
  566.     ADDLT   r6,r6,r12,LSL#16
  567.  
  568.     CMP     r11,r5,ASR#16
  569.     SUBLT   r5,r5,r11,LSL#16
  570.     CMP     r12,r6,ASR#16
  571.     SUBLT   r6,r6,r12,LSL#16
  572.  
  573.     STMFD   r13!,{r1-r2,r7}
  574.     MOV     r7,r6,ASR#16
  575.     MUL     r7,r4,r7
  576.     ADD     r7,r7,r5,ASR#16        ;pixel no.
  577.  
  578.     LDR     r1,[r9,#28]        ;alpha channel bitmap
  579.     LDRB    r2,[r1,r7]        ;alpha channel pixel
  580.     LDR     r1,[r9,#24]        ;alpha table
  581.     LDRB    r2,[r1,r2]
  582.  
  583.     LDRB    r1,[r3,r7]        ;pixel value
  584.     ADD     r1,r2,r1,LSL#3        ;pointer to colour
  585.     LDR     r1,[r1,#4]        ;read colour
  586.  
  587.     LDR     r0,[r10]        ;read current colour
  588.  
  589.     BL      mix_alpha16        ;r0=col1 r1=col2 r2=alpha
  590.     LDMFD   r13!,{r1-r2,r7}
  591.     TST     r10,#2
  592.     MOVEQ   r0,r0,LSR#16
  593.     STRB    r0,[r10,#0]        ;write colour
  594.     MOV     r0,r0,LSR#8
  595.     STRB    r0,[r10,#1]
  596.  
  597.     ADD     r5,r5,r7
  598.     ADD     r6,r6,r8
  599.     ADD     r10,r10,#2
  600.     B       %BT50
  601.  
  602.  
  603.  
  604. fill_line_alpha_bitmap16 ROUT
  605. ;on entry    r0  => line
  606. ;        r1  =  no. of pixels
  607. ;        r2  =  colourmap
  608. ;        r3  => bitmap (8bpp)
  609. ;          sp+0  =  bytes per line   r4
  610. ;          sp+4  =  x1        r5
  611. ;          sp+8  =  y1           r6
  612. ;          sp+12 =  dx           r7
  613. ;          sp+16 =  dy           r8
  614. ;          sp+20 => alpha channel bitmap r9
  615. ;          sp+24 =  width        r10
  616. ;          sp+28 =  height       r11
  617. ;          sp+32 =  tiled-flag
  618.     CMP     r1,#0
  619.     MOVLES  pc,r14
  620.     STMFD    r13!,{r3-r12,r14}
  621.     ADD     r12,r13,#11*4        ;remaining args
  622.     LDMIA   r12,{r4-r11}
  623.     MOV     r12,r0
  624.  
  625.     LDR     r0,[r13,#11*4+32]
  626.     CMP     r0,#1
  627.     BEQ     fill_line_alpha_bitmap16_tiled
  628. ;clipped
  629. 00
  630.     SUBS    r1,r1,#1
  631.     LDMLTFD    r13!,{r3-r12,pc}^
  632.  
  633.     STMFD   r13!,{r1-r2}
  634.     MOVS    r1,r5,ASR#16        ;clip to inside bitmap
  635.     MOVLT   r1,#0
  636.     CMP     r1,r10
  637.     SUBGE   r1,r10,#1
  638.  
  639.     MOVS    r2,r6,ASR#16
  640.     MOVLT   r2,#0
  641.     CMP     r2,r11
  642.     SUBGE   r2,r11,#1
  643.  
  644.     MLA     r1,r4,r2,r1        ;pixel no.
  645.  
  646.     LDRB    r2,[r9,r1]        ;alpha channel pixel
  647.  
  648.     LDRB    r1,[r3,r1]        ;pixel value
  649.     ADD     r1,r2,r1,LSL#3        ;pointer to colour
  650.     LDR     r1,[r1,#4]        ;read colour
  651.  
  652.     LDR     r0,[r12]        ;read current colour
  653.  
  654.     BL      mix_alpha16        ;r0=col1 r1=col2 r2=alpha
  655.     LDMFD   r13!,{r1-r2}
  656.     TST     r12,#2
  657.     MOVEQ   r0,r0,LSR#16
  658.     STRB    r0,[r12,#0]        ;write colour
  659.     MOV     r0,r0,LSR#8
  660.     STRB    r0,[r12,#1]
  661. 01
  662.     ADD     r5,r5,r7
  663.     ADD     r6,r6,r8
  664.     ADD     r12,r12,#2
  665.     B       %BT00
  666.  
  667. fill_line_alpha_bitmap16_tiled
  668. 50
  669.     SUBS    r1,r1,#1
  670.     LDMLTFD    r13!,{r3-r12,pc}^
  671.  
  672.     CMP     r5,#0            ;wrap to inside the bitmap
  673.     ADDLT   r5,r5,r10,LSL#16
  674.     CMPGE   r6,#0
  675.     ADDLT   r6,r6,r11,LSL#16
  676.  
  677.     CMP     r10,r5,ASR#16
  678.     SUBLT   r5,r5,r10,LSL#16
  679.     CMP     r11,r6,ASR#16
  680.     SUBLT   r6,r6,r11,LSL#16
  681.  
  682.     STMFD   r13!,{r1-r2}
  683.     MOV     r1,r6,ASR#16
  684.     MUL     r1,r4,r1
  685.     ADD     r1,r1,r5,ASR#16        ;pixel no.
  686.  
  687.     LDRB    r2,[r9,r1]        ;alpha channel pixel
  688.  
  689.     LDRB    r1,[r3,r1]        ;pixel value
  690.     ADD     r1,r2,r1,LSL#3        ;pointer to colour
  691.     LDR     r1,[r1,#4]        ;read colour
  692.  
  693.     LDR     r0,[r12]        ;read current colour
  694.  
  695.     BL      mix_alpha16        ;r0=col1 r1=col2 r2=alpha
  696.     LDMFD   r13!,{r1-r2}
  697.     TST     r12,#2
  698.     MOVEQ   r0,r0,LSR#16
  699.     STRB    r0,[r12,#0]        ;write colour
  700.     MOV     r0,r0,LSR#8
  701.     STRB    r0,[r12,#1]
  702.  
  703.     ADD     r5,r5,r7
  704.     ADD     r6,r6,r8
  705.     ADD     r12,r12,#2
  706.     B       %BT50
  707.  
  708.  
  709.  
  710. fill_line_flat_opaque16 ROUT
  711. ;on entry    r0  => line
  712. ;        r1  =  no. of pixels
  713. ;        r2  =  colour    (dither pattern)
  714.     CMP     r1,#0
  715.     MOVLES  pc,r14
  716.     STMFD    r13!,{r3-r10,r14}
  717.  
  718.         TST     r0,#3            ;make sure line is word-aligned
  719.         BEQ     %FT00
  720.     STRB    r2,[r0],#1
  721.     MOV     r3,r2,LSR#8
  722.     STRB    r3,[r0],#1
  723.         SUB     r1,r1,#1
  724.  
  725. 00
  726.     MOV     r4,r2
  727.     MOV     r5,r2
  728.     MOV     r6,r2
  729.     MOV     r7,r2
  730.     MOV     r8,r2
  731.     MOV     r9,r2
  732.     MOV     r10,r2
  733. 10                                      ;now write 16 pixels at a time
  734.      CMP    r1,#16            ;until there's less than 16 left
  735.          BLT    %FT11
  736.      STMIA  r0!,{r2,r4-r10}
  737.      SUB    r1,r1,#16
  738.         B       %BT10
  739.  
  740. 11
  741.      CMP    r1,#2            ;write 2 pixels at a time
  742.      BLT    %FT12            ;until there's less than 2 left
  743.          STR    r2,[r0],#4
  744.          SUB    r1,r1,#2
  745.         B       %BT11
  746.  
  747. 12
  748.     CMP     r1,#1
  749.         STREQB  r2,[r0],#1        ;write the last pixel (if any)
  750.     MOVEQ   r3,r2,LSR#8
  751.         STREQB  r3,[r0],#1
  752.     LDMFD    r13!,{r3-r10,pc}^
  753.  
  754.  
  755.  
  756. fill_line_flat16 ROUT
  757. ;on entry    r0  => line
  758. ;        r1  =  no. of pixels
  759. ;        r2  =  colour    (dither pattern)
  760. ;        r3  =  alpha
  761.     CMP     r1,#0
  762.     MOVLES  pc,r14
  763.     STMFD    r13!,{r4-r12,r14}
  764.         AND     r4,r2,#31           ;prepare r,g,b
  765.     MUL     r4,r3,r4
  766.         AND     r5,r2,#31<<5
  767.     MOV     r5,r5,LSR#5
  768.     MUL     r5,r3,r5
  769.         AND     r6,r2,#31<<10
  770.     MOV     r6,r6,LSR#10
  771.     MUL     r6,r3,r6
  772.  
  773.     RSB     r3,r3,#256
  774.  
  775. 01
  776.         CMP     r1,#0
  777.         LDMEQFD    r13!,{r4-r12,pc}^
  778.  
  779.         LDR     r7,[r0]
  780.     AND     r8,r7,#31
  781.     MLA     r8,r3,r8,r4
  782.     MOVS    r8,r8,LSR#8        ;r
  783.     MOVLT   r8,#0
  784.     CMP     r8,#31
  785.     MOVGT   r8,#31
  786.     AND     r9,r7,#31<<5
  787.     MOV     r9,r9,LSR#5
  788.     MLA     r9,r3,r9,r5
  789.     MOVS    r9,r9,LSR#8             ;g
  790.     MOVLT   r9,#0
  791.     CMP     r9,#31
  792.     MOVGT   r9,#31
  793.     AND     r10,r7,#31<<10
  794.     MOV     r10,r10,LSR#10
  795.     MLA     r10,r3,r10,r6
  796.     MOVS    r10,r10,LSR#8             ;g
  797.     MOVLT   r1,#0
  798.     CMP     r10,#31
  799.     MOVGT   r10,#31
  800.  
  801.     ORR     r7,r8,r9,LSL#5
  802.     ORR     r7,r7,r10,LSL#10
  803.     STRB    r7,[r0],#1
  804.     MOV     r7,r7,LSR#8
  805.     STRB    r7,[r0],#1
  806.  
  807.         SUBS    r1,r1,#1
  808.     BGT     %BT01
  809.         LDMFD    r13!,{r4-r12,pc}^
  810.  
  811.  
  812.  
  813.  
  814.  
  815. mix_alpha16 ROUT
  816. ;on entry    r0  =  colour1
  817. ;        r1  =  colour2 (dither pattern)
  818. ;        r2  =  mix level (0->colour1, 255->colour2)
  819. ;on exit    r0  =  mixed colour
  820.  
  821.     STMFD    r13!,{r3-r8,r14}
  822.     AND    r3,r0,#31
  823.     AND     r4,r1,#31
  824.     SUB     r5,r4,r3
  825.         MUL     r5,r2,r5
  826.         ADD     r5,r5,r3,LSL#8
  827.     MOVS    r5,r5,ASR#7
  828.     MOVLT   r5,#0
  829.         CMP     r5,#63
  830.         MOVGT   r5,#63
  831.  
  832.     AND    r3,r0,#31<<5
  833.     AND     r4,r1,#31<<5
  834.     MOV     r4,r4,LSR#5
  835.     SUB     r6,r4,r3,LSR#5
  836.         MUL     r6,r2,r6
  837.         ADD     r6,r6,r3,LSL#3
  838.     MOVS    r6,r6,ASR#7
  839.     MOVLT   r6,#0
  840.         CMP     r6,#63
  841.         MOVGT   r6,#63
  842.  
  843.     AND    r3,r0,#31<<10
  844.     AND     r4,r1,#31<<10
  845.     MOV     r4,r4,LSR#10
  846.     SUB     r7,r4,r3,LSR#10
  847.         MUL     r7,r2,r7
  848.         ADD     r7,r7,r3,LSR#2
  849.     MOVS    r7,r7,ASR#7
  850.     MOVLT   r7,#0
  851.         CMP     r7,#63
  852.         MOVGT   r7,#63
  853.  
  854.         ADR     r1,table8_5_error
  855.     LDR     r0,[r1,r5,LSL#2]
  856.     LDR     r2,[r1,r6,LSL#2]
  857.     ORR     r0,r0,r2,LSL#5
  858.     LDR     r2,[r1,r7,LSL#2]
  859.     ORR     r0,r0,r2,LSL#10
  860.     LDMFD    r13!,{r3-r8,pc}^
  861.  
  862.  
  863.  
  864. table8_5_error
  865.        DCD &00000000
  866.        DCD &00010000
  867.        DCD &00010001
  868.        DCD &00020001
  869.        DCD &00020002
  870.        DCD &00030002
  871.        DCD &00030003
  872.        DCD &00040003
  873.        DCD &00040004
  874.        DCD &00050004
  875.        DCD &00050005
  876.        DCD &00060005
  877.        DCD &00060006
  878.        DCD &00070006
  879.        DCD &00070007
  880.        DCD &00080007
  881.        DCD &00080008
  882.        DCD &00090008
  883.        DCD &00090009
  884.        DCD &000A0009
  885.        DCD &000A000A
  886.        DCD &000B000A
  887.        DCD &000B000B
  888.        DCD &000C000B
  889.        DCD &000C000C
  890.        DCD &000D000C
  891.        DCD &000D000D
  892.        DCD &000E000D
  893.        DCD &000E000E
  894.        DCD &000F000E
  895.        DCD &000F000F
  896.        DCD &0010000F
  897.        DCD &00100010
  898.        DCD &00110010
  899.        DCD &00110011
  900.        DCD &00120011
  901.        DCD &00120012
  902.        DCD &00130012
  903.        DCD &00130013
  904.        DCD &00140013
  905.        DCD &00140014
  906.        DCD &00150014
  907.        DCD &00150015
  908.        DCD &00160015
  909.        DCD &00160016
  910.        DCD &00170016
  911.        DCD &00170017
  912.        DCD &00180017
  913.        DCD &00180018
  914.        DCD &00190018
  915.        DCD &00190019
  916.        DCD &001A0019
  917.        DCD &001A001A
  918.        DCD &001B001A
  919.        DCD &001B001B
  920.        DCD &001C001B
  921.        DCD &001C001C
  922.        DCD &001D001C
  923.        DCD &001D001D
  924.        DCD &001E001D
  925.        DCD &001E001E
  926.        DCD &001F001E
  927.        DCD &001F001F
  928.        DCD &001F001F
  929.  
  930.         END
  931.