From a434c346f81a599619a8b7e6e4b4ff825ece701c Mon Sep 17 00:00:00 2001 From: Christian Zietz Date: Tue, 14 Oct 2025 17:58:37 +0200 Subject: [PATCH] WIP: Add a delay to the ACSI IRQ --- src/cycInt.c | 4 +++- src/hdc.c | 13 ++++++++++++- src/includes/cycInt.h | 1 + src/includes/hdc.h | 2 ++ 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/cycInt.c b/src/cycInt.c index 62b5f273..f65908cc 100644 --- a/src/cycInt.c +++ b/src/cycInt.c @@ -57,6 +57,7 @@ const char CycInt_fileid[] = "Hatari cycInt.c"; #include "dmaSnd.h" #include "crossbar.h" #include "fdc.h" +#include "hdc.h" #include "ikbd.h" #include "cycles.h" #include "cycInt.h" @@ -109,7 +110,8 @@ static void (* const pIntHandlerFunctions[MAX_INTERRUPTS])(void) = SCC_InterruptHandler_RX_A, SCC_InterruptHandler_BRG_B, SCC_InterruptHandler_TX_RX_B, - SCC_InterruptHandler_RX_B + SCC_InterruptHandler_RX_B, + HDC_InterruptHandler_Update, }; /* Event timer structure - keeps next timer to occur in structure so don't need diff --git a/src/hdc.c b/src/hdc.c index f795c4e8..8cdb6f58 100644 --- a/src/hdc.c +++ b/src/hdc.c @@ -17,6 +17,8 @@ const char HDC_fileid[] = "Hatari hdc.c"; #include "file.h" #include "fdc.h" #include "hdc.h" +#include "cycles.h" +#include "cycInt.h" #include "ioMem.h" #include "log.h" #include "m68000.h" @@ -1148,7 +1150,8 @@ static void Acsi_DmaTransfer(void) AcsiBus.data_len = 0; FDC_SetDMAStatus(AcsiBus.bDmaError); /* Mark DMA error */ - FDC_SetIRQ(FDC_IRQ_SOURCE_HDC); + FDC_ClearHdcIRQ(); + CycInt_AddRelativeInterrupt(2000, INT_CPU_CYCLE, INTERRUPT_ACSI_HD); /* For the MegaSTE, using the HDC DMA will flush the external cache */ if ( ConfigureParams.System.nMachineType == MACHINE_MEGA_STE ) @@ -1235,3 +1238,11 @@ void HDC_DmaTransfer(void) else if (bAcsiEmuOn) Acsi_DmaTransfer(); } + + + +void HDC_InterruptHandler_Update ( void ) +{ + CycInt_AcknowledgeInterrupt(); + FDC_SetIRQ(FDC_IRQ_SOURCE_HDC); +} \ No newline at end of file diff --git a/src/includes/cycInt.h b/src/includes/cycInt.h index 3dfb9293..f43705bd 100644 --- a/src/includes/cycInt.h +++ b/src/includes/cycInt.h @@ -39,6 +39,7 @@ typedef enum INTERRUPT_SCC_BRG_B, INTERRUPT_SCC_TX_RX_B, INTERRUPT_SCC_RX_B, + INTERRUPT_ACSI_HD, MAX_INTERRUPTS } interrupt_id; diff --git a/src/includes/hdc.h b/src/includes/hdc.h index 7c8f3dbf..aa90813e 100644 --- a/src/includes/hdc.h +++ b/src/includes/hdc.h @@ -106,4 +106,6 @@ extern off_t HDC_CheckAndGetSize(const char *hdtype, const char *filename, unsig extern bool HDC_WriteCommandPacket(SCSI_CTRLR *ctr, uint8_t b); extern void HDC_DmaTransfer(void); +extern void HDC_InterruptHandler_Update ( void ); + #endif /* HATARI_HDC_H */ -- 2.30.2