131158Sminshall /* 231158Sminshall * This file implements the API used in the PC version. 331158Sminshall */ 431158Sminshall 531158Sminshall #include <stdio.h> 631158Sminshall 731158Sminshall #include "api.h" 831183Sminshall #include "../general/general.h" 931158Sminshall 10*31226Sminshall #include "../ascii/disp_asc.h" 11*31226Sminshall 1231168Sminshall #include "../ctlr/screen.h" 1331193Sminshall #include "../ctlr/oia.h" 1431193Sminshall 1531183Sminshall #include "../general/globals.h" 1631158Sminshall 1731158Sminshall /* 1831193Sminshall * General utility routines. 1931193Sminshall */ 2031193Sminshall 2131193Sminshall #if defined(MSDOS) 2231193Sminshall 2331211Sminshall #if defined(LINT_ARGS) 2431211Sminshall static void movetous(char *, int, int, int); 2531211Sminshall static void movetothem(int, int, char *, int); 2631211Sminshall #endif /* defined(LINT_ARGS) */ 2731211Sminshall 28*31226Sminshall #define access(foo,length) (foo) 29*31226Sminshall #define unaccess(foo,goo,length) 30*31226Sminshall 3131193Sminshall static void 3231193Sminshall movetous(parms, es, di, length) 3331193Sminshall char *parms; 3431211Sminshall int es, di, length; 3531193Sminshall { 3631211Sminshall char far *farparms = parms; 3731193Sminshall 3831211Sminshall movedata(es, di, (int) FP_SEG(farparms), (int) FP_OFF(farparms), length); 3931193Sminshall } 4031193Sminshall 4131193Sminshall static void 4231211Sminshall movetothem(es, di, parms, length) 4331211Sminshall int es, di; 4431211Sminshall char *parms; 4531211Sminshall int length; 4631193Sminshall { 4731211Sminshall char far *farparms = parms; 4831193Sminshall 4931211Sminshall movedata((int) FP_SEG(farparms), (int) FP_OFF(farparms), es, di, length); 5031193Sminshall } 5131193Sminshall #endif /* defined(MSDOS) */ 5231193Sminshall 5331193Sminshall /* No Unix version yet... */ 5431193Sminshall 55*31226Sminshall #if defined(unix) 56*31226Sminshall #define access(f,l) (f) 5731193Sminshall 58*31226Sminshall #endif /* defined(unix) */ 59*31226Sminshall 6031193Sminshall /* 6131158Sminshall * Supervisor Services. 6231158Sminshall */ 6331158Sminshall 6431158Sminshall static void 6531193Sminshall name_resolution(regs, sregs) 6631158Sminshall union REGS *regs; 6731158Sminshall struct SREGS *sregs; 6831158Sminshall { 6931167Sminshall NameResolveParms parms; 7031161Sminshall 7131167Sminshall movetous((char *) &parms, sregs->es, regs->x.di, sizeof parms); 7231161Sminshall 7331161Sminshall regs->h.cl = 0; 7431193Sminshall if (memcmp((char *)&parms, NAME_SESSMGR, sizeof parms.gate_name) == 0) { 7531161Sminshall regs->x.dx = GATE_SESSMGR; 7631193Sminshall } else if (memcmp((char *)&parms, NAME_KEYBOARD, 7731193Sminshall sizeof parms.gate_name) == 0) { 7831161Sminshall regs->x.dx = GATE_KEYBOARD; 7931193Sminshall } else if (memcmp((char *)&parms, NAME_COPY, sizeof parms.gate_name) == 0) { 8031161Sminshall regs->x.dx = GATE_COPY; 8131193Sminshall } else if (memcmp((char *)&parms, NAME_OIAM, sizeof parms.gate_name) == 0) { 8231161Sminshall regs->x.dx = GATE_OIAM; 8331161Sminshall } else { 8431161Sminshall regs->h.cl = 0x2e; /* Name not found */ 8531161Sminshall } 8631161Sminshall regs->h.ch = 0x12; 8731161Sminshall regs->h.bh = 7; 8831158Sminshall } 8931158Sminshall 9031158Sminshall /* 9131158Sminshall * Session Information Services. 9231158Sminshall */ 9331158Sminshall 9431158Sminshall static void 9531158Sminshall query_session_id(regs, sregs) 9631158Sminshall union REGS *regs; 9731158Sminshall struct SREGS *sregs; 9831158Sminshall { 9931167Sminshall QuerySessionIdParms parms; 10031161Sminshall 10131167Sminshall movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms); 10231161Sminshall 10331211Sminshall if ((parms.rc != 0) || (parms.function_id != 0)) { 10431211Sminshall parms.rc = 0x0c; 10531211Sminshall } else if (parms.option_code != 0x01) { 10631211Sminshall parms.rc = 0x0d; /* Invalid option code */ 10731167Sminshall } else if (parms.data_code != 0x45) { 10831211Sminshall parms.rc = 0x0b; 10931161Sminshall } else { 11031168Sminshall NameArray list; 11131167Sminshall NameArrayElement element; 11231167Sminshall 11331167Sminshall movetous((char *)&list, FP_SEG(parms.name_array), 11431193Sminshall FP_OFF(parms.name_array), sizeof list); 11531168Sminshall if ((list.length < 14) || (list.length > 170)) { 11631167Sminshall parms.rc = 0x12; 11731161Sminshall } else { 11831167Sminshall list.number_matching_session = 1; 11931167Sminshall list.name_array_element.short_name = parms.data_code; 12031167Sminshall list.name_array_element.type = TYPE_DFT; 12131167Sminshall list.name_array_element.session_id = 23; 12231167Sminshall memcpy(list.name_array_element.long_name, "ONLYSESS", 12331167Sminshall sizeof list.name_array_element.long_name); 12431167Sminshall movetothem(FP_SEG(parms.name_array), 12531193Sminshall FP_OFF(parms.name_array), (char *)&list, sizeof list); 12631167Sminshall parms.rc = 0; 12731161Sminshall } 12831161Sminshall } 12931211Sminshall parms.function_id = 0x6b; 13031167Sminshall movetothem(sregs->es, regs->x.di, (char *)&parms, sizeof parms); 13131158Sminshall } 13231158Sminshall 13331158Sminshall static void 13431158Sminshall query_session_parameters(regs, sregs) 13531158Sminshall union REGS *regs; 13631158Sminshall struct SREGS *sregs; 13731158Sminshall { 13831167Sminshall QuerySessionParametersParms parms; 13931167Sminshall 14031167Sminshall movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms); 14131167Sminshall 14231168Sminshall if ((parms.rc !=0) || (parms.function_id != 0)) { 14331211Sminshall parms.rc = 0x0c; 14431211Sminshall } else if (parms.session_id != 23) { 14531211Sminshall parms.rc = 0x02; 14631167Sminshall } else { 14731211Sminshall parms.rc = 0; 14831167Sminshall parms.session_type = TYPE_DFT; 14931167Sminshall parms.session_characteristics = 0; /* Neither EAB nor PSS */ 15031167Sminshall parms.rows = MaxNumberLines; 15131167Sminshall parms.columns = MaxNumberColumns; 15231167Sminshall parms.presentation_space = 0; 15331167Sminshall } 15431211Sminshall parms.function_id = 0x6b; 15531168Sminshall movetothem(sregs->es, regs->x.di, (char *)&parms, sizeof parms); 15631158Sminshall } 15731158Sminshall 15831158Sminshall static void 15931158Sminshall query_session_cursor(regs, sregs) 16031158Sminshall union REGS *regs; 16131158Sminshall struct SREGS *sregs; 16231158Sminshall { 16331167Sminshall QuerySessionCursorParms parms; 16431167Sminshall 16531167Sminshall movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms); 16631167Sminshall 16731167Sminshall if ((parms.rc != 0) || (parms.function_id != 0)) { 16831167Sminshall parms.rc = 0x0c; 16931167Sminshall } else if (parms.session_id != 23) { 17031167Sminshall parms.rc = 0x02; 17131167Sminshall } else { 17231167Sminshall parms.rc = 0; 17331167Sminshall parms.cursor_type = CURSOR_BLINKING; /* XXX what is inhibited? */ 17431167Sminshall parms.row_address = ScreenLine(CursorAddress); 17531167Sminshall parms.column_address = ScreenLineOffset(CursorAddress); 17631167Sminshall } 17731167Sminshall 17831211Sminshall parms.function_id = 0x6b; 17931211Sminshall movetothem(sregs->es, regs->x.di, (char *) &parms, sizeof parms); 18031158Sminshall } 18131158Sminshall 18231158Sminshall /* 18331158Sminshall * Keyboard Services. 18431158Sminshall */ 18531158Sminshall 18631158Sminshall 18731158Sminshall static void 18831158Sminshall connect_to_keyboard(regs, sregs) 18931158Sminshall union REGS *regs; 19031158Sminshall struct SREGS *sregs; 19131158Sminshall { 19231167Sminshall ConnectToKeyboardParms parms; 19331167Sminshall 19431183Sminshall movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms); 19531167Sminshall 19631167Sminshall if ((parms.rc != 0) || (parms.function_id != 0)) { 19731167Sminshall parms.rc = 0x0c; 19831167Sminshall } else if (parms.session_id != 23) { 19931167Sminshall parms.rc = 0x02; 20031167Sminshall } else if (parms.intercept_options != 0) { 20131167Sminshall parms.rc = 0x01; 20231167Sminshall } else { 20331167Sminshall parms.rc = 0; 20431167Sminshall parms.first_connection_identifier = 0; 20531167Sminshall } 20631167Sminshall parms.function_id = 0x62; 20731167Sminshall 20831167Sminshall movetothem(sregs->es, regs->x.di, (char *)&parms, sizeof parms); 20931158Sminshall } 21031158Sminshall 21131158Sminshall static void 21231167Sminshall disconnect_from_keyboard(regs, sregs) 21331158Sminshall union REGS *regs; 21431158Sminshall struct SREGS *sregs; 21531158Sminshall { 21631167Sminshall DisconnectFromKeyboardParms parms; 21731167Sminshall 21831167Sminshall movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms); 21931167Sminshall 22031167Sminshall if ((parms.rc != 0) || (parms.function_id != 0)) { 22131167Sminshall parms.rc = 0x0c; 22231167Sminshall } else if (parms.session_id != 23) { 22331167Sminshall parms.rc = 0x02; 22431167Sminshall } else if (parms.connectors_task_id != 0) { 22531167Sminshall parms.rc = 04; /* XXX */ 22631167Sminshall } else { 22731167Sminshall parms.rc = 0; 22831167Sminshall } 22931167Sminshall parms.function_id = 0x62; 23031167Sminshall 23131167Sminshall movetothem(sregs->es, regs->x.di, (char *)&parms, sizeof parms); 23231158Sminshall } 23331158Sminshall 23431158Sminshall static void 23531158Sminshall write_keystroke(regs, sregs) 23631158Sminshall union REGS *regs; 23731158Sminshall struct SREGS *sregs; 23831158Sminshall { 23931198Sminshall WriteKeystrokeParms parms; 24031198Sminshall 24131198Sminshall movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms); 24231198Sminshall 24331198Sminshall if ((parms.rc != 0) || (parms.function_id != 0)) { 24431198Sminshall parms.rc = 0x0c; 24531198Sminshall } else if (parms.session_id != 23) { 24631198Sminshall parms.rc = 0x02; 24731198Sminshall } else if (parms.connectors_task_id != 0) { 24831198Sminshall parms.rc = 0x04; 24931198Sminshall } else { 25031198Sminshall parms.number_of_keys_sent = 0; 25131198Sminshall parms.rc = 0; 25231198Sminshall if (parms.options == OPTION_SINGLE_KEYSTROKE) { 25331198Sminshall KeystrokeEntry *entry = &parms.keystroke_specifier.keystroke_entry; 25431198Sminshall 25531198Sminshall if (AcceptKeystroke(entry->scancode, entry->shift_state) == 0) { 25631198Sminshall parms.rc = 0x10; /* XXX needs 0x12 too! */ 25731198Sminshall } 25831198Sminshall parms.number_of_keys_sent++; 25931198Sminshall } else if (parms.options == OPTION_MULTIPLE_KEYSTROKES) { 26031198Sminshall KeystrokeList 26131198Sminshall list, 26231198Sminshall far *atlist = parms.keystroke_specifier.keystroke_list; 26331198Sminshall KeystrokeEntry 26431198Sminshall entry[10], /* 10 at a time */ 26531198Sminshall *ourentry, 26631198Sminshall far *theirentry; 26731198Sminshall int 26831198Sminshall todo; 26931198Sminshall 27031198Sminshall movetous((char *)&list, FP_SEG(atlist), 27131198Sminshall FP_OFF(atlist), sizeof *atlist); 27231198Sminshall todo = list.length/2; 27331198Sminshall ourentry = entry+(highestof(entry)+1); 27431198Sminshall 27531198Sminshall while (todo) { 27631198Sminshall if (ourentry > &entry[highestof(entry)]) { 27731198Sminshall int thistime; 27831198Sminshall 27931198Sminshall thistime = todo; 28031198Sminshall if (thistime > numberof(entry)) { 28131198Sminshall thistime = numberof(entry); 28231198Sminshall } 28331198Sminshall movetous((char *)entry, FP_SEG(theirentry), 28431198Sminshall FP_OFF(theirentry), thistime*sizeof *theirentry); 28531198Sminshall theirentry += thistime; 28631198Sminshall ourentry = entry; 28731198Sminshall } 28831198Sminshall if (AcceptKeystroke(ourentry->scancode, 28931198Sminshall ourentry->shift_state) == 0) { 29031198Sminshall parms.rc = 0x10; /* XXX needs 0x12 too! */ 29131198Sminshall break; 29231198Sminshall } 29331198Sminshall parms.number_of_keys_sent++; 29431198Sminshall ourentry++; 29531198Sminshall todo--; 29631198Sminshall } 29731198Sminshall } else { 29831198Sminshall parms.rc = 0x01; 29931198Sminshall } 30031198Sminshall } 30131198Sminshall parms.function_id = 0x62; 30231198Sminshall 30331198Sminshall movetothem(sregs->es, regs->x.di, (char *)&parms, sizeof parms); 30431167Sminshall /* XXX */ 30531158Sminshall } 30631158Sminshall 30731167Sminshall 30831158Sminshall static void 30931167Sminshall disable_input(regs, sregs) 31031167Sminshall union REGS *regs; 31131167Sminshall struct SREGS *sregs; 31231167Sminshall { 31331167Sminshall DisableInputParms parms; 31431167Sminshall 31531167Sminshall movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms); 31631167Sminshall 31731167Sminshall if ((parms.rc != 0) || (parms.function_id != 0)) { 31831167Sminshall parms.rc = 0x0c; 31931167Sminshall } else if (parms.session_id != 23) { 32031167Sminshall parms.rc = 0x02; 32131167Sminshall } else if (parms.connectors_task_id != 0) { 32231167Sminshall parms.rc = 0x04; 32331167Sminshall } else { 32431211Sminshall SetOiaApiInhibit(&OperatorInformationArea); 32531167Sminshall parms.rc = 0; 32631167Sminshall } 32731167Sminshall parms.function_id = 0x62; 32831167Sminshall 32931167Sminshall movetothem(sregs->es, regs->x.di, (char *)&parms, sizeof parms); 33031167Sminshall } 33131167Sminshall 33231167Sminshall static void 33331158Sminshall enable_input(regs, sregs) 33431158Sminshall union REGS *regs; 33531158Sminshall struct SREGS *sregs; 33631158Sminshall { 33731167Sminshall EnableInputParms parms; 33831167Sminshall 33931167Sminshall movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms); 34031167Sminshall 34131167Sminshall if ((parms.rc != 0) || (parms.function_id != 0)) { 34231167Sminshall parms.rc = 0x0c; 34331167Sminshall } else if (parms.session_id != 23) { 34431167Sminshall parms.rc = 0x02; 34531167Sminshall } else if (parms.connectors_task_id != 0) { 34631167Sminshall parms.rc = 0x04; 34731167Sminshall } else { 34831211Sminshall ResetOiaApiInhibit(&OperatorInformationArea); 34931167Sminshall parms.rc = 0; 35031167Sminshall } 35131167Sminshall parms.function_id = 0x62; 35231167Sminshall 35331167Sminshall movetothem(sregs->es, regs->x.di, (char *)&parms, sizeof parms); 35431158Sminshall } 35531158Sminshall 35631158Sminshall /* 35731158Sminshall * Copy Services. 35831158Sminshall */ 35931158Sminshall 360*31226Sminshall copy_subroutine(target, source, parms, what_is_user) 361*31226Sminshall BufferDescriptor *target, *source; 362*31226Sminshall CopyStringParms *parms; 363*31226Sminshall int what_is_user; 364*31226Sminshall #define USER_IS_TARGET 0 365*31226Sminshall #define USER_IS_SOURCE 1 366*31226Sminshall { 367*31226Sminshall #define TARGET_NO_EAB 1 368*31226Sminshall #define SOURCE_NO_EAB 2 369*31226Sminshall #define TARGET_PC 4 370*31226Sminshall #define SOURCE_PC 8 371*31226Sminshall #define NO_FIELD_ATTRIBUTES 16 372*31226Sminshall int needtodo = 0; 373*31226Sminshall int length; 374*31226Sminshall int access_length; 375*31226Sminshall char far *input; 376*31226Sminshall char far *output; 377*31226Sminshall char far *access_pointer; 378*31226Sminshall 379*31226Sminshall if ((target->characteristics^source->characteristics) 380*31226Sminshall &CHARACTERISTIC_EAB) { 381*31226Sminshall if (target->characteristics&CHARACTERISTIC_EAB) { 382*31226Sminshall needtodo |= TARGET_NO_EAB; /* Need to bump for EAB in target */ 383*31226Sminshall } else { 384*31226Sminshall needtodo |= SOURCE_NO_EAB; /* Need to bump for EAB in source */ 385*31226Sminshall } 386*31226Sminshall } 387*31226Sminshall if (target->session_type != source->session_type) { 388*31226Sminshall if (target->session_type == TYPE_PC) { 389*31226Sminshall needtodo |= TARGET_PC; /* scan codes to PC */ 390*31226Sminshall } else { 391*31226Sminshall needtodo |= SOURCE_PC; /* PC to scan codes */ 392*31226Sminshall } 393*31226Sminshall } 394*31226Sminshall if ((parms->copy_mode©_MODE_FIELD_ATTRIBUTES) == 0) { 395*31226Sminshall needtodo |= NO_FIELD_ATTRIBUTES; 396*31226Sminshall } 397*31226Sminshall access_length = length = parms->source_end-source->begin; 398*31226Sminshall if (what_is_user == USER_IS_TARGET) { 399*31226Sminshall if (target->characteristics&CHARACTERISTIC_EAB) { 400*31226Sminshall access_length *= 2; 401*31226Sminshall } 402*31226Sminshall input = (char far *) &Host[source->begin]; 403*31226Sminshall access_pointer = target->buffer; 404*31226Sminshall output = access(target->buffer, access_length); 405*31226Sminshall } else { 406*31226Sminshall if (source->characteristics&CHARACTERISTIC_EAB) { 407*31226Sminshall access_length *= 2; 408*31226Sminshall } 409*31226Sminshall access_pointer = source->buffer; 410*31226Sminshall input = access(source->buffer, access_length); 411*31226Sminshall output = (char far *) &Host[target->begin]; 412*31226Sminshall } 413*31226Sminshall while (length--) { 414*31226Sminshall if (needtodo&TARGET_PC) { 415*31226Sminshall *output++ = disp_asc[*input++]; 416*31226Sminshall } else if (needtodo&SOURCE_PC) { 417*31226Sminshall *output++ = asc_disp[*input++]; 418*31226Sminshall } else { 419*31226Sminshall *output++ = *input++; 420*31226Sminshall } 421*31226Sminshall if (needtodo&TARGET_NO_EAB) { 422*31226Sminshall *input++; 423*31226Sminshall } else if (needtodo&SOURCE_NO_EAB) { 424*31226Sminshall *output++ = 0; /* Should figure out good EAB? */ 425*31226Sminshall } 426*31226Sminshall } 427*31226Sminshall if (what_is_user == USER_IS_TARGET) { 428*31226Sminshall unaccess(target->buffer, access_pointer, access_length); 429*31226Sminshall } else { 430*31226Sminshall unaccess(source->buffer, access_pointer, access_length); 431*31226Sminshall } 432*31226Sminshall } 433*31226Sminshall 434*31226Sminshall 43531158Sminshall static void 43631167Sminshall copy_string(regs, sregs) 43731158Sminshall union REGS *regs; 43831158Sminshall struct SREGS *sregs; 43931158Sminshall { 44031167Sminshall CopyStringParms parms; 441*31226Sminshall BufferDescriptor *target = &parms.target, *source = &parms.source; 442*31226Sminshall int length; 44331167Sminshall 44431167Sminshall movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms); 44531167Sminshall 44631167Sminshall if ((parms.rc != 0) || (parms.function_id !=0)) { 44731167Sminshall parms.rc = 0x0c; 448*31226Sminshall } else if (target->session_id == 0) { /* Target is buffer */ 449*31226Sminshall if (source->session_id != 23) { /* A no-no */ 450*31226Sminshall parms.rc = 0x2; 451*31226Sminshall } else { 452*31226Sminshall if ((source->characteristics == target->characteristics) && 453*31226Sminshall (source->session_type == target->session_type)) { 454*31226Sminshall length = parms.source_end-source->begin; 455*31226Sminshall if (source->characteristics&CHARACTERISTIC_EAB) { 456*31226Sminshall length *= 2; 457*31226Sminshall } 458*31226Sminshall movetothem( (int) FP_SEG(target->buffer), 459*31226Sminshall (int) FP_OFF(target->buffer), 460*31226Sminshall (char *)&Host[source->begin], length); 461*31226Sminshall } else { 462*31226Sminshall copy_subroutine(target, source, &parms, USER_IS_TARGET); 463*31226Sminshall } 464*31226Sminshall } 465*31226Sminshall } else if (source->session_id != 0) { 466*31226Sminshall parms.rc = 0xd; 467*31226Sminshall } else { 468*31226Sminshall if ((source->characteristics == target->characteristics) && 469*31226Sminshall (source->session_type == target->session_type)) { 470*31226Sminshall length = parms.source_end-source->begin; 471*31226Sminshall if (source->characteristics&CHARACTERISTIC_EAB) { 472*31226Sminshall length *= 2; 473*31226Sminshall } 474*31226Sminshall movetous((char *)&Host[target->begin], 475*31226Sminshall (int) FP_SEG(source->buffer), 476*31226Sminshall (int) FP_OFF(source->buffer), length); 477*31226Sminshall } else { 478*31226Sminshall copy_subroutine(target, source, &parms, USER_IS_SOURCE); 479*31226Sminshall } 48031167Sminshall } 48131183Sminshall movetothem(sregs->es, regs->x.di, (char *)&parms, sizeof parms); 48231158Sminshall } 48331158Sminshall /* 48431158Sminshall * Operator Information Area Services. 48531158Sminshall */ 48631158Sminshall 48731158Sminshall static void 48831158Sminshall read_oia_group(regs, sregs) 48931158Sminshall union REGS *regs; 49031158Sminshall struct SREGS *sregs; 49131158Sminshall { 49231167Sminshall ReadOiaGroupParms parms; 49331167Sminshall 49431167Sminshall movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms); 49531167Sminshall 49631167Sminshall if ((parms.rc != 0) || (parms.function_id != 0)) { 49731167Sminshall parms.rc = 0x0c; 49831167Sminshall } else if (parms.session_id != 23) { 49931167Sminshall parms.rc = 0x02; 50031167Sminshall } else { 50131167Sminshall int group = parms.oia_group_number; 50231193Sminshall char *from; 50331193Sminshall int size; 50431167Sminshall 50531211Sminshall if ((group != API_OIA_ALL_GROUPS) && 50631211Sminshall ((group > API_OIA_LAST_LEGAL_GROUP) || (group < 0))) { 50731193Sminshall } else { 50831193Sminshall if (group == API_OIA_ALL_GROUPS) { 50931193Sminshall size = API_OIA_BYTES_ALL_GROUPS; 51031193Sminshall from = (char *)&OperatorInformationArea; 51131193Sminshall } else if (group == API_OIA_INPUT_INHIBITED) { 51231193Sminshall size = sizeof OperatorInformationArea.input_inhibited; 51331193Sminshall from = (char *)&OperatorInformationArea.input_inhibited[0]; 51431193Sminshall } else { 51531193Sminshall size = 1; 51631193Sminshall from = ((char *)&OperatorInformationArea)+group; 51731193Sminshall } 51831193Sminshall movetothem(FP_SEG(parms.oia_buffer), FP_OFF(parms.oia_buffer), 51931193Sminshall from, size); 52031168Sminshall } 52131167Sminshall } 52231168Sminshall parms.function_id = 0x6d; 52331167Sminshall movetothem(sregs->es, regs->x.di, (char *)&parms, sizeof parms); 52431158Sminshall } 52531158Sminshall 52631158Sminshall static void 52731158Sminshall unknown_op(regs, sregs) 52831158Sminshall union REGS *regs; 52931158Sminshall struct SREGS *sregs; 53031158Sminshall { 53131158Sminshall regs->h.ch = 0x12; 53231158Sminshall regs->h.cl = 0x05; 53331158Sminshall } 53431158Sminshall 53531158Sminshall 53631158Sminshall handle_api(regs, sregs) 53731158Sminshall union REGS *regs; 53831158Sminshall struct SREGS *sregs; 53931158Sminshall { 54031158Sminshall if (regs->h.ah == NAME_RESOLUTION) { 54131158Sminshall name_resolution(regs, sregs); 54231168Sminshall } else if (regs->h.ah != 0x09) { 54331168Sminshall regs->h.ch = 0x12; 54431168Sminshall regs->h.cl = 0x0f; /* XXX Invalid environmental access */ 54531168Sminshall } else if (regs->x.bx != 0x8020) { 54631168Sminshall regs->h.ch = 0x12; 54731168Sminshall regs->h.cl = 0x08; /* XXX Invalid wait specified */ 54831168Sminshall } else if (regs->h.ch != 0) { 54931211Sminshall regs->x.cx = 0x1206; /* XXX Invalid priority */ 55031158Sminshall } else { 55131158Sminshall switch (regs->x.dx) { 55231158Sminshall case GATE_SESSMGR: 55331158Sminshall switch (regs->h.al) { 55431158Sminshall case QUERY_SESSION_ID: 55531168Sminshall if (regs->h.cl != 0) { 55631211Sminshall regs->x.cx = 0x1206; 55731168Sminshall } else { 55831211Sminshall regs->x.cx = 0x1200; 55931168Sminshall query_session_id(regs, sregs); 56031168Sminshall } 56131158Sminshall break; 56231211Sminshall case QUERY_SESSION_PARAMETERS: 56331168Sminshall if (regs->h.cl != 0) { 56431211Sminshall regs->x.cx = 0x1206; 56531168Sminshall } else { 56631211Sminshall regs->x.cx = 0x1200; 56731193Sminshall query_session_parameters(regs, sregs); 56831168Sminshall } 56931158Sminshall break; 57031158Sminshall case QUERY_SESSION_CURSOR: 57131168Sminshall if (regs->h.cl != 0xff) { 57231211Sminshall regs->x.cx = 0x1206; 57331168Sminshall } else { 57431211Sminshall regs->x.cx = 0x1200; 57531168Sminshall query_session_cursor(regs, sregs); 57631168Sminshall } 57731158Sminshall break; 57831158Sminshall default: 57931158Sminshall unknown_op(regs, sregs); 58031158Sminshall break; 58131158Sminshall } 58231158Sminshall break; 58331158Sminshall case GATE_KEYBOARD: 58431168Sminshall if (regs->h.cl != 00) { 58531211Sminshall regs->x.cx = 0x1206; 58631168Sminshall } else { 58731211Sminshall regs->x.cx = 0x1200; 58831168Sminshall switch (regs->h.al) { 58931168Sminshall case CONNECT_TO_KEYBOARD: 59031168Sminshall connect_to_keyboard(regs, sregs); 59131168Sminshall break; 59231168Sminshall case DISABLE_INPUT: 59331168Sminshall disable_input(regs, sregs); 59431168Sminshall break; 59531168Sminshall case WRITE_KEYSTROKE: 59631168Sminshall write_keystroke(regs, sregs); 59731168Sminshall break; 59831168Sminshall case ENABLE_INPUT: 59931168Sminshall enable_input(regs, sregs); 60031168Sminshall break; 60131168Sminshall case DISCONNECT_FROM_KEYBOARD: 60231168Sminshall disconnect_from_keyboard(regs, sregs); 60331168Sminshall break; 60431168Sminshall default: 60531168Sminshall unknown_op(regs, sregs); 60631168Sminshall break; 60731168Sminshall } 60831158Sminshall } 60931158Sminshall break; 61031158Sminshall case GATE_COPY: 61131168Sminshall if (regs->h.cl != 0xff) { 61231211Sminshall regs->x.cx = 0x1206; 61331168Sminshall } else { 61431211Sminshall regs->x.cx = 0x1200; 61531168Sminshall switch (regs->h.al) { 61631168Sminshall case COPY_STRING: 61731168Sminshall copy_string(regs, sregs); 61831168Sminshall break; 61931168Sminshall default: 62031168Sminshall unknown_op(regs, sregs); 62131168Sminshall break; 62231168Sminshall } 62331158Sminshall } 62431158Sminshall break; 62531158Sminshall case GATE_OIAM: 62631168Sminshall if (regs->h.cl != 0xff) { 62731211Sminshall regs->x.cx = 0x1206; 62831168Sminshall } else { 62931211Sminshall regs->x.cx = 0x1200; 63031168Sminshall switch (regs->h.al) { 63131168Sminshall case READ_OIA_GROUP: 63231168Sminshall read_oia_group(regs, sregs); 63331168Sminshall break; 63431168Sminshall default: 63531168Sminshall unknown_op(regs, sregs); 63631168Sminshall break; 63731168Sminshall } 63831158Sminshall } 63931158Sminshall break; 64031158Sminshall default: 64131168Sminshall regs->h.ch = 0x12; 64231168Sminshall regs->h.cl = 0x34; /* Invalid GATE entry */ 64331158Sminshall break; 64431158Sminshall } 64531158Sminshall } 64631158Sminshall } 647