From 5b75ae35fc4241544b75d6df4ddb0f47bae96be3 Mon Sep 17 00:00:00 2001 From: Andy McFadden Date: Sat, 1 Feb 2020 16:24:14 -0800 Subject: [PATCH] Fix ANDImm flag updater For nonzero values we were leaving Z=prev, which is wrong when Z=0 because the AND result might be zero. Now if Z=1 we leave it alone, but if Z=0 we now set it to Z=?. Test 1003-flags-and-branches was testing for the (incorrect) behavior, so we're now running into a BRK. This is fine. --- Asm65/OpDef.cs | 6 ++++-- SourceGen/RuntimeData/Apple/DOS33.sym65 | 1 + .../SGTestData/Expected/1003-flags-and-branches_64tass.S | 2 +- .../SGTestData/Expected/1003-flags-and-branches_Merlin32.S | 2 +- .../SGTestData/Expected/1003-flags-and-branches_acme.S | 2 +- .../SGTestData/Expected/1003-flags-and-branches_cc65.S | 2 +- 6 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Asm65/OpDef.cs b/Asm65/OpDef.cs index 48d7c38..0eeb77f 100644 --- a/Asm65/OpDef.cs +++ b/Asm65/OpDef.cs @@ -667,10 +667,12 @@ namespace Asm65 { } private static StatusFlags FlagUpdater_ANDImm(StatusFlags flags, int immVal, ref StatusFlags condBranchTakenFlags) { - // AND #00 --> Z=1, else Z=prev + // AND #00 --> Z=1, else if Z=0 then Z=? // AND #7f --> N=0, else N=prev if (immVal == 0) { - flags.Z = 1; + flags.Z = 1; // acc is now zero + } else if (flags.Z == 0) { + flags.Z = TriState16.INDETERMINATE; // acc *might* now be zero } bool hiBitClear; if (immVal >= 0) { diff --git a/SourceGen/RuntimeData/Apple/DOS33.sym65 b/SourceGen/RuntimeData/Apple/DOS33.sym65 index bdfc4ba..e25c1a0 100644 --- a/SourceGen/RuntimeData/Apple/DOS33.sym65 +++ b/SourceGen/RuntimeData/Apple/DOS33.sym65 @@ -31,6 +31,7 @@ RWTS_TRACK_NUM @ $b7ec ;track number (0 - 34) RWTS_SECTOR_NUM @ $b7ed ;sector number (0-15) RWTS_DCT @ $b7ee 2 ;pointer to Device Characteristics Table RWTS_BUF @ $b7f0 2 ;pointer to data buffer for READ/WRITE +;RWTS_UNUSED @ $b7f2 RWTS_PARTIAL_COUNT @ $b7f3 ;byte count for partial sector RWTS_CMD_CODE @ $b7f4 ;0=seek, 1=read, 2=write, 4=format RWTS_ERR_CODE @ $b7f5 ;err code (when carry set) diff --git a/SourceGen/SGTestData/Expected/1003-flags-and-branches_64tass.S b/SourceGen/SGTestData/Expected/1003-flags-and-branches_64tass.S index 27b52ef..c17aff3 100644 --- a/SourceGen/SGTestData/Expected/1003-flags-and-branches_64tass.S +++ b/SourceGen/SGTestData/Expected/1003-flags-and-branches_64tass.S @@ -154,8 +154,8 @@ _L10AB lda #$00 _L10B3 lda #$ff and #$7f bne _L10BB + brk - .byte $00 .byte $db _L10BB bpl _L10BF diff --git a/SourceGen/SGTestData/Expected/1003-flags-and-branches_Merlin32.S b/SourceGen/SGTestData/Expected/1003-flags-and-branches_Merlin32.S index 3141928..4b40d90 100644 --- a/SourceGen/SGTestData/Expected/1003-flags-and-branches_Merlin32.S +++ b/SourceGen/SGTestData/Expected/1003-flags-and-branches_Merlin32.S @@ -149,8 +149,8 @@ L105F sep #$80 :L10B3 lda #$ff and #$7f bne :L10BB + brk - dfb $00 dfb $db :L10BB bpl :L10BF diff --git a/SourceGen/SGTestData/Expected/1003-flags-and-branches_acme.S b/SourceGen/SGTestData/Expected/1003-flags-and-branches_acme.S index dd3adb7..24ef94d 100644 --- a/SourceGen/SGTestData/Expected/1003-flags-and-branches_acme.S +++ b/SourceGen/SGTestData/Expected/1003-flags-and-branches_acme.S @@ -154,8 +154,8 @@ L105F sep #$80 @L10B3 lda #$ff and #$7f bne @L10BB + brk - !byte $00 !byte $db @L10BB bpl @L10BF diff --git a/SourceGen/SGTestData/Expected/1003-flags-and-branches_cc65.S b/SourceGen/SGTestData/Expected/1003-flags-and-branches_cc65.S index 4e1b08a..95971b2 100644 --- a/SourceGen/SGTestData/Expected/1003-flags-and-branches_cc65.S +++ b/SourceGen/SGTestData/Expected/1003-flags-and-branches_cc65.S @@ -155,8 +155,8 @@ L105F: sep #$80 @L10B3: lda #$ff and #$7f bne @L10BB + brk - .byte $00 .byte $db @L10BB: bpl @L10BF