| } | } | ||||
| 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; | ||||
| } | } | ||||