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