目次

ROMチェッカー

 手元に8kバイトのROMがあるので、カウンタをシーケンサに使い
 内部データを1ワード=16ビットでチェックするツールを作成。

 回路図は、以下。



 16ワード(=32バイト)の内容をシーケンサを利用して、ROMから出力。

 各ICの役割を説明します。

 4017

  シーケンサとして使っています。

  0から9ステートの役割は、以下。

  4017は、0から9をカウントしていますが
  ステートごとに論理値の'1'を出力。

  タイミングチャートでは、以下となります。



 74LS374(left hand)

  16ビット分のデータを保持しておくために、外部から
  ワード用アドレスを与えます。

  ワード用アドレスを記憶しておくため、74LS374を使います。

 4013

  ROMには、A0からA8のアドレスを与えていきます。

  A1からA8はワード用の0から255です。

  A0はワードのうちの下位と上位を切り替えるため
  RSラッチから、0か1を出力。

  0出力か1出力かは、シーケンサ用カウンタの4017からの
  制御信号で指定します。

  片方のDタイプフリップフロップは、システムクロックの
  DUTY比を50%にするために利用。

 74LS374(right hand)

  各レジスタは、1バイトのデータを記憶。

  データ記憶のためのトリガーは、4017から与えられます。

 半田付けすると、以下。




 独立して動かせるように、4584による発振回路を入れました。

 ROMチェッカーの回路を発展させると、コンピュータの
 命令を引き出す instruction fetch 回路になります。

 8ビットで命令が賄えない場合、16ビットまでに
 拡張して利用できます。

 16ビット出力のROMがあれば、32ビットまでに拡張できます。

 ROMにパターンを入れるため、インテルのHEXファイルを利用します。

 どういうパターンを入れるのかは、テキストファイルで
 次のように指定します。

0 0 1 0
0 1 3 2
0 2 5 4
0 3 7 6
0 4 9 8
0 5 11 10
0 6 13 12
0 7 15 14
0 8 17 16
0 9 19 18
0 10 21 20
0 11 23 22
0 12 25 24
0 13 27 26
0 14 29 28
0 15 31 30
1 0 10 11
1 1 12 13
1 2 14 15
1 3 16 17
1 4 18 19
1 5 21 20
1 6 23 22
1 7 25 24
1 8 27 26
1 9 29 28
1 10 30 31
1 11 32 33
1 12 34 35
1 13 36 37
1 14 38 39
1 15 40 41

 1行に上位、下位のアドレスを4ビットずつに並べ
 続けて、データを2個並べます。

 アドレスは9ビットなので、512バイト分のデータを
 テキストファイルに用意して、それをHEXファイルへと
 変換できるようにしておきます。

 テキストファイルから、インテルHEXファイルへと変換する
 ために、AWKのスクリプトを利用します。

 スクリプトの内容は、以下。

# bit inverse
function xinverse(x) {
  # default
  result = 0 
  # judge
  if ( x == 0 ) { result = 1 }

  return result
}

# 1's compliment
function bnot(x) {
  # copy
  tmpx = x
  # separate
  x0 = int( tmpx % 2 ) ; tmpx = tmpx / 2 ;
  x1 = int( tmpx % 2 ) ; tmpx = tmpx / 2 ;
  x2 = int( tmpx % 2 ) ; tmpx = tmpx / 2 ;
  x3 = int( tmpx % 2 ) ; tmpx = tmpx / 2 ;
  x4 = int( tmpx % 2 ) ; tmpx = tmpx / 2 ;
  x5 = int( tmpx % 2 ) ; tmpx = tmpx / 2 ;
  x6 = int( tmpx % 2 ) ; tmpx = tmpx / 2 ;
  x7 = int( tmpx % 2 ) ;
  # inverse
  x0 = xinverse(x0) ; x1 = xinverse(x1)
  x2 = xinverse(x2) ; x3 = xinverse(x3)
  x4 = xinverse(x4) ; x5 = xinverse(x5)
  x6 = xinverse(x6) ; x7 = xinverse(x7)
  # calculate
  result = 0 ;
  result = result * 2 + x7 ; result = result * 2 + x6
  result = result * 2 + x5 ; result = result * 2 + x4
  result = result * 2 + x3 ; result = result * 2 + x2
  result = result * 2 + x1 ; result = result * 2 + x0

  return result
}

BEGIN {
  res = 0
}
{
  adr = ($1 * 16 + $2) * 2
  ln  = NR - 1
  r = ln % 8
  # show address
  if ( r == 0 ) {
    # data size
    res = res + 16
    # address
    res = res + (adr / 256) + (adr % 256)
    # 2 data
    res = res + $3 + $4
    # show
    printf(":10%04X00%02X%02X",adr,$3,$4)
  }
  # add check sum
  if ( r == 7 ) {
    # add
    res = res + $3 + $4
    # calculate check sum
    result = bnot(res % 256) + 1
    # show
    printf("%02X%02X%02X\n",$3,$4,result)
    # prepare next
    res = 0
  }
  # others
  if ( r != 0 && r != 7 ) {
    # add
    res = res + $3 + $4
    # show
    printf("%02X%02X",$3,$4)
  }
}
END {
  printf(":00000001FF\n")
}

 8行ごとに16個のデータをまとめています。

 AWKでは、NR(Number of Recode)でいくつ目のデータを
 処理するのかを指定できるので、0から7の範囲に限定
 して、動作を記述しました。

 8行ごとに処理するので、8の倍数の行数でまとめた
 パターンをHEXファイルへと変換できます。

 次のようにI/Oリダイレクトを利用して生成。



 生成したHEXファイルの内容は、以下。

:10000000010003020504070609080B0A0D0C0F0E78
:10001000111013121514171619181B1A1D1C1F1E68
:100020000A0B0C0D0E0F10111213151417161918B8
:100030001B1A1D1C1E1F20212223242526272829A8
:00000001FF

 出来上がったHEXファイルは、ROMライターに渡せば
 指定パターンを格納したROMが出来上がります。


目次

inserted by FC2 system