@asm80/core
Version:
Core ASM80 compiler / assembler
552 lines (499 loc) • 22.1 kB
JavaScript
import {C65816} from "../cpu/c65816.js";
import { Parser } from "../expression-parser.js";
QUnit.config.hidepassed = true;
QUnit.QUnit.module("ASM 65816");
QUnit.QUnit.test( "Namespace", function() {
QUnit.assert.notEqual( C65816, null, "C65816 is defined" );
QUnit.assert.equal( typeof(C65816), "object", "C65816 is an object" );
QUnit.assert.equal( typeof(C65816.parseOpcode), "function", "C65816.parseOpcode defined" );
});
var vars = {"LOOP":0x1234,"SHORT":0x21,"_PC":0x0100};
var varsm16 = {"__MX":16,"_PC":0x0100};
var varsa16 = {"__AX":16,"_PC":0x0100};
var s = [], p;
QUnit.test( "Invalid instruction", function() {
s = {"opcode":"INVALID","params":["A","B"],"addr":0x100,"lens":[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p,null,"Error detected");
});
QUnit.QUnit.test( "NOP test", function() {
s = {"opcode":"NOP","addr":0x100,"lens":[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0xea,"Opcode OK");
QUnit.assert.equal(p.bytes,1,"Length OK");
});
QUnit.QUnit.test( "LDA zp", function() {
s = {"opcode":"LDA","params":["$23"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0xa5,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1,0x23,"Expected value $23");
});
QUnit.QUnit.test( "LDA zp2", function() {
s = {"opcode":"LDA","params":["short"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s,vars, Parser);
QUnit.assert.equal(p.lens[0],0xa5,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1,0x21,"Expected value SHORT");
QUnit.assert.equal(p.bytes,2,"Length");
});
QUnit.QUnit.test( "LDA imm", function() {
s = {"opcode":"LDA","params":["#$23"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0xa9,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1,0x23,"Expected immediate value $23");
QUnit.assert.equal(p.bytes,2,"Length");
});
QUnit.QUnit.test( "LDA imm, 16bit acc", function() {
s = {"opcode":"LDA","params":["#$23"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s,varsa16, Parser);
QUnit.assert.equal(p.lens[0],0xa9,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x23, "Expected immediate value $23");
QUnit.assert.equal(p.bytes,3,"Length");
});
QUnit.test( "LDX imm", function() {
s = {"opcode":"LDX","params":["#$23"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s,varsa16, Parser);
QUnit.assert.equal(p.lens[0],0xa2,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x23, "Expected immediate value $23");
QUnit.assert.equal(p.bytes,2,"Length");
});
QUnit.test( "LDX imm, 16bit acc", function() {
s = {"opcode":"LDX","params":["#$23"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s,varsm16, Parser);
QUnit.assert.equal(p.lens[0],0xa2,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x23, "Expected immediate value $23");
QUnit.assert.equal(p.bytes,3,"Length");
});
QUnit.test( "LDA xx,S", function() {
s = {"opcode":"LDA","params":["$23","S"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0xa3,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x23, "Expected value $23");
QUnit.assert.equal(p.bytes,2,"Length");
});
QUnit.test( "STA xx,S", function() {
s = {"opcode":"STA","params":["$23","S"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x83,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x23, "Expected value $23");
QUnit.assert.equal(p.bytes,2,"Length");
});
QUnit.module("65816 spec test");
QUnit.test( "MVP", function() {
s = {"opcode":"MVP","params":["$12","$34"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x44,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x12, "Expected combined value $34,$12");
const outval2 = p.lens[2](vars);
QUnit.assert.equal(outval2, 0x34, "Expected combined value $34,$12");
QUnit.assert.equal(p.bytes,3,"Length");
});
QUnit.test( "MVN", function() {
s = {"opcode":"MVN","params":["$12","$34"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x54,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x12, "Expected combined value $34,$12");
const outval2 = p.lens[2](vars);
QUnit.assert.equal(outval2, 0x34, "Expected combined value $34,$12");
QUnit.assert.equal(p.bytes,3,"Length");
});
QUnit.test( "PEA", function() {
s = {"opcode":"PEA","params":["$1234"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0xF4,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x1234, "Expected value $1234");
QUnit.assert.equal(p.bytes,3,"Length");
});
QUnit.test( "PEI", function() {
s = {"opcode":"PEI","params":["($12)"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0xD4,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x12, "Expected value $12");
QUnit.assert.equal(p.bytes,2,"Length");
});
QUnit.test( "PER", function() {
s = {"opcode":"PER","params":["$1234"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x62,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x1132, "Expected relative offset to $1131");
QUnit.assert.equal(p.bytes,3,"Length");
});
QUnit.test( "PHB test", function() {
s = {"opcode":"PHB","addr":0x100,"lens":[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x8B,"Opcode OK");
QUnit.assert.equal(p.bytes,1,"Length OK");
});
QUnit.test( "PHD test", function() {
s = {"opcode":"PHD","addr":0x100,"lens":[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x0B,"Opcode OK");
QUnit.assert.equal(p.bytes,1,"Length OK");
});
QUnit.test( "PHK test", function() {
s = {"opcode":"PHK","addr":0x100,"lens":[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x4B,"Opcode OK");
QUnit.assert.equal(p.bytes,1,"Length OK");
});
QUnit.test( "PHX test", function() {
s = {"opcode":"PHX","addr":0x100,"lens":[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0xDA,"Opcode OK");
QUnit.assert.equal(p.bytes,1,"Length OK");
});
QUnit.test( "PHY test", function() {
s = {"opcode":"PHY","addr":0x100,"lens":[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x5A,"Opcode OK");
QUnit.assert.equal(p.bytes,1,"Length OK");
});
QUnit.test( "PLB test", function() {
s = {"opcode":"PLB","addr":0x100,"lens":[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0xAB,"Opcode OK");
QUnit.assert.equal(p.bytes,1,"Length OK");
});
QUnit.test( "PLD test", function() {
s = {"opcode":"PLD","addr":0x100,"lens":[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x2B,"Opcode OK");
QUnit.assert.equal(p.bytes,1,"Length OK");
});
QUnit.test( "PLX test", function() {
s = {"opcode":"PLX","addr":0x100,"lens":[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0xFA,"Opcode OK");
QUnit.assert.equal(p.bytes,1,"Length OK");
});
QUnit.test( "PLY test", function() {
s = {"opcode":"PLY","addr":0x100,"lens":[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x7A,"Opcode OK");
QUnit.assert.equal(p.bytes,1,"Length OK");
});
QUnit.test( "REP #$12 - imm", function() {
s = {"opcode":"REP","params":["#$23"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0xC2,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x23, "Expected immediate value $23");
QUnit.assert.equal(p.bytes,2,"Length");
});
QUnit.module("Addr modes test");
QUnit.test( "ADC (12,X)", function() {
s = {"opcode":"ADC","params":["($23","X)"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x61,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x23, "Expected value $23");
QUnit.assert.equal(p.bytes,2,"Length");
});
QUnit.test( "ADC 12,S", function() {
s = {"opcode":"ADC","params":["$23","S"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x63,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x23, "Expected value $23");
QUnit.assert.equal(p.bytes,2,"Length");
});
QUnit.test( "ADC $12 - dp", function() {
s = {"opcode":"ADC","params":["$23"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x65,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x23, "Expected value $23");
QUnit.assert.equal(p.bytes,2,"Length");
});
QUnit.test( "ADC [$12] - idl", function() {
s = {"opcode":"ADC","params":["[$23]"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x67,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x23, "Expected value $23");
QUnit.assert.equal(p.bytes,2,"Length");
});
QUnit.test( "ADC #$12 - imm", function() {
s = {"opcode":"ADC","params":["#$23"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x69,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x23, "Expected immediate value $23");
QUnit.assert.equal(p.bytes,2,"Length");
});
QUnit.test( "ADC #$12 - imm, acc16", function() {
s = {"opcode":"ADC","params":["#$23"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s,varsa16, Parser);
QUnit.assert.equal(p.lens[0],0x69,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x23, "Expected immediate value $23");
QUnit.assert.equal(p.bytes,3,"Length");
});
QUnit.test( "ADC $1234 - abs", function() {
s = {"opcode":"ADC","params":["$1234"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x6D,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x1234, "Expected value $1234");
QUnit.assert.equal(p.bytes,3,"Length");
});
QUnit.test( "ADC $123456 - long", function() {
s = {"opcode":"ADC","params":["$123456"],addr:"0x100",lens:[],"bytes":0,vars:{}};
p = C65816.parseOpcode(s,vars, Parser);
QUnit.assert.equal(p.lens[0],0x6F,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x123456, "Expected long value $123456");
QUnit.assert.equal(p.bytes,4,"Length");
});
QUnit.test( "ADC ($12),Y - dp", function() {
s = {"opcode":"ADC","params":["($23)","Y"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x71,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x23, "Expected value $23");
QUnit.assert.equal(p.bytes,2,"Length");
});
QUnit.test( "ADC $12,X - dpidx", function() {
s = {"opcode":"ADC","params":["$23","X"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x75,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x23, "Expected value $23");
QUnit.assert.equal(p.bytes,2,"Length");
});
QUnit.test( "ADC $1234,X - abx", function() {
s = {"opcode":"ADC","params":["$1234","X"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x7D,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x1234, "Expected value $1234");
QUnit.assert.equal(p.bytes,3,"Length");
});
QUnit.test( "ADC $1234,Y - aby", function() {
s = {"opcode":"ADC","params":["$1234","Y"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x79,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x1234, "Expected value $1234");
QUnit.assert.equal(p.bytes,3,"Length");
});
//65816
//
QUnit.test( "ADC ($12) - dpind", function() {
s = {"opcode":"ADC","params":["($22)"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x72,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x22, "Expected value $22");
QUnit.assert.equal(p.bytes,2,"Length");
});
QUnit.test( "ADC [$12],Y - idl", function() {
s = {"opcode":"ADC","params":["[$23]","Y"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x77,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x23, "Expected value $23");
QUnit.assert.equal(p.bytes,2,"Length");
});
QUnit.test( "ADC ($12,S),Y - dp", function() {
s = {"opcode":"ADC","params":["($23","S)","Y"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x73,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x23, "Expected value $23");
QUnit.assert.equal(p.bytes,2,"Length");
});
QUnit.test( "ADC $123456,X - abx", function() {
s = {"opcode":"ADC","params":["$123456","X"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x7F,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x123456, "Expected long value $123456");
QUnit.assert.equal(p.bytes,4,"Length");
});
QUnit.module("JMP modes test");
QUnit.test( "JMP", function() {
s = {"opcode":"JMP","params":["$1234"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x4c,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x1234, "Expected address $1234");
QUnit.assert.equal(p.bytes,3,"Length");
});
QUnit.test( "JMP (abs)", function() {
s = {"opcode":"JMP","params":["($1234)"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x6c,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x1234, "Expected address $1234");
QUnit.assert.equal(p.bytes,3,"Length");
});
QUnit.test( "JMP (abs,X)", function() {
s = {"opcode":"JMP","params":["($1234","X)"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x7c,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x1234, "Expected address $1234");
QUnit.assert.equal(p.bytes,3,"Length");
});
QUnit.test( "JMP long", function() {
s = {"opcode":"JMP","params":["$123457"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s,vars, Parser);
QUnit.assert.equal(p.lens[0],0x5c,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x123457, "Expected long address $123457");
QUnit.assert.equal(p.bytes,4,"Length");
});
QUnit.test( "JMP [abs]", function() {
s = {"opcode":"JMP","params":["[$1234]"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0xDC,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x1234, "Expected address $1234");
QUnit.assert.equal(p.bytes,3,"Length");
});
QUnit.test( "JMP bad mode", function() {
s = {"opcode":"JMP","params":["#$1234"],addr:"0x100",lens:[],"bytes":0,"numline":23};
try {
p = C65816.parseOpcode(s, vars, Parser);
} catch (e) {
p = e;
}
QUnit.assert.equal(p,"Bad addressing mode at line 23","Bad mode detected");
});
QUnit.module("JSR modes test");
QUnit.test( "JSR", function() {
s = {"opcode":"JSR","params":["$1234"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x20,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x1234, "Expected address $1234");
QUnit.assert.equal(p.bytes,3,"Length");
});
QUnit.test( "JSR (abs,X)", function() {
s = {"opcode":"JSR","params":["($1234","X)"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0xFc,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x1234, "Expected address $1234");
QUnit.assert.equal(p.bytes,3,"Length");
});
QUnit.test( "JSR long", function() {
s = {"opcode":"JSR","params":["$123457"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s,vars, Parser);
QUnit.assert.equal(p.lens[0],0x22,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x123457, "Expected long address $123457");
QUnit.assert.equal(p.bytes,4,"Length");
});
QUnit.module("Additional coverage tests");
QUnit.test( "ASL A - accumulator mode", function() {
s = {"opcode":"ASL","params":["A"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x0a,"Opcode");
QUnit.assert.equal(p.bytes,1,"Length");
});
QUnit.test( "LDA *$12 - force zero page", function() {
s = {"opcode":"LDA","params":["*$12"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0xa5,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x12, "Expected forced zero page value $12");
QUnit.assert.equal(p.bytes,2,"Length");
});
QUnit.test( "BRA $0102 - relative jump", function() {
s = {"opcode":"BRA","params":["$0102"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0x80,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x00, "Expected relative offset (0x0102 - 0x0102 = 0x00)");
QUnit.assert.equal(p.bytes,2,"Length");
});
QUnit.test( "LDA *$12,X - force zero page indexed", function() {
s = {"opcode":"LDA","params":["*$12","X"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0xb5,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x12, "Expected forced zero page value $12");
QUnit.assert.equal(p.bytes,2,"Length");
});
QUnit.test( "LDX *$12,Y - force zero page indexed Y", function() {
s = {"opcode":"LDX","params":["*$12","Y"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0xb6,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x12, "Expected forced zero page value $12");
QUnit.assert.equal(p.bytes,2,"Length");
});
QUnit.test( "LDA SHORT,X - auto zero page X", function() {
s = {"opcode":"LDA","params":["SHORT","X"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0xb5,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x21, "Expected SHORT variable value 0x21");
QUnit.assert.equal(p.bytes,2,"Length");
});
QUnit.test( "LDX SHORT,Y - auto zero page Y", function() {
s = {"opcode":"LDX","params":["SHORT","Y"],addr:"0x100",lens:[],"bytes":0};
p = C65816.parseOpcode(s, vars, Parser);
QUnit.assert.equal(p.lens[0],0xb6,"Opcode");
QUnit.assert.equal(typeof(p.lens[1]),"function","Opcode");
const outval1 = p.lens[1](vars);
QUnit.assert.equal(outval1, 0x21, "Expected SHORT variable value 0x21");
QUnit.assert.equal(p.bytes,2,"Length");
});