From 174d46c6edc7c01fd4fb61b4d5b7202844442a9d Mon Sep 17 00:00:00 2001 From: dschmenk Date: Sat, 10 Aug 2013 13:37:44 -0700 Subject: [PATCH] remove extarneous code --- src/._A2PI.PO | Bin 0 -> 4096 bytes src/a2mon | Bin 0 -> 9780 bytes src/a2pid | Bin 0 -> 19218 bytes src/a2pid.c | 3 - src/a2pid.c~ | 948 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/a2serclk | Bin 0 -> 6236 bytes src/bintomon | Bin 0 -> 6360 bytes src/dskread | Bin 0 -> 9042 bytes src/dskwrite | Bin 0 -> 9069 bytes 9 files changed, 948 insertions(+), 3 deletions(-) create mode 100755 src/._A2PI.PO create mode 100755 src/a2mon create mode 100755 src/a2pid create mode 100755 src/a2pid.c~ create mode 100755 src/a2serclk create mode 100755 src/bintomon create mode 100755 src/dskread create mode 100755 src/dskwrite diff --git a/src/._A2PI.PO b/src/._A2PI.PO new file mode 100755 index 0000000000000000000000000000000000000000..c2ce480bd148268936200077db1cffd3a9cd0f90 GIT binary patch literal 4096 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIgo;|%-Cq47!KeV z5)!oTxIi;R2SWu8WuwBQAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3^7)ev9= zng+sPAQzI6S*%c$TAW{6l$@%NmS2>ukeOGKnpcvUpO=`EQ>l=XnpUEal#`g34eaSc Sbq#3>)&Fp>$S}zL{|^B1HXnrm literal 0 HcmV?d00001 diff --git a/src/a2mon b/src/a2mon new file mode 100755 index 0000000000000000000000000000000000000000..7f9df820c2041d5244c9a771adaaed8898998482 GIT binary patch literal 9780 zcmb_i4{%h+dEciyfh@^zfJg*VofijZ$k;j#p^`SHsXzh?Bk%=e4@sCFPr4^`;dFPs zd%_~6i7=Qri5##|5>HI5%S2&Z*VDm`Gs!sE!^D}?`|bDb+kNjozqxyhWm!U}DzRD+1&;~QhBEX%A*zI^ zZWFes0qp~#ne?q(fiP4gPM>nBM?qCY@t2N5LOGta2wXv!;Eb~iwU@6A02SL$ff)CyPj}|6P_6G(y5%txY=wvEBex@l-uWt%#hbN;ADl< zo6dS7=fx8#kx02-ECX(l$tF@>zv$oRdO4AGow&#i40-YNy(!U`Oy^t-%(47|2OV_2 zH=FQWaYy&oO&zh;Fr%J+^6q~Yypw*y%+!!bz=f;C!wQNAVB6(bblSK9&f10YeQ>UB zmTgeD^_ z5pYLYBFJjmTVCrF;@34J&t3`^T1vsfcxh4Lc%kNv=So+<0;PX)e5&Tf(W$G~&X#oj zcSilPQNL)^Uoq+zjQUTF`j3tJS)=~6QGe2?PZ;%6Mt#hvj~ex(te?pjMIm1dhQ4|6 zMms+lv@u7~QVN|LF9pxFl{Zfo_TP}erfxZE$T{DB44yZ`QidQUpxohYS2~_X_B(wB2NUZ z@zQtDE+T~@;&i$>vTaI$SJ+2N!N`&8s#itw#j|U-O`e6W$EB?NjBq#;wbvEy+$;ZPWk%0ANm+PE92n#tj}}O=Ybnao!Kt{`61}8 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 literal 0 HcmV?d00001 diff --git a/src/a2pid b/src/a2pid new file mode 100755 index 0000000000000000000000000000000000000000..3d891150f7d0a50f1703e1756f71ef60e8439bcc GIT binary patch literal 19218 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 S_2JrzzN+F^PkvOzul&Cdvz`I~ literal 0 HcmV?d00001 diff --git a/src/a2pid.c b/src/a2pid.c index 3590332..61f2364 100755 --- a/src/a2pid.c +++ b/src/a2pid.c @@ -848,9 +848,6 @@ void main(int argc, char **argv) */ if (FD_ISSET(srvfd, &readset)) { - int len; - struct sockaddr inaddr; - len = sizeof(inaddr); reqfd = accept(srvfd, NULL, NULL); if (reqfd > 0) FD_SET(reqfd, &openset); diff --git a/src/a2pid.c~ b/src/a2pid.c~ new file mode 100755 index 0000000..3590332 --- /dev/null +++ b/src/a2pid.c~ @@ -0,0 +1,948 @@ +/* + * Copyright 2013, David Schmenk + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define BAUDRATE B115200 +#define _POSIX_SOURCE 1 /* POSIX compliant source */ +#define FALSE 0 +#define TRUE 1 +#define die(str, args...) do { \ + prlog(str); \ + exit(-1); \ + } while(0) +/* + * Apple II request entry + */ +#define MAX_XFER 32 + +struct a2request { + int fd; + int type; + int addr; + int count; + int xfer; + char *buffer; + struct a2request *next; +} *a2reqlist = NULL, *a2reqfree = NULL; + +/* + * ASCII to scancode conversion + */ +#define MOD_FN 0x80 +#define MOD_CTRL 0x8000 +#define MOD_ALT 0x4000 +#define MOD_SHIFT 0x2000 +#define KEY_CODE 0x03FF +#define KEY_PRESS 0x80 +#define KEY_ASCII 0x7F + +int keycode[256] = { + /* + * normal scancode + */ + MOD_CTRL | MOD_SHIFT | KEY_2, // CTRL-@ code 00 + MOD_CTRL | KEY_A, // CTRL-A code 01 + MOD_CTRL | KEY_B, // CTRL-B code 02 + MOD_CTRL | KEY_C, // CTRL-C code 03 + MOD_CTRL | KEY_D, // CTRL-D code 04 + MOD_CTRL | KEY_E, // CTRL-E code 05 + MOD_CTRL | KEY_F, // CTRL-F code 06 + MOD_CTRL | KEY_G, // CTRL-G code 07 + KEY_LEFT, // CTRL-H code 08 + KEY_TAB, // CTRL-I code 09 + KEY_DOWN, // CTRL-J code 0A + KEY_UP, // CTRL-K code 0B + MOD_CTRL | KEY_L, // CTRL-L code 0C + KEY_ENTER, // CTRL-M code 0D + MOD_CTRL | KEY_N, // CTRL-N code 0E + MOD_CTRL | KEY_O, // CTRL-O code 0F + MOD_CTRL | KEY_P, // CTRL-P code 10 + MOD_CTRL | KEY_Q, // CTRL-Q code 11 + MOD_CTRL | KEY_R, // CTRL-R code 12 + MOD_CTRL | KEY_S, // CTRL-S code 13 + MOD_CTRL | KEY_T, // CTRL-T code 14 + KEY_RIGHT, // CTRL-U code 15 + MOD_CTRL | KEY_V, // CTRL-V code 16 + MOD_CTRL | KEY_W, // CTRL-W code 17 + MOD_CTRL | KEY_X, // CTRL-X code 18 + MOD_CTRL | KEY_Y, // CTRL-Y code 19 + MOD_CTRL | KEY_Z, // CTRL-Z code 1A + KEY_ESC, // ESCAPE code 1B + MOD_CTRL | KEY_BACKSLASH, // CTRL-\ code 1C + MOD_CTRL | KEY_RIGHTBRACE, // CTRL-] code 1D + MOD_CTRL | KEY_6, // CTRL-6 code 1E + MOD_CTRL | KEY_MINUS, // CTRL-- code 1F + KEY_SPACE, // ' ' code 20 + MOD_SHIFT | KEY_1, // ! code 21 + MOD_SHIFT | KEY_APOSTROPHE, // " code 22 + MOD_SHIFT | KEY_3, // # code 23 + MOD_SHIFT | KEY_4, // $ code 24 + MOD_SHIFT | KEY_5, // % code 25 + MOD_SHIFT | KEY_7, // & code 26 + KEY_APOSTROPHE, // ' code 27 + MOD_SHIFT | KEY_9, // ( code 28 + MOD_SHIFT | KEY_0, // ) code 29 + MOD_SHIFT | KEY_8, // * code 2A + MOD_SHIFT | KEY_EQUAL, // + code 2B + KEY_COMMA, // , code 2C + KEY_MINUS, // - code 2D + KEY_DOT, // . code 2E + KEY_SLASH, // / code 2F + KEY_0, // 0 code 30 + KEY_1, // 1 code 31 + KEY_2, // 2 code 32 + KEY_3, // 3 code 33 + KEY_4, // 4 code 34 + KEY_5, // 5 code 35 + KEY_6, // 6 code 36 + KEY_7, // 7 code 37 + KEY_8, // 8 code 38 + KEY_9, // 9 code 39 + MOD_SHIFT | KEY_SEMICOLON, // : code 3A + KEY_SEMICOLON, // ; code 3B + MOD_SHIFT | KEY_COMMA, // < code 3C + KEY_EQUAL, // = code 3D + MOD_SHIFT | KEY_DOT, // > code 3E + MOD_SHIFT | KEY_SLASH, // ? code 3F + MOD_SHIFT | KEY_2, // @ code 40 + MOD_SHIFT | KEY_A, // A code 41 + MOD_SHIFT | KEY_B, // B code 42 + MOD_SHIFT | KEY_C, // C code 43 + MOD_SHIFT | KEY_D, // D code 44 + MOD_SHIFT | KEY_E, // E code 45 + MOD_SHIFT | KEY_F, // F code 46 + MOD_SHIFT | KEY_G, // G code 47 + MOD_SHIFT | KEY_H, // H code 48 + MOD_SHIFT | KEY_I, // I code 49 + MOD_SHIFT | KEY_J, // J code 4A + MOD_SHIFT | KEY_K, // K code 4B + MOD_SHIFT | KEY_L, // L code 4C + MOD_SHIFT | KEY_M, // M code 4D + MOD_SHIFT | KEY_N, // N code 4E + MOD_SHIFT | KEY_O, // O code 4F + MOD_SHIFT | KEY_P, // P code 50 + MOD_SHIFT | KEY_Q, // Q code 51 + MOD_SHIFT | KEY_R, // R code 52 + MOD_SHIFT | KEY_S, // S code 53 + MOD_SHIFT | KEY_T, // T code 54 + MOD_SHIFT | KEY_U, // U code 55 + MOD_SHIFT | KEY_V, // V code 56 + MOD_SHIFT | KEY_W, // W code 57 + MOD_SHIFT | KEY_X, // X code 58 + MOD_SHIFT | KEY_Y, // Y code 59 + MOD_SHIFT | KEY_Z, // Z code 5A + KEY_LEFTBRACE, // [ code 5B + KEY_BACKSLASH, // \ code 5C + KEY_RIGHTBRACE, // ] code 5D + MOD_SHIFT | KEY_6, // ^ code 5E + MOD_SHIFT | KEY_MINUS, // _ code 5F + KEY_GRAVE, // ` code 60 + KEY_A, // a code 61 + KEY_B, // b code 62 + KEY_C, // c code 63 + KEY_D, // d code 64 + KEY_E, // e code 65 + KEY_F, // f code 66 + KEY_G, // g code 67 + KEY_H, // h code 68 + KEY_I, // i code 69 + KEY_J, // j code 6A + KEY_K, // k code 6B + KEY_L, // l code 6C + KEY_M, // m code 6D + KEY_N, // n code 6E + KEY_O, // o code 6F + KEY_P, // p code 70 + KEY_Q, // q code 71 + KEY_R, // r code 72 + KEY_S, // s code 73 + KEY_T, // t code 74 + KEY_U, // u code 75 + KEY_V, // v code 76 + KEY_W, // w code 77 + KEY_X, // x code 78 + KEY_Y, // y code 79 + KEY_Z, // z code 7A + MOD_SHIFT | KEY_LEFTBRACE, // { code 7B + MOD_SHIFT | KEY_BACKSLASH, // | code 7C + MOD_SHIFT | KEY_RIGHTBRACE, // } code 7D + MOD_SHIFT | KEY_GRAVE, // ~ code 7E + KEY_BACKSPACE, // BS code 7F + /* + * w/ closed apple scancodes + */ + MOD_CTRL | MOD_SHIFT | KEY_2, // CTRL-@ code 00 + MOD_CTRL | KEY_A, // CTRL-A code 01 + MOD_CTRL | KEY_B, // CTRL-B code 02 + MOD_CTRL | KEY_C, // CTRL-C code 03 + MOD_CTRL | KEY_D, // CTRL-D code 04 + MOD_CTRL | KEY_E, // CTRL-E code 05 + MOD_CTRL | KEY_F, // CTRL-F code 06 + MOD_CTRL | KEY_G, // CTRL-G code 07 + KEY_HOME, // CTRL-H code 08 + KEY_INSERT, // CTRL-I code 09 + KEY_PAGEDOWN, // CTRL-J code 0A + KEY_PAGEUP, // CTRL-K code 0B + MOD_CTRL | KEY_L, // CTRL-L code 0C + KEY_LINEFEED, // CTRL-M code 0D + MOD_CTRL | KEY_N, // CTRL-N code 0E + MOD_CTRL | KEY_O, // CTRL-O code 0F + MOD_CTRL | KEY_P, // CTRL-P code 10 + MOD_CTRL | KEY_Q, // CTRL-Q code 11 + MOD_CTRL | KEY_R, // CTRL-R code 12 + MOD_CTRL | KEY_S, // CTRL-S code 13 + MOD_CTRL | KEY_T, // CTRL-T code 14 + KEY_END, // CTRL-U code 15 + MOD_CTRL | KEY_V, // CTRL-V code 16 + MOD_CTRL | KEY_W, // CTRL-W code 17 + MOD_CTRL | KEY_X, // CTRL-X code 18 + MOD_CTRL | KEY_Y, // CTRL-Y code 19 + MOD_CTRL | KEY_Z, // CTRL-Z code 1A + KEY_ESC, // ESCAPE code 1B + MOD_CTRL | KEY_BACKSLASH, // CTRL-\ code 1C + MOD_CTRL | KEY_RIGHTBRACE, // CTRL-] code 1D + MOD_CTRL | KEY_6, // CTRL-6 code 1E + MOD_CTRL | KEY_MINUS, // CTRL-- code 1F + KEY_SPACE, // ' ' code 20 + KEY_F11, // ! code 21 + MOD_SHIFT | KEY_APOSTROPHE, // " code 22 + KEY_F13, // # code 23 + KEY_F14, // $ code 24 + KEY_F15, // % code 25 + KEY_F17, // & code 26 + KEY_APOSTROPHE, // ' code 27 + KEY_F19, // ( code 28 + KEY_F20, // ) code 29 + KEY_F18, // * code 2A + MOD_SHIFT | KEY_EQUAL, // + code 2B + KEY_COMMA, // , code 2C + KEY_MINUS, // - code 2D + KEY_DOT, // . code 2E + KEY_SLASH, // / code 2F + KEY_F10, // 0 code 30 + KEY_F1, // 1 code 31 + KEY_F2, // 2 code 32 + KEY_F3, // 3 code 33 + KEY_F4, // 4 code 34 + KEY_F5, // 5 code 35 + KEY_F6, // 6 code 36 + KEY_F7, // 7 code 37 + KEY_F8, // 8 code 38 + KEY_F9, // 9 code 39 + MOD_SHIFT | KEY_SEMICOLON, // : code 3A + KEY_SEMICOLON, // ; code 3B + MOD_SHIFT | KEY_COMMA, // < code 3C + KEY_EQUAL, // = code 3D + MOD_SHIFT | KEY_DOT, // > code 3E + MOD_SHIFT | KEY_SLASH, // ? code 3F + KEY_F12, // @ code 40 + MOD_SHIFT | KEY_A, // A code 41 + MOD_SHIFT | KEY_B, // B code 42 + MOD_SHIFT | KEY_C, // C code 43 + MOD_SHIFT | KEY_D, // D code 44 + MOD_SHIFT | KEY_E, // E code 45 + MOD_SHIFT | KEY_F, // F code 46 + MOD_SHIFT | KEY_G, // G code 47 + MOD_SHIFT | KEY_H, // H code 48 + MOD_SHIFT | KEY_I, // I code 49 + MOD_SHIFT | KEY_J, // J code 4A + MOD_SHIFT | KEY_K, // K code 4B + MOD_SHIFT | KEY_L, // L code 4C + MOD_SHIFT | KEY_M, // M code 4D + MOD_SHIFT | KEY_N, // N code 4E + MOD_SHIFT | KEY_O, // O code 4F + MOD_SHIFT | KEY_P, // P code 50 + MOD_SHIFT | KEY_Q, // Q code 51 + MOD_SHIFT | KEY_R, // R code 52 + MOD_SHIFT | KEY_S, // S code 53 + MOD_SHIFT | KEY_T, // T code 54 + MOD_SHIFT | KEY_U, // U code 55 + MOD_SHIFT | KEY_V, // V code 56 + MOD_SHIFT | KEY_W, // W code 57 + MOD_SHIFT | KEY_X, // X code 58 + MOD_SHIFT | KEY_Y, // Y code 59 + MOD_SHIFT | KEY_Z, // Z code 5A + KEY_LEFTBRACE, // [ code 5B + KEY_BACKSLASH, // \ code 5C + KEY_RIGHTBRACE, // ] code 5D + KEY_F16, // ^ code 5E + MOD_SHIFT | KEY_MINUS, // _ code 5F + KEY_GRAVE, // ` code 60 + KEY_A, // a code 61 + KEY_B, // b code 62 + KEY_C, // c code 63 + KEY_D, // d code 64 + KEY_E, // e code 65 + KEY_F, // f code 66 + KEY_G, // g code 67 + KEY_H, // h code 68 + KEY_I, // i code 69 + KEY_J, // j code 6A + KEY_K, // k code 6B + KEY_L, // l code 6C + KEY_M, // m code 6D + KEY_N, // n code 6E + KEY_O, // o code 6F + KEY_P, // p code 70 + KEY_Q, // q code 71 + KEY_R, // r code 72 + KEY_S, // s code 73 + KEY_T, // t code 74 + KEY_U, // u code 75 + KEY_V, // v code 76 + KEY_W, // w code 77 + KEY_X, // x code 78 + KEY_Y, // y code 79 + KEY_Z, // z code 7A + MOD_SHIFT | KEY_LEFTBRACE, // { code 7B + MOD_SHIFT | KEY_BACKSLASH, // | code 7C + MOD_SHIFT | KEY_RIGHTBRACE, // } code 7D + MOD_SHIFT | KEY_GRAVE, // ~ code 7E + KEY_DELETE // DELETE code 7F +}; +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; +struct input_event evkey, evrelx, evrely, evsync; + +void sendkeycodedown(int fd, int code) +{ + /* + * press keys + */ + evkey.value = 1; + if (code & MOD_ALT) + { + evkey.code = KEY_LEFTALT; + write(fd, &evkey, sizeof(evkey)); + } + if (code & MOD_CTRL) + { + evkey.code = KEY_LEFTCTRL; + write(fd, &evkey, sizeof(evkey)); + } + if (code & MOD_SHIFT) + { + evkey.code = KEY_LEFTSHIFT; + write(fd, &evkey, sizeof(evkey)); + } + evkey.code = code & KEY_CODE; + write(fd, &evkey, sizeof(evkey)); + write(fd, &evsync, sizeof(evsync)); +} +void sendkeycodeup(int fd, int code) +{ + /* + * release keys + */ + evkey.code = code & KEY_CODE; + evkey.value = 0; + write(fd, &evkey, sizeof(evkey)); + if (code & MOD_SHIFT) + { + evkey.code = KEY_LEFTSHIFT; + write(fd, &evkey, sizeof(evkey)); + } + if (code & MOD_CTRL) + { + evkey.code = KEY_LEFTCTRL; + write(fd, &evkey, sizeof(evkey)); + } + if (code & MOD_ALT) + { + evkey.code = KEY_LEFTALT; + write(fd, &evkey, sizeof(evkey)); + } + write(fd, &evsync, sizeof(evsync)); +} +void sendkey(int fd, int mod, int key) +{ + static int prevcode = -1; + int code = keycode[(mod & MOD_FN) | (key & KEY_ASCII)] + | ((mod << 8) & MOD_ALT); + + if (prevcode >= 0) + { + sendkeycodeup(fd, prevcode); + if (!(key & KEY_PRESS) && ((code & KEY_CODE) != (prevcode & KEY_CODE))) + /* + * missed a key down event + * synthesize one + */ + sendkeycodedown(fd, code); + (key & KEY_PRESS) ? sendkeycodedown(fd, code) : sendkeycodeup(fd, code); + } + else + { + sendkeycodedown(fd, code); + if (!(key & KEY_PRESS)) + /* + * missed a key down event + * already synthesized one + */ + sendkeycodeup(fd, code); + } + prevcode = (key & KEY_PRESS) ? code : -1; +} +void sendbttn(int fd, int mod, int bttn) +{ + static int lastbtn = 0; + + if (bttn) + { + lastbtn = + evkey.code = (mod == 0) ? BTN_LEFT + : (mod & 0x40) ? BTN_RIGHT + : BTN_MIDDLE; + evkey.value = 1; + } + else + { + evkey.code = lastbtn; + evkey.value = 0; + } + write(fd, &evkey, sizeof(evkey)); + write(fd, &evsync, sizeof(evsync)); +} +void sendrelxy(int fd, int x, int y) +{ + if (x > 4 || x < -4) x = x *4; + else x = accel[x & 0x1F]; + if (y > 4 || y < -4) y = y * 4; + else y = accel[y & 0x1F]; + evrelx.value = x; + evrely.value = y; + write(fd, &evrelx, sizeof(evrelx)); + write(fd, &evrely, sizeof(evrely)); + write(fd, &evsync, sizeof(evsync)); +} +int writeword(int fd, int word, char ack) +{ + char rwchar; + + rwchar = word; /* send low byte of word */ + write(fd, &rwchar, 1); + if ((read(fd, &rwchar, 1) == 1) && (rwchar == ack)) /* receive ack */ + { + rwchar = word >> 8; /* send high byte of word */ + write(fd, &rwchar, 1); + if ((read(fd, &rwchar, 1) == 1) && (rwchar == ack)) /* receive ack */ + return TRUE; + } + return FALSE; +} +void prlog(char *str) +{ + if (!isdaemon) + puts(str); +} +struct a2request *addreq(int a2fd, int reqfd, int type, int addr, int count, char *buffer) +{ + char rwchar; + struct a2request *a2req = a2reqfree; + if (a2req == NULL) + a2req = malloc(sizeof(struct a2request)); + else + a2reqfree = a2reqfree->next; + a2req->fd = reqfd; + a2req->type = type; + a2req->addr = addr; + a2req->count = count; + a2req->xfer = 0; + a2req->buffer = buffer; + a2req->next = NULL; + if (a2reqlist == NULL) + { + /* + * Initiate request. + */ + a2reqlist = a2req; + rwchar = a2req->type; + write(a2fd, &rwchar, 1); + } + else + { + /* + * Add to end of request list. + */ + struct a2request *a2reqnext = a2reqlist; + while (a2reqnext->next != NULL) + a2reqnext = a2reqnext->next; + a2reqnext->next = a2req; + } + return a2req; +} +void finreq(int a2fd, int status, int result) +{ + char finbuf[2]; + struct a2request *a2req = a2reqlist; + if (a2req->next) + { + /* + * Initiate next request. + */ + finbuf[0] = a2req->next->type; + write(a2fd, finbuf, 1); + } + /* + * 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; + struct termios oldtio,newtio; + unsigned char iopkt[16]; + int i, c, lastbtn; + int a2fd, kbdfd, moufd, srvfd, reqfd, maxfd; + struct sockaddr_in servaddr; + fd_set readset, openset; + char *devtty = "/dev/ttyAMA0"; /* default for Raspberry Pi */ + + /* + * Parse arguments + */ + if (argc > 1) + { + /* + * Are we running as a daemon? + */ + if (strcmp(argv[1], "--daemon") == 0) + { + if (daemon(0, 0) != 0) + die("a2pid: daemon() failure"); + isdaemon = TRUE; + /* + * Another argument must be tty device + */ + if (argc > 2) + devtty = argv[2]; + } + else + /* + * Must be tty device + */ + devtty = argv[1]; + } + /* + * Create keyboard input device + */ + prlog("a2pid: Create keyboard input device\n"); + kbdfd = open("/dev/uinput", O_WRONLY | O_NONBLOCK); + if (kbdfd < 0) + die("error: uinput open"); + if (ioctl(kbdfd, UI_SET_EVBIT, EV_KEY) < 0) + die("error: uinput ioctl EV_KEY"); + if (ioctl(kbdfd, UI_SET_EVBIT, EV_REP) < 0) + die("error: uinput ioctl EV_REP"); + for (i = KEY_ESC; i <= KEY_F10; i++) + if (ioctl(kbdfd, UI_SET_KEYBIT, i) < 0) + die("error: uinput ioctl SET_KEYBITs"); + for (i = KEY_HOME; i <= KEY_DELETE; i++) + if (ioctl(kbdfd, UI_SET_KEYBIT, i) < 0) + die("error: uinput ioctl SET_KEYBITs"); + if (ioctl(kbdfd, UI_SET_EVBIT, EV_SYN) < 0) + die("error: ioctl EV_SYN"); + bzero(&uidev, sizeof(uidev)); + snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "Apple2 Pi Keyboard"); + uidev.id.bustype = BUS_RS232; + uidev.id.vendor = 0x05ac; /* apple */ + uidev.id.product = 0x2e; + uidev.id.version = 1; + write(kbdfd, &uidev, sizeof(uidev)); + if (ioctl(kbdfd, UI_DEV_CREATE) < 0) + die("error: ioctl DEV_CREATE"); + /* + * Set repeat delay values that make sense. + */ + bzero(&evkey, sizeof(evkey)); + evkey.type = EV_REP; + evkey.code = REP_DELAY; + evkey.value = 500; /* 0.5 sec delay */ + if (write(kbdfd, &evkey, sizeof(evkey)) < 0) + die("error: REP_DELAY"); + evkey.type = EV_REP; + evkey.code = REP_PERIOD; + evkey.value = 67; /* 15 reps/sec */ + if (write(kbdfd, &evkey, sizeof(evkey)) < 0) + die("error: REP_PERIOD"); + /* + * Create mouse input device + */ + prlog("a2pid: Create mouse input device\n"); + moufd = open("/dev/uinput", O_WRONLY | O_NONBLOCK); + if (moufd < 0) + die("error: uinput open"); + if (ioctl(moufd, UI_SET_EVBIT, EV_KEY) < 0) + die("error: uinput ioctl EV_KEY"); + if (ioctl(moufd, UI_SET_KEYBIT, BTN_LEFT) < 0) + die("error: uinput ioctl BTN_LEFT"); + if (ioctl(moufd, UI_SET_KEYBIT, BTN_RIGHT) < 0) + die("error: uinput ioctl BTN_RIGHT"); + if (ioctl(moufd, UI_SET_KEYBIT, BTN_MIDDLE) < 0) + die("error: uinput ioctl BTN_MIDDLE"); + if (ioctl(moufd, UI_SET_EVBIT, EV_REL) < 0) + die("error: ioctl EV_REL"); + if (ioctl(moufd, UI_SET_RELBIT, REL_X) < 0) + die("error: ioctl REL_X"); + if (ioctl(moufd, UI_SET_RELBIT, REL_Y) < 0) + die("error: ioctl REL_Y"); + if (ioctl(moufd, UI_SET_EVBIT, EV_SYN) < 0) + die("error: ioctl EV_SYN"); + bzero(&uidev, sizeof(uidev)); + snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "Apple2 Pi Mouse"); + uidev.id.bustype = BUS_RS232; + uidev.id.vendor = 0x05ac; /* apple */ + uidev.id.product = 0x2e; + uidev.id.version = 1; + write(moufd, &uidev, sizeof(uidev)); + if (ioctl(moufd, UI_DEV_CREATE) < 0) + die("error: ioctl DEV_CREATE"); + /* + * Initialize event structures. + */ + bzero(&evkey, sizeof(evkey)); + bzero(&evsync, sizeof(evsync)); + bzero(&evrelx, sizeof(evrelx)); + bzero(&evrely, sizeof(evrely)); + evkey.type = EV_KEY; + evrelx.type = EV_REL; + evrelx.code = REL_X; + evrely.type = EV_REL; + evrely.code = REL_Y; + evsync.type = EV_SYN; + /* + * Open serial port. + */ + prlog("a2pid: Open serial port\n"); + a2fd = open(devtty, O_RDWR | O_NOCTTY); + if (a2fd < 0) + die("error: serial port open"); + tcflush(a2fd, TCIFLUSH); + tcgetattr(a2fd, &oldtio); /* save current port settings */ + bzero(&newtio, sizeof(newtio)); + newtio.c_cflag = BAUDRATE /*| CRTSCTS*/ | CS8 | CLOCAL | CREAD; + newtio.c_iflag = IGNPAR; + newtio.c_oflag = 0; + newtio.c_lflag = 0; /* set input mode (non-canonical, no echo,...) */ + newtio.c_cc[VTIME] = 0; /* inter-character timer unused */ + newtio.c_cc[VMIN] = 1; /* blocking read until 1 char received */ + tcsetattr(a2fd, TCSANOW, &newtio); + prlog("a2pid: Waiting...\n"); + iopkt[0] = 0x80; /* request re-sync if Apple II already running */ + write(a2fd, iopkt, 1); + if (read(a2fd, iopkt, 1) == 1) + { + if (iopkt[0] == 0x80) /* receive sync */ + { + prlog("a2pid: Connected.\n"); + iopkt[0] = 0x81; /* acknowledge */ + write(a2fd, iopkt, 1); + tcflush(a2fd, TCIFLUSH); + } + else if (iopkt[0] == 0x9F) /* bad request from Apple II */ + { + prlog("a2pi: Bad Connect Request.\n"); + tcflush(a2fd, TCIFLUSH); + } + else + { + prlog("a2pi: Bad Sync ACK\n"); + stop = TRUE; + } + } + newtio.c_cc[VMIN] = 3; /* blocking read until 3 chars received */ + tcsetattr(a2fd, TCSANOW, &newtio); + /* + * Open socket. + */ + prlog("a2pid: Open server socket\n"); + bzero(&servaddr, sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_port = htons(6502); + servaddr.sin_addr.s_addr = htonl(INADDR_ANY); + srvfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); + if (srvfd < 0) + die("error: socket create"); + if (bind(srvfd,(struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) + die("error: bind socket"); + if (listen(srvfd, 1) < 0) + die("error: listen socket"); + reqfd = 0; + FD_ZERO(&openset); + FD_SET(a2fd, &openset); + FD_SET(srvfd, &openset); + maxfd = a2fd > srvfd ? a2fd : srvfd; + /* + * Event loop + */ + prlog("a2pid: Enter event loop\n"); + while (!stop) + { + memcpy(&readset, &openset, sizeof(openset)); + if (select(maxfd + 1, &readset, NULL, NULL, NULL) > 0) + { + /* + * Serial port to Apple II transaction. + */ + if (FD_ISSET(a2fd, &readset)) + { + if (read(a2fd, iopkt, 3) == 3) + { + // printf("a2pi: Event [0x%02X] [0x%02X] [0x%02X]\n", iopkt[0], iopkt[1], iopkt[2]); + switch (iopkt[0]) + { + case 0x80: /* sync */ + prlog("a2pid: Re-Connected.\n"); + iopkt[0] = 0x81; /* acknowledge */ + write(a2fd, iopkt, 1); + tcflush(a2fd, TCIFLUSH); + 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; + break; + case 0x84: /* mouse move event */ + // printf("Mouse XY Event: %d,%d\n", (signed char)iopkt[1], (signed char)iopkt[2]); + sendrelxy(moufd, (signed char)iopkt[1], (signed char)iopkt[2]); + break; + case 0x86: /* mouse button event */ + // printf("Mouse Button %s Event 0x%02X\n", iopkt[2] ? "[PRESS]" : "[RELEASE]", iopkt[1]); + sendbttn(moufd, iopkt[1], iopkt[2]); + break; + case 0x90: /* acknowledge read bytes request*/ + if (a2reqlist) /* better have an outstanding request */ + { + //printf("a2pid: read %d of %d bytes from 0x%04X\n", a2reqlist->xfer, a2reqlist->count, a2reqlist->addr); + newtio.c_cc[VMIN] = 1; /* blocking read until 1 char received */ + tcsetattr(a2fd, TCSANOW, &newtio); + c = a2reqlist->count - a2reqlist->xfer > MAX_XFER + ? MAX_XFER + : a2reqlist->count - a2reqlist->xfer; + if (writeword(a2fd, a2reqlist->addr + a2reqlist->xfer, 0x91) && writeword(a2fd, c, 0x91)) + { + for (i = 0; i < c; i++) + { + if (read(a2fd, iopkt, 1) == 1) + a2reqlist->buffer[a2reqlist->xfer++] = iopkt[0]; + else + { + stop = TRUE; + break; + } + } + } + else + stop = TRUE; + newtio.c_cc[VMIN] = 3; /* blocking read until 3 chars received */ + tcsetattr(a2fd, TCSANOW, &newtio); + } + else + stop = TRUE; + break; + case 0x92: /* acknowledge write bytes */ + if (a2reqlist) /* better have an outstanding request */ + { + //printf("a2pid: wrote %d of %d bytes to 0x%04X\n", a2reqlist->xfer, a2reqlist->count, a2reqlist->addr); + newtio.c_cc[VMIN] = 1; /* blocking read until 1 char received */ + tcsetattr(a2fd, TCSANOW, &newtio); + c = a2reqlist->count - a2reqlist->xfer > MAX_XFER + ? MAX_XFER + : a2reqlist->count - a2reqlist->xfer; + if (writeword(a2fd, a2reqlist->addr + a2reqlist->xfer, 0x93) && writeword(a2fd, c, 0x93)) + { + if (write(a2fd, a2reqlist->buffer + a2reqlist->xfer, c) == c) + a2reqlist->xfer += c; + else + stop = TRUE; + } + else + stop = TRUE; + newtio.c_cc[VMIN] = 3; /* blocking read until 3 chars received */ + tcsetattr(a2fd, TCSANOW, &newtio); + } + else + stop = TRUE; + break; + case 0x94: /* acknowledge call */ + if (a2reqlist) /* better have an outstanding request */ + { + //printf("a2pid: call address 0x%04X\n", a2reqlist->addr); + newtio.c_cc[VMIN] = 1; /* blocking read until 1 char received */ + tcsetattr(a2fd, TCSANOW, &newtio); + if (!writeword(a2fd, a2reqlist->addr, 0x95)) + stop = TRUE; + newtio.c_cc[VMIN] = 3; /* blocking read until 3 chars received */ + tcsetattr(a2fd, TCSANOW, &newtio); + } + else + stop = TRUE; + break; + case 0x9E: /* request complete ok */ + case 0x9F: /* request complete error */ + if (a2reqlist) /* better have an outstanding request */ + { + //printf("a2pid: complete request 0x%02X:0x%02X\n", (unsigned char)iopkt[0], (unsigned char)iopkt[1]); + if ((a2reqlist->type == 0x90 || a2reqlist->type == 0x92) + && (a2reqlist->count > a2reqlist->xfer)) + { + iopkt[0] = a2reqlist->type; + write(a2fd, iopkt, 1); + } + else + { + //printf("a2pid: finish request 0x%02X:0x%02X\n", (unsigned char)iopkt[0], (unsigned char)iopkt[1]); + finreq(a2fd, (unsigned char)iopkt[0], (unsigned char)iopkt[1]); + } + } + else + stop = TRUE; + break; + default: + prlog("a2pid: Unknown Event\n"); + tcflush(a2fd, TCIFLUSH); + //stop = TRUE; + } + } + else + { + prlog("a2pid: error read serial port ????\n"); + stop = TRUE; + } + } + /* + * Socket server connection. + */ + if (FD_ISSET(srvfd, &readset)) + { + int len; + struct sockaddr inaddr; + len = sizeof(inaddr); + reqfd = accept(srvfd, NULL, NULL); + if (reqfd > 0) + FD_SET(reqfd, &openset); + else + prlog("a2pid: error accept"); + maxfd = reqfd > maxfd ? reqfd : maxfd; + prlog("a2pi: Client Connect\n"); + } + /* + * Socket client request. + */ + if (reqfd > 0 && FD_ISSET(reqfd, &readset)) + { + int addr, count; + char *databuf; + if (read(reqfd, iopkt, 1) == 1) + { + // printf("a2pi: Request [0x%02X]\n", iopkt[0]); + switch (iopkt[0]) + { + case 0x90: /* read bytes */ + if (read(reqfd, iopkt, 4) == 4) + { + addr = (unsigned char)iopkt[0] | ((unsigned char)iopkt[1] << 8); + count = (unsigned char)iopkt[2] | ((unsigned char)iopkt[3] << 8); + if (count) + { + databuf = malloc(count); + addreq(a2fd, reqfd, 0x90, addr, count, databuf); + } + else + { + iopkt[0] = 0x9E; + iopkt[1] = 0x00; + write(reqfd, iopkt, 2); + } + } + break; + case 0x92: /* write bytes */ + if (read(reqfd, iopkt, 4) == 4) + { + addr = (unsigned char)iopkt[0] | ((unsigned char)iopkt[1] << 8); + count = (unsigned char)iopkt[2] | ((unsigned char)iopkt[3] << 8); + if (count) + { + databuf = malloc(count); + if (read(reqfd, databuf, count) == count) + addreq(a2fd, reqfd, 0x92, addr, count, databuf); + } + else + { + iopkt[0] = 0x9E; + iopkt[1] = 0x00; + write(reqfd, iopkt, 2); + } + } + break; + case 0x94: /* call */ + if (read(reqfd, iopkt, 2) == 2) + { + addr = (unsigned char)iopkt[0] | ((unsigned char)iopkt[1] << 8); + addreq(a2fd, reqfd, 0x94, addr, 0, NULL); + } + break; + case 0xFF: /* close */ + FD_CLR(reqfd, &openset); + close(reqfd); + reqfd = 0; + maxfd = a2fd > srvfd ? a2fd : srvfd; + break; + default: + prlog("a2pid: Unknown Request\n"); + stop = TRUE; + } + } + else + { + prlog("a2pid: error read socket ????"); + stop = TRUE; + } + } + } + } + if (reqfd > 0) + close(reqfd); + shutdown(srvfd, SHUT_RDWR); + close(srvfd); + tcsetattr(a2fd, TCSANOW, &oldtio); + tcflush(a2fd, TCIFLUSH); + close(a2fd); + ioctl(moufd, UI_DEV_DESTROY); + ioctl(kbdfd, UI_DEV_DESTROY); + close(moufd); + close(kbdfd); +} diff --git a/src/a2serclk b/src/a2serclk new file mode 100755 index 0000000000000000000000000000000000000000..6627f7f936010dc5903a4a9f3dd6a309fb22a47b GIT binary patch literal 6236 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 literal 0 HcmV?d00001 diff --git a/src/dskread b/src/dskread new file mode 100755 index 0000000000000000000000000000000000000000..1ad63eb2677de09d2432c105ef385c637af44910 GIT binary patch literal 9042 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 literal 0 HcmV?d00001 diff --git a/src/dskwrite b/src/dskwrite new file mode 100755 index 0000000000000000000000000000000000000000..7dee99ea018540a9ec3e98412872f35dfb57c3af GIT binary patch literal 9069 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 literal 0 HcmV?d00001