From 269bc8c9ab74e62caf2cbb9af0fecc17284ceb65 Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Sat, 10 Aug 2013 13:42:02 -0700 Subject: [PATCH] Sheesh --- src/._A2PI.PO | Bin 4096 -> 0 bytes src/a2mon | Bin 9780 -> 0 bytes src/a2pid | Bin 19218 -> 0 bytes src/a2pid.c~ | 948 -------------------------------------------------- src/a2serclk | Bin 6236 -> 0 bytes src/bintomon | Bin 6360 -> 0 bytes src/dskread | Bin 9042 -> 0 bytes src/dskwrite | Bin 9069 -> 0 bytes 8 files changed, 948 deletions(-) delete mode 100755 src/._A2PI.PO delete mode 100755 src/a2mon delete mode 100755 src/a2pid delete mode 100755 src/a2pid.c~ delete mode 100755 src/a2serclk delete mode 100755 src/bintomon delete mode 100755 src/dskread delete mode 100755 src/dskwrite diff --git a/src/._A2PI.PO b/src/._A2PI.PO deleted file mode 100755 index c2ce480bd148268936200077db1cffd3a9cd0f90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/src/a2mon b/src/a2mon deleted file mode 100755 index 7f9df820c2041d5244c9a771adaaed8898998482..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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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 diff --git a/src/a2pid b/src/a2pid deleted file mode 100755 index 3d891150f7d0a50f1703e1756f71ef60e8439bcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19218 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 S_2JrzzN+F^PkvOzul&Cdvz`I~ diff --git a/src/a2pid.c~ b/src/a2pid.c~ deleted file mode 100755 index 3590332..0000000 --- a/src/a2pid.c~ +++ /dev/null @@ -1,948 +0,0 @@ -/* - * 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 deleted file mode 100755 index 6627f7f936010dc5903a4a9f3dd6a309fb22a47b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6236 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 diff --git a/src/dskread b/src/dskread deleted file mode 100755 index 1ad63eb2677de09d2432c105ef385c637af44910..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9042 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 diff --git a/src/dskwrite b/src/dskwrite deleted file mode 100755 index 7dee99ea018540a9ec3e98412872f35dfb57c3af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9069 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