Files
Sprinter-BIOS/bios/exp/EXTENDED/shared.asm
T

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
*/