我真的有醋啊
# -*- coding: utf-8 -*-
from functools import reduce
class ROM: # Read Only Memory
def __init__(m):
m.bytes = (
(0, 0, 0, 0, 0, 0, 0, 1), # store a 1
(0, 0, 1, 0, 0, 0, 1, 0), # store b 2
(0, 1, 0, 0, 0, 0, 0, 1), # add a 1
(0, 1, 1, 1, 1, 1, 1, 1), # add b -1
(1, 0, 0, 0, 0, 0, 1, 0), # jlz 2
(1, 1, 0, 1, 1, 1, 0, 1), # jmp -3
(1, 1, 0, 0, 0, 0, 0, 0), # jmp 0
)
m.a7 = m.a6 = m.a5 = m.a4 = m.a3 = m.a2 = m.a1 = m.a0 = 0
m.d7 = m.d6 = m.d5 = m.d4 = m.d3 = m.d2 = m.d1 = m.d0 = 0
def read(m):
addr = reduce(lambda hi, low: hi * 2 + low, (m.a7, m.a6, m.a5, m.a4, m.a3, m.a2, m.a1, m.a0), 0)
(m.d7, m.d6, m.d5, m.d4, m.d3, m.d2, m.d1, m.d0) = m.bytes[addr]
class Adder85:
def __init__(m):
m.a7 = m.a6 = m.a5 = m.a4 = m.a3 = m.a2 = m.a1 = m.a0 = 0
m.b7 = m.b6 = m.b5 = m.b4 = m.b3 = m.b2 = m.b1 = m.b0 = 0
m.s7 = m.s6 = m.s5 = m.s4 = m.s3 = m.s2 = m.s1 = m.s0 = 0
def act(m):
def add1(a, b):
nonlocal carry
s = a + b + carry
carry = 1 if s >= 2 else 0
return s & 1
carry = 0
a = (m.a7, m.a6, m.a5, m.a4, m.a3, m.a2, m.a1, m.a0)
b_ = (m.b0, m.b1, m.b2, m.b3, m.b4, m.b5, m.b6, m.b7)
(m.s7, m.s6, m.s5, m.s4, m.s3, m.s2, m.s1, m.s0) = tuple(reversed(tuple(map(add1, a[::-1], b_))))
(m.s7, m.s6, m.s5) = (0, 0, 0)
def zeros(n): return list(map(lambda x:0,tuple(range(n))))
m = ROM()
r = [zeros(8), zeros(8)]
p = zeros(8)
a = Adder85()
s = 0
def add_to_pc(x):
global p
(a.a7, a.a6, a.a5, a.a4, a.a3, a.a2, a.a1, a.a0) = p
(a.b7, a.b6, a.b5, a.b4, a.b3, a.b2, a.b1, a.b0) = x
a.act()
p = (a.s7, a.s6, a.s5, a.s4, a.s3, a.s2, a.s1, a.s0)
def inc_pc(): add_to_pc((0, 0, 0, 0, 0, 0, 0, 1))
while True:
(m.a7, m.a6, m.a5, m.a4, m.a3, m.a2, m.a1, m.a0) = p
m.read()
i = (m.d7, m.d6, m.d5, m.d4, m.d3, m.d2, m.d1, m.d0)
print(i)
if i[:2] == (0, 0):
r[i[2]] = (0, 0, 0) + i[3:]
inc_pc()
elif i[:2] == (0, 1):
(a.a7, a.a6, a.a5, a.a4, a.a3, a.a2, a.a1, a.a0) = r[i[2]]
(a.b7, a.b6, a.b5, a.b4, a.b3, a.b2, a.b1, a.b0) = (0, 0, 0) + i[3:]
a.act()
r[i[2]] = (a.s7, a.s6, a.s5, a.s4, a.s3, a.s2, a.s1, a.s0)
s = a.s4
inc_pc()
elif i[:2] == (1, 0):
if s: add_to_pc((0, 0, 0) + i[3:])
else: inc_pc()
elif i[:2] == (1, 1):
if i[3:] == (0, 0, 0, 0, 0): break
add_to_pc((0, 0, 0) + i[3:])
print('\t', r[0], r[1], p)
#input('Press the Enter key')
# -*- coding: utf-8 -*- from functools import reduce def bits(n, b = 0): return list(map(lambda x:b,list(range(n)))) class ROM: def __init__(m): m.bytes = ( ( 0, 0, 0, 0, 0, 0, 0, 1 ), # store a 1 ( 0, 0, 1, 0, 0, 0, 1, 0 ), # store b 2 ( 0, 1, 0, 0, 0, 0, 0, 1 ), # add a 1 ( 0, 1, 1, 1, 1, 1, 1, 1 ), # add b -1 ( 1, 0, 0, 0, 0, 0, 1, 0 ), # jlz 2 ( 1, 1, 0, 1, 1, 1, 0, 1 ), # jmp -3 ( 1, 1, 0, 0, 0, 0, 0, 0 ), # jmp 0 ) m.a = m.d = bits(8) # They will have different id() after being assigned def read(m): m.d = m.bytes[reduce(lambda hi, low: hi * 2 + low, m.a, 0)] class Adder85: def __init__(m): m.a = m.b = m.s = bits(8) def act(m): def add1(a, b): nonlocal carry s = a + b + carry carry = 1 if s >= 2 else 0 return s & 1 carry = 0 m.s = list(map(add1, m.a[::-1], m.b[::-1]))[::-1] # (1,2)[::-1] = (2, 1) # LOOK OUT! # python: 0 1 2 3 4 5 6 7 # brain: 7 6 5 4 3 2 1 0 m.s[0:3] = [0, 0, 0] m = ROM(); r = [bits(8), bits(8)]; p = bits(8); a = Adder85(); s = 0 def add_up_pc(x): global p a.a = p; a.b = x a.act() p = a.s def inc_pc(): add_up_pc((0, 0, 0, 0, 0, 0, 0, 1)) while True: m.a = p; m.read(); i = m.d; print(i) if i[:2] == (0, 0): r[i[2]] = (0, 0, 0) + i[3:]; inc_pc() elif i[:2] == (0, 1): a.a = r[i[2]]; a.b = (0, 0, 0) + i[3:]; a.act() r[i[2]] = a.s; s = a.s[3]; inc_pc() elif i[:2] == (1, 0): if s: add_up_pc((0, 0, 0) + i[3:]) else: inc_pc() elif i[:2] == (1, 1): if i[3:] == (0, 0, 0, 0, 0): break add_up_pc((0, 0, 0) + i[3:]) print('\t', r[0], r[1], p)
1. Programmable Read Only Memory (PROM); 2. Programmable Array Logic (PAL); 3. Programmable Logic Array (PLA) 也许2,3是用电把电线烧断,形成一个组合逻辑电路。面包板是人插线。1么,存真值表的想法可能absurd,但memory里存表格真的顺耳。内存很耗晶体管吧,An Wang was a Chinese-American computer engineer and inventor, who did formidable work in the field of magnetic core memory.
# -*- coding: utf-8 -*-
from functools import reduce
def bits(n, b = 0): return list(map(lambda x:b,list(range(n))))
class ROM:
def __init__(m):
m.bytes = (
( 0, 0, 0, 0, 0, 0, 0, 1 ), # store a 1
( 0, 0, 1, 0, 0, 0, 1, 0 ), # store b 2
( 0, 1, 0, 0, 0, 0, 0, 1 ), # add a 1
( 0, 1, 1, 1, 1, 1, 1, 1 ), # add b -1
( 1, 0, 0, 0, 0, 0, 1, 0 ), # jlz 2
( 1, 1, 0, 1, 1, 1, 0, 1 ), # jmp -3
( 1, 1, 0, 0, 0, 0, 0, 0 ), # jmp 0
)
m.a = m.d = bits(8) # They will have different id() after being assigned
def read(m): m.d = m.bytes[reduce(lambda hi, low: hi * 2 + low, m.a, 0)]
class Adder:
def __init__(m): m.a = m.b = m.s = bits(8)
def add(m):
def add1(a, b):
nonlocal carry
s = a + b + carry
carry = 1 if s >= 2 else 0
return s & 1
carry = 0
m.s = list(map(add1, m.a[::-1], m.b[::-1]))[::-1] # (1,2)[::-1] = (2, 1)
m.s[0:3] = [0, 0, 0]
class Register: # w: write enable
def __init__(m): m.d = m.w = m.q = bits(8)
def write(m, x): m.d = x; m.w = bits(8, 1); m.q = x # FIX IT
m = ROM()
# LOOK OUT! r0 = r1 = Register() and then r0 = Register(), r0 and r1 are different.
# Before that, they refer to the SAME object.
r0 = Register(); r1 = Register(); p = Register()
a = Adder(); s = 0
def add_up_pc(x): global p; a.a = p.q; a.b = x; a.add(); p.write(a.s)
def inc_pc(): add_up_pc((0, 0, 0, 0, 0, 0, 0, 1))
# 0 can be hardcoded by not reset and ..., 1 by reset or ... pc is set, let's go
while True:
m.a = p.q; m.read(); i = m.d; print(i)
if i[:2] == (0, 0):
# Let r1.w = i[2], r0.w = not i[2]
if i[2]: r1.write((0, 0, 0) + i[3:])
else: r0.write((0, 0, 0) + i[3:])
inc_pc()
elif i[:2] == (0, 1):
a.a = r1.q if i[2] else r0.q
a.b = (0, 0, 0) + i[3:]; a.add(); s = a.s[3]
if i[2]: r1.write(a.s)
else: r0.write(a.s)
inc_pc()
elif i[:2] == (1, 0):
if s: add_up_pc((0, 0, 0) + i[3:])
else: inc_pc()
elif i[:2] == (1, 1):
if i[3:] == (0, 0, 0, 0, 0): break
add_up_pc((0, 0, 0) + i[3:])
print('\t', r0.q, r1.q, p.q)