
;-----------------------------------------------------------------------
;-------[инициализация винчестера]------;
INIT_HDD_WORK:
 IFN YesSound
	RET
 ENDIF

.currentDisk+1:	;
		LD	A,0
		OR	#80
		LD	HL,Temp_Buffer
		LD	BC,Dss.DskInfo
		RST	ToDSS
		;
		LD	B,4		;!HARDCODE номер нужного параметра
		LD	DE,0
		LD	HL,Temp_Buffer
.loop_param:	ADD	HL,DE
		LD	E,(HL)
		INC	HL
		DJNZ	.loop_param
		LD	A,(HL)
		AND	#80
		JR	Z,.no_change_Disk
		CP	#90
		JR	NC,.no_change_Disk
		;
		LD	A,3
		AND	(HL)
		LD	D,A
		INC	HL
		LD	A,(HL)
		RLCA
		RLCA
		;
		OR	D
		AND	#0F
		JR	.start
		;
.no_change_Disk:;
		XOR	A
.start:		LD	C,BIOS.HDD_PART					; IDE-1/IDE-2
		RST	ToBIOS
		;
.loop:		LD C,BIOS.HDD_INIT
		RST ToBIOS
		JR C,.loop
		;

		CALL	BPB_SetUp
;-----------------------------------------------------------------------

	IN A,(SLOT3)
	PUSH AF
	LD A,SYS_PAGE
	OUT (SLOT3),A

	LD HL,SYS_PAGE.MSD_FAT_SEC
	LD DE,MSD_DATS
	LD BC,16
	LDIR
	POP AF
	OUT (SLOT3),A
	;!TODO music and dirs
	; парсим строку пути
	; LD	HL,CURRENT_DIR+1
	; LD	DE,DIR_NAME_11
	; PUSH	DE
	; PUSH	HL
	; LD	BC,1*256 + Dss.DosName
	; RST	ToDSS

;-----[читать секторы с винчестера]-----
READ_DIR:
	LD HL,#C000					; адрес буфера данных
	LD DE,(MSD_DATS+4)				; CAT TABLE. абсолютный номер сектора младшая часть
	LD IX,(MSD_DATS+6)				; абсолютный номер сектора старшая часть
	LD B,32						; число читаемых секторов
CatPage+1:
	LD A,15						; страница буфера, если адрес в окне #C000
	LD C,BIOS.HDD_READ							
	RST ToBIOS					; загрузить CAT
	RET
;---------------------------------------

MSD_DATS:		WORD 0,0,0,0,0,0,0,0

SND_SEC1:		DW 12525			; начальный сектор
SND_SEC2:		DW 0
SND_L1:			DW #1720			; длина
SND_L2:			DW 0

SND_S1:			DW 12525			; текуший сектор
SND_S2:			DW 0
SND_C1:			DW #1720			; остаток до конца
SND_C2:			DW 0

SET_SND_FILE:
	IFN YesSound
	 ret
	ENDIF

	CALL OPEN_FILE
	RET C

	LD (SND_SEC1),IX					; сектор музыки!!!
	LD (SND_SEC2),HL
	LD HL,(FILE_DATA+2)
	LD DE,(FILE_DATA+4)
	AND A
	RR D
	RR E
	RR H
	LD L,H
	LD H,E
	LD E,D
	LD D,0
	LD (SND_L1),HL						; длина в секторах
	LD (SND_L2),DE						; длина в секторах
	AND A
	RET

SWITCH_SND:
NAME_S+1: LD DE,NAME1
	CALL SET_SND_FILE
	JR C,SWITCH_X

	LD HL,(NAME_S)
	LD BC,16
	ADD HL,BC
	LD (NAME_S),HL
	RET

SWITCH_X:
	LD HL,NAME1
	LD (NAME_S),HL
	JR SWITCH_SND

FILE_DATA:
			DW 0						; начальный кластер
			DW 0,0						; длина файла

			DW 0						; текущий кластер
			DW 0,0						; текущее положение в файле
			DW 0						; текущий номер сектора в кластере
;
OPEN_FILE:								; DE - name
	CALL FIND_FILE
	RET C

	LD C,SLOT3
	IN B,(C)

	PUSH BC
	LD A,(CatPage)
	OUT (C),A
	LD BC,26
	ADD HL,BC
	LD DE,FILE_DATA
	LD BC,6
	LDIR

	POP BC
	OUT (C),B

	LD HL,(FILE_DATA)
	LD (FILE_DATA+6),HL
	LD HL,0
	LD (FILE_DATA+8),HL
	LD (FILE_DATA+10),HL
	LD (FILE_DATA+12),HL

	LD IX,(FILE_DATA)					; номер первого кластера
	DEC IX
	DEC IX								; -2 !!!
	LD HL,0
	SCF
	LD DE,(MSD_DATS+13)					; длина кластера в байтах
	RR D
	RR E
SEC_MUL:
	RR D
	RR E
	JR C,SECT_X
	ADD IX,IX
	ADC HL,HL
	JR SEC_MUL

SECT_X:
	LD DE,(MSD_DATS+8)
	ADD IX,DE
	LD DE,(MSD_DATS+10)
	ADC HL,DE			; HL:IX - номер первого сектора файла

	AND A
	RET
;
;DE - name - 11 символов
FIND_FILE:
;
	LD C,SLOT3
	IN B,(C)
	PUSH BC

	LD A,(CatPage)
	OUT (C),A

	LD HL,#C000

NEXT_LOOP:
	LD B,11
	PUSH DE

NAME_LOOP:
	LD A,(DE)
	CP (HL)
	JR NZ,NEXT_NAME
	INC HL
	INC DE
	DJNZ NAME_LOOP

	POP DE
	LD A,L
	AND #E0
	LD L,A

	POP BC
	OUT (C),B
	AND A
	RET				; HL - данные файла в странице 6

NEXT_NAME:
	POP DE
	LD A,L
	AND #E0
	LD L,A
	LD BC,#20
	ADD HL,BC
	LD A,(HL)
	AND A
	JR Z,END_CAT
	LD A,H
	AND A
	JR NZ,NEXT_LOOP

END_CAT:
	POP BC
	OUT (C),B
	SCF
	RET

HDD_FN:
	EX AF,AF'
		IN A,(FastRAM.OFF)
		IN A,(SLOT1)
		PUSH AF
		IN A,(SLOT3)
		PUSH AF
		LD A,5			;!FIXIT
		OUT (SLOT1),A
DOOM2_SndPage+1:
		LD A,0
		OUT (SLOT3),A

		IN A,(PORT_Y)
		PUSH AF
	EX AF,AF'
	
	RST ToBIOS							; читать сектора с винчестера, функция #45
	;DI

	POP AF
	OUT (PORT_Y),A
	POP AF
	OUT (SLOT3),A
	POP AF
	OUT (SLOT1),A
	IN A,(FastRAM.ON)						; включаем кэш
	RET
;
;
BPB_SetUp:
	LD	A,SYS_PAGE
	LD	HL,SYS_PAGE.MS_BPB
	LD	C,BIOS.HDD_READ_BPB
	RST	ToBIOS
.PARAMS:
	DI
	IN A,(SLOT3)
	EX AF,AF'
	LD A,SYS_PAGE
	OUT (SLOT3),A

	LD A,(SYS_PAGE.MS_BPB+FORM_CODE)
	CP #F0
	JP C,.ERROR_BPB

	LD HL,SYS_PAGE.MS_BPB+FAT_ID
	LD DE,.FAT1_MSG
	LD B,4
.L1:	LD A,(DE)
	CP ' '
	JR NZ,.L11
	INC DE
	JR .L1
.L11:	CP (HL)
	JR NZ,.PC_DOS

	INC HL
	INC DE
	DJNZ .L1
	LD A,(HL)
	CP '6'
	LD HL,#81FF	; FAT16 флаг
	JR Z,.FAT
	CP '2'
	JP NZ,.ERROR_BPB

.PC_DOS:
	LD HL,#01FF	; FAT12 флаг
.FAT:	LD (SYS_PAGE.FAT_FLAG),HL

	LD A,(SYS_PAGE.MS_BPB+S_P_T)	; Количество секторов на трек
	LD (SYS_PAGE.MSD_SECS),A

	BIT 7,H

	LD IX,0
        LD HL,0				; вычислить начальный сектор FAT

	JR Z,.NO_LD_SPECIAL
	LD IX,(SYS_PAGE.MS_BPB+SPECIAL_SECS)
	LD HL,(SYS_PAGE.MS_BPB+SPECIAL_SECS+2)
.NO_LD_SPECIAL:
	LD BC,0
	LD DE,(SYS_PAGE.MS_BPB+RESERV_SECS)

	ADD IX,DE
	ADC HL,BC

	LD (SYS_PAGE.MSD_FAT_SEC),IX	; начальный сектор FAT
	LD (SYS_PAGE.MSD_FAT_SEC2),HL	; начальный сектор FAT

        LD DE,(SYS_PAGE.MS_BPB+S_P_F)    	; число секторов в FAT
	LD BC,0

        LD A,(SYS_PAGE.MS_BPB+FATS_NUM)  	; количество FATs
.NEXT_ADD:
	ADD IX,DE
	ADC HL,BC
	DEC A
	JR NZ,.NEXT_ADD

        LD (SYS_PAGE.MSD_CAT_SEC),IX       	; начальный сектор DIR
        LD (SYS_PAGE.MSD_CAT_SEC2),HL       	; начальный сектор DIR

	LD BC,(SYS_PAGE.MS_BPB+SEC_SIZE)	; Размер сектора
	RL C
	RL B
	RL C
	RL B
	RL C
	RL B
	LD C,B
	LD B,0			; BC - число файловых записей в секторе
	LD A,C
	LD (SYS_PAGE.F_P_S),A

	LD DE,(SYS_PAGE.MS_BPB+FLS_NUM)		; Число файловых записей

	EX DE,HL
	DEC HL
	XOR A
.NEXT_ADD2:
	INC A
	JR Z,.ERROR_BPB
	SBC HL,BC
	JR NC,.NEXT_ADD2
	EX DE,HL

	LD E,A			; A - число секторов в DIR
	LD D,0
	LD BC,0
	LD (SYS_PAGE.S_P_C),A

	ADD IX,DE		; Начало DATA area
	ADC HL,BC

	LD (SYS_PAGE.MSD_DAT_SEC),IX
	LD (SYS_PAGE.MSD_DAT_SEC2),HL

	LD BC,(SYS_PAGE.MS_BPB+SEC_SIZE)	; Размер сектора
	LD HL,0
	LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE)
	LD D,A
	LD A,0
.NEXT_ADD3:
	ADD HL,BC		; Вычисление длины кластера
	ADC A,0
	DEC D
	JR NZ,.NEXT_ADD3

	LD (SYS_PAGE.CLASTER_LEN),HL
	LD B,0
	LD C,A
	LD (SYS_PAGE.CLASTER_LEN2),BC

	LD HL,0
	LD BC,(SYS_PAGE.MS_BPB+S_P_T)
	LD A,(SYS_PAGE.MS_BPB+H_P_S)
.BPB_L1:; ВЫЧИСЛИТЬ КОЛИЧЕСТВО СЕКТОРОВ НА ЦИЛИНДР
	ADD HL,BC
	DEC A
	JR NZ,.BPB_L1
	LD (SYS_PAGE.S_X_H),HL
	;
	EX AF,AF'
	OUT (SLOT3),A
	EI
	AND A
	RET
.ERROR_BPB:
	EX AF,AF'
	OUT (SLOT3),A
	SCF
	EI
	RET
	;
.FAT1_MSG:
	DB 'FAT1'