fma-snes65816
Version:
SNES 65816 assembler backend for FMA
117 lines (104 loc) • 3.42 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _fma = require('fma');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var InstructionWriter = function () {
function InstructionWriter() {
(0, _classCallCheck3.default)(this, InstructionWriter);
}
(0, _createClass3.default)(InstructionWriter, null, [{
key: 'toCalculation',
value: function toCalculation(number) {
switch (number.getClassName()) {
case 'FutureNumber':
number = number.getCalculation();
break;
default:
throw new Error('Can not process rel8 with ' + number.getClassName());
}
return number;
}
}, {
key: 'brk',
value: function brk(scope, code, opcode, p1, p2) {
code.writeUInt8(opcode);
code.writeUInt8(0);
}
}, {
key: 'impl',
value: function impl(scope, code, opcode, p1, p2) {
code.writeUInt8(opcode);
}
}, {
key: 'rel8',
value: function rel8(scope, code, opcode, p1, p2, context) {
code.writeUInt8(opcode);
var number = InstructionWriter.toCalculation(p1.value);
var pc = InstructionWriter.toCalculation(scope.getMember('PC').callWithParameters(context));
code.writeUInt8(new _fma.FutureNumber(new _fma.Calculation(new _fma.Calculation(number, '-', pc), '-', new _fma.StaticNumber(1))));
}
}, {
key: 'rel16',
value: function rel16(scope, code, opcode, p1, p2) {
throw new Error("TODO REL16");
}
}, {
key: 'mv',
value: function mv(scope, code, opcode, p1, p2) {
code.writeUInt8(opcode);
code.writeUInt8(p2.value);
code.writeUInt8(p1.value);
}
}, {
key: 'im8',
value: function im8(scope, code, opcode, p1, p2) {
code.writeUInt8(opcode);
code.writeUInt8(p1.value);
}
}, {
key: 'im16',
value: function im16(scope, code, opcode, p1, p2) {
code.writeUInt8(opcode);
code.writeUInt16(p1.value);
}
}, {
key: 'im24',
value: function im24(scope, code, opcode, p1, p2) {
code.writeUInt8(opcode);
code.writeUInt24(p1.value);
}
}, {
key: 'im_a',
value: function im_a(scope, code, opcode, p1, p2, context) {
var size = scope.getMember('register_size_A').getMember('__value').value;
if (size === 8) {
InstructionWriter.im8(scope, code, opcode, p1, p2);
} else if (size === 16) {
InstructionWriter.im16(scope, code, opcode, p1, p2);
} else {
throw new Error('Invalid size for register A');
}
}
}, {
key: 'im_xy',
value: function im_xy(scope, code, opcode, p1, p2) {
var size = scope.getMember('register_size_XY').getMember('__value').value;
if (size === 8) {
InstructionWriter.im8(scope, code, opcode, p1, p2);
} else if (size === 16) {
InstructionWriter.im16(scope, code, opcode, p1, p2);
} else {
throw new Error('Invalid size for register XY');
}
}
}]);
return InstructionWriter;
}();
exports.default = InstructionWriter;
//# sourceMappingURL=InstructionWriter.js.map