;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; INCLUDE 'Shared_Includes/structures/FileSystem.inc' ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; ; in: HL - CLUSTER ; out: HL:IX - SECTOR ; Вначале должна быть выполнена инициализация BPB 4x CLUSTER_TO_SECTOR: IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE) EX DE,HL LD HL,(SYS_PAGE.MSD_DAT_SEC) LD (.MSD_DAT_SEC),HL LD HL,(SYS_PAGE.MSD_DAT_SEC2) LD (.MSD_DAT_SEC2),HL EX DE,HL 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 .MSD_DAT_SEC+1: LD DE,0 ;first data sector ;!FIXIT а если начальный сектор > #FFFF XOR A ADD IX,DE .MSD_DAT_SEC2+1: LD DE,0 ADC HL,DE ;!TODO а надо ли проверять переполнение HL:IX? RET ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; SET_IMAGE_DIR_SECTOR: LD HL,ONE_FILE LD DE,TMP_BUFF LD A,FAT_ATTR.DIRECTORY LD BC,Dss.F_First.FATname RST ToDSS RET C ; LD HL,(TMP_BUFF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) CALL CLUSTER_TO_SECTOR LD (RESET_TO_ZX.DIR_SEC_L),IX LD (RESET_TO_ZX.DIR_SEC_H),HL RET ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; SET_CURRENT_HDD: .NUMBER+1: LD A,#FF CP #FF LD C,BIOS.HDD_INIT JP Z,ToBIOS LD C,BIOS.HDD_PART ; IDE-1/IDE-2 JP ToBIOS ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; BPB_SetUp: LD A,SYS_PAGE LD HL,SYS_PAGE.MS_BPB LD C,BIOS.HDD_READ_BPB RST ToBIOS .PARAMS: 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 DE,SYS_PAGE.MS_BPB+FAT_ID LD HL,.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,(DE) 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 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 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) ; Размер сектора LD A,B RL C RLA RL C RLA RL C RLA LD C,A LD B,0 ; BC - число файловых записей в секторе LD (SYS_PAGE.FilesPerSector),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 BC,0 LD D,B LD (SYS_PAGE.SectorsPerCluster),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) ; Размер сектора ; D = 0 LD H,D LD L,D LD E,D LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE) LD D,A XOR A .NEXT_ADD3: ADD HL,BC ; Вычисление длины кластера ADC A,E DEC D JR NZ,.NEXT_ADD3 LD (SYS_PAGE.CLUSTER_LEN),HL LD B,E LD C,A LD (SYS_PAGE.CLUSTER_LEN2),BC ; ; DE=0 EX DE,HL ;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 AND A RET ; .ERROR_BPB: EX AF,AF' OUT (SLOT3),A SCF RET ; .FAT1_MSG: DB "FAT1" ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;