Detail | Specs |
---|---|
CPU | SONY SPC700シリーズ CMOS8ビットCPU |
最小命令実行時間 | 1.953us/2.048MHz |
内蔵ROM | 64バイト (IPL) |
メモリ空間 | 64Kバイト |
メモリ・マッピング / Memory Mapping
Address | Purpose |
---|---|
0000H~00EFH | 外部メモリ領域 |
00F0H~00FFH | 周辺機能レジスタ(DSPで使用) |
0100H~01FFH | 外部メモリ領域 |
0200H~7FFFH | 外部メモリ領域(標準データ転送域) |
8000H~FFBFH | 使用不可 |
FFC0H~FFFFH | IPL ROM 64byte (IPL ROMはハードの初期設定プログラムが 入っています。) |
0000H~00FFH | 0Page |
0100H~01FFH | 1Page |
0000h~7FFFH | 256Kbit RAM(基板上に実装) |
入出力ポート / I/O Port
周辺レジスタ / Peripheral Register
アドレス | 機能レジスタ | R/W | リセット時 | 備考 |
---|---|---|---|---|
00F0H | (test) | --------------------- | サウンドCPUに実装 | |
00F1H | Control | W | Control = "--00-000" | |
00F2H | Register Add. | R/W | 不定 | DSPに実装 |
00F3H | Register Data | R/W | 不定 | DSPに実装 |
00F4H | Port-0 | R/W | Port0r = "00" Port0w = "00" |
サウンドCPUに実装 |
00F5H | Port-1 | R/W | Port1r = "00" Port1w = "00" |
サウンドCPUに実装 |
00F6H | Port-2 | R/W | Port2r = "00" Port2w = "00" |
サウンドCPUに実装 |
00F7H | Port-3 | R/W | Port3r = "00" Port3w = "00" |
サウンドCPUに実装 |
00F8H | R/W | |||
00F9H | R/W | |||
00FAH | Timer-0 | W | 不定 | サウンドCPUに実装 |
00FBH | Timer-1 | W | 不定 | サウンドCPUに実装 |
00FCH | Timer-2 | W | 不定 | サウンドCPUに実装 |
00FDH | Counter-0 | R | 不定 | サウンドCPUに実装 |
00FEH | Counter-1 | R | 不定 | サウンドCPUに実装 |
00FFH | Counter-2 | R | 不定 | サウンドCPUに実装 |
APU I/O
ポート0~3は、SFXバスを通じてSCPUとデータ通信を行うポートで、8ビットIN4本(nr)、8ビットOUT4本(nw)より構成されます。 SCPUが2140Hへデータを書き込む事により、Port 0rにデータが格納されます。 そして、Sound-CPUが00F4Hを書き込むことで、Port 0rの内容が読み出されます。 Sound-CPUがAPU I/Oポート(00F4H)へデータを書き込むと、Port 0wにデータが書き込まれ、SCPUが2140Hを読み込むとでPort 0wの内容が読み出されます。 (リセット時は、Port nrレジスタ、Port nwレジスタの内容は”00”となります。 ( Port 1w~Port 3wについても同様 n=0ー3))
Port 0~Port 3レジスタ
Sound-CPU から見たアドレス |
SCPUから 見たアドレス |
レジスタ名 | W/R | Sound-CPU側から見た機能 |
---|---|---|---|---|
00F4H | 2140H | Port0r Port0w |
R W |
Port0rレジスタの内容をリード Port0wレジスタへのライト |
00F5H | 2141H | Port1r Port1w |
R W |
Port1rレジスタの内容をリード Port1wレジスタへのライト |
00F6H | 2142H | Port2r Port2w |
R W |
Port2rレジスタの内容をリード Port2wレジスタへのライト |
00F7H | 2143H | Port3r Port3w |
R W |
Port3rレジスタの内容をリード Port3wレジスタへのライト |
コントロールレジスタ
・Control Reg.によるタイマーの制御
ST0はタイマーT0のスタート・ストップ制御ピットで”0”でタイマーストップ、”
1”でタイマーがスタートします。この時、ST0をいったん ”0”にしてから”1”す
る必要があります。ST1、ST2はそれぞれタイマーT1、タイマーT2のスタート・ストップ
制御ピットで、機能はST0と同様です。
D7 D6 D5 D4 D3 D2 D1 DO
Control ── ── PC32 PC10 ── ST2 ST1 ST0 (W)
[00F1H] ↑ ↑ ↑
└──┴──┴─”1”Timer Start
”0”Timer Stop
リセット時"--00-000"
・ポートのクリア
PC32,PCF10に"1"を書き込む事により、ポートは"00"にクリアされます。"0"を書き込ま
れた場合にはクリアされません。
ポートクリア制御ピット PC10に"1"をライトすると、Port0rレジスタと、Port1rレジス
タは共に、"00"にクリアします。同様にPC32に"1"をライトすると、Port2rレジスタとP
ort31rレジスタは共に、"00"にクリアされます。
ポートクリアは、ポートクリア制御ピットに"1"が書き込まれた次のマシンサイクル内
に行われます。ポートクリアタイミングとSFXパスからの当該ポートへのライトタイミン
グが競合する時には、当該レジスタの内容は不定となります。
D7 D6 D5 D4 D3 D2 D1 DO
Control ── ── PC32 PC10 ── ST2 ST1 ST0 (W)
[00F1H] ↑ ↑
└──┴──”1”ポートクリア
”0”クリアせず
リセット時"--00-000"
・タイマー
タイマーT0,T1,T2はそれぞれ、下位8ビットプログラマブルインターバルタイマーと、
その上位に連結された上位4ビットアップカウンタで構成され、それぞれ独立にプログ
ラム可能です。
タイマーT0、タイマーT1のクロック入力は、プリスケーラの8kHz(125us)また、
タイマーT2のロック入力は、プリスケーラの64kHz(15.6us)です。
8ビットタイマー 4ビットアップカウンタ
分解能 最大カウント値 最大カウント値
タイマーTO、T1 125 μsec 32 msec 512 msec
タイマーT2 15.6 μsec 4 msec 64 msec
タイマーT0の下位8ビットは、2進アップ・カウンタを中心に構成され、カウントク
ロックが入力されるごとにインクリメントします。その値がタイマー・レジスタの内容
と一致すると00Hにクリアされ、同時に4ビットアップカウンタへのパルスを発生します。
4ビットアップカウンタは2進アップ・カウンタを中心に構成され、下位からのパル
スが入力されるごとにインクリメントします。
タイマーT0のカウンタ動作は、Control Reg のビット0により制御されます。ST0ビッ
トが”0”の時、カウントアップは停止され、”1”でカウント上位・下位ともクリア
したあとカウントアップが開始されます。
タイマー・レジスタへの書き込みは、カウンタが停止している時に行います。この時、
書き込む値の最小値は01Hで最大値は00Hとなります。尚、タイマー・レジスタの値は読
むことができませんが上位4ビットの値 CN0はいつでも読み出すことが出来ます。CN0の
値が読み出されると、4ビットアップカウンタ部のみ"00"にクリアされます。
タイマーT0は、リセット入力(ノットPOR = "L")により動作を停止します。
このリセット時、Control RegST0"0"、タイマー・レジスタTM0及びCN0は不定となります。
上位4ビットカウンタのタイミング
CNの値が読み出されるとIC内部タイミングによって、4ビットアップカウンタの
みクリアされますが、リードクリアパルスと4ビットアップカウンタへのパルスは競合
しません。従って4ビットアップカウンタへのパルスが入力された時、CNの値は必ず
インクリメントされまたCNのあたいが読み出されるとクリアされCN=”0”となり
ます。
D7 D6 D5 D4 D3 D2 D1 DO
Control ── ── PC32 PC10 ── ST2 ST1 ST0 (W)
[00F1H] ↑ ↑ ↑
└──┴──┴─”1”Timer Start
”0”Timer Stop
リセット時"--00-000"
Timer-0 TM0 (W)
[00FAH]└──┴──┴──┴──┴──┴──┴──┴──┘
Timer-1 TM1 (W)
[00FBH]└──┴──┴──┴──┴──┴──┴──┴──┘
Timer-2 TM2 (W)
[00FCH]└──┴──┴──┴──┴──┴──┴──┴──┘
リセット時 不定
D7 D6 D5 D4 D3 D2 D1 DO
Counter-0 ────────── CN0 (R)
[00FDH]└──┴──┴──┴──┴──┴──┴──┴──┘
Counter-1 ────────── CN1 (R)
[00FEH]└──┴──┴──┴──┴──┴──┴──┴──┘
Counter-2 ────────── CN2 (R)
[00FFH]└──┴──┴──┴──┴──┴──┴──┴──┘
リセット時 不定
・DSP
Interface register
D7 D6 D5 D4 D3 D2 D1 DO
Register Add. Register Address (R/W)
[00F2H]└──┴──┴──┴──┴──┴──┴──┴──┘
Register Data Register Data (R/W)
[00F3H]└──┴──┴──┴──┴──┴──┴──┴──┘
リセット時 不定
DSP内のレジスタにデータをセットするレジスタです。下図のフローチャートの手順
で指定されたレジスタにその値がセットされます。
00F2HにセットしたいDSPのアドレスを書く>00F3Hにデータを書き込む。
また、Register Dataの内容を読みたい時も下図のフローチャートに従って下さい。
00F2Hに読みたいアドレスをセットする。>00F3Hの内容を見る。
使用レジスタ
DSPレジスタマップ
┌───┬─────────┬────────────────────────┐
│Addr. │Register │ 機 能 説 明 │
├───┼─────────┼────────────────────────┤
│ 00 │ VOL(L) │┐Lch,RchのVolume │
│ 01 │ VOL(R) │┘ │
│ 02 │ P(L) │┐P(H)とP(L)の計14ピットで音の高さを表す。 │
│ 03 │ P(H) │┘ │
│ 04 │Voicc 0 SRCN │0~255までのソースナンバーの指定。 │
│ 05 │ ADSR(1) │┐ADSR(1)のD7=1でADSRの指定。 │
│ 06 │ ADSR(2) │┘D7=0の時、GAINが有効。 │
│ 07 │ GAIN │プログラムによって自由にエンベローブを設定できる。 │
│ 08 │ ☆ENVX │DSPがTs毎に書き換えるエンベローブの現在値。 │
│ 09 │ ☆OUTX │エンベローブ乗算後、VOL乗算前の値。(現在の波高値) │
├───┼─────────┼────────────────────────┤
│10~19│ Voice 1 : │┐ │
│20~29│ Voice 2 : ││ │
│30~39│ Voice 3 : ││ │
│40~49│ Voice 4 : │├ Voicc 0と同じ。 │
│50~59│ Voice 5 : ││ │
│60~69│ Voice 6 : ││ │
│70~79│ Voice 7 : │┘ │
├───┼─────────┼────────────────────────┤
│ 0C │ MVOL(L) │メインボリューム(L) │
│ 1C │ MVOL(R) │メインボリューム(R) │
│ 2C │ EVAL(L) │エコーボリューム(L) │
│ 3C │ EVOL(R) │エコーボリューム(L) │
│ 4C │ KOL │key on. D0~D7がVoicc0~Voice7に対応。 │
│ 5C │ KOF │key off. D0~D7がVoicc0~Voice7に対応。 │
│ 6C │ FLG │リセット,ミュート,エコーのon又はoff,ノイズのクロックの指定。 │
│ 7C │ ☆ENDX │sourceのend blockの表示。 │
├───┼─────────┼────────────────────────┤
│ 0D │ EFB │Echo Feed-Back。 │
│ 1D │ - │使用しません。 │
│ 2D │ PMON │Voice(i-1)のOUTXを変調波として、Voiceiに変調。 │
│ 3D │ NON │ノイズのon,off。D0~D7がVoicc0~7に対応。 │
│ 4D │ EON │エコーのon,off。D0~D7がVoicc0~7に対応。 │
│ 5D │ DIR │sourceディレクトリのオフセットアドレス。 │
│ 6D │ ESA │エコー領域のオフセットアドレス。Echo Start Address。 │
│ 7D │ EDL │Echo Delay。下位4ビットのみが有効。 │
├───┼─────────┼────────────────────────┤
│ 0F │ C0 │┐ │
│ 1F │ C1 ││ │
│ 2F │ C2 ││ │
│ 3F │ filter C3 │├エコーフィルタの係数8タップのFIRフイルタを構成。 │
│ 4F │ 関数 C4 ││ │
│ 5F │ C5 ││ (Lch,Rchとも同一フィルタとなります。)│
│ 6F │ C6 ││ │
│ 7F │ C7 │┘ │
└───┴─────────┴────────────────────────┘
☆....DPSが動作状態を書き込むレジスタ
・レジスタ機能
各 Voice毎のレジスタ(表記アドレスは Voice0の時)
・VOL(L),VOL(R)
D7 D6 D5 D4 D3 D2 D1 DO
┌──┬────────────────────┐
VOL(L) │Sign│ VOL(L) │
[00H]├──┼──┴──┴──┴──┴──┴──┴──┤
VOL(R) │Sign│ VOL(R) │
[01H]└──┴──┴──┴──┴──┴──┴──┴──┘
それぞれLch,Rchに乗算されるVolumeで、D7をsignビットとする2の補数形式です。
負の値を入れると、位相が逆転します。
・P(L),P(R)
D7 D6 D5 D4 D3 D2 D1 DO
┌─────┬─────────────────┐
P(H) │(0) (0) │ P(H) │
[02H]├──┴──┴──┴──┴──┴──┴──┴──┤
P(L) │ P(L) │
[03H]└──┴──┴──┴──┴──┴──┴──┴──┘
P(H)の下位6bitとP(L)の8bitとを加えた計14bitでピッチを表します。この時、P(H)の
上位2bitは0とみなされます。
再生される音の周波数をf、原音(録音された時の音)の周波数をfo,P(H),P(L)の上
位14ビットで表される値をpとすると、以下の式が成り立ちます。
f=fo X P / 2の12乗
再生される音とオクターブ比とpとの関係は下図のようになっています。
音程: -2oct. -1oct. 原音 +1oct. +2oct.(ほぼ)
─┼────┼────┼────┼────┤
p: 0400H 0800H 1000H 2000H 3FFFH
・ADSR(1),ADSR(2)
D7 D6 D5 D4 D3 D2 D1 DO
┌───────────┬───────────┐
ADSR(1) │ADSR│ DR │ AR │
[05H]│/GAIN │ │
├──┴──┴──┬──┴──┴──┴──┴──┤
ADSR(2) │ SL │ SR │
[06H]└──┴──┴──┴──┴──┴──┴──┴──┘
ADSR(1)のD7=1のときにこの2Byteが有効となります。(ADSRモード)
ARは一定値(1/64)加算,DR,SRは一定値(1-1/256)乗算。
Key off時には一定値(-1/256)加算により、クリック音を防止しています。
(GAINモードでも同様)
ADSRパラメータ
┌─┬─────┐┌─┬─────┐┌─┬─────┐
│AR│0→1 ││DR│1→SL ││SR│1→t/10 │
│ │の時間 ││ │の時間 ││ │の時間 │
├─┼─────┤├─┼─────┤├─┼─────┼─┬─────┐
│ O│4.1 sec. ││ 0│1.2 sec. ││ 0│ ∞ SEC. │10│1.2 sec. │
│ 1│2.6 ││ 1│740 msec. ││ 1│ 38 │11│880 msec. │
│ 2│1.5 ││ 2│440 ││ 2│ 28 │12│740 │
│ 3│1.0 ││ 3│290 ││ 3│ 24 │13│590 │
│ 4│640 msec. ││ 4│180 ││ 4│ 19 │14│440 │
│ 5│380 ││ 5│110 ││ 5│ 14 │15│370 │
│ 6│260 ││ 6│ 74 ││ 6│ 12 │16│290 │
│ 7│160 ││ 7│ 37 ││ 7│9.4 │17│220 │
│ 8│ 96 │└─┴─────┘│ 8│7.1 │18│180 │
│ 9│ 64 │┌─┬──┐ │ 9│5.9 │19│150 │
│ A│ 40 ││SL│ 比 │ │ A│4.7 │1A│110 │
│ B│ 24 │├─┼──┤ │ B│3.5 │1B│ 92 │
│ C│ 16 ││ O│1/8 │ │ C│2.9 │1C│ 74 │
│ D│ 10 ││ 1│2/8 │ │ D│2.4 │1D│ 55 │
│ E│ 6 ││ 2│3/8 │ │ E│1.8 │1E│ 37 │
│ F│ 0 ││ 3│4/8 │ │ F│1.5 │1F│ 18 │
└─┴─────┘│ 4│5/8 │ └─┴─────┴─┴─────┘
│ 5│6/8 │(パラメータ値は変更の可能性があります。)
│ 6│7/8 │
│ 7│ 1 │
└─┴──┘
・GAIN
ADSR(1)のD7=0の時に有効となります。次の5モードが有ります。
D7 D6 D5 D4 D3 D2 D1 DO
┌──┬────────────────────┐
直接指定 │ 0 │ │
[07H]└──┴──┴──┴──┴──┴──┴──┴──┘
┌──┬──┬──┬──────────────┐
増加モード (リニア)│ 1 │ 1 │ 0 │ │
[07H]└──┴──┴──┴──┴──┴──┴──┴──┘
┌──┬──┬──┬──────────────┐
増加モード (折れ線)│ 1 │ 1 │ 1 │ │
[07H]└──┴──┴──┴──┴──┴──┴──┴──┘
┌──┬──┬──┬──────────────┐
減少モード (リニア)│ 1 │ 0 │ 0 │ │
[07H]└──┴──┴──┴──┴──┴──┴──┴──┘
┌──┬──┬──┬──────────────┐
減少モード ( 指数 )│ 1 │ 0 │ 1 │ │
[07H]└──┴──┴──┴──┴──┴──┴──┴──┘
直接指定 ・・・DO~D6の値で直接 GAINの値をセット
増加(リニア)・・・一定値(1/64)加算
増加(折れ線)・・・0.75まで定数(1/64)、0.75~1で定数(1/256)の加算
減少(リニア)・・・一定値(1/64)減算
減少( 指数 )・・・一定値(1-1/256)乗算
いずれも初期値は、エンベローブの現在値(ENVXで示される値)が
採用されます。
・GAIN
ADSR(1)のD7=0の時に有効となります。次の5モードが有ります。
直接指定 ...D0~D6の値で直接・GAINの値をセット
増加(リニア)...一定値(1/64)加算
増加(折れ線)...0.75まで定数(1/64)、0,75~1で定数(1/256)の加算
減少(リニア)...一定値(1/64)減算
減少(折れ線)...一定値(1-1/256)乗算
いずれも初期値は、エンベローブの現在値(ENVXで示される値)が採用されます。
・SRCN
Source Number の事です。別のツールで作成した音の hex ファイル中の、
音色の順番のことです。
D7 D6 D5 D4 D3 D2 D1 DO
┌───────────────────────┐
SRCN │ │
[04H]└──┴──┴──┴──┴──┴──┴──┴──┘
・ENVX
ADSR/GAIN のエンベローブ定数の現在値。DSP側がTs(31.25usec)毎に書き換えます。
Signビットなし7bit。(D7は常に0)
D7 D6 D5 D4 D3 D2 D1 DO
┌──┬────────────────────┐
ENVX │ 0 │ │
[08H]└──┴──┴──┴──┴──┴──┴──┴──┘
・OUTX
エンベローブ乗算後・VOL乗算前の波高値の現在値。DSP値がTs(31.25usec)毎に書き換
えます。Signビット付8bit。ピッチ変調の変調波としてはこの値が用いられます。
D7 D6 D5 D4 D3 D2 D1 DO
┌──┬────────────────────┐
OUTX │Sign│ │
[09H]└──┴──┴──┴──┴──┴──┴──┴──┘
音声レジスタ
・KON,KOF
key on 及び key off。D0~D7が各々Voice0~7に対応します。1の時key on又は key
off を行い、0の時は何もしません。この二つのレジスタは、リセットの必要はありませ
ん。KOFでは、1が書かれた Voiceについて、ADSRモード/GAINモードにかかわらず一定
値(-1/256)加算により 1→0 が 8msec.の割合で減衰します。また、KON,KOFの連続書き込
みは、2Ts(62.5usec)以上離して下さい。
D7 D6 D5 D4 D3 D2 D1 DO
┌───┬───┬───┬───┬───┬───┬───┬───┐
KON │Voice7│Voice6│Voice5│Voice4│Voice3│Voice2│Voice1│Voice0│
[4CH]└───┴───┴───┴───┴───┴───┴───┴───┘
┌───┬───┬───┬───┬───┬───┬───┬───┐
KOF │Voice7│Voice6│Voice5│Voice4│Voice3│Voice2│Voice1│Voice0│
[5CH]└───┴───┴───┴───┴───┴───┴───┴───┘
・PMON
Voice(i-1)(i=1~7)のOUTXを変調波として、Voice i にピッチ変調をかけます。Di=1
のとき変調 ON となります。(例:D1=1のとき、Voice1から変調音が出ます。)
ただし、Voice0には変調はかかりません。そのため、D0ビットは無効となります。
ピッチ変調の方法は、変調波の波高値をYo、P(H),P(L)の値をPとすると、P'=P(
1+Yo)となる値P’が、Pに代わってその時のピッチの値として採用されるという
ものです。
D7 D6 D5 D4 D3 D2 D1 DO
┌───┬───┬───┬───┬───┬───┬───┬───┐
PMON │Voice7│Voice6│Voice5│Voice4│Voice3│Voice2│Voice1│XXX│
[2DH] └───┴───┴───┴───┴───┴───┴───┴───┘
・NON
ノイズの on/off。1でON。D0~7がVoice0~7に対応しています。on の時、音源データ
の変わりにノイズがでます。この時、前頁 SRCN でフォルマントのみの音源データを指
定していると、ノイズは音源データの長さ分の時間しか発音しません。
任意の時間再生したい時は必ず SRCN で、ループを含む音源データを指定してくださ
い。また、二つ以上の Voice が on であっても Noise の音源は同一です。このノイズ
に変調はかけられません。
D7 D6 D5 D4 D3 D2 D1 DO
┌───┬───┬───┬───┬───┬───┬───┬───┐
NON │Voice7│Voice6│Voice5│Voice4│Voice3│Voice2│Voice1│Voice0│
[3DH]└───┴───┴───┴───┴───┴───┴───┴───┘
・EON
Echo の on/off。1で on。D0~7 が Voice0~7 に対応しています。
D7 D6 D5 D4 D3 D2 D1 DO
┌───┬───┬───┬───┬───┬───┬───┬───┐
EON │Voice7│Voice6│Voice5│Voice4│Voice3│Voice2│Voice1│Voice0│
[4DH]└───┴───┴───┴───┴───┴───┴───┴───┘
・FLG
D7 D6 D5 D4 D3 D2 D1 DO
┌──┬──┬─────┬───────────────────┐
FLG │RES │MUTE│ノットECEN│ NCK │
[6CH]└──┴──┴─────┴───┴───┴───┴───┴───┘
RES : D7=1のときソフトリセットがかかります。このとき、全 Voice が
key on 待ち状態になりミュートがかかります。
パワーオン時に1となります。
MUTE : D6=1 のとき全 Voice にミュートがかかります。
パワーオン時に1となります。
ECEN : D5=0 のとき、Echo による外部メモリへの書込みが可能になります。
(Echo Enable)パワーオン後、CPUが最初に書込みを行うまでは
読み出しデータは不定です。
NCK : ノイズ発生器のクロックを指定します。
6.2.2. ノイズ発生器クロック
このレジスタは、CPU側から書込みだけが可能です。
・ENDX
Source の End Flag の立つブロックの BRR デコードを終えたら、DSP 側が1を立て
ます。D0~7 が Voice 0~7 に対応しています。key on されたVoice があると、それに
対応する bit はリセットされます。また、CPU側がこのレジスタを書き込むと、全 bit
がリセットされます。
D7 D6 D5 D4 D3 D2 D1 DO
┌───┬───┬───┬───┬───┬───┬───┬───┐
ENDX │Voice7│Voice6│Voice5│Voice4│Voice3│Voice2│Voice1│Voice0│
[7CH]└───┴───┴───┴───┴───┴───┴───┴───┘
・MVOL(L),MVOL(R),EVOL(L),EVOL(R)
Main Volume (Lch,Rch) Echo Volume (Lch,Rch)のことです。各チャンネルのメイン・
ボリューム(エコー・ボリューム)はエコー・ボリューム(メイン・ボリューム)と加
算され出力されます。
D7 D6 D5 D4 D3 D2 D1 DO
MVOL(Lch,Rch)┌──┬────────────────────┐
EVOL(Lch,Rch)│ │ │
[0CH]│Sign│ │
[1CH]└──┴──┴──┴──┴──┴──┴──┴──┘
・ESA
Echo Start Address。 Echo 領域のオフセットアドレスを与えます。[ESA]x100H がE
cho 領域の先頭アドレスとなります。
・EDL
Echo Dclay。下位 4bit のみが有効です。ディレイ時間は 16msec 間隔で、 0~240m
sec の範囲で可変します。この時間を t とすると、必要な外部メモリ領域は(2t)kbi
te となります。(最大 30k byte)ただし、EDL=0のときは、ESA~ESA+3
の4バイトのメモリ領域が必要となります。
D7 D6 D5 D4 D3 D2 D1 DO
┌───────────┬───────────┐
EDL │XXXXXXXXXXX│ │
[7DH]└───────────┴──┴──┴──┴──┘
・EFB (Echo Feed-Back)
符号付 8bit.
D7 D6 D5 D4 D3 D2 D1 DO
┌──┬────────────────────┐
EDL │Sign│ │
[7DH]└──┴──┴──┴──┴──┴──┴──┴──┘
・DIR
Source ディレクトリのオフセットアドレスを与えます。[DIR]x100H がディレクトリ
の先頭アドレスとなります。
・CO~C7
Echo フィルタの係数を与えます。sign付8bit。8タップの FIRフィルタを構成します。
Lch,Rchとも同一フィルタとなります。
D7 D6 D5 D4 D3 D2 D1 DO
┌──┬────────────────────┐
CO~C7 │Sign│ │
[0FH]~[7FH]└──┴──┴──┴──┴──┴──┴──┴──┘
・SA(H),SA(L)
Sourceの Start Address。 16bit。アドレスは先頭ブロックの先頭アドレスです。
・LSA(H),LSA(L)
Sourcek Loop Start Address。16bit。アドレスはループスタートブロックの先頭
アドレスです。
┌─────┬─────┐
│Mem.Addr. │Directory │
├─────┼─────┤
│ m+0 │ SA(L) │ SA: Source の Start Address
│ m+1 │ SA(H) │
│ m+2 │ LSA(L) │ LSA: Source のLoop Start Address
│ m+3 │ LSA(H) │
└─────┴─────┘
A15 A8 A7 A0
┌────────┬────────┐
│ DIR │00000000│
└─────┬──┴─────┬──┤
n=[DIR]X100H+[SRCN]X4 │ SRCN │00│
+) └────────┴──┘
──────────────────
┌─────────────────┐
│ n │
└─────────────────┘
・音声プロックフォーマット
32kHzでサンプリングされた音は、BRR(ビット・レート・リダクション)の
処理をかけられ、16ビットから4ビットにデータ圧縮されます。4ビットのデータは
16個にまとめられRFレジスタと共に、9 byte で1プロックを形成します。
D7 D6 D5 D4 D3 D2 D1 DO
┌───────────────────────┬───┬───┐
RF │ BRR情報 │Loop │END│
│ │on/off│ │
├───┴───┴───┴───┼───┴───┴───┴───┤
Da0 │ Da0 H │ Da0 L │
├───────────────┼───────────────┤
Db0 │ Db0 H │ Db0 L │
├───────────────┼───────────────┤
Da1 │ Da1 H │ Da1 L │
├───────────────┼───────────────┤
Db1 │ Db1 H │ Db1 L │
├───────────────┼───────────────┤
Da2 │ Da2 H │ Da2 L │
├───────────────┼───────────────┤
Db2 │ Db2 H │ Db2 L │
├───────────────┼───────────────┤
Da3 │ Da3 H │ Da3 L │
├───────────────┼───────────────┤
Db3 │ Db3 H │ Db3 L │
└───────────────┴───────────────┘
・RF
D7~D2は、BRRに関する情報です。D1=1 のときはループありのSourceで
あることを示し、D0=1 のとき、ブロックがデータの最後のブロックであることを
示します。
・CPUの構成
6502シリーズとよく似た命令セットを持つSPC700は、メモリ空間は64キ
ロが用途別にアドレス区分され、アドレス0000h~00FFhを0ページ、アドレ
ス0100h~01FFhを1ページと呼びます。この領域のデータについては、プログ
ラム・ステイタス・ワード内のダイレクト・ページ・フラグ(P)でダイレクト・ペー
ジ指定を行うと、多様なアドレシング・モードで、かつ少ないサイクル数でデータ処理
を行うことが出来ます。
CPUにはA,X,Yの汎用レジスタ、各種フラグの集合のプログラム・ステイタス
・ワード(PSW)、プログラム・カウンタ(PC)、スタック・ポインタ(SP)が
あります。
Aレジスタは最も多くの命令で操作され、8ビット演算のアキュムレータになります。
16ビット演算時にはYレジスタとペアになり16ビット・アキュムレータの下位8
ビットのレジスタとなります。X,Yレジスタは汎用レジスタとしての機能の他、各種
インデックス・アドレッシング・モードのインデックス・レジスタとしての機能や2ア
ドレス命令のソース、ディスティネーション・アドレス・レジスタ機能など多様な操作
に使用されます。
命令セットにはAれじすたを中心として算術・論理演算が行われる1アドレス命令と、
ダイレクトページ内の任意のアドレスをソース・アドレスとディスティネーション・ア
ドレスに指定できる2アドレス命令があります。
制御用途に多様されるビット処理に対しては、アドレス0000h~1FFFhの8
Kバイトの広範囲のデータに対してブーリアン・ビット操作命令が適用できます。
さらにダイレクト・ペード内のビットに対しては、セット,リセット,ビット条件相
対ジャンプが使用できます。64Kバイトの全空間のデータに対しては、複数ビットの
テスト・アンド・セット,テスト・アンド・リセット命令が用意されています。制度を
必要とするデータや、高速にデータ処理を行うため、16ビット・データを1命令で操
作できます。ダイレクト・ペード内の連続する2バイトの16ビットデータとYレジス
タとAレジスタのペアとの間で、加算,減算,比較,転送が出来ます。また、ダイレク
ト・ページ内の連続する16ビット・データのインクリメント,デクリメントも可能です。
高速データ処理と多様な形式のデータを処理するため、乗算,除算命令があります。
乗算は符号なし8ビット×8ビットで被乗算をYレジスタに、乗算をAレジスタに格
納し、結果はY,Aの16ビットアキュムレータに入ります。除算は符号なし16ビッ
ト÷8ビットで、被除数は、Y,Aの16ビット・アキュムレータに、除数はXレジス
タに格納され、結果の商はAレジスタに入り、余りがYレジスタに入ります。10進デ
ータの処理には、加減算両方の結果に対し10進(加,減算)補正命令があります。
ブランチ系の命令には各種ステイタス・フラグの状態による相対ブランチ命令、ダ
イレクト・ページ内の任意のビットのセット,リセット状態によるブランチ命令など
があります。また、ループ系のブランチ命令には比較ブランチ,減算ブランチ命令が
ありそれぞれについて2種類のアドレシング・モードがあります。サブルーチン・コー
ル命令には64Kバイト内のサブルーチン・アドレス直接指定の3バイトコール命令、
特定エリアをサブルーチン・コールする2バイト・コール命令、コール・テーブルを用
いる16個の1バイト・コール命令があり、サブルーチンの使用頻度に応じて使い分け
るとバイト効率を向上することが出来ます。
7.1. CPUレジスタ
CPU内部には各種の命令実行に必要なレジスタがあります。Aレジスタ(主に
8ビット・アキュムレータとして機能),Xレジスタ,Yレジスタ(インデックス・
レジスタとしても使える汎用8ビット・レジスタ),PSW(プログラム・
ステータス・ワード),SP(スタック・ポインタ)等です。これらは、8ビット・
レジスタですが、PC(プログラム・カウンタ)は16ビットで構成されています。
┌───────────────────────────────┐プログラム・カウンタ
│ PC │
└───────────────┴───────────────┘(16ビット)
┌───────────────┐A レジスタ
│ A │
└───────────────┘(8ビット)
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・(Y,A ベア
・ Y ・ A ・16 ビット
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・アキュムレータ)
(16ビット)
┌───────────────┐X レジスタ
│ X │
└───────────────┘(8ビット)
┌───────────────┐Y レジスタ
│ Y │
└───────────────┘(8ビット)
┌───────────────┐スタック・ポインタ
│ SP │
└───────────────┘(8ビット)
┌───────────────┐プログラム・ステータス・
│ PSW │ワード
└───────────────┘(8ビット)
↓ ↓
┌─┬─┬─┬─┬─┬─┬─┬─┐
│N│V│P│-│H│-│Z│C│
└┬┴┬┴┬┴─┴┬┴─┴┬┴┬┘
│ │ │ │ │ └ キャリー・フラグ
│ │ │ │ │ (ビット・アキュムレータ)
│ │ │ │ └ ゼロ・フラグ
│ │ │ └ ハーフ・キャリー・フラグ
│ │ └ ダイレクト・ページ・フング
│ └ オーバー・フロー・フング
└ ネガティブ・フング
(1) Aレジスタ
8ビットのアキュムレータとしてしようされるレジスタです。
16ビット演算命令時にはYレジスタとペアで構成する16ビットアキュムレータの
Lowバイト・データを保持するレジスタになります。演算命令時には乗数レジスタと
なり、積のLowバイト・データが入ります。除数命令時にはYレジスタとペアで
被除数を構成し、結果の商が入ります。
(2) Xレジスタ
Xレジスタは汎用のデータ・レジスタとしての役割の他にインデックス・
アドレシング時のインデックス・レジスタとして機能します。また、2アドレス命令
の
ディスティネーション・アドレス・レジスタ、Xレジスタ間接アドレス・レジスタに
使われます。
除算命令時には除数レジスタになります。
(3) Yレジスタ
Yレジスタは汎用のデータ・レジスタとしての役割の他にインデックス・
アドレシング時のインデックス・レジスタとして機能します。また、2アドレス命令
のソース・アドレスとして使われます。
16ビット演算命令時にはAレジスタとペアで構成する16ビットアキュムレータ
の
Highバイト・データを保持するレジスタになります。乗算命令時には被除数
レジスタになり、積のHighバイト・データが入ります。
除算命令時にはAレジスタとペアで被除数を構成し、結果の余りが入ります。
条件ジャンプ時のループ・カウンタにも使われます。
(4) プログラム・カウンタ(PC)
プログラム・カウンタは16ビットで構成され64Kバイトのアドレス領域を
持ちます。上位の8ビットをPCH、下位の8ビットをPCLと呼びます。
通常は、次に実行するアドレスを持っていて、フェッチした命令に必要なバイト数
だけインクリメントされます。
プログラムの途中に分岐命令があるとプログラム・カウンタには、分岐先のアドレス
が格納されます。リセット(ノットPOR)入力があるとアドレスFFFFhと
FFFEhにあるリセット・ベクタがそれぞれPCH、PCLに入り、分岐します。
(5) スタック・ポインタ(SP)
スタック・ポインタは割り込みや、サブルーチン・コール、プッシュ(PUCH)、
ポップ(POP)、リターン(RET)命令時にデータをRAM上に退避したり、
RAM上から復帰するために使用されます。スタック・ポインタの示すアドレス領域は
1ページ内(アドレス0100h~01FFh)です。
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
│0│0│0│0│0│0│0│1│ SPの値 │
└─┴─┴─┴─┴─┴─┴─┴─┴───────────────┘
└───────────────┴───────────────┘
ハードで設定 プログラムで設定
*サブルーチン・コール時
スタック・アドレス 動作 退避後のSPの値
SP PCH退避 SP-1
SP-1 PCL退避 SP-2
*サブルーチンからの復帰時
スタック・アドレス 動作 退避後のSPの値
SP+1 PCL退避 SP+1
SP+2 PCLH避 SP+2
Aレジスタ、Xレジスタ、Yレジスタ、PSWをスタックに退避,復帰するには
PUSH,POP命令を使えます。
*PUSH A(X,Y,PSW)
スタック・アドレス 動作 退避後のSPの値
SP A(X,Y,PSW)の退避 SP-1
*POP A(X,Y,PSW)
スタック・アドレス 動作 退避後のSPの値
SP+1 A(X,Y,PSW)の退避 SP+1
(6) プログラム・ステイタス・ワード(PSW)
プログラム・ステイタス・ワードは8ビットのレジスタで命令の実行結果より、セ
ット,リセットされるフラグ類とCPUの動作を決定するフラグ類から構成されています。
リセット時には ”000-0-00”になります。
PSWの構成
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ N │ V │ P │ - │ H │ - │ Z │ C │
└───┴───┴───┴───┴───┴───┴───┴───┘
◇キャリー・フラグ(C)
演算実行後、算術論理ユニット(ALU)の再上段ビットからキャリーがあった時、
またはボローが無かった時にリセットされます。シフト、ローテイト命令でも変化
します。ブーリアンビット操作命令のビット・アキュムレータとしても機能します。
SETC命令でセットされ、CLRC命令でリセットされます。また、NOTC
命令でキャリー・フラグは反転します。
条件分岐命令でテストすることが出来ます。
◇ゼロ・フラグ(Z)
演算実行後、結果がゼロのときにセットされ、ゼロでない時リセットされます。
16ビット演算命令でもゼロの検出が行なわれます。条件分岐命令でテストする
ことが出来ます。
◇ハーフ・キャリー・フラグ(H)
演算実行後、ALUのビット3からビット4へキャリーがあった時、または
ボローがなかった時にセットされます。セットする命令はありませんが、CLRV
命令によってリセットされます。その際、オーバー・フロー・フラグもセット
されます。
◇ダイレクト・ページ・フラグ(P)
ダイレクト・ページ・アドレシングなど多くのアドレシング・モードが適用される
ダイレクトページを指定するフラグです。”0”のときはアドレス0000h~
00FFhの領域、”1”のときはアドレス0100h~01FFhの領域が
ダイレクト・ページになります。STEP命令によってセットされ、CLRP命令
によってリセットされます。
◇オーバー・フロー・フラグ(V)
算術演算実行後、オーバー・フロー、アンダー・フローが生じた時セットされます。
その際、Hフラグも同時に影響をうけます。
条件分岐命令でテストすることが出来ます。
◇ネガティブ・フラグ(N)
演算実行後、MSBの結果の値が”1”のときセットされ、”0”のときリセット
されます。
条件分岐命令でテストすることが出来ます。
7.2. メモリ空間
Sound-CPUは64Kバイトのメモリをアクセスできます。メモリ空間は用途別に
分割されています。アドレス0000hより512バイトは256バイト単位の
2ページに分割されていて0ページ、1ページと呼びます。これらの領域内のデータは、
ダイレクト・ページ・アドレシングなどの多くのアドレシング・モードによりアクセス
できます。
スタック領域は1ページにとられます。
7.2.1. ダイレクト・ページ(0,1ベージ)
0ページ、1ページのどちらかをダイレクト・ページとするかは、プログラム・
ステイタス・ワード内のダイレクト・ページ(P)フラグをセット、リセットする
ことにより指定できます。このページ内のデータは少ないバイト数で高速に、かつ
多くの種類の命令とアドレシング・モードで扱えるようになっています。
スタック領域
スタック領域は1ページ内のRAM領域に設定します。スタック・アドレスの
上位バイトは01hに固定です。スタック・アドレスの下位バイトはプログラム
で初期設定する必要があります。
Sound-CPUでは、FFCOh~FFFFhまでマスクROMが内蔵されています。
ここには、SCPUを通じてROMカセットから256KビットRAM内に、データを
転送するプログラムが入っています。この領域はリセットにより使用されます。
ビット操作命令適用領域
1)SET1(セット・メモリ・ビット)、CLR1(クリア・メモリ・ビット)
命令は、ダイレクト・ページ内の1ビット・データに対して適用できます。
2)TEST1(テスト・アンド・セット・ビット)、TCLR1(テスト・アンド・
クリア・ビット)命令は、64Kバイトの全領域に対し適用できます。
3)ブーリアン命令(AND1,OR1,EOR1,MOV1,NOT1)は、
アドレス0000H~1FFFHの8Kバイトの領域に対し適用できます。
ビット操作命令適用領域
0000H┌──┬────────┬──┬────────┬──┬────────┐
│ │SET1,CLR1 │ │AND1,OR1 │ │TEST1,TCLR1 │
00FFH│ │ダイレクト・ページ │ │EOR1,MOV1 │ │ │
│ │に適用 │ │NOT1 │ │ │
01FFH│・・・・└────────┘ │ │ │ │
│ │ │ │ │
1FFFH│・・・・・・・・・・・・・・・・・・・・・・・・・・・・└────────┘ │ │
│ │ │
7FFFH│・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・│・・・・・・・・・・・・・・・・│
│ │: :│
│ │: 使用不可 :│
FFBFH│ │: :│
FFC0H│・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・│・・・・・・・・・・・・・・・・│
│ │ │
│ │ IPL ROM │
│ │ │
FFFFH└──────────────────────────┴────────┘
・ダイレクト・ページのアドレシング
ダイレクト・ページ・フラグ(P)で指定されるダイレクト・ページ(P=0:
アドレス0000h~00FFh、P=1:アドレス0100h~01FFh)の
データはアドレシング・モードがすべて適用できますので、データ
の多様な取扱いが出来るようになっています。また、命令語中の1バイトデータで
直接アドレス指定できますので、バイト効率も高くなります。
さらに、命令実効サイクルも少なくなりますので、データを高速にアクセスできます。
メモリアドレシング
┌─────┬────────────────┬─┬─────────────┐
│ │ │バ│ 有効アドレス領域 │
│ 記号 │ アドレシング │イ├───┬────┬────┤
│ │ │ト│0000H │~1FFFH │~FFFFH │
│ │ │数│~ │ │ │
│ │ │ │OF11H │ │ │
├─────┼────────────────┼─┼───┼────┼────┤
│ dp │ダイレクト・ページ │2│***│ │ │
├─────┼────────────────┼─┤***│ │ │
│ dp+X │Xインデックスド・ダイレクト・ページ │2│***│ │ │
├─────┼────────────────┼─┤***│ │ │
│ dp+Y │Yインデックスド・ダイレクト・ページ │2│***│ │ │
├─────┼────────────────┼─┤***│ │ │
│ (X) │インダイレクト │1│***│ │ │
├─────┼────────────────┼─┤***│ │ │
│ (X)+ │インダイレクト・オートインクリメント │1│***│ │ │
├─────┼────────────────┼─┤***│ │ │
│ dp,dp │ダイレクト・ページ・トゥ・ダイレクト・ページ │3│***│ │ │
├─────┼────────────────┼─┤***│ │ │
│ (X),(Y) │インダイレクト・ページ・トゥ・インダイレクト・ページ│1│***│ │ │
├─────┼────────────────┼─┤***│ │ │
│ dp,#imm │イミーディエント・データ・トゥ・ダイレクト・ページ │3│***│ │ │
├─────┼────────────────┼─┤***│ │ │
│ dp.bit │ダイレクト・ページ・ビット │2│***│ │ │
├─────┼────────────────┼─┤***│ │ │
│dp.bit,rel│ダイレクト・ページ・ビット ・リラティブ │3│***│ │ │
├─────┼────────────────┼─┼───┼────┤ │
│ mcm.bit │アブソリュート・ブーリアン・ビット │3│***│****│ │
├─────┼────────────────┼─┼───┼────┼────┤
│ laps │アブソリュート │3│***│****│****│
├─────┼────────────────┼─┤***│****│****│
│ laps+X │X インデックス・アブソリュート │3│***│****│****│
├─────┼────────────────┼─┤***│****│****│
│ laps+Y │Y インデックス・アブソリュート │3│***│****│****│
├─────┼────────────────┼─┤***│****│****│
│ [dp+X] │X インデックス・インダイレクト │2│***│****│****│
├─────┼────────────────┼─┤***│****│****│
│ [dp+Y」 │Y インデックス・インダイレクト │2│***│****│****│
└─────┴────────────────┴─┴───┴────┴────┘
SPC700命令要約
SFX音楽CPUは、SPC700シリーズが使われています。ただし、割り込みは
サポートされてないため、スタンバイ,スリーブの各モードは使うことができません。
8ビットデータ転送命令 グループ1
ニモニック オペランド オペコード バイト サイクル オペレーション NVPBHIZC
────────────────────────────────────────
MOV A,#imm E8 2 2 A ← imm N.....Z.
MOV A,(X) E6 1 3 A ← (X) N.....Z.
MOV A,(X)+ BF 1 4 A ← (X) with auto increment N.....Z.
MOV A,dp E4 2 3 A ← (dp) N.....Z.
MOV A,dp+X F4 2 4 A ← (dp+X) N.....Z.
MOV A,labs E5 3 4 A ← (abs) N.....Z.
MOV A,labs+X F5 3 5 A ← (abs+X) N.....Z.
MOV A,labs+Y F6 3 5 A ← (abs+Y) N.....Z.
MOV A,[dp+X] E7 2 6 A ← ((dp+X+1)(dp+X)) N.....Z.
MOV A,[dp]+Y F7 2 6 A ← ((dp+1)(dp)+Y) N.....Z.
MOV X,#imm CD 2 2 X ← imm N.....Z.
MOV X,dp F8 2 3 X ← (dp) N.....Z.
MOV X,dp+Y F9 2 4 X ← (dp+Y) N.....Z.
MOV X,labs E9 3 4 X ← (abs) N.....Z.
MOV Y,#imm 8D 2 2 Y ← imm N.....Z.
MOV Y,dp EB 2 3 Y ← (dp) N.....Z.
MOV Y,dp+X FB 2 4 Y ← (dp+X) N.....Z.
MOV Y,labs EC 3 4 Y ← (aps) N.....Z.
8 ビットデータ転送命令 グループ2
ニモニック オペランド オペコード バイト サイクル オペレーション NVPBHIZC
────────────────────────────────────────
MOV (A),A C6 1 4 A → (X) ........
MOV (A)+,A AF 1 4 A → (X) with auto increment ........
MOV dp,A C4 2 4 A → (dp) ........
MOV dp+X,A D4 2 5 A → (dp+X) ........
MOV labs,A C5 3 5 A → (abs) ........
MOV labs+X,A D5 3 6 A → (abs+X) ........
MOV labs+Y,A D6 3 6 A → (abs+Y) ........
MOV [dp+X],A C7 2 7 A → ((dp+X+1)(dp+X)) ........
MOV [dp]+Y,A D7 2 7 A → ((dp+1)(dp)+Y) ........
MOV dp,X D8 2 4 X → (dp) ........
MOV dp+Y,X D9 2 5 X → (dp+Y) ........
MOV labs,X C9 3 5 X → (abs) ........
MOV dp,Y CB 2 4 Y → (dp) ........
MOV (A),Y C6 1 4 Y → (dp+X) ........
MOV (A),Y C6 1 4 Y → (abs) ........
8ビットデータ転送命令 グループ3
ニモニック オペランド オペコード バイト サイクル オペレーション NVPBHIZC
────────────────────────────────────────
MOV A,X 7D 1 2 A ← X N.....Z.
MOV A,Y DD 1 2 A ← Y N.....Z.
MOV X,A 5D 1 2 X ← A N.....Z.
MOV Y,A FD 1 2 Y ← A N.....Z.
MOV X,SP 9D 1 2 X ← SP N.....Z.
MOV SP,X BD 1 2 SP ← X ........
MOV dp(d),dp(s) FA 3 5 (dp(d)) ← (dp(s)) ........
MOV dp,#imm 8F 3 5 (dp) ← imm ........
8ビット算術演算命令
ニモニック オペランド オペコード バイト サイクル オペレーション NVPBHIZC
────────────────────────────────────────
ADC A,#imm 88 2 2 A ← A + imm + C NV..H.ZC
ADC A,(X) 86 1 3 A ← A + (X) + C NV..H.ZC
ADC A,dp 84 2 3 A ← A + (dp) + C NV..H.ZC
ADC A,dp+X 94 2 4 A ← A + (dp+X) + C NV..H.ZC
ADC A,labs 85 3 4 A ← A + (abs) + C NV..H.ZC
ADC A,labs+X 95 3 5 A ← A + (abs+X) + C NV..H.ZC
ADC A,labs+Y 96 3 5 A ← A + (abs+Y) + C NV..H.ZC
ADC A,[dp+X] 87 2 6 A ← A + ((dp+X+1)(dp+X)) NV..H.ZC
ADC A,[dp]+Y 97 2 6 A ← A + ((dp+1)(dp)+Y) NV..H.ZC
ADC (X),(Y) 99 1 5 (X) ← (X) + (Y) + C NV..H.ZC
ADC dp(d),dp(s) 89 3 6 (dp(d)) ← (dp(d)) + (dp(s)) + C NV..H.ZC
ADC dp,#imm 98 3 5 (dp) ← (dp) + imm + C NV..H.ZC
────────────────────────────────────────
SBC A,#imm A8 2 2 A ← A - imm - ノットC NV..H.ZC
SBC A,(X) 86 1 3 A ← A - (X) - ノットC NV..H.ZC
SBC A,dp 84 2 3 A ← A - (dp) - ノットC NV..H.ZC
SBC A,dp+X 94 2 4 A ← A - (dp+X) - ノットC NV..H.ZC
SBC A,labs 85 3 4 A ← A - (abs) - ノットC NV..H.ZC
SBC A,labs+X 95 3 5 A ← A - (abs+X) - ノットC NV..H.ZC
SBC A,labs+Y 96 3 5 A ← A - (abs+Y) - ノットC NV..H.ZC
SBC A,[dp+X] 87 2 6 A ← A - ((dp+X+1)(dp+X)) - ノットC NV..H.ZC
SBC A,[dp]+Y 97 2 6 A ← A - ((dp+1)(dp)+Y) - ノットC NV..H.ZC
SBC (X),(Y) 99 1 5 (X) ← (X) - (Y) - ノットC NV..H.ZC
SBC dp(d),dp(s) 89 3 6 (dp(d)) ←(dp(d))-(dp(s))-ノットC NV..H.ZC
SBC dp,#imm 98 3 5 (dp) ← (dp) - imm - ノットC NV..H.ZC
────────────────────────────────────────
CMP A,#imm 68 2 2 A - imm N.....ZC
CMP A,(X) 66 1 3 A - (X) N.....ZC
CMP A,dp 64 2 3 A - (dp) N.....ZC
CMP A,dp+X 74 2 4 A - (dp+X) N.....ZC
CMP A,labs 65 3 4 A - (abs) N.....ZC
CMP A,labs+X 75 3 5 A - (abs+X) N.....ZC
CMP A,labs+Y 96 3 5 A - (abs+Y) N.....ZC
CMP A,[dp+X] 67 2 6 A - ((dp+X+1)(dp+X)) N.....ZC
CMP A,[dp]+Y 77 2 6 A - ((dp+1)(dp)+Y) N.....ZC
CMP (X),(Y) 79 1 5 (X) - (Y) N.....ZC
CMP dp(d),dp(s) 69 3 6 (dp(d)) - (dp(s)) N.....ZC
CMP dp,#imm 78 3 5 (dp) - imm N.....ZC
CMP X,#imm C8 2 2 X - imm N.....ZC
CMP X,dp 3E 2 3 X - (dp) N.....ZC
CMP X,labs 1E 3 4 X - (abs) N.....ZC
CMP Y,#imm AD 2 2 Y - imm N.....ZC
CMP Y,dp 7E 2 3 Y - (dp) N.....ZC
CMP Y,labs 5E 3 4 Y - (abs) N.....ZC
8ビット論理演算命令
ニモニック オペランド オペコード バイト サイクル オペレーション NVPBHIZC
────────────────────────────────────────
AND A,#imm 28 2 2 A ← A AND imm N.....Z.
AND A,(X) 26 1 3 A ← A AND (X) N.....Z.
AND A,dp 24 2 3 A ← A AND (dp) N.....Z.
AND A,dp+X 34 2 4 A ← A AND (dp+X) N.....Z.
AND A,labs 25 3 4 A ← A AND (abs) N.....Z.
AND A,labs+X 35 3 5 A ← A AND (abs+X) N.....Z.
AND A,labs+Y 36 3 5 A ← A AND (abs+Y) N.....Z.
AND A,[dp+X] 27 2 6 A ← A AND ((dp+X+1)(dp+X)) N.....Z.
AND A,[dp]+Y 37 2 6 A ← A AND ((dp+1)(dp)+Y) N.....Z.
AND (X),(Y) 39 1 5 (X) ← (X) AND (Y) N.....Z.
AND dp(d),dp(s) 29 3 6 (dp(d)) ← (dp(d)) AND (dp(s)) N.....Z.
AND dp,#imm 38 3 5 (dp) ← (dp) AND imm N.....Z.
────────────────────────────────────────
OR A,#imm 08 2 2 A ← A OR imm N.....Z.
OR A,(X) 06 1 3 A ← A OR (X) N.....Z.
OR A,dp 04 2 3 A ← A OR (dp) N.....Z.
OR A,dp+X 14 2 4 A ← A OR (dp+X) N.....Z.
OR A,labs 05 3 4 A ← A OR (abs) N.....Z.
OR A,labs+X 15 3 5 A ← A OR (abs+X) N.....Z.
OR A,labs+Y 16 3 5 A ← A OR (abs+Y) N.....Z.
OR A,[dp+X] 07 2 6 A ← A OR ((dp+X+1)(dp+X)) N.....Z.
OR A,[dp]+Y 17 2 6 A ← A OR ((dp+1)(dp)+Y) N.....Z.
OR (X),(Y) 19 1 5 (X) ← (X) OR (Y) N.....Z.
OR dp(d),dp(s) 09 3 6 (dp(d)) ← (dp(d)) OR (dp(s)) N.....Z.
OR dp,#imm 18 3 5 (dp) ← (dp) OR imm N.....Z.
────────────────────────────────────────
EOR A,#imm 48 2 2 A ← A EOR imm N.....Z.
EOR A,(X) 46 1 3 A ← A EOR (X) N.....Z.
EOR A,dp 44 2 3 A ← A EOR (dp) N.....Z.
EOR A,dp+X 54 2 4 A ← A EOR (dp+X) N.....Z.
EOR A,labs 45 3 4 A ← A EOR (abs) N.....Z.
EOR A,labs+X 55 3 5 A ← A EOR (abs+X) N.....Z.
EOR A,labs+Y 56 3 5 A ← A EOR (abs+Y) N.....Z.
EOR A,[dp+X] 47 2 6 A ← A EOR ((dp+X+1)(dp+X)) N.....Z.
EOR A,[dp]+Y 57 2 6 A ← A EOR ((dp+1)(dp)+Y) N.....Z.
EOR (X),(Y) 59 1 5 (X) ← (X) EOR (Y) N.....Z.
EOR dp(d),dp(s) 49 3 6 (dp(d)) ← (dp(d)) EOR (dp(s) N.....Z.
EOR dp,#imm 58 3 5 (dp) ← (dp) EOR imm N.....Z.
増減命令
ニモニック オペランド オペコード バイト サイクル オペレーション NVPBHIZC
────────────────────────────────────────
INC A BC 1 2 ++ A N.....Z.
INC dp AB 2 4 ++ (dp) N.....Z.
INC dp+X BB 2 5 ++ (dp+X) N.....Z.
INC labs AC 3 5 ++ (abs) N.....Z.
INC X 3D 1 2 ++ X N.....Z.
INC Y FC 1 2 ++ Y N.....Z.
────────────────────────────────────────
DEC A 9C 1 2 -- A N.....Z.
DEC dp 8B 2 4 -- (dp) N.....Z.
DEC dp+X 9B 2 5 -- (dp+X) N.....Z.
DEC labs 8C 3 5 -- (abs) N.....Z.
DEC X 1D 1 2 -- X N.....Z.
DEC Y DC 1 2 -- Y N.....Z.
7.シフト,ローテーション命令
ニモニック オペランド オペコード バイト サイクル オペレーション NVPBHIZC
────────────────────────────────────────
ASL A 1C 1 2 C << A << O N.....ZC
ASL dp 0B 2 4 C << (dp) << O N.....ZC
ASL dp+X 1B 2 5 C << (dp+X) << O N.....ZC
ASL labs 0C 3 5 C << (abs) << O N.....ZC
────────────────────────────────────────
LSR A 5C 1 2 O >> A >> C N.....ZC
LSR dp 4B 2 4 O >> (dp) >> C N.....ZC
LSR dp+X 5B 2 5 O >> (dp+X) >> C N.....ZC
LSR labs 4C 3 5 O >> (abs) >> C N.....ZC
────────────────────────────────────────
ROL A 3C 1 2 C << A << C N.....ZC
ROL dp 2B 2 4 C << (dp) << C N.....ZC
ROL dp+X 3B 2 5 C << (dp+X) << C N.....ZC
ROL labs 2C 3 5 C << (abs) << C N.....ZC
────────────────────────────────────────
ROR A 7C 1 2 C >> A >> C N.....ZC
ROR dp 6B 2 4 C >> (dp) >> C N.....ZC
ROR dp+X 7B 2 5 C >> (dp+X) >> C N.....ZC
ROR labs 6C 3 5 C >> (abs) >> C N.....ZC
────────────────────────────────────────
XCN A 9C 1 5 A(7~4)←→A(3~0) N.....Z.
16ピットデータ転送命令
ニモニック オペランド オペコード バイト サイクル オペレーション NVPBHIZC
────────────────────────────────────────
MOVW YA,dp BA 2 5 YA ← (dp+1)(dp) N.....Z.
MOVW dp,YA DA 2 5 (dp+1)(dp) ←YA ........
16ビット演算命令
ニモニック オペランド オペコード バイト サイクル オペレーション NVPBHIZC
────────────────────────────────────────
INCW dp 3A 2 6 increment dp memory pair N.....Z.
DECW dp 1A 2 6 decrement dp memory pair N.....Z.
ADDW YA,dp 7A 2 5 YA ← YA + (dp+1)(dp) NV..H.ZC
SUBW YA,dp 9A 2 5 YA ← YA - (dp+1)(dp) NV..H.ZC
CMPW YA,dp 5A 2 4 YA - (dp+1)(dp) N.....ZC
乗算,減算命令
ニモニック オペランド オペコード バイト サイクル オペレーション NVPBHIZC
────────────────────────────────────────
MUL YA CF 1 9 YA(16bits) ← Y * A pair N.....Z.
DIV YA,X 9E 1 12 Q:A R:Y ← YA / X NV..H.Z.
10進補正命令
ニモニック オペランド オペコード バイト サイクル オペレーション NVPBHIZC
────────────────────────────────────────
DAA A DF 1 3 decimal adjust for add. N.....ZC
DAS A BE 1 3 decimal adjust for sub. N.....ZC
ブランチ命令
ニモニック オペランド オペコード バイト サイクル オペレーション NVPBHIZC
────────────────────────────────────────
BRA re1 2F 2 4 branch always ........
BEQ re1 F0 2 2/4 branch on Z=1 ........
BNE re1 D0 2 2/4 branch on Z=0 ........
BCS re1 B0 2 2/4 branch on C=1 ........
BCC re1 90 2 2/4 branch on C=0 ........
BVS re1 70 2 2/4 branch on V=1 ........
BVC re1 50 2 2/4 branch on V=0 ........
BMI re1 30 2 2/4 branch on N=1 ........
BPL re1 10 2 2/4 branch on N=0 ........
BBS dp.bit,re1 x3 3 5/7 branch on dp.bit=1 ........
BBC dp.bit,re1 y3 3 5/7 branch on dp.bit=0 ........
CBNE dp,re1 2E 3 5/7 compare A with (dp) then BNE ........
CBNE dp+X,re1 DE 3 6/8 compare A with (dp+X) then BNE ........
DBNZ dp,re1 6E 3 5/7 decrement memory (dp) then JNZ ........
DBNZ Y,re1 FE 2 4/6 decrement Y then JNZ ........
JMP labs 5F 3 3 jump to new location ........
JMP [labs+X] 1F 3 6 PC ← (abs+X+1)(abs+X) ........
サブルーチン コール、リターン命令
ニモニック オペランド オペコード バイト サイクル オペレーション NVPBHIZC
────────────────────────────────────────
CALL labs 3F 3 8 subroutine call ........
PCALL upage 4F 2 6 upage call ........
TCALL n n1 1 8 table call 0 ........
BRK OF 1 8 software interrupt ...1.0..
RET 6F 1 5 return form subroutine ........
RETI 7F 1 6 return form interrupt (Restored)
スタック操作命令
ニモニック オペランド オペコード バイト サイクル オペレーション NVPBHIZC
────────────────────────────────────────
PUSH A 2D 1 4 push A to stack ........
PUSH X 4D 1 4 push X to stack ........
PUSH Y 6D 1 4 push Y to stack ........
PUSH PSW 0D 1 4 push PSW to stack ........
────────────────────────────────────────
POP A AE 1 4 pop A to stack ........
POP X CE 1 4 pop X to stack ........
POP Y EE 1 4 pop Y to stack ........
POP PSW 8E 1 4 pop PSW to stack (Restored)
15.ビット操作命令
ニモニック オペランド オペコード バイト サイクル オペレーション NVPBHIZC
────────────────────────────────────────
SET1 dp.dit x2 2 4 set direct page bit ........
CLR1 dp.bit y2 2 4 clear direct page bit ........
TEST1 labs OE 3 6 test and set bits with A N.....Z.
TCLR1 labs 4E 3 6 test and clear bits with A N.....Z.
AND1 C,mem.bit 4A 3 4 C ← C AND (mem.bit) .......C
AND1 C,/mem.bit 6A 3 4 C ← C AND ノット(mem.bit) .......C
OR1 C,mem.bit 0A 3 5 C ← C OR (mem.bit) .......C
OR1 C,/mem.bit 2A 3 5 C ← C OR ノット(mem.bit) .......C
EOR1 C,mem.bit 8A 3 5 C ← C EOR (mem.bit) .......C
NOT1 mem.bit EA 3 5 complement (mem.bit) ........
MOV1 C,mem.bit AA 3 4 C ← (mem.bit) .......C
MOV1 mem.bit,C CA 3 6 C → (mem.bit) ........
プログラム・ステイタス・フラグ操作命令
ニモニック オペランド オペコード バイト サイクル オペレーション NVPBHIZC
────────────────────────────────────────
CLRC 60 1 2 clear carry flagbit .......0
SETC 80 1 2 set carry flagage bit .......1
NOTC ED 1 3 complement carry flag .......C
CLRV E0 1 2 clear V and ll .0..0...
CLRP 20 1 2 clear direct page flag ..0.....
SETP 40 1 2 set direct page flag ..1.....
E1 A0 1 3 set interrupt enable flag .....1..
D1 CO 1 3 clear interrupt enable flag .....0..
その他の命令
ニモニック オペランド オペコード バイト サイクル オペレーション NVPBHIZC
────────────────────────────────────────
NOP 00 1 2 no operation ........
SLEEP EF 1 3 standby SLEEP mode ........
STOP FF 1 3 standby STOP mode ........
Note: This document was originally named sndtech.txt
.
Slowly being un-ASCII-art'd by alexmush