[#6862] Re: http_get.rb — 青山 和光 <PXN11625@...>

In-Reply-To: [ruby-list:6844] Re: http_get.rb

15 messages 1998/03/01

[#6906] ruby's Icon ? — 藤本尚邦 / FUJIMOTO Hisakuni <hisa@...>

藤本です、こんにちは。

25 messages 1998/03/03
[#6907] Re: ruby's Icon ? — matz@... (Yukihiro Matsumoto) 1998/03/03

まつもと ゆきひろです

[#6908] Re: ruby's Icon ? — 藤本尚邦 / FUJIMOTO Hisakuni <hisa@...> 1998/03/03

藤本です、こんにちは。

[#6911] Re: ruby's Icon ? — OZAWA Sakuro <ozawa@...> 1998/03/03

小澤さくです。

[#6912] Re: ruby's Icon ? — 藤本尚邦 / FUJIMOTO Hisakuni <hisa@...> 1998/03/03

藤本です、こんにちは。

[#6914] Re: ruby's Icon ? — 藤本尚邦 / FUJIMOTO Hisakuni <hisa@...> 1998/03/03

藤本です、こんばんは。

[#6918] manual 1.18b index — WATANABE Tetsuya <tetsu@...>

ruby-man-1.1b8 で、name タグがついているものを拾い集めて

17 messages 1998/03/04
[#6921] Re: manual 1.18b index — matz@... (Yukihiro Matsumoto) 1998/03/04

まつもと ゆきひろです

[#6954] Re: ruby's Icon ? — nosuzuki@... (Norio Suzuki)

こんばんは。鈴木教郎です。

18 messages 1998/03/04
[#6964] Re: ruby's Icon ? — matz@... (Yukihiro Matsumoto) 1998/03/05

まつもと ゆきひろです

[#7023] infinity — Tadayoshi Funaba <tadf@...>

ふなばです。

41 messages 1998/03/09
[#7029] Re: infinity — shugo@... (Shugo Maeda) 1998/03/09

前田です。

[#7033] Re: infinity — keiju@... (石塚圭樹 ) 1998/03/09

けいじゅ@日本ラショナルソフトウェアです.

[#7041] Re: infinity — Kazuhisa YANAGAWA <katze@...> 1998/03/10

In message <199803091741.CAA05774.keiju@cupmail0.rational.com>

[#7048] Re: infinity — keiju@... (Keiju ISHITSUKA) 1998/03/10

けいじゅ@日本ラショナルソフトウェアです.

[#7049] Re: infinity — matz@... (Yukihiro Matsumoto) 1998/03/10

まつもと ゆきひろです

[#7051] Re: infinity — keiju@... (石塚圭樹 ) 1998/03/10

けいじゅ@日本ラショナルソフトウェアです.

[#7054] Re: infinity — matz@... (Yukihiro Matsumoto) 1998/03/10

まつもと ゆきひろです

[#7050] Re: infinity — Kazuhisa YANAGAWA <katze@...> 1998/03/10

In message <199803100359.MAA08628.keiju@cupmail0.rational.com>

[#7259] Socket#shutdown — keiju@... (Keiju ISHITSUKA)

けいじゅ@日本ラショナルソフトウェアです.

16 messages 1998/03/28
[#7260] Re: Socket#shutdown — matz@... (Yukihiro Matsumoto) 1998/03/28

まつもと ゆきひろです

[#7265] Re: Socket#shutdown — keiju@... (石塚圭樹 ) 1998/03/29

けいじゅ@日本ラショナルソフトウェアです.

[ruby-list:6859] register calc (call for scripts)

From: TEI meiki <tei@...>
Date: 1998-03-01 17:09:02 UTC
List: ruby-list #6859
鄭です。

サイン本欲しさに私もノミネートしたいのですが……
(こんなスクリプトでも需要は有るのだろうか。^_^;)

デバイスドライバを作っていて、デバイスのハードウエアレジスタの
各フィールドのビット位置を覚え切れなくてでっちあげたスクリプトです。

使っているうちにだんだん膨れてきたこのスクリプトを、この土日に整理して
人様にお見せできるように整理してみたのですが、こうしたらもっと簡潔になるとか
rubyらしくなるといったコメントもよろしくおねがいします。_o_

このスクリプト単体では使えなくて、対象のハードウエアレジスタの定義ファイルを
作ってやる必要が有ります。

たとえば、例として R3000 の Status Register の定義を "sr2sym.tbl" という
ファイルに以下のように書いておきます。

--------- sr2sym.tbl --------------------------------------------------------
TITLE = "R3000 COP0 Status Register"
PREFIX = "SR_"
TABLE = [
    [ "CU",    28,  4,  "Coprocessor Usability" ],
    [ "BEV",   22,  1,  "BootStrap Exception Vectors" ],
    [ "TS",    21,  1,  "TLB Shutdown" ],
    [ "PE",    20,  1,  "Parity Error" ],
    [ "CM",    19,  1,  "Cache Miss" ],
    [ "PZ",    18,  1,  "Parity Zero" ],
    [ "SwC",   17,  1,  "Swap Caches" ],
    [ "IsC",   16,  1,  "Isolate Cache" ],
    [ "Intr",  10,  6,  "Hardware Interrupt Mask" ],
    [ "Sw",     8,  2,  "Software Interrupt Mask" ],
    [ "KUo",    5,  1,  "Kernel-User mode Old" ],
    [ "EIo",    4,  1,  "Interrupt Enable Old" ],
    [ "KUp",    3,  1,  "Kernel-User mode Previous" ],
    [ "EIp",    2,  1,  "Interrupt Enable Previous" ],
    [ "KUc",    1,  1,  "Kernel-User mode Current" ],
    [ "EIc",    0,  1,  "Interrupt Enable Current" ]
]
-----------------------------------------------------------------------------

そして、このスクリプトのシンボリックリンクを作ります。

 % ln -s hardreg2symbol.rb sr2sym

(sr2sym と sr2sym.tbl は同じディレクトリに置くかなければいけません)

そうすると、こんな風に使えます。

レジスタの値をみて、各フィールドがどんな値か知りたい時は

 % sr2sym 2000040c
CU=2 BEV=0 TS=0 PE=0 CM=0 PZ=0 SwC=0 IsC=0 Intr=1 Sw=0 KUo=0 EIo=0 KUp=1 EIp=1 KUc=0 EIc=0

各フィールドの値を指定して、レジスタに書かなければいけない値を求めるには

 % sr2sym -r CU=2 Intr=1 KUp=1 EIp=1 KUc=0 EIc=0
0x2000040c

いまのレジスタの値をちょっと変更したいという時には

 % sr2sym -r -o 0x2000040c EIp=0
0x20000408

以下スクリプトです。

--------- hardreg2symbol.rb ------------------------------------------------
#! /usr/local/bin/ruby
# 
#  hardreg2symbol.rb
#
# このスクリプトは、細かなフィールドにわかれているハードウエアレジスタを
# 扱う人のための補助ツールです。
# 以下の機能があります。
#   ハードウエアレジスタの値を、各フィールドにわけて分かりやすく表示する。
#   各フィールドの値を合成して、ハードウエアレジスタに書くべき値を求める。
#

require "getopts"

def usage()
  myname = $0.split("/").pop
  print  "Usage:\n"
  printf " %s [-v] HEX ...                データをフィールドに分解\n", myname
  printf " %s -r [-o HEX] FNAME=value ... フィールドの値からデータを求める\n", myname
  printf " %s [-v] -c HEX ...             データをC言語の式に変換\n", myname
  printf " %s -h                          C言語のマクロ定義の生成\n", myname
end

#  'コマンド名.tbl' という名前のファイルをこのコマンドとおなじディレクトリに
#  用意し以下の内容を書いておく

=begin
	TITLE = "hogehoge register"  # 記述するレジスタのフルネーム
	PREFIX = "y"	# C言語のマクロを定義するときのプレフィックス文字
	TABLE = [
	    # "フィールド名", ビット位置, ビット幅, "フィールドの説明"
	    [ "HOGE1",                 0,        1, "hoge1 bit"  ],
	    [ "HOGE2",                 2,        4, "hoge2 bits" ],
	    ....くりかえす。
	]
=end

orgarg = ARGV.dup
if getopts("vhrc","o:") == nil 
  printf("Unkown option %s\n",
	 orgarg.join("\n").sub(ARGV.join("\n"),"").split("\n").pop )
  usage()
  exit 1
end

# フィールド定義ファイルを読み込む。
open( $0.sub(/\.[a-z]+?$/,"") +".tbl" ) { |fd|
  src = fd.readlines(nil).join("")
  eval src if src != nil && src.length > 0
}

PTABLE = {};
NAMES = [];
body = Struct.new("Body", :pos, :width, :mask, :comment)

# 各フィールドの情報を構造体オブジェクトにして、名前で引ける連想配列に格納する
TABLE.each { |f|
  i = body.new( f[1], f[2], ((1<<f[2])-1)<<f[1], f[3] )
  PTABLE[f[0]] = i
  NAMES << f[0] # フィールド名リストをつくる。
}
  
# データをフィールドに分解して表示
def printreg(r)
  print format("#{TITLE} -- 0x%x\n",r) if $OPT_v
  result = []
  NAMES.each { |fname|
    p = PTABLE[fname]
    v = (r & p.mask)>>p.pos
    if( $OPT_v )
      printf(" %6s = %2d -- %s\n", fname, v, p.comment);
    end
    result << "#{fname}=#{v}"
  }
  print result.join(" "),"\n"
end

# データをC言語の式に変換
# 後述の printmacro で生成されるマクロを当てにしている。
def printregC(r)
  print format("/* #{TITLE} -- 0x%x\n",r) if $OPT_v
  result = []
  NAMES.each { |fname|
    p = PTABLE[fname]
    v = (r & p.mask)>>p.pos
    printf(" * %8s = %2d -- %s\n", fname,v, p.comment) if $OPT_v
    if( p.width == 2 )
      result << "#{PREFIX}#{fname}_#{v}"
    else
      result << "#{PREFIX}#{fname}(#{v})"
    end
  }
  printf" */\n" if $OPT_v
  print "\t( " + result.join("|") + " )\n"
end

# フィールドの値からデータを求める
def printhex(arg)
  if $OPT_o then total = $OPT_o.hex  else total = 0  end
  narg = arg.join(" ").gsub('\|'," ").gsub(/[ ]*=[ ]*/,"=").split(" ")
  narg.each { |term|
    if (term =~ /([^=]*)=([0-9]*)/) \
       || (term =~ /([^(]*)\(([0-9]*)\)/) \
       || (term =~ /([^_]*)_([0-9]*)/) then
      name = $1
      value = $2.to_i
      if (p = PTABLE[name]) || (p = PTABLE[name.sub(/^#{PREFIX}/,"")])
	total = (total & (p.mask^0x0ffffffff)) | (value<<p.pos)
      else
	printf("'%s' unknown in '%s'\n", name, term);
      end
    else
       printf("'%s' unknown format\n", term);
    end
  }
  printf( "0x%08x\n", total )
end

# C言語のマクロ定義の生成
def printmacro
  print "/* #{TITLE}\n";
  NAMES.each { |fname|
    p = PTABLE[fname]
    printf(" * %6s = 0x%08x [%2d:%d] -- %s\n",
	   fname, p.mask, p.pos, p.width, p.comment);
  }
  print " */\n";
  sample = []
  NAMES.each { |fname|
    p = PTABLE[fname]
    if p.width == 1
      ( 0..1 ).each { |i|
	printf("#define %-14s\t(#{i}<<#{p.pos})\n","#{PREFIX}#{fname}_#{i}");
      }
      sample << "#{PREFIX}#{fname}_0"
    else
      printf("#define %-14s\t((x)<<%d)\n", "#{PREFIX}#{fname}(x)", p.pos);
      sample << "#{PREFIX}#{fname}(x)"
    end
  }
  printf("\n/* Fully Qualified Bits\n ( %s )\n */\n",sample.join("|"));
end

# =========== main =========
if $OPT_r
  printhex ARGV
elsif $OPT_h
    printmacro
elsif $OPT_c
  while carg = ARGV.shift
    printregC carg.hex
  end
else
  while carg = ARGV.shift
    printreg carg.hex
  end
end

-----------------------------------------------------------------------------

-- 
                         ┌─鄭  明毅───────────────────┐
                         └──tei@harmony.co.jp──tei@mirage.linc.or.jp─┘

In This Thread

Prev Next