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 1031226Sminshall #include "../ascii/disp_asc.h" 1131226Sminshall 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*31470Sminshall #define access_api(foo,length) (foo) 29*31470Sminshall #define unaccess_api(foo,goo,length) 3031226Sminshall 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 5331226Sminshall #if defined(unix) 54*31470Sminshall extern char *access_api(), *unaccess_api(); 5531226Sminshall #endif /* defined(unix) */ 5631226Sminshall 57*31470Sminshall 5831193Sminshall /* 5931158Sminshall * Supervisor Services. 6031158Sminshall */ 6131158Sminshall 6231158Sminshall static void 6331193Sminshall name_resolution(regs, sregs) 6431158Sminshall union REGS *regs; 6531158Sminshall struct SREGS *sregs; 6631158Sminshall { 6731167Sminshall NameResolveParms parms; 6831161Sminshall 6931167Sminshall movetous((char *) &parms, sregs->es, regs->x.di, sizeof parms); 7031161Sminshall 7131161Sminshall regs->h.cl = 0; 7231193Sminshall if (memcmp((char *)&parms, NAME_SESSMGR, sizeof parms.gate_name) == 0) { 7331161Sminshall regs->x.dx = GATE_SESSMGR; 7431193Sminshall } else if (memcmp((char *)&parms, NAME_KEYBOARD, 7531193Sminshall sizeof parms.gate_name) == 0) { 7631161Sminshall regs->x.dx = GATE_KEYBOARD; 7731193Sminshall } else if (memcmp((char *)&parms, NAME_COPY, sizeof parms.gate_name) == 0) { 7831161Sminshall regs->x.dx = GATE_COPY; 7931193Sminshall } else if (memcmp((char *)&parms, NAME_OIAM, sizeof parms.gate_name) == 0) { 8031161Sminshall regs->x.dx = GATE_OIAM; 8131161Sminshall } else { 8231161Sminshall regs->h.cl = 0x2e; /* Name not found */ 8331161Sminshall } 8431161Sminshall regs->h.ch = 0x12; 8531161Sminshall regs->h.bh = 7; 8631158Sminshall } 8731158Sminshall 8831158Sminshall /* 8931158Sminshall * Session Information Services. 9031158Sminshall */ 9131158Sminshall 9231158Sminshall static void 9331158Sminshall query_session_id(regs, sregs) 9431158Sminshall union REGS *regs; 9531158Sminshall struct SREGS *sregs; 9631158Sminshall { 9731167Sminshall QuerySessionIdParms parms; 9831161Sminshall 9931167Sminshall movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms); 10031161Sminshall 10131211Sminshall if ((parms.rc != 0) || (parms.function_id != 0)) { 10231211Sminshall parms.rc = 0x0c; 10331211Sminshall } else if (parms.option_code != 0x01) { 10431211Sminshall parms.rc = 0x0d; /* Invalid option code */ 10531167Sminshall } else if (parms.data_code != 0x45) { 10631211Sminshall parms.rc = 0x0b; 10731161Sminshall } else { 10831168Sminshall NameArray list; 10931167Sminshall NameArrayElement element; 11031167Sminshall 11131167Sminshall movetous((char *)&list, FP_SEG(parms.name_array), 11231193Sminshall FP_OFF(parms.name_array), sizeof list); 11331168Sminshall if ((list.length < 14) || (list.length > 170)) { 11431167Sminshall parms.rc = 0x12; 11531161Sminshall } else { 11631167Sminshall list.number_matching_session = 1; 11731167Sminshall list.name_array_element.short_name = parms.data_code; 11831167Sminshall list.name_array_element.type = TYPE_DFT; 11931167Sminshall list.name_array_element.session_id = 23; 12031167Sminshall memcpy(list.name_array_element.long_name, "ONLYSESS", 12131167Sminshall sizeof list.name_array_element.long_name); 12231167Sminshall movetothem(FP_SEG(parms.name_array), 12331193Sminshall FP_OFF(parms.name_array), (char *)&list, sizeof list); 12431167Sminshall parms.rc = 0; 12531161Sminshall } 12631161Sminshall } 12731211Sminshall parms.function_id = 0x6b; 12831167Sminshall movetothem(sregs->es, regs->x.di, (char *)&parms, sizeof parms); 12931158Sminshall } 13031158Sminshall 13131158Sminshall static void 13231158Sminshall query_session_parameters(regs, sregs) 13331158Sminshall union REGS *regs; 13431158Sminshall struct SREGS *sregs; 13531158Sminshall { 13631167Sminshall QuerySessionParametersParms parms; 13731167Sminshall 13831167Sminshall movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms); 13931167Sminshall 14031168Sminshall if ((parms.rc !=0) || (parms.function_id != 0)) { 14131211Sminshall parms.rc = 0x0c; 14231211Sminshall } else if (parms.session_id != 23) { 14331211Sminshall parms.rc = 0x02; 14431167Sminshall } else { 14531211Sminshall parms.rc = 0; 14631167Sminshall parms.session_type = TYPE_DFT; 14731167Sminshall parms.session_characteristics = 0; /* Neither EAB nor PSS */ 14831167Sminshall parms.rows = MaxNumberLines; 14931167Sminshall parms.columns = MaxNumberColumns; 15031167Sminshall parms.presentation_space = 0; 15131167Sminshall } 15231211Sminshall parms.function_id = 0x6b; 15331168Sminshall movetothem(sregs->es, regs->x.di, (char *)&parms, sizeof parms); 15431158Sminshall } 15531158Sminshall 15631158Sminshall static void 15731158Sminshall query_session_cursor(regs, sregs) 15831158Sminshall union REGS *regs; 15931158Sminshall struct SREGS *sregs; 16031158Sminshall { 16131167Sminshall QuerySessionCursorParms parms; 16231167Sminshall 16331167Sminshall movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms); 16431167Sminshall 16531167Sminshall if ((parms.rc != 0) || (parms.function_id != 0)) { 16631167Sminshall parms.rc = 0x0c; 16731167Sminshall } else if (parms.session_id != 23) { 16831167Sminshall parms.rc = 0x02; 16931167Sminshall } else { 17031167Sminshall parms.rc = 0; 17131167Sminshall parms.cursor_type = CURSOR_BLINKING; /* XXX what is inhibited? */ 17231167Sminshall parms.row_address = ScreenLine(CursorAddress); 17331167Sminshall parms.column_address = ScreenLineOffset(CursorAddress); 17431167Sminshall } 17531167Sminshall 17631211Sminshall parms.function_id = 0x6b; 17731211Sminshall movetothem(sregs->es, regs->x.di, (char *) &parms, sizeof parms); 17831158Sminshall } 17931158Sminshall 18031158Sminshall /* 18131158Sminshall * Keyboard Services. 18231158Sminshall */ 18331158Sminshall 18431158Sminshall 18531158Sminshall static void 18631158Sminshall connect_to_keyboard(regs, sregs) 18731158Sminshall union REGS *regs; 18831158Sminshall struct SREGS *sregs; 18931158Sminshall { 19031167Sminshall ConnectToKeyboardParms parms; 19131167Sminshall 19231183Sminshall movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms); 19331167Sminshall 19431167Sminshall if ((parms.rc != 0) || (parms.function_id != 0)) { 19531167Sminshall parms.rc = 0x0c; 19631167Sminshall } else if (parms.session_id != 23) { 19731167Sminshall parms.rc = 0x02; 19831167Sminshall } else if (parms.intercept_options != 0) { 19931167Sminshall parms.rc = 0x01; 20031167Sminshall } else { 20131167Sminshall parms.rc = 0; 20231167Sminshall parms.first_connection_identifier = 0; 20331167Sminshall } 20431167Sminshall parms.function_id = 0x62; 20531167Sminshall 20631167Sminshall movetothem(sregs->es, regs->x.di, (char *)&parms, sizeof parms); 20731158Sminshall } 20831158Sminshall 20931158Sminshall static void 21031167Sminshall disconnect_from_keyboard(regs, sregs) 21131158Sminshall union REGS *regs; 21231158Sminshall struct SREGS *sregs; 21331158Sminshall { 21431167Sminshall DisconnectFromKeyboardParms parms; 21531167Sminshall 21631167Sminshall movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms); 21731167Sminshall 21831167Sminshall if ((parms.rc != 0) || (parms.function_id != 0)) { 21931167Sminshall parms.rc = 0x0c; 22031167Sminshall } else if (parms.session_id != 23) { 22131167Sminshall parms.rc = 0x02; 22231167Sminshall } else if (parms.connectors_task_id != 0) { 22331167Sminshall parms.rc = 04; /* XXX */ 22431167Sminshall } else { 22531167Sminshall parms.rc = 0; 22631167Sminshall } 22731167Sminshall parms.function_id = 0x62; 22831167Sminshall 22931167Sminshall movetothem(sregs->es, regs->x.di, (char *)&parms, sizeof parms); 23031158Sminshall } 23131158Sminshall 23231158Sminshall static void 23331158Sminshall write_keystroke(regs, sregs) 23431158Sminshall union REGS *regs; 23531158Sminshall struct SREGS *sregs; 23631158Sminshall { 23731198Sminshall WriteKeystrokeParms parms; 23831198Sminshall 23931198Sminshall movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms); 24031198Sminshall 24131198Sminshall if ((parms.rc != 0) || (parms.function_id != 0)) { 24231198Sminshall parms.rc = 0x0c; 24331198Sminshall } else if (parms.session_id != 23) { 24431198Sminshall parms.rc = 0x02; 24531198Sminshall } else if (parms.connectors_task_id != 0) { 24631198Sminshall parms.rc = 0x04; 24731198Sminshall } else { 24831198Sminshall parms.number_of_keys_sent = 0; 24931198Sminshall parms.rc = 0; 25031198Sminshall if (parms.options == OPTION_SINGLE_KEYSTROKE) { 25131198Sminshall KeystrokeEntry *entry = &parms.keystroke_specifier.keystroke_entry; 25231198Sminshall 25331198Sminshall if (AcceptKeystroke(entry->scancode, entry->shift_state) == 0) { 25431198Sminshall parms.rc = 0x10; /* XXX needs 0x12 too! */ 25531198Sminshall } 25631198Sminshall parms.number_of_keys_sent++; 25731198Sminshall } else if (parms.options == OPTION_MULTIPLE_KEYSTROKES) { 25831198Sminshall KeystrokeList 25931198Sminshall list, 26031198Sminshall far *atlist = parms.keystroke_specifier.keystroke_list; 26131198Sminshall KeystrokeEntry 26231198Sminshall entry[10], /* 10 at a time */ 26331198Sminshall *ourentry, 26431198Sminshall far *theirentry; 26531198Sminshall int 26631198Sminshall todo; 26731198Sminshall 26831198Sminshall movetous((char *)&list, FP_SEG(atlist), 26931198Sminshall FP_OFF(atlist), sizeof *atlist); 27031198Sminshall todo = list.length/2; 27131198Sminshall ourentry = entry+(highestof(entry)+1); 27231198Sminshall 27331198Sminshall while (todo) { 27431198Sminshall if (ourentry > &entry[highestof(entry)]) { 27531198Sminshall int thistime; 27631198Sminshall 27731198Sminshall thistime = todo; 27831198Sminshall if (thistime > numberof(entry)) { 27931198Sminshall thistime = numberof(entry); 28031198Sminshall } 28131198Sminshall movetous((char *)entry, FP_SEG(theirentry), 28231198Sminshall FP_OFF(theirentry), thistime*sizeof *theirentry); 28331198Sminshall theirentry += thistime; 28431198Sminshall ourentry = entry; 28531198Sminshall } 28631198Sminshall if (AcceptKeystroke(ourentry->scancode, 28731198Sminshall ourentry->shift_state) == 0) { 28831198Sminshall parms.rc = 0x10; /* XXX needs 0x12 too! */ 28931198Sminshall break; 29031198Sminshall } 29131198Sminshall parms.number_of_keys_sent++; 29231198Sminshall ourentry++; 29331198Sminshall todo--; 29431198Sminshall } 29531198Sminshall } else { 29631198Sminshall parms.rc = 0x01; 29731198Sminshall } 29831198Sminshall } 29931198Sminshall parms.function_id = 0x62; 30031198Sminshall 30131198Sminshall movetothem(sregs->es, regs->x.di, (char *)&parms, sizeof parms); 30231167Sminshall /* XXX */ 30331158Sminshall } 30431158Sminshall 30531167Sminshall 30631158Sminshall static void 30731167Sminshall disable_input(regs, sregs) 30831167Sminshall union REGS *regs; 30931167Sminshall struct SREGS *sregs; 31031167Sminshall { 31131167Sminshall DisableInputParms parms; 31231167Sminshall 31331167Sminshall movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms); 31431167Sminshall 31531167Sminshall if ((parms.rc != 0) || (parms.function_id != 0)) { 31631167Sminshall parms.rc = 0x0c; 31731167Sminshall } else if (parms.session_id != 23) { 31831167Sminshall parms.rc = 0x02; 31931167Sminshall } else if (parms.connectors_task_id != 0) { 32031167Sminshall parms.rc = 0x04; 32131167Sminshall } else { 32231211Sminshall SetOiaApiInhibit(&OperatorInformationArea); 32331167Sminshall parms.rc = 0; 32431167Sminshall } 32531167Sminshall parms.function_id = 0x62; 32631167Sminshall 32731167Sminshall movetothem(sregs->es, regs->x.di, (char *)&parms, sizeof parms); 32831167Sminshall } 32931167Sminshall 33031167Sminshall static void 33131158Sminshall enable_input(regs, sregs) 33231158Sminshall union REGS *regs; 33331158Sminshall struct SREGS *sregs; 33431158Sminshall { 33531167Sminshall EnableInputParms parms; 33631167Sminshall 33731167Sminshall movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms); 33831167Sminshall 33931167Sminshall if ((parms.rc != 0) || (parms.function_id != 0)) { 34031167Sminshall parms.rc = 0x0c; 34131167Sminshall } else if (parms.session_id != 23) { 34231167Sminshall parms.rc = 0x02; 34331167Sminshall } else if (parms.connectors_task_id != 0) { 34431167Sminshall parms.rc = 0x04; 34531167Sminshall } else { 34631211Sminshall ResetOiaApiInhibit(&OperatorInformationArea); 34731167Sminshall parms.rc = 0; 34831167Sminshall } 34931167Sminshall parms.function_id = 0x62; 35031167Sminshall 35131167Sminshall movetothem(sregs->es, regs->x.di, (char *)&parms, sizeof parms); 35231158Sminshall } 35331158Sminshall 35431158Sminshall /* 35531158Sminshall * Copy Services. 35631158Sminshall */ 35731158Sminshall 35831226Sminshall copy_subroutine(target, source, parms, what_is_user) 35931226Sminshall BufferDescriptor *target, *source; 36031226Sminshall CopyStringParms *parms; 36131226Sminshall int what_is_user; 36231226Sminshall #define USER_IS_TARGET 0 36331226Sminshall #define USER_IS_SOURCE 1 36431226Sminshall { 36531226Sminshall #define TARGET_NO_EAB 1 36631226Sminshall #define SOURCE_NO_EAB 2 36731226Sminshall #define TARGET_PC 4 36831226Sminshall #define SOURCE_PC 8 36931226Sminshall #define NO_FIELD_ATTRIBUTES 16 37031226Sminshall int needtodo = 0; 37131226Sminshall int length; 37231226Sminshall int access_length; 37331226Sminshall char far *input; 37431226Sminshall char far *output; 37531226Sminshall char far *access_pointer; 37631226Sminshall 37731226Sminshall if ((target->characteristics^source->characteristics) 37831226Sminshall &CHARACTERISTIC_EAB) { 37931226Sminshall if (target->characteristics&CHARACTERISTIC_EAB) { 38031226Sminshall needtodo |= TARGET_NO_EAB; /* Need to bump for EAB in target */ 38131226Sminshall } else { 38231226Sminshall needtodo |= SOURCE_NO_EAB; /* Need to bump for EAB in source */ 38331226Sminshall } 38431226Sminshall } 38531226Sminshall if (target->session_type != source->session_type) { 38631226Sminshall if (target->session_type == TYPE_PC) { 38731226Sminshall needtodo |= TARGET_PC; /* scan codes to PC */ 38831226Sminshall } else { 38931226Sminshall needtodo |= SOURCE_PC; /* PC to scan codes */ 39031226Sminshall } 39131226Sminshall } 39231226Sminshall if ((parms->copy_mode©_MODE_FIELD_ATTRIBUTES) == 0) { 39331226Sminshall needtodo |= NO_FIELD_ATTRIBUTES; 39431226Sminshall } 39531226Sminshall access_length = length = parms->source_end-source->begin; 39631226Sminshall if (what_is_user == USER_IS_TARGET) { 39731226Sminshall if (target->characteristics&CHARACTERISTIC_EAB) { 39831226Sminshall access_length *= 2; 39931226Sminshall } 40031226Sminshall input = (char far *) &Host[source->begin]; 40131226Sminshall access_pointer = target->buffer; 402*31470Sminshall output = access_api(target->buffer, access_length); 40331226Sminshall } else { 40431226Sminshall if (source->characteristics&CHARACTERISTIC_EAB) { 40531226Sminshall access_length *= 2; 40631226Sminshall } 40731226Sminshall access_pointer = source->buffer; 408*31470Sminshall input = access_api(source->buffer, access_length); 40931226Sminshall output = (char far *) &Host[target->begin]; 41031226Sminshall } 41131226Sminshall while (length--) { 41231226Sminshall if (needtodo&TARGET_PC) { 41331226Sminshall *output++ = disp_asc[*input++]; 41431226Sminshall } else if (needtodo&SOURCE_PC) { 41531226Sminshall *output++ = asc_disp[*input++]; 41631226Sminshall } else { 41731226Sminshall *output++ = *input++; 41831226Sminshall } 41931226Sminshall if (needtodo&TARGET_NO_EAB) { 42031226Sminshall *input++; 42131226Sminshall } else if (needtodo&SOURCE_NO_EAB) { 42231226Sminshall *output++ = 0; /* Should figure out good EAB? */ 42331226Sminshall } 42431226Sminshall } 42531226Sminshall if (what_is_user == USER_IS_TARGET) { 426*31470Sminshall unaccess_api(target->buffer, access_pointer, access_length); 42731226Sminshall } else { 428*31470Sminshall unaccess_api(source->buffer, access_pointer, access_length); 42931226Sminshall } 43031226Sminshall } 43131226Sminshall 43231226Sminshall 43331158Sminshall static void 43431167Sminshall copy_string(regs, sregs) 43531158Sminshall union REGS *regs; 43631158Sminshall struct SREGS *sregs; 43731158Sminshall { 43831167Sminshall CopyStringParms parms; 43931226Sminshall BufferDescriptor *target = &parms.target, *source = &parms.source; 44031226Sminshall int length; 44131167Sminshall 44231167Sminshall movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms); 44331167Sminshall 44431167Sminshall if ((parms.rc != 0) || (parms.function_id !=0)) { 44531167Sminshall parms.rc = 0x0c; 44631226Sminshall } else if (target->session_id == 0) { /* Target is buffer */ 44731226Sminshall if (source->session_id != 23) { /* A no-no */ 44831226Sminshall parms.rc = 0x2; 44931226Sminshall } else { 45031226Sminshall if ((source->characteristics == target->characteristics) && 45131226Sminshall (source->session_type == target->session_type)) { 45231226Sminshall length = parms.source_end-source->begin; 45331226Sminshall if (source->characteristics&CHARACTERISTIC_EAB) { 45431226Sminshall length *= 2; 45531226Sminshall } 45631226Sminshall movetothem( (int) FP_SEG(target->buffer), 45731226Sminshall (int) FP_OFF(target->buffer), 45831226Sminshall (char *)&Host[source->begin], length); 45931226Sminshall } else { 46031226Sminshall copy_subroutine(target, source, &parms, USER_IS_TARGET); 46131226Sminshall } 46231226Sminshall } 46331226Sminshall } else if (source->session_id != 0) { 46431226Sminshall parms.rc = 0xd; 46531226Sminshall } else { 46631226Sminshall if ((source->characteristics == target->characteristics) && 46731226Sminshall (source->session_type == target->session_type)) { 46831226Sminshall length = parms.source_end-source->begin; 46931226Sminshall if (source->characteristics&CHARACTERISTIC_EAB) { 47031226Sminshall length *= 2; 47131226Sminshall } 47231226Sminshall movetous((char *)&Host[target->begin], 47331226Sminshall (int) FP_SEG(source->buffer), 47431226Sminshall (int) FP_OFF(source->buffer), length); 47531226Sminshall } else { 47631226Sminshall copy_subroutine(target, source, &parms, USER_IS_SOURCE); 47731226Sminshall } 47831167Sminshall } 47931183Sminshall movetothem(sregs->es, regs->x.di, (char *)&parms, sizeof parms); 48031158Sminshall } 48131158Sminshall /* 48231158Sminshall * Operator Information Area Services. 48331158Sminshall */ 48431158Sminshall 48531158Sminshall static void 48631158Sminshall read_oia_group(regs, sregs) 48731158Sminshall union REGS *regs; 48831158Sminshall struct SREGS *sregs; 48931158Sminshall { 49031167Sminshall ReadOiaGroupParms parms; 49131167Sminshall 49231167Sminshall movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms); 49331167Sminshall 49431167Sminshall if ((parms.rc != 0) || (parms.function_id != 0)) { 49531167Sminshall parms.rc = 0x0c; 49631167Sminshall } else if (parms.session_id != 23) { 49731167Sminshall parms.rc = 0x02; 49831167Sminshall } else { 49931167Sminshall int group = parms.oia_group_number; 50031193Sminshall char *from; 50131193Sminshall int size; 50231167Sminshall 50331211Sminshall if ((group != API_OIA_ALL_GROUPS) && 50431211Sminshall ((group > API_OIA_LAST_LEGAL_GROUP) || (group < 0))) { 50531193Sminshall } else { 50631193Sminshall if (group == API_OIA_ALL_GROUPS) { 50731193Sminshall size = API_OIA_BYTES_ALL_GROUPS; 50831193Sminshall from = (char *)&OperatorInformationArea; 50931193Sminshall } else if (group == API_OIA_INPUT_INHIBITED) { 51031193Sminshall size = sizeof OperatorInformationArea.input_inhibited; 51131193Sminshall from = (char *)&OperatorInformationArea.input_inhibited[0]; 51231193Sminshall } else { 51331193Sminshall size = 1; 51431193Sminshall from = ((char *)&OperatorInformationArea)+group; 51531193Sminshall } 51631193Sminshall movetothem(FP_SEG(parms.oia_buffer), FP_OFF(parms.oia_buffer), 51731193Sminshall from, size); 51831168Sminshall } 51931167Sminshall } 52031168Sminshall parms.function_id = 0x6d; 52131167Sminshall movetothem(sregs->es, regs->x.di, (char *)&parms, sizeof parms); 52231158Sminshall } 52331158Sminshall 52431158Sminshall static void 52531158Sminshall unknown_op(regs, sregs) 52631158Sminshall union REGS *regs; 52731158Sminshall struct SREGS *sregs; 52831158Sminshall { 52931158Sminshall regs->h.ch = 0x12; 53031158Sminshall regs->h.cl = 0x05; 53131158Sminshall } 53231158Sminshall 53331158Sminshall 53431158Sminshall handle_api(regs, sregs) 53531158Sminshall union REGS *regs; 53631158Sminshall struct SREGS *sregs; 53731158Sminshall { 53831158Sminshall if (regs->h.ah == NAME_RESOLUTION) { 53931158Sminshall name_resolution(regs, sregs); 54031168Sminshall } else if (regs->h.ah != 0x09) { 54131168Sminshall regs->h.ch = 0x12; 54231168Sminshall regs->h.cl = 0x0f; /* XXX Invalid environmental access */ 54331168Sminshall } else if (regs->x.bx != 0x8020) { 54431168Sminshall regs->h.ch = 0x12; 54531168Sminshall regs->h.cl = 0x08; /* XXX Invalid wait specified */ 54631168Sminshall } else if (regs->h.ch != 0) { 54731211Sminshall regs->x.cx = 0x1206; /* XXX Invalid priority */ 54831158Sminshall } else { 54931158Sminshall switch (regs->x.dx) { 55031158Sminshall case GATE_SESSMGR: 55131158Sminshall switch (regs->h.al) { 55231158Sminshall case QUERY_SESSION_ID: 55331168Sminshall if (regs->h.cl != 0) { 55431211Sminshall regs->x.cx = 0x1206; 55531168Sminshall } else { 55631211Sminshall regs->x.cx = 0x1200; 55731168Sminshall query_session_id(regs, sregs); 55831168Sminshall } 55931158Sminshall break; 56031211Sminshall case QUERY_SESSION_PARAMETERS: 56131168Sminshall if (regs->h.cl != 0) { 56231211Sminshall regs->x.cx = 0x1206; 56331168Sminshall } else { 56431211Sminshall regs->x.cx = 0x1200; 56531193Sminshall query_session_parameters(regs, sregs); 56631168Sminshall } 56731158Sminshall break; 56831158Sminshall case QUERY_SESSION_CURSOR: 56931168Sminshall if (regs->h.cl != 0xff) { 57031211Sminshall regs->x.cx = 0x1206; 57131168Sminshall } else { 57231211Sminshall regs->x.cx = 0x1200; 57331168Sminshall query_session_cursor(regs, sregs); 57431168Sminshall } 57531158Sminshall break; 57631158Sminshall default: 57731158Sminshall unknown_op(regs, sregs); 57831158Sminshall break; 57931158Sminshall } 58031158Sminshall break; 58131158Sminshall case GATE_KEYBOARD: 58231168Sminshall if (regs->h.cl != 00) { 58331211Sminshall regs->x.cx = 0x1206; 58431168Sminshall } else { 58531211Sminshall regs->x.cx = 0x1200; 58631168Sminshall switch (regs->h.al) { 58731168Sminshall case CONNECT_TO_KEYBOARD: 58831168Sminshall connect_to_keyboard(regs, sregs); 58931168Sminshall break; 59031168Sminshall case DISABLE_INPUT: 59131168Sminshall disable_input(regs, sregs); 59231168Sminshall break; 59331168Sminshall case WRITE_KEYSTROKE: 59431168Sminshall write_keystroke(regs, sregs); 59531168Sminshall break; 59631168Sminshall case ENABLE_INPUT: 59731168Sminshall enable_input(regs, sregs); 59831168Sminshall break; 59931168Sminshall case DISCONNECT_FROM_KEYBOARD: 60031168Sminshall disconnect_from_keyboard(regs, sregs); 60131168Sminshall break; 60231168Sminshall default: 60331168Sminshall unknown_op(regs, sregs); 60431168Sminshall break; 60531168Sminshall } 60631158Sminshall } 60731158Sminshall break; 60831158Sminshall case GATE_COPY: 60931168Sminshall if (regs->h.cl != 0xff) { 61031211Sminshall regs->x.cx = 0x1206; 61131168Sminshall } else { 61231211Sminshall regs->x.cx = 0x1200; 61331168Sminshall switch (regs->h.al) { 61431168Sminshall case COPY_STRING: 61531168Sminshall copy_string(regs, sregs); 61631168Sminshall break; 61731168Sminshall default: 61831168Sminshall unknown_op(regs, sregs); 61931168Sminshall break; 62031168Sminshall } 62131158Sminshall } 62231158Sminshall break; 62331158Sminshall case GATE_OIAM: 62431168Sminshall if (regs->h.cl != 0xff) { 62531211Sminshall regs->x.cx = 0x1206; 62631168Sminshall } else { 62731211Sminshall regs->x.cx = 0x1200; 62831168Sminshall switch (regs->h.al) { 62931168Sminshall case READ_OIA_GROUP: 63031168Sminshall read_oia_group(regs, sregs); 63131168Sminshall break; 63231168Sminshall default: 63331168Sminshall unknown_op(regs, sregs); 63431168Sminshall break; 63531168Sminshall } 63631158Sminshall } 63731158Sminshall break; 63831158Sminshall default: 63931168Sminshall regs->h.ch = 0x12; 64031168Sminshall regs->h.cl = 0x34; /* Invalid GATE entry */ 64131158Sminshall break; 64231158Sminshall } 64331158Sminshall } 64431158Sminshall } 645