ここでは,シリアル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