1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
#include <u.h>
#include <libc.h>
#include <thread.h>
#include <draw.h>
#include <keyboard.h>
#include "../eui.h"
#include "dat.h"
#include "fns.h"
u8int *rom, *rop;
u16int bnk[8];
int mask = 0xfff;
void
togdifc(void)
{
p0difc ^= 1<<6;
}
void
togbw(void)
{
bwmod ^= 1<<3;
}
static void
loadrom(char *name)
{
int i, sz, fd;
fd = open(name, OREAD);
if(fd < 0)
sysfatal("open: %r");
sz = seek(fd, 0, 2);
switch(sz){
case 0x800: mask = 0x7ff;
case 0x1000: break;
case 0x3000: bnk[6] = 2<<12;
case 0x2000: bnk[5] = 1<<12; break;
case 0x4000: for(i=1; i<4; bnk[i+2] = i<<12, i++); break;
case 0x8000: for(i=1; i<8; bnk[i] = i<<12, i++); break;
default: sysfatal("unsupported ROM size");
}
rom = malloc(sz);
if(rom == nil)
sysfatal("malloc: %r");
rop = rom;
pread(fd, rom, sz, 0);
close(fd);
}
void
usage(void)
{
fprint(2, "usage: %s [-a] [-x scale] rom\n", argv0);
exits("usage");
}
void
threadmain(int argc, char **argv)
{
ARGBEGIN {
case 'a':
initaudio();
break;
case 'x':
fixscale = strtol(EARGF(usage()), nil, 0);
break;
default:
usage();
} ARGEND;
if(argc != 1)
usage();
loadrom(argv[0]);
initemu(PICW, PICH, 4, XRGB32, 1, nil);
regkey("a", ' ', 1<<4);
regkey("start", 'q', 1<<5);
regkey("control", 'w', 1<<6);
regkey("up", Kup, 1<<0);
regkey("down", Kdown, 1<<1);
regkey("left", Kleft, 1<<2);
regkey("right", Kright, 1<<3);
regkeyfn('e', togdifc);
regkeyfn('r', togbw);
pc = memread(0xFFFC) | memread(0xFFFD) << 8;
rP = FLAGI;
for(;;){
if(paused){
qlock(&pauselock);
qunlock(&pauselock);
}
step();
}
}
void
flush(void)
{
flushmouse(1);
flushscreen();
flushaudio(audioout);
}
|