diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2008-04-16 18:37:33 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2008-04-16 18:37:33 +0000 |
commit | 311dfa65d823ebb1448a12e9a24d09c7ca7a9e2a (patch) | |
tree | 47eaf22ca7bb8cc68486ffe964abd54b535902ad /c/src/lib/libbsp/arm/nds/libnds/source/arm9/console.c | |
parent | 2008-04-16 Matthieu Bucchianeri <mbucchia@gmail.com> (diff) | |
download | rtems-311dfa65d823ebb1448a12e9a24d09c7ca7a9e2a.tar.bz2 |
2008-04-16 Matthieu Bucchianeri <mbucchia@gmail.com>
* ChangeLog, Makefile.am, README, bsp_specs, configure.ac,
mk_libnds.sh, patch.libnds, preinstall.am, block/block.c,
clock/clock.c, console/console.c, coproc/coproc.S, coproc/coproc.c,
coproc/coproc.ld, dswifi/dswifi_license.txt, dswifi/makefile,
dswifi/arm7/makefile, dswifi/arm7/source/wifi_arm7.c,
dswifi/arm7/source/wifi_arm7.h, dswifi/arm9/makefile,
dswifi/arm9/source/sgIP.c, dswifi/arm9/source/sgIP.h,
dswifi/arm9/source/sgIP_ARP.c, dswifi/arm9/source/sgIP_ARP.h,
dswifi/arm9/source/sgIP_Config.h, dswifi/arm9/source/sgIP_DHCP.c,
dswifi/arm9/source/sgIP_DHCP.h, dswifi/arm9/source/sgIP_DNS.c,
dswifi/arm9/source/sgIP_DNS.h, dswifi/arm9/source/sgIP_Hub.c,
dswifi/arm9/source/sgIP_Hub.h, dswifi/arm9/source/sgIP_ICMP.c,
dswifi/arm9/source/sgIP_ICMP.h, dswifi/arm9/source/sgIP_IP.c,
dswifi/arm9/source/sgIP_IP.h, dswifi/arm9/source/sgIP_TCP.c,
dswifi/arm9/source/sgIP_TCP.h, dswifi/arm9/source/sgIP_UDP.c,
dswifi/arm9/source/sgIP_UDP.h, dswifi/arm9/source/sgIP_memblock.c,
dswifi/arm9/source/sgIP_memblock.h,
dswifi/arm9/source/sgIP_sockets.c, dswifi/arm9/source/sgIP_sockets.h,
dswifi/arm9/source/wifi_arm9.c, dswifi/arm9/source/wifi_arm9.h,
dswifi/common/source/dsregs.h, dswifi/common/source/spinlock.h,
dswifi/common/source/spinlock.s, dswifi/common/source/wifi_shared.h,
dswifi/include/dswifi7.h, dswifi/include/dswifi9.h,
dswifi/include/dswifi_version.h, dswifi/include/netdb.h,
dswifi/include/sgIP_errno.h, dswifi/include/netinet/in.h, fb/fb.c,
fb/fb.h, include/bsp.h, include/my_ipc.h, include/tm27.h,
include/types.h, include/sys/iosupport.h, irq/irq.c, irq/irq.h,
libfat/gba/include/fat.h, libfat/include/fat.h,
libfat/nds/include/fat.h, libfat/source/bit_ops.h,
libfat/source/cache.c, libfat/source/cache.h, libfat/source/common.h,
libfat/source/directory.c, libfat/source/directory.h,
libfat/source/fatdir.c, libfat/source/fatdir.h,
libfat/source/fatfile.c, libfat/source/fatfile.h,
libfat/source/file_allocation_table.c,
libfat/source/file_allocation_table.h, libfat/source/filetime.c,
libfat/source/filetime.h, libfat/source/libfat.c,
libfat/source/mem_allocate.h, libfat/source/partition.c,
libfat/source/partition.h, libfat/source/disc_io/disc.c,
libfat/source/disc_io/disc.h, libfat/source/disc_io/disc_io.h,
libfat/source/disc_io/io_cf_common.c,
libfat/source/disc_io/io_cf_common.h,
libfat/source/disc_io/io_dldi.h, libfat/source/disc_io/io_dldi.s,
libfat/source/disc_io/io_efa2.c, libfat/source/disc_io/io_efa2.h,
libfat/source/disc_io/io_fcsr.c, libfat/source/disc_io/io_fcsr.h,
libfat/source/disc_io/io_m3_common.c,
libfat/source/disc_io/io_m3_common.h,
libfat/source/disc_io/io_m3cf.c, libfat/source/disc_io/io_m3cf.h,
libfat/source/disc_io/io_m3sd.c, libfat/source/disc_io/io_m3sd.h,
libfat/source/disc_io/io_mpcf.c, libfat/source/disc_io/io_mpcf.h,
libfat/source/disc_io/io_njsd.c, libfat/source/disc_io/io_njsd.h,
libfat/source/disc_io/io_nmmc.c, libfat/source/disc_io/io_nmmc.h,
libfat/source/disc_io/io_sc_common.c,
libfat/source/disc_io/io_sc_common.h,
libfat/source/disc_io/io_sccf.c, libfat/source/disc_io/io_sccf.h,
libfat/source/disc_io/io_scsd.c, libfat/source/disc_io/io_scsd.h,
libfat/source/disc_io/io_scsd_s.s,
libfat/source/disc_io/io_sd_common.c,
libfat/source/disc_io/io_sd_common.h, libnds/Makefile.arm7,
libnds/Makefile.arm9, libnds/libnds_license.txt,
libnds/basicARM7/source/defaultARM7.c,
libnds/include/default_font_bin.h, libnds/include/gbfs.h,
libnds/include/nds.h, libnds/include/nds/bios.h,
libnds/include/nds/card.h, libnds/include/nds/dma.h,
libnds/include/nds/interrupts.h, libnds/include/nds/ipc.h,
libnds/include/nds/jtypes.h, libnds/include/nds/memory.h,
libnds/include/nds/registers_alt.h, libnds/include/nds/reload.h,
libnds/include/nds/system.h, libnds/include/nds/timers.h,
libnds/include/nds/arm7/audio.h, libnds/include/nds/arm7/clock.h,
libnds/include/nds/arm7/serial.h, libnds/include/nds/arm7/touch.h,
libnds/include/nds/arm9/background.h,
libnds/include/nds/arm9/boxtest.h, libnds/include/nds/arm9/cache.h,
libnds/include/nds/arm9/console.h,
libnds/include/nds/arm9/exceptions.h,
libnds/include/nds/arm9/image.h, libnds/include/nds/arm9/input.h,
libnds/include/nds/arm9/math.h, libnds/include/nds/arm9/ndsmotion.h,
libnds/include/nds/arm9/pcx.h, libnds/include/nds/arm9/postest.h,
libnds/include/nds/arm9/rumble.h, libnds/include/nds/arm9/sound.h,
libnds/include/nds/arm9/sprite.h, libnds/include/nds/arm9/trig_lut.h,
libnds/include/nds/arm9/video.h, libnds/include/nds/arm9/videoGL.h,
libnds/source/arm7/audio.c, libnds/source/arm7/clock.c,
libnds/source/arm7/microphone.c, libnds/source/arm7/spi.c,
libnds/source/arm7/touch.c, libnds/source/arm7/userSettings.c,
libnds/source/arm9/COS.bin, libnds/source/arm9/COS.s,
libnds/source/arm9/SIN.bin, libnds/source/arm9/SIN.s,
libnds/source/arm9/TAN.bin, libnds/source/arm9/TAN.s,
libnds/source/arm9/boxtest.c, libnds/source/arm9/console.c,
libnds/source/arm9/dcache.s, libnds/source/arm9/default_font.bin,
libnds/source/arm9/default_font.s,
libnds/source/arm9/exceptionHandler.S,
libnds/source/arm9/exceptionHandler.s,
libnds/source/arm9/exceptions.c, libnds/source/arm9/gurumeditation.c,
libnds/source/arm9/icache.s, libnds/source/arm9/image.c,
libnds/source/arm9/initSystem.c, libnds/source/arm9/keys.c,
libnds/source/arm9/ndsmotion.c, libnds/source/arm9/pcx.c,
libnds/source/arm9/rumble.c, libnds/source/arm9/sound.c,
libnds/source/arm9/system.c, libnds/source/arm9/touch.c,
libnds/source/arm9/video.c, libnds/source/arm9/videoGL.c,
libnds/source/common/biosCalls.s, libnds/source/common/card.c,
libnds/source/common/gbfs.c,
libnds/source/common/interruptDispatcher.s,
libnds/source/common/interrupts.c, rtc/rtc.c, sound/sound.c,
sound/sound.h, start/start.S, startup/linkcmds, startup/start.c,
timer/timer.c, tools/Makefile.am, tools/bin2s, tools/bin2s.c,
tools/configure.ac, tools/runtest,
tools/ndstool/include/arm7_sha1_homebrew.h,
tools/ndstool/include/arm7_sha1_nintendo.h,
tools/ndstool/include/banner.h, tools/ndstool/include/bigint.h,
tools/ndstool/include/crc.h, tools/ndstool/include/default_icon.h,
tools/ndstool/include/encryption.h, tools/ndstool/include/header.h,
tools/ndstool/include/hook.h, tools/ndstool/include/little.h,
tools/ndstool/include/loadme.h, tools/ndstool/include/logo.h,
tools/ndstool/include/ndscreate.h,
tools/ndstool/include/ndsextract.h, tools/ndstool/include/ndstool.h,
tools/ndstool/include/ndstree.h, tools/ndstool/include/overlay.h,
tools/ndstool/include/passme.h, tools/ndstool/include/passme_sram.h,
tools/ndstool/include/passme_vhd1.h,
tools/ndstool/include/passme_vhd2.h, tools/ndstool/include/raster.h,
tools/ndstool/include/sha1.h, tools/ndstool/include/types.h,
tools/ndstool/source/arm7_sha1_homebrew.c,
tools/ndstool/source/arm7_sha1_nintendo.c,
tools/ndstool/source/banner.cpp, tools/ndstool/source/bigint.cpp,
tools/ndstool/source/compile_date.c, tools/ndstool/source/crc.cpp,
tools/ndstool/source/default_icon.c,
tools/ndstool/source/encryption.cpp, tools/ndstool/source/header.cpp,
tools/ndstool/source/hook.cpp, tools/ndstool/source/loadme.c,
tools/ndstool/source/logo.cpp, tools/ndstool/source/ndscodes.cpp,
tools/ndstool/source/ndscreate.cpp,
tools/ndstool/source/ndsextract.cpp,
tools/ndstool/source/ndstool.cpp, tools/ndstool/source/ndstree.cpp,
tools/ndstool/source/passme.cpp, tools/ndstool/source/passme_sram.c,
tools/ndstool/source/raster.cpp, tools/ndstool/source/sha1.cpp,
touchscreen/README.reco, touchscreen/parser.c, touchscreen/reco.c,
touchscreen/reco.h, touchscreen/touchscreen.c,
touchscreen/touchscreen.h, wifi/compat.c, wifi/compat.h, wifi/wifi.c:
New files.
Diffstat (limited to '')
-rw-r--r-- | c/src/lib/libbsp/arm/nds/libnds/source/arm9/console.c | 459 |
1 files changed, 459 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/arm/nds/libnds/source/arm9/console.c b/c/src/lib/libbsp/arm/nds/libnds/source/arm9/console.c new file mode 100644 index 0000000000..47ff72df27 --- /dev/null +++ b/c/src/lib/libbsp/arm/nds/libnds/source/arm9/console.c @@ -0,0 +1,459 @@ +/*--------------------------------------------------------------------------------- + $Id$ + + Copyright (C) 2005 + Michael Noland (joat) + Jason Rogers (dovoto) + Dave Murphy (WinterMute) + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any + damages arising from the use of this software. + + Permission is granted to anyone to use this software for any + purpose, including commercial applications, and to alter it and + redistribute it freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you + must not claim that you wrote the original software. If you use + this software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and + must not be misrepresented as being the original software. + 3. This notice may not be removed or altered from any source + distribution. + +---------------------------------------------------------------------------------*/ + +#include <nds/jtypes.h> +#include <nds/memory.h> +#include <nds/arm9/console.h> +#include <nds/arm9/video.h> +#include <nds/arm9/background.h> +#include <default_font_bin.h> + +#include <stdio.h> +#include <stdarg.h> +#include <sys/iosupport.h> + +// global console variables + +#define CONSOLE_WIDTH 32 +#define CONSOLE_HEIGHT 24 +#define TAB_SIZE 3 + +// map to print to +static u16* fontMap; + +// location of cursor +static int row, col; +static int savedX, savedY; + +// font may not start on a character base boundry +static u16 fontOffset; + +// the first character in the set (0 if you have a full set) +static u16 fontStart; + +// the 16-color palette to use +bool fontBold = false; +static u16 fontPal; + +static int consoleInitialised = 0; + +void consolePrintChar(char c); + + +//--------------------------------------------------------------------------------- +static void consoleCls(char mode) { +//--------------------------------------------------------------------------------- + + int i = 0; + int colTemp,rowTemp; + + switch (mode) + { + case '0': + { + colTemp = col; + rowTemp = row; + + while(i++ < ((CONSOLE_HEIGHT * CONSOLE_WIDTH) - (rowTemp * CONSOLE_WIDTH + colTemp))) consolePrintChar(' '); + + col = colTemp; + row = rowTemp; + break; + } + case '1': + { + colTemp = col; + rowTemp = row; + + row = 0; + col = 0; + + while (i++ < (rowTemp * CONSOLE_WIDTH + colTemp)) consolePrintChar(' '); + + col = colTemp; + row = rowTemp; + break; + } + case '2': + { + row = 0; + col = 0; + + while(i++ < CONSOLE_HEIGHT * CONSOLE_WIDTH) consolePrintChar(' '); + + row = 0; + col = 0; + break; + } + } +} +//--------------------------------------------------------------------------------- +static void consoleClearLine(char mode) { +//--------------------------------------------------------------------------------- + + int i = 0; + int colTemp; + + switch (mode) + { + case '0': + { + colTemp = col; + + while(i++ < (CONSOLE_WIDTH - colTemp)) { + consolePrintChar(' '); + } + + col = colTemp; + + break; + } + case '1': + { + colTemp = col; + + col = 0; + + while(i++ < ((CONSOLE_WIDTH - colTemp)-2)) { + consolePrintChar(' '); + } + + col = colTemp; + + break; + } + case '2': + { + colTemp = col; + + col = 0; + + while(i++ < CONSOLE_WIDTH) { + consolePrintChar(' '); + } + + col = colTemp; + + break; + } + default: + { + colTemp = col; + + while(i++ < (CONSOLE_WIDTH - colTemp)) { + consolePrintChar(' '); + } + + col = colTemp; + + break; + } + } +} +//--------------------------------------------------------------------------------- +int con_write(struct _reent *r,int fd,const char *ptr,int len) { +//--------------------------------------------------------------------------------- + + if (!consoleInitialised) return -1; + + char chr; + + int i, count = 0; + char *tmp = (char*)ptr; + + if(!tmp || len<=0) return -1; + + i = 0; + while(*tmp!='\0' && i<len) { + + chr = *(tmp++); + i++; count++; + + if ( chr == 0x1b && *tmp == '[' ) { + bool escaping = true; + char *escapeseq = tmp; + int escapelen = 0; + + do { + chr = *(tmp++); + i++; count++; escapelen++; + int parameter; + + switch (chr) { + ///////////////////////////////////////// + // Cursor directional movement + ///////////////////////////////////////// + case 'A': + siscanf(escapeseq,"[%dA", ¶meter); + row = (row - parameter) < 0 ? 0 : row - parameter; + escaping = false; + break; + case 'B': + siscanf(escapeseq,"[%dB", ¶meter); + row = (row + parameter) > CONSOLE_HEIGHT - 1 ? CONSOLE_HEIGHT - 1 : row + parameter; + escaping = false; + break; + case 'C': + siscanf(escapeseq,"[%dC", ¶meter); + col = (col + parameter) > CONSOLE_WIDTH - 1 ? CONSOLE_WIDTH - 1 : col + parameter; + escaping = false; + break; + case 'D': + siscanf(escapeseq,"[%dC", ¶meter); + col = (col - parameter) < 0 ? 0 : col - parameter; + escaping = false; + break; + ///////////////////////////////////////// + // Cursor position movement + ///////////////////////////////////////// + case 'H': + case 'f': + siscanf(escapeseq,"[%d;%df", &row, &col); + escaping = false; + break; + ///////////////////////////////////////// + // Screen clear + ///////////////////////////////////////// + case 'J': + consoleCls(escapeseq[escapelen-2]); + escaping = false; + break; + ///////////////////////////////////////// + // Line clear + ///////////////////////////////////////// + case 'K': + consoleClearLine(escapeseq[escapelen-2]); + escaping = false; + break; + ///////////////////////////////////////// + // Save cursor position + ///////////////////////////////////////// + case 's': + savedX = col; + savedY = row; + escaping = false; + break; + ///////////////////////////////////////// + // Load cursor position + ///////////////////////////////////////// + case 'u': + col = savedX; + row = savedY; + escaping = false; + break; + } + } while (escaping); + continue; + } + + consolePrintChar(chr); + } + + return count; +} + +const devoptab_t dotab_stdout = { + "con", + 0, + NULL, + NULL, + con_write, + NULL, + NULL, + NULL +}; + + +/*--------------------------------------------------------------------------------- + consoleInit + param: + font: 16 color font + charBase: the location the font data will be loaded to + numCharacters: count of characters in the font + charStart: The ascii number of the first character in the font set + if you have a full set this will be zero + map: pointer to the map you will be printing to. + pal: specifies the 16 color palette to use, if > 15 it will change all non-zero + entries in the font to use palette index 255 +---------------------------------------------------------------------------------*/ +void consoleInit( u16* font, u16* charBase, + u16 numCharacters, u8 charStart, + u16* map, u8 pal, u8 bitDepth) { +//--------------------------------------------------------------------------------- + int i; + + row = col = 0; + + fontStart = charStart; + + fontOffset = 0; + + fontMap = map; + + if(bitDepth == 16) + { + if(pal < 16) + { + fontPal = pal << 12; + + for (i = 0; i < numCharacters * 16; i++) + charBase[i] = font[i]; + } + else + { + fontPal = 15 << 12; + + for (i = 0; i < numCharacters * 16; i++) + { + u16 temp = 0; + + if(font[i] & 0xF) + temp |= 0xF; + if(font[i] & 0xF0) + temp |= 0xF0; + if(font[i] & 0xF00) + temp |= 0xF00; + if(font[i] & 0xF000) + temp |= 0xF000; + + charBase[i] = temp; + } + } + }//end if bitdepth + else + { + fontPal = 0; + for(i = 0; i < numCharacters * 16; i++) + { + u32 temp = 0; + + if(font[i] & 0xF) + temp = 255; + if(font[i] & 0xF0) + temp |= 255 << 8; + if(font[i] & 0xF00) + temp |= 255 << 16; + if(font[i] & 0xF000) + temp |= 255 << 24; + + ((u32*)charBase)[i] = temp; + + } + } + + devoptab_list[STD_OUT] = &dotab_stdout; + devoptab_list[STD_ERR] = &dotab_stdout; + setvbuf(stderr, NULL , _IONBF, 0); + setvbuf(stdout, NULL , _IONBF, 0); + consoleCls('2'); + consoleInitialised = 1; + +} + +//--------------------------------------------------------------------------------- +// Places the console in a default mode using bg0 of the sub display, and vram c for +// font and map..this is provided for rapid prototyping and nothing more +void consoleDemoInit(void) { +//--------------------------------------------------------------------------------- + videoSetModeSub(MODE_0_2D | DISPLAY_BG0_ACTIVE); //sub bg 0 will be used to print text + vramSetBankC(VRAM_C_SUB_BG); + + SUB_BG0_CR = BG_MAP_BASE(31); + + BG_PALETTE_SUB[255] = RGB15(31,31,31); //by default font will be rendered with color 255 + + //consoleInit() is a lot more flexible but this gets you up and running quick + consoleInitDefault((u16*)SCREEN_BASE_BLOCK_SUB(31), (u16*)CHAR_BASE_BLOCK_SUB(0), 16); +} + +//--------------------------------------------------------------------------------- +void consoleInitDefault(u16* map, u16* charBase, u8 bitDepth) { +//--------------------------------------------------------------------------------- + consoleInit((u16*)default_font_bin, charBase, 256, 0, map, CONSOLE_USE_COLOR255, bitDepth); +} + +//void consoleInitColorDefault(u16* map, u16* charBase) { +// consoleInit((u16*)default_font_bin, charBase, 256, 0, map, CONSOLE_USE_COLOR255, bitDepth); +//} + +//--------------------------------------------------------------------------------- +static void newRow() { +//--------------------------------------------------------------------------------- + int i; + row++; + if(row >= CONSOLE_HEIGHT) { + row--; + + for(i = CONSOLE_WIDTH; i < CONSOLE_HEIGHT * CONSOLE_WIDTH; i++) fontMap[i - CONSOLE_WIDTH] = fontMap[i]; + + for(i = 0; i < CONSOLE_WIDTH; i++) fontMap[i + (CONSOLE_HEIGHT-1)*CONSOLE_WIDTH] = fontPal | (u16)(' ' + fontOffset - fontStart); + + } +} + + +//--------------------------------------------------------------------------------- +void consolePrintChar(char c) { +//--------------------------------------------------------------------------------- + + if(col >= CONSOLE_WIDTH) { + col = 0; + + newRow(); + } + + switch(c) { + /* + The only special characters we will handle are tab (\t), carriage return (\r) & line feed (\n). + Carriage return & line feed will function the same: go to next line and put cursor at the beginning. + For everything else, use VT sequences. + + Reason: VT sequences are more specific to the task of cursor placement. + The special escape sequences \b \f & \v are archaic and non-portable. + */ + case 9: + col += TAB_SIZE; + break; + case 10: + case 13: + newRow(); + col = 0; + break; + default: + fontMap[col + row * CONSOLE_WIDTH] = fontPal | (u16)(c + fontOffset - fontStart); + ++col; + break; + } +} + +//--------------------------------------------------------------------------------- +void consoleClear(void) { +//--------------------------------------------------------------------------------- + iprintf("\x1b[2J"); +} + + |