目次
前
次
シーケンサデータ作成
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
目次
前
次