メモリーアクセスするユーザーインタフェースはメモリー内容の確認および設定用のコマンドを備えています。次の操作はユーザーインタフェースを使用して行います。
任意の仮想アドレスの読み取り、書き込み。
仮想アドレスの物理アドレスへの対応付け。
メモリー演算子を使用すると、任意のメモリー位置からの読み取り、任意のメモリー位置への書き込みが行えます。以降の例に示すメモリーアドレスはすべて仮想アドレスです。
8 ビット、16 ビット、32 ビットのさまざまな操作ができます。一般的に、c (文字) という接頭辞は 8 ビット (1 バイト) の操作を示し、w (ワード) という接頭辞は 16 ビット (2 バイト) の操作を示し、l (quadlet) という接頭辞は 32 ビット (4 バイト) の操作を示します。
l は、場合によっては、数字の 1 との混同を避けるために大文字で示すことがあります。
waddr、qaddr、addr64 は境界の制約をもつアドレスを示します。たとえば、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 -- ) |
nu を a-addr に格納されている数値に加算します。 |
<w@ |
( waddr -- n ) |
doublet w を waddr から符号拡張して取り出します。 |
@ |
( 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 -- ) |
byte を addr に格納します。 |
c@ |
( addr -- byte ) |
byte を addr から取り出します。 |
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? ) |
byte を addr に格納します。アクセスが成功した場合は 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 q を qaddr に格納します。 |
l@ |
( qaddr -- quad ) |
quadlet q を qaddr から取り出します。 |
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-addr に len バイトをコピーします。 |
off |
( a-addr -- ) |
a-addr に false を格納します。 |
on |
( a-addr -- ) |
a-addr に true を格納します。 |
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 w を waddr に格納します。 |
w@ |
( waddr -- w) |
doublet w を waddr から取り出します。 |
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-mem と free-mem の使用例です。
alloc-mem が 4000 バイトのメモリーを割り当てます。その予約領域の開始アドレス (ffef7a48) が表示されます。
dump が ffef7a48 から始まるメモリー 20 バイトの内容を表示します。
次に、このメモリー領域を値 55でみたします。(注: ここで数字は 16 進数で記述されています。)
最後に、free-mem が割り当てられた ffef7a48 からの 4000 バイトのメモリーを返します。
ok ok 4000 alloc-mem . ffef7a48 ok ok ffef7a48 constant temp ok temp 20 dump 0 1 2 3 4 5 6 7 ¥/ 9 a b c d e f 01234567v9abcdef ffef7a40 00 00 f5 5f 00 00 40 08 ff ef c4 40 ff ef 03 c8 ..u_..@..oD@.o.H ffef7a50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ ffef7a60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ ok temp 20 55 fill ok temp 20 dump 0 1 2 3 4 5 6 7 ¥/ 9 a b c d e f 01234567v9abcdef ffef7a40 00 00 f5 5f 00 00 40 08 55 55 55 55 55 55 55 55 ..u_..@.UUUUUUUU ffef7a50 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 UUUUUUUUUUUUUUUU ffef7a60 55 55 55 55 55 55 55 55 00 00 00 00 00 00 00 00 UUUUUUUU........ ok ok temp 4000 free-mem ok |
memmap の使用例を次に示します。
ok 200.0000 sbus 1000 memmap ( virt ) ok |