(PIT)8254
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* PIT 8254のページ [#laece60c]
-PITは「Programmable Interval Timer」の略
-8253と8254がある
--8253にはリードバックコマンドがない(それ以外は同じ)
-AT互換機に1個(8254)、TOWNSには2個(8253)、PC-9801には...
--PC(IBM 5150)やXTでは8253で、ATで8254になったという説や...
-AT互換機ではPITに1.19318MHzのクロックが与えられている。
-TOWNSではPITに307.2KHz(ch0-2)と1.2288MHz(ch4)のクロ...
--さらに上位機種には1.00MHzのインターバルタイマ2がある(...
-PC-9801はPITに2.4576MHz(システムクロック5MHz系時)もし...
* 関係するI/Oポート [#k4ec992b]
*** AT互換機 [#d523a68d]
-0x0040 (8bit, R/W):カウンタ0 (IRQ0用)
--DOSではモード2でカウント65536を設定
-0x0041 (8bit, R/W):カウンタ1 (メインメモリ・リフレッシ...
--通常はモード2でカウント0x18を設定 --- メモリやチップセ...
-0x0042 (8bit, R/W):カウンタ2 (BEEP用)
--通常はモード3 --- モード2でも多分音は出るけど、音色は変...
-0x0043 (8bit, W):コントールレジスタ
-0x0061 (8bit, R):システムポート
--bit0:カウンタ2のGATEピンの状態
--bit1:スピーカイネーブルピンの状態
---これとカウンタ2のOUT値のANDがスピーカに接続されている
--bit2:ライト時のbit2の値が読める
--bit3:ライト時のbit3の値が読める
--bit4:(メモリリフレッシュが行われるたびに値が反転)
--bit5:カウンタ2のOUTピンの状態
--bit6:(ISAのIOCHK信号がアサートされてNMIが発生すると1...
--bit7:(メモリパリティエラーが発生すると1になる)
-0x0061 (8bit, W):システムポート
--bit0:カウンタ2のGATEピンへの出力値
--bit1:スピーカイネーブルピンへの出力値(1でBEEP-ON)
--bit2:(1にすると、メモリパリティエラーを検出したときに...
--bit3:(1にすると、ISAのIOCHK信号でNMIが発生)
--bit4-7:リザーブ(0にするのを推奨)
*** TOWNS [#r82d1f54]
-上位機種は合計で8カウンタをもち、そのうちの3つがIRQ0の発...
--この他にもFM音源部にタイマ割り込みがある
--とくに1.00MHzのインターバルタイマ2とフリーランタイマレ...
--IRQがレベルトリガになっていることも含めて、ここまでタイ...
-0x0040 (8bit, R/W):カウンタ0 (IRQ0用 - インターバルタイ...
--通常はモード3で使用
-0x0042 (8bit, R/W):カウンタ1 (IRQ0用 - I/O制御用)
--通常はモード0で使用
-0x0044 (8bit, R/W):カウンタ2 (BEEP用)
--通常はモード3 --- モード2でも多分音は出るけど、音色は変...
-0x0046 (8bit, W):コントールレジスタ(ch0-2用)
-0x0050 (8bit, R/W):カウンタ3 (リザーブ)
-0x0052 (8bit, R/W):カウンタ4 (RS-232Cのボーレート用)
--通常はモード3で使用
-0x0054 (8bit, R/W):カウンタ5 (リザーブ)
-0x0056 (8bit, W):コントールレジスタ(ch3-5用)
-0x0060 (8bit, W):割込み制御レジスタ
--bit0:ch0のタイムアウト割り込み許可(0でマスク、1で許可)
--bit1:ch1のタイムアウト割り込み許可(0でマスク、1で許可)
--bit2:BEEP出力制御(1でBEEP-ON)
--bit3-6:リザーブ(0で書き込むことを強く推奨)
--bit7:1でch0のタイムアウトフラグをクリア
---0に戻す必要はない。書き込み時に1だと、そのときにタイム...
---TOWNSの割り込みは全てレベルトリガであり、この動作でタ...
---なお、ch1にはタイムアウトフラグを下げるためのコマンド...
-0x0060 (8bit, R):割込み要因レジスタ
--bit0:ch0のタイムアウトフラグ(1でタイムアウトしたこと...
--bit1:ch1のタイムアウトフラグ(1でタイムアウトしたこと...
--bit2:ch0のタイムアウト割り込み許可、の設定値が読める
--bit3:ch1のタイムアウト割り込み許可、の設定値が読める
--bit4:BEEP出力制御、の設定値が読める
-0x0026 (16bit, R):フリーランタイマレジスタ
--bit0-15:カウント値
---これは1マイクロ秒ごとに1ずつカウントアップされるレジス...
-0x0068 (8bit, W):インターバルタイマ2制御レジスタ
--このレジスタは非常に有用であるが10F以降でしか利用できない
--bit0-6:リザーブ(0で書き込むことを強く推奨)
--bit7:インターバルタイマ2のタイムアウト割り込みマスク(...
-0x0068 (8bit, R):インターバルタイマ2制御レジスタ
--このレジスタは非常に有用であるが10F以降でしか利用できない
--bit0-4:リザーブ
--bit5:タイムアウトフラグが0になっていないときにさらにタ...
--bit6:タイムアウトフラグ(1でタイムアウトあり)
--bit7:インターバルタイマ2のタイムアウト割り込みマスク、...
--このレジスタをリードすると、リード直後にタイムアウトフ...
-0x006a (16bit, R/W):インターバルタイマ2周期レジスタ
--bit0-15:割り込み周期設定値(マイクロ秒単位で設定)
---このレジスタは非常に有用であるが10F以降でしか利用でき...
-0x006c (8bit, W):1マイクロ秒WAITレジスタ
--このレジスタは非常に有用であるが10F以降でしか利用できない
--bit0-7:リザーブ(0で書き込むことを強く推奨)
--このレジスタへの書き込み動作で、1マイクロ秒のwaitがかかる
-0x006c (8bit, R):1マイクロ秒WAITレジスタ
--このレジスタは非常に有用であるが10F以降でしか利用できない
--bit0-6:リザーブ
--bit7:常に0(ここが1だと10Fより前のモデルであることを意...
*** PC-9801 [#if04f508]
-0x0071 (8bit, R/W):カウンタ0 (IRQ0用)
--モード3で使用。
-0x0073 (8bit, R/W):カウンタ1 (メインメモリ・リフレッシ...
--BEEP音程が変わらない元祖/E/F/Mは前者、VF/VM/XL以降は後...
--モード3で使用。
-0x0075 (8bit, R/W):カウンタ2 (BEEP用)
--モード3で使用。
-0x0077 (8bit, W):コントールレジスタ
-0x3fdb (8bit, R/W):カウンタ1 (多くの機種のノーマルモー...
--モード3で使用。
-0x3fdf (8bit, W):コントールレジスタ
--ここにライトすることと0x0077にライトすることは全く同じ
* 8254の基礎 [#f990b9b0]
-8524は内部に16bitのカウンタを3つ持っている。それぞれに外...
-カウントは原則としてデクリメントであり、周期的なモードで...
-ハードウェア的には、以下の3つの信号ピンが関係している(...
--CLK:クロック(カウンタをデクリメントするためのクロック)
--GATE:ゲート(カウンタを始動させたり一時停止させたり再...
--OUT:アウト(カウント値によって制御されるPITの出力ピン...
-カウントは、2進数カウントモードと、BCDカウントモードがあ...
-8254は、現在のカウント値をラッチによって読み取ることがで...
--リードバックコマンドを使って、少ないサンプリング数で正...
-コントロールレジスタの各ビットの意味は次の通り。
--bit0:カウントモード
---0:2進数カウント
---1:BCDカウント
--bit1-3:カウントモード
---000:モード0(ターミナルカウント)
---001:モード1(プログラマブルワンショット)
---x10:モード2(レートジェネレータ)
---x11:モード3(方形波レートジェネレータ)
---100:モード4(ソフトウェアトリガストローブ)
---101:モード5(ハードウェアトリガストローブ)
--bit4-5:カウンタアクセスモード
---11:16bitリードロード(下位8bit、上位8bitの順)
---10:上位8bitのリードロード
---01:下位8bitのリードロード
---00:カウント値ラッチ
--bit6-7:カウンタチャンネル指定
---00:カウンタ0
---01:カウンタ1
---10:カウンタ2
---11:リードバックコマンド(後述)
-カウント値を設定するには、一般に以下の手順で行なう。
--コントールレジスタに設定したいチャンネルのモードを設定...
--そして、目的のカウンタに値をセット。8bitモードなら1回の...
--モード設定から、カウント値の設定完了までの間に、他のチ...
-カウント値を読み取るには、一般に次の手順で行なう。
--コントールレジスタを使って、読み取りたいチャンネルに対...
--読み取りのカウンタアクセスモードは、書き込み時のモード...
*** ものぐさなひとのために [#l0b6c2a0]
-ぶちゃっけ、読者の多くはAT互換機でタイマーとBEEPの設定を...
-IRQ0の割り込み周期変更:
--AL = 0x34; OUT(0x43, AL);
--AL = 割り込み周期の下位8bit; OUT(0x40, AL);
--AL = 割り込み周期の上位8bit; OUT(0x40, AL);
--これでおしまい。
--割り込み周期に0を指定すると65536を指定したとみなされる...
-BEEP音の制御:
--音程操作:
---AL = 0xb6; OUT(0x43, AL);
---AL = 設定値の下位8bit; OUT(0x42, AL);
---AL = 設定値の上位8bit; OUT(0x42, AL);
---設定値0は、65536として扱われる。
---これで発振される音程は、クロック/設定カウント値。つま...
--BEEPのON/OFF:
---これはI/Oポート0x61を使う。
---ON: IN(AL, 0x61); AL |= 0x03; AL &= 0x0f; OUT(0x61, ...
---OFF: IN(AL, 0x61); AL &= 0xd; OUT(0x61, AL);
* 6つのモード [#j135aafe]
* こめんと欄 [#d5d3986f]
-ここにKさんが書いてくださった内容を参考にして[[Mona]]のp...
-少しは役に立ったようでうれしいです。 -- [[K]] SIZE(10){2...
void setTimerInterval(dword ms) {
dword timerCounter = ms * 1193.18;
outportb(0x43, 0x34);
outportb(0x40, timerCounter & 0xff);
outportb(0x40, timerCounter >> 8);
}
-タイマ割込み周期設定関数を作ってみました。引数はmsです。...
-[[Mona]]で上記の関数をテストしましたがきちんと動いている...
-実機でテストしたところカーネルが起動中に止まってしまった...
-確かPC-9801VX辺りのハードウェアマニュアルにもi8254搭載と...
-PC-98の場合、アーキテクチャとして保証されてるのが8253の...
#comment
終了行:
* PIT 8254のページ [#laece60c]
-PITは「Programmable Interval Timer」の略
-8253と8254がある
--8253にはリードバックコマンドがない(それ以外は同じ)
-AT互換機に1個(8254)、TOWNSには2個(8253)、PC-9801には...
--PC(IBM 5150)やXTでは8253で、ATで8254になったという説や...
-AT互換機ではPITに1.19318MHzのクロックが与えられている。
-TOWNSではPITに307.2KHz(ch0-2)と1.2288MHz(ch4)のクロ...
--さらに上位機種には1.00MHzのインターバルタイマ2がある(...
-PC-9801はPITに2.4576MHz(システムクロック5MHz系時)もし...
* 関係するI/Oポート [#k4ec992b]
*** AT互換機 [#d523a68d]
-0x0040 (8bit, R/W):カウンタ0 (IRQ0用)
--DOSではモード2でカウント65536を設定
-0x0041 (8bit, R/W):カウンタ1 (メインメモリ・リフレッシ...
--通常はモード2でカウント0x18を設定 --- メモリやチップセ...
-0x0042 (8bit, R/W):カウンタ2 (BEEP用)
--通常はモード3 --- モード2でも多分音は出るけど、音色は変...
-0x0043 (8bit, W):コントールレジスタ
-0x0061 (8bit, R):システムポート
--bit0:カウンタ2のGATEピンの状態
--bit1:スピーカイネーブルピンの状態
---これとカウンタ2のOUT値のANDがスピーカに接続されている
--bit2:ライト時のbit2の値が読める
--bit3:ライト時のbit3の値が読める
--bit4:(メモリリフレッシュが行われるたびに値が反転)
--bit5:カウンタ2のOUTピンの状態
--bit6:(ISAのIOCHK信号がアサートされてNMIが発生すると1...
--bit7:(メモリパリティエラーが発生すると1になる)
-0x0061 (8bit, W):システムポート
--bit0:カウンタ2のGATEピンへの出力値
--bit1:スピーカイネーブルピンへの出力値(1でBEEP-ON)
--bit2:(1にすると、メモリパリティエラーを検出したときに...
--bit3:(1にすると、ISAのIOCHK信号でNMIが発生)
--bit4-7:リザーブ(0にするのを推奨)
*** TOWNS [#r82d1f54]
-上位機種は合計で8カウンタをもち、そのうちの3つがIRQ0の発...
--この他にもFM音源部にタイマ割り込みがある
--とくに1.00MHzのインターバルタイマ2とフリーランタイマレ...
--IRQがレベルトリガになっていることも含めて、ここまでタイ...
-0x0040 (8bit, R/W):カウンタ0 (IRQ0用 - インターバルタイ...
--通常はモード3で使用
-0x0042 (8bit, R/W):カウンタ1 (IRQ0用 - I/O制御用)
--通常はモード0で使用
-0x0044 (8bit, R/W):カウンタ2 (BEEP用)
--通常はモード3 --- モード2でも多分音は出るけど、音色は変...
-0x0046 (8bit, W):コントールレジスタ(ch0-2用)
-0x0050 (8bit, R/W):カウンタ3 (リザーブ)
-0x0052 (8bit, R/W):カウンタ4 (RS-232Cのボーレート用)
--通常はモード3で使用
-0x0054 (8bit, R/W):カウンタ5 (リザーブ)
-0x0056 (8bit, W):コントールレジスタ(ch3-5用)
-0x0060 (8bit, W):割込み制御レジスタ
--bit0:ch0のタイムアウト割り込み許可(0でマスク、1で許可)
--bit1:ch1のタイムアウト割り込み許可(0でマスク、1で許可)
--bit2:BEEP出力制御(1でBEEP-ON)
--bit3-6:リザーブ(0で書き込むことを強く推奨)
--bit7:1でch0のタイムアウトフラグをクリア
---0に戻す必要はない。書き込み時に1だと、そのときにタイム...
---TOWNSの割り込みは全てレベルトリガであり、この動作でタ...
---なお、ch1にはタイムアウトフラグを下げるためのコマンド...
-0x0060 (8bit, R):割込み要因レジスタ
--bit0:ch0のタイムアウトフラグ(1でタイムアウトしたこと...
--bit1:ch1のタイムアウトフラグ(1でタイムアウトしたこと...
--bit2:ch0のタイムアウト割り込み許可、の設定値が読める
--bit3:ch1のタイムアウト割り込み許可、の設定値が読める
--bit4:BEEP出力制御、の設定値が読める
-0x0026 (16bit, R):フリーランタイマレジスタ
--bit0-15:カウント値
---これは1マイクロ秒ごとに1ずつカウントアップされるレジス...
-0x0068 (8bit, W):インターバルタイマ2制御レジスタ
--このレジスタは非常に有用であるが10F以降でしか利用できない
--bit0-6:リザーブ(0で書き込むことを強く推奨)
--bit7:インターバルタイマ2のタイムアウト割り込みマスク(...
-0x0068 (8bit, R):インターバルタイマ2制御レジスタ
--このレジスタは非常に有用であるが10F以降でしか利用できない
--bit0-4:リザーブ
--bit5:タイムアウトフラグが0になっていないときにさらにタ...
--bit6:タイムアウトフラグ(1でタイムアウトあり)
--bit7:インターバルタイマ2のタイムアウト割り込みマスク、...
--このレジスタをリードすると、リード直後にタイムアウトフ...
-0x006a (16bit, R/W):インターバルタイマ2周期レジスタ
--bit0-15:割り込み周期設定値(マイクロ秒単位で設定)
---このレジスタは非常に有用であるが10F以降でしか利用でき...
-0x006c (8bit, W):1マイクロ秒WAITレジスタ
--このレジスタは非常に有用であるが10F以降でしか利用できない
--bit0-7:リザーブ(0で書き込むことを強く推奨)
--このレジスタへの書き込み動作で、1マイクロ秒のwaitがかかる
-0x006c (8bit, R):1マイクロ秒WAITレジスタ
--このレジスタは非常に有用であるが10F以降でしか利用できない
--bit0-6:リザーブ
--bit7:常に0(ここが1だと10Fより前のモデルであることを意...
*** PC-9801 [#if04f508]
-0x0071 (8bit, R/W):カウンタ0 (IRQ0用)
--モード3で使用。
-0x0073 (8bit, R/W):カウンタ1 (メインメモリ・リフレッシ...
--BEEP音程が変わらない元祖/E/F/Mは前者、VF/VM/XL以降は後...
--モード3で使用。
-0x0075 (8bit, R/W):カウンタ2 (BEEP用)
--モード3で使用。
-0x0077 (8bit, W):コントールレジスタ
-0x3fdb (8bit, R/W):カウンタ1 (多くの機種のノーマルモー...
--モード3で使用。
-0x3fdf (8bit, W):コントールレジスタ
--ここにライトすることと0x0077にライトすることは全く同じ
* 8254の基礎 [#f990b9b0]
-8524は内部に16bitのカウンタを3つ持っている。それぞれに外...
-カウントは原則としてデクリメントであり、周期的なモードで...
-ハードウェア的には、以下の3つの信号ピンが関係している(...
--CLK:クロック(カウンタをデクリメントするためのクロック)
--GATE:ゲート(カウンタを始動させたり一時停止させたり再...
--OUT:アウト(カウント値によって制御されるPITの出力ピン...
-カウントは、2進数カウントモードと、BCDカウントモードがあ...
-8254は、現在のカウント値をラッチによって読み取ることがで...
--リードバックコマンドを使って、少ないサンプリング数で正...
-コントロールレジスタの各ビットの意味は次の通り。
--bit0:カウントモード
---0:2進数カウント
---1:BCDカウント
--bit1-3:カウントモード
---000:モード0(ターミナルカウント)
---001:モード1(プログラマブルワンショット)
---x10:モード2(レートジェネレータ)
---x11:モード3(方形波レートジェネレータ)
---100:モード4(ソフトウェアトリガストローブ)
---101:モード5(ハードウェアトリガストローブ)
--bit4-5:カウンタアクセスモード
---11:16bitリードロード(下位8bit、上位8bitの順)
---10:上位8bitのリードロード
---01:下位8bitのリードロード
---00:カウント値ラッチ
--bit6-7:カウンタチャンネル指定
---00:カウンタ0
---01:カウンタ1
---10:カウンタ2
---11:リードバックコマンド(後述)
-カウント値を設定するには、一般に以下の手順で行なう。
--コントールレジスタに設定したいチャンネルのモードを設定...
--そして、目的のカウンタに値をセット。8bitモードなら1回の...
--モード設定から、カウント値の設定完了までの間に、他のチ...
-カウント値を読み取るには、一般に次の手順で行なう。
--コントールレジスタを使って、読み取りたいチャンネルに対...
--読み取りのカウンタアクセスモードは、書き込み時のモード...
*** ものぐさなひとのために [#l0b6c2a0]
-ぶちゃっけ、読者の多くはAT互換機でタイマーとBEEPの設定を...
-IRQ0の割り込み周期変更:
--AL = 0x34; OUT(0x43, AL);
--AL = 割り込み周期の下位8bit; OUT(0x40, AL);
--AL = 割り込み周期の上位8bit; OUT(0x40, AL);
--これでおしまい。
--割り込み周期に0を指定すると65536を指定したとみなされる...
-BEEP音の制御:
--音程操作:
---AL = 0xb6; OUT(0x43, AL);
---AL = 設定値の下位8bit; OUT(0x42, AL);
---AL = 設定値の上位8bit; OUT(0x42, AL);
---設定値0は、65536として扱われる。
---これで発振される音程は、クロック/設定カウント値。つま...
--BEEPのON/OFF:
---これはI/Oポート0x61を使う。
---ON: IN(AL, 0x61); AL |= 0x03; AL &= 0x0f; OUT(0x61, ...
---OFF: IN(AL, 0x61); AL &= 0xd; OUT(0x61, AL);
* 6つのモード [#j135aafe]
* こめんと欄 [#d5d3986f]
-ここにKさんが書いてくださった内容を参考にして[[Mona]]のp...
-少しは役に立ったようでうれしいです。 -- [[K]] SIZE(10){2...
void setTimerInterval(dword ms) {
dword timerCounter = ms * 1193.18;
outportb(0x43, 0x34);
outportb(0x40, timerCounter & 0xff);
outportb(0x40, timerCounter >> 8);
}
-タイマ割込み周期設定関数を作ってみました。引数はmsです。...
-[[Mona]]で上記の関数をテストしましたがきちんと動いている...
-実機でテストしたところカーネルが起動中に止まってしまった...
-確かPC-9801VX辺りのハードウェアマニュアルにもi8254搭載と...
-PC-98の場合、アーキテクチャとして保証されてるのが8253の...
#comment
ページ名: