Correct and faster hires mode. Added b/w hires mode. Input fixes.

This commit is contained in:
LemonBoy 2014-04-30 21:57:03 +02:00
parent 3b5d7bc6b3
commit 764c97dfb7
7 changed files with 119 additions and 87 deletions

View File

@ -8,6 +8,8 @@ endif
include $(DEVKITARM)/ds_rules
EMU_BUILD=0
#---------------------------------------------------------------------------------
# TARGET is the name of the output
# BUILD is the directory where object files & intermediate files will be placed
@ -20,7 +22,6 @@ BUILD := build
SOURCES := source
DATA :=
INCLUDES := include
NITRODATA := fs
#---------------------------------------------------------------------------------
# options for code generation
@ -34,7 +35,7 @@ CFLAGS := -save-temps \
$(ARCH)
#-finstrument-functions -mpoke-function-name \
CFLAGS += $(INCLUDE) -DARM9 -DEMU_BUILD
CFLAGS += $(INCLUDE) -DARM9
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions
ASFLAGS := $(ARCH)
@ -43,14 +44,21 @@ LDFLAGS = -specs=ds_arm9.specs $(ARCH) -Wl,-Map,$(notdir $*.map)
#---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project (order is important)
#---------------------------------------------------------------------------------
LIBS := -lfilesystem -lfat -lnds9
LIBS := -lfat -lnds9
#---------------------------------------------------------------------------------
# list of directories containing libraries, this must be the top level containing
# include and lib
#---------------------------------------------------------------------------------
LIBDIRS := $(LIBNDS)
ifeq ($(strip $(EMU_BUILD)),1)
NITRODATA := fs
CFLAGS += -DEMU_BUILD
LIBS := -lfilesystem $(LIBS)
else
CFLAGS += -DHW_BUILD
endif
#---------------------------------------------------------------------------------
# no real need to edit anything past this point unless you need to add additional

View File

@ -42,7 +42,6 @@ void emu_init ()
u16 crc;
int valid_crc;
keysSetRepeat(30, 10);
keyboardShow();
// Set some sane defaults
@ -51,6 +50,7 @@ void emu_init ()
// Setup the video hardware
video_init();
#if 1
crc = 0xffff;
// Load the appropriate bios
if (load_bin("BASIC.ROM", 0xD000, 0x3000, &crc)) {
valid_crc = valid_rom_crc(crc);
@ -95,6 +95,8 @@ void emu_run ()
video_draw();
scanKeys();
update_input();
frames_done++;

View File

@ -22,11 +22,10 @@ void update_input ()
u32 keys;
int kbd_key;
scanKeys();
keys = (keysDownRepeat()|keysDown())&0xfff;
keys = keysDown() | keysHeld();
// Send keyboard scancodes when a key is pressed
if (emu_input == INPUT_KBD && keys) {
if (emu_input == INPUT_KBD && (keys&0xfff)) {
int bit_set = __builtin_ffs(keys);
if (bit_set)
keybd_latch = 0x80 ^ key_map[bit_set-1];

View File

@ -12,13 +12,18 @@ int main(int argc, char **argv)
consoleDemoInit();
keyboardDemoInit();
fatInitDefault();
#ifdef EMU_BUILD
nitroFSInit(NULL);
#else
fatInitDefault();
#endif
soundEnable();
iprintf("-- grape\n");
keysSetRepeat(30, 10);
emu_init();
if (argc != 2) {
@ -27,7 +32,7 @@ int main(int argc, char **argv)
/*load_disk("PACMAN.DSK");*/
/*load_disk("Karateka (1984)(Broderbund).dsk");*/
// Awesome!
load_disk("lode.dsk");
/*load_disk("lode.dsk");*/
// AppleII+
/*load_disk("Prince of Persia (1989)(Broderbund)(Disk 1 of 3)[cr].dsk");*/
// Gfx heavy
@ -37,7 +42,7 @@ int main(int argc, char **argv)
/*load_disk("Round About (1983)(Datamost).dsk");*/
/*load_disk("Bug Attack (1981)(Cavalier Computer).dsk");*/
// Scroller
/*load_disk("TetrisII.DSK");*/
load_disk("TetrisII.DSK");
// Mixed mode
/*load_disk("tetris48k.nib");*/
// Lowres

View File

@ -48,13 +48,19 @@ static int opt_exit (const int sel)
return 1;
}
static int sel_slot_l = 0, sel_slot_s = 0;
static int opt_hires (const int sel)
{
video_set_hires(sel);
}
static int sel_slot_l = 0, sel_slot_s = 0, sel_hires = 0;
const static struct page_t paused_pg = {
"Paused", 7, (const entry_t []){
"Paused", 8, (const entry_t []){
{ "Vsync", 2, { "No", "Yes" }, &emu_vsync, opt_vsync },
{ "Scale", 2, { "No", "Yes" }, &emu_scale, opt_scale },
{ "Screen", 2, { "Top", "Bottom" }, &emu_screen, opt_screen },
{ "Hires mode", 2, { "B/W", "Color" }, &sel_hires, opt_hires },
{ "Map keys to", 2, { "joystick", "keyboard" }, &emu_input, opt_input },
{ "Save state", 9, { "1", "2", "3", "4", "5", "6", "7", "8", "9" }, &sel_slot_s, state_save },
{ "Load state", 9, { "1", "2", "3", "4", "5", "6", "7", "8", "9" }, &sel_slot_l, state_load },
@ -66,7 +72,7 @@ void menu_print_page (const page_t *page)
{
int i;
int cur;
int keys;
u32 keys, keys_;
cur = 0;
@ -83,32 +89,34 @@ void menu_print_page (const page_t *page)
}
scanKeys();
keys = keysDownRepeat();
keys = keysDown();
keys_ = keysDownRepeat();
if (keys&KEY_UP) {
if (keys_&KEY_UP) {
cur--;
if (cur < 0)
cur = page->entries_no - 1;
}
if (keys&KEY_DOWN) {
if (keys_&KEY_DOWN) {
cur++;
if (cur == page->entries_no)
cur = 0;
}
if (sel_entry->opts_no) {
if (keys&KEY_LEFT && *sel_entry->opt_ptr > 0)
if (keys_&KEY_LEFT && *sel_entry->opt_ptr > 0)
(*sel_entry->opt_ptr)--;
if (keys&KEY_RIGHT && *sel_entry->opt_ptr < sel_entry->opts_no - 1)
if (keys_&KEY_RIGHT && *sel_entry->opt_ptr < sel_entry->opts_no - 1)
(*sel_entry->opt_ptr)++;
}
if (keys&(KEY_TOUCH|KEY_START|KEY_A)) {
if (keys&KEY_A) {
if (sel_entry->cb && sel_entry->cb(*sel_entry->opt_ptr))
return;
if (!(keys&KEY_A))
return;
}
if (keys&KEY_START)
return;
swiWaitForVBlank();
}
}

View File

@ -73,6 +73,8 @@ static int mixed_mode;
static int sel_page;
static int hires;
static void (* draw_hires_line)(u16 *, u8 *);
// The mixed mode can be enabled only if graphic mode is set
#define render_mixed_mode (mixed_mode&(!text_mode))
@ -185,94 +187,86 @@ void draw_lores_scr (u16 *__restrict map)
}
}
void draw_hires_scr (u16 *map) ITCM_CODE;
#if 0
/*odd_color = (b1&0x80) ? 6 : 3;*/
/*even_color = (b1&0x80) ? 9 : 12;*/
void draw_hires_scr (u16 *__restrict map)
static void draw_hires_line_mono (u16 *__restrict map, u8 *__restrict ptr) ITCM_CODE;
static void draw_hires_line_mono (u16 *__restrict map, u8 *__restrict ptr)
{
int last_line;
int i, j, k;
u8 *__restrict ptr, tmp;
static u8 tmp_line[0x200];
static const u8 color_lut[] DTCM_DATA = { 0, 12, 0, 15, 0, 9, 0, 15, 0, 3, 0, 15, 0, 6, 0, 15 };
last_line = render_mixed_mode ? 168 : 192;
for (i = 0; i < last_line; i++, map += 0x100) {
if (!page_dirty[8 + (i&7)])
continue;
ptr = mainram + (sel_page << 13) + ((i&7) * 0x400) + video_addr[i>>3];
for (j = 0, tmp = 0; j < 280; j += 7) {
const u8 b1 = *ptr++;
tmp = (b1&0x7f) << 1 | tmp;
// embb
// e = even / odd
// m = msb
// b = data
for (k = 0; k <= 7; k++)
tmp_line[j+k] = color_lut[(((j+k)&1) ? 0x8 : 0x0) + ((b1&0x80)>>5) + ((tmp>>k)&3)];
tmp >>= 7;
}
DC_FlushRange(tmp_line, sizeof(tmp_line));
dmaCopyAsynch(tmp_line, map, sizeof(tmp_line));
DC_InvalidateRange(map, sizeof(tmp_line));
const u16 lut[] = {0x0000, 0x000c, 0x0c00, 0x0c0c};
int j;
for (j = 0; j < 280/14; j++) {
u16 tmp = (ptr[0]&0x7f) | ((ptr[1]&0x7f) << 7);
ptr += 2;
*map++ = lut[tmp&3]; tmp >>= 2;
*map++ = lut[tmp&3]; tmp >>= 2;
*map++ = lut[tmp&3]; tmp >>= 2;
*map++ = lut[tmp&3]; tmp >>= 2;
*map++ = lut[tmp&3]; tmp >>= 2;
*map++ = lut[tmp&3]; tmp >>= 2;
*map++ = lut[tmp&3];
}
}
#else
void draw_hires_scr (u16 *__restrict map)
static void draw_hires_line_color (u16 *__restrict map, u8 *__restrict ptr) ITCM_CODE;
static void draw_hires_line_color (u16 *__restrict map, u8 *__restrict ptr)
{
int last_line;
int i, j, k, x;
u8 *__restrict xptr, *__restrict ptr, tmp;
static u8 tmp_line[280];
static const u8 color_lut[] DTCM_DATA = {
0, 12, 0, 15, 0, 9, 0, 15, 0, 3, 0, 15, 0, 6, 0, 15
};
int j, k;
u16 tmp;
for (j = 0, tmp = 0; j < 280; j += 7) {
const u8 b1 = *ptr++;
tmp = (b1&0x7f) << 1 | tmp;
const u8 *__restrict lut_b = color_lut + ((b1&0x80)>>5);
for (k = 0; k < 7; k+=2)
{
tmp_line[j+k+0] = lut_b[((j&1) << 3) + (tmp&3)];
tmp >>= 1;
if(k == 6)
break;
tmp_line[j+k+1] = lut_b[((~j&1) << 3) + (tmp&3)];
tmp >>= 1;
}
}
DC_FlushRange(tmp_line, sizeof(tmp_line));
dmaCopyAsynch(tmp_line, map, sizeof(tmp_line));
DC_InvalidateRange(map, sizeof(tmp_line));
}
static void draw_hires_scr (u16 *map) ITCM_CODE;
static void draw_hires_scr (u16 *__restrict map)
{
int i, x, last_line;
u8 *__restrict xptr, *__restrict ptr;
u16 *__restrict omap;
static u8 tmp_line[0x200];
static const u8 color_lut[] DTCM_DATA = { 0, 12, 0, 15, 0, 9, 0, 15, 0, 3, 0, 15, 0, 6, 0, 15 };
last_line = render_mixed_mode ? 168/8 : 192/8;
for(x = 0; x < 8; x++, map += 0x100) {
if (!page_dirty[8+x])
if (!page_dirty[(sel_page<<3)+x])
continue;
xptr = mainram + (sel_page << 13) + (x << 10);
for(omap = map, i = 0; i < last_line; i++, omap += 0x800) {
ptr = xptr + video_addr[i];
for (j = 0, tmp = 0; j < 280; j += 7) {
const u8 b1 = *ptr++;
draw_hires_line(omap, ptr);
tmp = (b1&0x7f) << 1 | tmp;
const u8 *__restrict lut_b = color_lut + ((b1&0x80)>>5);
for (k = 0; k < 7; k+=2)
{
tmp_line[j+k+0] = lut_b[((j&1) << 3) + (tmp&3)];
tmp >>= 1;
if(k == 6)
break;
tmp_line[j+k+1] = lut_b[((~j&1) << 3) + (tmp&3)];
tmp >>= 1;
}
}
DC_FlushRange(tmp_line, sizeof(tmp_line));
dmaCopyAsynch(tmp_line, omap, sizeof(tmp_line));
DC_InvalidateRange(omap, sizeof(tmp_line));
}
page_dirty[8+x] = 0;
page_dirty[(sel_page<<3)+x] = 0;
}
}
#endif
void draw_text_scr (u16 *map) ITCM_CODE;
void draw_text_scr (u16 *map)
void draw_text_scr (u16 *__restrict map)
{
int start_line;
int i, j;
@ -319,6 +313,19 @@ void video_draw ()
page_dirty[sel_page] = 0;
}
void video_set_hires (int renderer)
{
switch (renderer) {
default:
case 0:
draw_hires_line = draw_hires_line_mono;
break;
case 1:
draw_hires_line = draw_hires_line_color;
break;
}
}
int video_set_scale (int mode)
{
int scaleg_x, scalet_x;
@ -366,6 +373,8 @@ void video_init ()
// BG2 outside
WIN_OUT = 0x4;
video_set_hires(-1);
memcpy(BG_PALETTE, palette, sizeof(palette));
struct UnpackStruct unpack_bit;

View File

@ -1,6 +1,7 @@
#ifndef VIDEO_H
#define VIDEO_H
void video_set_hires (int renderer);
int video_set_scale (int mode);
void video_draw ();
void video_init ();