Добавлена функция [5x] DRV_GET_NAME для ATA/ATAPI

This commit is contained in:
Tolik 2026-04-28 00:11:05 +10:00
parent 2e74cde2db
commit bd908595f8
8 changed files with 351 additions and 142 deletions

@ -1 +1 @@
Subproject commit e1dc7ec10dc9c7e9153a05884e42973a57378a63
Subproject commit 20f00d231f2a8e7979248c02769c9528ee67f457

View File

@ -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

View File

@ -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

View File

@ -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 ­¥ à¥á¥â¨âáï?

View File

@ -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
@ -67,6 +69,45 @@ SELECT_DRIVE: AND #0F
.error: LD A,BIOS.Error.BadNumber
SCF
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

View File

@ -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
@ -158,6 +163,15 @@ START: ; reset all
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

View File

@ -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

View File

@ -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 - ¯¥ç âì ¡¥§ ¯®àç¨ ¡ãä¥à  ¡¥§ ¯à®¯ã᪠ ¤¢®©­ëå ¯à®¡¥«®¢ - á⮪
;===============================================================;