From bd908595f879b60a74e89336aa998ab94f7ca2bb Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Tue, 28 Apr 2026 00:11:05 +1000 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F=20[5x?= =?UTF-8?q?]=20DRV=5FGET=5FNAME=20=D0=B4=D0=BB=D1=8F=20ATA/ATAPI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Shared_Includes | 2 +- src/bios/exp/BIOS_FUNC.asm | 17 +-- src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM | 17 +++ src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM | 20 ++- src/bios/exp/EXTENDED/IDE/shared.asm | 188 ++++++++++++++++++++---- src/bios/rom/SETUP/AUTOIDE.asm | 64 +++++++- src/bios/rom/SETUP/VIDEO_IO.asm | 181 +++++++++++------------ src/bios/shared/DEFINES.INC | 4 +- 8 files changed, 351 insertions(+), 142 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index e1dc7ec..20f00d2 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit e1dc7ec10dc9c7e9153a05884e42973a57378a63 +Subproject commit 20f00d231f2a8e7979248c02769c9528ee67f457 diff --git a/src/bios/exp/BIOS_FUNC.asm b/src/bios/exp/BIOS_FUNC.asm index dfcd642..8226bb2 100644 --- a/src/bios/exp/BIOS_FUNC.asm +++ b/src/bios/exp/BIOS_FUNC.asm @@ -80,8 +80,7 @@ TAB_FNS: ; 5x ;-------------- - DB low FN_RESERVED_5x ;#50 - + DB low FN_5x_Parser_0 ;#50 - Get drive name DB low FN_5x_Parser_1 ;#51 - Reset drive DB low FN_5x_Parser_2 ;#52 - Long read DB low FN_5x_Parser_3 ;#53 - Long write @@ -272,8 +271,7 @@ TAB_FNS: ;-------------- ;-------------- - DB high FN_RESERVED_5x - + DB high FN_5x_Parser_0 DB high FN_5x_Parser_1 DB high FN_5x_Parser_2 DB high FN_5x_Parser_3 @@ -523,7 +521,7 @@ TAB_5xFNS: ;-------------------------------------------------------------[ ATA #8 ] ; - DB low FN_RESERVED_5x + DB low ATA_5x_GET_DRIVE_NAME DB low ATA_5x_RESET DB low ATA_5x_LONG_READ DB low ATA_5x_LONG_WRITE @@ -548,7 +546,7 @@ TAB_5xFNS: ;-----------------------------------------------------------[ ATAPI #C ] ; - DB low FN_RESERVED_5x + DB low ATAPI_5x_GET_DRIVE_NAME DB low ATAPI_5x_RESET DB low ATAPI_5x_LONG_READ DB low ATAPI_5x_LONG_WRITE ; [ ] new @@ -626,7 +624,7 @@ TAB_5xFNS: ;-------------------------------------------------------------[ ATA #8 ] ; - DB high FN_RESERVED_5x + DB high ATA_5x_GET_DRIVE_NAME DB high ATA_5x_RESET DB high ATA_5x_LONG_READ DB high ATA_5x_LONG_WRITE @@ -651,7 +649,7 @@ TAB_5xFNS: ;-----------------------------------------------------------[ ATAPI #C ] ; - DB high FN_RESERVED_5x + DB high ATAPI_5x_GET_DRIVE_NAME DB high ATAPI_5x_RESET DB high ATAPI_5x_LONG_READ DB high ATAPI_5x_LONG_WRITE ; LONG_WRITE ; [ ] new @@ -702,7 +700,8 @@ EXP_FNS_RST18: PUSH HL ; FN_RESERVED_5x ; FN_RESERVED_5x ; DRV_LIST - +FN_5x_Parser_0: LD C,#00 + JR FN_5x_Parser FN_5x_Parser_1: LD C,#01 ; ATA_5x_RESET JR FN_5x_Parser FN_5x_Parser_2: LD C,#02 ; ATA_5x_LONG_READ diff --git a/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM b/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM index c3e2847..70904f8 100644 --- a/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM +++ b/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM @@ -24,6 +24,23 @@ _ZIP_WAITS_ EQU 128 ASSERT ((PACKET_SIZE % 4) = 0), "PACKET_SIZE must be an even number" +;[]================================================================[#50] +; IN: A - физический номер привода +; DE - буффер 64 байта для названия устройства +; OUT: NC - в буфере название +; СF - в A номер ошибки +ATAPI_5x_GET_DRIVE_NAME: + LD B,A ; сохраняем A + LD C,IDE.Device.ATAPI + CALL SELECT_DRIVE.drv_params + JP Z,ATAxx_5x_GET_DRIVE_NAME + ; + LD A,BIOS.Error.BadNumber + SCF + RET +;[]================================================================[#50] + + ;[]================================================================[#51] ATAPI_5x_RESET: LD C,IDE.Device.ATAPI CALL SELECT_DRIVE diff --git a/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM b/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM index e8ae194..4f43ba2 100644 --- a/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM +++ b/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM @@ -73,9 +73,27 @@ IDE3 EQU #C1D8 ; DB #FF ;SECTOR PER CYLINDER HIGH ;06 ; DB #FF ;RESERVED ;07 - WRITE_OUTI_DUPs EQU 32 ; bytes + + +;[]================================================================[#50] +; IN: A - физический номер привода +; DE - буффер 64 байта для названия устройства +; OUT: NC - в буфере название +; СF - в A номер ошибки +ATA_5x_GET_DRIVE_NAME: + LD B,A ; сохраняем A + LD C,IDE.Device.HDD + CALL SELECT_DRIVE.drv_params + JP Z,ATAxx_5x_GET_DRIVE_NAME + ; + LD A,BIOS.Error.BadNumber + SCF + RET +;[]================================================================[#50] + + ;[]================================================================[#51] ;Function: Reset drive ATA_5x_RESET: ; !FIXIT не ресетится? diff --git a/src/bios/exp/EXTENDED/IDE/shared.asm b/src/bios/exp/EXTENDED/IDE/shared.asm index 160ec71..53d6d76 100644 --- a/src/bios/exp/EXTENDED/IDE/shared.asm +++ b/src/bios/exp/EXTENDED/IDE/shared.asm @@ -3,37 +3,39 @@ ; Вход: A - номер устройства, C - DriveType ; Выход: A - MediaParameters, C - DriveType ; не портит L -SELECT_DRIVE: AND #0F - LD IY,IDE.INIT_TBL_IDE0 - JR Z,.channel - DEC A - LD IY,IDE.INIT_TBL_IDE1 - ;R02 - JR Z,.channel - DEC A - LD IY,IDE.INIT_TBL_IDE2 - JR Z,.channel - DEC A - LD IY,IDE.INIT_TBL_IDE3 - ; - JR NZ,.error - ; -.channel: EXX - IN A,(SLOT3) - PUSH AF - LD A,SYS_PAGE - OUT (SLOT3),A - ; - LD H,(IY + IDE.HDD_INIT_TABLE.MediaParameters) - LD C,(IY + IDE.HDD_INIT_TABLE.DriveType) - LD B,(IY + IDE.HDD_INIT_TABLE.DRV_Flags) - POP AF - OUT (SLOT3),A ;возврат страницы - ; - LD A,C - EXX - ; - CP C +SELECT_DRIVE: CALL .drv_params +; AND #0F +; LD IY,IDE.INIT_TBL_IDE0 +; JR Z,.channel +; ; +; DEC A +; LD IY,IDE.INIT_TBL_IDE1 +; JR Z,.channel +; ; +; DEC A +; LD IY,IDE.INIT_TBL_IDE2 +; JR Z,.channel +; ; +; DEC A +; LD IY,IDE.INIT_TBL_IDE3 +; JR NZ,.error +; ; +; .channel: EXX +; IN A,(SLOT3) +; PUSH AF +; LD A,SYS_PAGE +; OUT (SLOT3),A +; ; +; LD H,(IY + IDE.HDD_INIT_TABLE.MediaParameters) +; LD C,(IY + IDE.HDD_INIT_TABLE.DriveType) +; LD B,(IY + IDE.HDD_INIT_TABLE.DRV_Flags) +; POP AF +; OUT (SLOT3),A ;возврат страницы +; ; +; LD A,C +; EXX +; ; +; CP C ; EXX SCF @@ -66,7 +68,46 @@ SELECT_DRIVE: AND #0F ; .error: LD A,BIOS.Error.BadNumber SCF - RET + RET + ; + ; не портит регистры B,DE +.drv_params: AND #0F + LD IY,IDE.INIT_TBL_IDE0 + JR Z,.channel + ; + DEC A + LD IY,IDE.INIT_TBL_IDE1 + JR Z,.channel + ; + DEC A + LD IY,IDE.INIT_TBL_IDE2 + JR Z,.channel + ; + DEC A + LD IY,IDE.INIT_TBL_IDE3 + RET NZ + ; +.channel: EXX + IN A,(SLOT3) + PUSH AF + LD A,SYS_PAGE + OUT (SLOT3),A + ; + LD H,(IY + IDE.HDD_INIT_TABLE.MediaParameters) + LD C,(IY + IDE.HDD_INIT_TABLE.DriveType) + LD B,(IY + IDE.HDD_INIT_TABLE.DRV_Flags) + POP AF + OUT (SLOT3),A ;возврат страницы + ; + LD A,C + EXX + CP C + RET +;======================================================================= + + +;======================================================================= + ;======================================================================= @@ -87,6 +128,89 @@ CHANGE_MEM_BLK: LD HL,#C000 ;======================================================================= +;======================================================================= +; IN: B - физический номер привода +; DE - буффер 64 байта для названия устройства +; OUT: NC - в буфере название +; СF - в A номер ошибки +ATAxx_5x_GET_DRIVE_NAME: + LD A,B + AND #0F + LD HL,SYS_PAGE.IDE_0.NAME + JR Z,.ldir + ; + DEC A + LD HL,SYS_PAGE.IDE_1.NAME + JR Z,.ldir + DEC A + LD HL,SYS_PAGE.IDE_2.NAME + JR Z,.ldir + DEC A + LD HL,SYS_PAGE.IDE_3.NAME + JR NZ,.error + ; +.ldir: EXX + LD C,SLOT3 + IN B,(C) + LD D,SYS_PAGE + OUT (C),D + EXX + LD A,(HL) + EXX + OUT (C),B + EXX + AND A ;CONFIGURE_IDE_DRIVES.IDE_NAME_MARKER.None + JR Z,.error + ; + INC A ;CONFIGURE_IDE_DRIVES.IDE_NAME_MARKER.NoInfo + JR Z,.autodetect + ; + INC A ;CONFIGURE_IDE_DRIVES.IDE_NAME_MARKER.Unknown + JR Z,.UnknownName + ; + LD B,SYS_PAGE.IDE_x.NAME.Size +.loop: EXX + OUT (C),D + EXX + LD A,(HL) + EXX + OUT (C),B + EXX + LD (DE),A + INC HL + INC DE + DJNZ .loop + RET + ; +.UnknownName: LD HL,.Unknown_str + LD BC,.Unknown_str.Size + LDIR + XOR A + EX DE,HL + LD B,SYS_PAGE.IDE_x.NAME.Size - .Unknown_str.Size +.loop_zero: LD (HL),A + INC HL + DJNZ .loop_zero + RET + ; +.autodetect: ;!FIXIT сделать детект!!! + JR .UnknownName + ; + ; если нет драйва +.error: LD A,BIOS.Error.BadNumber + SCF + RET + ; +.Unknown_str: BYTE 'Unknown' +.Unknown_str.Size EQU $ - .Unknown_str + + ; если не поддерживается возврат имени для устройства + ;LD A,BIOS.Error.InvalidSubFunction + ;SCF + ;RET +;======================================================================= + + ;======================================================================= ;Function: Detect Disk ; A - Disk diff --git a/src/bios/rom/SETUP/AUTOIDE.asm b/src/bios/rom/SETUP/AUTOIDE.asm index 4c46cb3..71f049d 100644 --- a/src/bios/rom/SETUP/AUTOIDE.asm +++ b/src/bios/rom/SETUP/AUTOIDE.asm @@ -92,6 +92,11 @@ IDE3 EQU #C1D8 MODULE CONFIGURE_IDE_DRIVES +IDE_NAME_MARKER: +.None EQU #00 +.NoInfo EQU #FF +.Unknown EQU #FE + MODULE PAUSES HALT: .Time_2s EQU 100 @@ -153,11 +158,20 @@ START: ; reset all OUT (SLOT3),A LD HL,IDE.INIT_TBL_IDE0 LD BC,256*(IDE.HDD_INIT_TABLE * 4) + #FF ;R02 -;CLEAR HDD VARIABLE + ;CLEAR HDD VARIABLE .FILLIDE: LD (HL),C INC HL DJNZ .FILLIDE + ;CLEAR HDD NAME + LD HL,SYS_PAGE.IDE_NAMES_TABLE + LD B,low SYS_PAGE.IDE_NAMES_TABLE.Size + INC C ; IDE_NAME_MARKER.None +.FILLIDE_NAME: + LD (HL),C + INC HL + DJNZ .FILLIDE_NAME + ; EX AF,AF' OUT (SLOT3),A @@ -207,6 +221,7 @@ AUTODETECT: LD A,L ;DETECT MESSAGE INC A LD A,msgStrings.ideNone JR Z,.NOSKIPKEY + ; LD A,msgStrings.ideSkiped .NOSKIPKEY: CALL C,POSTMSG CALL ScreenPOS.CRLF @@ -598,22 +613,25 @@ IDE_CMD: /////////////////////////////////////////////////////////////////////[v] PRINT_IDE_MODEL: LD HL,IDENTIFY_DEVICE_BUFFER.ModelNumber + LD B,+(_ATA_IDENTIFY_DEVICE_DATA.MaximumBlockTransfer - _ATA_IDENTIFY_DEVICE_DATA.ModelNumber)/2 LD A,(HL) OR A JR Z,.unknown - LD B,+(_ATA_IDENTIFY_DEVICE_DATA.MaximumBlockTransfer - _ATA_IDENTIFY_DEVICE_DATA.ModelNumber)/2 - ; !FIXIT Сделать копирование названия винта в SYS_PAGE и - ; новой функцией/подфункцией отдавать эту строчку - ; чтоб проги типа FDISK не делали велосипедов - CALL PRINT_STR_BIG_ENDIAN ; + CALL PRINT_STR_BIG_ENDIAN AND A RET ; -.unknown: LD A,msgStrings.ideUnknown +.unknown: LD HL,.marker + LD A,.marker.Size + CALL COPY_IDE_NAME_TO_SYS_PAGE + LD A,msgStrings.ideUnknown CALL POSTMSG AND A RET + ; +.marker: BYTE IDE_NAME_MARKER.Unknown +.marker.Size: EQU $ - .marker /////////////////////////////////////////////////////////////////////[^] @@ -1044,6 +1062,38 @@ Nop_CHANELS: /////////////////////////////////////////////////////////////////////[^] +/////////////////////////////////////////////////////////////////////[v] +; Вход: A - длина строки +; HL - адрес строки +; IY - адрес данных драйва в SYS_PAGE (.IDE_0 .. .IDE_3) +; Выход: B - длина строки +COPY_IDE_NAME_TO_SYS_PAGE: + ; save IDE name + LD C,A + LD B,0 + IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + ; SYS_PAGE.IDE_x --> SYS_PAGE.IDE_x.NAME + PUSH IY + POP DE + SET 1,D + LD A,%0010'0000 + XOR E + LD E,A + SLA E + SLA E + ; + LD A,C + LDIR + LD B,A + EX AF,AF' + OUT (SLOT3),A + RET +/////////////////////////////////////////////////////////////////////[^] + + /////////////////////////////////////////////////////////////////////[v] ; DisableWriteCache: ; LD BC,IDE.Write.Features diff --git a/src/bios/rom/SETUP/VIDEO_IO.asm b/src/bios/rom/SETUP/VIDEO_IO.asm index aeddc70..f84e702 100644 --- a/src/bios/rom/SETUP/VIDEO_IO.asm +++ b/src/bios/rom/SETUP/VIDEO_IO.asm @@ -17,38 +17,95 @@ ScreenPOS: ;; - - IF BIG_ENDIAN_STR_PRINT = 2 -PRINT_STR_BIG_ENDIAN: - LD A,(HL) - CP ' ' - JR NZ,.PRINTDW - INC HL - LD A,(HL) - DEC HL - CP ' ' - JR NZ,.PRINTDW - INC HL - INC HL -.no_space: DJNZ DWPRINT - RET - ; -.PRINTDW: PUSH BC - LD E,(HL) - INC HL - LD A,(HL) - INC HL - CALL PRINT_CHAR - LD A,E - CALL PRINT_CHAR - POP BC - LD A,' ' - CP E - JR Z,.no_space - DJNZ .PRINTDW - RET - - ELSEIF BIG_ENDIAN_STR_PRINT = 0 +;======================================================================= +; 2 - печать без порчи буфера без пропуска двойных пробелов - сток +; PRINT_STR_BIG_ENDIAN: +; LD A,(HL) +; CP ' ' +; JR NZ,.PRINTDW +; INC HL +; LD A,(HL) +; DEC HL +; CP ' ' +; JR NZ,.PRINTDW +; INC HL +; INC HL +; .no_space: DJNZ DWPRINT +; RET +; ; +; .PRINTDW: PUSH BC +; LD E,(HL) +; INC HL +; LD A,(HL) +; INC HL +; CALL PRINT_CHAR +; LD A,E +; CALL PRINT_CHAR +; POP BC +; LD A,' ' +; CP E +; JR Z,.no_space +; DJNZ .PRINTDW +; RET +;======================================================================= +; 0 - печать с порчей буфера и пропуском двойных пробелов - в 1,5 раза шустрее стока не затирает предыдущую строку +; PRINT_STR_BIG_ENDIAN: +; PUSH HL +; PUSH BC +; LD D,H +; LD E,L +; INC HL +; ; +; .loop_ch: LD A,(DE) +; LDI +; LD (DE),A +; INC HL +; INC DE +; DJNZ .loop_ch +; ; +; POP BC +; POP HL +; LD A,B +; ADD A,B +; LD B,A +; ; +; .print_loop: CALL .no_space +; RET Z +; LD D,H +; LD E,L +; PUSH DE +; PUSH BC +; LD D,' ' +; CALL LP_PRINT_LINE6 +; POP BC +; POP DE +; PUSH HL +; AND A +; SBC HL,DE +; LD A,B +; SUB L +; LD B,A +; JR Z,.exit +; LD A,' ' +; INC B +; PUSH BC +; CALL PRINT_CHAR +; POP BC +; POP HL +; DJNZ .print_loop +; RET +; ; +; .no_space: LD A,(HL) +; CP ' ' +; RET NZ +; INC HL +; DJNZ .no_space +; RET +; ; +; .exit: POP HL +; RET +;======================================================================= +; 1 - печать с порчей буфера без пропуска двойных пробелов - в 3 раза шустрее стока PRINT_STR_BIG_ENDIAN: PUSH HL PUSH BC @@ -67,67 +124,11 @@ PRINT_STR_BIG_ENDIAN: POP HL LD A,B ADD A,B - LD B,A - ; -.print_loop: CALL .no_space - RET Z - LD D,H - LD E,L - PUSH DE - PUSH BC - LD D,' ' - CALL LP_PRINT_LINE6 - POP BC - POP DE PUSH HL - AND A - SBC HL,DE - LD A,B - SUB L - LD B,A - JR Z,.exit - LD A,' ' - INC B - PUSH BC - CALL PRINT_CHAR - POP BC + CALL CONFIGURE_IDE_DRIVES.COPY_IDE_NAME_TO_SYS_PAGE POP HL - DJNZ .print_loop - RET - ; -.no_space: LD A,(HL) - CP ' ' - RET NZ - INC HL - DJNZ .no_space - RET - ; -.exit: POP HL - RET - - ELSEIF BIG_ENDIAN_STR_PRINT = 1 -PRINT_STR_BIG_ENDIAN: - PUSH HL - PUSH BC - LD D,H - LD E,L - INC HL - ; -.loop_ch: LD A,(DE) - LDI - LD (DE),A - INC HL - INC DE - DJNZ .loop_ch - ; - POP BC - POP HL - LD A,B - ADD A,B - LD B,A JP LP_PRINT_LINE2 - ENDIF - +;======================================================================= PRINTA: LD E,A diff --git a/src/bios/shared/DEFINES.INC b/src/bios/shared/DEFINES.INC index df4a2d9..9dcd46c 100644 --- a/src/bios/shared/DEFINES.INC +++ b/src/bios/shared/DEFINES.INC @@ -29,8 +29,8 @@ RELEASEhotFIX EQU 0 ; DEFINE UnusedSettingsFeatures 0 ; ;DEFINE OPTIMIZE_RW_PROCEDURE 0 ; DEFINE TMP_CELLS_INIT 0 ; инит портов 4 и 5 для временного хранения значений в тр-дос - DEFINE BIG_ENDIAN_STR_PRINT 1 ; -; ; 0 - печать с порчей буфера и пропуском двойных пробелов - в 1,5 раза шустрее стока ;!FIXIT не затирает предыдущую строку +;DEFINE BIG_ENDIAN_STR_PRINT 1 ; +; ; 0 - печать с порчей буфера и пропуском двойных пробелов - в 1,5 раза шустрее стока не затирает предыдущую строку ; ; 1 - печать с порчей буфера без пропуска двойных пробелов - в 3 раза шустрее стока ; ; 2 - печать без порчи буфера без пропуска двойных пробелов - сток ;===============================================================; \ No newline at end of file