fix evaluation order, per spec (a then b)

This commit is contained in:
Loic Nageleisen 2012-04-06 11:30:33 +02:00
parent e78f4b8af8
commit be5c3baae4

View file

@ -52,106 +52,106 @@ def JSR(c, a):
@opcode(0x1) @opcode(0x1)
def SET(c, a, b): def SET(c, a, b):
"""sets a to b""" """sets a to b"""
c[a] = c[b] a.set(b())
@opcode(0x2) @opcode(0x2)
def ADD(c, a, b): def ADD(c, a, b):
"""sets a to a+b, sets O to 0x0001 if there's an overflow""" """sets a to a+b, sets O to 0x0001 if there's an overflow"""
res = (c[a] + c[b]) res = (a() + b())
if res > wmask: if res > wmask:
c.o = 0x0001 c.o = 0x0001
res = res & wmask res = res & wmask
c[a] = res a.set(res)
@opcode(0x3) @opcode(0x3)
def SUB(c, a, b): def SUB(c, a, b):
"""sets a to a-b, sets O to 0xFFFF if there's an underflow""" """sets a to a-b, sets O to 0xFFFF if there's an underflow"""
res = (c[a] - c[b]) res = (a() - b())
if res & (wmask+1): if res & (wmask+1):
c.o = 0xFFFF c.o = 0xFFFF
res = res & wmask res = res & wmask
c[a] = res a.set(res)
@opcode(0x4) @opcode(0x4)
def MUL(c, a, b): def MUL(c, a, b):
"""sets a to a*b, sets O to ((a*b)>>16)&0xFFFF""" """sets a to a*b, sets O to ((a*b)>>16)&0xFFFF"""
res = (c[a] * c[b]) res = (a() * b())
c.o = ((c[a] * c[b]) >> w) & wmask c.o = ((a() * b()) >> w) & wmask
res = res & wmask res = res & wmask
c[a] = res a.set(res)
@opcode(0x5) @opcode(0x5)
def DIV(c, a, b): def DIV(c, a, b):
"""sets a to a/b, sets O to ((a<<16)/b)&0xFFFF""" """sets a to a/b, sets O to ((a<<16)/b)&0xFFFF"""
res = c[a] / c[b] res = a() / b()
c.o = ((c[a] << w) / c[b]) & wmask c.o = ((a() << w) / b()) & wmask
c[a] = res a.set(res)
@opcode(0x6) @opcode(0x6)
def MOD(c, a, b): def MOD(c, a, b):
"""sets a to a%b. if b==0, sets a to 0 instead""" """sets a to a%b. if b==0, sets a to 0 instead"""
if c[b]==0: if b()==0:
res = 0 res = 0
else: else:
res = c[a] % c[b] res = a() % b()
c[a] = res a.set(res)
@opcode(0x7) @opcode(0x7)
def SHL(c, a, b): def SHL(c, a, b):
"""sets a to a<<b. sets O to ((a<<b)>>16)&0xFFFF""" """sets a to a<<b. sets O to ((a<<b)>>16)&0xFFFF"""
res = (c[a] << c[b]) res = (a() << b())
c.o = ((c[a] << c[b]) >> w) & wmask c.o = ((a() << b()) >> w) & wmask
res = res & wmask res = res & wmask
c[a] = res a.set(res)
@opcode(0x8) @opcode(0x8)
def SHR(c, a, b): def SHR(c, a, b):
"""sets a to a>>b. sets O to ((a>>16)>>b)&0xFFFF""" """sets a to a>>b. sets O to ((a>>16)>>b)&0xFFFF"""
res = (c[a] >> c[b]) res = (a() >> b())
c.o = ((c[a] >> w) >> c[b]) & wmask c.o = ((a() >> w) >> b()) & wmask
res = res & wmask res = res & wmask
c[a] = res a.set(res)
@opcode(0x9) @opcode(0x9)
def AND(c, a, b): def AND(c, a, b):
"""sets a to a&b""" """sets a to a&b"""
res = c[a] & c[b] res = a() & b()
c[a] = res a.set(res)
@opcode(0xA) @opcode(0xA)
def BOR(c, a, b): def BOR(c, a, b):
"""sets a to a|b""" """sets a to a|b"""
res = c[a] | c[b] res = a() | b()
c[a] = res a.set(res)
@opcode(0xB) @opcode(0xB)
def XOR(c, a, b): def XOR(c, a, b):
"""sets a to a^b""" """sets a to a^b"""
res = c[a] ^ c[b] res = a() ^ b()
c[a] = res a.set(res)
@opcode(0xC) @opcode(0xC)
def IFE(c, a, b): def IFE(c, a, b):
"""performs next instruction only if a==b""" """performs next instruction only if a==b"""
if c[a] == c[b]: if a() == b():
c.skip = True c.skip = True
@opcode(0xD) @opcode(0xD)
def IFN(c, a, b): def IFN(c, a, b):
"""performs next instruction only if a!=b""" """performs next instruction only if a!=b"""
if c[a] != c[b]: if a() != b():
c.skip = True c.skip = True
@opcode(0xE) @opcode(0xE)
def IFG(c, a, b): def IFG(c, a, b):
"""performs next instruction only if a>b""" """performs next instruction only if a>b"""
if c[a] > c[b]: if a() > b():
c.skip = True c.skip = True
@opcode(0xF) @opcode(0xF)
def IFB(c, a, b): def IFB(c, a, b):
"""performs next instruction only if (a&b)!=0""" """performs next instruction only if (a&b)!=0"""
if (c[a] & c[b]) != 0: if (a() & b()) != 0:
c.skip = True c.skip = True
@ -324,8 +324,8 @@ class CPU(object):
log(op.__name__) log(op.__name__)
except KeyError: except KeyError:
raise Exception('Invalid opcode %01X at PC=%04X' % (opcode, c.pc)) raise Exception('Invalid opcode %01X at PC=%04X' % (opcode, c.pc))
a = word >> 4 & 0x3F a = c._pointer(word >> 4 & 0x3F)
b = word >> 10 & 0x3F b = c._pointer(word >> 10 & 0x3F)
if c.skip: if c.skip:
c.skip = False c.skip = False
else: else: