Перехват прерывания RS232 не срабатывает

Тема в разделе "WASM.ASSEMBLER", создана пользователем gahcep, 13 апр 2007.

  1. gahcep

    gahcep New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2007
    Сообщения:
    1
    Вопрос по теме сабжа.
    Суть проблемы:
    - у меня есть два компа ( один обычный PC с WinXP, другой ноутбук с MS-DOS), соединенные нуль-модемом. На PC запущена прога-терминал и связана по COM-порту с ноутом.
    Предварительно, на ноуте запускается прога - инициализации - листинг 1,
    затем вешается резидент - упрощенный код - на листинге 2

    Листинг 1
    Код (Text):
    1.     .model tiny/AT
    2.     .data  
    3.     .code  
    4.     org 100h
    5.  
    6. start:
    7.    
    8.     ; getting address of COM in 'COM_address'
    9.     mov     ax, 40h
    10.     mov     es, ax
    11.     xor ax, ax
    12.    
    13.     ; get real adress of COM port in 'dx', which number
    14.     ; stored in 'COM_port' var
    15.     mov di, offset COM_port
    16.     mov cl, byte ptr ds:[di]
    17.     dec cl
    18.     shl cx, 1
    19.     mov di, cx
    20.     mov     dx, es:[di]
    21.     cmp dx, 0h
    22.     jne $+5
    23.     jmp exit_m
    24.    
    25.     ; get databits
    26.     mov di, offset COM_databits
    27.     mov cl, byte ptr ds:[di]
    28.     cmp cl, 5
    29.     je  databits_5
    30.     cmp cl, 6
    31.     je  databits_6
    32.     cmp cl, 7
    33.     je  databits_7
    34.       ; default - 8 bits
    35.     jmp databits_8
    36.    
    37.    databits_5:
    38.     mov al, 00000000b
    39.     jmp get_stopbits
    40.    databits_6:
    41.     mov al, 00000001b
    42.     jmp get_stopbits
    43.    databits_7:
    44.     mov al, 00000010b
    45.     jmp get_stopbits
    46.    databits_8:
    47.     mov al, 00000011b
    48.    
    49. get_stopbits:  
    50.     ; get stopbits
    51.     mov di, offset COM_stopbits
    52.     mov cl, byte ptr ds:[di]
    53.     cmp cl, 1h
    54.     jne stopbits_2
    55.    stopbits_1:
    56.     or  al, 000b
    57.     jmp get_parity
    58.    stopbits_2:
    59.     or  al, 100b
    60.    
    61. get_parity:
    62.     ; get parity
    63.     mov di, offset COM_parity
    64.     mov cl, byte ptr ds:[di]
    65.     cmp cl, 1
    66.     jl  parity_none     ; if less
    67.     je  parity_even     ; if equal
    68.     jmp parity_odd      ; if greater
    69.    
    70.    parity_none:
    71.     or  al, 000000b
    72.     jmp get_next
    73.    parity_even:
    74.     or  al, 011000b
    75.     jmp get_next
    76.    parity_odd:
    77.     or  al, 001000b
    78.  
    79.  
    80. get_next:      
    81.     ; setting bit 7 in 1, because of baudrate initialization
    82.     or  al, 10000000b
    83.    
    84.     ; write settings to LCR registr (base_com_adress + 3):
    85.     ;   - databits
    86.     ;   - stopbits
    87.     ;   - parity
    88.     ;   - enable divizion of frequency ('äåëèòåëü ÷àñòîòû')
    89.     push    dx
    90.     add dx, 3
    91.     out dx, ax
    92.     pop dx
    93.    
    94.     push    ax
    95.    
    96.     ; scoring baudrate
    97.     xor ax, ax
    98.  
    99.     ; get baudrate
    100.     mov di, offset COM_baudrate
    101.     mov cl, byte ptr ds:[di]
    102.    
    103.     cmp cl, 0  
    104.     jne $+8
    105.     mov ax, 1040    ; rate = 110
    106.     jmp done
    107.    
    108.     cmp cl, 1
    109.     jne $+8
    110.     mov ax, 768 ; rate = 150
    111.     jmp done
    112.    
    113.     cmp cl, 2
    114.     jne $+8
    115.     mov ax, 384 ; rate = 300
    116.     jmp done
    117.    
    118.     cmp cl, 3
    119.     jne $+8
    120.     mov ax, 192 ; rate = 600
    121.     jmp done
    122.    
    123.     cmp cl, 4
    124.     jne $+8
    125.     mov ax, 96      ; rate = 1200
    126.     jmp done
    127.    
    128.     cmp cl, 5
    129.     jne $+8
    130.     mov ax, 48      ; rate = 2400
    131.     jmp done
    132.    
    133.     cmp cl, 6
    134.     jne $+8
    135.     mov ax, 24      ; rate = 4800
    136.     jmp done
    137.    
    138.     cmp cl, 7
    139.     jne $+8
    140.     mov ax, 12      ; rate = 9600
    141.     jmp done
    142.    
    143.     cmp cl, 8
    144.     jne $+8
    145.     mov ax, 6       ; rate = 19200
    146.     jmp done
    147.    
    148.     cmp cl, 9
    149.     jne $+8
    150.     mov ax, 3       ; rate = 38400
    151.     jmp done
    152.  
    153.     cmp cl, 0ah
    154.     jne $+8
    155.     mov ax, 2       ; rate = 57600
    156.     jmp done
    157.    
    158.     cmp cl, 0bh
    159.     jne $+8
    160.     mov ax, 1       ; rate = 115200
    161.    
    162.    
    163.     ; Writing low and high bytes of 'ax' [baudrate]  in 'BASE_COM_ADDRESS' and 'BASE_COM_ADDRESS'+1
    164. done:   out dx, al      ; dx == 03f8
    165.     inc dx      ; dx == 03f9
    166.     xchg    al, ah
    167.     out dx, al
    168.    
    169.            
    170.     ; Enable interrupt in MCR - 'BASE_COM_ADDRESS+4'
    171.     ; Initialization of a modem
    172.     add dx, 3       ; dx == 03fC
    173.     xor ax, ax
    174.     in  ax, dx      ; First, get current port condition
    175.     or  al, 1011b   ; Write in MCR bit mask, which enables DTR, RTS è OUT2
    176.     out dx, ax
    177.     sub dx, 3       ; dx == 03f9
    178.    
    179.     pop ax
    180.     ; Enable interrupt flag in LCR - line processing registr
    181.     xor al, 10000000b
    182.     add dx, 2
    183.     out dx, ax      ; dx == 03fB
    184.  
    185.     ; Write in IER a bit mask, which enables all interruptions exclude 'transfer empty registr'
    186.     xor ax, ax
    187.     dec dx, 2
    188.     mov al, 1101b
    189.     out dx, al
    190.    
    191.     ; Unmask interruptions in interupt controller
    192.     in  al, 21h
    193.     and al, 11101111b
    194.     out 21h, al
    195.    
    196.    
    197. exit_m:
    198.     int 20h
    199.  
    200.     ; default setings for COM-port
    201.     BASE_BUF_ADDR        dw       400h
    202.     COM_port         db       1h
    203.     COM_baudrate           db   6 dup(7)
    204.     COM_databits        db   08h
    205.     COM_stopbits        db   01h     ; 0 - 1 ; >0 - 2
    206.     COM_parity       db       0h     ; 0-none, 1-even, 2-odd
    207.    
    208. end start
    Листинг 2
    Код (Text):
    1.     .model  tiny/AT
    2.        .code
    3.        org  100h
    4. start:
    5.         jmp     init   
    6.    
    7. old_int_handler     dd  0
    8.    
    9. new_handler:       
    10.         ; просто пишем в COM1 символ
    11.         pushf
    12.         push    dx
    13.         push    ax
    14.         mov dx, 3f8h
    15.         mov ax, 44h
    16.         out dx, ax
    17.  
    18.         pushf
    19.         call    dword ptr cs:[old_int_handler]
    20.        
    21.         pop ax
    22.         pop dx
    23.        
    24.         popf
    25.        
    26.                 ; окончание прерывания
    27.         mov   al, 20h
    28.         out   20h, al
    29.  
    30.         iret
    31.        
    32. init:      
    33.         ; save native handler of 'x'h interrupt
    34.         mov ax, 350Ch
    35.         int 21h
    36.        
    37.         mov     word ptr cs:[old_int_handler], bx
    38.         mov     word ptr cs:[old_int_handler+2], es
    39.    
    40.         ; setting new handler for int 'x'h
    41.         mov ax, 250Ch
    42.         mov dx, offset new_handler
    43.         int 21h
    44.        
    45.         mov dx, offset init
    46.         inc dx
    47.         int     27h
    48.  
    49.  
    50. end start
    Все места, где необходимо разрешить прерывание - 3F9h, 3FCh, и демаскировка порта контроллера вроде сделаны. Подскажите, где может быть косяк.
     
  2. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Здесь скорее всего найдёшь ответы на вопросы:
    http://www.wasm.ru/forum/viewtopic.php?id=16755
    Как вариант, может взять готовый терминал? Благо их _очень_ много написано.