summaryrefslogtreecommitdiff
path: root/arm7/source/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'arm7/source/main.c')
-rw-r--r--arm7/source/main.c285
1 files changed, 143 insertions, 142 deletions
diff --git a/arm7/source/main.c b/arm7/source/main.c
index 34aef8f..6579ad2 100644
--- a/arm7/source/main.c
+++ b/arm7/source/main.c
@@ -1,17 +1,27 @@
-/*---------------------------------------------------------------------------------
- $Id$
+/*
+ ds81 - Nintendo DS ZX81 emulator.
+
+ Copyright (C) 2006 Ian Cowburn <ianc@noddybox.co.uk>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ $Id$
+
+ This file is largely based on the libnds examples.
+*/
- Simple ARM7 stub (sends RTC, TSC, and X/Y data to the ARM 9)
-
- $Log$
- Revision 1.2 2005/09/07 20:06:06 wntrmute
- updated for latest libnds changes
-
- Revision 1.8 2005/08/03 05:13:16 wntrmute
- corrected sound code
-
-
----------------------------------------------------------------------------------*/
#include <nds.h>
#include <nds/bios.h>
@@ -20,159 +30,150 @@
#include <dswifi7.h>
+#include "ds81_ipc.h"
-//---------------------------------------------------------------------------------
-void startSound(int sampleRate, const void* data, u32 bytes, u8 channel, u8 vol, u8 pan, u8 format) {
-//---------------------------------------------------------------------------------
- SCHANNEL_TIMER(channel) = SOUND_FREQ(sampleRate);
- SCHANNEL_SOURCE(channel) = (u32)data;
- SCHANNEL_LENGTH(channel) = bytes >> 2 ;
- SCHANNEL_CR(channel) = SCHANNEL_ENABLE | SOUND_ONE_SHOT | SOUND_VOL(vol) | SOUND_PAN(pan) | (format==1?SOUND_8BIT:SOUND_16BIT);
-}
-
-
-//---------------------------------------------------------------------------------
-s32 getFreeSoundChannel() {
-//---------------------------------------------------------------------------------
- int i;
- for (i=0; i<16; i++) {
- if ( (SCHANNEL_CR(i) & SCHANNEL_ENABLE) == 0 ) return i;
- }
- return -1;
-}
+static void FIFO_Handler(u32 msg);
-//---------------------------------------------------------------------------------
-void VblankHandler(void) {
-//---------------------------------------------------------------------------------
- static int heartbeat = 0;
+static void VblankHandler(void)
+{
+ static int heartbeat = 0;
- 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)];
- u32 i;
+ 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)];
+ u32 i;
- // Update the heartbeat
- heartbeat++;
+ /* Update the heartbeat */
+ heartbeat++;
- // Read the touch screen
+ /* Read the touch screen */
+ but = REG_KEYXY;
- but = REG_KEYXY;
+ if (!(but & (1<<6)))
+ {
+ touchPosition tempPos = touchReadXY();
- if (!(but & (1<<6))) {
+ x = tempPos.x;
+ y = tempPos.y;
+ xpx = tempPos.px;
+ ypx = tempPos.py;
+ }
- touchPosition tempPos = touchReadXY();
-
- x = tempPos.x;
- y = tempPos.y;
- xpx = tempPos.px;
- ypx = tempPos.py;
- }
+ z1 = touchRead(TSC_MEASURE_Z1);
+ z2 = touchRead(TSC_MEASURE_Z2);
- z1 = touchRead(TSC_MEASURE_Z1);
- z2 = touchRead(TSC_MEASURE_Z2);
-
-
- batt = touchRead(TSC_MEASURE_BATTERY);
- aux = touchRead(TSC_MEASURE_AUX);
-
- // Read the time
- rtcGetTime((uint8 *)ct);
- BCDToInteger((uint8 *)&(ct[1]), 7);
-
- // 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;
-
- for(i=0; i<sizeof(ct); i++) {
- IPC->curtime[i] = ct[i];
- }
+ batt = touchRead(TSC_MEASURE_BATTERY);
+ aux = touchRead(TSC_MEASURE_AUX);
- IPC->temperature = temp;
- IPC->tdiode1 = t1;
- IPC->tdiode2 = t2;
+ /* Read the time */
+ rtcGetTime((uint8 *)ct);
+ BCDToInteger((uint8 *)&(ct[1]), 7);
+ /* Read the temperature */
+ temp = touchReadTemperature(&t1, &t2);
- //sound code :)
- TransferSound *snd = IPC->soundData;
- IPC->soundData = 0;
+ /* Update the IPC struct */
+ IPC->mailBusy = 1;
- if (0 != snd) {
+ 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 (i=0; i<snd->count; i++) {
- s32 chan = getFreeSoundChannel();
+ for(i=0; i<sizeof(ct); i++)
+ {
+ IPC->curtime[i] = ct[i];
+ }
- 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);
- }
- }
- }
+ IPC->temperature = temp;
+ IPC->tdiode1 = t1;
+ IPC->tdiode2 = t2;
- Wifi_Update(); // update wireless in vblank
+ IPC->mailBusy = 0;
+ Wifi_Update();
}
-// callback to allow wifi library to notify arm9
-void arm7_synctoarm9() { // send fifo message
- REG_IPC_FIFO_TX = 0x87654321;
+/* callback to allow wifi library to notify arm9
+*/
+static void ARM7_SyncToARM9(void)
+{
+ REG_IPC_FIFO_TX = DS81_WIFI_SYNC_IPC;
}
-// 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();
+
+/* interrupt handler to allow incoming notifications from arm9
+*/
+static void ARM7_Fifo(void)
+{
+ while(!(REG_IPC_FIFO_CR & IPC_FIFO_RECV_EMPTY))
+ {
+ u32 msg;
+
+ msg = REG_IPC_FIFO_RX;
+ FIFO_Handler(msg);
+ }
}
-//---------------------------------------------------------------------------------
-int main(int argc, char ** argv) {
-//---------------------------------------------------------------------------------
- REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_SEND_CLEAR; // enable & prepare fifo asap
- // Reset the clock if needed
- rtcReset();
-
- //enable sound
- powerON(POWER_SOUND);
- SOUND_CR = SOUND_ENABLE | SOUND_VOL(0x7F);
- IPC->soundData = 0;
-
- irqInit();
- irqSet(IRQ_VBLANK, VblankHandler);
- irqEnable(IRQ_VBLANK);
-
- irqSet(IRQ_WIFI, Wifi_Interrupt); // set up wifi interrupt
+/* Handler for FIFO messages
+*/
+static void FIFO_Handler(u32 msg)
+{
+ static int next_is_wifi=0;
+
+ if (next_is_wifi)
+ {
+ next_is_wifi = 0;
+ Wifi_Init(msg);
+ Wifi_SetSyncHandler(ARM7_SyncToARM9);
+
+ irqSet(IRQ_WIFI, Wifi_Interrupt);
irqEnable(IRQ_WIFI);
+ }
+ else
+ {
+ switch(msg)
+ {
+ case DS81_WIFI_INIT_IPC:
+ next_is_wifi = 1;
+ break;
+
+ case DS81_WIFI_SYNC_IPC:
+ Wifi_Sync();
+ break;
+ }
+ }
+}
+
+int main(int argc, char ** argv)
+{
+ /* enable & prepare fifo asap */
+ REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_SEND_CLEAR;
+
+ IPC->mailBusy = 1;
+
+ /* Reset the clock if needed */
+ rtcReset();
+
+ irqInit();
+ irqSet(IRQ_VBLANK, VblankHandler);
+ irqEnable(IRQ_VBLANK);
+
+ irqSet(IRQ_FIFO_NOT_EMPTY,ARM7_Fifo); /* set up fifo irq */
+ irqEnable(IRQ_FIFO_NOT_EMPTY);
+
+ REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_RECV_IRQ;
-{ // 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; // give next value to wifi_init
- Wifi_Init(fifo_temp);
-
- irqSet(IRQ_FIFO_NOT_EMPTY,arm7_fifo); // set up fifo irq
- irqEnable(IRQ_FIFO_NOT_EMPTY);
- REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_RECV_IRQ;
-
- Wifi_SetSyncHandler(arm7_synctoarm9); // allow wifi lib to notify arm9
- } // arm7 wifi init complete
-
- // Keep the ARM7 out of main RAM
- while (1) swiWaitForVBlank();
+ while (1)
+ {
+ swiWaitForVBlank();
+ }
}