git @ Cat's Eye Technologies BefOS / master src / kernel / disk.s
master

Tree @master (Download .tar.gz)

disk.s @masterraw · history · blame

;--- BEGIN ---------------------------------------------------;

;--- DATA ----------------------------------------------------;

SEGMENT	.data

diskno:		dw 0000h	; current disk number
sectrk:		dw 18		; sectors per track
bytesec: 	dw 512		; bytes per sector
numhead:	dw 2		; number of heads

;--- CODE ----------------------------------------------------;

SEGMENT	.text

NextDisk:	call	NotInEditMode
		inc	word [diskno]
		cmp	[diskno], word 2	; 2 devices?!?
		jne	.Return
		mov	[diskno], word 0
.Return:	jmp	LoadPage


PrevDisk:	call	NotInEditMode
		dec	word [diskno]
		cmp	[diskno], word 0ffffh
		jne	.Return
		mov	[diskno], word 1
.Return:	jmp	LoadPage



DiskInfo:	mov	ah, 15h
		mov	bx, [bufptr]
		mov	dl, [cbuffer + bx]
		int	13h		; DISK - GET DISK TYPE
		jc	.Error

		push	cx
		push	dx

		mov	ah, 5fh
		pop	bx
		mov	di, 124
		call	DisplayShort
		pop	bx
		call	DisplayShort

		jmp	OKLight

.Error:		jmp	BadLight


		;;--------------------------------------------;
		;; Read a page (four contiguous sectors) from
		;; the current disk (actually disk #0 for now.)
		;; ax: page number -> number of errors
		;; bx: address of 2048-byte buffer -> GARBAGE
		;; cx: * -> GARBAGE
		;; dx: * -> GARBAGE
		;; di: * -> DESTROYED
		;; TODO: DISALLOW ACCESS OUTSIDE BOUNDS OF DISK
ReadPage:	push	es
		mov	cx, ds
		mov	es, cx
		shl	ax, 1
		shl	ax, 1

.Begin:		xor	dx, dx		; Zero high
		div	word [sectrk]	; Calculate track
		mov	cl, dl		; CL = sector
		inc	cl
		xor	dx, dx		; Zero high
		div	word [numhead]	; Compute head
		mov	ch, al		; CH = cylinder
		mov	dh, dl		; DH = head
		xor	dl, dl		; DL = drive 0
		mov	di, 3		; Try three times

.Read1:		mov	ax, 0204h	; Read 4 sectors
		int	13h		; Call BIOS
                jnc     .Read2		; Success
		dec	di		; Reduce count
                jnz     .Read1		; Keep trying
		mov	ax, 1		; DISK ERROR
		jmp	.Exit

.Read2:		xor	ax, ax		; Zero return
.Exit:		pop	es
		ret


		;;--------------------------------------------;
		;; Write a page (four contiguous sectors) to
		;; the current disk (actually disk #0 for now.)
		;; ax: page number -> number of errors
		;; bx: address of 2048-byte buffer -> GARBAGE
		;; cx: * -> GARBAGE
		;; dx: * -> GARBAGE
		;; di: * -> DESTROYED
		;; TODO: DISALLOW ACCESS OUTSIDE BOUNDS OF DISK

WritePage:	push	es
		mov	cx, ds
		mov	es, cx
		shl	ax, 1
		shl	ax, 1

.Begin:		xor	dx, dx		; Zero high
		div	word [sectrk]	; Calculate track
		mov	cl, dl		; CL = sector
		inc	cl		; 1-
		xor	dx, dx		; Zero high
		div	word [numhead]	; Compute head
		mov	ch, al		; CH = cylinder
		mov	dh, dl		; DH = head
		xor	dl, dl		; DL = drive #0
		mov	di, 3		; Try three times

.Write1:	mov	ax, 0304h	; Write 4 sectors
		int	13h		; Call BIOS
                jnc     .Write2		; Success
		dec	di		; Reduce count
                jnz     .Write1		; Keep trying
		mov	ax, 1		; DISK ERROR
		jmp	.Exit

.Write2:	xor	ax, ax		; Zero return
.Exit:		pop	es
		ret

;--- END -----------------------------------------------------;