; ディスクの直接操作関数

CGROUP	group	TEXT

TEXT	CSEG

;
;rdabssec(void far *buf, unsigned long sector, int drive)
;
;BXAX==buf, DXCX==sector,[BP+4]==drive
;
;リターン値の上位8ビットがCF、下位8ビットがALの値

rdabssec_::

	push	BP
	mov	BP,SP
	push	DS
	push	CX
	push	DX
	push	SI
	push	DI

	cmp	[_osmajor_##].B,4
	jc	rdabs_16bit

rdabs_32bit:
	sub	SP,10
	mov	ES,BX
	mov	BX,SP
	mov	SS:[BX],CX
	mov	SS:[BX+2],DX
	mov	SS:[BX+4].W,1
	mov	SS:[BX+6],AX
	mov	SS:[BX+8],ES
	mov	AX,SS
	mov	DS,AX

	mov	AL,[BP+4]
	mov	CX,-1
	int	25h
	add	SP,12

	jmp	rdabs_endop

rdabs_16bit:
	mov	DS,BX
	mov	BX,AX
	mov	DX,CX
	mov	CX,1
	mov	AL,[BP+4]
	int	25h
	pop	CX

rdabs_endop:
	pop	DI
	pop	SI
	pop	DX
	pop	CX
	pop	DS
	pop	BP

	sbb	AH,AH

	ret

;
;wrabssec(void far *buf, unsigned long sector, int drive)
;
;BXAX==buf, DXCX==sector,[BP+4]==drive
;
;リターン値の上位8ビットがCF、下位8ビットがALの値

wrabssec_::

	push	BP
	mov	BP,SP
	push	DS
	push	CX
	push	DX
	push	SI
	push	DI

	cmp	[_osmajor_].B,4
	jc	wrabs_16bit

wrabs_32bit:
	sub	SP,10
	mov	ES,BX
	mov	BX,SP
	mov	SS:[BX],CX
	mov	SS:[BX+2],DX
	mov	SS:[BX+4].W,1
	mov	SS:[BX+6],AX
	mov	SS:[BX+8],ES
	mov	AX,SS
	mov	DS,AX

	mov	AL,[BP+4]
	mov	CX,-1
	int	26h
	add	SP,12

	jmp	wrabs_endop

wrabs_16bit:
	mov	DS,BX
	mov	BX,AX
	mov	DX,CX
	mov	CX,1
	mov	AL,[BP+4]
	int	26h
	pop	CX

wrabs_endop:
	pop	DI
	pop	SI
	pop	DX
	pop	CX
	pop	DS
	pop	BP

	sbb	AH,AH

	ret
