Skip to content

Commit

Permalink
- Enable Broadband Adapter emulation for GC Loader and SD Card Adapter.
Browse files Browse the repository at this point in the history
  • Loading branch information
Extrems committed Mar 3, 2024
1 parent 444402e commit 6a1559b
Show file tree
Hide file tree
Showing 11 changed files with 125 additions and 59 deletions.
60 changes: 51 additions & 9 deletions cube/patches/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,13 @@ DISASM = disassembly
all: clean codehandler cpatches stub sdpatch ideexipatch dvdpatch usbgeckopatch wkfpatch fsppatch gcloaderpatch

stub: reboot.bin stub.bin
sdpatch: sd.bin sd.card.bin sd.dtk.bin
sdpatch: sd.bin sd.card.bin sd.dtk.bin sd.eth.bin
ideexipatch: ideexi-v1.bin ideexi-v1.card.bin ideexi-v1.dtk.bin ideexi-v1.eth.bin ideexi-v2.bin ideexi-v2.card.bin ideexi-v2.dtk.bin ideexi-v2.eth.bin
dvdpatch: dvd.bin dvd.card.bin
usbgeckopatch: usbgecko.bin
wkfpatch: wkf.bin wkf.card.bin wkf.dtk.bin
fsppatch: fsp.bin fsp.dtk.bin fsp.eth.bin
gcloaderpatch: gcloader-v1.bin gcloader-v1.card.bin gcloader-v2.bin gcloader-v2.card.bin gcloader-v2.dtk.bin
gcloaderpatch: gcloader-v1.bin gcloader-v1.card.bin gcloader-v2.bin gcloader-v2.card.bin gcloader-v2.dtk.bin gcloader-v2.eth.bin

clean:
@rm -f *.bin *.elf *.o
Expand Down Expand Up @@ -160,6 +160,28 @@ sd.dtk.bin:
@$(BIN2S) -H $(DEST)/sd_dtk_bin.h sd.dtk.bin > $(DEST)/sd.dtk.bin.s
@rm -f *.bin *.elf *.o

sd.eth.bin:
@echo Building SD Patch + ETH ...
@$(CC) -Os $(OPTS) -c base/base.S
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DBBA -DETH_EMULATOR -DNO_VIDEO
@$(CC) -Os $(OPTS) -c base/emulator_eth.c
@$(CC) -Os $(OPTS) -c base/frag.c
@$(CC) -Os $(OPTS) -c base/interrupt.c -DIRQ_MASK=0b00000000001001001000000001000000
@$(CC) -Os $(OPTS) -c base/ipl.c
@$(CC) -Os $(OPTS) -c base/blockdevice.c -DASYNC_READ
@$(CC) -Os $(OPTS) -c sdgecko/sd.c -DISR_READ=1 -DWRITE=0
@$(CC) -Os $(OPTS) -c sdgecko/sd_isr.S
@$(CC) -Os $(OPTS) -c bba/enc28j60.c
@$(CC) -Os $(OPTS) -c usbgecko/uart.c
@$(CC) -Os $(OPTS) -c base/dolphin/os.c
@$(CC) -Os $(OPTS) -c base/memcpy.S
@$(CC) -Os $(OPTS) -o sd.eth.elf -T base/base.ld -T base/common.ld -T base/dolphin/os.ld base.o emulator.o emulator_eth.o frag.o interrupt.o ipl.o blockdevice.o sd.o sd_isr.o enc28j60.o uart.o os.o memcpy.o
@mkdir -p $(DISASM)
@$(OBJDUMP) -D sd.eth.elf > $(DISASM)/sd.eth.txt
@$(OBJCOPY) -O binary --set-section-flags .bss.*=alloc,load,contents sd.eth.elf sd.eth.bin
@$(BIN2S) -H $(DEST)/sd_eth_bin.h sd.eth.bin > $(DEST)/sd.eth.bin.s
@rm -f *.bin *.elf *.o

ideexi-v1.bin:
@echo Building IDE-EXI-v1 Patch ...
@$(CC) -Os $(OPTS) -c base/base.S
Expand Down Expand Up @@ -236,13 +258,13 @@ ideexi-v1.eth.bin:
@$(CC) -Os $(OPTS) -c base/interrupt.c -DIRQ_MASK=0b00000000001001000000000001000000
@$(CC) -Os $(OPTS) -c base/ipl.c
@$(CC) -Os $(OPTS) -c base/blockdevice.c -DASYNC_READ
@$(CC) -Os $(OPTS) -c bba/enc28j60.c
@$(CC) -Os $(OPTS) -c ide-exi/ata.c -DDMA_READ=0 -DISR_READ=1 -DWRITE=0
@$(CC) -Os $(OPTS) -c ide-exi/ata_isr.S
@$(CC) -Os $(OPTS) -c bba/enc28j60.c
@$(CC) -Os $(OPTS) -c usbgecko/uart.c
@$(CC) -Os $(OPTS) -c base/dolphin/os.c
@$(CC) -Os $(OPTS) -c base/memcpy.S
@$(CC) -Os $(OPTS) -o ideexi-v1.eth.elf -T base/base.ld -T base/common.ld -T base/dolphin/os.ld base.o emulator.o emulator_eth.o frag.o interrupt.o ipl.o blockdevice.o enc28j60.o ata.o ata_isr.o uart.o os.o memcpy.o
@$(CC) -Os $(OPTS) -o ideexi-v1.eth.elf -T base/base.ld -T base/common.ld -T base/dolphin/os.ld base.o emulator.o emulator_eth.o frag.o interrupt.o ipl.o blockdevice.o ata.o ata_isr.o enc28j60.o uart.o os.o memcpy.o
@mkdir -p $(DISASM)
@$(OBJDUMP) -D ideexi-v1.eth.elf > $(DISASM)/ideexi-v1.eth.txt
@$(OBJCOPY) -O binary --set-section-flags .bss.*=alloc,load,contents ideexi-v1.eth.elf ideexi-v1.eth.bin
Expand Down Expand Up @@ -325,13 +347,13 @@ ideexi-v2.eth.bin:
@$(CC) -Os $(OPTS) -c base/interrupt.c -DIRQ_MASK=0b00000000001001000000000001000000
@$(CC) -Os $(OPTS) -c base/ipl.c
@$(CC) -Os $(OPTS) -c base/blockdevice.c -DASYNC_READ
@$(CC) -Os $(OPTS) -c bba/enc28j60.c
@$(CC) -Os $(OPTS) -c ide-exi/ata.c -DDMA_READ=1 -DISR_READ=1 -DWRITE=0
@$(CC) -Os $(OPTS) -c ide-exi/ata_isr.S -DDMA
@$(CC) -Os $(OPTS) -c bba/enc28j60.c
@$(CC) -Os $(OPTS) -c usbgecko/uart.c
@$(CC) -Os $(OPTS) -c base/dolphin/os.c
@$(CC) -Os $(OPTS) -c base/memcpy.S
@$(CC) -Os $(OPTS) -o ideexi-v2.eth.elf -T base/base.ld -T base/common.ld -T base/dolphin/os.ld base.o emulator.o emulator_eth.o frag.o interrupt.o ipl.o blockdevice.o enc28j60.o ata.o ata_isr.o uart.o os.o memcpy.o
@$(CC) -Os $(OPTS) -o ideexi-v2.eth.elf -T base/base.ld -T base/common.ld -T base/dolphin/os.ld base.o emulator.o emulator_eth.o frag.o interrupt.o ipl.o blockdevice.o ata.o ata_isr.o enc28j60.o uart.o os.o memcpy.o
@mkdir -p $(DISASM)
@$(OBJDUMP) -D ideexi-v2.eth.elf > $(DISASM)/ideexi-v2.eth.txt
@$(OBJCOPY) -O binary --set-section-flags .bss.*=alloc,load,contents ideexi-v2.eth.elf ideexi-v2.eth.bin
Expand Down Expand Up @@ -402,7 +424,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 -DWKF
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ
@$(CC) -Os $(OPTS) -c base/frag.c -DDEVICE_PATCHES=1
@$(CC) -Os $(OPTS) -c base/interrupt.c -DIRQ_MASK=0b00000000001001001000111100000000
@$(CC) -Os $(OPTS) -c base/ipl.c
Expand All @@ -422,7 +444,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 -DWKF
@$(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 -DDEVICE_PATCHES=1
@$(CC) -Os $(OPTS) -c base/interrupt.c -DIRQ_MASK=0b00000000001001001000111100000000
Expand All @@ -443,7 +465,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 -DWKF
@$(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 -DDEVICE_PATCHES=1
Expand Down Expand Up @@ -629,3 +651,23 @@ gcloader-v2.dtk.bin:
@$(OBJCOPY) -O binary --set-section-flags .bss.*=alloc,load,contents gcloader-v2.dtk.elf gcloader-v2.dtk.bin
@$(BIN2S) -H $(DEST)/gcloader_v2_dtk_bin.h gcloader-v2.dtk.bin > $(DEST)/gcloader-v2.dtk.bin.s
@rm -f *.bin *.elf *.o

gcloader-v2.eth.bin:
@echo Building GCLoader-v2 Patch + ETH ...
@$(CC) -Os $(OPTS) -c base/base.S
@$(CC) -Os $(OPTS) -c base/emulator.c -DASYNC_READ -DBBA -DETH_EMULATOR -DGCODE -DNO_VIDEO
@$(CC) -Os $(OPTS) -c base/emulator_eth.c
@$(CC) -Os $(OPTS) -c base/frag.c -DDEVICE_PATCHES=1
@$(CC) -Os $(OPTS) -c base/interrupt.c -DIRQ_MASK=0b00000000000000000000111101000000
@$(CC) -Os $(OPTS) -c base/ipl.c
@$(CC) -Os $(OPTS) -c gcloader/gcloader.c
@$(CC) -Os $(OPTS) -c bba/enc28j60.c
@$(CC) -Os $(OPTS) -c usbgecko/uart.c
@$(CC) -Os $(OPTS) -c base/dolphin/os.c
@$(CC) -Os $(OPTS) -c base/memcpy.S
@$(CC) -Os $(OPTS) -o gcloader-v2.eth.elf -T base/base.ld -T base/common.ld -T base/dolphin/os.ld base.o emulator.o emulator_eth.o frag.o interrupt.o ipl.o gcloader.o enc28j60.o uart.o os.o memcpy.o
@mkdir -p $(DISASM)
@$(OBJDUMP) -D gcloader-v2.eth.elf > $(DISASM)/gcloader-v2.eth.txt
@$(OBJCOPY) -O binary --set-section-flags .bss.*=alloc,load,contents gcloader-v2.eth.elf gcloader-v2.eth.bin
@$(BIN2S) -H $(DEST)/gcloader_v2_eth_bin.h gcloader-v2.eth.bin > $(DEST)/gcloader-v2.eth.bin.s
@rm -f *.bin *.elf *.o
52 changes: 31 additions & 21 deletions cube/patches/base/emulator.c
Original file line number Diff line number Diff line change
Expand Up @@ -349,12 +349,14 @@ static void exi_read(unsigned index, uint32_t *value)

switch (index % 5) {
case 0:
if (chan == *VAR_EXI_SLOT)
mask |= 0b01000000000000;
if (chan == EXI_CHANNEL_0 && (dev & (1 << EXI_DEVICE_2)))
*value = exi.reg[chan].cpr | (EXI[chan][0] & ~(mask | 0b00001111111100));
mask |= 0b00001111111100;
else if (chan == EXI_CHANNEL_2)
*value = exi.reg[chan].cpr | (EXI[chan][0] & ~(mask | 0b00000000000011));
else
*value = exi.reg[chan].cpr | (EXI[chan][0] & ~mask);
mask |= 0b00000000000011;

*value = exi.reg[chan].cpr | (EXI[chan][0] & ~mask);
break;
case 1 ... 4:
if (chan == EXI_CHANNEL_0 && (dev & (1 << EXI_DEVICE_2)))
Expand Down Expand Up @@ -386,12 +388,19 @@ static void exi_write(unsigned index, uint32_t value)

dev2 = (exi.reg[chan].cpr >> 7) & 0b111;

if (chan == *VAR_EXI_SLOT) {
if ((dev | dev2) & (1 << EXI_DEVICE_0))
mask |= 0b00001110000000;
if (~dev & dev2)
end_read();
}

if (chan == EXI_CHANNEL_0 && ((dev | dev2) & (1 << EXI_DEVICE_2)))
EXI[chan][0] = (value & ~(mask | 0b00001111111100)) | (EXI[chan][0] & mask2);
mask |= 0b00001111111100;
else if (chan == EXI_CHANNEL_2)
EXI[chan][0] = (value & ~(mask | 0b00000000000011)) | (EXI[chan][0] & mask2);
else
EXI[chan][0] = (value & ~mask) | (EXI[chan][0] & mask2);
mask |= 0b00000000000011;

EXI[chan][0] = (value & ~mask) | (EXI[chan][0] & mask2);

if (chan == EXI_CHANNEL_0) {
if ((~dev & dev2) & (1 << EXI_DEVICE_2))
Expand Down Expand Up @@ -451,14 +460,14 @@ static void exi_read(unsigned index, uint32_t *value)

switch (index % 5) {
case 0:
#ifdef USB
if (chan == *VAR_EXI_SLOT || chan == EXI_CHANNEL_1)
#else
if (chan == *VAR_EXI_SLOT)
mask |= 0b01000000000000;
#ifdef USB
if (chan == EXI_CHANNEL_1)
mask |= 0b01000000000000;
#endif
*value = EXI[chan][0] & ~(mask | 0b01000000000000);
else
*value = EXI[chan][0] & ~mask;

*value = EXI[chan][0] & ~mask;
break;
default:
*value = (*EXI)[index];
Expand All @@ -480,19 +489,20 @@ static void exi_write(unsigned index, uint32_t value)
dev2 = (value >> 7) & 0b111;

if (~dev & dev2) {
if (chan == *VAR_EXI_SLOT) {
if (dev2 & (1 << EXI_DEVICE_0))
mask |= 0b00001110000000;
end_read();
}

#ifdef BBA
if (chan == EXI_CHANNEL_0 && (dev2 & (1 << EXI_DEVICE_2)))
value &= ~0b00001110000000;
mask |= 0b00001110000000;
#endif
#ifdef USB
if (chan == EXI_CHANNEL_1 && (dev2 & (1 << EXI_DEVICE_0)))
value &= ~0b00001110000000;
mask |= 0b00001110000000;
#endif
if (chan == *VAR_EXI_SLOT) {
if (dev2 & (1 << EXI_DEVICE_0))
value &= ~0b00001110000000;
end_read();
}
}

EXI[chan][0] = (value & ~mask) | (EXI[chan][0] & mask2);
Expand Down
4 changes: 2 additions & 2 deletions cube/reservedarea.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@
.set VAR_IGR_EXIT_TYPE, 0x09BB # IGR exit type
.set VAR_FRAG_LIST, 0x09BC # pointer to fragments (u32 offset, u32 size, u32 rawsector)

.set VAR_DISC_1_ID, 0x09C0 # disc 1 header
.set VAR_DISC_2_ID, 0x09CA # disc 2 header
.set VAR_DISC_1_ID, 0x09CC # disc 1 header
.set VAR_DISC_2_ID, 0x09D6 # disc 2 header

.set VAR_CLIENT_MAC, 0x09C0 # client MAC address
.set VAR_ROUTER_MAC, 0x09C6 # router MAC address
Expand Down
4 changes: 2 additions & 2 deletions cube/reservedarea.ld
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ VAR_ATA_LBA48 = VAR_AREA + 0x09BA; /* Is the HDD in use a 48 bit LBA supported
VAR_IGR_TYPE = VAR_AREA + 0x09BB; /* IGR exit type */
VAR_FRAG_LIST = VAR_AREA + 0x09BC; /* pointer to fragments (u32 offset, u32 size, u32 rawsector) */

VAR_DISC_1_ID = VAR_AREA + 0x09C0; /* disc 1 header */
VAR_DISC_2_ID = VAR_AREA + 0x09CA; /* disc 2 header */
VAR_DISC_1_ID = VAR_AREA + 0x09CC; /* disc 1 header */
VAR_DISC_2_ID = VAR_AREA + 0x09D6; /* disc 2 header */

VAR_NETWORK_ENV = VAR_AREA + 0x09C0; /* network environment variables */
VAR_CLIENT_MAC = VAR_AREA + 0x09C0; /* client MAC address */
Expand Down
2 changes: 2 additions & 0 deletions cube/swiss/include/patcher.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ typedef struct FuncPattern
#include "sd_bin.h"
#include "sd_card_bin.h"
#include "sd_dtk_bin.h"
#include "sd_eth_bin.h"
#include "ideexi_v1_bin.h"
#include "ideexi_v1_card_bin.h"
#include "ideexi_v1_dtk_bin.h"
Expand All @@ -45,6 +46,7 @@ typedef struct FuncPattern
#include "gcloader_v2_bin.h"
#include "gcloader_v2_card_bin.h"
#include "gcloader_v2_dtk_bin.h"
#include "gcloader_v2_eth_bin.h"

/* SDK patches */
#include "backwards_memcpy_bin.h"
Expand Down
14 changes: 9 additions & 5 deletions cube/swiss/source/bba.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,19 @@ void init_network(void *args) {
net_initialized = 0;
}

deviceHandler_setDeviceAvailable(&__device_smb, deviceHandler_SMB_test());
deviceHandler_setDeviceAvailable(&__device_ftp, deviceHandler_FTP_test());
deviceHandler_setDeviceAvailable(&__device_fsp, deviceHandler_FSP_test());

if(if_nametoindex("E20") == 1) {
__device_gcloader.emulable |= EMU_ETHERNET;
__device_ata_c.emulable |= EMU_ETHERNET;
__device_sd_c.emulable |= EMU_ETHERNET;
__device_sd_a.emulable |= EMU_ETHERNET;
__device_sd_b.emulable |= EMU_ETHERNET;
__device_ata_a.emulable |= EMU_ETHERNET;
__device_ata_b.emulable |= EMU_ETHERNET;
__device_ata_c.emulable |= EMU_ETHERNET;
}

deviceHandler_setDeviceAvailable(&__device_smb, deviceHandler_SMB_test());
deviceHandler_setDeviceAvailable(&__device_ftp, deviceHandler_FTP_test());
deviceHandler_setDeviceAvailable(&__device_fsp, deviceHandler_FSP_test());
}
}

Expand Down
2 changes: 0 additions & 2 deletions cube/swiss/source/devices/fat/deviceHandler-FAT.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
#include "swiss.h"
#include "main.h"
#include "ata.h"
#include "bba.h"
#include "patcher.h"
#include "dvd.h"

Expand Down Expand Up @@ -307,7 +306,6 @@ s32 deviceHandler_FAT_setupFile(file_handle* file, file_handle* file2, Executabl
// Is the HDD in use a 48 bit LBA supported HDD?
*(vu8*)VAR_ATA_LBA48 = ataDriveInfo.lba48Support;
}
net_get_mac_address(VAR_CLIENT_MAC);
return 1;
}

Expand Down
1 change: 0 additions & 1 deletion cube/swiss/source/devices/fsp/deviceHandler-FSP.c
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,6 @@ s32 deviceHandler_FSP_setupFile(file_handle* file, file_handle* file2, Executabl
memcpy(&arpreq.arp_pa, &addr, addrlen);
net_ioctl(fsp_session->fd, SIOCGARP, &arpreq);

net_get_mac_address(VAR_CLIENT_MAC);
memcpy(VAR_ROUTER_MAC, arpreq.arp_ha.sa_data, sizeof(VAR_ROUTER_MAC));
*(vu32*)VAR_CLIENT_IP = local_ip;
*(vu32*)VAR_ROUTER_IP = gateway;
Expand Down
2 changes: 2 additions & 0 deletions cube/swiss/source/devices/gcloader/deviceHandler-gcloader.c
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,8 @@ u32 deviceHandler_GCLoader_emulated() {
return EMU_READ | EMU_AUDIO_STREAMING;
else if (swissSettings.emulateReadSpeed)
return EMU_READ | EMU_READ_SPEED;
else if (swissSettings.emulateEthernet && (devices[DEVICE_CUR]->emulable & EMU_ETHERNET))
return EMU_READ | EMU_ETHERNET;
else if (swissSettings.emulateMemoryCard &&
!(swissSettings.audioStreaming && (devices[DEVICE_CUR]->quirks & QUIRK_GCLOADER_WRITE_CONFLICT)))
return EMU_READ | EMU_MEMCARD;
Expand Down

0 comments on commit 6a1559b

Please sign in to comment.