Use the File device load_rom function

This commit is contained in:
Devine Lu Linvega 2023-01-01 14:18:27 -08:00
parent 794ce1bdfd
commit 2fb5f560a7
1 changed files with 36 additions and 57 deletions

View File

@ -82,6 +82,38 @@ console_deo(Uint8 *d, Uint8 port)
} }
} }
static Uint8
emu_dei(Uxn *u, Uint8 addr)
{
Uint8 p = addr & 0x0f, d = addr & 0xf0;
switch(d) {
case 0x20: return screen_dei(&u->dev[d], p);
case 0xa0: return file_dei(0, &u->dev[d], p);
case 0xb0: return file_dei(1, &u->dev[d], p);
case 0xc0: return datetime_dei(&u->dev[d], p);
}
return u->dev[addr];
return 0;
}
static void
emu_deo(Uxn *u, Uint8 addr, Uint8 v)
{
Uint8 p = addr & 0x0f, d = addr & 0xf0;
u->dev[addr] = v;
switch(d) {
case 0x00:
system_deo(u, &u->dev[d], p);
if(p > 0x7 && p < 0xe)
screen_palette(&uxn_screen, &u->dev[0x8]);
break;
case 0x10: console_deo(&u->dev[d], p); break;
case 0x20: screen_deo(u->ram, &u->dev[d], p); break;
case 0xa0: file_deo(0, u->ram, &u->dev[d], p); break;
case 0xb0: file_deo(1, u->ram, &u->dev[d], p); break;
}
}
#pragma mark - Generics #pragma mark - Generics
static void static void
@ -127,7 +159,7 @@ set_window_size(SDL_Window *window, int w, int h)
SDL_SetWindowSize(window, w, h); SDL_SetWindowSize(window, w, h);
} }
int static int
set_size(void) set_size(void)
{ {
gRect.x = PAD; gRect.x = PAD;
@ -195,45 +227,6 @@ init(void)
#pragma mark - Devices #pragma mark - Devices
static Uint8
emu_dei(Uxn *u, Uint8 addr)
{
Uint8 p = addr & 0x0f, d = addr & 0xf0;
switch(d) {
case 0x20: return screen_dei(&u->dev[d], p);
case 0xa0: return file_dei(0, &u->dev[d], p);
case 0xb0: return file_dei(1, &u->dev[d], p);
case 0xc0: return datetime_dei(&u->dev[d], p);
}
return u->dev[addr];
return 0;
}
static void
emu_deo(Uxn *u, Uint8 addr, Uint8 v)
{
Uint8 p = addr & 0x0f, d = addr & 0xf0;
u->dev[addr] = v;
switch(d) {
case 0x00:
system_deo(u, &u->dev[d], p);
if(p > 0x7 && p < 0xe)
screen_palette(&uxn_screen, &u->dev[0x8]);
break;
case 0x10: console_deo(&u->dev[d], p); break;
case 0x20: screen_deo(u->ram, &u->dev[d], p); break;
case 0xa0: file_deo(0, u->ram, &u->dev[d], p); break;
case 0xb0: file_deo(1, u->ram, &u->dev[d], p); break;
}
}
void
system_deo_special(Device *d, Uint8 port)
{
if(port > 0x7 && port < 0xe)
screen_palette(&uxn_screen, &d->dat[0x8]);
}
static Uint8 static Uint8
audio_dei(Device *d, Uint8 port) audio_dei(Device *d, Uint8 port)
{ {
@ -261,32 +254,18 @@ audio_deo(Device *d, Uint8 port)
/* Boot */ /* Boot */
static int
load(Uxn *u, char *rom)
{
SDL_RWops *f;
int r;
if(!(f = SDL_RWFromFile(rom, "rb"))) return 0;
r = f->read(f, u->ram + PAGE_PROGRAM, 1, 0x10000 - PAGE_PROGRAM);
f->close(f);
if(r < 1) return 0;
fprintf(stderr, "Loaded %s\n", rom);
fflush(stderr);
SDL_SetWindowTitle(gWindow, rom);
return 1;
}
static int static int
start(Uxn *u, char *rom) start(Uxn *u, char *rom)
{ {
free(u->ram); free(u->ram);
if(!uxn_boot(u, (Uint8 *)calloc(0x10300, sizeof(Uint8)), emu_dei, emu_deo)) if(!uxn_boot(u, (Uint8 *)calloc(0x10300, sizeof(Uint8)), emu_dei, emu_deo))
return error("Boot", "Failed to start uxn."); return error("Boot", "Failed to start uxn.");
if(!load(u, rom)) if(!load_rom(u, rom))
return error("Boot", "Failed to load rom."); return error("Boot", "Failed to load rom.");
exec_deadline = SDL_GetPerformanceCounter() + deadline_interval; exec_deadline = SDL_GetPerformanceCounter() + deadline_interval;
if(!uxn_eval(u, PAGE_PROGRAM)) if(!uxn_eval(u, PAGE_PROGRAM))
return error("Boot", "Failed to start rom."); return error("Boot", "Failed to eval rom.");
SDL_SetWindowTitle(gWindow, rom);
return 1; return 1;
} }