memory.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. "use strict";
  2. CPU.prototype.mmap_read8 = function(addr)
  3. {
  4. const value = this.memory_map_read8[addr >>> MMAP_BLOCK_BITS](addr);
  5. dbg_assert(value >= 0 && value <= 0xFF);
  6. return value;
  7. };
  8. CPU.prototype.mmap_write8 = function(addr, value)
  9. {
  10. dbg_assert(value >= 0 && value <= 0xFF);
  11. this.memory_map_write8[addr >>> MMAP_BLOCK_BITS](addr, value);
  12. };
  13. CPU.prototype.mmap_read16 = function(addr)
  14. {
  15. var fn = this.memory_map_read8[addr >>> MMAP_BLOCK_BITS];
  16. const value = fn(addr) | fn(addr + 1 | 0) << 8;
  17. dbg_assert(value >= 0 && value <= 0xFFFF);
  18. return value;
  19. };
  20. CPU.prototype.mmap_write16 = function(addr, value)
  21. {
  22. var fn = this.memory_map_write8[addr >>> MMAP_BLOCK_BITS];
  23. dbg_assert(value >= 0 && value <= 0xFFFF);
  24. fn(addr, value & 0xFF);
  25. fn(addr + 1 | 0, value >> 8);
  26. };
  27. CPU.prototype.mmap_read32 = function(addr)
  28. {
  29. var aligned_addr = addr >>> MMAP_BLOCK_BITS;
  30. return this.memory_map_read32[aligned_addr](addr);
  31. };
  32. CPU.prototype.mmap_write32 = function(addr, value)
  33. {
  34. var aligned_addr = addr >>> MMAP_BLOCK_BITS;
  35. this.memory_map_write32[aligned_addr](addr, value);
  36. };
  37. CPU.prototype.mmap_write64 = function(addr, value0, value1)
  38. {
  39. var aligned_addr = addr >>> MMAP_BLOCK_BITS;
  40. // This should hold since writes across pages are split up
  41. dbg_assert(aligned_addr === (addr + 7) >>> MMAP_BLOCK_BITS);
  42. var write_func32 = this.memory_map_write32[aligned_addr];
  43. write_func32(addr, value0);
  44. write_func32(addr + 4, value1);
  45. };
  46. CPU.prototype.mmap_write128 = function(addr, value0, value1, value2, value3)
  47. {
  48. var aligned_addr = addr >>> MMAP_BLOCK_BITS;
  49. // This should hold since writes across pages are split up
  50. dbg_assert(aligned_addr === (addr + 12) >>> MMAP_BLOCK_BITS);
  51. var write_func32 = this.memory_map_write32[aligned_addr];
  52. write_func32(addr, value0);
  53. write_func32(addr + 4, value1);
  54. write_func32(addr + 8, value2);
  55. write_func32(addr + 12, value3);
  56. };
  57. /**
  58. * @param {Array.<number>|Uint8Array} blob
  59. * @param {number} offset
  60. */
  61. CPU.prototype.write_blob = function(blob, offset)
  62. {
  63. dbg_assert(blob && blob.length >= 0);
  64. if(blob.length)
  65. {
  66. dbg_assert(!this.in_mapped_range(offset));
  67. dbg_assert(!this.in_mapped_range(offset + blob.length - 1));
  68. this.jit_dirty_cache(offset, offset + blob.length);
  69. this.mem8.set(blob, offset);
  70. }
  71. };
  72. CPU.prototype.read_blob = function(offset, length)
  73. {
  74. if(length)
  75. {
  76. dbg_assert(!this.in_mapped_range(offset));
  77. dbg_assert(!this.in_mapped_range(offset + length - 1));
  78. }
  79. return this.mem8.subarray(offset, offset + length);
  80. };