home *** CD-ROM | disk | FTP | other *** search
/ Dream 44 / Amiga_Dream_44.iso / RiscPc / jeux / biohazard.arc / s / weapon < prev    next >
Text File  |  1994-12-15  |  21KB  |  1,134 lines

  1. ; Use the GET directive to include register definitions as if typed here
  2.  
  3.       KEEP
  4.           GET     h.WolfReg
  5.  
  6. ; Use the GET directive to include a list of SWI names as if typed here
  7.  
  8.           GET     h.SWInames
  9.  
  10. ; Area name C$$code advisable as wanted to link with C output
  11.  
  12.           AREA    |C$$code|, CODE, READONLY
  13.  
  14. ; Export global symbols
  15.  
  16.       EXPORT  |PlotWeapon|
  17.  
  18. ;Plot Sprite
  19. ;
  20. ; on entry :-
  21. ;    r0 = pointer to data block where :-
  22. ;     0 = frame number
  23. ;     1 = left clip value
  24. ;     2 = right clip value (relative to size of sprite)
  25. ;     3 = size of square (height)
  26. ;     4 = increment (16 bit fixed point number)
  27. ;     5 = x position of square centre on screen
  28. ;     6 = screen address
  29. ;     7 = pointer to frame base address
  30. ;     8 = screen width
  31. ;     9 = screen height
  32. ;    10 = y_value
  33. ;       11 = reverse increment (width / 240)
  34.  
  35. |PlotWeapon|
  36.       STMFD   r13!,{r0-r12,link}
  37.  
  38.  
  39.     ;compute base screen address for plot
  40.     LDR   r1,[r0,#32]  ;load screen width
  41.     LDR   r2,[r0,#12]  ;load height
  42.     LDR   r3,[r0,#20]  ;load centre pos
  43.     LDR   r4,[r0,#36]  ;load screen height
  44.     LDR   r14,[r0,#24] ;load screen address
  45.  
  46.     ;clear y_value
  47.     MOV   r5,#0
  48.     STR   r5,[r0,#40]
  49.  
  50.     ;((screen height - (height)/2) * 320)
  51.     MOV   r5,r4,LSR #1
  52.         SUB   r5,r5,r2,LSR #1
  53.  
  54.     MOV   r12,r5,LSL #6    ; * 64
  55.         ADD   r5,r12,r5,LSL #8 ; + (* 256)
  56.  
  57.     ;(screen width + centre pos - (height/2))
  58.     ;SUB   r6,r3,r2,LSR #1
  59.         ;ADD   r6,r6,r1
  60.  
  61.     ;sum results and add to screen base
  62.         ;ADD   r5,r5,r6
  63.     ADD   r5,r5,r14
  64.     STR   r5,[r0,#24]
  65.  
  66.     ;get data from Frame Database
  67.         ; locate frame data in Database
  68.         LDR   r6,[r0,#28]  ;load pointer to database
  69.  
  70.     ;skip the inital 4 words, these are not required
  71.     ADD   r6,r6,#16
  72.  
  73.     ;locate pointer to our frame
  74.     LDR   r7,[r0]      ;load frame number
  75.  
  76.     ;multiply by 4, and add to database pointer
  77.     ADD   r7,r6,r7,LSL #2
  78.  
  79.     ;get the address of the frame data
  80.     LDR   r7,[r7]
  81.     SUB   r6,r6,#16
  82.     ADD   r6,r6,r7 ;add databaase pointer to frame address
  83.  
  84.     ;calculate reverse increment
  85.     LDR   r10,[r0,#44]
  86.  
  87. PlotNextLine
  88.  
  89.     ;load the number of vertical lines to skip
  90.     LDRB  r7,[r6],#1
  91.     CMP   r7,#254
  92.     BEQ   EndPlotSprite
  93.  
  94.     ;compute increment and number of lines to plot
  95.     LDR   r8,[r0,#40]
  96.     LDR   r9,[r0,#16]
  97.     ADD   r11,r8,r9
  98.  
  99.     MOV   r12,r11,LSR #20
  100.     SUBS  r12,r12,r8,LSR #20
  101.     STRNE r12,[r0,#44]
  102.     STRNE r11,[r0,#40]
  103.     MOVNE r11,#1
  104.     STRNE r11,[r0,#48]
  105.     BNE   Skip_Calc
  106.  
  107.     ADD   r11,r11,r9
  108.     MOV   r12,r11,LSR #20
  109.     SUBS  r12,r12,r8,LSR #20
  110.     STRNE r12,[r0,#44]
  111.     STRNE r11,[r0,#40]
  112.     MOVNE r11,#2
  113.     STRNE r11,[r0,#48]
  114.     BNE   Skip_Calc
  115.  
  116.     ADD   r11,r11,r9
  117.     MOV   r12,r11,LSR #20
  118.     SUBS  r12,r12,r8,LSR #20
  119.     STRNE r12,[r0,#44]
  120.     STRNE r11,[r0,#40]
  121.     MOVNE r11,#3
  122.     STRNE r11,[r0,#48]
  123.     BNE   Skip_Calc
  124.  
  125.     ADD   r11,r11,r9
  126.     MOV   r12,r11,LSR #20
  127.     SUBS  r12,r12,r8,LSR #20
  128.     STRNE r12,[r0,#44]
  129.     STRNE r11,[r0,#40]
  130.     MOVNE r11,#4
  131.     STRNE r11,[r0,#48]
  132.     BNE   Skip_Calc
  133.  
  134. Skip_Calc
  135.     ;multiply by reverse increment
  136.     MUL   r7,r10,r7
  137.     MOV   r7,r7,LSR #20
  138.  
  139.     ;multiply by 320
  140.     MOV   r8,r7,LSL #6
  141.     ADD   r7,r8,r7,LSL #8
  142.  
  143.     ;add to base screen address
  144.     ADD   r5,r5,r7
  145.  
  146. NextSegment
  147.     ;load the line length and horizontal skip
  148.     LDRB  r14,[r6],#1 ;line length
  149.     ADD   r14,r14,#1
  150.     LDRB  r9,[r6],#1 ;horizontal skip
  151.     ADD   r9,r9,#1
  152.  
  153.     ;reverse increment = height/128
  154.     ;we treat 'height' as reverse increment wiht 7 bit
  155.         ;fixed point accuracy.
  156.  
  157.     ;multiply horizontal skip by reverse increment to get 'offset'
  158.     ; load increment
  159.     ;LDR   r10,[r0,#16]
  160.     LDR   r2,[r0,#12]
  161.     MUL   r9,r10,r9
  162.     MOV   r9,r9,LSR #20
  163.     SUB   r11,r3,r2,LSR #1 ;centre-(height/2)
  164.     ADD   r9,r9,r11        ;hs + (centre-(height/2))
  165.  
  166.         ;multiply source domain line length by increment to get real
  167.     ;'line length'
  168.     MUL   r8,r10,r14
  169.     MOV   r8,r8,LSR #20
  170.  
  171.     ;load left and right clip values
  172.     LDR   r11,[r0,#4] ;left
  173.     LDR   r12,[r0,#8] ;right
  174.     LDR   r2,[r0,#16]
  175.  
  176.     CMP   r12,r9
  177.     MOVLE r8,#0
  178.     MOVLE r9,#0
  179.     BLE   skip_leftclip_else
  180.     ;if offset < left clip then
  181.     ;  source offset = ((left clip - offset) * reverse increment)
  182.     ;  base screen address += left clip
  183.     ;  line length = (line length - (left clip - offset)
  184.     ;end if
  185.     SUBS  r1,r11,r9 ;left clip - offset
  186.     BMI   skip_leftclip
  187.     ADD   r7,r8,r9
  188.     CMP   r11,r7
  189.     MOVGE r8,#0
  190.     MOVGE r9,#0
  191.     BGE   skip_leftclip_else
  192.     MUL   r4,r2,r1
  193.     MOV   r4,r4,LSR #20 ;((left clip - offset) * increment)
  194.     ADD   r7,r6,r4
  195.  
  196.     ADD   r5,r5,r11 ;base screen address += left clip
  197.     MOV   r9,r11
  198.  
  199.     SUB   r8,r8,r1
  200.     B     skip_leftclip_else
  201.  
  202. skip_leftclip
  203.         ADD   r5,r5,r9 ;base screen address += offset
  204.     MOV   r7,r6
  205.  
  206. skip_leftclip_else
  207.     CMP   r8,#0
  208.     BEQ   skip_reg_load
  209.  
  210.     ;clip right by modifying line length
  211.     ADD   r4,r8,r9
  212.     CMP   r4,r12
  213.     SUBGT r8,r12,r9
  214.  
  215.     ;store registers on stack
  216.     STMFD   r13!,{r0-r12,link}
  217.  
  218.     ;set up registers
  219.     MOV    r4,r7
  220.     MOV     r6,r8
  221.     MOV     r1,r5
  222.  
  223.     LDR     r11,[r0,#48]
  224.     B       PlotLine
  225.  
  226. NextLine
  227.     ;load registers from stack
  228.     LDMFD   r13!,{r0-r12,link}
  229.  
  230. skip_reg_load
  231.     ;modify database pointer to point to end of line block
  232.     ADD     r6,r6,r14
  233.     ;ADD     r6,r6,#1
  234.     LDRB    r7,[r6]
  235.     CMP     r7,#254
  236.     BEQ     Test2EndPlotSprite
  237.  
  238.     CMP     r7,#255
  239.     SUB     r5,r5,r9
  240.     BNE     NextSegment
  241.  
  242.     LDR     r8,[r0,#44]
  243.     CMP     r8,#1
  244.     BEQ     skip_modify_database
  245.  
  246.     ;skip required number of lines through database
  247.     ADD     r6,r6,#1
  248.     SUB     r8,r8,#1
  249.     ADD     r5,r5,#320 ;modify screen address
  250.  
  251. skip_database_line
  252.     ;load vskip
  253.     ADD     r6,r6,#1
  254.  
  255. skip_next_segment
  256.     ;load length
  257.     LDRB    r12,[r6],#1
  258.  
  259.     ;load hskip
  260.     ADD     r6,r6,#2
  261.  
  262.     ADD     r6,r6,r12
  263.  
  264.     LDRB    r7,[r6]
  265.     CMP     r7,#254
  266.     BEQ     TestEndPlotSprite
  267.  
  268.     CMP     r7,#255
  269.     BNE     skip_next_segment
  270.  
  271.     SUBS    r8,r8,#1
  272.     ADD     r6,r6,#1
  273.     BNE     skip_database_line
  274.  
  275.     B       PlotNextLine
  276.  
  277. skip_modify_database
  278.     ;update screen address
  279.     LDR     r8,[r0,#48]
  280.     MOV     r11,r8,LSL #6
  281.     ADD     r8,r11,r8,LSL #8
  282.     ADD     r5,r5,r8
  283.  
  284.     ADD     r6,r6,#1
  285.  
  286.     B       PlotNextLine
  287.  
  288. TestEndPlotSprite
  289.     B       EndPlotSprite
  290.  
  291. Test2EndPlotSprite
  292.     B       EndPlotSprite
  293.  
  294.  
  295. ; line plotter
  296. ;
  297. ; on entry :-
  298. ;    r11 = number of lines to plot
  299. ;    r4 = source base address
  300. ;    r6 = line length
  301. ;       r2 = increment
  302. ;    r1 = screen address
  303.  
  304. PlotLine
  305.  
  306.     ;check for zero length line
  307.     CMP   r6,#0
  308.     BEQ   end_plotOne
  309.  
  310.     ;update y incrememt and calculate number of lines to draw
  311.     CMP   r11,#1
  312.     BEQ   OneLine
  313.     CMP   r11,#2
  314.     BEQ   TwoLine
  315.     CMP   r11,#3
  316.     BEQ   ThreeLine
  317.     B     FourLine
  318.  
  319. ;**********************************
  320. ;
  321. ; One Line draw
  322. ;
  323. ;**********************************
  324. OneLine
  325.     ;find offsets - start & end of line
  326.     AND   r7,r1,#3
  327.     RSB   r7,r7,#4
  328.     AND   r7,r7,#3
  329.  
  330.     ADD   r11,r1,r6
  331.     AND   r11,r11,#3
  332.     MOV   r12,r6
  333.  
  334.     ;plot start pixels
  335.     MOV   r3,#0
  336.     CMP   r7,#0
  337.     BEQ   skip_start_plotOne
  338.  
  339.     LDRB  r10,[r4,r3,LSR #20]
  340.     ADD   r3,r3,r2
  341.     STRB  r10,[r1],#1
  342.     ;check for small pixel line
  343.     SUBS  r12,r12,#1
  344.         BEQ   end_plotOne
  345.     CMP   r7,#1
  346.         BEQ   skip_start_plotOne
  347.  
  348.     LDRB  r10,[r4,r3,LSR #20]
  349.     ADD   r3,r3,r2
  350.     STRB  r10,[r1],#1
  351.     ;check for small pixel line
  352.     SUBS  r12,r12,#1
  353.         BEQ   end_plotOne
  354.     CMP   r7,#2
  355.         BEQ   skip_start_plotOne
  356.  
  357.     LDRB  r10,[r4,r3,LSR #20]
  358.     ADD   r3,r3,r2
  359.     STRB  r10,[r1],#1
  360.     ;check for small pixel line
  361.     SUBS  r12,r12,#1
  362.         BEQ   end_plotOne
  363.  
  364. skip_start_plotOne
  365.     MOV   r12,r6
  366.     ADD   r9,r7,r11
  367.     SUB   r9,r6,r9
  368.     MOV   r9,r9,LSR #2
  369.  
  370.     MOVS  r8,r9,LSR #2
  371.     BEQ   skip_four_word_plotOne
  372.  
  373. four_word_plotOne
  374.     LDRB  r5,[r4,r3,LSR #20]
  375.     ADD   r3,r3,r2
  376.     LDRB  r14,[r4,r3,LSR #20]
  377.     ADD   r3,r3,r2
  378.     ADD   r5,r5,r14,LSL #8
  379.     LDRB  r14,[r4,r3,LSR #20]
  380.     ADD   r3,r3,r2
  381.     ADD   r5,r5,r14,LSL #16
  382.     LDRB  r14,[r4,r3,LSR #20]
  383.     ADD   r3,r3,r2
  384.     ADD   r5,r5,r14,LSL #24
  385.  
  386.     LDRB  r6,[r4,r3,LSR #20]
  387.     ADD   r3,r3,r2
  388.     LDRB  r14,[r4,r3,LSR #20]
  389.     ADD   r3,r3,r2
  390.     ADD   r6,r6,r14,LSL #8
  391.     LDRB  r14,[r4,r3,LSR #20]
  392.     ADD   r3,r3,r2
  393.     ADD   r6,r6,r14,LSL #16
  394.     LDRB  r14,[r4,r3,LSR #20]
  395.     ADD   r3,r3,r2
  396.     ADD   r6,r6,r14,LSL #24
  397.  
  398.     LDRB  r7,[r4,r3,LSR #20]
  399.     ADD   r3,r3,r2
  400.     LDRB  r14,[r4,r3,LSR #20]
  401.     ADD   r3,r3,r2
  402.     ADD   r7,r7,r14,LSL #8
  403.     LDRB  r14,[r4,r3,LSR #20]
  404.     ADD   r3,r3,r2
  405.     ADD   r7,r7,r14,LSL #16
  406.     LDRB  r14,[r4,r3,LSR #20]
  407.     ADD   r3,r3,r2
  408.     ADD   r7,r7,r14,LSL #24
  409.  
  410.     LDRB  r8,[r4,r3,LSR #20]
  411.     ADD   r3,r3,r2
  412.     LDRB  r14,[r4,r3,LSR #20]
  413.     ADD   r3,r3,r2
  414.     ADD   r8,r8,r14,LSL #8
  415.     LDRB  r14,[r4,r3,LSR #20]
  416.     ADD   r3,r3,r2
  417.     ADD   r8,r8,r14,LSL #16
  418.     LDRB  r14,[r4,r3,LSR #20]
  419.     ADD   r3,r3,r2
  420.     ADD   r8,r8,r14,LSL #24
  421.  
  422.     STMIA r1!,{r5-r8}
  423.     SUB   r9,r9,#4
  424.         MOVS  r8,r9,LSR #2
  425.     BNE   four_word_plotOne
  426.  
  427. skip_four_word_plotOne
  428.     ANDS  r8,r9,#2
  429.     BEQ   skip_two_word_plotOne
  430.  
  431.     ;two word plot
  432.     LDRB  r7,[r4,r3,LSR #20]
  433.     ADD   r3,r3,r2
  434.     LDRB  r14,[r4,r3,LSR #20]
  435.     ADD   r3,r3,r2
  436.     ADD   r7,r7,r14,LSL #8
  437.     LDRB  r14,[r4,r3,LSR #20]
  438.     ADD   r3,r3,r2
  439.     ADD   r7,r7,r14,LSL #16
  440.     LDRB  r14,[r4,r3,LSR #20]
  441.     ADD   r3,r3,r2
  442.     ADD   r7,r7,r14,LSL #24
  443.  
  444.     LDRB  r8,[r4,r3,LSR #20]
  445.     ADD   r3,r3,r2
  446.     LDRB  r14,[r4,r3,LSR #20]
  447.     ADD   r3,r3,r2
  448.     ADD   r8,r8,r14,LSL #8
  449.     LDRB  r14,[r4,r3,LSR #20]
  450.     ADD   r3,r3,r2
  451.     ADD   r8,r8,r14,LSL #16
  452.     LDRB  r14,[r4,r3,LSR #20]
  453.     ADD   r3,r3,r2
  454.     ADD   r8,r8,r14,LSL #24
  455.  
  456.     STMIA r1!,{r7-r8}
  457.     SUB   r9,r9,#2
  458.  
  459. skip_two_word_plotOne
  460.     ANDS  r8,r9,#1
  461.     BEQ   skip_one_word_plotOne
  462.  
  463.     ;one word plot
  464.     LDRB  r8,[r4,r3,LSR #20]
  465.     ADD   r3,r3,r2
  466.     LDRB  r14,[r4,r3,LSR #20]
  467.     ADD   r3,r3,r2
  468.     ADD   r8,r8,r14,LSL #8
  469.     LDRB  r14,[r4,r3,LSR #20]
  470.     ADD   r3,r3,r2
  471.     ADD   r8,r8,r14,LSL #16
  472.     LDRB  r14,[r4,r3,LSR #20]
  473.     ADD   r3,r3,r2
  474.     ADD   r8,r8,r14,LSL #24
  475.  
  476.     STR   r8,[r1],#4
  477.  
  478. skip_one_word_plotOne
  479.     ;plot_end_pixels
  480.     CMP   r11,#0
  481.     BEQ   end_plotOne
  482.  
  483.     LDRB  r10,[r4,r3,LSR #20]
  484.     ADD   r3,r3,r2
  485.     STRB  r10,[r1],#1
  486.     ;check for small pixel line
  487.     SUBS  r12,r12,#1
  488.         BEQ   end_plotOne
  489.     CMP   r11,#1
  490.         BEQ   end_plotOne
  491.  
  492.     LDRB  r10,[r4,r3,LSR #20]
  493.     ADD   r3,r3,r2
  494.     STRB  r10,[r1],#1
  495.     ;check for small pixel line
  496.     SUBS  r12,r12,#1
  497.         BEQ   end_plotOne
  498.     CMP   r11,#2
  499.         BEQ   end_plotOne
  500.  
  501.     LDRB  r10,[r4,r3,LSR #20]
  502.     ADD   r3,r3,r2
  503.     STRB  r10,[r1],#1
  504.     ;check for small pixel line
  505.     SUBS  r12,r12,#1
  506.         BEQ   end_plotOne
  507.  
  508. end_plotOne
  509.     B     NextLine
  510.  
  511. ;**********************************
  512. ;
  513. ; Two Line draw
  514. ;
  515. ;**********************************
  516. TwoLine
  517.     ;find offsets - start & end of line
  518.     AND   r7,r1,#3
  519.     RSB   r7,r7,#4
  520.     AND   r7,r7,#3
  521.  
  522.     ADD   r11,r1,r6
  523.     AND   r11,r11,#3
  524.  
  525.     ;plot start pixels
  526.     MOV   r3,#0
  527.     CMP   r7,#0
  528.     BEQ   skip_start_plotTwo
  529.  
  530.     LDRB  r10,[r4,r3,LSR #20]
  531.     ADD   r3,r3,r2
  532.     STRB  r10,[r1,#320]
  533.     STRB  r10,[r1],#1
  534.     ;check for 1 pixel line
  535.     CMP   r6,#1
  536.         BEQ   end_plotTwo
  537.     CMP   r7,#1
  538.         BEQ   skip_start_plotTwo
  539.  
  540.     LDRB  r10,[r4,r3,LSR #20]
  541.     ADD   r3,r3,r2
  542.     STRB  r10,[r1,#320]
  543.     STRB  r10,[r1],#1
  544.     ;check for 2 pixel line
  545.     CMP   r6,#2
  546.         BEQ   end_plotTwo
  547.     CMP   r7,#2
  548.         BEQ   skip_start_plotTwo
  549.  
  550.     LDRB  r10,[r4,r3,LSR #20]
  551.     ADD   r3,r3,r2
  552.     STRB  r10,[r1,#320]
  553.     STRB  r10,[r1],#1
  554.     ;check for 3 pixel line
  555.     CMP   r6,#3
  556.         BEQ   end_plotTwo
  557.  
  558. skip_start_plotTwo
  559.     ADD   r9,r7,r11
  560.     SUB   r9,r6,r9
  561.     MOV   r9,r9,LSR #2
  562.  
  563.     MOVS  r8,r9,LSR #2
  564.     BEQ   skip_four_word_plotTwo
  565.  
  566. four_word_plotTwo
  567.     LDRB  r5,[r4,r3,LSR #20]
  568.     ADD   r3,r3,r2
  569.     LDRB  r14,[r4,r3,LSR #20]
  570.     ADD   r3,r3,r2
  571.     ADD   r5,r5,r14,LSL #8
  572.     LDRB  r14,[r4,r3,LSR #20]
  573.     ADD   r3,r3,r2
  574.     ADD   r5,r5,r14,LSL #16
  575.     LDRB  r14,[r4,r3,LSR #20]
  576.     ADD   r3,r3,r2
  577.     ADD   r5,r5,r14,LSL #24
  578.  
  579.     LDRB  r6,[r4,r3,LSR #20]
  580.     ADD   r3,r3,r2
  581.     LDRB  r14,[r4,r3,LSR #20]
  582.     ADD   r3,r3,r2
  583.     ADD   r6,r6,r14,LSL #8
  584.     LDRB  r14,[r4,r3,LSR #20]
  585.     ADD   r3,r3,r2
  586.     ADD   r6,r6,r14,LSL #16
  587.     LDRB  r14,[r4,r3,LSR #20]
  588.     ADD   r3,r3,r2
  589.     ADD   r6,r6,r14,LSL #24
  590.  
  591.     LDRB  r7,[r4,r3,LSR #20]
  592.     ADD   r3,r3,r2
  593.     LDRB  r14,[r4,r3,LSR #20]
  594.     ADD   r3,r3,r2
  595.     ADD   r7,r7,r14,LSL #8
  596.     LDRB  r14,[r4,r3,LSR #20]
  597.     ADD   r3,r3,r2
  598.     ADD   r7,r7,r14,LSL #16
  599.     LDRB  r14,[r4,r3,LSR #20]
  600.     ADD   r3,r3,r2
  601.     ADD   r7,r7,r14,LSL #24
  602.  
  603.     LDRB  r8,[r4,r3,LSR #20]
  604.     ADD   r3,r3,r2
  605.     LDRB  r14,[r4,r3,LSR #20]
  606.     ADD   r3,r3,r2
  607.     ADD   r8,r8,r14,LSL #8
  608.     LDRB  r14,[r4,r3,LSR #20]
  609.     ADD   r3,r3,r2
  610.     ADD   r8,r8,r14,LSL #16
  611.     LDRB  r14,[r4,r3,LSR #20]
  612.     ADD   r3,r3,r2
  613.     ADD   r8,r8,r14,LSL #24
  614.  
  615.     ADD   r1,r1,#320
  616.     STMIA r1,{r5-r8}
  617.     SUB   r1,r1,#320
  618.     STMIA r1!,{r5-r8}
  619.     SUB   r9,r9,#4
  620.         MOVS  r8,r9,LSR #2
  621.     BNE   four_word_plotTwo
  622.  
  623. skip_four_word_plotTwo
  624.     ANDS  r8,r9,#2
  625.     BEQ   skip_two_word_plotTwo
  626.  
  627.     ;two word plot
  628.     LDRB  r7,[r4,r3,LSR #20]
  629.     ADD   r3,r3,r2
  630.     LDRB  r14,[r4,r3,LSR #20]
  631.     ADD   r3,r3,r2
  632.     ADD   r7,r7,r14,LSL #8
  633.     LDRB  r14,[r4,r3,LSR #20]
  634.     ADD   r3,r3,r2
  635.     ADD   r7,r7,r14,LSL #16
  636.     LDRB  r14,[r4,r3,LSR #20]
  637.     ADD   r3,r3,r2
  638.     ADD   r7,r7,r14,LSL #24
  639.  
  640.     LDRB  r8,[r4,r3,LSR #20]
  641.     ADD   r3,r3,r2
  642.     LDRB  r14,[r4,r3,LSR #20]
  643.     ADD   r3,r3,r2
  644.     ADD   r8,r8,r14,LSL #8
  645.     LDRB  r14,[r4,r3,LSR #20]
  646.     ADD   r3,r3,r2
  647.     ADD   r8,r8,r14,LSL #16
  648.     LDRB  r14,[r4,r3,LSR #20]
  649.     ADD   r3,r3,r2
  650.     ADD   r8,r8,r14,LSL #24
  651.  
  652.     ADD   r1,r1,#320
  653.     STMIA r1,{r7-r8}
  654.     SUB   r1,r1,#320
  655.     STMIA r1!,{r7-r8}
  656.     SUB   r9,r9,#2
  657.  
  658. skip_two_word_plotTwo
  659.     ANDS  r8,r9,#1
  660.     BEQ   skip_one_word_plotTwo
  661.  
  662.     ;one word plot
  663.     LDRB  r8,[r4,r3,LSR #20]
  664.     ADD   r3,r3,r2
  665.     LDRB  r14,[r4,r3,LSR #20]
  666.     ADD   r3,r3,r2
  667.     ADD   r8,r8,r14,LSL #8
  668.     LDRB  r14,[r4,r3,LSR #20]
  669.     ADD   r3,r3,r2
  670.     ADD   r8,r8,r14,LSL #16
  671.     LDRB  r14,[r4,r3,LSR #20]
  672.     ADD   r3,r3,r2
  673.     ADD   r8,r8,r14,LSL #24
  674.  
  675.     STR   r8,[r1,#320]
  676.     STR   r8,[r1],#4
  677.  
  678. skip_one_word_plotTwo
  679.     ;plot_end_pixels
  680.     CMP   r11,#0
  681.     BEQ   end_plotTwo
  682.  
  683.     LDRB  r10,[r4,r3,LSR #20]
  684.     ADD   r3,r3,r2
  685.     STRB  r10,[r1,#320]
  686.     STRB  r10,[r1],#1
  687.     CMP   r11,#1
  688.         BEQ   end_plotTwo
  689.  
  690.     LDRB  r10,[r4,r3,LSR #20]
  691.     ADD   r3,r3,r2
  692.     STRB  r10,[r1,#320]
  693.     STRB  r10,[r1],#1
  694.     CMP   r11,#2
  695.         BEQ   end_plotTwo
  696.  
  697.     LDRB  r10,[r4,r3,LSR #20]
  698.     ADD   r3,r3,r2
  699.     STRB  r10,[r1,#320]
  700.     STRB  r10,[r1],#1
  701.  
  702. end_plotTwo
  703.     B     NextLine
  704.  
  705.  
  706. ;**********************************
  707. ;
  708. ; Three Line draw
  709. ;
  710. ;**********************************
  711. ThreeLine
  712.     ;find offsets - start & end of line
  713.     AND   r7,r1,#3
  714.     RSB   r7,r7,#4
  715.     AND   r7,r7,#3
  716.  
  717.     ADD   r11,r1,r6
  718.     AND   r11,r11,#3
  719.  
  720.     ;plot start pixels
  721.     MOV   r3,#0
  722.     CMP   r7,#0
  723.     BEQ   skip_start_plotThree
  724.  
  725.     LDRB  r10,[r4,r3,LSR #20]
  726.     ADD   r3,r3,r2
  727.     STRB  r10,[r1,#640]
  728.     STRB  r10,[r1,#320]
  729.     STRB  r10,[r1],#1
  730.     ;check for 1 pixel line
  731.     CMP   r6,#1
  732.         BEQ   end_plotTwo
  733.     CMP   r7,#1
  734.         BEQ   skip_start_plotThree
  735.  
  736.     LDRB  r10,[r4,r3,LSR #20]
  737.     ADD   r3,r3,r2
  738.     STRB  r10,[r1,#640]
  739.     STRB  r10,[r1,#320]
  740.     STRB  r10,[r1],#1
  741.     ;check for 2 pixel line
  742.     CMP   r6,#2
  743.         BEQ   end_plotTwo
  744.     CMP   r7,#2
  745.         BEQ   skip_start_plotThree
  746.  
  747.     LDRB  r10,[r4,r3,LSR #20]
  748.     ADD   r3,r3,r2
  749.     STRB  r10,[r1,#640]
  750.     STRB  r10,[r1,#320]
  751.     STRB  r10,[r1],#1
  752.     ;check for 3 pixel line
  753.     CMP   r6,#3
  754.         BEQ   end_plotTwo
  755.  
  756. skip_start_plotThree
  757.     ADD   r9,r7,r11
  758.     SUB   r9,r6,r9
  759.     MOV   r9,r9,LSR #2
  760.  
  761.     MOVS  r8,r9,LSR #2
  762.     BEQ   skip_four_word_plotThree
  763.  
  764. four_word_plotThree
  765.     LDRB  r5,[r4,r3,LSR #20]
  766.     ADD   r3,r3,r2
  767.     LDRB  r14,[r4,r3,LSR #20]
  768.     ADD   r3,r3,r2
  769.     ADD   r5,r5,r14,LSL #8
  770.     LDRB  r14,[r4,r3,LSR #20]
  771.     ADD   r3,r3,r2
  772.     ADD   r5,r5,r14,LSL #16
  773.     LDRB  r14,[r4,r3,LSR #20]
  774.     ADD   r3,r3,r2
  775.     ADD   r5,r5,r14,LSL #24
  776.  
  777.     LDRB  r6,[r4,r3,LSR #20]
  778.     ADD   r3,r3,r2
  779.     LDRB  r14,[r4,r3,LSR #20]
  780.     ADD   r3,r3,r2
  781.     ADD   r6,r6,r14,LSL #8
  782.     LDRB  r14,[r4,r3,LSR #20]
  783.     ADD   r3,r3,r2
  784.     ADD   r6,r6,r14,LSL #16
  785.     LDRB  r14,[r4,r3,LSR #20]
  786.     ADD   r3,r3,r2
  787.     ADD   r6,r6,r14,LSL #24
  788.  
  789.     LDRB  r7,[r4,r3,LSR #20]
  790.     ADD   r3,r3,r2
  791.     LDRB  r14,[r4,r3,LSR #20]
  792.     ADD   r3,r3,r2
  793.     ADD   r7,r7,r14,LSL #8
  794.     LDRB  r14,[r4,r3,LSR #20]
  795.     ADD   r3,r3,r2
  796.     ADD   r7,r7,r14,LSL #16
  797.     LDRB  r14,[r4,r3,LSR #20]
  798.     ADD   r3,r3,r2
  799.     ADD   r7,r7,r14,LSL #24
  800.  
  801.     LDRB  r8,[r4,r3,LSR #20]
  802.     ADD   r3,r3,r2
  803.     LDRB  r14,[r4,r3,LSR #20]
  804.     ADD   r3,r3,r2
  805.     ADD   r8,r8,r14,LSL #8
  806.     LDRB  r14,[r4,r3,LSR #20]
  807.     ADD   r3,r3,r2
  808.     ADD   r8,r8,r14,LSL #16
  809.     LDRB  r14,[r4,r3,LSR #20]
  810.     ADD   r3,r3,r2
  811.     ADD   r8,r8,r14,LSL #24
  812.  
  813.     ADD   r1,r1,#320
  814.     STMIA r1,{r5-r8}
  815.     ADD   r1,r1,#320
  816.     STMIA r1,{r5-r8}
  817.     SUB   r1,r1,#640
  818.     STMIA r1!,{r5-r8}
  819.     SUB   r9,r9,#4
  820.         MOVS  r8,r9,LSR #2
  821.     BNE   four_word_plotThree
  822.  
  823. skip_four_word_plotThree
  824.     ANDS  r8,r9,#2
  825.     BEQ   skip_two_word_plotThree
  826.  
  827.     ;two word plot
  828.     LDRB  r7,[r4,r3,LSR #20]
  829.     ADD   r3,r3,r2
  830.     LDRB  r14,[r4,r3,LSR #20]
  831.     ADD   r3,r3,r2
  832.     ADD   r7,r7,r14,LSL #8
  833.     LDRB  r14,[r4,r3,LSR #20]
  834.     ADD   r3,r3,r2
  835.     ADD   r7,r7,r14,LSL #16
  836.     LDRB  r14,[r4,r3,LSR #20]
  837.     ADD   r3,r3,r2
  838.     ADD   r7,r7,r14,LSL #24
  839.  
  840.     LDRB  r8,[r4,r3,LSR #20]
  841.     ADD   r3,r3,r2
  842.     LDRB  r14,[r4,r3,LSR #20]
  843.     ADD   r3,r3,r2
  844.     ADD   r8,r8,r14,LSL #8
  845.     LDRB  r14,[r4,r3,LSR #20]
  846.     ADD   r3,r3,r2
  847.     ADD   r8,r8,r14,LSL #16
  848.     LDRB  r14,[r4,r3,LSR #20]
  849.     ADD   r3,r3,r2
  850.     ADD   r8,r8,r14,LSL #24
  851.  
  852.     ADD   r1,r1,#320
  853.     STMIA r1,{r7-r8}
  854.     ADD   r1,r1,#320
  855.     STMIA r1,{r7-r8}
  856.     SUB   r1,r1,#640
  857.     STMIA r1!,{r7-r8}
  858.     SUB   r9,r9,#2
  859.  
  860. skip_two_word_plotThree
  861.     ANDS  r8,r9,#1
  862.     BEQ   skip_one_word_plotThree
  863.  
  864.     ;one word plot
  865.     LDRB  r8,[r4,r3,LSR #20]
  866.     ADD   r3,r3,r2
  867.     LDRB  r14,[r4,r3,LSR #20]
  868.     ADD   r3,r3,r2
  869.     ADD   r8,r8,r14,LSL #8
  870.     LDRB  r14,[r4,r3,LSR #20]
  871.     ADD   r3,r3,r2
  872.     ADD   r8,r8,r14,LSL #16
  873.     LDRB  r14,[r4,r3,LSR #20]
  874.     ADD   r3,r3,r2
  875.     ADD   r8,r8,r14,LSL #24
  876.  
  877.     STR   r8,[r1,#640]
  878.     STR   r8,[r1,#320]
  879.     STR   r8,[r1],#4
  880.  
  881. skip_one_word_plotThree
  882.     ;plot_end_pixels
  883.     CMP   r11,#0
  884.     BEQ   end_plotThree
  885.  
  886.     LDRB  r10,[r4,r3,LSR #20]
  887.     ADD   r3,r3,r2
  888.     STRB  r10,[r1,#320]
  889.     STRB  r10,[r1,#640]
  890.     STRB  r10,[r1],#1
  891.     CMP   r11,#1
  892.         BEQ   end_plotThree
  893.  
  894.     LDRB  r10,[r4,r3,LSR #20]
  895.     ADD   r3,r3,r2
  896.     STRB  r10,[r1,#640]
  897.     STRB  r10,[r1,#320]
  898.     STRB  r10,[r1],#1
  899.     CMP   r11,#2
  900.         BEQ   end_plotThree
  901.  
  902.     LDRB  r10,[r4,r3,LSR #20]
  903.     ADD   r3,r3,r2
  904.     STRB  r10,[r1,#640]
  905.     STRB  r10,[r1,#320]
  906.     STRB  r10,[r1],#1
  907.  
  908. end_plotThree
  909.     B     NextLine
  910.  
  911. ;**********************************
  912. ;
  913. ; Four Line draw
  914. ;
  915. ;**********************************
  916. FourLine
  917.     ;find offsets - start & end of line
  918.     AND   r7,r1,#3
  919.     RSB   r7,r7,#4
  920.     AND   r7,r7,#3
  921.  
  922.     ADD   r11,r1,r6
  923.     AND   r11,r11,#3
  924.  
  925.     ;plot start pixels
  926.     MOV   r3,#0
  927.     CMP   r7,#0
  928.     BEQ   skip_start_plotFour
  929.  
  930.     LDRB  r10,[r4,r3,LSR #20]
  931.     ADD   r3,r3,r2
  932.     STRB  r10,[r1,#960]
  933.     STRB  r10,[r1,#640]
  934.     STRB  r10,[r1,#320]
  935.     STRB  r10,[r1],#1
  936.     ;check for 1 pixel line
  937.     CMP   r6,#1
  938.         BEQ   end_plotFour
  939.     CMP   r7,#1
  940.         BEQ   skip_start_plotFour
  941.  
  942.     LDRB  r10,[r4,r3,LSR #20]
  943.     ADD   r3,r3,r2
  944.     STRB  r10,[r1,#960]
  945.     STRB  r10,[r1,#640]
  946.     STRB  r10,[r1,#320]
  947.     STRB  r10,[r1],#1
  948.     ;check for 2 pixel line
  949.     CMP   r6,#2
  950.         BEQ   end_plotFour
  951.     CMP   r7,#2
  952.         BEQ   skip_start_plotFour
  953.  
  954.     LDRB  r10,[r4,r3,LSR #20]
  955.     ADD   r3,r3,r2
  956.     STRB  r10,[r1,#960]
  957.     STRB  r10,[r1,#640]
  958.     STRB  r10,[r1,#320]
  959.     STRB  r10,[r1],#1
  960.     ;check for 3 pixel line
  961.     CMP   r6,#3
  962.         BEQ   end_plotFour
  963.  
  964. skip_start_plotFour
  965.     ADD   r9,r7,r11
  966.     SUB   r9,r6,r9
  967.     MOV   r9,r9,LSR #2
  968.  
  969.     MOVS  r8,r9,LSR #2
  970.     BEQ   skip_four_word_plotFour
  971.  
  972. four_word_plotFour
  973.     LDRB  r5,[r4,r3,LSR #20]
  974.     ADD   r3,r3,r2
  975.     LDRB  r14,[r4,r3,LSR #20]
  976.     ADD   r3,r3,r2
  977.     ADD   r5,r5,r14,LSL #8
  978.     LDRB  r14,[r4,r3,LSR #20]
  979.     ADD   r3,r3,r2
  980.     ADD   r5,r5,r14,LSL #16
  981.     LDRB  r14,[r4,r3,LSR #20]
  982.     ADD   r3,r3,r2
  983.     ADD   r5,r5,r14,LSL #24
  984.  
  985.     LDRB  r6,[r4,r3,LSR #20]
  986.     ADD   r3,r3,r2
  987.     LDRB  r14,[r4,r3,LSR #20]
  988.     ADD   r3,r3,r2
  989.     ADD   r6,r6,r14,LSL #8
  990.     LDRB  r14,[r4,r3,LSR #20]
  991.     ADD   r3,r3,r2
  992.     ADD   r6,r6,r14,LSL #16
  993.     LDRB  r14,[r4,r3,LSR #20]
  994.     ADD   r3,r3,r2
  995.     ADD   r6,r6,r14,LSL #24
  996.  
  997.     LDRB  r7,[r4,r3,LSR #20]
  998.     ADD   r3,r3,r2
  999.     LDRB  r14,[r4,r3,LSR #20]
  1000.     ADD   r3,r3,r2
  1001.     ADD   r7,r7,r14,LSL #8
  1002.     LDRB  r14,[r4,r3,LSR #20]
  1003.     ADD   r3,r3,r2
  1004.     ADD   r7,r7,r14,LSL #16
  1005.     LDRB  r14,[r4,r3,LSR #20]
  1006.     ADD   r3,r3,r2
  1007.     ADD   r7,r7,r14,LSL #24
  1008.  
  1009.     LDRB  r8,[r4,r3,LSR #20]
  1010.     ADD   r3,r3,r2
  1011.     LDRB  r14,[r4,r3,LSR #20]
  1012.     ADD   r3,r3,r2
  1013.     ADD   r8,r8,r14,LSL #8
  1014.     LDRB  r14,[r4,r3,LSR #20]
  1015.     ADD   r3,r3,r2
  1016.     ADD   r8,r8,r14,LSL #16
  1017.     LDRB  r14,[r4,r3,LSR #20]
  1018.     ADD   r3,r3,r2
  1019.     ADD   r8,r8,r14,LSL #24
  1020.  
  1021.     ADD   r1,r1,#320
  1022.     STMIA r1,{r5-r8}
  1023.     ADD   r1,r1,#320
  1024.     STMIA r1,{r5-r8}
  1025.     ADD   r1,r1,#320
  1026.     STMIA r1,{r5-r8}
  1027.     SUB   r1,r1,#960
  1028.     STMIA r1!,{r5-r8}
  1029.     SUB   r9,r9,#4
  1030.         MOVS  r8,r9,LSR #2
  1031.     BNE   four_word_plotFour
  1032.  
  1033. skip_four_word_plotFour
  1034.     ANDS  r8,r9,#2
  1035.     BEQ   skip_two_word_plotFour
  1036.  
  1037.     ;two word plot
  1038.     LDRB  r7,[r4,r3,LSR #20]
  1039.     ADD   r3,r3,r2
  1040.     LDRB  r14,[r4,r3,LSR #20]
  1041.     ADD   r3,r3,r2
  1042.     ADD   r7,r7,r14,LSL #8
  1043.     LDRB  r14,[r4,r3,LSR #20]
  1044.     ADD   r3,r3,r2
  1045.     ADD   r7,r7,r14,LSL #16
  1046.     LDRB  r14,[r4,r3,LSR #20]
  1047.     ADD   r3,r3,r2
  1048.     ADD   r7,r7,r14,LSL #24
  1049.  
  1050.     LDRB  r8,[r4,r3,LSR #20]
  1051.     ADD   r3,r3,r2
  1052.     LDRB  r14,[r4,r3,LSR #20]
  1053.     ADD   r3,r3,r2
  1054.     ADD   r8,r8,r14,LSL #8
  1055.     LDRB  r14,[r4,r3,LSR #20]
  1056.     ADD   r3,r3,r2
  1057.     ADD   r8,r8,r14,LSL #16
  1058.     LDRB  r14,[r4,r3,LSR #20]
  1059.     ADD   r3,r3,r2
  1060.     ADD   r8,r8,r14,LSL #24
  1061.  
  1062.     ADD   r1,r1,#320
  1063.     STMIA r1,{r7-r8}
  1064.     ADD   r1,r1,#320
  1065.     STMIA r1,{r7-r8}
  1066.     ADD   r1,r1,#320
  1067.     STMIA r1,{r7-r8}
  1068.     SUB   r1,r1,#960
  1069.     STMIA r1!,{r7-r8}
  1070.     SUB   r9,r9,#2
  1071.  
  1072. skip_two_word_plotFour
  1073.     ANDS  r8,r9,#1
  1074.     BEQ   skip_one_word_plotFour
  1075.  
  1076.     ;one word plot
  1077.     LDRB  r8,[r4,r3,LSR #20]
  1078.     ADD   r3,r3,r2
  1079.     LDRB  r14,[r4,r3,LSR #20]
  1080.     ADD   r3,r3,r2
  1081.     ADD   r8,r8,r14,LSL #8
  1082.     LDRB  r14,[r4,r3,LSR #20]
  1083.     ADD   r3,r3,r2
  1084.     ADD   r8,r8,r14,LSL #16
  1085.     LDRB  r14,[r4,r3,LSR #20]
  1086.     ADD   r3,r3,r2
  1087.     ADD   r8,r8,r14,LSL #24
  1088.  
  1089.     STR   r8,[r1,#960]
  1090.     STR   r8,[r1,#640]
  1091.     STR   r8,[r1,#320]
  1092.     STR   r8,[r1],#4
  1093.  
  1094. skip_one_word_plotFour
  1095.     ;plot_end_pixels
  1096.     CMP   r11,#0
  1097.     BEQ   end_plotFour
  1098.  
  1099.     LDRB  r10,[r4,r3,LSR #20]
  1100.     ADD   r3,r3,r2
  1101.     STRB  r10,[r1,#960]
  1102.     STRB  r10,[r1,#320]
  1103.     STRB  r10,[r1,#640]
  1104.     STRB  r10,[r1],#1
  1105.     CMP   r11,#1
  1106.         BEQ   end_plotFour
  1107.  
  1108.     LDRB  r10,[r4,r3,LSR #20]
  1109.     ADD   r3,r3,r2
  1110.     STRB  r10,[r1,#960]
  1111.     STRB  r10,[r1,#640]
  1112.     STRB  r10,[r1,#320]
  1113.     STRB  r10,[r1],#1
  1114.     CMP   r11,#2
  1115.         BEQ   end_plotFour
  1116.  
  1117.     LDRB  r10,[r4,r3,LSR #20]
  1118.     ADD   r3,r3,r2
  1119.     STRB  r10,[r1,#960]
  1120.     STRB  r10,[r1,#640]
  1121.     STRB  r10,[r1,#320]
  1122.     STRB  r10,[r1],#1
  1123.  
  1124. end_plotFour
  1125.     B     NextLine
  1126.  
  1127.  
  1128.  
  1129.  
  1130. EndPlotSprite
  1131.         LDMFD   r13!,{r0-r12,pc}
  1132.  
  1133.     END
  1134.