home *** CD-ROM | disk | FTP | other *** search
/ Dream 44 / Amiga_Dream_44.iso / RiscPc / jeux / biohazard.arc / s / AffLine1 < prev    next >
Text File  |  1994-05-30  |  21KB  |  810 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.           IMPORT  |x$stack_overflow|
  17.        EXPORT  |DrawScaledLine|
  18.        EXPORT  |LowDetailLine|
  19.         EXPORT  |MegaLowDetailLine|
  20.         EXPORT  |ExtraMegaLowDetailLine|
  21.         EXPORT  |SuperExtraMegaLowDetailLine|
  22.        EXPORT  |RedrawScreen|
  23.        EXPORT  |BigRedrawScreen|
  24.  
  25. DSLineX   DCB     "DrawScaledLine", 0
  26.           ALIGN
  27. DSLineY   DCD     &ff000000 + DSLineY - DSLineX
  28.  
  29. ;scale line of graphics block to height value.
  30. ;on entry -
  31. ;           r0 = pointer to Plot_Block where :-
  32. ;         0 = pointer to block_data
  33. ;            1 = initial_x_intercept
  34. ;            2 = height
  35. ;            3 = screen_address
  36. ;         4 = pointer to div_table
  37. ;         5 = quadrant
  38. ;            6 = Players
  39.  
  40. |DrawScaledLine|
  41.       STMFD   r13!,{r0-r12,link}
  42.  
  43.       LDMIA   r0,{r0-r6}
  44.  
  45.       ;validate height
  46.       CMP     r2,#1
  47.       BLE     EndLDLine
  48.       CMP     r2,#5120
  49.       MOVGE   r2,#5120
  50.  
  51.       ;set max height according to players
  52.       CMP     r6,#0
  53.       MOV     r12,#254
  54.       MOVNE   r12,#126
  55.  
  56.       ;compute pointer to graphical data
  57.       AND     r7,r1,#63
  58.       ADD     r0,r0,r7,LSL #6
  59.  
  60.       ;get gradient
  61.       LDR     r4,[r4,r2,LSL #2]
  62.       MOV     r4,r4,LSL #6    ;multiply by 64*2 (side length)
  63.       MOV     r7,#0           ;clear gradient counter
  64.       ;move to correct screen position
  65.       CMP     r2,r12          ;max height value
  66.       BGT     DSclipheight    ;if height larger than screen height
  67.       RSB     r5,r2,r12       ;find height difference
  68.       MOV     r5,r5,LSR #1    ;divide by 2 for upper & lower limits
  69.       MOV     r6,r5,LSL #8    ;multiply by 320 ((r5*256)+(r5*64))
  70.       ADD     r5,r6,r5,LSL #6
  71.       ADD     r3,r3,r5
  72.  
  73. DSloop    LDRB    r6,[r0,r7,ASR #20]
  74.       STRB    r6,[r3],#320
  75.       ADD     r7,r7,r4              ;increment gradient
  76.       SUBS    r2,r2,#1
  77.       BEQ     EndDSLine
  78.       LDRB    r6,[r0,r7,ASR #20]
  79.        STRB    r6,[r3],#320
  80.       ADD     r7,r7,r4              ;increment gradient
  81.       SUBS    r2,r2,#1
  82.       BEQ     EndDSLine
  83.       LDRB    r6,[r0,r7,ASR #20]
  84.        STRB    r6,[r3],#320
  85.       ADD     r7,r7,r4              ;increment gradient
  86.       SUBS    r2,r2,#1
  87.       BEQ     EndDSLine
  88.       LDRB    r6,[r0,r7,ASR #20]
  89.       STRB    r6,[r3],#320
  90.       ADD     r7,r7,r4              ;increment gradient
  91.       SUBS    r2,r2,#1
  92.       BEQ     EndDSLine
  93.       LDRB    r6,[r0,r7,ASR #20]
  94.       STRB    r6,[r3],#320
  95.       ADD     r7,r7,r4              ;increment gradient
  96.       SUBS    r2,r2,#1
  97.       BEQ     EndDSLine
  98.       LDRB    r6,[r0,r7,ASR #20]
  99.       STRB    r6,[r3],#320
  100.       ADD     r7,r7,r4              ;increment gradient
  101.       SUBS    r2,r2,#1
  102.       BEQ     EndDSLine
  103.       LDRB    r6,[r0,r7,ASR #20]
  104.       STRB    r6,[r3],#320
  105.       ADD     r7,r7,r4              ;increment gradient
  106.       SUBS    r2,r2,#1
  107.       BEQ     EndDSLine
  108.       LDRB    r6,[r0,r7,ASR #20]
  109.        STRB    r6,[r3],#320
  110.       ADD     r7,r7,r4              ;increment gradient
  111.       SUBS    r2,r2,#1
  112.       BEQ     EndDSLine
  113.       LDRB    r6,[r0,r7,ASR #20]
  114.       STRB    r6,[r3],#320
  115.       ADD     r7,r7,r4              ;increment gradient
  116.       SUBS    r2,r2,#1
  117.       BNE     DSloop
  118.  
  119. EndDSLine
  120.           LDMFD   r13!,{r0-r12,pc}
  121.  
  122. DSclipheight
  123.           SUB     r10,r2,r12
  124.           MOV     r10,r10,LSR #1    ;find height difference
  125.           MUL     r7,r10,r4         ;multiply the gradient by the height diff
  126.           MOV     r2,r12
  127.           B       DSloop
  128.  
  129. LDLineX   DCB     "LowDetailLine", 0
  130.           ALIGN
  131. LDLineY   DCD     &ff000000 + LDLineY - LDLineX
  132.  
  133. ;scale line of graphics block to height value.
  134. ;on entry -
  135. ;           r0 = pointer to Plot_Block where :-
  136. ;         0 = pointer to block_data
  137. ;            1 = initial_x_intercept
  138. ;            2 = height
  139. ;            3 = screen_address
  140. ;         4 = pointer to div_table
  141. ;         5 = quadrant
  142. ;         6 = Players
  143.  
  144. |LowDetailLine|
  145.       STMFD   r13!,{r0-r12,link}
  146.  
  147.       LDMIA   r0,{r0-r6}
  148.  
  149.       ;validate height
  150.       CMP     r2,#1
  151.       BLE     EndLDLine
  152.       CMP     r2,#5120
  153.       MOVGE   r2,#5120
  154.  
  155.       ;set max height according to players
  156.       CMP     r6,#0
  157.       MOV     r12,#254
  158.       MOVNE   r12,#126
  159.  
  160.       ;compute pointer to graphical data
  161.       AND     r7,r1,#63
  162.       ADD     r0,r0,r7,LSL #6
  163.  
  164.       ;get gradient
  165.       LDR     r4,[r4,r2,LSL #2]
  166.       MOV     r4,r4,LSL #6    ;multiply by 64*2 (side length)
  167.       MOV     r7,#0           ;clear gradient counter
  168.       ;move to correct screen position
  169.       CMP     r2,r12          ;max height value
  170.       BGT     LDclipheight    ;if height larger than screen height
  171.       RSB     r5,r2,r12       ;find height difference
  172.       MOV     r5,r5,LSR #1    ;divide by 2 for upper & lower limits
  173.       MOV     r6,r5,LSL #8    ;multiply by 320 ((r5*256)+(r5*64))
  174.       ADD     r5,r6,r5,LSL #6
  175.       ADD     r3,r3,r5
  176.  
  177. LDloop    LDRB    r6,[r0,r7,ASR #20]
  178.           STRB    r6,[r3,#1]
  179.       STRB    r6,[r3],#320
  180.       ADD     r7,r7,r4              ;increment gradient
  181.       SUBS    r2,r2,#1
  182.       BEQ     EndLDLine
  183.       LDRB    r6,[r0,r7,ASR #20]
  184.           STRB    r6,[r3,#1]
  185.       STRB    r6,[r3],#320
  186.       ADD     r7,r7,r4              ;increment gradient
  187.       SUBS    r2,r2,#1
  188.       BEQ     EndLDLine
  189.       LDRB    r6,[r0,r7,ASR #20]
  190.           STRB    r6,[r3,#1]
  191.       STRB    r6,[r3],#320
  192.       ADD     r7,r7,r4              ;increment gradient
  193.       SUBS    r2,r2,#1
  194.       BEQ     EndLDLine
  195.       LDRB    r6,[r0,r7,ASR #20]
  196.           STRB    r6,[r3,#1]
  197.       STRB    r6,[r3],#320
  198.       ADD     r7,r7,r4              ;increment gradient
  199.       SUBS    r2,r2,#1
  200.       BEQ     EndLDLine
  201.       LDRB    r6,[r0,r7,ASR #20]
  202.           STRB    r6,[r3,#1]
  203.       STRB    r6,[r3],#320
  204.       ADD     r7,r7,r4              ;increment gradient
  205.       SUBS    r2,r2,#1
  206.       BEQ     EndLDLine
  207.       LDRB    r6,[r0,r7,ASR #20]
  208.           STRB    r6,[r3,#1]
  209.       STRB    r6,[r3],#320
  210.       ADD     r7,r7,r4              ;increment gradient
  211.       SUBS    r2,r2,#1
  212.       BEQ     EndLDLine
  213.       LDRB    r6,[r0,r7,ASR #20]
  214.           STRB    r6,[r3,#1]
  215.       STRB    r6,[r3],#320
  216.       ADD     r7,r7,r4              ;increment gradient
  217.       SUBS    r2,r2,#1
  218.       BEQ     EndLDLine
  219.       LDRB    r6,[r0,r7,ASR #20]
  220.           STRB    r6,[r3,#1]
  221.       STRB    r6,[r3],#320
  222.       ADD     r7,r7,r4              ;increment gradient
  223.       SUBS    r2,r2,#1
  224.       BEQ     EndLDLine
  225.       LDRB    r6,[r0,r7,ASR #20]
  226.           STRB    r6,[r3,#1]
  227.       STRB    r6,[r3],#320
  228.       ADD     r7,r7,r4              ;increment gradient
  229.       SUBS    r2,r2,#1
  230.       BNE     LDloop
  231.  
  232. EndLDLine
  233.           LDMFD   r13!,{r0-r12,pc}
  234.  
  235. LDclipheight
  236.           SUB     r10,r2,r12
  237.           MOV     r10,r10,LSR #1    ;find height difference
  238.           MUL     r7,r10,r4         ;multiply the gradient by the height diff
  239.           MOV     r2,r12
  240.           B       LDloop
  241.  
  242. MLDLineX  DCB     "MegaLowDetailLine", 0
  243.           ALIGN
  244. MLDLineY  DCD     &ff000000 + MLDLineY - MLDLineX
  245.  
  246. ;scale line of graphics block to height value.
  247. ;on entry -
  248. ;           r0 = pointer to Plot_Block where :-
  249. ;         0 = pointer to block_data
  250. ;            1 = initial_x_intercept
  251. ;            2 = height
  252. ;            3 = screen_address
  253. ;         4 = pointer to div_table
  254. ;         5 = quadrant
  255. ;            6 = Players
  256.  
  257. |MegaLowDetailLine|
  258.       STMFD   r13!,{r0-r12,link}
  259.  
  260.       LDMIA   r0,{r0-r6}
  261.  
  262.       ;validate height
  263.       CMP     r2,#1
  264.       BLE     EndMLDLine
  265.       CMP     r2,#5120
  266.       MOVGE   r2,#5120
  267.  
  268.       ;round height
  269.       MOV     r2,r2,ASR #1
  270.       MOV     r2,r2,LSL #1
  271.  
  272.       ;set max height according to players
  273.       CMP     r6,#0
  274.       MOV     r12,#254
  275.       MOVNE   r12,#126
  276.  
  277.       ;compute pointer to graphical data
  278.       AND     r7,r1,#63
  279.       ADD     r0,r0,r7,LSL #6
  280.  
  281.       ;get gradient
  282.       LDR     r4,[r4,r2,LSL #2]
  283.       MOV     r4,r4,LSL #6    ;multiply by 64*2 (side length)
  284.       MOV     r7,#0           ;clear gradient counter
  285.       ;move to correct screen position
  286.       CMP     r2,r12          ;max height value
  287.       BGT     MLDclipheight   ;if height larger than screen height
  288.       RSB     r5,r2,r12       ;find height difference
  289.       MOV     r5,r5,LSR #1    ;divide by 2 for upper & lower limits
  290.       MOV     r6,r5,LSL #8    ;multiply by 320 ((r5*256)+(r5*64))
  291.       ADD     r5,r6,r5,LSL #6
  292.       ADD     r3,r3,r5
  293.       MOV     r4,r4,LSL #1
  294.  
  295. MLDloop   LDRB    r6,[r0,r7,ASR #20]
  296.           STRB    r6,[r3,#1]
  297.       STRB    r6,[r3],#320
  298.       STRB    r6,[r3,#1]
  299.       STRB    r6,[r3],#320
  300.       ADD     r7,r7,r4              ;increment gradient
  301.       SUBS    r2,r2,#2
  302.       BEQ     EndMLDLine
  303.       LDRB    r6,[r0,r7,ASR #20]
  304.           STRB    r6,[r3,#1]
  305.       STRB    r6,[r3],#320
  306.       STRB    r6,[r3,#1]
  307.       STRB    r6,[r3],#320
  308.       ADD     r7,r7,r4              ;increment gradient
  309.       SUBS    r2,r2,#2
  310.       BEQ     EndMLDLine
  311.       LDRB    r6,[r0,r7,ASR #20]
  312.           STRB    r6,[r3,#1]
  313.       STRB    r6,[r3],#320
  314.       STRB    r6,[r3,#1]
  315.       STRB    r6,[r3],#320
  316.       ADD     r7,r7,r4              ;increment gradient
  317.       SUBS    r2,r2,#2
  318.       BEQ     EndMLDLine
  319.       LDRB    r6,[r0,r7,ASR #20]
  320.           STRB    r6,[r3,#1]
  321.       STRB    r6,[r3],#320
  322.       STRB    r6,[r3,#1]
  323.       STRB    r6,[r3],#320
  324.       ADD     r7,r7,r4              ;increment gradient
  325.       SUBS    r2,r2,#2
  326.       BEQ     EndMLDLine
  327.       LDRB    r6,[r0,r7,ASR #20]
  328.           STRB    r6,[r3,#1]
  329.       STRB    r6,[r3],#320
  330.       STRB    r6,[r3,#1]
  331.       STRB    r6,[r3],#320
  332.       ADD     r7,r7,r4              ;increment gradient
  333.       SUBS    r2,r2,#2
  334.       BEQ     EndMLDLine
  335.       LDRB    r6,[r0,r7,ASR #20]
  336.           STRB    r6,[r3,#1]
  337.       STRB    r6,[r3],#320
  338.       STRB    r6,[r3,#1]
  339.       STRB    r6,[r3],#320
  340.       ADD     r7,r7,r4              ;increment gradient
  341.       SUBS    r2,r2,#2
  342.       BEQ     EndMLDLine
  343.       LDRB    r6,[r0,r7,ASR #20]
  344.           STRB    r6,[r3,#1]
  345.       STRB    r6,[r3],#320
  346.       STRB    r6,[r3,#1]
  347.       STRB    r6,[r3],#320
  348.       ADD     r7,r7,r4              ;increment gradient
  349.       SUBS    r2,r2,#2
  350.       BEQ     EndMLDLine
  351.       LDRB    r6,[r0,r7,ASR #20]
  352.           STRB    r6,[r3,#1]
  353.       STRB    r6,[r3],#320
  354.       STRB    r6,[r3,#1]
  355.       STRB    r6,[r3],#320
  356.       ADD     r7,r7,r4              ;increment gradient
  357.       SUBS    r2,r2,#2
  358.       BEQ     EndMLDLine
  359.       LDRB    r6,[r0,r7,ASR #20]
  360.           STRB    r6,[r3,#1]
  361.       STRB    r6,[r3],#320
  362.       STRB    r6,[r3,#1]
  363.       STRB    r6,[r3],#320
  364.       ADD     r7,r7,r4              ;increment gradient
  365.       SUBS    r2,r2,#2
  366.       BNE     MLDloop
  367.  
  368. EndMLDLine
  369.           LDMFD   r13!,{r0-r12,pc}
  370.  
  371. MLDclipheight
  372.           SUB     r10,r2,r12
  373.           MOV     r10,r10,LSR #1    ;find height difference
  374.           MUL     r7,r10,r4         ;multiply the gradient by the height diff
  375.           MOV     r2,r12
  376.           MOV     r4,r4,LSL #1
  377.           B       MLDloop
  378.  
  379. EMLDLineX DCB     "ExtraMegaLowDetailLine", 0
  380.           ALIGN
  381. EMLDLineY DCD     &ff000000 + EMLDLineY - EMLDLineX
  382.  
  383. ;scale line of graphics block to height value.
  384. ;on entry -
  385. ;           r0 = pointer to Plot_Block where :-
  386. ;         0 = pointer to block_data
  387. ;            1 = initial_x_intercept
  388. ;            2 = height
  389. ;            3 = screen_address
  390. ;         4 = pointer to div_table
  391. ;         5 = quadrant
  392. ;         6 = Players
  393. ;         7 = ScanLine
  394.  
  395. |ExtraMegaLowDetailLine|
  396.       STMFD   r13!,{r0-r12,link}
  397.  
  398.       LDMIA   r0,{r0-r6}
  399.  
  400.       ;validate height
  401.       CMP     r2,#1
  402.       BLE     EndEMLDLine
  403.       CMP     r2,#5120
  404.       MOVGE   r2,#5120
  405.  
  406.       ;round height
  407.       MOV     r2,r2,ASR #1
  408.       MOV     r2,r2,LSL #1
  409.  
  410.       ;set max height according to players
  411.       CMP     r6,#0
  412.       MOV     r12,#254
  413.       MOVNE   r12,#126
  414.  
  415.       ;compute pointer to graphical data
  416.       AND     r7,r1,#63
  417.       ADD     r0,r0,r7,LSL #6
  418.  
  419.       ;get gradient
  420.       LDR     r4,[r4,r2,LSL #2]
  421.       MOV     r4,r4,LSL #6    ;multiply by 64*2 (side length)
  422.       MOV     r7,#0           ;clear gradient counter
  423.       ;move to correct screen position
  424.       CMP     r2,r12          ;max height value
  425.       BGT     EMLDclipheight  ;if height larger than screen height
  426.       RSB     r5,r2,r12       ;find height difference
  427.       MOV     r5,r5,LSR #1    ;divide by 2 for upper & lower limits
  428.       MOV     r6,r5,LSL #8    ;multiply by 320 ((r5*256)+(r5*64))
  429.       ADD     r5,r6,r5,LSL #6
  430.       ADD     r3,r3,r5
  431.       MOV     r4,r4,LSL #1
  432.  
  433. EMLDloop  LDRB    r6,[r0,r7,ASR #20]
  434.           STRB    r6,[r3,#1]
  435.           STRB    r6,[r3,#2]
  436.       STRB    r6,[r3],#320
  437.       STRB    r6,[r3,#1]
  438.           STRB    r6,[r3,#2]
  439.       STRB    r6,[r3],#320
  440.       ADD     r7,r7,r4              ;increment gradient
  441.       SUBS    r2,r2,#2
  442.       BEQ     EndEMLDLine
  443.       LDRB    r6,[r0,r7,ASR #20]
  444.           STRB    r6,[r3,#1]
  445.           STRB    r6,[r3,#2]
  446.       STRB    r6,[r3],#320
  447.       STRB    r6,[r3,#1]
  448.           STRB    r6,[r3,#2]
  449.       STRB    r6,[r3],#320
  450.       ADD     r7,r7,r4              ;increment gradient
  451.       SUBS    r2,r2,#2
  452.       BEQ     EndEMLDLine
  453.       LDRB    r6,[r0,r7,ASR #20]
  454.           STRB    r6,[r3,#1]
  455.           STRB    r6,[r3,#2]
  456.       STRB    r6,[r3],#320
  457.       STRB    r6,[r3,#1]
  458.           STRB    r6,[r3,#2]
  459.       STRB    r6,[r3],#320
  460.       ADD     r7,r7,r4              ;increment gradient
  461.       SUBS    r2,r2,#2
  462.       BEQ     EndEMLDLine
  463.       LDRB    r6,[r0,r7,ASR #20]
  464.           STRB    r6,[r3,#1]
  465.           STRB    r6,[r3,#2]
  466.       STRB    r6,[r3],#320
  467.       STRB    r6,[r3,#1]
  468.           STRB    r6,[r3,#2]
  469.       STRB    r6,[r3],#320
  470.       ADD     r7,r7,r4              ;increment gradient
  471.       SUBS    r2,r2,#2
  472.       BEQ     EndEMLDLine
  473.       LDRB    r6,[r0,r7,ASR #20]
  474.           STRB    r6,[r3,#1]
  475.           STRB    r6,[r3,#2]
  476.       STRB    r6,[r3],#320
  477.       STRB    r6,[r3,#1]
  478.           STRB    r6,[r3,#2]
  479.       STRB    r6,[r3],#320
  480.       ADD     r7,r7,r4              ;increment gradient
  481.       SUBS    r2,r2,#2
  482.       BEQ     EndEMLDLine
  483.       LDRB    r6,[r0,r7,ASR #20]
  484.           STRB    r6,[r3,#1]
  485.           STRB    r6,[r3,#2]
  486.       STRB    r6,[r3],#320
  487.       STRB    r6,[r3,#1]
  488.           STRB    r6,[r3,#2]
  489.       STRB    r6,[r3],#320
  490.       ADD     r7,r7,r4              ;increment gradient
  491.       SUBS    r2,r2,#2
  492.       BEQ     EndEMLDLine
  493.       LDRB    r6,[r0,r7,ASR #20]
  494.           STRB    r6,[r3,#1]
  495.           STRB    r6,[r3,#2]
  496.       STRB    r6,[r3],#320
  497.       STRB    r6,[r3,#1]
  498.           STRB    r6,[r3,#2]
  499.       STRB    r6,[r3],#320
  500.       ADD     r7,r7,r4              ;increment gradient
  501.       SUBS    r2,r2,#2
  502.       BEQ     EndEMLDLine
  503.       LDRB    r6,[r0,r7,ASR #20]
  504.           STRB    r6,[r3,#1]
  505.           STRB    r6,[r3,#2]
  506.       STRB    r6,[r3],#320
  507.       STRB    r6,[r3,#1]
  508.           STRB    r6,[r3,#2]
  509.       STRB    r6,[r3],#320
  510.       ADD     r7,r7,r4              ;increment gradient
  511.       SUBS    r2,r2,#2
  512.       BEQ     EndEMLDLine
  513.       LDRB    r6,[r0,r7,ASR #20]
  514.           STRB    r6,[r3,#1]
  515.           STRB    r6,[r3,#2]
  516.       STRB    r6,[r3],#320
  517.       STRB    r6,[r3,#1]
  518.           STRB    r6,[r3,#2]
  519.       STRB    r6,[r3],#320
  520.       ADD     r7,r7,r4              ;increment gradient
  521.       SUBS    r2,r2,#2
  522.        BNE     EMLDloop
  523.  
  524. EndEMLDLine
  525.           LDMFD   r13!,{r0-r12,pc}
  526.  
  527. EMLDclipheight
  528.           SUB     r10,r2,r12
  529.           MOV     r10,r10,LSR #1    ;find height difference
  530.           MUL     r7,r10,r4         ;multiply the gradient by the height diff
  531.           MOV     r2,r12
  532.           MOV     r4,r4,LSL #1
  533.           B       EMLDloop
  534.  
  535. SEMLDLineX DCB     "SuperExtraMegaLowDetailLine", 0
  536.            ALIGN
  537. SEMLDLineY DCD     &ff000000 + SEMLDLineY - SEMLDLineX
  538.  
  539. ;scale line of graphics block to height value.
  540. ;on entry -
  541. ;           r0 = pointer to Plot_Block where :-
  542. ;         0 = pointer to block_data
  543. ;            1 = initial_x_intercept
  544. ;            2 = height
  545. ;            3 = screen_address
  546. ;         4 = pointer to div_table
  547. ;         5 = quadrant
  548. ;         6 = Players
  549. ;         7 = ScanLine
  550.  
  551. |SuperExtraMegaLowDetailLine|
  552.       STMFD   r13!,{r0-r12,link}
  553.  
  554.       LDMIA   r0,{r0-r6}
  555.  
  556.       ;validate height
  557.       CMP     r2,#1
  558.       BLE     EndEMLDLine
  559.       CMP     r2,#5120
  560.       MOVGE   r2,#5120
  561.  
  562.       ;round height
  563.       MOV     r2,r2,ASR #1
  564.       MOV     r2,r2,LSL #1
  565.  
  566.       ;set max height according to players
  567.       CMP     r6,#0
  568.       MOV     r12,#254
  569.       MOVNE   r12,#128
  570.  
  571.       ;compute pointer to graphical data
  572.       AND     r7,r1,#63
  573.       ADD     r0,r0,r7,LSL #6
  574.  
  575.       ;get gradient
  576.       LDR     r4,[r4,r2,LSL #2]
  577.       MOV     r4,r4,LSL #6    ;multiply by 64*2 (side length)
  578.       MOV     r7,#0           ;clear gradient counter
  579.       ;move to correct screen position
  580.       CMP     r2,r12          ;max height value
  581.       BGT     SEMLDclipheight ;if height larger than screen height
  582.       RSB     r5,r2,r12       ;find height difference
  583.       MOV     r5,r5,LSR #1    ;divide by 2 for upper & lower limits
  584.       MOV     r6,r5,LSL #8    ;multiply by 320 ((r5*256)+(r5*64))
  585.       ADD     r5,r6,r5,LSL #6
  586.       ADD     r3,r3,r5
  587.  
  588. SEMLDloop LDRB    r6,[r0,r7,ASR #20]
  589.       ADD     r6,r6,r6,LSL #8
  590.       ADD     r6,r6,r6,LSL #16
  591.           STR     r6,[r3],#320
  592.        ADD     r7,r7,r4              ;increment gradient
  593.       SUBS    r2,r2,#1
  594.       BEQ     EndSEMLDLine
  595.       LDRB    r6,[r0,r7,ASR #20]
  596.       ADD     r6,r6,r6,LSL #8
  597.       ADD     r6,r6,r6,LSL #16
  598.           STR     r6,[r3],#320
  599.        ADD     r7,r7,r4              ;increment gradient
  600.       SUBS    r2,r2,#1
  601.       BEQ     EndSEMLDLine
  602.       LDRB    r6,[r0,r7,ASR #20]
  603.       ADD     r6,r6,r6,LSL #8
  604.       ADD     r6,r6,r6,LSL #16
  605.           STR     r6,[r3],#320
  606.        ADD     r7,r7,r4              ;increment gradient
  607.       SUBS    r2,r2,#1
  608.       BEQ     EndSEMLDLine
  609.       LDRB    r6,[r0,r7,ASR #20]
  610.       ADD     r6,r6,r6,LSL #8
  611.       ADD     r6,r6,r6,LSL #16
  612.           STR     r6,[r3],#320
  613.        ADD     r7,r7,r4              ;increment gradient
  614.       SUBS    r2,r2,#1
  615.       BEQ     EndSEMLDLine
  616.       LDRB    r6,[r0,r7,ASR #20]
  617.       ADD     r6,r6,r6,LSL #8
  618.       ADD     r6,r6,r6,LSL #16
  619.           STR     r6,[r3],#320
  620.        ADD     r7,r7,r4              ;increment gradient
  621.       SUBS    r2,r2,#1
  622.       BEQ     EndSEMLDLine
  623.       LDRB    r6,[r0,r7,ASR #20]
  624.       ADD     r6,r6,r6,LSL #8
  625.       ADD     r6,r6,r6,LSL #16
  626.           STR     r6,[r3],#320
  627.        ADD     r7,r7,r4              ;increment gradient
  628.       SUBS    r2,r2,#1
  629.       BEQ     EndSEMLDLine
  630.       LDRB    r6,[r0,r7,ASR #20]
  631.       ADD     r6,r6,r6,LSL #8
  632.       ADD     r6,r6,r6,LSL #16
  633.           STR     r6,[r3],#320
  634.        ADD     r7,r7,r4              ;increment gradient
  635.       SUBS    r2,r2,#1
  636.       BEQ     EndSEMLDLine
  637.       LDRB    r6,[r0,r7,ASR #20]
  638.       ADD     r6,r6,r6,LSL #8
  639.       ADD     r6,r6,r6,LSL #16
  640.           STR     r6,[r3],#320
  641.        ADD     r7,r7,r4              ;increment gradient
  642.       SUBS    r2,r2,#1
  643.       BNE     SEMLDloop
  644.  
  645. EndSEMLDLine
  646.           LDMFD   r13!,{r0-r12,pc}
  647.  
  648. SEMLDclipheight
  649.           SUB     r10,r2,r12
  650.           MOV     r10,r10,LSR #1    ;find height difference
  651.           MUL     r7,r10,r4         ;multiply the gradient by the height diff
  652.           MOV     r2,r12
  653.           B       SEMLDloop
  654.  
  655.  
  656. RDScreenX DCB     "RedrawScreen", 0
  657.           ALIGN
  658. RDScreenY DCD     &ff000000 + RDScreenY - RDScreenX
  659.  
  660. ;draw background graphics.
  661. ;on entry -
  662. ;           r0 = screen address
  663.  
  664. |RedrawScreen|
  665.       STMFD   r13!,{r0-r12,link}
  666.  
  667.       ;initial height value
  668.       MOV     r1,#64
  669.  
  670.       ;load initial colour value into r2 & make word sized
  671.       MOV     r2,#44
  672.       ADD     r2,r2,r2,LSL #8
  673.       ADD     r2,r2,r2,LSL #16
  674.  
  675.       ;move into other registers
  676.       MOV     r3,r2
  677.       MOV     r4,r2
  678.       MOV     r5,r2
  679.       MOV     r6,r2
  680.       MOV     r7,r2
  681.       MOV     r8,r2
  682.       MOV     r9,r2
  683.       MOV     r10,r2
  684.       MOV     r11,r2
  685.  
  686. RDloop    STMIA   r0!,{r2-r11} ;plot one line of colour data on screen
  687.       STMIA   r0!,{r2-r11}
  688.       STMIA   r0!,{r2-r11}
  689.       STMIA   r0!,{r2-r11}
  690.       STMIA   r0!,{r2-r11}
  691.       STMIA   r0!,{r2-r11}
  692.       STMIA   r0!,{r2-r11}
  693.       STMIA   r0!,{r2-r11}
  694.  
  695.       SUBS      r1,r1,#1
  696.       BNE     RDloop
  697.  
  698.       ;next height value
  699.       MOV     r1,#64
  700.  
  701.       ;load next colour value into r2 & make word sized
  702.       MOV     r2,#42
  703.       ADD     r2,r2,r2,LSL #8
  704.       ADD     r2,r2,r2,LSL #16
  705.  
  706.       ;move into other registers
  707.       MOV     r3,r2
  708.       MOV     r4,r2
  709.       MOV     r5,r2
  710.       MOV     r6,r2
  711.       MOV     r7,r2
  712.       MOV     r8,r2
  713.       MOV     r9,r2
  714.       MOV     r10,r2
  715.       MOV     r11,r2
  716.  
  717. RDloopA   STMIA   r0!,{r2-r11} ;plot one line of colour data on screen
  718.       STMIA   r0!,{r2-r11}
  719.       STMIA   r0!,{r2-r11}
  720.       STMIA   r0!,{r2-r11}
  721.       STMIA   r0!,{r2-r11}
  722.       STMIA   r0!,{r2-r11}
  723.       STMIA   r0!,{r2-r11}
  724.       STMIA   r0!,{r2-r11}
  725.  
  726.       SUBS      r1,r1,#1
  727.       BNE     RDloopA
  728.  
  729. EndRDScreen
  730.           LDMFD   r13!,{r0-r12,pc}
  731.  
  732. BRDScreenX DCB     "BigRedrawScreen", 0
  733.            ALIGN
  734. BRDScreenY DCD     &ff000000 + BRDScreenY - BRDScreenX
  735.  
  736. ;draw background graphics.
  737. ;on entry -
  738. ;           r0 = screen address
  739.  
  740. |BigRedrawScreen|
  741.       STMFD   r13!,{r0-r12,link}
  742.  
  743.       ;initial height value
  744.       MOV     r1,#127
  745.  
  746.       ;load initial colour value into r2 & make word sized
  747.       MOV     r2,#44
  748.       ADD     r2,r2,r2,LSL #8
  749.       ADD     r2,r2,r2,LSL #16
  750.  
  751.       ;move into other registers
  752.       MOV     r3,r2
  753.       MOV     r4,r2
  754.       MOV     r5,r2
  755.       MOV     r6,r2
  756.       MOV     r7,r2
  757.       MOV     r8,r2
  758.       MOV     r9,r2
  759.       MOV     r10,r2
  760.       MOV     r11,r2
  761.  
  762. BRDloop   STMIA   r0!,{r2-r11} ;plot one line of colour data on screen
  763.       STMIA   r0!,{r2-r11}
  764.       STMIA   r0!,{r2-r11}
  765.       STMIA   r0!,{r2-r11}
  766.       STMIA   r0!,{r2-r11}
  767.       STMIA   r0!,{r2-r11}
  768.       STMIA   r0!,{r2-r11}
  769.       STMIA   r0!,{r2-r11}
  770.  
  771.       SUBS      r1,r1,#1
  772.       BNE     BRDloop
  773.  
  774.       ;next height value
  775.       MOV     r1,#127
  776.  
  777.       ;load next colour value into r2 & make word sized
  778.       MOV     r2,#46
  779.       ADD     r2,r2,r2,LSL #8
  780.       ADD     r2,r2,r2,LSL #16
  781.  
  782.       ;move into other registers
  783.       MOV     r3,r2
  784.       MOV     r4,r2
  785.       MOV     r5,r2
  786.       MOV     r6,r2
  787.       MOV     r7,r2
  788.       MOV     r8,r2
  789.       MOV     r9,r2
  790.       MOV     r10,r2
  791.       MOV     r11,r2
  792.  
  793. BRDloopA  STMIA   r0!,{r2-r11} ;plot one line of colour data on screen
  794.       STMIA   r0!,{r2-r11}
  795.       STMIA   r0!,{r2-r11}
  796.       STMIA   r0!,{r2-r11}
  797.       STMIA   r0!,{r2-r11}
  798.       STMIA   r0!,{r2-r11}
  799.       STMIA   r0!,{r2-r11}
  800.       STMIA   r0!,{r2-r11}
  801.  
  802.       SUBS      r1,r1,#1
  803.       BNE     BRDloopA
  804.  
  805. EndBRDScreen
  806.           LDMFD   r13!,{r0-r12,pc}
  807.  
  808.  
  809.       END
  810.