bugfix with interrupts in 5x for FDD

This commit is contained in:
Anatoliy Belyanskiy 2024-06-10 00:34:57 +10:00
parent 2020c04f13
commit 903081f220
6 changed files with 340 additions and 303 deletions

View File

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

View File

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

View File

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

Binary file not shown.