ref: a496c0fd7853aa30b7eb21c23d332647e8c44b6f
dir: /sms.c/
#include <u.h>
#include <libc.h>
#include <thread.h>
#include <draw.h>
#include <keyboard.h>
#include "../eui.h"
#include "dat.h"
#include "fns.h"
int t = 0;
u32int r[16];
u32int irq;
u8int *rom = nil;
u8int *mem = nil;
int vdpclock = 0;
int psgclock = 0;
static void
loadrom(char *file)
{
int fd;
long n;
vlong sz;
ulong alloc;
fd = open(file, OREAD);
if(fd < 0)
sysfatal("open: %r");
sz = seek(fd, 0, 2);
if(sz <= 0 || sz > 4*1024*1024)
sysfatal("invalid file size");
seek(fd, 0, 0);
alloc = (sz + 0x3fff) & ~0x3fff;
rom = mallocz(alloc, 1);
if(rom == nil)
sysfatal("mallocz: %r");
n = readn(fd, rom, sz);
if(n < sz)
sysfatal("read: %r");
nbank = alloc / 0x4000;
mem = mallocz(0xC000+0x8000, 1);
if(mem == nil)
sysfatal("mallocz: %r");
mapperinit();
spc = 0;
close(fd);
}
void
usage(void)
{
fprint(2, "usage: %s [-a] [-x scale] rom\n", argv0);
exits("usage");
}
static void
process_inputs(void)
{
u16int v1, v2;
v1 = ~(keys & 0xffff);
v2 = 0; //~(keys2 & 0xffff);
portDC = (v1 & 0x3f) + ((v2 << 6) & 0xc0);
portDD = ((v2 >> 2) & 0x0f) | 0xf0;
}
void
threadmain(int argc, char **argv)
{
int t;
ARGBEGIN{
case 'a':
psginit(RATE, PSGCLOCK);
break;
case 'x':
fixscale = strtol(EARGF(usage()), nil, 0);
break;
default:
usage();
} ARGEND;
if(argc < 1)
usage();
loadrom(*argv);
initemu(256, 224, 4, XRGB32, 1, nil);
regkey("a", 'c', 1<<4);
regkey("b", 'x', 1<<5);
regkey("start", '\n', 1<<6);
regkey("up", Kup, 1<<0);
regkey("down", Kdown, 1<<1);
regkey("left", Kleft, 1<<2);
regkey("right", Kright, 1<<3);
z80reset();
vdpmode();
for(;;){
process_inputs();
t = z80step();
vdpclock -= t * Z80DIV;
psgclock += t * Z80DIV;
while(vdpclock < 0){
vdpstep();
vdpclock += 8;
}
while(psgclock >= SAMPDIV){
audiosample();
psgclock -= SAMPDIV;
}
}
}
void
flush(void)
{
flushmouse(1);
flushscreen();
flushaudio(audioout);
}