diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 6136a7d..b46492d 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -612,7 +612,6 @@ SEARCH5: OUT (SLOT3),A AND A RET - SEARCH3: EXX INC DE @@ -1066,7 +1065,7 @@ DIRSIZE: WORD 0 ; раз ; Массив лог. номеров банок расширения ДОС -BANKTBL: BLOCK USING_MEMPAGES+1,#FF +BANKTBL: BLOCK USING_MEMPAGES,#FF diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index e101e00..5ed58b8 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -570,166 +570,12 @@ BACK_CUR_PATH: ; вход: нет ; выход: A - номер последнего лог. диска в системе ;/////////////////////////////////////////////////////////////////////// -SCANDRV: -;1 [-----------] [-----------] [-----------] [-----------] [-----------] - ; LD A,(LDRIVE) - ; LD (.old_ldrive),A - ; - CALL GETBOOT - LD (.old_letter),A ; bootdisk Log.number -; [-----------] - -;2 [-----------] [-----------] [-----------] [-----------] [-----------] - ; A = bootdisk Log.number - LD DE,Dss.DRV.GenIOCTL.Enter - LD BC,Dss.DRV.GenIOCTL.GetParams - RST ToDSS.DRV - EX AF,AF' - LD (.old_DRIVE_ID),A -; [-----------] - - -;3 [-----------] [-----------] [-----------] [-----------] [-----------] - ;!TEST в DRV-MAIN могут быть проблемы с прерываниями - ;DI - LD A,Dss.DRV.RescanDRV - LD C,Dss.DRV.RescanDRV - RST ToDSS.DRV - LD (LDRIVE),A - ;EI - ; -; [-----------] - -;4 [-----------] [-----------] [-----------] [-----------] [-----------] -.old_DRIVE_ID+1: - LD A,0 - CALL SETBOOT - JR C,.ERROR_BOOTDRV_DIES - LD (.new_letter),A - ; - LD A,(.old_letter) - LD (BOOTDRV),A -; - -;5 [-----------] [-----------] [-----------] [-----------] [-----------] - AND A - LD A,R - PUSH AF - DI - ;;;;;;;; - IN A,(SLOT3) - LD (.restore_page),A - LD A,(DRV_PG_NUMBER) - OUT (SLOT3),A - ;;;;; - - ; вычисляем смещение bootdisk в новой таблице DEVICE -.new_letter+1: - LD A,0 - CALL .get_entry_addr - PUSH HL - ; сохраняем значения нового boot - LD DE,.TMP_BUFFER - LD BC,DEVICE.TBL_Entry - LDIR - ; вычисляем смещение для буквы старого bootdisk в новой таблице DEVICE -.old_letter+1: - LD A,0 - CALL .get_entry_addr - ; меняем букву диска для девайса занявшего старую букву bootdisk - POP DE - LD BC,DEVICE.TBL_Entry - LDIR - ; восстанавливаем bootdisk на старое место - DEC HL - LD DE,.TMP_BUFFER + DEVICE.TBL_Entry-1 - LD BC,DEVICE.TBL_Entry - EX DE,HL - LDDR - ; проверяем, не увеличилось ли значение LDRIVE - ;!TEST - LD HL,.old_letter - LD A,(LDRIVE) - CP (HL) - JR NC,.no_change_LDRIVE - LD A,(HL) - LD (LDRIVE),A - ; -; .old_ldrive+1: - ;LD L,0 - ;LD A,(LDRIVE) - ;CP L - ;JR NC,.no_change_LDRIVE - ;LD A,L - ;LD (LDRIVE),A - ; -.no_change_LDRIVE: - ; - ; DEC A - ; LD C,Dss.DskInfo - ; RST ToDSS - ; LD A,(BOOTDRV) - ; LD C,Dss.ChDisk - ; RST ToDSS - - ;;;;; -.restore_page+1: - LD A,0 - OUT (SLOT3),A - ;;;;;;;; - POP AF - LD A,(LDRIVE) - RET PO - EI - RET -.ERROR_BOOTDRV_DIES: - LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_OPEN_S - LD E,0 - RST ToBIOS - - LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN - LD DE,0 - LD HL,#2050 - RST ToBIOS - - LD A,1 - OUT (RGMOD),A ; set scr-2 - - LD HL,.ERROR_MSG - LD DE,#A000 - LD BC,.ERROR_MSG.size - LD A,C - LDIR - - LD DE,#10*256 + (80-.ERROR_MSG.size)/2 ;X=0, Y=16 - LD C,BIOS.LP_SET_PLACE - RST ToBIOS - - LD HL,#A000 - LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE - LD B,A - LD C,BIOS.LP_PRINT_LINE3 - RST ToBIOS - -.loop: DI -; .loop: LD A,R -; AND 7 -; OUT (BorderColor),A - HALT - JR .loop - -.ERROR_MSG: DZ "Kernel panic! Boot disk lost. Press Ctrl+Alt+Del or RESET." -.ERROR_MSG.size EQU $-.ERROR_MSG -.get_entry_addr: - _CALC_DEVICE_ENTRY DEVICE + #C000 - RET -; -.TMP_BUFFER: BLOCK 3,#FF - -; .old_letter: DB #FF -; .old_DRIVE_ID: DB #FF -; .new_letter: DB #FF + INCLUDE 'ScanDRV.asm' +; INCLUDE 'NScanDRV.asm' ;/////////////////////////////////////////////////////////////////////// +; + + ;R12 diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index b4ba3b2..8c92c56 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -233,7 +233,6 @@ INIT_H: PUSH IY LD A,C OUT (SLOT3),A JR Z,NO_HARDS - ;LD BC,4*256 + #80 ;!HARDCODE 4 - количество винтов, 80 - ID винта ;!FIXIT LD C,#80 ;!HARDCODE - ID винта для процедуры BIOS.DRV_DETECT NX_DVCI: PUSH BC @@ -317,7 +316,7 @@ DRVCLC: INC A ;+05 LONG SIZE IN SECTORS ;+09 FREE ;+15 -LOGDRV: BLOCK .TBL_Entry*LD_DSK,0 ;!FIXIT перенести к буферам в конец страницы +LOGDRV: BLOCK .TBL_Entry * LD_DSK,0 ;!FIXIT перенести к буферам в конец страницы .TBL_Entry EQU 16 .Size EQU $-LOGDRV diff --git a/DSS/ScanDRV.ASM b/DSS/ScanDRV.ASM new file mode 100644 index 0000000..d471989 --- /dev/null +++ b/DSS/ScanDRV.ASM @@ -0,0 +1,157 @@ +; !TODO запоминать прерывания, отключать на старте, восстанавливать на выходе +SCANDRV: +;1 [-----------] [-----------] [-----------] [-----------] [-----------] + ; LD A,(LDRIVE) + ; LD (.old_ldrive),A + ; + CALL GETBOOT + LD (.old_letter),A ; bootdisk Log.number +; [-----------] + +;2 [-----------] [-----------] [-----------] [-----------] [-----------] + ; A = bootdisk Log.number + LD DE,Dss.DRV.GenIOCTL.Enter + LD BC,Dss.DRV.GenIOCTL.GetParams + RST ToDSS.DRV + EX AF,AF' + LD (.old_DRIVE_ID),A +; [-----------] + + +;3 [-----------] [-----------] [-----------] [-----------] [-----------] + ;!TEST в DRV-MAIN могут быть проблемы с прерываниями + ;DI + LD A,Dss.DRV.RescanDRV + LD C,Dss.DRV.RescanDRV + RST ToDSS.DRV + LD (LDRIVE),A + ;EI + ; +; [-----------] + +;4 [-----------] [-----------] [-----------] [-----------] [-----------] +.old_DRIVE_ID+1: + LD A,0 + CALL SETBOOT + JR C,.ERROR_BOOTDRV_DIES + LD (.new_letter),A + ; + LD A,(.old_letter) + LD (BOOTDRV),A +; + +;5 [-----------] [-----------] [-----------] [-----------] [-----------] + AND A + LD A,R + PUSH AF + DI + ;;;;;;;; + IN A,(SLOT3) + LD (.restore_page),A + LD A,(DRV_PG_NUMBER) + OUT (SLOT3),A + ;;;;; + + ; вычисляем смещение bootdisk в новой таблице DEVICE +.new_letter+1: + LD A,0 + CALL .get_entry_addr + PUSH HL + ; сохраняем значения нового boot + LD DE,.TMP_BUFFER + LD BC,DEVICE.TBL_Entry + LDIR + ; вычисляем смещение для буквы старого bootdisk в новой таблице DEVICE +.old_letter+1: + LD A,0 + CALL .get_entry_addr + ; меняем букву диска для девайса занявшего старую букву bootdisk + POP DE + LD BC,DEVICE.TBL_Entry + LDIR + ; восстанавливаем bootdisk на старое место + DEC HL + LD DE,.TMP_BUFFER + DEVICE.TBL_Entry-1 + LD BC,DEVICE.TBL_Entry + EX DE,HL + LDDR + ; проверяем, не увеличилось ли значение LDRIVE + ;!TEST + LD HL,.old_letter + LD A,(LDRIVE) + CP (HL) + JR NC,.no_change_LDRIVE + LD A,(HL) + LD (LDRIVE),A + ; +; .old_ldrive+1: + ;LD L,0 + ;LD A,(LDRIVE) + ;CP L + ;JR NC,.no_change_LDRIVE + ;LD A,L + ;LD (LDRIVE),A + ; +.no_change_LDRIVE: + ; + ; DEC A + ; CALL DISKINF + ; LD A,(BOOTDRV) + ; CALL CHNDISK + ;;;;; +.restore_page+1: + LD A,0 + OUT (SLOT3),A + ;;;;;;;; + POP AF + LD A,(LDRIVE) + RET PO + EI + RET +.ERROR_BOOTDRV_DIES: + LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_OPEN_S + LD E,0 + RST ToBIOS + + LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN + LD DE,0 + LD HL,#2050 + RST ToBIOS + + LD A,1 + OUT (RGMOD),A ; set scr-2 + + LD HL,.ERROR_MSG + LD DE,#A000 + LD BC,.ERROR_MSG.size + LD A,C + LDIR + + LD DE,#10*256 + (80-.ERROR_MSG.size)/2 ;X=0, Y=16 + LD C,BIOS.LP_SET_PLACE + RST ToBIOS + + LD HL,#A000 + LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE + LD B,A + LD C,BIOS.LP_PRINT_LINE3 + RST ToBIOS + +.loop: DI +; .loop: LD A,R +; AND 7 +; OUT (BorderColor),A + HALT + JR .loop + +.ERROR_MSG: DZ "Kernel panic! Boot disk lost. Press Ctrl+Alt+Del or RESET." +.ERROR_MSG.size EQU $-.ERROR_MSG +.get_entry_addr: + _CALC_DEVICE_ENTRY DEVICE + #C000 + RET +; +.TMP_BUFFER: BLOCK 3,#FF + +; .old_letter: DB #FF +; .old_DRIVE_ID: DB #FF +; .new_letter: DB #FF \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index da4c6e9..2c136b2 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -297 \ No newline at end of file +302 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 5246fad..fd0b202 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -27,7 +27,7 @@ DSS_MAX_DRIVES_AMOUNT EQU 26 DIRPAGE EQU 0 FATPAGE EQU 1 TXTPAGE EQU 2 -ENVPAGE EQU 2 +ENVPAGE EQU TXTPAGE DRVPAGE EQU 3 ; diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index fc0a75b..971c6ee 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -26,42 +26,21 @@ cmd_dir: push de ;ld de,T9186 ; буфер ld hl,work_buffer1 ; имя файла ld de,work_buffer1 ; 80 буфер - ld a,37h ; атрибут (все, кроме метки тома) + ld a,#37 ; атрибут (все, кроме метки тома) ld bc,0*256 + Dss.F_First ; f_first (формат 11) RST ToDSS - jp c,print_err_message ; вывод сообщения - ; %1 - ;ld a,(system_path) ; буфер полного сист. пути - ;ld (T90F6),a - ;ld a,":" - ;ld (T90F7),a - ;xor a - ;ld (T90F8),a - ld a,(screen_path) ; диск - ld hl,PRM1 - ld (hl),a - inc hl - ld (hl),":" - inc hl - ld (hl),0 - ; %2 - ld hl,serial_string ; строка серийного номера диска - ld de,PRM2 ; куда - call ncopy_string ; скопир. строку (с нулем) - ;call print_sys_path ; вывод сист. пути на экран - ; %3 - ld hl,screen_path ; экран. путь - ld de,PRM3 ; 16 буфер - ;ld a,(hl) - ;ldi ; скопир. строку - ;or a - ;jr nz,$-4 - call copy_string ; скопир. строку (с нулем) + ;R14 + ;jp c,print_err_message ; вывод сообщения DSS_Error.sys.FILE_NOT_FOUND + JR NC,.not_empty + CP DSS_Error.sys.FILE_NOT_FOUND + JP NZ,print_err_message + SCF + JP .Print_Header +.not_empty: + CALL .Print_Header ; - ld de,0 ; индекс "Volume in drive %1 has no label..." - call MESSAGE ; вывести строку ; цикл вывода списка файлов/папок -A882C: ;ld hl,T9186 ; раб. буфер +.loop: ;ld hl,T9186 ; раб. буфер ld hl,work_buffer1 ; 80 ld de,33 add hl,de @@ -70,7 +49,7 @@ A882C: ;ld hl,T9186 ; раб. ld ix,work_buffer1 ; 80 ld a,(ix+32) ; атрибут тек. записи and 10h ; папка ? - jr nz,A8866 ; да + jr nz,.next ; да ; прибавить размер тек. файла ld hl,(D88DC) inc hl @@ -89,16 +68,14 @@ A882C: ;ld hl,T9186 ; раб. ld (D88DE),hl exx ld (D88E0),hl -A8866: ;ld de,T9186 ; раб. буфер +.next: ;ld de,T9186 ; раб. буфер ld de,work_buffer1 ; 80 буфер ld c,Dss.F_Next ; поиск след. RST ToDSS - jr nc,A882C ; назад в цикл - jr A8872 ; конец списка, на десят. вывод + jr nc,.loop ; назад в цикл, если не конец списка - -; Десятичный вывод -A8872: ld hl,(D88DC) + ; Десятичный вывод +.print: ld hl,(D88DC) ld ix,PRM1 ; буфер call A8964 ld hl,(D88DE) ; мл. разряд @@ -109,10 +86,11 @@ A8872: ld hl,(D88DC) ld hl,T8B37 ; "0" ld a,(hl) cp " " - jr nz,A8892 + jr nz,.not_zero ld a,"0" ld (hl),a -A8892: ld de,T8B46 ; "0 000 000 000" +.not_zero: + ld de,T8B46 ; "0 000 000 000" ld hl,T8B2E ; "0000000000" ld a,(hl) ldi @@ -148,8 +126,42 @@ A8892: ld de,T8B46 ; "0 000 000 000" ld de,9 ; индекс " %1 file(s) %2 bytes" jp MESSAGE ; вывести строку + ;R14 +.Print_Header: + PUSH AF + ; + ; %1 + ld a,(screen_path) ; диск + ld hl,PRM1 + ld (hl),a + inc hl + ld (hl),":" + inc hl + ld (hl),0 + ; %2 + ld hl,serial_string ; строка серийного номера диска + ld de,PRM2 ; куда + call ncopy_string ; скопир. строку (с нулем) + ; + ;R14 + POP AF + ld hl,screen_path + JR NC,.not_empty_2 + ; + ld a,(screen_path) + LD (.str),A + ld hl,.str ; экран. путь + ; %3 +.not_empty_2: + ; + ld de,PRM3 ; 16 буфер + CALL copy_string ; скопир. строку (с нулем) + ; + ld de,0 ; индекс "Volume in drive %1 has no label..." ;!HARDCODE номер строки MSG0 + JP MESSAGE ; вывести строку - +.str: DZ 'X:\ is empty' ;R14 + ; ; Подготовить строку списка файлов/папок A88E2: ld bc,8 diff --git a/SHELL/ERROR.ASM b/SHELL/ERROR.ASM index 9b3fe64..9bab454 100644 --- a/SHELL/ERROR.ASM +++ b/SHELL/ERROR.ASM @@ -6,7 +6,7 @@ print_err_message: ld e,a ld d,0 inc de - ld hl,ERR0 ; массив строк + ld hl,ERR0 ; массив строк ld bc,ERR0.Size ; размер массива call LCPIR ; найти строку call PRINTZ ; формат. вывод строки @@ -133,24 +133,24 @@ HELPMSG EQU 11 MSG0: db 0 ; 0 - db "Volume in drive %1 " + db "Volume on drive %1 " .volume_string: ;!FIXIT сделать через PRM - db "has no label ",0Dh,0Ah ;0 - db "Volume Serial Number is %2",0Dh,0Ah - db 0Dh,0Ah,"Directory of %3",0Dh,0Ah,0Ah,0 + 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",0Dh,0Ah,0 ;2 - db "Current time: %1",0Dh,0Ah,0 ;3 - db "Press any key to continue . . .",0Dh,0Ah,0Ah,0 ;4 - db "Invalid parametr",0Dh,0Ah,0 ;5 - db "Echo is %1",0Dh,0Ah,0 ;6 + 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",0Dh,0Ah,0Ah,0 ;9 + db " %1 file(s) %2 bytes",CR,LF,LF,0 ;9 ; 10 FILENAME EXT SIZE DATE TIME - db "%1 %2 %3 %4 %5",0Dh,0Ah,0 ;10 + 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 diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index 766e994..b66cd26 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -12,6 +12,29 @@ ; ; +; SYSTEM.EXE /S /P +; +; /P Primary command processor +; /S Secondary command processor +; /C Execute batch file + +;=====================================================================[] +;Rev. Date Name Description +;---------------------------------------------------------------------[] +;R14 22-09-2023 BAO Исправлен баг "File not found" в команде DIR на пустом разделе +;R13 03-08-2023 BAO Добавлен вывод номера версии Консоли для команды VERSION +;R12 23-07-2023 BAO Добавлена команда REBOOT - перезагрузка с полной очисткой памяти +;R11 20-07-2023 BAO Поправлена функция LCPIR для корректного выбора сообщения об ошибке при номере ошибки > заготовленных сообщений +;R10 16-05-2023 BAO TEХT MODE AND TEXT ARE RESTORED AFTER RETURNING FROM THE APP +;R08 21-02-2003 DNS FIX BUG IN BAT-PARSER, IT SPLIT STRINGS WHEN LINE BEGAN AT #xx00 OFFSET +;R07 14-12-2002 DNS PARSING BATCH LINE +;R06 12-12-2002 DNS ADD %0, %1, %2 ... +;R05 11-12-2002 DNS IMPLEMENTED %VAR% +;R04 11-12-2002 DNS ADD 'EVALSTRING' ROUTINE +;R03 11-12-2002 DNS NEW VERSION +;R02 19-11-2002 DNS CORRECT SOME ERROR MESSAGES +;R01 19-11-2002 DNS ADD ENVIRONMENT %VARIABLE% IN ECHO +;=====================================================================[] includelua 'Shared_includes/lua/Functions.lua' include 'shared_includes/constants/bios_equ.inc' diff --git a/SHELL/build.txt b/SHELL/build.txt index 8323328..780fea9 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -67 \ No newline at end of file +77 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index b593cb6..a4f1028 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit b593cb606636c961e49597b9b1e5b6ee72d191c9 +Subproject commit a4f102897a7fa7488c1e64cf8329f5659c6b0d6b