all repos — mgba @ 498aa541fc660c8755cda99cf8889171b3bd5381

mGBA Game Boy Advance Emulator

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}