	title 'lader-bios harddisk fuer	prof-80' 
   
;       --              CP/M 3.0            --
;       ______________________________________
   
;       Autor Wilfried Schmitten, Heidebloeck 16, 2000 Hamburg 74
   
;       letzte Aenderung   1.3.88   Aenderung der HD-Organisation
;	Command geaendert			11.2.89 Wilfried
		    
	maclib	z80	 
	maclib	cpm3
	maclib	cdef 
	maclib	syspage 
   
   
;       BIOS Jump Vektor
   
		jmp	boot 
		jmp	wboot 
		jmp	const 
		jmp	conin 
		jmp	conout 
		jmp	list 
		jmp	auxout 
		jmp	auxin 
		jmp	home 
		jmp	seldsk 
		jmp	settrk 
		jmp	setsec 
		jmp	setdma 
		jmp	read 
		jmp	write 
		jmp	listst 
		jmp	sectrn 
		jmp	conost 
		jmp	auxist 
		jmp	auxost 
		jmp	devtbl 
		jmp	?cinit 
		jmp	getdrv 
		jmp	multio 
		jmp	flush 
		jmp	?move 
		jmp	?time 
		jmp	bnksel 
		jmp	setbnk 
		jmp	?xmove 
		jmp	0 
		jmp	0 
		jmp	0 
   
		dw	0 
		dw	hd$read 
		dw	hdlogin	
		dw	hdinit0	
		db	0,0 
hdsd0:		dw	0		;noskew
		db	0,0,0,0,0,0,0,0,0	;BDOS scratch
		db	0		;media flag
		dw	hddpb0 
		dw	0		;not removeable
		dw	alv		;alloc vector
		dw	dirbcb 
		dw	dtabcb 
		dw	0 
		db	0 
   
   
   
dirbcb:		db	0ffh	;drv
		db	0,0,0	;rec#
		db	0	;wflg
		db	0 
		dw	0	;track
		dw	0	;sector
		dw	dirpuffer	;pufferadresse
		 
   
dtabcb:		db	0ffh	;drv
		db	0,0,0	;rec#
		db	0	;wflag
		db	0	;scratchbyte
		dw	0	;track
		dw	0	;sector
		dw	dtapuffer 

hddpb0:		dpb	sector$size,sector$nmb*hd$head,cylnum,2048,1024,1,8000h

   
;       Boot entry
;       Initialisiere Hardware fuer Charakter out zur Grip
;       und Harddisk Read
   
boot:	
		mvi	c,'L'-'@' 
		call	gripout	
		call	hdinit0	
		ret				
   
wboot:		ret  
   
const:		ret  
   
conin:		ret  
   
conout:		jmp	gripout	
   
list:		ret  
   
auxout:		ret  
   
auxin:		ret  
   
home:		ret

seldsk:		lxi	h,hdsd0	
		ret  
   
settrk:		sbcd	@trk 
		ret  
   
setsec:		sbcd	@sect 
		ret  
   
setdma:		sbcd	@dma 
		ret  
   
read:		jmp	hdread 
   
write:		ret  
   
listst:		ret  
   
sectrn:		mov	l,c 
		mov	h,b 
		ret  
conost:		ret  
   
auxist:		ret  
   
auxost:		ret  
   
devtbl:		ret  
   
?cinit:		ret  
   
getdrv:		ret  
   
multio:		ret  
   
flush:		ret  
   
?move:		xchg	 
		ldir  
		xchg	 
		ret  
   
?time:		ret  
   
bnksel:		ret  
   
setbnk:		ret  
   
?xmove:		ret  
   
   
gripout:	in	gripc 
		ani	gripout$mask 
		jrz	gripout	
		mov	a,c 
		ani	07fh 
		out	gripd 
		ret  
		 
hdlogin:	ret

hdinit0:	ret	 ;keine	Initialisierung	erforderlich
                        ;wenn durch hboot von der Disksystemspur
                        ;geladen wurd
waitreq:    
	in	hd$status	;warten	auf
	rrc			;request transfer 
	rc			;
	jr	waitreq
    
command:    
	out	hd$select	;Controller mit	dummy ansprechen
	mvi	b,6		; 6 byte
	mvi	c,hd$data 
comloop:    
	call	waitreq 
	outi  
	jrnz	comloop	
	ret   
    
    
hd$read:	   
	mvi	a,8		;Read command
hdrwcom:    
	sta	cdb$com		;Command ablegen
	lhld	@trk		; get track number
				;Boot von HD drive 0
hdrw$drive$ok:	 
	mov	a,l		; set bit 7..0 of track
	sta	cdb$cylinder 
	mvi	b,0		; head number := 0
	lda	@sect		; A := sector number
hdrw$test:   
	cpi	sector$nmb	; > number of sectors per track	?
	jrc	hdrw$reached 
	sui	sector$nmb	; yes :	next head
	inr	b 
	jr	hdrw$test 
hdrw$reached:			; A := sector, B := head, H := track bits 9,8
	rrcr	h		; into bit 7,6 of H
	rrcr	h 
	ora	h		; put track bits 9,8 into sector number
	sta	cdb$sector 
	mov	a,b		; set head
	sta	cdb$head 
	mvi	a,1		 ; 1 Sektor lesen/schreiben
	sta	cdb$count 
	mvi	a,1		;10 us per step
	sta	cdb$control 
	lxi	h,cdb$com
	call	command		; kommando geben
	call	waitreq		; warten, bis Daten da
				; und einlesen
   
	ani	2
	jrnz	hderrcheck	;Fehler	
	lhld	@dma			;DMA adress
	mvi	c,hd$data 
    
rwpatch:    
	ini  
rwloop:	   
	in	hd$status 
	rrc  
	jrnc	rwloop			;kein Data request
	ani	3
	xri	1 
	jrz	rwpatch			;naechstes byte	Data
    
hderrcheck:	   
	call	waitreq 
	in	hd$data	
	ani	2 
	rz			; ***Normal Ausgang***
   
reqsense:    
	mvi	b,0		;kurzer Delay
reqloop:
	djnz	reqloop	
	lxi	h,kreqs
	call	command
	ani	2
	jrnz	hderrexit		;Fehler 	
	lxi	h,sense$data	;Ergebnispuffer
	mvi	c,hd$data 
req1:	ini
req2:	in	hd$status
	rrc
	jrnc	req2
	ani	3
	xri	1
	jrz	req1
	ini 

hderrexit:   
	mvi	a,1 
	ret   
    
kreqs:	db	3,0,0,0,0,0   

   
@dma:		dw	0 
@trk:		dw	0 
@sect:		dw	0 

alv:            ds      328
dirpuffer:      ds      512
dtapuffer:      ds      512

	end   

