From eb19a43a3075e673bb73f6f8402f2a7904fbc65f Mon Sep 17 00:00:00 2001 From: Ross Wilson Date: Sat, 21 May 2016 16:58:32 +0700 Subject: [PATCH] Got PPM display working --- pymlac/Display.py | 2 +- pymlac/DisplayCPU.py | 84 ++++++++++++---------- pymlac/MainCPU.py | 34 +++++---- pymlac/Trace.py | 2 +- pymlac/pymlac | 3 +- pymlac/test_Display.py | 153 +++++++++++++++++++++++------------------ 6 files changed, 157 insertions(+), 121 deletions(-) diff --git a/pymlac/Display.py b/pymlac/Display.py index 0bf1e4e..b2cd174 100644 --- a/pymlac/Display.py +++ b/pymlac/Display.py @@ -91,7 +91,7 @@ class Display(object): dotted True if dotted line, else False (IGNORED) """ -# log('Display: drawing (%d,%d) to (%d,%d)' % (x1, y1, x2, y2)) + log('Display: drawing (%d,%d) to (%d,%d)' % (x1, y1, x2, y2)) self.dirty = True diff --git a/pymlac/DisplayCPU.py b/pymlac/DisplayCPU.py index 65fc7e2..d229ee8 100644 --- a/pymlac/DisplayCPU.py +++ b/pymlac/DisplayCPU.py @@ -13,6 +13,9 @@ import Trace trace = Trace.Trace(TRACE_FILENAME) +import log +log = log.Log('test.log', log.Log.DEBUG) + class DisplayCPU(object): @@ -71,8 +74,8 @@ class DisplayCPU(object): last True if the last byte in a word """ - trace = DEIMdecode(byte) - print('doDEIMByte: trace=%s' % str(trace)) + trace = self.DEIMdecode(byte) + log('doDEIMByte: trace=%s' % str(trace)) if byte & 0x80: # increment? prevDX = self.DX @@ -158,29 +161,34 @@ class DisplayCPU(object): return (1, tracestr) def i_DEIM(self, address): + log('i_DEIM: %3o' % (address & 0377)) self.Mode = self.MODE_DEIM - tracestr += 'DEIM\t' + self.doDEIMByte(address & 0377, last=True) + tracestr = 'DEIM\t' + self.doDEIMByte(address & 0377, last=True) return (1, tracestr) def i_DHLT(self): self.Running = False - Trace.dtrace('DHLT') +# trace.dtrace('DHLT') + return (1, trace.dtrace(self.dot, 'DHLT', None)) def i_DHVC(self): - Trace.dtrace('DHVC') +# trace.dtrace('DHVC') + return (1, trace.dtrace(self.dot, 'DHVC', None)) def i_DIXM(self): self.DX += 04000 - Trace.dtrace('DIXM') +# trace.dtrace('DIXM') + return (1, trace.dtrace(self.dot, 'DIXM', None)) def i_DIYM(self): self.DY += 04000 - Trace.dtrace('DIYM') +# trace.dtrace('DIYM') + return (1, trace.dtrace(self.dot, 'DIYM', None)) def i_DJMP(self, address): self.DPC = MASK_MEM(address + (self.DIB << 12)) - Trace.dtrace('DJMP', address) - return 1 +# trace.dtrace('DJMP', address) + return (1, trace.dtrace(self.dot, 'DJMP', address)) def i_DJMS(self, address): if self.DRSindex >= 8: @@ -190,18 +198,18 @@ class DisplayCPU(object): self.DRS[self.DRSindex] = self.DPC self.DRSindex += 1 self.DPC = MASK_MEM(address + (self.DIB << 12)) - Trace.dtrace('DJMS', address) - return 1 +# trace.dtrace('DJMS', address) + return (1, trace.dtrace(self.dot, 'DJMS', address)) def i_DLXA(self, address): self.DX = address - Trace.dtrace('DLXA', address) - return 1 +# trace.dtrace('DLXA', address) + return (1, trace.dtrace(self.dot, 'DLXA', address)) def i_DLYA(self, address): self.DY = address - Trace.dtrace('DLYA', address) - return 1 +# trace.dtrace('DLYA', address) + return (1, trace.dtrace(self.dot, 'DLXA', address)) def i_DLVH(self, word1): word2 = self.memory.get(self, DPC, 0) @@ -241,8 +249,8 @@ class DisplayCPU(object): self.DY += N self.display.draw(prevDX, prevDY, self.DX, self.DY, dotted) - Trace.dtrace('DLVH') - return 3 +# trace.dtrace('DLVH') + return (3, trace.dtrace(self.dot, 'DLVH', None)) def i_DRJM(self): if self.DRSindex <= 0: @@ -251,12 +259,13 @@ class DisplayCPU(object): self.illegal() self.DRSindex -= 1 self.DPC = self.DRS[self.DRSindex] - Trace.dtrace('DRJM') - return 1 # FIXME check # cycles used +# trace.dtrace('DRJM') + return (1, trace.dtrace(self.dot, 'DRJM', None)) # FIXME check # cycles used def i_DSTB(self, block): self.DIB = block - Trace.dtrace('DSTB\t%d' % block) + trace.dtrace('DSTB\t%d' % block) + return (1, trace.dtrace('DSTB\t%d' % block, None)) def i_DSTS(self, scale): if scale == 0: @@ -269,41 +278,42 @@ class DisplayCPU(object): self.Scale = 3.0 else: self.illegal() - Trace.dtrace('DSTS', scale) - return 1 # FIXME check # cycles used +# trace.dtrace('DSTS', scale) + return (1, trace.dtrace('DSTS\t%d' % scale, None)) # FIXME check # cycles used def page00(self, instruction): if instruction == 000000: # DHLT - self.i_DHLT() + (cycles, tracestr) = self.i_DHLT() elif instruction == 004000: # DNOP - Trace.dtrace('DNOP') + cycles = 1 + tracestr = trace.dtrace('DNOP') elif instruction == 004004: # DSTS 0 - self.i_DSTS(0) + (cycles, tracestr) = self.i_DSTS(0) elif instruction == 004005: # DSTS 1 - self.i_DSTS(1) + (cycles, tracestr) = self.i_DSTS(1) elif instruction == 004006: # DSTS 2 - self.i_DSTS(2) + (cycles, tracestr) = self.i_DSTS(2) elif instruction == 004007: # DSTS 3 - self.i_DSTS(3) + (cycles, tracestr) = self.i_DSTS(3) elif instruction == 004010: # DSTB 0 - self.i_DSTB(0) + (cycles, tracestr) = self.i_DSTB(0) elif instruction == 004011: # DSTB 1 - self.i_DSTB(1) + (cycles, tracestr) = self.i_DSTB(1) elif instruction == 004040: # DRJM - self.i_DRJM() + (cycles, tracestr) = self.i_DRJM() elif instruction == 004100: # DDYM - self.i_DDYM() + (cycles, tracestr) = self.i_DDYM() elif instruction == 004200: # DDXM - self.i_DDXM() + (cycles, tracestr) = self.i_DDXM() elif instruction == 004400: # DIYM - self.i_DIYM() + (cycles, tracestr) = self.i_DIYM() elif instruction == 005000: # DIXM - self.i_DIXM() + (cycles, tracestr) = self.i_DIXM() elif instruction == 006000: # DHVC - self.i_DHVC() + (cycles, tracestr) = self.i_DHVC() else: self.illegal(instruction) - return 1 + return (cycles, tracestr) def start(self): self.Running = True diff --git a/pymlac/MainCPU.py b/pymlac/MainCPU.py index 4cc12e1..b647b06 100644 --- a/pymlac/MainCPU.py +++ b/pymlac/MainCPU.py @@ -13,9 +13,9 @@ import Trace import log log = log.Log('test.log', log.Log.DEBUG) - trace = Trace.Trace(TRACE_FILENAME) + class MainCPU(object): ###### @@ -45,6 +45,10 @@ class MainCPU(object): def __init__(self, memory, display, displaycpu, kbd, ttyin, ttyout, ptrptp): """Initialize the main CPU.""" + log('MainCPU.__init__: memory=%s' % str(memory)) + log('MainCPU.__init__: display=%s' % str(display)) + log('MainCPU.__init__: displaycpu=%s' % str(displaycpu)) + self.memory = memory self.display = display self.displaycpu = displaycpu @@ -347,8 +351,8 @@ class MainCPU(object): return (1, tracestr) def i_DLA(self, indirect, address, instruction): - #self.displaycpu.DPC = self.AC - tracestr = trace.itrace(self.dot, 'DLA_X') + self.displaycpu.DPC = self.AC + tracestr = trace.itrace(self.dot, 'DLA') return (1, tracestr) def i_CTB(self, indirect, address, instruction): @@ -356,8 +360,9 @@ class MainCPU(object): return (1, tracestr) def i_DOF(self, indirect, address, instruction): - #self.displaycpu.stop() - tracestr = trace.itrace(self.dot, 'DOF_X') + log('self.displaycpu=%s' % str(self.displaycpu)) + self.displaycpu.stop() + tracestr = trace.itrace(self.dot, 'DOF') return (1, tracestr) def i_KRB(self, indirect, address, instruction): @@ -594,9 +599,10 @@ class MainCPU(object): return (1, tracestr) def i_DON(self, indirect, address, instruction): - #self.displaycpu.DRSindex = 0 - #self.displaycpu.start() - tracestr = trace.itrace(self.dot, 'DON_X') + self.display.clear() + self.displaycpu.DRSindex = 0 + self.displaycpu.start() + tracestr = trace.itrace(self.dot, 'DON') return (1, tracestr) def i_ASZ(self): @@ -636,15 +642,15 @@ class MainCPU(object): return (1, tracestr) def i_DSF(self): -# if self.displaycpu.ison(): -# self.PC = (self.PC + 1) & WORDMASK - tracestr = trace.itrace(self.dot, 'DSF_X') + if self.displaycpu.ison(): + self.PC = (self.PC + 1) & WORDMASK + tracestr = trace.itrace(self.dot, 'DSF') return (1, tracestr) def i_DSN(self): -# if not self.displaycpu.ison(): -# self.PC = (self.PC + 1) & WORDMASK - tracestr = trace.itrace(self.dot, 'DSN_X') + if not self.displaycpu.ison(): + self.PC = (self.PC + 1) & WORDMASK + tracestr = trace.itrace(self.dot, 'DSN') return (1, tracestr) def i_KSF(self): diff --git a/pymlac/Trace.py b/pymlac/Trace.py index fd243d3..5a37621 100644 --- a/pymlac/Trace.py +++ b/pymlac/Trace.py @@ -100,7 +100,7 @@ class Trace(object): if self.tracing: if address is None: - result = '%04o: %s\t' % (ddot, opcode) + result = '%s: %s\t' % (ddot, opcode) else: result = '%04o: %s\t%5.5o' % (ddot, opcode, address) diff --git a/pymlac/pymlac b/pymlac/pymlac index b23351c..32a26b9 100755 --- a/pymlac/pymlac +++ b/pymlac/pymlac @@ -104,8 +104,9 @@ def main(): imlac_ttyin = TtyIn.TtyIn() imlac_ttyout = TtyOut.TtyOut() imlac_display = Display.Display() + log('pymlac.main: imlac_display=%s' % str(imlac_display)) imlac_dcpu = DisplayCPU.DisplayCPU(imlac_display, imlac_memory) - imlac_cpu = MainCPU.MainCPU(imlac_memory, imlac_dcpu, None, + imlac_cpu = MainCPU.MainCPU(imlac_memory, imlac_display, imlac_dcpu, None, imlac_ttyin, imlac_ttyout, imlac_ptrptp) imlac_cpu.running = True imlac_display_state = False diff --git a/pymlac/test_Display.py b/pymlac/test_Display.py index 5b8fc1f..e856b81 100755 --- a/pymlac/test_Display.py +++ b/pymlac/test_Display.py @@ -8,7 +8,7 @@ Usage: test_Display.py [-h] """ -import wx +#import wx import Display # if we don't have log.py, don't crash @@ -27,71 +27,88 @@ except ImportError: WindowTitleHeight = 22 DefaultAppSize = (600, 600+WindowTitleHeight) -################################################################################ -# The main application frame -################################################################################ - -class TestFrame(wx.Frame): - def __init__(self): - wx.Frame.__init__(self, None, size=DefaultAppSize, - title=('Test pymlac display - %s' - % Display.__version__)) - self.SetMinSize(DefaultAppSize) - self.panel = wx.Panel(self, wx.ID_ANY) - self.panel.ClearBackground() - - # build the GUI - box = wx.BoxSizer(wx.VERTICAL) - self.display = Display.Display(self.panel) - box.Add(self.display, proportion=1, border=1, flag=wx.EXPAND) - self.panel.SetSizer(box) - self.panel.Layout() - self.Centre() - self.Show(True) - - self.Bind(wx.EVT_SIZE, self.OnSize) - - self.lock = False - - self.Refresh() - - self.display.draw(0, 0, 1024, 1024) - self.display.draw(1024, 0, 0, 1024) - self.display.draw(512, 0, 1024, 512) - self.display.draw(1024, 512, 512, 1024) - self.display.draw(512, 1024, 0, 512) - self.display.draw(0, 512, 512, 0) - -# self.display.draw(0, 0, 1023, 1023) -# self.display.draw(1023, 0, 0, 1023) -# self.display.draw(511, 0, 1023, 511) -# self.display.draw(1023, 511, 511, 1023) -# self.display.draw(511, 1023, 0, 511) -# self.display.draw(0, 511, 511, 0) - - for x in (0, 256, 512, 768, 1024): - self.display.draw(x, 0, x, 1024, dotted=True) - - for y in (0, 256, 512, 768, 1024): - self.display.draw(0, y, 1024, y, dotted=True) - -# for x in (0, 255, 511, 766, 1023): -# self.display.draw(x, 0, x, 1023, dotted=True) +################################################################################# +## The main application frame +################################################################################# # -# for y in (0, 255, 511, 766, 1023): -# self.display.draw(0, y, 1023, y, dotted=True) +#class TestFrame(wx.Frame): +# def __init__(self): +# wx.Frame.__init__(self, None, size=DefaultAppSize, +# title=('Test pymlac display - %s' +# % Display.__version__)) +# self.SetMinSize(DefaultAppSize) +# self.panel = wx.Panel(self, wx.ID_ANY) +# self.panel.ClearBackground() +# +# # build the GUI +# box = wx.BoxSizer(wx.VERTICAL) +# self.display = Display.Display(self.panel) +# box.Add(self.display, proportion=1, border=1, flag=wx.EXPAND) +# self.panel.SetSizer(box) +# self.panel.Layout() +# self.Centre() +# self.Show(True) +# +# self.Bind(wx.EVT_SIZE, self.OnSize) +# +# self.lock = False +# +# self.Refresh() +# +# self.display.draw(0, 0, 1024, 1024) +# self.display.draw(1024, 0, 0, 1024) +# self.display.draw(512, 0, 1024, 512) +# self.display.draw(1024, 512, 512, 1024) +# self.display.draw(512, 1024, 0, 512) +# self.display.draw(0, 512, 512, 0) +# +## self.display.draw(0, 0, 1023, 1023) +## self.display.draw(1023, 0, 0, 1023) +## self.display.draw(511, 0, 1023, 511) +## self.display.draw(1023, 511, 511, 1023) +## self.display.draw(511, 1023, 0, 511) +## self.display.draw(0, 511, 511, 0) +# +# for x in (0, 256, 512, 768, 1024): +# self.display.draw(x, 0, x, 1024, dotted=True) +# +# for y in (0, 256, 512, 768, 1024): +# self.display.draw(0, y, 1024, y, dotted=True) +# +## for x in (0, 255, 511, 766, 1023): +## self.display.draw(x, 0, x, 1023, dotted=True) +## +## for y in (0, 255, 511, 766, 1023): +## self.display.draw(0, y, 1023, y, dotted=True) +# +# def OnSize(self, event): +# """Maintain square window.""" +# +# if not self.lock: +# self.lock = True +# (w, h) = event.GetSize() +# size = min(w, h) +# self.SetSize((size-WindowTitleHeight, size)) +# self.lock = False +# +# event.Skip() - def OnSize(self, event): - """Maintain square window.""" +def test(): + display = Display.Display() + display.draw(0, 0, 1023, 1023) + display.draw(1023, 0, 0, 1023) + display.draw(512, 0, 1023, 512) + display.draw(1023, 512, 512, 1023) + display.draw(512, 1023, 0, 512) + display.draw(0, 512, 512, 0) + for x in (0, 256, 512, 768, 1023): + display.draw(x, 0, x, 1023, dotted=True) - if not self.lock: - self.lock = True - (w, h) = event.GetSize() - size = min(w, h) - self.SetSize((size-WindowTitleHeight, size)) - self.lock = False + for y in (0, 256, 512, 768, 1023): + display.draw(0, y, 1023, y, dotted=True) + + display.close() - event.Skip() ################################################################################ @@ -132,9 +149,11 @@ if __name__ == '__main__': usage() sys.exit(0) - # start wxPython app - app = wx.App() - TestFrame().Show() - app.MainLoop() - sys.exit(0) + test() +# # start wxPython app +# app = wx.App() +# TestFrame().Show() +# app.MainLoop() +# sys.exit(0) +#