| @@ -436,55 +436,118 @@ class Assembler{ | |||
| procFailed = StoreSingleOp(0xC8); break; | |||
| // --- JMP | |||
| case 'jmp': | |||
| if (tokens.length === 2){ | |||
| if (tokens[1].startsWith("$") && tokens[1].length === 5){ | |||
| let v = parseInt(tokens[1].substr(1), 16); | |||
| if (!isNaN(v)){ | |||
| op.push(0x4C); | |||
| op.push(v & 0x000000FF); | |||
| op.push((v & 0x0000FF00) >> 8); | |||
| this.__PC += 3; | |||
| } else { | |||
| throw new Error("Malformed op-code or value on program address " + toHexString(this.__PC)); | |||
| } | |||
| } else if (tokens[1].startsWith("+$") && tokens[1].length === 6){ | |||
| let v = parseInt(tokens[1].substr(2), 16); | |||
| if (!isNaN(v)){ | |||
| op.push(0x6C); | |||
| op.push(v & 0x000000FF); | |||
| op.push((v & 0x0000FF00) >> 8); | |||
| this.__PC += 3; | |||
| } else { | |||
| throw new Error("Malformed op-code or value on program address " + toHexString(this.__PC)); | |||
| } | |||
| } else { procFailed = true; } | |||
| } else { procFailed = true; } | |||
| break; | |||
| // --- JSR | |||
| case 'jsr': | |||
| if (tokens.length === 2){ | |||
| if (tokens[1].startsWith("$") && tokens[1].length === 5){ | |||
| let v = parseInt(tokens[1].substr(1), 16); | |||
| if (!isNaN(v)){ | |||
| op.push(0x20); | |||
| op.push(v & 0x000000FF); | |||
| op.push((v & 0x0000FF00) >> 8); | |||
| this.__PC += 3; | |||
| } else { | |||
| throw new Error("Malformed op-code or value on program address " + toHexString(this.__PC)); | |||
| } | |||
| } else { procFailed = true; } | |||
| } else { | |||
| procFailed = true; | |||
| } | |||
| break; | |||
| // --- LDA | |||
| case 'lda': | |||
| procFailed = StoreOp([0xA9, 0xA5, 0xB5, 0xAD, 0xBD, 0xB9, 0xA1, 0xB1], 2, 3); break; | |||
| break; | |||
| // --- LDX | |||
| case 'ldx': | |||
| procFailed = StoreOp([0xA2, 0xA6, 0xB6, 0xAE, 0xBE, null, null, null], 2, 3); break; | |||
| break; | |||
| // --- LDY | |||
| case 'ldy': | |||
| procFailed = StoreOp([0xA0, 0xA4, 0xB4, 0xAC, 0xBC, null, null, null], 2, 3); break; | |||
| break; | |||
| // --- LSR | |||
| case 'lsr': | |||
| break; | |||
| if (tokens.length === 2){ | |||
| if (tokens[1].toUpperCase() === 'A'){ | |||
| op.push(0x4A); | |||
| this.__PC += 1; | |||
| break; | |||
| } | |||
| } | |||
| procFailed = StoreOp([null, 0x46, 0x56, 0x4E, 0x5E, null, null, null], 2, 3); break; | |||
| // --- NOP | |||
| case 'nop': | |||
| procFailed = StoreSingleOp(0xEA); break; | |||
| // --- ORA | |||
| case 'ora': | |||
| break; | |||
| procFailed = StoreOp([0x09, 0x05, 0x15, 0x0D, 0x1D, 0x19, 0x01, 0x11], 2, 3); break; | |||
| // --- PHA | |||
| case 'pha': | |||
| break; | |||
| procFailed = StoreSingleOp(0x48); break; | |||
| // --- PHP | |||
| case 'php': | |||
| break; | |||
| procFailed = StoreSingleOp(0x08); break; | |||
| // --- PLA | |||
| case 'pla': | |||
| break; | |||
| procFailed = StoreSingleOp(0x68); break; | |||
| // --- PLP | |||
| case 'plp': | |||
| break; | |||
| procFailed = StoreSingleOp(0x28); break; | |||
| // --- ROL | |||
| case 'rol': | |||
| break; | |||
| if (tokens.length === 2){ | |||
| if (tokens[1].toUpperCase() === 'A'){ | |||
| op.push(0x2A); | |||
| this.__PC += 1; | |||
| break; | |||
| } | |||
| } | |||
| procFailed = StoreOp([null, 0x26, 0x36, 0x2E, 0x3E, null, null, null], 2, 3); break; | |||
| // --- ROR | |||
| case 'ror': | |||
| break; | |||
| if (tokens.length === 2){ | |||
| if (tokens[1].toUpperCase() === 'A'){ | |||
| op.push(0x6A); | |||
| this.__PC += 1; | |||
| break; | |||
| } | |||
| } | |||
| procFailed = StoreOp([null, 0x66, 0x76, 0x6E, 0x7E, null, null, null], 2, 3); break; | |||
| // --- RTI | |||
| case 'rti': | |||
| break; | |||
| procFailed = StoreSingleOp(0x40); break; | |||
| // --- RTS | |||
| case 'rts': | |||
| procFailed = StoreSingleOp(0x60); break; | |||
| break; | |||
| // --- SBC | |||
| case 'sbc': | |||
| break; | |||
| procFailed = StoreOp([0xE9, 0xE5, 0xF5, 0xED, 0xFD, 0xF9, 0xE1, 0xF1], 2, 3); break; | |||
| // --- SEC | |||
| case 'sec': | |||
| procFailed = StoreSingleOp(0x38); break; | |||
| @@ -497,13 +560,13 @@ class Assembler{ | |||
| break; | |||
| // --- STA | |||
| case 'sta': | |||
| break; | |||
| procFailed = StoreOp([null, 0x85, 0x95, 0x8D, 0x9D, 0x99, 0x81, 0x91], 2, 3); break; | |||
| // --- STX | |||
| case 'stx': | |||
| break; | |||
| procFailed = StoreOp([null, 0x86, 0x96, 0x8E, null, null, null, null], 2, 3); break; | |||
| // --- STY | |||
| case 'sty': | |||
| break; | |||
| procFailed = StoreOp([null, 0x84, 0x94, 0x8C, null, null, null, null], 2, 3); break; | |||
| // --- TAX | |||
| case 'tax': | |||
| procFailed = StoreSingleOp(0xAA); break; | |||
| @@ -512,13 +575,13 @@ class Assembler{ | |||
| procFailed = StoreSingleOp(0xA8); break; | |||
| // --- TSX | |||
| case 'tsx': | |||
| break; | |||
| procFailed = StoreSingleOp(0xBA); break; | |||
| // --- TXA | |||
| case 'txa': | |||
| procFailed = StoreSingleOp(0x8A); break; | |||
| // --- TXS | |||
| case 'txs': | |||
| break; | |||
| procFailed = StoreSingleOp(0x9A); break; | |||
| // --- TYA | |||
| case 'tya': | |||
| procFailed = StoreSingleOp(0x98); break; | |||