mirror of
https://github.com/rzzzwilson/pymlac.git
synced 2025-06-10 09:32:41 +00:00
Got PPM display working
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
#
|
||||
|
||||
Reference in New Issue
Block a user