131202Sminshall #include "../api/api.h" 231202Sminshall 331205Sminshall #include "apilib.h" 431202Sminshall 531202Sminshall int 631205Sminshall api_sup_errno = 0, /* Supervisor error number */ 731205Sminshall api_sup_fcn_id = 0, /* Supervisor function id (0x12) */ 831205Sminshall api_fcn_errno = 0, /* Function error number */ 931205Sminshall api_fcn_fcn_id = 0; /* Function ID (0x6b, etc.) */ 1031205Sminshall 1131205Sminshall static int 1231205Sminshall gate_sessmgr = 0, 1331205Sminshall gate_keyboard = 0, 1431205Sminshall gate_copy = 0, 1531205Sminshall gate_oiam = 0; 1631205Sminshall 1731205Sminshall /* 1831205Sminshall * Issue an API request, with reg structures supplied by the caller. 1931205Sminshall * 2031205Sminshall * Only certain routines need this (supervisor services come to mind). 2131205Sminshall */ 2231205Sminshall 2331205Sminshall int 2431205Sminshall api_issue_regs(ah, al, bh, bl, cx, dx, parms, regs, sregs) 2531205Sminshall int ah, al, bh, bl, cx, dx; 2631205Sminshall char *parms; 2731205Sminshall union REGS *regs; 2831205Sminshall struct SREGS *sregs; 2931205Sminshall { 3031205Sminshall char far *ourseg = parms; 3131205Sminshall 3231205Sminshall regs->h.ah = ah; 3331205Sminshall regs->h.al = al; 3431205Sminshall regs->h.bh = bh; 3531205Sminshall regs->h.bl = bl; 3631205Sminshall regs->x.cx = cx; 3731205Sminshall regs->x.dx = dx; 3831205Sminshall sregs->es = (int) FP_SEG(ourseg); 3931205Sminshall regs->x.di = (int) FP_OFF(ourseg); 4031205Sminshall 4131205Sminshall int86x(API_INTERRUPT_NUMBER, regs, regs, sregs); 4231205Sminshall if (regs->h.cl != 0) { 4331205Sminshall api_sup_errno = regs->h.cl; 4431205Sminshall return -1; 4531205Sminshall } else { 4631205Sminshall return 0; 4731205Sminshall } 4831205Sminshall } 4931205Sminshall 5031205Sminshall 5131205Sminshall /* 5231205Sminshall * Issue an API request without requiring caller to supply 5331205Sminshall * registers. Most routines use this. 5431205Sminshall */ 5531205Sminshall 5631205Sminshall int 5731202Sminshall api_issue(ah, al, bh, bl, cx, dx, parms) 5831202Sminshall int 5931202Sminshall ah, 6031202Sminshall al, 6131202Sminshall bh, 6231202Sminshall bl, 6331202Sminshall cx, 6431202Sminshall dx; 6531202Sminshall char *parms; 6631202Sminshall { 6731202Sminshall union REGS regs; 6831202Sminshall struct SREGS sregs; 6931202Sminshall 7031205Sminshall return api_issue_regs(ah, al, bh, bl, cx, dx, parms, ®s, &sregs); 7131202Sminshall } 7231205Sminshall 7331205Sminshall /* 7431205Sminshall * Supervisor Services 7531205Sminshall */ 7631202Sminshall 7731202Sminshall int 7831202Sminshall api_name_resolve(name) 7931202Sminshall char *name; 8031202Sminshall { 8131202Sminshall NameResolveParms parms; 8231202Sminshall int i; 8331202Sminshall union REGS regs; 8431202Sminshall struct SREGS sregs; 8531202Sminshall 8631202Sminshall for (i = 0; i < sizeof parms.gate_name; i++) { 8731202Sminshall if (*name) { 8831202Sminshall parms.gate_name[i] = *name++; 8931202Sminshall } else { 9031202Sminshall parms.gate_name[i] = ' '; 9131202Sminshall } 9231202Sminshall } 9331202Sminshall 9431205Sminshall if (api_issue_regs(NAME_RESOLUTION, 0, 0, 0, 0, 0, &parms, ®s, &sregs) 9531205Sminshall == -1) { 9631205Sminshall return -1; 9731205Sminshall } else { 9831205Sminshall return regs.x.dx; 9931202Sminshall } 10031205Sminshall } 10131205Sminshall 10231205Sminshall /* 10331205Sminshall * Session Information Services 10431205Sminshall */ 10531202Sminshall 106*31210Sminshall api_query_session_id(parms) 10731205Sminshall QuerySessionIdParms *parms; 10831205Sminshall { 10931205Sminshall if (api_issue(0x09, QUERY_SESSION_ID, 0x80, 0x20, 0, 11031205Sminshall gate_sessmgr, (char *)parms) == -1) { 11131205Sminshall api_fcn_errno = 0; 11231205Sminshall api_fcn_fcn_id = 0; 11331202Sminshall return -1; 11431205Sminshall } else if (parms->rc == 0) { 11531205Sminshall return 0; 11631202Sminshall } else { 11731205Sminshall api_fcn_errno = parms->rc; 11831205Sminshall api_fcn_fcn_id = parms->function_id; 11931205Sminshall return -1; 12031202Sminshall } 12131202Sminshall } 12231205Sminshall 12331205Sminshall 124*31210Sminshall api_query_session_parameters(parms) 12531205Sminshall QuerySessionParametersParms *parms; 12631205Sminshall { 127*31210Sminshall if (api_issue(0x09, QUERY_SESSION_PARAMETERS, 0x80, 0x20, 0, 12831205Sminshall gate_sessmgr, (char *)parms) == -1) { 12931205Sminshall api_fcn_errno = 0; 13031205Sminshall api_fcn_fcn_id = 0; 13131205Sminshall return -1; 13231205Sminshall } else if (parms->rc == 0) { 13331205Sminshall return 0; 13431205Sminshall } else { 13531205Sminshall api_fcn_errno = parms->rc; 13631205Sminshall api_fcn_fcn_id = parms->function_id; 13731205Sminshall return -1; 13831205Sminshall } 13931205Sminshall } 14031205Sminshall 14131205Sminshall api_query_session_cursor(parms) 14231205Sminshall QuerySessionCursorParms *parms; 14331205Sminshall { 144*31210Sminshall if (api_issue(0x09, QUERY_SESSION_CURSOR, 0x80, 0x20, 0xff, 14531205Sminshall gate_sessmgr, (char *)parms) == -1) { 14631205Sminshall api_fcn_errno = 0; 14731205Sminshall api_fcn_fcn_id = 0; 14831205Sminshall return -1; 14931205Sminshall } else if (parms->rc == 0) { 15031205Sminshall return 0; 15131205Sminshall } else { 15231205Sminshall api_fcn_errno = parms->rc; 15331205Sminshall api_fcn_fcn_id = parms->function_id; 15431205Sminshall return -1; 15531205Sminshall } 15631205Sminshall } 15731205Sminshall 15831205Sminshall /* 15931205Sminshall * Keyboard Services 16031205Sminshall */ 16131205Sminshall 16231205Sminshall api_connect_to_keyboard(parms) 16331205Sminshall ConnectToKeyboardParms *parms; 16431205Sminshall { 16531205Sminshall if (api_issue(0x09, CONNECT_TO_KEYBOARD, 0x80, 0x20, 0, 16631205Sminshall gate_keyboard, (char *)parms) == -1) { 16731205Sminshall api_fcn_errno = 0; 16831205Sminshall api_fcn_fcn_id = 0; 16931205Sminshall return -1; 17031205Sminshall } else if (parms->rc == 0) { 17131205Sminshall return 0; 17231205Sminshall } else { 17331205Sminshall api_fcn_errno = parms->rc; 17431205Sminshall api_fcn_fcn_id = parms->function_id; 17531205Sminshall return -1; 17631205Sminshall } 17731205Sminshall } 17831205Sminshall 17931205Sminshall 18031205Sminshall api_disconnect_from_keyboard(parms) 18131205Sminshall DisconnectFromKeyboardParms *parms; 18231205Sminshall { 18331205Sminshall if (api_issue(0x09, DISCONNECT_FROM_KEYBOARD, 0x80, 0x20, 0, 18431205Sminshall gate_keyboard, (char *)parms) == -1) { 18531205Sminshall api_fcn_errno = 0; 18631205Sminshall api_fcn_fcn_id = 0; 18731205Sminshall return -1; 18831205Sminshall } else if (parms->rc == 0) { 18931205Sminshall return 0; 19031205Sminshall } else { 19131205Sminshall api_fcn_errno = parms->rc; 19231205Sminshall api_fcn_fcn_id = parms->function_id; 19331205Sminshall return -1; 19431205Sminshall } 19531205Sminshall } 19631205Sminshall 19731205Sminshall 19831205Sminshall api_write_keystroke(parms) 19931205Sminshall WriteKeystrokeParms *parms; 20031205Sminshall { 20131205Sminshall if (api_issue(0x09, WRITE_KEYSTROKE, 0x80, 0x20, 0, 20231205Sminshall gate_keyboard, (char *)parms) == -1) { 20331205Sminshall api_fcn_errno = 0; 20431205Sminshall api_fcn_fcn_id = 0; 20531205Sminshall return -1; 20631205Sminshall } else if (parms->rc == 0) { 20731205Sminshall return 0; 20831205Sminshall } else { 20931205Sminshall api_fcn_errno = parms->rc; 21031205Sminshall api_fcn_fcn_id = parms->function_id; 21131205Sminshall return -1; 21231205Sminshall } 21331205Sminshall } 21431205Sminshall 21531205Sminshall 21631205Sminshall api_disable_input(parms) 21731205Sminshall DisableInputParms *parms; 21831205Sminshall { 21931205Sminshall if (api_issue(0x09, DISABLE_INPUT, 0x80, 0x20, 0, 22031205Sminshall gate_keyboard, (char *)parms) == -1) { 22131205Sminshall api_fcn_errno = 0; 22231205Sminshall api_fcn_fcn_id = 0; 22331205Sminshall return -1; 22431205Sminshall } else if (parms->rc == 0) { 22531205Sminshall return 0; 22631205Sminshall } else { 22731205Sminshall api_fcn_errno = parms->rc; 22831205Sminshall api_fcn_fcn_id = parms->function_id; 22931205Sminshall return -1; 23031205Sminshall } 23131205Sminshall } 23231205Sminshall 23331205Sminshall api_enable_input(parms) 23431205Sminshall EnableInputParms *parms; 23531205Sminshall { 23631205Sminshall if (api_issue(0x09, ENABLE_INPUT, 0x80, 0x20, 0, 23731205Sminshall gate_keyboard, (char *)parms) == -1) { 23831205Sminshall api_fcn_errno = 0; 23931205Sminshall api_fcn_fcn_id = 0; 24031205Sminshall return -1; 24131205Sminshall } else if (parms->rc == 0) { 24231205Sminshall return 0; 24331205Sminshall } else { 24431205Sminshall api_fcn_errno = parms->rc; 24531205Sminshall api_fcn_fcn_id = parms->function_id; 24631205Sminshall return -1; 24731205Sminshall } 24831205Sminshall } 24931205Sminshall 25031205Sminshall /* 25131205Sminshall * Copy Services 25231205Sminshall */ 25331205Sminshall 25431205Sminshall api_copy_string(parms) 25531205Sminshall CopyStringParms *parms; 25631205Sminshall { 257*31210Sminshall if (api_issue(0x09, COPY_STRING, 0x80, 0x20, 0xff, 25831205Sminshall gate_copy, (char *)parms) == -1) { 25931205Sminshall api_fcn_errno = 0; 26031205Sminshall api_fcn_fcn_id = 0; 26131205Sminshall return -1; 26231205Sminshall } else if (parms->rc == 0) { 26331205Sminshall return 0; 26431205Sminshall } else { 26531205Sminshall api_fcn_errno = parms->rc; 26631205Sminshall api_fcn_fcn_id = parms->function_id; 26731205Sminshall return -1; 26831205Sminshall } 26931205Sminshall } 27031205Sminshall 27131205Sminshall /* 27231205Sminshall * Operator Information Area Services 27331205Sminshall */ 27431205Sminshall 27531205Sminshall api_read_oia_group(parms) 27631205Sminshall ReadOiaGroupParms *parms; 27731205Sminshall { 278*31210Sminshall if (api_issue(0x09, READ_OIA_GROUP, 0x80, 0x20, 0xff, 27931205Sminshall gate_oiam, (char *)parms) == -1) { 28031205Sminshall api_fcn_errno = 0; 28131205Sminshall api_fcn_fcn_id = 0; 28231205Sminshall return -1; 28331205Sminshall } else if (parms->rc == 0) { 28431205Sminshall return 0; 28531205Sminshall } else { 28631205Sminshall api_fcn_errno = parms->rc; 28731205Sminshall api_fcn_fcn_id = parms->function_id; 28831205Sminshall return -1; 28931205Sminshall } 29031205Sminshall } 29131205Sminshall 29231205Sminshall /* 29331205Sminshall * The initialization routine. Be sure to call this first. 29431205Sminshall */ 29531205Sminshall 29631205Sminshall api_init() 29731205Sminshall { 29831205Sminshall union REGS regs; 29931205Sminshall struct SREGS sregs; 30031205Sminshall 30131205Sminshall regs.h.ah = 0x35; 30231205Sminshall regs.h.al = API_INTERRUPT_NUMBER; 30331205Sminshall intdosx(®s, ®s, &sregs); 30431205Sminshall 30531205Sminshall if ((regs.x.bx == 0) && (sregs.es == 0)) { 30631205Sminshall return 0; /* Interrupt not being handled */ 30731205Sminshall } 30831205Sminshall 30931205Sminshall gate_sessmgr = api_name_resolve("SESSMGR"); 31031205Sminshall gate_keyboard = api_name_resolve("KEYBOARD"); 31131205Sminshall gate_copy = api_name_resolve("COPY"); 31231205Sminshall gate_oiam = api_name_resolve("OIAM"); 31331205Sminshall 31431205Sminshall if ((gate_sessmgr == gate_keyboard) || 31531205Sminshall (gate_sessmgr == gate_copy) || 31631205Sminshall (gate_sessmgr == gate_oiam) || 31731205Sminshall (gate_keyboard == gate_copy) || 31831205Sminshall (gate_keyboard == gate_oiam) || 31931205Sminshall (gate_copy == gate_oiam)) { 32031205Sminshall return 0; /* Interrupt doesn't seem correct */ 32131205Sminshall } 32231205Sminshall return 1; 32331205Sminshall } 324