|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function ALU(cpu, m, b){ |
|
|
function ALU(cpu, m, b){ |
|
|
switch(m){ |
|
|
|
|
|
case 0: // Addition |
|
|
|
|
|
cpu.__AR = (cpu.__AR + b) + ((cpu.C === 1) ? 1 : 0); |
|
|
|
|
|
//cpu.C = (this.__AR >= 256); |
|
|
|
|
|
break; |
|
|
|
|
|
case 1: // Subtraction |
|
|
|
|
|
cpu.__AR = (cpu.__AR - b) - ((cpu.C === 0) ? 1 : 0); |
|
|
|
|
|
//cpu.C = (this.__AR >= 0); |
|
|
|
|
|
cpu.__AR += (cpu.__AR < 0) ? 256 : 0; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
cpu.V = (BITM.isOn(cpu.__AR, 7) === BITM.isOn(b, 7)) && (BITM.val(cpu.__AR, 7) !== BITM.val(cpu.__AR, 7)); |
|
|
|
|
|
cpu.C = (m === 0) ? (this.__AR >= 256) : (cpu.V === 0); |
|
|
|
|
|
cpu.N = BITM.val(cpu.__AR, 7); |
|
|
|
|
|
|
|
|
|
|
|
cpu.__AR &= 0xFF; |
|
|
|
|
|
cpu.Z = (cpu.__AR === 0); |
|
|
|
|
|
|
|
|
let A = 0; |
|
|
|
|
|
let IAR = cpu.__AR; |
|
|
|
|
|
if (cpu.D === 0){ // Binary Mode |
|
|
|
|
|
switch(m){ |
|
|
|
|
|
case 0: // Addition |
|
|
|
|
|
A = (cpu.__AR + b) + ((cpu.C === 1) ? 1 : 0); |
|
|
|
|
|
//cpu.C = (this.__AR >= 256); |
|
|
|
|
|
break; |
|
|
|
|
|
case 1: // Subtraction |
|
|
|
|
|
A = (cpu.__AR - b) - ((cpu.C === 0) ? 1 : 0); |
|
|
|
|
|
//cpu.C = (this.__AR >= 0); |
|
|
|
|
|
A += (A < 0) ? 256 : 0; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
cpu.__AR = A & 0xFF; |
|
|
|
|
|
|
|
|
|
|
|
// Both inputs have the same sign, but the output doesn't match the sign of the input. |
|
|
|
|
|
// (Twos Compliment) |
|
|
|
|
|
cpu.V = ((IAR & 0x80) === (b & 0x80)) && ((IAR & 0x80) !== (cpu.__AR & 0x80)); |
|
|
|
|
|
//cpu.V = (BITM.isOn(cpu.__AR, 7) === BITM.isOn(b, 7)) && (BITM.val(cpu.__AR, 7) !== BITM.val(cpu.__AR, 7)); |
|
|
|
|
|
cpu.C = (m === 0) ? (A >= 256) : (cpu.V === 0); |
|
|
|
|
|
cpu.N = BITM.isOn(cpu.__AR, 7); |
|
|
|
|
|
|
|
|
|
|
|
//cpu.__AR &= 0xFF; |
|
|
|
|
|
cpu.Z = (cpu.__AR === 0); |
|
|
|
|
|
} else { // Decimal (BCD) Mode |
|
|
|
|
|
// Borrowed from information located on... |
|
|
|
|
|
// http://www.6502.org/tutorials/decimal_mode.html |
|
|
|
|
|
let AL = 0; |
|
|
|
|
|
switch(m){ |
|
|
|
|
|
case 0: // Addition |
|
|
|
|
|
AL = (cpu.__AR & 0x0F) + (b & 0x0F) + ((cpu.C === 1) ? 1 : 0); |
|
|
|
|
|
AL = (AL < 0x0A) ? AL : ((AL + 0x06) & 0x0F) + 0x10; |
|
|
|
|
|
A = (cpu.__AR & 0xF0) + (b & 0xF0) + AL; |
|
|
|
|
|
A += (A >= 0xA0) ? 0x60 : 0; |
|
|
|
|
|
cpu.__AR = A & 0xFF; |
|
|
|
|
|
cpu.C = (A >= 0x100); |
|
|
|
|
|
cpu.N = (BITM.isOn(A, 7)) ? 1 : 0; |
|
|
|
|
|
cpu.V = (A >= -128 && A <= 127) ? 0 : 1; |
|
|
|
|
|
break; |
|
|
|
|
|
case 1: // Subtraction |
|
|
|
|
|
AL = (cpu.__AR & 0x0F) - (b & 0x0F) + (cpu.C - 1); |
|
|
|
|
|
AL = (AL >= 0) ? AL : ((AL - 0x06) & 0x0F) - 0x10; |
|
|
|
|
|
A = (A & 0xF0) - (b & 0xF0) + AL; |
|
|
|
|
|
A -= (A >= 0) ? 0 : 0x60; |
|
|
|
|
|
cpu.__AR = A & 0xFF; |
|
|
|
|
|
|
|
|
|
|
|
cpu.V = ((IAR & 0x80) === (b & 0x80)) && ((IAR & 0x80) !== (cpu.__AR & 0x80)); |
|
|
|
|
|
cpu.C = (cpu.V === 0); |
|
|
|
|
|
cpu.N = BITM.isOn(cpu.__AR, 7); |
|
|
|
|
|
cpu.Z = (cpu.__AR === 0); |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
return cpu.__AR; |
|
|
return cpu.__AR; |
|
|
} |
|
|
} |
|
|
|
|
|
|