/*************************************************************** * vt100 - terminal emulator - initialization * * v2.6 870227 DBW - bug fixes for all the stuff in v2.5 * v2.5 870214 DBW - more additions (see readme file) * v2.4 861214 DBW - lots of fixes/additions (see readme file) * v2.3 861101 DBW - minor bug fixes * v2.2 861012 DBW - more of the same * v2.1 860915 DBW - new features (see README) * 860901 ACS - Added Parity and Word Length and support code * 860823 DBW - Integrated and rewrote lots of code * v2.0 860809 DBW - Major rewrite * v1.1 860720 DBW - Switches, 80 cols, colors, bug fixes * v1.0 860712 DBW - First version released * ***************************************************************/ #include "vt100.h" char line[256]; static char cmds[] = "V^GRSBLHXEOIT.DWKCZ"; char *InitDefaults(argc,argv) int argc; char **argv; { FILE *fd; char *p; int l; doing_init = 1; /* make sure we only allow INIT script commands */ if (((argc > 1) && (fd=fopen(argv[1],"r")) != 0) || (fd=fopen("vt100.init","r")) != 0 || (fd=fopen("s:vt100.init","r")) != 0) { while (fgets(line,256,fd) != 0) { line[strlen(line)-1] = '\000'; p = next_wrd(&line[0],&l); if (*p) { *p |= ' '; if (p[1]) p[1] |= ' '; if (*p == '#') continue; if (*p == 'e' && p[1] == 'x') break; exe_cmd(p,l); } } fclose(fd); } doing_init = 0; /* Now set up all the screen info as necessary */ if (p_interlace == 0) { if (p_lines > 24) p_lines = 24; MINY = 14; NewWindow.Height = (long)((p_lines*8)+8); } else { if (p_lines > 48) p_lines = 48; MINY = 16; NewScreen.ViewModes |= LACE; NewWindow.Height = (long)((p_lines*8)+10); } NewWindow.MinHeight = NewWindow.Height; NewWindow.MaxHeight = NewWindow.Height; NewWindow.TopEdge = 0L; MAXY = ((p_lines-1)*8) + MINY; top = MINY; bot = MAXY; savx = MINX; savy = MINY; if (p_screen == 1) { if (p_depth > 2) p_depth = 2; if (p_depth < 1) p_depth = 1; NewScreen.Depth = (long)p_depth; NewScreen.Height = (long)((p_lines*8)+16); if (p_interlace == 1) NewScreen.TopEdge = (long)(400 - NewScreen.Height); else NewScreen.TopEdge = (long)(208 - NewScreen.Height); } else { p_depth = 2L; NewWindow.TopEdge = 0L; NewWindow.Screen = NULL; NewWindow.Type = WBENCHSCREEN; } /* see if we exit with a startup script */ if (*p == 'e') { p = next_wrd(p+l+1,&l); if (*p) return(p); } return(NULL); } void InitDevs() { USHORT colors[4]; int i; BYTE *b,*c; IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library", INTUITION_REV); if( IntuitionBase == NULL ) cleanup("can't open intuition",1); GfxBase = (struct GfxBase *) OpenLibrary("graphics.library",GRAPHICS_REV); if( GfxBase == NULL ) cleanup("can't open graphics library",2); if (p_screen == 1) { if ((myscreen = (struct Screen *)OpenScreen(&NewScreen)) == NULL) cleanup("can't open screen",3); NewWindow.Screen = myscreen; } if ((mywindow = (struct Window *)OpenWindow(&NewWindow)) == NULL) cleanup("can't open window",4); if ((myfont = (struct TextFont *)OpenFont(&myattr)) == NULL) cleanup("can't open font",4); myviewport = (struct ViewPort *)ViewPortAddress(mywindow); myrastport = (struct RastPort *)mywindow->RPort; SetFont(myrastport,myfont); if (p_depth > 1) myrequest.BackFill = 2; if (p_screen != 0 && p_wbcolors == 0) { colors[0] = p_background; colors[1] = p_foreground; colors[2] = p_bold; colors[3] = p_cursor; if (p_depth == 1) LoadRGB4(myviewport,(struct ColorMap *)colors,2L); else LoadRGB4(myviewport,(struct ColorMap *)colors,4L); } Read_Request = (struct IOExtSer *) AllocMem((long)sizeof(*Read_Request),MEMF_PUBLIC|MEMF_CLEAR); Read_Request->io_SerFlags = 0L; Read_Request->IOSer.io_Message.mn_ReplyPort = CreatePort(0L,0L); if(OpenDevice(SERIALNAME,NULL,Read_Request,NULL)) cleanup("Cant open Read device",5); rs_in = malloc(p_buffer+1); Read_Request->io_SerFlags = 0L; Read_Request->io_Baud = p_baud; Read_Request->io_ReadLen = 8L; Read_Request->io_WriteLen = 8L; Read_Request->io_CtlChar = 0x11130000L; Read_Request->io_RBufLen = p_buffer; Read_Request->io_BrkTime = p_break; Read_Request->IOSer.io_Command = SDCMD_SETPARAMS; DoIO(Read_Request); Read_Request->IOSer.io_Command = CMD_READ; Read_Request->IOSer.io_Length = 1; Read_Request->IOSer.io_Data = (APTR) &rs_in[0]; Write_Request = (struct IOExtSer *) AllocMem((long)sizeof(*Write_Request),MEMF_PUBLIC|MEMF_CLEAR); b = (BYTE *)Read_Request; c = (BYTE *)Write_Request; for (i=0;iIOSer.io_Message.mn_ReplyPort = CreatePort(0L,0L); Write_Request->IOSer.io_Command = CMD_WRITE; Write_Request->IOSer.io_Length = 1; Write_Request->IOSer.io_Data = (APTR) &rs_out[0]; Timer_Port = CreatePort("Timer Port",0L); Script_Timer_Port = CreatePort("Timer Port",0L); if (OpenDevice(TIMERNAME, UNIT_VBLANK, (char *) &Timer, 0) || OpenDevice(TIMERNAME, UNIT_VBLANK, (char *) &Script_Timer, 0)) cleanup("can't open timer device",7); Timer.tr_node.io_Message.mn_ReplyPort = Timer_Port; Timer.tr_node.io_Command = TR_ADDREQUEST; Timer.tr_node.io_Flags = 0; Timer.tr_node.io_Error = 0; Script_Timer.tr_node.io_Message.mn_ReplyPort = Script_Timer_Port; Script_Timer.tr_node.io_Command = TR_ADDREQUEST; Script_Timer.tr_node.io_Flags = 0; Script_Timer.tr_node.io_Error = 0; BeepWave = (UBYTE *)AllocMem(BEEPSIZE,(long)(MEMF_CHIP|MEMF_CLEAR)); if (BeepWave != 0) BeepWave[0] = 100; Audio_Port = CreatePort("Audio Port",0L); Audio_Request.ioa_Request.io_Message.mn_ReplyPort = Audio_Port; Audio_Request.ioa_Request.io_Message.mn_Node.ln_Pri = 85; Audio_Request.ioa_Data = Audio_AllocMap; Audio_Request.ioa_Length = (ULONG) sizeof(Audio_AllocMap); if (OpenDevice(AUDIONAME, NULL, (char *) &Audio_Request, NULL)) cleanup("can't open audio device",8); Audio_Request.ioa_Request.io_Command = CMD_WRITE; Audio_Request.ioa_Request.io_Flags = ADIOF_PERVOL; Audio_Request.ioa_Data = BeepWave; Audio_Request.ioa_Length = BEEPSIZE; Audio_Request.ioa_Period = COLORCLOCK / (BEEPSIZE * BEEPFREQ); Audio_Request.ioa_Volume = p_volume; Audio_Request.ioa_Cycles = 100; } /*****************************************************************/ /* The following function initializes the structure arrays */ /* needed to provide the File menu topic. */ /*****************************************************************/ void InitFileItems() { int n,nplus1; /* initialize each menu item and IntuiText with loop */ for( n=0; n= 2 && n <= 7) { FileItem[n].Command = cmds[n-2]; FileItem[n].Flags |= COMMSEQ; } else FileItem[n].Command = 0; FileItem[n].SubItem = NULL; FileItem[n].NextSelect = 0; FileText[n].FrontPen = 0; FileText[n].BackPen = 1; FileText[n].DrawMode = JAM2;/* render in fore and background */ FileText[n].LeftEdge = 0; FileText[n].TopEdge = 1; FileText[n].ITextFont = NULL; FileText[n].NextText = NULL; } FileItem[FILEMAX-1].NextItem = NULL; /* initialize text for specific menu items */ FileText[0].IText = (UBYTE *)"Ascii Capture"; FileText[1].IText = (UBYTE *)"Ascii Send"; FileText[2].IText = (UBYTE *)"Xmodem Receive"; FileText[3].IText = (UBYTE *)"Xmodem Send"; FileText[4].IText = (UBYTE *)"Kermit Get"; FileText[5].IText = (UBYTE *)"Kermit Receive"; FileText[6].IText = (UBYTE *)"Kermit Send"; FileText[7].IText = (UBYTE *)"Kermit BYE"; } /****************************************************************** /* Main Comm menu /* set up for Baud & Parity submenus /******************************************************************/ void InitCommItems() { int n,nplus1; /* initialize each menu item and IntuiText with loop */ for( n=0; n= 1 && n <= 2) { RSItem[n].Command = cmds[n+5]; RSItem[n].Flags |= COMMSEQ; } else RSItem[n].Command = 0; RSItem[n].SubItem = NULL; RSItem[n].NextSelect = 0; RSText[n].FrontPen = 0; RSText[n].BackPen = 1; RSText[n].DrawMode = JAM2; /* render in fore and background */ RSText[n].LeftEdge = 0; RSText[n].TopEdge = 1; RSText[n].ITextFont = NULL; RSText[n].NextText = NULL; } RSItem[RSMAX-1].NextItem = NULL; /* select baud item chekced */ switch (p_baud) { case 300: n = 0; break; case 1200: n = 1; break; case 2400: n = 2; break; case 4800: n = 3; break; case 9600: n = 4; break; default: n = 2; p_baud = 2400; } RSItem[n].Flags |= CHECKED; /* initialize text for specific menu items */ RSText[0].IText = (UBYTE *)" 300"; RSText[1].IText = (UBYTE *)" 1200"; RSText[2].IText = (UBYTE *)" 2400"; RSText[3].IText = (UBYTE *)" 4800"; RSText[4].IText = (UBYTE *)" 9600"; /*****************************************************************/ /* The following initializes the structure arrays */ /* needed to provide the Parity Submenu topic. */ /*****************************************************************/ for( n=0; n 3) UtilItem[n].Flags |= CHECKIT; UtilItem[n].MutualExclude = 0; UtilItem[n].ItemFill = (APTR)&UtilText[n]; UtilItem[n].SelectFill = NULL; if (n == 0 || n == 2) { UtilItem[n].Command = cmds[(n==0)?13:14]; UtilItem[n].Flags |= COMMSEQ; } else if (n >= 5) { UtilItem[n].Command = cmds[n+10]; UtilItem[n].Flags |= COMMSEQ; } else UtilItem[n].Command = 0; UtilItem[n].SubItem = NULL; UtilItem[n].NextSelect = 0; UtilText[n].FrontPen = 0; UtilText[n].BackPen = 1; UtilText[n].DrawMode = JAM2;/* render in fore and background */ UtilText[n].LeftEdge = 0; UtilText[n].TopEdge = 1; UtilText[n].ITextFont = NULL; UtilText[n].NextText = NULL; } UtilItem[UTILMAX-1].NextItem = NULL; if (p_echo) UtilItem[4].Flags |= CHECKED; if (p_wrap) UtilItem[5].Flags |= CHECKED; if (p_keyapp == 0) UtilItem[6].Flags |= CHECKED; if (p_curapp) UtilItem[7].Flags |= CHECKED; if (p_bs_del) UtilItem[8].Flags |= CHECKED; /* initialize text for specific menu items */ UtilText[0].IText = (UBYTE *)"Send Break"; UtilText[1].IText = (UBYTE *)"Hang Up"; UtilText[2].IText = (UBYTE *)"Change Dir"; UtilText[3].IText = (UBYTE *)"Clear Scrn"; UtilText[4].IText = (UBYTE *)" Echo"; UtilText[5].IText = (UBYTE *)" Wrap"; UtilText[6].IText = (UBYTE *)" Num Key"; UtilText[7].IText = (UBYTE *)" App Cur"; UtilText[8].IText = (UBYTE *)" BS<->DEL"; } /****************************************************************/ /* The following function inits the Menu structure array with */ /* appropriate values for our simple menu. Review the manual */ /* if you need to know what each value means. */ /****************************************************************/ void InitMenu() { menu[0].NextMenu = &menu[1]; menu[0].LeftEdge = 5; menu[0].TopEdge = 0; menu[0].Width = 40; menu[0].Height = 10; menu[0].Flags = MENUENABLED; menu[0].MenuName = "File"; /* text for menu-bar display */ menu[0].FirstItem = &FileItem[0]; /* pointer to first item in list */ menu[1].NextMenu = &menu[2]; menu[1].LeftEdge = 55; menu[1].TopEdge = 0; menu[1].Width = 88; menu[1].Height = 10; menu[1].Flags = MENUENABLED; menu[1].MenuName = "Comm Setup"; /* text for menu-bar display */ menu[1].FirstItem = &CommItem[0]; /* pointer to first item in list */ menu[2].NextMenu = &menu[3]; menu[2].LeftEdge = 153; menu[2].TopEdge = 0; menu[2].Width = 56; menu[2].Height = 10; menu[2].Flags = MENUENABLED; menu[2].MenuName = "Script"; /* text for menu-bar display */ menu[2].FirstItem = &ScriptItem[0]; /* pointer to first item in list*/ menu[3].NextMenu = NULL; menu[3].LeftEdge = 225; menu[3].TopEdge = 0; menu[3].Width = 64; menu[3].Height = 10; menu[3].Flags = MENUENABLED; menu[3].MenuName = "Utility"; /* text for menu-bar display */ menu[3].FirstItem = &UtilItem[0]; /* pointer to first item in list*/ }