Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
nesh committed Oct 26, 2008
1 parent f2752ab commit 3df09e1
Showing 1 changed file with 66 additions and 5 deletions.
71 changes: 66 additions & 5 deletions hardware/Z80/opcodes/_opcodes.py
Expand Up @@ -27,6 +27,14 @@ def parse_bits(self, bits):
if len(args) > 1:
self.src = args[1].lower()

def add_t(self):
if len(self.tstates) == 1:
return ''
t0, t1 = self.tstates
t1 = t1 - t0
if not t1: return ''
return ADD_T % (t1, t1)

def __call__(self, type_, code, op, tstates, bits):
self.parse_bits(bits)
self.name = ' '.join(bits)
Expand Down Expand Up @@ -312,7 +320,7 @@ def parse(self):
'self.b = (self.b - 1) & 0xFF',
'if self.b:',
'%(IDENT)sself.pc = (self.pc + offset) & 0xFFFF' % globals(),
'%s%s' % (IDENT, (ADD_T % (5, 5))),
'%s%s' % (IDENT, self.add_t()),
]
CMDS['DJNZ'] = DJNZ()

Expand Down Expand Up @@ -342,13 +350,13 @@ def parse(self):
ret += [
'if self.f & %sF:' % flag.upper(),
'%(IDENT)sself.pc = (self.pc + offset) & 0xFFFF' % globals(),
'%s%s' % (IDENT, (ADD_T % (5, 5))),
'%s%s' % (IDENT, self.add_t()),
]
elif flag in _NOTCOND:
ret += [
'if not (self.f & %sF):' % flag[1].upper(),
'%(IDENT)sself.pc = (self.pc + offset) & 0xFFFF' % globals(),
'%s%s' % (IDENT, (ADD_T % (5, 5))),
'%s%s' % (IDENT, self.add_t()),
]
else:
raise ValueError('unhandled flag %(opcode)s: %(flag)s' % locals())
Expand Down Expand Up @@ -692,7 +700,7 @@ def parse(self):
'if self.f & %sF:' % flag.upper(),
'%(IDENT)sself.pc = self.read16(self.sp)' % globals(),
'%(IDENT)sself.sp = (self.sp + 2) & 0xFFFF' % globals(),
'%s%s' % (IDENT, (ADD_T % (6, 6))),
'%s%s' % (IDENT, self.add_t()),
]
elif flag is not None and (flag in _NOTCOND):
if flag == 'p':
Expand All @@ -703,14 +711,67 @@ def parse(self):
'if not (self.f & %sF):' % flag[1].upper(),
'%(IDENT)sself.pc = self.read16(self.sp)' % globals(),
'%(IDENT)sself.sp = (self.sp + 2) & 0xFFFF' % globals(),
'%s%s' % (IDENT, (ADD_T % (6, 6))),
'%s%s' % (IDENT, self.add_t()),
]
else:
return [
'self.pc = self.read16(self.sp)',
'self.sp = (self.sp + 2) & 0xFFFF',
]
CMDS['RET'] = RET()


class POP(_OpBase):
def parse(self):
opcode, rp = self.opcode, self.dst
return [
'self.%(rp)s = self.read16(self.sp)' % locals(),
'self.sp = (self.sp + 2) & 0xFFFF',
]
CMDS['POP'] = POP()


class JP(_OpBase):
def parse(self):
opcode, flag, adr = self.opcode, self.dst, self.src
ret = []
ident = IDENT

if adr == '@':
adr = 'self.read_op_arg16()'

if flag == '@':
ret += ['self.pc = self.read_op_arg16()' % locals()]
elif flag in ('hl', 'ix', 'iy'):
ret += ['self.pc = self.%(flag)s' % locals()]
elif flag in _COND:
if flag == 'm':
flag = 's'
elif flag == 'pe':
flag = 'p'
ret += [
'if self.f & %sF:' % flag.upper(),
'%(ident)sself.pc = %(adr)s' % locals(),
'%s%s' % (IDENT, self.add_t()),
'else:',
'%(ident)s%(adr)s # dummy read' % locals(),
]
elif flag in _NOTCOND:
if flag == 'p':
flag = 'ns'
elif flag == 'po':
flag = 'np'
ret += [
'if not (self.f & %sF):' % flag[1].upper(),
'%(ident)sself.pc = %(adr)s' % locals(),
'%s%s' % (IDENT, self.add_t()),
'else:',
'%(ident)s%(adr)s # dummy read' % locals(),
]
else:
raise ValueError('unhandled flag %(opcode)s: %(flag)s' % locals())
return ret
CMDS['JP'] = JP()
# ===============
# = for testing =
# ===============
Expand Down

0 comments on commit 3df09e1

Please sign in to comment.