目次

シーケンサデータ作成

 ROMシーケンサを動かすには、データ作成が必要です。

 全体で8ビットとしたROMシーケンサでは、次のように
 次アドレスとカレントシグナルを決めます。



 全体で16ビットとしたROMシーケンサでは、次のように
 次アドレスとカレントシグナルを決めます。




 ビットパターンから16進2桁あるいは4桁のデータを
 生成するので、スクリプト言語を利用します。

 AWKを利用すると、1行に8ビットあるいは16ビットの
 1と0を並べて対応できます。

 ビットパターンは、テキストファイルとして、次のような
 内容とします。

0 0 0 1 1 0 0 0
0 0 1 0 0 1 0 0
0 0 1 1 0 0 1 0
0 1 0 0 0 0 0 1
0 1 0 1 0 0 1 0
0 0 0 0 0 1 0 0

 8ビットあるいは16ビットを16進数で表現するとすれば
 AWKスクリプトは、次のようにすれば充分。

# initialize
BEGIN {
  start = 1
  last  = 8
  hajime = 9
  owari  = 16
}
{
  # address
  adr = 0
  for ( i = start ; i < last+1 ; i++ ) {
    adr = adr * 2 + $i
  }
  # ? 16bits
  if ( NF > 8 ) {
    # data
    dat = 0
    for ( i = hajime ; i < owari+1 ; i++ ) {
      dat = dat * 2 + $i
    }
  }
  # address
  printf("%02x %02x ",NR-1,adr)
  if ( NF > 8 ) {
    printf("%02x",dat)
  }
  printf("\n")
}

 このAWKスクリプトを使うと、次のようにデータを
 生成してきます。




 大抵のROMライターソフトは、16進数のデータを専用SRAM
 バッファに入れると、その場で対応する領域に情報を転送
 できるので、この機能を利用。





 ROMライターソフトを使うためには、Personal Computerが
 必要です。ROMシーケンサのデータを手で作成するのは効率
 が悪いので、ROMライターとともに用意します。

 最新OSを載せた機種でなくとも、充分対応できるはず。

 自分の得意とするAWKを使ってますが、Perl、Tcl/Tk、Python
 のような、Unix標準バンドリングのスクリプト言語ならば
 どの言語でも構いません。

 ROMシーケンサ用のHEXファイルを作成するAWKスクリプトは以下。

#
function s2v(x) {
  #default
  result = 0
  #
  if ( x == "1" ) { result = 1 }
  if ( x == "2" ) { result = 2 }
  if ( x == "3" ) { result = 3 }
  if ( x == "4" ) { result = 4 }
  if ( x == "5" ) { result = 5 }
  if ( x == "6" ) { result = 6 }
  if ( x == "7" ) { result = 7 }
  if ( x == "8" ) { result = 8 }
  if ( x == "9" ) { result = 9 }
  if ( x == "A" ) { result = 10 }
  if ( x == "B" ) { result = 11 }
  if ( x == "C" ) { result = 12 }
  if ( x == "D" ) { result = 13 }
  if ( x == "E" ) { result = 14 }
  if ( x == "F" ) { result = 15 }

  return result
}

# 
function s2d(x) {
  # default
  result = 0
  # upper
  dh = s2v(substr(x,1,1))
  # lower
  dl = s2v(substr(x,2,1))
  # judge
  result = dh * 16 + dl

  return result
}

# 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
}

# main
{
  # get 16 bytes data
  dats = $1
  sum = 0 
  for ( i = 0 ; i < 16 ; i++ ) {
    stmp = substr(dats,2*i+1,2)
    sum += s2d( stmp )
  }
  # generate entry address
  xadr = 16 * (NR-1)
  xadrh = xadr / 256
  xadrl = xadr % 256
  # data count
  sum += 16
  # address high
  sum += xadrh
  # address low
  sum += xadrl
  #
  sum %= 256
  sum = bnot(sum)+1
  sum %= 256
  #
  printf(":10%04x00%s%02X\n",xadr,dats,sum)
}

END {
  printf(":00000001FF\n")
}

 テキストファイルで、1行に16バイト分のデータを
 格納して利用します。

00010001000100010001000100010001
02030203020302030203020302030203
00010001000100010001000100010001
02030203020302030203020302030203

 生成したデータの内容は、以下。

:1000000000010001000100010001000100010001E8
:1000100002030203020302030203020302030203B8
:1000200000010001000100010001000100010001C8
:100030000203020302030203020302030203020398
:00000001FF


目次

inserted by FC2 system