home *** CD-ROM | disk | FTP | other *** search
/ Dream 44 / Amiga_Dream_44.iso / RiscPc / jeux / biohazard.arc / s / Floor < prev    next >
Text File  |  1995-01-02  |  14KB  |  509 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  |PlotFloor|
  17.  
  18. PltFloorX DCB     "PlotFloor", 0
  19.           ALIGN
  20. PltFloorY DCD     &ff000000 + PltFloorY - PltFloorX
  21.  
  22. ;on entry
  23. ;
  24. ; r0 = pointer to data block where :-
  25. ;
  26. ; 0 = pointer to perspective plot data
  27. ;         format of plot data is :-
  28. ;           word 1...x1 x start position
  29. ;           word 2...y1 y start position
  30. ;           word 3...xg x increment value (per screen pixel)
  31. ;           word 4...yg y increment value (per screen pixel)
  32. ; 1 = screen address (of the first line to draw on)
  33. ; 2 = pointer to sprite data to use as floor.
  34. ;        This is simply a 64x64 block of data
  35. ; 3 = counter (number of lines to draw)
  36. ; 4 = x offset
  37. ; 5 = y offset
  38. ; 6 = screen width
  39. ; 7 = screen height
  40.  
  41. |PlotFloor|
  42.       STMFD   r13!,{r0-r12,link}
  43.  
  44.       ;load up block data
  45.           MOV     r14,r0
  46.           LDMIA   r14,{r0-r9}
  47.  
  48.       ;combine x & y offsets
  49.           MOV     r12,r4,LSR #16
  50.           MOV     r12,r12,LSL #16
  51.           ADD     r4,r12,r5,LSR #16
  52.  
  53.       ;move sin theta to r5 to free r9
  54.           MOV     r5,r9
  55.  
  56. Plot_Loop
  57.       ;load up the next block of perspective plot data
  58.       LDMIA   r0!,{r9-r12}
  59.  
  60.           ;store vars on stack
  61.           ;  screen address is updated by line drawing procedure
  62.           ;  source base is used by the line drawing program and not changed
  63.           STMFD   r13!,{r0,r3-r8}
  64.  
  65.       ;rotate x1 & y1 coordinates
  66.       MOV     r0,r9,ASR #10
  67.       MOV     r3,r10,ASR #10
  68.           MUL     r7,r8,r0        ;x * cos theta
  69.       MUL     r14,r5,r3       ;y * sin theta
  70.           SUB     r9,r7,r14       ;x = (x * cos theta) - (y * sin theta)
  71.  
  72.       MUL     r14,r5,r0       ;x * sin theta
  73.           MUL     r0,r8,r3        ;y * cos theta
  74.           ADD     r10,r14,r0      ;y = (x * sin theta) + (y * cos theta)
  75.  
  76.       MOV     r9,r9,ASR #6
  77.       MOV     r10,r10,ASR #6
  78.  
  79.       ;rotate xg & yg coordinates
  80.       MOV     r0,r11,ASR #4
  81.       MOV     r3,r12,ASR #4
  82.       MOV     r5,r5,ASR #4
  83.       MOV     r8,r8,ASR #4
  84.           MUL     r7,r8,r0        ;x * cos theta
  85.       MUL     r14,r5,r3       ;y * sin theta
  86.           SUB     r11,r7,r14       ;x = (x * cos theta) - (y * sin theta)
  87.  
  88.       MUL     r14,r5,r0       ;x * sin theta
  89.           MUL     r0,r8,r3        ;y * cos theta
  90.           ADD     r12,r14,r0      ;y = (x * sin theta) + (y * cos theta)
  91.  
  92.       MOV     r11,r11,ASR #8
  93.       MOV     r12,r12,ASR #8
  94.  
  95.       ;main line drawing procedure
  96.  
  97.       ;adjust offsets
  98.       MOV     r14,r4,ASR #16
  99.       SUB     r9,r9,r4,LSL #16
  100.           ADD     r10,r10,r14,LSL #16
  101.  
  102.       ;load screen width and 127 register
  103.       MOV     r4,r6
  104.       MOV     r3,#127
  105.  
  106. Draw_Line
  107.       ;extract x,y positions in sprite data from x & y
  108.           AND     r0,r3,r9,LSR #16
  109.           AND     r14,r3,r10,LSR #16
  110.  
  111.       ;construct address from x & y values
  112.           ADD     r0,r0,r14,LSL #7
  113.  
  114.           ;load byte from source_base + (x + 128(y))
  115.           LDRB    r5,[r2,r0]
  116.  
  117.           ;update x & y
  118.           ADD     r9,r9,r11
  119.           ADD     r10,r10,r12
  120.  
  121.       ;load byte 2 word 1
  122.           AND     r0,r3,r9,LSR #16
  123.           AND     r14,r3,r10,LSR #16
  124.           ADD     r0,r0,r14,LSL #7
  125.           LDRB    r14,[r2,r0]
  126.           ADD     r5,r5,r14,LSL #8
  127.           ADD     r9,r9,r11
  128.           ADD     r10,r10,r12
  129.  
  130.       ;load byte 3 word 1
  131.           AND     r0,r3,r9,LSR #16
  132.           AND     r14,r3,r10,LSR #16
  133.           ADD     r0,r0,r14,LSL #7
  134.           LDRB    r14,[r2,r0]
  135.           ADD     r5,r5,r14,LSL #16
  136.           ADD     r9,r9,r11
  137.           ADD     r10,r10,r12
  138.  
  139.       ;load byte 4 word 1
  140.           AND     r0,r3,r9,LSR #16
  141.           AND     r14,r3,r10,LSR #16
  142.           ADD     r0,r0,r14,LSL #7
  143.           LDRB    r14,[r2,r0]
  144.           ADD     r5,r5,r14,LSL #24
  145.           ADD     r9,r9,r11
  146.           ADD     r10,r10,r12
  147.  
  148.       ;load byte 1 word 2
  149.           AND     r0,r3,r9,LSR #16
  150.           AND     r14,r3,r10,LSR #16
  151.           ADD     r0,r0,r14,LSL #7
  152.           LDRB    r6,[r2,r0]
  153.           ADD     r9,r9,r11
  154.           ADD     r10,r10,r12
  155.  
  156.       ;load byte 2 word 2
  157.           AND     r0,r3,r9,LSR #16
  158.           AND     r14,r3,r10,LSR #16
  159.           ADD     r0,r0,r14,LSL #7
  160.           LDRB    r14,[r2,r0]
  161.           ADD     r6,r6,r14,LSL #8
  162.           ADD     r9,r9,r11
  163.           ADD     r10,r10,r12
  164.  
  165.       ;load byte 3 word 2
  166.           AND     r0,r3,r9,LSR #16
  167.           AND     r14,r3,r10,LSR #16
  168.           ADD     r0,r0,r14,LSL #7
  169.           LDRB    r14,[r2,r0]
  170.           ADD     r6,r6,r14,LSL #16
  171.           ADD     r9,r9,r11
  172.           ADD     r10,r10,r12
  173.  
  174.       ;load byte 4 word 2
  175.           AND     r0,r3,r9,LSR #16
  176.           AND     r14,r3,r10,LSR #16
  177.           ADD     r0,r0,r14,LSL #7
  178.           LDRB    r14,[r2,r0]
  179.           ADD     r6,r6,r14,LSL #24
  180.           ADD     r9,r9,r11
  181.           ADD     r10,r10,r12
  182.  
  183.       ;load byte 1 word 3
  184.           AND     r0,r3,r9,LSR #16
  185.           AND     r14,r3,r10,LSR #16
  186.           ADD     r0,r0,r14,LSL #7
  187.           LDRB    r7,[r2,r0]
  188.           ADD     r9,r9,r11
  189.           ADD     r10,r10,r12
  190.  
  191.       ;load byte 2 word 3
  192.           AND     r0,r3,r9,LSR #16
  193.           AND     r14,r3,r10,LSR #16
  194.           ADD     r0,r0,r14,LSL #7
  195.           LDRB    r14,[r2,r0]
  196.           ADD     r7,r7,r14,LSL #8
  197.           ADD     r9,r9,r11
  198.           ADD     r10,r10,r12
  199.  
  200.       ;load byte 3 word 3
  201.           AND     r0,r3,r9,LSR #16
  202.           AND     r14,r3,r10,LSR #16
  203.           ADD     r0,r0,r14,LSL #7
  204.           LDRB    r14,[r2,r0]
  205.           ADD     r7,r7,r14,LSL #16
  206.           ADD     r9,r9,r11
  207.           ADD     r10,r10,r12
  208.  
  209.       ;load byte 4 word 3
  210.           AND     r0,r3,r9,LSR #16
  211.           AND     r14,r3,r10,LSR #16
  212.           ADD     r0,r0,r14,LSL #7
  213.           LDRB    r14,[r2,r0]
  214.           ADD     r7,r7,r14,LSL #24
  215.           ADD     r9,r9,r11
  216.           ADD     r10,r10,r12
  217.  
  218.       ;load byte 1 word 4
  219.           AND     r0,r3,r9,LSR #16
  220.           AND     r14,r3,r10,LSR #16
  221.           ADD     r0,r0,r14,LSL #7
  222.           LDRB    r8,[r2,r0]
  223.           ADD     r9,r9,r11
  224.           ADD     r10,r10,r12
  225.  
  226.       ;load byte 2 word 4
  227.           AND     r0,r3,r9,LSR #16
  228.           AND     r14,r3,r10,LSR #16
  229.           ADD     r0,r0,r14,LSL #7
  230.           LDRB    r14,[r2,r0]
  231.           ADD     r8,r8,r14,LSL #8
  232.           ADD     r9,r9,r11
  233.           ADD     r10,r10,r12
  234.  
  235.       ;load byte 3 word 4
  236.           AND     r0,r3,r9,LSR #16
  237.           AND     r14,r3,r10,LSR #16
  238.           ADD     r0,r0,r14,LSL #7
  239.           LDRB    r14,[r2,r0]
  240.           ADD     r8,r8,r14,LSL #16
  241.           ADD     r9,r9,r11
  242.           ADD     r10,r10,r12
  243.  
  244.       ;load byte 4 word 4
  245.           AND     r0,r3,r9,LSR #16
  246.           AND     r14,r3,r10,LSR #16
  247.           ADD     r0,r0,r14,LSL #7
  248.           LDRB    r14,[r2,r0]
  249.           ADD     r8,r8,r14,LSL #24
  250.           ADD     r9,r9,r11
  251.           ADD     r10,r10,r12
  252.  
  253.       ;write block to screen
  254.           STMIA   r1!,{r5-r8}
  255.           SUBS    r4,r4,#16
  256.           BNE     Draw_Line
  257.  
  258.       ;load vars from stack & decrement line counter
  259.           LDMFD   r13!,{r0,r3-r8}
  260.           SUBS    r3,r3,#1
  261.  
  262.       ;adjust pointer to screen to start of next line
  263.           RSB     r9,r6,#320
  264.           ADD     r1,r1,r9
  265.  
  266.           BNE     Plot_Loop
  267.  
  268.           LDMFD   r13!,{r0-r12,link}
  269.       STMFD   r13!,{r0-r12,link}
  270.  
  271.       ;load up block data
  272.           MOV     r14,r0
  273.           LDMIA   r14,{r0-r9}
  274.           ADD     r2,r2,#16384
  275.  
  276.       ;combine x & y offsets
  277.           MOV     r12,r4,LSR #16
  278.           MOV     r12,r12,LSL #16
  279.           ADD     r4,r12,r5,LSR #16
  280.  
  281.       ;move sin theta to r5 to free r9
  282.           MOV     r5,r9
  283.  
  284.       ;adjust screen address
  285.       RSB     r14,r3,r7,LSR #1    ;r14 = screen_height/2 - lines
  286.           MOV     r10,r14,LSL #6
  287.           ADD     r9,r10,r14,LSL #8   ;r6  = r14 * 640
  288.           SUB     r1,r1,r9,LSL #1
  289.       SUB     r1,r1,#320
  290.  
  291. Plot_Loop1
  292.       ;load up the next block of perspective plot data
  293.       LDMIA   r0!,{r9-r12}
  294.  
  295.           ;store vars on stack
  296.           ;  screen address is updated by line drawing procedure
  297.           ;  source base is used by the line drawing program and not changed
  298.           STMFD   r13!,{r0,r3-r8}
  299.  
  300.       ;rotate x1 & y1 coordinates
  301.       MOV     r0,r9,ASR #10
  302.       MOV     r3,r10,ASR #10
  303.           MUL     r7,r8,r0        ;x * cos theta
  304.       MUL     r14,r5,r3       ;y * sin theta
  305.           SUB     r9,r7,r14       ;x = (x * cos theta) - (y * sin theta)
  306.  
  307.       MUL     r14,r5,r0       ;x * sin theta
  308.           MUL     r0,r8,r3        ;y * cos theta
  309.           ADD     r10,r14,r0      ;y = (x * sin theta) + (y * cos theta)
  310.  
  311.       MOV     r9,r9,ASR #6
  312.       MOV     r10,r10,ASR #6
  313.  
  314.       ;rotate xg & yg coordinates
  315.       MOV     r0,r11,ASR #4
  316.       MOV     r3,r12,ASR #4
  317.       MOV     r5,r5,ASR #4
  318.       MOV     r8,r8,ASR #4
  319.           MUL     r7,r8,r0        ;x * cos theta
  320.       MUL     r14,r5,r3       ;y * sin theta
  321.           SUB     r11,r7,r14       ;x = (x * cos theta) - (y * sin theta)
  322.  
  323.       MUL     r14,r5,r0       ;x * sin theta
  324.           MUL     r0,r8,r3        ;y * cos theta
  325.           ADD     r12,r14,r0      ;y = (x * sin theta) + (y * cos theta)
  326.  
  327.       MOV     r11,r11,ASR #8
  328.       MOV     r12,r12,ASR #8
  329.  
  330.       ;main line drawing procedure
  331.  
  332.       ;adjust offsets
  333.       MOV     r14,r4,ASR #16
  334.       SUB     r9,r9,r4,LSL #16
  335.           ADD     r10,r10,r14,LSL #16
  336.  
  337.       ;load screen width and 63 register
  338.           ;ADR     r4,screen_wth
  339.       MOV     r4,r6
  340.           MOV     r3,#127
  341.  
  342. Draw_Line1
  343.       ;extract x,y positions in sprite data from x & y
  344.           AND     r0,r3,r9,LSR #16
  345.           AND     r14,r3,r10,LSR #16
  346.  
  347.       ;construct address from x & y values
  348.           ADD     r0,r0,r14,LSL #7
  349.  
  350.           ;load byte from source_base + (x + 64(y))
  351.           LDRB    r5,[r2,r0]
  352.  
  353.           ;update x & y
  354.           ADD     r9,r9,r11
  355.           ADD     r10,r10,r12
  356.  
  357.       ;load byte 2 word 1
  358.           AND     r0,r3,r9,LSR #16
  359.           AND     r14,r3,r10,LSR #16
  360.           ADD     r0,r0,r14,LSL #7
  361.           LDRB    r14,[r2,r0]
  362.           ADD     r5,r5,r14,LSL #8
  363.           ADD     r9,r9,r11
  364.           ADD     r10,r10,r12
  365.  
  366.       ;load byte 3 word 1
  367.           AND     r0,r3,r9,LSR #16
  368.           AND     r14,r3,r10,LSR #16
  369.           ADD     r0,r0,r14,LSL #7
  370.           LDRB    r14,[r2,r0]
  371.           ADD     r5,r5,r14,LSL #16
  372.           ADD     r9,r9,r11
  373.           ADD     r10,r10,r12
  374.  
  375.       ;load byte 4 word 1
  376.           AND     r0,r3,r9,LSR #16
  377.           AND     r14,r3,r10,LSR #16
  378.           ADD     r0,r0,r14,LSL #7
  379.           LDRB    r14,[r2,r0]
  380.           ADD     r5,r5,r14,LSL #24
  381.           ADD     r9,r9,r11
  382.           ADD     r10,r10,r12
  383.  
  384.       ;load byte 1 word 2
  385.           AND     r0,r3,r9,LSR #16
  386.           AND     r14,r3,r10,LSR #16
  387.           ADD     r0,r0,r14,LSL #7
  388.           LDRB    r6,[r2,r0]
  389.           ADD     r9,r9,r11
  390.           ADD     r10,r10,r12
  391.  
  392.       ;load byte 2 word 2
  393.           AND     r0,r3,r9,LSR #16
  394.           AND     r14,r3,r10,LSR #16
  395.           ADD     r0,r0,r14,LSL #7
  396.           LDRB    r14,[r2,r0]
  397.           ADD     r6,r6,r14,LSL #8
  398.           ADD     r9,r9,r11
  399.           ADD     r10,r10,r12
  400.  
  401.       ;load byte 3 word 2
  402.           AND     r0,r3,r9,LSR #16
  403.           AND     r14,r3,r10,LSR #16
  404.           ADD     r0,r0,r14,LSL #7
  405.           LDRB    r14,[r2,r0]
  406.           ADD     r6,r6,r14,LSL #16
  407.           ADD     r9,r9,r11
  408.           ADD     r10,r10,r12
  409.  
  410.       ;load byte 4 word 2
  411.           AND     r0,r3,r9,LSR #16
  412.           AND     r14,r3,r10,LSR #16
  413.           ADD     r0,r0,r14,LSL #7
  414.           LDRB    r14,[r2,r0]
  415.           ADD     r6,r6,r14,LSL #24
  416.           ADD     r9,r9,r11
  417.           ADD     r10,r10,r12
  418.  
  419.       ;load byte 1 word 3
  420.           AND     r0,r3,r9,LSR #16
  421.           AND     r14,r3,r10,LSR #16
  422.           ADD     r0,r0,r14,LSL #7
  423.           LDRB    r7,[r2,r0]
  424.           ADD     r9,r9,r11
  425.           ADD     r10,r10,r12
  426.  
  427.       ;load byte 2 word 3
  428.           AND     r0,r3,r9,LSR #16
  429.           AND     r14,r3,r10,LSR #16
  430.           ADD     r0,r0,r14,LSL #7
  431.           LDRB    r14,[r2,r0]
  432.           ADD     r7,r7,r14,LSL #8
  433.           ADD     r9,r9,r11
  434.           ADD     r10,r10,r12
  435.  
  436.       ;load byte 3 word 3
  437.           AND     r0,r3,r9,LSR #16
  438.           AND     r14,r3,r10,LSR #16
  439.           ADD     r0,r0,r14,LSL #7
  440.           LDRB    r14,[r2,r0]
  441.           ADD     r7,r7,r14,LSL #16
  442.           ADD     r9,r9,r11
  443.           ADD     r10,r10,r12
  444.  
  445.       ;load byte 4 word 3
  446.           AND     r0,r3,r9,LSR #16
  447.           AND     r14,r3,r10,LSR #16
  448.           ADD     r0,r0,r14,LSL #7
  449.           LDRB    r14,[r2,r0]
  450.           ADD     r7,r7,r14,LSL #24
  451.           ADD     r9,r9,r11
  452.           ADD     r10,r10,r12
  453.  
  454.       ;load byte 1 word 4
  455.           AND     r0,r3,r9,LSR #16
  456.           AND     r14,r3,r10,LSR #16
  457.           ADD     r0,r0,r14,LSL #7
  458.           LDRB    r8,[r2,r0]
  459.           ADD     r9,r9,r11
  460.           ADD     r10,r10,r12
  461.  
  462.       ;load byte 2 word 4
  463.           AND     r0,r3,r9,LSR #16
  464.           AND     r14,r3,r10,LSR #16
  465.           ADD     r0,r0,r14,LSL #7
  466.           LDRB    r14,[r2,r0]
  467.           ADD     r8,r8,r14,LSL #8
  468.           ADD     r9,r9,r11
  469.           ADD     r10,r10,r12
  470.  
  471.       ;load byte 3 word 4
  472.           AND     r0,r3,r9,LSR #16
  473.           AND     r14,r3,r10,LSR #16
  474.           ADD     r0,r0,r14,LSL #7
  475.           LDRB    r14,[r2,r0]
  476.           ADD     r8,r8,r14,LSL #16
  477.           ADD     r9,r9,r11
  478.           ADD     r10,r10,r12
  479.  
  480.       ;load byte 4 word 4
  481.           AND     r0,r3,r9,LSR #16
  482.           AND     r14,r3,r10,LSR #16
  483.           ADD     r0,r0,r14,LSL #7
  484.           LDRB    r14,[r2,r0]
  485.           ADD     r8,r8,r14,LSL #24
  486.           ADD     r9,r9,r11
  487.           ADD     r10,r10,r12
  488.  
  489.       ;write block to screen
  490.           STMIA   r1!,{r5-r8}
  491.           SUBS    r4,r4,#16
  492.           BNE     Draw_Line1
  493.  
  494.       ;load vars from stack & decrement line counter
  495.           LDMFD   r13!,{r0,r3-r8}
  496.           ;SUB     r1,r1,#640
  497.           SUBS    r3,r3,#1
  498.  
  499.       ;adjust pointer to screen to start of next line
  500.           SUB     r1,r1,r6
  501.       SUB     r1,r1,#320
  502.  
  503.           BNE     Plot_Loop1
  504.  
  505. EndPlotFloor
  506.           LDMFD   r13!,{r0-r12,pc}
  507.  
  508.       END
  509.