マイクロコンピュータインターフェースの復習
一、復習方向
二、プログラムクエリ方式の入出力
例題:クエリ方式を使用して、メモリのBUFFERからCRT端末に128バイトを出力する。CRT端末のデータポートアドレスは0008H、ステータスポートアドレスは0020H、D7がステータスビット(0は出力バッファが空)。
MOV BX, OFFSET BUFFER ; バッファの先頭アドレス
MOV CX, 128 ; カウンタに128を設定
LOP: MOV DX, 0020H ; ステータスポートアドレス
IN AL, DX ; ステータス読み込み
AND AL, 10000000B ; D7ビットのみ残す
JNZ LOP ; D7が1なら再試行
MOV AL, [BX] ; データ取得
MOV DX, 0008H ; データポートアドレス
OUT DX, AL ; データ出力
INC BX ; 次のデータへ
LOOP LOP ; 128回繰り返す
HLT ; 終了
三、8259Aの単一チップと多重チップの初期化
初期化にはICW(Initial Command Word)が必要。
単一チップ8259Aの初期化
IBM PCで8259Aを使用し、外部からの8レベルの割込みを受け付ける。I/Oアドレス20Hと21Hに8259Aを配置し、エッジトリガ、バッファ接続、EOIコマンドによる割込み終了、完全ネスト優先順位、割込みタイプ08H〜0FH。
MOV DX, 20H ; 8259Aの初期化アドレス(偶数)
MOV AL, 00010011B ; ICW1: エッジトリガ、ICW4必要
OUT DX, AL
MOV DX, 21H ; 8259Aの初期化アドレス(奇数)
MOV AL, 08H ; ICW2: 中断タイプの上位5ビット
OUT DX, AL
MOV AL, 00001101B ; ICW4: 全ネスト、バッファ主、非自動EOI、8086モード
OUT DX, AL
XOR AL, AL ; OCW1書き込み
OUT DX, AL
STI
多重チップ8259Aの初期化
; 主チップの初期化
INT_A00 EQU 020H ; 8259A主チップ(偶数)
INT_A01 EQU 021H ; 8259A主チップ(奇数)
MOV AL, 00010001B ; ICW1: エッジトリガ、カスケード、ICW4必要
OUT INT_A00, AL
JMP SHORT $+2 ; I/Oポート遅延
MOV AL, 00001000B ; ICW2: 中断番号の上位5ビット
OUT INT_A01, AL
JMP SHORT $+2
MOV AL, 00000100B ; ICW3: IR2に従属チップ接続
OUT INT_A01, AL
JMP SHORT $+2
MOV AL, 00000001B ; ICW4: 全ネスト、非バッファ、非自動EOI、8086モード
OUT INT_A01, AL
; 従属チップの初期化
INT_B00 EQU 0A0H ; 8259A従属チップ(偶数)
INT_B01 EQU 0A1H ; 8259A従属チップ(奇数)
MOV AL, 00010001B ; ICW1: エッジトリガ、カスケード、ICW4必要
OUT INT_B00, AL
JMP SHORT $+2 ; I/Oポート遅延
MOV AL, 10110000B ; ICW2: 中断番号の上位5ビット
OUT INT_B01, AL
JMP SHORT $+2
MOV AL, 00000010B ; ICW3: IR2に従属チップ接続
OUT INT_B01, AL
JMP SHORT $+2
MOV AL, 00000001B ; ICW4: 全ネスト、非バッファ、非自動EOI、8086モード
OUT INT_B01, AL
四、8255Aのモード0とモード1
8255Aの制御ワードとPCポートのセット/リセット制御ワード。
8255Aのモード0の初期化
ORG 100H ; 100Hから開始
MOV DX, 303H ; 8255Aの制御ポートアドレス
MOV AL, 10000001B ; 制御ワード: Aポート出力、Cポート上半分出力、Bポート出力、Cポート下半分入力
OUT DX, AL
MOV AL, 00001111B ; PC7をセット
OUT DX, AL
MOV SI, OFFSET BUF ; バッファの先頭アドレス
MOV CX, 0FFH ; 256バイト出力
L: MOV DX, 302H ; PCポートアドレス
IN AL, DX
AND AL, 00000100B ; BUSY=0?
JNZ L ; バジーなら待機
MOV DX, 300H ; PAポートアドレス
MOV AL, [SI] ; メモリからデータ取得
OUT DX, AL ; PAポートに出力
MOV DX, 303H ; 8255Aの制御ポート
MOV AL, 00001110B ; STB信号をリセット
OUT DX, AL
NOP
NOP
MOV AL, 00001111B ; STB信号をセット
OUT DX, AL
INC SI
DEC CX
JNZ L
MOV AL, 4CH
INT 21H
BUF DB 256 DUP(?)
8255Aのモード1の初期化と応用
甲乙両方のマイクロコンピュータ間で1Kバイトのデータを並列転送。甲側の8255Aはモード1、乙側の8255Aはモード0で動作。
甲側の送信プログラム
MOV DX, 303H ; 8255Aの制御ポート
MOV AL, 10100000B ; 制御ワード: Aポートモード1出力、Cポート上半分出力、Bポートモード0出力、Cポート下半分出力
OUT DX, AL
MOV AL, 00001101B ; PC6をセット
OUT DX, AL
MOV SI, OFFSET BUFS ; 送信データの先頭アドレス
MOV CX, 3FFH ; 1024バイト送信
MOV DX, 300H ; PAポートアドレス
MOV AL, [SI] ; メモリからデータ取得
OUT DX, AL
INC SI
DEC CX
L: MOV DX, 302H ; PCポート
IN AL, DX
AND AL, 00001000B ; INTRA=1?
JZ L ; なければ待機
MOV DX, 300H ; PAポートアドレス
MOV AL, [SI]
OUT DX, AL
INC SI
DEC CX
JNZ L
MOV AH, 4CH
INT 21H
BUFS DB 1024 DUP(?)
乙側の受信プログラム
MOV DX, 303H ; 8255Aの制御ポート
MOV AL, 10101000B ; 制御ワード: Aポートモード1出力、Cポート上半分入力、Bポートモード0出力、Cポート下半分入力
OUT DX, AL
MOV AL, 00000111B ; PC3をセット
OUT DX, AL
MOV DI, OFFSET BUFR ; 受信データの先頭アドレス
MOV CX, 3FFH ; 1024バイト受信
L1: MOV DX, 302H ; PCポート
IN AL, DX
AND AL, 80H ; OBF=0?
JNZ L1 ; なければ待機
MOV DX, 300H ; PAポートアドレス
IN AL, DX
MOV [DI], AL ; メモリに保存
MOV DX, 303H ; 8255Aの制御ポート
MOV AL, 00000110B ; PC3をリセット
OUT DX, AL
NOP
NOP
MOV AL, 00000111B ; PC3をセット
OUT DX, AL
INC DI
DEC CX
JNZ L1
MOV AH, 4CH
INT 21H
BUFR DB 1024 DUP(?)
五、8253タイマーカウンターの応用
原理図とフローチャート
CODE SEGMENT
ASSUME CS:CODE, DS:CODE
ORG 100H
START: JMP BEGIN
LONG1 EQU 6
SHORT EQU 1
BEGIN: MOV AX, CODE
MOV DS, AX
MOV AL, 0B6H
OUT 43H, AL
MOV AX, 5D3H
OUT 42H, AL
MOV AL, AH
OUT 42H, AL
IN AL, 61H
AND AL, 0FCH
OUT 61H, AL
WAIT1: MOV AH, 0BH
INT 21H
CMP AL, 00H
JE WAIT1
LOP: MOV BL, LONG1
CALL SSP
MOV AH, 0BH
INT 21H
CMP AL, 00H
JE CONTINUE1
MOV AH, 08H
INT 21H
CMP AL, 1BH
JE QUIT
CONTINUE1: MOV BL, SHORT
CALL SSP
JMP LOP
QUIT: IN AL, 61H
MOV AH, AL
AND AL, 0FCH
OUT 61H, AL
MOV AL, AH
OUT 61H, AL
MOV AH, 4CH
INT 21H
SSP PROC NEAR
IN AL, 61H
OR AL, 03H
OUT 61H, AL
SUB CX, CX
L: LOOP L
DEC BL
JNZ L
RET
SSP ENDP
CODE ENDS
END START