Get 8x8 led matrix working

This commit is contained in:
n loewen 2025-03-25 17:04:25 +00:00
parent cf68271440
commit 6bea93308c
1 changed files with 49 additions and 30 deletions

View File

@ -13,7 +13,9 @@ import board
import keypad import keypad
import digitalio import digitalio
from tm1637_display import TM1637Display from tm1637_display import TM1637Display
import board
import busio # for led matrix
from adafruit_ht16k33 import matrix
class TwoDigitHexInput: class TwoDigitHexInput:
def __init__(self): def __init__(self):
@ -59,13 +61,15 @@ class CPU:
self.running = True self.running = True
def step(self): def step(self):
if self.IP >= 256: if self.IP >= 255: # TODO CHECK
self.IP = 0 self.IP = 0
print("IP:", self.IP) print("IP:", self.IP)
self.instruction['opcode'] = self.memory[self.IP] self.instruction['opcode'] = self.memory[self.IP]
self.IP = self.IP+1 self.IP = self.IP+1
self.instruction['operand'] = self.memory[self.IP] self.instruction['operand'] = self.memory[self.IP]
self.IP = self.IP+1 self.IP = self.IP+1
print(self.memory[self.IP -1], self.memory[self.IP-2])
print(self.instruction)
self.nums2mnems[self.instruction['opcode']](self, self.instruction['operand']) self.nums2mnems[self.instruction['opcode']](self, self.instruction['operand'])
print("instr:", self.instruction['opcode'], self.instruction['operand']) print("instr:", self.instruction['opcode'], self.instruction['operand'])
@ -87,13 +91,13 @@ class CPU:
self.acc = operand self.acc = operand
def lda_mem(self, operand): def lda_mem(self, operand):
self.acc = memory[operand] self.acc = self.memory[operand]
def sta_lit(self, operand): def sta_lit(self, operand):
memory[operand] = self.acc self.memory[operand] = self.acc
def sta_mem(self, operand): def sta_mem(self, operand):
memory[memory[operand]] = self.acc self.memory[self.memory[operand]] = self.acc
def add_lit(self, operand): def add_lit(self, operand):
self.acc = self.acc + operand self.acc = self.acc + operand
@ -168,26 +172,26 @@ class CPU:
self.flags['C'] = False self.flags['C'] = False
nums2mnems = { nums2mnems = {
0: hlt, 0: hlt, # x0
1: nop, 1: nop, # x1
2: lda_lit, 2: lda_lit, # 02
3: sta_lit, 3: sta_lit, # 03
4: add_lit, 4: add_lit, # 04
5: sub_lit, 5: sub_lit, # 05
6: jmp_lit, 6: jmp_lit, # 06
7: ske, 7: ske, # x7
8: skz, 8: skz, # x8
9: skn, 9: skn, # x9
10: skc, 10: skc, # A
11: cst, 11: cst, # B
12: ccl, 12: ccl, # C
16: hlt, 16: hlt, #
17: nop, 17: nop, #
18: lda_mem, 18: lda_mem, # 12
19: sta_mem, 19: sta_mem, # 13
20: add_mem, 20: add_mem, # 14
21: sub_mem, 21: sub_mem, # 15
22: jmp_mem, 22: jmp_mem, # 16
23: ske, 23: ske,
24: skz, 24: skz,
25: skn, 25: skn,
@ -204,6 +208,11 @@ class CPU:
display_1 = TM1637Display(board.GP0, board.GP1, length=4) display_1 = TM1637Display(board.GP0, board.GP1, length=4)
display_2 = TM1637Display(board.GP2, board.GP3, length=4) display_2 = TM1637Display(board.GP2, board.GP3, length=4)
i2c = busio.I2C(board.GP17, board.GP16) # scl, sda
matrix = matrix.Matrix8x8(i2c)
matrix.brightness = 1
matrix.blink_rate = 0
keymatrix = keypad.KeyMatrix( keymatrix = keypad.KeyMatrix(
row_pins = (board.GP5, board.GP6, board.GP7, board.GP8), row_pins = (board.GP5, board.GP6, board.GP7, board.GP8),
column_pins = (board.GP9, board.GP10, board.GP11, board.GP12, board.GP13) ) column_pins = (board.GP9, board.GP10, board.GP11, board.GP12, board.GP13) )
@ -293,20 +302,27 @@ class Monitor:
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 displayScreen(self):
for x in range(8):
for y in range(8):
matrix[x, y] = self.cpu.memory[x + (8*y)]
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: # TODO: add a time delta or sth maybe so this doesn't just burn cycles
self.handleKeys() self.handleKeys()
display_1.print(toHex(self.cpu.IP) + toHex(self.cpu.memory[self.cpu.IP])) display_1.print(toHex(self.cpu.IP) + toHex(self.cpu.memory[self.cpu.IP]))
# display_1.print(toHex(self.monitorAddressInput.value) + toHex(self.cpu.memory[self.cpu.IP])) # 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.IP) + toHex(self.cpu.acc))
display_2.print(toHex(self.cpu.acc)) display_2.print(toHex(self.cpu.acc))
self.displayScreen()
if self.cpu.running: if self.cpu.running:
self.cpu.step() self.cpu.step()
time.sleep(0.5) # time.sleep(0.5) # TODO ?
print("timeout") print("timeout")
print(self.cpu.memory) print(self.cpu.memory)
@ -314,11 +330,14 @@ class Monitor:
cpu = CPU() cpu = CPU()
monitor = Monitor(cpu) monitor = Monitor(cpu)
#prog = '04 FF 04 01 14 01 00 00 01 01 01 01 01 01' preamble = '00' * 64
prog = '00' prog = preamble + '02 01 13 f0 12 f0 04 02 03 f0 12 f0 05 41 08 00 06 40 00 00' # STRIPES
#prog = '00'
program_bytes = bytearray.fromhex(prog.replace(" ", "")) program_bytes = bytearray.fromhex(prog.replace(" ", ""))
# Add jmp at addr 254: # Add jmp at addr 254:
program_with_jump = program_bytes + bytearray(254 - len(program_bytes)) + bytearray.fromhex('0600') #program_with_jump = program_bytes + bytearray(254 - len(program_bytes)) + bytearray.fromhex('0600') # jump to addr 00
program_with_jump = program_bytes + bytearray(254 - len(program_bytes)) + bytearray.fromhex('0640') # jump to addr 0x40 (dec 64)
cpu.load_memory(program_with_jump) cpu.load_memory(program_with_jump)
monitor.run() monitor.run()