Процедура приема:
TCP_Resive proc far TCPRC_Socket = word ptr [bp + 6] TCPRC_AdrBuf = dword ptr [bp + 8] TCPRC_LenBuf = word ptr [bp + 12] TCPRC_AdrRd = dword ptr [bp - 4] TCPRC_LenRd = word ptr [bp - 6] enter 4 + 2, 0 push ds es pushad ; bx cx dx edi esi mov bx, TCPRC_Socket shl bx, 1 mov TCPRC_LenRd, 0 mov dx, cs:TCP_TblReg_SRW_PR[bx] in al, dx push cx mov cx, 5 loop $ pop cx mov dx, cs:TCP_TblReg_RW_PR[bx] in ax, dx xchg ah, al mov si, ax shl esi, 16 add dx, 2 in ax, dx xchg ah, al mov si, ax mov dx, cs:TCP_TblReg_SRR_PR[bx] in al, dx push cx mov cx, 5 loop $ pop cx mov dx, cs:TCP_TblReg_RR_PR[bx] in ax, dx xchg ah, al mov di, ax shl edi, 16 add dx, 2 in ax, dx xchg ah, al mov di, ax mov ss:[110h], esi mov ss:[114h], edi mov TCPRC_AdrRd, edi cmp esi, edi jae TRc_Sub add edi, 800h ; 2Ÿ sub edi, esi mov esi, edi jmp TRc_Read TRc_Sub: sub esi, edi TRc_Read: or si, si jz TCPRC_Ret cmp si, TCPRC_LenBuf jb TCPRC_Ret mov cx, si mov TCPRC_LenRd, si les di, TCPRC_AdrBuf mov ax, word ptr TCPRC_AdrRd TRc_Rd: mov dx, ax and dx, 07FFh add dx, cs:TCP_TblReg_RcBufAdr[bx] insb inc ax loop TRc_Rd add esi, TCPRC_AdrRd mov ax, si xchg ah, al mov dx, cs:TCP_TblReg_RR_PR[bx] add dx, 2 out dx, ax shr esi, 16 mov ax, si xchg ah, al sub dx, 2 out dx, ax TCPRC_Ret: popad mov ax, TCPRC_LenRd ;pop esi edi dx cx bx pop es ds leave ret 2 + 4 + 2 TCP_Resive endp
В обработке прерывания стоит вызов функции которая принимает сообщение и транслиркет его обратно.
Используя утилиту AX1 тесирую прием и передачу. При включении второго канала начинаются траблы.
|