掛け算

今度は掛け算をしてみる。

今、0x0010 * 0x0876 = 0b 1000 0111 0110 0000を計算したところである。
f:id:ti-nspire:20210202084407j:plain:w700

def generate_mif(file_name, width, depth, rom):
    f = open(file_name, "w")
    f.write("WIDTH=%d;\n" % width)
    f.write("DEPTH=%d;\n" % depth)
    f.write("ADDRESS_RADIX=UNS;\n")
    f.write("DATA_RADIX=BIN;\n")
    f.write("CONTENT BEGIN\n")
    format_of_code = "0" + str(width) + "b"
    for i in range(depth):
        machine_code = format(rom[i], format_of_code)
        f.write("%10d   :   %s;\n" % (i, machine_code))
    f.write("END;\n")
    f.close()
   
def mov(ra, rb):   return  0 << 11 | ra << 8 | rb << 5
def add(ra, rb):   return  1 << 11 | ra << 8 | rb << 5
def sub(ra, rb):   return  2 << 11 | ra << 8 | rb << 5
def _and(ra, rb):  return  3 << 11 | ra << 8 | rb << 5
def _or(ra, rb):   return  4 << 11 | ra << 8 | rb << 5
def sl(ra):        return  5 << 11 | ra << 8                 # 左シフト
def sr(ra):        return  6 << 11 | ra << 8                 # 右シフト
def sra(ra):       return  7 << 11 | ra << 8                 # 算術右シフト
def ldl(ra, ival): return  8 << 11 | ra << 8 | (ival & 0xFF) # 下位バイトに即値をロード
def ldh(ra, ival): return  9 << 11 | ra << 8 | (ival & 0xFF) # 上位バイトに即値をロード
def cmp(ra, rb):   return 10 << 11 | ra << 8 | rb << 5       # 一致したらフラグが立つ。
def je(addr):      return 11 << 11 | (addr & 0xFF)           # 一致フラグが立っていたらジャンプ
def jmp(addr):     return 12 << 11 | (addr & 0xFF)           # 無条件ジャンプ
def ld(ra, addr):  return 13 << 11 | ra << 8 | (addr & 0xFF) # RAMからレジスタへ値を持ってくる。
def st(ra, addr):  return 14 << 11 | ra << 8 | (addr & 0xFF) # レジスタの値をRAMへ格納する。
def hlt():         return 15 << 11

def _in(ra): return ld(ra, 65) # INポートからレジスタへ読み込む。
def out(ra): return st(ra, 64) # レジスタからOUTポートへ書き出す。

def ld_hl(ra, two_bytes): return ldh(ra, two_bytes >> 8), ldl(ra, two_bytes & 0xFF) # 2バイト即値をレジスタへロード(2命令)

def nop(): return 0

r0, r1, r2, r3, r4, r5, r6, r7 = range(8) # 汎用レジスタ



FILE_NAME = "rom_init.mif"
WIDTH = 15
DEPTH = 256
_ = [0] * DEPTH


# M × N = Pを計算する。
INC = r0
M = r1
N = r2
COUNT = r3
P = r4

_[0] = ldl(INC, 1)            # 増分をセットする。
_[1], _[2] = ld_hl(M, 0x0010) # 掛けられる数Mをセットする。
_[3] = _in(N)                 # 掛ける数NをINポートから読み込む。

_[4] = cmp(COUNT, N)   # N回足し終えたら、
_[5] = je(255)         # 加算ループを抜けるが、そうでなければ、
_[6] = add(P, M)       # 加算し、 
_[7] = out(P)          # 加算の途中経過を出力し、
_[8] = add(COUNT, INC) # 加算回数をインクリメントし、
_[9] = jmp(4)          # 加算を繰り返す。 

_[255] = hlt()

generate_mif(FILE_NAME, WIDTH, DEPTH, _)