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