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