OpenBoot 2.x コマンド・リファレンスマニュアル

メモリーのアクセス

メモリーアクセスするユーザーインタフェースはメモリー内容の確認および設定用のコマンドを備えています。次の操作はユーザーインタフェースを使用して行います。

メモリー演算子を使用すると、任意のメモリー位置からの読み取り、任意のメモリー位置への書き込みが行えます。以降の例に示すメモリーアドレスはすべて仮想アドレスです。

8 ビット、16 ビット、32 ビットのさまざまな操作ができます。一般的に、c (文字) という接頭辞は 8 ビット (1 バイト) の操作を示し、w (ワード) という接頭辞は 16 ビット (2 バイト) の操作を示し、l (quadlet) という接頭辞は 32 ビット (4 バイト) の操作を示します。


注 -

l は、場合によっては、数字の 1 との混同を避けるために大文字で示すことがあります。


waddrqaddraddr64 は境界の制約をもつアドレスを示します。たとえば、qaddr は 32 ビット (4 バイト) 境界を示し、したがってそのアドレス値は次の例に示すように 4 で割り切れなければなりません。


ok 4028 L@ 
ok 4029 L@ 
Memory address not aligned 
ok 

OpenBoot に実装されている Forth インタプリタはできるだけ ANS の Forth 標準に準拠しています。明示的に 16 ビットまたは 32 ビットを取り出す場合は、@ の代わりにそれぞれ w@ または L@ を使用してください。そのほかのメモリーやデバイスレジスタへのアクセスコマンドもこの規則に従います。

表 4-5 にメモリーアクセス用のコマンドを示します。

表 4-5 メモリーアクセスコマンド

コマンド 

スタックダイアグラム 

説明 

!

( x a-addr -- ) 

数値を a-addr に格納します。

+!

( nu a-addr -- ) 

nua-addr に格納されている数値に加算します。

<w@

( waddr -- n ) 

doublet wwaddr から符号拡張して取り出します。

@

( a-addr --x ) 

数値を a-addr から取り出します。

2!

( x1 x2 a-addr -- ) 

2 つの数値を a-addr に格納します。x2 が下位アドレス。

2@

( a-addr -- x1 x2 )  

2 つの数値を a-addr から取り出します。x2 が下位アドレス。

blank

( addr len -- ) 

addr からの len バイトを空白文字 (10 進の 32) に設定します。

c!

(byte addr -- ) 

byteaddr に格納します。

c@

( addr -- byte ) 

byteaddr から取り出します。

cmove

( addr1 addr2 u -- ) 

addr1 から addr2 に、下位バイトから先に、u バイトをコピーします。

cmove>

( addr1 addr2 u -- ) 

addr1 から addr2 に、上位バイトから先に、u バイトをコピーします。

cpeek

( addr -- false | byte true ) 

addr の 1 バイトを取り出します。アクセスが成功した場合はそのデータと true を返し、読み取りエラーが発生した場合は false を返します。

cpoke

( byte addr -- okay? ) 

byteaddr に格納します。アクセスが成功した場合は true を返し、書き込みエラーが発生した場合はfalse を返します。

comp

( addr1 addr2 len -- diff? ) 

2 つのバイト配列を比較します。 両配列が等しい場合は diff? = 0、異なる最初のバイトにおいて、addr1 の文字列の方が小さい場合は diff? =-1、それ以外の場合は diff? = 1 になります。

dump

( addr len -- ) 

addr から len バイトのメモリを表示します。

erase

( addr len -- ) 

addr から len バイトのメモリを 0 に設定します。

fill

( addr len byte -- ) 

addr から len バイトのメモリを値 byte に設定します。

l!

( n qaddr -- ) 

quadlet qqaddr に格納します。

l@

( qaddr -- quad ) 

quadlet qqaddr から取り出します。

lbflips

( qaddr len -- ) 

指定された領域の各 quadlet 内のバイトを逆に並べ替えます。 

lwflips

( qaddr len -- ) 

指定された領域の各 quadlet 内の doublet をスワップします。 

lpeek

( qaddr -- false | quad true ) 

32 ビット数値を qaddr から取り出します。アクセスが成功した場合はそのデータと true を返し、読み取りエラーが発生した場合は false を返します。

lpoke

( quad qaddr -- okay? ) 

32 ビットの数値を qaddr に格納します。アクセスが成功した場合は true を返し、書き込みエラーが発生した場合は false を返します。

move

( src-addr dest-addr len -- ) 

src-addr から dest-addrlen バイトをコピーします。

off

( a-addr -- ) 

a-addrfalse を格納します。

on

( a-addr -- ) 

a-addrtrue を格納します。

unaligned-l!

( quad addr -- ) 

quadlet q を任意の境界に格納します。(境界は問われません。)

unaligned-l@

( addr -- quad ) 

quadlet q を任意の境界で取り出します。(境界は問われません。)

unaligned-w!

( w addr -- ) 

doublet w を任意の境界に格納します。(境界は問われません。)

unaligned-w@

( addr -- w ) 

doublet w を任意の境界で取り出します。(境界は問われません。)

w!

( w waddr -- ) 

doublet wwaddr に格納します。

w@

( waddr -- w) 

doublet wwaddr から取り出します。

wbflips

( waddr len -- ) 

指定された領域の各 doublet 内のバイトをスワップします。 

wpeek

( waddr -- false | w true ) 

16 ビットの数値を waddr から取り出します。アクセスが成功した場合はそのデータと true を返し、読み取りエラーが発生した場合は false を返します。

wpoke

( w waddr -- okay? ) 

16 ビットの数値を waddr に格納します。アクセスが成功した場合は true を返し、書き込みエラーが発生した場合は false を返します。

dump コマンドは特に便利です。このコマンドは、メモリーの領域をバイト値、ASCII 値の両方で表示します。次の例は、仮想アドレス仮想アドレス 10000 からの 20 バイトを表示します。さらに、特定のメモリー位置に読み書きする方法も示しています。


ok 10000 20 dump   (仮想アドレス 10000 からの 20 バイトを表示) 
      ¥/ 1  2  3  4  5  6  7   8  9  a  b  c  d  e  f  v123456789abcdef 
10000 05 75 6e 74 69 6c 00 40  4e d4 00 00 da 18 00 00 .until.@NT..Z...
10010 ce da 00 00 f4 f4 00 00  fe dc 00 00 d3 0c 00 00 NZ..tt..‾¥..S...
ok 22 10004 c!   (メモリー位置 10004 の 8 ビットバイトを 22 に変更) 
ok

(たとえば、@ を使用して) 無効なメモリー位置をアクセスしようとした場合は、処理はただちに終了し、PROM が Data Access Exception または Bus Error などのエラーメッセージを表示します。(注: 数字は 16 進数で記述されています。)

表 4-6 にメモリー割り当て用のコマンドを示します。

表 4-6 メモリー割り当てコマンド

コマンド 

スタックダイアグラム 

説明 

alloc-mem

( size -- virt ) 

size バイトの空きメモリーを割り当てます。割り当てた仮想アドレスを返します。

free-mem

( virt size -- ) 

alloc-mem で割り当てられていたメモリーを開放します。

free-virtual

( virt size -- ) 

memmap で作成されていた割り当てを取り消します。

次の画面は alloc-memfree-mem の使用例です。

memmap の使用例を次に示します。


ok 200.0000 sbus 1000 memmap ( virt ) 
ok