home *** CD-ROM | disk | FTP | other *** search
/ Dream 44 / Amiga_Dream_44.iso / RiscPc / jeux / biohazard.arc / s / AffLnVGA < prev    next >
Text File  |  1995-02-19  |  26KB  |  895 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  |DrawScaledLineVGA|
  18.       EXPORT  |BigRedrawScreenVGA|
  19.  
  20. DSLineX1  DCB     "DrawScaledLine", 0
  21.           ALIGN
  22. DSLineY1  DCD     &ff000000 + DSLineY1 - DSLineX1
  23.  
  24. ;scale line of graphics block to height value.
  25. ;on entry -
  26. ;           r0 = pointer to Plot_Block where :-
  27. ;           0 - 3  = clipped heights of lines to draw
  28. ;           4 - 7  = gradients of lines to draw
  29. ;           8 - 11 = gradient counters (13 bit resolution)
  30. ;           12- 15 = data addresses of graphics data
  31. ;           16     = screen address
  32. ;           17     = base address of graphics data
  33. ;        18     = smallest_height
  34. ;           19     = screen height
  35. ;           20     = pointer to gradient table
  36. ;           21     = scaling factor
  37. ;           22     = AND value
  38.  
  39.     ALIGN
  40. SmallestHeight1
  41.           DCD 0
  42.  
  43.     ALIGN
  44.  
  45. |DrawScaledLineVGA|
  46.       STMFD   r13!,{r0-r12,link}
  47.  
  48.           ;outer loop
  49.           ;r0 = pointer to plot block.
  50.           LDMIA   r0,{r1-r3}
  51.           SUB     r1,r1,#16
  52.           SUB     r2,r2,#16
  53.           ADD     r3,r3,#4
  54.           LDR     r4,[r0,#64]
  55.           ADD     r4,r4,#4
  56.           STR     r4,[r0,#64]
  57.           STMFD   r13!,{r1-r4}
  58.  
  59. OuterLoop LDMFD   r13!,{r1-r4}
  60.           ADD     r1,r1,#16
  61.           ADD     r2,r2,#16
  62.           SUBS    r3,r3,#4
  63.           BEQ     EndOuterLoop
  64.  
  65.           ADD     r4,r4,#4
  66.           STR     r4,[r0,#64]
  67.  
  68.           STMFD   r13!,{r1-r4}
  69.  
  70.           STMFD   r13!,{r2}
  71.  
  72.       LDMIA   r1,{r5-r8}
  73.  
  74.           ;shift distances down 17 places
  75.           MOV     r5,r5,LSR #18
  76.           MOV     r6,r6,LSR #18
  77.           MOV     r7,r7,LSR #18
  78.           MOV     r8,r8,LSR #18
  79.  
  80.           ;clear result registers
  81.           MOV     r1,#0
  82.           MOV     r2,#0
  83.           MOV     r3,#0
  84.           MOV     r4,#0
  85.  
  86.           ;compute heights from distances
  87.           ;wrk = temp register
  88.           ;div = divisor (distance)
  89.           ;num = number (64<<10)
  90.           ;res = result
  91.           ;RSBS    wrk,div,num,LSR #bit
  92.           ;ADC     res,res,res
  93.           ;SUBCS   num,num,div,LSR #bit
  94.  
  95.           ;set up working registers
  96.           MOV     r9,#64  ;num
  97.           MOV     r9,r9,LSL #10
  98.  
  99.           RSBS    r14,r5,r9,LSR #16
  100.           ADC     r1,r1,r1
  101.           SUBCS   r9,r9,r5,LSL #16
  102.           RSBS    r14,r5,r9,LSR #15
  103.           ADC     r1,r1,r1
  104.           SUBCS   r9,r9,r5,LSL #15
  105.           RSBS    r14,r5,r9,LSR #14
  106.           ADC     r1,r1,r1
  107.           SUBCS   r9,r9,r5,LSL #14
  108.           RSBS    r14,r5,r9,LSR #13
  109.           ADC     r1,r1,r1
  110.           SUBCS   r9,r9,r5,LSL #13
  111.           RSBS    r14,r5,r9,LSR #12
  112.           ADC     r1,r1,r1
  113.           SUBCS   r9,r9,r5,LSL #12
  114.           RSBS    r14,r5,r9,LSR #11
  115.           ADC     r1,r1,r1
  116.           SUBCS   r9,r9,r5,LSL #11
  117.           RSBS    r14,r5,r9,LSR #10
  118.           ADC     r1,r1,r1
  119.           SUBCS   r9,r9,r5,LSL #10
  120.           RSBS    r14,r5,r9,LSR #9
  121.           ADC     r1,r1,r1
  122.           SUBCS   r9,r9,r5,LSL #9
  123.           RSBS    r14,r5,r9,LSR #8
  124.           ADC     r1,r1,r1
  125.           SUBCS   r9,r9,r5,LSL #8
  126.           RSBS    r14,r5,r9,LSR #7
  127.           ADC     r1,r1,r1
  128.           SUBCS   r9,r9,r5,LSL #7
  129.           RSBS    r14,r5,r9,LSR #6
  130.           ADC     r1,r1,r1
  131.           SUBCS   r9,r9,r5,LSL #6
  132.           RSBS    r14,r5,r9,LSR #5
  133.           ADC     r1,r1,r1
  134.           SUBCS   r9,r9,r5,LSL #5
  135.           RSBS    r14,r5,r9,LSR #4
  136.           ADC     r1,r1,r1
  137.           SUBCS   r9,r9,r5,LSL #4
  138.           RSBS    r14,r5,r9,LSR #3
  139.           ADC     r1,r1,r1
  140.           SUBCS   r9,r9,r5,LSL #3
  141.           RSBS    r14,r5,r9,LSR #2
  142.           ADC     r1,r1,r1
  143.           SUBCS   r9,r9,r5,LSL #2
  144.           RSBS    r14,r5,r9,LSR #1
  145.           ADC     r1,r1,r1
  146.           SUBCS   r9,r9,r5,LSL #1
  147.  
  148.           ;set up working registers
  149.           MOV     r9,#64  ;num
  150.           MOV     r9,r9,LSL #10
  151.  
  152.           RSBS    r14,r6,r9,LSR #16
  153.           ADC     r2,r2,r2
  154.           SUBCS   r9,r9,r6,LSL #16
  155.           RSBS    r14,r6,r9,LSR #15
  156.           ADC     r2,r2,r2
  157.           SUBCS   r9,r9,r6,LSL #15
  158.           RSBS    r14,r6,r9,LSR #14
  159.           ADC     r2,r2,r2
  160.           SUBCS   r9,r9,r6,LSL #14
  161.           RSBS    r14,r6,r9,LSR #13
  162.           ADC     r2,r2,r2
  163.           SUBCS   r9,r9,r6,LSL #13
  164.           RSBS    r14,r6,r9,LSR #12
  165.           ADC     r2,r2,r2
  166.           SUBCS   r9,r9,r6,LSL #12
  167.           RSBS    r14,r6,r9,LSR #11
  168.           ADC     r2,r2,r2
  169.           SUBCS   r9,r9,r6,LSL #11
  170.           RSBS    r14,r6,r9,LSR #10
  171.           ADC     r2,r2,r2
  172.           SUBCS   r9,r9,r6,LSL #10
  173.           RSBS    r14,r6,r9,LSR #9
  174.           ADC     r2,r2,r2
  175.           SUBCS   r9,r9,r6,LSL #9
  176.           RSBS    r14,r6,r9,LSR #8
  177.           ADC     r2,r2,r2
  178.           SUBCS   r9,r9,r6,LSL #8
  179.           RSBS    r14,r6,r9,LSR #7
  180.           ADC     r2,r2,r2
  181.           SUBCS   r9,r9,r6,LSL #7
  182.           RSBS    r14,r6,r9,LSR #6
  183.           ADC     r2,r2,r2
  184.           SUBCS   r9,r9,r6,LSL #6
  185.           RSBS    r14,r6,r9,LSR #5
  186.           ADC     r2,r2,r2
  187.           SUBCS   r9,r9,r6,LSL #5
  188.           RSBS    r14,r6,r9,LSR #4
  189.           ADC     r2,r2,r2
  190.           SUBCS   r9,r9,r6,LSL #4
  191.           RSBS    r14,r6,r9,LSR #3
  192.           ADC     r2,r2,r2
  193.           SUBCS   r9,r9,r6,LSL #3
  194.           RSBS    r14,r6,r9,LSR #2
  195.           ADC     r2,r2,r2
  196.           SUBCS   r9,r9,r6,LSL #2
  197.           RSBS    r14,r6,r9,LSR #1
  198.           ADC     r2,r2,r2
  199.           SUBCS   r9,r9,r6,LSL #1
  200.  
  201.           ;set up working registers
  202.           MOV     r9,#64  ;num
  203.           MOV     r9,r9,LSL #10
  204.  
  205.           RSBS    r14,r7,r9,LSR #16
  206.           ADC     r3,r3,r3
  207.           SUBCS   r9,r9,r7,LSL #16
  208.           RSBS    r14,r7,r9,LSR #15
  209.           ADC     r3,r3,r3
  210.           SUBCS   r9,r9,r7,LSL #15
  211.           RSBS    r14,r7,r9,LSR #14
  212.           ADC     r3,r3,r3
  213.           SUBCS   r9,r9,r7,LSL #14
  214.           RSBS    r14,r7,r9,LSR #13
  215.           ADC     r3,r3,r3
  216.           SUBCS   r9,r9,r7,LSL #13
  217.           RSBS    r14,r7,r9,LSR #12
  218.           ADC     r3,r3,r3
  219.           SUBCS   r9,r9,r7,LSL #12
  220.           RSBS    r14,r7,r9,LSR #11
  221.           ADC     r3,r3,r3
  222.           SUBCS   r9,r9,r7,LSL #11
  223.           RSBS    r14,r7,r9,LSR #10
  224.           ADC     r3,r3,r3
  225.           SUBCS   r9,r9,r7,LSL #10
  226.           RSBS    r14,r7,r9,LSR #9
  227.           ADC     r3,r3,r3
  228.           SUBCS   r9,r9,r7,LSL #9
  229.           RSBS    r14,r7,r9,LSR #8
  230.           ADC     r3,r3,r3
  231.           SUBCS   r9,r9,r7,LSL #8
  232.           RSBS    r14,r7,r9,LSR #7
  233.           ADC     r3,r3,r3
  234.           SUBCS   r9,r9,r7,LSL #7
  235.           RSBS    r14,r7,r9,LSR #6
  236.           ADC     r3,r3,r3
  237.           SUBCS   r9,r9,r7,LSL #6
  238.           RSBS    r14,r7,r9,LSR #5
  239.           ADC     r3,r3,r3
  240.           SUBCS   r9,r9,r7,LSL #5
  241.           RSBS    r14,r7,r9,LSR #4
  242.           ADC     r3,r3,r3
  243.           SUBCS   r9,r9,r7,LSL #4
  244.           RSBS    r14,r7,r9,LSR #3
  245.           ADC     r3,r3,r3
  246.           SUBCS   r9,r9,r7,LSL #3
  247.           RSBS    r14,r7,r9,LSR #2
  248.           ADC     r3,r3,r3
  249.           SUBCS   r9,r9,r7,LSL #2
  250.           RSBS    r14,r7,r9,LSR #1
  251.           ADC     r3,r3,r3
  252.           SUBCS   r9,r9,r7,LSL #1
  253.  
  254.           ;set up working registers
  255.           MOV     r9,#64  ;num
  256.           MOV     r9,r9,LSL #10
  257.  
  258.           RSBS    r14,r8,r9,LSR #16
  259.           ADC     r4,r4,r4
  260.           SUBCS   r9,r9,r8,LSL #16
  261.           RSBS    r14,r8,r9,LSR #15
  262.           ADC     r4,r4,r4
  263.           SUBCS   r9,r9,r8,LSL #15
  264.           RSBS    r14,r8,r9,LSR #14
  265.           ADC     r4,r4,r4
  266.           SUBCS   r9,r9,r8,LSL #14
  267.           RSBS    r14,r8,r9,LSR #13
  268.           ADC     r4,r4,r4
  269.           SUBCS   r9,r9,r8,LSL #13
  270.           RSBS    r14,r8,r9,LSR #12
  271.           ADC     r4,r4,r4
  272.           SUBCS   r9,r9,r8,LSL #12
  273.           RSBS    r14,r8,r9,LSR #11
  274.           ADC     r4,r4,r4
  275.           SUBCS   r9,r9,r8,LSL #11
  276.           RSBS    r14,r8,r9,LSR #10
  277.           ADC     r4,r4,r4
  278.           SUBCS   r9,r9,r8,LSL #10
  279.           RSBS    r14,r8,r9,LSR #9
  280.           ADC     r4,r4,r4
  281.           SUBCS   r9,r9,r8,LSL #9
  282.           RSBS    r14,r8,r9,LSR #8
  283.           ADC     r4,r4,r4
  284.           SUBCS   r9,r9,r8,LSL #8
  285.           RSBS    r14,r8,r9,LSR #7
  286.           ADC     r4,r4,r4
  287.           SUBCS   r9,r9,r8,LSL #7
  288.           RSBS    r14,r8,r9,LSR #6
  289.           ADC     r4,r4,r4
  290.           SUBCS   r9,r9,r8,LSL #6
  291.           RSBS    r14,r8,r9,LSR #5
  292.           ADC     r4,r4,r4
  293.           SUBCS   r9,r9,r8,LSL #5
  294.           RSBS    r14,r8,r9,LSR #4
  295.           ADC     r4,r4,r4
  296.           SUBCS   r9,r9,r8,LSL #4
  297.           RSBS    r14,r8,r9,LSR #3
  298.           ADC     r4,r4,r4
  299.           SUBCS   r9,r9,r8,LSL #3
  300.           RSBS    r14,r8,r9,LSR #2
  301.           ADC     r4,r4,r4
  302.           SUBCS   r9,r9,r8,LSL #2
  303.           RSBS    r14,r8,r9,LSR #1
  304.           ADC     r4,r4,r4
  305.           SUBCS   r9,r9,r8,LSL #1
  306.  
  307.           ;multiply by scaling factor
  308.           LDR     r14,[r0,#84]
  309.           MUL     r1,r14,r1
  310.           MUL     r2,r14,r2
  311.           MUL     r3,r14,r3
  312.           MUL     r4,r14,r4
  313.  
  314.           MOV     r1,r1,LSR #16
  315.           MOV     r2,r2,LSR #16
  316.           MOV     r3,r3,LSR #16
  317.           MOV     r4,r4,LSR #16
  318.  
  319.           ;shift and round
  320.           CMP     r1,#2
  321.           MOVLT   r1,#2
  322.           CMP     r2,#2
  323.           MOVLT   r2,#2
  324.           CMP     r3,#2
  325.           MOVLT   r3,#2
  326.           CMP     r4,#2
  327.           MOVLT   r4,#2
  328.  
  329.           MOV     r1,r1,ASL #1
  330.           MOV     r2,r2,ASL #1
  331.           MOV     r3,r3,ASL #1
  332.           MOV     r4,r4,ASL #1
  333.  
  334.           ;load pointer to gradient table
  335.           LDR     r5,[r0,#80]
  336.  
  337.       ;limit heights
  338.       MOV     r6,#1024
  339.       SUB     r6,r6,#1
  340.       CMP     r1,r6
  341.       MOVGT   r1,r6
  342.           CMP     r2,r6
  343.           MOVGT   r2,r6
  344.           CMP     r3,r6
  345.           MOVGT   r3,r6
  346.           CMP     r4,r6
  347.       MOVGT   r4,r6
  348.  
  349.       MOV     r6,#4
  350.       CMP     r1,r6
  351.       MOVLT   r1,r6
  352.           CMP     r2,r6
  353.           MOVLT   r2,r6
  354.           CMP     r3,r6
  355.           MOVLT   r3,r6
  356.           CMP     r4,r6
  357.       MOVLT   r4,r6
  358.  
  359.           ;load gradients from table
  360.           LDR     r6,[r5,r1,LSL #2]
  361.           LDR     r7,[r5,r2,LSL #2]
  362.           LDR     r8,[r5,r3,LSL #2]
  363.           LDR     r9,[r5,r4,LSL #2]
  364.  
  365.           ADD     r0,r0,#16
  366.           STMIA   r0,{r6-r9}
  367.           SUB     r0,r0,#16
  368.  
  369.           ;load smallest height
  370.           LDR     r5,[r0,#76]
  371.  
  372.           ;modify height values
  373.           SUBS    r14,r4,r5
  374.           MOVPL   r14,r14,LSR #1
  375.           MULPL   r12,r9,r14
  376.           MOVPL   r4,r5
  377.           MOVMI   r12,#0
  378.  
  379.           SUBS    r14,r1,r5
  380.           MOVPL   r14,r14,LSR #1
  381.           MULPL   r9,r6,r14
  382.           MOVPL   r1,r5
  383.           MOVMI   r9,#0
  384.  
  385.           SUBS    r14,r2,r5
  386.           MOVPL   r14,r14,LSR #1
  387.           MULPL   r10,r7,r14
  388.           MOVPL   r2,r5
  389.           MOVMI   r10,#0
  390.  
  391.           SUBS    r14,r3,r5
  392.           MOVPL   r14,r14,LSR #1
  393.           MULPL   r11,r8,r14
  394.           MOVPL   r3,r5
  395.           MOVMI   r11,#0
  396.  
  397.           STMIA   r0,{r1-r4}
  398.  
  399.           ADD     r0,r0,#32
  400.           STMIA   r0,{r9-r12}
  401.           SUB     r0,r0,#32
  402.  
  403.       ;find smallest height, store in r7
  404.       MOV     r7,r1
  405.       CMP     r2,r7
  406.       MOVLT   r7,r2
  407.       CMP     r3,r7
  408.       MOVLT   r7,r3
  409.       CMP     r4,r7
  410.       MOVLT   r7,r4
  411.           STR     r7,[r0,#72]
  412.  
  413.           LDMFD   r13!,{r9}
  414.  
  415.       ;load r11 with graphics data pointer
  416.       LDR     r11,[r0,#68]
  417.  
  418.       ;draw upper section of line 1
  419.       LDR     r2,[r0,#16]      ; load gradient of line 1
  420.        LDR     r3,[r0,#32]      ; load gradient counter for line 1
  421.       LDR     r4,[r9]          ; load data address of data for line 1
  422.  
  423.       ADD     r3,r3,r4,LSL #14 ; combine gradient counter & data addr
  424.       SUB     r14,r1,r7        ; get height offset against smallest height
  425.       MOVS    r14,r14,LSR #1
  426.       STREQ   r3,[r0,#32]      ; save gradient counter for line 1
  427.           BEQ     DrawLine2
  428.  
  429.       LDR     r5,[r0,#64]      ; load screen address
  430.       RSB     r6,r1,#480       ; find distance from top of screen
  431.       MOV     r6,r6,LSR #1
  432.       MOV     r8,r6,LSL #6     ; multiply height offset by 128
  433.       ADD     r6,r8,r6,LSL #8  ; add to height offset * *256
  434.       ADD     r5,r5,r6,LSL #1  ; add to screen base
  435.       MOV     r1,r14
  436.       BL      DrawByteLine
  437.       STR     r3,[r0,#32]      ; save gradient counter for line 1
  438.  
  439. DrawLine2
  440.       ;draw upper section of line 2
  441.       LDR     r2,[r0,#20]      ; load gradient of line 2
  442.       LDR     r3,[r0,#36]      ; load gradient counter for line 2
  443.       LDR     r4,[r9,#4]       ; load data address of data for line 2
  444.  
  445.       ADD     r3,r3,r4,LSL #14 ; combine gradient counter & data addr
  446.  
  447.       LDR     r1,[r0,#4]
  448.       SUB     r14,r1,r7        ; get height offset against smallest height
  449.       MOVS    r14,r14,LSR #1
  450.       STREQ   r3,[r0,#36]      ; save gradient counter for line 2
  451.           BEQ     DrawLine3
  452.  
  453.       LDR     r5,[r0,#64]      ; load screen address
  454.       RSB     r6,r1,#480       ; find distance from top of screen
  455.       MOV     r6,r6,LSR #1
  456.       MOV     r8,r6,LSL #6     ; multiply height offset by 128
  457.       ADD     r6,r8,r6,LSL #8  ; add to height offset * 256
  458.       ADD     r5,r5,r6,LSL #1  ; add to screen base
  459.       ADD     r5,r5,#1
  460.       MOV     r1,r14
  461.       BL      DrawByteLine
  462.       STR     r3,[r0,#36]      ; save gradient counter for line 2
  463.  
  464. DrawLine3
  465.       ;draw upper section of line 3
  466.       LDR     r2,[r0,#24]      ; load gradient of line 3
  467.       LDR     r3,[r0,#40]      ; load gradient counter for line 3
  468.       LDR     r4,[r9,#8]       ; load data address of data for line 3
  469.  
  470.       ADD     r3,r3,r4,LSL #14 ; combine gradient counter & data addr
  471.  
  472.       LDR     r1,[r0,#8]
  473.       SUB     r14,r1,r7        ; get height offset against smallest height
  474.       MOVS    r14,r14,LSR #1
  475.       STREQ   r3,[r0,#40]      ; save gradient counter for line 3
  476.           BEQ    DrawLine4
  477.  
  478.       LDR     r5,[r0,#64]      ; load screen address
  479.       RSB     r6,r1,#480       ; find distance from top of screen
  480.       MOV     r6,r6,LSR #1
  481.       MOV     r8,r6,LSL #6     ; multiply height offset by 64
  482.       ADD     r6,r8,r6,LSL #8  ; add to height offset * 256
  483.       ADD     r5,r5,r6,LSL #1  ; add to screen base
  484.       ADD     r5,r5,#2
  485.       MOV     r1,r14
  486.       BL      DrawByteLine
  487.       STR     r3,[r0,#40]      ; save gradient counter for line 3
  488.  
  489. DrawLine4
  490.       ;draw upper section of line 4
  491.       LDR     r1,[r0,#12]
  492.       LDR     r2,[r0,#28]      ; load gradient of line 4
  493.       LDR     r3,[r0,#44]      ; load gradient counter for line 4
  494.       LDR     r4,[r9,#12]      ; load data address of data for line 4
  495.  
  496.       ADD     r3,r3,r4,LSL #14 ; combine gradient counter & data addr
  497.       SUB     r14,r1,r7        ; get height offset against smallest height
  498.       MOVS    r14,r14,LSR #1
  499.       STREQ   r3,[r0,#44]      ; save gradient counter for line 4
  500.           BEQ    DrawMainBlock
  501.  
  502.       LDR     r5,[r0,#64]      ; load screen address
  503.       RSB     r6,r1,#480       ; find distance from top of screen
  504.       MOV     r6,r6,LSR #1
  505.       MOV     r8,r6,LSL #6     ; multiply height offset by 64
  506.       ADD     r6,r8,r6,LSL #8  ; add to height offset * 256
  507.       ADD     r5,r5,r6,LSL #1  ; add to screen base
  508.       ADD     r5,r5,#3
  509.       MOV     r1,r14
  510.       BL      DrawByteLine
  511.       STR     r3,[r0,#44]      ; save gradient counter for line 4
  512.  
  513. DrawMainBlock
  514.  
  515.       ;preserve smallest height
  516.           LDR     r14,[r0,#72]
  517.       LDR     r12,[r0,#64]      ; load screen address
  518.  
  519.           ;compute screen address
  520.       LDR     r5,[r0,#64]      ; load screen address
  521.       RSB     r6,r14,#480      ; find distance from top of screen
  522.       MOV     r6,r6,LSR #1
  523.       MOV     r8,r6,LSL #6     ; multiply height offset by 64
  524.       ADD     r6,r8,r6,LSL #8  ; add to height offset * 256
  525.       ADD     r12,r5,r6,LSL #1 ; add to screen base
  526.  
  527.       ;load and combine AND value with counter
  528.       LDR     r9,[r0,#88]
  529.           ORR     r14,r14,r9
  530.  
  531.           ADD     r0,r0,#16
  532.       LDMIA   r0!,{r1-r4}      ; load up gradients
  533.       LDMIA      r0,{r5-r8}       ; load up gradient counters + data addrs
  534.  
  535. StartPlotBlock
  536.  
  537.  
  538.       LDRB    r10,[r11,r5,LSR #14]
  539.           AND     r10,r10,r14,LSR #16
  540.       LDRB    r9,[r11,r6,LSR #14]
  541.           AND     r9,r9,r14,LSR #16
  542.       ADD     r10,r10,r9,LSL #8
  543.       LDRB    r9,[r11,r7,LSR #14]
  544.           AND     r9,r9,r14,LSR #16
  545.       ADD     r10,r10,r9,LSL #16
  546.       LDRB    r9,[r11,r8,LSR #14]
  547.           AND     r9,r9,r14,LSR #16
  548.       ADD     r10,r10,r9,LSL #24
  549.       STR     r10,[r12],#320
  550.       STR     r10,[r12],#320
  551.       ADD     r5,r5,r1
  552.       ADD     r6,r6,r2
  553.       ADD     r7,r7,r3
  554.       ADD     r8,r8,r4
  555.       SUB     r14,r14,#1
  556.           MOVS    r10,r14,LSL #16
  557.       BEQ     EndPlotBlock
  558.  
  559.       LDRB    r10,[r11,r5,LSR #14]
  560.           AND     r10,r10,r14,LSR #16
  561.       LDRB    r9,[r11,r6,LSR #14]
  562.           AND     r9,r9,r14,LSR #16
  563.       ADD     r10,r10,r9,LSL #8
  564.       LDRB    r9,[r11,r7,LSR #14]
  565.           AND     r9,r9,r14,LSR #16
  566.       ADD     r10,r10,r9,LSL #16
  567.       LDRB    r9,[r11,r8,LSR #14]
  568.           AND     r9,r9,r14,LSR #16
  569.       ADD     r10,r10,r9,LSL #24
  570.       STR     r10,[r12],#320
  571.       STR     r10,[r12],#320
  572.       ADD     r5,r5,r1
  573.       ADD     r6,r6,r2
  574.       ADD     r7,r7,r3
  575.       ADD     r8,r8,r4
  576.       SUB     r14,r14,#1
  577.           MOVS    r10,r14,LSL #16
  578.       BEQ     EndPlotBlock
  579.  
  580.       LDRB    r10,[r11,r5,LSR #14]
  581.           AND     r10,r10,r14,LSR #16
  582.       LDRB    r9,[r11,r6,LSR #14]
  583.           AND     r9,r9,r14,LSR #16
  584.       ADD     r10,r10,r9,LSL #8
  585.       LDRB    r9,[r11,r7,LSR #14]
  586.           AND     r9,r9,r14,LSR #16
  587.       ADD     r10,r10,r9,LSL #16
  588.       LDRB    r9,[r11,r8,LSR #14]
  589.           AND     r9,r9,r14,LSR #16
  590.       ADD     r10,r10,r9,LSL #24
  591.       STR     r10,[r12],#320
  592.       STR     r10,[r12],#320
  593.       ADD     r5,r5,r1
  594.       ADD     r6,r6,r2
  595.       ADD     r7,r7,r3
  596.       ADD     r8,r8,r4
  597.       SUB     r14,r14,#1
  598.           MOVS    r10,r14,LSL #16
  599.       BEQ     EndPlotBlock
  600.  
  601.       LDRB    r10,[r11,r5,LSR #14]
  602.           AND     r10,r10,r14,LSR #16
  603.       LDRB    r9,[r11,r6,LSR #14]
  604.           AND     r9,r9,r14,LSR #16
  605.       ADD     r10,r10,r9,LSL #8
  606.       LDRB    r9,[r11,r7,LSR #14]
  607.           AND     r9,r9,r14,LSR #16
  608.       ADD     r10,r10,r9,LSL #16
  609.       LDRB    r9,[r11,r8,LSR #14]
  610.           AND     r9,r9,r14,LSR #16
  611.       ADD     r10,r10,r9,LSL #24
  612.       STR     r10,[r12],#320
  613.       STR     r10,[r12],#320
  614.       ADD     r5,r5,r1
  615.       ADD     r6,r6,r2
  616.       ADD     r7,r7,r3
  617.       ADD     r8,r8,r4
  618.       SUB     r14,r14,#1
  619.           MOVS    r10,r14,LSL #16
  620.       BEQ     EndPlotBlock
  621.  
  622.       LDRB    r10,[r11,r5,LSR #14]
  623.           AND     r10,r10,r14,LSR #16
  624.       LDRB    r9,[r11,r6,LSR #14]
  625.           AND     r9,r9,r14,LSR #16
  626.       ADD     r10,r10,r9,LSL #8
  627.       LDRB    r9,[r11,r7,LSR #14]
  628.           AND     r9,r9,r14,LSR #16
  629.       ADD     r10,r10,r9,LSL #16
  630.       LDRB    r9,[r11,r8,LSR #14]
  631.           AND     r9,r9,r14,LSR #16
  632.       ADD     r10,r10,r9,LSL #24
  633.       STR     r10,[r12],#320
  634.       STR     r10,[r12],#320
  635.       ADD     r5,r5,r1
  636.       ADD     r6,r6,r2
  637.       ADD     r7,r7,r3
  638.       ADD     r8,r8,r4
  639.       SUB     r14,r14,#1
  640.           MOVS    r10,r14,LSL #16
  641.       BEQ     EndPlotBlock
  642.  
  643.       LDRB    r10,[r11,r5,LSR #14]
  644.           AND     r10,r10,r14,LSR #16
  645.       LDRB    r9,[r11,r6,LSR #14]
  646.           AND     r9,r9,r14,LSR #16
  647.       ADD     r10,r10,r9,LSL #8
  648.       LDRB    r9,[r11,r7,LSR #14]
  649.           AND     r9,r9,r14,LSR #16
  650.       ADD     r10,r10,r9,LSL #16
  651.       LDRB    r9,[r11,r8,LSR #14]
  652.           AND     r9,r9,r14,LSR #16
  653.       ADD     r10,r10,r9,LSL #24
  654.       STR     r10,[r12],#320
  655.       STR     r10,[r12],#320
  656.       ADD     r5,r5,r1
  657.       ADD     r6,r6,r2
  658.       ADD     r7,r7,r3
  659.       ADD     r8,r8,r4
  660.       SUB     r14,r14,#1
  661.           MOVS    r10,r14,LSL #16
  662.        BNE     StartPlotBlock
  663.  
  664.  
  665. EndPlotBlock
  666.  
  667.           STMIA   r0,{r5-r8}       ; save gradient/data combos
  668.           STR     r12,[r0,#32]       ; save screen address
  669.           SUB     r0,r0,#32        ; reset pointer to start of height data
  670.           LDR     r6,[r0,#72]
  671.  
  672.        ;draw lower section of line 1
  673.        MOV     r5,r12       ; get old screen address
  674.           LDR     r1,[r0]          ; get height of line 1
  675.           SUB     r1,r1,r6         ; length = height - smallest height
  676.           MOVS    r1,r1,LSR #1     ; divide by 2
  677.           BEQ     LowerLine2
  678.        LDR     r2,[r0,#16]      ; load gradient of line 1
  679.       LDR     r3,[r0,#32]      ; load gradient/data combo for line 1
  680.       LDR     r4,[r0,#48]      ; load data address of data for line 1
  681.           BL      DrawByteLine
  682.  
  683. LowerLine2
  684.       ;draw lower section of line 2
  685.       ADD     r5,r12,#1
  686.           LDR     r1,[r0,#4]       ; get height of line 2
  687.           SUB     r1,r1,r6         ; length = height - smallest height
  688.           MOVS    r1,r1,LSR #1     ; divide by 2
  689.           BEQ     LowerLine3
  690.        LDR     r2,[r0,#20]      ; load gradient of line 2
  691.       LDR     r3,[r0,#36]      ; load gradient/data combo for line 2
  692.       LDR     r4,[r0,#52]      ; load data address of data for line 2
  693.           BL      DrawByteLine
  694.  
  695. LowerLine3
  696.       ;draw lower section of line 3
  697.       ADD     r5,r12,#2
  698.           LDR     r1,[r0,#8]       ; get height of line 3
  699.           SUB     r1,r1,r6         ; length = height - smallest height
  700.           MOVS    r1,r1,LSR #1     ; divide by 2
  701.           BEQ     LowerLine4
  702.        LDR     r2,[r0,#24]      ; load gradient of line 3
  703.       LDR     r3,[r0,#40]      ; load gradient/data combo for line 3
  704.       LDR     r4,[r0,#56]      ; load data address of data for line 3
  705.           BL      DrawByteLine
  706.  
  707. LowerLine4
  708.       ;draw lower section of line 4
  709.       ADD     r5,r12,#3
  710.           LDR     r1,[r0,#12]      ; get height of line 1
  711.           SUB     r1,r1,r6         ; length = height - smallest height
  712.           MOVS    r1,r1,LSR #1     ; divide by 2
  713.           BEQ     EndDSLine
  714.        LDR     r2,[r0,#28]      ; load gradient of line 1
  715.       LDR     r3,[r0,#44]      ; load gradient/data combo for line 1
  716.       LDR     r4,[r0,#60]      ; load data address of data for line 1
  717.           BL      DrawByteLine
  718.  
  719. EndDSLine
  720.  
  721.           B       OuterLoop
  722.  
  723. EndOuterLoop
  724.           LDMFD   r13!,{r0-r12,pc}
  725.  
  726. DBLineX   DCB     "DrawByteLine", 0
  727.           ALIGN
  728. DBLineY   DCD     &ff000000 + DBLineY - DBLineX
  729.  
  730. ;scale line of graphics block to height value.
  731. ;on entry -
  732. ;           r1  = length of line to draw
  733. ;           r2  = gradient of line
  734. ;           r3  = gradient counter plus data address
  735. ;        r5  = screen address
  736. ;           r14 = return address
  737. ;
  738. ;on exit -
  739. ;           r1  = zero
  740. ;           r2  = gradient of line
  741. ;           r3  = gradient counter plus data address, updated
  742. ;           r5  = updated screen address
  743. ;           r14 = return address
  744. ;
  745.  
  746.  
  747. DrawByteLine
  748.  
  749.       ;store return location on stack
  750.           STMFD   r13!,{r14}
  751.  
  752. ByteLineLoop
  753.           ;load AND value
  754.           LDR   r14,[r0,#88]
  755.  
  756.           LDRB  r10,[r11,r3,LSR #14]
  757.           AND   r10,r10,r14,LSR #16
  758.           STRB  r10,[r5],#320
  759.           STRB  r10,[r5],#320
  760.           ADD   r3,r3,r2
  761.       SUBS  r1,r1,#1
  762.       BEQ   EndByteLine
  763.           LDRB  r10,[r11,r3,LSR #14]
  764.           AND   r10,r10,r14,LSR #16
  765.           STRB  r10,[r5],#320
  766.           STRB  r10,[r5],#320
  767.           ADD   r3,r3,r2
  768.       SUBS  r1,r1,#1
  769.       BEQ   EndByteLine
  770.           LDRB  r10,[r11,r3,LSR #14]
  771.           AND   r10,r10,r14,LSR #16
  772.           STRB  r10,[r5],#320
  773.           STRB  r10,[r5],#320
  774.           ADD   r3,r3,r2
  775.       SUBS  r1,r1,#1
  776.       BEQ   EndByteLine
  777.           LDRB  r10,[r11,r3,LSR #14]
  778.           AND   r10,r10,r14,LSR #16
  779.           STRB  r10,[r5],#320
  780.           STRB  r10,[r5],#320
  781.           ADD   r3,r3,r2
  782.       SUBS  r1,r1,#1
  783.           BEQ   EndByteLine
  784.           LDRB  r10,[r11,r3,LSR #14]
  785.           AND   r10,r10,r14,LSR #16
  786.           STRB  r10,[r5],#320
  787.           STRB  r10,[r5],#320
  788.           ADD   r3,r3,r2
  789.       SUBS  r1,r1,#1
  790.       BEQ   EndByteLine
  791.           LDRB  r10,[r11,r3,LSR #14]
  792.           AND   r10,r10,r14,LSR #16
  793.           STRB  r10,[r5],#320
  794.           STRB  r10,[r5],#320
  795.           ADD   r3,r3,r2
  796.       SUBS  r1,r1,#1
  797.       BEQ   EndByteLine
  798.           LDRB  r10,[r11,r3,LSR #14]
  799.           AND   r10,r10,r14,LSR #16
  800.           STRB  r10,[r5],#320
  801.           STRB  r10,[r5],#320
  802.           ADD   r3,r3,r2
  803.       SUBS  r1,r1,#1
  804.       BEQ   EndByteLine
  805.           LDRB  r10,[r11,r3,LSR #14]
  806.           AND   r10,r10,r14,LSR #16
  807.           STRB  r10,[r5],#320
  808.           STRB  r10,[r5],#320
  809.           ADD   r3,r3,r2
  810.       SUBS  r1,r1,#1
  811.       BNE   ByteLineLoop
  812.  
  813. EndByteLine
  814.           LDMFD   r13!,{r15}
  815.  
  816. BRDScreenX DCB     "BigRedrawScreen", 0
  817.            ALIGN
  818. BRDScreenY DCD     &ff000000 + BRDScreenY - BRDScreenX
  819.  
  820. ;draw background graphics.
  821. ;on entry -
  822. ;           r0 = screen address
  823.  
  824. |BigRedrawScreenVGA|
  825.       STMFD   r13!,{r0-r12,link}
  826.  
  827.       ;initial height value
  828.       MOV     r1,#128
  829.  
  830.       ;load initial colour value into r2 & make word sized
  831.       MOV     r2,#44
  832.       ADD     r2,r2,r2,LSL #8
  833.       ADD     r2,r2,r2,LSL #16
  834.  
  835.       ;move into other registers
  836.       MOV     r3,r2
  837.       MOV     r4,r2
  838.       MOV     r5,r2
  839.       MOV     r6,r2
  840.       MOV     r7,r2
  841.       MOV     r8,r2
  842.       MOV     r9,r2
  843.       MOV     r10,r2
  844.       MOV     r11,r2
  845.  
  846.  
  847. BRDloop   STMIA   r0!,{r2-r11} ;plot one line of colour data on screen
  848.       STMIA   r0!,{r2-r11}
  849.       STMIA   r0!,{r2-r11}
  850.       STMIA   r0!,{r2-r11}
  851.       STMIA   r0!,{r3-r11}
  852.       STMIA   r0!,{r2-r11}
  853.       STMIA   r0!,{r2-r11}
  854.       STMIA   r0!,{r2-r11}
  855.  
  856.       SUBS      r1,r1,#1
  857.       BNE     BRDloop
  858.  
  859.       ;next height value
  860.       MOV     r1,#128
  861.  
  862.       ;load next colour value into r2 & make word sized
  863.       MOV     r2,#46
  864.       ADD     r2,r2,r2,LSL #8
  865.       ADD     r2,r2,r2,LSL #16
  866.  
  867.       ;move into other registers
  868.       MOV     r3,r2
  869.       MOV     r4,r2
  870.       MOV     r5,r2
  871.       MOV     r6,r2
  872.       MOV     r7,r2
  873.       MOV     r8,r2
  874.       MOV     r9,r2
  875.       MOV     r10,r2
  876.       MOV     r11,r2
  877.  
  878. BRDloopA  STMIA   r0!,{r2-r11} ;plot one line of colour data on screen
  879.       STMIA   r0!,{r2-r11}
  880.       STMIA   r0!,{r2-r11}
  881.       STMIA   r0!,{r2-r11}
  882.       STMIA   r0!,{r2-r11}
  883.       STMIA   r0!,{r2-r11}
  884.       STMIA   r0!,{r2-r11}
  885.       STMIA   r0!,{r2-r11}
  886.  
  887.       SUBS      r1,r1,#1
  888.       BNE     BRDloopA
  889.  
  890. EndBRDScreen
  891.           LDMFD   r13!,{r0-r12,pc}
  892.  
  893.  
  894.       END
  895.