;----------------------------------------------------------------------- ;!FIXIT переделать музло на API 5x ;-------[инициализация винчестера]------; INIT_HDD_WORK: .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) EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A ; LD HL,SYS_PAGE.MSD_FAT_SEC LD DE,MSD_DATS LD BC,16 LDIR EX AF,AF' OUT (SLOT3),A ;[ ] music and dirs LD HL,SND_DIR LD DE,Temp_Buffer LD A,FAT_ATTR.DIRECTORY LD BC,Dss.F_First RST ToDSS JR NC,.start_setup ; LD A,#C9 ; RET opcode - disable music LD (SoundOnOff2),A RET ; ;LD HL,(SYS_PAGE.MS_BPB + _sBOOT_SEC.B_P_S) ; LD BC,(Temp_Buffer+26) ; first dir cluster ; LD A,(SYS_PAGE.MS_BPB + _sBOOT_SEC.S_P_C) ; LD E,A ; LD D,0 ; LD HL,0 ; LD IX,0 ; .cluster_loop: ; ADD HL,DE ; CALL C,KOSTILYI ; DEC BC ; LD A,B ; OR C ; JR NZ,.cluster_loop .start_setup: ;-=-=-=-=-=-=-=- LD HL,(Temp_Buffer+26) ; first dir cluster CALL NSECTOR LD (MSD_DATS.MSD_CAT_SEC2),HL LD (MSD_DATS.MSD_CAT_SEC),IX ;JP READ_DIR ;-=-=-=-=-=-=-=- ; В FAT12/FAT16 для корневого каталога выделено место между FAT и данными. ; Как узнать его размер в секторах? Число элементов корневого каталога умножаем на 32, ; добавляем размер сектора, вычитаем единицу и делим это всё на размер сектора. ; Кластер папки #2258 ; IX:HL относительный сектор папки #897E0 (E0 97 08 00) ; .skip_dir: ; LD DE,(MSD_DATS.MSD_CAT_SEC) ; CAT TABLE. абсолютный номер сектора младшая часть ; LD IX,(MSD_DATS.MSD_CAT_SEC2) ; абсолютный номер сектора старшая часть ;-----[читать секторы с винчестера]----- READ_DIR: LD HL,#C000 ; адрес буфера данных LD DE,(MSD_DATS.MSD_CAT_SEC) ; CAT TABLE. абсолютный номер сектора младшая часть LD IX,(MSD_DATS.MSD_CAT_SEC2) ; абсолютный номер сектора старшая часть LD B,32 ; число читаемых секторов CatPage+1: LD A,0 ; страница буфера, если адрес в окне #C000 LD C,BIOS.HDD_READ ; IX:DE - абсолютный номер сектора RST ToBIOS ; загрузить CAT RET ; KOSTILYI: ; INC IX ; RET ;--------------------------------------- MSD_DATS: .MSD_FAT_SEC DW 00 .MSD_FAT_SEC2 DW 00 .MSD_CAT_SEC DW 00 .MSD_CAT_SEC2 DW 00 .MSD_DAT_SEC DW 00 .MSD_DAT_SEC2 DW 00 .CLASTER_LEN DW 00 .CLASTER_LEN2 DW 00 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: 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.CLASTER_LEN + 1) ; длина кластера в байтах 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.MSD_DAT_SEC) ADD IX,DE LD DE,(MSD_DATS.MSD_DAT_SEC2) 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 ; LD A,CBL.BUFFER_PAGE OUT (SLOT3),A IN A,(PORT_Y) PUSH AF EX AF,AF' RST ToBIOS ; читать сектора с винчестера, функция #45 ; 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' ;-=-=-=-=-=-=-=- ; in: HL - CLUSTER ; out: HL:IX - SECTOR NSECTOR: IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE) EX AF,AF' OUT (SLOT3),A EX AF,AF' ; LD DE,0 ;!FIXIT for FAT32 DEC HL DEC HL XOR 1 JR Z,.skip ; RRA .loop: ADD HL,HL RL E RL D ; RRA JP NC,.loop ; .skip: EX DE,HL LD XL,E LD XH,D LD DE,(MSD_DATS.MSD_DAT_SEC) ;first data sector ;!FIXIT а если начальный сектор > #FFFF XOR A ADD IX,DE LD D,A LD E,A ADC HL,DE ;!TODO а надо ли проверять переполнение HL:IX? RET ;-=-=-=-=-=-=-=-