131202Sminshall #include "../api/api.h" 231202Sminshall 3*31205Sminshall #include "apilib.h" 431202Sminshall 531202Sminshall int 6*31205Sminshall api_sup_errno = 0, /* Supervisor error number */ 7*31205Sminshall api_sup_fcn_id = 0, /* Supervisor function id (0x12) */ 8*31205Sminshall api_fcn_errno = 0, /* Function error number */ 9*31205Sminshall api_fcn_fcn_id = 0; /* Function ID (0x6b, etc.) */ 10*31205Sminshall 11*31205Sminshall static int 12*31205Sminshall gate_sessmgr = 0, 13*31205Sminshall gate_keyboard = 0, 14*31205Sminshall gate_copy = 0, 15*31205Sminshall gate_oiam = 0; 16*31205Sminshall 17*31205Sminshall /* 18*31205Sminshall * Issue an API request, with reg structures supplied by the caller. 19*31205Sminshall * 20*31205Sminshall * Only certain routines need this (supervisor services come to mind). 21*31205Sminshall */ 22*31205Sminshall 23*31205Sminshall int 24*31205Sminshall api_issue_regs(ah, al, bh, bl, cx, dx, parms, regs, sregs) 25*31205Sminshall int ah, al, bh, bl, cx, dx; 26*31205Sminshall char *parms; 27*31205Sminshall union REGS *regs; 28*31205Sminshall struct SREGS *sregs; 29*31205Sminshall { 30*31205Sminshall char far *ourseg = parms; 31*31205Sminshall 32*31205Sminshall regs->h.ah = ah; 33*31205Sminshall regs->h.al = al; 34*31205Sminshall regs->h.bh = bh; 35*31205Sminshall regs->h.bl = bl; 36*31205Sminshall regs->x.cx = cx; 37*31205Sminshall regs->x.dx = dx; 38*31205Sminshall sregs->es = (int) FP_SEG(ourseg); 39*31205Sminshall regs->x.di = (int) FP_OFF(ourseg); 40*31205Sminshall 41*31205Sminshall int86x(API_INTERRUPT_NUMBER, regs, regs, sregs); 42*31205Sminshall if (regs->h.cl != 0) { 43*31205Sminshall api_sup_errno = regs->h.cl; 44*31205Sminshall return -1; 45*31205Sminshall } else { 46*31205Sminshall return 0; 47*31205Sminshall } 48*31205Sminshall } 49*31205Sminshall 50*31205Sminshall 51*31205Sminshall /* 52*31205Sminshall * Issue an API request without requiring caller to supply 53*31205Sminshall * registers. Most routines use this. 54*31205Sminshall */ 55*31205Sminshall 56*31205Sminshall 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 70*31205Sminshall return api_issue_regs(ah, al, bh, bl, cx, dx, parms, ®s, &sregs); 7131202Sminshall } 72*31205Sminshall 73*31205Sminshall /* 74*31205Sminshall * Supervisor Services 75*31205Sminshall */ 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 94*31205Sminshall if (api_issue_regs(NAME_RESOLUTION, 0, 0, 0, 0, 0, &parms, ®s, &sregs) 95*31205Sminshall == -1) { 96*31205Sminshall return -1; 97*31205Sminshall } else { 98*31205Sminshall return regs.x.dx; 9931202Sminshall } 100*31205Sminshall } 101*31205Sminshall 102*31205Sminshall /* 103*31205Sminshall * Session Information Services 104*31205Sminshall */ 10531202Sminshall 106*31205Sminshall api_query_sesion_id(parms) 107*31205Sminshall QuerySessionIdParms *parms; 108*31205Sminshall { 109*31205Sminshall if (api_issue(0x09, QUERY_SESSION_ID, 0x80, 0x20, 0, 110*31205Sminshall gate_sessmgr, (char *)parms) == -1) { 111*31205Sminshall api_fcn_errno = 0; 112*31205Sminshall api_fcn_fcn_id = 0; 11331202Sminshall return -1; 114*31205Sminshall } else if (parms->rc == 0) { 115*31205Sminshall return 0; 11631202Sminshall } else { 117*31205Sminshall api_fcn_errno = parms->rc; 118*31205Sminshall api_fcn_fcn_id = parms->function_id; 119*31205Sminshall return -1; 12031202Sminshall } 12131202Sminshall } 122*31205Sminshall 123*31205Sminshall 124*31205Sminshall api_query_session_parms(parms) 125*31205Sminshall QuerySessionParametersParms *parms; 126*31205Sminshall { 127*31205Sminshall if (api_issue(0x09, QUERY_SESSION_PARMS, 0x80, 0x20, 0, 128*31205Sminshall gate_sessmgr, (char *)parms) == -1) { 129*31205Sminshall api_fcn_errno = 0; 130*31205Sminshall api_fcn_fcn_id = 0; 131*31205Sminshall return -1; 132*31205Sminshall } else if (parms->rc == 0) { 133*31205Sminshall return 0; 134*31205Sminshall } else { 135*31205Sminshall api_fcn_errno = parms->rc; 136*31205Sminshall api_fcn_fcn_id = parms->function_id; 137*31205Sminshall return -1; 138*31205Sminshall } 139*31205Sminshall } 140*31205Sminshall 141*31205Sminshall api_query_session_cursor(parms) 142*31205Sminshall QuerySessionCursorParms *parms; 143*31205Sminshall { 144*31205Sminshall if (api_issue(0x09, QUERY_SESSION_CURSOR, 0x80, 0x20, 0, 145*31205Sminshall gate_sessmgr, (char *)parms) == -1) { 146*31205Sminshall api_fcn_errno = 0; 147*31205Sminshall api_fcn_fcn_id = 0; 148*31205Sminshall return -1; 149*31205Sminshall } else if (parms->rc == 0) { 150*31205Sminshall return 0; 151*31205Sminshall } else { 152*31205Sminshall api_fcn_errno = parms->rc; 153*31205Sminshall api_fcn_fcn_id = parms->function_id; 154*31205Sminshall return -1; 155*31205Sminshall } 156*31205Sminshall } 157*31205Sminshall 158*31205Sminshall /* 159*31205Sminshall * Keyboard Services 160*31205Sminshall */ 161*31205Sminshall 162*31205Sminshall api_connect_to_keyboard(parms) 163*31205Sminshall ConnectToKeyboardParms *parms; 164*31205Sminshall { 165*31205Sminshall if (api_issue(0x09, CONNECT_TO_KEYBOARD, 0x80, 0x20, 0, 166*31205Sminshall gate_keyboard, (char *)parms) == -1) { 167*31205Sminshall api_fcn_errno = 0; 168*31205Sminshall api_fcn_fcn_id = 0; 169*31205Sminshall return -1; 170*31205Sminshall } else if (parms->rc == 0) { 171*31205Sminshall return 0; 172*31205Sminshall } else { 173*31205Sminshall api_fcn_errno = parms->rc; 174*31205Sminshall api_fcn_fcn_id = parms->function_id; 175*31205Sminshall return -1; 176*31205Sminshall } 177*31205Sminshall } 178*31205Sminshall 179*31205Sminshall 180*31205Sminshall api_disconnect_from_keyboard(parms) 181*31205Sminshall DisconnectFromKeyboardParms *parms; 182*31205Sminshall { 183*31205Sminshall if (api_issue(0x09, DISCONNECT_FROM_KEYBOARD, 0x80, 0x20, 0, 184*31205Sminshall gate_keyboard, (char *)parms) == -1) { 185*31205Sminshall api_fcn_errno = 0; 186*31205Sminshall api_fcn_fcn_id = 0; 187*31205Sminshall return -1; 188*31205Sminshall } else if (parms->rc == 0) { 189*31205Sminshall return 0; 190*31205Sminshall } else { 191*31205Sminshall api_fcn_errno = parms->rc; 192*31205Sminshall api_fcn_fcn_id = parms->function_id; 193*31205Sminshall return -1; 194*31205Sminshall } 195*31205Sminshall } 196*31205Sminshall 197*31205Sminshall 198*31205Sminshall api_write_keystroke(parms) 199*31205Sminshall WriteKeystrokeParms *parms; 200*31205Sminshall { 201*31205Sminshall if (api_issue(0x09, WRITE_KEYSTROKE, 0x80, 0x20, 0, 202*31205Sminshall gate_keyboard, (char *)parms) == -1) { 203*31205Sminshall api_fcn_errno = 0; 204*31205Sminshall api_fcn_fcn_id = 0; 205*31205Sminshall return -1; 206*31205Sminshall } else if (parms->rc == 0) { 207*31205Sminshall return 0; 208*31205Sminshall } else { 209*31205Sminshall api_fcn_errno = parms->rc; 210*31205Sminshall api_fcn_fcn_id = parms->function_id; 211*31205Sminshall return -1; 212*31205Sminshall } 213*31205Sminshall } 214*31205Sminshall 215*31205Sminshall 216*31205Sminshall api_disable_input(parms) 217*31205Sminshall DisableInputParms *parms; 218*31205Sminshall { 219*31205Sminshall if (api_issue(0x09, DISABLE_INPUT, 0x80, 0x20, 0, 220*31205Sminshall gate_keyboard, (char *)parms) == -1) { 221*31205Sminshall api_fcn_errno = 0; 222*31205Sminshall api_fcn_fcn_id = 0; 223*31205Sminshall return -1; 224*31205Sminshall } else if (parms->rc == 0) { 225*31205Sminshall return 0; 226*31205Sminshall } else { 227*31205Sminshall api_fcn_errno = parms->rc; 228*31205Sminshall api_fcn_fcn_id = parms->function_id; 229*31205Sminshall return -1; 230*31205Sminshall } 231*31205Sminshall } 232*31205Sminshall 233*31205Sminshall api_enable_input(parms) 234*31205Sminshall EnableInputParms *parms; 235*31205Sminshall { 236*31205Sminshall if (api_issue(0x09, ENABLE_INPUT, 0x80, 0x20, 0, 237*31205Sminshall gate_keyboard, (char *)parms) == -1) { 238*31205Sminshall api_fcn_errno = 0; 239*31205Sminshall api_fcn_fcn_id = 0; 240*31205Sminshall return -1; 241*31205Sminshall } else if (parms->rc == 0) { 242*31205Sminshall return 0; 243*31205Sminshall } else { 244*31205Sminshall api_fcn_errno = parms->rc; 245*31205Sminshall api_fcn_fcn_id = parms->function_id; 246*31205Sminshall return -1; 247*31205Sminshall } 248*31205Sminshall } 249*31205Sminshall 250*31205Sminshall /* 251*31205Sminshall * Copy Services 252*31205Sminshall */ 253*31205Sminshall 254*31205Sminshall api_copy_string(parms) 255*31205Sminshall CopyStringParms *parms; 256*31205Sminshall { 257*31205Sminshall if (api_issue(0x09, COPY_STRING, 0x80, 0x20, 0, 258*31205Sminshall gate_copy, (char *)parms) == -1) { 259*31205Sminshall api_fcn_errno = 0; 260*31205Sminshall api_fcn_fcn_id = 0; 261*31205Sminshall return -1; 262*31205Sminshall } else if (parms->rc == 0) { 263*31205Sminshall return 0; 264*31205Sminshall } else { 265*31205Sminshall api_fcn_errno = parms->rc; 266*31205Sminshall api_fcn_fcn_id = parms->function_id; 267*31205Sminshall return -1; 268*31205Sminshall } 269*31205Sminshall } 270*31205Sminshall 271*31205Sminshall /* 272*31205Sminshall * Operator Information Area Services 273*31205Sminshall */ 274*31205Sminshall 275*31205Sminshall api_read_oia_group(parms) 276*31205Sminshall ReadOiaGroupParms *parms; 277*31205Sminshall { 278*31205Sminshall if (api_issue(0x09, READ_OIA_GROUP, 0x80, 0x20, 0, 279*31205Sminshall gate_oiam, (char *)parms) == -1) { 280*31205Sminshall api_fcn_errno = 0; 281*31205Sminshall api_fcn_fcn_id = 0; 282*31205Sminshall return -1; 283*31205Sminshall } else if (parms->rc == 0) { 284*31205Sminshall return 0; 285*31205Sminshall } else { 286*31205Sminshall api_fcn_errno = parms->rc; 287*31205Sminshall api_fcn_fcn_id = parms->function_id; 288*31205Sminshall return -1; 289*31205Sminshall } 290*31205Sminshall } 291*31205Sminshall 292*31205Sminshall /* 293*31205Sminshall * The initialization routine. Be sure to call this first. 294*31205Sminshall */ 295*31205Sminshall 296*31205Sminshall api_init() 297*31205Sminshall { 298*31205Sminshall union REGS regs; 299*31205Sminshall struct SREGS sregs; 300*31205Sminshall 301*31205Sminshall regs.h.ah = 0x35; 302*31205Sminshall regs.h.al = API_INTERRUPT_NUMBER; 303*31205Sminshall intdosx(®s, ®s, &sregs); 304*31205Sminshall 305*31205Sminshall if ((regs.x.bx == 0) && (sregs.es == 0)) { 306*31205Sminshall return 0; /* Interrupt not being handled */ 307*31205Sminshall } 308*31205Sminshall 309*31205Sminshall gate_sessmgr = api_name_resolve("SESSMGR"); 310*31205Sminshall gate_keyboard = api_name_resolve("KEYBOARD"); 311*31205Sminshall gate_copy = api_name_resolve("COPY"); 312*31205Sminshall gate_oiam = api_name_resolve("OIAM"); 313*31205Sminshall 314*31205Sminshall if ((gate_sessmgr == gate_keyboard) || 315*31205Sminshall (gate_sessmgr == gate_copy) || 316*31205Sminshall (gate_sessmgr == gate_oiam) || 317*31205Sminshall (gate_keyboard == gate_copy) || 318*31205Sminshall (gate_keyboard == gate_oiam) || 319*31205Sminshall (gate_copy == gate_oiam)) { 320*31205Sminshall return 0; /* Interrupt doesn't seem correct */ 321*31205Sminshall } 322*31205Sminshall return 1; 323*31205Sminshall } 324