Get monitor keypad working
This commit is contained in:
parent
e82a429d5e
commit
cf68271440
|
|
@ -24,13 +24,20 @@ class TwoDigitHexInput:
|
||||||
def input(self, d):
|
def input(self, d):
|
||||||
self.digits[self.currentDigit] = d
|
self.digits[self.currentDigit] = d
|
||||||
self.value = (self.digits[0] * 16) + self.digits[1]
|
self.value = (self.digits[0] * 16) + self.digits[1]
|
||||||
print("INPUT", self.digits)
|
print("INPUT", self.digits, "current digit: " + str(self.currentDigit), "value: " + str(self.value))
|
||||||
self.currentDigit = 0 if self.currentDigit else 1
|
self.currentDigit = 0 if self.currentDigit else 1
|
||||||
|
|
||||||
def clear(self):
|
def clear(self):
|
||||||
self.__init__()
|
self.__init__()
|
||||||
print(self.digits)
|
print(self.digits)
|
||||||
|
|
||||||
|
def set(self, n):
|
||||||
|
self.value = n
|
||||||
|
self.digits[0] = n >> 4
|
||||||
|
self.digits[1] = n & 0xF
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class CPU:
|
class CPU:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|
@ -204,8 +211,8 @@ keymatrix = keypad.KeyMatrix(
|
||||||
keymap = {
|
keymap = {
|
||||||
15:"0", 16:"1", 17:"2", 18:"3", 19:"runhalt",
|
15:"0", 16:"1", 17:"2", 18:"3", 19:"runhalt",
|
||||||
10:"4", 11:"5", 12:"6", 13:"7", 14:"step",
|
10:"4", 11:"5", 12:"6", 13:"7", 14:"step",
|
||||||
5:"8", 6:"9", 7:"A", 8:"B", 9:"addrdata",
|
5:"8", 6:"9", 7:"A", 8:"B", 9:"addr",
|
||||||
0:"C", 1:"D", 2:"E", 3:"F", 4:"NA" }
|
0:"C", 1:"D", 2:"E", 3:"F", 4:"data" }
|
||||||
|
|
||||||
numericKeys = [ "0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F" ]
|
numericKeys = [ "0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F" ]
|
||||||
|
|
||||||
|
|
@ -219,12 +226,18 @@ class Monitor:
|
||||||
self.monitorAddressInput = TwoDigitHexInput()
|
self.monitorAddressInput = TwoDigitHexInput()
|
||||||
self.monitorDataInput = TwoDigitHexInput()
|
self.monitorDataInput = TwoDigitHexInput()
|
||||||
|
|
||||||
|
# In data entry mode, when a full byte is keyed in,
|
||||||
|
# the next keypress advances to the next address and continues entering data there.
|
||||||
|
# This variable tracks whether it's time to do that or not.
|
||||||
|
self.advanceDataEntryNextPress = False
|
||||||
|
|
||||||
def handleKeys(self):
|
def handleKeys(self):
|
||||||
keypad_event = keymatrix.events.get()
|
keypad_event = keymatrix.events.get()
|
||||||
keyPressed = True if (keypad_event and keypad_event.released ) else False
|
keyPressed = True if (keypad_event and keypad_event.released ) else False
|
||||||
key = keymap[keypad_event.key_number] if keyPressed else False
|
key = keymap[keypad_event.key_number] if keyPressed else False
|
||||||
numericKeyPressed = True if (keyPressed and (key in numericKeys)) else False
|
numericKeyPressed = True if (keyPressed and (key in numericKeys)) else False
|
||||||
|
|
||||||
|
|
||||||
if self.cpu.running:
|
if self.cpu.running:
|
||||||
if key == "runhalt":
|
if key == "runhalt":
|
||||||
print("HALT PRESSED")
|
print("HALT PRESSED")
|
||||||
|
|
@ -241,12 +254,17 @@ class Monitor:
|
||||||
print("\nSTARTING")
|
print("\nSTARTING")
|
||||||
time.sleep(0.5) # lazy debounce
|
time.sleep(0.5) # lazy debounce
|
||||||
|
|
||||||
if key == "addrdata":
|
if key == "addr":
|
||||||
self.monitorMode = 'addressEntry' if self.monitorMode != 'addressEntry' else 'dataEntry'
|
self.monitorMode = 'addressEntry'
|
||||||
print("\nENTERING", self.monitorMode, "MODE")
|
print("\nENTERING", self.monitorMode, "MODE")
|
||||||
self.monitorDataInput.currentDigit = 0
|
|
||||||
self.monitorAddressInput.currentDigit = 0
|
self.monitorAddressInput.currentDigit = 0
|
||||||
time.sleep(0.5) # lazy debounce
|
time.sleep(0.5) # lazy debounce
|
||||||
|
if key == "data":
|
||||||
|
self.monitorMode = 'dataEntry'
|
||||||
|
print("\nENTERING", self.monitorMode, "MODE")
|
||||||
|
self.monitorDataInput.clear()
|
||||||
|
self.advanceDataEntryNextPress = False
|
||||||
|
time.sleep(0.5) # lazy debounce
|
||||||
|
|
||||||
if key == "step":
|
if key == "step":
|
||||||
print("\nSINGLE STEP FROM MONITOR ADDR")
|
print("\nSINGLE STEP FROM MONITOR ADDR")
|
||||||
|
|
@ -260,24 +278,32 @@ class Monitor:
|
||||||
self.cpu.IP = self.monitorAddressInput.value
|
self.cpu.IP = self.monitorAddressInput.value
|
||||||
print("MA", self.cpu.IP)
|
print("MA", self.cpu.IP)
|
||||||
|
|
||||||
else:
|
if self.monitorMode == 'dataEntry':
|
||||||
|
if self.advanceDataEntryNextPress:
|
||||||
|
print("ADVANCING")
|
||||||
|
self.cpu.IP = (self.cpu.IP + 1) % 256
|
||||||
|
# self.monitorDataInput.clear() # reset .currentDigit
|
||||||
|
self.monitorDataInput.set(self.cpu.memory[self.cpu.IP])
|
||||||
|
self.advanceDataEntryNextPress = False
|
||||||
self.monitorDataInput.input(int(key, 16))
|
self.monitorDataInput.input(int(key, 16))
|
||||||
self.cpu.memory[self.cpu.IP] = self.monitorDataInput.value
|
self.cpu.memory[self.cpu.IP] = self.monitorDataInput.value
|
||||||
print("MD", self.monitorDataInput.value)
|
print("MD", self.monitorDataInput.value)
|
||||||
if self.monitorDataInput.currentDigit == 0: # that was the second keypress, so go to the next addresss
|
if self.monitorDataInput.currentDigit == 0: # that was the second keypress, so next keypress is for the next address
|
||||||
self.cpu.IP = (self.cpu.IP + 1) % 256
|
self.advanceDataEntryNextPress = True
|
||||||
print("ADVANCING")
|
|
||||||
print("Acc", self.cpu.acc, "IP", self.cpu.IP, "Data", self.cpu.memory[self.cpu.IP], "\n")
|
print("Acc", self.cpu.acc, "IP", self.cpu.IP, "Data", self.cpu.memory[self.cpu.IP], "\n")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
self.cpu.start()
|
#self.cpu.start()
|
||||||
t = time.time()
|
t = time.time()
|
||||||
while (time.time() - t) < 120:
|
while (time.time() - t) < 120:
|
||||||
self.handleKeys()
|
self.handleKeys()
|
||||||
display_1.print(toHex(self.monitorAddressInput.value) + toHex(self.monitorDataInput.value))
|
display_1.print(toHex(self.cpu.IP) + toHex(self.cpu.memory[self.cpu.IP]))
|
||||||
display_2.print(toHex(self.cpu.IP) + toHex(self.cpu.acc))
|
# display_1.print(toHex(self.monitorAddressInput.value) + toHex(self.cpu.memory[self.cpu.IP]))
|
||||||
|
# display_2.print(toHex(self.cpu.IP) + toHex(self.cpu.acc))
|
||||||
|
display_2.print(toHex(self.cpu.acc))
|
||||||
if self.cpu.running:
|
if self.cpu.running:
|
||||||
self.cpu.step()
|
self.cpu.step()
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue