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,20 +72,19 @@ 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: ;
IN A,(SLOT3) .setParams: 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
@ -105,10 +104,11 @@ FDD_5x_SETMED:
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
@ -125,25 +125,26 @@ 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
@ -152,7 +153,21 @@ FDD_5x_RESET:
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,7 +194,11 @@ 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
CALL .Start
JP SAVE_INTERRUPTS.restore
;
.Start: PUSH IY
PUSH BC PUSH BC
PUSH HL PUSH HL
PUSH IX PUSH IX
@ -206,8 +225,7 @@ FDD_5x_LONG_READ:
LD C,A LD C,A
EX AF,AF' EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A
.DSK_LP: .DSK_LP: LD A,D
LD A,D
EXX EXX
CALL SEEK CALL SEEK
EXX EXX
@ -234,18 +252,15 @@ FDD_5x_LONG_READ:
OUT (SLOT3),A OUT (SLOT3),A
SET 7,H SET 7,H
SET 6,H SET 6,H
.THISRD: .THISRD: POP DE
POP DE
LD A,C LD A,C
INC E INC E
CP E CP E
JP NZ,.NINC_T JP NZ,.NINC_T
LD E,0 LD E,0
INC D INC D
.NINC_T: .NINC_T: DJNZ .DSK_LP
DJNZ .DSK_LP .RETDOS: 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
@ -260,16 +275,14 @@ FDD_5x_LONG_READ:
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: ERRDOS: POP HL
POP HL
POP BC POP BC
POP DE POP DE
CALL SET_DOS_OFF CALL SET_DOS_OFF
@ -326,7 +339,11 @@ 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
CALL .Start
JP SAVE_INTERRUPTS.restore
;
.Start: PUSH IY
PUSH BC PUSH BC
PUSH HL PUSH HL
PUSH IX PUSH IX
@ -353,8 +370,7 @@ FDD_5x_LONG_WRITE:
LD C,A LD C,A
EX AF,AF' EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A
.DSK_LP2: .DSK_LP2: LD A,D
LD A,D
EXX EXX
CALL SEEK CALL SEEK
EXX EXX
@ -381,16 +397,14 @@ FDD_5x_LONG_WRITE:
OUT (SLOT3),A OUT (SLOT3),A
SET 7,H SET 7,H
SET 6,H SET 6,H
.THISWR: .THISWR: POP DE
POP DE
LD A,C LD A,C
INC E INC E
CP E CP E
JP NZ,.NINC_T2 JP NZ,.NINC_T2
LD E,0 LD E,0
INC D INC D
.NINC_T2: .NINC_T2: DJNZ .DSK_LP2
DJNZ .DSK_LP2
CALL SET_DOS_OFF CALL SET_DOS_OFF
LD A,XH LD A,XH
EX AF,AF' EX AF,AF'
@ -406,8 +420,7 @@ FDD_5x_LONG_WRITE:
LD B,0 LD B,0
JR NZ,.ADW8BIT JR NZ,.ADW8BIT
INC B INC B
.ADW8BIT: .ADW8BIT: ADD IX,BC
ADD IX,BC
LD BC,0 LD BC,0
ADC HL,BC ADC HL,BC
LD B,A LD B,A
@ -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.