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的リード・
モディファイ・ライトを行っているため、基本的な命令がテスト・アンド・セット命令と
して使用できる。
ここには、割り込み禁止/許可などといううざったい命令は一切出てこない。
また、近代的な16bitクラス以上のCPUでは、
割り込み禁止/許可の命令は特権命令であるから、ユーザ権限では実行できない。
ここで紹介した命令(シフト命令)は、ごく普通の命令であるから、すべてユーザランドで
実現できる。非常にスマートであろう。
6809でSMP,マルチ・プロセッサ(マルチコア)を実現するための「6809E」とい
うCPUがある。
6809Eでは、BUSYという信号線が、リード・モディファイ・ライト操作を行っ
ていることを示す。BUSYの期間は、他のCPUがメモリ・アクセスをしないこと
にすれば、リード・モディファイ・ライト操作は、不可分に行われることが簡
単に保証できる。
したがって、6809Eでは、ここで紹介した命令で、マルチ・プロセッサ対応が
可能である。