From 6205c12145843e2185958971218a2a333a6127f1 Mon Sep 17 00:00:00 2001 From: dschmenk Date: Fri, 29 Jan 2016 13:42:47 -0800 Subject: [PATCH] Fix IDXW bug in portable VM --- src/inc/testlib.plh | 2 +- src/samplesrc/test.pla | 17 ++++++++++++++++- src/samplesrc/testlib.pla | 2 +- src/vmsrc/plvm.c | 6 ++++-- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/inc/testlib.plh b/src/inc/testlib.plh index a2e244a..66710fa 100644 --- a/src/inc/testlib.plh +++ b/src/inc/testlib.plh @@ -1,5 +1,5 @@ import testlib - predef puti, putln + predef puti word print const dec = 0 const hex = 2 diff --git a/src/samplesrc/test.pla b/src/samplesrc/test.pla index b9af489..e3581b1 100755 --- a/src/samplesrc/test.pla +++ b/src/samplesrc/test.pla @@ -62,13 +62,18 @@ def nums(range) puti(i) putln next + puti(array[0]);putln + puti(array[1]);putln i++ j = 2 j++ - array[0]++ + array[1]++ + array[0] = array[0] + 1 array++ a1[0]++ a1++ + puti(array[0]);putln + puti(array[1]);putln end export def main(range) nums(*range) @@ -100,6 +105,16 @@ export def main(range) wend putln end +puti(array[0]);putc(' ') +puti(array[1]);putc(' ') +puti(array[2]);putc(' ') +puti(array[3]);putc(' ') +puti(array[4]);putln +puti((@array)=>0);putc(' ') +puti((@array)=>2);putc(' ') +puti((@array)=>4);putc(' ') +puti((@array)=>6);putc(' ') +puti((@array)=>8);putln ptr = @main ptr(@array:6) ptr = @array diff --git a/src/samplesrc/testlib.pla b/src/samplesrc/testlib.pla index e2d288c..ebaca9f 100755 --- a/src/samplesrc/testlib.pla +++ b/src/samplesrc/testlib.pla @@ -5,7 +5,7 @@ include "inc/cmdsys.plh" // // Module data. // -predef puti, puth, putln +predef puti, puth export word print[] = @puti, @puth, @putln, @puts, @putc byte valstr[] = '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' byte loadstr[] = "testlib loaded!" diff --git a/src/vmsrc/plvm.c b/src/vmsrc/plvm.c index 7a8af8d..fbeb538 100755 --- a/src/vmsrc/plvm.c +++ b/src/vmsrc/plvm.c @@ -604,8 +604,10 @@ void interp(code *ip) ea = POP; PUSH(ea >> val); break; - case 0x1E: // IDXW : TOS = TOS * 2 - TOS *= 2; + case 0x1E: // IDXW : TOS = TOS * 2 + TOS-1 + val = POP; + ea = POP; + PUSH(ea + val * 2); break; /* * 0x20-0x2F