Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
196 lines (159 loc) · 5.59 KB

SDL_ndsvideo.c

File metadata and controls

196 lines (159 loc) · 5.59 KB
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2006 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
Jul 19, 2008
Jul 19, 2008
24
25
/* SDL Nintendo DS video driver implementation
* based on dummy driver:
26
27
28
29
30
31
32
33
* Initial work by Ryan C. Gordon (icculus@icculus.org). A good portion
* of this was cut-and-pasted from Stephane Peter's work in the AAlib
* SDL video driver. Renamed to "DUMMY" by Sam Lantinga.
*/
#include <stdio.h>
#include <stdlib.h>
#include <nds.h>
Jul 19, 2008
Jul 19, 2008
34
#include <nds/arm9/video.h>
35
36
37
38
39
40
41
42
43
44
45
#include "SDL_video.h"
#include "SDL_mouse.h"
#include "../SDL_sysvideo.h"
#include "../SDL_pixels_c.h"
#include "../../events/SDL_events_c.h"
#include "SDL_ndsvideo.h"
#include "SDL_ndsevents_c.h"
#include "SDL_ndsrender_c.h"
Aug 16, 2008
Aug 16, 2008
46
47
48
49
50
51
52
#define TRACE
//#define TRACE printf
53
54
55
56
57
58
59
#define NDSVID_DRIVER_NAME "nds"
/* Initialization/Query functions */
static int NDS_VideoInit(_THIS);
static int NDS_SetDisplayMode(_THIS, SDL_DisplayMode * mode);
static void NDS_VideoQuit(_THIS);
Jul 19, 2008
Jul 19, 2008
60
61
/* SDL NDS driver bootstrap functions */
62
63
64
static int
NDS_Available(void)
{
Jul 19, 2008
Jul 19, 2008
65
/*const char *envr = SDL_getenv("SDL_VIDEODRIVER");*/
Jun 19, 2008
Jun 19, 2008
66
/*printf("NDS_Available()\n"); */
67
68
69
70
71
72
73
74
75
76
77
78
79
return (1);
}
static void
NDS_DeleteDevice(SDL_VideoDevice * device)
{
SDL_free(device);
}
static SDL_VideoDevice *
NDS_CreateDevice(int devindex)
{
SDL_VideoDevice *device;
Jun 19, 2008
Jun 19, 2008
80
/*printf("NDS_CreateDevice(%d)\n", devindex); */
Aug 16, 2008
Aug 16, 2008
82
TRACE("+NDS_CreateDevice\n");
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/* Initialize all variables that we clean on shutdown */
device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice));
if (!device) {
SDL_OutOfMemory();
if (device) {
SDL_free(device);
}
return (0);
}
/* Set the function pointers */
device->VideoInit = NDS_VideoInit;
device->VideoQuit = NDS_VideoQuit;
device->SetDisplayMode = NDS_SetDisplayMode;
device->PumpEvents = NDS_PumpEvents;
Jun 12, 2008
Jun 12, 2008
99
device->num_displays = 2; /* DS = dual screens */
100
101
102
device->free = NDS_DeleteDevice;
Aug 16, 2008
Aug 16, 2008
103
TRACE("-NDS_CreateDevice\n");
104
105
106
107
108
109
110
111
112
113
114
115
116
117
return device;
}
VideoBootStrap NDS_bootstrap = {
NDSVID_DRIVER_NAME, "SDL NDS video driver",
NDS_Available, NDS_CreateDevice
};
int
NDS_VideoInit(_THIS)
{
SDL_DisplayMode mode;
int i;
Aug 16, 2008
Aug 16, 2008
118
TRACE("+NDS_VideoInit\n");
Jul 19, 2008
Jul 19, 2008
119
/* simple 256x192x16x60 for now */
Jun 12, 2008
Jun 12, 2008
120
121
mode.w = 256;
mode.h = 192;
Jul 13, 2008
Jul 13, 2008
122
mode.format = SDL_PIXELFORMAT_ABGR1555;
123
124
125
126
mode.refresh_rate = 60;
mode.driverdata = NULL;
SDL_AddBasicVideoDisplay(&mode);
Jul 2, 2008
Jul 2, 2008
127
SDL_AddRenderDriver(0, &NDS_RenderDriver);
Jul 13, 2008
Jul 13, 2008
128
129
/*SDL_AddBasicVideoDisplay(&mode); two screens, same mode. uncomment later
SDL_AddRenderDriver(1, &NDS_RenderDriver);*/
130
131
132
133
SDL_zero(mode);
SDL_AddDisplayMode(0, &mode);
Jun 12, 2008
Jun 12, 2008
134
/* hackish stuff to get things up and running for now, and for a console */
Jul 19, 2008
Jul 19, 2008
135
powerON(POWER_ALL_2D); irqInit();
Jul 13, 2008
Jul 13, 2008
136
137
irqEnable(IRQ_VBLANK);
NDS_SetDisplayMode(_this, &mode);
Aug 16, 2008
Aug 16, 2008
138
139
TRACE("-NDS_VideoInit\n");
140
141
142
143
144
145
return 0;
}
static int
NDS_SetDisplayMode(_THIS, SDL_DisplayMode * mode)
{
Aug 16, 2008
Aug 16, 2008
146
TRACE("+NDS_SetDisplayMode\n");
Jun 19, 2008
Jun 19, 2008
147
/* right now this function is just hard-coded for 256x192 ABGR1555 */
Jul 25, 2008
Jul 25, 2008
148
videoSetMode(MODE_5_2D |
Aug 15, 2008
Aug 15, 2008
149
150
151
152
DISPLAY_BG2_ACTIVE |
DISPLAY_BG3_ACTIVE |
DISPLAY_BG_EXT_PALETTE |
DISPLAY_SPR_1D_LAYOUT |
Aug 17, 2008
Aug 17, 2008
153
154
DISPLAY_SPR_1D_BMP |
DISPLAY_SPR_1D_BMP_SIZE_256 | /* try 128 if 256 is trouble. */
Aug 15, 2008
Aug 15, 2008
155
156
157
158
159
160
161
162
163
164
DISPLAY_SPR_ACTIVE |
DISPLAY_SPR_EXT_PALETTE); /* display on main core
with lots of flags set for
flexibility/capacity to render */
/* hopefully these cover all the various things we might need to do */
vramSetBankA(VRAM_A_MAIN_BG_0x06000000);
vramSetBankB(VRAM_B_MAIN_BG_0x06020000);
vramSetBankC(VRAM_C_SUB_BG_0x06200000);
vramSetBankD(VRAM_D_MAIN_BG_0x06040000); /* not a typo. vram d can't sub */
Jul 19, 2008
Jul 19, 2008
165
vramSetBankE(VRAM_E_MAIN_SPRITE);
Aug 15, 2008
Aug 15, 2008
166
167
168
169
170
171
172
173
174
175
vramSetBankF(VRAM_F_OBJ_EXT_PALETTE);
vramSetBankG(VRAM_G_BG_EXT_PALETTE);
vramSetBankH(VRAM_H_SUB_BG_EXT_PALETTE);
vramSetBankI(VRAM_I_SUB_SPRITE);
videoSetModeSub(MODE_0_2D | DISPLAY_BG0_ACTIVE); /* debug text on sub
TODO: this will change
when multi-head is
introduced in render */
Aug 16, 2008
Aug 16, 2008
176
TRACE("-NDS_SetDisplayMode\n");
177
178
179
180
181
182
return 0;
}
void
NDS_VideoQuit(_THIS)
{
Aug 16, 2008
Aug 16, 2008
183
TRACE("+NDS_VideoQuit\n");
Jul 13, 2008
Jul 13, 2008
184
185
186
videoSetMode(DISPLAY_SCREEN_OFF);
videoSetModeSub(DISPLAY_SCREEN_OFF);
vramSetMainBanks(VRAM_A_LCD, VRAM_B_LCD, VRAM_C_LCD, VRAM_D_LCD);
Aug 15, 2008
Aug 15, 2008
187
188
189
190
191
vramSetBankE(VRAM_E_LCD);
vramSetBankF(VRAM_F_LCD);
vramSetBankG(VRAM_G_LCD);
vramSetBankH(VRAM_H_LCD);
vramSetBankI(VRAM_I_LCD);
Aug 16, 2008
Aug 16, 2008
192
TRACE("-NDS_VideoQuit\n");
193
194
195
}
/* vi: set ts=4 sw=4 expandtab: */