guarding against PC/SP overflow

This commit is contained in:
Loic Nageleisen 2012-04-08 18:24:05 +02:00
parent 6d5a40d6ac
commit 7f97d50ce0

View file

@ -198,9 +198,9 @@ def register_value(c, code):
@pointerize @pointerize
def next_word_plus_register_value(c, code): def next_word_plus_register_value(c, code):
"""[next word + register]""" """[next word + register]"""
c.pc += 1
v = "c.m[0x%04X + c.r[0x%01X]]" % (c.m[c.pc], code-0x0F) v = "c.m[0x%04X + c.r[0x%01X]]" % (c.m[c.pc], code-0x0F)
if c.debug: log(v) if c.debug: log(v)
c.pc = (c.pc + 1) & wmask
return v return v
@valcode(0x18) @valcode(0x18)
@ -208,8 +208,8 @@ def next_word_plus_register_value(c, code):
def pop(c): def pop(c):
"""POP / [SP++]""" """POP / [SP++]"""
v = "c.m[0x%04X]" % c.sp v = "c.m[0x%04X]" % c.sp
c.sp += 1
if c.debug: log(v) if c.debug: log(v)
c.sp = (c.sp + 1) & wmask
return v return v
@valcode(0x19) @valcode(0x19)
@ -224,7 +224,7 @@ def peek(c):
@pointerize @pointerize
def push(c): def push(c):
"""PUSH / [--SP]""" """PUSH / [--SP]"""
c.sp -= 1 c.sp = (c.sp - 1) & wmask
v = "c.m[0x%04X]" % c.sp v = "c.m[0x%04X]" % c.sp
if c.debug: log(v) if c.debug: log(v)
return v return v
@ -258,7 +258,7 @@ def overflow(c):
def next_word_value(c): def next_word_value(c):
"""[next_word]""" """[next_word]"""
v = "c.m[0x%04X]" % c.m[c.pc] v = "c.m[0x%04X]" % c.m[c.pc]
c.pc += 1 c.pc = (c.pc + 1) & wmask
if c.debug: log(v) if c.debug: log(v)
return v return v
@ -267,7 +267,7 @@ def next_word_value(c):
def next_word(c): def next_word(c):
"""next_word (literal)""" """next_word (literal)"""
v = "c.m[0x%04X]" % c.pc v = "c.m[0x%04X]" % c.pc
c.pc += 1 c.pc = (c.pc + 1) & wmask
if c.debug: log(v) if c.debug: log(v)
return v return v
@ -375,8 +375,8 @@ class CPU(object):
def step(c): def step(c):
"""start handling [PC]""" """start handling [PC]"""
word = c.m[c.pc] word = c.m[c.pc]
c.pc += 1
opcode = word & 0xF opcode = word & 0xF
c.pc = (c.pc + 1) & wmask
try: try:
op = opcode_map[(opcode,)] op = opcode_map[(opcode,)]
if c.debug: log(op.__name__) if c.debug: log(op.__name__)