mirror of
https://github.com/dschmenk/apple2pi.git
synced 2024-11-28 09:49:27 +00:00
Try for more robust daemon and cool Apple II commands from DOS 3.3
This commit is contained in:
parent
9971e7c348
commit
1a5d470f48
BIN
src/A2PI.PO
BIN
src/A2PI.PO
Binary file not shown.
75
src/a2pid.c
75
src/a2pid.c
@ -21,7 +21,7 @@
|
||||
#define die(str, args...) do { \
|
||||
prlog(str); \
|
||||
exit(-1); \
|
||||
} while(0)
|
||||
} while(0)
|
||||
/*
|
||||
* Apple II request entry
|
||||
*/
|
||||
@ -312,9 +312,12 @@ int keycode[256] = {
|
||||
MOD_SHIFT | KEY_GRAVE, // ~ code 7E
|
||||
KEY_DELETE // DELETE code 7F
|
||||
};
|
||||
#define RUN 0
|
||||
#define STOP 1
|
||||
#define RESET 2
|
||||
int accel[32] = { 0, 1, 4, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
|
||||
-21, -20, -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, -9, -8, -4, -1};
|
||||
volatile int stop = FALSE, isdaemon = FALSE;
|
||||
volatile int state = RUN, isdaemon = FALSE;
|
||||
struct input_event evkey, evrelx, evrely, evsync;
|
||||
|
||||
void sendkeycodedown(int fd, int code)
|
||||
@ -519,6 +522,36 @@ void finreq(int a2fd, int status, int result)
|
||||
a2req->next = a2reqfree;
|
||||
a2reqfree = a2req;
|
||||
}
|
||||
void flushreqs(int a2fd, int status, int result)
|
||||
{
|
||||
char finbuf[2];
|
||||
struct a2request *a2req;
|
||||
while (a2req = a2reqlist)
|
||||
{
|
||||
/*
|
||||
* Send result to socket.
|
||||
*/
|
||||
if (a2req->fd)
|
||||
{
|
||||
if (a2req->type == 0x90) /* read bytes */
|
||||
write(a2req->fd, a2req->buffer, a2req->count);
|
||||
finbuf[0] = status;
|
||||
finbuf[1] = result;
|
||||
write(a2req->fd, finbuf, 2);
|
||||
}
|
||||
if (a2req->buffer)
|
||||
{
|
||||
free(a2req->buffer);
|
||||
a2req->buffer = NULL;
|
||||
}
|
||||
/*
|
||||
* Update lists.
|
||||
*/
|
||||
a2reqlist = a2req->next;
|
||||
a2req->next = a2reqfree;
|
||||
a2reqfree = a2req;
|
||||
}
|
||||
}
|
||||
void main(int argc, char **argv)
|
||||
{
|
||||
struct uinput_user_dev uidev;
|
||||
@ -679,7 +712,7 @@ void main(int argc, char **argv)
|
||||
else
|
||||
{
|
||||
prlog("a2pi: Bad Sync ACK\n");
|
||||
stop = TRUE;
|
||||
state = RESET;
|
||||
}
|
||||
}
|
||||
newtio.c_cc[VMIN] = 3; /* blocking read until 3 chars received */
|
||||
@ -699,6 +732,11 @@ void main(int argc, char **argv)
|
||||
die("error: bind socket");
|
||||
if (listen(srvfd, 1) < 0)
|
||||
die("error: listen socket");
|
||||
/*
|
||||
* Come basck here on RESET.
|
||||
*/
|
||||
reset:
|
||||
state = RUN;
|
||||
reqfd = 0;
|
||||
FD_ZERO(&openset);
|
||||
FD_SET(a2fd, &openset);
|
||||
@ -708,7 +746,7 @@ void main(int argc, char **argv)
|
||||
* Event loop
|
||||
*/
|
||||
prlog("a2pid: Enter event loop\n");
|
||||
while (!stop)
|
||||
while (state == RUN)
|
||||
{
|
||||
memcpy(&readset, &openset, sizeof(openset));
|
||||
if (select(maxfd + 1, &readset, NULL, NULL, NULL) > 0)
|
||||
@ -728,12 +766,13 @@ void main(int argc, char **argv)
|
||||
iopkt[0] = 0x81; /* acknowledge */
|
||||
write(a2fd, iopkt, 1);
|
||||
tcflush(a2fd, TCIFLUSH);
|
||||
flushreqs(a2fd, -1, -1);
|
||||
break;
|
||||
case 0x82: /* keyboard event */
|
||||
// printf("Keyboard Event: 0x%02X:%c\n", iopkt[1], iopkt[2] & 0x7F);
|
||||
sendkey(kbdfd, iopkt[1], iopkt[2]);
|
||||
if (iopkt[2] == 0x9B && iopkt[1] == 0xC0)
|
||||
stop = TRUE;
|
||||
state = STOP;
|
||||
break;
|
||||
case 0x84: /* mouse move event */
|
||||
// printf("Mouse XY Event: %d,%d\n", (signed char)iopkt[1], (signed char)iopkt[2]);
|
||||
@ -760,18 +799,18 @@ void main(int argc, char **argv)
|
||||
a2reqlist->buffer[a2reqlist->xfer++] = iopkt[0];
|
||||
else
|
||||
{
|
||||
stop = TRUE;
|
||||
state = RESET;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
stop = TRUE;
|
||||
state = RESET;
|
||||
newtio.c_cc[VMIN] = 3; /* blocking read until 3 chars received */
|
||||
tcsetattr(a2fd, TCSANOW, &newtio);
|
||||
}
|
||||
else
|
||||
stop = TRUE;
|
||||
state = RESET;
|
||||
break;
|
||||
case 0x92: /* acknowledge write bytes */
|
||||
if (a2reqlist) /* better have an outstanding request */
|
||||
@ -787,15 +826,15 @@ void main(int argc, char **argv)
|
||||
if (write(a2fd, a2reqlist->buffer + a2reqlist->xfer, c) == c)
|
||||
a2reqlist->xfer += c;
|
||||
else
|
||||
stop = TRUE;
|
||||
state = RESET;
|
||||
}
|
||||
else
|
||||
stop = TRUE;
|
||||
state = RESET;
|
||||
newtio.c_cc[VMIN] = 3; /* blocking read until 3 chars received */
|
||||
tcsetattr(a2fd, TCSANOW, &newtio);
|
||||
}
|
||||
else
|
||||
stop = TRUE;
|
||||
state = RESET;
|
||||
break;
|
||||
case 0x94: /* acknowledge call */
|
||||
if (a2reqlist) /* better have an outstanding request */
|
||||
@ -804,12 +843,12 @@ void main(int argc, char **argv)
|
||||
newtio.c_cc[VMIN] = 1; /* blocking read until 1 char received */
|
||||
tcsetattr(a2fd, TCSANOW, &newtio);
|
||||
if (!writeword(a2fd, a2reqlist->addr, 0x95))
|
||||
stop = TRUE;
|
||||
state = RESET;
|
||||
newtio.c_cc[VMIN] = 3; /* blocking read until 3 chars received */
|
||||
tcsetattr(a2fd, TCSANOW, &newtio);
|
||||
}
|
||||
else
|
||||
stop = TRUE;
|
||||
state = RESET;
|
||||
break;
|
||||
case 0x9E: /* request complete ok */
|
||||
case 0x9F: /* request complete error */
|
||||
@ -829,7 +868,7 @@ void main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
else
|
||||
stop = TRUE;
|
||||
state = RESET;
|
||||
break;
|
||||
default:
|
||||
prlog("a2pid: Unknown Event\n");
|
||||
@ -840,7 +879,7 @@ void main(int argc, char **argv)
|
||||
else
|
||||
{
|
||||
prlog("a2pid: error read serial port ????\n");
|
||||
stop = TRUE;
|
||||
state = RESET;
|
||||
}
|
||||
}
|
||||
/*
|
||||
@ -920,19 +959,21 @@ void main(int argc, char **argv)
|
||||
break;
|
||||
default:
|
||||
prlog("a2pid: Unknown Request\n");
|
||||
stop = TRUE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
prlog("a2pid: error read socket ????");
|
||||
stop = TRUE;
|
||||
state = RESET;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
flushreqs(a2fd, -1, -1);
|
||||
if (reqfd > 0)
|
||||
close(reqfd);
|
||||
if (state == RESET)
|
||||
goto reset;
|
||||
shutdown(srvfd, SHUT_RDWR);
|
||||
close(srvfd);
|
||||
tcsetattr(a2fd, TCSANOW, &oldtio);
|
||||
|
@ -41,6 +41,7 @@ int main(int argc, char **argv)
|
||||
if (addr + len > MAXSIZE)
|
||||
len = MAXSIZE - addr;
|
||||
memptr = membuff;
|
||||
printf("Loading");
|
||||
while (len)
|
||||
{
|
||||
printf(".");
|
||||
|
@ -60,7 +60,7 @@ int main(int argc, char **argv)
|
||||
len = 0;
|
||||
}
|
||||
}
|
||||
printf("\nCalling Apple II...");
|
||||
printf("\nRunning...");
|
||||
fflush(stdout);
|
||||
a2call(pifd, entry, &result);
|
||||
a2close(pifd);
|
||||
|
Loading…
Reference in New Issue
Block a user