My understanding is that in order to evaluate X - Y - borrow
, we can either perfrom X - (Y + borrow)
or (X - Y) - borrow
.
Typically, real CPUs do not perform two operations, but they use an ALU that uses "full adder-subtractors". These circuits perform a subtraction with borrow in one operation.
Typically, there is one circuit for each bit (e.g. 8 circuits for an 8-bit subtraction).
The circuit calculating the carry flag also calculates the upper bit (bit 7) of the result; it takes the upper bits (bit 7) of both numbers and an internal flag (which can be 0 or 1) as input. It has no other information!
We calculate 90h-80h
: The result is 10h
or 0Fh
(depending on the former state of the carry flag) and carry is clear. This means that the circuit will calculate 0
as upper bit of the result and clear carry if the upper bits of both input numbers are 1
and the "internal flag" has a certain state (0 or 1).
We calculate 80h-90h
: The result is 0F0h
or 0EFh
and carry is set. This means that the circuit will calculate 1
as upper bit of the result and set carry if the upper bits of both input numbers are 1
and the "internal flag" has the other state.
Calculating 0FFh-0FFh
, the upper bits of both input values also set to 1
. This means: Depending on the "internal flag", the circuit will either set the upper bit of the output to 0
and clear carry, or set the upper bit of the output to 1
and set carry.
So a result of A=0xFFh
and CY=0
is not possible.
Is it an implementation issue of GNUSim8085 or this actually happens in physical Intel 8085 chip due to the overflow?
There are CPUs that do not use a "full-adder" in the lowest bit to calculate a subtraction with borrow.
However, I doubt that the 8085 is one of those CPUs.
Having a look at the source code of GNUSim8085, you'll see comments like this (this one is taken from the function that performs SBI
):
/* I'm not sure abt the new code
* Old code:
Reading such comments, I think that there are still some bugs in that emulator.
EDIT
If someone having an actual 8085 kit ...
A result of CY=0
would definitely be a bug!
Why? Because a subtraction of a 32-bit constant from a 32-bit number would lead to the wrong result:
1000FF00h - 0FF01h = 0FFFFFFFh (if CY=1 in your example)
1000FF00h - 0FF01h = 1000FFFFh (if CY=0 in your example)
If Intel really produced some (buggy) 8085 ICs resulting in CY=0
, Intel would have corrected this bug in ICs produced later!
So you will definitely find real 8085 ICs resulting in CY=1
, while it is pure speculation that there might also be (buggy) ICs resulting in CY=0
.
By the way: Using the 8085 simulator "sim8085", your example results in CY=1
.