Minix1.1/usr/src/tools/C86/diskio.asm

Title diskio  -  absolute disk read & write for MS-DOS
page,132
;
;	   int absread (disk,sector,&buffer)
;	   int disk, sector;
;	   char *buffer[PH_SECTSIZE];
;	and
;	   int abswrite (disk,sector,buffer)
;	   int disk, sector;
;	   char *buffer[PH_SECTSIZE];


INCLUDE \lib\C86\prologue.h
PUBLIC	absread, abswrite, dmaoverr


disk	equ	[bp+4]
sector	equ	[bp+6]
buffer	equ	[bp+8]


@CODE 	SEGMENT
	assume cs:@code,ds:dgroup

; These are the routines that do the DOS-interrupts; you can use
; them for any disk-drive in the system.
;
absread	PROC	NEAR
	push	bp
	mov	bp,sp

	mov	ax,disk
	mov	bx,buffer
	mov	cx,1
	mov	dx,sector

	int	25h		; abs disk-read

	jnc	rd_ok		; carry ===> error in al
	xor	ah,ah		; zero upper half
	inc	al		; code 0 means something too
	jmp	end_rd

rd_ok:	xor	ax,ax		; no error

end_rd: popf			; flags pushed by int
	pop	bp
	ret
absread	ENDP



abswrite PROC NEAR
	push	bp
	mov	bp,sp

	mov	ax,disk
	mov	bx,buffer
	mov	cx,1
	mov	dx,sector

	int	26h		; abs disk-write

	jnc	wr_ok
	xor	ah,ah
	inc	al
	jmp	end_wr

wr_ok:	xor	ax,ax

end_wr:	popf
	pop	bp
	ret

abswrite ENDP


dmaoverr PROC NEAR		; dummy routine
	 xor	ax,ax
         ret
dmaoverr ENDP

@CODE	ENDS

	END	; end of assembly file