bugfix with interrupts in 5x for FDD

This commit is contained in:
Anatoliy Belyanskiy 2024-06-10 00:33:25 +10:00
parent 918c764244
commit 7c53c2ec02
5 changed files with 340 additions and 303 deletions

View File

@ -1105,7 +1105,7 @@ PORTS_INIT:
INCLUDE 'FUNC_PIC.ASM'
INCLUDE 'FUNC_RAM_ROM_DRV.ASM'
INCLUDE 'FUNC_SYS.ASM'
INCLUDE 'FUNK_FOR_TRDOS.ASM'
INCLUDE 'FUNC_FOR_TRDOS.ASM'
INCLUDE 'FUNC_5x.asm'
INCLUDE 'FUNC_LOW_PRINT.ASM'
;-----------------------------------------------------------------------;
@ -1584,11 +1584,13 @@ DOS_OFF:
DI
PUSH AF
PUSH BC
;
LD BC,(#5BFF) ; !HARDCODE
LD A,#C9 ; Opcode RET
LD (#5BFF),A ; !HARDCODE
CALL #5BFF ; !HARDCODE
LD (#5BFF),BC ; !HARDCODE
;
POP BC
POP AF
JP PO,.no_EI

View File

@ -72,52 +72,52 @@ FDD_5x_GETMED:
; D7 - "1" - High Density, "0" - Double Density
;Return: None
;[]===========================================================[]
FDD_5x_SETMED:
;!TEST FDD 720/1440
IF FDD_NormalCount
LD IY,FDD_INI_TABLE.FDD_0
DEC A
JR C,.setParams
LD IY,FDD_INI_TABLE.FDD_1
ENDIF
.setParams:
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
;!TEST FDD 720/1440
IF FDD_NormalCount
LD (IY+1),L ;SECTORS
LD (IY+2),H ;HEADS
LD (IY+3),E ;CYLINDL
LD (IY+4),D ;CYLINDH
LD A,XL
LD (IY+5),A ;B_P_S low
LD A,XH
LD (IY+6),A ;B_P_S High
LD (IY+0),B ;F144/720
LD A,B
ELSE
LD A,B
LD (FDD_INI_TABLE.FDD_0.SECTORS),HL
LD (FDD_INI_TABLE.FDD_0.CYLINDL),DE
LD (FDD_INI_TABLE.FDD_0.BytesPerSector),IX
LD (FDD_INI_TABLE.FDD_0.F144),A
ENDIF
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
;!TEST FDD 720/1440
IF FDD_NormalCount
AND 1
JP Z,FN_TURBO.SET_FDD_720
JP FN_TURBO..SET_FDD_1440
ELSE
AND A
RET
ENDIF
FDD_5x_SETMED: ;!TEST FDD 720/1440
IF FDD_NormalCount
LD IY,FDD_INI_TABLE.FDD_0
DEC A
JR C,.setParams
LD IY,FDD_INI_TABLE.FDD_1
ENDIF
;
.setParams: IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
;
;!TEST FDD 720/1440
IF FDD_NormalCount
LD (IY+1),L ;SECTORS
LD (IY+2),H ;HEADS
LD (IY+3),E ;CYLINDL
LD (IY+4),D ;CYLINDH
LD A,XL
LD (IY+5),A ;B_P_S low
LD A,XH
LD (IY+6),A ;B_P_S High
LD (IY+0),B ;F144/720
LD A,B
ELSE
LD A,B
LD (FDD_INI_TABLE.FDD_0.SECTORS),HL
LD (FDD_INI_TABLE.FDD_0.CYLINDL),DE
LD (FDD_INI_TABLE.FDD_0.BytesPerSector),IX
LD (FDD_INI_TABLE.FDD_0.F144),A
ENDIF
;
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
;
;!TEST FDD 720/1440
IF FDD_NormalCount
AND 1
JP Z,FN_TURBO.SET_FDD_720
JP FN_TURBO..SET_FDD_1440
ELSE
AND A
RET
ENDIF
;[]===========================================================[]
;Function: Detect Disk Density
@ -125,34 +125,49 @@ FDD_5x_SETMED:
;Return:
; A - Flag D7 - "1" - High Density, "0" - Double Density
;[]===========================================================[]
FDD_5x_DETECT:
CALL SET_DOS_ON
CALL DISK_ID
PUSH AF
CALL SET_DOS_OFF
POP AF
RET
FDD_5x_DETECT: CALL SAVE_INTERRUPTS.switch_off
CALL SET_DOS_ON
CALL DISK_ID
PUSH AF
CALL SET_DOS_OFF
POP AF
JP SAVE_INTERRUPTS.restore
;RET
;[]===========================================================[]
;Function: Reset Disk
; A - Disk
;Return: None
;[]===========================================================[]
FDD_5x_RESET:
CALL SET_DOS_ON
CALL S_FDD
CALL DISK_ID
LD A,4 ;NOT READY /NO DISK/
JP C,MOTOR_OFF
CALL RESWG
XOR A
OUT (FDC_93.Track),A
IN A,(FDC_93.Command)
LD C,A
CALL SET_DOS_OFF
LD A,C
AND A
RET
FDD_5x_RESET: CALL SAVE_INTERRUPTS.switch_off
CALL SET_DOS_ON
CALL S_FDD
CALL DISK_ID
JR C,.MOTOR_OFF
;
CALL RESWG
XOR A
OUT (FDC_93.Track),A
IN A,(FDC_93.Command)
LD C,A
CALL SET_DOS_OFF
LD A,C
AND A
JP SAVE_INTERRUPTS.restore
;RET
.MOTOR_OFF: ;PUSH AF
LD A,#D0
OUT (FDC_93.Command),A ;STOP OPERATION
LD A,#00
OUT (FDC_93.DrvCTRL),A
LD A,#3C
OUT (FDC_93.DrvCTRL),A
CALL SET_DOS_OFF
; CF=1
LD A,4 ;NOT READY /NO DISK/
;POP AF
JP SAVE_INTERRUPTS.restore
;[]===========================================================[]
;Function: Read Sectors
; A - Disk
@ -179,126 +194,124 @@ FDD_5x_READ:
; DE - Address + (Sector counter * Size sector)
;[]===========================================================[]
FDD_5x_LONG_READ:
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 SPEED
CALL NTRACK
POP BC
EX DE,HL
; LD A,B
; OR A
; JP Z,RETDOS
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD IY,(FDD_INI_TABLE.FDD_0.BytesPerSector)
LD XH,C
LD A,(FDD_INI_TABLE.FDD_0.SECTORS)
LD C,A
EX AF,AF'
OUT (SLOT3),A
.DSK_LP:
LD A,D
EXX
CALL SEEK
EXX
PUSH DE
PUSH BC
PUSH HL
CALL RD_SEC
JP C,ERRDOS
LD D,YH
LD E,YL
POP HL
POP BC
ADD HL,DE
JR NC,.THISRD
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD D,#C2
LD E,XH
LD A,(DE)
LD XH,A
EX AF,AF'
OUT (SLOT3),A
SET 7,H
SET 6,H
.THISRD:
POP DE
LD A,C
INC E
CP E
JP NZ,.NINC_T
LD E,0
INC D
.NINC_T:
DJNZ .DSK_LP
.RETDOS:
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,.ADD8BIT
INC B
.ADD8BIT:
ADD IX,BC
LD BC,0
ADC HL,BC
LD B,A
XOR A
RET
ERRDOS:
POP HL
POP BC
POP DE
CALL SET_DOS_OFF
EX DE,HL
EX AF,AF'
EXX
LD C,XH
EXX
LD A,B
POP IX
POP HL
POP BC
POP IY
PUSH AF
LD C,A
LD A,B
SUB C
LD C,A
LD B,0
ADD IX,BC
LD C,B
ADC HL,BC
POP BC
EXX
LD A,C
EXX
EX AF,AF'
SCF
RET
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 SPEED
CALL NTRACK
POP BC
EX DE,HL
; LD A,B
; OR A
; JP Z,RETDOS
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD IY,(FDD_INI_TABLE.FDD_0.BytesPerSector)
LD XH,C
LD A,(FDD_INI_TABLE.FDD_0.SECTORS)
LD C,A
EX AF,AF'
OUT (SLOT3),A
.DSK_LP: LD A,D
EXX
CALL SEEK
EXX
PUSH DE
PUSH BC
PUSH HL
CALL RD_SEC
JP C,ERRDOS
LD D,YH
LD E,YL
POP HL
POP BC
ADD HL,DE
JR NC,.THISRD
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD D,#C2
LD E,XH
LD A,(DE)
LD XH,A
EX AF,AF'
OUT (SLOT3),A
SET 7,H
SET 6,H
.THISRD: POP DE
LD A,C
INC E
CP E
JP NZ,.NINC_T
LD E,0
INC D
.NINC_T: DJNZ .DSK_LP
.RETDOS: 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,.ADD8BIT
INC B
.ADD8BIT: ADD IX,BC
LD BC,0
ADC HL,BC
LD B,A
XOR A
RET
;
ERRDOS: POP HL
POP BC
POP DE
CALL SET_DOS_OFF
EX DE,HL
EX AF,AF'
EXX
LD C,XH
EXX
LD A,B
POP IX
POP HL
POP BC
POP IY
PUSH AF
LD C,A
LD A,B
SUB C
LD C,A
LD B,0
ADD IX,BC
LD C,B
ADC HL,BC
POP BC
EXX
LD A,C
EXX
EX AF,AF'
SCF
RET
;[]===========================================================[]
;Function: Write Sectors
@ -326,93 +339,93 @@ FDD_5x_WRITE:
; DE - Address + (Sector counter * Size sector)
;[]===========================================================[]
FDD_5x_LONG_WRITE:
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 SPEED
CALL NTRACK
POP BC
EX DE,HL
; LD A,B
; OR A
; JP Z,RETDOS
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD IY,(FDD_INI_TABLE.FDD_0.BytesPerSector)
LD XH,C
LD A,(FDD_INI_TABLE.FDD_0.SECTORS)
LD C,A
EX AF,AF'
OUT (SLOT3),A
.DSK_LP2:
LD A,D
EXX
CALL SEEK
EXX
PUSH DE
PUSH BC
PUSH HL
CALL WR_SEC
JP C,ERRDOS
LD D,YH
LD E,YL
POP HL
POP BC
ADD HL,DE
JR NC,.THISWR
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD D,#C2
LD E,XH
LD A,(DE)
LD XH,A
EX AF,AF'
OUT (SLOT3),A
SET 7,H
SET 6,H
.THISWR:
POP DE
LD A,C
INC E
CP E
JP 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
LD BC,0
ADC HL,BC
LD B,A
XOR A
RET
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 SPEED
CALL NTRACK
POP BC
EX DE,HL
; LD A,B
; OR A
; JP Z,RETDOS
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD IY,(FDD_INI_TABLE.FDD_0.BytesPerSector)
LD XH,C
LD A,(FDD_INI_TABLE.FDD_0.SECTORS)
LD C,A
EX AF,AF'
OUT (SLOT3),A
.DSK_LP2: LD A,D
EXX
CALL SEEK
EXX
PUSH DE
PUSH BC
PUSH HL
CALL WR_SEC
JP C,ERRDOS
LD D,YH
LD E,YL
POP HL
POP BC
ADD HL,DE
JR NC,.THISWR
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD D,#C2
LD E,XH
LD A,(DE)
LD XH,A
EX AF,AF'
OUT (SLOT3),A
SET 7,H
SET 6,H
.THISWR: POP DE
LD A,C
INC E
CP E
JP 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
LD BC,0
ADC HL,BC
LD B,A
XOR A
RET
;
;-------------------------------
@ -420,7 +433,7 @@ FDD_5x_LONG_WRITE:
;-------------------------------
RD_SEC: LD D,5 ;RETRY COUNT
.RRETRY:
DI
;DI
PUSH DE
LD A,E
INC A
@ -458,7 +471,7 @@ RD_SEC: LD D,5 ;RETRY COUNT
EX AF,AF'
;-------------------------------
POP DE
EI
;EI
IN A,(FDC_93.Command)
LD C,A
;R01
@ -499,7 +512,7 @@ RD_SEC: LD D,5 ;RETRY COUNT
;-------------------------------
WR_SEC: LD D,5 ;RETRY COUNT
.WRETRY:
DI
;DI
PUSH DE
LD A,E
INC A
@ -537,7 +550,7 @@ WR_SEC: LD D,5 ;RETRY COUNT
EX AF,AF'
;-------------------------------
POP DE
EI
;EI
IN A,(FDC_93.Command)
LD C,A
;R01
@ -629,17 +642,17 @@ S_FDD: PUSH BC
;
;
MOTOR_OFF:
PUSH AF
LD A,#D0
OUT (FDC_93.Command),A ;STOP OPERATION
LD A,#00
OUT (FDC_93.DrvCTRL),A
LD A,#3C
OUT (FDC_93.DrvCTRL),A
CALL SET_DOS_OFF
POP AF
RET
; MOTOR_OFF:
; PUSH AF
; LD A,#D0
; OUT (FDC_93.Command),A ;STOP OPERATION
; LD A,#00
; OUT (FDC_93.DrvCTRL),A
; LD A,#3C
; OUT (FDC_93.DrvCTRL),A
; CALL SET_DOS_OFF
; POP AF
; RET
;
;
@ -673,9 +686,9 @@ SPEED: IN A,(SLOT3)
JP FDD.SET1440 ;NZ
;
;
; ¯à¥à뢠­¨ï ¤®«¦­ë ¡ëâì ®âª«î祭ë
DISK_ID:
DI
;DI
EXX
CALL SPEED
IN A,(FDC_93.Track)
@ -708,7 +721,7 @@ DISK_ID:
OUT (SLOT3),A
EX AF,AF'
AND #80
EI
;EI
RET
.ID_LP4:
DEC HL
@ -720,7 +733,7 @@ DISK_ID:
JP NZ,.ID_LP0
EXX
SCF
EI
;EI
RET
;
@ -828,6 +841,26 @@ NTRACK:
LD H,A
RET
;
SAVE_INTERRUPTS:
.switch_off: PUSH AF
LD A,R
LD A,#80
JP PE,.set_R
XOR A
.set_R: LD R,A
DI
POP AF
RET
; ;
.restore: PUSH AF
LD A,R
BIT 7,A
JR Z,.set_di
EI
POP AF ; PE
RET
;
.set_di: DI
POP AF ; PO
RET
;[]===========================================================[]

View File

@ -320,11 +320,13 @@ SW_ROM:
DI
PUSH AF
PUSH BC
LD BC,(#5BFF) ; !HARDCODE
;
LD BC,(#5BFF) ; !HARDCODE
LD A,#C9 ; Opcode RET
LD (#5BFF),A ; !HARDCODE
CALL #5BFF ; !HARDCODE
LD (#5BFF),BC ; !HARDCODE
LD (#5BFF),A ; !HARDCODE
CALL #5BFF ; !HARDCODE
LD (#5BFF),BC ; !HARDCODE
;
POP BC
POP AF
JP PO,.no_EI

View File

@ -527,7 +527,7 @@ msgStrings:
_mSetStr ideFail, tmp_Counter : DZ 'Fail ' ; !FIXIT strFail
_mSetStr spModel, tmp_Counter : DZ 'Model : '
.str_ACEX_MODEL EQU $$$+2 ; 㪠§ â¥«ì ­  áâப㠭¨¦¥ ¤«ï ¯ âç   ¯¤¥©â¥à®¬
_mSetStr spCNFver, tmp_Counter : DZ '1K30 core : v'
_mSetStr spCNFver, tmp_Counter : DZ 'Core 1K30 : v'
_mSetStr spMemory, tmp_Counter : DZ 'Memory : '
_mSetStr cmosFound, tmp_Counter : DZ 'CMOS : Found'
_mSetStr cmosNone, tmp_Counter : DZ 'CMOS : None'
@ -678,7 +678,7 @@ msgRusStrings:
_mSetStrRus ideFail, tmp_Counter : DZ '<EFBFBD>¥ ®¯à¥¤¥«ñ­ '
_mSetStrRus spModel, tmp_Counter : DZ 'Œ®¤¥«ì : '
.str_ACEX_MODEL EQU $$$+2 ; 㪠§ â¥«ì ­  áâப㠭¨¦¥ ¤«ï ¯ âç   ¯¤¥©â¥à®¬ ; !FIXIT ? ¢ëâ¢ âì ç¥à¥§ FN_CRIPT.Acex_ver ?
_mSetStrRus spCNFver, tmp_Counter : DZ '1K30 ï¤à® : v'
_mSetStrRus spCNFver, tmp_Counter : DZ 'Ÿ¤à® 1K30 : v'
_mSetStrRus spMemory, tmp_Counter : DZ '<EFBFBD> ¬ïâì : '
_mSetStrRus cmosFound, tmp_Counter : DZ 'CMOS : <EFBFBD> ©¤¥­'
_mSetStrRus cmosNone, tmp_Counter : DZ 'CMOS : <EFBFBD>¥â'

Binary file not shown.