ref: bbdafbb399c4cd8b627ba2bbbead7bd349952069
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];
extern u16int pc, curpc, sp;
u32int irq;
u8int rom[0x40000];
u8int *mem = nil;
int vdpclock = 0;
int psgclock = 0;
static void
loadrom(char *file)
{
int fd;
fd = open(file, OREAD);
if(fd < 0)
sysfatal("open: %r");
if(readn(fd, rom, 0x40000) < 0x40000)
sysfatal("read: %r");
mem = malloc(0xC000+0x8000);
memcpy(mem, rom, 0xC000);
pc = 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(320, 224, 4, XRGB32, 1, nil);
regkey("a", 'c', 1<<4);
regkey("b", 'x', 1<<5);
regkey("start", '\n', 1<<6);
regkey("up", Kup, 0x0);
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;
while(vdpclock < 0){
vdpstep();
vdpclock += 8;
}
}
}
void
flush(void)
{
flushmouse(1);
flushscreen();
flushaudio(audioout);
}