6809のテスト・アンド・セット命令
6809には表立って、テスト・アンド・セット命令は無い。
しかし、リード・モディファイ・ライト命令(メモリを読み出し、変更を加え、
再度書き込む命令) をうまく使えば、テスト・アンド・セット命令を実現できる。
ここで実現するセマフォは、1がクリア状態(誰もセマフォを取っていない)
、0でセマフォがセット状態(誰かがセマフォを獲得している)であるとする。
すなわち、セマフォは1に初期化されている。
test & set命令は、0を書き込みながら、もとのセマフォの値が、0か非0であるか
が判定できる。
それができる命令は、メモリをシフトする命令である。
セマフォがあるメモリ番地をSEMとする。
セマフォ・セット命令、すなわちテスト・アンド・セット命令は、次である。
* テスト・アンド・セット命令
*
LSR SEM
BCS セマフォ使用中 * → CPUを離さないとね。
* セマフォ獲得成功
* きわどい領域でやるべきことをやる
LSR はメモリを右シフトする。そして、古い最下位ビットの値をキャリーフラグ(C)に
入れる。
つまり、セマフォが1であれば、LSR実行後の値は0になり、Cフラグは1になる。
セマフォが0であれば、LSR実行後の値は0になり、Cフラグも0である。
Cフラグが0であれば、セマフォは誰かにすでに誰かに取られており、
セマフォ獲得に失敗したことがわかる。
セマフォ・クリア命令は単純に、セマフォに1を書けばよい。この時点では、
他者との競合を意識する必要はまったくない。他者が、テスト・アンド・セッ
トを正しく不可分に実行しているはずであるから。
* セマフォ・クリア命令
*
LD A,#1
ST A,SEM
このように、8bit CPUとはいえ、基本的な命令が、CISC的リード・モディファ
イ・ライトを行っているため、基本的な命令がテスト・アンド・セット命令と
して使用できる。
割り込み禁止/許可などといううざったい命令は一切出てこない。また、
それらの命令は特権であるから、ユーザ権限では実行できない。
ここで紹介した命令は、ごく普通の命令であるから、すべてユーザランドで
実現できる。非常にスマートであろう。
6809でSMP,マルチ・プロセッサ(マルチコア)を実現するための「6809E」とい
うCPUがある。
6809Eでは、BUSYという信号線が、リード・モディファイ・ライト操作を行っ
ていることを示す。BUSYの期間は、他のCPUがメモリ・アクセスをしないこと
にすれば、リード・モディファイ・ライト操作は、不可分に行われることが簡
単に保証できる。
したがって、6809Eでは、ここで紹介した命令で、マルチ・プロセッサ対応が
可能である。