[Simh] DAA Emulation
Richard Cini
rich.cini at verizon.net
Sat Dec 11 09:16:48 EST 2010
Al --
Thanks a lot for the email. I¹m sure you looked at this, but I pulled
the Intel 8080 Users Manual and under DAA, it says the following (snipping a
bit):
The 8-bit number in the accumulator is adjusted to form two 4-bit [BCD]
digits by the following process:
(1) If the value of the least significant 4 bits is greater than 9
or if the AC flag is set, 6 is added to the accumulator.
(2) if the value of the most significant 4 bits is now greater than
9 or if the CY flag is set, 6 is added to the most significant 4 bits of the
accumulator.
Based on this, I would say that the second part of the test in the
Altair32 code is wrong. Further, it looks like the SIMH code may be wrong as
well because it doesn¹t test the CY flag in the second test.
As far as the register display, I¹ll make that change oddly no one has
ever reported it.
Thanks again for locating this bug.
Rich
--
Rich Cini
Collector of Classic Computers
Build Master and lead engineer, Altair32 Emulator
http://www.altair32.com
http://www.classiccmp.org/cini
On 12/11/10 1:32 AM, "Al Williams" <al.williams at awce.com> wrote:
> Hi Rich and Bob,
>
> I've been doing some work on Vince Briel's excellent AVR emulation of the 8080
> and while rewriting DAA I came across what I think to be a harmless bug but
> thought you might want to comment on it.
>
> From what I can glean DAA effects all flags including half carry. And I
> _think_ that half carry occurs from the +6 (if it happens at all). So if you
> don't adjust the LSD you get AC=0. If you add 6 then if adding the 6 gives you
> a carry out of Bit 3 you get AC set. Note that the carry might ripple so
> that's NOT to say Bit 4 is necessarily 1.
>
> Here's part of Altair32's code:
>
> static void daa ( OP_ARG_U )
> {
> // Decimal Adjust Accumulator
> // DAA:: A=BCD format
> // Flags: SZAPC
> // *****
>
> register /* FJS */ word tmp = ACCUM;
>
> if ( (( tmp & 0x0f ) > 0x09 ) || ( FLAGS & AC_FLAG ))
> tmp += 0x06;
>
> if (tmp > 0x0f)
> FLAGS |= AC_FLAG; // if adjusted LSB > 0xf, set AC
> else
> FLAGS &= ~AC_FLAG; // else clear SC
>
>
> So since tmp is not masked off, any value >0xF gets AC set even if no carry or
> add occurred! In other words, pretend the value of ACCUM is 90 (and thus temp
> is 90) with AC=0. The first if does not fire. The second if does and AC gets
> set. That's got to be wrong. Granted, who checks AC after DAA? But still....
>
>
> So why copy Bob? Well... I think SIMH has a similar but different problem.
> Here's a snip from the DAA code:
>
> /*opcode=0x27*/
> static void i86op_daa(PC_ENV *m)
> {
> uint16 dbyte;
> dbyte = m->R_AL;
> if (ACCESS_FLAG(m,F_AF)|| (dbyte&0xf) > 9)
> {
> dbyte += 6;
> if (dbyte&0x100)
> SET_FLAG(m, F_CF);
> SET_FLAG(m, F_AF);
> }
> else
>
>
> Here we add 6 to dbyte and then AC is always set. If no +6 then AC is cleared.
> This COULD be correct behavior, but I can't find any reference material that
> says it is. In any event, SIMH and Altair32 are doing something different
> here, so they both can't be right. Meanwhile I have my own version of DAA in
> AVR assembler that I will spare you unless you ask. The only real silicon I
> have even close to operational at the moment is a Z80 and not only is it not
> operational, the DAA is one place where it is a lot different so I don't trust
> the result there.
>
> Oh. One other note about Altair32. In the debugger, the A and FLAGS display is
> swapped in the debug console window. The Register display up top left is ok
> though. I bet you've heard that one before.
>
> If either of you can show documentation on the AC flag after DAA or point to a
> real piece of silicon's behavior I'd like to know so I can fix the DAA code in
> the Briel emulator to match. Otherwise, I thought you'd like to know about
> this bug even though it is pretty innocuous as far as I can tell.
>
>
> Al Williams
> http://www.ddj.com/embedded (among others)
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.trailing-edge.com/pipermail/simh/attachments/20101211/9c31adb2/attachment-0002.html>
More information about the Simh
mailing list