Sprinter-Core/src/bios/exp/FUNC_4x.ASM
2024-01-09 01:00:57 +10:00

730 lines
12 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;
MACRO WAIT_HDD
LD BC,IDE.Read.Status
.loop: IN A,(C)
BIT IDE.ControlBit.Busy,A
JR NZ,.loop
ENDM
;______________________________________________________________________:
;
;--
HD_BPB_PREP:
LD D,A
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(SYS_PAGE.HD_IDF_ADR.sectors)
LD E,A
EX AF,AF'
OUT (SLOT3),A
LD A,D
LD D,#00
LD IX,#0000
LD B,#01
HD_PREPARE:
PUSH AF
PUSH HL
CALL HD_CALC_SECS
JR NC,.L1
POP HL
POP AF
SCF
RET
.L1: LD A,B
LD BC,IDE.Write.Counter ; “áâ ­®¢¨âì ç¨á«® ᥪâ®à®¢ ¤«ï § ¯¨á¨
OUT (C),A
IF IDE_Optimization
INC C
OUT (C),L
INC C
OUT (C),E
INC C
OUT (C),D
ELSE
LD BC,IDE.Write.Sector
OUT (C),L ; …ŠŽ<E28099>
LD BC,IDE.Write.CylinderLow
OUT (C),E ; ¤®à®¦ª  low
LD BC,IDE.Write.CylinderHigh
OUT (C),D ; ¤®à®¦ª  high
ENDIF
LD BC,IDE.Read.Control
IN A,(C)
AND #F0 ; !!!!! ¯®á¬®âà¥âì
OR H
INC B ; IDE.Write.DeviceHead
OUT (C),A
POP HL ; BUFER & PAGE
POP AF
AND A
RET
NEXT_ADD_SEC:
PUSH AF
LD A,B
LD BC,IDE.Write.Counter ; “áâ ­®¢¨âì ç¨á«® ᥪâ®à®¢ ¤«ï § ¯¨á¨
OUT (C),A
IF IDE_Optimization
DEC B
INC C
IN A,(C) ; IDE.Read.Sector
ADC A,E
INC B
OUT (C),A ; IDE.Write.Sector
DEC B
INC C
IN A,(C) ; IDE.Read.CylinderLow
ADC A,D
INC B
OUT (C),A ; IDE.Write.CylinderLow
DEC B
INC C
IN A,(C) ; IDE.Read.CylinderHigh
ADC A,0
INC B
OUT (C),A ; IDE.Write.CylinderHigh
LD BC,IDE.Read.Control
IN A,(C)
ELSE
LD BC,IDE.Read.Sector
IN A,(C)
ADC A,E
INC B
OUT (C),A ; IDE.Write.Sector
LD BC,IDE.Read.CylinderLow
IN A,(C)
ADC A,D
INC B
OUT (C),A ; IDE.Write.CylinderLow
LD BC,IDE.Read.CylinderHigh
IN A,(C)
ADC A,0
INC B
OUT (C),A ; IDE.Write.CylinderHigh
LD BC,IDE.Read.Control
IN A,(C)
ENDIF
LD D,A
ADC A,0
AND #0F
LD E,A
LD A,D
AND #F0
OR E
INC B
OUT (C),A ; IDE.Write.DeviceHead
POP AF
RET
; <20>ਠ¨á¯®«­¥­¨¨ ¯à®¨§¢®¤¨âáï ¢áï ¯®¤£®â®¢ª  ª
; ®¯¥à æ¨ï¬ ç⥭¨ï/§ ¯¨á¨ ¢ëç¨á«¥­¨¥
; 樫¨­¤à®¢/£®«®¢®ª/ᥪâ®à®¢ ¨ § ­¥á¥­¨¥ ¨å ¢ ॣ¨áâàë ¢¨­ç¥áâ¥à 
; ¤ «¥¥ ¯à®£à ¬¬  ¬®¦¥â á ¬  ⮫쪮 ¯®¤ âì ª®¬ ­¤ã ç¨â âì/¯¨á âì ¨
; á ¬®áâ®ï⥫쭮 ¯à®¨§¢®¤¨âì áç¨â뢠­¨¥/§ ¯¨áì ¤ ­­ëå ¢ ¢¨­ç¥áâ¥à.
; Š®¬ ­¤  㤮¡­  ¤«ï à ¡®âë ¯à®£à ¬¬ ¢ ॠ«ì­®¬ ¢à¥¬¥­¨, ª®£¤  ­¥®¡å®¤¨¬®
; ªà®¬¥ ç⥭¨ï/§ ¯¨á¨ ¤ ­­ëå ¯à®¨§¢®¤¨âì ª ª¨¥ «¨¡® ¨­ë¥ ¤¥©á⢨ï.
FN_HDD_PREPARE: ; <20>Ž„ƒŽŽŠ€ Š <>˜<E280A6>ˆŒ Ž<><EFBFBD>ˆŸŒ R/W
AND A ; ç⮡ á¡à®á¨âì CF ¥á«¨ ®­ á⮨⠨ B=0
INC B
DEC B
RET Z
CALL HD_WAIT
RET C
CALL HD_PREPARE
RET C
;!TEST
EX AF,AF'
LD A,#BF ; check buffer address in SLOT3
SUB H
JR C,.SetCommand
EX AF,AF'
SAFE_PORTY
EXX
LD C,SLOT3
IN B,(C)
EXX
OUT (SLOT3),A
EX AF,AF'
.SetCommand:
LD BC,IDE.Write.Command
LD A,IDE.ATA.ReadSectorsWithRetry
; OUT (C),A
AND A
RET
FN_HDD_READ_BPB:
CALL HD_WAIT
RET C
CALL HD_BPB_PREP
JR NC,HD_RD_L1
RET
; FOR LBA ONLY - NEXT_READ
; HL - bufer, A - page
; B - numer of sectors
; DE - add_par (next+DE) (d.b. 1 for NEXT)
FN_HDD_READ_NEXT:
AND A
INC B
DEC B
RET Z ; ret if 0 sectors
CALL HD_WAIT
RET C
CALL NEXT_ADD_SEC
JR HD_RD_L1
; HL - BUFER, A - PAGE
FN_HDD_READ:
AND A
INC B
DEC B
RET Z
CALL HD_WAIT
CALL NC,HD_PREPARE
RET C
HD_RD_L1:
EXX
LD C,SLOT3
IN B,(C)
EXX
OUT (SLOT3),A
EX AF,AF'
SAFE_PORTY
LD BC,IDE.Write.Command
LD A,IDE.ATA.ReadSectorsWithRetry
OUT (C),A
HD_RD_L2:
WAIT_HDD
BIT IDE.ControlBit.DataRequest,A
JR NZ,HD_READ_CONT
ZERO_PORTY
HD_RET:
EXX
OUT (C),B
EXX
LD BC,IDE.Read.Error
IN A,(C)
AND A
SCF
RET NZ
EX AF,AF'
AND A
RET
HD_READ_CONT:
LD BC,IDE.Read.Data
.loop_read1:
DUP 16
INI ; ¢á¥£® 16 à § INI - ®¯â¨¬ «ì­®.
EDUP
JR NZ,.loop_read1
.loop_read2:
DUP 16
INI ; ¢á¥£® 16 à § INI - ®¯â¨¬ «ì­®.
EDUP
JR NZ,.loop_read2
LD A,H
OR L
JR NZ,HD_RD_L2
LD A,SYS_PAGE
OUT (SLOT3),A
EX AF,AF'
LD HL,SYS_PAGE.RAMD_FAT
LD L,A
LD A,(HL)
OUT (SLOT3),A
EX AF,AF'
LD HL,#C000 ; !!!!!
JR HD_RD_L2
; HL - BUFER, A - PAGE
FN_HDD_WRITE:
AND A
INC B
DEC B
RET Z
CALL HD_WAIT
RET C
CALL HD_PREPARE
RET C
EXX
LD C,SLOT3
IN B,(C)
EXX
OUT (SLOT3),A
EX AF,AF'
LD BC,IDE.Write.Command
LD A,IDE.ATA.WriteSectorsWithRetry
OUT (C),A
HD_WR_L2:
WAIT_HDD
BIT IDE.ControlBit.DataRequest,A
JP Z,HD_RET
LD BC,IDE.Write.Data
LD D,32 ;!HARDCODE § ¢¨á¨â ®â áçñâ稪  DUP ¢ HD_WR_LOOP
HD_WR_LOOP:
DUP 16
OUTI ; ¢á¥£® 16 à § OUTI - ®¯â¨¬ «ì­®.
EDUP
DEC D
JR NZ,HD_WR_LOOP
LD A,H
OR L
JR NZ,HD_WR_L2
LD A,SYS_PAGE
OUT (SLOT3),A
EX AF,AF'
LD HL,SYS_PAGE.RAMD_FAT
LD L,A
LD A,(HL)
OUT (SLOT3),A
EX AF,AF'
LD HL,#C000 ;!!!!!
JR HD_WR_L2
FN_HDD_RECAL:
LD A,IDE.Drive.Master
LD BC,IDE.Write.DeviceHead
OUT (C),A
LD A,IDE.ATA.ExecuteDeviceDiagnostic
CALL HD_CMD_EXE
AND A
BIT IDE.ControlBit.Error,A
RET Z
LD BC,IDE.Read.Error
IN A,(C)
CP 1 ; !!!!! £«ï­ãâì
RET Z
SCF
RET
;????? £«ï­ãâì
; RET C
; LD A,#1F ; RECALIBRATE
; CALL HD_CMD_EXE
; RET
FN_HDD_TEST_IDE:
LD E,#00
LD BC,IDE.Write.DeviceHead
LD A,IDE.Drive.Master
OUT (C),A
CALL TEST_HDD_DRV
JR NZ,NO_HDD1
SET 0,E
NO_HDD1:
LD BC,IDE.Write.DeviceHead
LD A,IDE.Drive.Slave
OUT (C),A
CALL TEST_HDD_DRV
JR NZ,NO_HDD2
SET 1,E
NO_HDD2:
LD A,E
AND A
SCF
RET Z ; HDD absent !
AND A
RET
;-----------------------------------[DIFFERENT]
; <20>¥ ¤®«¦­  ¯®àâ¨âì ॣ¨áâà E!!!
TEST_HDD_DRV:
; EXP_HDD.ASM variant
LD HL,#01FE ; ?????
LD BC,IDE.Write.Counter
OUT (C),L
IF IDE_Optimization
INC C
OUT (C),H ; IDE.Write.Sector
DEC C
INC B
IN A,(C) ; ????? IDE.Write.Counter+#100
CP L
RET NZ
INC C
ELSE
LD BC,IDE.Write.Sector
OUT (C),H
LD BC,IDE.Write.Counter+#100
IN A,(C)
CP L
RET NZ
LD BC,IDE.Write.Sector+#100
ENDIF
IN A,(C) ; ????? IDE.Write.Sector+#100
CP H
RET
/*
TEST_HDD_DRV:
; EXTENDED.ASM variant
LD HL,#00FF ;?????
LD BC,IDE.Write.CylinderLow
OUT (C),L
IF IDE_Optimization
INC C
OUT (C),H ; IDE.Write.CylinderHigh
INC B
DEC C
IN A,(C) ; ????? ’ãâ ॣ¨áâà BC = #0254 - çâ® §  ¯®àâ â ª®© ¨ çâ® ®ââ㤠 ¯à®ç¨â ¥âáï?
CP L
RET NZ
INC C
ELSE
LD BC,IDE.Write.CylinderHigh
OUT (C),H
LD BC,#0254 ;???!!!!
IN A,(C)
CP L
RET NZ
LD BC,#0255 ;???!!!!
ENDIF
IN A,(C) ; ????? ’ãâ ॣ¨áâà BC = #0255 - çâ® §  ¯®àâ â ª®© ¨ çâ® ®ââ㤠 ¯à®ç¨â ¥âáï?
CP H
RET
*/
FN_HDD_INIT:
LD BC,IDE.Write.DeviceHead
LD A,IDE.Drive.Master
OUT (C),A
CALL TEST_HDD_DRV
JR NZ,.ABSENT
;
.L3: WAIT_HDD
LD BC,IDE.Write.Command
LD A,IDE.ATA.IdentifyDevice ;!FIXIT ¯¥à¥¤¥« âì
OUT (C),A
WAIT_HDD
BIT IDE.ControlBit.DataRequest,A
JR NZ,.L2
SCF
RET
.ABSENT:
LD BC,IDE.Write.DeviceHead
LD A,IDE.Drive.Slave
OUT (C),A
CALL TEST_HDD_DRV
JR Z,.L3
SCF
RET
;
.L2: LD BC,IDE.Read.Data
LD HL,SYS_PAGE.HD_IDF_ADR
IN A,(SLOT3)
LD D,A
LD A,SYS_PAGE
OUT (SLOT3),A
INIR
INIR
; B = 0
LD H,B
LD L,B
LD A,(SYS_PAGE.HD_IDF_ADR.sectors) ; ç¨á«® ᥪâ®à®¢
LD C,A
;LD HL,0
;LD B,H
LD A,(SYS_PAGE.HD_IDF_ADR.heads) ; ç¨á«® £®«®¢®ª
.loop: ADD HL,BC
DEC A
JR NZ,.loop
LD (SYS_PAGE.HD_IDF_ADR.sec_cyl),HL
WAIT_HDD
LD BC,IDE.Read.Control
IN A,(C)
AND #10
LD B,A
LD A,(SYS_PAGE.HD_IDF_ADR.heads) ; ç¨á«® £®«®¢®ª
DEC A
AND #0F
OR IDE.Drive.Master
OR B
LD H,A
LD A,(SYS_PAGE.HD_IDF_ADR.LBA_CHS)
;BIT 1,A
AND %0000'0010
JR Z,.NO_LBA
SET 6,H
.NO_LBA:
LD BC,IDE.Write.DeviceHead
OUT (C),H
LD A,(SYS_PAGE.HD_IDF_ADR.sectors) ; ç¨á«® ᥪâ®à®¢
LD BC,IDE.Write.Counter
OUT (C),A
LD A,D
OUT (SLOT3),A
LD A,IDE.ATA.InitializeDeviceParameters ; SET HDD PARAMETERS
;CALL HD_CMD_EXE
;RET
HD_CMD_EXE:
CALL HD_WAIT
RET C
LD BC,IDE.Write.Command
OUT (C),A
HD_WAIT:
PUSH DE
PUSH BC
PUSH AF
LD DE,0
HD_WAIT1:
LD BC,IDE.Read.Status
IN A,(C)
AND IDE.ControlByte.Busy
JR Z,HD_W_EXIT
DEC DE
LD A,D
OR E
JR NZ,HD_WAIT1
POP AF
POP BC
POP DE
SCF
RET
HD_W_EXIT:
POP AF
POP BC
POP DE
AND A
RET
; ;EXTENDED.ASM Version
; HDD_LBA: ;???!!!!
; POP BC
; LD L,E
; LD E,D
; LD D,XL
; XOR A
; LD H,A
; RET
; HD_CALC_SECS:
; LD A,XH
; AND A
; SCF
; RET NZ ; ®è¨¡ª , ᫨誮¬ ¡®«ì让 HDD
; PUSH BC
; LD BC,IDE.Write.DeviceHead
; DEC B
; IN A,(C)
; BIT 6,A
; JR NZ,HDD_LBA
; ; POP BC
;EXP_HDD.ASM Version
HD_CALC_SECS:
PUSH BC
LD BC,IDE.Read.Control
IN A,(C)
AND %0100'0000
POP BC
JR Z,.CHS
; LBA
LD L,E
LD E,D
LD D,XL
LD A,XH
AND #0F ; ®£à ­¨ç¥­¨¥ ­  ~127 £¨£®¢
LD H,A
RET
; CHS
.CHS: LD A,XH
AND A
SCF
RET NZ ; ®è¨¡ª , ᫨誮¬ ¡®«ì让 HDD
; IX,DE -  ¡á®«îâ­ë© ­®¬¥à ᥪâ®à 
PUSH IX
POP HL
;
IN A,(SLOT3)
LD C,A
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,C
LD (SYS_PAGE.COPY_SLOT3),A
; HL,DE - ­®¬¥à ᥪâ®à 
; BC - ç¨á«® ᥪâ®à®¢ ­  樫¨­¤à¥
LD BC,(SYS_PAGE.HD_IDF_ADR.sec_cyl) ; ç¨á«® ᥪâ®à®¢ ­  樫¨­¤à¥
LD A,16 ; HL,DE à §¤¥«¨âì ­  BC
SCF
.DIV_LOOP:
EX DE,HL
ADD HL,HL
EX DE,HL
ADC HL,HL
;
SBC HL,BC ; áà ¢­¨âì HL ¨ BC
JR NC,.NO_ADD ; ¯¥à¥­®á  ­¥ ¡ë«® - +1!
ADD HL,BC
DEC A
JR NZ,.DIV_LOOP
JR .DIV_END
.NO_ADD:
INC DE
DEC A
JR NZ,.DIV_LOOP
.DIV_END:
; DE - १ã«ìâ â, HL - ®áâ â®ª
; DE - 樫¨­¤à
LD A,(SYS_PAGE.HD_IDF_ADR.sectors)
; A - ç¨á«® ᥪâ®à®¢ ­  ¤®à®¦ª¥
; HL - ­®¬¥à ᥪâ®à  ¢ 樫¨­¤à¥
LD C,A
;LD BC,(MS_BPB+S_P_T) ; —ˆ‘‹Ž …ŠŽ<E28099>Ž <20>€ „Ž<E2809E>ކЅ
XOR A
LD B,A
.LOOP: SBC HL,BC
INC A
JR NC,.LOOP
;
DEC A ; A - £®«®¢ª 
ADD HL,BC ; L - ᥪâ®à
INC L
LD H,A ; HL - HEAD,SEC
;
LD A,(SYS_PAGE.COPY_SLOT3)
OUT (SLOT3),A
AND A
RET
; [ ] 07/01/2024 bit0: Primary/Secondary, bit1 - master/slave, bit2..3: ¨á¯®«ì§ãî騩áï à §¤¥« ¢ MBR
; !TODO ᤥ« âì à ¡®âã á ¯¥à¥¬¥­­ë¬¨ ¡¨®á  SYS_PAGE.IDE_0..3
FN_HDD_PART:
DI
PUSH BC
PUSH HL
;
EX AF,AF'
IN A,(SLOT3)
EX AF,AF'
;
LD C,A
AND 1
LD A,IDE.Chanel.Primary
JR Z,.SET_CH
LD A,IDE.Chanel.Secondary
.SET_CH:
OUT (IDE.Chanel.Set),A
;
LD A,C
PUSH AF
AND 2
;
LD A,IDE.Drive.Slave
JR NZ,.SET_Master_Slave
;
LD A,IDE.Drive.Master
.SET_Master_Slave:
LD BC,IDE.Write.DeviceHead
OUT (C),A
CALL TEST_HDD_DRV
JR NZ,.Error
CALL FN_HDD_INIT.L3
JR C,.Error
;
POP BC
LD A,SYS_PAGE
OUT (SLOT3),A
;
LD A,B
LD (SYS_PAGE.CURRENT_HDD),A
;
EX AF,AF'
OUT (SLOT3),A
;
AND A
.exit: POP HL
POP BC
EI
RET
;
.Error: POP AF
SCF
JR .exit
; ENDMODULE
;************************************************
; ?????
; DB 'HDD_DRV_END'
; ‚室:
; C - ª®¬ ­¤ 
; 0 - INIT - ¢å®¤­ëå ¯ à ­¥â => A - ç¨á«® ¯®¤¤¥à¦¨¢ ¥¬ëå ¤¨áª®¢.
; 1 - RESET - ¢ë¡®à ¤¨áª  A - ­®¬¥à ¤¨áª  ®â 0 =>
; 2 - (STATUS) !!!!! TEST?
; 3 - MEDIA CHECK - A - ­®¬¥à ¤¨áª  => A = 0 - old. #FF - new (¢á¥£¤  #FF) !!!!! PREPARE???
; 4 - READ BPB - A - ¤¨áª HL -  ¤à¥á ¢ ⥪ã饩 áâà ­¨æ¥.
; 5 - READ - A - ¤¨áª, IX:DE ᥪâ®à, HL -  ¤à¥á, B - ç¨á«® ᥪâ®à®¢
; 6 - WRITE - '' -
; 7 - PART
; 8 - READ_NEXT
;
; ®è¨¡ª¨ - CF - A - ®è¨¡ª 
;
; 0 - ­¥â ®è¨¡ª¨
; 1 - ­¥¢¥à­ ï ª®¬ ­¤ 
; 2 - ­¥¢¥à­ë© ­®¬¥à ¤¨áª 
; 3 - ­¥¢¥à­ë© ä®à¬ â (­¥ MS-DOS)
; 4 - ­¥â £®â®¢­®áâ¨
; 5 - ®è¨¡ª  ¯®§¨æ¨®­¨à®¢ ­¨ï
; 6 - ᥪâ®à ­¥ ­ ©¤¥­
; 7 - ®è¨¡ª  CRC
; 8 - § é¨â  § ¯¨á¨
; 9 - ®è¨¡ª  ç⥭¨ï
; 10 - ®è¨¡ª  § ¯¨á¨
; 11 - ƒ‹žŠ
;