シリアルチップ(8250,16650A)制御テクニック

★初期化プログラム例★


以下に,COM1の初期かを行なうプログラム例を示します. なお,cs:[irq]には,IRQ番号が入っているものとします.

ここでは,シリアルLSIだけでなく,割り込み制御LSIの設定も行なっています. このプログラムは,私が公開しているフリーウエアで実際に使っているものの一部です. 従って,説明のない変数が出てきたりしますが, だいたいのながれはわかると思います.さらに詳細を知りたいというのであれば, 私の公開しているフリーウエアをダウンロードして,ソースを参照して下さい.

また,FIFOの有無の確認部分に関しての詳細は, FIFO有無の判断を御覧下さい.


		mov	dx,3f8h
                add     dx,1                            ;8250割り込み禁止
                mov     al,0
                out     dx,al

                add     dx,1
                mov     al,0
                out     dx,al
                mov     al,11000001b			;16550Aかチェック
                out     dx,al
                in      al,dx
                and     al,11000000b
                cmp     al,11000000b
                mov     ah,0
                jnz     no_fifo
                mov     al,10000001b                    ;FIFOイネーブル
                out     dx,al
                mov     ah,1
no_fifo:        

fifoset_end:    add     dx,1
                mov     al,80h
                out     dx,al                           ;通信速度設定モード

                sub     dx,3                            ;通信速度設定
                mov     ax,ds:[di]
                out     dx,al
                add     dx,1
                mov     al,ah
                out     dx,al

                mov     al,ds:[di+2]                    ;8250パラメータセット
                and     al,7fh
                add     dx,2
                out     dx,al

                mov     al,byte ptr cs:[irq]            ;IRQに従いベクタ取得
                cmp     al,08h
                jnc     slave_set
                add     al,08h
                jmp     vec_save
slave_set:      add     al,68h
vec_save:       mov     ah,35h                          ;指定した割り込みベクタ
                mov     si,bx                           ;の保存
                push    bx
                sal     si,2
                int     21h
                mov     word ptr cs:[oldint_ch1],bx
                mov     word ptr cs:[oldint_ch1+2],es
                pop     bx

                mov     ah,25h                          ;新たな割り込み
                push    ds				;ベクタ設定
                push    cs
                pop     ds
                mov     dx,offset com_int1
                cmp     bx,0
                jz      int_ok
                mov     dx,offset com_int2
                cmp     bx,1
                jz      int_ok
                mov     dx,offset com_int3
                cmp     bx,2
                jz      int_ok
                mov     dx,offset com_int4
                cmp     bx,3
                jz      int_ok
int_ok:         int     21h
                pop     ds

                cli

                mov     si,bx
                mov     cl,byte ptr cs:[irq]            ;8259A 割り込みマスク
                cmp     cl,08h                          ;解除
                jnc     slav
                mov     si,bx
                mov     byte ptr cs:[si+slave1],0
                mov     ch,01h                          ;IRQがマスタ
                sal     ch,cl
                xor     ch,0ffh
                in      al,21h
                and     al,ch
                jmp     $+2
                out     21h,al
                jmp     mask_c

slav:           mov     si,bx                           ;IRQがスレーブ
                mov     byte ptr cs:[si+slave1],1
                sub     cl,08h
                mov     ch,01h
                sal     ch,cl
                xor     ch,0ffh
                in      al,21h
                jmp     $+2
                jmp     $+2
                jmp     $+2
                jmp     $+2
                and     al,0dfh
                out     21h,al
                in      al,0a1h
                jmp     $+2
                jmp     $+2
                jmp     $+2
                jmp     $+2
                and     al,ch
                out     0a1h,al

mask_c:
                sti

                mov     ah,cs:[lowlevel_bit1+si]
                sal     si,1                            ;8250受信割り込みマスク
                mov     dx,cs:[address1+si]             ;解除
                add     dx,1
                mov     al,1
                out     dx,al


junichi@astec.co.jp