From 6d6bb88a0215b87a4a47ed86a84ae3c75d399962 Mon Sep 17 00:00:00 2001 From: Jeffrey Armstrong Date: Sun, 24 Apr 2016 18:05:02 -0400 Subject: Initial import of 5.0 source code with minor changes to use termios on Linux. --- term.c | 4034 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 4034 insertions(+) create mode 100644 term.c (limited to 'term.c') diff --git a/term.c b/term.c new file mode 100644 index 0000000..ba0e55a --- /dev/null +++ b/term.c @@ -0,0 +1,4034 @@ +/*Copyright (c) Anker Berg-Sonne, 1985,1986,1987*/ + +/* + This module contains all terminal dependent code. To implement a new +terminal type it should only be necessary to change and recompile the code here +and relink Sedt. +*/ + +#include "proto.h" + +#if defined(DOS) & !(defined(Windows) | defined(TV)) +#if defined(DESQVIEW) +unsigned int api_init(void); +unsigned long api_shadow(void); +unsigned long win_me(void); +unsigned long ptr_new(void); +void ptr_open(unsigned long ptrhan, unsigned long winhan); +void ptr_addto(unsigned long ptrhan, unsigned int flags); +int ptr_sizeof(unsigned long ptrhan); +#endif +#endif + + +#define Fn 512 + +#if defined(VMS) +extern int T$Application(); +#endif + +#if defined(DOS) | defined(NT) | defined(OS2) +#include +#define Mcapsl 0x40 +#define Malt 0x8 +#define Mctl 0x4 +#define Mlsh 0x2 +#define Mrsh 0x1 +#endif + +#if defined(OS2) +void Mon_Thread() +{unsigned Key_Count; + while (1) + {Key_Count=sizeof(Key_Buff); + DosMonRead((PBYTE)&InBuff,(USHORT)0,(PBYTE)&Key_Buff,(PUSHORT)&Key_Count); + {register int I; + if (Key_Buff.ddflags&0x37) + {if (Key_Buff.cp.scan==0) + {if (Key_Buff.mnflags==17792) + {for (I=0;I=0&&Abs_Row<=Phys_Length&&Abs_Col>=0&&Abs_Col<=Phys_Width) + Mouse_Call(Abs_Row,Abs_Col,P2&1,P2&2,P1&1); + M1=1; + Mouse(&M1,NULL,NULL,NULL); + M1=1; + Mouse(&M1,NULL,NULL,NULL); + Set_Mouse(); + } +} +#endif + +#if defined(VMS) +void Reposition_Input() +{ + if (--This_In>=0) + Character=TTY_Buffer[This_In]&255; +} +#endif +#if defined(UNIX) +void Reposition_Input() +{ + Same_Character=1; +} +#endif + +#if defined(VMS) | defined(UNIX) +void Enable_Mouse() +{if (Use_Mouse) + {Out_S("\033[1;2'z"); /* Enable Locator */ + Out_Zap(); + } +} + +void Disable_Mouse() +{ + Out_S("\033[0'z"); /* Disable Locator */ + Out_Zap(); +} + +void Mouse_1_Down() +{ + Ldown=1; + Move=Rdown=0; + if (Mouse_Get_Rest()==1) + Mouse_Call(); + Abs_Row_Sav=Abs_Row; + Abs_Col_Sav=Abs_Col; +} + +void Mouse_1_Up() +{ + Rdown=0; + Ldown=1; + if (Mouse_Get_Rest()==1) + {Move=Abs_Row_Sav!=Abs_Row||Abs_Col_Sav!=Abs_Col; + if (Move) + Mouse_Call(); + } +} + +void Mouse_2_Down() +{ + Mouse_Get_Rest(); +} + +void Mouse_2_Up() +{ + Mouse_Get_Rest(); +} + +void Mouse_3_Down() +{ + Rdown=1; + Move=Ldown=0; + if (Mouse_Get_Rest()==1) + Mouse_Call(); +} + +void Mouse_3_Up() +{ + Move=Ldown=0; + Rdown=1; + Mouse_Get_Rest()==1; +} + +void Mouse_4_Down() +{ + Mouse_Get_Rest(); +} + +void Mouse_4_Up() +{ + Mouse_Get_Rest(); +} + +void Mouse_Outside() +{ +} + +/* read in rest of locator input escape sequence and compute row/column + Ansi Locator report has following format: VAX/VWS: Pe;Pb;Pr;Pc;Pp&w + VAX/DECwindows Pe;Pb;Pr;Pc&w + Pe Event code: 2 Left Button Down 3 Left Button Up + 4 Middle Button Down 5 Middle Button Up + 6 Right Button Down 7 Right Button Up + 8 Fourth Button Down 9 Fourth Button Up + 10 Locator outside filter rectangle + Pb Button status: 0 No Buttons down 1 Right 2 Middle 4 Left 8 Fourth + Pr row coordinate + Pc column coordinate + Pp page coordinate (may be omitted) + The current position in the input stream is at the end of Pe; +*/ +int Mouse_Get_Rest() +{ + int field[4]; + int *pf; + register char C; + pf=field; + *pf=0; +#if defined(VMS) + C=Termin(); +#else +#if defined(TERMCAP) + C=UGetrm(); +#else + C=getch(); +#endif +#endif + while (C!='&'&&pf<=(&field[3])) + { + if (isdigit(C)) + {*pf=(*pf)*10+C-'0'; + }else + if (C==';') + *(++pf)=0; + else + {Error(5,Ill_Mouse_Mess,C); + Err_Flag=0; + return (0); + } +#if defined(VMS) + C=Termin(); +#else +#if defined(TERMCAP) + C=UGetrm(); +#else + C=getch(); +#endif +#endif + } + if (( +#if defined(VMS) + C=Termin() +#else +#if defined(TERMCAP) + C=UGetrm() +#else + C=getch() +#endif +#endif + )=='w') + {Abs_Row=(--field[1]); + Abs_Col=(--field[2]); + return (1); + } + else + {Error(5,Ill_Mouse_Mess,C); + Err_Flag=0; + return (0); + } +} +#endif + +#if defined(GEM) | defined(Windows) | defined(TV) +#define SCREEN_LENGTH Scr_Length-1 +#else +#define SCREEN_LENGTH Scr_Length +#endif +#if defined(VMS) | defined(UNIX) +void Fast Mouse_Call() /* 290a */ +#endif +#if ((defined(DOS) | defined(NT)) & !defined(PC100)) | defined(OS2) | (defined(ATARI) & defined(GEM)) +void Fast Mouse_Call(int Abs_Row,int Abs_Col,int Ldown,int Rdown,int Move) +#endif +#if defined(VMS) | ((defined(DOS) | defined(NT)) & !defined(PC100)) | defined(OS2) | (defined(ATARI) & defined(GEM)) | defined(UNIX) +{ + /*Diag("Mouse_Call:Row=%d,Col=%d,Ldown=%d,Rdown=%d,Move=%d", + Abs_Row,Abs_Col,Ldown,Rdown,Move);*/ + if (Down_Type==0) +#if defined(GEM) | defined(Windows) | defined(TV) + {if (Abs_Row>=Top_Row&&Abs_Col>=Left_Col&&Abs_Row=Top_Row&&Abs_Col>=Left_Col&&Abs_Row=Left_Col&&Abs_Col=Left_Col&&Abs_Col=Top_Row&&Abs_Row=Top_Row&&Abs_Row=Top_Row-1&&Abs_Col>=Left_Col-1&& + Abs_Row<=Top_Row+SCREEN_LENGTH&&Abs_Col<=Left_Col+Scr_Width) + {Load_Window(Cur_Buffer); + Ch_Window(Buffer_Stack[I]); + Opt_Move_Cursor(My_Line,My_Col); + break; + } + if (I==Buffers-1) + Load_Window(Cur_Buffer); + } + } + } + } else /* Down_Type!=0 */ + {if (Ldown&&Move) + {Zoomed=0; + switch (Down_Type) + {case 1: + if (Scr_Length+Top_Row-Abs_Row>4) + {Scr_Length+=Top_Row-Abs_Row-1; + Top_Row=Abs_Row+1; + } + break; + case 2: + if (Abs_Row-Top_Row>2&&Abs_Row=Max_Length-2) Scr_Length=Max_Length-3-Top_Row; +#endif + break; + case 3: + if (Scr_Width+Left_Col-Abs_Col>4) + {Scr_Width+=Left_Col-1-Abs_Col; + Left_Col=Abs_Col+1; + } + break; + case 4: + if (Abs_Col-Left_Col>3) + Scr_Width=Abs_Col-Left_Col; + break; + case 5: + if (Scr_Length+Top_Row-Abs_Row>4) + {Scr_Length+=Top_Row-Abs_Row-1; + Top_Row=Abs_Row+1; + } + if (Scr_Width+Left_Col-Abs_Col>4) + {Scr_Width+=Left_Col-1-Abs_Col; + Left_Col=Abs_Col+1; + } + break; + case 6: + if (Scr_Length+Top_Row-Abs_Row>4) + {Scr_Length+=Top_Row-Abs_Row-1; + Top_Row=Abs_Row+1; + } + if (Abs_Col-Left_Col>3) + Scr_Width=Abs_Col-Left_Col; + break; + case 7: + if (Abs_Row-Top_Row>2&&Abs_Row=Max_Length-2) Scr_Length=Max_Length-3-Top_Row; +#endif + if (Abs_Col-Left_Col>3) + Scr_Width=Abs_Col-Left_Col; + break; + case 8: + if (Abs_Row-Top_Row>2&&Abs_Row=Max_Length-2) Scr_Length=Max_Length-3-Top_Row; +#endif + if (Scr_Width+Left_Col-Abs_Col>4) + {Scr_Width+=Left_Col-1-Abs_Col; + Left_Col=Abs_Col+1; + } + break; + } + Open_Window(); + /*Down_Type=0;*/ /* 290a */ + } else +#if defined(VMS) | defined(UNIX) +/* allow multiple move operations without refresh: + second move starts with (Ldown&&!Move) +*/ + if (Rdown||Move) /* 290a */ + {Down_Type=0; + Refresh_Window(); + Opt_Move_Cursor(My_Line,My_Col); + } else + Down_Type=0; +#else + if (!((Ldown)&&(Move))) + {Down_Type=0; + Refresh_Window(); + Opt_Move_Cursor(My_Line,My_Col); + } +#endif + } +} +#endif + +#if defined(VMS) | ((defined(DOS) | defined(NT)) & !defined(PC100)) | defined(OS2) | (defined(ATARI) & defined(GEM)) | defined(UNIX) +void Fast Mouse_Execute(int Line,int Col,int Left,int Right,int Move) +{int C; + long Chars, Sel_Pos, Sav_Col, R_Col; + if (!(Left||Right)) + return; + if (Err_Display) + Clr_Error(); + if (Working_Flag) + Clr_Working(); + Line-=Home; + R_Col=Col+Scr_Shift; + Sav_Col=My_Col; + Chars=0; + B_Goto(Current,My_Pos); +#if defined(VMS) | defined(UNIX) + if (Abs_Row==Max_Length-2) /* 290a */ + {R_Col-=Scr_Shift-Left_Col; +#elif defined(GEM) | defined(Windows) | defined(TV) + if (Line+Home+Top_Row==Scr_Length-1) + {R_Col-=Scr_Shift; +#else + if (Line+Home+Top_Row==Phys_Length-1) + {R_Col-=Scr_Shift-Left_Col; +#endif + if (!Move&&!Right) /* 290a */ + {if (R_Col=Scr_Width) + {while (My_Col-Scr_Shift>=Scr_Width) + Scr_Shift+=Shift_Screen?Shift_Screen:Scr_Width/2; + if (Show_Ruler) + S_Ruler(); + Fill_Screen(Rel_First,Rel_Last); + } else + if (My_Col-Scr_Shift<1&&Scr_Shift>0) + {while (My_Col-Scr_Shift<1&&Scr_Shift>0) + Scr_Shift-=Shift_Screen?Shift_Screen:Scr_Width/2; + if (Show_Ruler) + S_Ruler(); + Fill_Screen(Rel_First,Rel_Last); + } + } else + if (Scr_Shift>0) + {Scr_Shift=0; + Hdr_Changes=1; + if (Show_Ruler) + S_Ruler(); + Fill_Screen(Rel_First,Rel_Last); + } + } else /* 290a */ + if (R_Col>=Mod_Pos) + Window_Changed(); + else + {Error(3,Mouse_Toggle_Txt); + Err_Flag=0; + } + Hdr_Changes=1; + Upd_Header(); + } + } else + if (Show_Ruler&&Line+Home==2) + {if (R_Col<=512&&!Move&&!Right) /* 290a */ + {Tabs[R_Col]=Tabs[R_Col]?0:1; + S_Ruler(); + } + } else +#if defined(VMS) + if (Line+Home==1&&Col==Scr_Width) /* 290a */ + {if (Mbx_Count>0&&!Move&&!Right) + {Plain_Message(Mbx_Mess[0]); + Err_Display=0; + Mbx_Count--; + C_Move(Mbx_Mess[1],Mbx_Mess[0],99*1024,1); + } + } else +#endif + if (Line+Home==1) /* 290a */ + {if (Col>=Buffer_Pos&&!Move&&!Right) + {Window_Used(); + Set_Cursor(My_Line,My_Col); + } + } + else + {if (Line==0) + {if (R_ColPos-My_Pos; + My_Col=1; + } + while (My_ColPos<=Current->Bufsize&& + !Chk_EL(Current,C=B_Get(Current))&&C!='\n') + {My_Col+=Char_Rep(C,NULL); + Chars++; + } + Init_Entity(); + if (Chars<0) + {Ent_Direction=0; + Ent_Count= -Chars; + } else + Ent_Count=Chars; + A_Char(); + My_Col=Sav_Col; + } else + {if (LineRel_Last) + /* Error(3,Mouse_Window_Txt) */; /* 290a */ +#if !(defined(GEM) | (defined(Windows) | defined(TV))) + else +#endif + if (!Err_Flag) + {if (!Move&&Left&&Points[0]) + Reset(); + My_Col=R_Col; + Init_Entity(); + if (Line<0) + {Ent_Direction=0; + Ent_Count= -Line; + } else + Ent_Count=Line; + Vertical(); + } + My_Col=Sav_Col; + } + if (Err_Flag) + Err_Flag=0; else + {if (Left) + {if (Move) + {if (Points[0]==(Ent_Direction?End_Pos:Beg_Pos)) + Points[0]=0; else + if (Points[0]==0) + Points[0]=My_Pos; + } + Move_Entity(); + } else + if (Right) + {if ((Sel_Pos=Points[0])!=0&& + (Ent_Direction?Sel_PosMy_Pos)) + {Points[0]=0; + if (Sel_Pos Maxlines) + Scr_Length = Maxlines; + if (Scr_Width > Maxcol) + Scr_Width = Maxcol; + Phys_Length=Max_Length=Scr_Length; + Max_Length=Sub_Window?Sub_H:Max_Length; /* 290a */ + Scr_Length=Max_Length-2; /* 290a */ + Phys_Width=Max_Width=Scr_Width; + Max_Width=Scr_Width=Sub_Window?Sub_W:Scr_Width; /* 290a */ +#if defined(TERMCAP) + Org_Width = Scr_Width; + Scl_Regions=Term_Type==VT1XX||Term_Type==VT2XX||Term_Type==VT3XX|| + Term_Type==VT4XX||CS!=NULL; +#endif +#endif +#if defined(VMS) + register char C, *S; + VMS_Application=T$Application(); + if (Call_Type!=0) + {switch (Call_Type) + {case 1: + Term_Type=VT1XX; + break; + case 2: + Term_Type=VT2XX; + break; + case 3: + Term_Type=VT52; + break; + case 4: + Term_Type=VK100; + break; + case 5: + Term_Type=ANSI; + break; + case 6: + Term_Type=VT3XX; + break; + } + } else + {Term_Type=VT2XX; + S=getenv("TERM"); + if (strcmp(S,"vt52")==0) + Term_Type=VT52; else + if (strncmp(S,"vt1",3)==0) + {Term_Type=VT1XX; + } else + if (strncmp(S,"pro",3)==0) + {Term_Type=VT1XX; + } else + if (strncmp(S,"vt2",3)==0) + {Term_Type=VT2XX; + } else + if (strncmp(S,"vt3",3)==0) + {Term_Type=VT3XX; + } else + if (strncmp(S,"vt4",3)==0) + {Term_Type=VT4XX; + } else + {Out_S("\033[0c"); + if (Termin()=='\033') + {if ((C=Termin())=='['&&(C=Termin())=='?') + {if ((C=Termin())=='6') + {if ((C=Termin())==';'||C=='c'||C=='C'||C=='1') + Term_Type=VT1XX; else + if (C=='2') + Term_Type=VT2XX; else + if (C=='3') + Term_Type=VT3XX; else + if (C=='4') + Term_Type=VT4XX; else + Term_Error(); + } else + if (C=='5') + Term_Type=VK100; else + if (C=='1') + Term_Type=VT1XX; else + Term_Error(); + while (C!='c'&&C!='C') + C=Termin(); + } else + Term_Error(); + } else + if (C==155&&(C=Termin())=='?') + {if ((C=Termin())=='6') + {if ((C=Termin())==';'||C=='c'||C=='C'||C=='1') + Term_Type=VT1XX; else + if (C=='2') + Term_Type=VT2XX; else + if (C=='3') + Term_Type=VT3XX; else + if (C=='4') + Term_Type=VT4XX; else + Term_Error(); + } else + Term_Error(); + while (C!='c'&&C!='C') + C=Termin(); + } else + Term_Error(); + } + } + T$GETSIZE(&Scr_Length,&Scr_Width); + if (Scr_Length>Maxlines) + Scr_Length=Maxlines; + if (Scr_Width>Maxcol) + Scr_Width=Maxcol; + Phys_Length=Max_Length=Scr_Length; + Max_Length=Sub_Window?Sub_H:Max_Length; /* 290a */ + Scr_Length=Max_Length-2; /* 290a */ + Phys_Width=Max_Width=Scr_Width; + Org_Width=Scr_Width; + Max_Width=Scr_Width=Sub_Window?Sub_W:Scr_Width; /* 290a */ + Scl_Regions=Term_Type==VT1XX||Term_Type==VT2XX||Term_Type==VT3XX|| + Term_Type==VT4XX; +#endif +#if defined(DOS) | defined(NT) +#if !defined(Windows) +#if !defined(PC100) + Get_Type(); + Term_Type=Call_Type; + switch (Term_Type) + {case 0xD2: + case 0xFC: + {Color=Call_Color==0?((GETEQ()>>4)&3)!=3:Call_Color==2; + if (Term_Type==0xFC) + {Term_Type=IBM_AT; + switch (Call_Model) + {case 0x1: + Term_Type=AT_339; + Int16_Ext=1; + break; + case 0x2: + Term_Type=XT_286; + Int16_Ext=1; + break; + case 0x4: + Term_Type=PS2_50; + Int16_Ext=1; + break; + case 0x5: + Term_Type=PS2_60; + Int16_Ext=1; + break; + } + } else + Term_Type=PCXX; + OURKBD(); + if (Keyb_Type==0) + {if (!pc_enh_keyb()) + Keyb_Type=Keyb_AT; else + Keyb_Type=Keyb_New; + } + if (Set_Num_Lock==-1&&(Mapping==EDT_Mapping||Mapping==WPS_Mapping)) + {switch (Keyb_Type) + {case Keyb_PC: + case Keyb_250: + case Keyb_New: + case Keyb_Conv: + case Keyb_TC: + case Keyb_AT: + Set_Num_Lock=1; + break; + case Keyb_SLT: + Set_Num_Lock=0; + break; + } + } +#if !defined(TV) + Sub_Set(25,80); +#endif + break; + } + case 0xFE: + {OURKBD(); + Color=Call_Color==0?((GETEQ()>>4)&3)!=3:Call_Color==2; + Term_Type=IBM_XT; + if (Keyb_Type==0) + Keyb_Type=Keyb_PC; +#if !defined(TV) + Sub_Set(25,80); +#endif + break; + } + case 0xFB: + {OURKBD(); + Color=Call_Color==0?((GETEQ()>>4)&3)!=3:Call_Color==2; + Term_Type=XT_2; + Int16_Ext=1; + if (Keyb_Type==0) + Keyb_Type=Keyb_New; +#if !defined(TV) + Sub_Set(25,80); +#endif + break; + } + case 0xF9: + {OURKBD(); + Color=Call_Color==0?((GETEQ()>>4)&3)!=3:Call_Color==2; + Term_Type=IBM_Conv; + if (Keyb_Type==0) + Keyb_Type=Keyb_Conv; +#if !defined(TV) + Sub_Set(25,80); +#endif + break; + } + case 0xFF: + {OURKBD(); + Color=Call_Color==0?((GETEQ()>>4)&3)!=3:Call_Color==2; + Term_Type=IBM_PC; + if (Keyb_Type==0) + Keyb_Type=Keyb_PC; +#if !defined(TV) + Sub_Set(25,80); +#endif + break; + } + case 0xFA: + OURKBD(); + if (Keyb_Type==0) + Keyb_Type=Keyb_New; + Color=Call_Color==0?((GETEQ()>>4)&3)!=3:Call_Color==2; + Term_Type=PS2_30; + Int16_Ext=1; +#if !defined(TV) + Sub_Set(25,80); +#endif + break; + case 0xF8: + OURKBD(); + if (Keyb_Type==0) + Keyb_Type=Keyb_New; + Color=Call_Color==0?((GETEQ()>>4)&3)!=3:Call_Color==2; + Term_Type=PS2_80; + Int16_Ext=1; +#if !defined(TV) + Sub_Set(25,80); +#endif + break; + case 2: + OURKBD(); + if (Keyb_Type==0) + Keyb_Type=Keyb_TC; + Color=Call_Color==0?((GETEQ()>>4)&3)!=3:Call_Color==2; + Term_Type=TANDY_1400; +#if !defined(TV) + Sub_Set(25,80); +#endif + break; + case 1: + default: + {Term_Type=AT_339; + Keyb_Type=Keyb_New; + break; + } + } +#if defined(DESQVIEW) + if ((DV=api_init())!=0) + {Ptr=ptr_new(); + ptr_open(Ptr,win_me()); + ptr_addto(Ptr,0x4); + } +#endif +#if !defined(TV) + if (Dir_Video) + { +#if defined(DESQVIEW) + if (DV) + {if ((Video_Seg=((api_shadow()))>>16)==0) + Video_Seg=Color?0xB800:0xB000; + } else +#endif + Video_Seg=Color?0xB800:0xB000; + } + if (EGA43) + Sub_Set(43,80); else + {if (New_Mode) + Old_Mode=Set_Mode(New_Mode); + Get_Mode((int far *)&Scr_Length,(int far *)&Scr_Width); + Sub_Set(Scr_Length,Scr_Width); + if (New_Mode) + Set_Mode(Old_Mode); + } +#endif +#else + Term_Type=PC100; + Keyb_Type=0; +#endif + Scl_Regions=1; +#else + Get_Type(); + Term_Type=Call_Type; + switch (Term_Type) + {case 0xD2: + case 0xFC: + {if (Term_Type==0xFC) + {Term_Type=IBM_AT; + switch (Call_Model) + {case 0x1: + Term_Type=AT_339; + if (Keyb_Type==0) + Keyb_Type=Keyb_New; + break; + case 0x2: + Term_Type=XT_286; + if (Keyb_Type==0) + Keyb_Type=Keyb_New; + break; + case 0x4: + Term_Type=PS2_50; + if (Keyb_Type==0) + Keyb_Type=Keyb_New; + break; + case 0x5: + Term_Type=PS2_60; + if (Keyb_Type==0) + Keyb_Type=Keyb_New; + break; + default: + if (Keyb_Type==0) + Keyb_Type=Keyb_AT; + break; + } + } else + {Term_Type=PCXX; + if (Keyb_Type==0) + Keyb_Type=Keyb_250; + } + break; + } + case 0xFE: + {Term_Type=IBM_XT; + if (Keyb_Type==0) + Keyb_Type=Keyb_PC; + break; + } + case 0xFB: + {Term_Type=XT_2; + if (Keyb_Type==0) + Keyb_Type=Keyb_New; + break; + } + case 0xF9: + {Term_Type=IBM_Conv; + if (Keyb_Type==0) + Keyb_Type=Keyb_Conv; + break; + } + case 0xFF: + {Term_Type=IBM_PC; + if (Keyb_Type==0) + Keyb_Type=Keyb_PC; + break; + } + case 0xFA: + Term_Type=PS2_30; + if (Keyb_Type==0) + Keyb_Type=Keyb_New; + break; + case 0xF8: + Term_Type=PS2_80; + if (Keyb_Type==0) + Keyb_Type=Keyb_New; + break; + default: + {Term_Type=AT_339; + Keyb_Type=Keyb_New; + break; + } + } + if (Set_Num_Lock==-1&&(Mapping==EDT_Mapping||Mapping==WPS_Mapping)) + {switch (Keyb_Type) + {case Keyb_PC: + case Keyb_250: + case Keyb_New: + case Keyb_Conv: + case Keyb_TC: + case Keyb_AT: + Set_Num_Lock=1; + break; + case Keyb_SLT: + Set_Num_Lock=0; + break; + } + } + Scl_Regions=1; +#endif +#endif +#if defined(OS2) + USHORT Mask; + Get_Type(); + Term_Type=Call_Type; + switch (Term_Type) + {case 0xFB: + {Term_Type=XT_2; + if (Keyb_Type==0) + Keyb_Type=Keyb_New; + break; + } + case 0xFA: + if (Keyb_Type==0) + Keyb_Type=Keyb_New; + Term_Type=PS2_30; + Int16_Ext=1; + break; + case 0xF8: + if (Keyb_Type==0) + Keyb_Type=Keyb_New; + Term_Type=PS2_80; + Int16_Ext=1; + break; + case 0xD2: + case 0xFC: + default: + if (Term_Type==0xFC) + {Term_Type=IBM_AT; + switch (Call_Model) + {case 0x1: + Term_Type=AT_339; + if (Keyb_Type==0) + Keyb_Type=Keyb_New; + Int16_Ext=1; + break; + case 0x2: + Term_Type=XT_286; + if (Keyb_Type==0) + Keyb_Type=Keyb_New; + Int16_Ext=1; + break; + case 0x4: + Term_Type=PS2_50; + if (Keyb_Type==0) + Keyb_Type=Keyb_New; + Int16_Ext=1; + break; + case 0x5: + Term_Type=PS2_60; + if (Keyb_Type==0) + Keyb_Type=Keyb_New; + Int16_Ext=1; + break; + default: + if (Keyb_Type==0) + Keyb_Type=Keyb_AT; + } + } else + {Term_Type=PCXX; + if (Keyb_Type==0) + Keyb_Type=Keyb_250; + } + break; + } + if (Set_Num_Lock==-1&&(Mapping==EDT_Mapping||Mapping==WPS_Mapping)) + {switch (Keyb_Type) + {case Keyb_PC: + case Keyb_250: + case Keyb_New: + case Keyb_Conv: + case Keyb_TC: + case Keyb_AT: + Set_Num_Lock=1; + break; + case Keyb_SLT: + Set_Num_Lock=0; + break; + } + } + Mode_Data.cb=12; + VioGetMode((PVIOMODEINFO)&Mode_Data,0); + Sub_Set(Mode_Data.row,Mode_Data.col); + Old_Length=Scr_Length; + VioGetCurType((PVIOCURSORINFO)&Cursor_Data,0); + DosGetInfoSeg((PSEL)&Gdt_Descriptor,(PSEL)&Ldt_Descriptor); + Gdt=MAKEPGINFOSEG(Gdt_Descriptor); + Ldt=MAKEPLINFOSEG(Ldt_Descriptor); + if (Scan_Defs!=0) + {DosMonOpen("KBD$",(PHMONITOR)&KBD_Handle); + InBuff.bufflen=64; + OutBuff.bufflen=64; + if (DosMonReg(KBD_Handle,(PBYTE)&InBuff,(PBYTE)&OutBuff,0x0002, Gdt->sgCurrent)) + Initerror(Not_Enough_Memory_Txt); + Thread_ID=_beginthread((void (far *)(void far *))Mon_Thread,(void far *)NULL, 4096,(void far *)NULL); + DosSetPrty(PRTYS_THREAD,PRTYC_REGULAR,+2,Thread_ID); + } + if (Use_Mouse) + {DosSemRequest((HSEM)&Mouse_Sem,-1L); + if (MouOpen(0L,(PHMOU)&Mouse_Handle)) + Gotmouse=0; else + {Mask=(1<<1)+(1<<2)+(1<<4); + MouSetEventMask((PUSHORT)&Mask,Mouse_Handle); + Mouse_ID=_beginthread((void (far *)(void far *))Mouse_Thread,(void far *)NULL,4096, (void far *)NULL); + /*DosSetPrty(PRTYS_THREAD,PRTYC_REGULAR,+1,Mouse_ID);*/ + Gotmouse=1; + } + } + Scl_Regions=1; +#endif +#if defined(ATARI) + Scl_Regions=1; + Max_Length=Scr_Length; + Max_Width=Scr_Width; +#endif +#if defined(MPE) + Max_Length=Scr_Length; + Max_Width=Scr_Width; + Scl_Regions=0; +#endif +} + +#if defined(DOS) | defined(NT) | defined(OS2) +void Fast Sub_Set(int H,int W) +{Phys_Length=H; + Phys_Width=W; + Max_Length=Scr_Length=Sub_Window?Sub_H:H; + Max_Width=Scr_Width=Sub_Window?Sub_W:W; +} +#endif + +/* Set the physical cursor to position Line, Col. +*/ +void Fast Set_Cursor(int Line,int Col) +{ +#if defined(UNIX) +#if defined(TERMCAP) + switch (Term_Type) + {case ANSI: + case VT2XX: + case VT3XX: + case VT4XX: + case VT1XX: + case VK100: + {Out_S("\033["); + Out_I(Line+Top_Row); + Out_C(';'); + Out_I(Col+Left_Col); + Out_C('H'); + break; + } + case VT52: + {Out_S("\033Y"); + Out_C(037+Line+Top_Row); + Out_C(037+Col+Left_Col); + break; + } + case Tcap: + case Default: + default: + tputs (tgoto (CM, Col+Left_Col-1,Line+Top_Row-1),1,Out_C); + } +#else + Out_Zap(); + move(Line+Top_Row-1,Col+Left_Col-1); +#endif +#endif +#if defined(VMS) + if (Echo_Read) + Force_Cursor=1; + switch (Term_Type) + {case VT2XX: + case VT3XX: + case VT4XX: + case VT1XX: + case VK100: + case ANSI: + case Default: + {Out_S("\033["); + Out_I(Line+Top_Row); + Out_C(';'); + Out_I(Col+Left_Col); + Out_C('H'); + break; + } + case VT52: + {Out_S("\033Y"); + Out_C(037+Line+Top_Row); + Out_C(037+Col+Left_Col); + } + } +#endif +#if defined(DOS) | defined(NT) +#if !(defined(Windows) | defined(TV)) +#if !defined(PC100) + Out_Zap(); + IBMcursor(Sub_X+Top_Row+Line-1,Sub_Y+Left_Col+Col-1); +#else + Out_S("\033["); + Out_I(Line); + Out_C(';'); + Out_I(Col); + Out_C('H'); +#endif +#else + if (Out_Count) + Out_Zap(); +#if defined(TV) + TV_Cursor(Line,Col); +#endif +#endif +#endif +#if defined(OS2) + VioSetCurPos(Sub_X+Line-1+Top_Row,Sub_Y+Col-1+Left_Col,0); +#endif +#if defined(ATARI) +#if !defined(GEM) + Out_S("\033Y"); + Out_C(037+Line+Top_Row); + Out_C(037+Col+Left_Col); +#else + if (Out_Count) + Out_Zap(); +#endif +#endif +#if defined(MPE) + Out_S("\033&a"); + Out_I(Col-1); + Out_C('c'); + Out_I(Line-1); + Out_C('R'); +#endif + His_Line=Line; + His_Col=Col; +} + +/* Scrolls the screen and database Scroll lines + The routine is divided into two parts. One for terminals with scroll + regions, which can use hardware scrolling. The other for terminals + with no scroll regions, which Sedt must simulate scroll regions on. +*/ +void Fast Opt_Scroll(int Scroll,int First,int Last) +{ +#if defined(VMS) | defined(UNIX) + int Sav_Line, L, This_Last, That_Last; + long Sav_Col; + char *P, *A; + /*Diag("Opt_Scroll:Scroll=%d,First=%d,Last=%d",Scroll,First,Last);*/ + if (!Update_Flag) + return; + Set_Scroll(First+=Home,Last+=Home); + if (Scl_Regions&&Scr_Width==Max_Width) + {if (Scroll>0) + {Set_Cursor(Last,1); + Scl_Up(Scroll); + {register int I; + for (I=First;I<=Last-Scroll;I++) + { + This_Last=Lst_Col[I+Top_Row]; + if (That_Last=Lst_Col[I+Scroll+Top_Row]) + {C_Move(My_Screen[I+Scroll+Top_Row]+1+Left_Col, + My_Screen[I+Top_Row]+1+Left_Col,That_Last,0); + C_Move(My_Attributes[I+Scroll+Top_Row]+1+Left_Col, + My_Attributes[I+Top_Row]+1+Left_Col,That_Last,0); + } + if (This_Last>That_Last) + {Space_Fill(My_Screen[I+Top_Row]+That_Last+1+Left_Col, + This_Last-That_Last); + Zero_Fill(My_Attributes[I+Top_Row]+That_Last+1+Left_Col, + This_Last-That_Last); + } + Lst_Col[I+Top_Row]=That_Last; + } + } + {register int I; + for (I=Last-Scroll+1;I<=Last;I++) + if (This_Last=Lst_Col[I+Top_Row]) + {Space_Fill(My_Screen[I+Top_Row]+1+Left_Col,This_Last); + Zero_Fill(My_Attributes[I+Top_Row]+1+Left_Col,This_Last); + Lst_Col[I+Top_Row]=0; + } + } + } else + {Scroll=(-Scroll); + Set_Cursor(First,1); + Scl_Down(Scroll); + {register int I; + for (I=Last;I>=First+Scroll;I--) + { + This_Last=Lst_Col[I+Top_Row]; + if (That_Last=Lst_Col[I-Scroll+Top_Row]) + {C_Move(My_Screen[I-Scroll+Top_Row]+1+Left_Col, + My_Screen[I+Top_Row]+1+Left_Col,That_Last,0); + C_Move(My_Attributes[I-Scroll+Top_Row]+1+Left_Col, + My_Attributes[I+Top_Row]+1+Left_Col,That_Last,0); + } + if (This_Last>That_Last) + {Space_Fill(My_Screen[I+Top_Row]+That_Last+1+Left_Col, + This_Last-That_Last); + Zero_Fill(My_Attributes[I+Top_Row]+That_Last+1+Left_Col, + This_Last-That_Last); + } + Lst_Col[I+Top_Row]=That_Last; + } + } + {register int I; + for (I=First;I<=Scroll+First-1;I++) + if (This_Last=Lst_Col[I+Top_Row]) + {Space_Fill(My_Screen[I+Top_Row]+1+Left_Col,This_Last); + Zero_Fill(My_Attributes[I+Top_Row]+1+Left_Col,This_Last); + Lst_Col[I+Top_Row]=0; + } + } + } + } else + {if (Scroll>0) + {Sav_Line=My_Line; + Sav_Col=My_Col; + {register int I; + for (I=Scl_Top;I<=Scl_Bottom-Scroll;I++) + {Opt_Cursor(I,(long)1); + P=My_Screen[My_Line+Scroll+Top_Row]+Left_Col; + A=My_Attributes[My_Line+Scroll+Top_Row]+Left_Col; + L=Lst_Col[My_Line+Scroll+Top_Row]; + My_Col=Scr_Shift+1; + for (Scr_Col=1;Scr_Col<=L;Scr_Col++) + {Cur_Attributes=A[Scr_Col]; + Opt_Char(P[Scr_Col]); + } + Opt_Erase_Line(); + } + } + {register int I; + for (I=Scl_Bottom-Scroll+1;I<=Scl_Bottom;I++) + {Opt_Cursor(I,(long)1); + Opt_Erase_Line(); + } + } + Opt_Cursor(Sav_Line,Sav_Col); + } else + {Scroll=(-Scroll); + Sav_Line=My_Line; + Sav_Col=My_Col; + {register int I; + for (I=Scl_Bottom;I>=Scl_Top+Scroll;I--) + {Opt_Cursor(I,(long)1); + P=My_Screen[My_Line-Scroll+Top_Row]+Left_Col; + A=My_Attributes[My_Line-Scroll+Top_Row]+Left_Col; + L=Lst_Col[My_Line-Scroll+Top_Row]; + My_Col=Scr_Shift+1; + for (Scr_Col=1;Scr_Col<=L;Scr_Col++) + {Cur_Attributes=A[Scr_Col]; + Opt_Char(P[Scr_Col]); + } + Opt_Erase_Line(); + } + } + {register int I; + for (I=Scl_Top+Scroll-1;I>=Scl_Top;I--) + {Opt_Cursor(I,(long)1); + Opt_Erase_Line(); + } + } + Opt_Cursor(Sav_Line,Sav_Col); + } + } +#endif +#if (defined(DOS) | defined(NT)) & defined(Windows) + if (!Update_Flag) + return; + Out_Zap(); + Set_Scroll(First+=Home,Last+=Home); + if (Scroll>0) + {Scl_Up(Scroll); + {register int I; + for (I=First;I<=Last-Scroll;I++) + Lst_Col[I]=Lst_Col[I+Scroll]; + for (I=Last-Scroll+1;I<=Last;I++) + Lst_Col[I]=0; + } + } else + {Scroll=(-Scroll); + Scl_Down(Scroll); + {register int I; + for (I=Last;I>=First+Scroll;I--) + Lst_Col[I]=Lst_Col[I-Scroll]; + for (I=First;I<=Scroll+First-1;I++) + Lst_Col[I]=0; + } + } +#endif +#if (defined(DOS) & !defined(Windows) & !defined(TV)) | defined(OS2) + if (!Update_Flag) + return; + Out_Zap(); + Set_Scroll(First+=Home,Last+=Home); + if (Scroll>0) + {Scl_Up(Scroll); + {register int I; + for (I=First;I<=Last-Scroll;I++) + Lst_Col[I]=Lst_Col[I+Scroll]; + } + if (Lst_Col[Last-Scroll+1]!=0) + Lst_Col[Last-Scroll+1]=0; + {register int I; + for (I=Last-Scroll+2;I<=Last;I++) + {if (Lst_Col[I]!=0) + Lst_Col[I]=0; + } + } + } else + {Scroll=(-Scroll); + Scl_Down(Scroll); + {register int I; + for (I=Last;I>=First+Scroll;I--) + Lst_Col[I]=Lst_Col[I-Scroll]; + } + if (Lst_Col[First]!=0) + Lst_Col[First]=0; + {register int I; + for (I=First+1;I<=Scroll+First-1;I++) + {if (Lst_Col[I]!=0) + Lst_Col[I]=0; + } + } + } +#endif +#if defined(DOS) & defined(TV) + int Sav_Line, L; + long Sav_Col; + char *P, *A; + /*Diag("Opt_Scroll:Scroll=%d,First=%d,Last=%d",Scroll,First,Last);*/ + if (!Update_Flag) + return; + Set_Scroll(First+=Home,Last+=Home); + if (Scroll>0) + {Sav_Line=My_Line; + Sav_Col=My_Col; + {register int I; + for (I=Scl_Top;I<=Scl_Bottom-Scroll;I++) + {Opt_Cursor(I,(long)1); + P=My_Screen[My_Line+Scroll]; + A=My_Attributes[My_Line+Scroll]; + L=Lst_Col[My_Line+Scroll]; + My_Col=Scr_Shift+1; + for (Scr_Col=1;Scr_Col<=L;Scr_Col++) + {Cur_Attributes=A[Scr_Col]; + Opt_Char(P[Scr_Col]); + } + Opt_Erase_Line(); + } + } + {register int I; + for (I=Scl_Bottom-Scroll+1;I<=Scl_Bottom;I++) + {Opt_Cursor(I,(long)1); + Opt_Erase_Line(); + } + } + Opt_Cursor(Sav_Line,Sav_Col); + } else + {Scroll=(-Scroll); + Sav_Line=My_Line; + Sav_Col=My_Col; + {register int I; + for (I=Scl_Bottom;I>=Scl_Top+Scroll;I--) + {Opt_Cursor(I,(long)1); + P=My_Screen[My_Line-Scroll]; + A=My_Attributes[My_Line-Scroll]; + L=Lst_Col[My_Line-Scroll]; + My_Col=Scr_Shift+1; + for (Scr_Col=1;Scr_Col<=L;Scr_Col++) + {Cur_Attributes=A[Scr_Col]; + Opt_Char(P[Scr_Col]); + } + Opt_Erase_Line(); + } + } + {register int I; + for (I=Scl_Top+Scroll-1;I>=Scl_Top;I--) + {Opt_Cursor(I,(long)1); + Opt_Erase_Line(); + } + } + Opt_Cursor(Sav_Line,Sav_Col); + } +#endif +#if defined(ATARI) + int This_Last, That_Last, Sav_Line, L, Scr_Col; + long Sav_Col; + char *P, *A; + if (!Update_Flag) + return; + Set_Scroll(First+=Home,Last+=Home); + if (Scr_Width==Max_Width) + {if (Scroll>0) + {Scl_Up(Scroll); + {register int I; + for (I=First;I<=Last-Scroll;I++) + { + This_Last=Lst_Col[I+Top_Row]; + if (That_Last=Lst_Col[I+Scroll+Top_Row]) + {C_Move(My_Screen[I+Scroll+Top_Row]+1+Left_Col, + My_Screen[I+Top_Row]+1+Left_Col,That_Last,0); + C_Move(My_Attributes[I+Scroll+Top_Row]+1+Left_Col, + My_Attributes[I+Top_Row]+1+Left_Col,That_Last,0); + } + if (This_Last>That_Last) + {Space_Fill(My_Screen[I+Top_Row]+That_Last+1+Left_Col,This_Last-That_Last); + Zero_Fill(My_Attributes[I+Top_Row]+That_Last+1+Left_Col,This_Last-That_Last); + } + Lst_Col[I+Top_Row]=That_Last; + } + } + } else + {Scroll=(-Scroll); + Scl_Down(Scroll); + {register int I; + for (I=Last;I>=First+Scroll;I--) + { + This_Last=Lst_Col[I+Top_Row]; + if (That_Last=Lst_Col[I-Scroll+Top_Row]) + {C_Move(My_Screen[I-Scroll+Top_Row]+1+Left_Col, + My_Screen[I+Top_Row]+1+Left_Col,That_Last,0); + C_Move(My_Attributes[I-Scroll+Top_Row]+1+Left_Col, + My_Attributes[I+Top_Row]+1+Left_Col,That_Last,0); + } + if (This_Last>That_Last) + {Space_Fill(My_Screen[I+Top_Row]+That_Last+1+Left_Col,This_Last-That_Last); + Zero_Fill(My_Attributes[I+Top_Row]+That_Last+1+Left_Col,This_Last-That_Last); + } + Lst_Col[I+Top_Row]=That_Last; + } + } + } + } else + {if (Scroll>0) + {Sav_Line=My_Line; + Sav_Col=My_Col; + {register int I; + for (I=Scl_Top;I<=Scl_Bottom-Scroll;I++) + {Opt_Cursor(I,(long)1); + P=My_Screen[My_Line+Scroll+Top_Row]+Left_Col; + A=My_Attributes[My_Line+Scroll+Top_Row]+Left_Col; + L=Lst_Col[My_Line+Scroll+Top_Row]; + My_Col=Scr_Shift+1; + for (Scr_Col=1;Scr_Col<=L;Scr_Col++) + {Cur_Attributes=A[Scr_Col]; + Opt_Char(P[Scr_Col]); + } + Opt_Erase_Line(); + } + } + {register int I; + for (I=Scl_Bottom-Scroll+1;I<=Scl_Bottom;I++) + {Opt_Cursor(I,(long)1); + Opt_Erase_Line(); + } + } + Opt_Cursor(Sav_Line,Sav_Col); + } else + {Scroll=(-Scroll); + Sav_Line=My_Line; + Sav_Col=My_Col; + {register int I; + for (I=Scl_Bottom;I>=Scl_Top+Scroll;I--) + {Opt_Cursor(I,(long)1); + P=My_Screen[My_Line-Scroll+Top_Row]+Left_Col; + A=My_Attributes[My_Line-Scroll+Top_Row]+Left_Col; + L=Lst_Col[My_Line-Scroll+Top_Row]; + My_Col=Scr_Shift+1; + for (Scr_Col=1;Scr_Col<=L;Scr_Col++) + {Cur_Attributes=A[Scr_Col]; + Opt_Char(P[Scr_Col]); + } + Opt_Erase_Line(); + } + } + {register int I; + for (I=Scl_Top+Scroll-1;I>=Scl_Top;I--) + {Opt_Cursor(I,(long)1); + Opt_Erase_Line(); + } + } + Opt_Cursor(Sav_Line,Sav_Col); + } + } +#endif +#if defined(MPE) + int Sav_Line, Sav_Col, L, Scr_Col; + char *P, *A; + if (!Update_Flag) + return; + Set_Scroll(First+=Home,Last+=Home); + if (Scroll>0) + {Sav_Line=My_Line; + Sav_Col=My_Col; + {register int I; + for (I=Scl_Top;I<=Scl_Bottom-Scroll;I++) + {Opt_Cursor(I,(long)1); + P=My_Screen[My_Line+Scroll+Top_Row]+Left_Col; + A=My_Attributes[My_Line+Scroll+Top_Row]+Left_Col; + L=Lst_Col[My_Line+Scroll+Top_Row]; + My_Col=Scr_Shift+1; + for (Scr_Col=1;Scr_Col<=L;Scr_Col++) + {Cur_Attributes=A[Scr_Col]; + Opt_Char(P[Scr_Col]); + } + Opt_Erase_Line(); + } + } + {register int I; + for (I=Scl_Bottom-Scroll+1;I<=Scl_Bottom;I++) + {Opt_Cursor(I,(long)1); + Opt_Erase_Line(); + } + } + Opt_Cursor(Sav_Line,Sav_Col); + } else + {Scroll=(-Scroll); + Sav_Line=My_Line; + Sav_Col=My_Col; + {register int I; + for (I=Scl_Bottom;I>=Scl_Top+Scroll;I--) + {Opt_Cursor(I,(long)1); + P=My_Screen[My_Line-Scroll+Top_Row]+Left_Col; + A=My_Attributes[My_Line-Scroll+Top_Row]+Left_Col; + L=Lst_Col[My_Line-Scroll+Top_Row]; + My_Col=Scr_Shift+1; + for (Scr_Col=1;Scr_Col<=L;Scr_Col++) + {Cur_Attributes=A[Scr_Col]; + Opt_Char(P[Scr_Col]); + } + Opt_Erase_Line(); + } + } + {register int I; + for (I=Scl_Top+Scroll-1;I>=Scl_Top;I--) + {Opt_Cursor(I,(long)1); + Opt_Erase_Line(); + } + } + Opt_Cursor(Sav_Line,Sav_Col); + } +#endif +} + +#if !((defined(DOS) & defined(TV)) | defined(MPE)) +/* Scroll the current scroll region up by Scroll lines. This routine is + not called for terminals with no hardware for scroll regions. +*/ +void Fast Scl_Up(int Scroll) +{ +#if defined(UNIX) +#if defined(TERMCAP) + switch (Term_Type) + {case VT2XX: + case VT3XX: + case VT4XX: + case VT1XX: + case VK100: + case ANSI: + {register int I; + for (I=1;I<=Scroll;I++) + Out_S("\033D"); + break; + } + case VT52: + {register int I; + for (I=1;I<=Scroll;I++) + Out_S("\033B"); + break; + } + case Tcap: + case Default: + default: + {register int I; + for (I=1;I<=Scroll;I++) + tputs (SF, 1, Out_C); + } + } +#endif +#endif +#if defined(VMS) + switch (Term_Type) + {case VT2XX: + case VT3XX: + case VT4XX: + case VT1XX: + case VK100: + case ANSI: + case Default: + {register int I; + for (I=1;I<=Scroll;I++) + Out_S("\033D"); + break; + } + case VT52: + {register int I; + for (I=1;I<=Scroll;I++) + Out_S("\033B"); + } + } +#endif +#if defined(DOS) | defined(NT) +#if !(defined(Windows) | defined(TV)) +#if !defined(PC100) + if (Dir_Video) + {register int I; + for (I=Scl_Top;I<=Scl_Bottom-Scroll;I++) +#if defined(__BORLANDC__) + movedata(Video_Seg,((Sub_X+Top_Row+I+Scroll-1)*Phys_Width+Sub_Y+Left_Col)*2, +#else + _movedata(Video_Seg,((Sub_X+Top_Row+I+Scroll-1)*Phys_Width+Sub_Y+Left_Col)*2, +#endif + Video_Seg,((Sub_X+Top_Row+I-1)*Phys_Width+Sub_Y+Left_Col)*2, + Scr_Width*2); + for (I=Scl_Bottom-Scroll+1;I<=Scl_Bottom;I++) + Dir_Set(Sub_X+Top_Row+I-1,Sub_Y+Left_Col,' ',Attab[0],Scr_Width); + } else + IBMscrup(Scroll,Sub_X+Top_Row+Scl_Top-1,Sub_Y+Left_Col, + Sub_X+Top_Row+Scl_Bottom-1,Sub_Y+Left_Col+Scr_Width-1,Attab[0]); +#else + register int I; + for (I=1;I<=Scroll;I++) + Out_S("\033D"); +#endif +#else + Out_Zap(); +#if defined(Windows) + Win_Scroll(Scl_Top,Scl_Bottom,Scroll); +#endif +#endif +#endif +#if defined(OS2) + char Cell[2]; + Cell[0]=' '; + Cell[1]=Attab[0]; + VioScrollUp(Sub_X+Scl_Top-1+Top_Row,Sub_Y+Left_Col, + Sub_X+Scl_Bottom-1+Top_Row,Sub_Y+Scr_Width-1+Left_Col,Scroll, + (char far *)Cell,0); +#endif +#if defined(ATARI) +#if ! defined(GEM) + register char *F, *T; + Out_Zap(); + F=Logbase(); + T=F+(Scl_Top-1)*1280; + F=F+(Scl_Top-1+Scroll)*1280; + movmem(F,T,(Scl_Bottom-Scl_Top-Scroll+1)*1280); +#else + Out_Zap(); + GEM_Up_Scroll(Scl_Top,Scl_Bottom,Scroll); +#endif +#endif +} + +/* Scroll the current scroll region down by Scroll lines. This routine + is not called for terminals with no hardware for scroll regions. +*/ +void Fast Scl_Down(int Scroll) +{ +#if defined(UNIX) +#if defined(TERMCAP) + switch (Term_Type) + {case VT2XX: + case VT3XX: + case VT4XX: + case VT1XX: + case VK100: + case ANSI: + {register int I; + for (I=1;I<=Scroll;I++) + Out_S("\033M"); + break; + } + case VT52: + {register int I; + for (I=1;I<=Scroll;I++) + Out_S("\033A"); + break; + } + case Tcap: + case Default: + default: + {register int I; + for (I=1;I<=Scroll;I++) + tputs (SR, 1, Out_C); + } + } +#endif +#endif +#if defined(VMS) + switch (Term_Type) + {case VT2XX: + case VT3XX: + case VT4XX: + case VT1XX: + case VK100: + case ANSI: + case Default: + {register int I; + for (I=1;I<=Scroll;I++) + Out_S("\033M"); + break; + } + case VT52: + {register int I; + for (I=1;I<=Scroll;I++) + Out_S("\033A"); + } + } +#endif +#if defined(DOS) | defined(NT) +#if !(defined(Windows) | defined(TV)) +#if !defined(PC100) + if (Dir_Video) + {register int I; + for (I=Scl_Bottom;I>=Scl_Top+Scroll;I--) +#if defined(__BORLANDC__) + movedata(Video_Seg,((Sub_X+Top_Row+I-Scroll-1)*Phys_Width+Sub_Y+Left_Col)*2, + Video_Seg,((Sub_X+Top_Row+I-1)*Phys_Width+Sub_Y+Left_Col)*2,Scr_Width*2); +#else + _movedata(Video_Seg,((Sub_X+Top_Row+I-Scroll-1)*Phys_Width+Sub_Y+Left_Col)*2, + Video_Seg,((Sub_X+Top_Row+I-1)*Phys_Width+Sub_Y+Left_Col)*2,Scr_Width*2); +#endif + for (I=Scl_Top+Scroll-1;I>=Scl_Top;I--) + Dir_Set(Sub_X+Top_Row+I-1,Sub_Y+Left_Col,' ',Attab[0],Scr_Width); + } else + IBMscrdown(Scroll,Sub_X+Top_Row+Scl_Top-1,Sub_Y+Left_Col, + Sub_X+Top_Row+Scl_Bottom-1,Sub_Y+Left_Col+Scr_Width-1,Attab[0]); +#else + register int I; + for (I=1;I<=Scroll;I++) + Out_S("\033M"); +#endif +#else + Out_Zap(); +#if defined(Windows) + Win_Scroll(Scl_Top,Scl_Bottom,-Scroll); +#endif +#endif +#endif +#if defined(OS2) + char Cell[2]; + Cell[0]=' '; + Cell[1]=Attab[0]; + VioScrollDn(Sub_X+Scl_Top-1+Top_Row,Sub_Y+Left_Col, + Sub_X+Scl_Bottom-1+Top_Row,Sub_X+Scr_Width-1+Left_Col,Scroll, + (char far *)Cell,0); +#endif +#if defined(ATARI) +#if ! defined(GEM) + register char *F, *T; + Out_Zap(); + F=Logbase(); + T=F+(Scl_Top-1+Scroll)*1280; + F=F+(Scl_Top-1)*1280; + movmem(F,T,(Scl_Bottom-Scl_Top-Scroll+1)*1280); +#else + Out_Zap(); + GEM_Down_Scroll(Scl_Top,Scl_Bottom,Scroll); +#endif +#endif +} +#endif + +/* Clear the physical screen. +*/ +void Fast Clr_Screen() +{ +#if defined(UNIX) + int Line, Col; + if (Zoomed) + { +#if defined(TERMCAP) + switch (Term_Type) + {case ANSI: + if (His_Attributes!=0) + Opt_Force_Attributes(0); + case VT2XX: + case VT3XX: + case VT4XX: + case VT1XX: + case VK100: + {Out_S("\033[2J"); + break; + } + case VT52: + {Set_Cursor(1,1); + Out_S("\033J"); + break; + } + case Tcap: + case Default: + default: + if (His_Attributes!=0) + Opt_Force_Attributes(0); + tputs (CL, 1, Out_C); + } +#else + Out_Zap(); + clear(); +#endif + } else + {Opt_Force_Attributes(0); + for (Line=1;Line<=Scr_Length;Line++) + {Set_Cursor(Line,1); + for (Col=1;Col<=Scr_Width;Col++) + Out_C(' '); + } + Out_Zap(); + } +#endif +#if defined(VMS) + int Line, Col; + if (Zoomed) + {switch (Term_Type) + {case VT2XX: + case VT3XX: + case VT4XX: + case VT1XX: + case VK100: + case ANSI: + case Default: + {Out_S("\033[2J"); + break; + } + case VT52: + {Set_Cursor(1,1); + Out_S("\033J"); + } + } + } else + {Opt_Force_Attributes(0); + for (Line=1;Line<=Scr_Length;Line++) + {Set_Cursor(Line,1); + for (Col=1;Col<=Scr_Width;Col++) + Out_C(' '); + } + Out_Zap(); + } +#endif +#if defined(DOS) | defined(NT) +#if !(defined(Windows) | defined(TV)) +#if !defined(PC100) + if (Dir_Video) + {register int I; + for (I=1;I<=Scr_Length;I++) + Dir_Set(Sub_X+Top_Row+I-1,Sub_Y+Left_Col,' ',Attab[0],Scr_Width); + } else + IBMscrdown(0,Sub_X+Top_Row,Sub_Y+Left_Col, + Sub_X+Top_Row+Scr_Length-1,Sub_Y+Left_Col+Scr_Width-1,Attab[0]); +#else + Out_S("\033[2J"); +#endif +#else +#if defined(TV) + TV_Clear(); +#else + Win_Clear(); +#endif +#endif +#endif +#if defined(OS2) + char Cell[2]; + Cell[0]=' '; + Cell[1]=Attab[0]; + VioScrollDn(Sub_X+Top_Row,Sub_Y+Left_Col,Sub_X+Scr_Length-1+Top_Row, + Sub_Y+Scr_Width-1+Left_Col,Scr_Length,(char *)Cell,0); +#endif +#if defined(ATARI) +#if ! defined(GEM) + int Line, Col; + if (Zoomed) + {Set_Cursor(1,1); + Out_S("\033J"); + } else + {Opt_Force_Attributes(0); + for (Line=1;Line<=Scr_Length;Line++) + {Set_Cursor(Line,1); + for (Col=1;Col<=Scr_Width;Col++) + Out_C(' '); + } + Out_Zap(); + } +#else + GEM_Clear(); +#endif +#endif +#if defined(MPE) + Out_S("\033h"); + Out_S("\033J"); + His_Line=His_Col=1; +#endif + {register int Line; + for (Line=1;Line<=Maxlines;++Line) + { +#if defined(VMS) | defined(ATARI) | defined(UNIX) | (defined(DOS) & defined(TV)) | defined(MPE) + Space_Fill(My_Screen[Line]+1,Maxcol); + Zero_Fill(My_Attributes[Line]+1,Maxcol); + Lst_Col[Line]=0; +#else + Lst_Col[Line]=0; +#endif + } + } +} + +/* Clear the physical screen. and reset to original attributes +*/ +void Fast Reset_Screen() +{ +#if defined(UNIX) +#if defined(TERMCAP) + switch (Term_Type) + {case ANSI: + if (His_Attributes!=0) + Opt_Force_Attributes(0); + case VT2XX: + case VT3XX: + case VT4XX: + case VT1XX: + case VK100: + {Out_S("\033[2J"); + break; + } + case VT52: + {Set_Cursor(1,1); + Out_S("\033J"); + break; + } + case Tcap: + case Default: + default: + if (His_Attributes!=0) + Opt_Force_Attributes(0); + tputs (CL, 1, Out_C); + } +#else + Out_Zap(); + clear(); +#endif +#endif +#if defined(VMS) + switch (Term_Type) + {case VT2XX: + case VT3XX: + case VT4XX: + case VT1XX: + case VK100: + case ANSI: + case Default: + {Out_S("\033[2J"); + break; + } + case VT52: + {Set_Cursor(1,1); + Out_S("\033J"); + } + } +#endif +#if defined(DOS) | defined(NT) +#if !(defined(Windows) | defined(TV)) +#if !defined(PC100) + if (Dir_Video) + {register int I; + for (I=1;I<=Max_Length;I++) + Dir_Set(Sub_X+I-1,Sub_Y,' ',7,Max_Width); + } else + IBMscrdown(0,Sub_X,Sub_Y,Sub_X+Max_Length-1,Sub_Y+Max_Width-1,7); +#else + Out_S("\033[2J"); +#endif +#else +#if defined(TV) + TV_Clear(); +#else + Win_Clear(); +#endif +#endif +#endif +#if defined(OS2) + char Cell[2]; + Cell[0]=' '; + Cell[1]=7; + VioScrollDn(Sub_X,Sub_Y,Sub_X+Max_Length-1, + Sub_Y+Max_Width-1,Max_Length,(char *)Cell,0); +#endif +#if defined(ATARI) +#if ! defined(GEM) + Set_Cursor(1,1); + Out_S("\033J"); +#else + GEM_Clear(); +#endif +#endif +#if defined(MPE) + Out_S("\033h"); + Out_S("\033J"); + His_Line=His_Col=1; +#endif + {register int Line; + for (Line=1;Line<=Maxlines;++Line) + { +#if defined(VMS) | defined(ATARI) | defined(UNIX) | (defined(DOS) & defined(TV)) | defined(MPE) + Space_Fill(My_Screen[Line]+1,Maxcol); + Zero_Fill(My_Attributes[Line]+1,Maxcol); + Lst_Col[Line]=0; +#else + Lst_Col[Line]=0; +#endif + } + } +} + +/* Set Scroll Region. This routine is also called for terminals with no + hardware scroll regions. + The following variables define the scroll region + Scl_Top The first ine in the region + Scl_Bottom The last line in the region +*/ +void Fast Set_Scroll(int Top,int Bottom) +{ + Top+=Top_Row; + Bottom+=Top_Row; +#if defined(UNIX) +#if defined(TERMCAP) + switch (Term_Type) + {case VT2XX: + case VT3XX: + case VT4XX: + case VT1XX: + {if (Scl_Top!=Top||Scl_Bottom!=Bottom) + {Out_S("\033["); + if (Top!=1) + Out_I(Top); + Out_C(';'); + if (Bottom!=Max_Length) /* 290a */ + Out_I(Bottom); + Out_C('r'); + Set_Cursor(Top,1); + } + break; + } + case Tcap: + case Default: + default: + if (CS != NULL) + tputs (tgoto (CS, Bottom - 1, Top - 1), 1, Out_C); + } + His_Line=His_Col= -1; +#endif +#endif +#if defined(VMS) + switch (Term_Type) + {case VT2XX: + case VT3XX: + case VT4XX: + case VT1XX: + case Default: + {if (Scl_Top!=Top||Scl_Bottom!=Bottom) + {Out_S("\033["); + if (Top!=1) + Out_I(Top); + Out_C(';'); + if (Bottom!=Max_Length) /* 290a */ + Out_I(Bottom); + Out_C('r'); + Set_Cursor(Top,1); + } + break; + } + } + His_Line=His_Col= -1; +#endif +#if defined(DOS) | defined(NT) +#if !(defined(Windows) | defined(TV)) +#if defined(PC100) + if (Scl_Top!=Top||Scl_Bottom!=Bottom) + {Out_S("\033["); + if (Top!=1) + Out_I(Top); + Out_C(';'); + if (Bottom!=Scr_Length) + Out_I(Bottom); + Out_C('r'); + Set_Cursor(Top,1); + } +#endif +#endif +#endif + Scl_Top=Top-Top_Row; + Scl_Bottom=Bottom-Top_Row; +} + +/* Move the cursor right by Col characters without changing the characters + the cursor moves over. +*/ +void Fast Move_Right(int Col) +{ +#if defined(UNIX) +#if defined(TERMCAP) + switch (Term_Type) + {case ANSI: + case VT2XX: + case VT3XX: + case VT4XX: + case VT1XX: + case VK100: + {Out_S("\033["); + Out_I(Col-His_Col); + Out_C('C'); + break; + } + case VT52: + {register int I; + for (I=His_Col;ICol;I--) + Out_S("\033D"); + break; + } + case Tcap: + case Default: + default: + tputs (tgoto (CM, Col+Left_Col - 1, His_Line+Top_Row - 1), 1, Out_C); + } +#else + Out_Zap(); + move(His_Line+Top_Row-1,Col+Left_Col-1); +#endif +#endif +#if defined(VMS) + switch (Term_Type) + {case VT2XX: + case VT3XX: + case VT4XX: + case VT1XX: + case VK100: + case ANSI: + case Default: + {Out_S("\033["); + Out_I(His_Col-Col); + Out_C('D'); + break; + } + case VT52: + {register int I; + for (I=His_Col;I>Col;I--) + Out_S("\033D"); + } + } +#endif +#if defined(DOS) | defined(NT) +#if !(defined(Windows) | defined(TV)) +#if !defined(PC100) + His_Col-=Col; + IBMcursor(Top_Row+His_Line-1,Left_Col+His_Col-1); +#else + Out_S("\033["); + Out_I(His_Col-Col); + Out_C('D'); +#endif +#else + Set_Cursor(His_Line,Col); +#endif +#endif +#if defined(OS2) + His_Col-=Col; + VioSetCurPos(Sub_X+His_Line-1+Top_Row,Sub_Y+His_Col-1+Left_Col,0); +#endif +#if defined(ATARI) +#if ! defined(GEM) + {register int I; + for (I=His_Col;I>Col;I--) + Out_S("\033D"); + } +#else + Set_Cursor(His_Line,Col); +#endif +#endif +#if defined(MPE) + Out_S("\033&a-"); + Out_I(His_Col-Col); + Out_S("c+0R"); +#endif + His_Col=Col; +} + +/* Set the physical attributes of the terminal to A +*/ +void Fast Opt_Force_Attributes(char A) +{ +#if defined(UNIX) +#if defined(TERMCAP) + switch (Term_Type) + {case VT2XX: + case VT1XX: + case VK100: + case VT3XX: + case VT4XX: + {Out_S("\033[0"); + if (A&A_Bold) + Out_S(";1"); + if (A&A_Blink) + Out_S(";5"); + if (A&A_Underline) + Out_S(";4"); + if (A&A_Reverse) + Out_S(";7"); + Out_C('m'); + break; + } + case ANSI: + {Out_S("\033[0m"); + if (A&A_Bold) + Out_S("\033[1m"); + if (A&A_Blink) + Out_S("\033[5m"); + if (A&A_Underline) + Out_S("\033[4m"); + if (A&A_Reverse) + Out_S("\033[7m"); + break; + } + case Tcap: + case Default: + default: + if (ME==NULL) + tputs(SE,1,Out_C); else + tputs (ME, 1, Out_C); + if (A & A_Bold) + {if (MD==NULL) + tputs(SO,1,Out_C); else + tputs (MD, 1, Out_C); + } + if (A & A_Blink) + tputs (MB, 1, Out_C); + if (A & A_Underline) + tputs (UL, 1, Out_C); + if (A & A_Reverse) + {if (MR==NULL) + tputs(SO,1,Out_C); else + tputs (MR, 1, Out_C); + } + } +#else + Out_Zap(); + attrset(0); + if (A & A_Bold) + attron(A_BOLD); + if (A & A_Blink) + attron(A_BLINK); + if (A & A_Underline) + attron(A_UNDERLINE); + if (A & A_Reverse) + attron(A_REVERSE); +#endif +#endif +#if defined(VMS) + switch (Term_Type) + {case VT2XX: + case VT1XX: + case VK100: + case VT3XX: + case VT4XX: + case Default: + {Out_S("\033[0"); + if (A&A_Bold) + Out_S(";1"); + if (A&A_Blink) + Out_S(";5"); + if (A&A_Underline) + Out_S(";4"); + if (A&A_Reverse) + Out_S(";7"); + Out_C('m'); + break; + } + case ANSI: + {Out_S("\033[0m"); + if (A&A_Bold) + Out_S("\033[1m"); + if (A&A_Blink) + Out_S("\033[5m"); + if (A&A_Underline) + Out_S("\033[4m"); + if (A&A_Reverse) + Out_S("\033[7m"); + break; + } + } +#endif +#if defined(DOS) | defined(NT) + Out_Zap(); +#if !(defined(Windows) | defined(TV)) +#if defined(PC100) + Out_S("\033[0"); + if (A&A_Bold) + Out_S(";1"); + if (A&A_Blink) + Out_S(";5"); + if (A&A_Underline) + Out_S(";4"); + if (A&A_Reverse) + Out_S(";7"); + Out_C('m'); +#endif +#endif +#endif +#if defined(OS2) + Out_Zap(); +#endif +#if defined(ATARI) +#if ! defined(GEM) + if (A&A_Reverse) + Out_S("\033p"); else + Out_S("\033q"); +#else + Out_Zap(); +#endif +#endif +#if defined(MPE) + int I; + Out_S("\033&d"); + I='A'-1; + if (A&A_Blink) + I+=1; + if (A&A_Reverse) + I+=2; + if (A&A_Underline) + I+=4; + if (!(A&A_Bold)) + I+=8; + Out_C(I); +#endif + His_Attributes=A; +} + +/* Erase the screen from the current cursor position to the end of the + line +*/ +void Fast Del_To_End_Line() +{ +#if defined(UNIX) + long Col; + if ((Scr_Col!=His_Col)||(My_Line!=His_Line)) + Opt_Move_Cursor(My_Line,My_Col); + if (Scr_Width==Max_Width) + { +#if defined(TERMCAP) + switch (Term_Type) + {case ANSI: + if (His_Attributes!=0) + Opt_Force_Attributes(0); + case VT2XX: + case VT3XX: + case VT4XX: + case VT1XX: + case VK100: + Out_S("\033[K"); + break; + case VT52: + Out_S("\033K"); + break; + case Tcap: + case Default: + default: + if (His_Attributes!=0) + Opt_Force_Attributes(0); + tputs (CE, 1, Out_C); + } +#else + Out_Zap(); + clrtoeol(); +#endif + } else + {Opt_Force_Attributes(0); + Col=My_Col; + while (My_Col-Scr_Shift<=Lst_Col[My_Line+Top_Row]&&My_Col-Scr_Shift<=Scr_Width) + Opt_Char(' '); + My_Col=Col; + } +#endif +#if defined(VMS) + long Col; + if ((Scr_Col!=His_Col)||(My_Line!=His_Line)) + Opt_Move_Cursor(My_Line,My_Col); + if (Scr_Width==Max_Width) + {switch (Term_Type) + {case VT2XX: + case VT3XX: + case VT4XX: + case VT1XX: + case VK100: + case ANSI: + case Default: + Out_S("\033[K"); + break; + case VT52: + Out_S("\033K"); + } + } else + {Opt_Force_Attributes(0); + Col=My_Col; + while (My_Col-Scr_Shift<=Lst_Col[My_Line+Top_Row]&& + My_Col-Scr_Shift<=Scr_Width) + Opt_Char(' '); + My_Col=Col; + } +#endif +#if defined(DOS) | defined(NT) + Out_Zap(); +#if !(defined(Windows) | defined(TV)) +#if !defined(PC100) + if (Scr_Width-Scr_Col+1>0) + {if (Dir_Video) + Dir_Set(Sub_X+Top_Row+My_Line-1,Sub_Y+Left_Col+Scr_Col-1,' ', + Attab[0],Scr_Width-Scr_Col+1); else + {IBMcursor(Top_Row+My_Line-1,Left_Col+Scr_Col-1); + IBMcout(Scr_Width-Scr_Col+1,' ',Attab[0]); + } + } +#else + Out_S("\033[K"); +#endif +#else +#if defined(TV) + TV_Erase(My_Line,My_Col-Scr_Shift,Scr_Width-Scr_Col+Scr_Shift+1); +#else + Win_Erase(My_Line,Scr_Col,Scr_Width-Scr_Col+1); +#endif +#endif +#endif +#if defined(OS2) + char Cell[2]; + Out_Zap(); + Cell[0]=' '; + Cell[1]=Attab[0]; + VioWrtNCell((char far *)Cell,Scr_Width-Scr_Col+1, + Sub_X+My_Line-1+Top_Row,Sub_Y+Scr_Col-1+Left_Col,0); +#endif +#if defined(ATARI) +#if ! defined(GEM) + long Col; + if ((Scr_Col!=His_Col)||(My_Line!=His_Line)) + Opt_Move_Cursor(My_Line,My_Col); + if (Scr_Width==Max_Width) + {Opt_Force_Attributes(0); + Out_S("\033K"); + } else + {Opt_Force_Attributes(0); + Col=My_Col; + while (My_Col<=Lst_Col[My_Line+Top_Row]+Scr_Shift&&My_Col<=Scr_Width) + Opt_Char(' '); + My_Col=Col; + } +#else + GEM_Erase(My_Line,Scr_Col,Scr_Width-Scr_Col+1); +#endif +#endif +#if defined(MPE) + long Col; + if ((Scr_Col!=His_Col)||(My_Line!=His_Line)) + Opt_Move_Cursor(My_Line,My_Col); + if (Scr_Width==Max_Width) + {Opt_Force_Attributes(0); + Out_S("\033K"); + } else + {Opt_Force_Attributes(0); + Col=My_Col; + while (My_Col-Scr_Shift<=Lst_Col[My_Line+Top_Row]&& + My_Col-Scr_Shift<=Scr_Width) + Opt_Char(' '); + My_Col=Col; + } +#endif +} + +#if defined(UNIX) +char * Environment_Name(Suffix) +char *Suffix; +{strcpy(Dsk_Rec,getenv("TERM")); + strcat(Dsk_Rec,Suffix); +} +#endif + +#if !defined(MPE) +char *Do_Mapping(char *S) +{static char Mapped_File[80]; + switch (Mapping) + {case EDT_Mapping: + strcpy(Mapped_File,S); +#if defined(UNIX) + strcpy(strchr(Mapped_File,'.')+1,"edt"); +#else +#if defined(ATARI) + strcpy(index(Mapped_File,'.')+1,"EDT"); +#else + strcpy(strchr(Mapped_File,'.')+1,"EDT"); +#endif +#endif + break; + case WPS_Mapping: + strcpy(Mapped_File,S); +#if defined(UNIX) + strcpy(strchr(Mapped_File,'.')+1,"wps"); +#else +#if defined(ATARI) + strcpy(index(Mapped_File,'.')+1,"WPS"); +#else + strcpy(strchr(Mapped_File,'.')+1,"WPS"); +#endif +#endif + break; + case Other_Mapping: + strcpy(Mapped_File,S); +#if defined(UNIX) + strcpy(strchr(Mapped_File,'.')+1,Map_Ext); +#else +#if defined(ATARI) + strcpy(index(Mapped_File,'.')+1,Map_Ext); +#else + strcpy(strchr(Mapped_File,'.')+1,Map_Ext); +#endif +#endif + break; + } + return Mapped_File; +} +#endif + +/* Returns the name of the file containing the key mappings +*/ +char *Keyfile() +{ +#if defined(DOS) | defined(NT) | defined(OS2) | defined(ATARI) | defined(VMS) + return Do_Mapping("FUNDEF.EDT"); +#endif +#if defined(UNIX) + return Do_Mapping("fundef.edt"); +#endif +#if defined(MPE) + return "fundef.sed"; +#endif +} + +/* Returns the name of the file containing the key mappings +*/ +char *Mapfile() +{ +#if defined(UNIX) | defined(VMS) + char *S; + switch (Term_Type) + {case VT1XX: + return Do_Mapping("vt100m.map"); + case VT2XX: + return Do_Mapping("vt200m.map"); + case VT52: + return Do_Mapping("vt52m.map"); + case VK100: + return Do_Mapping("vk100m.map"); + case ANSI: + return Do_Mapping("ansim.map"); + case VT3XX: + return Do_Mapping("vt300m.map"); + case VT4XX: + return Do_Mapping("vt400m.map"); + case Tcap: + S=getenv("TERM"); + strcpy(Dsk_Rec,S); + strcat(Dsk_Rec,"m.map"); + return Do_Mapping(Dsk_Rec); +#if defined(UNIX) + case Defined: + S=Defined_Terminal; + strcpy(Dsk_Rec,S); + strcat(Dsk_Rec,"m.map"); + return Do_Mapping(Dsk_Rec); +#endif + case Default: + return Do_Mapping("defm.map"); + } +#endif +#if defined(DOS) | defined(NT) +#if !defined(Windows) +#if defined(PC100) + return Do_Mapping("RBDOSM.MAP"); +#else + if (Keyb_Type==Keyb_PC) + return Do_Mapping("PCDOSM.MAP"); else + if (Keyb_Type==Keyb_250) + return Do_Mapping("LKDOSM.MAP"); else + if (Keyb_Type==Keyb_New) + return Do_Mapping("NPDOSM.MAP"); else + if (Keyb_Type==Keyb_Conv) + return Do_Mapping("CVDOSM.MAP"); else + if (Keyb_Type==Keyb_AT) + return Do_Mapping("ATDOSM.MAP"); else + if (Keyb_Type==Keyb_SLT) + return Do_Mapping("SLTDOSM.MAP"); else + if (Keyb_Type==Keyb_Special) + {strcpy(Keyb_File,Keyb_Name); + strcat(Keyb_File,"DOSM.MAP"); + return Do_Mapping(Keyb_File); + } else + switch (Term_Type) + {case IBM_PC: + case IBM_XT: + return Do_Mapping("PCDOSM.MAP"); + case IBM_AT: + return Do_Mapping("ATDOSM.MAP"); + case IBM_Conv: + return Do_Mapping("CVDOSM.MAP"); + case PCXX: + return Do_Mapping("LKDOSM.MAP"); + case TANDY_1400: + return Do_Mapping("TCDOSM.MAP"); + case Default: + return Do_Mapping("defdosm.map"); + default: + return Do_Mapping("NPDOSM.MAP"); + } +#endif +#else + if (Keyb_Type==Keyb_PC) + return Do_Mapping("PCWINM.MAP"); else + if (Keyb_Type==Keyb_250) + return Do_Mapping("LKWINM.MAP"); else + if (Keyb_Type==Keyb_New) + return Do_Mapping("NPWINM.MAP"); else + if (Keyb_Type==Keyb_Conv) + return Do_Mapping("CVWINM.MAP"); else + if (Keyb_Type==Keyb_AT) + return Do_Mapping("ATWINM.MAP"); else + if (Keyb_Type==Keyb_SLT) + return Do_Mapping("SLTWINM.MAP"); else + if (Keyb_Type==Keyb_Special) + {strcpy(Keyb_File,Keyb_Name); + strcat(Keyb_File,"WINM.MAP"); + return Do_Mapping(Keyb_File); + } else + switch (Term_Type) + {case IBM_PC: + case IBM_XT: + return Do_Mapping("PCWINM.MAP"); + case IBM_AT: + return Do_Mapping("ATWINM.MAP"); + case IBM_Conv: + return Do_Mapping("CVWINM.MAP"); + case PCXX: + return Do_Mapping("LKWINM.MAP"); + case TANDY_1400: + return Do_Mapping("TCWINM.MAP"); + case Default: + return Do_Mapping("defwinm.map"); + default: + return Do_Mapping("NPWINM.MAP"); + } +#endif +#endif +#if defined(OS2) + if (Keyb_Type==Keyb_PC) + return Do_Mapping("PCOS2M.MAP"); else + if (Keyb_Type==Keyb_250) + return Do_Mapping("LKOS2M.MAP"); else + if (Keyb_Type==Keyb_New) + return Do_Mapping("NPOS2M.MAP"); else + if (Keyb_Type==Keyb_Conv) + return Do_Mapping("CVOS2M.MAP"); else + if (Keyb_Type==Keyb_AT) + return Do_Mapping("ATOS2M.MAP"); else + if (Keyb_Type==Keyb_SLT) + return Do_Mapping("SLTOS2M.MAP"); else + if (Keyb_Type==Keyb_Special) + {strcpy(Keyb_File,Keyb_Name); + strcat(Keyb_File,"OS2M.MAP"); + return Do_Mapping(Keyb_File); + } else + switch (Term_Type) + {case IBM_PC: + case IBM_XT: + return Do_Mapping("PCOS2M.MAP"); + case IBM_AT: + return Do_Mapping("ATOS2M.MAP"); + case IBM_Conv: + return Do_Mapping("CVOS2M.MAP"); + case PCXX: + return Do_Mapping("LKOS2M.MAP"); + case TANDY_1400: + return Do_Mapping("TCOS2M.MAP"); + case Default: + return Do_Mapping("defos2m.map"); + default: + return Do_Mapping("NPOS2M.MAP"); + } +#endif +#if defined(ATARI) + return Do_Mapping("STTOSM.MAP"); +#endif +#if defined(MPE) + return "map.sed"; +#endif +} + +/* Returns the name of the help file for the current terminal type +*/ +char *Helpfile() +{ +#if defined(UNIX) | defined(VMS) + char *S; + switch (Term_Type) + {case VT1XX: + return Do_Mapping("vt100h.hlp"); + case VT2XX: + return Do_Mapping("vt200h.hlp"); + case VT52: + return Do_Mapping("vt52h.hlp"); + case VK100: + return Do_Mapping("vk100h.hlp"); + case ANSI: + return Do_Mapping("ansih.hlp"); + case VT3XX: + return Do_Mapping("vt300h.hlp"); + case VT4XX: + return Do_Mapping("vt400h.hlp"); + case Tcap: + S=getenv("TERM"); + strcpy(Dsk_Rec,S); + strcat(Dsk_Rec,"h.hlp"); + return Do_Mapping(Dsk_Rec); +#if defined(UNIX) + case Defined: + S=Defined_Terminal; + strcpy(Dsk_Rec,S); + strcat(Dsk_Rec,"h.hlp"); + return Do_Mapping(Dsk_Rec); +#endif + case Default: + return Do_Mapping("defh.hlp"); + } +#endif +#if defined(DOS) | defined(NT) +#if !defined(Windows) +#if defined(PC100) + return Do_Mapping("RBDOSH.HLP"); +#else + if (Keyb_Type==Keyb_PC) + return Do_Mapping("PCDOSH.HLP"); else + if (Keyb_Type==Keyb_250) + return Do_Mapping("LKDOSH.HLP"); else + if (Keyb_Type==Keyb_New) + return Do_Mapping("NPDOSH.HLP"); else + if (Keyb_Type==Keyb_Conv) + return Do_Mapping("CVDOSH.HLP"); else + if (Keyb_Type==Keyb_AT) + return Do_Mapping("ATDOSH.HLP"); else + if (Keyb_Type==Keyb_SLT) + return Do_Mapping("SLTDOSH.HLP"); else + if (Keyb_Type==Keyb_Special) + {strcpy(Keyb_File,Keyb_Name); + strcat(Keyb_File,"DOSH.MAP"); + return Do_Mapping(Keyb_File); + } else + switch (Term_Type) + {case IBM_PC: + case IBM_XT: + return Do_Mapping("PCDOSH.HLP"); + case IBM_AT: + return Do_Mapping("ATDOSH.HLP"); + case IBM_Conv: + return Do_Mapping("CVDOSH.HLP"); + case PCXX: + return Do_Mapping("ATDOSH.HLP"); + case TANDY_1400: + return Do_Mapping("TCDOSH.HLP"); + case Default: + return Do_Mapping("defdosh.hlp"); + default: + return Do_Mapping("NPDOSH.HLP"); + } +#endif +#else + if (Keyb_Type==Keyb_PC) + return Do_Mapping("PCWINH.HLP"); else + if (Keyb_Type==Keyb_250) + return Do_Mapping("LKWINH.HLP"); else + if (Keyb_Type==Keyb_New) + return Do_Mapping("NPWINH.HLP"); else + if (Keyb_Type==Keyb_Conv) + return Do_Mapping("CVWINH.HLP"); else + if (Keyb_Type==Keyb_AT) + return Do_Mapping("ATWINH.HLP"); else + if (Keyb_Type==Keyb_SLT) + return Do_Mapping("SLTWINH.HLP"); else + if (Keyb_Type==Keyb_Special) + {strcpy(Keyb_File,Keyb_Name); + strcat(Keyb_File,"WINH.MAP"); + return Do_Mapping(Keyb_File); + } else + switch (Term_Type) + {case IBM_PC: + case IBM_XT: + return Do_Mapping("PCWINH.HLP"); + case IBM_AT: + return Do_Mapping("ATWINH.HLP"); + case IBM_Conv: + return Do_Mapping("CVWINH.HLP"); + case PCXX: + return Do_Mapping("LKWINH.HLP"); + case TANDY_1400: + return Do_Mapping("TCWINH.HLP"); + case Default: + return Do_Mapping("defwinh.hlp"); + default: + return Do_Mapping("NPWINH.HLP"); + } +#endif +#endif +#if defined(OS2) + if (Keyb_Type==Keyb_PC) + return Do_Mapping("PCOS2H.HLP"); else + if (Keyb_Type==Keyb_250) + return Do_Mapping("LKOS2H.HLP"); else + if (Keyb_Type==Keyb_New) + return Do_Mapping("NPOS2H.HLP"); else + if (Keyb_Type==Keyb_Conv) + return Do_Mapping("CVOS2H.HLP"); else + if (Keyb_Type==Keyb_AT) + return Do_Mapping("ATOS2H.HLP"); else + if (Keyb_Type==Keyb_SLT) + return Do_Mapping("SLTOS2H.HLP"); else + if (Keyb_Type==Keyb_Special) + {strcpy(Keyb_File,Keyb_Name); + strcat(Keyb_File,"OS2H.MAP"); + return Do_Mapping(Keyb_File); + } else + switch (Term_Type) + {case IBM_PC: + case IBM_XT: + return Do_Mapping("PCOS2H.HLP"); + case IBM_AT: + return Do_Mapping("ATOS2H.HLP"); + case IBM_Conv: + return Do_Mapping("CVOS2H.HLP"); + case PCXX: + return Do_Mapping("ATOS2H.HLP"); + case TANDY_1400: + return Do_Mapping("TCOS2H.HLP"); + case Default: + return Do_Mapping("defos2h.hlp"); + default: + return Do_Mapping("NPOS2H.HLP"); + } +#endif +#if defined(ATARI) + return Do_Mapping("STTOSH.HLP"); +#endif +#if defined(MPE) + return "help.sed"; +#endif +} + +/* Get a character from the console. +*/ +void Fast Conin() +{ +#if defined(OS2) + struct _KBDKEYINFO Key_Data; + struct _NOPTRRECT No_Pointer; +#endif +#if defined(DOS) & !(defined(Windows) | defined(TV)) + int M1; +#endif +#if defined(ATARI) + long Con_Input; +#endif +#if defined(VMS) + if (Got_In==This_In) + {Upd_Header(); + if (Force_Cursor) + {Force_Cursor=0; + Set_Cursor(My_Line,(int)My_Col); + } else + if (My_Col-Scr_Shift!=His_Col||My_Line!=His_Line) + Opt_Move_Cursor(My_Line,My_Col); + if (Cur_Attributes!=His_Attributes) + Opt_Force_Attributes(Cur_Attributes); + Out_Zap(); + do + Got_In=Get_Input(); + while (Got_In==0); + This_In=0; + } + Character=TTY_Buffer[This_In++]&255; + Do_Echo=0; +#else + if (My_Col-Scr_Shift!=His_Col||My_Line!=His_Line) + Opt_Move_Cursor(My_Line,My_Col); + Out_Zap(); +#endif +#if defined(UNIX) +#if !defined(TERMCAP) + refresh(); +#endif +#if defined(UNIX) + if (Same_Character) + { + Same_Character=0; + Character=Saved_Character; + } + else + { +#endif +#if defined(TERMCAP) + Character=UGetrm(); +#else + Character=getch(); +#endif +#if defined(UNIX) + Saved_Character=Character; + } +#endif + Scancode=255; +#endif +#if defined(DOS) | defined(NT) +#if !(defined(Windows) | defined(TV)) + if (Gotmouse&&Mouse_OK) + {M1=1; + Mouse(&M1,NULL,NULL,NULL); + M1=1; + Mouse(&M1,NULL,NULL,NULL); + } +#if defined(PC100) + while ((Character=bdos(0x07,0,0)&255)==0); + Scancode=255; +#else +#if defined(DESQVIEW) + if (DV) + {Save_Row=Save_Col=0; + while (1) + {if (ptr_sizeof(Ptr)!=0) + {ptr_read(Ptr,(char far *)&Ptr_Buf,(int far *)&Buflen); + /*Diag("Mouse:Row=%d,Col=%d,Button%d,Move=%d", + Ptr_Buf->Row,Ptr_Buf->Column,Ptr_Buf->Status&3,Ptr_Buf->Status&64);*/ + if (!(Ptr_Buf->Status&64)) + {if ((Ptr_Buf->Status&3)==1) + {Save_Row=Ptr_Buf->Row; + Save_Col=Ptr_Buf->Column; + Mouse_Call(Ptr_Buf->Row,Ptr_Buf->Column, + (Ptr_Buf->Status&3)==1,(Ptr_Buf->Status&3)==2,0); + } + } else + if ((Save_Row!=Ptr_Buf->Row||Save_Col!=Ptr_Buf->Column)&& + (Ptr_Buf->Status&3)==1) + {Mouse_Call(Save_Row,Save_Col,1,0,1); + Mouse_Call(Ptr_Buf->Row,Ptr_Buf->Column,1,0,1); + Mouse_Call(Ptr_Buf->Row,Ptr_Buf->Column,0,0,0); + } + } + if (Firmware&1?ANYEXT():ANYCHR()) + break; + api_pause(); + } + } +#endif + if (Firmware&1) + Character=GETEXT((int far *)&Scancode); else + Character=GETSCAN((int far *)&Scancode); +#endif + if (Gotmouse&&Mouse_OK) + {M1=2; + Mouse(&M1,NULL,NULL,NULL); + } + /*Diag("Conin:Character=%d,Scancode=%d",Character,Scancode);*/ +#else +#if defined(TV) + TV_Char(); +#else + WinChar(); +#endif + if (Not_End==0) + return; + /*Diag("Conin:Scancode=%d,Character=%d",Scancode,Character);*/ +#endif +#endif +#if defined(ATARI) +#if defined(GEM) + Con_Input=GEM_char(Mouse_OK); + if (Not_End==0) + return; + Character=Con_Input&0xFF; + Scancode=(Con_Input>>8)&0xFF; +#else + if (Key_Count||Cconis()!=0) + {while (Cconis()!=0) + {if (Key_Count<20) + Key_Buffer[Key_Count++]=Crawcin(); else + Crawcin(); + } + Con_Input=Key_Buffer[0]; + Key_Count--; + {register int I; + for (I=0;I>16)&0xFF; +#endif +#endif +#if defined(MPE) + {char data[4]; + FREAD(mpe_stdin, (unsigned short *)data,-1); + Character=data[0]; + if (Character==':') + {int dummy; + FSETMODE(mpe_stdin,0); + FCLOSE(mpe_stdin,0,0); + mpe_stdin=FOPEN("$STDIN"); + FCONTROL(mpe_stdin,27,&dummy); + FCONTROL(mpe_stdin,13,&dummy); + FSETMODE(mpe_stdin,4); + } + } +#endif +#if defined(OS2) + if (Gotmouse) + {MouDrawPtr(Mouse_Handle); + DosSemClear((HSEM)&Mouse_Sem); + } + do + {KbdCharIn((PKBDKEYINFO)&Key_Data,0,0); + Character=Key_Data.chChar; + Scancode=Key_Data.chScan; + } while ((Key_Data.fbStatus&&0x40)==0); + if (Gotmouse) + {DosSemRequest((HSEM)&Mouse_Sem,-1L); + No_Pointer.row=0; + No_Pointer.col=0; + No_Pointer.cRow=Scr_Length-1; + No_Pointer.cCol=Scr_Width-1; + MouRemovePtr((PNOPTRRECT)&No_Pointer,Mouse_Handle); + } + if (Scancode==0x45) + {Kbd_Status.cb=10; + KbdGetStatus((PKBDINFO)&Kbd_Status,0); + Kbd_Status.fsMask=1<<4; + Kbd_Status.fsState|=(1<<5); + KbdSetStatus((PKBDINFO)&Kbd_Status,0); + } else + if (Scancode==0x46) + {Kbd_Status.cb=10; + KbdGetStatus((PKBDINFO)&Kbd_Status,0); + Kbd_Status.fsMask=1<<4; + Kbd_Status.fsState&=~(1<<4); + KbdSetStatus((PKBDINFO)&Kbd_Status,0); + } +#endif + /*Diag("Conin:Scancode=%x,Character=%x",Scancode,Character);*/ +} + +/* Get a key from the keyboard. +*/ +void Fast Getkbd() +{int Done; + Function=0; + Done=0; + while (!Done) + {Getkey(); + if (Check_Comb(0,0)<0) + Key_Error(); else + {Map_Index= -1; + {register int I; + for (I=0;;I++) + {if (I==Map_Defs) + {Done=1; + break; + } + if (Map_Tab[I].Flags&Gold_Code?Gold:!Gold) + {if (Map_Tab[I].Char==Key_Number&&(Map_Tab[I].Flags&Key_Code)) + {if (Map_Tab[I].F_Code==0) + Gold=1; else + {if ((Function=Map_Tab[I].F_Code)<0) + Function=0; + Map_Index=I; + Done=1; + } + break; + } else + if (Map_Tab[I].Scancode==Scancode&&Map_Tab[I].Char==Character) + {if (Enhanced&&(Map_Tab[I].Flags&Ext_Code)) + {if (Map_Tab[I].F_Code==0) + Gold=1; else + {if ((Function=Map_Tab[I].F_Code)<0) + Function=0; + Map_Index=I; + Done=1; + } + break; + } else + if (!Enhanced&&!(Map_Tab[I].Flags&Ext_Code)) + {if (Map_Tab[I].F_Code==0) + Gold=1; else + {if ((Function=Map_Tab[I].F_Code)<0) + Function=0; + Map_Index=I; + Done=1; + } + break; + } + } else + if (Map_Tab[I].Char==Character&&(Map_Tab[I].Flags&Char_Code)) + {if (Map_Tab[I].F_Code==0) + Gold=1; else + {if ((Function=Map_Tab[I].F_Code)<0) + Function=0; + Map_Index=I; + Done=1; + } + break; + } + } + } + } + } + } + return; +} + +void Fast Getkey() +{Conin(); + if (Scancode==0) + {Enhanced=1; + Scancode=Character; + } else + Enhanced=0; + /*Diag("Getkey:Scancode=%d,Character=%d",Scancode,Character);*/ + if (Scancode==Character) + {register int I; + for (I=0;I"); + } + if (His_Attributes!=0) + Opt_Force_Attributes(0); + Set_Scroll (1, Max_Length); + Out_Zap (); +#else + Out_Zap(); + clear(); + refresh(); + endwin(); +#endif +#endif +#if defined(VMS) + switch (Term_Type) + {case VT2XX: + case VT3XX: + case VT4XX: + case ANSI: + case VT1XX: + case VK100: + if (!VMS_Application) + Out_S("\033>"); + } + if (Gotmouse) /* 290a */ + Disable_Mouse(); + Opt_Force_Attributes(0); + Set_Scroll(1,Max_Length); /* 290a */ + Out_Zap(); +#endif +#if defined(DOS) | defined(NT) +#if !defined(Windows) +#if !defined(TV) + int P1, P2, P3, P4; + if (Use_Mouse) + {if (Gotmouse) + Clear_Mouse(); + } +#endif +#if defined(PC100) + Opt_Force_Attributes(0); + Out_S("\033>"); + Set_Scroll(1,Max_Length); + Out_Zap(); +#else +#if !defined(TV) + if (EGA43) + {Clr43(); + if (Gotmouse) + {P1=7; + P3=0; + P4=639; + Mouse(&P1,&P2,&P3,&P4); + P1=8; + P3=0; + P4=199; + Mouse(&P1,&P2,&P3,&P4); + } + } else + if (Old_Mode) + Set_Mode(Old_Mode); +#endif + if (Keyb_Type==Keyb_250&&Term_Type!=IBM_XT&&Term_Type!=IBM_PC&& + Term_Type!=IBM_Conv&&Term_Type!=TANDY_1400) + {if (!DEC_Mode) + SENDCMD(0xAD); + } + if (Set_Num_Lock>=0) + RESNUMLOCK(); +#endif +#else + if (Set_Num_Lock>=0) + Win_Reset_Num_Lock(); +#endif +#endif +#if defined(OS2) + char Cell[2]; + if (EGA43) + {Mode_Data.row=Old_Length; + VioSetMode((PVIOMODEINFO)&Mode_Data,0); + if (Old_Length==25) + {Cursor_Data.yStart=12; + Cursor_Data.cEnd=13; + } else + {Cursor_Data.yStart=7; + Cursor_Data.cEnd=7; + } + VioSetCurType((PVIOCURSORINFO)&Cursor_Data,0); + } + Kbd_Status.cb=20; + KbdGetStatus((PKBDINFO)&Kbd_Status,0); + Kbd_Status.fsMask=1<<4; + Kbd_Status.fsState&=~((1<<4)+(1<<5)); + Kbd_Status.fsState|=Sav_Shift_State&((1<<4)+(1<<5)); + KbdSetStatus((PKBDINFO)&Kbd_Status,0); +#endif +#if defined(ATARI) & ! defined(GEM) + Opt_Force_Attributes(0); + Cursconf(1,0); + Out_Zap(); +#endif +#if defined(MPE) + int dummy; + Opt_Force_Attributes(0); + Out_S("\033&s0A"); + Clr_Screen(); + Out_Zap(); + FCONTROL(mpe_stdin,26,&dummy); + FCONTROL(mpe_stdin,12,&dummy); + FSETMODE(mpe_stdin,0); + FCLOSE(mpe_stdin,0,0); + FCLOSE(mpe_stdout,0,0); +#endif + if (Reset_T_String[0]!=0) + {Out_S(Reset_T_String); + Out_Zap(); + } +} + +/* Make the screen 132 characters wide if possible +*/ +void Fast Wide_Screen() +{ +#if (defined(DOS) & !(defined(Windows) | defined(TV)) & defined(PC100)) | defined(VMS) | defined(UNIX) + Phys_Width=Max_Width=132; + Sav_Window(Cur_Buffer); + {register int I; + for (I=Buffers-1;I>=0;I--) + {Out_Zap(); + Load_Window(Cur_Buffer=Buffer_Stack[I]); + if (Scr_Width==80) + Scr_Width=132; + Sav_Window(Cur_Buffer); + } + } + Out_S("\033[?3h"); +#endif +} + +/* Make the screen 80 characters wide if 132 character displays are + possible +*/ +void Fast Narrow_Screen() +{ +#if (defined(DOS) & !(defined(Windows) | defined(TV)) & defined(PC100)) | defined(VMS) | defined(UNIX) + Phys_Width=Max_Width=80; + Sav_Window(Cur_Buffer); + {register int I; + for (I=Buffers-1;I>=0;I--) + {Out_Zap(); + Load_Window(Cur_Buffer=Buffer_Stack[I]); + if (Left_Col>79) + Left_Col=79; + if (Left_Col+Scr_Width>80) + Scr_Width=80-Left_Col; + Sav_Window(Cur_Buffer); + } + } + Out_S("\033[?3l"); +#endif +} + +void Fast Term_Error() +{Error(2,Unrecognized_Terminal_Txt); +} + +void Fast Key_Error() +{Error(2,Illegal_Keystroke_Txt); + Err_Flag=0; +} + +void Fast Esc_Error() +{Error(2,Undefined_Escape_Txt); +} + +#if defined(DOS) | defined(NT) +#if !(defined(Windows) | defined(TV)) +void Fast Mouse(int *P1,int *P2,int *P3,int *P4) +{union REGS Regs; + if (P1!=NULL) + Regs.x.ax=*P1; + if (P2!=NULL) + Regs.x.bx=*P2; + if (P3!=NULL) + Regs.x.cx=*P3; + if (P4!=NULL) + Regs.x.dx=*P4; + int86(51,&Regs,&Regs); + if (P1!=NULL) + *P1=Regs.x.ax; + if (P2!=NULL) + *P2=Regs.x.bx; + if (P3!=NULL) + *P3=Regs.x.cx; + if (P4!=NULL) + *P4=Regs.x.dx; +} +#endif +#endif -- cgit v1.2.3