-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

@ -127,6 +127,7 @@ FDD_5x_SET_PAR: ;!TEST FDD 720/1440
; A - Disk ; A - Disk
;Return: ;Return:
; A - Flag D7 - "1" - High Density, "0" - Double Density ; A - Flag D7 - "1" - High Density, "0" - Double Density
; B - bit0=1 removable
;[]===========================================================[] ;[]===========================================================[]
FDD_5x_DETECT: CALL SAVE_INTERRUPTS.switch_off FDD_5x_DETECT: CALL SAVE_INTERRUPTS.switch_off
CALL SET_DOS_ON CALL SET_DOS_ON
@ -147,7 +148,19 @@ FDD_5x_RESET: CALL SAVE_INTERRUPTS.switch_off
CALL SET_DOS_ON CALL SET_DOS_ON
CALL S_FDD CALL S_FDD
CALL DISK_ID 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 JR C,.MOTOR_OFF
; ;
CALL RESWG CALL RESWG
@ -240,7 +253,6 @@ FDD_5x_LONG_READ:
PUSH DE PUSH DE
PUSH BC PUSH BC
PUSH HL PUSH HL
;CALL READ_SECTOR
CALL FDD_RW_SECTOR CALL FDD_RW_SECTOR
JR C,ERRDOS JR C,ERRDOS
; à §¬¥à ᥪâ®à  ; à §¬¥à ᥪâ®à 
@ -252,21 +264,6 @@ FDD_5x_LONG_READ:
ADD HL,DE ADD HL,DE
; ;
CALL C,CHANGE_MEM_BLK 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 .THISRD: POP DE
LD A,C LD A,C
@ -366,205 +363,12 @@ FDD_5x_LONG_WRITE:
LD B,#A0 ;COMMAND WRITE LD B,#A0 ;COMMAND WRITE
EXX EXX
JP FDD_5x_LONG_READ.RW_Shared 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 ;WRITE SECTOR
;------------------------------- ;-------------------------------
FDD_RW_SECTOR: LD D,5 ;RETRY COUNT FDD_RW_SECTOR: LD D,5 ;RETRY COUNT
.RETRY: DI .RETRY: ;DI
PUSH HL PUSH HL
PUSH DE PUSH DE
LD A,E LD A,E
@ -596,9 +400,19 @@ FDD_RW_SECTOR: LD D,5 ;RETRY COUNT
.RW_PROC: EXX .RW_PROC: EXX
BIT 5,B BIT 5,B
EXX EXX
; [ ] 15/04/25 à §¬¥à ᥪâ®à  ¡®«ìè¥, 祬 ãáâ ­®¢«¥­® ¢ FDD_INIT_TABLE.FDD_0.BytesPerSector ¢ë§®¢¥â ®è¨¡ªã
LD D,YH
LD E,YL
INC DE
;
JR NZ,.write_loop JR NZ,.write_loop
;READ BYTE ;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) .wait_data_r: IN A,(FDC_93.DrvCTRL)
AND %1100'0000 ;b6: DRQ (§ ¯à®á ¤ ­­ëå = 1). b7: INTRQ (¢ë¯®«­ï¥âáï ª®¬ ­¤  = 0). AND %1100'0000 ;b6: DRQ (§ ¯à®á ¤ ­­ëå = 1). b7: INTRQ (¢ë¯®«­ï¥âáï ª®¬ ­¤  = 0).
JR Z,.wait_data_r JR Z,.wait_data_r
@ -610,12 +424,7 @@ FDD_RW_SECTOR: LD D,5 ;RETRY COUNT
; ;
POP DE POP DE
POP HL POP HL
; ¯à¥à뢠­¨ï ;EI
LD A,R
AND %1000'0000
JR Z,.no_EI
EI
.no_EI: ;
LD A,BIOS.Error.NotReady LD A,BIOS.Error.NotReady
JR C,.CMD_ERROR JR C,.CMD_ERROR
; ;
@ -655,6 +464,7 @@ FDD_RW_SECTOR: LD D,5 ;RETRY COUNT
JR Z,.error_exit JR Z,.error_exit
; ;
LD A,BIOS.Error.Write ; Error Write LD A,BIOS.Error.Write ; Error Write
;
.error_exit: EX AF,AF' .error_exit: EX AF,AF'
LD A,#D0 LD A,#D0
OUT (FDC_93.Command),A ;STOP OPERATION OUT (FDC_93.Command),A ;STOP OPERATION
@ -666,12 +476,29 @@ FDD_RW_SECTOR: LD D,5 ;RETRY COUNT
RET RET
; ;
;WRITE BYTE ;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) .wwait_data: IN A,(FDC_93.DrvCTRL)
AND %1100'0000 ;b6: DRQ (§ ¯à®á ¤ ­­ëå = 1). b7: INTRQ (¢ë¯®«­ï¥âáï ª®¬ ­¤  = 0). AND %1100'0000 ;b6: DRQ (§ ¯à®á ¤ ­­ëå = 1). b7: INTRQ (¢ë¯®«­ï¥âáï ª®¬ ­¤  = 0).
JR Z,.wwait_data JR Z,.wwait_data
JP P,.write_loop JP P,.write_loop
JP .rw_return 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 OUT (FDD_Density),A
RET RET
; ¯à¥à뢠­¨ï ¤®«¦­ë ¡ëâì ®âª«î祭ë ; ¯à¥à뢠­¨ï ¤®«¦­ë ¡ëâì ®âª«î祭ë
; ¢ë室: A - FDD_INIT_TABLE.F144, B - sector size high byte
DISK_ID: EXX DISK_ID: EXX
CALL SET_SPEED CALL SET_SPEED
IN A,(FDC_93.Track) IN A,(FDC_93.Track)
@ -770,24 +599,7 @@ DISK_ID: EXX
LD HL,#F000 ; áçñâ稪 LD HL,#F000 ; áçñâ稪
.loop_reg_HL: IN A,(FDC_93.DrvCTRL) .loop_reg_HL: IN A,(FDC_93.DrvCTRL)
AND #C0 AND #C0
JR Z,.ID_LP4 JR NZ,.Read_Index
;
.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
; ;
.ID_LP4: DEC HL .ID_LP4: DEC HL
LD A,H LD A,H
@ -800,6 +612,42 @@ DISK_ID: EXX
SCF SCF
RET 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 SEEK: LD XL,A

View File

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