src/ds/wifi.c (view raw)
1/* Copyright (c) 2013-2017 Jeffrey Pfau
2 *
3 * This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6#include <mgba/internal/ds/wifi.h>
7
8#include <mgba/internal/arm/macros.h>
9#include <mgba/internal/ds/ds.h>
10
11mLOG_DEFINE_CATEGORY(DS_WIFI, "DS Wi-Fi", "ds.wifi");
12
13void DSWifiReset(struct DS* ds) {
14 memset(ds->wifi.io, 0, sizeof(ds->wifi.io));
15 memset(ds->wifi.wram, 0, sizeof(ds->wifi.wram));
16}
17
18static void DSWifiWriteBB(struct DS* ds, uint8_t address, uint8_t value) {
19 mLOG(DS_WIFI, STUB, "Stub Wi-Fi baseband register write: %02X:%02X", address, value);
20 ds->wifi.baseband[address] = value;
21}
22
23static uint8_t DSWifiReadBB(struct DS* ds, uint8_t address) {
24 mLOG(DS_WIFI, STUB, "Stub Wi-Fi baseband register read: %02X", address);
25 return ds->wifi.baseband[address];
26}
27
28static void DSWifiWriteReg(struct DS* ds, uint32_t address, uint16_t value) {
29 switch (address) {
30 case 0x158:
31 if (value & 0x1000) {
32 DSWifiWriteBB(ds, value & 0xFF, ds->wifi.io[0x15A >> 1]);
33 }
34 if (value & 0x2000) {
35 ds->wifi.io[0x15C >> 1] = DSWifiReadBB(ds, value & 0xFF);
36 }
37 break;
38 case 0x15A:
39 break;
40 default:
41 mLOG(DS_WIFI, STUB, "Stub Wi-Fi I/O register write: %06X:%04X", address, value);
42 break;
43 }
44 ds->wifi.io[address >> 1] = value;
45}
46
47static uint16_t DSWifiReadReg(struct DS* ds, uint32_t address) {
48 switch (address) {
49 case 0x15C:
50 break;
51 default:
52 mLOG(DS_WIFI, STUB, "Stub Wi-Fi I/O register read: %06X", address);
53 break;
54 }
55 return ds->wifi.io[address >> 1];
56}
57
58void DSWifiWriteIO(struct DS* ds, uint32_t address, uint16_t value) {
59 switch (address >> 12) {
60 case 0:
61 case 1:
62 case 6:
63 case 7:
64 DSWifiWriteReg(ds, address & 0xFFF, value);
65 break;
66 case 4:
67 case 5:
68 STORE_16(value, address & 0x1FFE, ds->wifi.wram);
69 break;
70 }
71}
72
73uint16_t DSWifiReadIO(struct DS* ds, uint32_t address) {
74 uint16_t value = 0;
75 switch (address >> 12) {
76 case 0:
77 case 1:
78 case 6:
79 case 7:
80 value = DSWifiReadReg(ds, address & 0xFFF);
81 break;
82 case 4:
83 case 5:
84 LOAD_16(value, address & 0x1FFE, ds->wifi.wram);
85 break;
86 }
87 return value;
88}