diff --git a/BOOT/boot.asm b/BOOT/boot.asm index 3514291..ce707cc 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -117,7 +117,7 @@ page_buffer equ #C000 ; ORG org_addr BEGIN: ;di in a,(SLOT3) - ld (port+1),a ; сохр. порт + ld (port),a ; сохр. порт push ix call save_path ; сохр. тек. диск и путь ld c,Dss.Version ; узнать версию ДОС @@ -134,7 +134,7 @@ BEGIN: ;di .old_ver: pop hl ld a,11 ; индекс строки "Error: Need DSS version 1.70..." call print_string - ld a,-1 + ld a,DSS_Error.sys.COMMON_ERROR jp exit ;[x] 17.12.2023 загрузка с активного раздела, а не с первого .check_build: ld hl,810 ; 1.70.810 d=версия, e=модификация, bc - номер сборки. de = #0146, bc = 810 dos ver 1.70.810 @@ -153,11 +153,11 @@ version_ok: xor a ; RST ToDSS ld (boot_disk),a ; диск (A=0,B=1,..) ; проверить на совпадение дисков - ld hl,disk +same_fdd: ld hl,disk cp (hl) jr nz,.next - ld hl,confirm_flag - ld (hl),1 ; уст. флаг + ld hl,read_sys_files.swap_flag +.flag+1: ld (hl),0 ; уст. флаг ; ; Чтение в банки файлов системы ; @@ -170,6 +170,11 @@ version_ok: xor a ; ;-------------------------------------------- ; Чтение файла system.exe ;-------------------------------------------- +read_sys_files: ; +.noFiles+1: ld a,0 + or a + jr nz,.write_boot + ; ld hl,name2 ; имя файла call read_file ; вся работа по загрузке файла в страницы ;jr nc,read_file1_ok @@ -180,7 +185,7 @@ version_ok: xor a ; ;ld a,DSS_Error.sys.DISK_FULL ; код ошибки jp c,exit ; сохр. раб. ячейки файла system.exe -read_file1_ok: ld hl,FILE1_PARAMS ; откуда +.read_file1_ok: ld hl,FILE1_PARAMS ; откуда ld de,FILE2_PARAMS ; куда ld bc,FILE2_PARAMS.dataSize ldir @@ -198,12 +203,12 @@ read_file1_ok: ld hl,FILE1_PARAMS ; ; ld c,Dss.FreeMem ; RST ToDSS ;jr read_file_err ; освоб. блок памяти system.dos -confirm_flag+1: ld a,0 +.swap_flag+1: ld a,1 or a - jr z,no_confirm + jr nz,.no_confirm ld a,(boot_disk) ; сист. диск cp 2 - jr nc,no_confirm ; не дисководы + jr nc,.no_confirm ; не дисководы ; запросить целевой диск ld a,(disk) ; заданный номер диска add a,'A' @@ -212,9 +217,8 @@ confirm_flag+1: ld a,0 call print_string ld bc,Dss.K_CLEAR + Dss.WaitKey*256; ждем нажатия клавиши RST ToDSS -no_confirm: ld a,2 ; индекс строки "Installing boot loader..." - call print_string - ; Уст. целевой диск/путь + ; +.no_confirm: ; Уст. целевой диск/путь ld a,(disk) ; целевой диск ld hl,root_path ; "X:\" строка пути add a,'A' @@ -222,17 +226,13 @@ no_confirm: ld a,2 ; ld c,Dss.ChDir ; смена тек. каталога RST ToDSS ;-------------------------------------------- - ; Записать boot-загрузчик - call write_boot_loader - jr c,write_error ; ошибка работы с девайсом - ; ld a,3 ; индекс строки "Writing system files..." call print_string ; Запись файла system.dos ld hl,name1 ; имя файла call write_file jr c,write_error -ok_write1: ; освободить память +.ok_write1: ; освободить память ; ld a,(FILE1_PARAMS.id_blck) ; блок system.dos ; ld c,Dss.FreeMem ; RST ToDSS @@ -255,14 +255,21 @@ ok_write1: ; jr c,write_error ;jr c,exit ; ошибка ; + ; Записать boot-загрузчик +.write_boot: ld a,2 ; индекс строки "Installing boot loader..." + call print_string + call write_boot_loader + jr c,write_error ; ошибка работы с девайсом + ; ld a,(disk) ; заданный номер диска add a,'A' ld (messages.lett1),a ld a,1 ; индекс строки "System installed on disk " call print_string - ld a,(confirm_flag) + ; + ld a,(read_sys_files.swap_flag) or a - jr z,exit + jr nz,.not_fdd ; запросить системный диск ld a,(boot_disk) ; сист. диск cp 2 @@ -274,9 +281,10 @@ ok_write1: ; ld bc,Dss.K_CLEAR + Dss.WaitKey*256; ждем нажатия клавиши RST ToDSS .not_fdd: xor a ; код "Ok" + ; exit: push af call restore_path ; восст. тек. диск и путь -port: ld a,-1 ; сохр. порт +port+1: ld a,-1 ; сохр. порт out (SLOT3),a pop af ld c,Dss.Exit ; выход в ДОС @@ -288,7 +296,7 @@ help: ld a,8 ; call print_string ld a,4 ; индекс строки хэлпа err_mes: call print_string - ld a,1 ; код ошибки + ld a,DSS_Error.sys.COMMON_ERROR jr exit write_error: ld a,7 ; индекс строки "Can't install boot on this disk" @@ -564,35 +572,78 @@ SETUP_ZERO_SECTOR: ; CF-при ошибке ;------------------------------------------------- get_drive_letter: + ; зачистка буфера + xor a + ld (buffer+1),a + ; inc hl ; буфер строки ld de,buffer ; буфер для выдел. параметра ld c,Dss.GSwitch ; выделить параметр ком. строки RST ToDSS + ; + rra + rl b ; признак конца параметров + ; ld de,buffer ld a,(de) inc de ld c,a ; сохр. 'a' ld a,(de) - inc de cp ':' - jr nz,get_drive_err ; диск не задан - ld a,(de) + jr nz,.get_drive_err ; диск не задан inc de + ld a,(de) or a - jr nz,get_drive_err ; > 1 параметра - ld a,c ; восст. 'a' - cp 'A' - jr c,get_drive_err - cp 'z'+1 - jr nc,get_drive_err + jr nz,.get_drive_err ; неправильные параметры + ; + rr b ; признак конца параметров + jr c,.checkChar + ; + push bc + ld de,buffer ; буфер для выдел. параметра + ld c,Dss.GSwitch ; выделить параметр ком. строки + RST ToDSS + pop bc + jr nc,.get_drive_err ; неправильные параметры + ; + ld de,buffer ; буфер для выдел. параметра + ld a,(de) + cp "0" + ret c ; неправильные параметры + cp "4" + jr nc,.get_drive_err ; неправильные параметры + ; + ld b,a + inc de + ld a,(de) + or a + jr nz,.get_drive_err ; неправильные параметры + ; + ld a,b + ;0 - standart + ;1 - silent + ;2 - no_files + ;3 - no_files+silent + sub "0" + jr z,.checkChar + rra + ld (read_sys_files.noFiles),a + ld (same_fdd.flag),a + rla + and 1 + ld (print_string.silentMode),a + ; проверяем букву +.checkChar: ld a,c ; восст. 'a' and %1101'1111 + cp 'A' + ret c ; ошибка + cp 'Z'+1 + jr nc,.get_drive_err sub 'A' - or a ret ; -get_drive_err: scf ; ошибка +.get_drive_err: scf ; ошибка ret - ;---------------------------------------------------- ; сохр. тек. системный диск и путь ;---------------------------------------------------- @@ -690,6 +741,9 @@ messages: db 0 ; Вывести строку по индексу ; вход: a=индекс строки print_string: call get_string ; поиск строки по ее индексу в 'a' +.silentMode+1: ld a,0 + or a + ret nz ld c,Dss.PChars ; вывод строки RST ToDSS ret diff --git a/DSS/build.txt b/DSS/build.txt index dce6588..d2e1cef 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -36 \ No newline at end of file +44 \ No newline at end of file diff --git a/DSS/drivers/media/ata_atapi-drv.asm b/DSS/drivers/media/ata_atapi-drv.asm index 7b62967..148864f 100644 --- a/DSS/drivers/media/ata_atapi-drv.asm +++ b/DSS/drivers/media/ata_atapi-drv.asm @@ -440,12 +440,13 @@ GetParams: EX DE,HL JR .error ; ; [ ] media change - убрать ;!FIXIT -.next: EX AF,AF +.next: EX AF,AF' JR NC,.NoMediaChange CP BIOS.Error.ATAPI.UnitAttention + SCF JR NZ,.NoMediaChange ; - PUSH IX +.ReDEFINE: PUSH IX PUSH IY PUSH HL PUSH DE @@ -457,52 +458,51 @@ GetParams: EX DE,HL POP IY POP IX ; -.NoMediaChange: ;EX AF,AF - ; перетасовка регистров с результатом от BIOS - EX DE,HL - LD C,E - LD E,D - LD D,0 - LD A,B - LD B,D - EXX +.NoMediaChange: ; перетасовка регистров с результатом от BIOS + EX DE,HL + LD C,E + LD E,D + LD D,0 + LD A,B + LD B,D + EXX ;[ ] 04/01/2025 возвращение размера сектора - EX AF,AF' - LD A,XH - LD E,XL - RL E - RLA + EX AF,AF' + LD A,XH + LD E,XL + RL E + RLA ; ; SECTORS ON LOGICAL DISK - LD E,(IY+LOGDRV.SIZE_IN_SECTORS+0) - LD D,(IY+LOGDRV.SIZE_IN_SECTORS+1) - LD L,(IY+LOGDRV.SIZE_IN_SECTORS+2) - LD H,(IY+LOGDRV.SIZE_IN_SECTORS+3) + LD E,(IY+LOGDRV.SIZE_IN_SECTORS+0) + LD D,(IY+LOGDRV.SIZE_IN_SECTORS+1) + LD L,(IY+LOGDRV.SIZE_IN_SECTORS+2) + LD H,(IY+LOGDRV.SIZE_IN_SECTORS+3) ; ;[x] 17.12.2023 загрузка с активного раздела, а не с первого - LD C,(IY+LOGDRV.PARTITION_RECORD_NUM) ; номер партиции в MBR диска + LD C,(IY+LOGDRV.PARTITION_RECORD_NUM) ; номер партиции в MBR диска ; ;[ ] 04/01/2025 возвращение размера сектора - ; 00 - undefined - ; 01 - 128 bytes - ; 02 - 256 bytes - ; 04 - 512 bytes - ; 08 - 1024 bytes - ; 16 - 2048 bytes - ; 32 - 4096 bytes - ; 64 - 8192 bytes - ; 128 - 16384 bytes - ;EX AF,AF' - LD B,A + ; 00 - undefined + ; 01 - 128 bytes + ; 02 - 256 bytes + ; 04 - 512 bytes + ; 08 - 1024 bytes + ; 16 - 2048 bytes + ; 32 - 4096 bytes + ; 64 - 8192 bytes + ; 128 - 16384 bytes + ;EX AF,AF' + LD B,A ; LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... EX AF,AF' ; - AND A -.error: POP IY - POP IX - RET - + ;AND A +.error: POP IY + POP IX + RET + ; Removable: XOR A @@ -553,15 +553,7 @@ MediaCheck: PUSH IY ; CP BIOS.Error.ATAPI.UnitAttention JR Z,.Reinit - ;!FIXIT заглушка/костыль из-за пересечения номеров ошибок POP BC ; Баланс стека - /* - BIOS.Error.BadNumber - BIOS.Error.Failure - BIOS.Error.Busy - BIOS.Error.ATAPI.TimeOut - */ - ;LD A,BIOS.Error.Busy .exit: SCF POP IY RET @@ -584,8 +576,10 @@ MediaCheck: PUSH IY JR NC,.no_errors ; CP BIOS.Error.UnknownDevice + JR NZ,.no_errors + AND A ; сброс ZF SCF - RET Z + RET ; .no_errors: LD A,#FF ;!HARDCODE drive changed OR A @@ -604,12 +598,15 @@ CHECK_IDE_SECTOR_SIZE: ;RET ; ReDEFINE_PARTITIONS: + EX AF,AF' + LD B,A ; HDD_INIT_TABLE.RemovableMedia LD A,DSS_MAX_DRIVES_AMOUNT - 1 ; ограничитель, чтоб не детектить больше 1 раздела LD (Init.count),A LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) LD (CURRENT_DRIVE.Number),A LD (LOGDRV_OFFSET),IY ;RES 1,(IY + LOGDRV.MediaParameters) - сбрасывается в DEFINE_PARTITIONS + ;LD B,%0000'0011 ;!HARDCODE drive changed, removable media JP DEFINE_PARTITIONS @@ -831,7 +828,7 @@ DEFINE_PARTITIONS: AND %1111'1101 LD (CURRENT_DRIVE.Removable),A LD (EXT_Partition.Low),DE ;R01 - LD (EXT_Partition.High),IX ;R01 + LD (EXT_Partition.High),DE ;R01 ; .LOOP: LD (CURRENT_SECTOR.Low),DE LD (CURRENT_SECTOR.High),IX diff --git a/SHELL/Commands/INFO.ASM b/SHELL/Commands/INFO.ASM index f168532..b20b2f9 100644 --- a/SHELL/Commands/INFO.ASM +++ b/SHELL/Commands/INFO.ASM @@ -33,14 +33,21 @@ cmd_info: CALL Get_Path ; .patch_A+1: LD A,0 CALL read_disk_info - JR C,.Unformatted_Partition + JR NC,.info_ok + ; + CP DSS_Error.sys.MEDIA_CHANGED + JR NZ,.Unsupported_Partition + ; + LD A,(.patch_A) + CALL read_disk_info + JR C,.Unsupported_Partition ; %7 - Volume label ; serial_string - Volume serial number string ; full_space_high \ ; full_space_medium - Partition size ; full_space_low / ; - LD HL,serial_string +.info_ok: LD HL,serial_string LD DE,Buffers.bat_params.PRM4 ; Volume serial number string CALL ncopy_string ; full capacity @@ -73,7 +80,7 @@ cmd_info: CALL Get_Path JP RESTORE_ALL.path ;RET ; -.Unformatted_Partition: +.Unsupported_Partition: LD HL,.none_string LD DE,Buffers.bat_params.PRM4 ; Volume serial number string CALL ncopy_string @@ -89,13 +96,17 @@ cmd_info: CALL Get_Path LD A,C CP "C" - "A" JR C,.ItIsFDD + ; LD DE,Dss.DRV.GenIOCTL.Enter LD BC,Dss.DRV.GenIOCTL.GetParams RST ToDSS.DRV - JR NC,.calc_size + JR C,.noMedia + LD A,H + AND %1111'0000 ; проверка на номер сектора > 28bit = нет носителя + JR Z,.calc_size ; .ItIsFDD: ; - LD HL,.Unknown_str +.noMedia: LD HL,.Unknown_str LD DE,Buffers.bat_params.PRM5 ; Drive size CALL ncopy_string JR .print_info_2 diff --git a/SHELL/build.txt b/SHELL/build.txt index fc42ce4..88bc40f 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -504 \ No newline at end of file +513 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index a6c50f5..68e156a 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit a6c50f572424e88f6199d639fa8109d53b71142c +Subproject commit 68e156a69e848e7b01656cdf67122022999d75ee