Web based MIPS assembler and emulator

encoders.js 1.2KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. const utils = require('./utils.js')
  2. const regmap = [
  3. 'zero', 'at', 'v0', 'v1', 'a0', 'a1', 'a2', 't0', 't1', 't2', 't3', 't4', 't5',
  4. 't6', 't7', 's0', 's1', 's2', 's3', 's4', 's5', 's6', 's7', 't8', 't9', 'k0',
  5. 'k1', 'gp', 'sp', 's8', 'ra' ]
  6. const getReg = (id) => {
  7. if (id.startsWith('$')) {
  8. id = id.slice(1)
  9. }
  10. if ((isNaN(id) === false && +id >= 0 && +id <= 31) || (id = regmap.indexOf(id)) > -1) {
  11. return id
  12. } else {
  13. utils.error("Invalid register: " + id)
  14. }
  15. }
  16. const encoders = {
  17. 'LUI': (rt, immediate) =>
  18. '0x'.concat(utils.bin2hex(
  19. '001111'.concat(
  20. '0'.repeat(5),
  21. utils.dec2binu(getReg(rt), 5),
  22. utils.hex2bin(immediate, 16)), 8)),
  23. 'ORI': (rt, rs, immediate) =>
  24. '0x'.concat(utils.bin2hex(
  25. '001101'.concat(
  26. utils.dec2binu(getReg(rs), 5),
  27. utils.dec2binu(getReg(rt), 5),
  28. utils.hex2bin(immediate, 16)), 8)),
  29. 'SW': (rt, offsetBase) => {
  30. const [offset, base] = utils.splitOffsetBase(offsetBase)
  31. return '0x'.concat(utils.bin2hex(
  32. '101011'.concat(
  33. utils.dec2binu(getReg(base), 5),
  34. utils.dec2binu(getReg(rt), 5),
  35. utils.int16_2bin(offset, 16)), 8))
  36. }
  37. }
  38. module.exports = encoders