+ READ_PORTS, * FN_HDD_PART и FN_HDD_INIT переделаны

This commit is contained in:
Anatoliy Belyanskiy 2024-01-27 04:11:34 +10:00
parent 84e81ef7df
commit 832cbf9460
7 changed files with 320 additions and 180 deletions

@ -1 +1 @@
Subproject commit e7e58e7b816a25137a0a253321164e863bbe782e
Subproject commit 5cb5d02cf145ff2d6d14fca5a5f9a5fb2ec6a673

Binary file not shown.

View File

@ -235,8 +235,8 @@ TAB_FNS:
DB low CMOS_RD ; #F6
DB low CMOS_WR ; #F7
DB low SET_PORTS ; #F8
DB low READ_PORTS ; #F9 !TODO
DB low WRITE_PORTS ; #FA !TODO
DB low READ_PORTS ; #F9 [x] 26/01/2024
DB low FN_RESERVED ; #FA [x] 26/01/2024 ­¥ à ¡®â «  ¨ ­¥ ­ã¦­ , ¤ã¡«¨àã¥â SET_PORTS
DB low GOTO_SPEC ; #FB Goto Spectrum!
DB low FN_RESERVED ; #FC
DB low REINIT ; #FD
@ -428,7 +428,7 @@ TAB_FNS:
DB high CMOS_WR
DB high SET_PORTS
DB high READ_PORTS
DB high WRITE_PORTS
DB high FN_RESERVED
DB high GOTO_SPEC
DB high FN_RESERVED
DB high REINIT

View File

@ -582,72 +582,94 @@ DCP_CONFIG:
;-----------------------------------------------------------------------;
;
;----------------------------------------------------------------------;
;[x] 26/01/2024
READ_PORTS:
CALL SET_PORTS.Prepare
LD BC,0
IN B,(C)
JR SET_PORTS.End
;[x] 26/01/2024
; WRITE_PORTS:
; SCF
; RET
;----------------------------------------------------------------------;
;
;-----------------------------------------------------------------------;
;[x] ’¥¯¥àì íâ® ­¥ ­ã¦­®: CALL from 3D13h! Žáâ®à®¦­¥¥ á ¯à¥à뢠­¨ï¬¨, «ãçè¥ £ á¨âì, ç⮡ ­¥ ᡨâì ᨣ­ « DOS_ON
; in: A - ¢­ãâ७­¨© ¯®àâ, B - §­ ç¥­¨¥ ¤«ï § ¯¨á¨ ¢® ¢­ãâ७­¨© ¯®àâ
; out: B - áâ à®¥ §­ ç¥­¨¥ ¢­ãâ७­¥£® ¯®àâ ; <20>¥à¥¤ ¢ë室®¬ ¢®ááâ ­ ¢«¨¢ ¥âáï ª®­ä  ¯à®¯¨á ­­ ï ¢ CONFIG_DE.
SET_PORTS:
EX AF,AF'
;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23
AND A
LD A,R
PUSH AF
DI
CALL DOS_ON
;
LD A,CNF_PORT.CNF_0 + ROM.BIOS
OUT (SYS_PORT.ROM),A
;
LD C,SLOT2 ; ¯®«ãç¨âì áâà ­¨æã
IN D,(C)
;
LD A,DCP_PAGE ; ãáâ ­®¢¨âì ­®¢ãî
OUT (C),A
;
LD A,(#8000) ; á®åà ­¨âì â® çâ® ¡ë«®
LD L,A
LD A,(#8200)
LD H,A
EX AF,AF' ; áâà ­¨æ 
CALL .Prepare
;
LD (#8000),A ; ãáâ ­®¢¨âì ¢­ãâ७­¨© ¯®àâ
LD (#8200),A
EX AF,AF'
LD A,B
LD BC,0
EX AF,AF'
;
EX AF,AF'
LD A,B
LD BC,0
EX AF,AF'
; —⥭¨¥ ¯®àâ 
IN A,(C)
; ‡ ¯¨áì ¯®àâ 
EX AF,AF'
OUT (C),A ; ãáâ ­®¢¨âì ­®¢®¥ §­ ç¥­¨¥ ¯®àâ 
EX AF,AF'
;
IN A,(C)
LD B,A ; ¯à®è«®¥ á®áâ®ï­¨¥ ¯®àâ 
;
EX AF,AF'
OUT (C),A ; ãáâ ­®¢¨âì ­®¢®¥ §­ ç¥­¨¥ ¯®àâ 
EX AF,AF'
.End: LD A,DCP_PAGE ; ãáâ ­®¢¨âì DCP
LD C,SLOT2
OUT (C),A
LD A,L
LD (#8000),A ; ¢¥à­ãâì ¯®àâ
LD A,H
LD (#8200),A ; ¢¥à­ãâì ¯®àâ
;
LD B,A
LD A,L
LD (#8000),A ; ¢¥à­ãâì ¯®àâ
LD A,H
LD (#8200),A ; ¢¥à­ãâì ¯®àâ
LD C,SLOT2
LD A,SYS_PAGE
OUT (C),A
LD A,(SYS_PAGE.CONFIG_DE-#4000)
OUT (C),D ; ¢¥à­ãâì áâà ­¨æã
OUT (SYS_PORT.ROM),A
LD A,SYS_PAGE
OUT (C),A
LD A,(SYS_PAGE.CONFIG_DE-#4000)
OUT (C),D ; ¢¥à­ãâì áâà ­¨æã
OUT (SYS_PORT.ROM),A
;
CALL DOS_OFF
;
;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23
POP AF
RET PO
BIT 2,E
RET Z
EI
RET
;
;AND A
;RET
;
.Prepare:
EX AF,AF'
;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23
AND A
LD A,R
PUSH AF
POP DE
DI
CALL DOS_ON
;
LD A,CNF_PORT.CNF_0 + ROM.BIOS
OUT (SYS_PORT.ROM),A
;
LD C,SLOT2 ; ¯®«ãç¨âì áâà ­¨æã
IN D,(C)
;
LD A,DCP_PAGE ; ãáâ ­®¢¨âì ­®¢ãî
OUT (C),A
;
LD A,(#8000) ; á®åà ­¨âì â® çâ® ¡ë«®
LD L,A
LD A,(#8200)
LD H,A
EX AF,AF' ; áâà ­¨æ 
;
LD (#8000),A ; ãáâ ­®¢¨âì ¢­ãâ७­¨© ¯®àâ
LD (#8200),A
OUT (C),D ; ¢¥à­ãâì áâà ­¨æã
RET
;-----------------------------------------------------------------------;
;

View File

@ -596,15 +596,15 @@ SET_DOS_OFF:
;
FDD.SET720:
LD A,#01 ;!HARDCODE
OUT (#BD),A ;!HARDCODE
LD A,FDD_Density.SET_720
OUT (FDD_Density),A
RET
;
;
FDD.SET1440:
LD A,#21 ;!HARDCODE
OUT (#BD),A ;!HARDCODE
LD A,FDD_Density.SET_1440
OUT (FDD_Density),A
RET
;

View File

@ -7,32 +7,89 @@
ENDM
;______________________________________________________________________:
;
;--
; GET_BPB_OFFSET:
; ;LD A,SYS_PAGE
; ;LD HL,MS_BPB
; PUSH AF
; PUSH HL
; LD B,1
; LD IX,#0000
; LD DE,#0000
; CALL FN_HDD_READ
; POP IX
; POP AF
; PUSH AF
; PUSH IX
; LD DE,#01BE ;!HARDCODE ᬥ饭¨¥ ®â ­ ç «  ᥪâ®à  ¤«ï â ¡«¨æë à §¤¥«®¢
; ADD IX,DE
; ;
; EX AF,AF'
; IN A,(SLOT3)
; EX AF,AF'
; OUT (SLOT3),A
; ;
; LD E,(IX+8) ; ¯¥à¢ë© ᥪâ®à (LBA) ­ ç «  à §¤¥«  (DWORD)
; LD D,(IX+9)
; LD L,(IX+10)
; LD H,(IX+11)
; ;
; EX AF,AF'
; OUT (SLOT3),A
; EX AF,AF'
; ;
; PUSH HL
; POP IX
; POP HL
; POP AF
; RET
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
; [ ] 27/01/2023
;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
LD B,A
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(SYS_PAGE.CURRENT_HDD)
INC A
JR NZ,.configured
;
LD A,(SYS_PAGE.HD_IDF_ADR.sectors)
LD E,A
LD D,#00
LD IX,#0000
JR .done
;
.configured:
LD IX,(SYS_PAGE.HDD_PARTITION_OFFSET+2)
LD DE,(SYS_PAGE.HDD_PARTITION_OFFSET)
.done: EX AF,AF'
OUT (SLOT3),A
LD A,B
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
JR C,.error
;
LD A,B
LD BC,IDE.Write.Counter ; “áâ ­®¢¨âì ç¨á«® ᥪâ®à®¢ ¤«ï § ¯¨á¨
OUT (C),A
@ -57,13 +114,16 @@ HD_PREPARE:
AND #F0 ; !!!!! ¯®á¬®âà¥âì
OR H
INC B ; IDE.Write.DeviceHead
OUT (C),A
POP HL ; BUFER & PAGE
POP AF
AND A
RET
;
.error: POP HL
POP AF
SCF
RET
NEXT_ADD_SEC:
@ -222,7 +282,8 @@ HD_RD_L1:
HD_RD_L2:
WAIT_HDD
BIT IDE.ControlBit.DataRequest,A
;BIT IDE.ControlBit.DataRequest,A
AND IDE.ControlByte.DataRequest
JR NZ,HD_READ_CONT
ZERO_PORTY
@ -404,45 +465,114 @@ TEST_HDD_DRV:
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
; 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
; 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
; 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
*/
; IN A,(C) ; ????? ’ãâ ॣ¨áâà BC = #0255 - çâ® §  ¯®àâ â ª®© ¨ çâ® ®ââ㤠 ¯à®ç¨â ¥âáï?
; CP H
; RET
FN_HDD_INIT:
LD BC,IDE.Write.DeviceHead
; [ ] 07/01/2024 bit1: Primary/Secondary, bit0 - 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 2
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 1
;
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,.ABSENT
JR NZ,.Error
;
CALL FN_HDD_INIT.L3
JR C,.Error
;
POP BC
LD A,SYS_PAGE
OUT (SLOT3),A
;e tu
LD A,B
LD (SYS_PAGE.CURRENT_HDD),A
;
EX AF,AF'
OUT (SLOT3),A
;
CALL SET_BPB_OFFSET
;AND A
.exit: POP HL
POP BC
EI
RET
;
.Error: POP AF
SCF
JR .exit
; [ ] 27/01/2024  ¤ ¯â¨à®¢ ­  ¤«ï ª®à४⭮© à ¡®âë á FN_HDD_PART
FN_HDD_INIT:
LD C,SLOT3
IN B,(C)
LD A,SYS_PAGE
OUT (SLOT3),A
;
LD A,(SYS_PAGE.CURRENT_HDD)
OUT (C),B
INC A
JR Z,FN_HDD_PART
CALL TEST_HDD_DRV
SCF
RET NZ
; 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
@ -450,17 +580,20 @@ FN_HDD_INIT:
OUT (C),A
WAIT_HDD
BIT IDE.ControlBit.DataRequest,A
JR NZ,.L2
;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
RET Z
;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
@ -503,13 +636,18 @@ FN_HDD_INIT:
LD BC,IDE.Write.DeviceHead
OUT (C),H
LD A,(SYS_PAGE.HD_IDF_ADR.sectors) ; ç¨á«® ᥪâ®à®¢
.HDD_CONFIGURED:
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
CALL HD_CMD_EXE
;
;
;
;
RET
HD_CMD_EXE:
CALL HD_WAIT
RET C
@ -642,60 +780,44 @@ HD_CALC_SECS:
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
; [ ] 27/01/2024 ⥯¥àì ०¨¬ ᯥªâà㬠 à ¡®â ¥â á «î¡ë¬ à §¤¥«®¬ HDD
SET_BPB_OFFSET:
LD A,SYS_PAGE
OUT (SLOT3),A
;
LD A,B
LD (SYS_PAGE.CURRENT_HDD),A
LD HL,SYS_PAGE.MS_BPB
LD IX,#0000
LD DE,#0000
LD B,1
CALL FN_HDD_READ
;
EX AF,AF'
IN A,(SLOT3)
EX AF,AF'
OUT (SLOT3),A
;
AND A
.exit: POP HL
POP BC
EI
RET
LD A,(SYS_PAGE.CURRENT_HDD)
RRCA
RRCA
AND 3
INC A
LD B,A
;
.Error: POP AF
SCF
JR .exit
LD HL,SYS_PAGE.MS_BPB-16 + #01BE ;!HARDCODE ᬥ饭¨¥ ®â ­ ç «  ᥪâ®à  ¤«ï â ¡«¨æë à §¤¥«®¢ c ¯¥à¢ë¬ ᥪâ®à®¬ LBA ¤«ï ¯¥à¢®£® à §¤¥« 
LD DE,16 ;!HARDCODE à §¬¥à ¯®«ï ®¯¨á â¥«ï à §¤¥« 
.loop: ADD HL,DE
DJNZ .loop
;
LD A,8
ADD L
LD L,A
LD DE,SYS_PAGE.HDD_PARTITION_OFFSET
LD C,4
LDIR
;
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
RET
; ENDMODULE
;************************************************

View File

@ -271,14 +271,14 @@ FN_TURBO:
;!FIXIT ¬¥­ï¥¬ ¯«®â­®áâì - ¬¥­ï¥¬ ¢ á¨á⥬­®© áâà ­¨æ¥ ¨­äã ®¡ í⮬
.SET_FDD_720:
LD A,1
OUT (#BD),A ; !HARDCODE
LD A,FDD_Density.SET_720
OUT (FDD_Density),A
AND A
RET
;!FIXIT ¬¥­ï¥¬ ¯«®â­®áâì - ¬¥­ï¥¬ ¢ á¨á⥬­®© áâà ­¨æ¥ ¨­äã ®¡ í⮬
.SET_FDD_1440:
LD A,#21
OUT (#BD),A ; !HARDCODE
LD A,FDD_Density.SET_1440
OUT (FDD_Density),A
AND A
RET
@ -308,18 +308,14 @@ FN_TURBO:
RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
READ_PORTS: ; !TODO ᤥ« âì
WRITE_PORTS: ; !TODO ᤥ« âì
SCF
RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
;!TODO
;FN_GET_SYS_VAR:
; ‚室: HL - ­®¬¥à á¨á⥬­®© ¯¥à¥¬¥­­®©
; ‚ë室: HL - §­ ç¥­¨¥ á¨á⥬­®© ¯¥à¥¬¥­­®©
; RET
;----------------------------------------------------------------------;
;!TODO ᪮¬¯®­®¢ âì