diff --git a/BOOT/boot.asm b/BOOT/boot.asm
index 30be7ca..bd19f1c 100644
--- a/BOOT/boot.asm
+++ b/BOOT/boot.asm
@@ -1,4 +1,8 @@
-;!TODO определение попытки сделать загрузочным не первый раздел
+////////////////////////////////////////////////////////////////////////
+; CHANGELOG
+; [ ] - определение попытки сделать загрузочным не первый раздел
+////////////////////////////////////////////////////////////////////////
+
; Программа записи на FDD/HDD boot-загрузчика и файлов системы.
;
diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM
index 7ce405b..22f61ec 100644
--- a/DSS/DOS_X.ASM
+++ b/DSS/DOS_X.ASM
@@ -153,55 +153,141 @@ CURRDSK: LD A,(FatBuffer.DRIVE)
;/////////////////////////////////////////////////////////////////////
-; Функция #03. Информация о диске.
+; [ ] новая подфункция с битом 7 в рег. А
; Возвращает информацию об общем и свободном пространстве дискового
; устройства.
;
-; вход: A - номер диска (0=A,1=B,..#FF-текущий)
+; вход: A - номер диска (0=A,1=B .. 25=Z. #FF-текущий)
+; При A bit7 = 1:
+; HL - буфер (256 байтов) для расширенных данных:
+; B != 0 - считать свободное место
+; ;
+; размер поля - 1 байт
+; Файловая система
+; ;
+; размер поля - 1 байт
+; Серийный номер диска
+; ;
+; размер поля - 1 байт
+; Метка диска
+; ;
+; размер поля - 1 байт
+; Зарезервировано...
+; ;
+; A xor #80 - номер диска
+;
; выход: A - размер кластера в секторах, если CF=0
; HL - общее кол-во кластеров
; DE - свободных кластеров
; BC - размер сектора в байтах
; A - код ошибки, если CF=1
;/////////////////////////////////////////////////////////////////////
-DISKINF:
- CP #FF ; !FIXIT WorkDirectory
+ ; [ ] 22/11/23 подфункция с доп.инфой
+ MACRO _mCOPY_LOOP
+ LD C,A
+ LD B,0
+ LD (DE),A
+ INC DE
+ LDIR
+; .loop:
+; LD (HL),A
+; INC DE
+; INC HL
+; LD A,(DE)
+; DJNZ .loop
+ ENDM
+ ;
+DISKINF:; [ ] 22/11/23 подфункция с доп.инфой
+ CP #80
+ JR C,.CustomDisk
+ CP #FF
+ JR Z,.CurrentDisk
+ ; more info
+ PUSH HL
+ AND %0111'1111
+ CALL .CustomDisk
+ JR C,.error
+ ;
+ EX (SP),HL
+ PUSH AF
+ PUSH DE
+ PUSH BC
+ ;;;;
+ ;
+ EX DE,HL
+ LD HL,CORE_BUFFERS.BootSector.ID_FAT
+ LD A,8 ;!HARDCODE _sBOOT_SEC.ID_FAT.length
+ _mCOPY_LOOP
+ ;
+ LD HL,CORE_BUFFERS.BootSector.BPB_SERIAL_NUMBER
+ LD A,4 ;!HARDCODE _sBOOT_SEC.BPB_SERIAL_NUMBER
+ _mCOPY_LOOP
+ ;
+ LD HL,CORE_BUFFERS.BootSector.BPB_LABEL
+ LD A,11 ;!HARDCODE _sBOOT_SEC.BPB_LABEL
+ _mCOPY_LOOP
+ ;
+
+ XOR A
+ LD (DE),A
+ ;;;;
+ POP BC
+ POP DE
+ POP AF
+.error: POP HL
+ RET
+ ;
+
+ ;CP #FF ; !FIXIT WorkDirectory
;!TEST Current Dir
;JR Z,CURRDS ;R06
- JR NZ,.CustomDisk
+.CurrentDisk:
LD A,(CurrentPath)
SUB 'A'
LD HL,FatBuffer.DRIVE
CP (HL)
- JR Z,CURRDS
+ JR Z,.CheckFreeSpace
;
.CustomDisk:
+ PUSH BC
CALL CHNDISK ;R06
- RET C ;R06
-CURRDS:
- LD HL,2
- LD BC,0
-FRESP: PUSH BC
- CALL R_F_FAT
POP BC
- CP DSS_Error.sys.DISK_FULL
- JR Z,FRESP2
+ RET C ;R06
- LD A,E
- OR D
- JR NZ,SKIC
- INC BC
-SKIC: INC HL
- JP FRESP
-
-FRESP2: LD D,B
+.CheckFreeSpace:
+ ;
+ XOR A
+ OR B
+ CALL NZ,.CURRDS
+ ;
+ ;
+.FRESP2:
+ LD D,B
LD E,C
LD HL,(MAX_CLU)
DEC HL
LD BC,(CORE_BUFFERS.BootSector.B_P_S)
LD A,(CORE_BUFFERS.BootSector.S_P_C)
AND A
- RET
+ RET
+ ;
+.CURRDS:
+ LD HL,2
+ LD BC,0
+.FRESP: PUSH BC
+ CALL R_F_FAT
+ POP BC
+ CP DSS_Error.sys.DISK_FULL
+ RET Z
+
+ LD A,E
+ OR D
+ JR NZ,.SKIC
+ INC BC
+.SKIC: INC HL
+ JP .FRESP
+;
+
; Номер последнего диска в системе
LDRIVE: DB DSS_MAX_DRIVES_AMOUNT
diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm
index 8a769bc..ec9e206 100644
--- a/DSS/Media_drivers/ide-drv.asm
+++ b/DSS/Media_drivers/ide-drv.asm
@@ -446,7 +446,7 @@ GBPB_H: PUSH IY
POP IY
LD BC,1*256 + BIOS.DRV_READ
JP ToBIOS
- ;RET
+
;HL:IX - SECTOR
; DE - ADDRESS
diff --git a/DSS/build.txt b/DSS/build.txt
index a9ba125..a0d1ef1 100644
--- a/DSS/build.txt
+++ b/DSS/build.txt
@@ -1 +1 @@
-607
\ No newline at end of file
+620
\ No newline at end of file
diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM
index 9d1e598..f0a6352 100644
--- a/SHELL/Commands/DIR.ASM
+++ b/SHELL/Commands/DIR.ASM
@@ -3,10 +3,13 @@
; DIR. Вывод списка файлов и папок
;
;///////////////////////////////////////////////////
-cmd_dir: push de
+cmd_dir:
+ push de
ld c,Dss.CurDisk ; узнать тек. диск
RST ToDSS
- ld (disk+1),a ; номер диска
+ ADD A,"A"
+ ld (root_path),a ; номер диска
+ SUB "A"
call read_disk_info ; прочитать метку и серийный номер диска
pop de
ld hl,0
@@ -51,9 +54,15 @@ cmd_dir: push de
;ld ix,T9186
ld ix,work_buffer1 ; 80
ld a,(ix+32) ; атрибут тек. записи
- and 10h ; папка ?
- jr nz,.next ; да
+ and FAT_ATTR.DIRECTORY ; папка ?
+ jr z,.calc_size ; нет
+ ; увеличиваем счётчик папок
+ ld hl,(dir_number)
+ inc hl
+ ld (dir_number),hl
+ jr .next
; прибавить размер тек. файла
+.calc_size:
ld hl,(D88DC)
inc hl
ld (D88DC),hl
@@ -71,8 +80,7 @@ cmd_dir: push de
ld (D88DE),hl
exx
ld (D88E0),hl
-.next: ;ld de,T9186 ; раб. буфер
- ld de,work_buffer1 ; 80 буфер
+.next: ld de,work_buffer1 ; 80 буфер
ld c,Dss.F_Next ; поиск след.
RST ToDSS
jr nc,.loop ; назад в цикл, если не конец списка
@@ -123,6 +131,7 @@ cmd_dir: push de
ldi
ldi
ldi
+недоделано
ld hl,T8B46 ; "0 000 000 000"
ld de,PRM2 ; куда
call ncopy_string ; скопир. строку (с нулем), макс.15 симв.
@@ -163,7 +172,7 @@ cmd_dir: push de
ld de,0 ; индекс "Volume in drive %1 has no label..." ;!HARDCODE номер строки MSG0
JP MESSAGE ; вывести строку
-.str: DZ 'X:\ is empty' ;R14
+.str: DZ 'X:\ is empty' ;R14 ;!FIXIT
;
; Подготовить строку списка файлов/папок
@@ -402,127 +411,151 @@ A8B16: inc a
ld (ix+0),a
inc ix
ret
-
-
-
+;
D88DC: dw 0
D88DE: dw 0
D88E0: dw 0
-
-
+;
T8B2E: db "000000000"
T8B37: db "0"
T8B38: db "
",0
T8B46: db "0 000 000 000",0
db 0
-
-
-
-
+;
;!FIXIT перенести в DSS - FN #04: GET_BPB
; прочитать BPB диска
read_disk_info:
-disk: ld a,0 ; сохр. номер диска
- ld c,1 ; open device
- rst 18h
- jr c,get_inf_data_err ;!FIXIT нет обработчика ошибк
- ld a,(disk+1)
- ld de,work_buffer ; буфер
- ld c,4 ; get BPB
- rst 18h
- push af
- ld a,(disk+1) ; номер диска
- ld c,2 ; close device
- rst 18h
- pop af
- jr c,get_inf_data_err ;!FIXIT нет обработчика ошибки
-;
-get_inf_data_err:
-;
+ OR #80
+ LD HL,work_buffer
+ LD BC,Dss.DskInfo
+ RST ToDSS
+ ; Файловая система
+ ; Серийный номер диска
+ ; Метка диска в BPB
- ; Серийный номер лог. диска
- ld hl,(work_buffer+41) ; ст.часть
+ ; 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 hl,(work_buffer+39) ; мл.часть
+ INC DE
+ ; младшее слово серийника
+ LD A,(HL)
+ DEC HL
+ LD L,(HL)
+ LD H,A
call hex16
;
+
; Метка диска
- ld a,(disk+1) ; номер диска
- cp 2 ; меньше "C:" ?
- jr nc,get_inf_data1 ; метка в BPB
- ; floppy, метка - как запись файла
- ld c,Dss.ChDisk ; уст. диск
- RST ToDSS
+ ; ld a,(disk) ; номер диска
+ ; cp 2 ; меньше "C:" ?
+ ; jr nc,get_inf_data1 ; метка в BPB
+
+.get_label:
+ ; ищем метку в корне ФС раздела
; уст. корень диска
- ld hl,root_path ; "\",0
+ ld hl,root_path ; "x:\",0
ld c,Dss.ChDir
RST ToDSS
; поиск метки
ld hl,mask_fname ; "*.*" имя метки
ld de,work_buffer1 ; куда
- ld a,8 ; атрибут метки тома
+ ld a,FAT_ATTR.VOLUME_ID ; атрибут метки тома
ld bc,0*256 + Dss.F_First ; f_first, формат 11
RST ToDSS
push af
call restore_path ; восст. тек. путь
pop af
- jr c,no_volume_label ; метки нет
+ ;jr c,no_volume_label ; метки нет дирректории
ld hl,work_buffer1+33 ; начало метки в буфере f_first
- jr volume_label
+ 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,' '
;
-get_inf_data1: ;!FIXIT так там пробелы стоять могут, если метка короче 11 символов
- ld hl,work_buffer+53 ; конец метки в BPB
- ld a,(hl)
- cp " " ; есть метка ?
- ld hl,work_buffer+43 ; начало метки в BPB
- jr nz,volume_label ; да
-;!FIXIT сделать через аргументы %1-%9
+.loop: CP (HL)
+ JR NZ,.good_label
+ INC HL
+ DJNZ .loop
+ POP HL ; снимаем лишнее
; нет метки
-no_volume_label: ;!FIXIT сделать через PRM %4
- ld hl,volume_string1 ; "has no label "
- ld de,MSG0.volume_string ; куда
- ld bc,14
- ldir
+.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 ; лишнее
;!FIXIT сделать через аргументы %1-%9
; есть метка
volume_label:
- ex de,hl
- ld hl,MSG0.volume_string ; куда
- ld (hl),"i"
- inc hl
- ld (hl),"s"
- inc hl
- ld (hl)," "
- inc hl
- ex de,hl
- ; скопир. имя метки
- ld bc,11 ; макс. длина метки
- ld a,(hl)
- cp " "+1
- jr nc,$+6
- inc hl
- dec c
- jr $-7
- ld a,11
- sub c
+ pop DE ; лишнее
+ ; %5
+ ld de,PRM5
+ ld bc,11 ;!HARDCODE длина метки
ldir
- ld b,a
- or a ; длина метки 11 симв. ?
- ret z ; да
- ; дополнить хвост. пробелами
+ xor a
ld (de),a
- inc de
- djnz $-2
- ret
+ ; %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
+ ;
@@ -538,33 +571,34 @@ hex8: push af
rrca
rrca
rrca
- call $+4
+ call .num
pop af
- and 0Fh
- add a,90h
+ ;
+.num: and %0000'1111
+ add a,#90
daa
- adc a,40h
+ adc a,#40
daa
ld (de),a
inc de
ret
-
-
; маска файлов
mask_fname:
db "*.*",0
; корень диска
root_path:
- db '\',0
-
-
+ db 'X:\',0
; Серийный номер диска
serial_string:
- db "xxxx-xxxx",0
+ db "xxxx-xxxx"
+.Size equ $-serial_string
+ db 0 ; закрывашка
-volume_string1: ;!FIXIT сделать через PRM
- db "has no label " ; 14
+volume_string_no: ;!FIXIT сделать через PRM
+ db "has no label",0
+volume_string_yes:
+ db "has label",0
\ No newline at end of file
diff --git a/SHELL/EDLINE.ASM b/SHELL/EDLINE.ASM
index 55b76f6..7b8087f 100644
--- a/SHELL/EDLINE.ASM
+++ b/SHELL/EDLINE.ASM
@@ -226,7 +226,9 @@ prne1__:ld (cursor_position),a ; X
; Чтение событий
;-------------------------------------------------
handle_event:
- ld de,(cursor_position)
+cursor_position+1:
+ ld de,0
+ ;
ld c,Dss.Locate
RST ToDSS
ld c,Dss.EchoKey ; опрос клавы
@@ -956,36 +958,37 @@ not_move_to_end:
+;!FIXIT к буферам почти всё
+////////////////////////////////////////////////////////////////////////
+; 1 0
+;cursor_position:
+; dw 0 ; Y/X полож. курсора
-
-cursor_position:
- dw 0 ; Y/X полож. курсора
-
+; 2 0
width_inpline:
.MAX EQU 80
db width_inpline.MAX-4 ; тек. ширина поля ввода
+; 3 0
YXpos: dw 0 ; Y/X начало ком-строки
-
+; 4 0
; режим ввода
insert_mode:
db 1 ; 01/00 inser/overwrite
-
-
+; 5 0
; экранный путь
screen_path:
db "A:"
- ds max_screen_path+1 ; 32+1
+ BLOCK max_screen_path+1,0 ; 32+1
+; 6 0
; системный путь
system_path:
- ;db "\BORLAND\LMDTOOLS\TESTING\PROGRAM\SOURCES\TURBO\PR",0
- ds 256
-
-
+ BLOCK 256,0 ;!HARDCODE
+; 7 0
; Структура строки ввода ~input line~
struct_input_line:
db max_len_comline ;+0 254 макс. число ввод. символов
@@ -995,12 +998,14 @@ struct_input_line:
db 0 ;+4 число введенных символов
ds max_len_comline+1 ;+5 строка ввода
-
+; 8 0
; Буфер истории
history_buff:
- ds history_size ; 256
-
+ BLOCK history_size,0 ; 256
+; 9 0
; Рабочий буфер
work_buffer:
- ds 512
+ BLOCK 512,0
+////////////////////////////////////////////////////////////////////////
+;
\ No newline at end of file
diff --git a/SHELL/ERROR.ASM b/SHELL/ERROR.ASM
index 9bab454..1f0a770 100644
--- a/SHELL/ERROR.ASM
+++ b/SHELL/ERROR.ASM
@@ -131,35 +131,29 @@ DIR2MSG EQU 9
DIR3MSG EQU 10
HELPMSG EQU 11
-MSG0: db 0
-; 0
- db "Volume on drive %1 "
-.volume_string: ;!FIXIT сделать через PRM
- db "has no label ",CR,LF ;0
- db "The volume serial number is %2",CR,LF
- db CR,LF,"Directory of %3",CR,LF,LF,0
-; 1
- db "Estex DSS version %1. Shell version %2.",CR,LF,0 ;R13
-; 2
- db "Current date: %1",CR,LF,0 ;2
- db "Current time: %1",CR,LF,0 ;3
- db "Press any key to continue . . .",CR,LF,LF,0 ;4
- db "Invalid parametr",CR,LF,0 ;5
- db "Echo is %1",CR,LF,0 ;6
- db "on",0 ;7
- db "off",0 ;8
- db " %1 file(s) %2 bytes",CR,LF,LF,0 ;9
-; 10 FILENAME EXT SIZE DATE TIME
- db "%1 %2 %3 %4 %5",CR,LF,0 ;10
-; 11
- 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,0
+MSG0: db 0
+/* 0 */ 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
+/* 1 */ db "Estex DSS version %1. Shell version %2.",CR,LF,0 ;R13
+/* 2 */ db "Current date: %1",CR,LF,0
+/* 3 */ db "Current time: %1",CR,LF,0
+/* 4 */ db "Press any key to continue . . .",CR,LF,LF,0
+/* 5 */ db "Invalid parametr",CR,LF,0
+/* 6 */ db "Echo is %1",CR,LF,0
+/* 7 */ db "on",0
+/* 8 */ db "off",0
+/* 9 */ db " %1 File(s) %2 bytes",CR,LF
+ db " %3 Dir(s) %4 bytes",CR,LF,LF,0
+/* 10 */ db "%1 %2 %3 %4 %5",CR,LF,0 ;FILENAME EXT SIZE DATE TIME
+/* 11 */ 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,0
;R11
- BYTE 0
- DZ "Unknown command"
+ DB 0
+ DZ "Unknown command"
;
.Size EQU $-MSG0
diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM
index cfe8a7e..a0f5008 100644
--- a/SHELL/SHELL.ASM
+++ b/SHELL/SHELL.ASM
@@ -316,6 +316,7 @@ save_disk:
ld (screen_path),a ; 33 строка экранного пути
ret
+ ;!FIXIT убрать лишние вызовы
; Восстановить тек. диск и путь (после ошибки)
restore_disk_path:
; уст. тек. диск
@@ -323,6 +324,8 @@ restore_disk_path:
sub "A"
ld c,Dss.ChDir
RST ToDSS
+
+ ;!FIXIT убрать лишние вызовы
restore_path:
; уст. тек. каталог
ld hl,system_path ; 256 буфер сист. пути
diff --git a/SHELL/build.txt b/SHELL/build.txt
index 56749c8..405e057 100644
--- a/SHELL/build.txt
+++ b/SHELL/build.txt
@@ -1 +1 @@
-96
\ No newline at end of file
+127
\ No newline at end of file
diff --git a/Shared_Includes b/Shared_Includes
index 1826974..349ba28 160000
--- a/Shared_Includes
+++ b/Shared_Includes
@@ -1 +1 @@
-Subproject commit 18269745815d90e76686f5693e0cb45f8f31741c
+Subproject commit 349ba286106d21a77cf3f8a25b6f7c952eccb046