From ba617f9b7e62641b7134ad7f322df8dfc36b055f Mon Sep 17 00:00:00 2001 From: luigi__ Date: Wed, 25 Feb 2009 21:32:56 +0000 Subject: [PATCH] More correct emulation of the power registers. (Tested, doesn't seem to break anything) --- desmume/src/wifi.cpp | 40 ++++++++++++++++++++++++++++++++++++---- desmume/src/wifi.h | 5 +++++ 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/desmume/src/wifi.cpp b/desmume/src/wifi.cpp index acd6ca8d4..ae47fb608 100644 --- a/desmume/src/wifi.cpp +++ b/desmume/src/wifi.cpp @@ -418,6 +418,8 @@ void WIFI_Init(wifimac_t *wifi) WIFI_resetRF(&wifi->RF) ; WIFI_Host_InitSystem() ; wifi->udpSocket = WIFI_Host_OpenChannel(1) ; + wifi->powerOn = FALSE; + wifi->powerOnPending = FALSE; } static void WIFI_RXPutWord(wifimac_t *wifi,u16 val) @@ -507,7 +509,7 @@ void WIFI_write16(wifimac_t *wifi,u32 address, u16 val) break ; case REG_WIFI_IE: wifi->IE.val = val ; - printf("wifi ie write %04X\n", val); + //printf("wifi ie write %04X\n", val); break ; case REG_WIFI_IF: wifi->IF.val &= ~val ; /* clear flagging bits */ @@ -528,6 +530,30 @@ void WIFI_write16(wifimac_t *wifi,u32 address, u16 val) case REG_WIFI_WEPCNT: wifi->WEP_enable = (val & 0x8000) != 0 ; break ; + case REG_WIFI_POWERSTATE: + wifi->powerOn = ((val & 0x0002)?TRUE:FALSE); + if(wifi->powerOn) WIFI_triggerIRQ(wifi, 11); + break; + case REG_WIFI_FORCEPS: + if((val & 0x8000) && (!wifi->powerOnPending)) + { + BOOL newPower = ((val & 0x0001)?FALSE:TRUE); + if(newPower != wifi->powerOn) + { + if(!newPower) + wifi->powerOn = FALSE; + else + wifi->powerOnPending = TRUE; + } + } + break; + case REG_WIFI_POWERACK: + if((val == 0x0000) && wifi->powerOnPending) + { + wifi->powerOn = TRUE; + wifi->powerOnPending = FALSE; + } + break; case REG_WIFI_RXRANGEBEGIN: wifi->RXRangeBegin = val ; break ; @@ -645,6 +671,12 @@ void WIFI_write16(wifimac_t *wifi,u32 address, u16 val) case REG_WIFI_AID_HIGH: wifi->aid = val & 0x07FF ; break ; + //case 0x36: + //case 0x38: + //case 0x3C: + //case 0x40: + // printf("wifi power reg %03X write %04X\n", address, val); + // break; default: // val = 0 ; /* not handled yet */ break ; @@ -687,6 +719,8 @@ u16 WIFI_read16(wifimac_t *wifi,u32 address) return wifi->IE.val ; case REG_WIFI_IF: return wifi->IF.val ; + case REG_WIFI_POWERSTATE: + return ((wifi->powerOn ? 0x0000 : 0x0200) | (wifi->powerOnPending ? 0x0102 : 0x0000)); case REG_WIFI_RFIODATA1: return WIFI_getRF_DATA(wifi,0) ; case REG_WIFI_RFIODATA2: @@ -757,10 +791,8 @@ u16 WIFI_read16(wifimac_t *wifi,u32 address) return wifi->pid ; case REG_WIFI_AID_HIGH: return wifi->aid ; - case 0x03C: - return 0x0200; case 0x214: - return 0x0000; + return 0x0009; default: return wifi->ioMem[address >> 1]; } diff --git a/desmume/src/wifi.h b/desmume/src/wifi.h index 29426b537..05a46974e 100644 --- a/desmume/src/wifi.h +++ b/desmume/src/wifi.h @@ -109,6 +109,7 @@ #define REG_WIFI_RFIOBSY 0x180 #define REG_WIFI_RFIOCNT 0x184 #define REG_WIFI_IF_SET 0x21C +#define REG_WIFI_POWERACK 0x2D0 /* WIFI misc constants */ #define WIFI_CHIPID 0x1440 /* emulates "old" wifi chip, new is 0xC340 */ @@ -370,6 +371,10 @@ typedef union /* http://www.akkit.org/info/dswifi.htm#WifiIOMap */ typedef struct { + /* power */ + BOOL powerOn; + BOOL powerOnPending; + /* wifi interrupt handling */ wifiirq_t IE ; wifiirq_t IF ;