 0 0BrosigSBIOSWE1.TXT     .Z80
PN BIOS_HC
;
;
IOBYT:	EQU	3	;IO-BYTE
ADISK:	EQU	4	;AKTUELLE DISK
CCP:	EQU	0C800H
BDOS:	EQU	0D000H	;BDOS ANFANG	
;
	ORG	0DE00H
;
BOOT:	JMP	CBOOT
WBOT:	JMP	WBOOT
	JMP	CONST
	JMP	CONIN
	JMP	COOUT
	JMP	LIST
	JMP	PUNCH
	JMP	READR
	JMP	HOME
	JMP	SDISK
	JMP	STRCK
	JMP	SREC
	JMP	SDMA
	JMP	READ
	JMP	WRITE
	JMP	LSTST
	JMP	STRAN
	JMP	LSTIN
;KALTSTART
CBOOT:	LD	SP,100H		;STACK
	CALL	IPORT		;INIT PORTS
	CALL	IGDC1		;BS 80*24+80*1
	CALL	INFDC		;FDC INIT
	XOR	A
	LD	(IOBYT),A
	LD	C,0CH
	CALL	COOUT		;BS1 LOESCHEN
	LD	A,1
	LD	(IOBYT),A
	LD	C,0CH
	CALL	COOUT		;BS2 LOESCHEN
	CALL	IRAMF		;INIT RAM-FLOPPY
	LD	HL,TBS64
	CALL	LCON
	CALL	CICO
	CMP	'J'		;64-ZEICHEN BS ?
	CAZ	IGDC2		;JA
	LD	A,2
	LD	(ADISK),A	;AKT.LW=A	
	LD	A,0
	LD	(IOBYT),A	;BS1
WBOOT:	LD	A,H(IVCTC)	;IV
	LD	SP,80H
	LD	A,(BUSY)
	AND	A		;PUFFER BELEGT ?
	CANZ	WRTF		;FLOPPY SCHREIBEN
	XOR	A
	LD	(BUSY),A	;PUFFER FREI
	LD	(3),A		;IOBYTE
	LD	A,0C3H
	LD	(0),A		;WARMSTART VORB.
	LD	HL,WBOT
	LD	(1),HL
	LD	(5),A		;BDOS VORB.
	LD	HL,BDOS+6
	LD	(6),HL
	LD	HL,80H
	LD	(DMA),HL	;DMA=80H
	LD	A,(ADISK)	;AKTUELLES LW
	LD	C,A
	JMP	CCP		;SPRUNG ZU CCP
;
TBS64:	DB	0DH
	DB	0AH
	DB	'64-ZEICHEN/ZEILE  J/N ?'
	DB	80H  
;----------------------------------------
;
;INIT GDC FUER 24*80 + 1*80 ZEICHEN
IGDC1:	LD	HL,ICRT1
	LD	DE,BSAN1
	LD	BC,12
	LDIR
	LD	HL,80
	LD	(MAXS),HL
	CALL	UPOUT
	DB	2
	DB	19H
	DB	0		;RESET
	DB	0FH		;SYNC
	DB	8
	DB	18H
	DB	20H		;ZEICHENBETRIEB
	DB	80-2		;AW (80 ZEICHEN)
	DB	6BH		;HS=12 VSL=3
	DB	34H		;HFP=14 VSH=0
	DB	22-1		;HBP=22
	DB	21-1		;VFP=21
	DB	250		;ALL=250 LINIEN
	DB	098H		;VBP=38
	DB	2
	DB	19H
	DB	6FH		;VSYNC
	DB	4BH		;CCHAR
	DB	3
	DB	18H
	DB	89H		;10 LINEN/ZEICHEN
	DB	0
	DB	49H		;CURSOR BLINKT
	DB	1
	DB	19H
	DB	70H		;PRAM
	DB	8
	DB	18H
	DA	0		;SAD1=0
	DB	0
	DB	0FH		;LEN1=240 24 ZEIL
	DA	1920		;SAD2=1920
	DB	0A0H
	DB	0		;LEN2=10 1 ZEILE
	DB	1
	DB	19H
	DB	46H		;ZOOM
	DB	1
	DB	18H
	DB	0		;1
	DB	1
	DB	19H
	DB	49H		;CURS
	DB	2
	DB	18H
	DB	0
	DB	0		;CURSOR-POS.
	DB	1
	DB	19H
	DB	47H		;PITCH
	DB	1
	DB	18H
	DB	80		;ZEICHEN/ZEILE
	DB	1
	DB	19H
	DB	4CH		;FIGS
	DB	1
	DB	18H
	DB	2		;DIR ->
	DB	2
	DB	19H
	DB	6BH		;START
	DB	0DH		;BCTRL DISP FREI
	DB	0
	RET
;
;INIT GDC FUER 16*64 + 9*64 ZEICHEN
IGDC2:	LD	HL,ICRT2
	LD	DE,BSAN1
	LD	BC,12
	LDIR
	LD	HL,64
	LD	(MAXS),HL
	CALL	UPOUT
	DB	2
	DB	19H
	DB	0		;RESET
	DB	0FH		;SYNC
	DB	8
	DB	18H
	DB	20H		;ZEICHENBETRIEB
	DB	64-2		;AW (64 ZEICHEN)
	DB	6BH		;HS=12 VS=3
	DB	54H		;HFP=22
	DB	30-1		;HBP=30
	DB	21		;VFP=21
	DB	250		;AL=250 LINIEN
	DB	98H		;VBP=38
	DB	2
	DB	19H
	DB	6FH		;VSYNC
	DB	4BH		;CCHAR
	DB	3
	DB	18H
	DB	89H		;10 LINIEN/ZEILE
	DB	0
	DB	49H		;CURSOR BLINKT
	DB	1
	DB	19H
	DB	70H		;PRAM
	DB	8
	DB	18H
	DA	0		;SAD1=0
	DB	0
	DB	0AH		;LEN1=160 16 ZEILEN
	DA	1024		;SAD2=400H
	DB	0A0H
	DB	5		;LEN2=90 9 ZEILEN
	DB	1
	DB	19H
	DB	46H		;ZOOM
	DB	1
	DB	18H
	DB	0		;1
	DB	1
	DB	19H
	DB	49H		;CURS
	DB	2
	DB	18H
	DB	0
	DB	0		;CURSOR-POS.
	DB	1
	DB	19H
	DB	47H		;PITCH
	DB	1
	DB	18H
	DB	64		;ZEICHEN/ZEILE
	DB	1
	DB	19H
	DB	4CH		;FIGS
	DB	1
	DB	18H
	DB	2		;DIR ->
	DB	2
	DB	19H
	DB	6BH		;START
	DB	0DH		;BCTRL DISP FREI
	DB	0
	RET
;
ICRT1:	DA	0	;BSAN1
	DA	0	;CUPO1
	DA	1920	;BSGR1
	DA	1920	;BSAN2
	DA	1920	;CUPO2
	DA	80	;BSGR2
;
;
ICRT2:	DA	0	;BSAN1
	DA	0	;CUPO1
	DA	1024	;BSGR1
	DA	1024	;BSAN2
	DA	1024	;CUPO2
	DA	576	;BSGR2
;--------------------------------------
;INIT RAM-FLOPPY
IRAMF:	LD	HL,RITXT
	CALL	LCON
	CALL	CICO
	CMP	'J'		;INIT ?
	RNZ			;NEIN
	LD	A,RDADR		;BASISADR. RDISK
	LD	E,A
	ADD	6
	LD	C,A
	LD	H,C		;IO-ADR.LATCH
	XOR	A
	LD	D,A		;BLOCKZAEHLER/SEITE
RDEL3:	OUT	D		;RESET LATCH
	INC	C
	LD	L,C		;IO-ADR.ZAEHLER
	XOR	A
	OUT	A		;RESET ZAEHLER
	LD	C,E
	LD	B,0
	LD	A,0E5H
RDEL2:	OUT	A
	DJNZ	RDEL2-#
	INC	D
	LD	C,H
	JRNZ	RDEL3-#
	INC	E
	LD	A,RDADR
	ADD	4
	CMP	E
	JRNC	RDEL3-#
	RET
;
RITXT:	DB	'RAM-DISK CLEAR J/N ?'
	DB	80H 
;--------------------------------------
;UP OUT(ANZAHL,OUTADR,PARAMETER,....0)
UPOUT:	POP	HL
	LD	B,M
	INC	HL
	LD	C,M
	INC	HL
	OTIR
	LD	A,M
	AND	A
	JRNZ	-8
	JMP	(HL)
;-------------------------------------
CICO:	CALL	CONIN
	PUSH	AF
	LD	C,A
	CALL	COOUT
	POP	AF
	RET
;-------------------------------------
;----------------------------------------
;CONSOLE MIT GDC
BAGDC:	EQU	18H
STGDC:	EQU	BAGDC
RDGDC:	EQU	BAGDC+1
WDGDC:	EQU	BAGDC
WCGDC:	EQU	BAGDC+1
ABEEP:	EQU	BAGDC+7	;ADR. PIEP
;
CR:	EQU	0DH
LF:	EQU	0AH
FF:	EQU	0CH
TAB:	EQU	09H
ESC:	EQU	1BH
DELL:	EQU	18H
BS:	EQU	08H
;
BU256:	BER	256	;PUFFER FUER ROLL
;
BSAN1:	DA	0	;CRT1
CUPO1:	DA	0
BSGR1:	DA	1024
;
BSAN2:	DA	1024	;CRT2
CUPO2:	DA	1024
BSGR2:	DA	576	
;
BSANF:	DA	0
CUPO:	DA	0
BSGR:	DA	1024
BSEND:	DA	1023
MAXS:	DA	64
QESC:	DB	0	;POS.-FLAG
FCRT2:	DB	1	;1 - ZULETZT CRT2 
;
;TABELLE BILDSCHIRMSTEUERZEICHEN
BSTAB:	DB	0DH,0AH,8
	DB	0CH		;HOME U. CLEAR
	DB	1		;HOME
	DB	1AH		;UP
	DB	7FH		;DEL
	DB	14H		;EOS
	DB	15H		;RIGHT
	DB	16H		;EOL
	DB	18H		;DELL
	DB	1BH		;CPOS ZE SP
	DB	7		;BEEP
BSTBE:	EQU	#
;
	DA	COCR,COLF,COBS,COCLS
	DA	CHOME,COUP,CODEL,COEOS
	DA	CRIGH,COEOL,CODLL,COPOS
	DA	BEEP
CRTBE:	EQU	#
;
CRT2:	CMP	M		;ZULETZT CRT1 ?
	JRZ	CRT1-#		;NEIN
	LD	M,A		;FCRT2=1
	LD	HL,(CUPO)
	LD	(CUPO1),HL	;CUPO1 RETTEN
	LD	HL,BSAN2
	JR	CRTLD-#
COOUT:	LD	A,(IOBYT)
	BIT	1,A
	JRZ	CON1-#
	BIT	0,A
	JPNZ	PUNCH		;XXXXXX11 KASSETTE
	JMP	LIST		;XXXXXX10 DRUCKER
CON1:	LD	HL,FCRT2
	AND	1
	JPNZ	CRT2		;XXXXXX01 2.BILDSCH
	CMP	M		;ZULETZT CRT2 ?
	JRZ	CRT1-#		;NEIN
	LD	M,A		;FCRT2=0
	LD	HL,(CUPO)
	LD	(CUPO2),HL	;CUPO2 RETTEN
	LD	HL,BSAN1
CRTLD:	LD	DE,BSANF
	PUSH	BC
	LD	BC,6
	LDIR			;CRT1/2 LADEN
	LD	HL,(BSANF)
	LD	BC,(BSGR)
	ADD	HL,BC
	DEC	HL
	LD	(BSEND),HL	;BS-ENDADR.BERECHNEN
	POP	BC
CRT1:	LD	HL,CORET	;XXXXXX00 1.BILDSCH
	PUSH	HL
	LD	HL,(CUPO)
	CALL	CUSET		;CURSOR SET
	LD	A,(QESC)
	OR	A
	JRNZ	CPOS1-#		;QUES<>0
	LD	A,C		;ZEICHEN IN A
	EX	DE,HL
	LD	HL,BSTAB
	LD	BC,BSTBE-BSTAB
	CPIR			;STEUERZEICHEN ?
	JRZ	BS08-#		;JA
	EX	DE,HL
	CMP	20H
	RC
	OUT	WDGDC		;ZEICHEN AUF BS
	EX	DE,HL
CRIGH:	INC	DE
	LD	HL,(BSEND)
	OR	A
	SBC	HL,DE		;BS ENDE ?
	BIT	7,H
	EX	DE,HL
	RZ			;NEIN
	LD	HL,(BSEND)
	INC	HL
	OR	A
	LD	DE,(MAXS)
	SBC	HL,DE		;ANF. LETZTE ZEILE
	EX	DE,HL
BS01:	PUSH	DE		;BS ROLLEN
	LD	HL,(MAXS)
	LD	DE,(BSANF)	;ANF.1.ZEILE
	ADD	HL,DE		;ANF.2.ZEILE
	LD	BC,(BSGR)
	CALL	MOVBS		;BS EINE ZEILE HOCH
	POP	HL		;ANF. LETZTE ZEILE
	CALL	CUSET
	LD	BC,(MAXS)
	CALL	CLBWS		;20H IN LETZTE ZEILE
	RET
;
BS08:	LD	HL,CRTBE-1
	XOR	A
	SBC	HL,BC
	SBC	HL,BC
	LD	B,M
	DEC	HL
	LD	C,M
	PUSH	BC
	LD	L,E
	LD	H,D
	RET			;BEHANDL.CTRL
;
CORET:	LD	(CUPO),HL	;CURSOR-POS MERKEN
	CALL	CUSET		;CURSOR SETZEN
	RET
;
CPOS1:	RES	7,C
	DEC	A
	LD	(QESC),A
	JRZ	BS04-#		;SPALTE GEKOMMEN
	LD	B,C
	LD	HL,(BSANF)
	LD	DE,(MAXS)
BS03:	ADD	HL,DE		;+ SPALTENANZAHL
	DJNZ	BS03-#
BSCHK:	PUSH	HL
	LD	DE,(BSANF)
	OR	A
	SBC	HL,DE
	POP	HL
	JRC	POSER-#		;ADRESSE ZU KLEIN
	EX	DE,HL
	LD	HL,(BSEND)
	SBC	HL,DE
	EX	DE,HL
	RNC			;IO
;ADRESSE ZU GROSS
POSER:	LD	HL,(BSANF)
	RET
;
BS04:	LD	A,(MAXS)
	DEC	A
	CMP	C
	JRNC	BS05-#		;SPALTE IO
	LD	C,A		;NEIN LETZTE SPALTE
BS05:	LD	B,0
	ADD	HL,BC		;+ SPALTE
	JR	BSCHK-#
;
;
COCR:	LD	HL,(BSEND)
	LD	BC,(MAXS)
BS09:	SB	HL,BC
	JRC	COCR1-#
	PUSH	HL
	SBC	HL,DE
	POP	HL
	JRNC	BS09-#
COCR1:	INC	HL
	RET
;
;LINEFEED
COLF:	LD	HL,(BSEND)
	LD	BC,(MAXS)
	OR	A
	SBC	HL,BC
	SBC	HL,DE
	JPC	BS01
	LD	HL,(MAXS)
	ADD	HL,DE
	RET
;
;ZEICHEN LOESCHEN UND CURSOR LINKS
CODEL:	EX	DE,HL
	LD	A,20H
	OUT	WDGDC		;ZEICHEN LOESCHEN 
	EX	DE,HL
;CURSOR NACH LINKS
COBS:	LD	HL,(BSANF)
	SBC	HL,DE
	EX	DE,HL
	RZ
	DEC	HL
	RET
;
;CLEAR SCREEN
COCLS:	LD	HL,(BSANF)
	CALL	CUSET
	EX	DE,HL
;
;CLEAR VON CURSOR BIS BS-ENDE
COEOS:	LD	HL,(BSEND)
	INC	HL
	OR	A
	SBC	HL,DE
	EX	DE,HL		;CUPO IN HL
	LD	B,D
	LD	C,E
	CALL	CLBWS		;CLEAR AB CU (BC)MAL
	RET
;
;CURSOR HOME
CHOME:	LD	HL,(BSANF)
	RET
;
;CURSOR HOCH
COUP:	LD	HL,(BSANF)
	LD	BC,(MAXS)
	ADD	HL,BC
	DEC	HL
	SBC	HL,DE
	EX	DE,HL
	RNC
	CCF
	LD	DE,(MAXS)
	SBC	HL,DE		;- SPALTENANZAHL
	RET
;
CODLL:	CALL	COCR
	EX	DE,HL
COEOL:	PUSH	DE
	CALL	COCR
	ADD	HL,BC		;+ SPALTENANZAHL
	XOR	A
	SBC	HL,DE
	LD	B,L		;ANZAHL IN B
	POP	HL
	CALL	CUSET
	LD	A,20H
BS10:	OUT	WDGDC		;BIS EOL SPACE
	DJNZ	BS10-#
	RET
;
COPOS:	LD	A,2
	LD	(QESC),A
	RET
;
;CLEAR BWS AB CURSOR (BC)MAL MIT 20H
CLBWS:	LD	A,B
	OR	C
	RZ			;BC=0
	LD	A,20H
	OUT	WDGDC
	DEC	BC
	JR	CLBWS-#
;
WRKOM:	PUSH	AF
	IN	STGDC
	BIT	2,A		;FIFO LEER
	JRZ	WRKOM-#
	POP	AF
	OUT	WCGDC
	RET
;
;CURSOR AUF HL SETZEN
CUSET:	PUSH	AF
	LD	A,49H
OUTHL:	CALL	WRKOM
	LD	A,L
	OUT	WDGDC
	LD	A,H
	OUT	WDGDC
;VORBEREITEN WRITE DATA IN BWS
WRDAT:	LD	A,30H
	CALL	WRKOM
	POP	AF
	RET
; 	
;
;READ BWS VORBEREITEN
RDEN:	LD	A,4CH		;FIGS
	CALL	WRKOM
	LD	A,2		;RICHTUNG ->
	OUT	WDGDC
	LD	A,B
	OUT	WDGDC		;ANZAHL LO
	AND	A
	LD	A,0
	JRNZ	RDEN1-#
	INC	A		;1 BEI N=256 
RDEN1:	OUT	WDGDC		;ANZAHL HI
;VORBEREITEN READ DATA VON BWS
RDDAT:	LD	A,0B0H		;RDAT
	CALL	WRKOM
RDAT2:	IN	STGDC
	BIT	0,A		;DATA READY
	JRZ	RDAT2-#		;NEIN
	RET
;
;
;256 BYTE AUS PUFFER AUF BS SCHREBEN
;CURSOR AUF HL
WRBS:	LD	B,0
WRBSN:	PUSH	HL
	CALL	CUSET		;CURSOR SETZEN
	LD	C,WDGDC
	LD	HL,BU256	;PUFFER 256 BYTE
	OTIR
	POP	HL
	RET
;
;256 BYTE VON BS IN PUFFER LESEN
;CURSOR AUF HL
RDBS:	LD	B,0
RDBSN:	PUSH	HL
	CALL	CUSET
	CALL	RDEN		;FIGS,RDDAT
	LD	C,RDGDC
	LD	HL,BU256
	INIR
	POP	HL
	RET
;
;MOVE BWS VON (HD) NACH (DE) ANZAHL(BC)
MOVBS:	INC	B
	DEC	B
	JRZ	MOV1-#
	DEC	B
	PUSH	BC
	CALL	RDBS
	INC	H
	EX	DE,HL
	CALL	WRBS
	POP	BC
	INC	H
	EX	DE,HL
	JR	MOVBS-#		;MOVE 256 BYTE
MOV1:	INC	C
	DEC	C
	RZ
	LD	B,C
	PUSH	BC
	CALL	RDBSN		;REST LESEN
	POP	BC
	EX	DE,HL
	CALL	WRBSN		;REST SCHREIBEN
	RET
;
BEEP:	OUT	ABEEP		;PIEP-TON
DUMMY:	RET
;-----------------------------------------
;TEXT AB HL AUF 2.FENSTER BIS BIT 7(HL) GESETZT 
LDISP:	LD	A,(IOBYT)
	PUSH	AF
	LD	A,1
	LD	(IOBYT),A
	CALL	LCON
	POP	AF
	LD	(IOBYT),A
	RET
;------------------------------------------
;TEXT AB HL AUF CONSOLE BIS BIT 7(HL) GESETZT 
LCON:	LD	C,M
	RES	7,C
	PUSH	HL
	CALL	COOUT
	POP	HL
	BIT	7,M
	RNZ
	INC	HL
	JR	LCON-#
;------------------------------------------
;FLOPPY BIOS MIT FDC U8272
SFDC:	EQU	0C0H		;HAUPSTATUSREGISTER
DFDC:	EQU	0C1H		;DATENREGISTER FDC
TC:	EQU	0C8H		;TERMINAL COUNT FDC
MOEIN:	EQU	0C6H		;FDD MOTOR EIN (SE0)
MOAUS:	EQU	0C2H		;FDD MOTOR AUS
PDADR:	EQU	0B0H		;PROM-DISK ADR.
RDADR:	EQU	098H		;RAM-DISK ADR.
NDISK:	EQU	4		;ANZAHL LAUFWERKE
;LWA=RAM(16*128*128)	LWB=ROM(16*128*64)
;LWC=DISK(16*256*40/3S)	LWD=DISK(5*1024*40)
;LWE=DISK(32*256*80/2S)
;
;ZWISCHENPUFFER FDC-PARAMETER
REC:	DB	1	;BDOS SATZ (128)
DMA:	DA	80H	;HAELT DMA-ADR.
;
UNIT1:	DB	0	;LWNR. VON BDOS
TRCK1:	DB	0	;SPURNR.
HEAD1:	DB	0	;KOPFNR.
SECT1:	DB	0	;PHYS.SECTOR
N1:	DB	0	;BYTES/SEC
EOT1:	DB	0	;16 SEKTOREN/SPUR
GPL1:	DB	0	;LUECKE
;----------------------------------------
;KOMMANDOTABELLE FDC
TFDC:	DB	40H	;MFM
UNIT:	DB	0	;LW-NR IN FDC
TRACK:	DB	0	;SPUR
HEAD:	DB	0	;AMMER KOPF 0
SECTR:	DB	0	;PHYS. SECTOR
N:	DB	0	;256 BYTES/SEC
EOT:	DB	0	;16 SEKTOREN/SPUR
GPL:	DB	0	;LUECKE
DTL:	DB	0FFH	;NICHT BENOETIGT
;----------------------------------------
;ERGEBNISTABELLE FDC
ST0:	DB	0	;STATUSREGISTER 0
ST1:	DB	0	;		1
ST2:	DB	0	;		2
CYL:	DB	0	;SPUR
HD:	DB	0	;KOPF
RPSEC:	DB	0	;SECTOR
N256:	DB	0	;256 BYTES/SEC
;---------------------------------------
;HILFSZELLEN BIOS
ZFDMA:	DB	0	;ZEIGER FDMA N*128
BUSY:	DB	0	;PUFFER BELEGT
WRTYP:	DB	0	;SCHREIBTYP
RWFLG:	DB	0	;LESEN=1 SCHREIBEN=0
RWERR:	DB	0	;FEHLER >0
GADDR:	DB	0	;BASISADR. P/R-DISK
;----------------------------------------
;DISK-PARAMETER-TABELLEN
DPBAS:	EQU	#
DPH0:	DA	0	;TRANSF.TAB
	DA	0
	DA	0
	DA	0
	DA	DIRBF	;128 BYTE DIRBUF
	DA	DPB0	;DISK PAR. BLOCK0
	DA	CHK0	;CHECKVEKTOR 0
	DA	ALL0	;ALLOCATIONSVEKTOR
;---------------------------------------
DPH1:	DA	0	;TRANSF.TAB
	DA	0
	DA	0
	DA	0
	DA	DIRBF	;128 BYTE DIRBUF
	DA	DPB1	;DISK PAR. BLOCK 1
	DA	CHK1	;CHECKVEKTOR 0
	DA	ALL1	;ALLOCATIONSVEKTOR
;---------------------------------------
DPH2:	DA	0	;TRANSF.TAB
	DA	0
	DA	0
	DA	0
	DA	DIRBF	;128 BYTE DIRBUF
	DA	DPB2	;DISK PAR. BLOCK 2
	DA	CHK2	;CHECKVEKTOR 2
	DA	ALL2	;ALLOCATIONSVEKTOR
;---------------------------------------
DPH3:	DA	0	;TRANSF.TAB
	DA	0
	DA	0
	DA	0
	DA	DIRBF	;128 BYTE DIRBUF
	DA	DPB3	;DISK PAR. BLOCK 3
	DA	CHK3	;CHECKVEKTOR 3
	DA	ALL3	;ALLOCATIONSVEKTOR
;---------------------------------------
;DISK-PARAMETER-BLOECKE
;PROM-DISK 4*32K-BYTE
DPB0:	DA	16	;(128 BYTE)SEC/TRACK
	DB	3	;1K BLOECKE
	DB	7	;8 SEC/BLOCK
	DB	0	;EXTEND
	DA	127	;128 1K-BLOECKE
	DA	63	;64 DIR.-EINTRAEGE
	DA	0C000H	;ERSTE 16 BIT ALLVEK
	DA	16	;LAENGE CHECKVEKT.
	DA	0	;0 SYSTEMSPUREN
CHK0:	DB	0	;KEIN DISKWECHSEL
ALL0:	BER	32	;BELEGUNGSPLAN DISK
;-------------------------------------------
;RAM-DISK 256K-BYTE
DPB1:	DA	16	;(128 BYTE)SEC/TRACK
	DB	3	;1K BLOECKE
	DB	7	;8 SEC/BLOCK
	DB	0	;EXTEND
	DA	255	;256 1K-BLOECKE
	DA	63	;64 DIR.-EINTRAEGE
	DA	0C000H	;ERSTE 16 BIT ALLVEK
	DA	0	;LAENGE CHECKVEKT.
	DA	0	;0 SYSTEMSPUREN
CHK1:	DB	0	;KEIN DISKWECHSEL
ALL1:	BER	32	;BELEGUNGSPLAN DISK
;-------------------------------------------
;FLOPPY-DISK 16*256*40   148K BYTE
DPB2:	DA	32	;(128 BYTE)SEC/TRACK
	DB	4	;2K BLOECKE
	DB	15	;16 SEC/BLOCK
	DB	1	;EXTEND
	DA	73	;74 2K-BLOECKE
	DA	63	;64 DIR.-EINTRAEGE
	DA	8000H	;ERSTE 16 BIT ALLVEK
	DA	16	;DIR /4
	DA	3	;3 SYSTEMSPUREN
;
	DB	1	;(N) 256 BYTE/SEC
	DB	16	;(EOT) PHYS.SEC/TRCK
	DB	20	;(GPL1) LUECKE R/W
	DB	53	;(GPL2) LUECKE FORM.
	DB	0	;EINSEITIG
	DB	0	;PHYS.LW
	DB	40	;ANZ.PHYS.SPUREN
;
CHK2:	BER	16	;CHECK DISKWECHSEL
ALL2:	BER	20	;BELEG]NGSPLAN DISK
;-------------------------------------------
;FLOPPY-DISK 5*1024*40 200K-BYTE
DPB3:	DA	40	;(128 BYTE)SEC/TRACK
	DB	4	;2K BLOECKE
	DB	15	;16 SEC/BLOCK
	DB	1	;EXTEND
	DA	99	;100 2K-BLOECKE
	DA	63	;64 DIR.-EINTRAEGE
	DA	8000H	;ERSTE 16 BIT ALLVEK.
	DA	16	;DIR /4
	DA	0	;KEINE SYSTEMSPUREN
;
	DB	3	;1024 BYTES/SEC (N)
	DB	5	;(EOT) PHYS.SEC/TRCK
	DB	48	;(GPL1) LUECKE R/W
	DB	100	;(GPL2) LUECKE FORM.
	DB	0	;EINSEITIG
	DB	0	;PHYS.LW
	DB	25	;PRECOMP-SPUR
	DB	40	;ANZ.PHYS.SPUREN
;
CHK3:	BER	16	;CHECK DISKWECHSEL
ALL3:	BER	25	;BELEGUNGSPLAN DISK
;-------------------------------------------
;----------------------------------------
;KOPF AUF SPUR 0
HOME:	LD	C,0
;----------------------------------------
;SPUR SETZEN
STRCK:	LD	HL,TRCK1	;NEUE SPUR
	LD	M,C
	RET
;----------------------------------------
;LAUFWERK AUSWAHLEN
SDISK:	LD	A,C
	CALL	APHPB		;HL=DPH,IX=DPB
	RC			;LW NICHT VORH.
	LD	(UNIT1),A	;NEUE LWNR. MERKEN
	RET
;----------------------------------------
;SECTOR SETZEN
SREC:	LD	HL,REC		;NEUER SATZ
	LD	M,C
	RET
;________________________________________
;DMA ADR. SETZEN
SDMA:	LD	(DMA),BC
	RET
;----------------------------------------
;SECTOR-TRANSFORMATION
STRAN:	LD	H,B
	LD	L,C
	INC	HL		;SEKTOREN AB 1...
	RET
;----------------------------------------
;BDOS SEKTOR LESEN
READ:	LD	A,1		;READ-FLAG
	LD	C,0		;WRTYP=0
	JR	RDWR-#
WRITE:	LD	A,0
RDWR:	LD	(RWFLG),A	;LESEN/SCHREIBEN
	LD	A,(UNIT1)
	CALL	APHPB		;HL=DPH,IX=DPB
	AND	A		;LW A
	JPZ	RDISK		;RAM-DISK
	DEC	A		;LW B
	JPZ	PDISK		;PROM-DISK
;FLOPPY LESEN SCHREIBEN
FRDWR:	LD	A,C
	LD	(WRTYP),A	;SCHREIBTYP
	LD	A,0
	LD	(RWERR),A	;FEHLER RESET
	CALL	FSEC		;PHYS.SEC BERECHN.
;TEST OB AUS PUFFER GELESEN WERDEN KANN
	CALL	BLKIN		;BLOCK IN PUFFER?
	CANZ	BLKNO		;NEIN
;ALLES GLEICH -MIT PUFFER ARBEITEN
	CALL	AFDMA		;ADR. FDMA IN HL
	LD	DE,(DMA)	;DMA-ADR.
	LD	A,(RWFLG)
	LD	BC,80H		;ANZAHL BYTES
	AND	A		;LESEN
	JRZ	WRBUF-#		;NEIN
;PUFFER LESEN
	LDIR			;KOPIEREN
	JR	RWEND-#		;ENDE RD/WR
;
;PUFFER SCHREIBEN
WRBUF:	EX	DE,HL
	LDIR
	LD	A,(WRTYP)
	CMP	1		;DIR ?
	JRZ	WRDIR-#		;JA
	LD	A,1
	LD	(BUSY),A	;PUFFER BELEGT
	JR	RWEND-#		;ENDE RD/WR
;
;DIR SCHREIBEN
WRDIR:	CALL	WRTF		;DISK SCHREIBEN
	JRZ	WRDI1-#		;FEHLER
	LD	(RWERR),A	;FEHLER MERKEN
WRDI1:	XOR	A
	LD	(BUSY),A	;PUFFER FREI
RWEND:	LD	A,(RWERR)	;FEHLER IN A
	RET
;
;BLOCK NICHT IN PUFFER
BLKNO:	LD	A,(BUSY)
	AND	A		;PUFFER BELEGT
	JRZ	NOBSY-#		;NEIN
	CALL	WRTF		;PUFFER RETTEN
	JRZ	NOBSY-#		;KEIN FEHLER
	LD	(RWERR),A	;FEHLER
NOBSY:	LD	HL,UNIT1
	LD	DE,UNIT
	LD	BC,7
	LDIR			;PARAMETER -> TFDC  
	LD	A,(WRTYP)
 	CMP	2		;SCHREIBTYP
	JRZ	BLKN1-#
	CALL	READF
	JRZ	BLKN1-#		;KEIN FEHLER
	LD	(RWERR),A	;FEHLER
BLKN1:	XOR	A
	LD	(BUSY),A	;PUFFER FREI
	RET
;
;BLOCK IN PUFFER ? JA- Z=1
BLKIN:	LD	HL,UNIT1
	LD	DE,UNIT
	LD	B,7
BLKI1:	LD	A,(DE)
	CMP	(HL)
	INC	HL
	INC	DE
	RNZ			;UNGLEICH -NZ
	DJNZ	BLKI1-#
	RET			;ALLES GLEICH
;----------------------------------------------
;PROM-DISK
PDISK:	LD	A,PDADR
	JR	PRDRW-#
;----------------------------------------
;RAM-DISK
RDISK:	LD	A,RDADR
;READ/WRITE RAM-DISK/PROM/DISK
PRDRW:	LD	(GADDR),A	;BASIS-ADR 
;ADRESSRECHNUNG
	LD	HL,(TRCK1)
	XOR	A
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	LD	DE,(REC)
	ADD	HL,DE
	RR	H
	RR	L
	RR	A
	LD	B,A
	LD	A,(GADDR)
	ADD	7
	LD	C,A
	OUT	B
	DEC	C		;BASISADR.+6
	OUT	L
	LD	A,H
	AND	3
	LD	B,A
	LD	A,(GADDR)
	OR	B		;BASISADR.		
	LD	C,A
	LD	B,128
	LD	HL,(DMA)
;TEST READ/WRITE
	LD	A,(RWFLG)
	AND	A
	JRZ	PRDWR-#		;P/R-DISK WRITE
;READ RAM-DISK/PROM-DISK
PRDRD:	INIR
	XOR	A
	RET
;WRITE RAM-DISK/PROM-DISK
PRDWR:	OTIR
	XOR	A
	RET
;----------------------------------------
;IN: A=LW OUT: HL=LPH   IX=DPB
APHPB:	LD	HL,0
	CMP	NDISK		;ANZAHL LAUFWERKE
	CCF
	RC			;ZUVIEL CY=1
	LD	L,A
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL		;*16
	LD	DE,DPBAS
	ADD	HL,DE		;DPH ADR. IN HL
	PUSH	HL
	LD	DE,0AH
	ADD	HL,DE
	LD	E,M
	INC	HL
	LD	D,M
	PUSH	DE
	POP	IX		;DPB IN IX
	POP	HL		;DPH IN HL
	AND	A		;LW VORHANDEN CY=0
	RET
;----------------------------------
;FDC-PARAMETER BERECHNEN
;IN: IX=DPB-ADR.
FSEC:	LD	HL,GPL1
;EOT N UND GPL VON DPB IN PARAMETER-PUFFER
	LD	A,(IX+17)
	LD	M,A		;GPL1
	DEC	HL
	LD	A,(IX+16)
	LD	M,A		;EOT1
	DEC	HL
	LD	A,(IX+15)
	LD	M,A		;N1
;PHYS.SECTOR UND ZEIGER FDMA BERECHNEN
	LD	B,A
	LD	A,(REC)		;128BYTE SEKTOREN
	DEC	A		;-1 SEKTOR 0...
	LD	C,A
	AND	7
	LD	(ZFDMA),A	;ZEIGER FDMA N*128
	LD	A,C
	AND	0F8H		;AUF 1K RUNDEN
FSECN:	SRL	A		;:2
	DJNZ	FSECN-#
	INC	A		;SEC 1....
FSEC1:	LD	(SECT1),A	;PHYS. SEKTOR
;KOPF 0/1 BERECHNEN
	LD	C,A
	XOR	A
	CMP	(IX+19)		;DS ?
	JRZ	FSEC2-#		;NEIN
	LD	A,(IX+17)	;SEC/TRACK
	SRL	A		;:2
	CMP	C		;SEITE 2 ?
	LD	A,0
	JRNC	FSEC2-#		;NEIN
	INC	A		;JA
FSEC2:	LD	(HEAD1),A
	RET
;----------------------------------------
;ADR FDMA BERECHNEN
AFDMA:	LD	A,(ZFDMA)	;ZEIGER (0..7)
	AND	7
	LD	H,A
	LD	L,0
	SRL	H
	RR	L		;ZEIGER*128
	LD	DE,FDMA		;PUFFERENFANG
	ADD	HL,DE		;PUFFERADR. IN HL
	RET
;----------------------------------------
;INIT FDC U8272
INFDC:	OUT	MOAUS		;LW AUSSCHALTEN
	LD	B,0
IFDC1:	DJNZ	IFDC1-#		;WARTEN
	IN	SFDC		;LESEN HAUPSTATUSREG
	CMP	80H		;BEREIT ?
	JRZ	SPECI-#		;JA -SPECIFY
	IN	DFDC		;BLINDEINGABE
	JR	INFDC-#
SPECI:	LD	HL,TSPEC	;TAB. SPECIFY
	LD	BC,0303H	;SPECIFY KOMMANDO
	CALL	WCOM1		;KOM SCHREIBEN
	OUT	MOEIN
	CALL	RECAL		;SPUR 0 EINSTELLEN
	OUT	MOAUS
	RET
;TABELLE SPECIFY
TSPEC:	DB	3H		;SPECIFY KOM/
	DB	88H		;SRT=16MS,HUT=256MS
	DB	15H		;HLT=40MS +NON DMA
;-----------------------------------
DELAY:	PUSH	BC		;FUR STATUS-FLAG
	LD	B,15
DELY1:	DJNZ	DELY1-#
	POP	BC
	RET
;-----------------------------------
;KOMMANDO-TAB. AN FDC SENDEN
WCOM:	LD	HL,TFDC
	LD	M,C		;KOM. MERKEN
WCOM1:	CALL	DELAY
	IN	SFDC
	BIT	7,A		;BEREIT ?
	JRZ	WCOM1-#		;NEIN
	BIT	6,A		;FDC INPUT ?
	JRZ	WCOM2-#		;JA
	IN	DFDC		;NEIN -BYTE ABHOLEN
	RET			;NO ZERO -KOM.FEHLER
WCOM2:	LD	A,M
	OUT	DFDC		;KOM. SCHREIBEN
	INC	HL
	DJNZ	WCOM1-#
	RET			;ZERO -OK
;-----------------------------------------
;KOPF AUF SPUR 0
RECAL:	CALL	FDRDY		;LW BEREIT
	LD	BC,207H		;RECALIBRATE
	CALL	WCOM
	CALL	SIS		;SENSE INT. STATUS
	AND	0F8H
	CMP	20H		;KOPF AUF SPUR 0 ?
	RZ			;JA
	LD	HL,MTRK0	;FEHLER
	JMP	LDISP
MTRK0:	DB	'FEHLER SPUR 0'
	DB	80H
;-----------------------------------------
;SENSE INTERRUPT STATUS
SIS:	LD	BC,108H
	CALL	WCOM
	CALL	RBYTE
	LD	B,A
	LD	(ST0),A
	CMP	80H		;OK ?
	CANZ	RBYTE		;JA ERGEBNIS LESEN
	LD	C,A		;AKTUELLE SPUR
	LD	A,B
	BIT	5,A		;SUCHE ENDE ?
	JRZ	SIS-#		;NEIN
	RET
;----------------------------------------
;FD-DRIVE READY ( RDY-BIT IN ST3 )
FDRDY:	CALL	SDS		;SENSE DRIVE STATUS
	BIT	5,A		;BEREIT ?
	JRZ	FDRDY-#		;NEIN
	RET
;-----------------------------------------
;SENSE DRIVE STATUS
SDS:	LD	BC,204H
	CALL	WCOM
	CALL	RBYTE		;ERGEBNIS LESEN
	RET
;-----------------------------------------
;ERGEBNISBYTE LESEN
RBYTE:	CALL	DELAY
RBYT1:	IN	SFDC
	RLCA
	JRNC	RBYT1-#		;NICHT BEREIT
	IN	DFDC		;ERGEBNISBYTE
	RET
;-----------------------------------------
;7 ERGEBNISBYTES LESEN UND NACH (ST0)...
RRSLT:	LD	B,6
	CALL	RBYTE
	LD	HL,ST0
	LD	M,A
	LD	C,A
RESL1:	CALL	RBYTE
	INC	HL
	LD	M,A
	DJNZ	RESL1-#
	LD	A,C
	RET
;----------------------------------------
;SPUR EINSTELLEN
SEEK:	LD	BC,30FH
	CALL	WCOM		;KOM SEEK
	CALL	SIS		;SPUR EINGESTEDLT
SEEK1:	IN	SFDC
	AND	0FH
	JRNZ	SEEK1-#		;NEIN
	RET
;----------------------------------------
;LESEN 1K BYTE VON DISK IN FDMA
READF:	OUT	MOEIN
	CALL	FDRDY
	CALL	SEEK		;SPUR EINSTELLEN
RLOOP:	LD	B,8		;8 LESEWIEDERHOL.
RLOP:	PUSH	BC
	LD	BC,0946H	;KOM MFM LESEN
	LD	A,C
	LD	(TFDC),A	;KOM MERKEN
	DI
	CALL	WCOM		;KOMMANDO
	LD	HL,FDMA		;ZIELADRESSE
	LD	C,DFDC		;FDC LESEPORT
	LD	E,4
R0:	LD	B,0
R1:	IN	SFDC		;HAUPTSTATUSREG.
	RLCA
	JRNC	R1-#		;NOCH KEINE DATEN
	RLCA
	RLCA
	JRNC	R2-#		;FDC FERTIG
	INI			;BYTE VON DISK
	JRNZ	R1-#
	DEC	E		;1K UEBERTRAGEN ?
	JRNZ	R0-#		;NOCH NICHT
	OUT	TC		;JA TERMINAL COUNT
R2:	CALL	RRSLT		;ERGEBNIS LESEN
	POP	BC
	AND	0C8H		;ST0 OHNE DSn
	JRZ	WRT3-#		;KEIN LESEFEHLER
	DJNZ	RLOP-#		;LESEWIEDERHOLUNG
	LD	HL,LESF
	JR	WRTE-#
;
LESF:	DB	'LESEFEHLER'
	DB	80H
;----------------------------------------
;SCHREIBEN 1K BYTE VON FDMA AUF DISK
WRTF:	OUT	MOEIN
	CALL	FDRDY
	LD	HL,WRPRO
	BIT	6,A		;SCHREIBSCHUTZ ?
	JRNZ	WRTE-#		;JA
 	CALL	SEEK		;SPUR EINSTELLEN
	LD	B,8		;8 SCHREIBWIEDERHOLUNG
WLOOP:	PUSH	BC
	LD	BC,0945H	;KOM MFM SCHREIBEN
	DI
	CALL	WCOM		;KOMMANDO
	LD	HL,FDMA		;QUELL-ADRESSE
	LD	C,DFDC		;FDC DATENPORT
	LD	E,4		;4*256 BYTE
WRT0:	LD	B,0
WRT1:	IN	SFDC		;HAUPTSTATUSREG.
	RLCA
	JRNC	WRT1-#		;NOCH KEINE DATEN
	RLCA
	RLCA
	JRNC	WRT2-#		;FDC FERTIG
	OUTI			;BYTE AUF DISK
	JRNZ	WRT1-#
	DEC	E		;1K UEBERTRAGEN ?
	JRNZ	WRT0-#		;NOCH NICHT
	OUT	TC		;JA TERMINAL COUNT
WRT2:	CALL	RRSLT		;ERGEBNIS SCHREIBEN
	POP	BC
	AND	0C8H		;ST0 OHNE DSn
	JRZ	WRT3-#		;KEIN SCHREIBFEHLER
	DJNZ	WLOOP-#		;7*SCHREIBWIEDERHOLUNG
	LD	HL,SCHRF
WRTE:	CALL	LDISP		;DISP SCHREIBFEHLER
	LD	A,1		;FEHLER
	AND	A
WRT3:	PUSH	AF
	EI
	OUT	MOAUS
	POP	AF		;FEHLER IN A
	RET			;UND Z-FLAG
;
WRPRO:	DB	'SCHREIB'
	DB	'GESCHUETZT '
	DB	80H
;
SCHRF:	DB	'SCHREIBFEHLER'
	DB	80H
;-------------------------------------
	ORG	0EB70H
;
IVCTC:	BER	8	;IV-TABELLE CTC
IVSIO:	BER	8	;IV-TABELLE SIO
DIRBF:	BER	128	;DIR.PUFFER
FDMA:	BER	1024	;1K FLOPPY-PUFFER
;
END


	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	LD	DE,(REC)
	ADD	HL,DE
	RR	H
	RR	L
	RR	A
	LD	B,A
	LD	A,(GADDR)
	ADD	7
	LD	C,A
	OUT	B
	DEC	C		;BASISADR.+6
	OUT	L
	LD	A,H
	AND	3
	LD	B,A
	LD	A,(GADDR)
	OR	B		;BASISADR.		
	LD	C,A
	LD	B,128
	LD	HL,(DMA)
;TEST READ/WRITE
	LD	A,(RWFLG)
	AND	A
	JRZ	PRDWR-#		;P/R-DISK WRITE
;READ RAM-DISK/PROM-DISK
PRDRD:	INIR
	XOR	A
	RET
;WRITE RAM-DISK/PROM-DISK
PRDWR:	OTIR
	XOR	A
	RET
;----------------------------------------
;IN: A=LW OUT: HL=LPH   IX=DPB
APHPB:	LD	HL,0
	CMP	NDISK		;ANZAHL LAUFWERKE
	CCF
	RC			;ZUVIEL CY=1
	LD	L,A
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL		;*16
	LD	DE,DPBAS
	ADD	HL,DE		;DPH ADR. IN HL
	PUSH	HL
	LD	DE,0AH
	ADD	HL,DE
	LD	E,M
	INC	HL
	LD	D,M
	PUSH	DE
	POP	IX		;DPB IN IX
	POP	HL		;DPH IN HL
	AND	A		;LW VORHANDEN CY=0
	RET
;----------------------------------
;FDC-PARAMETER BERECHNEN
;IN: IX=DPB-ADR.
FSEC:	LD	HL,GPL1
;EOT N UND GPL VON DPB IN PARAMETER-PUFFER
	LD	A,(IX+17)
	LD	M,A		;GPL1
	DEC	HL
	LD	A,(IX+16)
	LD	M,A		;EOT1
	DEC	HL
	LD	A,(IX+15)
	LD	M,A		;N1
;PHYS.SECTOR UND ZEIGER FDMA BERECHNEN
	LD	B,A
	LD	A,(REC)		;128BYTE SEKTOREN
	DEC	A		;-1 SEKTOR 0...
	LD	C,A
	AND	7
	LD	(ZFDMA),A	;ZEIGER FDMA N*128
	LD	A,C
	AND	0F8H		;AUF 1K RUNDEN
FSECN:	SRL	A		;:2
	DJNZ	FSECN-#
	INC	A		;SEC 1....
FSEC1:	LD	(SECT1),A	;PHYS. SEKTOR
;KOPF 0/1 BERECHNEN
	LD	C,A
	XOR	A
	CMP	(IX+19)		;DS ?
	JRZ	FSEC2-#		;NEIN
	LD	A,(IX+17)	;SEC/TRACK
	SRL	A		;:2
	CMP	C		;SEITE 2 ?
	LD	A,0
	JRNC	FSEC2-#		;NEIN
	INC	A		;JA
FSEC2:	LD	(HEAD1),A
	RET
;----------------------------------------
;ADR FDMA BERECHNEN
AFDMA:	LD	A,(ZFDMA)	;ZEIGER (0..7)
	AND	7
	LD	H,A
	LD	L,0
	SRL	H
	RR	L		;ZEIGER*128
	LD	DE,FDMA		;PUFFERENFANG
	ADD	HL,DE		;PUFFERADR. IN HL
	RET
;----------------------------------------
;INIT FDC U8272
INFDC:	OUT	MOAUS		;LW AUSSCHALTEN
	LD	B,0
IFDC1:	DJNZ	IFDC1-#		;WARTEN
	IN	SFDC		;LESEN HAUPSTATUSREG
	CMP	80H		;BEREIT ?
	JRZ	SPECI-#		;JA -SPECIFY
	IN	DFDC		;BLINDEINGABE
	JR	INFDC-#
SPECI:	LD	HL,TSPEC	;TAB. SPECIFY
	LD	BC,0303H	;SPECIFY KOMMANDO
	CALL	WCOM1		;KOM SCHREIBEN
	OUT	MOEIN
	CALL	RECAL		;SPUR 0 EINSTELLEN
	OUT	MOAUS
	RET
;TABELLE SPECIFY
TSPEC:	DB	3H		;SPECIFY KOM/
	DB	88H		;SRT=16MS,HUT=256MS
	DB	15H		;HLT=40MS +NON DMA
;-----------------------------------
DELAY:	PUSH	BC		;FUR STATUS-FLAG
	LD	B,15
DELY1:	DJNZ	DELY1-#
	POP	BC
	RET
;-----------------------------------
;KOMMANDO-TAB. AN FDC SENDEN
WCOM:	LD	HL,TFDC
	LD	M,C		;KOM. MERKEN
WCOM1:	CALL	DELAY
	IN	SFDC
	BIT	7,A		;BEREIT ?
	JRZ	WCOM1-#		;NEIN
	BIT	6,A		;FDC INPUT ?
	JRZ	WCOM2-#		;JA
	IN	DFDC		;NEIN -BYTE ABHOLEN
	RET			;NO ZERO -KOM.FEHLER
WCOM2:	LD	A,M
	OUT	DFDC		;KOM. SCHREIBEN
	INC	HL
	DJNZ	WCOM1-#
	RET			;ZERO -OK
;-----------------------------------------
;KOPF AUF SPUR 0
RECAL:	CALL	FDRDY		;LW BEREIT
	LD	BC,207H		;RECALIBRATE
	CALL	WCOM
	CALL	SIS		;SENSE INT. STATUS
	AND	0F8H
	CMP	20H		;KOPF AUF SPUR 0 ?
	RZ			;JA
	LD	HL,MTRK0	;FEHLER
	JMP	LDISP
MTRK0:	DB	'FEHLER SPUR 0'
	DB	80H
;-----------------------------------------
;SENSE INTERRUPT STATUS
SIS:	LD	BC,108H
	CALL	WCOM
	CALL	RBYTE
	LD	B,A
	LD	(ST0),A
	CMP	80H		;OK ?
	CANZ	RBYTE		;JA ERGEBNIS LESEN
	LD	C,A		;AKTUELLE SPUR
	LD	A,B
	BIT	5,A		;SUCHE ENDE ?
	JRZ	SIS-#		;NEIN
	RET
;----------------------------------------
;FD-DRIVE READY ( RDY-BIT IN ST3 )
FDRDY:	CALL	SDS		;SENSE DRIVE STATUS
	BIT	5,A		;BEREIT ?
	JRZ	FDRDY-#		;NEIN
	RET
;-----------------------------------------
;SENSE DRIVE STATUS
SDS:	LD	BC,204H
	CALL	WCOM
	CALL	RBYTE		;ERGEBNIS LESEN
	RET
;-----------------------------------------
;ERGEBNISBYTE LESEN
RBYTE:	CALL	DELAY
RBYT1:	IN	SFDC
	RLCA
	JRNC	RBYT1-#		;NICHT BEREIT
	IN	DFDC		;ERGEBNISBYTE
	RET
;-----------------------------------------
;7 ERGEBNISBYTES LESEN UND NACH (ST0)...
RRSLT:	LD	B,6
	CALL	RBYTE
	LD	HL,ST0
	LD	M,A
	LD	C,A
RESL1:	CALL	RBYTE
	INC	HL
	LD	M,A
	DJNZ	RESL1-#
	LD	A,C
	RET
;----------------------------------------
;SPUR EINSTELLEN
SEEK:	LD	BC,30FH
	CALL	WCOM		;KOM SEEK
	CALL	SIS		;SPUR EINGESTEDLT
SEEK1:	IN	SFDC
	AND	0FH
	JRNZ	SEEK1-#		;NEIN
	RET
;----------------------------------------
;LESEN 1K BYTE VON DISK IN FDMA
READF:	OUT	MOEIN
	CALL	FDRDY
	CALL	SEEK		;SPUR EINSTELLEN
RLOOP:	LD	B,8		;8 LESEWIEDERHOL.
RLOP:	PUSH	BC
	LD	BC,0946H	;KOM MFM LESEN
	LD	A,C
	LD	(TFDC),A	;KOM MERKEN
	DI
	CALL	WCOM		;KOMMANDO
	LD	HL,FDMA		;ZIELADRESSE
	LD	C,DFDC		;FDC LESEPORT
	LD	E,4
R0:	LD	B,0
R1:	IN	SFDC		;HAUPTSTATUSREG.
	RLCA
	JRNC	R1-#		;NOCH KEINE DATEN
	RLCA
	RLCA
	JRNC	R2-#		;FDC FERTIG
	INI			;BYTE VON DISK
	JRNZ	R1-#
	DEC	E		;1K UEBERTRAGEN ?
	JRNZ	R0-#		;NOCH NICHT
	OUT	TC		;JA TERMINAL COUNT
R2:	CALL	RRSLT		;ERGEBNIS LESEN
	POP	BC
	AND	0C8H		;ST0 OHNE DSn
	JRZ	WRT3-#		;KEIN LESEFEHLER
	DJNZ	RLOP-#		;LESEWIEDERHOLUNG
	LD	HL,LESF
	JR	WRTE-#
;
LESF:	DB	'LESEFEHLER'
	DB	80H
;----------------------------------------
;SCHREIBEN 1K BYTE VON FDMA AUF DISK
WRTF:	OUT	MOEIN
	CALL	FDRDY
	LD	HL,WRPRO
	BIT	6,A		;SCHREIBSCHUTZ ?
	JRNZ	WRTE-#		;JA
 	CALL	SEEK		;SPUR EINSTELLEN
	LD	B,8		;8 SCHREIBWIEDERHOLUNG
WLOOP:	PUSH	BC
	LD	BC,0945H	;KOM MFM SCHREIBEN
	DI
	CALL	WCOM		;KOMMANDO
	LD	HL,FDMA		;QUELL-ADRESSE
	LD	C,DFDC		;FDC DATENPORT
	LD	E,4		;4*256 BYTE
WRT0:	LD	B,0
WRT1:	IN	SFDC		;HAUPTSTATUSREG.
	RLCA
	JRNC	WRT1-#		;NOCH KEINE DATEN
	RLCA
	RLCA
	JRNC	WRT2-#		;FDC FERTIG
	OUTI			;BYTE AUF DISK
	JRNZ	WRT1-#
	DEC	E		;1K UEBERTRAGEN ?
	JRNZ	WRT0-#		;NOCH NICHT
	OUT	TC		;JA TERMINAL COUNT
WRT2:	CALL	RRSLT		;ERGEBNIS SCHREIBEN
	POP	BC
	AND	0C8H		;ST0 OHNE DSn
	JRZ	WRT3-#		;KEIN SCHREIBFEHLER
	DJNZ	WLOOP-#		;7*SCHREIBWIEDERHOLUNG
	LD	HL,SCHRF
WRTE:	CALL	LDISP		;DISP SCHREIBFEHLER
	LD	A,1		;FEHLER
	AND	A
WRT3:	PUSH	AF
	EI
	OUT	MOAUS
	POP	AF		;FEHLER IN A
	RET			;UND Z-FLAG
;
WRPRO:	DB	'SCHREIB'
	DB	'GESCHUETZT '
	DB	80H
;
SCHRF:	DB	'SCHREIBFEHLER'
	DB	80H
;-------------------------------------
	ORG	0EB70H
;
IVCTC:	BER	8	;IV-TABELLE CTC
IVSIO:	BER	8	;IV-TABELLE SIO
DIRBF:	BER	128	;DIR.PUFFER
FDMA:	BER	1024	;1K FLOPPY-PUFFER
;
END

