dirkwhoffmann / virtualc64

VirtualC64 is a cycle-accurate C64 emulator for macOS
https://dirkwhoffmann.github.io/virtualc64
Other
355 stars 33 forks source link

BCD mode flags, detection of WD65C802/816 #639

Closed dirkwhoffmann closed 3 years ago

dirkwhoffmann commented 3 years ago

This was posted in a German C64 forum. I quote it here so it won't be forgotten:

Nun zu etwas Technischem: Ich habe mir die CPU-Emulation ein bisschen angesehen, https://github.com/dirkwhoffma…r/CPU/CPUInstructions.cpp

Bei der BCD-Arithmetik ist mir aufgefallen, dass bei ADC und SBC die Flags Z, N und V so gesetzt werden, als wären es keine BCD-Operationen. Nur der 6502/6510 setzt die Flags im BCD-Modus eben nicht richtig (soweit ich weiß wird nur C korrekt gesetzt). Erst die WD 65C802/816 machen es richtig, weswegen die CPU-Erkennung an dem auch scheitern dürfte. Die geht nämlich so:

Code
        SED
        LDA #$99
        CLC
        ADC #1
        CLD
        BEQ HV816
; 6502 here           ;flags show N set, and Z clear, even though A=0
HV816                 ;816 here

Soweit ich das sehe würde der Code beim Emulator einen 802/816er erkennen. ;)

Bei PLA dachte ich erst, dass die Flag-Behandlung nicht stimmt. PLA setzt nämlich das Z- und N-Flag entsprechend dem vom Stapel geholten Wert. Im Kommentar zum PLA-Befehl steht es jedenfalls falsch. Aber glücklicherweise verwendet PULL_A das Makro LoadA und das setzt implizit Z und N richtig. :) Ich hab das in meiner Grafikerweiterung einige Male in Verwendung ... Code PLA BNE ... Kommt auch im BASIC-Interpreter vor, z.B. bei $A45F oder bei $A9C1 ... da wär das wohl auch unangenehm aufgefallen. Somit passt es also, nur die Doku im Source stimmt nicht ganz. ;)

JeeeK commented 3 years ago

According to Graham:

Example to Z: SED CLC LDA #$80 ADC #$80 ... results in A=$60, but the Z flag is 1.

dirkwhoffmann commented 3 years ago

Somit passt es also, nur die Doku im Source stimmt nicht ganz. ;)

Just to make sure we're on the same page: You are saying the code is fine, but the comments are wrong?

I am asking, because I did run all CPU related VICE tests and they all pass. However, I am not sure if the VICE tests cover this specific feature at all. Do you happen to know a small test program (D64 or PRG) that can be used to check this particular CPU feature?

Alessandro1970 commented 3 years ago

...perhaps something can be found here: https://stardot.org.uk/forums/viewtopic.php?t=8793

Or: http://www.zimmers.net/anonftp/pub/cbm/documents/chipdata/64doc 64doc contains an exhaustive test for BCD mode, by Marko Mäkelä. The document was originally created by Jouko Valta and/or John West.

_

https://github.com/Klaus2m5/6502_65C02_functional_tests http://www.softwolves.com/arkiv/cbm-hackers/7/7114.html

JeeeK commented 3 years ago

Just to make sure we're on the same page: You are saying the code is fine, but the comments are wrong?

This is just regarding the PLA opcode, not the BCD issue. There was to much of my initial comment copied in. ;)

dirkwhoffmann commented 3 years ago

OK, just double checked the code with a small Turbo Assembler program. We're all good:

Bildschirmfoto 2021-05-14 um 13 07 39 Bildschirmfoto 2021-05-14 um 13 07 47