Added initial support for Nintendo DS, based on the work by Troy Davis (GPF)
--HG-- branch : SDL-1.2 extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/branches/SDL-1.2%402376
This commit is contained in:
parent
10ab421d01
commit
9d68aabeb7
25 changed files with 1744 additions and 10 deletions
63
Makefile.ds
Normal file
63
Makefile.ds
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
#LibSDL 1.2.12
|
||||||
|
#DS porting by Troy Davis(GPF)
|
||||||
|
|
||||||
|
|
||||||
|
ifeq ($(strip $(DEVKITPRO)),)
|
||||||
|
$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=<path to>devkitPro)
|
||||||
|
endif
|
||||||
|
ifeq ($(strip $(DEVKITARM)),)
|
||||||
|
DEVKITARM := $(DEVKITPRO)/devkitARM
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
SRCS = $(shell echo ./src/*.c ./src/audio/*.c ./src/cdrom/*.c ./src/cpuinfo/*.c ./src/events/*.c ./src/file/*.c ./src/stdlib/*.c ./src/thread/*.c ./src/timer/*.c ./src/video/*.c ./src/joystick/*.c ./src/joystick/nds/*.c ./src/cdrom/dummy/*.c ./src/thread/generic/*.c ./src/timer/nds/*.c ./src/loadso/dummy/*.c ./src/audio/dummy/*.c ./src/audio/nds/*.c ./src/video/dummy/*.c ./src/video/nds/*.c)
|
||||||
|
|
||||||
|
OBJS = $(SRCS:.c=.o)
|
||||||
|
|
||||||
|
|
||||||
|
SUBDIRS=
|
||||||
|
|
||||||
|
CC=arm-eabi-gcc
|
||||||
|
CXX=arm-eabi-g++
|
||||||
|
LDSHARED=$(CXX)
|
||||||
|
AR=arm-eabi-ar rc
|
||||||
|
RANLIB=arm-eabi-ranlib
|
||||||
|
|
||||||
|
CFLAGS = -mthumb -mthumb-interwork \
|
||||||
|
-march=armv5te -mtune=arm946e-s \
|
||||||
|
-O2 -Wall -Wwrite-strings -Wpointer-arith \
|
||||||
|
-DARM9 -D__NDS__ -I$(DEVKITPRO)/libnds/include -Iinclude
|
||||||
|
|
||||||
|
CXXFLAGS += $(CFLAGS)
|
||||||
|
|
||||||
|
all: $(DEVKITPRO)/libnds/lib/libSDL.a
|
||||||
|
|
||||||
|
|
||||||
|
$(DEVKITPRO)/libnds/lib/libSDL.a: $(OBJS)
|
||||||
|
$(AR) $@ $(OBJS)
|
||||||
|
-@ ($(RANLIB) $@ || true) >/dev/null 2>&1
|
||||||
|
|
||||||
|
clean:
|
||||||
|
find . -name "*.o" |xargs rm -f
|
||||||
|
find . -name "*.d" |xargs rm -f
|
||||||
|
-rm -f *.elf
|
||||||
|
-rm -f *.nds
|
||||||
|
-rm -f *.gba
|
||||||
|
-rm -f *.arm9
|
||||||
|
-rm -f *.map
|
||||||
|
-rm -f *.img
|
||||||
|
-rm -Rf *.d
|
||||||
|
|
||||||
|
|
||||||
|
subdirs: $(patsubst %, _dir_%, $(SUBDIRS))
|
||||||
|
|
||||||
|
$(patsubst %, _dir_%, $(SUBDIRS)):
|
||||||
|
$(MAKE) -C $(patsubst _dir_%, %, $@)
|
||||||
|
|
||||||
|
clean_subdirs: $(patsubst %, _clean_dir_%, $(SUBDIRS))
|
||||||
|
|
||||||
|
$(patsubst %, _clean_dir_%, $(SUBDIRS)):
|
||||||
|
$(MAKE) -C $(patsubst _clean_dir_%, %, $@) clean
|
||||||
|
|
||||||
|
#include $(DEVKITARM)/ds_rules
|
||||||
|
|
9
README
9
README
|
@ -12,10 +12,11 @@ This is the Simple DirectMedia Layer, a general API that provides low
|
||||||
level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL,
|
level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL,
|
||||||
and 2D framebuffer across multiple platforms.
|
and 2D framebuffer across multiple platforms.
|
||||||
|
|
||||||
The current version supports Linux, Windows, Windows CE, BeOS, MacOS,
|
The current version supports Linux, Windows CE/95/98/ME/XP/Vista, BeOS,
|
||||||
Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX, and QNX.
|
MacOS Classic, Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX,
|
||||||
The code contains support for Dreamcast, Atari, AIX, OSF/Tru64,
|
and QNX. The code contains support for Dreamcast, Atari, AIX, OSF/Tru64,
|
||||||
RISC OS, SymbianOS, and OS/2, but these are not officially supported.
|
RISC OS, SymbianOS, Nintendo DS, and OS/2, but these are not officially
|
||||||
|
supported.
|
||||||
|
|
||||||
SDL is written in C, but works with C++ natively, and has bindings to
|
SDL is written in C, but works with C++ natively, and has bindings to
|
||||||
several other languages, including Ada, C#, Eiffel, Erlang, Euphoria,
|
several other languages, including Ada, C#, Eiffel, Erlang, Euphoria,
|
||||||
|
|
22
README.NDS
Normal file
22
README.NDS
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
The SDL port to the Nintendo DS
|
||||||
|
|
||||||
|
This port uses the devKitPro toolchain, available from:
|
||||||
|
http://www.devkitpro.org
|
||||||
|
|
||||||
|
Precompiled tools for cross-compiling on Linux are available from:
|
||||||
|
http://www.libsdl.org/extras/nds/devkitPro-20070503-linux.tar.gz
|
||||||
|
|
||||||
|
todo:
|
||||||
|
add ds console specific features/optimizations
|
||||||
|
mouse/keyboard support
|
||||||
|
dual screen support
|
||||||
|
|
||||||
|
build with:
|
||||||
|
cp include/SDL_config_nds.h include/SDL_config.h
|
||||||
|
make -f Makefile.ds
|
||||||
|
|
||||||
|
included is an arm9/arm7 template to allow for sound streaming support.
|
||||||
|
|
||||||
|
Enjoy, fix the source and share :)
|
||||||
|
Troy Davis(GPF)
|
||||||
|
http://gpf.dcemu.co.uk/
|
|
@ -49,6 +49,9 @@ SDL 1.2.12 is a minor bug fix release.
|
||||||
<P>
|
<P>
|
||||||
Unofficial support for the S60/SymbianOS platform has been added.
|
Unofficial support for the S60/SymbianOS platform has been added.
|
||||||
</P>
|
</P>
|
||||||
|
<P>
|
||||||
|
Unofficial support for the Nintendo DS platform has been added.
|
||||||
|
</P>
|
||||||
</BLOCKQUOTE>
|
</BLOCKQUOTE>
|
||||||
|
|
||||||
<H3> Unix Notes </H3>
|
<H3> Unix Notes </H3>
|
||||||
|
|
115
include/SDL_config_nds.h
Normal file
115
include/SDL_config_nds.h
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
/*
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _SDL_config_nds_h
|
||||||
|
#define _SDL_config_nds_h
|
||||||
|
|
||||||
|
#include "SDL_platform.h"
|
||||||
|
|
||||||
|
/* This is a set of defines to configure the SDL features */
|
||||||
|
|
||||||
|
/* General platform specific identifiers */
|
||||||
|
#include "SDL_platform.h"
|
||||||
|
|
||||||
|
/* C datatypes */
|
||||||
|
#define SDL_HAS_64BIT_TYPE 1
|
||||||
|
|
||||||
|
/* Endianness */
|
||||||
|
#define SDL_BYTEORDER 1234
|
||||||
|
|
||||||
|
/* Useful headers */
|
||||||
|
#define HAVE_ALLOCA_H 1
|
||||||
|
#define HAVE_SYS_TYPES_H 1
|
||||||
|
#define HAVE_STDIO_H 1
|
||||||
|
#define STDC_HEADERS 1
|
||||||
|
#define HAVE_STDLIB_H 1
|
||||||
|
#define HAVE_STDARG_H 1
|
||||||
|
#define HAVE_MALLOC_H 1
|
||||||
|
#define HAVE_STRING_H 1
|
||||||
|
#define HAVE_INTTYPES_H 1
|
||||||
|
#define HAVE_STDINT_H 1
|
||||||
|
#define HAVE_CTYPE_H 1
|
||||||
|
#define HAVE_MATH_H 1
|
||||||
|
#define HAVE_ICONV_H 1
|
||||||
|
#define HAVE_SIGNAL_H 1
|
||||||
|
|
||||||
|
/* C library functions */
|
||||||
|
#define HAVE_MALLOC 1
|
||||||
|
#define HAVE_CALLOC 1
|
||||||
|
#define HAVE_REALLOC 1
|
||||||
|
#define HAVE_FREE 1
|
||||||
|
#define HAVE_ALLOCA 1
|
||||||
|
#define HAVE_GETENV 1
|
||||||
|
#define HAVE_PUTENV 1
|
||||||
|
#define HAVE_UNSETENV 1
|
||||||
|
#define HAVE_QSORT 1
|
||||||
|
#define HAVE_ABS 1
|
||||||
|
#define HAVE_BCOPY 1
|
||||||
|
#define HAVE_MEMSET 1
|
||||||
|
#define HAVE_MEMCPY 1
|
||||||
|
#define HAVE_MEMMOVE 1
|
||||||
|
#define HAVE_STRLEN 1
|
||||||
|
#define HAVE_STRLCPY 1
|
||||||
|
#define HAVE_STRLCAT 1
|
||||||
|
#define HAVE_STRDUP 1
|
||||||
|
#define HAVE_STRCHR 1
|
||||||
|
#define HAVE_STRRCHR 1
|
||||||
|
#define HAVE_STRSTR 1
|
||||||
|
#define HAVE_STRTOL 1
|
||||||
|
#define HAVE_STRTOUL 1
|
||||||
|
#define HAVE_STRTOLL 1
|
||||||
|
#define HAVE_STRTOULL 1
|
||||||
|
#define HAVE_ATOI 1
|
||||||
|
#define HAVE_ATOF 1
|
||||||
|
#define HAVE_STRCMP 1
|
||||||
|
#define HAVE_STRNCMP 1
|
||||||
|
#define HAVE_STRCASECMP 1
|
||||||
|
#define HAVE_STRNCASECMP 1
|
||||||
|
#define HAVE_SSCANF 1
|
||||||
|
#define HAVE_SNPRINTF 1
|
||||||
|
#define HAVE_VSNPRINTF 1
|
||||||
|
#define HAVE_SETJMP 1
|
||||||
|
|
||||||
|
/* Enable various audio drivers */
|
||||||
|
#define SDL_AUDIO_DRIVER_NDS 1
|
||||||
|
#define SDL_AUDIO_DRIVER_DUMMY 1
|
||||||
|
|
||||||
|
/* Enable the stub cdrom driver (src/cdrom/dummy/\*.c) */
|
||||||
|
#define SDL_CDROM_DISABLED 1
|
||||||
|
|
||||||
|
/* Enable various input drivers */
|
||||||
|
#define SDL_JOYSTICK_NDS 1
|
||||||
|
|
||||||
|
/* Enable the stub shared object loader (src/loadso/dummy/\*.c) */
|
||||||
|
#define SDL_LOADSO_DISABLED 1
|
||||||
|
|
||||||
|
/* Enable the stub thread support (src/thread/generic/\*.c) */
|
||||||
|
#define SDL_THREADS_DISABLED 1
|
||||||
|
|
||||||
|
/* Enable various timer systems */
|
||||||
|
#define SDL_TIMER_NDS 1
|
||||||
|
|
||||||
|
/* Enable various video drivers */
|
||||||
|
#define SDL_VIDEO_DRIVER_NDS 1
|
||||||
|
#define SDL_VIDEO_DRIVER_DUMMY 1
|
||||||
|
|
||||||
|
#endif /* _SDL_config_nds_h */
|
|
@ -129,7 +129,9 @@ typedef enum {
|
||||||
DUMMY_ENUM_VALUE
|
DUMMY_ENUM_VALUE
|
||||||
} SDL_DUMMY_ENUM;
|
} SDL_DUMMY_ENUM;
|
||||||
|
|
||||||
|
#ifndef __NDS__
|
||||||
SDL_COMPILE_TIME_ASSERT(enum, sizeof(SDL_DUMMY_ENUM) == sizeof(int));
|
SDL_COMPILE_TIME_ASSERT(enum, sizeof(SDL_DUMMY_ENUM) == sizeof(int));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#include "begin_code.h"
|
#include "begin_code.h"
|
||||||
|
|
|
@ -54,7 +54,9 @@ static SDL_version version =
|
||||||
|
|
||||||
/* The initialized subsystems */
|
/* The initialized subsystems */
|
||||||
static Uint32 SDL_initialized = 0;
|
static Uint32 SDL_initialized = 0;
|
||||||
|
#if !SDL_TIMERS_DISABLED
|
||||||
static Uint32 ticks_started = 0;
|
static Uint32 ticks_started = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CHECK_LEAKS
|
#ifdef CHECK_LEAKS
|
||||||
int surfaces_allocated = 0;
|
int surfaces_allocated = 0;
|
||||||
|
|
|
@ -101,6 +101,9 @@ static AudioBootStrap *bootstrap[] = {
|
||||||
#if SDL_AUDIO_DRIVER_DC
|
#if SDL_AUDIO_DRIVER_DC
|
||||||
&DCAUD_bootstrap,
|
&DCAUD_bootstrap,
|
||||||
#endif
|
#endif
|
||||||
|
#if SDL_AUDIO_DRIVER_NDS
|
||||||
|
&NDSAUD_bootstrap,
|
||||||
|
#endif
|
||||||
#if SDL_AUDIO_DRIVER_MMEAUDIO
|
#if SDL_AUDIO_DRIVER_MMEAUDIO
|
||||||
&MMEAUDIO_bootstrap,
|
&MMEAUDIO_bootstrap,
|
||||||
#endif
|
#endif
|
||||||
|
@ -470,10 +473,7 @@ int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained)
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(__MACOS__) || (defined(__RISCOS__) && SDL_THREADS_DISABLED)
|
#if SDL_THREADS_DISABLED
|
||||||
/* FIXME: Need to implement PPC interrupt asm for SDL_LockAudio() */
|
|
||||||
#else
|
|
||||||
#if defined(__MINT__) && SDL_THREADS_DISABLED
|
|
||||||
/* Uses interrupt driven audio, without thread */
|
/* Uses interrupt driven audio, without thread */
|
||||||
#else
|
#else
|
||||||
/* Create a semaphore for locking the sound buffers */
|
/* Create a semaphore for locking the sound buffers */
|
||||||
|
@ -483,8 +483,7 @@ int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained)
|
||||||
SDL_CloseAudio();
|
SDL_CloseAudio();
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
#endif /* __MINT__ */
|
#endif /* SDL_THREADS_DISABLED */
|
||||||
#endif /* __MACOS__ */
|
|
||||||
|
|
||||||
/* Calculate the silence and size of the audio specification */
|
/* Calculate the silence and size of the audio specification */
|
||||||
SDL_CalculateAudioSpec(desired);
|
SDL_CalculateAudioSpec(desired);
|
||||||
|
|
|
@ -165,6 +165,9 @@ extern AudioBootStrap DUMMYAUD_bootstrap;
|
||||||
#if SDL_AUDIO_DRIVER_DC
|
#if SDL_AUDIO_DRIVER_DC
|
||||||
extern AudioBootStrap DCAUD_bootstrap;
|
extern AudioBootStrap DCAUD_bootstrap;
|
||||||
#endif
|
#endif
|
||||||
|
#if SDL_AUDIO_DRIVER_NDS
|
||||||
|
extern AudioBootStrap NDSAUD_bootstrap;
|
||||||
|
#endif
|
||||||
#if SDL_AUDIO_DRIVER_MMEAUDIO
|
#if SDL_AUDIO_DRIVER_MMEAUDIO
|
||||||
extern AudioBootStrap MMEAUDIO_bootstrap;
|
extern AudioBootStrap MMEAUDIO_bootstrap;
|
||||||
#endif
|
#endif
|
||||||
|
|
335
src/audio/nds/SDL_ndsaudio.c
Normal file
335
src/audio/nds/SDL_ndsaudio.c
Normal file
|
@ -0,0 +1,335 @@
|
||||||
|
/*
|
||||||
|
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"
|
||||||
|
|
||||||
|
/* Allow access to a raw mixing buffer */
|
||||||
|
#include <nds.h>
|
||||||
|
#include "SDL.h"
|
||||||
|
#include "SDL_endian.h"
|
||||||
|
#include "SDL_timer.h"
|
||||||
|
#include "SDL_audio.h"
|
||||||
|
#include "../SDL_audiomem.h"
|
||||||
|
#include "../SDL_audio_c.h"
|
||||||
|
#include "SDL_ndsaudio.h"
|
||||||
|
#include "soundcommon.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* Audio driver functions */
|
||||||
|
static int NDS_OpenAudio(_THIS, SDL_AudioSpec *spec);
|
||||||
|
static void NDS_WaitAudio(_THIS);
|
||||||
|
static void NDS_PlayAudio(_THIS);
|
||||||
|
static Uint8 *NDS_GetAudioBuf(_THIS);
|
||||||
|
static void NDS_CloseAudio(_THIS);
|
||||||
|
|
||||||
|
/* Audio driver bootstrap functions */
|
||||||
|
|
||||||
|
u32 framecounter = 0,soundoffset = 0;
|
||||||
|
static SDL_AudioDevice *sdl_nds_audiodevice;
|
||||||
|
|
||||||
|
//void SoundMixCallback(void *stream,u32 size)
|
||||||
|
//{
|
||||||
|
// //printf("SoundMixCallback\n");
|
||||||
|
//
|
||||||
|
// Uint8 *buffer;
|
||||||
|
//
|
||||||
|
// buffer = sdl_nds_audiodevice->hidden->mixbuf;
|
||||||
|
// memset(buffer, sdl_nds_audiodevice->spec.silence, size);
|
||||||
|
//
|
||||||
|
// if (!sdl_nds_audiodevice->paused){
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// //if (sdl_nds_audiodevice->convert.needed) {
|
||||||
|
// // int silence;
|
||||||
|
//
|
||||||
|
// // if (sdl_nds_audiodevice->convert.src_format == AUDIO_U8 ) {
|
||||||
|
// // silence = 0x80;
|
||||||
|
// // } else {
|
||||||
|
// // silence = 0;
|
||||||
|
// // }
|
||||||
|
// // memset(sdl_nds_audiodevice->convert.buf, silence, sdl_nds_audiodevice->convert.len);
|
||||||
|
// // sdl_nds_audiodevice->spec.callback(sdl_nds_audiodevice->spec.userdata,
|
||||||
|
// // (Uint8 *)sdl_nds_audiodevice->convert.buf,sdl_nds_audiodevice->convert.len);
|
||||||
|
// // SDL_ConvertAudio(&sdl_nds_audiodevice->convert);
|
||||||
|
// // memcpy(buffer, sdl_nds_audiodevice->convert.buf, sdl_nds_audiodevice->convert.len_cvt);
|
||||||
|
// //} else
|
||||||
|
// {
|
||||||
|
// sdl_nds_audiodevice->spec.callback(sdl_nds_audiodevice->spec.userdata, buffer, size);
|
||||||
|
// //memcpy((Sint16 *)stream,buffer, size);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// if(soundsystem->format == 8)
|
||||||
|
// {
|
||||||
|
// int i;
|
||||||
|
// s32 *buffer32 = (s32 *)buffer;
|
||||||
|
// s32 *stream32 = (s32 *)stream;
|
||||||
|
// for(i=0;i<size/4;i++){ *stream32++ = buffer32[i] ^ 0x80808080;}
|
||||||
|
// //for(i = 0; i < size; i++)
|
||||||
|
// // ((s8*)stream)[i]=(buffer[i]^0x80);
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// int i;
|
||||||
|
// for(i = 0; i < size; i++){
|
||||||
|
// //((short*)stream)[i] =(short)buffer[i] << 8; // sound 8bit ---> buffer 16bit
|
||||||
|
// //if (buffer[i] &0x80)
|
||||||
|
// //((Sint16*)stream)[i] = 0xff00 | buffer[i];
|
||||||
|
// ((Sint16*)stream)[i] = (buffer[i] - 128) << 8;
|
||||||
|
//
|
||||||
|
// //else
|
||||||
|
// // ((Sint16*)stream)[i] = buffer[i];
|
||||||
|
// }
|
||||||
|
// //register signed char *pSrc =buffer;
|
||||||
|
// //register short *pDest =stream;
|
||||||
|
// //int x;
|
||||||
|
// // for (x=size; x>0; x--)
|
||||||
|
// // {
|
||||||
|
// // register short temp = (((short)*pSrc)-128)<<8;
|
||||||
|
// // pSrc++;
|
||||||
|
// // *pDest++ = temp;
|
||||||
|
// // }
|
||||||
|
//
|
||||||
|
// //memcpy((Sint16 *)stream,buffer, size);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
void SoundMixCallback(void *stream,u32 len)
|
||||||
|
{
|
||||||
|
SDL_AudioDevice *audio = (SDL_AudioDevice *)sdl_nds_audiodevice;
|
||||||
|
|
||||||
|
/* Silence the buffer, since it's ours */
|
||||||
|
SDL_memset(stream, audio->spec.silence, len);
|
||||||
|
|
||||||
|
/* Only do soemthing if audio is enabled */
|
||||||
|
if ( ! audio->enabled )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ( ! audio->paused ) {
|
||||||
|
if ( audio->convert.needed ) {
|
||||||
|
//fprintf(stderr,"converting audio\n");
|
||||||
|
SDL_mutexP(audio->mixer_lock);
|
||||||
|
(*audio->spec.callback)(audio->spec.userdata,
|
||||||
|
(Uint8 *)audio->convert.buf,audio->convert.len);
|
||||||
|
SDL_mutexV(audio->mixer_lock);
|
||||||
|
SDL_ConvertAudio(&audio->convert);
|
||||||
|
SDL_memcpy(stream,audio->convert.buf,audio->convert.len_cvt);
|
||||||
|
} else {
|
||||||
|
SDL_mutexP(audio->mixer_lock);
|
||||||
|
(*audio->spec.callback)(audio->spec.userdata,
|
||||||
|
(Uint8 *)stream, len);
|
||||||
|
SDL_mutexV(audio->mixer_lock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
void MixSound(void)
|
||||||
|
{
|
||||||
|
int remain;
|
||||||
|
|
||||||
|
if(soundsystem->format == 8)
|
||||||
|
{
|
||||||
|
if((soundsystem->soundcursor + soundsystem->numsamples) > soundsystem->buffersize)
|
||||||
|
{
|
||||||
|
SoundMixCallback(&soundsystem->mixbuffer[soundsystem->soundcursor],soundsystem->buffersize - soundsystem->soundcursor);
|
||||||
|
remain = soundsystem->numsamples - (soundsystem->buffersize - soundsystem->soundcursor);
|
||||||
|
SoundMixCallback(soundsystem->mixbuffer,remain);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SoundMixCallback(&soundsystem->mixbuffer[soundsystem->soundcursor],soundsystem->numsamples);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if((soundsystem->soundcursor + soundsystem->numsamples) > (soundsystem->buffersize >> 1))
|
||||||
|
{
|
||||||
|
SoundMixCallback(&soundsystem->mixbuffer[soundsystem->soundcursor << 1],(soundsystem->buffersize >> 1) - soundsystem->soundcursor);
|
||||||
|
remain = soundsystem->numsamples - ((soundsystem->buffersize >> 1) - soundsystem->soundcursor);
|
||||||
|
SoundMixCallback(soundsystem->mixbuffer,remain);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SoundMixCallback(&soundsystem->mixbuffer[soundsystem->soundcursor << 1],soundsystem->numsamples);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void InterruptHandler(void)
|
||||||
|
{
|
||||||
|
framecounter++;
|
||||||
|
}
|
||||||
|
void FiFoHandler(void)
|
||||||
|
{
|
||||||
|
u32 command;
|
||||||
|
while ( !(REG_IPC_FIFO_CR & (IPC_FIFO_RECV_EMPTY)) )
|
||||||
|
{
|
||||||
|
command = REG_IPC_FIFO_RX;
|
||||||
|
|
||||||
|
switch(command)
|
||||||
|
{
|
||||||
|
case FIFO_NONE:
|
||||||
|
break;
|
||||||
|
case UPDATEON_ARM9:
|
||||||
|
REG_IME = 0;
|
||||||
|
MixSound();
|
||||||
|
REG_IME = 1;
|
||||||
|
SendCommandToArm7(MIXCOMPLETE_ONARM9);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static int Audio_Available(void)
|
||||||
|
{
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Audio_DeleteDevice(SDL_AudioDevice *device)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static SDL_AudioDevice *Audio_CreateDevice(int devindex)
|
||||||
|
{
|
||||||
|
|
||||||
|
SDL_AudioDevice *this;
|
||||||
|
|
||||||
|
/* Initialize all variables that we clean on shutdown */
|
||||||
|
this = (SDL_AudioDevice *)malloc(sizeof(SDL_AudioDevice));
|
||||||
|
if ( this ) {
|
||||||
|
SDL_memset(this, 0, (sizeof *this));
|
||||||
|
this->hidden = (struct SDL_PrivateAudioData *)
|
||||||
|
SDL_malloc((sizeof *this->hidden));
|
||||||
|
}
|
||||||
|
if ( (this == NULL) || (this->hidden == NULL) ) {
|
||||||
|
SDL_OutOfMemory();
|
||||||
|
if ( this ) {
|
||||||
|
SDL_free(this);
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
SDL_memset(this->hidden, 0, (sizeof *this->hidden));
|
||||||
|
|
||||||
|
/* Set the function pointers */
|
||||||
|
this->OpenAudio = NDS_OpenAudio;
|
||||||
|
this->WaitAudio = NDS_WaitAudio;
|
||||||
|
this->PlayAudio = NDS_PlayAudio;
|
||||||
|
this->GetAudioBuf = NDS_GetAudioBuf;
|
||||||
|
this->CloseAudio = NDS_CloseAudio;
|
||||||
|
|
||||||
|
this->free = Audio_DeleteDevice;
|
||||||
|
//fprintf(stderr,"Audio_CreateDevice\n");
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
AudioBootStrap NDSAUD_bootstrap = {
|
||||||
|
"nds", "NDS audio",
|
||||||
|
Audio_Available, Audio_CreateDevice
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void static NDS_WaitAudio(_THIS)
|
||||||
|
{
|
||||||
|
//printf("NDS_WaitAudio\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void NDS_PlayAudio(_THIS)
|
||||||
|
{
|
||||||
|
//printf("playing audio\n");
|
||||||
|
if (this->paused)
|
||||||
|
return;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static Uint8 *NDS_GetAudioBuf(_THIS)
|
||||||
|
{
|
||||||
|
return NULL;//(this->hidden->mixbuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void NDS_CloseAudio(_THIS)
|
||||||
|
{
|
||||||
|
/* if ( this->hidden->mixbuf != NULL ) {
|
||||||
|
SDL_FreeAudioMem(this->hidden->mixbuf);
|
||||||
|
this->hidden->mixbuf = NULL;
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
|
||||||
|
static int NDS_OpenAudio(_THIS, SDL_AudioSpec *spec)
|
||||||
|
{
|
||||||
|
//printf("NDS_OpenAudio\n");
|
||||||
|
int format = 0;
|
||||||
|
//switch(spec->format&0xff) {
|
||||||
|
//case 8: spec->format = AUDIO_S8;format=8; break;
|
||||||
|
//case 16: spec->format = AUDIO_S16LSB;format=16; break;
|
||||||
|
//default:
|
||||||
|
// SDL_SetError("Unsupported audio format");
|
||||||
|
// return(-1);
|
||||||
|
//}
|
||||||
|
switch (spec->format&~0x1000) {
|
||||||
|
case AUDIO_S8:
|
||||||
|
/* Signed 8-bit audio supported */
|
||||||
|
format=8;
|
||||||
|
break;
|
||||||
|
case AUDIO_U8:
|
||||||
|
spec->format ^= 0x80;format=8;
|
||||||
|
break;
|
||||||
|
case AUDIO_U16:
|
||||||
|
/* Unsigned 16-bit audio unsupported, convert to S16 */
|
||||||
|
spec->format ^=0x8000;format=16;
|
||||||
|
case AUDIO_S16:
|
||||||
|
/* Signed 16-bit audio supported */
|
||||||
|
format=16;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* Update the fragment size as size in bytes */
|
||||||
|
SDL_CalculateAudioSpec(spec);
|
||||||
|
|
||||||
|
/* Allocate mixing buffer */
|
||||||
|
//this->hidden->mixlen = spec->size;
|
||||||
|
//this->hidden->mixbuf = (Uint8 *) SDL_AllocAudioMem(this->hidden->mixlen);
|
||||||
|
//if ( this->hidden->mixbuf == NULL ) {
|
||||||
|
// SDL_SetError("Out of Memory");
|
||||||
|
// return(-1);
|
||||||
|
//}
|
||||||
|
|
||||||
|
SDL_NDSAudio_mutex = 0;
|
||||||
|
sdl_nds_audiodevice=this;
|
||||||
|
|
||||||
|
irqInit();
|
||||||
|
irqSet(IRQ_VBLANK,&InterruptHandler);
|
||||||
|
irqSet(IRQ_FIFO_NOT_EMPTY,&FiFoHandler);
|
||||||
|
irqEnable(IRQ_FIFO_NOT_EMPTY);
|
||||||
|
|
||||||
|
REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_SEND_CLEAR | IPC_FIFO_RECV_IRQ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
SoundSystemInit(spec->freq,spec->size,0,format);
|
||||||
|
SoundStartMixer();
|
||||||
|
|
||||||
|
|
||||||
|
return(1);
|
||||||
|
}
|
40
src/audio/nds/SDL_ndsaudio.h
Normal file
40
src/audio/nds/SDL_ndsaudio.h
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
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"
|
||||||
|
|
||||||
|
#ifndef _SDL_lowaudio_h
|
||||||
|
#define _SDL_lowaudio_h
|
||||||
|
|
||||||
|
#include "../SDL_sysaudio.h"
|
||||||
|
|
||||||
|
/* Hidden "this" pointer for the audio functions */
|
||||||
|
#define _THIS SDL_AudioDevice *this
|
||||||
|
|
||||||
|
struct SDL_PrivateAudioData {
|
||||||
|
/* The file descriptor for the audio device */
|
||||||
|
//Uint8 *mixbuf;
|
||||||
|
//Uint32 mixlen;
|
||||||
|
};
|
||||||
|
unsigned short SDL_NDSAudio_mutex=0;
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _SDL_lowaudio_h */
|
61
src/audio/nds/sound9.c
Normal file
61
src/audio/nds/sound9.c
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
/*
|
||||||
|
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"
|
||||||
|
#include "SDL_stdinc.h"
|
||||||
|
|
||||||
|
#include "soundcommon.h"
|
||||||
|
|
||||||
|
void SoundSystemInit(u32 rate,u32 buffersize,u8 channel,u8 format)
|
||||||
|
{
|
||||||
|
soundsystem->rate = rate;
|
||||||
|
|
||||||
|
if(format == 8)
|
||||||
|
soundsystem->buffersize = buffersize;
|
||||||
|
else if(format == 16)
|
||||||
|
soundsystem->buffersize = buffersize * sizeof(short);
|
||||||
|
|
||||||
|
soundsystem->mixbuffer = (s8*)SDL_malloc(soundsystem->buffersize);
|
||||||
|
//soundsystem->soundbuffer = soundsystem->mixbuffer;
|
||||||
|
soundsystem->format = format;
|
||||||
|
soundsystem->channel = channel;
|
||||||
|
soundsystem->prevtimer = 0;
|
||||||
|
soundsystem->soundcursor = 0;
|
||||||
|
soundsystem->numsamples = 0;
|
||||||
|
soundsystem->period = 0x1000000 / rate;
|
||||||
|
soundsystem->cmd = INIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SoundStartMixer(void)
|
||||||
|
{
|
||||||
|
soundsystem->cmd |= MIX;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SendCommandToArm7(u32 command)
|
||||||
|
{
|
||||||
|
while (REG_IPC_FIFO_CR & IPC_FIFO_SEND_FULL);
|
||||||
|
if (REG_IPC_FIFO_CR & IPC_FIFO_ERROR)
|
||||||
|
{
|
||||||
|
REG_IPC_FIFO_CR |= IPC_FIFO_SEND_CLEAR;
|
||||||
|
}
|
||||||
|
|
||||||
|
REG_IPC_FIFO_TX = command;
|
||||||
|
}
|
80
src/audio/nds/soundcommon.h
Normal file
80
src/audio/nds/soundcommon.h
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
/*
|
||||||
|
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"
|
||||||
|
|
||||||
|
#ifndef __SOUNDCOMMON_H
|
||||||
|
#define __SOUNDCOMMON_H
|
||||||
|
|
||||||
|
#include <nds.h>
|
||||||
|
|
||||||
|
#define CLOCK (1 << 25)
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
NONE = 0,
|
||||||
|
INIT = 1,
|
||||||
|
MIX = 2,
|
||||||
|
MIXING = 4,
|
||||||
|
STOP = 8
|
||||||
|
}CommandType;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
FIFO_NONE = 0,
|
||||||
|
UPDATEON_ARM9 = 1,
|
||||||
|
MIXCOMPLETE_ONARM9 = 2,
|
||||||
|
}FifoType;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
s8 *mixbuffer;//,*soundbuffer;
|
||||||
|
u32 rate;
|
||||||
|
u32 buffersize;
|
||||||
|
u32 cmd;
|
||||||
|
u8 channel,format;
|
||||||
|
u32 soundcursor,numsamples;
|
||||||
|
s32 prevtimer;
|
||||||
|
s16 period;
|
||||||
|
}S_SoundSystem;
|
||||||
|
|
||||||
|
#define soundsystem ((S_SoundSystem*)((u32)(IPC)+sizeof(TransferRegion)))
|
||||||
|
|
||||||
|
#ifdef ARM9
|
||||||
|
extern void SoundSystemInit(u32 rate,u32 buffersize,u8 channel,u8 format);
|
||||||
|
extern void SoundStartMixer(void);
|
||||||
|
extern void SendCommandToArm7(u32 command);
|
||||||
|
#else
|
||||||
|
extern void SoundVBlankIrq(void);
|
||||||
|
extern void SoundSwapAndMix(void);
|
||||||
|
extern void SoundSetTimer(int period);
|
||||||
|
extern void SoundFifoHandler(void);
|
||||||
|
extern void SendCommandToArm9(u32 command);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
150
src/joystick/nds/SDL_sysjoystick.c
Normal file
150
src/joystick/nds/SDL_sysjoystick.c
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
/*
|
||||||
|
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"
|
||||||
|
|
||||||
|
/* This is the system specific header for the SDL joystick API */
|
||||||
|
#include <nds.h>
|
||||||
|
//#include <nds/registers_alt.h>
|
||||||
|
|
||||||
|
#include "SDL_error.h"
|
||||||
|
#include "SDL_events.h"
|
||||||
|
#include "SDL_joystick.h"
|
||||||
|
#include "../SDL_sysjoystick.h"
|
||||||
|
#include "../SDL_joystick_c.h"
|
||||||
|
|
||||||
|
#include "../../video/nds/SDL_ndsevents_c.h"
|
||||||
|
|
||||||
|
/* Function to scan the system for joysticks.
|
||||||
|
* This function should set SDL_numjoysticks to the number of available
|
||||||
|
* joysticks. Joystick 0 should be the system default joystick.
|
||||||
|
* It should return 0, or -1 on an unrecoverable fatal error.
|
||||||
|
*/
|
||||||
|
int SDL_SYS_JoystickInit(void)
|
||||||
|
{
|
||||||
|
SDL_numjoysticks = 1;
|
||||||
|
//keysInit();
|
||||||
|
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Function to get the device-dependent name of a joystick */
|
||||||
|
const char *SDL_SYS_JoystickName(int index)
|
||||||
|
{
|
||||||
|
if(!index)
|
||||||
|
return "NDS builtin joypad";
|
||||||
|
SDL_SetError("No joystick available with that index");
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Function to open a joystick for use.
|
||||||
|
The joystick to open is specified by the index field of the joystick.
|
||||||
|
This should fill the nbuttons and naxes fields of the joystick structure.
|
||||||
|
It returns 0, or -1 if there is an error.
|
||||||
|
*/
|
||||||
|
int SDL_SYS_JoystickOpen(SDL_Joystick *joystick)
|
||||||
|
{
|
||||||
|
joystick->nbuttons=8;
|
||||||
|
joystick->nhats=0;
|
||||||
|
joystick->nballs=0;
|
||||||
|
joystick->naxes=2;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Function to update the state of a joystick - called as a device poll.
|
||||||
|
* This function shouldn't update the joystick structure directly,
|
||||||
|
* but instead should call SDL_PrivateJoystick*() to deliver events
|
||||||
|
* and update joystick device state.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int prevbutton=0;
|
||||||
|
int prevkey=0;
|
||||||
|
|
||||||
|
int dc=0;int ldc=0;
|
||||||
|
u32 keysd,keysu=0;
|
||||||
|
void SDL_SYS_JoystickUpdate(SDL_Joystick *joystick)
|
||||||
|
{
|
||||||
|
//dc=keysd;
|
||||||
|
//if (dc)
|
||||||
|
//{
|
||||||
|
//fprintf(stderr,"heartbeat= %d\n",REG_VCOUNT);
|
||||||
|
//swiWaitForVBlank();
|
||||||
|
//scanKeys();
|
||||||
|
//keysd = keysDown();
|
||||||
|
//keysu = keysUp();
|
||||||
|
//ldc=keysd;
|
||||||
|
|
||||||
|
//}
|
||||||
|
/*if (prevkey && prevbutton)
|
||||||
|
{
|
||||||
|
scanKeys();
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
//scanKeys();
|
||||||
|
keysd = keysDown();
|
||||||
|
keysu = keysUp();
|
||||||
|
|
||||||
|
|
||||||
|
short ax=0,v=0,h=0;
|
||||||
|
if((keysd&KEY_UP)) {ax=1;v=-10;SDL_PrivateJoystickAxis(joystick,ax,v);prevkey=KEY_UP;}//fprintf(stderr,"KEY_UP\n");}
|
||||||
|
if((keysd&KEY_DOWN)) {ax=1;v=10;SDL_PrivateJoystickAxis(joystick,ax,v);prevkey=KEY_DOWN;}//fprintf(stderr,"KEY_DOWN\n");}
|
||||||
|
if((keysd&KEY_LEFT)) {ax=0;h=-10;SDL_PrivateJoystickAxis(joystick,ax,h);prevkey=KEY_LEFT;}//fprintf(stderr,"KEY_LEFT\n");}
|
||||||
|
if((keysd&KEY_RIGHT)) {ax=0;h=10;SDL_PrivateJoystickAxis(joystick,ax,h);prevkey=KEY_RIGHT;}//fprintf(stderr,"KEY_RIGHT\n");}
|
||||||
|
|
||||||
|
if((keysu&KEY_UP)) {ax=1;v=0;SDL_PrivateJoystickAxis(joystick,ax,v);prevkey=0;}//fprintf(stderr,"KEY_UP\n");}
|
||||||
|
if((keysu&KEY_DOWN)) {ax=1;v=0;SDL_PrivateJoystickAxis(joystick,ax,v);prevkey=0;}//fprintf(stderr,"KEY_DOWN\n");}
|
||||||
|
if((keysu&KEY_LEFT)) {ax=0;h=0;SDL_PrivateJoystickAxis(joystick,ax,h);prevkey=0;}//fprintf(stderr,"KEY_LEFT\n");}
|
||||||
|
if((keysu&KEY_RIGHT)) {ax=0;h=0;SDL_PrivateJoystickAxis(joystick,ax,h);prevkey=0;}//fprintf(stderr,"KEY_RIGHT\n");}
|
||||||
|
|
||||||
|
if((keysd&KEY_A)) {SDL_PrivateJoystickButton(joystick,0,SDL_PRESSED);prevbutton=KEY_A;}
|
||||||
|
if((keysd&KEY_B)) {SDL_PrivateJoystickButton(joystick,1,SDL_PRESSED);prevbutton=KEY_B;}
|
||||||
|
if((keysd&KEY_X)) {SDL_PrivateJoystickButton(joystick,2,SDL_PRESSED);prevbutton=KEY_X;}
|
||||||
|
if((keysd&KEY_Y)) {SDL_PrivateJoystickButton(joystick,3,SDL_PRESSED);prevbutton=KEY_Y;}
|
||||||
|
if((keysd&KEY_SELECT)) {SDL_PrivateJoystickButton(joystick,6,SDL_PRESSED);prevbutton=KEY_SELECT;}
|
||||||
|
if((keysd&KEY_START)) {SDL_PrivateJoystickButton(joystick,7,SDL_PRESSED);prevbutton=KEY_START;}
|
||||||
|
if((keysd&KEY_L)) {SDL_PrivateJoystickButton(joystick,4,SDL_PRESSED);prevbutton=KEY_L;}
|
||||||
|
if((keysd&KEY_R)) {SDL_PrivateJoystickButton(joystick,5,SDL_PRESSED);prevbutton=KEY_R;}
|
||||||
|
|
||||||
|
if((keysu&KEY_A)) {SDL_PrivateJoystickButton(joystick,0,SDL_RELEASED);prevbutton=0;}
|
||||||
|
if((keysu&KEY_B)) {SDL_PrivateJoystickButton(joystick,1,SDL_RELEASED);prevbutton=0;}
|
||||||
|
if((keysu&KEY_X)) {SDL_PrivateJoystickButton(joystick,2,SDL_RELEASED);prevbutton=0;}
|
||||||
|
if((keysu&KEY_Y)) {SDL_PrivateJoystickButton(joystick,3,SDL_RELEASED);prevbutton=0;}
|
||||||
|
if((keysu&KEY_SELECT)) {SDL_PrivateJoystickButton(joystick,6,SDL_RELEASED);prevbutton=0;}
|
||||||
|
if((keysu&KEY_START)) {SDL_PrivateJoystickButton(joystick,7,SDL_RELEASED);prevbutton=0;}
|
||||||
|
if((keysu&KEY_L)) {SDL_PrivateJoystickButton(joystick,4,SDL_RELEASED);prevbutton=0;}
|
||||||
|
if((keysu&KEY_R)) {SDL_PrivateJoystickButton(joystick,5,SDL_RELEASED);prevbutton=0;}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Function to close a joystick after use */
|
||||||
|
void SDL_SYS_JoystickClose(SDL_Joystick *joystick)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Function to perform any system-specific joystick related cleanup */
|
||||||
|
void SDL_SYS_JoystickQuit(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
73
src/timer/nds/SDL_systimer.c
Normal file
73
src/timer/nds/SDL_systimer.c
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
/*
|
||||||
|
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"
|
||||||
|
|
||||||
|
#include "SDL_thread.h"
|
||||||
|
#include "SDL_timer.h"
|
||||||
|
#include "SDL_error.h"
|
||||||
|
#include "../SDL_timer_c.h"
|
||||||
|
|
||||||
|
#include <nds.h>
|
||||||
|
|
||||||
|
#define timers2ms(tlow,thigh)(tlow | (thigh<<16)) >> 5
|
||||||
|
|
||||||
|
|
||||||
|
void SDL_StartTicks(void)
|
||||||
|
{
|
||||||
|
TIMER0_DATA=0;
|
||||||
|
TIMER1_DATA=0;
|
||||||
|
TIMER0_CR=TIMER_ENABLE|TIMER_DIV_1024;
|
||||||
|
TIMER1_CR=TIMER_ENABLE|TIMER_CASCADE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Uint32 SDL_GetTicks(void)
|
||||||
|
{
|
||||||
|
return timers2ms(TIMER0_DATA, TIMER1_DATA);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDL_Delay(Uint32 ms)
|
||||||
|
{
|
||||||
|
Uint32 now;
|
||||||
|
now=timers2ms(TIMER0_DATA, TIMER1_DATA);
|
||||||
|
while((Uint32)timers2ms(TIMER0_DATA, TIMER1_DATA)<now+ms);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This is only called if the event thread is not running */
|
||||||
|
int SDL_SYS_TimerInit(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDL_SYS_TimerQuit(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int SDL_SYS_StartTimer(void)
|
||||||
|
{
|
||||||
|
SDL_SetError("Timers not implemented on NDS");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDL_SYS_StopTimer(void)
|
||||||
|
{
|
||||||
|
}
|
|
@ -166,12 +166,21 @@ do { \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
/* Assemble R-G-B values into a specified pixel format and store them */
|
/* Assemble R-G-B values into a specified pixel format and store them */
|
||||||
|
#ifdef __NDS__ // FIXME
|
||||||
|
#define PIXEL_FROM_RGB(Pixel, fmt, r, g, b) \
|
||||||
|
{ \
|
||||||
|
Pixel = ((r>>fmt->Rloss)<<fmt->Rshift)| \
|
||||||
|
((g>>fmt->Gloss)<<fmt->Gshift)| \
|
||||||
|
((b>>fmt->Bloss)<<fmt->Bshift) | (1<<15); \
|
||||||
|
}
|
||||||
|
#else
|
||||||
#define PIXEL_FROM_RGB(Pixel, fmt, r, g, b) \
|
#define PIXEL_FROM_RGB(Pixel, fmt, r, g, b) \
|
||||||
{ \
|
{ \
|
||||||
Pixel = ((r>>fmt->Rloss)<<fmt->Rshift)| \
|
Pixel = ((r>>fmt->Rloss)<<fmt->Rshift)| \
|
||||||
((g>>fmt->Gloss)<<fmt->Gshift)| \
|
((g>>fmt->Gloss)<<fmt->Gshift)| \
|
||||||
((b>>fmt->Bloss)<<fmt->Bshift); \
|
((b>>fmt->Bloss)<<fmt->Bshift); \
|
||||||
}
|
}
|
||||||
|
#endif // __NDS__ FIXME
|
||||||
#define RGB565_FROM_RGB(Pixel, r, g, b) \
|
#define RGB565_FROM_RGB(Pixel, r, g, b) \
|
||||||
{ \
|
{ \
|
||||||
Pixel = ((r>>3)<<11)|((g>>2)<<5)|(b>>3); \
|
Pixel = ((r>>3)<<11)|((g>>2)<<5)|(b>>3); \
|
||||||
|
@ -321,6 +330,15 @@ do { \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
/* FIXME: this isn't correct, especially for Alpha (maximum != 255) */
|
/* FIXME: this isn't correct, especially for Alpha (maximum != 255) */
|
||||||
|
#ifdef __NDS__ // FIXME
|
||||||
|
#define PIXEL_FROM_RGBA(Pixel, fmt, r, g, b, a) \
|
||||||
|
{ \
|
||||||
|
Pixel = ((r>>fmt->Rloss)<<fmt->Rshift)| \
|
||||||
|
((g>>fmt->Gloss)<<fmt->Gshift)| \
|
||||||
|
((b>>fmt->Bloss)<<fmt->Bshift)| \
|
||||||
|
((a>>fmt->Aloss)<<fmt->Ashift) | (1<<15); \
|
||||||
|
}
|
||||||
|
#else
|
||||||
#define PIXEL_FROM_RGBA(Pixel, fmt, r, g, b, a) \
|
#define PIXEL_FROM_RGBA(Pixel, fmt, r, g, b, a) \
|
||||||
{ \
|
{ \
|
||||||
Pixel = ((r>>fmt->Rloss)<<fmt->Rshift)| \
|
Pixel = ((r>>fmt->Rloss)<<fmt->Rshift)| \
|
||||||
|
@ -328,6 +346,7 @@ do { \
|
||||||
((b>>fmt->Bloss)<<fmt->Bshift)| \
|
((b>>fmt->Bloss)<<fmt->Bshift)| \
|
||||||
((a>>fmt->Aloss)<<fmt->Ashift); \
|
((a>>fmt->Aloss)<<fmt->Ashift); \
|
||||||
}
|
}
|
||||||
|
#endif // __NDS__ FIXME
|
||||||
#define ASSEMBLE_RGBA(buf, bpp, fmt, r, g, b, a) \
|
#define ASSEMBLE_RGBA(buf, bpp, fmt, r, g, b, a) \
|
||||||
{ \
|
{ \
|
||||||
switch (bpp) { \
|
switch (bpp) { \
|
||||||
|
|
|
@ -392,6 +392,9 @@ extern VideoBootStrap PG_bootstrap;
|
||||||
#if SDL_VIDEO_DRIVER_DC
|
#if SDL_VIDEO_DRIVER_DC
|
||||||
extern VideoBootStrap DC_bootstrap;
|
extern VideoBootStrap DC_bootstrap;
|
||||||
#endif
|
#endif
|
||||||
|
#if SDL_VIDEO_DRIVER_NDS
|
||||||
|
extern VideoBootStrap NDS_bootstrap;
|
||||||
|
#endif
|
||||||
#if SDL_VIDEO_DRIVER_RISCOS
|
#if SDL_VIDEO_DRIVER_RISCOS
|
||||||
extern VideoBootStrap RISCOS_bootstrap;
|
extern VideoBootStrap RISCOS_bootstrap;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -108,6 +108,9 @@ static VideoBootStrap *bootstrap[] = {
|
||||||
#if SDL_VIDEO_DRIVER_DC
|
#if SDL_VIDEO_DRIVER_DC
|
||||||
&DC_bootstrap,
|
&DC_bootstrap,
|
||||||
#endif
|
#endif
|
||||||
|
#if SDL_VIDEO_DRIVER_NDS
|
||||||
|
&NDS_bootstrap,
|
||||||
|
#endif
|
||||||
#if SDL_VIDEO_DRIVER_RISCOS
|
#if SDL_VIDEO_DRIVER_RISCOS
|
||||||
&RISCOS_bootstrap,
|
&RISCOS_bootstrap,
|
||||||
#endif
|
#endif
|
||||||
|
|
83
src/video/nds/SDL_ndsevents.c
Normal file
83
src/video/nds/SDL_ndsevents.c
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
/*
|
||||||
|
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"
|
||||||
|
|
||||||
|
/* Being a nds driver, there's no event stream. We just define stubs for
|
||||||
|
most of the API. */
|
||||||
|
#include <nds.h>
|
||||||
|
#include "SDL.h"
|
||||||
|
#include "../../events/SDL_sysevents.h"
|
||||||
|
#include "../../events/SDL_events_c.h"
|
||||||
|
#include "SDL_ndsvideo.h"
|
||||||
|
#include "SDL_ndsevents_c.h"
|
||||||
|
|
||||||
|
static SDLKey keymap[NDS_NUMKEYS];
|
||||||
|
char keymem[NDS_NUMKEYS]; /* memorize states of buttons */
|
||||||
|
|
||||||
|
void NDS_PumpEvents(_THIS)
|
||||||
|
{
|
||||||
|
scanKeys();
|
||||||
|
int i;
|
||||||
|
SDL_keysym keysym;
|
||||||
|
keysym.mod=KMOD_NONE;
|
||||||
|
for(i=0;i<NDS_NUMKEYS;i++)
|
||||||
|
{
|
||||||
|
keysym.scancode=i;
|
||||||
|
keysym.sym=keymap[i];
|
||||||
|
if(keysHeld()&(1<<i) && !keymem[i])
|
||||||
|
{
|
||||||
|
keymem[i]=1;
|
||||||
|
//printf("key released %d\n",i);
|
||||||
|
SDL_PrivateKeyboard(SDL_RELEASED, &keysym);
|
||||||
|
}
|
||||||
|
if(!(keysHeld()&(1<<i)) && keymem[i])
|
||||||
|
{
|
||||||
|
keymem[i]=0;
|
||||||
|
//printf("key pressed %d\n",i);
|
||||||
|
SDL_PrivateKeyboard(SDL_PRESSED, &keysym);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//touchPosition touch;
|
||||||
|
//touch=touchReadXY();
|
||||||
|
//if (touch.px!=0 || touch.py!=0)
|
||||||
|
// SDL_PrivateMouseMotion(SDL_PRESSED, 0, touch.px, touch.py);
|
||||||
|
}
|
||||||
|
|
||||||
|
void NDS_InitOSKeymap(_THIS)
|
||||||
|
{
|
||||||
|
SDL_memset(keymem,1,NDS_NUMKEYS);
|
||||||
|
keymap[KEY_A]=SDLK_a;
|
||||||
|
keymap[KEY_B]=SDLK_s;
|
||||||
|
keymap[KEY_X]=SDLK_w;
|
||||||
|
keymap[KEY_Y]=SDLK_d;
|
||||||
|
keymap[KEY_L]=SDLK_q;
|
||||||
|
keymap[KEY_R]=SDLK_e;
|
||||||
|
keymap[KEY_UP]=SDLK_UP;
|
||||||
|
keymap[KEY_DOWN]=SDLK_DOWN;
|
||||||
|
keymap[KEY_LEFT]=SDLK_LEFT;
|
||||||
|
keymap[KEY_RIGHT]=SDLK_RIGHT;
|
||||||
|
keymap[KEY_SELECT]=SDLK_SPACE;
|
||||||
|
keymap[KEY_START]=SDLK_RETURN;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* end of SDL_gbaevents.c ... */
|
||||||
|
|
51
src/video/nds/SDL_ndsevents_c.h
Normal file
51
src/video/nds/SDL_ndsevents_c.h
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
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"
|
||||||
|
|
||||||
|
#include "SDL_ndsvideo.h"
|
||||||
|
|
||||||
|
/* Variables and functions exported by SDL_sysevents.c to other parts
|
||||||
|
of the native video subsystem (SDL_sysvideo.c)
|
||||||
|
*/
|
||||||
|
extern void NDS_InitOSKeymap(_THIS);
|
||||||
|
extern void NDS_PumpEvents(_THIS);
|
||||||
|
|
||||||
|
#define NDS_NUMKEYS 12
|
||||||
|
|
||||||
|
/*
|
||||||
|
#define NDS_JOYPADREG 0x4000130
|
||||||
|
#define NDS_JOYPAD (*(volatile Uint16*)NDS_JOYPADREG)
|
||||||
|
|
||||||
|
#define NDS_NUMKEYS 10
|
||||||
|
#define NDS_KEYA (0)
|
||||||
|
#define NDS_KEYB (1)
|
||||||
|
#define NDS_KEYSEL (2)
|
||||||
|
#define NDS_KEYSTART (3)
|
||||||
|
#define NDS_KEYRIGHT (4)
|
||||||
|
#define NDS_KEYLEFT (5)
|
||||||
|
#define NDS_KEYUP (6)
|
||||||
|
#define NDS_KEYDOWN (7)
|
||||||
|
#define NDS_KEYR (8)
|
||||||
|
#define NDS_KEYL (9)
|
||||||
|
*/
|
||||||
|
/* end of SDL_NDSevents_c.h ... */
|
||||||
|
|
34
src/video/nds/SDL_ndsmouse.c
Normal file
34
src/video/nds/SDL_ndsmouse.c
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
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"
|
||||||
|
|
||||||
|
#include "SDL_error.h"
|
||||||
|
#include "SDL_mouse.h"
|
||||||
|
#include "../../events/SDL_events_c.h"
|
||||||
|
|
||||||
|
#include "SDL_ndsmouse_c.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* The implementation dependent data for the window manager cursor */
|
||||||
|
struct WMcursor {
|
||||||
|
int unused;
|
||||||
|
};
|
26
src/video/nds/SDL_ndsmouse_c.h
Normal file
26
src/video/nds/SDL_ndsmouse_c.h
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
/*
|
||||||
|
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"
|
||||||
|
|
||||||
|
#include "SDL_ndsvideo.h"
|
||||||
|
|
||||||
|
/* Functions to be exported */
|
500
src/video/nds/SDL_ndsvideo.c
Normal file
500
src/video/nds/SDL_ndsvideo.c
Normal file
|
@ -0,0 +1,500 @@
|
||||||
|
/*
|
||||||
|
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"
|
||||||
|
|
||||||
|
#include <nds.h>
|
||||||
|
#include <nds/registers_alt.h>
|
||||||
|
#include "SDL.h"
|
||||||
|
#include "SDL_error.h"
|
||||||
|
#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_ndsmouse_c.h"
|
||||||
|
|
||||||
|
#define NDSVID_DRIVER_NAME "nds"
|
||||||
|
|
||||||
|
/* Initialization/Query functions */
|
||||||
|
static int NDS_VideoInit(_THIS, SDL_PixelFormat *vformat);
|
||||||
|
static SDL_Rect **NDS_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags);
|
||||||
|
static SDL_Surface *NDS_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags);
|
||||||
|
static int NDS_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors);
|
||||||
|
static void NDS_VideoQuit(_THIS);
|
||||||
|
|
||||||
|
/* Hardware surface functions */
|
||||||
|
static int NDS_AllocHWSurface(_THIS, SDL_Surface *surface);
|
||||||
|
static int NDS_LockHWSurface(_THIS, SDL_Surface *surface);
|
||||||
|
static int NDS_FlipHWSurface(_THIS, SDL_Surface *surface);
|
||||||
|
static void NDS_UnlockHWSurface(_THIS, SDL_Surface *surface);
|
||||||
|
static void NDS_FreeHWSurface(_THIS, SDL_Surface *surface);
|
||||||
|
|
||||||
|
/* etc. */
|
||||||
|
static void NDS_UpdateRects(_THIS, int numrects, SDL_Rect *rects);
|
||||||
|
|
||||||
|
/* NDS driver bootstrap functions */
|
||||||
|
|
||||||
|
static int NDS_Available(void)
|
||||||
|
{
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void NDS_DeleteDevice(SDL_VideoDevice *device)
|
||||||
|
{
|
||||||
|
SDL_free(device->hidden);
|
||||||
|
SDL_free(device);
|
||||||
|
}
|
||||||
|
|
||||||
|
void on_irq_vblank()
|
||||||
|
{
|
||||||
|
// Disable interrupts
|
||||||
|
//REG_IME = 0;
|
||||||
|
scanKeys();
|
||||||
|
|
||||||
|
// VBLANK_INTR_WAIT_FLAGS |= IRQ_VBLANK;
|
||||||
|
// REG_IF |= IRQ_VBLANK;
|
||||||
|
//REG_IF = REG_IF;
|
||||||
|
|
||||||
|
// Enable interrupts
|
||||||
|
//REG_IME = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int HWAccelBlit(SDL_Surface *src, SDL_Rect *srcrect,
|
||||||
|
SDL_Surface *dst, SDL_Rect *dstrect)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int CheckHWBlit(_THIS, SDL_Surface *src, SDL_Surface *dst)
|
||||||
|
{
|
||||||
|
if (src->flags & SDL_SRCALPHA) return false;
|
||||||
|
if (src->flags & SDL_SRCCOLORKEY) return false;
|
||||||
|
if (src->flags & SDL_HWPALETTE ) return false;
|
||||||
|
if (dst->flags & SDL_SRCALPHA) return false;
|
||||||
|
if (dst->flags & SDL_SRCCOLORKEY) return false;
|
||||||
|
if (dst->flags & SDL_HWPALETTE ) return false;
|
||||||
|
|
||||||
|
if (src->format->BitsPerPixel != dst->format->BitsPerPixel) return false;
|
||||||
|
if (src->format->BytesPerPixel != dst->format->BytesPerPixel) return false;
|
||||||
|
|
||||||
|
src->map->hw_blit = HWAccelBlit;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static SDL_VideoDevice *NDS_CreateDevice(int devindex)
|
||||||
|
{
|
||||||
|
SDL_VideoDevice *device=0;
|
||||||
|
|
||||||
|
|
||||||
|
/* Initialize all variables that we clean on shutdown */
|
||||||
|
device = (SDL_VideoDevice *)SDL_malloc(sizeof(SDL_VideoDevice));
|
||||||
|
if ( device ) {
|
||||||
|
SDL_memset(device, 0, (sizeof *device));
|
||||||
|
device->hidden = (struct SDL_PrivateVideoData *)
|
||||||
|
SDL_malloc((sizeof *device->hidden));
|
||||||
|
}
|
||||||
|
if ( (device == NULL) || (device->hidden == NULL) ) {
|
||||||
|
SDL_OutOfMemory();
|
||||||
|
if ( device ) {
|
||||||
|
SDL_free(device);
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
SDL_memset(device->hidden, 0, (sizeof *device->hidden));
|
||||||
|
|
||||||
|
/* Set the function pointers */
|
||||||
|
device->VideoInit = NDS_VideoInit;
|
||||||
|
device->ListModes = NDS_ListModes;
|
||||||
|
device->SetVideoMode = NDS_SetVideoMode;
|
||||||
|
device->CreateYUVOverlay = NULL;
|
||||||
|
device->SetColors = NDS_SetColors;
|
||||||
|
device->UpdateRects = NDS_UpdateRects;
|
||||||
|
device->VideoQuit = NDS_VideoQuit;
|
||||||
|
device->AllocHWSurface = NDS_AllocHWSurface;
|
||||||
|
device->CheckHWBlit = CheckHWBlit;
|
||||||
|
device->FillHWRect = NULL;
|
||||||
|
device->SetHWColorKey = NULL;
|
||||||
|
device->SetHWAlpha = NULL;
|
||||||
|
device->LockHWSurface = NDS_LockHWSurface;
|
||||||
|
device->UnlockHWSurface = NDS_UnlockHWSurface;
|
||||||
|
device->FlipHWSurface = NDS_FlipHWSurface;
|
||||||
|
device->FreeHWSurface = NDS_FreeHWSurface;
|
||||||
|
device->SetCaption = NULL;
|
||||||
|
device->SetIcon = NULL;
|
||||||
|
device->IconifyWindow = NULL;
|
||||||
|
device->GrabInput = NULL;
|
||||||
|
device->GetWMInfo = NULL;
|
||||||
|
device->InitOSKeymap = NDS_InitOSKeymap;
|
||||||
|
device->PumpEvents = NDS_PumpEvents;
|
||||||
|
device->info.blit_hw=1;
|
||||||
|
|
||||||
|
device->free = NDS_DeleteDevice;
|
||||||
|
return device;
|
||||||
|
}
|
||||||
|
|
||||||
|
VideoBootStrap NDS_bootstrap = {
|
||||||
|
NDSVID_DRIVER_NAME, "SDL NDS video driver",
|
||||||
|
NDS_Available, NDS_CreateDevice
|
||||||
|
};
|
||||||
|
|
||||||
|
u16* frontBuffer;// = (u16*)(0x06000000);
|
||||||
|
u16* backBuffer;// = (u16*)(0x06000000 + 256 * 256 * 2);
|
||||||
|
int NDS_VideoInit(_THIS, SDL_PixelFormat *vformat)
|
||||||
|
{
|
||||||
|
//printf("WARNING: You are using the SDL NDS video driver!\n");
|
||||||
|
|
||||||
|
/* Determine the screen depth (use default 8-bit depth) */
|
||||||
|
/* we change this during the SDL_SetVideoMode implementation... */
|
||||||
|
vformat->BitsPerPixel = 16; // mode 3
|
||||||
|
vformat->BytesPerPixel = 2;
|
||||||
|
vformat->Rmask = 0x0000f800;
|
||||||
|
vformat->Gmask = 0x000007e0;
|
||||||
|
vformat->Bmask = 0x0000001f;
|
||||||
|
powerON(POWER_ALL);
|
||||||
|
irqInit();
|
||||||
|
irqSet(IRQ_VBLANK, on_irq_vblank);
|
||||||
|
irqEnable(IRQ_VBLANK);
|
||||||
|
|
||||||
|
//set the mode for 2 text layers and two extended background layers
|
||||||
|
//videoSetMode(MODE_5_2D | DISPLAY_BG3_ACTIVE);
|
||||||
|
videoSetMode(MODE_6_2D| DISPLAY_BG2_ACTIVE);
|
||||||
|
|
||||||
|
//set the sub background up for text display (we could just print to one
|
||||||
|
//of the main display text backgrounds just as easily
|
||||||
|
videoSetModeSub(MODE_0_2D | DISPLAY_BG0_ACTIVE); //sub bg 0 will be used to print text
|
||||||
|
|
||||||
|
//set the first two banks as background memory and the third as sub background memory
|
||||||
|
//D is not used..if you need a bigger background then you will need to map
|
||||||
|
//more vram banks consecutivly (VRAM A-D are all 0x20000 bytes in size)
|
||||||
|
//vramSetMainBanks(VRAM_A_MAIN_BG_0x6000000, VRAM_B_MAIN_BG_0x6020000,VRAM_C_SUB_BG , VRAM_D_LCD);
|
||||||
|
vramSetMainBanks(VRAM_A_MAIN_BG,VRAM_B_MAIN_BG,VRAM_C_MAIN_BG,VRAM_D_MAIN_BG);
|
||||||
|
//vramSetBankA(VRAM_A_MAIN_BG);
|
||||||
|
//vramSetBankB(VRAM_B_MAIN_BG);
|
||||||
|
//vramSetBankC(VRAM_C_MAIN_BG);
|
||||||
|
//vramSetBankD(VRAM_D_MAIN_BG);
|
||||||
|
//vramSetBankE(VRAM_E_MAIN_BG);
|
||||||
|
//vramSetBankF(VRAM_F_MAIN_BG);
|
||||||
|
//vramSetBankG(VRAM_G_MAIN_BG);
|
||||||
|
vramSetBankH(VRAM_H_SUB_BG);
|
||||||
|
vramSetBankI(VRAM_I_LCD);
|
||||||
|
|
||||||
|
////////////////set up text background for text/////////////////////
|
||||||
|
SUB_BG0_CR = BG_MAP_BASE(8);
|
||||||
|
|
||||||
|
BG_PALETTE_SUB[255] = RGB15(31,31,31);//by default font will be rendered with color 255
|
||||||
|
///////////////set up our bitmap background///////////////////////
|
||||||
|
|
||||||
|
//BG3_CR = BG_BMP16_512x512;
|
||||||
|
|
||||||
|
//these are rotation backgrounds so you must set the rotation attributes:
|
||||||
|
//these are fixed point numbers with the low 8 bits the fractional part
|
||||||
|
//this basicaly gives it a 1:1 translation in x and y so you get a nice flat bitmap
|
||||||
|
/* BG3_XDX = 1<<8;
|
||||||
|
BG3_XDY = 0;
|
||||||
|
BG3_YDX = 0;
|
||||||
|
BG3_YDY = 1<<8;
|
||||||
|
//our bitmap looks a bit better if we center it so scroll down (256 - 192) / 2
|
||||||
|
BG3_CX = 0;
|
||||||
|
BG3_CY = 0;
|
||||||
|
*/
|
||||||
|
//consoleInit() is a lot more flexible but this gets you up and running quick
|
||||||
|
consoleInitDefault((u16*)SCREEN_BASE_BLOCK_SUB(8), (u16*)CHAR_BASE_BLOCK_SUB(0), 16);
|
||||||
|
|
||||||
|
|
||||||
|
frontBuffer =(u16*)(0x06000000);
|
||||||
|
//backBuffer =(u16*)(0x06000000 + 1024 * 512*2);
|
||||||
|
|
||||||
|
//lcdSwap();
|
||||||
|
/* We're done! */
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_Rect **NDS_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags)
|
||||||
|
{
|
||||||
|
return (SDL_Rect **) -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_Surface *NDS_SetVideoMode(_THIS, SDL_Surface *current,
|
||||||
|
int width, int height, int bpp, Uint32 flags)
|
||||||
|
{
|
||||||
|
Uint32 Rmask, Gmask, Bmask, Amask;
|
||||||
|
|
||||||
|
//if(width > 1024 || height > 512 || bpp > 16)
|
||||||
|
// return(NULL);
|
||||||
|
|
||||||
|
if(bpp >8) {
|
||||||
|
bpp=16;
|
||||||
|
Rmask = 0x0000001F;
|
||||||
|
Gmask = 0x000003E0;
|
||||||
|
Bmask = 0x00007C00;
|
||||||
|
Amask = 0x00008000;
|
||||||
|
|
||||||
|
videoSetMode(MODE_5_2D| DISPLAY_BG2_ACTIVE);
|
||||||
|
|
||||||
|
vramSetMainBanks(VRAM_A_MAIN_BG,VRAM_B_MAIN_BG,VRAM_C_MAIN_BG,VRAM_D_MAIN_BG);
|
||||||
|
|
||||||
|
BG2_CR = BG_BMP16_512x512;
|
||||||
|
BG2_XDX = ((width / 256) << 8) | (width % 256) ;
|
||||||
|
BG2_XDY = 0;
|
||||||
|
BG2_YDX = 0;
|
||||||
|
BG2_YDY = ((height / 192) << 8) | ((height % 192) + (height % 192) / 3) ;
|
||||||
|
BG2_CX = 0;
|
||||||
|
BG2_CY = 0;
|
||||||
|
// for (i=0;i<256*192;i++)
|
||||||
|
// frontBuffer[i] = RGB15(31,0,0)|BIT(15);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if(bpp <= 8) {
|
||||||
|
bpp=8;
|
||||||
|
Rmask = 0x00000000;
|
||||||
|
Gmask = 0x00000000;
|
||||||
|
Bmask = 0x00000000;
|
||||||
|
BG2_CR = BG_BMP8_1024x512;
|
||||||
|
BG2_XDX = ((width / 256) << 8) | (width % 256) ;
|
||||||
|
BG2_XDY = 0;
|
||||||
|
BG2_YDX = 0;
|
||||||
|
BG2_YDY = ((height / 192) << 8) | ((height % 192) + (height % 192) / 3) ;
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if(bpp < 15) bpp=15;
|
||||||
|
if(width<=256) width=256;
|
||||||
|
else
|
||||||
|
if(width<256) width=256;
|
||||||
|
if(height<=192) height=192;
|
||||||
|
else
|
||||||
|
if(height<192) height=192;
|
||||||
|
|
||||||
|
if(bpp==8)
|
||||||
|
{
|
||||||
|
if(width<256) width=256;
|
||||||
|
if(height<192) height=192;
|
||||||
|
this->hidden->ndsmode=4;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(bpp==15)
|
||||||
|
{
|
||||||
|
if(width<256) this->hidden->ndsmode=5;
|
||||||
|
else this->hidden->ndsmode=3;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->hidden->buffer= frontBuffer;//NDS_VRAM_BASE;
|
||||||
|
|
||||||
|
//NDS_DISPCNT = NDS_DISP_MODE(this->hidden->ndsmode)|NDS_DISP_BG2;
|
||||||
|
|
||||||
|
//fprintf(stderr,"Setting mode %dx%d (ndsmode %d)\n", width, height,this->hidden->ndsmode);
|
||||||
|
|
||||||
|
// FIXME: How do I tell that 15 bits mode is 555?
|
||||||
|
|
||||||
|
SDL_memset(this->hidden->buffer, 0, 1024 * 512* ((this->hidden->ndsmode==4 || this->hidden->ndsmode==5) ? 2 : 1 ) * ((bpp+7) / 8));
|
||||||
|
|
||||||
|
/* Allocate the new pixel format for the screen */
|
||||||
|
if ( ! SDL_ReallocFormat(current, bpp, Rmask, Gmask, Bmask, Amask) ) {
|
||||||
|
this->hidden->buffer = NULL;
|
||||||
|
SDL_SetError("Couldn't allocate new pixel format for requested mode");
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set up the new mode framebuffer */
|
||||||
|
current->flags = flags | SDL_FULLSCREEN | SDL_HWSURFACE | (this->hidden->ndsmode > 0 ? SDL_DOUBLEBUF : 0);
|
||||||
|
this->hidden->w = current->w = width;
|
||||||
|
this->hidden->h = current->h = height;
|
||||||
|
current->pixels = frontBuffer;
|
||||||
|
|
||||||
|
if (flags & SDL_DOUBLEBUF) {
|
||||||
|
this->hidden->secondbufferallocd=1;
|
||||||
|
backBuffer=(u16*)SDL_malloc(1024*512*2);
|
||||||
|
current->pixels = backBuffer;
|
||||||
|
}
|
||||||
|
if(bpp==8)
|
||||||
|
current->pitch =1024;
|
||||||
|
else
|
||||||
|
current->pitch =1024*2;
|
||||||
|
|
||||||
|
/* We're done */
|
||||||
|
return(current);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int NDS_AllocHWSurface(_THIS, SDL_Surface *surface)
|
||||||
|
{
|
||||||
|
if(this->hidden->secondbufferallocd) {
|
||||||
|
//printf("double double buffer alloc\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
//if(this->hidden->ndsmode==3)
|
||||||
|
//{
|
||||||
|
// printf("no 2nd buffer in mode3\n");
|
||||||
|
// return -1;
|
||||||
|
//}
|
||||||
|
//printf("second buffer\n");
|
||||||
|
//this->hidden->secondbufferallocd=1;
|
||||||
|
//backBuffer=(u16*)malloc(1024*512*2);
|
||||||
|
//surface->pixels = backBuffer;
|
||||||
|
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
static void NDS_FreeHWSurface(_THIS, SDL_Surface *surface)
|
||||||
|
{
|
||||||
|
//free(backBuffer);
|
||||||
|
this->hidden->secondbufferallocd=0;
|
||||||
|
}
|
||||||
|
int z=0;
|
||||||
|
/* We need to wait for vertical retrace on page flipped displays */
|
||||||
|
static int NDS_LockHWSurface(_THIS, SDL_Surface *surface)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
uint8* a = surface->pixels;
|
||||||
|
int i,j;
|
||||||
|
a += 5 * SCREEN_WIDTH + 5;
|
||||||
|
for( i = 0; i < 195; ++i) {
|
||||||
|
uint16* line = a + (SCREEN_WIDTH * i);
|
||||||
|
for( j = 0; j < 158; ++j) {
|
||||||
|
*line++ = RGB15(155,155,25);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
//if (z <256)
|
||||||
|
// BG_PALETTE[z++]=RGB15(255-z,z,255-z);
|
||||||
|
|
||||||
|
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void NDS_UnlockHWSurface(_THIS, SDL_Surface *surface)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int NDS_FlipHWSurface(_THIS, SDL_Surface *surface)
|
||||||
|
{
|
||||||
|
if(this->hidden->secondbufferallocd){
|
||||||
|
while(DISP_Y!=192);
|
||||||
|
while(DISP_Y==192);
|
||||||
|
//printf("flip");
|
||||||
|
|
||||||
|
dmaCopyAsynch(backBuffer,frontBuffer,1024*512);
|
||||||
|
}
|
||||||
|
//printf("flip\n");
|
||||||
|
//u16* temp = surface->pixels;
|
||||||
|
//surface->pixels = frontBuffer;
|
||||||
|
//frontBuffer = temp;
|
||||||
|
/* u8* vram=BG_GFX;
|
||||||
|
int x,y;
|
||||||
|
for(y = 0; y < 512; y++)
|
||||||
|
dmaCopy(&frontBuffer[y*rects->w], &vram[y*512],512);
|
||||||
|
//unsigned char buf;
|
||||||
|
|
||||||
|
//printf("NDS_FlipHWSurface\n");
|
||||||
|
//printf("ptr now: 0x%x\n",surface->pixels);
|
||||||
|
|
||||||
|
while(DISP_Y!=192);
|
||||||
|
while(DISP_Y==192);
|
||||||
|
//swap
|
||||||
|
u16* temp = frontBuffer;
|
||||||
|
frontBuffer = backBuffer;
|
||||||
|
backBuffer = temp;
|
||||||
|
|
||||||
|
//flip
|
||||||
|
//base is 16KB and screen size is 256x256x2 (128KB)
|
||||||
|
BG2_CR ^= BG_BMP_BASE( 512 / 16 ); */
|
||||||
|
/*
|
||||||
|
if(surface->pixels == frontBuffer)//NDS_VRAM_BASE)
|
||||||
|
{
|
||||||
|
while(DISP_Y!=192);
|
||||||
|
while(DISP_Y==192);
|
||||||
|
//swap
|
||||||
|
u16* temp = backBuffer;
|
||||||
|
backBuffer = frontBuffer;
|
||||||
|
frontBuffer = temp;
|
||||||
|
|
||||||
|
//flip
|
||||||
|
//base is 16KB and screen size is 256x256x2 (128KB)
|
||||||
|
BG3_CR ^= BG_BMP_BASE( 128 / 16 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
while(DISP_Y!=192);
|
||||||
|
while(DISP_Y==192);
|
||||||
|
//swap
|
||||||
|
u16* temp = frontBuffer;
|
||||||
|
frontBuffer = backBuffer;
|
||||||
|
backBuffer = temp;
|
||||||
|
|
||||||
|
//flip
|
||||||
|
//base is 16KB and screen size is 256x256x2 (128KB)
|
||||||
|
BG3_CR ^= BG_BMP_BASE( 128 / 16 );
|
||||||
|
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
//printf("ptr then: 0x%x\n",surface->pixels);
|
||||||
|
|
||||||
|
//printf("setting dispcnt to 0x%x\n",NDS_DISPCNT = NDS_DISP_MODE(this->hidden->ndsmode)|NDS_DISP_BG2| buf);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void NDS_UpdateRects(_THIS, int numrects, SDL_Rect *rects)
|
||||||
|
{
|
||||||
|
//fprintf(stderr,"update\n");
|
||||||
|
/* do nothing. */
|
||||||
|
//dmaCopy(frontBuffer,BG_GFX,512*512);
|
||||||
|
/*
|
||||||
|
u8* vram=(u8*)BG_GFX;
|
||||||
|
int x,y;
|
||||||
|
for(y = 0; y < 512; y++)
|
||||||
|
dmaCopy(&frontBuffer[y*rects->w], &vram[y*512],512);
|
||||||
|
*/
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int NDS_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors)
|
||||||
|
{
|
||||||
|
//printf("SetColors\n");
|
||||||
|
short r,g,b;
|
||||||
|
|
||||||
|
if(this->hidden->ndsmode != 4)
|
||||||
|
{
|
||||||
|
printf("This is not a palettized mode\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int i,j=firstcolor+ncolors;
|
||||||
|
for(i=firstcolor;i<j;i++)
|
||||||
|
{
|
||||||
|
r=colors[i].r>>3;
|
||||||
|
g=colors[i].g>>3;
|
||||||
|
b=colors[i].b>>3;
|
||||||
|
BG_PALETTE[i]=RGB15(r, g, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Note: If we are terminated, this could be called in the middle of
|
||||||
|
another SDL video routine -- notably UpdateRects.
|
||||||
|
*/
|
||||||
|
void NDS_VideoQuit(_THIS)
|
||||||
|
{
|
||||||
|
}
|
61
src/video/nds/SDL_ndsvideo.h
Normal file
61
src/video/nds/SDL_ndsvideo.h
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
/*
|
||||||
|
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"
|
||||||
|
|
||||||
|
#ifndef _SDL_ndsvideo_h
|
||||||
|
#define _SDL_ndsvideo_h
|
||||||
|
|
||||||
|
#include "SDL_mouse.h"
|
||||||
|
#include "../SDL_sysvideo.h"
|
||||||
|
|
||||||
|
/* Hidden "this" pointer for the video functions */
|
||||||
|
#define _THIS SDL_VideoDevice *this
|
||||||
|
|
||||||
|
|
||||||
|
/* Private display data */
|
||||||
|
|
||||||
|
struct SDL_PrivateVideoData {
|
||||||
|
int w, h;
|
||||||
|
void *buffer;
|
||||||
|
short ndsmode;
|
||||||
|
short secondbufferallocd;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
#define NDS_VIDC_BASE 0x4000000
|
||||||
|
#define NDS_DISPCNT (*(volatile Uint32*)(NDS_VIDC_BASE))
|
||||||
|
#define NDS_VIDC_SCANLINE (NDS_VIDC_BASE+6)
|
||||||
|
#define NDS_SCANLINE (*(volatile Uint8*)(NDS_VIDC_SCANLINE))
|
||||||
|
|
||||||
|
#define NDS_DISP_MODE(n) (n&7)
|
||||||
|
#define NDS_DISP_BG2 0x400
|
||||||
|
#define NDS_DISP_FB 0x10
|
||||||
|
|
||||||
|
#define NDS_PAL_BASE 0x5000000
|
||||||
|
#define NDS_BGPAL ((volatile Uint16*)(NDS_PAL_BASE))
|
||||||
|
#define NDS_OBJPAL ((volatile Uint16*)(NDS_PAL_BASE+0x200))
|
||||||
|
|
||||||
|
#define NDS_VRAM_BASE 0x6000000
|
||||||
|
#define NDS_VRAM_2NDBUF 0x600a000
|
||||||
|
#define NDS_VRAM = ((volatile Uint16* )NDS_VRAM_BASE)
|
||||||
|
*/
|
||||||
|
#endif /* _SDL_ndsvideo_h */
|
|
@ -751,6 +751,11 @@ SDL_Surface *DIB_SetVideoMode(_THIS, SDL_Surface *current,
|
||||||
|
|
||||||
/* Set video surface flags */
|
/* Set video surface flags */
|
||||||
if ( bpp <= 8 ) {
|
if ( bpp <= 8 ) {
|
||||||
|
if ( (video->flags & SDL_FULLSCREEN) == SDL_FULLSCREEN ) {
|
||||||
|
hdc = GetDC(SDL_Window);
|
||||||
|
SetSystemPaletteUse(hdc, SYSPAL_NOSTATIC);
|
||||||
|
ReleaseDC(SDL_Window, hdc);
|
||||||
|
}
|
||||||
/* BitBlt() maps colors for us */
|
/* BitBlt() maps colors for us */
|
||||||
video->flags |= SDL_HWPALETTE;
|
video->flags |= SDL_HWPALETTE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue