Skip to content

Commit

Permalink
- Install ISR as needed.
Browse files Browse the repository at this point in the history
  • Loading branch information
Extrems committed May 21, 2023
1 parent 9e6637d commit 65aa702
Show file tree
Hide file tree
Showing 9 changed files with 62 additions and 111 deletions.
41 changes: 21 additions & 20 deletions cube/patches/Makefile
Expand Up @@ -91,7 +91,7 @@ stub.bin:
sd.bin:
@echo Building SD Patch ...
@$(CC) -Os $(OPTS) -c base/base.S
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DISR
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ
@$(CC) -Os $(OPTS) -c base/emulator_dvd.c -DREAD_SPEED_TIER=2
@$(CC) -Os $(OPTS) -c base/DVDMath.c
@$(CC) -Os $(OPTS) -c base/frag.c
Expand All @@ -115,7 +115,7 @@ sd.bin:
sd.card.bin:
@echo Building SD Patch + CARD ...
@$(CC) -Os $(OPTS) -c base/base.S
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DCARD_EMULATOR -DISR
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DCARD_EMULATOR
@$(CC) -Os $(OPTS) -c base/emulator_card.c -DASYNC_READ
@$(CC) -Os $(OPTS) -c base/frag.c
@$(CC) -Os $(OPTS) -c base/interrupt.c
Expand All @@ -136,7 +136,7 @@ sd.card.bin:
sd.dtk.bin:
@echo Building SD Patch + DTK ...
@$(CC) -Os $(OPTS) -c base/base.S
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DDTK -DISR
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DDTK
@$(CC) -Os $(OPTS) -c base/audio.c
@$(CC) -Os $(OPTS) -c base/fifo.c
@$(CC) -Os $(OPTS) -c base/frag.c
Expand All @@ -158,7 +158,7 @@ sd.dtk.bin:
ideexi-v1.bin:
@echo Building IDE-EXI-v1 Patch ...
@$(CC) -Os $(OPTS) -c base/base.S
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DISR
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ
@$(CC) -Os $(OPTS) -c base/emulator_dvd.c -DREAD_SPEED_TIER=2
@$(CC) -Os $(OPTS) -c base/DVDMath.c
@$(CC) -Os $(OPTS) -c base/frag.c
Expand All @@ -182,7 +182,7 @@ ideexi-v1.bin:
ideexi-v1.card.bin:
@echo Building IDE-EXI-v1 Patch + CARD ...
@$(CC) -Os $(OPTS) -c base/base.S
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DCARD_EMULATOR -DISR
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DCARD_EMULATOR
@$(CC) -Os $(OPTS) -c base/emulator_card.c -DASYNC_READ
@$(CC) -Os $(OPTS) -c base/frag.c
@$(CC) -Os $(OPTS) -c base/interrupt.c
Expand All @@ -203,7 +203,7 @@ ideexi-v1.card.bin:
ideexi-v1.dtk.bin:
@echo Building IDE-EXI-v1 Patch + DTK ...
@$(CC) -Os $(OPTS) -c base/base.S
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DDTK -DISR
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DDTK
@$(CC) -Os $(OPTS) -c base/audio.c
@$(CC) -Os $(OPTS) -c base/fifo.c
@$(CC) -Os $(OPTS) -c base/frag.c
Expand All @@ -225,7 +225,7 @@ ideexi-v1.dtk.bin:
ideexi-v2.bin:
@echo Building IDE-EXI-v2 Patch ...
@$(CC) -Os $(OPTS) -c base/base.S
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DISR
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ
@$(CC) -Os $(OPTS) -c base/emulator_dvd.c -DREAD_SPEED_TIER=2
@$(CC) -Os $(OPTS) -c base/DVDMath.c
@$(CC) -Os $(OPTS) -c base/frag.c
Expand All @@ -249,7 +249,7 @@ ideexi-v2.bin:
ideexi-v2.card.bin:
@echo Building IDE-EXI-v2 Patch + CARD ...
@$(CC) -Os $(OPTS) -c base/base.S
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DCARD_EMULATOR -DISR
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DCARD_EMULATOR
@$(CC) -Os $(OPTS) -c base/emulator_card.c -DASYNC_READ
@$(CC) -Os $(OPTS) -c base/frag.c
@$(CC) -Os $(OPTS) -c base/interrupt.c
Expand All @@ -270,7 +270,7 @@ ideexi-v2.card.bin:
ideexi-v2.dtk.bin:
@echo Building IDE-EXI-v2 Patch + DTK ...
@$(CC) -Os $(OPTS) -c base/base.S
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DDTK -DISR
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DDTK
@$(CC) -Os $(OPTS) -c base/audio.c
@$(CC) -Os $(OPTS) -c base/fifo.c
@$(CC) -Os $(OPTS) -c base/frag.c
Expand All @@ -292,7 +292,7 @@ ideexi-v2.dtk.bin:
dvd.bin:
@echo Building DVD Patch ...
@$(CC) -Os $(OPTS) -c base/base.S
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DDI_PASSTHROUGH -DDVD -DISR
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DDI_PASSTHROUGH -DDVD
@$(CC) -Os $(OPTS) -c base/frag.c -DDEVICE_PATCHES=1 -DDIRECT_DISC
@$(CC) -Os $(OPTS) -c base/interrupt.c
@$(CC) -Os $(OPTS) -c base/ipl.c
Expand All @@ -312,7 +312,7 @@ dvd.bin:
dvd.card.bin:
@echo Building DVD Patch + CARD ...
@$(CC) -Os $(OPTS) -c base/base.S
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DCARD_EMULATOR -DDI_PASSTHROUGH -DDVD -DISR
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DCARD_EMULATOR -DDI_PASSTHROUGH -DDVD
@$(CC) -Os $(OPTS) -c base/emulator_card.c -DASYNC_READ
@$(CC) -Os $(OPTS) -c base/frag.c -DDEVICE_PATCHES=1 -DDIRECT_DISC
@$(CC) -Os $(OPTS) -c base/interrupt.c
Expand All @@ -333,16 +333,17 @@ dvd.card.bin:
usbgecko.bin:
@echo Building USBGecko Patch ...
@$(CC) -Os $(OPTS) -c base/base.S
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DISR -DUSB
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DUSB
@$(CC) -Os $(OPTS) -c base/frag.c -DDEVICE_PATCHES=1
@$(CC) -Os $(OPTS) -c base/interrupt.c
@$(CC) -Os $(OPTS) -c base/ipl.c
@$(CC) -Os $(OPTS) -c usbgecko/usbgecko.c -DASYNC_READ
@$(CC) -Os $(OPTS) -c usbgecko/usbgecko_isr.S -DMMC
@$(CC) -Os $(OPTS) -c usbgecko/usbgecko_isr.S
@$(CC) -Os $(OPTS) -c sdgecko/sd.c -DISR_READ=1 -DWRITE=0
@$(CC) -Os $(OPTS) -c sdgecko/sd_isr.S
@$(CC) -Os $(OPTS) -c base/dolphin/os.c
@$(CC) -Os $(OPTS) -c base/memcpy.S
@$(CC) -Os $(OPTS) -o usbgecko.elf -T base/base.ld -T base/common.ld -T base/dolphin/os.ld base.o emulator.o frag.o interrupt.o ipl.o usbgecko.o usbgecko_isr.o sd.o os.o memcpy.o
@$(CC) -Os $(OPTS) -o usbgecko.elf -T base/base.ld -T base/common.ld -T base/dolphin/os.ld base.o emulator.o frag.o interrupt.o ipl.o usbgecko.o usbgecko_isr.o sd.o sd_isr.o os.o memcpy.o
@mkdir -p $(DISASM)
@$(OBJDUMP) -D usbgecko.elf > $(DISASM)/usbgecko.txt
@$(OBJCOPY) -O binary --set-section-flags .bss.*=alloc,load,contents usbgecko.elf usbgecko.bin
Expand All @@ -352,7 +353,7 @@ usbgecko.bin:
wkf.bin:
@echo Building WKF Patch ...
@$(CC) -Os $(OPTS) -c base/base.S
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DISR -DWKF
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DWKF
@$(CC) -Os $(OPTS) -c base/frag.c -DDEVICE_PATCHES=1
@$(CC) -Os $(OPTS) -c base/interrupt.c
@$(CC) -Os $(OPTS) -c base/ipl.c
Expand All @@ -372,7 +373,7 @@ wkf.bin:
wkf.card.bin:
@echo Building WKF Patch + CARD ...
@$(CC) -Os $(OPTS) -c base/base.S
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DCARD_EMULATOR -DISR -DWKF
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DCARD_EMULATOR -DWKF
@$(CC) -Os $(OPTS) -c base/emulator_card.c -DASYNC_READ
@$(CC) -Os $(OPTS) -c base/frag.c -DDEVICE_PATCHES=1
@$(CC) -Os $(OPTS) -c base/interrupt.c
Expand All @@ -393,7 +394,7 @@ wkf.card.bin:
wkf.dtk.bin:
@echo Building WKF Patch + DTK ...
@$(CC) -Os $(OPTS) -c base/base.S
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DDTK -DISR -DWKF
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DDTK -DWKF
@$(CC) -Os $(OPTS) -c base/audio.c
@$(CC) -Os $(OPTS) -c base/fifo.c
@$(CC) -Os $(OPTS) -c base/frag.c -DDEVICE_PATCHES=1
Expand All @@ -415,7 +416,7 @@ wkf.dtk.bin:
fsp.bin:
@echo Building FSP Patch ...
@$(CC) -Os $(OPTS) -c base/base.S
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DBBA -DISR -DNO_VIDEO
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DBBA -DNO_VIDEO
@$(CC) -Os $(OPTS) -c base/frag.c -DDEVICE_PATCHES=1
@$(CC) -Os $(OPTS) -c base/interrupt.c
@$(CC) -Os $(OPTS) -c base/ipl.c
Expand Down Expand Up @@ -457,7 +458,7 @@ fsp.dtk.bin:
gcloader-v1.bin:
@echo Building GCLoader-v1 Patch ...
@$(CC) -Os $(OPTS) -c base/base.S
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DDI_PASSTHROUGH -DGCODE -DISR
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DDI_PASSTHROUGH -DGCODE
@$(CC) -Os $(OPTS) -c base/emulator_dvd.c -DREAD_SPEED_TIER=1
@$(CC) -Os $(OPTS) -c base/DVDMath.c
@$(CC) -Os $(OPTS) -c base/frag.c -DDEVICE_PATCHES=1 -DDIRECT_DISC
Expand All @@ -481,7 +482,7 @@ gcloader-v1.bin:
gcloader-v1.card.bin:
@echo Building GCLoader-v1 Patch + CARD ...
@$(CC) -Os $(OPTS) -c base/base.S
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DCARD_EMULATOR -DDI_PASSTHROUGH -DGCODE -DISR
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DCARD_EMULATOR -DDI_PASSTHROUGH -DGCODE
@$(CC) -Os $(OPTS) -c base/emulator_card.c -DASYNC_READ
@$(CC) -Os $(OPTS) -c base/frag.c -DDEVICE_PATCHES=1 -DDIRECT_DISC
@$(CC) -Os $(OPTS) -c base/interrupt.c
Expand Down
14 changes: 7 additions & 7 deletions cube/patches/base/emulator.c
Expand Up @@ -1150,12 +1150,15 @@ ppc_context_t *service_exception(ppc_context_t *context)
}

void dsi_exception_vector(void);
void external_interrupt_vector(void);

static void write_branch(void *a, void *b)
void write_branch(void *a, void *b)
{
*(uint32_t *)a = (uint32_t)(b - (OS_BASE_CACHED - 0x48000002));
asm volatile("dcbst 0,%0; sync; icbi 0,%0" :: "r" (a));
uint32_t branch = (uint32_t)(b - (OS_BASE_CACHED - 0x48000002));

if (*(uint32_t *)a != branch) {
*(uint32_t *)a = branch;
asm volatile("dcbst 0,%0; sync; icbi 0,%0" :: "r" (a));
}
}

#ifdef BBA
Expand All @@ -1169,9 +1172,6 @@ void init(void **arenaLo, void **arenaHi)
OSCreateAlarm(&read_alarm);

write_branch((void *)0x80000300, dsi_exception_vector);
#ifdef ISR
write_branch((void *)0x80000500, external_interrupt_vector);
#endif

#ifdef BBA
bba_init(arenaLo, arenaHi);
Expand Down
3 changes: 2 additions & 1 deletion cube/patches/base/emulator.h
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2019-2022, Extrems <extrems@extremscorner.org>
* Copyright (c) 2019-2023, Extrems <extrems@extremscorner.org>
*
* This file is part of Swiss.
*
Expand Down Expand Up @@ -44,6 +44,7 @@ void perform_read(uint32_t address, uint32_t length, uint32_t offset);
void trickle_read();
bool change_disc(void);
void reset_devices(void);
void write_branch(void *a, void *b);

void exi_interrupt(unsigned chan);
void exi_complete_transfer(unsigned chan);
Expand Down
6 changes: 5 additions & 1 deletion cube/patches/ide-exi/ata.c
Expand Up @@ -63,6 +63,8 @@ extern struct {
intptr_t buffer;
intptr_t registers;
} _ata;

void ata_interrupt_vector(void);
#endif

static struct {
Expand Down Expand Up @@ -428,8 +430,10 @@ static void ata_done_queued(void)
static void tc_interrupt_handler(OSInterrupt interrupt, OSContext *context)
{
#if ISR_READ
if (_ata.transferred < SECTOR_SIZE)
if (_ata.transferred < SECTOR_SIZE) {
write_branch((void *)0x80000500, ata_interrupt_vector);
return;
}
#endif

mask_interrupts(OS_INTERRUPTMASK(interrupt) & (OS_INTERRUPTMASK_EXI_0_TC | OS_INTERRUPTMASK_EXI_1_TC));
Expand Down
6 changes: 3 additions & 3 deletions cube/patches/ide-exi/ata_isr.S
Expand Up @@ -20,7 +20,7 @@
#define _LANGUAGE_ASSEMBLY
#include "../../reservedarea.h"

.section .text.external_interrupt_vector,"ax",@progbits
.section .text.ata_interrupt_vector,"ax",@progbits
.balign 32
.globl _ata
_ata:
Expand All @@ -35,8 +35,8 @@ _ata_buffer:
_ata_registers:
.long 0x0C006800

.globl external_interrupt_vector
external_interrupt_vector:
.globl ata_interrupt_vector
ata_interrupt_vector:
mtsprg 0, r4
mtsprg 1, r5
mtsprg 2, r6
Expand Down
6 changes: 5 additions & 1 deletion cube/patches/sdgecko/sd.c
Expand Up @@ -48,6 +48,8 @@ extern struct {
intptr_t buffer;
intptr_t registers;
} _mmc;

void mmc_interrupt_vector(void);
#endif

static struct {
Expand Down Expand Up @@ -304,8 +306,10 @@ static void mmc_done_queued(void)

static void tc_interrupt_handler(OSInterrupt interrupt, OSContext *context)
{
if (_mmc.transferred < SECTOR_SIZE)
if (_mmc.transferred < SECTOR_SIZE) {
write_branch((void *)0x80000500, mmc_interrupt_vector);
return;
}

mask_interrupts(OS_INTERRUPTMASK(interrupt) & (OS_INTERRUPTMASK_EXI_0_TC | OS_INTERRUPTMASK_EXI_1_TC | OS_INTERRUPTMASK_EXI_2_TC));
exi_deselect();
Expand Down
6 changes: 3 additions & 3 deletions cube/patches/sdgecko/sd_isr.S
Expand Up @@ -20,7 +20,7 @@
#define _LANGUAGE_ASSEMBLY
#include "../../reservedarea.h"

.section .text.external_interrupt_vector,"ax",@progbits
.section .text.mmc_interrupt_vector,"ax",@progbits
.balign 32
.globl _mmc
_mmc:
Expand All @@ -33,8 +33,8 @@ _mmc_buffer:
_mmc_registers:
.long 0x0C006800

.globl external_interrupt_vector
external_interrupt_vector:
.globl mmc_interrupt_vector
mmc_interrupt_vector:
mtsprg 0, r4
mtsprg 1, r5
mtsprg 2, r6
Expand Down
6 changes: 5 additions & 1 deletion cube/patches/usbgecko/usbgecko.c
Expand Up @@ -53,6 +53,8 @@ extern struct {
intptr_t registers;
} _usb;

void usb_interrupt_vector(void);

static struct {
struct {
void *buffer;
Expand Down Expand Up @@ -159,8 +161,10 @@ static void usb_done_queued(void)

static void tc_interrupt_handler(OSInterrupt interrupt, OSContext *context)
{
if (_usb.requested)
if (_usb.requested) {
write_branch((void *)0x80000500, usb_interrupt_vector);
return;
}

mask_interrupts(OS_INTERRUPTMASK_EXI_1_TC);
exi_deselect();
Expand Down

0 comments on commit 65aa702

Please sign in to comment.