Skip to content

Commit abd5aae

Browse files
committed
[fix] Increment RTL return address
Fixes #20
1 parent 1882880 commit abd5aae

File tree

2 files changed

+7
-7
lines changed

2 files changed

+7
-7
lines changed

src/chips/w65c816s.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1862,8 +1862,8 @@ uint64_t w65816_tick(w65816_t* c, uint64_t pins) {
18621862
case (0x60<<4)|1: _SA(c->PC);break;
18631863
case (0x60<<4)|2: _VDA(0);_SA(_SP(++_S(c)));break;
18641864
case (0x60<<4)|3: _VDA(0);_SA(_SP(++_S(c)));c->AD=_GD();break;
1865-
case (0x60<<4)|4: c->PC=(_GD()<<8)|c->AD;_SA(c->PC++);break;
1866-
case (0x60<<4)|5: _FETCH();break;
1865+
case (0x60<<4)|4: _SA(_SP(_S(c)));c->PC=(_GD()<<8)|c->AD;break;
1866+
case (0x60<<4)|5: ++c->PC;_FETCH();break;
18671867
case (0x60<<4)|6: assert(false);break;
18681868
case (0x60<<4)|7: assert(false);break;
18691869
case (0x60<<4)|8: assert(false);break;
@@ -1973,7 +1973,7 @@ uint64_t w65816_tick(w65816_t* c, uint64_t pins) {
19731973
case (0x6B<<4)|2: _VDA(0);_SA(_SP(++_S(c)));break;
19741974
case (0x6B<<4)|3: _VDA(0);_SA(_SP(++_S(c)));c->AD=_GD();break;
19751975
case (0x6B<<4)|4: _VDA(0);_SA(_SP(++_S(c)));c->PC=(_GD()<<8)|c->AD;break;
1976-
case (0x6B<<4)|5: c->PBR=_GD();_FETCH();break;
1976+
case (0x6B<<4)|5: c->PBR=_GD();++c->PC;_FETCH();break;
19771977
case (0x6B<<4)|6: assert(false);break;
19781978
case (0x6B<<4)|7: assert(false);break;
19791979
case (0x6B<<4)|8: assert(false);break;

src/codegen/w65c816s_gen.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -752,10 +752,10 @@ def i_rts(o):
752752
o.t('_VDA(0);_SA(_SP(++_S(c)));')
753753
# load return address high byte from stack
754754
o.t('_VDA(0);_SA(_SP(++_S(c)));c->AD=_GD();')
755-
# put return address in PC, this is one byte before next op, do junk read from Stack
756-
o.t('c->PC=(_GD()<<8)|c->AD;_SA(c->PC++);')
755+
# put return address in PC, this is one byte before next op, do junk read from stack
756+
o.t('_SA(_SP(_S(c)));c->PC=(_GD()<<8)|c->AD;')
757757
# next tick is opcode fetch
758-
o.t('');
758+
o.t('++c->PC;');
759759

760760
#-------------------------------------------------------------------------------
761761
def i_rtl(o):
@@ -769,7 +769,7 @@ def i_rtl(o):
769769
# put return address in PC, read PBR from stack
770770
o.t('_VDA(0);_SA(_SP(++_S(c)));c->PC=(_GD()<<8)|c->AD;')
771771
# next tick is opcode fetch
772-
o.t('c->PBR=_GD();');
772+
o.t('c->PBR=_GD();++c->PC;');
773773

774774
#-------------------------------------------------------------------------------
775775
def i_rti(o):

0 commit comments

Comments
 (0)