Thanks Jeff, that is a nice trick for sure.
Have to keep that in mind.

On Thursday, December 19, 2024, <[email protected]> wrote:

> Knowing the use case makes things clear. This brings up a thought though.
> Given that the NSC800 and Z80 will set P for Parity OR Overflow how would
> one disambiguate the two?
>
>
>
> Given that you have the value of interest in A and flag P is set. Then you
> do:
>
> MOV A,A
>
>
>
> If P is now NOT set, you know that P was set due to overflow. If P is
> still set then you know it is set because of Parity but you don’t know it
> may have also been set due to overflow. If Parity is what is important you
> can filter out the Overlfow condition with a MOV A,A. (in my mind it works
> anyhow 😊 )
>
>
>
> Jeff Birt
>
>
>
> *From:* M100 <[email protected]> *On Behalf Of *Stephen
> Adolph
> *Sent:* Wednesday, December 18, 2024 6:19 PM
> *To:* [email protected]
> *Subject:* SPAM-LOW: [M100] Z80 is not quite 8085 compatible.
>
>
>
> I've been debugging my NSC800 CP/M modified Model 100.
>
>
>
> I noticed that, in M100 BASIC, issuing this command
>
> ? 65535-32767
>
> produced gibberish.
>
>
>
> I went on a bit of a deep dive on this.
>
> Here is what I found.
>
>
>
> NSC800 and Z80 dual purpose the P flag to be a P/V flag, meaning parity or
> overflow.
>
>
>
> This messed up the M100 in one specific place.
>
> RST 5 is a subroutine that is used to determine the type of a variable.
>
>
>
> 1069H
>
> (3AH)
>
> LDA FB65H      ; Type of last variable used
>
> 106CH
>
> (FEH)
>
> CPI 08H
>
> 106EH
>
> (3DH)
>
> DCR A
>
> 106FH
>
> (3DH)
>
> DCR A
>
> 1070H
>
> (3DH)
>
> DCR A
>
> 1071H
>
> (C9H)
>
> RET
>
>
>
> what is interesting here is that the CPI operation correctly sets the
> flags, then so do the following DCR.
>
> EXCEPT! in the Z80, DCR opcode treats the P flag as OVERFLOW and not
> PARITY.
>
>
>
> The calling subroutine ends up getting mostly correct flags, but not the P
> flag.
>
> So any subsequent use of the P flag would be a problem.
>
>
>
> Turns out this exact thing happens at
>
>
>
> 352AH
>
> (EFH)
>
> RST 5          ; Determine type of last var used
>
> 352BH
>
> (E0H)
>
> RPO
>
>
>
> this RPO redirects the program counter on the status of that flag.   Bingo.
>
> This appears to be the only such occurrence in the rom.
>
>
>
> So, I have yet another patch for the NSC800, that manually calculates
> parity and corrects the flag, so the existing M100 rom code can run cleanly.
>
>
>
> new ROM binary is here:
>
> https://bitchin100.com/wiki/index.php?title=NSC800_
> Conversion#Modified_M100_Main_ROM
>
>
>
>
>
>
>

Reply via email to