mirror of
				https://github.com/FDOS/kernel.git
				synced 2025-11-04 13:14:46 +01:00 
			
		
		
		
	git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/branches/UNSTABLE@988 6ac86273-5f31-0410-b378-82cca8765d1b
		
			
				
	
	
		
			216 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
			
		
		
	
	
			216 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
;
 | 
						|
; File:
 | 
						|
;                         floppy.asm
 | 
						|
; Description:
 | 
						|
;                   floppy disk driver primitives
 | 
						|
;
 | 
						|
;                       Copyright (c) 1995
 | 
						|
;                       Pasquale J. Villani
 | 
						|
;                       All Rights Reserved
 | 
						|
;
 | 
						|
; This file is part of DOS-C.
 | 
						|
;
 | 
						|
; DOS-C is free software; you can redistribute it and/or
 | 
						|
; modify it under the terms of the GNU General Public License
 | 
						|
; as published by the Free Software Foundation; either version
 | 
						|
; 2, or (at your option) any later version.
 | 
						|
;
 | 
						|
; DOS-C is distributed in the hope that it will be useful, but
 | 
						|
; WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
 | 
						|
; the GNU General Public License for more details.
 | 
						|
;
 | 
						|
; You should have received a copy of the GNU General Public
 | 
						|
; License along with DOS-C; see the file COPYING.  If not,
 | 
						|
; write to the Free Software Foundation, 675 Mass Ave,
 | 
						|
; Cambridge, MA 02139, USA.
 | 
						|
;
 | 
						|
; $Id$
 | 
						|
;
 | 
						|
 | 
						|
%include "../kernel/segs.inc"
 | 
						|
segment HMA_TEXT
 | 
						|
 | 
						|
;
 | 
						|
; int ASMPASCAL fl_reset(UBYTE drive);
 | 
						|
;
 | 
						|
; Reset both the diskette and hard disk system.
 | 
						|
; returns TRUE if successful.
 | 
						|
;
 | 
						|
 | 
						|
		global	FL_RESET
 | 
						|
FL_RESET:
 | 
						|
		pop	ax		; return address
 | 
						|
		pop	dx		; drive
 | 
						|
		push	ax		; restore address
 | 
						|
		mov	ah,0		; reset disk
 | 
						|
		int	13h
 | 
						|
		sbb	ax,ax		; CF=1: error
 | 
						|
		inc	ax		; ...return TRUE (1) on success,
 | 
						|
		ret			;  FALSE (0) on error
 | 
						|
 | 
						|
;
 | 
						|
; int ASMPASCAL fl_diskchanged(UBYTE drive);
 | 
						|
;
 | 
						|
; Read disk change line status.
 | 
						|
; returns 1 if disk has changed, 0 if not, 0xFF if error.
 | 
						|
;
 | 
						|
 | 
						|
		global	FL_DISKCHANGED
 | 
						|
FL_DISKCHANGED:
 | 
						|
		pop	ax		; return address
 | 
						|
		pop	dx		; drive
 | 
						|
		push	ax		; restore stack
 | 
						|
 | 
						|
		push	si
 | 
						|
		mov	ah,16h		; read change status type
 | 
						|
		xor	si,si		; RBIL: avoid crash on AT&T 6300
 | 
						|
		int	13h
 | 
						|
		pop	si
 | 
						|
 | 
						|
		sbb	al,al		; CF=0 (disk has not changed)
 | 
						|
		jnc	ret_AH_0	; ...return 0
 | 
						|
		cmp	ah,6		; ah!=6 (error)
 | 
						|
		jne	ret_AH_0	; ...return 0xFF
 | 
						|
		mov	al,1		; ah=6 (disk has changed)
 | 
						|
		jmp	short ret_AH_0	; ...return 1
 | 
						|
 | 
						|
;
 | 
						|
; int ASMPASCAL fl_read  (UBYTE drive, WORD head, WORD track, WORD sector, WORD count, void FAR *buffer);
 | 
						|
; int ASMPASCAL fl_write (UBYTE drive, WORD head, WORD track, WORD sector, WORD count, void FAR *buffer);
 | 
						|
; int ASMPASCAL fl_verify(UBYTE drive, WORD head, WORD track, WORD sector, WORD count, void FAR *buffer);
 | 
						|
; int ASMPASCAL fl_format(UBYTE drive, WORD head, WORD track, WORD sector, WORD count, void FAR *buffer);
 | 
						|
;
 | 
						|
 | 
						|
; Format tracks (sector should be 0).
 | 
						|
 | 
						|
		global	FL_FORMAT
 | 
						|
FL_FORMAT:
 | 
						|
		mov	ah,5		; format track
 | 
						|
		jmp	short fl_common
 | 
						|
 | 
						|
		global	FL_VERIFY
 | 
						|
FL_VERIFY:
 | 
						|
		mov	ah,4		; verify sector(s)
 | 
						|
		jmp	short fl_common
 | 
						|
 | 
						|
		global	FL_READ
 | 
						|
FL_READ:
 | 
						|
		mov	ah,2		; read sector(s)
 | 
						|
		jmp	short fl_common
 | 
						|
 | 
						|
		global	FL_WRITE
 | 
						|
FL_WRITE:
 | 
						|
		mov	ah,3		; write sector(s)
 | 
						|
 | 
						|
fl_common:
 | 
						|
		push	bp
 | 
						|
		mov	bp,sp
 | 
						|
 | 
						|
		mov	cx,[bp+12]	; cylinder number
 | 
						|
		mov	al,1		; error code
 | 
						|
		cmp	ch,3
 | 
						|
		ja	fl_error	; can't write above 3FFh=1023
 | 
						|
 | 
						|
		xchg	ch,cl		; ch=low 8 bits of cylinder number
 | 
						|
		mov	dh,[bp+14]	; head number
 | 
						|
		ror	cl,1		; bits 8-9 of cylinder number...
 | 
						|
		 ror	cl,1		; ...to bits 6-7 in CL
 | 
						|
		or	cl,[bp+10]	; sector number (bits 0-5)
 | 
						|
 | 
						|
		mov	al,[bp+8]	; number of sectors
 | 
						|
		les	bx,[bp+4]	; 32-bit buffer ptr
 | 
						|
		mov	dl,[bp+16]	; drive (if or'ed 80h its hard drive)
 | 
						|
		int	13h		; process sectors
 | 
						|
 | 
						|
		sbb	al,al		; carry: al=ff, else al=0
 | 
						|
		and	al,ah		; carry: error code, else 0
 | 
						|
fl_error:
 | 
						|
		mov	ah,0
 | 
						|
		pop	bp
 | 
						|
		ret	14
 | 
						|
 | 
						|
;
 | 
						|
; int ASMPASCAL fl_lba_ReadWrite(UBYTE drive, WORD mode, void FAR * dap);
 | 
						|
;
 | 
						|
; Returns 0 if successful, error code otherwise.
 | 
						|
;
 | 
						|
 | 
						|
		global	FL_LBA_READWRITE
 | 
						|
FL_LBA_READWRITE:
 | 
						|
		push	bp
 | 
						|
		mov	bp,sp
 | 
						|
		push	si
 | 
						|
		push	ds
 | 
						|
		mov	dl,[bp+10]	; drive (if or'ed 80h its hard drive)
 | 
						|
		mov	ax,[bp+8]	; command
 | 
						|
		lds	si,[bp+4]	; far dap pointer
 | 
						|
		int	13h		; process sectors
 | 
						|
		pop	ds
 | 
						|
		pop	si
 | 
						|
		pop	bp
 | 
						|
		mov	al,ah		; place error code into al
 | 
						|
		mov	ah,0
 | 
						|
		ret	8
 | 
						|
 | 
						|
;
 | 
						|
; void ASMPASCAL fl_readkey (void);
 | 
						|
;
 | 
						|
 | 
						|
		global	FL_READKEY
 | 
						|
FL_READKEY:
 | 
						|
		mov	ah,0
 | 
						|
		int	16h
 | 
						|
		ret
 | 
						|
 | 
						|
;
 | 
						|
; int ASMPASCAL fl_setdisktype (UBYTE drive, WORD type);
 | 
						|
;
 | 
						|
 | 
						|
		global	FL_SETDISKTYPE
 | 
						|
FL_SETDISKTYPE:
 | 
						|
		pop	bx		; return address
 | 
						|
		pop	ax		; disk type
 | 
						|
		pop	dx		; drive
 | 
						|
		push	bx		; restore stack
 | 
						|
		mov	ah,17h		; set disk type for format
 | 
						|
		int	13h
 | 
						|
ret_AH:
 | 
						|
		mov	al,ah		; place error code into al
 | 
						|
ret_AH_0:
 | 
						|
		mov	ah,0
 | 
						|
		ret
 | 
						|
 | 
						|
;
 | 
						|
; int ASMPASCAL fl_setmediatype (UBYTE drive, WORD tracks, WORD sectors);
 | 
						|
;
 | 
						|
 | 
						|
		global	FL_SETMEDIATYPE
 | 
						|
FL_SETMEDIATYPE:
 | 
						|
		pop	ax		; return address
 | 
						|
		pop	bx		; sectors/track
 | 
						|
		pop	cx		; number of tracks
 | 
						|
		pop	dx		; drive
 | 
						|
		push	ax		; restore stack
 | 
						|
		push	di
 | 
						|
 | 
						|
		dec	cx		; last cylinder number
 | 
						|
		xchg	ch,cl		; CH=low 8 bits of last cyl number
 | 
						|
		ror	cl,1		; bits 8-9 of cylinder number...
 | 
						|
		 ror	cl,1		; ...to bits 6-7 in CL
 | 
						|
		or	cl,bl		; sectors/track (bits 0-5)
 | 
						|
		mov	ah,18h		; set media type for format
 | 
						|
		int	13h
 | 
						|
		jc	skipint1e
 | 
						|
 | 
						|
		push	es
 | 
						|
		xor	dx,dx
 | 
						|
		mov	es,dx
 | 
						|
		cli
 | 
						|
		mov	[es:0x1e*4],di
 | 
						|
		pop	word [es:0x1e*4+2] ; set int 0x1e table to es:di
 | 
						|
		sti
 | 
						|
skipint1e:
 | 
						|
		pop	di
 | 
						|
		jmp	short ret_AH
 |