from time import time from sys import argv from time import sleep from RPi.GPIO import IN, OUT import RPi.GPIO as GPIO from opcodes import opcodes_d # EEPROM AT28C256 Pin names and RPi GPIO Pin Numbers # b means bar = inverted gpio_l = [2, 3, 4, 17, 27, 22, 10, 9, 11, 5, 6, 13, 19, 26] gpio_r = [14, 15, 18, 23, 24, 25, 8, 7, 12, 16, 20, 21] # # Defining which 6502 pin goes to which GPIO pin # """ IO = gpio_r[-8:] # 8 io pins IO.reverse() A = [13, 6, 5, 11, 9, 10, 22, 27, 17, 4, 3, 2, 23, 18, 15] # OEb = 26 # Output Enable RWb = 19 # Write Enable CEb = 14 # Chip Enable is hooked up to A15 on the processor PHI2 = 26 controls = [CEb, RWb, PHI2] """ A = [ 27, 22, 10, 9, 11, 5, 6, 13, # A0-A7 4, 2, 18, 3, # A8-A11 23, 17, 15 # A12-A14 ] IO = [ 24, 25, 8, 7, 12, 16, 20, 21 ] RWb = 19 # Write Enable CEb = 14 # Chip Enable is hooked up to A15 on the processor PHI2 = 26 controls = [CEb, RWb, PHI2] # Address setup time t_AS = 300e-9 # setup the pins GPIO.setmode(GPIO.BCM) for pin in controls: GPIO.setup(pin, IN) for pin in A: GPIO.setup(pin, IN) def setup_pins(IOdirection=OUT): # OUT when writing and IN when reading for pin in IO: if IOdirection == OUT: GPIO.setup(pin, IOdirection, initial=0) elif IOdirection == IN: GPIO.setup(pin, IOdirection) # print("setup pins", IOdirection) def print_pins(): for i in range(len(A)): print(f"A{i} - {A[i]}") for i in range(len(IO)): print(f"IO{i} - {IO[i]}") print(f"CEb - {CEb}") print(f"RWb - {RWb}") print(f"PHI2 - {PHI2}") def get_8_bit(l: list): for i in range(len(l)): l[i] = format(l[i], f"08b") # get the 8-bit bin value return l def check_enable(): # assumes the EEPROM is only hooked up via CE. If CE is low, it will ouput data if GPIO.input(CEb) == 0 and GPIO.input(RWb) == 1: return True return False def decode_address(): ad_s = "" for i in range(len(A)): ad_s += str(GPIO.input(A[len(A)-1-i])) return int(ad_s, 2) def simulate(path, verbose=True): with open(path, "rb") as file: bindata = file.read() data = [] for i in range(len(bindata)): data.append(format(bindata[i], "08b")) while True: GPIO.cleanup(IO) setup_pins(IN) # address is set on falling edge channel = GPIO.wait_for_edge(PHI2, GPIO.FALLING, timeout=1000) # allow for KeyboardInterrupts if channel is None: continue # wait an address setup time, dependant on clock speed! sleep(t_AS) enable = check_enable() address = decode_address() # put the data on the bus if enable: setup_pins(OUT) for i in range(8): if data[address][i] == "0": GPIO.output(IO[7-i], 0) else: GPIO.output(IO[7-i], 1) # wait the output hold time if verbose: print(f"OUT|||{format(address + 0x8000, '015b')} - {data[address]}|||{format(address + 0x8000, '04x')} - {format(int(data[address], 2), '02x')}", end="") if int(data[address], 2) in opcodes_d: print(f" ||| {opcodes_d[int(data[address], 2)]}") else: print("") elif verbose: data_in = "" for i in range(8): data_in += str(GPIO.input(IO[7-i])) print(f"IN |||{format(address, '016b')} - {data_in}|||{format(address, '04x')} - {format(int(data_in, 2), '02x')}") if len(argv) > 1: try: simulate(argv[1]) except KeyboardInterrupt: GPIO.cleanup() else: print("No filepath given. Printing Pin-Settings") print_pins() # if performing action from this script, put the code HERE: GPIO.cleanup()