koreth@ssyx.ucsc.edu (Steven Grimm) (03/03/89)
Submitted-by: sun.com!laidbak!katzung (Brian Katzung) Posting-number: Volume 2, Issue 20 Archive-name: uw/part02 #!/bin/sh # this is part 2 of a multipart archive # do not concatenate these parts, unpack them in order with /bin/sh # file KERMIT.C continued # CurArch=2 if test ! -r s2_seq_.tmp then echo "Please unpack part 1 first!" exit 1; fi ( read Scheck if test "$Scheck" != $CurArch then echo "Please unpack part $Scheck next!" exit 1; else exit 0; fi ) < s2_seq_.tmp || exit 1 sed 's/^X//' << 'SHAR_EOF' >> KERMIT.C X numtry = 0; /* Reset try counter */ X return(state); /* Stay in Data state */ X } X else return('A'); /* Not previous packet, "abort" */ X X case 'Z': /* End-Of-File */ X if (num != n) return('A'); /* Must have right packet number */ X spack('Y',n,0,NULL); /* OK, ACK it. */ X fclose(fp); /* Close the file */ X n = (n+1)%64; /* Bump packet number */ X return('F'); /* Go back to Receive File state */ X X case 'E': /* Error packet received */ X prerrpkt(recpkt); /* Print it out and */ X return('A'); /* abort */ X X case FALSE: /* Didn't get packet */ X spack('N',n,0,NULL); /* Return a NAK */ X return(state); /* Keep trying */ X X default: return('A'); /* Some other packet, "abort" */ X } X} X X X/* X * KERMIT utilities. X */ X X X/* X * s p a c k X * X * Send a Packet X */ X Xspack(type,num,len,data) Xchari type; Xchar *data; Xint num, len; X{ X int i; /* Character loop counter */ X char chksum, buffer[100]; /* Checksum, packet buffer */ X register char *bufp; /* Buffer pointer */ X X if (debug>1) /* Display outgoing packet */ X { X printmsg(" spack type: %c\n",type); X printmsg(" num: %d\n",num); X printmsg(" len: %d\n",len); X if (data != NULL) X { X data[len] = '\0'; /* Null-terminate data to print it */ X printmsg(" data: \"%s\"\n",data); X } X } X X bufp = buffer; /* Set up buffer pointer */ X for (i=1; i<=pad; i++) proto_out(kermport,&padchar,1); /* Issue any padding */ X X *bufp++ = SOH; /* Packet marker, ASCII 1 (SOH) */ X *bufp++ = tochar(len+3); /* Send the character count */ X chksum = tochar(len+3); /* Initialize the checksum */ X *bufp++ = tochar(num); /* Packet number */ X chksum += tochar(num); /* Update checksum */ X *bufp++ = type; /* Packet type */ X chksum += type; /* Update checksum */ X X for (i=0; i<len; i++) /* Loop for all data characters */ X { X *bufp++ = data[i]; /* Get a character */ X chksum += data[i]; /* Update checksum */ X } X chksum = (((chksum&0300) >> 6)+chksum)&077; /* Compute final checksum */ X *bufp++ = tochar(chksum); /* Put it in the packet */ X *bufp = eol; /* Extra-packet line terminator */ X proto_out(kermport, buffer, bufp-buffer+1); X /* Send the packet */ X#ifdef EXTRADEBUG X if (debug > 2) printmsg("Returning from spack"); X#endif X} X X/* X * r p a c k X * X * Read a Packet X * This routine is called both to buffer data from the host to the kermit X * window and to retreive those buffers once they contain a packet. This X * routine calls the kermit state machine when it has a complete packet. X * The kermit state machine in turn calls this routine to retreive the packet. X * Thus, this routine is indirectly recursive to two levels. Receive timeouts X * and bad packets cause FALSE to be returned to the state machine. The uw X * control loop calls us with num == NULL to pass us a string of data from X * the host. The uw control loop calls us with len == NULL if the timout X * counter (kerm_time) exceeds timint without us reseting it. X */ X#ifdef EXTRADEBUG X#define getnext {t = *dptr++; \ X if (debug>2) printmsg( "char %d state %c", t, recstate);\ X if ((t & 0177) == SOH) { \ X recstate = 'L'; /* restart packet collection */\ X break; } \ X if (!image) t &= 0177; /* Handle parity */ \ X if (t == 0) break; /* end of this input buffer */ } X#else X#define getnext {t = *dptr++; \ X if ((t & 0177) == SOH) { \ X recstate = 'L'; /* restart packet collection */\ X break; } \ X if (!image) t &= 0177; /* Handle parity */ \ X if (t == 0) break; /* end of this input buffer */ } X#endif Xrpack(len,num,data) Xint *len, *num; /* Packet length, number */ Xchar *data; /* Packet data */ X{ X static int i; /* Data character number */ X static int leng; /* length of data packet in buffer */ X static char type; /* packet type */ X static int numb; /* number of data packet in buffer */ X static int timedout = 0; /* did we time out? */ X char t; /* Current input character */ X static char cchksum, /* Our (computed) checksum */ X rchksum; /* Checksum received from other host */ X char *dptr; /* pointer to next data byte */ X static char mybuf[MAXPACKSIZ]; /* buffer used to acumulate packet */ X static char recstate = 'S'; /* start with S state */ X X if (len == NULL) { /* timed out */ X timedout = TRUE; X if (sflg) X { X if (sendsw() != GETPACK) /* Send the file(s) */ X return(kermterm()); X } X else if (rflg) X { X if (recsw() != GETPACK) /* Receive the file(s) */ X return(kermterm()); X } X return (0); X } X if (len != NULL && num != NULL) /* received packet or timed out */ X { X *len = leng; X *num = numb; X timestamp = clock(); /* reset timer */ X if (timedout) X { X printmsg("Timeout."); X timedout = 0; X return(FALSE); X } X for (i=0; i<leng; i++) X data[i] = mybuf[i]; X if (data != NULL) X data[*len] = '\0'; /* Null-terminate data to print it */ X if (debug>1) /* Display incoming packet */ X { X printmsg(" rpack type: %c\n",type); X printmsg(" num: %d\n",*num); X printmsg(" len: %d\n",*len); X if (data != NULL) X printmsg(" data: \"%s\"\n",data); X } X /* Fold in bits 7,8 to compute */ X cchksum = (((cchksum&0300) >> 6)+cchksum)&077; /* final checksum */ X X if (cchksum != rchksum) return(FALSE); X X return(type); /* All OK, return packet type */ X } X /* num == NULL so collect data for kermit */ X dptr = data; X t = -1; X while (t) X { X switch(recstate) X { X case 'S': X while (1) /* Wait for packet header */ X getnext; X break; X case 'L': /* get packet length */ X getnext; /* get next character */ X cchksum = t; /* Start the checksum */ X leng = unchar(t)-3; /* Character count */ X if (leng > MAXPACKSIZ) X leng = MAXPACKSIZ; X i = 0; X recstate = 'N'; X /* Fall Through */ X X case 'N': /* get packet number */ X getnext X cchksum = cchksum + t; /* Update checksum */ X numb = unchar(t); /* Packet number */ X recstate = 'T'; X /* Fall Through */ X X case 'T': /* get packet type */ X getnext; X cchksum = cchksum + t; /* Update checksum */ X type = t; /* Packet type */ X recstate = 'D'; X /* Fall Through */ X X case 'D': /* get packet data */ X for (; i<leng; i++) /* The data itself, if any */ X { /* Loop for character count */ X getnext; X cchksum = cchksum + t; /* Update checksum */ X mybuf[i] = t; /* Put it in the data buffer */ X } X if (i == leng) X recstate = 'C'; X break; X X case 'C': X mybuf[leng] = 0; /* Mark the end of the data */ X getnext; X rchksum = unchar(t); /* Convert to numeric */ X recstate = 'E'; /* Done with packet receipt */ X t = 0; /* Dispose of remaining data */ X } X } X if (recstate == 'E') { X recstate = 'S'; X if (sflg) X { X if (sendsw() != GETPACK) /* Send the file(s) */ X return(kermterm()); X } X else if (rflg) X { X if (recsw() != GETPACK) /* Receive the file(s) */ X return(kermterm()); X } X } X return(0); X} X X X/* X * b u f i l l X * X * Get a bufferful of data from the file that's being sent. X * Only control-quoting is done; 8-bit & repeat count prefixes are X * not handled. X */ X Xbufill(buffer) Xchar buffer[]; /* Buffer */ X{ X int i, /* Loop index */ X t; /* Char read from file */ X char t7; /* 7-bit version of above */ X X i = 0; /* Init data buffer pointer */ X while((t = getc(fp)) != EOF) /* Get the next character */ X { X t7 = t & 0177; /* Get low order 7 bits */ X X if (t7 < SP || t7==DEL || t7==quote) /* Does this char require */ X { /* special handling? */ X if (t=='\n' && !image) X { /* Do LF->CRLF mapping if !image */ X buffer[i++] = quote; X buffer[i++] = ctl('\r'); X } X buffer[i++] = quote; /* Quote the character */ X if (t7 != quote) X { X t = ctl(t); /* and uncontrolify */ X t7 = ctl(t7); X } X } X if (image) X buffer[i++] = t; /* Deposit the character itself */ X else X buffer[i++] = t7; X X if (i >= spsiz-8) return(i); /* Check length */ X } X if (i==0) return(EOF); /* Wind up here only on EOF */ X return(i); /* Handle partial buffer */ X} X X X/* X * b u f e m p X * X * Put data from an incoming packet into a file. X */ X Xbufemp(buffer,len) Xchar buffer[]; /* Buffer */ Xint len; /* Length */ X{ X int i; /* Counter */ X char t; /* Character holder */ X X#ifdef EXTRADEBUG X if (debug > 2) printmsg("Entered bufemp"); X#endif X for (i=0; i<len; i++) /* Loop thru the data field */ X { X t = buffer[i]; /* Get character */ X if (t == MYQUOTE) /* Control quote? */ X { /* Yes */ X t = buffer[++i]; /* Get the quoted character */ X if ((t & 0177) != MYQUOTE) /* Low order bits match quote char? */ X t = ctl(t); /* No, uncontrollify it */ X } X if (t==CR && !image) /* Don't pass CR if not in image mode */ X continue; X#ifdef EXTRADEBUG X if (debug > 2) printmsg("writing t=%c", t); X#endif X putc(t,fp); X } X} X X X X/* X * g n x t f l X * X * Get next file in a file group X */ X Xgnxtfl() X{ X if (filecount-- == 0) return FALSE; /* If no more, fail */ X if (debug) printmsg(" gnxtfl: filelist = \"%s\"\n",*filelist); X filnam = *(filelist++); X return TRUE; /* else succeed */ X} X X X/* X * s p a r X * X * Fill the data array with my send-init parameters X * X */ X Xspar(data) Xchar data[]; X{ X data[0] = tochar(MAXPACKSIZ); /* Biggest packet I can receive */ X data[1] = tochar(reqtimint); /* When I want to be timed out */ X data[2] = tochar(MYPAD); /* How much padding I need */ X data[3] = ctl(MYPCHAR); /* Padding character I want */ X data[4] = tochar(MYEOL); /* End-Of-Line character I want */ X data[5] = MYQUOTE; /* Control-Quote character I send */ X} X X X/* r p a r X * X * Get the other host's send-init parameters X * X */ X Xrpar(data) Xchar data[]; X{ X spsiz = unchar(data[0]); /* Maximum send packet size */ X timint = unchar(data[1]); /* When I should time out */ X if (timint > MAXTIM) timint = MAXTIM; X if (timint < MINTIM) timint = MINTIM; X pad = unchar(data[2]); /* Number of pads to send */ X padchar = ctl(data[3]); /* Padding character to send */ X eol = unchar(data[4]); /* EOL character I must send */ X quote = data[5]; /* Incoming data quote character */ X} X X X/* X * Kermit printing routines: X * X * printmsg - like printf with "Kermit: " prepended X * prerrpkt - print contents of error packet received from remote host X */ X X X/* X * p r i n t m s g X * X * Print message kermit window X */ X X/*VARARGS1*/ Xprintmsg(fmt, a1, a2, a3, a4, a5) Xchar *fmt; X{ X char *sbuf[100]; X w_output(kermwdes,"Kermit: "); X sprintf(sbuf,fmt,a1,a2,a3,a4,a5); X w_output(kermwdes,sbuf); X w_output(kermwdes,"\n\r"); X} X X X/* X * p r e r r p k t X * X * Print contents of error packet received from remote host. X */ Xprerrpkt(msg) Xchar *msg; X{ X printmsg("Kermit aborting with following error from remote host:\n%s",msg); X return; X} SHAR_EOF chmod 0600 KERMIT.C || echo "restore of KERMIT.C fails" sed 's/^X//' << 'SHAR_EOF' > LASTCHG && X89 Jan 24 2.1.2 X Removed radio button and touch-exit attributes and X added exit attribute to send/receive/cancel buttons X in kermit parameter dialog (double-click bug fix) -- BK X88 Sep 19 2.1.1 X Added cursor-to-bottom on font change+reshape and X fixed set_menu_string() bug -- BK X88 Sep 12 Version w/ latest fixes from Brad Bosch SHAR_EOF chmod 0600 LASTCHG || echo "restore of LASTCHG fails" sed 's/^X//' << 'SHAR_EOF' > LCKBLK1.ICN && X/* GEM Icon Definition: */ X#define lckblk1_W 0x0010 X#define lckblk1_H 0x0028 X#define lckblk1SIZE 0x0028 Xshort lckblk1[lckblk1SIZE] = X{ 0x0005, 0x0009, 0x0001, 0x0000, X 0x0001, 0x1FF8, 0x300C, 0x67E6, X 0x4C32, 0x581A, 0x500A, 0xDFFB, X 0x8001, 0x8001, 0x83C1, 0x83C1, X 0x8181, 0x8181, 0x8181, 0x8001, X 0xFFFF, 0x0000, 0x0FF0, 0x1818, X 0x300C, 0x2004, 0x2004, 0x2004, X 0x7FFE, 0x7FFE, 0x7C3E, 0x7C3E, X 0x7E7E, 0x7E7E, 0x7E7E, 0x7FFE, X 0x0000, 0x0000, 0x0000, 0x0000 X}; SHAR_EOF chmod 0600 LCKBLK1.ICN || echo "restore of LCKBLK1.ICN fails" sed 's/^X//' << 'SHAR_EOF' > MAKE.BAT && X# This file has not been maintained and is not supported Xcp68 -i \dric.dir\ -i %1 %1winmain.c %1winmain.i Xc068 %1winmain.i %1winmain.1 %1winmain.2 %1winmain.3 -f Xrm %1winmain.i Xc168 %1winmain.1 %1winmain.2 %1winmain.s Xrm %1winmain.1 Xrm %1winmain.2 Xas68 -l -u %1winmain.s Xrm %1winmain.s Xcp68 -i \dric.dir\ -i %1 %1winsubr.c %1winsubr.i Xc068 %1winsubr.i %1winsubr.1 %1winsubr.2 %1winsubr.3 -f Xrm %1winsubr.i Xc168 %1winsubr.1 %1winsubr.2 %1winsubr.s Xrm %1winsubr.1 Xrm %1winsubr.2 Xas68 -l -u %1winsubr.s Xrm %1winsubr.s Xlink68 [u] %1wind.68k=gemstart,%1winsubr,%1winmain,vdibind,gemlib,aesbind,osbind,libf Xrelmod %1wind Xrm %1wind.68k SHAR_EOF chmod 0600 MAKE.BAT || echo "restore of MAKE.BAT fails" sed 's/^X//' << 'SHAR_EOF' > MAKEFILE && X# make file for uw compiled with mwc X# GETSPEED, GETFLOW, and GETUCR use magic cookies to get the RS232 X# configuration. Otherwise, the configuration is not known until X# you set it. XCFLAGS=-O -DMWC -DLOCATE='"c:\\bin"' -DGETSPEED -DGETFLOW -DGETUCR X Xall: bldmform.prg mform.o win.prg startgem.prg X echo X XOBJS= winmain.o winsubr.o mform.o resetaux.o winhash.o winio.o winproto.o\ X winproc.o kermit.o X Xwin.prg: $(OBJS) X $(CC) $(CFLAGS) -VGEM -s -o win.prg $(OBJS) X Xmform.o: rmbblk1.icn lckblk1.icn X bldmform -ndR rmbmform rmbblk1.icn > mform.c X bldmform -ndR lckmform lckblk1.icn >> mform.c X $(CC) $(CFLAGS) -c mform.c X Xbldmform.prg: bldmform.c X $(CC) $(CFLAGS) -o bldmform.prg bldmform.c X Xresetaux.o: resetaux.s X $(CC) $(CFLAGS) -c resetaux.s X Xstartgem.prg: startgem.s X as -o startgem.o startgem.s X ld -s -o startgem.prg startgem.o X rm startgem.o SHAR_EOF chmod 0600 MAKEFILE || echo "restore of MAKEFILE fails" sed 's/^X//' << 'SHAR_EOF' > MFORM.C && X/* GEM Icon Definition: */ X#define rmbblk1_W 0x0010 X#define rmbblk1_H 0x0028 X#define rmbblk1SIZE 0x0028 Xshort rmbmform[rmbblk1SIZE] = X{ 0x000A, 0x0003, 0x0001, 0x0000, X 0x0001, 0xFFFF, 0x8037, 0xB82F, X 0xB801, 0xB82F, 0xB837, 0x803F, X 0xBFA0, 0xBFA0, 0xBFA0, 0xBBA0, X 0xB1A0, 0xAAA0, 0xBFA0, 0x8020, X 0xFFE0, 0x0000, 0x7FC8, 0x47D0, X 0x47FE, 0x47D0, 0x47C8, 0x7FC0, X 0x4040, 0x4040, 0x4040, 0x4440, X 0x4E40, 0x5540, 0x4040, 0x7FC0, X 0x0000, 0x0000, 0x0000, 0x0000 X}; X/* GEM Icon Definition: */ X#define lckblk1_W 0x0010 X#define lckblk1_H 0x0028 X#define lckblk1SIZE 0x0028 Xshort lckmform[lckblk1SIZE] = X{ 0x0005, 0x0009, 0x0001, 0x0000, X 0x0001, 0x1FF8, 0x300C, 0x67E6, X 0x4C32, 0x581A, 0x500A, 0xDFFB, X 0x8001, 0x8001, 0x83C1, 0x83C1, X 0x8181, 0x8181, 0x8181, 0x8001, X 0xFFFF, 0x0000, 0x0FF0, 0x1818, X 0x300C, 0x2004, 0x2004, 0x2004, X 0x7FFE, 0x7FFE, 0x7C3E, 0x7C3E, X 0x7E7E, 0x7E7E, 0x7E7E, 0x7FFE, X 0x0000, 0x0000, 0x0000, 0x0000 X}; SHAR_EOF chmod 0600 MFORM.C || echo "restore of MFORM.C fails" sed 's/^X//' << 'SHAR_EOF' > README && X X UW (Unix (tm) Windows) for the Atari ST X XThis program was written by Hans-Martin Mosner at the University of XDortmund in West Germany. It has since been enhanced by Brad Bosch Xand Brian Katzung at Lachman Associates, Inc., in Naperville, Illinois. X XNote that this disk represents a beta test version, and is provided on Xa strictly as-is basis, and we assume no responsibility or liability Xfor any aspect of this software. X XThis version of uw provides only adm31 emulation and the most basic XUW protocol. The adm31 emulation has been extended slightly. See Xthe end of the Features section for a description of the extensions. X XFeatures added by Brad Bosch and Brian Katzung: X X o Jump scrolling occurs if screen updates can't keep up with X transmission from the host. X X o The input window may be different than the top window. X X o A printer copy of output to each window may be enabled or X disabled on a window-by-window basis in various flavors. X X o <Shift><Help> sends a break. X X o There is a menu item to reset flow control if the Atari and X the host get out of synchronization. X X o Fonts "windalt.fnt", "windoth.fnt", and "windtny.fnt" are X supported in addition to "windstd.fnt". The "windtny" font is X small enough to allow four 24 x 80 windows on the screen without X overlapping. X X o The smaller system font is offered in addition to the larger X one. Some of the characters in the smaller font are "improved" X to increase readability. X X o The user may now select whether or not a window will be X "topped" when a ^G (BEL) is output to it. X X o The user may choose to have ^G (BEL) flash the screen, ring X the bell, neither, or both. X X o When not selecting an input window, pressing the right mouse X button on the menu bar toggles the menu bar sensitivity. X X o The close-box works even when the UW protocol is not running. X This is useful for changing the font size or other options. X X o The RTS (request to send) and DTR (data terminal ready) lines X can be cleared and asserted. X X o Function keys can be used and defined up to 40 characters each. X X o Function keys and other global option values can be saved and X loaded. A file called "win.cnf", if present, is read at startup X time. X X o The right mouse button can be used to copy text from the screen X and send it to a window as keyboard input. Click twice on a X window border to send copied text. Click once on the boarder to X select the window for input. Select text by dragging with the X right button pressed. Inside a border, a single right button X click selects a word and a double click selects a line. X X o Emulation window size can now be selected when a window is opened. X The fixed sizes available in the menu can be changed with a resource X editor without recompiling. Default sizes are font dependent. X X o A window menu item was added to allow the bottom window to be sent X to the top even if it is competely hidden. Another item sends the X top window to the bottom. The latter is somewhat slow due to X shortcomings in GEM. X X o The main keyboard digit keys when used while the alt key is down X will select that window number to be the top and keyboard input X window. The first window is alt-1, the last is alt-7. Windows X are numbered as gem numbers them. Alt-key bindings for lower X case letters are scanned from the menu strings in the resource X file. These bindings are indicated by the ^E (close box) X character. X X o A window menu item was added to shrink the current window to an X iconic size. The second-from-the-top non-iconic window becomes X the current window. The fuller box is used to reverse the process. X X o An option is now available to cause new windows to be created X without the sliders and arrows. The title bar (and close and X fuller boxes) may also be eliminated by another option. Menu X items have been added to support most of the functionality lost X when the window controls are turned off. X X o Additional help information was added to the about dialog. X X o Startgem is now included in the distribution. This program, if X placed in the auto folder, will attempt to start a:\bin\uw.prg X automatically when the ST is booted up. X X o A variable called "locpath" contains the name of a directory to X scan after the current directory when looking for configuration X and font files. The string is 64 bytes long and defaults to X c:\bin. X X o An RS232 configuration dialog has been added. There is no pro- X vision for putting this information in the configuration file. X Bug view: There is no auto-configuration. Feature view: Changes X persist across executions. X X o One can now capture host output to a file on a per-window basis. X Capture mode is terminated by setting an empty file name. X X o Added keyboard lock to file menu. This locks the keyboard and mouse X until your password is reentered. X X o Added change working directory item to file menu. This is usefull X for kermit and the exec command entry. X X o Added execute command entry. This allows uw to be suspended while X another command is executed. Note that mwc startup for gem does not X preserve the environment variables. The default command and X parameters are part of the config file. X X o Add basic kermit functionality. Kermit can operate under the uw X protocol in a window concurent with interactive terminal windows. X Sending multiple files is not yet supported. X X XExtensions to Adm31 emulation: X X o If the host sends a window the sequence ESC [18t, the window will X respond with ESC [8;<rows>;<cols>t, where <rows> and <cols> specify X the window's size in characters. X X o The insert line and delete line escape sequences (ESC E and ESC R, X respectively) allow a repeat count (ie, ESC 5E inserts 5 lines). X XBugs fixed: X X o Exiting in "fast" mode used to leave a window open. The X system would crash on the next run unless you had returned X to the desktop. X X o Actions on windows now check that there are windows to act upon. X X XKnown bugs: X X o Because of the extra memory used in the jump scrolling X algorithm, the bottom row of pixels of an earlier line X sometimes appears immediately below the title bar. X X o GEM doesn't let you completely eliminate the menu bar and X increase your workspace. X X o Desk accessories sometimes leave damage on the screen. X X o GEM doesn't send "top" messages to the top window, so you X can't use the left mouse button as a short hand to select X the top window for input. Use the right button on the window X title bar instead. X X o The rsconf() baud rates listed in the manual as 75 and 50 baud X really result in system timer settings for 120 and 80 baud. X The RS232 configuration dialog allows you to set these two baud X rates, but decodes them as 300 or 200 baud, respectively. X X o The RS232 configuration code uses some trickery to determine the X current port configuration. Some parts of this code may need to X be turned off or adapted to run on other hardware or if system X calls stop returning undocumented values. SHAR_EOF chmod 0600 README || echo "restore of README fails" sed 's/^X//' << 'SHAR_EOF' > RESETAUX.S && X/ X/ Reset the Aux rs232 port. Usage: X/ char *rs232_iorec = Iorec(0); /* Do this first */ X/ X/ if (rs232_reset()) X/ Cauxout(0x11); /* sent an XOFF */ X/ X/ This subroutine was written by Martin Minow, Arlington, MA X/ and is in the public domain. X/ X/ .shrd / Public data X/ .globl rs232_iorec_ / -> aux io record. see below X .shri / Public instructions X .globl rs232_reset_ X Xrs232_reset_: X move.l d2,-(sp) / Save a scratch register X clr.l -(sp) / Super(0L) switches to super mode X move.w $0x20,-(sp) / Super opcode X trap $1 / Call TOS X addq.l $6,sp / Clear stack X move.l d0,-(sp) / Save old stack for now. X/ X/ If you don't already have the iorec as a readily-available global, X/ uncomment the following code (which is, of course, untested) X/ X clr.w -(sp) / Aux port is device zero X move.w $14,-(sp) / Iorec X trap $14 / Xbios(14) X addq.l $4,sp / Clear stack X/ End of "get iorec" code. We already have this information: X/ movea rs232_iorec_,a0 / a0 -> I/O record X movea d0,a0 / a0 -> I/O record X move sr,-(sp) / Save cpu status X ori $0x700,sr / Disable interrupts X/ clr.l 6(a0) / Clear input head, tail -- crashes! X clr.l 20(a0) / Clear output head, tail X clr.l d2 / Clear result X or.b 30(a0),d2 / Get old rcv xoff state X clr.w 30(a0) / Cancel rcv, xmt xoff states X move (sp)+,sr / Enable interrupts X move.w $0x20,-(sp) / Super -- old_stack is still at (sp) X trap $1 / Exit super mode X addq $6,sp / Clean junk from stack X move.l d2,d0 / Get result X move.l (sp)+,d2 / Restore d2 X rts / Exit routine SHAR_EOF chmod 0600 RESETAUX.S || echo "restore of RESETAUX.S fails" sed 's/^X//' << 'SHAR_EOF' > RMBBLK1.ICN && X/* GEM Icon Definition: */ X#define rmbblk1_W 0x0010 X#define rmbblk1_H 0x0028 X#define rmbblk1SIZE 0x0028 Xshort rmbblk1[rmbblk1SIZE] = X{ 0x000A, 0x0003, 0x0001, 0x0000, X 0x0001, 0xFFFF, 0x8037, 0xB82F, X 0xB801, 0xB82F, 0xB837, 0x803F, X 0xBFA0, 0xBFA0, 0xBFA0, 0xBBA0, X 0xB1A0, 0xAAA0, 0xBFA0, 0x8020, X 0xFFE0, 0x0000, 0x7FC8, 0x47D0, X 0x47FE, 0x47D0, 0x47C8, 0x7FC0, X 0x4040, 0x4040, 0x4040, 0x4440, X 0x4E40, 0x5540, 0x4040, 0x7FC0, X 0x0000, 0x0000, 0x0000, 0x0000 X}; SHAR_EOF chmod 0600 RMBBLK1.ICN || echo "restore of RMBBLK1.ICN fails" sed 's/^X//' << 'SHAR_EOF' > STARTGEM.S && X/ X/ STARTGEM.S 6-MAR-1987 by GHOST-Soft X/ X/ This program is used to start GEM programs from within the AUTO folder. X/ X/ The code is probably highly nonportable, as it heavily depends on the X/ internal organisation of code in TOS/GEM. X/ As this program works with ROM- as well as all disk-based versions X/ of German TOS, I'm pretty sure that this program works with foreign X/ versions of TOS, too. X/ All addresses given in square brackets apply to the German ROM-TOS. X/ X/ Assemble with Mark Williams assembler: X/ as -o startgem.o startgem.s X/ gemfix startgem.o startgem.prg X/ strip startgem.prg X/ _or_ X/ as -o startgem.o startgem.s X/ ld -o startgem.prg -s startgem.o X/ X Xlinef= 0x2c Xvbllist1= 0x4d2 X Xgemdos= 1 X cconws= 0x9 X fsetdta= 0x1a X super= 0x20 X ptermres= 0x31 X fsfirst= 0x4e Xxbios= 14 X vsync= 0x25 X X .shri Xstart: X lea basepage(pc),a0 X move.l 4(a7),(a0) / get basepage address X X pea msg(pc) X move.w $cconws,-(a7) / print line X trap $gemdos X addq.w $6,a7 X X moveq $70,d2 / wait 1 second = 71 vblanks X1: move.w $vsync,-(a7) / wait for vertical blank X trap $xbios X addq.w $2,a7 X dbra d2,1b X X clr.l -(a7) X move.w $super,-(a7) / enter super mode X trap $gemdos X addq.w $6,a7 / keep old super sp in d0 X X moveq $-1,d2 X move.l d2,linef / set line-f emulator trap X lea vblank(pc),a2 X move.l a2,vbllist1 / set vblank vector #1 {0..7} X X move.l d0,-(a7) X move.w $super,-(a7) / exit super mode X trap $gemdos X addq.w $6,a7 X X lea basepage(pc),a0 / compute number of bytes to keep X suba.l basepage(pc),a0 X clr.w -(a7) / 0 = no error X move.l a0,-(a7) X move.w $ptermres,-(a7) / terminate and stay resident X trap $gemdos / this call never returns X Xvblank: X moveq $-1,d0 X cmp.l linef,d0 X beq.s 1f X clr.l vbllist1 / clear vblank vector #1 X movea.l linef,a0 X lea old_lf(pc),a1 X move.l a0,(a1) / save old line-f vector (usually in low RAM) X lea new_lf(pc),a1 X move.l a1,linef / install new one X X / find the address of the buffer that GEM uses for the X / name of the program that it is going to execute X movea.l 0x16(a0),a0 / get start of line-f table from instruction X / [a0 = fee8bc] move.l $0xfee8bc,a0 X movea.l 0x7c8(a0),a0 / get address of routine 'f7c8' from table X / [a0 = fd8fc4] X movea.l 0xa(a0),a2 / get address from instruction X / [a2 = 73e4] move.l $0x73e4,a5 X adda.w 0x10(a0),a2 / add offset 0x1f56 from instruction X / [a2 = 933a] lea 0x1f56,a0 X lea pointer(pc),a1 X move.l a2,(a1) / save buffer address X1: rts X Xnew_lf: X movea.l 2(a7),a0 / get addr. of instr. that caused exception X cmpi.w $0xf08c,(a0) / 'f08c' is the line-f instr. we're looking for X bne.w exit X move.l old_lf(pc),linef / restore old line-f vector X X movea.l pointer(pc),a0 X lea filename(pc),a1 X1: move.b (a1)+,(a0)+ / copy filename into GEM buffer space X bne.s 1b X X pea dta X move.w $fsetdta,-(a7) / set DTA X trap $gemdos X addq.l $6,a7 X move.w $0x27,-(a7) / don't look at volumes and directories X pea filename(pc) X move.w $fsfirst,-(a7) / search first X trap $gemdos X addq.l $8,a7 X tst d0 / status != 0 indicates error X bne.s exit X X movea.l 2(a7),a0 / get addr. of instr. that caused exception X / [a0 = fed188] X2: cmpi.w $0xf4b8,(a0) / look for line-f instruction 'f4b8' X beq.s doload X addq.l $2,a0 X cmpa.l $0xfefffe,a0 / test for ROM end X beq.s exit X cmpa.l $0x078000,a0 / test for RAM end (on 512K machine) X bne.s 2b / {RAM-TOS usually loads much lower} X Xexit: X movea.l old_lf(pc),a0 / resume execution of regular line-f handler X jmp (a0) X Xdoload: X / [a0 = fe1de2] X move.w (a7)+,d2 / pop status word X addq.w $4,a7 / destroy addr. of instr. 'f08c' X move.w d2,sr / restore status register X adda.w $56,a7 / destroy parameters of instr. 'f08c' X jmp (a0) / jump to instruction 'f4b8' X X .prvd Xdta: X .blkb 44 Xold_lf: X .blkl 1 Xpointer: X .blkl 1 X Xmsg: X .ascii "\033\105Autostart of " Xfilename: X .ascii "a:\\bin\\UW.PRG" Xnulls: X .blkb 20 / these nulls allow easy patching of code file X X .even Xbasepage: X .ascii "EOPA" / magic number indicates End Of Patch Area SHAR_EOF chmod 0600 STARTGEM.S || echo "restore of STARTGEM.S fails" sed 's/^X//' << 'SHAR_EOF' > UW.H && X/* X * uw command bytes X * X * Copyright 1985 by John D. Bruner. All rights reserved. Permission to X * copy this program is given provided that the copy is not sold and that X * this copyright notice is included. X * X * X * Two types of information are exchanged through the 7-bit serial line: X * ordinary data and command bytes. Command bytes are preceeded by X * an IAC byte. IAC bytes and literal XON/XOFF characters (those which X * are not used for flow control) are sent by a CB_FN_CTLCH command. X * Characters with the eighth bit set (the "meta" bit) are prefixed with X * a CB_FN_META function. X * X * The next most-significant bit in the byte specifies the sender and X * recipient of the command. If this bit is clear (0), the command byte X * was sent from the host computer to the Macintosh; if it is set (1) X * the command byte was sent from the Macintosh to the host computer. X * This prevents confusion in the event that the host computer X * (incorrectly) echos a command back to the Macintosh. X * X * The remaining six bits are partitioned into two fields. The low-order X * three bits specify a window number from 1-7 (window 0 is reserved for X * other uses) or another type of command-dependent parameter. The next X * three bits specify the operation to be performed by the recipient of X * the command byte. X * X * Note that the choice of command bytes prevents the ASCII XON (021) and X * XOFF (023) characters from being sent as commands. CB_FN_ISELW commands X * are only sent by the Macintosh (and thus are tagged with the CB_DIR_MTOH X * bit). Since XON and XOFF data characters are handled via CB_FN_CTLCH, X * this allows them to be used for flow control purposes. X */ X X#define IAC 0001 /* interpret as command */ X#define CB_DIR 0100 /* command direction: */ X#define CB_DIR_HTOM 0000 /* from host to Mac */ X#define CB_DIR_MTOH 0100 /* from Mac to host */ X#define CB_FN 0070 /* function code: */ X#define CB_FN_NEWW 0000 /* new window */ X#define CB_FN_KILLW 0010 /* kill (delete) window */ X#define CB_FN_ISELW 0020 /* select window for input */ X#define CB_FN_OSELW 0030 /* select window for output */ X#define CB_FN_META 0050 /* add meta to next data char */ X#define CB_FN_CTLCH 0060 /* low 3 bits specify char */ X#define CB_FN_MAINT 0070 /* maintenance functions */ X#define CB_WINDOW 0007 /* window number mask */ X#define CB_CC 0007 /* control character specifier: */ X#define CB_CC_IAC 1 /* IAC */ X#define CB_CC_ON 2 /* XON */ X#define CB_CC_OFF 3 /* XOFF */ X#define CB_MF 0007 /* maintenance functions: */ X#define CB_MF_ENTRY 0 /* beginning execution */ X#define CB_MF_EXIT 7 /* execution terminating */ X#define NWINDOW 7 /* maximum number of windows */ X X/* CB_CC_XON and CB_CC_XOFF give the same name on the DR C compiler. X * Changed them to CB_CC_ON and CB_CC_OFF X * hmm@unido X */ SHAR_EOF chmod 0600 UW.H || echo "restore of UW.H fails" sed 's/^X//' << 'SHAR_EOF' > VERSION && XUW Version 2.1.2 24 Jan 1989 SHAR_EOF chmod 0655 VERSION || echo "restore of VERSION fails" sed 's/^X//' << 'SHAR_EOF' > WIN-.CNF && Xaudibell=1 Xvisibell=1 Xtopbell=0 Xfast Xnooverstrike Xnosliders Xtitles Xbufsiz=256 Xcmdpath=E:\BIN\*.* Xcmdname=MSH.PRG Xcmdargs=c:\src\uw\profile Xfont=3 Xf1=at^m Xf2=atdt5559100,,,,410,,^m Xf3=atdt5551205^m Xf4=atdt5551102^m Xf5=ata^m Xf6=ATDT5551272^m Xf7=^A6^M Xf8=^A7^M Xf9=^A8^M Xf10=ati4^m Xf11=^A10^M Xf12=^A11^M Xf13=^A12^M Xf14=^A13^M Xf15=^A14^M Xf16=^A15^M Xf17=^A16^M Xf18=^A17^M Xf19=^A18^M Xf20=^A19^M Xf21=^A20^M Xf22=^A21^M Xf23=^A22^M Xf24=^A23^M Xf25=^A24^M Xf26=^A25^M Xf27=^A26^M Xf28=^A27^M Xf29=^A28^M Xf30=^A29^M Xf31=^A30^M Xf32=^A31^M Xf33=^A32^M Xf34=^A33^M Xf35=^A34^M Xf36=^A35^M Xf37=^A36^M Xf38=^A37^M Xf39=^A38^M Xf40=^A39^M SHAR_EOF chmod 0655 WIN-.CNF || echo "restore of WIN-.CNF fails" sed 's/^X//' << 'SHAR_EOF' > WIN.CNF && Xaudibell=1 Xvisibell=1 Xtopbell=0 Xfast Xnooverstrike Xnosliders Xnotitles Xbufsiz=256 Xcmdpath=E:\BIN\*.* Xcmdname=MSH.PRG Xcmdargs=c:\src\uw\profile Xfont=2 Xf1=atx6d5559100,,,,,410,,,^M Xf2=atx6d5559100,,,,,420,,,^M Xf3=atx6d18005559848^M Xf4=^A3^M Xf5=atx6d14155554619^M Xf6=atx6d14155556755^M Xf7=atx6d14155554127^M Xf8=atdt*70;^M Xf9=^A8^M Xf10=adm31^M Xf11=^A10^M Xf12=^A11^M Xf13=^A12^M Xf14=^A13^M Xf15=^A14^M Xf16=^A15^M Xf17=^A16^M Xf18=^A17^M Xf19=^A18^M Xf20=^A19^M Xf21=^A20^M Xf22=^A21^M Xf23=^A22^M Xf24=^A23^M Xf25=^A24^M Xf26=^A25^M Xf27=^A26^M Xf28=^A27^M Xf29=^A28^M Xf30=^A29^M Xf31=^A30^M Xf32=^A31^M Xf33=^A32^M Xf34=^A33^M Xf35=^A34^M Xf36=^A35^M Xf37=^A36^M Xf38=^A37^M Xf39=^A38^M Xf40=^A39^M SHAR_EOF chmod 0655 WIN.CNF || echo "restore of WIN.CNF fails" sed 's/^X//' << 'SHAR_EOF' > WIND.H && X#define MENUBAR 0 /* TREE */ X#define ABOUT 1 /* TREE */ X#define NEWNAME 2 /* TREE */ X#define DABOUT 12 /* OBJECT in TREE #0 */ X#define FQUITUW 21 /* OBJECT in TREE #0 */ X#define FQUIT 26 /* OBJECT in TREE #0 */ X#define MFAST 33 /* OBJECT in TREE #0 */ X#define WRENAME 47 /* OBJECT in TREE #0 */ X#define FNTOWN 69 /* OBJECT in TREE #0 */ X#define FNTSYS 68 /* OBJECT in TREE #0 */ X#define BUTTON 5 /* OBJECT in TREE #1 */ X#define FLD1 1 /* OBJECT in TREE #2 */ X#define OKRENAME 3 /* OBJECT in TREE #2 */ X#define FNTALT 70 /* OBJECT in TREE #0 */ X#define DESK 3 /* OBJECT in TREE #0 */ X#define PRTBOTOM 74 /* OBJECT in TREE #0 */ X#define PRTSTOP 77 /* OBJECT in TREE #0 */ X#define FUNCTKEY 36 /* OBJECT in TREE #0 */ X#define PRTTOP 75 /* OBJECT in TREE #0 */ X#define RESETAUX 43 /* OBJECT in TREE #0 */ X#define AUDIBELL 37 /* OBJECT in TREE #0 */ X#define VISIBELL 38 /* OBJECT in TREE #0 */ X#define TOPONBEL 39 /* OBJECT in TREE #0 */ X#define ASSRD 40 /* OBJECT in TREE #0 */ X#define RESRD 41 /* OBJECT in TREE #0 */ X#define PRTWIND 76 /* OBJECT in TREE #0 */ X#define FUNCTEDT 3 /* TREE */ X#define FUNCEXIT 7 /* OBJECT in TREE #3 */ X#define FUNCSHOW 6 /* OBJECT in TREE #3 */ X#define FUNCPREV 5 /* OBJECT in TREE #3 */ X#define FUNCNEXT 4 /* OBJECT in TREE #3 */ X#define FUNCNAME 10 /* OBJECT in TREE #3 */ X#define FUNCBODY 12 /* OBJECT in TREE #3 */ X#define FUNCENT 16 /* OBJECT in TREE #3 */ X#define LOADCONF 23 /* OBJECT in TREE #0 */ X#define SAVECONF 24 /* OBJECT in TREE #0 */ X#define WINDSIZE 4 /* TREE */ X#define WINDROWS 7 /* OBJECT in TREE #4 */ X#define WINDCOLS 8 /* OBJECT in TREE #4 */ X#define WINDCANC 5 /* OBJECT in TREE #4 */ X#define WINDOK 6 /* OBJECT in TREE #4 */ X#define SHRNKWIN 48 /* OBJECT in TREE #0 */ X#define BOTTOMTO 50 /* OBJECT in TREE #0 */ X#define INPUTWIN 54 /* OBJECT in TREE #0 */ X#define HIDEWIN 49 /* OBJECT in TREE #0 */ X#define WINSTYLE 34 /* OBJECT in TREE #0 */ X#define MOREINF1 6 /* OBJECT in TREE #1 */ X#define INFO1 5 /* TREE */ X#define CONT1 4 /* OBJECT in TREE #5 */ X#define INFO2 6 /* TREE */ X#define CONT2 8 /* OBJECT in TREE #6 */ X#define INFO3 7 /* TREE */ X#define INFO4 8 /* TREE */ X#define INFO5 9 /* TREE */ X#define CONT3 2 /* OBJECT in TREE #7 */ X#define CONT4 2 /* OBJECT in TREE #8 */ X#define CONT5 2 /* OBJECT in TREE #9 */ X#define FNTBIG 67 /* OBJECT in TREE #0 */ X#define FNTTINY 71 /* OBJECT in TREE #0 */ X#define FNTUNKNW 72 /* OBJECT in TREE #0 */ X#define OSIZEWIN 51 /* OBJECT in TREE #0 */ X#define MOVEWIN 52 /* OBJECT in TREE #0 */ X#define CLOSEWIN 53 /* OBJECT in TREE #0 */ X#define WINTITLE 35 /* OBJECT in TREE #0 */ X#define PASTE 55 /* OBJECT in TREE #0 */ X#define CAPTURE 25 /* OBJECT in TREE #0 */ X#define RSCONF 10 /* TREE */ X#define BB1920 7 /* OBJECT in TREE #10 */ X#define BB960 8 /* OBJECT in TREE #10 */ X#define BB480 9 /* OBJECT in TREE #10 */ X#define BB360 10 /* OBJECT in TREE #10 */ X#define BB240 11 /* OBJECT in TREE #10 */ X#define BB200 12 /* OBJECT in TREE #10 */ X#define BB180 13 /* OBJECT in TREE #10 */ X#define BB120 14 /* OBJECT in TREE #10 */ X#define BB60 15 /* OBJECT in TREE #10 */ X#define BB30 16 /* OBJECT in TREE #10 */ X#define BB20 17 /* OBJECT in TREE #10 */ X#define BB15 18 /* OBJECT in TREE #10 */ X#define BB13 19 /* OBJECT in TREE #10 */ X#define BB11 20 /* OBJECT in TREE #10 */ X#define BB7 21 /* OBJECT in TREE #10 */ X#define BB5 22 /* OBJECT in TREE #10 */ X#define BCB5 24 /* OBJECT in TREE #10 */ X#define BCB6 25 /* OBJECT in TREE #10 */ X#define BCB7 26 /* OBJECT in TREE #10 */ X#define BCB8 27 /* OBJECT in TREE #10 */ X#define PBNONE 30 /* OBJECT in TREE #10 */ X#define PBEVEN 31 /* OBJECT in TREE #10 */ X#define PBODD 32 /* OBJECT in TREE #10 */ X#define FCBNONE 40 /* OBJECT in TREE #10 */ X#define FCBXON 41 /* OBJECT in TREE #10 */ X#define FCBRTS 42 /* OBJECT in TREE #10 */ X#define RCCAN 1 /* OBJECT in TREE #10 */ X#define RCOK 2 /* OBJECT in TREE #10 */ X#define SBB1 36 /* OBJECT in TREE #10 */ X#define SBB15 37 /* OBJECT in TREE #10 */ X#define SBB2 38 /* OBJECT in TREE #10 */ X#define SETCONF 42 /* OBJECT in TREE #0 */ X#define BUFSIZ1 44 /* OBJECT in TREE #10 */ X#define BUFSIZ2 45 /* OBJECT in TREE #10 */ X#define BUFSIZ32 46 /* OBJECT in TREE #10 */ X#define LOCKINFO 11 /* TREE */ X#define FLOCKKEY 27 /* OBJECT in TREE #0 */ X#define COMMAND 28 /* OBJECT in TREE #0 */ X#define SETPATH 29 /* OBJECT in TREE #0 */ X#define PARAM 12 /* TREE */ X#define PARAMSTR 3 /* OBJECT in TREE #12 */ X#define OKEXEC 1 /* OBJECT in TREE #12 */ X#define KERMIT 30 /* OBJECT in TREE #0 */ X#define KERMPARM 13 /* TREE */ X#define DEBUGENA 10 /* OBJECT in TREE #13 */ X#define DEBUG1 11 /* OBJECT in TREE #13 */ X#define DEBUG2 13 /* OBJECT in TREE #13 */ X#define DEBUG3 12 /* OBJECT in TREE #13 */ X#define IMAGEMOD 7 /* OBJECT in TREE #13 */ X#define ASCIIMOD 8 /* OBJECT in TREE #13 */ X#define CONVNAME 9 /* OBJECT in TREE #13 */ X#define SENDFILE 2 /* OBJECT in TREE #13 */ X#define RECFILE 3 /* OBJECT in TREE #13 */ X#define KERMEXIT 4 /* OBJECT in TREE #13 */ X#define REMSHELL 59 /* OBJECT in TREE #0 */ X#define SHELL32 60 /* OBJECT in TREE #0 */ X#define SHELL24 61 /* OBJECT in TREE #0 */ X#define SHELL12 62 /* OBJECT in TREE #0 */ X#define SHELL8 63 /* OBJECT in TREE #0 */ X#define SHELLOTH 64 /* OBJECT in TREE #0 */ X#define WINRESIZ 57 /* OBJECT in TREE #0 */ X#define WINCLEAR 56 /* OBJECT in TREE #0 */ X#define LOCCOPY 65 /* OBJECT in TREE #0 */ X#define OVERSTRI 45 /* OBJECT in TREE #0 */ X#define MFREE 31 /* OBJECT in TREE #0 */ SHAR_EOF chmod 0600 WIND.H || echo "restore of WIND.H fails" sed 's/^X//' << 'SHAR_EOF' > WINDEFS.H && X/* header file with various definitions X */ X X/* this one should really be in stdio.h ... X */ X X#ifndef NULL X#define NULL ((char *) 0) X#endif X X#define TRUE 1 X#define FALSE 0 X X/* constants X */ X X#define ALTINDICATOR '\05' X#define MAXFUNCLEN 41 /* Maximum length of function key string */ X#define BREAK_TICKS 20 /* length of break in clock() ticks (5ms * 20 = .1s) */ X#define MAXSCROLLED 8 X#define MAX_WIND 8 X#define NFSTRINGS 42 /* number of function keys */ X#define WI_WITHSLD (SIZER|UPARROW|DNARROW|VSLIDE|LFARROW|RTARROW|HSLIDE) X#define WI_NOSLD (NAME|MOVER|CLOSER|FULLER) X X X#define WI_ROWS 80 X#define WI_LINES 24 X#define WI_WCHAR 8 X#define WI_HCHAR 16 X#define WI_WPIX (WI_ROWS*WI_WCHAR+16) X#define WI_WWORDS ((WI_WPIX+15)/16) X#define WI_HPIX (WI_LINES*WI_HCHAR) X#define WI_SIZE ((long)WI_WWORDS*WI_HPIX*2) X#define XON '\021' X#define XOFF '\023' X X#define xmitcmd(x) { Bconout(1, IAC); Bconout(1, CB_DIR_MTOH|x); } X X#define MINMAX(x, y, z) ( x<y ? y : (x>z ? z :x) ) X X#define HASHBITS 9 /* number of bits of hash for character lookup*/ X X#define FM_INVERT 12 /* logic parameter to copy_fm */ X#define FM_COPY 3 /* copy source to dest */ X X#define X0 1 X#define Y0 1 X X/* emulation FSM states X */ X X#define S_NORMAL 0 X#define S_ESC 1 X#define S_ESC1 2 X#define S_ESC2 3 X#define S_ESC3 4 X#define S_STATUS 5 X#define S_ESCA 6 X X#define min(a,b) ( a < b ? a : b ) X#define max(a,b) ( a > b ? a : b ) X/* data types used X */ X Xtypedef struct mfdb { X short *ptr; /* ptr to memory holding the image */ X short wpix; /* width in pixels */ X short hpix; /* height in pixels */ X short wwords; /* width in words */ X short format; /* 0 for machine-dependent */ X short planes; /* 1 for hires screen */ X} MFDB; X Xtypedef struct { X unsigned char h_t[1<<HASHBITS]; /* hash table */ X struct { X char h_try; /* try this character next */ X char h_next; /* index of next entry in table */ X } h_colision[128]; /* colision lists formed here */ X} HTBL; X Xtypedef struct fnt { X int inc_x, inc_y; /* real size of one char */ X int def_win_x, def_win_y; /* default window size in chars for this font */ X HTBL f_hash; /* hash table for this font */ X char f_data[2048]; /* character data */ SHAR_EOF echo "End of part 2, continue with part 3" echo "3" > s2_seq_.tmp exit 0