Sprinter-Core/src/bios/exp/FUNC_4x.ASM
Anatoliy Belyanskiy 0271ac3713 Creation
2023-06-12 05:56:21 +10:00

707 lines
11 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
.loop: LD BC,IDE.Read.Status
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.DriveCtrl
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 ; ????? HEADS?! IDE.Write.DriveCtrl
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,#20
; OUT (C),A
AND A
RET
FN_HDD_READ_BPB:
CALL HD_WAIT
RET C
CALL HD_BPB_PREP
RET C
JR HD_RD_L1
; 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
RET C
CALL 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,#20
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
JP NZ,.loop_read1
.loop_read2:
DUP 16
INI ; ¢á¥£® 16 à § INI - ®¯â¨¬ «ì­®.
EDUP
JP 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,#30
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
HD_WR_LOOP:
DUP 16
OUTI ; ¢á¥£® 16 à § OUTI - ®¯â¨¬ «ì­®.
EDUP
DEC D
JP 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,#A0
LD BC,IDE.Write.DriveCtrl
OUT (C),A
LD A,#90 ; DIAGNOSTICS
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.DriveCtrl
LD A,#A0 ; !!!!! £«ï­ãâì
OUT (C),A
CALL TEST_HDD_DRV
JR NZ,NO_HDD1
SET 0,E
NO_HDD1:
LD BC,IDE.Write.DriveCtrl
LD A,#B0 ; !!!!! £«ï­ãâì
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.DriveCtrl
LD A,#A0
OUT (C),A
CALL TEST_HDD_DRV
JR NZ,HD_ABSENT
HD_C0_L3:
WAIT_HDD
LD BC,IDE.Write.Command
LD A,#EC ; !HARDCODE
OUT (C),A
WAIT_HDD
BIT IDE.ControlBit.DataRequest,A
JR NZ,HD_C0_L2
SCF
RET
HD_ABSENT:
LD BC,IDE.Write.DriveCtrl
LD A,#B0 ; !HARDCODE
OUT (C),A
CALL TEST_HDD_DRV
JR Z,HD_C0_L3
SCF
RET
HD_C0_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
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 #A0
OR B
LD H,A
LD A,(SYS_PAGE.HD_IDF_ADR+99) ; ????? LBA?
BIT 1,A
JR Z,HD_C0_NO_LBA
SET 6,H
HD_C0_NO_LBA:
LD BC,IDE.Write.DriveCtrl
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,#91 ; 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)
BIT IDE.ControlBit.Busy,A
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.DriveCtrl
DEC B
IN A,(C)
BIT 6,A
JR NZ,HDD_LBA
; POP BC ;!!!!! ¯®á¬®âà¥âì
*/
;EXP_HDD.ASM Version
HDD_LBA:
POP BC
LD L,E
LD E,D
LD D,XL
LD A,XH
AND #0F
LD H,A
RET
HD_CALC_SECS:
PUSH BC
LD BC,IDE.Read.Control
IN A,(C)
BIT 6,A
JR NZ,HDD_LBA
POP BC ; á­¨¬ ¥¬ §­ ç¥­¨¥ ¤«ï ª®à४⭮£® ret
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+12) ; !HARDCODE .sectors
; A - ç¨á«® ᥪâ®à®¢ ­  ¤®à®¦ª¥
; HL - ­®¬¥à ᥪâ®à  ¢ 樫¨­¤à¥
LD B,0
LD C,A
; LD BC,(MS_BPB+S_P_T) ; —ˆ‘‹Ž …ŠŽ<E28099>Ž <20>€ „Ž<E2809E>ކЅ
XOR A
HD_CALC_LOOP2:
SBC HL,BC
INC A
JR NC,HD_CALC_LOOP2
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
FN_HDD_PART:
BIT 0,A
LD A,#21 ; !HARDCODE
JR Z,.SET_CH
LD A,#01 ; !HARDCODE
.SET_CH:
OUT (IDE.Chanel.Choose),A
RET
; 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 - ƒ‹žŠ
;