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