mirror of
https://github.com/LemonBoy/grape.git
synced 2024-12-01 19:50:26 +00:00
Menu fixes. Various fixes.
This commit is contained in:
parent
54d3f3ee3f
commit
3b5d7bc6b3
3
Makefile
3
Makefile
@ -25,10 +25,9 @@ NITRODATA := fs
|
|||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
# options for code generation
|
# options for code generation
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
ARCH := -marm -mthumb-interwork -march=armv5te -mtune=arm946e-s
|
ARCH := -marm -mno-thumb-interwork -march=armv5te -mtune=arm946e-s
|
||||||
|
|
||||||
CFLAGS := -save-temps \
|
CFLAGS := -save-temps \
|
||||||
-funroll-loops -ftree-vectorize \
|
|
||||||
-Wall -Ofast\
|
-Wall -Ofast\
|
||||||
-fomit-frame-pointer\
|
-fomit-frame-pointer\
|
||||||
-ffast-math \
|
-ffast-math \
|
||||||
|
15
source/cpu.s
15
source/cpu.s
@ -21,6 +21,7 @@ reg_y .req r7
|
|||||||
reg_f .req r6
|
reg_f .req r6
|
||||||
cycles .req r5
|
cycles .req r5
|
||||||
|
|
||||||
|
// XXX rebase the pc on page cross
|
||||||
.macro fetch
|
.macro fetch
|
||||||
ldrb r0, [reg_pc], #1
|
ldrb r0, [reg_pc], #1
|
||||||
.endm
|
.endm
|
||||||
@ -134,19 +135,11 @@ cycles .req r5
|
|||||||
ldrsb r0, [reg_pc], #1
|
ldrsb r0, [reg_pc], #1
|
||||||
#ifdef CHECK_IDLE_JUMP
|
#ifdef CHECK_IDLE_JUMP
|
||||||
cmp r0, #-2
|
cmp r0, #-2
|
||||||
bne 2f
|
bne 1f
|
||||||
// unbase_pc reg_pc
|
|
||||||
// ldr r0, =idle_loop_msg
|
|
||||||
// mov r1, reg_pc
|
|
||||||
// bl iprintf
|
|
||||||
b _xx
|
b _xx
|
||||||
#endif
|
#endif
|
||||||
2: // Sign extend
|
// XXX two cycle penality for page crossing
|
||||||
add r2, reg_pc, r0
|
1: add reg_pc, r0
|
||||||
eor r1, r2, reg_pc
|
|
||||||
tst r1, #0x100
|
|
||||||
subne cycles, #2
|
|
||||||
add reg_pc, r0
|
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
#define FLAG_CARRY 0x01<<24
|
#define FLAG_CARRY 0x01<<24
|
||||||
|
@ -46,7 +46,7 @@ void emu_init ()
|
|||||||
keyboardShow();
|
keyboardShow();
|
||||||
|
|
||||||
// Set some sane defaults
|
// Set some sane defaults
|
||||||
emu_vsync = 0;
|
emu_vsync = 1;
|
||||||
|
|
||||||
// Setup the video hardware
|
// Setup the video hardware
|
||||||
video_init();
|
video_init();
|
||||||
|
@ -13,8 +13,10 @@
|
|||||||
|
|
||||||
int emu_vsync;
|
int emu_vsync;
|
||||||
int emu_input;
|
int emu_input;
|
||||||
|
int emu_screen;
|
||||||
|
int emu_scale;
|
||||||
|
|
||||||
static char *basename;
|
static char *basename = NULL;
|
||||||
|
|
||||||
void emu_init ();
|
void emu_init ();
|
||||||
void emu_run ();
|
void emu_run ();
|
||||||
|
@ -27,7 +27,7 @@ int main(int argc, char **argv)
|
|||||||
/*load_disk("PACMAN.DSK");*/
|
/*load_disk("PACMAN.DSK");*/
|
||||||
/*load_disk("Karateka (1984)(Broderbund).dsk");*/
|
/*load_disk("Karateka (1984)(Broderbund).dsk");*/
|
||||||
// Awesome!
|
// Awesome!
|
||||||
/*load_disk("lode.dsk");*/
|
load_disk("lode.dsk");
|
||||||
// AppleII+
|
// AppleII+
|
||||||
/*load_disk("Prince of Persia (1989)(Broderbund)(Disk 1 of 3)[cr].dsk");*/
|
/*load_disk("Prince of Persia (1989)(Broderbund)(Disk 1 of 3)[cr].dsk");*/
|
||||||
// Gfx heavy
|
// Gfx heavy
|
||||||
@ -44,7 +44,7 @@ int main(int argc, char **argv)
|
|||||||
/*load_disk("Fracas (1980)(Quality Software).dsk");*/
|
/*load_disk("Fracas (1980)(Quality Software).dsk");*/
|
||||||
/*load_disk("Colorix.dsk");*/
|
/*load_disk("Colorix.dsk");*/
|
||||||
/*load_disk("LoRes Games.DSK");*/
|
/*load_disk("LoRes Games.DSK");*/
|
||||||
load_disk("LoRes Hijinks.DSK");
|
/*load_disk("LoRes Hijinks.DSK");*/
|
||||||
// SP Crash
|
// SP Crash
|
||||||
/*load_disk("Apple II Business Graphics 1.0 (1981).nib");*/
|
/*load_disk("Apple II Business Graphics 1.0 (1981).nib");*/
|
||||||
} else {
|
} else {
|
||||||
|
@ -6,6 +6,7 @@ typedef struct entry_t {
|
|||||||
const char *label;
|
const char *label;
|
||||||
const int opts_no;
|
const int opts_no;
|
||||||
const char *opts[10];
|
const char *opts[10];
|
||||||
|
int *opt_ptr;
|
||||||
int (*cb)(int);
|
int (*cb)(int);
|
||||||
} entry_t;
|
} entry_t;
|
||||||
|
|
||||||
@ -15,31 +16,53 @@ typedef struct page_t {
|
|||||||
const entry_t *entries;
|
const entry_t *entries;
|
||||||
} page_t;
|
} page_t;
|
||||||
|
|
||||||
#define OPT(n) int opt_##n (int sel) { emu_##n = sel; return 1; }
|
static int opt_screen (const int sel)
|
||||||
|
|
||||||
OPT(vsync);
|
|
||||||
OPT(input);
|
|
||||||
|
|
||||||
int opt_screen (int sel)
|
|
||||||
{
|
{
|
||||||
|
emu_screen = sel;
|
||||||
(sel) ? lcdMainOnBottom() : lcdMainOnTop();
|
(sel) ? lcdMainOnBottom() : lcdMainOnTop();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int opt_vsync (const int sel)
|
||||||
|
{
|
||||||
|
emu_vsync = sel;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int opt_scale (const int sel)
|
||||||
|
{
|
||||||
|
emu_scale = sel;
|
||||||
|
video_set_scale(emu_scale);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int opt_input (const int sel)
|
||||||
|
{
|
||||||
|
emu_input = sel;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int opt_exit (const int sel)
|
||||||
|
{
|
||||||
|
exit(0);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int sel_slot_l = 0, sel_slot_s = 0;
|
||||||
|
|
||||||
const static struct page_t paused_pg = {
|
const static struct page_t paused_pg = {
|
||||||
"Paused", 7, (const entry_t []){
|
"Paused", 7, (const entry_t []){
|
||||||
{ "Vsync", 2, { "No", "Yes" }, opt_vsync },
|
{ "Vsync", 2, { "No", "Yes" }, &emu_vsync, opt_vsync },
|
||||||
{ "Scale", 2, { "No", "Yes" }, video_set_scale },
|
{ "Scale", 2, { "No", "Yes" }, &emu_scale, opt_scale },
|
||||||
{ "Screen", 2, { "Top", "Bottom" }, opt_screen },
|
{ "Screen", 2, { "Top", "Bottom" }, &emu_screen, opt_screen },
|
||||||
{ "Map keys to", 2, { "joystick", "keyboard" }, opt_input },
|
{ "Map keys to", 2, { "joystick", "keyboard" }, &emu_input, opt_input },
|
||||||
{ "Save state", 9, { "1", "2", "3", "4", "5", "6", "7", "8", "9" }, state_save },
|
{ "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" }, state_load },
|
{ "Load state", 9, { "1", "2", "3", "4", "5", "6", "7", "8", "9" }, &sel_slot_l, state_load },
|
||||||
{ "Exit", 0, { }, exit },
|
{ "Exit", 0, { }, NULL, opt_exit },
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
static int paused_pg_opt[6] = { 1, 0, 0, 0, 0, 0 };
|
|
||||||
|
|
||||||
void menu_print_page (const page_t *page, int *opts)
|
void menu_print_page (const page_t *page)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int cur;
|
int cur;
|
||||||
@ -56,7 +79,7 @@ void menu_print_page (const page_t *page, int *opts)
|
|||||||
for (i = 0; i < page->entries_no; i++) {
|
for (i = 0; i < page->entries_no; i++) {
|
||||||
const entry_t *entry = &page->entries[i];
|
const entry_t *entry = &page->entries[i];
|
||||||
iprintf("%c %s %s\n", (i == cur) ? '>' : ' ', entry->label,
|
iprintf("%c %s %s\n", (i == cur) ? '>' : ' ', entry->label,
|
||||||
(entry->opts_no) ? entry->opts[opts[i]] : "");
|
(entry->opts_no) ? entry->opts[*entry->opt_ptr] : "");
|
||||||
}
|
}
|
||||||
|
|
||||||
scanKeys();
|
scanKeys();
|
||||||
@ -73,26 +96,19 @@ void menu_print_page (const page_t *page, int *opts)
|
|||||||
cur = 0;
|
cur = 0;
|
||||||
}
|
}
|
||||||
if (sel_entry->opts_no) {
|
if (sel_entry->opts_no) {
|
||||||
if (keys&KEY_LEFT && opts[cur] > 0) {
|
if (keys&KEY_LEFT && *sel_entry->opt_ptr > 0)
|
||||||
opts[cur]--;
|
(*sel_entry->opt_ptr)--;
|
||||||
/*if (sel_entry->cb) sel_entry->cb(opts[cur]);*/
|
if (keys&KEY_RIGHT && *sel_entry->opt_ptr < sel_entry->opts_no - 1)
|
||||||
}
|
(*sel_entry->opt_ptr)++;
|
||||||
if (keys&KEY_RIGHT && opts[cur] < sel_entry->opts_no - 1) {
|
|
||||||
opts[cur]++;
|
|
||||||
/*if (sel_entry->cb) sel_entry->cb(opts[cur]);*/
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (keys&KEY_A) {
|
if (keys&(KEY_TOUCH|KEY_START|KEY_A)) {
|
||||||
if (sel_entry->cb)
|
if (sel_entry->cb && sel_entry->cb(*sel_entry->opt_ptr))
|
||||||
if (sel_entry->cb(opts[cur]))
|
return;
|
||||||
return;
|
if (!(keys&KEY_A))
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use keysDown to avoid bouncing
|
|
||||||
if (keysDown()&KEY_START)
|
|
||||||
return;
|
|
||||||
|
|
||||||
swiWaitForVBlank();
|
swiWaitForVBlank();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -103,4 +119,4 @@ void print_msg (const char *msg)
|
|||||||
swiDelay(10000000);
|
swiDelay(10000000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pause_menu () { menu_print_page(&paused_pg, (int *)&paused_pg_opt); }
|
void pause_menu () { menu_print_page(&paused_pg); }
|
||||||
|
140
source/video.c
140
source/video.c
@ -3,46 +3,46 @@
|
|||||||
#include "mem.h"
|
#include "mem.h"
|
||||||
|
|
||||||
const u8 apple_font[] = {
|
const u8 apple_font[] = {
|
||||||
0x00, 0x70, 0x88, 0xa8, 0xe8, 0x68, 0x08, 0xf0, 0x00, 0x20, 0x50, 0x88, 0x88, 0xf8, 0x88, 0x88,
|
0x00, 0x70, 0x88, 0xa8, 0xe8, 0x68, 0x08, 0xf0, 0x00, 0x20, 0x50, 0x88, 0x88, 0xf8, 0x88, 0x88,
|
||||||
0x00, 0x78, 0x88, 0x88, 0x78, 0x88, 0x88, 0x78, 0x00, 0x70, 0x88, 0x08, 0x08, 0x08, 0x88, 0x70,
|
0x00, 0x78, 0x88, 0x88, 0x78, 0x88, 0x88, 0x78, 0x00, 0x70, 0x88, 0x08, 0x08, 0x08, 0x88, 0x70,
|
||||||
0x00, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x00, 0xf8, 0x08, 0x08, 0x78, 0x08, 0x08, 0xf8,
|
0x00, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x00, 0xf8, 0x08, 0x08, 0x78, 0x08, 0x08, 0xf8,
|
||||||
0x00, 0xf8, 0x08, 0x08, 0x78, 0x08, 0x08, 0x08, 0x00, 0xf0, 0x08, 0x08, 0x08, 0xc8, 0x88, 0xf0,
|
0x00, 0xf8, 0x08, 0x08, 0x78, 0x08, 0x08, 0x08, 0x00, 0xf0, 0x08, 0x08, 0x08, 0xc8, 0x88, 0xf0,
|
||||||
0x00, 0x88, 0x88, 0x88, 0xf8, 0x88, 0x88, 0x88, 0x00, 0x70, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70,
|
0x00, 0x88, 0x88, 0x88, 0xf8, 0x88, 0x88, 0x88, 0x00, 0x70, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70,
|
||||||
0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x88, 0x70, 0x00, 0x88, 0x48, 0x28, 0x18, 0x28, 0x48, 0x88,
|
0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x88, 0x70, 0x00, 0x88, 0x48, 0x28, 0x18, 0x28, 0x48, 0x88,
|
||||||
0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0xf8, 0x00, 0x88, 0xd8, 0xa8, 0xa8, 0x88, 0x88, 0x88,
|
0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0xf8, 0x00, 0x88, 0xd8, 0xa8, 0xa8, 0x88, 0x88, 0x88,
|
||||||
0x00, 0x88, 0x88, 0x98, 0xa8, 0xc8, 0x88, 0x88, 0x00, 0x70, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70,
|
0x00, 0x88, 0x88, 0x98, 0xa8, 0xc8, 0x88, 0x88, 0x00, 0x70, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70,
|
||||||
0x00, 0x78, 0x88, 0x88, 0x78, 0x08, 0x08, 0x08, 0x00, 0x70, 0x88, 0x88, 0x88, 0xa8, 0x48, 0xb0,
|
0x00, 0x78, 0x88, 0x88, 0x78, 0x08, 0x08, 0x08, 0x00, 0x70, 0x88, 0x88, 0x88, 0xa8, 0x48, 0xb0,
|
||||||
0x00, 0x78, 0x88, 0x88, 0x78, 0x28, 0x48, 0x88, 0x00, 0x70, 0x88, 0x08, 0x70, 0x80, 0x88, 0x70,
|
0x00, 0x78, 0x88, 0x88, 0x78, 0x28, 0x48, 0x88, 0x00, 0x70, 0x88, 0x08, 0x70, 0x80, 0x88, 0x70,
|
||||||
0x00, 0xf8, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70,
|
0x00, 0xf8, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70,
|
||||||
0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x50, 0x20, 0x00, 0x88, 0x88, 0x88, 0xa8, 0xa8, 0xd8, 0x88,
|
0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x50, 0x20, 0x00, 0x88, 0x88, 0x88, 0xa8, 0xa8, 0xd8, 0x88,
|
||||||
0x00, 0x88, 0x88, 0x50, 0x20, 0x50, 0x88, 0x88, 0x00, 0x88, 0x88, 0x50, 0x20, 0x20, 0x20, 0x20,
|
0x00, 0x88, 0x88, 0x50, 0x20, 0x50, 0x88, 0x88, 0x00, 0x88, 0x88, 0x50, 0x20, 0x20, 0x20, 0x20,
|
||||||
0x00, 0xf8, 0x80, 0x40, 0x20, 0x10, 0x08, 0xf8, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8,
|
0x00, 0xf8, 0x80, 0x40, 0x20, 0x10, 0x08, 0xf8, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8,
|
||||||
0x00, 0x00, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0xf8, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8,
|
0x00, 0x00, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0xf8, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8,
|
||||||
0x00, 0x00, 0x00, 0x20, 0x50, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8,
|
0x00, 0x00, 0x00, 0x20, 0x50, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x20,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x20,
|
||||||
0x00, 0x50, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x50, 0xf8, 0x50, 0xf8, 0x50, 0x50,
|
0x00, 0x50, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x50, 0xf8, 0x50, 0xf8, 0x50, 0x50,
|
||||||
0x00, 0x20, 0xf0, 0x28, 0x70, 0xa0, 0x78, 0x20, 0x00, 0x18, 0x98, 0x40, 0x20, 0x10, 0xc8, 0xc0,
|
0x00, 0x20, 0xf0, 0x28, 0x70, 0xa0, 0x78, 0x20, 0x00, 0x18, 0x98, 0x40, 0x20, 0x10, 0xc8, 0xc0,
|
||||||
0x00, 0x10, 0x28, 0x28, 0x10, 0xa8, 0x48, 0xb0, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x10, 0x28, 0x28, 0x10, 0xa8, 0x48, 0xb0, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x20, 0x10, 0x08, 0x08, 0x08, 0x10, 0x20, 0x00, 0x20, 0x40, 0x80, 0x80, 0x80, 0x40, 0x20,
|
0x00, 0x20, 0x10, 0x08, 0x08, 0x08, 0x10, 0x20, 0x00, 0x20, 0x40, 0x80, 0x80, 0x80, 0x40, 0x20,
|
||||||
0x00, 0x20, 0xa8, 0x70, 0x20, 0x70, 0xa8, 0x20, 0x00, 0x00, 0x20, 0x20, 0xf8, 0x20, 0x20, 0x00,
|
0x00, 0x20, 0xa8, 0x70, 0x20, 0x70, 0xa8, 0x20, 0x00, 0x00, 0x20, 0x20, 0xf8, 0x20, 0x20, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x00,
|
||||||
0x00, 0x70, 0x88, 0xc8, 0xa8, 0x98, 0x88, 0x70, 0x00, 0x20, 0x30, 0x20, 0x20, 0x20, 0x20, 0x70,
|
0x00, 0x70, 0x88, 0xc8, 0xa8, 0x98, 0x88, 0x70, 0x00, 0x20, 0x30, 0x20, 0x20, 0x20, 0x20, 0x70,
|
||||||
0x00, 0x70, 0x88, 0x80, 0x60, 0x10, 0x08, 0xf8, 0x00, 0xf8, 0x80, 0x40, 0x60, 0x80, 0x88, 0x70,
|
0x00, 0x70, 0x88, 0x80, 0x60, 0x10, 0x08, 0xf8, 0x00, 0xf8, 0x80, 0x40, 0x60, 0x80, 0x88, 0x70,
|
||||||
0x00, 0x40, 0x60, 0x50, 0x48, 0xf8, 0x40, 0x40, 0x00, 0xf8, 0x08, 0x78, 0x80, 0x80, 0x88, 0x70,
|
0x00, 0x40, 0x60, 0x50, 0x48, 0xf8, 0x40, 0x40, 0x00, 0xf8, 0x08, 0x78, 0x80, 0x80, 0x88, 0x70,
|
||||||
0x00, 0xe0, 0x10, 0x08, 0x78, 0x88, 0x88, 0x70, 0x00, 0xf8, 0x80, 0x40, 0x20, 0x10, 0x10, 0x10,
|
0x00, 0xe0, 0x10, 0x08, 0x78, 0x88, 0x88, 0x70, 0x00, 0xf8, 0x80, 0x40, 0x20, 0x10, 0x10, 0x10,
|
||||||
0x00, 0x70, 0x88, 0x88, 0x70, 0x88, 0x88, 0x70, 0x00, 0x70, 0x88, 0x88, 0xf0, 0x80, 0x40, 0x38,
|
0x00, 0x70, 0x88, 0x88, 0x70, 0x88, 0x88, 0x70, 0x00, 0x70, 0x88, 0x88, 0xf0, 0x80, 0x40, 0x38,
|
||||||
0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x20, 0x10,
|
0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x20, 0x10,
|
||||||
0x00, 0x40, 0x20, 0x10, 0x08, 0x10, 0x20, 0x40, 0x00, 0x00, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0x00,
|
0x00, 0x40, 0x20, 0x10, 0x08, 0x10, 0x20, 0x40, 0x00, 0x00, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0x00,
|
||||||
0x00, 0x10, 0x20, 0x40, 0x80, 0x40, 0x20, 0x10, 0x00, 0x70, 0x88, 0x40, 0x20, 0x20, 0x00, 0x20
|
0x00, 0x10, 0x20, 0x40, 0x80, 0x40, 0x20, 0x10, 0x00, 0x70, 0x88, 0x40, 0x20, 0x20, 0x00, 0x20
|
||||||
};
|
};
|
||||||
|
|
||||||
static const u16 video_addr[] DTCM_DATA = {
|
static const u16 video_addr[] DTCM_DATA = {
|
||||||
0x000, 0x080, 0x100, 0x180,
|
0x000, 0x080, 0x100, 0x180,
|
||||||
0x200, 0x280, 0x300, 0x380,
|
0x200, 0x280, 0x300, 0x380,
|
||||||
0x028, 0x0a8, 0x128, 0x1a8,
|
0x028, 0x0a8, 0x128, 0x1a8,
|
||||||
0x228, 0x2a8, 0x328, 0x3a8,
|
0x228, 0x2a8, 0x328, 0x3a8,
|
||||||
0x050, 0x0d0, 0x150, 0x1d0,
|
0x050, 0x0d0, 0x150, 0x1d0,
|
||||||
0x250, 0x2d0, 0x350, 0x3d0
|
0x250, 0x2d0, 0x350, 0x3d0
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -73,6 +73,9 @@ static int mixed_mode;
|
|||||||
static int sel_page;
|
static int sel_page;
|
||||||
static int hires;
|
static int hires;
|
||||||
|
|
||||||
|
// The mixed mode can be enabled only if graphic mode is set
|
||||||
|
#define render_mixed_mode (mixed_mode&(!text_mode))
|
||||||
|
|
||||||
void video_set_mode ();
|
void video_set_mode ();
|
||||||
|
|
||||||
void video_save (FILE *f)
|
void video_save (FILE *f)
|
||||||
@ -83,7 +86,7 @@ void video_save (FILE *f)
|
|||||||
fwrite(&hires, 1, 4, f);
|
fwrite(&hires, 1, 4, f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void video_load (FILE *f)
|
void video_load (FILE *f)
|
||||||
{
|
{
|
||||||
fread(&text_mode, 1, 4, f);
|
fread(&text_mode, 1, 4, f);
|
||||||
fread(&mixed_mode, 1, 4, f);
|
fread(&mixed_mode, 1, 4, f);
|
||||||
@ -94,8 +97,8 @@ void video_load (FILE *f)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void video_set_mode ()
|
void video_set_mode ()
|
||||||
{
|
{
|
||||||
if (mixed_mode) {
|
if (render_mixed_mode) {
|
||||||
bgShow(gfx_bg);
|
bgShow(gfx_bg);
|
||||||
bgShow(text_bg);
|
bgShow(text_bg);
|
||||||
REG_DISPCNT |= DISPLAY_WIN0_ON;
|
REG_DISPCNT |= DISPLAY_WIN0_ON;
|
||||||
@ -106,8 +109,8 @@ void video_set_mode ()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
u8 video_io_read (u16 addr) ITCM_CODE;
|
u8 video_io_read (u16 addr) ITCM_CODE;
|
||||||
u8 video_io_read (u16 addr)
|
u8 video_io_read (u16 addr)
|
||||||
{
|
{
|
||||||
switch (addr&0xf) {
|
switch (addr&0xf) {
|
||||||
case 0x0:
|
case 0x0:
|
||||||
@ -115,8 +118,6 @@ u8 video_io_read (u16 addr)
|
|||||||
break;
|
break;
|
||||||
case 0x1:
|
case 0x1:
|
||||||
text_mode = 1;
|
text_mode = 1;
|
||||||
// The mixed mode can be enabled only if graphic mode is set
|
|
||||||
mixed_mode = 0;
|
|
||||||
break;
|
break;
|
||||||
case 0x2:
|
case 0x2:
|
||||||
mixed_mode = 0;
|
mixed_mode = 0;
|
||||||
@ -152,7 +153,7 @@ u8 video_io_read (u16 addr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void draw_lores_scr (u16 *map) ITCM_CODE;
|
void draw_lores_scr (u16 *map) ITCM_CODE;
|
||||||
void draw_lores_scr (u16 *map)
|
void draw_lores_scr (u16 *__restrict map)
|
||||||
{
|
{
|
||||||
int last_line;
|
int last_line;
|
||||||
int i, j;
|
int i, j;
|
||||||
@ -161,7 +162,7 @@ void draw_lores_scr (u16 *map)
|
|||||||
if (!page_dirty[sel_page])
|
if (!page_dirty[sel_page])
|
||||||
return;
|
return;
|
||||||
|
|
||||||
last_line = mixed_mode ? 168 : 192;
|
last_line = render_mixed_mode ? 168 : 192;
|
||||||
|
|
||||||
for (i = 0; i < last_line; i++) {
|
for (i = 0; i < last_line; i++) {
|
||||||
ptr = (u8 *)(mainram + (sel_page << 10) + video_addr[i/8]);
|
ptr = (u8 *)(mainram + (sel_page << 10) + video_addr[i/8]);
|
||||||
@ -184,17 +185,19 @@ void draw_lores_scr (u16 *map)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void draw_hires_scr (u16 *map) ITCM_CODE;
|
||||||
|
#if 0
|
||||||
/*odd_color = (b1&0x80) ? 6 : 3;*/
|
/*odd_color = (b1&0x80) ? 6 : 3;*/
|
||||||
/*even_color = (b1&0x80) ? 9 : 12;*/
|
/*even_color = (b1&0x80) ? 9 : 12;*/
|
||||||
void draw_hires_scr_1 (u16 *map)
|
void draw_hires_scr (u16 *__restrict map)
|
||||||
{
|
{
|
||||||
int last_line;
|
int last_line;
|
||||||
int i, j, k;
|
int i, j, k;
|
||||||
u8 *ptr, tmp;
|
u8 *__restrict ptr, tmp;
|
||||||
static u8 tmp_line[0x200];
|
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 };
|
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 = mixed_mode ? 168 : 192;
|
last_line = render_mixed_mode ? 168 : 192;
|
||||||
|
|
||||||
for (i = 0; i < last_line; i++, map += 0x100) {
|
for (i = 0; i < last_line; i++, map += 0x100) {
|
||||||
if (!page_dirty[8 + (i&7)])
|
if (!page_dirty[8 + (i&7)])
|
||||||
@ -211,28 +214,29 @@ void draw_hires_scr_1 (u16 *map)
|
|||||||
// e = even / odd
|
// e = even / odd
|
||||||
// m = msb
|
// m = msb
|
||||||
// b = data
|
// b = data
|
||||||
for (k = 0; k <= 7; k++)
|
for (k = 0; k <= 7; k++)
|
||||||
tmp_line[j+k] = color_lut[(((j+k)&1) ? 0x8 : 0x0) + ((b1&0x80)>>5) + ((tmp>>k)&3)];
|
tmp_line[j+k] = color_lut[(((j+k)&1) ? 0x8 : 0x0) + ((b1&0x80)>>5) + ((tmp>>k)&3)];
|
||||||
|
|
||||||
tmp >>= 7;
|
tmp >>= 7;
|
||||||
}
|
}
|
||||||
|
|
||||||
dmaCopyAsynch(tmp_line, map, 0x200);
|
DC_FlushRange(tmp_line, sizeof(tmp_line));
|
||||||
|
dmaCopyAsynch(tmp_line, map, sizeof(tmp_line));
|
||||||
|
DC_InvalidateRange(map, sizeof(tmp_line));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
void draw_hires_scr (u16 *map) ITCM_CODE;
|
void draw_hires_scr (u16 *__restrict map)
|
||||||
void draw_hires_scr (u16 *map)
|
{
|
||||||
{
|
int last_line;
|
||||||
int last_line;
|
int i, j, k, x;
|
||||||
int i, j, k, x;
|
u8 *__restrict xptr, *__restrict ptr, tmp;
|
||||||
u8 *xptr, *ptr, tmp;
|
u16 *__restrict omap;
|
||||||
u16 *omap;
|
|
||||||
static u8 tmp_line[0x200];
|
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 };
|
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 = mixed_mode ? 168/8 : 192/8;
|
last_line = render_mixed_mode ? 168/8 : 192/8;
|
||||||
|
|
||||||
for(x = 0; x < 8; x++, map += 0x100) {
|
for(x = 0; x < 8; x++, map += 0x100) {
|
||||||
if (!page_dirty[8+x])
|
if (!page_dirty[8+x])
|
||||||
@ -246,7 +250,7 @@ void draw_hires_scr (u16 *map)
|
|||||||
const u8 b1 = *ptr++;
|
const u8 b1 = *ptr++;
|
||||||
|
|
||||||
tmp = (b1&0x7f) << 1 | tmp;
|
tmp = (b1&0x7f) << 1 | tmp;
|
||||||
const u8 *lut_b = color_lut + ((b1&0x80)>>5);
|
const u8 *__restrict lut_b = color_lut + ((b1&0x80)>>5);
|
||||||
|
|
||||||
for (k = 0; k < 7; k+=2)
|
for (k = 0; k < 7; k+=2)
|
||||||
{
|
{
|
||||||
@ -258,12 +262,14 @@ void draw_hires_scr (u16 *map)
|
|||||||
tmp >>= 1;
|
tmp >>= 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dmaCopyAsynch(tmp_line, omap, 0x200);
|
DC_FlushRange(tmp_line, sizeof(tmp_line));
|
||||||
/*memcpy(omap, tmp_line, 0x200);*/
|
dmaCopyAsynch(tmp_line, omap, sizeof(tmp_line));
|
||||||
|
DC_InvalidateRange(omap, sizeof(tmp_line));
|
||||||
}
|
}
|
||||||
page_dirty[8+x] = 0;
|
page_dirty[8+x] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void draw_text_scr (u16 *map) ITCM_CODE;
|
void draw_text_scr (u16 *map) ITCM_CODE;
|
||||||
void draw_text_scr (u16 *map)
|
void draw_text_scr (u16 *map)
|
||||||
@ -275,7 +281,7 @@ void draw_text_scr (u16 *map)
|
|||||||
if (!page_dirty[sel_page])
|
if (!page_dirty[sel_page])
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ((start_line = mixed_mode ? 21 : 0))
|
if ((start_line = render_mixed_mode ? 21 : 0))
|
||||||
map += 32 * start_line;
|
map += 32 * start_line;
|
||||||
|
|
||||||
for (i = start_line; i < 24; i++) {
|
for (i = start_line; i < 24; i++) {
|
||||||
@ -298,7 +304,7 @@ void video_draw ()
|
|||||||
u16 *text_ptr = (u16 *)0x6002000;
|
u16 *text_ptr = (u16 *)0x6002000;
|
||||||
u16 *gfx_ptr = (u16 *)0x6020000;
|
u16 *gfx_ptr = (u16 *)0x6020000;
|
||||||
|
|
||||||
if (mixed_mode) {
|
if (render_mixed_mode) {
|
||||||
draw_text_scr(text_ptr);
|
draw_text_scr(text_ptr);
|
||||||
(hires) ? draw_hires_scr(gfx_ptr) : draw_lores_scr(gfx_ptr);
|
(hires) ? draw_hires_scr(gfx_ptr) : draw_lores_scr(gfx_ptr);
|
||||||
} else {
|
} else {
|
||||||
@ -307,13 +313,13 @@ void video_draw ()
|
|||||||
else
|
else
|
||||||
(hires) ? draw_hires_scr(gfx_ptr) : draw_lores_scr(gfx_ptr);
|
(hires) ? draw_hires_scr(gfx_ptr) : draw_lores_scr(gfx_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear this here otherwise we won't be able to render a lores
|
// Clear this here otherwise we won't be able to render a lores
|
||||||
// screen after the text one
|
// screen after the text one
|
||||||
page_dirty[sel_page] = 0;
|
page_dirty[sel_page] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int video_set_scale (int mode)
|
int video_set_scale (int mode)
|
||||||
{
|
{
|
||||||
int scaleg_x, scalet_x;
|
int scaleg_x, scalet_x;
|
||||||
int scale_y;
|
int scale_y;
|
||||||
@ -337,7 +343,7 @@ int video_set_scale (int mode)
|
|||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void video_init ()
|
void video_init ()
|
||||||
{
|
{
|
||||||
videoSetMode(MODE_4_2D);
|
videoSetMode(MODE_4_2D);
|
||||||
@ -348,7 +354,7 @@ void video_init ()
|
|||||||
// http://mtheall.com/vram.html#T2=3&NT2=128&MB2=4&TB2=0&S2=2&T3=5&NT3=32&MB3=8&TB3=1&S3=3
|
// http://mtheall.com/vram.html#T2=3&NT2=128&MB2=4&TB2=0&S2=2&T3=5&NT3=32&MB3=8&TB3=1&S3=3
|
||||||
text_bg = bgInit(2, BgType_Rotation, BgSize_R_512x512, 4, 0);
|
text_bg = bgInit(2, BgType_Rotation, BgSize_R_512x512, 4, 0);
|
||||||
gfx_bg = bgInit(3, BgType_Bmp8, BgSize_B8_512x256, 8, 0);
|
gfx_bg = bgInit(3, BgType_Bmp8, BgSize_B8_512x256, 8, 0);
|
||||||
|
|
||||||
REG_DISPCNT &= ~DISPLAY_WIN0_ON;
|
REG_DISPCNT &= ~DISPLAY_WIN0_ON;
|
||||||
// Setup the window used for mixed mode
|
// Setup the window used for mixed mode
|
||||||
WIN0_X0 = 0;
|
WIN0_X0 = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user