Вопрос по теме сабжа. Суть проблемы: - у меня есть два компа ( один обычный PC с WinXP, другой ноутбук с MS-DOS), соединенные нуль-модемом. На PC запущена прога-терминал и связана по COM-порту с ноутом. Предварительно, на ноуте запускается прога - инициализации - листинг 1, затем вешается резидент - упрощенный код - на листинге 2 Листинг 1 Код (Text): .model tiny/AT .data .code org 100h start: ; getting address of COM in 'COM_address' mov ax, 40h mov es, ax xor ax, ax ; get real adress of COM port in 'dx', which number ; stored in 'COM_port' var mov di, offset COM_port mov cl, byte ptr ds:[di] dec cl shl cx, 1 mov di, cx mov dx, es:[di] cmp dx, 0h jne $+5 jmp exit_m ; get databits mov di, offset COM_databits mov cl, byte ptr ds:[di] cmp cl, 5 je databits_5 cmp cl, 6 je databits_6 cmp cl, 7 je databits_7 ; default - 8 bits jmp databits_8 databits_5: mov al, 00000000b jmp get_stopbits databits_6: mov al, 00000001b jmp get_stopbits databits_7: mov al, 00000010b jmp get_stopbits databits_8: mov al, 00000011b get_stopbits: ; get stopbits mov di, offset COM_stopbits mov cl, byte ptr ds:[di] cmp cl, 1h jne stopbits_2 stopbits_1: or al, 000b jmp get_parity stopbits_2: or al, 100b get_parity: ; get parity mov di, offset COM_parity mov cl, byte ptr ds:[di] cmp cl, 1 jl parity_none ; if less je parity_even ; if equal jmp parity_odd ; if greater parity_none: or al, 000000b jmp get_next parity_even: or al, 011000b jmp get_next parity_odd: or al, 001000b get_next: ; setting bit 7 in 1, because of baudrate initialization or al, 10000000b ; write settings to LCR registr (base_com_adress + 3): ; - databits ; - stopbits ; - parity ; - enable divizion of frequency ('äåëèòåëü ÷àñòîòû') push dx add dx, 3 out dx, ax pop dx push ax ; scoring baudrate xor ax, ax ; get baudrate mov di, offset COM_baudrate mov cl, byte ptr ds:[di] cmp cl, 0 jne $+8 mov ax, 1040 ; rate = 110 jmp done cmp cl, 1 jne $+8 mov ax, 768 ; rate = 150 jmp done cmp cl, 2 jne $+8 mov ax, 384 ; rate = 300 jmp done cmp cl, 3 jne $+8 mov ax, 192 ; rate = 600 jmp done cmp cl, 4 jne $+8 mov ax, 96 ; rate = 1200 jmp done cmp cl, 5 jne $+8 mov ax, 48 ; rate = 2400 jmp done cmp cl, 6 jne $+8 mov ax, 24 ; rate = 4800 jmp done cmp cl, 7 jne $+8 mov ax, 12 ; rate = 9600 jmp done cmp cl, 8 jne $+8 mov ax, 6 ; rate = 19200 jmp done cmp cl, 9 jne $+8 mov ax, 3 ; rate = 38400 jmp done cmp cl, 0ah jne $+8 mov ax, 2 ; rate = 57600 jmp done cmp cl, 0bh jne $+8 mov ax, 1 ; rate = 115200 ; Writing low and high bytes of 'ax' [baudrate] in 'BASE_COM_ADDRESS' and 'BASE_COM_ADDRESS'+1 done: out dx, al ; dx == 03f8 inc dx ; dx == 03f9 xchg al, ah out dx, al ; Enable interrupt in MCR - 'BASE_COM_ADDRESS+4' ; Initialization of a modem add dx, 3 ; dx == 03fC xor ax, ax in ax, dx ; First, get current port condition or al, 1011b ; Write in MCR bit mask, which enables DTR, RTS è OUT2 out dx, ax sub dx, 3 ; dx == 03f9 pop ax ; Enable interrupt flag in LCR - line processing registr xor al, 10000000b add dx, 2 out dx, ax ; dx == 03fB ; Write in IER a bit mask, which enables all interruptions exclude 'transfer empty registr' xor ax, ax dec dx, 2 mov al, 1101b out dx, al ; Unmask interruptions in interupt controller in al, 21h and al, 11101111b out 21h, al exit_m: int 20h ; default setings for COM-port BASE_BUF_ADDR dw 400h COM_port db 1h COM_baudrate db 6 dup(7) COM_databits db 08h COM_stopbits db 01h ; 0 - 1 ; >0 - 2 COM_parity db 0h ; 0-none, 1-even, 2-odd end start Листинг 2 Код (Text): .model tiny/AT .code org 100h start: jmp init old_int_handler dd 0 new_handler: ; просто пишем в COM1 символ pushf push dx push ax mov dx, 3f8h mov ax, 44h out dx, ax pushf call dword ptr cs:[old_int_handler] pop ax pop dx popf ; окончание прерывания mov al, 20h out 20h, al iret init: ; save native handler of 'x'h interrupt mov ax, 350Ch int 21h mov word ptr cs:[old_int_handler], bx mov word ptr cs:[old_int_handler+2], es ; setting new handler for int 'x'h mov ax, 250Ch mov dx, offset new_handler int 21h mov dx, offset init inc dx int 27h end start Все места, где необходимо разрешить прерывание - 3F9h, 3FCh, и демаскировка порта контроллера вроде сделаны. Подскажите, где может быть косяк.
Здесь скорее всего найдёшь ответы на вопросы: http://www.wasm.ru/forum/viewtopic.php?id=16755 Как вариант, может взять готовый терминал? Благо их _очень_ много написано.