-bug FDD_RW_SECTOR: размер сектора больше, чем установлено в FDD_INIT_TABLE.FDD_0.BytesPerSector вызовет ошибку

This commit is contained in:
Tolik 2025-04-15 04:33:54 +10:00
parent df27d443e2
commit 55a1020dd6
3 changed files with 143 additions and 320 deletions

@ -1 +1 @@
Subproject commit a9f5915a3275f5ffbafa0994bb97c5846aab826c
Subproject commit bd4546a854905998edab6144547b79aa673404f6

View File

@ -109,7 +109,7 @@ FDD_5x_SET_PAR: ;!TEST FDD 720/1440
ENDIF
;
EX AF,AF'
OUT (SLOT3),A
OUT (SLOT3),A
EX AF,AF'
;
;!TEST FDD 720/1440
@ -127,6 +127,7 @@ FDD_5x_SET_PAR: ;!TEST FDD 720/1440
; A - Disk
;Return:
; A - Flag D7 - "1" - High Density, "0" - Double Density
; B - bit0=1 removable
;[]===========================================================[]
FDD_5x_DETECT: CALL SAVE_INTERRUPTS.switch_off
CALL SET_DOS_ON
@ -147,7 +148,19 @@ FDD_5x_RESET: CALL SAVE_INTERRUPTS.switch_off
CALL SET_DOS_ON
CALL S_FDD
CALL DISK_ID
CALL SAVE_INTERRUPTS.restore
JR C,.int
; [ ] à §¬¥à  ᥪâ®à 
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD H,B
LD L,0
LD (FDD_INIT_TABLE.FDD_0.BytesPerSector),HL
EX AF,AF'
OUT (SLOT3),A
;
.int: CALL SAVE_INTERRUPTS.restore
JR C,.MOTOR_OFF
;
CALL RESWG
@ -240,8 +253,7 @@ FDD_5x_LONG_READ:
PUSH DE
PUSH BC
PUSH HL
;CALL READ_SECTOR
CALL FDD_RW_SECTOR
CALL FDD_RW_SECTOR
JR C,ERRDOS
; à §¬¥à ᥪâ®à 
LD D,YH
@ -252,22 +264,7 @@ FDD_5x_LONG_READ:
ADD HL,DE
;
CALL C,CHANGE_MEM_BLK
; 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
; ; SET 7,H
; ; SET 6,H
; LD A,%1100'0000
; OR H
; LD H,A
;
;
.THISRD: POP DE
LD A,C
INC E
@ -366,205 +363,12 @@ FDD_5x_LONG_WRITE:
LD B,#A0 ;COMMAND WRITE
EXX
JP FDD_5x_LONG_READ.RW_Shared
/*
CALL SAVE_INTERRUPTS.switch_off
CALL .Start
JP SAVE_INTERRUPTS.restore
;
.Start: PUSH IY
PUSH BC
PUSH HL
PUSH IX
;
EX AF,AF'
LD C,A
EX AF,AF'
PUSH BC
CALL SET_DOS_ON
CALL S_FDD
CALL SET_SPEED
CALL NTRACK
POP BC
EX DE,HL
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD IY,(FDD_INIT_TABLE.FDD_0.BytesPerSector)
LD XH,C
LD A,(FDD_INIT_TABLE.FDD_0.SECTORS)
LD C,A
EX AF,AF'
OUT (SLOT3),A
.DSK_LP2: LD A,D
EXX
PUSH BC
CALL SEEK
POP BC
EXX
PUSH DE
PUSH BC
PUSH HL
CALL WR_SEC
JR C,ERRDOS
; à §¬¥à ᥪâ®à 
LD D,YH
LD E,YL
;
POP HL
POP BC
ADD HL,DE
;
CALL C,CHANGE_MEM_BLK
; 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
; ; SET 7,H
; ; SET 6,H
; LD A,%1100'0000
; OR H
; LD H,A
;
.THISWR: POP DE
LD A,C
INC E
CP E
JR NZ,.NINC_T2
LD E,0
INC D
.NINC_T2: DJNZ .DSK_LP2
CALL SET_DOS_OFF
LD A,XH
EX AF,AF'
EX DE,HL
POP IX
POP HL
POP BC
POP IY
LD A,B
LD C,B
INC B
DEC B
LD B,0
JR NZ,.ADW8BIT
INC B
.ADW8BIT: ADD IX,BC
;!TEST
;LD BC,0
;ADC HL,BC
;LD B,A
;XOR A
;RET
;
LD B,A
RET NC
INC HL
XOR A
RET
;
*/
/*
;
;-------------------------------
;READ SECTOR
;-------------------------------
READ_SECTOR: LD D,5 ;RETRY COUNT
.HL_RETRY: ;DI
PUSH HL
PUSH DE
LD A,E
INC A
OUT (FDC_93.Sector),A
.FDREAD: IN A,(SLOT3)
EX AF,AF'
LD A,XH
OUT (SLOT3),A
;
LD B,4 ; áçñâ稪
LD C,FDC_93.Data
LD A,#80 ; COMMAND READ
OUT (FDC_93.Command),A
;
.FDR001: IN A,(FDC_93.DrvCTRL) ;WAIT INTRQ or DRQ
AND %1100'0000 ;b6: DRQ (§ ¯à®á ¤ ­­ëå = 1). b7: INTRQ (¢ë¯®«­ï¥âáï ª®¬ ­¤  = 0).
JR NZ,.read_loop
INC DE
LD A,E
OR D
JR NZ,.FDR001
;
DJNZ .FDR001
SCF
JR .FDR005
;READ BYTE
.read_loop: INI
.wait_data: IN A,(FDC_93.DrvCTRL)
AND %1100'0000 ;b6: DRQ (§ ¯à®á ¤ ­­ëå = 1). b7: INTRQ (¢ë¯®«­ï¥âáï ª®¬ ­¤  = 0).
JR Z,.wait_data
JP P,.read_loop ; JUMP if "¢ë¯®«­ï¥âáï ª®¬ ­¤  = 0"
;
.FDR005: EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
;
POP DE
POP HL
;EI
LD A,BIOS.Error.NotReady
JR C,.ERR_XRD
;
IN A,(FDC_93.Command)
LD C,A
AND #7F
RET Z ; ‚ë室 ¡¥§ ®è¨¡®ª
;
BIT 2,C
JR NZ,.ERDATA
;
LD A,BIOS.Error.Seek
.ERR_XRD: DEC D
JR Z,.RSTOP
;
PUSH DE
PUSH HL
CALL RESWG ; RESET_WG
LD A,XL
CALL SEEK ; !!!!! ¯®á¬®âà¥âì
POP HL
POP DE
JR .HL_RETRY
;
.ERDATA: DEC D ; ¯®â¥àï ¤ ­­ëå
JR NZ,.HL_RETRY
; Error Read
.ERRRD: LD A,BIOS.Error.Read
.RSTOP: EX AF,AF'
LD A,#D0
OUT (FDC_93.Command),A ;STOP OPERATION
EX AF,AF'
BIT 0,C
SCF
RET Z
LD A,BIOS.Error.SectorNotFound
RET
; ; ;
*/
;
;-------------------------------
;WRITE SECTOR
;-------------------------------
FDD_RW_SECTOR: LD D,5 ;RETRY COUNT
.RETRY: DI
.RETRY: ;DI
PUSH HL
PUSH DE
LD A,E
@ -596,9 +400,19 @@ FDD_RW_SECTOR: LD D,5 ;RETRY COUNT
.RW_PROC: EXX
BIT 5,B
EXX
; [ ] 15/04/25 à §¬¥à ᥪâ®à  ¡®«ìè¥, 祬 ãáâ ­®¢«¥­® ¢ FDD_INIT_TABLE.FDD_0.BytesPerSector ¢ë§®¢¥â ®è¨¡ªã
LD D,YH
LD E,YL
INC DE
;
JR NZ,.write_loop
;READ BYTE
.read_loop: INI
.read_loop: DEC DE
LD A,D
OR E
JR Z,.SectorSizeError
;
INI
.wait_data_r: IN A,(FDC_93.DrvCTRL)
AND %1100'0000 ;b6: DRQ (§ ¯à®á ¤ ­­ëå = 1). b7: INTRQ (¢ë¯®«­ï¥âáï ª®¬ ­¤  = 0).
JR Z,.wait_data_r
@ -610,12 +424,7 @@ FDD_RW_SECTOR: LD D,5 ;RETRY COUNT
;
POP DE
POP HL
; ¯à¥à뢠­¨ï
LD A,R
AND %1000'0000
JR Z,.no_EI
EI
.no_EI: ;
;EI
LD A,BIOS.Error.NotReady
JR C,.CMD_ERROR
;
@ -655,6 +464,7 @@ FDD_RW_SECTOR: LD D,5 ;RETRY COUNT
JR Z,.error_exit
;
LD A,BIOS.Error.Write ; Error Write
;
.error_exit: EX AF,AF'
LD A,#D0
OUT (FDC_93.Command),A ;STOP OPERATION
@ -666,12 +476,29 @@ FDD_RW_SECTOR: LD D,5 ;RETRY COUNT
RET
;
;WRITE BYTE
.write_loop: OUTI
.write_loop: DEC DE
LD A,D
OR E
JR Z,.SectorSizeError
;
OUTI ; !FIXIT à §¬¥à ᥪâ®à  ¬®¦¥â ¡ëâì ¯« ¢ î騬 ¨ ¯à¨¡¨âì ¡ãä¥à
.wwait_data: IN A,(FDC_93.DrvCTRL)
AND %1100'0000 ;b6: DRQ (§ ¯à®á ¤ ­­ëå = 1). b7: INTRQ (¢ë¯®«­ï¥âáï ª®¬ ­¤  = 0).
JR Z,.wwait_data
JP P,.write_loop
JP .rw_return
;
.SectorSizeError:
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
POP DE
POP HL
;EI
; A = 0
LD C,A
LD A,BIOS.Error.UnknownDevice
JR .error_exit
@ -757,7 +584,9 @@ FDD.SET720: LD A,FDD_Density.SET_720
OUT (FDD_Density),A
RET
; ¯à¥à뢠­¨ï ¤®«¦­ë ¡ëâì ®âª«î祭ë
; ¢ë室: A - FDD_INIT_TABLE.F144, B - sector size high byte
DISK_ID: EXX
CALL SET_SPEED
IN A,(FDC_93.Track)
@ -770,24 +599,7 @@ DISK_ID: EXX
LD HL,#F000 ; áçñâ稪
.loop_reg_HL: IN A,(FDC_93.DrvCTRL)
AND #C0
JR Z,.ID_LP4
;
.ID_LP2: IN A,(FDC_93.Data)
.ID_LP3: IN A,(FDC_93.DrvCTRL)
AND #C0
JR Z,.ID_LP3
JP P,.ID_LP2
EXX
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(FDD_INIT_TABLE.FDD_0.F144)
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
AND #80
RET
JR NZ,.Read_Index
;
.ID_LP4: DEC HL
LD A,H
@ -799,7 +611,43 @@ DISK_ID: EXX
EXX
SCF
RET
;
;
.Read_Index: ;
; „ ­­ë¥ FDC_93.Data:
; ­®¬¥à 樫¨­¤à  BYTE
; ­®¬¥à £®«®¢ª¨ BYTE
; ­®¬¥à ᥪâ®à  BYTE
; ¤«¨­  ᥪâ®à  BYTE
; ª®­â஫쭠ï á㬬  WORD
LD H,4 ; !HARDCODE áçñâ稪 ¤® ¡ ©â  à §¬¥à  ᥪâ®à 
.ID_LP2: IN A,(FDC_93.Data)
DEC H
JR NZ,.ID_LP3
LD L,A ; [ ] à §¬¥à  ᥪâ®à  (áâ à訩 ¡ ©â)
.ID_LP3: IN A,(FDC_93.DrvCTRL)
AND %1100'0000
JR Z,.ID_LP3
JP P,.ID_LP2
LD A,L
EXX
LD B,A ; [ ] à §¬¥à  ᥪâ®à  (áâ à訩 ¡ ©â)
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
;LD A,L
;LD (FDD_INIT_TABLE.FDD_0.BytesPerSector + 1),A
LD A,(FDD_INIT_TABLE.FDD_0.F144)
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
AND #80
RET
;
SEEK: LD XL,A

View File

@ -803,66 +803,59 @@ RAMD_CLEAR:
; º ** NOT USED TR-DOS VARS ** º\
; ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\
; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
BLK_RD_WR:
AND A
BLK_RD_WR: AND A
SCF
RET Z
;
;
AND A
INC B
DEC B
RET Z
;
; á®å࠭塞 á®áâ®ï­¨¥ ¯à¥à뢠­¨©
; á®å࠭塞 á®áâ®ï­¨¥ ¯à¥à뢠­¨©
LD C,A
LD A,R
PUSH AF
; á®å࠭塞 PORT_Y
; á®å࠭塞 PORT_Y
IN A,(PORT_Y)
PUSH AF
LD A,#C0
OUT (PORT_Y),A
;
;
LD A,C
DI
CALL .start
EX AF,AF'
; ¢®ááâ ­ ¢«¨¢ ¥¬ PORT_Y
; ¢®ááâ ­ ¢«¨¢ ¥¬ PORT_Y
POP AF
OUT (PORT_Y),A
; ¢®ááâ ­ ¢«¨¢ ¥¬ á®áâ®ï­¨¥ ¯à¥à뢠­¨©
; ¢®ááâ ­ ¢«¨¢ ¥¬ á®áâ®ï­¨¥ ¯à¥à뢠­¨©
POP AF
JP PO,.noInterrupts
EI
.noInterrupts:
EX AF,AF'
.noInterrupts: EX AF,AF'
RET
;
; ;
.start: EX AF,AF'
AND A ; 0 - read
AND A ; 0 - read
JR Z,.reset_Z
CP #FF ; write
CP #FF ; write
JR Z,.keep_Z
CP 5 ; old read
;
CP 5 ; old read
JR Z,.reset_Z
CP 6 ; old write
CP 6 ; old write
JR Z,.keep_Z
;
CP #46
JP Z,ROM_DISK
;
EX AF,AF'
SCF
RET
.reset_Z:
INC A ; set Z for WRITE
.keep_Z:
EX AF,AF'
;
;
.reset_Z: INC A ; set Z for WRITE
.keep_Z: EX AF,AF'
;
PUSH HL
PUSH BC
LD C,SLOT1
@ -871,89 +864,73 @@ BLK_RD_WR:
LD A,SYS_PAGE
OUT (SLOT1),A
LD A,H
;
LD H,high +(SYS_PAGE.RAM_TABLE-#4000-#4000)
LD L,A
INC D
.RAMD_LOOP_D:
DEC D
.RAMD_LOOP_D: DEC D
JR Z,.NOT_FOUR_BLK
LD L,(HL)
LD L,(HL)
LD L,(HL)
LD L,(HL)
JP .RAMD_LOOP_D
.NOT_FOUR_BLK:
LD A,E
;
.NOT_FOUR_BLK: LD A,E
.loop: SUB #40
JR C,.NOT_ONE_BLK
LD L,(HL)
JP .loop
.NOT_ONE_BLK:
AND #3F
;
.NOT_ONE_BLK: AND #3F
LD D,A ; DE - ADRESS in RAM-Disk
LD E,0
LD A,L ; L - ⥪ã騩 ¡ ­ª RAM-Disk
OUT (C),B ; ¢®ááâ ­®¢¨âì áâà ­¨æã
OUT (C),B ; ¢®ááâ ­®¢¨âì áâà ­¨æã
POP BC ; ¤«¨­  ¤ ­­ëå
POP HL ;  ¤à¥á ¡ãä¥à 
BIT 7,H
JR NZ,.BLK_PAGE1
;
LD C,SLOT3
IN C,(C)
OUT (SLOT3),A
SET 7,D
SET 6,D
JP .BLK_CONT1
.BLK_PAGE1:
LD C,SLOT1
;
.BLK_PAGE1: LD C,SLOT1
IN C,(C)
OUT (SLOT1),A
RES 7,D
SET 6,D
.BLK_CONT1: ; DE - RamDisk, HL - data
EX AF,AF'
; DE - RamDisk, HL - data
.BLK_CONT1: EX AF,AF'
JR Z,.NO_EX_RW1 ; WRITE
EX DE,HL ; for READ
.NO_EX_RW1:
EX AF,AF'
EX DE,HL ; for READ
.NO_EX_RW1: EX AF,AF'
LD A,16
.BLK_LL1:
DUP 16
LDI
EDUP
;
.BLK_LL1: DUP 16
LDI
EDUP
DEC A
JR NZ,.BLK_LL1
;
EX AF,AF'
JR Z,.NO_EX_RW2 ; WRITE
EX DE,HL ; for READ
.NO_EX_RW2:
EX AF,AF' ; DEC C ¯à®ªàã⨫áï 256 à § ¨ ¢¥à­ã«áï
; A = 0
;INC B ; B 㦥 㬥­ì訫áï ­  1,
;DEC B
EX DE,HL ; for READ
.NO_EX_RW2: EX AF,AF' ; DEC C ¯à®ªàã⨫áï 256 à § ¨ ¢¥à­ã«áï
; A = 0
CP B
JP Z,.BLK_EXIT_1
;
BIT 6,D
JP NZ,.BLK_CONT1
;
BIT 7,D
JR Z,.BLK_PAGE3_X
;
IN A,(SLOT1)
LD E,A
LD D,high +(SYS_PAGE.RAM_TABLE-#4000-#4000)
@ -963,9 +940,8 @@ BLK_RD_WR:
OUT (SLOT1),A
LD DE,#4000
JP .BLK_CONT1
.BLK_PAGE3_X:
IN A,(SLOT3)
;
.BLK_PAGE3_X: IN A,(SLOT3)
LD E,A
LD D,high SYS_PAGE.RAM_TABLE
LD A,SYS_PAGE
@ -973,10 +949,10 @@ BLK_RD_WR:
LD A,(DE)
OUT (SLOT3),A
LD DE,#C000
;
BIT 7,H
JP Z,.BLK_CONT1
;
LD E,A
LD A,C
OUT (SLOT3),A
@ -986,17 +962,16 @@ BLK_RD_WR:
OUT (SLOT1),A
LD DE,#4000
JP .BLK_CONT1
.BLK_EXIT_1:
LD A,D
;
.BLK_EXIT_1: LD A,D
DEC A
RLCA
LD A,C
JR C,.BLK_EXIT_2
OUT (SLOT1),A
RET
.BLK_EXIT_2:
OUT (SLOT3),A
;
.BLK_EXIT_2: OUT (SLOT3),A
AND A
RET
;----------------------------------------------------------------------;