diff --git a/Asm65/OpDef.cs b/Asm65/OpDef.cs index 0eeb77f..9447324 100644 --- a/Asm65/OpDef.cs +++ b/Asm65/OpDef.cs @@ -709,6 +709,12 @@ namespace Asm65 { } return flags; } + private static StatusFlags FlagUpdater_LSR(StatusFlags flags, int immVal, + ref StatusFlags condBranchTakenFlags) { + flags.C = flags.Z = TriState16.INDETERMINATE; + flags.N = 0; // always shifts 0 into high bit + return flags; + } private static StatusFlags FlagUpdater_ROL(StatusFlags flags, int immVal, ref StatusFlags condBranchTakenFlags) { // this rotates the N flag into C, so set C=N @@ -1152,7 +1158,7 @@ namespace Asm65 { Effect = FlowEffect.Cont, BaseMemEffect = MemoryEffect.ReadModifyWrite, FlagsAffected = FlagsAffected_NZC, - StatusFlagUpdater = FlagUpdater_NZC + StatusFlagUpdater = FlagUpdater_LSR }; private static OpDef OpMVN = new OpDef() { Mnemonic = OpName.MVN, diff --git a/SourceGen/SGTestData/1003-flags-and-branches b/SourceGen/SGTestData/1003-flags-and-branches index 34e3a42..0f2797d 100644 Binary files a/SourceGen/SGTestData/1003-flags-and-branches and b/SourceGen/SGTestData/1003-flags-and-branches differ diff --git a/SourceGen/SGTestData/Expected/1003-flags-and-branches_64tass.S b/SourceGen/SGTestData/Expected/1003-flags-and-branches_64tass.S index c17aff3..e87ab2f 100644 --- a/SourceGen/SGTestData/Expected/1003-flags-and-branches_64tass.S +++ b/SourceGen/SGTestData/Expected/1003-flags-and-branches_64tass.S @@ -219,50 +219,57 @@ _L10F2 lda #$00 .byte $00 .byte $dc -_L10FA clc +_L10FA lda #$ff + lsr a + bpl _L1101 + + .byte $00 + .byte $dd + +_L1101 clc php sec plp - bcc _L1102 + bcc _L1109 .byte $00 .byte $00 -_L1102 sec - bcs _L1106 +_L1109 sec + bcs _L110D -_L1105 clc -_L1106 lda $33 - beq _L1105 - bcs _L110E +_L110C clc +_L110D lda $33 + beq _L110C + bcs _L1115 lda $44 -_L110E nop +_L1115 nop rep #$20 .al sep #$10 - jsr _L112A + jsr _L1131 rep #$30 .xl - jsr _L1130 + jsr _L1137 sep #$30 .as .xs - jsr _L1130 + jsr _L1137 rep #$20 .al sep #$10 - jsr _L112A + jsr _L1131 sep #$30 .as rts .al -_L112A lda #$1234 +_L1131 lda #$1234 ldx #$ff rts .as -_L1130 lda #$ff +_L1137 lda #$ff ldx #$ee ldy #$dd rts diff --git a/SourceGen/SGTestData/Expected/1003-flags-and-branches_Merlin32.S b/SourceGen/SGTestData/Expected/1003-flags-and-branches_Merlin32.S index 4b40d90..d8ea883 100644 --- a/SourceGen/SGTestData/Expected/1003-flags-and-branches_Merlin32.S +++ b/SourceGen/SGTestData/Expected/1003-flags-and-branches_Merlin32.S @@ -214,49 +214,56 @@ L105F sep #$80 dfb $00 dfb $dc -:L10FA clc +:L10FA lda #$ff + lsr A + bpl :L1101 + + dfb $00 + dfb $dd + +:L1101 clc php sec plp - bcc :L1102 + bcc :L1109 dfb $00 dfb $00 -:L1102 sec - bcs :L1106 +:L1109 sec + bcs :L110D -:L1105 clc -:L1106 lda $33 - beq :L1105 - bcs :L110E +:L110C clc +:L110D lda $33 + beq :L110C + bcs :L1115 lda $44 -:L110E nop +:L1115 nop rep #$20 mx %01 sep #$10 - jsr :L112A + jsr :L1131 rep #$30 mx %00 - jsr :L1130 + jsr :L1137 sep #$30 mx %11 - jsr :L1130 + jsr :L1137 rep #$20 mx %01 sep #$10 - jsr :L112A + jsr :L1131 sep #$30 mx %11 rts mx %01 -:L112A lda #$1234 +:L1131 lda #$1234 ldx #$ff rts mx %11 -:L1130 lda #$ff +:L1137 lda #$ff ldx #$ee ldy #$dd rts diff --git a/SourceGen/SGTestData/Expected/1003-flags-and-branches_acme.S b/SourceGen/SGTestData/Expected/1003-flags-and-branches_acme.S index 24ef94d..545263c 100644 --- a/SourceGen/SGTestData/Expected/1003-flags-and-branches_acme.S +++ b/SourceGen/SGTestData/Expected/1003-flags-and-branches_acme.S @@ -219,50 +219,57 @@ L105F sep #$80 !byte $00 !byte $dc -@L10FA clc +@L10FA lda #$ff + lsr + bpl @L1101 + + !byte $00 + !byte $dd + +@L1101 clc php sec plp - bcc @L1102 + bcc @L1109 !byte $00 !byte $00 -@L1102 sec - bcs @L1106 +@L1109 sec + bcs @L110D -@L1105 clc -@L1106 lda $33 - beq @L1105 - bcs @L110E +@L110C clc +@L110D lda $33 + beq @L110C + bcs @L1115 lda $44 -@L110E nop +@L1115 nop rep #$20 !al sep #$10 - jsr @L112A + jsr @L1131 rep #$30 !rl - jsr @L1130 + jsr @L1137 sep #$30 !as !rs - jsr @L1130 + jsr @L1137 rep #$20 !al sep #$10 - jsr @L112A + jsr @L1131 sep #$30 !as rts !al -@L112A lda #$1234 +@L1131 lda #$1234 ldx #$ff rts !as -@L1130 lda #$ff +@L1137 lda #$ff ldx #$ee ldy #$dd rts diff --git a/SourceGen/SGTestData/Expected/1003-flags-and-branches_cc65.S b/SourceGen/SGTestData/Expected/1003-flags-and-branches_cc65.S index 95971b2..f65691e 100644 --- a/SourceGen/SGTestData/Expected/1003-flags-and-branches_cc65.S +++ b/SourceGen/SGTestData/Expected/1003-flags-and-branches_cc65.S @@ -220,50 +220,57 @@ L105F: sep #$80 .byte $00 .byte $dc -@L10FA: clc +@L10FA: lda #$ff + lsr A + bpl @L1101 + + .byte $00 + .byte $dd + +@L1101: clc php sec plp - bcc @L1102 + bcc @L1109 .byte $00 .byte $00 -@L1102: sec - bcs @L1106 +@L1109: sec + bcs @L110D -@L1105: clc -@L1106: lda $33 - beq @L1105 - bcs @L110E +@L110C: clc +@L110D: lda $33 + beq @L110C + bcs @L1115 lda $44 -@L110E: nop +@L1115: nop rep #$20 .a16 sep #$10 - jsr @L112A + jsr @L1131 rep #$30 .i16 - jsr @L1130 + jsr @L1137 sep #$30 .a8 .i8 - jsr @L1130 + jsr @L1137 rep #$20 .a16 sep #$10 - jsr @L112A + jsr @L1131 sep #$30 .a8 rts .a16 -@L112A: lda #$1234 +@L1131: lda #$1234 ldx #$ff rts .a8 -@L1130: lda #$ff +@L1137: lda #$ff ldx #$ee ldy #$dd rts diff --git a/SourceGen/SGTestData/Expected/1003-flags-and-branches_cc65.cfg b/SourceGen/SGTestData/Expected/1003-flags-and-branches_cc65.cfg index 1fd5402..c1cdbb0 100644 --- a/SourceGen/SGTestData/Expected/1003-flags-and-branches_cc65.cfg +++ b/SourceGen/SGTestData/Expected/1003-flags-and-branches_cc65.cfg @@ -1,7 +1,7 @@ # 6502bench SourceGen generated linker script for 1003-flags-and-branches MEMORY { MAIN: file=%O, start=%S, size=65536; -# MEM000: file=%O, start=$1000, size=311; +# MEM000: file=%O, start=$1000, size=318; } SEGMENTS { CODE: load=MAIN, type=rw; diff --git a/SourceGen/SGTestData/Source/1003-flags-and-branches.S b/SourceGen/SGTestData/Source/1003-flags-and-branches.S index 059510f..26ba38d 100644 --- a/SourceGen/SGTestData/Source/1003-flags-and-branches.S +++ b/SourceGen/SGTestData/Source/1003-flags-and-branches.S @@ -195,6 +195,13 @@ ok_ror2 brk $dc ok_rol1 +; check lsr + lda #$ff + lsr A ;lsr always clears the high bit + bpl ok_lsr + brk $dd +ok_lsr + ; simple php/plp pair test clc php