From cf1bc4fad427052eae7ce4d9077715459d938e89 Mon Sep 17 00:00:00 2001 From: "Matthew D. Steele" Date: Fri, 7 Jan 2022 09:56:46 -0500 Subject: [PATCH 1/4] Fix Pop() implementation in src/sim65/paravirt.c (fixes #1625) The Pop() function was not handling stack pointer wrap around correctly. Also, change the simulated RTS implementation in ParaVirtHooks() to explicitly sequence the two Pop() calls in the correct order. --- src/sim65/paravirt.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/sim65/paravirt.c b/src/sim65/paravirt.c index e73bd3400..b3ec8fa37 100644 --- a/src/sim65/paravirt.c +++ b/src/sim65/paravirt.c @@ -105,7 +105,7 @@ static void SetAX (CPURegs* Regs, unsigned Val) static unsigned char Pop (CPURegs* Regs) { - return MemReadByte (0x0100 + ++Regs->SP); + return MemReadByte (0x0100 + (++Regs->SP & 0xFF)); } @@ -327,5 +327,7 @@ void ParaVirtHooks (CPURegs* Regs) Hooks[Regs->PC - PARAVIRT_BASE] (Regs); /* Simulate RTS */ - Regs->PC = Pop(Regs) + (Pop(Regs) << 8) + 1; + unsigned lo = Pop(Regs); + unsigned hi = Pop(Regs); + Regs->PC = lo + (hi << 8) + 1; } From 92bfbeb8abf85596a30a13d5af275b535d640dfe Mon Sep 17 00:00:00 2001 From: "Matthew D. Steele" Date: Sat, 8 Jan 2022 16:24:40 -0500 Subject: [PATCH 2/4] Adjust Pop() sequencing in paravirt.c --- src/sim65/paravirt.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/sim65/paravirt.c b/src/sim65/paravirt.c index b3ec8fa37..7da683f1d 100644 --- a/src/sim65/paravirt.c +++ b/src/sim65/paravirt.c @@ -328,6 +328,5 @@ void ParaVirtHooks (CPURegs* Regs) /* Simulate RTS */ unsigned lo = Pop(Regs); - unsigned hi = Pop(Regs); - Regs->PC = lo + (hi << 8) + 1; + Regs->PC = lo + (Pop(Regs) << 8) + 1; } From 1f6bc6240faa126048c13ad20427b250d9cba235 Mon Sep 17 00:00:00 2001 From: "Matthew D. Steele" Date: Sat, 8 Jan 2022 16:29:42 -0500 Subject: [PATCH 3/4] Move local variable declaration to top of block --- src/sim65/paravirt.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/sim65/paravirt.c b/src/sim65/paravirt.c index 7da683f1d..ba3a76461 100644 --- a/src/sim65/paravirt.c +++ b/src/sim65/paravirt.c @@ -317,6 +317,8 @@ void ParaVirtInit (unsigned aArgStart, unsigned char aSPAddr) void ParaVirtHooks (CPURegs* Regs) /* Potentially execute paravirtualization hooks */ { + unsigned lo; + /* Check for paravirtualization address range */ if (Regs->PC < PARAVIRT_BASE || Regs->PC >= PARAVIRT_BASE + sizeof (Hooks) / sizeof (Hooks[0])) { @@ -327,6 +329,6 @@ void ParaVirtHooks (CPURegs* Regs) Hooks[Regs->PC - PARAVIRT_BASE] (Regs); /* Simulate RTS */ - unsigned lo = Pop(Regs); + lo = Pop(Regs); Regs->PC = lo + (Pop(Regs) << 8) + 1; } From 22a3d55e40317e2554c5e686725d793e8df9900c Mon Sep 17 00:00:00 2001 From: "Matthew D. Steele" Date: Sat, 8 Jan 2022 16:39:30 -0500 Subject: [PATCH 4/4] Add space after function names --- src/sim65/paravirt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sim65/paravirt.c b/src/sim65/paravirt.c index ba3a76461..db4120326 100644 --- a/src/sim65/paravirt.c +++ b/src/sim65/paravirt.c @@ -329,6 +329,6 @@ void ParaVirtHooks (CPURegs* Regs) Hooks[Regs->PC - PARAVIRT_BASE] (Regs); /* Simulate RTS */ - lo = Pop(Regs); - Regs->PC = lo + (Pop(Regs) << 8) + 1; + lo = Pop (Regs); + Regs->PC = lo + (Pop (Regs) << 8) + 1; }