summaryrefslogtreecommitdiff
path: root/arm9
diff options
context:
space:
mode:
Diffstat (limited to 'arm9')
-rw-r--r--arm9/Makefile2
-rw-r--r--arm9/include/ds81_global.h37
-rw-r--r--arm9/source/framebuffer.c2
-rw-r--r--arm9/source/gui.c2
-rw-r--r--arm9/source/keyboard.c5
-rw-r--r--arm9/source/main.c215
-rw-r--r--arm9/source/tapes.c2
-rw-r--r--arm9/source/zx81.c12
8 files changed, 268 insertions, 9 deletions
diff --git a/arm9/Makefile b/arm9/Makefile
index 0eb1905..26ad86a 100644
--- a/arm9/Makefile
+++ b/arm9/Makefile
@@ -16,7 +16,7 @@ include $(DEVKITARM)/ds_rules
#---------------------------------------------------------------------------------
BUILD := build
SOURCES := source
-INCLUDES := include
+INCLUDES := include build ../common
DATA := data
#---------------------------------------------------------------------------------
diff --git a/arm9/include/ds81_global.h b/arm9/include/ds81_global.h
new file mode 100644
index 0000000..96fb23c
--- /dev/null
+++ b/arm9/include/ds81_global.h
@@ -0,0 +1,37 @@
+/*
+ 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$
+*/
+#ifndef DS81_GLOBAL_H
+#define DS81_GLOBAL_H
+
+#define DS81STR(x) #x
+
+/* Tracing. Remove calls once debugged -- relatively expensive ops
+*/
+#define TRACE do \
+ { \
+ int sprintf(char *,const char *,...); \
+ char s[32]; \
+ sprintf(s,"%s:%d ",__func__,__LINE__); \
+ FB_Print(s,0,184,FB_RGB(31,31,31),FB_RGB(10,10,10));\
+ } while(0)
+
+#endif /* DS81_GLOBAL_H */
diff --git a/arm9/source/framebuffer.c b/arm9/source/framebuffer.c
index 4a4b03d..65bedc9 100644
--- a/arm9/source/framebuffer.c
+++ b/arm9/source/framebuffer.c
@@ -23,6 +23,8 @@
#include <nds.h>
#include <string.h>
+#include "ds81_global.h"
+
/* ---------------------------------------- STATIC DATA
*/
#define WIDTH 256
diff --git a/arm9/source/gui.c b/arm9/source/gui.c
index 713ad02..e505330 100644
--- a/arm9/source/gui.c
+++ b/arm9/source/gui.c
@@ -23,6 +23,8 @@
#include <nds.h>
#include <string.h>
+#include "ds81_global.h"
+
#include "framebuffer.h"
diff --git a/arm9/source/keyboard.c b/arm9/source/keyboard.c
index bbc0c61..76f16e6 100644
--- a/arm9/source/keyboard.c
+++ b/arm9/source/keyboard.c
@@ -21,6 +21,9 @@
*/
#include <nds.h>
+
+#include "ds81_global.h"
+
#include "keyboard.h"
#include "framebuffer.h"
#include "keyb_bin.h"
@@ -143,8 +146,6 @@ static int GetEvent(SoftKeyEvent *ev, int map)
int f;
uint32 keys;
- scanKeys();
-
keys = keysHeld();
/* Clear the non-sticky keys
diff --git a/arm9/source/main.c b/arm9/source/main.c
index 162ca2d..0f996bb 100644
--- a/arm9/source/main.c
+++ b/arm9/source/main.c
@@ -25,6 +25,12 @@
#include <string.h>
#include <nds.h>
#include <fat.h>
+#include <dswifi9.h>
+
+#include "ds81_ipc.h"
+
+#include "ds81_global.h"
+#include "ds81_fader.h"
#include "framebuffer.h"
#include "gui.h"
@@ -45,6 +51,7 @@ static const char *main_menu[]=
"Sticky Shift On",
"Sticky Shift Off",
"Map Joypad to Keys",
+ "Select Web Server (WFC)",
"Cancel",
NULL
};
@@ -55,14 +62,89 @@ typedef enum
MenuSelectTape,
MenuStickyOn,
MenuStickyOff,
- MenuMapJoypad
+ MenuMapJoypad,
+ MenuConfigNetwork
} MenuOpt;
+/* Hope ints are atomic... Having said that we are on the one processor so
+ I doubt it'll mess up. Which are usually famous last words.
+*/
+static volatile int wifi_enabled = FALSE;
+
+static u32 main_heartbeat;
+
+
+/* ---------------------------------------- IRQ FUNCS
+*/
+
+static void Timer(void)
+{
+ {
+ static int c=0;
+ char s[32];
+ sprintf(s,"%d",(c++)/50);
+ FB_Print(s,0,184-10,FB_RGB(31,31,31),FB_RGB(10,10,10));
+ }
+
+ if (wifi_enabled)
+ {
+ Wifi_Timer(50);
+ }
+}
+
+static void ARM9_SyncToARM7(void)
+{
+ REG_IPC_FIFO_TX = DS81_WIFI_SYNC_IPC;
+}
+
+
+static void ARM9_Fifo(void)
+{
+ static int c=0;
+ u32 v;
+
+ v = REG_IPC_FIFO_RX;
+
+ {
+ char s[32];
+ sprintf(s,"%d:%x ",c++,v);
+ FB_Print(s,0,184,FB_RGB(31,31,31),FB_RGB(10,10,10));
+ }
+
+ if (v == DS81_WIFI_SYNC_IPC)
+ {
+ Wifi_Sync();
+ }
+}
+
+
/* ---------------------------------------- DISPLAY FUNCS
*/
static void VBlankFunc(void)
{
+#if 0
+ char t[32];
+
+ if (IPC->rtc_hours < 12)
+ {
+ sprintf(t,"%2.2d:%2.2d:%2.2d",IPC->rtc_hours,
+ IPC->rtc_minutes,
+ IPC->rtc_seconds);
+ }
+ else
+ {
+ sprintf(t,"%2.2d:%2.2d:%2.2d",IPC->rtc_hours-40,
+ IPC->rtc_minutes,
+ IPC->rtc_seconds);
+ }
+
+ FB_Print(t,192,0,FB_RGB(31,31,31),FB_RGB(10,10,10));
+
+ sprintf(t,"H:%8.8x M:%8.8x",IPC->heartbeat,main_heartbeat);
+ FB_Print(t,0,0,FB_RGB(31,31,31),FB_RGB(10,10,10));
+#endif
+
scanKeys();
}
@@ -218,6 +300,109 @@ static void MapJoypad(void)
}
+/* ---------------------------------------- NETWORK CONFIGURATION
+*/
+static const char *AssocStatus(enum WIFI_ASSOCSTATUS s, int *exit_loop)
+{
+ switch(s)
+ {
+ case ASSOCSTATUS_DISCONNECTED:
+ return "Not trying to connect...";
+
+ case ASSOCSTATUS_SEARCHING:
+ return "Searching for AP...";
+
+ case ASSOCSTATUS_AUTHENTICATING:
+ return "Connecting (authenticate)...";
+
+ case ASSOCSTATUS_ASSOCIATING:
+ return "Connecting (associating)...";
+
+ case ASSOCSTATUS_ACQUIRINGDHCP:
+ return "Requesting IP address...";
+
+ case ASSOCSTATUS_ASSOCIATED:
+ *exit_loop = 1;
+ return "Associated";
+
+ case ASSOCSTATUS_CANNOTCONNECT:
+ *exit_loop = 1;
+ return "Cannot connect";
+
+ default:
+ *exit_loop = 1;
+ return "Unknown status";
+ }
+}
+
+static void ConfigNetwork(void)
+{
+ int col;
+ int coli;
+ u32 wifi_pass;
+ enum WIFI_ASSOCSTATUS assoc;
+ int exit_loop;
+
+ FB_Clear();
+
+ FB_Centre("Initialising WIFI...",0,FB_RGB(31,31,31),-1);
+
+ wifi_pass = Wifi_Init(WIFIINIT_OPTION_USELED);
+
+ REG_IPC_FIFO_TX = DS81_WIFI_INIT_IPC;
+ REG_IPC_FIFO_TX = wifi_pass;
+
+ Wifi_SetSyncHandler(ARM9_SyncToARM7);
+ wifi_enabled = TRUE;
+
+ FB_Centre("Waiting for WIFI...",10,FB_RGB(31,31,31),-1);
+
+ col = 31;
+ coli = -1;
+
+ while(Wifi_CheckInit() == 0)
+ {
+ FB_Centre("Waiting for WIFI...",10,FB_RGB(col,col,col),-1);
+ DS81_BOUNCE(col,coli);
+ swiWaitForVBlank();
+ }
+
+ FB_Centre("Waiting for WIFI...",10,FB_RGB(31,31,31),-1);
+
+ FB_Centre("Using WFC settings...",20,FB_RGB(31,31,31),-1);
+ Wifi_AutoConnect();
+
+ FB_Centre("Waiting for association...",30,FB_RGB(31,31,31),-1);
+ exit_loop = FALSE;
+
+ while(!exit_loop)
+ {
+ assoc = Wifi_AssocStatus();
+
+ FB_Centre(AssocStatus(assoc,&exit_loop),40,FB_RGB(col,col,col),-1);
+ DS81_BOUNCE(col,coli);
+ swiWaitForVBlank();
+ }
+
+ FB_Centre(AssocStatus(assoc,&exit_loop),40,FB_RGB(31,31,31),-1);
+
+ FB_Centre("Press a key...",60,FB_RGB(31,31,31),-1);
+
+ while(!keysDown())
+ {
+ swiWaitForVBlank();
+ }
+
+ while(keysHeld())
+ {
+ swiWaitForVBlank();
+ }
+
+ SK_DisplayKeyboard(BG_GFX_SUB);
+ swiWaitForVBlank();
+}
+
+
/* ---------------------------------------- MAIN
*/
int main(int argc, char *argv[])
@@ -255,12 +440,30 @@ int main(int argc, char *argv[])
SUB_BG2_CX = 0;
SUB_BG2_CY = 0;
+ /* Tell 'framebuffer' routines to use this
+ */
+ FB_Init(BG_GFX_SUB);
+
+ /* Set up interrupts and timers
+ */
irqInit();
irqSet(IRQ_VBLANK,VBlankFunc);
+ irqEnable(IRQ_VBLANK);
- keysSetRepeat(30,15);
+ REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_RECV_IRQ;
- FB_Init(BG_GFX_SUB);
+ TIMER3_CR = 0;
+
+ irqSet(IRQ_TIMER3,Timer);
+ TIMER3_DATA = TIMER_FREQ_256(20);
+ TIMER3_CR = TIMER_ENABLE | TIMER_IRQ_REQ | TIMER_DIV_256;
+
+ irqSet(IRQ_FIFO_NOT_EMPTY,ARM9_Fifo);
+ irqEnable(IRQ_FIFO_NOT_EMPTY);
+
+ /* All required stuff initialised
+ */
+ keysSetRepeat(30,15);
z80 = Z80Init(ZX81ReadMem,
ZX81WriteMem,
@@ -285,6 +488,8 @@ int main(int argc, char *argv[])
{
SoftKeyEvent ev;
+ main_heartbeat++;
+
Z80Exec(z80);
while(SK_GetEvent(&ev))
@@ -316,6 +521,10 @@ int main(int argc, char *argv[])
case MenuMapJoypad:
MapJoypad();
break;
+
+ case MenuConfigNetwork:
+ ConfigNetwork();
+ break;
}
SK_DisplayKeyboard(BG_GFX_SUB);
diff --git a/arm9/source/tapes.c b/arm9/source/tapes.c
index bc5ac8b..5c49346 100644
--- a/arm9/source/tapes.c
+++ b/arm9/source/tapes.c
@@ -22,6 +22,8 @@
#include <nds.h>
+#include "ds81_global.h"
+
#include "tapes.h"
#include "framebuffer.h"
#include "keyboard.h"
diff --git a/arm9/source/zx81.c b/arm9/source/zx81.c
index 533c382..41ff686 100644
--- a/arm9/source/zx81.c
+++ b/arm9/source/zx81.c
@@ -28,6 +28,8 @@
#include <ctype.h>
#include <nds.h>
+#include "ds81_global.h"
+
#include "zx81.h"
#include "gui.h"
@@ -446,10 +448,14 @@ static void ZX81HouseKeeping(Z80 *z80)
if (lastk1 && (lastk1!=prev_lk1 || lastk2!=prev_lk2))
{
mem[CDFLAG]|=1;
-
- mem[LASTK1]=lastk1^0xff;
- mem[LASTK2]=lastk2^0xff;
}
+ else
+ {
+ mem[CDFLAG]&=~1;
+ }
+
+ mem[LASTK1]=lastk1^0xff;
+ mem[LASTK2]=lastk2^0xff;
prev_lk1=lastk1;
prev_lk2=lastk2;