home *** CD-ROM | disk | FTP | other *** search
/ Dream 55 / Amiga_Dream_55.iso / RISCOS / MAGAZINE / NEWS / 3DENGI.ZIP / 3DEngine / s / fpuset next >
Text File  |  1998-08-01  |  5KB  |  260 lines

  1.         AREA    |C$$code|, CODE, READONLY
  2.  
  3.         EXPORT    fpusetup
  4.         EXPORT    HackDiv
  5.         EXPORT    Screen_Clear8
  6.         EXPORT    Screen_Clear16
  7.         EXPORT    Screen_Clear24
  8.  
  9.     ; Setup the FPU to not complain about overflows, underflows, infinite values
  10.     ; etc etc. This is what the PC needed. ;-)
  11. fpusetup
  12.     STMFD    r13!, {r0-r12,r14}
  13.     RFS    r0
  14.     BIC    r0,r0,#31<<16
  15. ;    BIC    r0,r0,#1<<8
  16. ;    BIC    r0,r0,#10<<8
  17.     WFS    r0
  18.     LDMFD    r13!, {r0-r12,pc}^    ; return
  19.     [ 0 = 1
  20. HackDiv
  21.     ; Divide r0-r1 by r2. We know that r2 > 0 and -65536 < r0-r1 < 65536
  22.     MOV    r12,#0
  23.     SUBS    r3,r0,r1
  24.     RSBLT    r3,r3,#0
  25.     SUBS    r3,r3,r2,LSL#15
  26.     ADDLT    r3,r3,r2,LSL#15
  27.     ADDGE    r12,r12,#1<<15
  28.     SUBS    r3,r3,r2,LSL#14
  29.     ADDLT    r3,r3,r2,LSL#14
  30.     ADDGE    r12,r12,#1<<14
  31.     SUBS    r3,r3,r2,LSL#13
  32.     ADDLT    r3,r3,r2,LSL#13
  33.     ADDGE    r12,r12,#1<<13
  34.     SUBS    r3,r3,r2,LSL#12
  35.     ADDLT    r3,r3,r2,LSL#12
  36.     ADDGE    r12,r12,#1<<12
  37.     SUBS    r3,r3,r2,LSL#11
  38.     ADDLT    r3,r3,r2,LSL#11
  39.     ADDGE    r12,r12,#1<<11
  40.     SUBS    r3,r3,r2,LSL#10
  41.     ADDLT    r3,r3,r2,LSL#10
  42.     ADDGE    r12,r12,#1<<10
  43.     SUBS    r3,r3,r2,LSL#9
  44.     ADDLT    r3,r3,r2,LSL#9
  45.     ADDGE    r12,r12,#1<<9
  46.     SUBS    r3,r3,r2,LSL#8
  47.     ADDLT    r3,r3,r2,LSL#8
  48.     ADDGE    r12,r12,#1<<8
  49.     SUBS    r3,r3,r2,LSL#7
  50.     ADDLT    r3,r3,r2,LSL#7
  51.     ADDGE    r12,r12,#1<<7
  52.     SUBS    r3,r3,r2,LSL#6
  53.     ADDLT    r3,r3,r2,LSL#6
  54.     ADDGE    r12,r12,#1<<6
  55.     SUBS    r3,r3,r2,LSL#5
  56.     ADDLT    r3,r3,r2,LSL#5
  57.     ADDGE    r12,r12,#1<<5
  58.     SUBS    r3,r3,r2,LSL#4
  59.     ADDLT    r3,r3,r2,LSL#4
  60.     ADDGE    r12,r12,#1<<4
  61.     SUBS    r3,r3,r2,LSL#3
  62.     ADDLT    r3,r3,r2,LSL#3
  63.     ADDGE    r12,r12,#1<<3
  64.     SUBS    r3,r3,r2,LSL#2
  65.     ADDLT    r3,r3,r2,LSL#2
  66.     ADDGE    r12,r12,#1<<2
  67.     SUBS    r3,r3,r2,LSL#1
  68.     ADDLT    r3,r3,r2,LSL#1
  69.     ADDGE    r12,r12,#1<<1
  70.     SUBS    r3,r3,r2,LSL#0
  71.     ADDLT    r3,r3,r2,LSL#0
  72.     ADDGE    r12,r12,#1<<0
  73.     SUBS    r0,r0,r1
  74.     MOVGE    r0,r12
  75.     RSBLT    r0,r12,#0
  76.     MOVS    PC,R14
  77.     |
  78. HackDiv
  79.     ; Divide r0-r1 by r2. We know that r2 > 0 and -65536 < r0-r1 < 65536
  80.     MOV    r12,#0
  81.     SUBS    r3,r0,r1
  82.     RSBLT    r3,r3,#0
  83.     CMP    r3,r2,LSL#9
  84.     BLE    hd_mid
  85.     SUBS    r3,r3,r2,LSL#15
  86.     ADDLT    r3,r3,r2,LSL#15
  87.     ADDGE    r12,r12,#1<<15
  88.     SUBS    r3,r3,r2,LSL#14
  89.     ADDLT    r3,r3,r2,LSL#14
  90.     ADDGE    r12,r12,#1<<14
  91.     SUBS    r3,r3,r2,LSL#13
  92.     ADDLT    r3,r3,r2,LSL#13
  93.     ADDGE    r12,r12,#1<<13
  94.     SUBS    r3,r3,r2,LSL#12
  95.     ADDLT    r3,r3,r2,LSL#12
  96.     ADDGE    r12,r12,#1<<12
  97.     SUBS    r3,r3,r2,LSL#11
  98.     ADDLT    r3,r3,r2,LSL#11
  99.     ADDGE    r12,r12,#1<<11
  100.     SUBS    r3,r3,r2,LSL#10
  101.     ADDLT    r3,r3,r2,LSL#10
  102.     ADDGE    r12,r12,#1<<10
  103.     SUBS    r3,r3,r2,LSL#9
  104.     ADDLT    r3,r3,r2,LSL#9
  105.     ADDGE    r12,r12,#1<<9
  106. hd_mid
  107.     SUBS    r3,r3,r2,LSL#8
  108.     ADDLT    r3,r3,r2,LSL#8
  109.     ADDGE    r12,r12,#1<<8
  110.     SUBS    r3,r3,r2,LSL#7
  111.     ADDLT    r3,r3,r2,LSL#7
  112.     ADDGE    r12,r12,#1<<7
  113.     SUBS    r3,r3,r2,LSL#6
  114.     ADDLT    r3,r3,r2,LSL#6
  115.     ADDGE    r12,r12,#1<<6
  116.     SUBS    r3,r3,r2,LSL#5
  117.     ADDLT    r3,r3,r2,LSL#5
  118.     ADDGE    r12,r12,#1<<5
  119.     SUBS    r3,r3,r2,LSL#4
  120.     ADDLT    r3,r3,r2,LSL#4
  121.     ADDGE    r12,r12,#1<<4
  122.     SUBS    r3,r3,r2,LSL#3
  123.     ADDLT    r3,r3,r2,LSL#3
  124.     ADDGE    r12,r12,#1<<3
  125.     SUBS    r3,r3,r2,LSL#2
  126.     ADDLT    r3,r3,r2,LSL#2
  127.     ADDGE    r12,r12,#1<<2
  128.     SUBS    r3,r3,r2,LSL#1
  129.     ADDLT    r3,r3,r2,LSL#1
  130.     ADDGE    r12,r12,#1<<1
  131.     SUBS    r3,r3,r2,LSL#0
  132.     ADDLT    r3,r3,r2,LSL#0
  133.     ADDGE    r12,r12,#1<<0
  134.     SUBS    r0,r0,r1
  135.     MOVGE    r0,r12
  136.     RSBLT    r0,r12,#0
  137.     MOVS    PC,R14
  138.     ]
  139. Screen_Clear24
  140.     ; r0 = char *screen_ptr
  141.     ; r1 = int width
  142.     ; r2 = int height
  143.     STMFD    r13!,{r4-r11,r14}
  144.  
  145.     MOV    r12,#0        ; r12 = Colour Reg
  146.     MOV    r14,r2        ; r14 = Bresenham
  147.     MOV    r3,r2
  148. sclp24
  149.     MOV    r4,r1
  150.     MOV    r11,r12
  151.     MOV    r10,r12
  152.     MOV    r9,r12
  153.     MOV    r8,r12
  154.     MOV    r7,r12
  155.     MOV    r6,r12
  156.     MOV    r5,r12
  157. scrlp24
  158.     SUBS    r4,r4,#8
  159.     STMGEIA    r0!,{r5-r12}
  160.     BGT    scrlp24
  161.     SUBS    r4,r4,#4
  162.     STMGEIA    r0!,{r9-r12}
  163.     SUBS    r4,r4,#2
  164.     STMGEIA    r0!,{r11-r12}
  165.     SUBS    r4,r4,#1
  166.     STRGE    r12,[r0],#4
  167.  
  168.     SUBS    r14,r14,#256
  169.     ADDLT    r14,r14,r2
  170.     ADDLT    r12,r12,#1
  171.     SUBS    r3,r3,#1
  172.     BGT    sclp24
  173.  
  174.     LDMFD    r13!,{r4-r11,PC}^
  175. Screen_Clear16
  176.     ; r0 = char *screen_ptr
  177.     ; r1 = int width
  178.     ; r2 = int height
  179.     STMFD    r13!,{r4-r11,r14}
  180.  
  181.     MOV    r12,#0        ; r12 = Colour Reg
  182.     MOV    r14,r2        ; r14 = Bresenham
  183.     MOV    r3,r2
  184. sclp16
  185.     MOV    r4,r1
  186.     MOV    r11,r12
  187.     MOV    r10,r12
  188.     MOV    r9,r12
  189.     MOV    r8,r12
  190.     MOV    r7,r12
  191.     MOV    r6,r12
  192.     MOV    r5,r12
  193. scrlp16
  194.     SUBS    r4,r4,#8*2
  195.     STMGEIA    r0!,{r5-r12}
  196.     BGT    scrlp16
  197.     SUBS    r4,r4,#4*2
  198.     STMGEIA    r0!,{r9-r12}
  199.     SUBS    r4,r4,#2*2
  200.     STMGEIA    r0!,{r11-r12}
  201.     SUBS    r4,r4,#1*2
  202.     STRGE    r12,[r0],#4
  203.  
  204.     SUBS    r14,r14,#32
  205.     ADDLT    r14,r14,r2
  206.     ADDLT    r12,r12,#1
  207.     ADDLT    r12,r12,#1<<16
  208.     SUBS    r3,r3,#1
  209.     BGT    sclp16
  210.  
  211.     LDMFD    r13!,{r4-r11,PC}^
  212. Screen_Clear8
  213.     ; r0 = char *screen_ptr
  214.     ; r1 = int width
  215.     ; r2 = int height
  216.     STMFD    r13!,{r4-r11,r14}
  217.  
  218.     MOV    r12,#4        ; r12 = Colour Reg
  219.     ORR    r12,r12,r12,LSL#8
  220.     ORR    r12,r12,r12,LSL#16
  221.     MOV    r14,r2        ; r14 = Bresenham
  222.     MOV    r3,r2
  223. sclp8
  224.     MOV    r4,r1
  225.     MOV    r11,r12
  226.     MOV    r10,r12
  227.     MOV    r9,r12
  228.     MOV    r8,r12
  229.     MOV    r7,r12
  230.     MOV    r6,r12
  231.     MOV    r5,r12
  232. scrlp8
  233.     SUBS    r4,r4,#8*4
  234.     STMGEIA    r0!,{r5-r12}
  235.     BGT    scrlp8
  236.     ADDLT    r4,r4,#8*4
  237.     TST    r4,#16
  238.     STMNEIA    r0!,{r9-r12}
  239.     TST    r4,#8
  240.     STMNEIA    r0!,{r11-r12}
  241.     TST    r4,#4
  242.     STRNE    r12,[r0],#4
  243.  
  244.     SUBS    r14,r14,#12
  245.     ADR    r9,backtab
  246.     LDRLTB    r12,[r9,r12,LSR#24]
  247.     ADDLT    r14,r14,r2
  248.     ORRLT    r12,r12,r12,LSL#8
  249.     ORRLT    r12,r12,r12,LSL#16
  250.     SUBS    r3,r3,#1
  251.     BGT    sclp8
  252.  
  253.     LDMFD    r13!,{r4-r11,PC}^
  254. backtab
  255.     DCB    0x01,0x02,0x03,0x04, 0x05,0x06,0x07,0x10
  256.     DCB    0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00
  257.     DCB    0x11,0x12,0x13,0x14, 0x15,0x16,0x17,0x00
  258.  
  259.         END
  260.