; receiver.asm .MODEL SMALL,C JUMPS INCLUDE snoop.inc PUBLIC receiver EXTRN discarded_pkts:DWORD EXTRN receive_buffer:DWORD EXTRN receiver_busy:BYTE .CODE receiver PROC FAR USES ax,dx,ds mov dx,@DATA mov ds,dx mov dx,BUSY les di,DWORD PTR [cs:receive_buffer] ; check current buffer to see if it's cmp [es:di.pktsize_flag],dx ; currently being displayed jge discard_packet mov dl,BUSY xchg [cs:receiver_busy],dl cmp dl,BUSY ; check flag je second_call first_call: cmp al, FIRST_REQ ; check flag: if ; FIRST_REQ then fill jne discard_packet ; a buffer, otherwise ; display one les di, DWORD PTR [es:di.buffer] jmp exit second_call: cmp al, SECOND_REQ jne discard_packet ; mov dl, BUSY mov [es:di.pktsize_flag], cx les di, DWORD PTR [es:di.next] ; point to next buffer in queue mov WORD PTR [cs:receive_buffer], di mov di, es mov WORD PTR [cs:receive_buffer+2], di mov dl, IDLE ; make receiver_busy = IDLE mov [cs:receiver_busy], dl jmp short exit discard_packet: mov dx, WORD PTR [cs:discarded_pkts] add dx,1 mov WORD PTR [cs:discarded_pkts], dx mov dx, WORD PTR [cs:discarded_pkts+2] adc dx,1 mov WORD PTR [cs:discarded_pkts+2], dx mov di, 0H mov es, di exit: ret ENDP END