Advertisement
Guest User

bios.c

a guest
Dec 13th, 2011
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. s16 b_sinetable[256] = {
  2.  
  3.   (s16)0x0000, (s16)0x0192, (s16)0x0323, (s16)0x04B5, (s16)0x0645, (s16)0x07D5, (s16)0x0964, (s16)0x0AF1,
  4.  
  5.   (s16)0x0C7C, (s16)0x0E05, (s16)0x0F8C, (s16)0x1111, (s16)0x1294, (s16)0x1413, (s16)0x158F, (s16)0x1708,
  6.  
  7.   (s16)0x187D, (s16)0x19EF, (s16)0x1B5D, (s16)0x1CC6, (s16)0x1E2B, (s16)0x1F8B, (s16)0x20E7, (s16)0x223D,
  8.  
  9.   (s16)0x238E, (s16)0x24DA, (s16)0x261F, (s16)0x275F, (s16)0x2899, (s16)0x29CD, (s16)0x2AFA, (s16)0x2C21,
  10.  
  11.   (s16)0x2D41, (s16)0x2E5A, (s16)0x2F6B, (s16)0x3076, (s16)0x3179, (s16)0x3274, (s16)0x3367, (s16)0x3453,
  12.  
  13.   (s16)0x3536, (s16)0x3612, (s16)0x36E5, (s16)0x37AF, (s16)0x3871, (s16)0x392A, (s16)0x39DA, (s16)0x3A82,
  14.  
  15.   (s16)0x3B20, (s16)0x3BB6, (s16)0x3C42, (s16)0x3CC5, (s16)0x3D3E, (s16)0x3DAE, (s16)0x3E14, (s16)0x3E71,
  16.  
  17.   (s16)0x3EC5, (s16)0x3F0E, (s16)0x3F4E, (s16)0x3F84, (s16)0x3FB1, (s16)0x3FD3, (s16)0x3FEC, (s16)0x3FFB,
  18.  
  19.   (s16)0x4000, (s16)0x3FFB, (s16)0x3FEC, (s16)0x3FD3, (s16)0x3FB1, (s16)0x3F84, (s16)0x3F4E, (s16)0x3F0E,
  20.  
  21.   (s16)0x3EC5, (s16)0x3E71, (s16)0x3E14, (s16)0x3DAE, (s16)0x3D3E, (s16)0x3CC5, (s16)0x3C42, (s16)0x3BB6,
  22.  
  23.   (s16)0x3B20, (s16)0x3A82, (s16)0x39DA, (s16)0x392A, (s16)0x3871, (s16)0x37AF, (s16)0x36E5, (s16)0x3612,
  24.  
  25.   (s16)0x3536, (s16)0x3453, (s16)0x3367, (s16)0x3274, (s16)0x3179, (s16)0x3076, (s16)0x2F6B, (s16)0x2E5A,
  26.  
  27.   (s16)0x2D41, (s16)0x2C21, (s16)0x2AFA, (s16)0x29CD, (s16)0x2899, (s16)0x275F, (s16)0x261F, (s16)0x24DA,
  28.  
  29.   (s16)0x238E, (s16)0x223D, (s16)0x20E7, (s16)0x1F8B, (s16)0x1E2B, (s16)0x1CC6, (s16)0x1B5D, (s16)0x19EF,
  30.  
  31.   (s16)0x187D, (s16)0x1708, (s16)0x158F, (s16)0x1413, (s16)0x1294, (s16)0x1111, (s16)0x0F8C, (s16)0x0E05,
  32.  
  33.   (s16)0x0C7C, (s16)0x0AF1, (s16)0x0964, (s16)0x07D5, (s16)0x0645, (s16)0x04B5, (s16)0x0323, (s16)0x0192,
  34.  
  35.   (s16)0x0000, (s16)0xFE6E, (s16)0xFCDD, (s16)0xFB4B, (s16)0xF9BB, (s16)0xF82B, (s16)0xF69C, (s16)0xF50F,
  36.  
  37.   (s16)0xF384, (s16)0xF1FB, (s16)0xF074, (s16)0xEEEF, (s16)0xED6C, (s16)0xEBED, (s16)0xEA71, (s16)0xE8F8,
  38.  
  39.   (s16)0xE783, (s16)0xE611, (s16)0xE4A3, (s16)0xE33A, (s16)0xE1D5, (s16)0xE075, (s16)0xDF19, (s16)0xDDC3,
  40.  
  41.   (s16)0xDC72, (s16)0xDB26, (s16)0xD9E1, (s16)0xD8A1, (s16)0xD767, (s16)0xD633, (s16)0xD506, (s16)0xD3DF,
  42.  
  43.   (s16)0xD2BF, (s16)0xD1A6, (s16)0xD095, (s16)0xCF8A, (s16)0xCE87, (s16)0xCD8C, (s16)0xCC99, (s16)0xCBAD,
  44.  
  45.   (s16)0xCACA, (s16)0xC9EE, (s16)0xC91B, (s16)0xC851, (s16)0xC78F, (s16)0xC6D6, (s16)0xC626, (s16)0xC57E,
  46.  
  47.   (s16)0xC4E0, (s16)0xC44A, (s16)0xC3BE, (s16)0xC33B, (s16)0xC2C2, (s16)0xC252, (s16)0xC1EC, (s16)0xC18F,
  48.  
  49.   (s16)0xC13B, (s16)0xC0F2, (s16)0xC0B2, (s16)0xC07C, (s16)0xC04F, (s16)0xC02D, (s16)0xC014, (s16)0xC005,
  50.  
  51.   (s16)0xC000, (s16)0xC005, (s16)0xC014, (s16)0xC02D, (s16)0xC04F, (s16)0xC07C, (s16)0xC0B2, (s16)0xC0F2,
  52.  
  53.   (s16)0xC13B, (s16)0xC18F, (s16)0xC1EC, (s16)0xC252, (s16)0xC2C2, (s16)0xC33B, (s16)0xC3BE, (s16)0xC44A,
  54.  
  55.   (s16)0xC4E0, (s16)0xC57E, (s16)0xC626, (s16)0xC6D6, (s16)0xC78F, (s16)0xC851, (s16)0xC91B, (s16)0xC9EE,
  56.  
  57.   (s16)0xCACA, (s16)0xCBAD, (s16)0xCC99, (s16)0xCD8C, (s16)0xCE87, (s16)0xCF8A, (s16)0xD095, (s16)0xD1A6,
  58.  
  59.   (s16)0xD2BF, (s16)0xD3DF, (s16)0xD506, (s16)0xD633, (s16)0xD767, (s16)0xD8A1, (s16)0xD9E1, (s16)0xDB26,
  60.  
  61.   (s16)0xDC72, (s16)0xDDC3, (s16)0xDF19, (s16)0xE075, (s16)0xE1D5, (s16)0xE33A, (s16)0xE4A3, (s16)0xE611,
  62.  
  63.   (s16)0xE783, (s16)0xE8F8, (s16)0xEA71, (s16)0xEBED, (s16)0xED6C, (s16)0xEEEF, (s16)0xF074, (s16)0xF1FB,
  64.  
  65.   (s16)0xF384, (s16)0xF50F, (s16)0xF69C, (s16)0xF82B, (s16)0xF9BB, (s16)0xFB4B, (s16)0xFCDD, (s16)0xFE6E
  66.  
  67. };
  68.  
  69.  
  70.  
  71. void bios_halt()
  72.  
  73. {
  74.  
  75. };
  76.  
  77.  
  78.  
  79. int bios_sqrt(int b_value)
  80.  
  81. {
  82.  
  83.     return sqrtf(b_value);
  84.  
  85. };
  86.  
  87.  
  88.  
  89. void bios_cpuset(u32 b_source, u32 b_dest, u32 b_cnt) /* arm_r0, arm r1, arm_r2 */
  90.  
  91. {
  92.  
  93.   save_reg();
  94.  
  95.   if(((b_source & 0xe000000) == 0) ||
  96.  
  97.      ((b_source + (((b_cnt << 11)>>9) & 0x1FFFFF)) & 0xe000000) == 0)
  98.  
  99.     {
  100.  
  101.       load_reg();
  102.  
  103.       return;
  104.  
  105.     }
  106.  
  107.  
  108.  
  109.   u32 b_count = b_cnt & 0x1FFFFF;
  110.  
  111.  
  112.  
  113.   // 32-bit ?
  114.  
  115.   if((b_cnt >> 26) & 1) {
  116.  
  117.     // needed for 32-bit mode!
  118.  
  119.     b_source &= 0x0FFFFFFC;
  120.  
  121.     b_dest &= 0x0FFFFFFC;
  122.  
  123.     // fill ?
  124.  
  125.     if((b_cnt >> 24) & 1) {
  126.  
  127.       u32 b_value = read_memory32(b_source);
  128.  
  129.       while(b_count) {
  130.  
  131.         write_memory32(b_dest, b_value);
  132.  
  133.         b_dest += 4;
  134.  
  135.         b_count--;
  136.  
  137.       }
  138.  
  139.     } else {
  140.  
  141.       // copy
  142.  
  143.       while(b_count) {
  144.  
  145.         u32 b_value = read_memory32(b_source);
  146.  
  147.         write_memory32(b_dest, b_value);
  148.  
  149.         b_source += 4;
  150.  
  151.         b_dest += 4;
  152.  
  153.         b_count--;
  154.  
  155.       }
  156.  
  157.     }
  158.  
  159.   } else {
  160.  
  161.     // 16-bit fill?
  162.  
  163.     if((b_cnt >> 24) & 1) {
  164.  
  165.       u16 b_value = read_memory16(b_source);
  166.  
  167.       while(b_count) {
  168.  
  169.         write_memory16(b_dest, b_value);
  170.  
  171.         b_dest += 2;
  172.  
  173.         b_count--;
  174.  
  175.       }
  176.  
  177.     } else {
  178.  
  179.       // copy
  180.  
  181.       while(b_count) {
  182.  
  183.         u16 b_value = read_memory16(b_source);
  184.  
  185.         write_memory16(b_dest, b_value);
  186.  
  187.         b_source += 2;
  188.  
  189.         b_dest += 2;
  190.  
  191.         b_count--;
  192.  
  193.       }
  194.  
  195.     }
  196.  
  197.   }
  198.  
  199.   load_reg();
  200.  
  201. }
  202.  
  203.  
  204.  
  205.  
  206.  
  207. void bios_cpufastset(u32 b_source, u32 b_dest, u32 b_cnt)
  208.  
  209.  
  210.  
  211.     {
  212.  
  213.   save_reg();
  214.  
  215.   if(((b_source & 0xe000000) == 0) ||
  216.  
  217.      ((b_source + (((b_cnt << 11)>>9) & 0x1FFFFF)) & 0xe000000) == 0)
  218.  
  219.     {
  220.  
  221.       load_reg();
  222.  
  223.       return;
  224.  
  225.     }
  226.  
  227.   // needed for 32-bit mode!
  228.  
  229.   b_source &= 0x0FFFFFFC;
  230.  
  231.   b_dest &= 0x0FFFFFFC;
  232.  
  233.  
  234.  
  235.   u32 b_count = b_cnt & 0x1FFFFF;
  236.  
  237.   u32 b_i;
  238.  
  239.  
  240.  
  241.   // fill?
  242.  
  243.   if((b_cnt >> 24) & 1) {
  244.  
  245.     while(b_count > 0) {
  246.  
  247.       // BIOS always transfers 32 bytes at a time
  248.  
  249.       u32 b_value = read_memory32(b_source);
  250.  
  251.       for(b_i = 0; b_i < 8; b_i++) {
  252.  
  253.         write_memory32(b_dest, b_value);
  254.  
  255.         b_dest += 4;
  256.  
  257.       }
  258.  
  259.       b_count -= 8;
  260.  
  261.     }
  262.  
  263.   } else {
  264.  
  265.     // copy
  266.  
  267.     while(b_count > 0) {
  268.  
  269.       // BIOS always transfers 32 bytes at a time
  270.  
  271.       for(b_i = 0; b_i < 8; b_i++) {
  272.  
  273.         u32 b_value = read_memory32(b_source);
  274.  
  275.         write_memory32(b_dest, b_value);
  276.  
  277.         b_source += 4;
  278.  
  279.         b_dest += 4;
  280.  
  281.       }
  282.  
  283.       b_count -= 8;
  284.  
  285.     }
  286.  
  287.   }
  288.  
  289.   load_reg();
  290.  
  291. }
  292.  
  293.  
  294.  
  295. void bios_bgaffineset(u32 b_src, u32 b_dest, u32 b_num)
  296.  
  297.    
  298.  
  299.     {
  300.  
  301.   save_reg();
  302.  
  303.   u32 b_i;
  304.  
  305.   for(b_i = 0; b_i < b_num; b_i++) {
  306.  
  307.     s32 b_cx = read_memory32(b_src);
  308.  
  309.     b_src+=4;
  310.  
  311.     s32 b_cy = read_memory32(b_src);
  312.  
  313.     b_src+=4;
  314.  
  315.     s16 b_dispx = read_memory16(b_src);
  316.  
  317.     b_src+=2;
  318.  
  319.     s16 b_dispy = read_memory16(b_src);
  320.  
  321.     b_src+=2;
  322.  
  323.     s16 b_rx = read_memory16(b_src);
  324.  
  325.     b_src+=2;
  326.  
  327.     s16 b_ry = read_memory16(b_src);
  328.  
  329.     b_src+=2;
  330.  
  331.     u16 b_theta = read_memory16(b_src)>>8;
  332.  
  333.     b_src+=4; // keep structure alignment
  334.  
  335.     s32 b_a = b_sinetable[(b_theta+0x40)&255];
  336.  
  337.     s32 b_b = b_sinetable[b_theta];
  338.  
  339.  
  340.  
  341.     s16 b_dx =  (b_rx * b_a)>>14;
  342.  
  343.     s16 b_dmx = (b_rx * b_b)>>14;
  344.  
  345.     s16 b_dy =  (b_ry * b_b)>>14;
  346.  
  347.     s16 b_dmy = (b_ry * b_a)>>14;
  348.  
  349.    
  350.  
  351.     write_memory16(b_dest, b_dx);
  352.  
  353.     b_dest += 2;
  354.  
  355.     write_memory16(b_dest, -b_dmx);
  356.  
  357.     b_dest += 2;
  358.  
  359.     write_memory16(b_dest, b_dy);
  360.  
  361.     b_dest += 2;
  362.  
  363.     write_memory16(b_dest, b_dmy);
  364.  
  365.     b_dest += 2;
  366.  
  367.  
  368.  
  369.     s32 b_startx = b_cx - b_dx * b_dispx + b_dmx * b_dispy;
  370.  
  371.     s32 b_starty = b_cy - b_dy * b_dispx - b_dmy * b_dispy;
  372.  
  373.    
  374.  
  375.     write_memory32(b_dest, b_startx);
  376.  
  377.     b_dest += 4;
  378.  
  379.     write_memory32(b_dest, b_starty);
  380.  
  381.     b_dest += 4;
  382.  
  383.   }
  384.  
  385.   load_reg();
  386.  
  387. }  
  388.  
  389.  
  390.  
  391. void bios_objaffineset(u32 b_src, u32 b_dest, u32 b_num, u32 b_offset)
  392.  
  393.  
  394.  
  395.     {
  396.  
  397.   save_reg();
  398.  
  399.   u32 b_i;
  400.  
  401.   for(b_i = 0; b_i < b_num; b_i++) {
  402.  
  403.     s16 b_rx = read_memory16(b_src);
  404.  
  405.     b_src+=2;
  406.  
  407.     s16 b_ry = read_memory16(b_src);
  408.  
  409.     b_src+=2;
  410.  
  411.     u16 b_theta = read_memory16(b_src)>>8;
  412.  
  413.     b_src+=4; // keep structure alignment
  414.  
  415.  
  416.  
  417.     s32 b_a = (s32)b_sinetable[(b_theta+0x40)&255];
  418.  
  419.     s32 b_b = (s32)b_sinetable[b_theta];
  420.  
  421.  
  422.  
  423.     s16 b_dx =  ((s32)b_rx * b_a)>>14;
  424.  
  425.     s16 b_dmx = ((s32)b_rx * b_b)>>14;
  426.  
  427.     s16 b_dy =  ((s32)b_ry * b_b)>>14;
  428.  
  429.     s16 b_dmy = ((s32)b_ry * b_a)>>14;
  430.  
  431.    
  432.  
  433.     write_memory16(b_dest, b_dx);
  434.  
  435.     b_dest += b_offset;
  436.  
  437.     write_memory16(b_dest, -b_dmx);
  438.  
  439.     b_dest += b_offset;
  440.  
  441.     write_memory16(b_dest, b_dy);
  442.  
  443.     b_dest += b_offset;
  444.  
  445.     write_memory16(b_dest, b_dmy);
  446.  
  447.     b_dest += b_offset;
  448.  
  449.   }
  450.  
  451.   load_reg();
  452.  
  453. }
  454.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement