Get 8x8 led matrix working
This commit is contained in:
parent
cf68271440
commit
6bea93308c
|
|
@ -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()
|
||||||
Loading…
Reference in New Issue