2025-09-09 15:29:39 +00:00
|
|
|
#include <u.h>
|
|
|
|
#include <libc.h>
|
|
|
|
#include "dat.h"
|
|
|
|
#include "fns.h"
|
|
|
|
|
|
|
|
void
|
|
|
|
usage(void)
|
|
|
|
{
|
2025-09-09 16:00:07 +00:00
|
|
|
fprint(2, "usage: %s [ -t ] [ -s target cycle length ] prog\n", argv0);
|
2025-09-09 15:29:39 +00:00
|
|
|
exits("usage");
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
openprog(char *f)
|
|
|
|
{
|
|
|
|
int fd;
|
|
|
|
long n;
|
|
|
|
Dir *d;
|
|
|
|
usize s;
|
|
|
|
|
|
|
|
fd = open(f, OREAD);
|
|
|
|
if(fd < 0)
|
|
|
|
sysfatal("cannot open program: %r");
|
|
|
|
d = dirfstat(fd);
|
|
|
|
if(d->length > 0xFF00)
|
2025-09-09 15:43:34 +00:00
|
|
|
sysfatal("program too big: cannot be bigger than $ff00");
|
2025-09-09 15:29:39 +00:00
|
|
|
romptr = mem+32768;
|
2025-09-09 15:43:34 +00:00
|
|
|
romptr += 32768 - d->length;
|
|
|
|
s = mem+65536-romptr;
|
2025-09-09 15:29:39 +00:00
|
|
|
free(d);
|
|
|
|
n = read(fd, romptr, s);
|
|
|
|
if(n != s)
|
2025-09-09 15:43:34 +00:00
|
|
|
fprint(2, "tried to read %ulld bytes, got %ld bytes\n", s, n);
|
2025-09-09 15:29:39 +00:00
|
|
|
close(fd);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
main(int argc, char **argv)
|
|
|
|
{
|
|
|
|
int c;
|
|
|
|
vlong t, t2, t3;
|
|
|
|
vlong target;
|
|
|
|
|
2025-09-09 16:00:07 +00:00
|
|
|
trace = 0;
|
2025-09-09 15:29:39 +00:00
|
|
|
target = 1000;
|
2025-09-09 15:43:34 +00:00
|
|
|
mem = malloc(0x10000);
|
|
|
|
if(mem == nil)
|
|
|
|
sysfatal("bad malloc for mem");
|
2025-09-09 15:29:39 +00:00
|
|
|
ARGBEGIN{
|
|
|
|
case 's':
|
|
|
|
target = atoll(EARGF(usage()));
|
|
|
|
break;
|
2025-09-09 16:00:07 +00:00
|
|
|
case 't':
|
|
|
|
trace = 1;
|
|
|
|
break;
|
2025-09-09 15:29:39 +00:00
|
|
|
default:
|
|
|
|
usage();
|
|
|
|
break;
|
|
|
|
}ARGEND
|
2025-09-09 15:43:34 +00:00
|
|
|
if(!argc)
|
|
|
|
usage();
|
2025-09-09 15:29:39 +00:00
|
|
|
openprog(*argv);
|
|
|
|
rP = 0x34;
|
|
|
|
pc = 0xFFFC;
|
|
|
|
pc = fetch16();
|
|
|
|
for(;;){
|
|
|
|
c = step();
|
|
|
|
while(c >= 0){
|
|
|
|
t = nsec();
|
|
|
|
--c;
|
|
|
|
t2 = nsec();
|
|
|
|
t3 = t2-t;
|
|
|
|
while(t3 < target){
|
|
|
|
t2 = nsec();
|
|
|
|
t3 = t2-t;
|
|
|
|
}
|
|
|
|
}
|
2025-09-09 16:00:07 +00:00
|
|
|
out();
|
2025-09-09 15:29:39 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|