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