NETWORK - PKTD11B.ZIP - IO8.ASM

 
Output of file : IO8.ASM contained in archive : PKTD11B.ZIP

;put into the public domain by Russell Nelson, [email protected]

;input a word from IO port
inw macro
in al, dx ;read low address byte
mov ah, al ;save byte
in al,61h ;wait a bit.
inc dx ;next IO address
in al, dx ;read high address byte
xchg ah, al ;swap bytes
dec dx ;restore IO address
endm

;write a word to an IO port
outw macro
out dx, al ;write low address byte
push ax ;wait a little bit.
in al,61h
pop ax
xchg ah, al ;get next byte
inc dx ;next IO address
out dx, al ;write high address byte
xchg ah, al ;restore AX
dec dx ;restore DX
endm

;this code is exactly like the "rep insb" instruction. It works even if
;you've got an 8088.

extrn is_186: byte ;=0 if 808[68], =1 if 80[123]86.

repinsb:
cmp is_186,0 ; Can we use rep insb?
je repinsb_1 ; no - have to do it slowly.
.286
rep insb
.8086
jmp short icnteven
repinsb_1:
; If buffer doesn't begin on a word boundary, get the first byte
test di,1 ; if(buf & 1){
jz ibufeven ;
in al,dx ; al = in(dx);
stosb ; *di++ = al
dec cx ; cx--;
ibufeven:
shr cx,1 ; cx = cnt >> 1; (convert to word count)
; Do the bulk of the buffer, a word at a time
jcxz inobuf ; if(cx != 0){
rb: in al,dx ; do { al = in(dx);
mov ah,al
in al,dx ; ah = in(dx);
xchg al,ah
stosw ; *si++ = ax; (di is word pointer)
loop rb ; } while(--cx != 0);
; now check for odd trailing byte
inobuf:
jnc icnteven
in al,dx
stosb ; *di++ = al
icnteven:
ret


;this code is exactly like the "rep outsb" instruction. It works even if
;you've got an 8088.

repoutsb:
cmp is_186,0 ; Can we use rep outsb?
je out86 ; no - have to do it slowly.
.286
rep outsb
.8086
jmp short ocnteven
out86:
test si,1 ; (buf & 1) ?
jz obufeven ; no
lodsb ; al = *si++;
out dx,al ; out(dx,al);
dec cx ; cx--;
obufeven:
shr cx,1 ; cx = cnt >> 1; (convert to word count)
; Do the bulk of the buffer, a word at a time
jcxz onobuf ; if(cx != 0){
xb: lodsw ; do { ax = *si++; (si is word pointer)
out dx,al ; out(dx,lowbyte(ax));
mov al,ah
out dx,al ; out(dx,hibyte(ax));
loop xb ; } while(--cx != 0); }
; now check for odd trailing byte
onobuf:
jnc ocnteven
lodsb ; out(dx,*si++);
out dx,al
ocnteven:
ret