shithub: sms

ref: a496c0fd7853aa30b7eb21c23d332647e8c44b6f
dir: /sms.c/

View raw version
#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);
}