summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/arm/nds/libnds/source/common
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2008-04-16 18:37:33 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2008-04-16 18:37:33 +0000
commit311dfa65d823ebb1448a12e9a24d09c7ca7a9e2a (patch)
tree47eaf22ca7bb8cc68486ffe964abd54b535902ad /c/src/lib/libbsp/arm/nds/libnds/source/common
parent2008-04-16 Matthieu Bucchianeri <mbucchia@gmail.com> (diff)
downloadrtems-311dfa65d823ebb1448a12e9a24d09c7ca7a9e2a.tar.bz2
2008-04-16 Matthieu Bucchianeri <mbucchia@gmail.com>
* ChangeLog, Makefile.am, README, bsp_specs, configure.ac, mk_libnds.sh, patch.libnds, preinstall.am, block/block.c, clock/clock.c, console/console.c, coproc/coproc.S, coproc/coproc.c, coproc/coproc.ld, dswifi/dswifi_license.txt, dswifi/makefile, dswifi/arm7/makefile, dswifi/arm7/source/wifi_arm7.c, dswifi/arm7/source/wifi_arm7.h, dswifi/arm9/makefile, dswifi/arm9/source/sgIP.c, dswifi/arm9/source/sgIP.h, dswifi/arm9/source/sgIP_ARP.c, dswifi/arm9/source/sgIP_ARP.h, dswifi/arm9/source/sgIP_Config.h, dswifi/arm9/source/sgIP_DHCP.c, dswifi/arm9/source/sgIP_DHCP.h, dswifi/arm9/source/sgIP_DNS.c, dswifi/arm9/source/sgIP_DNS.h, dswifi/arm9/source/sgIP_Hub.c, dswifi/arm9/source/sgIP_Hub.h, dswifi/arm9/source/sgIP_ICMP.c, dswifi/arm9/source/sgIP_ICMP.h, dswifi/arm9/source/sgIP_IP.c, dswifi/arm9/source/sgIP_IP.h, dswifi/arm9/source/sgIP_TCP.c, dswifi/arm9/source/sgIP_TCP.h, dswifi/arm9/source/sgIP_UDP.c, dswifi/arm9/source/sgIP_UDP.h, dswifi/arm9/source/sgIP_memblock.c, dswifi/arm9/source/sgIP_memblock.h, dswifi/arm9/source/sgIP_sockets.c, dswifi/arm9/source/sgIP_sockets.h, dswifi/arm9/source/wifi_arm9.c, dswifi/arm9/source/wifi_arm9.h, dswifi/common/source/dsregs.h, dswifi/common/source/spinlock.h, dswifi/common/source/spinlock.s, dswifi/common/source/wifi_shared.h, dswifi/include/dswifi7.h, dswifi/include/dswifi9.h, dswifi/include/dswifi_version.h, dswifi/include/netdb.h, dswifi/include/sgIP_errno.h, dswifi/include/netinet/in.h, fb/fb.c, fb/fb.h, include/bsp.h, include/my_ipc.h, include/tm27.h, include/types.h, include/sys/iosupport.h, irq/irq.c, irq/irq.h, libfat/gba/include/fat.h, libfat/include/fat.h, libfat/nds/include/fat.h, libfat/source/bit_ops.h, libfat/source/cache.c, libfat/source/cache.h, libfat/source/common.h, libfat/source/directory.c, libfat/source/directory.h, libfat/source/fatdir.c, libfat/source/fatdir.h, libfat/source/fatfile.c, libfat/source/fatfile.h, libfat/source/file_allocation_table.c, libfat/source/file_allocation_table.h, libfat/source/filetime.c, libfat/source/filetime.h, libfat/source/libfat.c, libfat/source/mem_allocate.h, libfat/source/partition.c, libfat/source/partition.h, libfat/source/disc_io/disc.c, libfat/source/disc_io/disc.h, libfat/source/disc_io/disc_io.h, libfat/source/disc_io/io_cf_common.c, libfat/source/disc_io/io_cf_common.h, libfat/source/disc_io/io_dldi.h, libfat/source/disc_io/io_dldi.s, libfat/source/disc_io/io_efa2.c, libfat/source/disc_io/io_efa2.h, libfat/source/disc_io/io_fcsr.c, libfat/source/disc_io/io_fcsr.h, libfat/source/disc_io/io_m3_common.c, libfat/source/disc_io/io_m3_common.h, libfat/source/disc_io/io_m3cf.c, libfat/source/disc_io/io_m3cf.h, libfat/source/disc_io/io_m3sd.c, libfat/source/disc_io/io_m3sd.h, libfat/source/disc_io/io_mpcf.c, libfat/source/disc_io/io_mpcf.h, libfat/source/disc_io/io_njsd.c, libfat/source/disc_io/io_njsd.h, libfat/source/disc_io/io_nmmc.c, libfat/source/disc_io/io_nmmc.h, libfat/source/disc_io/io_sc_common.c, libfat/source/disc_io/io_sc_common.h, libfat/source/disc_io/io_sccf.c, libfat/source/disc_io/io_sccf.h, libfat/source/disc_io/io_scsd.c, libfat/source/disc_io/io_scsd.h, libfat/source/disc_io/io_scsd_s.s, libfat/source/disc_io/io_sd_common.c, libfat/source/disc_io/io_sd_common.h, libnds/Makefile.arm7, libnds/Makefile.arm9, libnds/libnds_license.txt, libnds/basicARM7/source/defaultARM7.c, libnds/include/default_font_bin.h, libnds/include/gbfs.h, libnds/include/nds.h, libnds/include/nds/bios.h, libnds/include/nds/card.h, libnds/include/nds/dma.h, libnds/include/nds/interrupts.h, libnds/include/nds/ipc.h, libnds/include/nds/jtypes.h, libnds/include/nds/memory.h, libnds/include/nds/registers_alt.h, libnds/include/nds/reload.h, libnds/include/nds/system.h, libnds/include/nds/timers.h, libnds/include/nds/arm7/audio.h, libnds/include/nds/arm7/clock.h, libnds/include/nds/arm7/serial.h, libnds/include/nds/arm7/touch.h, libnds/include/nds/arm9/background.h, libnds/include/nds/arm9/boxtest.h, libnds/include/nds/arm9/cache.h, libnds/include/nds/arm9/console.h, libnds/include/nds/arm9/exceptions.h, libnds/include/nds/arm9/image.h, libnds/include/nds/arm9/input.h, libnds/include/nds/arm9/math.h, libnds/include/nds/arm9/ndsmotion.h, libnds/include/nds/arm9/pcx.h, libnds/include/nds/arm9/postest.h, libnds/include/nds/arm9/rumble.h, libnds/include/nds/arm9/sound.h, libnds/include/nds/arm9/sprite.h, libnds/include/nds/arm9/trig_lut.h, libnds/include/nds/arm9/video.h, libnds/include/nds/arm9/videoGL.h, libnds/source/arm7/audio.c, libnds/source/arm7/clock.c, libnds/source/arm7/microphone.c, libnds/source/arm7/spi.c, libnds/source/arm7/touch.c, libnds/source/arm7/userSettings.c, libnds/source/arm9/COS.bin, libnds/source/arm9/COS.s, libnds/source/arm9/SIN.bin, libnds/source/arm9/SIN.s, libnds/source/arm9/TAN.bin, libnds/source/arm9/TAN.s, libnds/source/arm9/boxtest.c, libnds/source/arm9/console.c, libnds/source/arm9/dcache.s, libnds/source/arm9/default_font.bin, libnds/source/arm9/default_font.s, libnds/source/arm9/exceptionHandler.S, libnds/source/arm9/exceptionHandler.s, libnds/source/arm9/exceptions.c, libnds/source/arm9/gurumeditation.c, libnds/source/arm9/icache.s, libnds/source/arm9/image.c, libnds/source/arm9/initSystem.c, libnds/source/arm9/keys.c, libnds/source/arm9/ndsmotion.c, libnds/source/arm9/pcx.c, libnds/source/arm9/rumble.c, libnds/source/arm9/sound.c, libnds/source/arm9/system.c, libnds/source/arm9/touch.c, libnds/source/arm9/video.c, libnds/source/arm9/videoGL.c, libnds/source/common/biosCalls.s, libnds/source/common/card.c, libnds/source/common/gbfs.c, libnds/source/common/interruptDispatcher.s, libnds/source/common/interrupts.c, rtc/rtc.c, sound/sound.c, sound/sound.h, start/start.S, startup/linkcmds, startup/start.c, timer/timer.c, tools/Makefile.am, tools/bin2s, tools/bin2s.c, tools/configure.ac, tools/runtest, tools/ndstool/include/arm7_sha1_homebrew.h, tools/ndstool/include/arm7_sha1_nintendo.h, tools/ndstool/include/banner.h, tools/ndstool/include/bigint.h, tools/ndstool/include/crc.h, tools/ndstool/include/default_icon.h, tools/ndstool/include/encryption.h, tools/ndstool/include/header.h, tools/ndstool/include/hook.h, tools/ndstool/include/little.h, tools/ndstool/include/loadme.h, tools/ndstool/include/logo.h, tools/ndstool/include/ndscreate.h, tools/ndstool/include/ndsextract.h, tools/ndstool/include/ndstool.h, tools/ndstool/include/ndstree.h, tools/ndstool/include/overlay.h, tools/ndstool/include/passme.h, tools/ndstool/include/passme_sram.h, tools/ndstool/include/passme_vhd1.h, tools/ndstool/include/passme_vhd2.h, tools/ndstool/include/raster.h, tools/ndstool/include/sha1.h, tools/ndstool/include/types.h, tools/ndstool/source/arm7_sha1_homebrew.c, tools/ndstool/source/arm7_sha1_nintendo.c, tools/ndstool/source/banner.cpp, tools/ndstool/source/bigint.cpp, tools/ndstool/source/compile_date.c, tools/ndstool/source/crc.cpp, tools/ndstool/source/default_icon.c, tools/ndstool/source/encryption.cpp, tools/ndstool/source/header.cpp, tools/ndstool/source/hook.cpp, tools/ndstool/source/loadme.c, tools/ndstool/source/logo.cpp, tools/ndstool/source/ndscodes.cpp, tools/ndstool/source/ndscreate.cpp, tools/ndstool/source/ndsextract.cpp, tools/ndstool/source/ndstool.cpp, tools/ndstool/source/ndstree.cpp, tools/ndstool/source/passme.cpp, tools/ndstool/source/passme_sram.c, tools/ndstool/source/raster.cpp, tools/ndstool/source/sha1.cpp, touchscreen/README.reco, touchscreen/parser.c, touchscreen/reco.c, touchscreen/reco.h, touchscreen/touchscreen.c, touchscreen/touchscreen.h, wifi/compat.c, wifi/compat.h, wifi/wifi.c: New files.
Diffstat (limited to '')
-rw-r--r--c/src/lib/libbsp/arm/nds/libnds/source/common/biosCalls.s352
-rw-r--r--c/src/lib/libbsp/arm/nds/libnds/source/common/card.c394
-rw-r--r--c/src/lib/libbsp/arm/nds/libnds/source/common/gbfs.c221
-rw-r--r--c/src/lib/libbsp/arm/nds/libnds/source/common/interruptDispatcher.s152
-rw-r--r--c/src/lib/libbsp/arm/nds/libnds/source/common/interrupts.c178
5 files changed, 1297 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/arm/nds/libnds/source/common/biosCalls.s b/c/src/lib/libbsp/arm/nds/libnds/source/common/biosCalls.s
new file mode 100644
index 0000000000..a59debef6c
--- /dev/null
+++ b/c/src/lib/libbsp/arm/nds/libnds/source/common/biosCalls.s
@@ -0,0 +1,352 @@
+/*---------------------------------------------------------------------------------
+ $Id$
+
+ Copyright (C) 2005
+ Michael Noland (joat)
+ Jason Rogers (dovoto)
+ Dave Murphy (WinterMute)
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any
+ damages arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any
+ purpose, including commercial applications, and to alter it and
+ redistribute it freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you
+ must not claim that you wrote the original software. If you use
+ this software in a product, an acknowledgment in the product
+ documentation would be appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and
+ must not be misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source
+ distribution.
+
+ $Log$
+ Revision 1.5 2006/03/15 12:37:14 wntrmute
+ reformatted for legibility
+ grouped arm7 and arm9 specific code
+
+ Revision 1.4 2006/03/03 07:20:14 joatski
+ Fixed a couple of little bugs (e.g. swiSetHaltCR using r0 instead of r2 on ARM7)
+ Commented out ARM7 swis in ARM9 mode, and vis versa
+
+ Revision 1.3 2006/01/17 00:13:36 dovoto
+ Fixed swi 08 so lable and global matched "swiChangeSoundBias"
+
+ Revision 1.2 2005/09/03 13:47:13 wntrmute
+ added logging to header
+ reformatted for legibility
+
+
+---------------------------------------------------------------------------------*/
+
+ .text
+ .align 4
+
+ .thumb
+
+@---------------------------------------------------------------------------------
+ .global swiSoftReset
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiSoftReset:
+@---------------------------------------------------------------------------------
+ swi 0x00
+ bx lr
+
+
+@---------------------------------------------------------------------------------
+ .global swiDelay
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiDelay:
+@---------------------------------------------------------------------------------
+ swi 0x03
+ bx lr
+
+@---------------------------------------------------------------------------------
+ .global swiIntrWait
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiIntrWait:
+@---------------------------------------------------------------------------------
+ swi 0x04
+ bx lr
+
+
+@---------------------------------------------------------------------------------
+ .global swiWaitForVBlank
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiWaitForVBlank:
+@---------------------------------------------------------------------------------
+ swi 0x05
+ bx lr
+
+@---------------------------------------------------------------------------------
+ .global swiSleep
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiSleep:
+@---------------------------------------------------------------------------------
+ swi 0x07
+ bx lr
+
+@---------------------------------------------------------------------------------
+ .global swiChangeSoundBias
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiChangeSoundBias:
+@---------------------------------------------------------------------------------
+ swi 0x08
+ bx lr
+
+@---------------------------------------------------------------------------------
+ .global swiDivide
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiDivide:
+@---------------------------------------------------------------------------------
+ swi 0x09
+ bx lr
+
+@---------------------------------------------------------------------------------
+ .global swiRemainder
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiRemainder:
+@---------------------------------------------------------------------------------
+ swi 0x09
+ mov r0, r1
+ bx lr
+
+@---------------------------------------------------------------------------------
+ .global swiDivMod
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiDivMod:
+@---------------------------------------------------------------------------------
+ push {r2, r3}
+ swi 0x09
+ pop {r2, r3}
+ str r0, [r2]
+ str r1, [r3]
+ bx lr
+
+@---------------------------------------------------------------------------------
+ .global swiCopy
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiCopy:
+@---------------------------------------------------------------------------------
+ swi 0x0B
+ bx lr
+
+@---------------------------------------------------------------------------------
+ .global swiFastCopy
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiFastCopy:
+@---------------------------------------------------------------------------------
+ swi 0x0C
+ bx lr
+
+@---------------------------------------------------------------------------------
+ .global swiSqrt
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiSqrt:
+@---------------------------------------------------------------------------------
+ swi 0x0D
+ bx lr
+
+@---------------------------------------------------------------------------------
+ .global swiCRC16
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiCRC16:
+@---------------------------------------------------------------------------------
+ swi 0x0E
+ bx lr
+
+@---------------------------------------------------------------------------------
+ .global swiIsDebugger
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiIsDebugger:
+@---------------------------------------------------------------------------------
+ swi 0x0F
+ bx lr
+
+@---------------------------------------------------------------------------------
+ .global swiUnpackBits
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiUnpackBits:
+@---------------------------------------------------------------------------------
+ swi 0x10
+ bx lr
+
+@---------------------------------------------------------------------------------
+ .global swiDecompressLZSSWram
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiDecompressLZSSWram:
+@---------------------------------------------------------------------------------
+ swi 0x11
+ bx lr
+
+@---------------------------------------------------------------------------------
+ .global swiDecompressLZSSVram
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiDecompressLZSSVram:
+@---------------------------------------------------------------------------------
+ swi 0x12
+ bx lr
+
+@---------------------------------------------------------------------------------
+ .global swiDecompressHuffman
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiDecompressHuffman:
+@---------------------------------------------------------------------------------
+ swi 0x13
+ bx lr
+
+@---------------------------------------------------------------------------------
+ .global swiDecompressRLEWram
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiDecompressRLEWram:
+@---------------------------------------------------------------------------------
+ swi 0x14
+ bx lr
+
+@---------------------------------------------------------------------------------
+ .global swiDecompressRLEVram
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiDecompressRLEVram:
+@---------------------------------------------------------------------------------
+ swi 0x15
+ bx lr
+
+@---------------------------------------------------------------------------------
+@ ARM7 only bios calls
+@---------------------------------------------------------------------------------
+#ifdef ARM7
+
+@---------------------------------------------------------------------------------
+ .global swiHalt
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiHalt:
+@---------------------------------------------------------------------------------
+ swi 0x06
+ bx lr
+
+@---------------------------------------------------------------------------------
+ .global swiGetSineTable
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiGetSineTable:
+@---------------------------------------------------------------------------------
+ swi 0x1A
+ bx lr
+
+@---------------------------------------------------------------------------------
+ .global swiGetPitchTable
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiGetPitchTable:
+@---------------------------------------------------------------------------------
+ swi 0x1B
+ bx lr
+
+@---------------------------------------------------------------------------------
+ .global swiGetVolumeTable
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiGetVolumeTable:
+@---------------------------------------------------------------------------------
+ swi 0x1C
+ bx lr
+
+
+@ ARM7 function, but no real point in exposing it, at least not
+@ without adding a way to get the 3 arguments back into C
+@ .global swiGetFptrs
+@ .thumb_func
+@swiGetFptrs:
+@ swi 0x1D
+@ bx lr
+
+
+@---------------------------------------------------------------------------------
+ .global swiSwitchToGBAMode
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiSwitchToGBAMode:
+@---------------------------------------------------------------------------------
+ mov r0, #0x40
+ swi 0x1F
+@ does not return, of course
+
+@---------------------------------------------------------------------------------
+ .global swiSetHaltCR
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiSetHaltCR:
+@---------------------------------------------------------------------------------
+ mov r2, r0
+ swi 0x1F
+ bx lr
+
+#endif // ARM7
+
+@---------------------------------------------------------------------------------
+@ ARM9 only bios calls
+@---------------------------------------------------------------------------------
+#ifdef ARM9
+
+@---------------------------------------------------------------------------------
+ .global swiWaitForIRQ
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiWaitForIRQ:
+@---------------------------------------------------------------------------------
+ swi 0x06
+ bx lr
+
+@---------------------------------------------------------------------------------
+ .global swiDecodeDelta8
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiDecodeDelta8:
+@---------------------------------------------------------------------------------
+ swi 0x16
+ bx lr
+
+@---------------------------------------------------------------------------------
+ .global swiDecodeDelta16
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiDecodeDelta16:
+@---------------------------------------------------------------------------------
+ swi 0x18
+ bx lr
+
+@---------------------------------------------------------------------------------
+ .global swiSetHaltCR
+ .thumb_func
+@---------------------------------------------------------------------------------
+swiSetHaltCR:
+@---------------------------------------------------------------------------------
+ swi 0x1F
+ bx lr
+
+#endif // ARM9
+
diff --git a/c/src/lib/libbsp/arm/nds/libnds/source/common/card.c b/c/src/lib/libbsp/arm/nds/libnds/source/common/card.c
new file mode 100644
index 0000000000..8aad2d93aa
--- /dev/null
+++ b/c/src/lib/libbsp/arm/nds/libnds/source/common/card.c
@@ -0,0 +1,394 @@
+/*---------------------------------------------------------------------------------
+ $Id$
+
+ Copyright (C) 2005
+ Michael Noland (joat)
+ Jason Rogers (dovoto)
+ Dave Murphy (WinterMute)
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any
+ damages arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any
+ purpose, including commercial applications, and to alter it and
+ redistribute it freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you
+ must not claim that you wrote the original software. If you use
+ this software in a product, an acknowledgment in the product
+ documentation would be appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and
+ must not be misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source
+ distribution.
+
+
+---------------------------------------------------------------------------------*/
+#include "nds/card.h"
+#include "nds/dma.h"
+#include "nds/memory.h"
+
+
+//---------------------------------------------------------------------------------
+void cardWriteCommand(const uint8 * command) {
+//---------------------------------------------------------------------------------
+ int index;
+
+ CARD_CR1H = CARD_CR1_ENABLE | CARD_CR1_IRQ;
+
+ for (index = 0; index < 8; index++) {
+ CARD_COMMAND[7-index] = command[index];
+ }
+}
+
+
+//---------------------------------------------------------------------------------
+void cardPolledTransfer(uint32 flags, uint32 * destination, uint32 length, const uint8 * command) {
+//---------------------------------------------------------------------------------
+ u32 data;;
+ cardWriteCommand(command);
+ CARD_CR2 = flags;
+ uint32 * target = destination + length;
+ do {
+ // Read data if available
+ if (CARD_CR2 & CARD_DATA_READY) {
+ data=CARD_DATA_RD;
+ if (destination < target)
+ *destination = data;
+ destination++;
+ }
+ } while (CARD_CR2 & CARD_BUSY);
+}
+
+
+//---------------------------------------------------------------------------------
+void cardStartTransfer(const uint8 * command, uint32 * destination, int channel, uint32 flags) {
+//---------------------------------------------------------------------------------
+ cardWriteCommand(command);
+
+ // Set up a DMA channel to transfer a word every time the card makes one
+ DMA_SRC(channel) = (uint32)&CARD_DATA_RD;
+ DMA_DEST(channel) = (uint32)destination;
+ DMA_CR(channel) = DMA_ENABLE | DMA_START_CARD | DMA_32_BIT | DMA_REPEAT | DMA_SRC_FIX | 0x0001;;
+
+ CARD_CR2 = flags;
+}
+
+
+//---------------------------------------------------------------------------------
+uint32 cardWriteAndRead(const uint8 * command, uint32 flags) {
+//---------------------------------------------------------------------------------
+ cardWriteCommand(command);
+ CARD_CR2 = flags | CARD_ACTIVATE | CARD_nRESET | 0x07000000;
+ while (!(CARD_CR2 & CARD_DATA_READY)) ;
+ return CARD_DATA_RD;
+}
+
+
+//---------------------------------------------------------------------------------
+void cardRead00(uint32 address, uint32 * destination, uint32 length, uint32 flags) {
+//---------------------------------------------------------------------------------f
+ uint8 command[8];
+ command[7] = 0;
+ command[6] = (address >> 24) & 0xff;
+ command[5] = (address >> 16) & 0xff;
+ command[4] = (address >> 8) & 0xff;
+ command[3] = address & 0xff;
+ command[2] = 0;
+ command[1] = 0;
+ command[0] = 0;
+ cardPolledTransfer(flags, destination, length, command);
+}
+
+
+//---------------------------------------------------------------------------------
+void cardReadHeader(uint8 * header) {
+//---------------------------------------------------------------------------------
+ cardRead00(0, (uint32 *)header, 512, 0xA93F1FFF);
+}
+
+
+//---------------------------------------------------------------------------------
+int cardReadID(uint32 flags) {
+//---------------------------------------------------------------------------------
+ uint8 command[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90};
+ return cardWriteAndRead(command, flags);
+}
+
+
+//---------------------------------------------------------------------------------
+static inline void EepromWaitBusy() {
+//---------------------------------------------------------------------------------
+ while (CARD_CR1 & /*BUSY*/0x80);
+}
+
+//---------------------------------------------------------------------------------
+uint8 cardEepromReadID(uint8 i) {
+//---------------------------------------------------------------------------------
+ return cardEepromCommand(/*READID*/0xAB, i&1);
+}
+
+//---------------------------------------------------------------------------------
+uint8 cardEepromCommand(uint8 command, uint32 address) {
+//---------------------------------------------------------------------------------
+ uint8 retval;
+ int k;
+ CARD_CR1 = /*E*/0x8000 | /*SEL*/0x2000 | /*MODE*/0x40;
+
+ CARD_CR1 = 0xFFFF;
+ CARD_EEPDATA = command;
+
+ EepromWaitBusy();
+
+ CARD_EEPDATA = (address >> 16) & 0xFF;
+ EepromWaitBusy();
+
+ CARD_EEPDATA = (address >> 8) & 0xFF;
+ EepromWaitBusy();
+
+ CARD_EEPDATA = (address) & 0xFF;
+ EepromWaitBusy();
+
+ for(k=0;k<256;k++)
+ {
+ retval = CARD_EEPDATA;
+ if(retval!=0xFF)
+ break;
+ EepromWaitBusy();
+ }
+
+ CARD_CR1 = /*MODE*/0x40;
+ return retval;
+}
+
+//---------------------------------------------------------------------------------
+int cardEepromGetType(void)
+//---------------------------------------------------------------------------------
+{
+ uint8 c00;
+ uint8 c05;
+ uint8 c9f;
+ uint8 c03;
+
+#ifdef ARM9
+ sysSetBusOwners(BUS_OWNER_ARM9, BUS_OWNER_ARM9);
+#endif
+
+ c03=cardEepromCommand(0x03,0);
+ c05=cardEepromCommand(0x05,0);
+ c9f=cardEepromCommand(0x9f,0);
+ c00=cardEepromCommand(0x00,0);
+
+ if((c00==0x00) && (c9f==0x00)) return 0; // PassMe?
+ if((c00==0xff) && (c05==0xff) && (c9f==0xff))return -1;
+
+ if((c00==0xff) && (c05 & 0xFD) == 0xF0 && (c9f==0xff))return 1;
+ if((c00==0xff) && (c05 & 0xFD) == 0x00 && (c9f==0xff))return 2;
+ if((c00==0xff) && (c05 & 0xFD) == 0x00 && (c9f==0x00))return 3;
+ if((c00==0xff) && (c05 & 0xFD) == 0x00 && (c9f==0x12))return 3; // NEW TYPE 3
+ if((c00==0xff) && (c05 & 0xFD) == 0x00 && (c9f==0x13))return 3; // NEW TYPE 3+ 4Mbit
+ if((c00==0xff) && (c05 & 0xFD) == 0x00 && (c9f==0x14))return 3; // NEW TYPE 3++ 8Mbit MK4-FLASH Memory
+
+ return 0;
+}
+
+//---------------------------------------------------------------------------------
+uint32 cardEepromGetSize() {
+//---------------------------------------------------------------------------------
+
+ int type = cardEepromGetType();
+
+ if(type == -1)
+ return 0;
+ if(type == 0)
+ return 8192;
+ if(type == 1)
+ return 512;
+ if(type == 2) {
+ static const uint32 offset0 = (8*1024-1); // 8KB
+ static const uint32 offset1 = (2*8*1024-1); // 16KB
+ u8 buf1; // +0k data read -> write
+ u8 buf2; // +8k data read -> read
+ u8 buf3; // +0k ~data write
+ u8 buf4; // +8k data new comp buf2
+ cardReadEeprom(offset0,&buf1,1,type);
+ cardReadEeprom(offset1,&buf2,1,type);
+ buf3=~buf1;
+ cardWriteEeprom(offset0,&buf3,1,type);
+ cardReadEeprom (offset1,&buf4,1,type);
+ cardWriteEeprom(offset0,&buf1,1,type);
+ if(buf4!=buf2) // +8k
+ return 8*1024; // 8KB(64kbit)
+ else
+ return 64*1024; // 64KB(512kbit)
+ }
+ if(type == 3) {
+ uint8 c9f;
+ c9f=cardEepromCommand(0x9f,0);
+
+ if(c9f==0x14)
+ return 1024*1024; // NEW TYPE 3++ 8Mbit(1024KByte)
+
+ if(c9f==0x13)
+ return 512*1024; // NEW TYPE 3+ 4Mbit(512KByte)
+
+ return 256*1024; // TYPE 3 2Mbit(256KByte)
+ }
+
+ return 0;
+}
+
+
+//---------------------------------------------------------------------------------
+void cardReadEeprom(uint32 address, uint8 *data, uint32 length, uint32 addrtype) {
+//---------------------------------------------------------------------------------
+
+ CARD_CR1 = /*E*/0x8000 | /*SEL*/0x2000 | /*MODE*/0x40;
+ CARD_EEPDATA = 0x03 | ((addrtype == 1) ? address>>8<<3 : 0);
+ EepromWaitBusy();
+
+ if (addrtype == 3) {
+ CARD_EEPDATA = (address >> 16) & 0xFF;
+ EepromWaitBusy();
+ }
+
+ if (addrtype >= 2) {
+ CARD_EEPDATA = (address >> 8) & 0xFF;
+ EepromWaitBusy();
+ }
+
+
+ CARD_EEPDATA = (address) & 0xFF;
+ EepromWaitBusy();
+
+ while (length > 0) {
+ CARD_EEPDATA = 0;
+ EepromWaitBusy();
+ *data++ = CARD_EEPDATA;
+ length--;
+ }
+
+ EepromWaitBusy();
+ CARD_CR1 = /*MODE*/0x40;
+}
+
+
+//---------------------------------------------------------------------------------
+void cardWriteEeprom(uint32 address, uint8 *data, uint32 length, uint32 addrtype) {
+//---------------------------------------------------------------------------------
+
+ uint32 address_end = address + length;
+ int i;
+ int maxblocks = 32;
+ if(addrtype == 1) maxblocks = 16;
+ if(addrtype == 2) maxblocks = 32;
+ if(addrtype == 3) maxblocks = 256;
+
+ while (address < address_end) {
+ // set WEL (Write Enable Latch)
+ CARD_CR1 = /*E*/0x8000 | /*SEL*/0x2000 | /*MODE*/0x40;
+ CARD_EEPDATA = 0x06; EepromWaitBusy();
+ CARD_CR1 = /*MODE*/0x40;
+
+ // program maximum of 32 bytes
+ CARD_CR1 = /*E*/0x8000 | /*SEL*/0x2000 | /*MODE*/0x40;
+
+ if(addrtype == 1) {
+ // WRITE COMMAND 0x02 + A8 << 3
+ CARD_EEPDATA = 0x02 | (address & BIT(8)) >> (8-3) ;
+ EepromWaitBusy();
+ CARD_EEPDATA = address & 0xFF;
+ EepromWaitBusy();
+ }
+ else if(addrtype == 2) {
+ CARD_EEPDATA = 0x02;
+ EepromWaitBusy();
+ CARD_EEPDATA = address >> 8;
+ EepromWaitBusy();
+ CARD_EEPDATA = address & 0xFF;
+ EepromWaitBusy();
+ }
+ else if(addrtype == 3) {
+ CARD_EEPDATA = 0x02;
+ EepromWaitBusy();
+ CARD_EEPDATA = (address >> 16) & 0xFF;
+ EepromWaitBusy();
+ CARD_EEPDATA = (address >> 8) & 0xFF;
+ EepromWaitBusy();
+ CARD_EEPDATA = address & 0xFF;
+ EepromWaitBusy();
+ }
+
+ for (i=0; address<address_end && i<maxblocks; i++, address++) {
+ CARD_EEPDATA = *data++;
+ EepromWaitBusy();
+ }
+ CARD_CR1 = /*MODE*/0x40;
+
+ // wait programming to finish
+ CARD_CR1 = /*E*/0x8000 | /*SEL*/0x2000 | /*MODE*/0x40;
+ CARD_EEPDATA = 0x05; EepromWaitBusy();
+ do { CARD_EEPDATA = 0; EepromWaitBusy(); } while (CARD_EEPDATA & 0x01); // WIP (Write In Progress) ?
+ EepromWaitBusy();
+ CARD_CR1 = /*MODE*/0x40;
+ }
+}
+
+
+// Chip Erase : clear FLASH MEMORY (TYPE 3 ONLY)
+//---------------------------------------------------------------------------------
+void cardEepromChipErase(void) {
+//---------------------------------------------------------------------------------
+ int sz;
+ sz=cardEepromGetSize();
+ cardEepromSectorErase(0x00000);
+ cardEepromSectorErase(0x10000);
+ cardEepromSectorErase(0x20000);
+ cardEepromSectorErase(0x30000);
+ if(sz==512*1024)
+ {
+ cardEepromSectorErase(0x40000);
+ cardEepromSectorErase(0x50000);
+ cardEepromSectorErase(0x60000);
+ cardEepromSectorErase(0x70000);
+ }
+}
+
+// COMMAND Sec.erase 0xD8
+void cardEepromSectorErase(uint32 address)
+{
+ // set WEL (Write Enable Latch)
+ CARD_CR1 = /*E*/0x8000 | /*SEL*/0x2000 | /*MODE*/0x40;
+ CARD_EEPDATA = 0x06;
+ EepromWaitBusy();
+
+ CARD_CR1 = /*MODE*/0x40;
+
+ // SectorErase 0xD8
+ CARD_CR1 = /*E*/0x8000 | /*SEL*/0x2000 | /*MODE*/0x40;
+ CARD_EEPDATA = 0xD8;
+ EepromWaitBusy();
+ CARD_EEPDATA = (address >> 16) & 0xFF;
+ EepromWaitBusy();
+ CARD_EEPDATA = (address >> 8) & 0xFF;
+ EepromWaitBusy();
+ CARD_EEPDATA = address & 0xFF;
+ EepromWaitBusy();
+
+ CARD_CR1 = /*MODE*/0x40;
+
+ // wait erase to finish
+ CARD_CR1 = /*E*/0x8000 | /*SEL*/0x2000 | /*MODE*/0x40;
+ CARD_EEPDATA = 0x05;
+ EepromWaitBusy();
+
+ do
+ {
+ CARD_EEPDATA = 0;
+ EepromWaitBusy();
+ } while (CARD_EEPDATA & 0x01); // WIP (Write In Progress) ?
+ CARD_CR1 = /*MODE*/0x40;
+}
+
+
diff --git a/c/src/lib/libbsp/arm/nds/libnds/source/common/gbfs.c b/c/src/lib/libbsp/arm/nds/libnds/source/common/gbfs.c
new file mode 100644
index 0000000000..cc9348a4e8
--- /dev/null
+++ b/c/src/lib/libbsp/arm/nds/libnds/source/common/gbfs.c
@@ -0,0 +1,221 @@
+/*---------------------------------------------------------------------------------
+ $Id$
+
+ access object in a GBFS file
+
+ Copyright 2002-2005 Damian Yerrick
+
+ Additional code Dave Murphy
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+ OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ IN THE SOFTWARE.
+
+ $Log$
+ Revision 1.5 2006/05/05 05:32:06 wntrmute
+ consistency formatting
+
+ Revision 1.4 2006/02/25 02:31:12 wntrmute
+ tabs, not spaces
+
+ Revision 1.3 2005/09/20 04:59:44 wntrmute
+ *** empty log message ***
+
+ Revision 1.2 2005/08/23 17:06:10 wntrmute
+ converted all endings to unix
+
+ Revision 1.1 2005/08/04 17:55:44 wntrmute
+ added gbfs
+
+
+---------------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------------
+ This code assumes a LITTLE ENDIAN target. It'll need a boatload
+ of itohs and itohl calls if converted to run on Sega Genesis. It
+ also assumes that the target uses 16-bit short and 32-bit longs.
+---------------------------------------------------------------------------------*/
+
+#include <stdlib.h>
+#include <string.h>
+#include <nds/jtypes.h>
+#include "gbfs.h"
+
+/*---------------------------------------------------------------------------------
+ change this to the end of your ROM,
+ or to 0x02040000 for gba multiboot
+ or to 0x24000000 for nds main ram
+---------------------------------------------------------------------------------*/
+
+static const u32 * GBFS_1ST_SEARCH_LIMIT = (const u32 *)0x02400000;
+static const u32 * GBFS_2ND_SEARCH_START = (const u32 *)0x08000000;
+static const u32 * GBFS_2ND_SEARCH_LIMIT = (const u32 *)0x0a000000;
+/*---------------------------------------------------------------------------------
+ a power of two, less than or equal to the argument passed to
+ padbin. Increasing the stride makes find_first_gbfs_file()
+ faster at the cost of a slightly larger binary.
+---------------------------------------------------------------------------------*/
+static int GBFS_STRIDE = 256;
+
+/*---------------------------------------------------------------------------------
+ Set the search limits and stride for searching
+---------------------------------------------------------------------------------*/
+void gbfs_search_range(
+ u32 gbfs_1st_limit,
+ u32 gbfs_2nd_start, u32 gbfs_2nd_limit,
+ u32 gbfs_stride
+) {
+//---------------------------------------------------------------------------------
+ if ( NULL != gbfs_1st_limit ) GBFS_1ST_SEARCH_LIMIT = (u32 *)gbfs_1st_limit;
+ if ( NULL != gbfs_2nd_limit ) GBFS_2ND_SEARCH_LIMIT = (u32 *)gbfs_2nd_limit;
+ if ( NULL != gbfs_2nd_start ) GBFS_2ND_SEARCH_START = (u32 *)gbfs_2nd_start;
+ if ( NULL != gbfs_stride ) GBFS_STRIDE = gbfs_stride;
+
+}
+
+//---------------------------------------------------------------------------------
+const GBFS_FILE * find_first_gbfs_file(const void *start) {
+//---------------------------------------------------------------------------------
+ /* align the pointer */
+ const u32 *here = (const u32 *)
+ ((unsigned long)start & (-GBFS_STRIDE));
+ const char rest_of_magic[] = "ightGBFS\r\n\x1a\n";
+
+ /* Linear-search first in multiboot space. */
+ while(here < GBFS_1ST_SEARCH_LIMIT)
+ {
+ /* We have to keep the magic code in two pieces; otherwise,
+ this function may find itself and think it's a GBFS file.
+ This obviously won't work if your compiler stores this
+ numeric literal just before the literal string, but Devkit
+ Advance R4 and R5 seem to keep numeric constant pools
+ separate enough from string pools for this to work.
+ */
+ if(*here == 0x456e6950) { /* ASCII code for little endian "PinE" */
+ /* We've matched the first four bytes.
+ If the rest of the magic matches, then we've found a file. */
+ if(!memcmp(here + 1, rest_of_magic, 12))
+ return (const GBFS_FILE *)here;
+ }
+ here += GBFS_STRIDE / sizeof(here);
+ }
+
+ /* Now search in ROM space. */
+ if(here < GBFS_2ND_SEARCH_START)
+ here = GBFS_2ND_SEARCH_START;
+ while(here < GBFS_2ND_SEARCH_LIMIT) {
+ /* Search loop same as above. */
+ if(*here == 0x456e6950) { /* ASCII code for little endian "PinE" */
+ if(!memcmp(here + 1, rest_of_magic, 12))
+ return (const GBFS_FILE *)here;
+ }
+ here += GBFS_STRIDE / sizeof(*here);
+ }
+ return 0;
+}
+
+
+//---------------------------------------------------------------------------------
+const void *skip_gbfs_file(const GBFS_FILE *file) {
+//---------------------------------------------------------------------------------
+ return ((char *)file + file->total_len);
+}
+
+
+//---------------------------------------------------------------------------------
+static int namecmp(const void *a, const void *b) {
+//---------------------------------------------------------------------------------
+ return memcmp(a, b, 24);
+}
+
+
+//---------------------------------------------------------------------------------
+const void *gbfs_get_obj( const GBFS_FILE *file,
+ const char *name,
+ u32 *len) {
+//---------------------------------------------------------------------------------
+ char key[24] = {0};
+
+ const GBFS_ENTRY *dirbase = (const GBFS_ENTRY *)((const char *)file + file->dir_off);
+ size_t n_entries = file->dir_nmemb;
+ const GBFS_ENTRY *here;
+
+ strncpy(key, name, 24);
+
+ here = bsearch( key, dirbase,
+ n_entries, sizeof(GBFS_ENTRY),
+ namecmp);
+ if(!here)
+ return NULL;
+
+ if(len)
+ *len = here->len;
+ return (char *)file + here->data_offset;
+}
+
+
+//---------------------------------------------------------------------------------
+const void *gbfs_get_nth_obj( const GBFS_FILE *file,
+ size_t n,
+ char *name,
+ u32 *len)
+//---------------------------------------------------------------------------------
+{
+ const GBFS_ENTRY *dirbase = (const GBFS_ENTRY *)((const char *)file + file->dir_off);
+ size_t n_entries = file->dir_nmemb;
+ const GBFS_ENTRY *here = dirbase + n;
+
+ if(n >= n_entries)
+ return NULL;
+
+ if(name) {
+ strncpy(name, here->name, 24);
+ name[24] = 0;
+ }
+
+ if(len)
+ *len = here->len;
+
+ return (char *)file + here->data_offset;
+}
+
+
+//---------------------------------------------------------------------------------
+void *gbfs_copy_obj( void *dst,
+ const GBFS_FILE *file,
+ const char *name) {
+//---------------------------------------------------------------------------------
+ u32 len;
+ const void *src = gbfs_get_obj(file, name, &len);
+
+ if(!src)
+ return NULL;
+
+ memcpy(dst, src, len);
+ return dst;
+}
+
+
+//---------------------------------------------------------------------------------
+size_t gbfs_count_objs(const GBFS_FILE *file) {
+//---------------------------------------------------------------------------------
+ return file ? file->dir_nmemb : 0;
+}
+
diff --git a/c/src/lib/libbsp/arm/nds/libnds/source/common/interruptDispatcher.s b/c/src/lib/libbsp/arm/nds/libnds/source/common/interruptDispatcher.s
new file mode 100644
index 0000000000..70b726e6e6
--- /dev/null
+++ b/c/src/lib/libbsp/arm/nds/libnds/source/common/interruptDispatcher.s
@@ -0,0 +1,152 @@
+/*---------------------------------------------------------------------------------
+ $Id$
+
+ Copyright (C) 2005
+ Dave Murphy (WinterMute)
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any
+ damages arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any
+ purpose, including commercial applications, and to alter it and
+ redistribute it freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you
+ must not claim that you wrote the original software. If you use
+ this software in a product, an acknowledgment in the product
+ documentation would be appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and
+ must not be misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source
+ distribution.
+
+ $Log$
+ Revision 1.10 2007/08/11 06:00:23 wntrmute
+ make nesting really work
+
+ Revision 1.9 2007/01/10 15:48:27 wntrmute
+ remove unused code
+
+ Revision 1.8 2006/12/16 09:10:02 wntrmute
+ acknowledge interrupt before calling handler
+
+ Revision 1.7 2006/04/26 05:11:31 wntrmute
+ rebase dtcm, take __irq_flags and __irq_vector from linker script
+ move arm7 irq vector & irq flags to actual locations
+
+ Revision 1.6 2006/04/23 18:19:15 wntrmute
+ reworked interrupt code to allow dtcm moving
+
+ Revision 1.5 2005/12/12 13:01:55 wntrmute
+ disable interrupts on return from user handler
+
+ Revision 1.4 2005/10/21 22:43:42 wntrmute
+ restore REG_IME on exit from null handler
+
+ Revision 1.3 2005/09/27 18:21:53 wntrmute
+ safer nested interrupt support
+
+ Revision 1.2 2005/09/04 16:37:01 wntrmute
+ check for NULL handler
+
+ Revision 1.1 2005/09/03 17:09:35 wntrmute
+ added interworking aware interrupt dispatcher
+
+
+---------------------------------------------------------------------------------*/
+
+#ifdef ARM7
+ .text
+#endif
+
+#ifdef ARM9
+ .section .itcm,"ax",%progbits
+#endif
+
+ .extern irqTable
+ .code 32
+
+ .global IntrMain
+@---------------------------------------------------------------------------------
+IntrMain:
+@---------------------------------------------------------------------------------
+ mov r3, #0x4000000 @ REG_BASE
+
+ ldr r1, [r3, #0x208] @ r1 = IME
+ str r3, [r3, #0x208] @ disable IME
+ mrs r0, spsr
+ stmfd sp!, {r0-r1,r3,lr} @ {spsr, IME, REG_BASE, lr_irq}
+
+ ldr r1, [r3,#0x210] @ REG_IE
+ ldr r2, [r3,#0x214] @ REG_IF
+ and r1,r1,r2
+
+ ldr r0,=__irq_flags @ defined by linker script
+
+ ldr r2,[r0]
+ orr r2,r2,r1
+ str r2,[r0]
+
+ ldr r2,=irqTable
+@---------------------------------------------------------------------------------
+findIRQ:
+@---------------------------------------------------------------------------------
+ ldr r0, [r2, #4]
+ cmp r0,#0
+ beq no_handler
+ ands r0, r0, r1
+ bne jump_intr
+ add r2, r2, #8
+ b findIRQ
+
+@---------------------------------------------------------------------------------
+no_handler:
+@---------------------------------------------------------------------------------
+ str r1, [r3, #0x0214] @ IF Clear
+ ldmfd sp!, {r0-r1,r3,lr} @ {spsr, IME, REG_BASE, lr_irq}
+ str r1, [r3, #0x208] @ restore REG_IME
+ mov pc,lr
+
+@---------------------------------------------------------------------------------
+jump_intr:
+@---------------------------------------------------------------------------------
+ ldr r1, [r2] @ user IRQ handler address
+ cmp r1, #0
+ bne got_handler
+ mov r1, r0
+ b no_handler
+@---------------------------------------------------------------------------------
+got_handler:
+@---------------------------------------------------------------------------------
+
+ mrs r2, cpsr
+ bic r2, r2, #0xdf @ \__
+ orr r2, r2, #0x1f @ / --> Enable IRQ & FIQ. Set CPU mode to System.
+ msr cpsr,r2
+
+ str r0, [r3, #0x0214] @ IF Clear
+
+ push {lr}
+ adr lr, IntrRet
+ bx r1
+
+@---------------------------------------------------------------------------------
+IntrRet:
+@---------------------------------------------------------------------------------
+ mov r3, #0x4000000 @ REG_BASE
+ str r3, [r3, #0x208] @ disable IME
+ pop {lr}
+
+ mrs r3, cpsr
+ bic r3, r3, #0xdf @ \__
+ orr r3, r3, #0x92 @ / --> Disable IRQ. Enable FIQ. Set CPU mode to IRQ.
+ msr cpsr, r3
+
+ ldmfd sp!, {r0-r1,r3,lr} @ {spsr, IME, REG_BASE, lr_irq}
+ msr spsr, r0 @ restore spsr
+ str r1, [r3, #0x208] @ restore REG_IME
+ mov pc,lr
+
+ .pool
+ .end
diff --git a/c/src/lib/libbsp/arm/nds/libnds/source/common/interrupts.c b/c/src/lib/libbsp/arm/nds/libnds/source/common/interrupts.c
new file mode 100644
index 0000000000..6d49e6f89f
--- /dev/null
+++ b/c/src/lib/libbsp/arm/nds/libnds/source/common/interrupts.c
@@ -0,0 +1,178 @@
+/*---------------------------------------------------------------------------------
+ $Id$
+
+ Copyright (C) 2005
+ Dave Murphy (WinterMute)
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any
+ damages arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any
+ purpose, including commercial applications, and to alter it and
+ redistribute it freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you
+ must not claim that you wrote the original software. If you use
+ this software in a product, an acknowledgment in the product
+ documentation would be appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and
+ must not be misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source
+ distribution.
+
+ $Log$
+ Revision 1.10 2007/02/06 12:00:32 wntrmute
+ use uint32 for irqEnable
+
+ Revision 1.9 2006/06/16 07:35:14 wntrmute
+ more moves to REG_ values
+ implement SetYtrigger helper function
+ set bits in REG_DISPSTAT for IRQ_VCOUNT
+
+ Revision 1.8 2006/02/21 00:12:35 wntrmute
+ clear interrupts and enable REG_IME in irqInit
+
+ Revision 1.7 2005/12/12 13:03:29 wntrmute
+ set/clear LCD interrupts in irqEnable/Disable
+
+ Revision 1.6 2005/11/07 01:11:08 wntrmute
+ more doxygen
+ moved IntrMain declaration to C file
+
+ Revision 1.5 2005/09/20 05:00:24 wntrmute
+ use new register definitions
+
+ Revision 1.4 2005/09/04 16:28:04 wntrmute
+ place irqTable in ewram
+
+ Revision 1.3 2005/09/03 17:09:35 wntrmute
+ added interworking aware interrupt dispatcher
+
+
+---------------------------------------------------------------------------------*/
+
+#include <nds/interrupts.h>
+#include <nds/system.h>
+
+void IntrMain(); // Prototype for assembly interrupt dispatcher
+
+//---------------------------------------------------------------------------------
+void irqDummy(void) {}
+//---------------------------------------------------------------------------------
+
+
+#ifdef ARM9
+#define INT_TABLE_SECTION __attribute__((section(".itcm")))
+#else
+#define INT_TABLE_SECTION
+#endif
+
+struct IntTable irqTable[MAX_INTERRUPTS] INT_TABLE_SECTION;
+
+//---------------------------------------------------------------------------------
+void irqSet(int mask, IntFn handler) {
+//---------------------------------------------------------------------------------
+ if (!mask) return;
+
+ int i;
+
+ for (i=0;i<MAX_INTERRUPTS;i++)
+ if (!irqTable[i].mask || irqTable[i].mask == mask) break;
+
+ if ( i == MAX_INTERRUPTS ) return;
+
+ irqTable[i].handler = handler;
+ irqTable[i].mask = mask;
+
+ if(mask & IRQ_VBLANK)
+ REG_DISPSTAT |= DISP_VBLANK_IRQ ;
+ if(mask & IRQ_HBLANK)
+ REG_DISPSTAT |= DISP_HBLANK_IRQ ;
+
+ REG_IE |= mask;
+}
+
+//---------------------------------------------------------------------------------
+void irqInit() {
+//---------------------------------------------------------------------------------
+ int i;
+
+ // Set all interrupts to dummy functions.
+ for(i = 0; i < MAX_INTERRUPTS; i ++)
+ {
+ irqTable[i].handler = irqDummy;
+ irqTable[i].mask = 0;
+ }
+
+ IRQ_HANDLER = IntrMain;
+
+ REG_IE = 0; // disable all interrupts
+ REG_IF = IRQ_ALL; // clear all pending interrupts
+ REG_IME = 1; // enable global interrupt
+
+}
+
+
+//---------------------------------------------------------------------------------
+void irqClear(int mask) {
+//---------------------------------------------------------------------------------
+ int i = 0;
+
+ for (i=0;i<MAX_INTERRUPTS;i++)
+ if (irqTable[i].mask == mask) break;
+
+ if ( i == MAX_INTERRUPTS ) return;
+
+ irqTable[i].handler = irqDummy;
+
+ if (mask & IRQ_VBLANK)
+ REG_DISPSTAT &= ~DISP_VBLANK_IRQ ;
+ if (mask & IRQ_HBLANK)
+ REG_DISPSTAT &= ~DISP_HBLANK_IRQ ;
+ if (mask & IRQ_VCOUNT)
+ REG_DISPSTAT &= ~DISP_YTRIGGER_IRQ;
+
+ REG_IE &= ~mask;
+}
+
+
+//---------------------------------------------------------------------------------
+void irqInitHandler(IntFn handler) {
+//---------------------------------------------------------------------------------
+ REG_IME = 0;
+ REG_IF = ~0;
+ REG_IE = 0;
+
+ IRQ_HANDLER = handler;
+
+ REG_IME = 1;
+}
+
+//---------------------------------------------------------------------------------
+void irqEnable(uint32 irq) {
+//---------------------------------------------------------------------------------
+ if (irq & IRQ_VBLANK)
+ REG_DISPSTAT |= DISP_VBLANK_IRQ ;
+ if (irq & IRQ_HBLANK)
+ REG_DISPSTAT |= DISP_HBLANK_IRQ ;
+ if (irq & IRQ_VCOUNT)
+ REG_DISPSTAT |= DISP_YTRIGGER_IRQ;
+
+ REG_IE |= irq;
+ REG_IME = 1;
+}
+
+//---------------------------------------------------------------------------------
+void irqDisable(uint32 irq) {
+//---------------------------------------------------------------------------------
+ if (irq & IRQ_VBLANK)
+ REG_DISPSTAT &= ~DISP_VBLANK_IRQ ;
+ if (irq & IRQ_HBLANK)
+ REG_DISPSTAT &= ~DISP_HBLANK_IRQ ;
+ if (irq & IRQ_VCOUNT)
+ REG_DISPSTAT &= ~DISP_YTRIGGER_IRQ;
+
+ REG_IE &= ~irq;
+}
+