パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

4ビットマイコンをエミュレートしてみる

2018-09-25 | コンピュータ温故知新
そういえばアセンブラってまったくといっていいほどわからなかったなー

ということで4ビットマイコンのエミュレータを作ってみることにします。
えーっと開始時間は21:51分

4ビットマイコン 大人の科学マガジンvol.24

というのはこのPDFをみたからです。
技術者の気合が感じられます。
FX−マイコン R165プログラム集




10ヶ月ほど前
こんな設計書で

こんなエミュレートはしたことがあるので、できるはず...


プログラム集の30ページあたりから開始

23:53脳が完全に思考停止状態


まず、仕様の理解だけでなんか頭がくらくらする。特にキャリーフラグ

pythonでrangeでループした際、添字の値を変更できないようでここに相当ハマった。



あとキー入力ぐらいではと思ってますが、後頭部がやられそうで一時中断

pythonだからprint文使いまくってなんとか解析できているけど、これを脳内だけでやるのは…

久しぶりに脳のスペックがちょっと足りていないことを自覚してます。

2:00 1群ようやくバグ取れたか状態
キー入力とかキースキャンにしないといけなかったり
ここからはpygameとか使わないと難しいので終了

なんていったけど4:00ぐらいまで少し追加
無理してしまったので、翌日から風邪

#fx-r-165 エミュレータ 1群のみ
def getNum(i):
    return "0123456789abcdef".find(prg[i])

#    0123456789abcedf0123456
#prg="80120f0429120f13f0c2f02"#no.12
#prg="81120f0429220f13f0c2f02"#no.13
#prg="82120f04292f0b20f16f0f2f02"#no.14
#prg="811921931941951"#original1+2+3+4+5
prg="a00f0210f0ef074b1f11f02"

hx="0123456789abcdef"
r=[0,0,0,0,0,0,0,0]#Ar Br Yr Zr A'r B'r Y'r Z'r
m=[0 for i in range(16)]
cf=1
p=0
while p#print("add prg",hex(p),prg[p],r)
    o=prg[p]
    if o=="0":#KA
        inp=input()#押していないはenter押下で代用
        key=-1
        if inp!="":key="0123456789abcdef".find(inp)
        if inp=="m":print("memory",m)
        if key>-1:
            r[0]=key
            p+=1
            cf=0
            continue
    elif o=="1":#AO
        print("print",hx[r[0]])
    elif o=="2":#CH
        r[0],r[1]=r[1],r[0]
        r[2],r[3]=r[3],r[2]
    elif o=="3":#CY
        r[0],r[3]=r[3],r[0]
    elif o=="4":#AM
        m[r[2]]=r[0]
    elif o=="5":#MA
        r[0]=m[r[2]]
    elif o=="6":#M+
        a=r[0]+m[r[2]]
        p+=2
        if a>15:
            r[0]=a-16
            cf=1
            continue
        else:
            r[0]=a
            cf=0
            continue
    elif o=="7":#M-
        a=r[0]-m[r[2]]
        p+=2
        if a<0:
            cf=1
            continue
        else:
            r[0]=a
            cf=0
            continue
    elif o=="8":#TIA
        r[0]=getNum(p+1)
        p+=2
        cf=1
        continue
    elif o=="9":#AIA
        a=r[0]+getNum(p+1)
        p+=2
        if a>15:
            r[0]=a-16
            cf=1
            continue
        else:
            r[0]=a
            cf=0
            continue
    elif o=="a":#TIY
        r[2]=getNum(p+1)
        p+=2
        cf=1
        continue
    elif o=="b":#AIY
        a=r[2]+getNum(p+1)
        p+=2
        if a>15:
            r[2]=a-16
            cf=1
            continue
        else:
            r[2]=a
            cf=0
            continue
    elif o=="c":#CIA
        p+=2
        if r[0]!=getNum(p+1):cf=1
        else:cf=0
        continue
    elif o=="d":#CIY
        p+=2
        if r[2]!=getNum(p+1):cf=1
        else:cf=0
        continue
    elif o=="f":#JUMP
        if cf==1:
            q=getNum(p+1)*16+getNum(p+2)
            p=q
            cf=1
            continue
        else:
            p+=3
            cf=1
            continue

    p+=1
    cf=1


最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。