1*ccaec48aSDavid du Colombier #include <u.h>
2*ccaec48aSDavid du Colombier #include <libc.h>
3*ccaec48aSDavid du Colombier
4*ccaec48aSDavid du Colombier #include "/386/include/ureg.h"
5*ccaec48aSDavid du Colombier
6*ccaec48aSDavid du Colombier static uchar buf[0xFF01];
7*ccaec48aSDavid du Colombier
8*ccaec48aSDavid du Colombier void
main(int argc,char * argv[])9*ccaec48aSDavid du Colombier main(int argc, char *argv[])
10*ccaec48aSDavid du Colombier {
11*ccaec48aSDavid du Colombier struct Ureg u;
12*ccaec48aSDavid du Colombier int fd, rreg, rmem, len;
13*ccaec48aSDavid du Colombier
14*ccaec48aSDavid du Colombier ARGBEGIN {
15*ccaec48aSDavid du Colombier } ARGEND;
16*ccaec48aSDavid du Colombier
17*ccaec48aSDavid du Colombier if(argc == 0){
18*ccaec48aSDavid du Colombier fprint(2, "usage:\t%s file.com\n", argv0);
19*ccaec48aSDavid du Colombier exits("usage");
20*ccaec48aSDavid du Colombier }
21*ccaec48aSDavid du Colombier if((fd = open(*argv, OREAD)) < 0)
22*ccaec48aSDavid du Colombier sysfatal("open: %r");
23*ccaec48aSDavid du Colombier
24*ccaec48aSDavid du Colombier if((rreg = open("/dev/realmode", OWRITE)) < 0)
25*ccaec48aSDavid du Colombier sysfatal("open realmode: %r");
26*ccaec48aSDavid du Colombier if((rmem = open("/dev/realmodemem", OWRITE)) < 0)
27*ccaec48aSDavid du Colombier sysfatal("open realmodemem: %r");
28*ccaec48aSDavid du Colombier if((len = readn(fd, buf, sizeof buf)) < 2)
29*ccaec48aSDavid du Colombier sysfatal("file too small");
30*ccaec48aSDavid du Colombier
31*ccaec48aSDavid du Colombier memset(&u, 0, sizeof u);
32*ccaec48aSDavid du Colombier u.cs = u.ds = u.es = u.fs = u.gs = 0x1000;
33*ccaec48aSDavid du Colombier u.ss = 0x0000;
34*ccaec48aSDavid du Colombier u.sp = 0xfffe;
35*ccaec48aSDavid du Colombier u.pc = 0x0100;
36*ccaec48aSDavid du Colombier
37*ccaec48aSDavid du Colombier seek(rmem, (u.cs<<4) + u.pc, 0);
38*ccaec48aSDavid du Colombier if(write(rmem, buf, len) != len)
39*ccaec48aSDavid du Colombier sysfatal("write mem: %r");
40*ccaec48aSDavid du Colombier
41*ccaec48aSDavid du Colombier if(write(rreg, &u, sizeof u) != sizeof u)
42*ccaec48aSDavid du Colombier sysfatal("write reg: %r");
43*ccaec48aSDavid du Colombier }
44