I'm currently writing a bit of code for the 4004 at the moment, and playing
with it in the online Javascript emulator found here:
http://e4004.szyc.org/emu/
According to
http://e4004.szyc.org/iset.html (which I believe is copied
straight from the MCS-4 Users Manual), the DAA instruction should increment
the accumulator by 6 if carry is set or if the accumulator is greater than
9. Carry should be set following the instruction if the resulting addition
generated a carry; otherwise it's unaffected.
Let's say the accumulator is currently 9, carry is not set. I add another
9. Accumulator is now 2 with a carry. Running DAA should turn this into 8
with carry set, indicating that 9+9=(1)8. Am I thinking through this
correctly?
I ask, because according to the simulator's source code, DAA won't do that,
if I'm following it correctly:
function opDAA() { //DAA Decimal Adjust Accumulator
if(A_reg > 9) A_reg += 6;
C_flag=0; if (A_reg & 0xf0) {A_reg&=0xf; C_flag=1;}
incPC();
}
It says that it'll only add 6 if the accumulator is greater than 9, not if
a carry is already set. It will then reset carry and set it if and only if
there was a carry.
Have I found a bug in the simulator? Am I misreading the MCS-4 Users
Manual?
In any event, this is my proposed fix to better match what the instruction
description says:
function opDAA() { //DAA Decimal Adjust Accumulator
if((A_reg > 9) | (C_flag)) A_reg += 6;
if (A_reg & 0xf0) {A_reg&=0xf; C_flag=1;}
incPC();
}
Seems to work as I would expect it to.
Thanks,
Kyle