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