; Diskettentreiber logischer Teil aus BIOS fuer FLO-MON
	MACLIB	Z80
	MACLIB	DISKDEF

	EXTRN	FLOPPY,PFTKOM,PFTADR

MAXDSK	EQU	2

	DISKS	2

	DISKDEF	0,1,80,0,2048,390,128,128,2

	DISKDEF	1,0

SELDSK:			; LAUFWERK AUSWAEHLEN
	LXI	H,0	; UND PRUEFEN OB GUELTIG
	MOV	A,C	; WENN GROESSER ALS NDISK
	CPI	MAXDSK	; DANN NICHT OK
	RNC		; NUMMER 0 BIS N-1 ERSCHEINT IN A
	STA	DBANK	; DANN ZUSAETZLICH DIE
	MOV	L,C	; LAUFWERKSTABELLE AUSRECHNEN
	MVI	H,0	; DAZU NUMMER MIT 16 MLTIPLIZIEREN
	REPT	4
	DAD	H
	ENDM
	LXI	D,DPBASE ; UND BASISADRESSE DRAUF ADDIEREN
	DAD	D
	RET
; 
HOME:			; Laufwerk auf Spur 0 anfahren
	MVI	C,0	; nur anwaehlen, aber nicht ausfuehren
;
SETTRK:			; Spur merken, dazu in Speicherzelle
	LXI	H,IOT	; laden
	MOV	M,C
	RET
;
SETSEC:			; SEKTOR MERKEN
	LXI	H,IOS	; DAZU IN SPEICHERZELLE LADEN
	MOV	M,C
	RET
;
SECTRAN:		; SEKTOR UMSETZEN
	MOV	A,D	; WENN EIN SKEWFAKTOR VERWENDET WIRD,
	ORA	E	; WIE Z.B. BEI 8 ZOLL UEBLICH.
	JZ	SE1	; =0, DANN KEIN SKEW VERWENDET,
	MVI	B,0	; SONST IN DE ADRESSE DER SKEW-TABELLE
	XCHG		; DAZU SEKTOR IN C ADDIEREN
	DAD	B	; UND WERT ALS NEUEN SEKTOR
	MOV	A,M	; FESTLEGEN UND
	STA	IOS	; SPEICHERN.
	MOV	L,A
	RET
SE1:	MOV	L,C	; SONST NUR EINFACHEN WERT
	MOV	A,C	; UEBERNEHMEN, OHNE UMRECHNUNG.
	STA	IOS	; AUCH MERKEN
	MVI	H,0	; SE 0.. 255 MAX
	RET
;
SETDMA:			; ADRESSE FUER FLOPPYZUGRIFF FESTLEGEN
	MOV	L,C
	MOV	H,B
	SHLD	IOD
	RET
;
; READ UND WRITE UNTER VERWENDUNG DES PHYSISCHEN FLOPYTREIBERS
; FUER 1 K BYTE BLOECKE
;
CALC:			; RECHNET IOS IN SEKTORBUFFERNR UM
	XOR	A
	MOV	B,A	; SIDE SELEKT AUF 0
	STA	SIDE
	LDA	IOS	; 0..79 IST DER BEREICH
	RRC		; X000NNNN 0..15
	RRC
	RRC		; 0..9
	ANI	0FH	; MAX
	INR	A	; 1..10 STARTSEKTOR DES GEBIETES (1K)
	MOV	E,A	; IN E ALS PARAMETER
	SUI	6	; PRUEFEN OB VORDERSEITE
	JC	CAL1
	INR	A	; RUECKSEITE SEKTOREN AB 1 (1K)
	MOV	E,A
	MVI	A,1	; SIDE SELECT AUF 1
	MOV	B,A
	STA	SIDE
CAL1:	LDA	DBANK	; LAUFWERK
	MOV	C,A
	LDA	IOT	; SPUR
	MOV	D,A
	RET		; TRACK=D , SEKTOR=E , DRIVE=C
;
READ:			; EINEN SEKTOR LESEN
	LDA	DBANK	; DAZU LAUFWERK BESTIMMEN
;
; HIER EINFUEGEN ZUKUENFTIGEN TEST AUF RAMFLOPPY
;
; 8" LAUFWERKE WERDEN NICHT UNTERSTUETZT
;
MINIRD:			; FUER VERGLEICH,
	CALL	CALC	; LAUFWERKSDATEN UMRECHNEN
	LDA	MDRVAKT	; UND NUN AKTUELLES LAUFW. VERGLEICHEN
	CMP	C	; WENN NICHT GLEICH, DANN NEU LADEN
	JNZ	RLOAD
	LDA	MTRKAKT	; SONST SPUR VERGLEICHEN
	CMP	D	; UND
	JNZ	RLOAD
	LDA	MSIDAKT	; SONST SIDE VERGLEICHEN
	CMP	B
	JNZ	RLOAD
	LDA	MSEKAKT	; SONST SEKTOR
	CMP	E	; WENN GLEICH, DANN SEKTOR IM SPEICHER
	JNZ	RLOAD
R1RD:			; OK, SEKTOR IST IM PUFFER
	LXI	H,BUFFER ; ADRESSE BERECHNEN
	LDA	IOS	; 0..39 * 128 + BUFFER
	ANI	7	; 0,1,..,7
	MOV	D,A	; SEKTOR * 256 / 2
	MVI	E,0	; SCHIEBEN MIT Z80 BEFEHLEN
	DB	0CBH,2AH ; SRA D
	DB	0CBH,1BH ; RR  E = * 256 / 2
	DAD	D	; + BUFFER
	XCHG		; NACH DE IST ZIEL
	LHLD	IOD	; DMA ADRESSE QUELLE HIER
	XCHG		; ZIEL DE
	LXI	B,128	; LAENGE
	DB	0EDH,0B0H ; LDIR
	XRA	A
	RET		; OK ENDE

RLOAD:			; NEUEN LADEN, GGF ALTEN ZURUECKSCHR.
	LDA	MWRTFLG
	ORA	A
	JZ	R1LOAD
	CALL	PUTTRK	; ALTEN ZURUECKSCHREIBEN
	JC	ERRIO
R1LOAD:	CALL	CALC	; BERECHNEN
	MOV	A,C
	STA	MDRVAKT
	MOV	A,B
	STA	MSIDAKT
	MOV	A,E
	STA	MSEKAKT
	MOV	A,D
	STA	MTRKAKT
	CALL	GETTRK	; NEUEN SEKTOR LESEN
	JC	ERRIO	; FEHLER AUFGETRETEN
	JMP	R1RD	; ENDE
;

WRITE:			; SCHREIBEN EINES SEKTORS
	LDA	DBANK	; DAZU LAUFWERK BESTIMMEN
;
; HIER EINFUEGEN ZUKUENFTIGEN TEST AUF RAMFLOPPY
;
; 8" LAUFWERKE WERDEN NICHT UNTERSTUETZT
;
MINIWR:			; SCHREIBEN EINES SEKTORS
	MOV	A,C
	STA	ALLOC	; INFORMATION 1=DIRECTORYWRITE
	CALL	CALC	; FUER VERGLEICH, BERECHNUNG AUSFUEHREN
	LDA	MDRVAKT	; UND WIE BEI MINIRD
	CMP	C
	JNZ	WLOAD
	LDA	MTRKAKT
	CMP	D
	JNZ	WLOAD
	LDA	MSIDAKT
	CMP	B
	JNZ	WLOAD
	LDA	MSEKAKT
	CMP	E
	JNZ	WLOAD
			; LADEN UNNOETIG, DA SEKTOR SCHON DA
W1WR:			; OK IST SCHON IN BUFFER
	LXI	H,BUFFER
	LDA	IOS	; 0..79 * 128 + BUFFER
	ANI	7	; 0,1,2,3,4,5,6,7
	MOV	D,A	; SEKTOR * 256
	MVI	B,0	; SCHIEBEN MIT Z80 BEFS
	DB	0CBH,2AH ; SRA D
	DB	0CBH,1BH ; RR  E = * 256 / 2
	DAD	D	; + BUFFER
	XCHG		; NACH DE IST ZIEL
	LHLD	IOD	; DMA ADRESSE IST QUELLE HIER
	LXI	B,128	; LAENGE
	DB	0EDH,0B0H ; LDIR
	MVI	A,1
	STA	MWRTFLG	; NUN BESCHRIEBEN
	LDA	ALLOC	; =1 DANN SOFORT ZURUECKSCHREIBEN
	CPI	1	; WEIL DIRECTORYZUGRIFF
	JNZ	W2WR
	CALL	PUTTRK
	JC	ERRIO	; FEHLER AUFGETRETEN, BAD SEKTOR
W2WR:
	XRA	A	; KEIN FEHLER
	RET		; OK ENDE
;
WLOAD:			; NEUEN LADEN, GGF ALTEN ZURUECKSCHR.
	LDA	MWRTFLG
	ORA	A
	JZ	W1LOAD
	CALL	PUTTRK	; ALTEN ZURUECKSCHREIBEN
	JC	ERRIO
W1LOAD:	CALL	CALC	; BERECHNEN
	MOV	A,C
	STA	MDRVAKT
	MOV	A,B
	STA	MSIDAKT
	MOV	A,E
	STA	MSEKAKT
	MOV	A,D
	STA	MTRKAKT
	CALL	GETTRK
	JC	ERRIO
	JMP	W1WR
;
ERRIO:	MVI	A,1	; FEHLER AUFGETRETEN
	ORA	A
	RET
;
; BUFFER VERWALTUNG
;
GETTRK:			; TRKAKT,SEKAKT,DRVAKT,SIDE ENTHALTEN
			; NEUE BUFFERADRESSE

; HIER KOPPLUNG PHYSISCHEN TREIBER EINBINDEN
; BUFFER LESEN

	CALL	PHREAD

	JC	ERRX
	XRA	A
	RET

ERRX:	STC
	RET

PUTTRK:			; TRKAKT,SEKAKT,DRVAKT,SIDE ENTHALTEN
			; NEUE BUFFERADRESSE
	XRA	A	; BUFFER FREI MELDEN, WIRD
	STA	MWRTFLG	; ZURUECKGESCHRIEBEN

; HIER KOPPLUNG PHYSISCHEN TREIBER EINBINDEN
; BUFFER SCHREIBEN

	CALL	PHWRITE

	JC	ERRX
	XRA	A
	RET

;
; EINBINDEN PHYSISCHER FLOPPYROUTINEN READ / WRITE
;
PHREAD:
	MVI	B,39H	; PFTKOM FUER LESEN
	JMP	PHREWR

PHWRITE:
	MVI	B,3DH	; PFTKOM FUER SCHREIBEN
PHREWR:
	LDA	MSIDAKT
	ORA	A
	MOV	A,B
	JRZ	PH1
	ORI	80H
PH1:	STA	PFTKOM
	LXI	H,ADR
	LXI	D,PFTADR
	LXI	B,10
	LDIR
	CALL	FLOPPY
	ORA	A
	RZ
	STC
	RET





;
; RAM - ZELLEN

MWRTFLG:
	DB	0	; <> 0 IST BESCHRIEBEN

; NACHFOLGENDE TABELLE ( BIS STI ) DARF IN IHREM AUFBAU NICHT
; VERAENDERT WERDEN, DA SIE MITTELS LDIR-BEFEHL DEM PHYSISCHEN
; DISKETTENTREIBER UEBERGEBEN WIRD

ADR:	DW	BUFFER	; ADRESSE DES BUFFERS FUER PHYSISCHE
			; FLOPPYROUTINE
MDRVAKT:
	DB	0	; DRIVE, DAS GELADEN IST
MTRKAKT:
	DB	0	; TRACK
MSIDAKT:
	DB	0	; SIDE
MSEKAKT:
	DB	0	; SEKTOR
LEN:	DB	3	; PHYSISCHE BLOCKLAENGE
ANZ:	DB	1	; ANZAHL ZU TRANSFERIERENDER SEKTOREN
STP:	DB	1	; ANZAHL STEPIMPULSE PRO SPUR
STI:	DB	4*10	; SCHRITTZEIT FUER STEP

ALLOC:
	DB	0	; MERKER 1= DIRECTORY WRITE
;

;
DBANK:	DB	0
IOT:	DB	0	; SPUR
IOS:	DB	0	; SEKTOR
SIDE:	DB	0	; SIDE SELECT
IOD:	DW	0	; DMA


BUFFER:	DS	1024

	ENDEF
