サウンドブラスターのMIDIポートを98モードでMPU互換ポートとして使うドライバです. IOポートの0330h,0331h <-> 0e0d0,0e0d2 での変換と割り込みのIRQ5 <-> INT2での 変換をしています. .386 code segment use16 assume cs:code, ds:data db '26SOUNDI' dw code,00bah dw data,00b2h dw 0002h start: pushad mov bp,sp push ds push es mov ax,data mov ds,ax mov es,ax mov esi,large offset L2 mov dx,ds mov ax,0010h call FCP mov ax,[small E2] or ax,ax jne ERL1 mov esi,large offset L4 mov dx,ds mov ax,0010h call FCP mov ax,[small E4] or ax,ax jne ERL1 in al,21h and al,11011111b ;IRQ5 enable call IWAIT out 21h,al xor ax,ax jmp ERL2 ERL1: mov ax,0ffffh ERL2: mov [bp+1ch],ax pop es pop ds popad retf FCP: db 9ah dw 0000h dw 0010h ret IWAIT: push ax push cx mov cx,0002h LLP1: in al,61h test al,01h loop LLP1 pop cx pop ax ret MPUI: pushad mov bp,sp push ds push es mov ax,data mov ds,ax mov es,ax mov al,0eh ;I vector Int2(98) db 0ffh db 1eh dw MPUINT mov al,20h out 20h,al xor ax,ax mov [bp+1ch],ax pop es pop ds popad retf voutp: push ds test byte ptr[bp+25h],10h je voutp3 test byte ptr[bp+25h],08h je voutp1 std jmp voutp2 voutp1: cld voutp2: mov ecx,[bp+2eh] mov esi,[bp+28h] mov ds,[bp+2ch] rep lodsb jmp voutp4 voutp3: mov al,[bp+28h] voutp4: pop ds ret vinp: push es test byte ptr[bp+25h],10h je vinp3 test byte ptr[bp+25h],08h je vinp1 std jmp vinp2 vinp1: cld vinp2: mov ecx,[bp+2eh] mov edi,[bp+28h] mov es,[bp+2ch] rep stosb jmp vinp4 vinp3: mov [bp+1ch],al vinp4: pop es ret mpudt: pushad mov bp,sp push ds push es mov ax,data mov ds,ax mov es,ax mov dx,0330h test byte ptr[bp+25h],04h je mio_1 call voutp out dx,al jmp mio_2 mio_1: in al,dx test byte ptr[uartmod],0ffh jne mio_01 test byte ptr[mpusf],80h jne mio_01 mov byte ptr[mpusf],0ffh ; mov al,0ffh mio_01: call vinp mio_2: pop es pop ds popad retf mpust: pushad mov bp,sp push ds push es mov ax,data mov ds,ax mov es,ax mov dx,0331h test byte ptr[bp+25h],04h je mio_11 call voutp mov byte ptr[mpusf],0ffh cmp al,0ffh jne mio_21 mov byte ptr[uartmod],0 jmp mio_23 mio_21: cmp al,3fh jne mio_22 mov byte ptr[uartmod],0ffh jmp mio_23 mio_22: mov byte ptr[mpusf],7fh mio_23: out dx,al jmp mio_12 mio_11: in al,dx test byte ptr[uartmod],0ffh jne mio_25 and al,byte ptr[mpusf] mio_25: call vinp mio_12: pop es pop ds popad retf ends data segment L2 db 'DISPATCH' E2 dw 0000h db 03h ;dispatch number db 00h db 00h db 00h ;kind = IO dw 0e0d0h ;IO PORT Adr (98) dw 0000h db 00h dw mpudt dw code db 00h ;kind = IO dw 0e0d2h ;IO PORT Adr (98) dw 0000h db 00h dw mpust dw code db 03h ;kind = IR db 0dh ;I vector IRQ05 (AT) dw MPUI dw code db 0ffh ;kind = Termination L4 db 'PIC_FUNC' E4 dw 0000h dw 0000h db 0Eh ;I vector Int2(98) MPUINT dw 0000h dw 0000h uartmod db 0 mpusf db 0ffh ends end start