JANITORIAL: Fix formatting

Futile attempt at taming the mess. There is also much leftover
unused code which someone who knows what all of this does should
remove, if possible.
This commit is contained in:
Adrian Frühwirth 2018-04-07 23:41:18 +02:00
parent 7f9c06f91a
commit 9dd582180b

View File

@ -26,7 +26,7 @@
// -- modified by Darkain and others
//////////////////////////////////////////////////////////////////////
//#define USE_LIBCARTRESET
// #define USE_LIBCARTRESET
#include <nds.h>
@ -37,7 +37,7 @@
#include <system.h>
#include <stdlib.h>
#include <string.h>
#include <registers_alt.h> // Needed for SOUND_CR
#include <registers_alt.h> // Needed for SOUND_CR
#include <NDS/scummvm_ipc.h>
//////////////////////////////////////////////////////////////////////
#ifdef USE_DEBUGGER
@ -54,8 +54,8 @@
#define SCREEN_HEIGHT 192
s32 TOUCH_WIDTH = TOUCH_CAL_X2 - TOUCH_CAL_X1;
s32 TOUCH_HEIGHT = TOUCH_CAL_Y2 - TOUCH_CAL_Y1;
s32 TOUCH_OFFSET_X = ( ((SCREEN_WIDTH -60) * TOUCH_CAL_X1) / TOUCH_WIDTH ) - 28;
s32 TOUCH_OFFSET_Y = ( ((SCREEN_HEIGHT-60) * TOUCH_CAL_Y1) / TOUCH_HEIGHT ) - 28;
s32 TOUCH_OFFSET_X = ( ((SCREEN_WIDTH - 60) * TOUCH_CAL_X1) / TOUCH_WIDTH ) - 28;
s32 TOUCH_OFFSET_Y = ( ((SCREEN_HEIGHT - 60) * TOUCH_CAL_Y1) / TOUCH_HEIGHT ) - 28;
vu8 *soundData;
@ -71,163 +71,157 @@ int temp;
int adpcmBufferNum = 0;
// those are pixel positions of the two points you click when calibrating
#define TOUCH_CNTRL_X1 (*(vu8 *)0x027FFCDC)
#define TOUCH_CNTRL_Y1 (*(vu8 *)0x027FFCDD)
#define TOUCH_CNTRL_X2 (*(vu8 *)0x027FFCE2)
#define TOUCH_CNTRL_Y2 (*(vu8 *)0x027FFCE3)
//////////////////////////////////////////////////////////////////////
#define TOUCH_CNTRL_X1 (*(vu8 *)0x027FFCDC)
#define TOUCH_CNTRL_Y1 (*(vu8 *)0x027FFCDD)
#define TOUCH_CNTRL_X2 (*(vu8 *)0x027FFCE2)
#define TOUCH_CNTRL_Y2 (*(vu8 *)0x027FFCE3)
/*
void startSound(int sampleRate, const void *data, uint32 bytes, u8 channel=0, u8 vol=0x7F, u8 pan=63, u8 format=0) {
SCHANNEL_TIMER(channel) = SOUND_FREQ(sampleRate);
SCHANNEL_SOURCE(channel) = (uint32)data;
SCHANNEL_LENGTH(channel) = bytes;
SCHANNEL_CR(channel) = SOUND_ENABLE | SOUND_ONE_SHOT | SOUND_VOL(vol) | SOUND_PAN(pan) | (format==1?SOUND_8BIT:SOUND_16BIT);
void startSound(int sampleRate, const void *data, uint32 bytes, u8 channel = 0, u8 vol = 0x7F, u8 pan = 63, u8 format = 0) {
SCHANNEL_TIMER(channel) = SOUND_FREQ(sampleRate);
SCHANNEL_SOURCE(channel) = (uint32)data;
SCHANNEL_LENGTH(channel) = bytes;
SCHANNEL_CR(channel) = SOUND_ENABLE | SOUND_ONE_SHOT | SOUND_VOL(vol) | SOUND_PAN(pan) | (format==1?SOUND_8BIT:SOUND_16BIT);
}
s8 getFreeSoundChannel() {
for (int i=0; i<16; i++) {
if ( (SCHANNEL_CR(i) & SOUND_ENABLE) == 0 ) return i;
}
return -1;
for (int i = 0; i < 16; i++) {
if ( (SCHANNEL_CR(i) & SOUND_ENABLE) == 0 )
return i;
}
return -1;
}
*/
s8 getFreeSoundChannel() {
// return 0;
for (int i=0; i<16; i++) {
if ( (SCHANNEL_CR(i) & SCHANNEL_ENABLE) == 0 ) return i;
}
return -1;
// return 0;
for (int i = 0; i < 16; i++) {
if ( (SCHANNEL_CR(i) & SCHANNEL_ENABLE) == 0 )
return i;
}
return -1;
}
void startSound(int sampleRate, const void *data, uint32 bytes, u8 channel=0, u8 vol=0x7F, u8 pan=63, u8 format=0) {
// REG_IME = IME_DISABLE;
void startSound(int sampleRate, const void *data, uint32 bytes, u8 channel = 0, u8 vol = 0x7F, u8 pan = 63, u8 format = 0) {
// REG_IME = IME_DISABLE;
channel = getFreeSoundChannel();
/* if (format == 2) {
channel = 1;
} else {
channel = 0;
}*/
channel = getFreeSoundChannel();
/*
if (format == 2) {
channel = 1;
} else {
channel = 0;
}
*/
if (channel > 1) channel = 1;
if (channel > 1)
channel = 1;
bytes &= ~7; // Multiple of 4 bytes!
// bytes += 4;
bytes &= ~7; // Multiple of 4 bytes!
// bytes += 4;
SCHANNEL_CR(channel) = 0;
SCHANNEL_TIMER(channel) = SOUND_FREQ(sampleRate);
SCHANNEL_SOURCE(channel) = ((uint32) (data));
SCHANNEL_LENGTH(channel) = ((bytes & 0x7FFFFFFF) >> 2);
SCHANNEL_REPEAT_POINT(channel) = 0;
SCHANNEL_CR(channel) = 0;
SCHANNEL_TIMER(channel) = SOUND_FREQ(sampleRate);
SCHANNEL_SOURCE(channel) = (uint32)data;
SCHANNEL_LENGTH(channel) = (bytes & 0x7FFFFFFF) >> 2;
SCHANNEL_REPEAT_POINT(channel) = 0;
SCHANNEL_CR(channel + 2) = 0;
SCHANNEL_TIMER(channel + 2) = SOUND_FREQ(sampleRate);
SCHANNEL_SOURCE(channel + 2) = ((uint32) (data));
SCHANNEL_LENGTH(channel + 2) = ((bytes & 0x7FFFFFFF) >> 2);
SCHANNEL_REPEAT_POINT(channel + 2) = 0;
SCHANNEL_CR(channel + 2) = 0;
SCHANNEL_TIMER(channel + 2) = SOUND_FREQ(sampleRate);
SCHANNEL_SOURCE(channel + 2) = (uint32)data;
SCHANNEL_LENGTH(channel + 2) = (bytes & 0x7FFFFFFF) >> 2;
SCHANNEL_REPEAT_POINT(channel + 2) = 0;
uint32 flags = SCHANNEL_ENABLE | SOUND_VOL(vol) | SOUND_PAN(pan);
uint32 flags = SCHANNEL_ENABLE | SOUND_VOL(vol) | SOUND_PAN(pan);
switch (format) {
switch (format) {
case 1: {
flags |= SOUND_FORMAT_8BIT;
flags |= SOUND_REPEAT;// | (1 << 15);
flags |= SOUND_REPEAT; // | (1 << 15);
break;
}
case 0: {
flags |= SOUND_FORMAT_16BIT;
flags |= SOUND_REPEAT;// | (1 << 15);
flags |= SOUND_REPEAT; // | (1 << 15);
break;
}
case 2: {
flags |= SOUND_FORMAT_ADPCM;
flags |= SOUND_ONE_SHOT;// | (1 << 15);
flags |= SOUND_ONE_SHOT; // | (1 << 15);
SCHANNEL_SOURCE(channel) = (unsigned int) IPC->adpcm.buffer[0];
//bytes += 32;
SCHANNEL_LENGTH(channel) = (((bytes + 4) & 0x7FFFFFFF) >> 2);
SCHANNEL_SOURCE(channel) = (unsigned int)IPC->adpcm.buffer[0];
// bytes += 32;
SCHANNEL_LENGTH(channel) = ((bytes + 4) & 0x7FFFFFFF) >> 2;
SCHANNEL_CR(channel + 1) = 0;
SCHANNEL_SOURCE(channel + 1) = (unsigned int) IPC->adpcm.buffer[0];
SCHANNEL_LENGTH(channel + 1) = (((bytes + 4) & 0x7FFFFFFF) >> 2);
SCHANNEL_TIMER(channel + 1) = SOUND_FREQ(sampleRate);
SCHANNEL_SOURCE(channel + 1) = (unsigned int)IPC->adpcm.buffer[0];
SCHANNEL_LENGTH(channel + 1) = ((bytes + 4) & 0x7FFFFFFF) >> 2;
SCHANNEL_TIMER(channel + 1) = SOUND_FREQ(sampleRate);
SCHANNEL_REPEAT_POINT(channel + 1) = 0;
SCHANNEL_CR(channel + 1) = flags;
temp = bytes;
adpcmBufferNum = 0;
break;
}
}
// if (bytes & 0x80000000) {
// flags |= SOUND_REPEAT;
// } else {
// }
soundData = (vu8 *) data;
SCHANNEL_CR(channel) = flags;
SCHANNEL_CR(channel + 2) = flags;
if (channel == 0) {
for (volatile int i = 0; i < 16384 * 2; i++) {
// Delay loop - this makes everything stay in sync!
}
TIMER0_CR = 0;
TIMER0_DATA = SOUND_FREQ(sampleRate) * 2;
TIMER0_CR = TIMER_ENABLE | TIMER_DIV_1;
/*
if (bytes & 0x80000000) {
flags |= SOUND_REPEAT;
} else {
}
*/
TIMER1_CR = 0;
TIMER1_DATA = 65536 - ((bytes & 0x7FFFFFFF) >> 3); // Trigger four times during the length of the buffer
TIMER1_CR = TIMER_ENABLE | TIMER_IRQ_REQ | TIMER_CASCADE;
soundData = (vu8 *)data;
playingSection = 0;
} else {
for (volatile int i = 0; i < 16384 * 2; i++) {
// Delay loop - this makes everything stay in sync!
SCHANNEL_CR(channel) = flags;
SCHANNEL_CR(channel + 2) = flags;
if (channel == 0) {
for (volatile int i = 0; i < 16384 * 2; i++) {
// Delay loop - this makes everything stay in sync!
}
TIMER0_CR = 0;
TIMER0_DATA = SOUND_FREQ(sampleRate) * 2;
TIMER0_CR = TIMER_ENABLE | TIMER_DIV_1;
TIMER1_CR = 0;
TIMER1_DATA = 65536 - ((bytes & 0x7FFFFFFF) >> 3); // Trigger four times during the length of the buffer
TIMER1_CR = TIMER_ENABLE | TIMER_IRQ_REQ | TIMER_CASCADE;
playingSection = 0;
} else {
for (volatile int i = 0; i < 16384 * 2; i++) {
// Delay loop - this makes everything stay in sync!
}
TIMER2_CR = 0;
TIMER2_DATA = SOUND_FREQ(sampleRate) * 2;
TIMER2_CR = TIMER_ENABLE | TIMER_DIV_1;
TIMER3_CR = 0;
TIMER3_DATA = 65536 - ((bytes & 0x7FFFFFFF) >> 3); // Trigger four times during the length of the buffer
TIMER3_CR = TIMER_ENABLE | TIMER_IRQ_REQ | TIMER_CASCADE;
for (int r = 0; r < 4; r++) {
// IPC->streamFillNeeded[r] = true;
}
IPC->streamPlayingSection = 0;
}
TIMER2_CR = 0;
TIMER2_DATA = SOUND_FREQ(sampleRate) * 2;
TIMER2_CR = TIMER_ENABLE | TIMER_DIV_1;
// IPC->fillSoundFirstHalf = true;
// IPC->fillSoundSecondHalf = true;
// soundFirstHalf = true;
TIMER3_CR = 0;
TIMER3_DATA = 65536 - ((bytes & 0x7FFFFFFF) >> 3); // Trigger four times during the length of the buffer
TIMER3_CR = TIMER_ENABLE | TIMER_IRQ_REQ | TIMER_CASCADE;
for (int r = 0; r < 4; r++) {
// IPC->streamFillNeeded[r] = true;
}
IPC->streamPlayingSection = 0;
}
// IPC->fillSoundFirstHalf = true;
// IPC->fillSoundSecondHalf = true;
// soundFirstHalf = true;
// REG_IME = IME_ENABLE;
// REG_IME = IME_ENABLE;
}
void stopSound(int chan) {
SCHANNEL_CR(chan) = 0;
SCHANNEL_CR(chan) = 0;
}
void DummyHandler() {
@ -235,146 +229,132 @@ void DummyHandler() {
}
void powerManagerWrite(uint32 command, u32 data, bool enable) {
uint16 result;
SerialWaitBusy();
uint16 result;
SerialWaitBusy();
// Write the command and wait for it to complete
REG_SPICNT = SPI_ENABLE | SPI_BAUD_1MHz | (1 << 11);
REG_SPIDATA = command | 0x80;
SerialWaitBusy();
// Write the command and wait for it to complete
REG_SPICNT = SPI_ENABLE | SPI_BAUD_1MHz | (1 << 11);
REG_SPIDATA = command | 0x80;
SerialWaitBusy();
// Write the second command and clock in the data
REG_SPICNT = SPI_ENABLE | SPI_BAUD_1MHz;
REG_SPIDATA = 0;
SerialWaitBusy();
// Write the second command and clock in the data
REG_SPICNT = SPI_ENABLE | SPI_BAUD_1MHz;
REG_SPIDATA = 0;
SerialWaitBusy();
result = REG_SPIDATA & 0xFF;
result = REG_SPIDATA & 0xFF;
// Write the command and wait for it to complete
REG_SPICNT = SPI_ENABLE | SPI_BAUD_1MHz | (1 << 11);
REG_SPIDATA = command;
SerialWaitBusy();
// Write the command and wait for it to complete
REG_SPICNT = SPI_ENABLE | SPI_BAUD_1MHz | (1 << 11);
REG_SPIDATA = command;
SerialWaitBusy();
// Write the second command and clock in the data
REG_SPICNT = SPI_ENABLE | SPI_BAUD_1MHz;
REG_SPIDATA = enable? (result | data): (result & ~data);
SerialWaitBusy();
// Write the second command and clock in the data
REG_SPICNT = SPI_ENABLE | SPI_BAUD_1MHz;
REG_SPIDATA = enable ? (result | data) : (result & ~data);
SerialWaitBusy();
}
/*
void performSleep() {
powerManagerWrite(0, 0x30, true);
powerManagerWrite(0, 0x30, true);
// Here, I set up a dummy interrupt handler, then trigger all interrupts.
// These are just aknowledged by the handler without doing anything else.
// Why? Because without it the sleep mode will only happen once, and then
// never again. I got the idea from reading the MoonShell source.
IME = 0;
u32 irq = (u32)IRQ_HANDLER;
IRQ_HANDLER = DummyHandler;
IF = ~0;
IME = 1;
// Here, I set up a dummy interrupt handler, then trigger all interrupts.
// These are just aknowledged by the handler without doing anything else.
// Why? Because without it the sleep mode will only happen once, and then
// never again. I got the idea from reading the MoonShell source.
IME = 0;
u32 irq = (u32) IRQ_HANDLER;
IRQ_HANDLER = DummyHandler;
IF = ~0;
IME = 1;
// Now save which interrupts are enabled, then set only the screens unfolding
// interrupt to be enabled, so that the first interrupt that happens is the
// one I want.
int saveInts = IE;
IE = IRQ_TIMER0; // Screens unfolding interrupt
// Now save which interrupts are enabled, then set only the screens unfolding
// interrupt to be enabled, so that the first interrupt that happens is the
// one I want.
int saveInts = IE;
// Now call the sleep function in the bios
bool b;
do {
TIMER0_CR = 0;
TIMER0_DATA = TIMER_FREQ(20);
TIMER0_CR = TIMER_ENABLE | TIMER_DIV_64;
swiDelay(100);
swiSleep();
IE = IRQ_TIMER0; // Screens unfolding interrupt
swiDelay(100);
// Now call the sleep function in the bios
bool b;
do {
TIMER0_CR = 0;
TIMER0_DATA = TIMER_FREQ(20);
TIMER0_CR = TIMER_ENABLE | TIMER_DIV_64;
powerManagerWrite(0, 0x30, b = !b);
} while (!(TIMER0_CR & TIMER_ENABLE));
swiDelay(100);
TIMER0_CR = 0;
swiSleep();
// We're back from sleep, now restore the interrupt state and IRQ handler
IRQ_HANDLER = (void (*)())irq;
IE = saveInts;
IF = ~0;
IME = 1;
swiDelay(100);
powerManagerWrite(0, 0x30, b = !b);
} while (!(TIMER0_CR & TIMER_ENABLE));
TIMER0_CR = 0;
// We're back from sleep, now restore the interrupt state and IRQ handler
IRQ_HANDLER = (void (*)()) irq;
IE = saveInts;
IF = ~0;
IME = 1;
powerManagerWrite(0, 0x30, false);
powerManagerWrite(0, 0x30, false);
}
*/
void performSleep() {
powerManagerWrite(0, 0x30, true);
powerManagerWrite(0, 0x30, true);
IPC->performArm9SleepMode = true; // Tell ARM9 to sleep
IPC->performArm9SleepMode = true; // Tell ARM9 to sleep
// u32 irq = (u32) IRQ_HANDLER;
// IRQ_HANDLER = DummyHandler;
// POWER_CR &= ~POWER_SOUND;
// u32 irq = (u32)IRQ_HANDLER;
// IRQ_HANDLER = DummyHandler;
// POWER_CR &= ~POWER_SOUND;
// int saveInts = REG_IE;
// REG_IE = (1 << 22) | IRQ_VBLANK; // Lid open
// *((u32 *) (0x0380FFF8)) = *((u32 *) (0x0380FFF8)) | (REG_IE & REG_IF);
// VBLANK_INTR_WAIT_FLAGS = IRQ_VBLANK;
// int saveInts = REG_IE;
// REG_IE = (1 << 22) | IRQ_VBLANK; // Lid open
// *((u32 *)(0x0380FFF8)) = *((u32 *)(0x0380FFF8)) | (REG_IE & REG_IF);
// VBLANK_INTR_WAIT_FLAGS = IRQ_VBLANK;
int r = 0;
while ((REG_KEYXY & (1 << 7))) { // Wait for lid to open
swiDelay(1000000);
r++;
}
int r = 0;
while ((REG_KEYXY & (1 << 7))) { // Wait for lid to open
swiDelay(1000000);
r++;
}
// IRQ_HANDLER = (void (*)())irq;
IPC->performArm9SleepMode = false; // Tell ARM9 to wake up
// REG_IE = saveInts;
// IRQ_HANDLER = (void (*)()) irq;
IPC->performArm9SleepMode = false; // Tell ARM9 to wake up
// REG_IE = saveInts;
// POWER_CR |= POWER_SOUND;
// POWER_CR |= POWER_SOUND;
powerManagerWrite(0, 0x30, false);
powerManagerWrite(0, 0x30, false);
}
void powerOff() {
powerManagerWrite(0, 0x40, true);
}
//////////////////////////////////////////////////////////////////////
void InterruptTimer1() {
IPC->fillNeeded[playingSection] = true;
soundFilled[playingSection] = false;
if (playingSection == 3) {
// IME = IME_DISABLED;
// IME = IME_DISABLED;
// while (SCHANNEL_CR(0) & SCHANNEL_ENABLE) {
// }
// SCHANNEL_CR(0) &= ~SCHANNEL_ENABLE;
// while (SCHANNEL_CR(0) & SCHANNEL_ENABLE) {
// }
// SCHANNEL_CR(0) &= ~SCHANNEL_ENABLE;
// SCHANNEL_CR(0) |= SCHANNEL_ENABLE;
// TIMER1_CR = 0;
// TIMER1_CR = TIMER_ENABLE | TIMER_IRQ_REQ | TIMER_CASCADE;
// SCHANNEL_CR(0) |= SCHANNEL_ENABLE;
// TIMER1_CR = 0;
// TIMER1_CR = TIMER_ENABLE | TIMER_IRQ_REQ | TIMER_CASCADE;
playingSection = 0;
// IME = IME_ENABLED;
// IME = IME_ENABLED;
} else {
playingSection++;
}
@ -395,8 +375,8 @@ void InterruptTimer1() {
}
void InterruptTimer3() {
while (IPC->adpcm.semaphore); // Wait for buffer to become free if needed
IPC->adpcm.semaphore = true; // Lock the buffer structure to prevent clashing with the ARM7
while (IPC->adpcm.semaphore); // Wait for buffer to become free if needed
IPC->adpcm.semaphore = true; // Lock the buffer structure to prevent clashing with the ARM7
IPC->streamFillNeeded[IPC->streamPlayingSection] = true;
@ -406,153 +386,145 @@ void InterruptTimer3() {
IPC->streamPlayingSection++;
}
IPC->adpcm.semaphore = false;
}
// IPC->performArm9SleepMode = false;
// precalculate some values
// static int16 TOUCH_WIDTH = TOUCH_CAL_X2 - TOUCH_CAL_X1;
// static int16 TOUCH_HEIGHT = TOUCH_CAL_Y2 - TOUCH_CAL_Y1;
// static int16 CNTRL_WIDTH = TOUCH_CNTRL_X2 - (TOUCH_CNTRL_X1 - 8);
// static int16 CNTRL_HEIGHT = TOUCH_CNTRL_Y2 - (TOUCH_CNTRL_Y1 - 8);
// IPC->performArm9SleepMode = false;
// precalculate some values
// static int16 TOUCH_WIDTH = TOUCH_CAL_X2 - TOUCH_CAL_X1;
// static int16 TOUCH_HEIGHT = TOUCH_CAL_Y2 - TOUCH_CAL_Y1;
// static int16 CNTRL_WIDTH = TOUCH_CNTRL_X2 - (TOUCH_CNTRL_X1 - 8);
// static int16 CNTRL_HEIGHT = TOUCH_CNTRL_Y2 - (TOUCH_CNTRL_Y1 - 8);
void InterruptVBlank() {
uint16 but=0, x=0, y=0, xpx=0, ypx=0, z1=0, z2=0, batt=0, aux=0;
int t1=0, t2=0;
uint32 temp=0;
uint8 ct[sizeof(IPC->curtime)];
uint16 but = 0, x = 0, y = 0, xpx = 0, ypx = 0, z1 = 0, z2 = 0, batt = 0, aux = 0;
int t1 = 0, t2 = 0;
uint32 temp = 0;
uint8 ct[sizeof(IPC->curtime)];
static int heartbeat = 0;
// Update the heartbeat
heartbeat++;
// Update the heartbeat
heartbeat++;
// Read the X/Y buttons and the /PENIRQ line
but = REG_KEYXY;
if (!(but & 0x40)) {
// Read the touch screen
touchPosition p;
touchReadXY(&p);
// Read the X/Y buttons and the /PENIRQ line
but = REG_KEYXY;
if (!(but & 0x40)) {
// Read the touch screen
touchPosition p;
touchReadXY(&p);
// x = touchRead(TSC_MEASURE_X);
// y = touchRead(TSC_MEASURE_Y);
// x = touchRead(TSC_MEASURE_X);
// y = touchRead(TSC_MEASURE_Y);
x = p.rawx;
y = p.rawy;
x = p.rawx;
y = p.rawy;
//xpx = p.px;
//ypx = p.py;
// xpx = p.px;
// ypx = p.py;
xpx = ( ((SCREEN_WIDTH -60) * x) / TOUCH_WIDTH ) - TOUCH_OFFSET_X;
ypx = ( ((SCREEN_HEIGHT-60) * y) / TOUCH_HEIGHT ) - TOUCH_OFFSET_Y;
xpx = ( ((SCREEN_WIDTH - 60) * x) / TOUCH_WIDTH ) - TOUCH_OFFSET_X;
ypx = ( ((SCREEN_HEIGHT - 60) * y) / TOUCH_HEIGHT ) - TOUCH_OFFSET_Y;
// xpx = (IPC->touchX - (int16) TOUCH_CAL_X1) * CNTRL_WIDTH / TOUCH_WIDTH + (int16) (TOUCH_CNTRL_X1 - 8);
// ypx = (IPC->touchY - (int16) TOUCH_CAL_Y1) * CNTRL_HEIGHT / TOUCH_HEIGHT + (int16) (TOUCH_CNTRL_Y1 - 8);
// xpx = (IPC->touchX - (int16) TOUCH_CAL_X1) * CNTRL_WIDTH / TOUCH_WIDTH + (int16) (TOUCH_CNTRL_X1 - 8);
// ypx = (IPC->touchY - (int16) TOUCH_CAL_Y1) * CNTRL_HEIGHT / TOUCH_HEIGHT + (int16) (TOUCH_CNTRL_Y1 - 8);
z1 = touchRead(TSC_MEASURE_Z1);
z2 = touchRead(TSC_MEASURE_Z2);
}
if (but & (1 << 7)) { // Check if screen is folded
needSleep = true;
z1 = touchRead(TSC_MEASURE_Z1);
z2 = touchRead(TSC_MEASURE_Z2);
}
// Check if screen is folded
if (but & (1 << 7)) {
needSleep = true;
}
batt = touchRead(TSC_MEASURE_BATTERY);
aux = touchRead(TSC_MEASURE_AUX);
batt = touchRead(TSC_MEASURE_BATTERY);
aux = touchRead(TSC_MEASURE_AUX);
// Read the time
rtcGetTime((uint8 *)ct);
BCDToInteger((uint8 *)&(ct[1]), 7);
// Read the time
rtcGetTime((uint8 *)ct);
BCDToInteger((uint8 *)&(ct[1]), 7);
// Read the temperature
temp = touchReadTemperature(&t1, &t2);
// Read the temperature
temp = touchReadTemperature(&t1, &t2);
// Update the IPC struct
IPC->heartbeat = heartbeat;
IPC->buttons = but;
IPC->touchX = x;
IPC->touchY = y;
IPC->touchXpx = xpx;
IPC->touchYpx = ypx;
IPC->touchZ1 = z1;
IPC->touchZ2 = z2;
IPC->battery = batt;
IPC->aux = aux;
// Update the IPC struct
IPC->heartbeat = heartbeat;
IPC->buttons = but;
IPC->touchX = x;
IPC->touchY = y;
IPC->touchXpx = xpx;
IPC->touchYpx = ypx;
IPC->touchZ1 = z1;
IPC->touchZ2 = z2;
IPC->battery = batt;
IPC->aux = aux;
for (u32 i = 0; i < sizeof(ct); i++) {
IPC->curtime[i] = ct[i];
}
for (u32 i=0; i<sizeof(ct); i++) {
IPC->curtime[i] = ct[i];
}
IPC->temperature = temp;
IPC->tdiode1 = t1;
IPC->tdiode2 = t2;
IPC->temperature = temp;
IPC->tdiode1 = t1;
IPC->tdiode2 = t2;
//sound code :)
TransferSound *snd = IPC->soundData;
IPC->soundData = 0;
if (snd) {
for (int i=0; i<snd->count; i++) {
s8 chan = getFreeSoundChannel();
if (snd->data[i].rate > 0) {
if (chan >= 0) {
startSound(snd->data[i].rate, snd->data[i].data, snd->data[i].len, chan, snd->data[i].vol, snd->data[i].pan, snd->data[i].format);
// sound code :)
TransferSound *snd = IPC->soundData;
IPC->soundData = 0;
if (snd) {
for (int i = 0; i < snd->count; i++) {
s8 chan = getFreeSoundChannel();
if (snd->data[i].rate > 0) {
if (chan >= 0) {
startSound(snd->data[i].rate, snd->data[i].data, snd->data[i].len, chan, snd->data[i].vol, snd->data[i].pan, snd->data[i].format);
}
} else {
stopSound(-snd->data[i].rate);
}
} else {
stopSound(-snd->data[i].rate);
}
}
}
#ifdef USE_DEBUGGER
Wifi_Update(); // update wireless in vblank
#endif
}
//////////////////////////////////////////////////////////////////////
}
#ifdef USE_DEBUGGER
Wifi_Update(); // update wireless in vblank
#endif
}
#ifdef USE_DEBUGGER
// callback to allow wifi library to notify arm9
void arm7_synctoarm9() { // send fifo message
REG_IPC_FIFO_TX = 0x87654321;
REG_IPC_FIFO_TX = 0x87654321;
}
// interrupt handler to allow incoming notifications from arm9
void arm7_fifo() { // check incoming fifo messages
u32 msg = REG_IPC_FIFO_RX;
if (msg==0x87654321) Wifi_Sync();
u32 msg = REG_IPC_FIFO_RX;
if (msg == 0x87654321)
Wifi_Sync();
}
void initDebugger() {
// set up the wifi irq
irqSet(IRQ_WIFI, Wifi_Interrupt); // set up wifi interrupt
irqEnable(IRQ_WIFI);
//get them talking together
// get them talking together
// sync with arm9 and init wifi
u32 fifo_temp;
while (1) { // wait for magic number
while (REG_IPC_FIFO_CR&IPC_FIFO_RECV_EMPTY) swiWaitForVBlank();
fifo_temp=REG_IPC_FIFO_RX;
if (fifo_temp==0x12345678) break;
while (REG_IPC_FIFO_CR & IPC_FIFO_RECV_EMPTY)
swiWaitForVBlank();
fifo_temp = REG_IPC_FIFO_RX;
if (fifo_temp == 0x12345678)
break;
}
while (REG_IPC_FIFO_CR&IPC_FIFO_RECV_EMPTY) swiWaitForVBlank();
fifo_temp=REG_IPC_FIFO_RX; // give next value to wifi_init
while (REG_IPC_FIFO_CR & IPC_FIFO_RECV_EMPTY)
swiWaitForVBlank();
fifo_temp = REG_IPC_FIFO_RX; // give next value to wifi_init
Wifi_Init(fifo_temp);
irqSet(IRQ_FIFO_NOT_EMPTY,arm7_fifo); // set up fifo irq
@ -561,7 +533,6 @@ void initDebugger() {
Wifi_SetSyncHandler(arm7_synctoarm9); // allow wifi lib to notify arm9
// arm7 wifi init complete
}
#endif
@ -571,82 +542,75 @@ void reboot() {
}
#endif
int main(int argc, char ** argv) {
#ifdef USE_DEBUGGER
REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_SEND_CLEAR;
REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_SEND_CLEAR;
#endif
// Reset the clock if needed
rtcReset();
// Reset the clock if needed
rtcReset();
//enable sound
// powerOn(POWER_SOUND);
SOUND_CR = SOUND_ENABLE | SOUND_VOL(0x7F);
IPC->soundData = 0;
IPC->reset = false;
// enable sound
// powerOn(POWER_SOUND);
SOUND_CR = SOUND_ENABLE | SOUND_VOL(0x7F);
IPC->soundData = 0;
IPC->reset = false;
// fifoInit();
//fifoInit();
for (int r = 0; r < 8; r++) {
IPC->adpcm.arm7Buffer[r] = (u8 *) malloc(512);
}
for (int r = 0; r < 4; r++) {
soundFilled[r] = false;
}
// Set up the interrupt handler
irqInit();
irqSet(IRQ_VBLANK, InterruptVBlank);
irqEnable(IRQ_VBLANK);
irqSet(IRQ_TIMER1, InterruptTimer1);
irqEnable(IRQ_TIMER1);
irqSet(IRQ_TIMER3, InterruptTimer3);
irqEnable(IRQ_TIMER3);
/* REG_IME = 0;
IRQ_HANDLER = &InterruptHandler;
REG_IE = IRQ_VBLANK | IRQ_TIMER1 | IRQ_TIMER3;
REG_IF = ~0;
DISP_SR = DISP_VBLANK_IRQ;
REG_IME = 1;
*/
#ifdef USE_DEBUGGER
initDebugger();
#endif
// Keep the ARM7 out of main RAM
while ((1)) {
if (needSleep) {
performSleep();
needSleep = false;
for (int r = 0; r < 8; r++) {
IPC->adpcm.arm7Buffer[r] = (u8 *)malloc(512);
}
for (int r = 0; r < 4; r++) {
soundFilled[r] = false;
}
// Set up the interrupt handler
irqInit();
irqSet(IRQ_VBLANK, InterruptVBlank);
irqEnable(IRQ_VBLANK);
irqSet(IRQ_TIMER1, InterruptTimer1);
irqEnable(IRQ_TIMER1);
irqSet(IRQ_TIMER3, InterruptTimer3);
irqEnable(IRQ_TIMER3);
/*
REG_IME = 0;
IRQ_HANDLER = &InterruptHandler;
REG_IE = IRQ_VBLANK | IRQ_TIMER1 | IRQ_TIMER3;
REG_IF = ~0;
DISP_SR = DISP_VBLANK_IRQ;
REG_IME = 1;
*/
#ifdef USE_DEBUGGER
initDebugger();
#endif
// Keep the ARM7 out of main RAM
while ((1)) {
if (needSleep) {
performSleep();
needSleep = false;
}
#ifdef USE_LIBCARTRESET
if (passmeloopQuery()) {
reboot();
}
if (passmeloopQuery()) {
reboot();
}
#endif
if (IPC->reset) {
powerOff();
if (IPC->reset) {
powerOff();
}
swiWaitForVBlank();
}
swiWaitForVBlank();
}
return 0;
return 0;
}
//////////////////////////////////////////////////////////////////////