mirror of
https://github.com/Tolik-Trek/Sprinter-BIOS.git
synced 2026-06-15 09:21:46 +03:00
354 lines
7.2 KiB
NASM
354 lines
7.2 KiB
NASM
;[x] 18/12/2023. ¤®¡ ¢«¥¨¥/¤®¯¨«¨¢ ¨¥ API CD-ROM (ATAPI)
|
||
;=======================================================================
|
||
; ‚室: A - ®¬¥à ãáâனá⢠, C - DriveType
|
||
; ‚ë室: A - MediaParameters, C - DriveType
|
||
; ¥ ¯®àâ¨â L
|
||
SELECT_DRIVE: CALL .drv_params
|
||
EXX
|
||
SCF
|
||
LD A,BIOS.Error.BadNumber
|
||
RET NZ
|
||
;
|
||
LD A,B
|
||
RRA
|
||
LD A,IDE.Chanel.Secondary
|
||
JR C,.device
|
||
LD A,IDE.Chanel.Primary
|
||
.device: OUT (IDE.Chanel.Set),A ;R02
|
||
LD A,B
|
||
AND #F0
|
||
LD BC,IDE.Write.DeviceHead
|
||
OUT (C),A
|
||
;
|
||
LD A,high IDE.Read.Status
|
||
IN A,(low IDE.Read.Status)
|
||
AND IDE.CtrlByte.Busy
|
||
; â¥áâ¨à®¢ ¨¥ § ¤¥à¦¥ª
|
||
JR Z,.notBusy
|
||
LD B,32
|
||
DJNZ $
|
||
;
|
||
.notBusy: LD A,H
|
||
EXX
|
||
RET
|
||
;
|
||
.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
|
||
;=======================================================================
|
||
|
||
|
||
;=======================================================================
|
||
|
||
;=======================================================================
|
||
|
||
|
||
;=======================================================================
|
||
; next page in mem block
|
||
CHANGE_MEM_BLK: LD HL,#C000
|
||
IN A,(SLOT3)
|
||
EX AF,AF' ;>-----------> \
|
||
LD A,SYS_PAGE
|
||
OUT (SLOT3),A
|
||
LD D,high SYS_PAGE.RAM_TABLE
|
||
LD E,XH
|
||
LD A,(DE)
|
||
LD XH,A
|
||
EX AF,AF' ;<-----------< /
|
||
OUT (SLOT3),A
|
||
RET
|
||
;=======================================================================
|
||
|
||
; NOT USED
|
||
;=======================================================================
|
||
; IN: B - ¡¨â 4..7 - ⨯ ãáâனá⢠, ¡¨â 0..3 - ®¬¥à ãáâனáâ¢
|
||
; 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
|
||
;=======================================================================
|
||
|
||
|
||
;=======================================================================
|
||
; !FIXIT ¬®¦® ¯®¯à®¡®¢ âì ¨á¯®«ì§®¢ âì ¢ AUTOIDE.asm ¤«ï ᮪à é¥¨ï ª®¤
|
||
; A - ¡¨â 4..7 - ⨯ ãáâனá⢠, ¡¨â 0..3 - ®¬¥à ãáâனáâ¢
|
||
; C - IDE.Device.HDD
|
||
; E - IDE.CMD.ATA.IdentifyDevice / IDE.CMD.ATAPI.IdentifyPacketDevice
|
||
; HL - Buffer
|
||
ATAxx_IdentifyDevice:
|
||
PUSH HL
|
||
PUSH BC
|
||
CALL .RUN_CMD
|
||
POP BC
|
||
JR C,.error
|
||
;
|
||
DJNZ .get_full_name
|
||
; B=1
|
||
POP HL
|
||
.read_hdd_data: LD BC,IDE.Read.Data
|
||
INIR
|
||
INIR
|
||
RET
|
||
;
|
||
.invalidFunction:
|
||
POP HL
|
||
LD A,BIOS.Error.InvalidSubFunction
|
||
SCF
|
||
RET
|
||
;
|
||
; B=2
|
||
.get_full_name: DJNZ .invalidFunction
|
||
;
|
||
LD HL,SYS_PAGE.MS_BUF
|
||
IN A,(SLOT3)
|
||
PUSH AF ; áâà ¨æ ¯®«ì§®¢ ⥫ï
|
||
LD A,SYS_PAGE
|
||
OUT (SLOT3),A
|
||
CALL .read_hdd_data
|
||
LD HL,SYS_PAGE.MS_BUF + _ATA_IDENTIFY_DEVICE_DATA.FirmwareRevision
|
||
LD B,+(_ATA_IDENTIFY_DEVICE_DATA.MaximumBlockTransfer - _ATA_IDENTIFY_DEVICE_DATA.FirmwareRevision)/2
|
||
CALL ATAxx_IdentifyDevice.STR_BIG_ENDIAN_TO_LITTLE
|
||
LD HL,SYS_PAGE.MS_BUF + _ATA_IDENTIFY_DEVICE_DATA.SerialNumber
|
||
LD B,+(_ATA_IDENTIFY_DEVICE_DATA.BufferType - _ATA_IDENTIFY_DEVICE_DATA.SerialNumber)/2
|
||
CALL ATAxx_IdentifyDevice.STR_BIG_ENDIAN_TO_LITTLE
|
||
POP AF ; áâà ¨æ ¯®«ì§®¢ ⥫ï
|
||
EXX
|
||
LD B,A
|
||
LD C,SLOT3
|
||
LD D,SYS_PAGE
|
||
EXX
|
||
POP DE
|
||
LD HL,SYS_PAGE.MS_BUF + _ATA_IDENTIFY_DEVICE_DATA.ModelNumber
|
||
LD B,_ATA_IDENTIFY_DEVICE_DATA.MaximumBlockTransfer - _ATA_IDENTIFY_DEVICE_DATA.ModelNumber
|
||
CALL .ldirSwitched
|
||
;
|
||
LD HL,SYS_PAGE.MS_BUF + _ATA_IDENTIFY_DEVICE_DATA.SerialNumber
|
||
LD B,_ATA_IDENTIFY_DEVICE_DATA.BufferType - _ATA_IDENTIFY_DEVICE_DATA.SerialNumber
|
||
CALL .ldir
|
||
;
|
||
LD HL,SYS_PAGE.MS_BUF + _ATA_IDENTIFY_DEVICE_DATA.FirmwareRevision
|
||
LD B,_ATA_IDENTIFY_DEVICE_DATA.ModelNumber - _ATA_IDENTIFY_DEVICE_DATA.FirmwareRevision
|
||
;CALL .ldir
|
||
.ldir: EXX
|
||
OUT (C),D
|
||
EXX
|
||
.ldirSwitched: LD A,(HL)
|
||
EXX
|
||
OUT (C),B
|
||
EXX
|
||
LD (DE),A
|
||
INC HL
|
||
INC DE
|
||
AND A
|
||
RET Z
|
||
;
|
||
DJNZ .ldir
|
||
XOR A
|
||
LD (DE),A
|
||
INC DE
|
||
RET
|
||
;
|
||
.error: POP HL
|
||
CP BIOS.Error.BadNumber
|
||
SCF
|
||
RET Z
|
||
LD A,BIOS.Error.NotReady
|
||
RET
|
||
;
|
||
;
|
||
.RUN_CMD: CALL SELECT_DRIVE
|
||
RET C
|
||
;
|
||
LD BC,IDE.Write.Command
|
||
OUT (C),E
|
||
LD A,E
|
||
EXX
|
||
SUB IDE.CMD.ATA.IdentifyDevice
|
||
LD H,A
|
||
LD L,A
|
||
JR Z,.wait
|
||
;
|
||
LD H,#0C
|
||
.wait: LD DE,IDE.CtrlByte.Busy * 256 + 0
|
||
CALL WAITPRT.custom ; HL = 0 or #0CB7
|
||
EXX
|
||
RET C
|
||
;
|
||
LD BC,IDE.Read.Status
|
||
IN A,(C)
|
||
RRCA
|
||
RET C
|
||
;
|
||
AND (IDE.CtrlByte.DataRequest + IDE.CtrlByte.Ready) / 2
|
||
SCF
|
||
RET Z
|
||
;
|
||
EXX
|
||
LD DE,256*IDE.CtrlByte.DataRequest + IDE.CtrlByte.DataRequest
|
||
CALL WAITPRT.custom_DE
|
||
EXX
|
||
RET
|
||
;
|
||
; LD BC,IDE.Read.Data
|
||
; LD HL,SYS_PAGE.MS_BUF
|
||
; IN A,(SLOT3)
|
||
; EX AF,AF'
|
||
; LD A,SYS_PAGE
|
||
; OUT (SLOT3),A
|
||
; INIR
|
||
; INIR
|
||
; EX AF,AF'
|
||
; RET
|
||
;
|
||
;
|
||
; 1 - ¯¥ç âì á ¯®à祩 ¡ãä¥à ¡¥§ ¯à®¯ã᪠¤¢®©ëå ¯à®¡¥«®¢ - ¢ 3 à § èãáâ॥ á⮪
|
||
; ¬®¦¥â ¯®â®¬ ᤥ« âì ¨§ í⮣® API ¯¥ç ⨠¤«ï BIG ENDIAN
|
||
.STR_BIG_ENDIAN_TO_LITTLE:
|
||
LD D,H
|
||
LD E,L
|
||
LD A,(HL)
|
||
AND A
|
||
RET Z
|
||
;
|
||
INC HL
|
||
.loop_ch: LD A,(DE)
|
||
LDI
|
||
LD (DE),A
|
||
INC HL
|
||
INC DE
|
||
DJNZ .loop_ch
|
||
RET
|
||
;=======================================================================
|
||
/*
|
||
; D - MASK
|
||
; E - PATTERN
|
||
; !!! ¥ª®â®àë¥ äãªæ¨¨ ¤¥îâáï, çâ® ¢ë室¥ ¢á¥£¤ ZF
|
||
WAITPRT: LD DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.Ready+IDE.CtrlByte.Error) + IDE.CtrlByte.Ready
|
||
.custom: LD BC,IDE.Read.Status
|
||
|
||
|
||
; ATAPI or Absent
|
||
; Exit: CF - No device
|
||
; NC - ATAPI
|
||
.IdentPDevChk: LD E,IDE.CMD.ATAPI.IdentifyPacketDevice
|
||
LD BC,IDE.Write.Command
|
||
OUT (C),E
|
||
;
|
||
LD HL,PAUSES.HALT.Time_2s
|
||
LD DE,IDE.CtrlByte.Busy*256 + 0
|
||
CALL BITS_WAITS.Clear_BUSY
|
||
RET C
|
||
;
|
||
; BC = IDE.Read.Status
|
||
IN A,(C)
|
||
RRCA
|
||
RET
|
||
*/ |