diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 4938c26..770ac93 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -130,28 +130,48 @@ DISKINF: LD C,B POP BC RET C ; -.CheckFreeSpace: +.CheckFreeSpace:; если GetFreeSpace не вызывается XOR A OR B + LD A,#FF + LD B,A + LD C,A + EXX + LD B,A + LD C,A + EXX CALL NZ,.GetFreeSpace ; ;.FRESP2: - LD D,B - LD E,C + ; A = 0 if B != 0 before .GetFreeSpace + ; + LD H,B + LD L,C + ; LD DE,2 + ; SBC HL,DE + EX DE,HL + EXX + LD H,B + LD L,C + ; LD DE,2 + ; SBC HL,DE + EX DE,HL + EXX LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow) DEC HL ; fat 32 EXX - LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh) + LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh) + JR NC,.skip_dec_hl DEC HL - EXX +.skip_dec_hl: EXX LD BC,(CORE_BUFFERS.FatBuffer.BytesPerSector) LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) AND A RET ; .GetFreeSpace: XOR A - LD HL,2 ; [ ] fat32 ? номер кластера от которого считать + LD HL,2 ; fat32 номер кластера от которого считать ; fat32 EXX LD H,A @@ -181,6 +201,7 @@ DISKINF: LD C,B OR E OR D JR NZ,.skip + ; INC BC LD A,B OR C @@ -188,6 +209,7 @@ DISKINF: LD C,B EXX INC BC EXX + ; .skip: INC HL LD A,L OR H @@ -195,7 +217,7 @@ DISKINF: LD C,B EXX INC HL EXX - JR .loop_free_space + JP .loop_free_space ; ; [ ] 22/11/23 подфункция с доп.инфой .mCOPY_LOOP: LD B,0 diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 7fcd78a..ba6fd0a 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -12,16 +12,22 @@ ; сбрасывает значение свободных кластеров на "неопределено" ; меняет значение первого свободного кластера -SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.RESET_FSINFO) +SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 + RET NZ + ; + LD A,(CORE_BUFFERS.FatBuffer.UPD_FSINFO) OR A RET Z ; + ;!TODO формировать самому в буфер CALL READ_FSinfo ; ;!TODO FREE_CLUSTERS_COUNT - LD HL,#FFFF - LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER),HL - LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2),HL + LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L) + LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT),HL + LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H) + LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2),HL ; FIRST_FREE_CLUSTER LD HL,(G_CLUST.low) LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER),HL @@ -29,7 +35,7 @@ SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.RESET_FSINFO) LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2),HL ; XOR A - LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A + LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A JR WRITE_FSinfo ; ; ; Прочитать BPB в SECTOR_BUFFER @@ -831,7 +837,7 @@ RD_BPB: ; LD C,SLOT3 PUSH HL ; Total Sectors low SBC HL,DE ; -.HDDBIG: CALL ClusterToSector +.HDDBIG: CALL SectorToCluster ; LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) ; SCF ; .loop7: RRA @@ -938,8 +944,8 @@ RD_BPB: ; LD C,SLOT3 LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),BC - - CALL ClusterToSector + ; + CALL CLUSTER_TO_SECTOR LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_H),BC ; @@ -1007,7 +1013,7 @@ RD_BPB: ; LD C,SLOT3 DJNZ .fsinfo_loop ; .error_sig: XOR #FF - LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A + LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A ; XOR A LD H,A @@ -1030,27 +1036,32 @@ RD_BPB: ; LD C,SLOT3 LD DE,#6141 SBC HL,DE JR NZ,.error + ;!TODO FREE_CLUSTERS_COUNT + LD BC,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT) + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2) + ; CF = 0 + CALL .check_cluster + JR NC,.skip_FFFF + ; + LD B,#FF + LD C,B + LD D,B + LD E,B + ; +.skip_FFFF: LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),BC + LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),DE + ; ; FIRST_FREE_CLUSTER - LD DE,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2) LD BC,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER) - LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow) + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2) ; CF = 0 - ;!TODO MaxCluster - максимально допустимый или на 1 больше максимально допустимого? - SBC HL,BC - LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh) - SBC HL,DE + CALL .check_cluster JR C,.error ; LD (G_CLUST.high),DE LD (G_CLUST.low),BC - ;!TODO FREE_CLUSTERS_COUNT - ;LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT) - ;LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL - ;LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2) - ;LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL - ; XOR A -.error: LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A +.error: LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A RET Z ;!TODO FREE_CLUSTERS_COUNT ;LD HL,#FFFF @@ -1064,12 +1075,19 @@ RD_BPB: ; LD C,SLOT3 LD L,H LD (G_CLUST.high),HL RET + ; + ;!TODO MaxCluster - максимально допустимый или на 1 больше максимально допустимого? +.check_cluster: LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow) + SBC HL,BC + LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh) + SBC HL,DE + RET ENDIF ;;;;;;;; -; --> BC:HL - Cluster -; <-- BC:HL - Sector -ClusterToSector: +; --> BC:HL - Sector +; <-- BC:HL - Cluster +SectorToCluster: LD A,B AND #0F LD B,A diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index 97fbb35..200492e 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -16,7 +16,7 @@ ; Удаляет запись в каталоге и освобождает занятую цепочку кластеров ; Вход: IX - указатель на удаляемую запись в DIRPAGE ;!TODO record index. возможно, что может сломаться, если больше страницы -DELETE_REC_FAT: SET_PAGE_X DIRPAGE: +DELETE_REC_FAT: SET_PAGE_X DIRPAGE EX AF,AF' CALL DELETE_LFN_RECORDS ; [x] удаление записи LFN LD (IX + FAT_DIRECTORY_RECORD.NAME),#E5 ; признак удаления файла @@ -68,6 +68,7 @@ DELETE_REC_FAT: SET_PAGE_X DIRPAGE: ; Вход: HL':HL - cluster ; портит DE, BC' и A ; [x] раньше был шанс упереться в "DISK FULL" если G_CLUST указывал на кластер дальше, чем другой свободный +; [ ] free clusters for FSInfo SET_NEW_FREE_CLUSTER: XOR A ;LD B,D @@ -138,16 +139,62 @@ G_CLUST: ; LD (G_CLUST.high),HL EXX INC A - LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A + LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A + ; [ ] free clusters for FSInfo + ; XOR A ; уменьшить + ; CALL SET_NEW_FREE_CLUSTERS RET +; Вход: A - уменьшить (0) или увеличить (!0) число свободных кластеров +SET_NEW_FREE_CLUSTERS: + PUSH HL + EXX + PUSH HL + LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H) + EXX + LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L) + ; + OR A + JR Z,.dec_clusters + ; inc clusters + INC HL + LD A,H + OR L + JR NZ,.set_new + EXX + INC HL + EXX + ; +.set_new: LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL + EXX + LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL + POP HL + EXX + POP HL + LD A,1 + LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A + RET + ; +.dec_clusters: LD A,H + OR L + DEC HL + JR NZ,.set_new + EXX + DEC HL + EXX + JP .set_new +; ; + ; ; [x] fat32 ;!TEST ; Прикрепить к последнему кластеру цепочки новый пустой кластер ; Вход: HL':HL - номер кластера к которому прикрепить пустой ; Выход: HL':HL - номер кластера к которому прикрепился пустой ; DE':DE - номер пустого кластера -INC_FAT: PUSH HL ; текущий кластер +INC_FAT: ; [ ] free clusters for FSInfo + ; + ; + PUSH HL ; текущий кластер EXX PUSH HL ; текущий кластер EXX @@ -210,7 +257,7 @@ CHECK_CLUSTER_IS_SMALLER: LD A,DSS_Error.sys.DISK_FULL RET C RET NZ - ; проверяем младше слово номера кластера + ; проверяем младшее слово номера кластера .low: EX DE,HL LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow) SBC HL,DE @@ -585,9 +632,7 @@ WRITE_FAT_TABLE: OUT (SLOT3),A RET ; Запись кеша FAT-а на диск -.Start: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) - CP FAT_TYPE.x32 - CALL Z,SET_FSInfo +.Start: CALL SET_FSInfo LD HL,(CORE_BUFFERS.FatBuffer.CacheBlock) ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT CALL GET_SECTOR_OF_FAT diff --git a/DSS/Media_drivers/fdd-drv.asm b/DSS/Media_drivers/fdd-drv.asm index c3a3082..50104cf 100644 --- a/DSS/Media_drivers/fdd-drv.asm +++ b/DSS/Media_drivers/fdd-drv.asm @@ -172,10 +172,15 @@ FDDRIVE: .STAT: XOR A RET -;!FIXIT проверять ВГ93 когда это станет возможным -.CHEK: LD A,#FF - AND A - RET + +.CHEK: ;!FIXIT проверять ВГ93 когда это станет возможным + IF NON_REMOVABLE_FDD + XOR A + ELSE + LD A,#FF + OR A + ENDIF + RET ;DE - ADDRESS .GBPB: LD IX,0 diff --git a/DSS/Structures.inc b/DSS/Structures.inc index a4eedd7..1c8cc57 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -103,7 +103,7 @@ .FSINFO_Sector WORD #01 .BPB_SERIAL_NUMBER DWORD #00000000 .BPB_LABEL BLOCK 11,' ' ; 11 для FAT, 31 для CDFS -.RESET_FSINFO BYTE 0 +.UPD_FSINFO BYTE 0 ; IF USE_FSINFO_FAT32 ;.FREE_CLUSTERS_COUNT_L WORD #FFFF ;.FREE_CLUSTERS_COUNT_H WORD #FFFF diff --git a/DSS/build.txt b/DSS/build.txt index fbee9e3..c9ebe15 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -982 \ No newline at end of file +978 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 33a4515..c85ad2d 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -102,6 +102,7 @@ DSS_MAX_DRIVES_AMOUNT EQU 26 DEFINE EnoughtOnly_LF 0 DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55 DEFINE CHECK_DRIVE_CHANGE 1 ; 1 - тормознее, но безопаснее + DEFINE NON_REMOVABLE_FDD 0 ; ;-------------------[MEMORY]-------------------------; DEFINE PORTAL.RSTx18_SWITCH_ADDRESS #82 diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index d58bf22..093e313 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -3,415 +3,405 @@ ; DIR. Вывод списка файлов и папок ; ;/////////////////////////////////////////////////// -cmd_dir: - push de - ;;;; [ ] поддержка параметров - ; зануляем все параметры на старте - xor a - ld (read_disk_info.full),a - ld (.key_p),a - - ; выполняем/настраиваем все найденные параметры в строке - LD C,256-3 ;!HARDCODE длина строки с командой -.parse: ld hl,cmd_dir_options - call RUN_OPTION - jr nc,.end_opt - jp (hl) -.end_opt: - ; выводим строку о расчёте свободного места так, чтоб она затёрлась - ld a,(read_disk_info.full) - and a - jr z,.skip - LD DE,MAIN_MSG.CALCULATING - CALL MESSAGE -.skip: ld c,Dss.CurDisk ; узнать тек. диск - RST ToDSS - ADD A,"A" - ld (root_path),a ; номер диска - SUB "A" - call read_disk_info ; прочитать метку и серийный номер диска - ; - pop de - ld hl,0 - ld (D88DC),hl - ld (D88DE),hl - ld (D88E0),hl - ld (dir_number),hl - - ex de,hl - ld de,work_buffer1 ; 80 - ld c,Dss.GSwitch ; выделить параметр ком-строки - RST ToDSS - ; - ld a,(work_buffer1) - or a - jr nz,1F ; задана маска имен - ; - ld hl,mask_fname ; "*.*" - ld de,work_buffer1 - call copy_string - ; [ ] 1/10/23 -1: ld hl,work_buffer1 ; имя файла - ld de,work_buffer1 ; 80 буфер - ld a,FAT_ATTR.NoVolID ; атрибут (все, кроме метки тома) - ld bc,Dss.F_First.FATname ; f_first (формат 11) - RST ToDSS - JR C,.dir_empty ;R14 - CALL .Print_Header - ; - LD A,32-5 ; количество строк до ожидания клавиши (с вычетом заголовка) ;!HARDCODE - PUSH AF - ; цикл вывода списка файлов/папок -.loop: POP AF -.key_p+1: and #ff - dec a - jr nz,.skip_wait - ld de,MAIN_MSG.PAUSE - call MESSAGE ; вывести строку - ld c,Dss.WaitKey - rst ToDSS - dec d - ld de,MAIN_MSG.DIR_ESCAPE - jp z,MESSAGE ; закончить по ESC - ;jr nz,.skip_esc - ;xor a - ;ld (.key_p),a ; отменяем ESC -.skip_esc: - ld a,32-1 -.skip_wait: - PUSH AF - ; - ld hl,work_buffer1+33 ; 80 - ;push af - ;ld de,33 - ;add hl,de - call A88E2 - ; - ld ix,work_buffer1 ; 80 - ld a,(ix+32) ; атрибут тек. записи - and FAT_ATTR.DIRECTORY ; папка ? - jr z,.calc_size ; нет - ; считаем папки - ; не считаем папкой служебные "." и ".." - ld d,(ix+33) - ld e,(ix+34) - ld hl,-('..') - add hl,de - ld a,h - or l - jr z,.next - ld hl,-('. ') - add hl,de - ld a,h - or l - jr z,.next - ; увеличиваем счётчик папок - ld hl,(dir_number) - inc hl - ld (dir_number),hl - jr .next - +cmd_dir: push de + ;;;; [ ] поддержка параметров + ; зануляем все параметры на старте + xor a + ld (read_disk_info.full),a + ld (.key_p),a + ; выполняем/настраиваем все найденные параметры в строке + LD C,256-3 ;!HARDCODE длина строки с командой +.parse: ld hl,cmd_dir_options + call RUN_OPTION + jr nc,.end_opt + jp (hl) +.end_opt: ; выводим строку о расчёте свободного места так, чтоб она затёрлась + ld a,(read_disk_info.full) + and a + jr z,.skip + LD DE,MAIN_MSG.CALCULATING + CALL MESSAGE +.skip: ld c,Dss.CurDisk ; узнать тек. диск + RST ToDSS + ADD A,"A" + ld (root_path),a ; номер диска + SUB "A" + call read_disk_info ; прочитать метку и серийный номер диска + ; + pop de + xor a + ld h,a + ld l,a + ld (FILES),hl + ld (dir_number),hl + ld (S_LOW),hl + ld (S_MED),hl + ld (S_HIGH),a + ; + ex de,hl + ld de,work_buffer1 ; 80 + ld c,Dss.GSwitch ; выделить параметр ком-строки + RST ToDSS + ; + ld a,(work_buffer1) + or a + jr nz,.skipMask ; задана маска имен + ; + ld hl,mask_fname ; "*.*" + ld de,work_buffer1 + call copy_string + ; [ ] 1/10/23 +.skipMask: ld hl,work_buffer1 ; имя файла + ld de,work_buffer1 ; 80 буфер + ld a,FAT_ATTR.NoVolID ; атрибут (все, кроме метки тома) + ld bc,Dss.F_First.FATname ; f_first (формат 11) + RST ToDSS + JR C,.Dir_Empty ;R14 + CALL Print_Header + ; + LD A,32-5 ; количество строк до ожидания клавиши (с вычетом заголовка) ;!HARDCODE + PUSH AF + ; цикл вывода списка файлов/папок +.loop: POP AF +.key_p+1: and #ff + dec a + jr nz,.skip_wait + ld de,MAIN_MSG.PAUSE + call MESSAGE ; вывести строку + ld c,Dss.WaitKey + rst ToDSS + dec d + ld de,MAIN_MSG.DIR_ESCAPE + jp z,MESSAGE ; закончить по ESC + ;jr nz,.skip_esc + ;xor a + ;ld (.key_p),a ; отменяем ESC +.skip_esc: ld a,32-1 +.skip_wait: PUSH AF + ld hl,work_buffer1+33 ; 80 + ;push af + ;ld de,33 + ;add hl,de + call PRNNAME + ; + ld ix,work_buffer1 ; 80 + ld a,(ix+32) ; атрибут тек. записи + and FAT_ATTR.DIRECTORY ; папка ? + jr z,.Calc_Size ; нет + ; считаем папки + ; не считаем папкой служебные "." и ".." + ld d,(ix+33) + ld e,(ix+34) + ld hl,-('..') + add hl,de + ld a,h + or l + jr z,.next + ld hl,-('. ') + add hl,de + ld a,h + or l + jr z,.next + ; увеличиваем счётчик папок + ld hl,(dir_number) + inc hl + ld (dir_number),hl + jr .next ;;R14 -.dir_empty: - push af - CALL .Print_Header - pop af - CALL print_err_message - jr .print +.Dir_Empty: push af + CALL Print_Header + pop af + CALL print_err_message + jr .print ;;R14 - - ; прибавить размер тек. файла -.calc_size: - ld hl,(D88DC) - inc hl - ld (D88DC),hl - ld e,(ix+30) - ld d,(ix+31) - ld hl,(D88E0) - exx - ld e,(ix+28) - ld d,(ix+29) - ld hl,(D88DE) - add hl,de - exx - adc hl,de - exx - ld (D88DE),hl - exx - ld (D88E0),hl -.next: ld de,work_buffer1 ; 80 буфер - ld c,Dss.F_Next ; поиск след. - RST ToDSS - jp nc,.loop ; назад в цикл, если не конец списка - ; - pop af ; баланс стека - ; Десятичный вывод -.print: ld hl,(D88DC) - ld ix,PRM1 ; буфер - call PDIGIT - ; - ld hl,(D88DE) ; мл. разряд - exx - ld hl,(D88E0) ; ст. разряд - exx - ; - CALL Size2Char - ;;;;;;;;;;;;; - ; -; [ ] вывод количества папок -; [ ] вывод общего количества свободного места - ld hl,T8B46 ; "0 000 000 000" - ld de,PRM2 ; куда - call ncopy_string ; скопир. строку (с нулем), макс.15 симв. - ; - ;!TEST - ;ld hl,(dir_number) - ;ld de,PRM3 - ;call hex2dec_ascii_16bit.n10000 - ; Десятичный вывод - ld hl,(dir_number) - ld ix,PRM3 ; буфер - call PDIGIT - ;xor a - ;ld (de),a - ; - ; - ;LD A,(read_disk_info.full) - ;OR A - ;ld hl,has_not_full_info - ;JR Z,.skip_full_space - ; - ld hl,(free_space_low) ; мл. разряд - exx - ld hl,(free_space_medium) ; ст. разряд - ;!FIXIT использовать старший разряд! free_space_high - exx - CALL Size2Char - ld hl,T8B46 ; "0 000 000 000" - ; -;.skip_full_space: - ld de,PRM4 ; куда - call ncopy_string ; скопир. строку (с нулем), макс.15 симв. - ; - ; - ld de,MAIN_MSG.DIR_2 ; индекс " %1 file(s) %2 bytes" - CALL MESSAGE ; вывести строку - ld a,(read_disk_info.full) - and a - ld de,MAIN_MSG.DIR_4 ; - jp nz,MESSAGE - ld de,MAIN_MSG.CRLF ; - jp MESSAGE - - -.Print_Header: - ; %1 - ld hl,PRM1 - ld a,'"' - ld (hl),a - inc hl - ld a,(screen_path) ; диск - ld (hl),a - inc hl - ld a,'"' - ld (hl),a - inc hl - ;ld (hl),":" - ld (hl),0 - ; %2 - ld hl,serial_string ; строка серийного номера диска - ld de,PRM2 ; куда - call ncopy_string ; скопир. строку (с нулем) - ; %3 - ld hl,screen_path ; !FIXIT если ввести "DIR gamez\*.*", то отображаемый путь в заголовке будет неверным - ld de,PRM3 ; 16 буфер - CALL copy_string ; скопир. строку (с нулем) - ; - ld de,MAIN_MSG.DIR_1 ; индекс "Volume in drive %1..." - JP MESSAGE ; вывести строку - ; -; + ; прибавить размер тек. файла +.Calc_Size: ld hl,(FILES) + inc hl + ld (FILES),hl + ld e,(ix+FAT_DIRECTORY_RECORD.F_SIZE+2) + ld d,(ix+FAT_DIRECTORY_RECORD.F_SIZE+3) + ld hl,(S_MED) + ld a,(S_HIGH) + exx + ld e,(ix+FAT_DIRECTORY_RECORD.F_SIZE) + ld d,(ix+FAT_DIRECTORY_RECORD.F_SIZE+1) + ld hl,(S_LOW) + add hl,de + ld (S_LOW),hl + exx + adc hl,de + ld (S_MED),hl + ;exx + adc a,0 + ld (S_HIGH),a + ;exx +.next: ld de,work_buffer1 ; 80 буфер + ld c,Dss.F_Next ; поиск след. + RST ToDSS + jp nc,.loop ; назад в цикл, если не конец списка + pop af ; баланс стека + ; Десятичный вывод +.print: ld hl,(FILES) + ld ix,PRM3 ; количество файлов + call PDIGIT + ; + ld a,(S_HIGH) + ld hl,(S_MED) ; ст. разряд + exx + ld hl,(S_LOW) ; мл. разряд + ;exx + ; + ;CALL PRINT_DWORD + CALL PRINT_5BYTES + ; + ; [ ] вывод количества папок + ; [x] вывод общего количества свободного места + ld hl,SIZE_BUFFER.high ; "000 000 000 000" + ld de,PRM1; + PRM2 ; размер файлов в каталоге + ld bc,SIZE_BUFFER.bytes + call ncopy_string.start ; скопир. строку (с нулем), макс. SIZE_BUFFER.bytes симв. + ; + ;!TEST + ;ld hl,(dir_number) + ;ld de,PRM3 + ;call hex2dec_ascii_16bit.n10000 + ; Десятичный вывод + ld hl,(dir_number) + ld ix,PRM4 ; кол-во каталогов в каталоге + call PDIGIT + ;xor a + ;ld (de),a + ; + ; + ;LD A,(read_disk_info.full) + ;OR A + ;ld hl,has_not_full_info + ;JR Z,.skip_full_space + ; + ld de,MAIN_MSG.DIR_2 ; индекс " %1 file(s), %2 bytes, %3 Dir(s)" + CALL MESSAGE ; вывести строку + ; + ld a,(read_disk_info.full) + and a + ld de,MAIN_MSG.CRLF + jp z,MESSAGE + ; + ld a,(free_space_high) + ld hl,(free_space_medium) ; ст. разряд + exx + ld hl,(free_space_low) ; мл. разряд + ;exx + call PRINT_5BYTES + ld hl,SIZE_BUFFER.high ; "000 000 000 000" + ld de,PRM1 ; and PRM2 ; куда + ld bc,SIZE_BUFFER.bytes + call ncopy_string.start ; скопир. строку (с нулем), макс. SIZE_BUFFER.bytes симв. + ld de,MAIN_MSG.DIR_4 ; индекс " %6 bytes free" + jp MESSAGE + ; +Print_Header: ; %1 + ld hl,PRM1 + ld a,'"' + ld (hl),a + inc hl + ld a,(screen_path) ; диск + ld (hl),a + inc hl + ld a,'"' + ld (hl),a + inc hl + ;ld (hl),":" + ld (hl),0 + ; %2 + ld hl,serial_string ; строка серийного номера диска + ld de,PRM2 ; куда + call ncopy_string ; скопир. строку (с нулем) + ; %3 + ld hl,screen_path ; !FIXIT если ввести "DIR gamez\*.*", то отображаемый путь в заголовке будет неверным + ld de,PRM3 ; 16 буфер + CALL copy_string ; скопир. строку (с нулем) + ; + ld de,MAIN_MSG.DIR_1 ; индекс "Volume in drive %1..." + JP MESSAGE ; вывести строку + ; ; Подготовить строку списка файлов/папок -A88E2: - dec hl - ld a,(hl) - and FAT_ATTR.DIRECTORY - call z,.set_small - inc hl - ; - ld bc,8 - ld de,PRM1 ; буфер - ldir - xor a - ld (de),a - ld de,PRM2 ; куда - ldi - ldi - ldi - ld (de),a - ld ix,work_buffer1 - call A89A4 ; вывести в буфер имя файла и его размер (у папки ) - call A89FA ; вывести в буфер дату файла/папки - call A8A19 ; вывести в буфер время файла/папки - ld de,MAIN_MSG.DIR_3 ; индекс "%1 %2 %3 %4 %5" - jp MESSAGE ; вывод строки - ; +PRNNAME: dec hl + ld a,(hl) + and FAT_ATTR.DIRECTORY + call z,.set_small + inc hl + ; + ld bc,8 + ld de,PRM1 ; буфер + ldir + xor a + ld (de),a + ld de,PRM2 ; куда + ldi + ldi + ldi + ld (de),a + ld ix,work_buffer1 + call PRNSIZE ; вывести в буфер имя файла и его размер (у папки ) + call PRNDATE ; вывести в буфер дату файла/папки + call PRNTIME ; вывести в буфер время файла/папки + ld de,MAIN_MSG.DIR_3 ; индекс "%1 %2 %3 %4 %5" + jp MESSAGE ; вывод строки + ; .set_small: - ld d,h - ld e,l - ld b,11 ;!HARDCODE длина имени DOS -.loop: inc hl - ld a,(hl) - cp 'A' - jr c,.next - cp 'Z'+1 - jr c,.letter - ; - cp 'А' ;#80 - jr c,.next - cp 'Я'+1 ;#9F + 1 - jr nc,.next -.letter: - or %0010'0000 - ld (hl),a -.next: djnz .loop - ex de,hl - ret + ld d,h + ld e,l + ld b,11 ;!HARDCODE длина имени DOS +.loop: inc hl + ld a,(hl) + cp 'A' + jr c,.next + cp 'Z'+1 + jr c,.letter + ; + cp 'А' ;#80 + jr c,.next + cp 'Я'+1 ;#9F + 1 + jr nc,.next + ; +.letter: or %0010'0000 + ld (hl),a +.next: djnz .loop + ex de,hl + ret ; Вывести в буфер имя файла и его размер (у папки ) -A89A4: ld a,(ix+32) - ld hl,T8B38 ; " " - and FAT_ATTR.DIRECTORY ; папка ? - jr nz,A89F4 ; да - ld l,(ix+28) ; мл. разряд - ld h,(ix+29) - exx - ld l,(ix+30) ; ст. разряд - ld h,(ix+31) - exx - push ix - call MAKE_LN ; десятичный 32-х разрядный вывод - ld hl,T8B37 - ld a,(hl) - cp " " - jr nz,A89CD - ld a,"0" - ld (hl),a -A89CD: ld de,T8B46 ; "0 000 000 000" - ld hl,L32BIT_ ; "0000000000" - ldi - ld a," " - ld (de),a - inc de - ldi - ldi - ldi - ld (de),a - inc de - ldi - ldi - ldi - ld (de),a - inc de - ldi - ldi - ldi - ld hl,T8B46 ; "0 000 000 000" - pop ix -A89F4: ld de,PRM3 ; 16 буфер - jp ncopy_string ; скопир. строку (с нулем), макс.15 симв. +PRNSIZE: ld a,(ix+32) + ld hl,DIRIDD ; " " + and FAT_ATTR.DIRECTORY ; папка ? + jr nz,.PRZ ; да + ld l,(ix+FAT_DIRECTORY_RECORD.F_SIZE) ; мл. разряд + ld h,(ix+FAT_DIRECTORY_RECORD.F_SIZE+1) + exx + ld l,(ix+FAT_DIRECTORY_RECORD.F_SIZE+2) ; ст. разряд + ld h,(ix+FAT_DIRECTORY_RECORD.F_SIZE+3) + exx + push ix + call MAKE_LN ; десятичный 32-х разрядный вывод + ld hl,L32BIT_.end + ld a,(hl) + cp " " + jr nz,.not_zero + ld a,"0" + ld (hl),a +.not_zero: ld de,SIZE_BUFFER.low ; "0 000 000 000" + ld hl,L32BIT_ ; "0000000000" + ldi + ld a," " + ld (de),a + inc de + ldi + ldi + ldi + ld (de),a + inc de + ldi + ldi + ldi + ld (de),a + inc de + ldi + ldi + ldi + ld hl,SIZE_BUFFER.low ; "0 000 000 000" + pop ix +.PRZ: ld de,PRM3 ; 16 буфер + jp ncopy_string ; скопир. строку (с нулем), макс.15 симв. ; Скопировать в буфер дату файла/папки -A89FA: ld b,(ix+25) - ld c,(ix+24) - ld hl,T8B46 ; "0 000 000 000" - call A8A53 ; вывод в буфер даты - ld (hl),0 - ld hl,T8B46 ; "0 000 000 000" - ld de,PRM4 ; 16 куда - ld a,(hl) - cp "0" - jr nz,$+4 - ld (hl)," " - jp ncopy_string ; скопир. строку (с нулем), макс.15 симв. - - +PRNDATE: ld c,(ix+FAT_DIRECTORY_RECORD.DATE) + ld b,(ix+FAT_DIRECTORY_RECORD.DATE+1) + ld hl,SIZE_BUFFER.low ; "0 000 000 000" + call MAKE_DATE ; вывод в буфер даты + ld (hl),0 + ld hl,SIZE_BUFFER.low ; "0 000 000 000" + ld de,PRM4 ; 16 куда + ; ld a,(hl) + ; cp "0" + ; jr nz,$+4 + ; ld (hl)," " + jp ncopy_string ; скопир. строку (с нулем), макс.15 симв. ; Скопировать в буфер время файла/папки -A8A19: ld b,(ix+22) - ld c,(ix+23) - ld hl,T8B46 ; "0 000 000 000" - call A8A38 ; скопир. в буфер время файла/папки - ld (hl),0 - ld hl,T8B46 ; "0 000 000 000" - ld de,PRM5 ; 80 буфер строки - ld a,(hl) - cp "0" - jr nz,$+4 - ld (hl)," " - jp ncopy_string ; скопир. строку (с нулем), макс.15 симв. - +PRNTIME: ld b,(ix+22) + ld c,(ix+23) + ld hl,SIZE_BUFFER.low ; "0 000 000 000" + call MAKE_TIME ; скопир. в буфер время файла/папки + ld (hl),0 + ld hl,SIZE_BUFFER.low ; "0 000 000 000" + ld de,PRM5 ; 80 буфер строки + ; ld a,(hl) + ; cp "0" + ; jr nz,$+4 + ; ld (hl)," " + jp ncopy_string ; скопир. строку (с нулем), макс.15 симв. ; в буфер время файла/папки -A8A38: srl c - rr b - srl c - rr b - srl c - rr b - srl b - srl b - ld a,c - call A8A7E - ld (hl),":" ; раздел. времени - inc hl - ld a,b - jr A8A7E - +MAKE_TIME: srl c + rr b + srl c + rr b + srl c + rr b + srl b + srl b + ld a,c + call toNumber + ld (hl),":" ; раздел. времени + inc hl + ld a,b + jr toNumber ; в буфер дату файла/папки -A8A53: ld a,c - and 1Fh - push bc - call A8A7E - ld (hl),"." ; раздел. даты - inc hl - pop bc - ld a,c - srl b - rla - rla - rla - rla - and 0Fh - call A8A7E - ld (hl),"." ; раздел. даты - inc hl - ld a,b - add a,80 - cp 100 - jr c,A8A7E -A8A75: sub 100 - cp 100 - jr nc,A8A75 -A8A7E: ld c,2Fh - inc c - sub 10 - jr nc,$-3 - add a,10 - add a,"0" - ld (hl),c - inc hl - ld (hl),a - inc hl - ret +MAKE_DATE: ld a,c + and #1F + push bc + call toNumber + ld (hl),"." ; раздел. даты + inc hl + pop bc + ld a,c + srl b + rla + rla + rla + rla + and #0F + call toNumber + ld (hl),"." ; раздел. даты + inc hl + ld a,b + add a,80 + cp 100 + jr c,toNumber +.loop: sub 100 + cp 100 + jr nc,.loop + ; +toNumber: ld c,#2F +.loop: inc c + sub 10 + jr nc,.loop + add a,10 + add a,"0" + ld (hl),c + inc hl + ld (hl),a + inc hl + ret ;!TODO перетащить в procedures/math.asm ; Десятичный 32-х разрядный вывод ; HL':HL - число для перевода +; !FIXIT можно объеденить с PDIGIT MAKE_LN: ld ix,L32BIT_ ; "0000000000" exx ld de,#3B9A @@ -419,7 +409,7 @@ MAKE_LN: ld ix,L32BIT_ ; "0000000000" ld de,#CA00 ; DE':DE = 1,000,000,000 call GET_DIG - exx +.skip_1: exx ld de,#05F5 exx ld de,#E100 @@ -456,7 +446,7 @@ MAKE_LN: ld ix,L32BIT_ ; "0000000000" ; DE':DE = 1,000 call GET_DIG ; 1,000...9,999 exx - ld de#00 + ld de,#00 exx ld de,#64 ; DE':DE = 100 @@ -480,14 +470,13 @@ MAKE_LN: ld ix,L32BIT_ ; "0000000000" inc hl jr .KILLZ ; -.KILLZ2: ld hl,T8B37 ; "0" +.KILLZ2: ld hl,L32BIT_.end ; "0" ld a,(hl) cp d ret nz ld (hl),e ret - GET_DIG: xor a .loop: inc a sbc hl,de @@ -507,20 +496,26 @@ GET_DIG: xor a ret ; -D88DC: WORD 0 -D88DE: WORD 0 -D88E0: WORD 0 +FILES: WORD 0 +S_LOW: WORD 0 +S_MED: WORD 0 +S_HIGH: BYTE 0 dir_number: WORD 0 free_space_low: WORD 0 free_space_medium: WORD 0 free_space_high: BYTE 0 ; +L40BIT_ db "00" L32BIT_: db "000000000" -T8B37: db "0" -T8B38: db " ",0 -T8B46: db "0 000 000 000",0 - db 0 +.end: db "0" +; +DIRIDD: db " ",0 +; +SIZE_BUFFER: +.high db "00" +.low: db "0 000 000 000",0,0 +.bytes equ SIZE_BUFFER - $ ; ; [x] теперь не лезет напрямую, делает через новый параметр функции DskInfo @@ -545,278 +540,344 @@ read_disk_info: OR #80 LD A,(.full) OR A JR Z,.no_full_space_option - ; - PUSH BC ; размер сектора в байтах EX AF,AF' - ; A - размер кластера в секторах ; - ; free_clu_L * clu_size_in_sect - LD C,A - EX AF,AF' - CALL Mult16X8 ; DE*C = A:HL - ; A:HL = DE*C - ; - ; free_clu_H * clu_size_in_sect - EX AF,AF' + ; --> (HL':HL)*BC*A, (DE':DE)*BC*A = B':HL'HL, C':DE':DE EXX - LD C,A - CALL Mult16X8 ; DE*C = A:HL - ; A:HL = DE*C - ; max #0FFF'FFFF sectors for LBA28 - EX AF,AF' - LD D,0 - LD E,A - ADD HL,DE + LD BC,0 + EXX + SRL B + RR C + RRCA + JR C,.loop2 + ; +.loop1: SLA L + RL H + EXX + RL L + RL H + RL B EXX ; - EX DE,HL - ; HL':DE - свободных секторов + SLA E + RL D + EXX + RL E + RL D + RL C + EXX + ; + RRCA + JP NC,.loop1 ; - POP BC ; размер сектора в байтах - PUSH BC - CALL Mult_16x16 ; DE*BC = HL:DE. +.loop2: SLA L + RL H EXX - POP BC - EX DE,HL - CALL Mult_16x16 ; DE*BC = HL:DE. - LD XH,D - LD XL,E + RL L + RL H + RL B EXX - EX DE,HL - ADD IX,DE - EX DE,HL + ; + SLA E + RL D EXX - JR NC,.no_inc_HL - INC L - ; потому что не должно быть больше #001F'FFFF'FE00 - ; при секторе в 512 байтов -.no_inc_HL: ; - LD A,L + RL E + RL D + RL C + EXX + ; + SRL B + RR C + JP NC,.loop2 + ; <-- B':HL'HL, C':DE':DE + ;!TODO выводить полный размер диска + EXX + LD A,C LD (free_space_high),A - LD (free_space_medium),IX + LD (free_space_medium),DE EXX LD (free_space_low),DE ; .no_full_space_option: - ; parse - LD D,0 - LD HL,work_buffer - ; тут в HL длина поля "Файловая система" - LD E,(HL) - ADD HL,DE - INC HL - ; длина поля "Серийный номер диска" - LD A,(HL) - LD E,A - ADD HL,DE - INC HL - PUSH HL ; указатель на длину поля "Метка диска" - CP 4 ;!HARDCODE длина поля серийного номера - JR NZ,unknown_serial - DEC HL - ; старшее слово серийника - LD D,(HL) - DEC HL - LD E,(HL) - DEC HL - PUSH HL - EX DE,HL - ld de,serial_string ; xxxx-xxxx - call hex16 - POP HL - ; - ld a,"-" - ld (de),a - INC DE - ; младшее слово серийника - LD A,(HL) - DEC HL - LD L,(HL) - LD H,A - call hex16 - ; + ; parse + LD D,0 + LD HL,work_buffer + ; тут в HL длина поля "Файловая система" + LD E,(HL) + ADD HL,DE + INC HL + ; длина поля "Серийный номер диска" + LD A,(HL) + LD E,A + ADD HL,DE + INC HL + PUSH HL ; указатель на длину поля "Метка диска" + CP 4 ;!HARDCODE длина поля серийного номера + JR NZ,unknown_serial + DEC HL + ; старшее слово серийника + LD D,(HL) + DEC HL + LD E,(HL) + DEC HL + PUSH HL + EX DE,HL + ld de,serial_string ; xxxx-xxxx + call hex16 + POP HL + ; + ld a,"-" + ld (de),a + INC DE + ; младшее слово серийника + LD A,(HL) + DEC HL + LD L,(HL) + LD H,A + call hex16 + ; - ; Метка диска - ; ld a,(disk) ; номер диска - ; cp 2 ; меньше "C:" ? - ; jr nc,get_inf_data1 ; метка в BPB + ; Метка диска + ; ld a,(disk) ; номер диска + ; cp 2 ; меньше "C:" ? + ; jr nc,get_inf_data1 ; метка в BPB -.get_label: - ; ищем метку в корне ФС раздела - ; уст. корень диска - ld hl,root_path ; "x:\",0 - ld c,Dss.ChDir - RST ToDSS - ; поиск метки - ld hl,mask_fname ; "*.*" имя метки - ld de,work_buffer1 ; куда - ld a,FAT_ATTR.VOLUME_ID ; атрибут метки тома - ld bc,Dss.F_First.FATname ; f_first, формат 11 - RST ToDSS - push af - call restore_path ; восст. тек. путь - pop af - ;jr c,no_volume_label ; метки нет дирректории - ld hl,work_buffer1+33 ; начало метки в буфере f_first - jr nc,volume_label ; метка в корневом каталоге - ; берём метку из BPB - ; тут в HL длина поля "Метка диска" - POP hl - LD A,(HL) - INC HL - AND A - jr z,.no_volume_label ; да - PUSH HL - LD B,A - LD A,' ' - ; -.loop: CP (HL) - JR NZ,.good_label - INC HL - DJNZ .loop - POP HL ; снимаем лишнее -; нет метки -.no_volume_label: - ; %4 - ld hl,volume_string_no ; строка - ld de,PRM4 ; куда - call ncopy_string ; скопир. строку (с нулем) - XOR A - LD (PRM5),A - ret -.good_label: - POP HL - PUSH HL ; лишнее - ; есть метка -volume_label: - pop DE ; лишнее - ; %5 - ld de,PRM5 - ld bc,11 ;!HARDCODE длина метки - ldir - xor a - ld (de),a - ; %4 - ld hl,volume_string_yes ; строка - ld de,PRM4 ; куда - call ncopy_string ; скопир. строку (с нулем) - ret - ; +.get_label: ; ищем метку в корне ФС раздела + ; уст. корень диска + ld hl,root_path ; "x:\",0 + ld c,Dss.ChDir + RST ToDSS + ; поиск метки + ld hl,mask_fname ; "*.*" имя метки + ld de,work_buffer1 ; куда + ld a,FAT_ATTR.VOLUME_ID ; атрибут метки тома + ld bc,Dss.F_First.FATname ; f_first, формат 11 + RST ToDSS + push af + call restore_path ; восст. тек. путь + pop af + ;jr c,no_volume_label ; метки нет дирректории + ld hl,work_buffer1+33 ; начало метки в буфере f_first + jr nc,volume_label ; метка в корневом каталоге + ; берём метку из BPB + ; тут в HL длина поля "Метка диска" + POP hl + LD A,(HL) + INC HL + AND A + jr z,.no_volume_label ; да + PUSH HL + LD B,A + LD A,' ' + ; +.loop: CP (HL) + JR NZ,.good_label + INC HL + DJNZ .loop + POP HL ; снимаем лишнее + ; нет метки +.no_volume_label:; %4 + ld hl,volume_string_no ; строка + ld de,PRM4 ; куда + call ncopy_string ; скопир. строку (с нулем) + XOR A + LD (PRM5),A + ret +.good_label: POP HL + PUSH HL ; лишнее + ; есть метка +volume_label: pop DE ; лишнее + ; %5 + ld de,PRM5 + ld bc,11 ;!HARDCODE длина метки + ldir + xor a + ld (de),a + ; %4 + ld hl,volume_string_yes ; строка + ld de,PRM4 ; куда + call ncopy_string ; скопир. строку (с нулем) + ret + ; ; если не удалось прочитать серийный номер диска или формат неизвестен -unknown_serial: - ; серийный номер диска - неизвестен ;!HARDCODE ниже - LD HL,serial_string - LD A,'?' - LD B,serial_string.Size -.loop: LD (HL),A - INC HL - DJNZ .loop - LD HL,serial_string+4 - LD (HL),'-' - ;POP HL ; лишнее - JP read_disk_info.get_label - ; +unknown_serial: ; серийный номер диска - неизвестен ;!HARDCODE ниже + LD HL,serial_string + LD A,'?' + LD B,serial_string.Size +.loop: LD (HL),A + INC HL + DJNZ .loop + LD HL,serial_string+4 + LD (HL),'-' + ;POP HL ; лишнее + JP read_disk_info.get_label + ; ; маска файлов -mask_fname: - db "*.*",0 +mask_fname: db "*.*",0 ; корень диска -root_path: - db 'X:\',0 +root_path: db 'X:\',0 ; Серийный номер диска -serial_string: - db "xxxx-xxxx" -.Size equ $-serial_string - db 0 ; закрывашка +serial_string: db "xxxx-xxxx" +.Size equ $-serial_string + db 0 ; закрывашка volume_string_no: - db "has no label",0 + db "has no label",0 volume_string_yes: - db "has label",0 + db "has label",0 ; has_not_full_info: -; db ' (?)',0 +; db ' (?)',0 ; -cmd_dir_options: - ; [ ] параметр /F - вывод количества свободного места на диске (тормозит, поэтому параметром) - DB 'f' : DW cmd_dir_freeSpace - DB 'p' : DW cmd_dir_pause -.Size EQU ($-cmd_dir_options)/3 +cmd_dir_options:; [ ] параметр /F - вывод количества свободного места на диске (тормозит, поэтому параметром) + DB 'f' : DW cmd_dir_freeSpace + DB 'p' : DW cmd_dir_pause +.Size EQU ($-cmd_dir_options)/3 .paramLength equ 3 ; ; cmd_dir_freeSpace: - ;PUSH DE - ;PUSH BC - ; затираем найденый ключ - ; ld A,'/' - ; ex de,hl - ; ld bc,4 - ; CPDR - ; inc hl - ; ld (hl),' ' - ; inc hl - ; ld (hl),' ' - - ; ставим опцию для API DSS DskInfo - ld a,1 - ld (read_disk_info.full),a - ; ; выводим строку о расчёте свободного места так, чтоб она затёрлась - ; LD DE,MAIN_MSG.CALCULATING - ; CALL MESSAGE - ; возвращаемся в цикл - ;POP BC - ;POP DE - jp cmd_dir.parse + ;PUSH DE + ;PUSH BC + ; затираем найденый ключ + ; ld A,'/' + ; ex de,hl + ; ld bc,4 + ; CPDR + ; inc hl + ; ld (hl),' ' + ; inc hl + ; ld (hl),' ' + ; + ; ставим опцию для API DSS DskInfo + ld a,1 + ld (read_disk_info.full),a + ; ; выводим строку о расчёте свободного места так, чтоб она затёрлась + ; LD DE,MAIN_MSG.CALCULATING + ; CALL MESSAGE + ; возвращаемся в цикл + ;POP BC + ;POP DE + jp cmd_dir.parse ; -cmd_dir_pause: - ld a,#ff - ld (cmd_dir.key_p),a - jp cmd_dir.parse +cmd_dir_pause: ld a,#ff + ld (cmd_dir.key_p),a + jp cmd_dir.parse /////////////////////////////////////////////////////////////////////////////////////// -Size2Char: - call MAKE_LN ; десятичный 32-х разрядный вывод - ld hl,T8B37 ; "0" - ld a,(hl) - cp " " - jr nz,.not_zero - ld a,"0" - ld (hl),a -.not_zero: - ld de,T8B46 ; "0 000 000 000" - ld hl,L32BIT_ ; "0000000000" - ld a,(hl) - ldi - cp " " - jr z,1F - ld a,"," ; разд. разрядов -1: ld (de),a - inc de - ldi - ldi - ld a,(hl) - ldi - cp " " - jr z,1F - ld a,"," ; разд. разрядов -1: ld (de),a - inc de - ldi - ldi - ld a,(hl) - ldi - cp " " - jr z,1F - ld a,"," ; разд. разрядов -1: ld (de),a - inc de - ldi - ldi - ldi - ret +GET_BIG_DIG: ld b,0 + and a +.loop: inc b + sbc hl,de + exx + sbc hl,de + exx + sbc a,c + jp nc,.loop + ; + exx + rr b + exx + adc hl,de + ; + exx + adc hl,de + exx + adc a,c + ; + ex af,af' + dec b + ld a,b + add a,"0" + ld (ix+0),a + ex af,af' + inc ix + ret + ; stop +PRINT_5BYTES: ld ix,L40BIT_ ; "00" + ld c,#17 + exx + ld de,#4876 + exx + ld de,#E800 + ; C:DE':DE = 100,000,000,000 + call GET_BIG_DIG + ; + ld c,#02 + exx + ld de,#540B + exx + ld de,#E400 + ; C:DE':DE = 10,000,000,000 + CALL GET_BIG_DIG + ; + ld c,#00 + exx + ld de,#3B9A + exx + ld de,#CA00 + ; C:DE':DE = 1,000,000,000 + CALL GET_BIG_DIG + ; + ; DE':DE = 100,000,000 + ; HL':HL ещё нужны + PUSH HL + LD HL,L40BIT_ + LD B,2 ;!HARDCODE 2 знака +.loop: LD A,(HL) + CP "0" + jr nz,.not_zero + LD (HL)," " +.not_zero: INC HL + DJNZ .loop + POP HL + CALL MAKE_LN.skip_1 + JR PRINT_DWORD.skip_LN + ; +PRINT_DWORD: call MAKE_LN ; десятичный 32-х разрядный вывод +.skip_LN: ld hl,L32BIT_.end ; "0" + ld a,(hl) + cp " " + jr nz,.not_zero + ld a,"0" + ld (hl),a +.not_zero: ld de,SIZE_BUFFER.high ; "0 000 000 000" + ld hl,L40BIT_ ; "0000000000" + ldi + ldi + ld a,(hl) + ldi + cp " " + jr z,1F + ld a,"," ; разд. разрядов +1: ld (de),a + inc de + ldi + ldi + ld a,(hl) + ldi + cp " " + jr z,1F + ld a,"," ; разд. разрядов +1: ld (de),a + inc de + ldi + ldi + ld a,(hl) + ldi + cp " " + jr z,1F + ld a,"," ; разд. разрядов +1: ld (de),a + inc de + ldi + ldi + ldi + scf + ret /////////////////////////////////////////////////////////////////////////////////////// @@ -825,6 +886,7 @@ Size2Char: ;Процедура умножения (16*8bit) ;На вход: DE * C ;На выход:A:HL = результат + IFUSED Mult32 Mult16X8: SUB A LD L,A LD H,A @@ -842,7 +904,8 @@ Mult16X8: SUB A ADD HL,DE ADC A,C .next: DJNZ .loop - RET + RET + ENDIF ;----------------------------------------------------------------------; ;----------------------------------------------------------------------; ;Процедура умножения (32bit) @@ -871,6 +934,7 @@ Mult32: PUSH IX ;----------------------------------------------------------------------; ;INPUT : DE * BC ;OUTPUT: HL:DE + IFUSED Mult32 Mult_16x16: LD IX,0 LD HL,0 ; @@ -898,4 +962,5 @@ Mult_16x16: LD IX,0 .exit: LD D,XH LD E,XL RET -/////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file + ENDIF +/////////////////////////////////////////////////////////////////////////////////////// diff --git a/SHELL/Messages/main_txt.asm b/SHELL/Messages/main_txt.asm index 8ec2ebb..c67f942 100644 --- a/SHELL/Messages/main_txt.asm +++ b/SHELL/Messages/main_txt.asm @@ -29,35 +29,40 @@ MAIN_MSG: stN .CRLF_ : db CR,LF,0; | ;________________/ ; - stN .DIR_1_ : db "Volume in drive %1 %4 %5",CR,LF - db "Volume Serial Number is %2",CR,LF - db CR,LF,"Directory of %3",CR,LF,LF,0 - stN .VERS_ : db "Estex DSS version %1. Shell version %2.",CR,LF,0 ;R13 - stN .DATE_ : db "Current date: %1, %2",CR,LF,0 ; [x] вывод дня недели 26/01/2023 - stN .TIME_ : db "Current time: %1",CR,LF,0 - stN .PAUSE_ : db "Press any key to continue . . .",CR,0 - stN .DIR_ESC_ : db 'Command "DIR" aborted by user ',CR,LF,CR,LF,0 - stN .INV_ : db "Invalid parametr",CR,LF,0 - stN .ECHO_ : db "Echo is %1",CR,LF,0 - stN .ON_ : db "on",0 - stN .OFF_ : db "off",0 - stN .DIR_2_ : db " %1 File(s) %2 bytes",CR,LF - db " %3 Dir(s) ",0 - stN .DIR_4_ : db "%4 bytes free",CR,LF,0 - ; db " %3 Dir(s) %4 bytes free",CR,LF,LF,0 -; : db " %3 Dir(s)",CR,LF,LF,0 - stN .DIR_3_ : db "%1 %2 %3 %4 - %5",CR,LF,0 ;FILENAME EXT SIZE DATE TIME - stN .HELP_ : db "COMMANDS:",CR,LF,CR,LF - db "DIR REN | RENAME PATH HELP ",CR,LF - db "CD | CHDIR DEL | ERASE SET VER | VERSION ",CR,LF - db "MD | MKDIR TIME ECHO EXIT ",CR,LF - db "RD | RMDIR DATE CLS REBOOT ",CR,LF,LF,0 - stN .CALC_ : db "Calculating free space...",CR,0 +; 1 2 3 4 5 6 7 +; 01234567890123456789012345678901234567890123456789012345678901234567890123456789; + stN .DIR_1_ : db "Volume in drive %1 %4 %5\r\n" + db "Volume Serial Number is %2\r\n" + DZ "\r\nDirectory of %3\r\n\n" + stN .VERS_ : DZ "Estex DSS version %1. Shell version %2.\r\n" ;R13 + stN .DATE_ : DZ "Current date: %1, %2\r\n" ; [x] вывод дня недели 26/01/2023 + stN .TIME_ : DZ "Current time: %1\r\n" + stN .PAUSE_ : DZ "Press any key to continue . . .\r" + stN .DIR_ESC_ : DZ "Command 'DIR' aborted by user \r\n\n" + stN .INV_ : DZ "Invalid parametr\r\n" + stN .ECHO_ : DZ "Echo is %1\r\n" + stN .ON_ : DZ "on" + stN .OFF_ : DZ "off" +; stN .DIR_2_ : db " %3 File(s) %1 byte(s)\r\n" +; DZ " %4 Dir(s) " +; stN .DIR_4_ : DZ "%1 bytes free\r\n" + stN .DIR_2_ : db " %3 File(s)\r %1 byte(s)\r\n" + DZ " %4 Dir(s)" + stN .DIR_4_ : DZ "\r %1 bytes free\r\n" +; stN .DIR_3_ : DZ "%1 %2 %3 %4 - %5\r\n" ;FILENAME EXT SIZE DATE TIME + stN .DIR_3_ : DZ "%4 %5 %3 %1 %2 \r\n" ;DATE TIME SIZE FILENAME EXT + stN .HELP_ : db "COMMANDS:\r\n" + db "DIR REN | RENAME PATH HELP \r\n" + db "CD | CHDIR DEL | ERASE SET VER | VERSION \r\n" + db "MD | MKDIR TIME ECHO EXIT \r\n" + DZ "RD | RMDIR DATE CLS REBOOT \r\n\n" + stN .CALC_ : DZ "Calculating free space...\r" ; ;R11 - db 0 - DZ "Unknown command" + db 0 + DZ "Unknown command" ; ; .TABLE.Size EQU $-.TABLE ; !txtCounter=0 -; \ No newline at end of file +; + ; \ No newline at end of file diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index 128f097..014d0ee 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -42,7 +42,7 @@ include 'shared_includes/constants/bios_equ.inc' include 'shared_includes/constants/dss_equ.inc' include 'SHELL/version.inc' - + include 'shared_includes/structures/FileSystem.inc' ; ; Program EQU section ;---------------------------------------------------------------------[] @@ -379,7 +379,7 @@ COMPARE: ; (hl) -> (de) ncopy_string: ld bc,15 ; макс. длина строки - ld a,(hl) +.start: ld a,(hl) ldi ret po or a @@ -457,7 +457,7 @@ STR2DEC: ;!FIXIT есть дубл hex2dec_ascii_16bit PDIGIT: ld de,10000 ld a,#C8 ; ret z - ld (.patch),a + ld (.RET_Z),a call .DIG ld de,1000 call .DIG @@ -467,31 +467,28 @@ PDIGIT: ld de,10000 call .DIG ld a,l add a,"0" - ;!TEST + ;!TEST пока не требуется передавать следующий IX дальше ;ld (ix+0),a ;inc ix ;ld (ix+0),0 LD (IX+0),A - LD (IX+1),0 + LD (IX+1),0 ; ret .DIG: xor a - inc a +.loop: inc a sbc hl,de - jr nc,$-3 + jr nc,.loop add hl,de dec a -.patch: ret z +.RET_Z: ret z add a,"0" ld (ix+0),a inc ix xor a ; nop - ld (.patch),a + ld (.RET_Z),a ret - - - Restore_Screen: PUSH AF LD C,Dss.GetVMod diff --git a/SHELL/build.txt b/SHELL/build.txt index 871cae9..136c8ca 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -323 \ No newline at end of file +342 \ No newline at end of file