IMD 1.18: 6/12/2012 18:53:44 sys 29/10a version 1.0 comm utilities pn 4120024-001  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ÅÙÔÁ×@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@åÖÓñÁÔÃ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@æÈÄÙñ@ÄÁãÁ@@@@@@@@@@@@@@@ðøð@ðñððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ðñððñ@ÄÄÙñ@ÄÁãÁðù@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁñð@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁññ@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁñò@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁñó@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁñô@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁñõ@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁñö@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁñ÷@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁñø@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁñù@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁòð@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁòñ@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁòò@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁòó@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁòô@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁòõ@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁòö@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ åååååååååååååååååååååååååå AFT COMAMDHST C € AMDHST C <AMDHST FOR€ !"#$%&'()*+,ååte$� Ãw&*Á7+#~þ>Ÿ&T]þ –&#å*Á7z³Ìt name of file? $bad file name$t enter delay in hex: $ delay set to $bad value$*ù:€2å{ þ,Ê™$þ;Ê™$¸Ê™$þ á"Á7ÂØ$yþÚØ$ÍÖ GÍÜ ÍÜ Ã»$ÅÍÓÁÍÜ þ ȸ³$ÍÖ ¸ÊÒ$Í� þ,ÊI$ÉÍÓÃI$Íõ:$9·úñÍÓyþ,ÊI$ÉÍIõxæƒÄªñÉÍZÍ{ þ"Ê %þ'AMDHST FOR€-./0123456789:;<AMDHST FORz=>?@ABCDEFGHIJKLFILEXF96COMMNOPFILEXF6 COMQRSTåå·Ê˜G!�~#Â�>ÍžÃ!"�!M "†"„>2’2“*þ"ˆ! "Š"Œ€"Ž>l2•>`2–:·Ê;!˜Í¢·Âú>ì2–>@2•Ã;!›åÄtOÍÜ þ ÈGÍÖ ¹Ê %xÍÓà S8TTYPTRPPRAMD ASCII file transfer program V1.1 11/24/82 $buffer size $using port $¥q²Q²rµRµwHEX2AMD COMUUVWXYZ[\]^_CHKSUM DAT`ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååÍ¢·Â>ì2–>Ü2•Ã;!ŸÍ¢·Â)>h2•Ã;!¤Í¢·Â;>d2•:•<2”:–<2—§Í_×Í_*†|/W}/_*ˆÍe ÍY ÍYäÍ_:•o¯gÍeå»W»sÁSÁpÇPÇcëCëf F d¬D¬buffer pointer at $collection terminated$collection started$buffer flushed$unknown functioåÃx$‡o& å ÍY ÍYÍÛæÊ;ÛæO:“·Ê)!ðÃ�AÍNÃ"ÍÞ Ã"ÃÍ×Ã"ÍKÃ"ÍÃÃ"&Í_*†|/W}/_*„Íe ÍY ÍYÃ":’·Êÿ¯2’9͸Ã">ån$buffer overflow$can't open file$file loaded$can't create file$warning: buffer full$file write error$write complete$send compleåå^#V*M8Í6 ÑØës#r¯2a8É*U8##Ã$õ:j7·ÊC$:a8·ÊC$ÅÕå*O8ë ÍÐáÑÁ¯2a8ñÉÍZÍ{ Íé þ"Ê\$þ'ÂØ$GÍÜ ÍÜ *Á7++å¸Ê|$ ÍÜ þ ʃ$¸Âo$Í� ¸Êo$Íé Í 2’O͸Ã"*†"„b͸Ã"q͸¯2“Ã;>¹Â7>2“Ã;AÍNÛæÊ…ÛæO*Šq#"Šë*Ž{½Â^! "Š:’·Ê…*„q#"„ë*ˆz¼Â…{½Â…‚͸åå..................................... SOH xx xx xxxxxxxx xx ETX CR where type canÆ�'Î@'_ÍYáÉ~·Êœ¹Êœ###Ã�#^#Vëé¾Â®·È#â>ÿÉ'Í_€{ Í!6#>  w# Â˯w# ÂÔ!�~#·ÈOþÚ #~+þ: ~Í] ÖA<##¯G d at any time. This program is written specifically to run under UNIX. It needs modifications in order to run under¯2’*Œë*Š{½ÊŒ*ŒFÛæÊŒxÓ*Œ#"Œë*Ž{½ÂŒ! "ŒÃŒÕÍY ÍY ÍYÑÍ_ ÍY ÍYÉͱÀ>€2FÍþÿÂô’͸É*†"„ë*ˆ|º/******************************************************************************* PROGRAM NAME : AMDHST.c DATE : Apriå be 1: download file, 2: upsave file, 3: upsave print file, 4: close print file, 5: reopen print file, 6: deÈ~#þ Èþ,Èþ?ÊT þ*ÊT þ.Ê( Í] xþ ÒT à  ¯G ÈxþÈ~#þ Èþ,Èþ?ÊT þ*ÊT þ.ÊT Í]  Ã. 8͸¯=ÉþaØþ{ÐæßÉÍÉŠÍÍÉ any other operating system supporting "C" language. It also serves as an example if one wants to write his own softw }»Â Ã#Í¥ þÿÊ#þÊ#*„w#"„ÃúÍf *„ë*ˆ|ºÂ@}»Â@‚͸ÃF¢͸¯2’ÉͱÀ¯2FÍÍþÿÂo®͸É*„ë*ˆ|ºÂ†}»Â†l 23, 1982 AUTHOR : Tsu-Phong Wu This software supports the file transfer between RTE16 and a host. This prålete file filename is of length up to 8 characters, checksum is the sum of all characters from length field to filenåÕÅ*F&DŠw:F<þ€ÌŸ 2FxÁÑáÉÍo G¯ÉåÕÅ:Fþ€ÌÈ o&ŠxþÿÊÄ ~!F4ÁÑáÉŠÍÍG¯2FÉGÍ_€{ Í!�~#·Ê6 O~#þ0Úare to communicate with RTE16. The message format is described ad follows : header record ------------- startÀ͸*†ë*„z¼Âš{½ÂšíÍ€ þÿŠÕ͸õ>Í€ Ío Íf æ͸¯2’É*†ë*„|ºÂ×}»Â×ÃøGÍN>£ÂìÅÕ.ÍYÑÁ*�|µÊÇ+Ãïõ͸¯2ogram constantly listens to RTE16 and tries to satisfy the request regardless of any invalid conditions. Therefore RTE16 måame field, CR is converted to LF by UNIX data record ----------- start data block data  þ:Ú$ þAÚ þGÚ" þaÚ þgÚ" n͸ÉÆ æë))))µoë Âû ë"�^Í_*�Íe ÍY ÍYÉÍÍG¯2FÉGÍ_€{ Í!�~#·Ê6 O~#þ0Ú filename end carriage of header length type filename checksum of text return ...........................’É:”2<2>2@2D2H2L2O2<:•2W2C:–2”2ž:—2�2–>ÓÓÓ>@Ó>NÓ>7ÓÉÛæÊNxÓÉÍÉ ÍÉ|Í~|Í~}Í~}Í~Éåæust monitor the communication and cancel the request under those circumstances. A request to cancel is always accepte end carriage of text length number block checksum of text return .................................................* tab */ #define NEWTAB 0x1f /* new tab */ #define ENDSIZE 8 /* end record size */ #define FILENAMELEN 12 /* file nax1 /* start of header */ #define STX 0x2 /* start of text */ #define ETX '.' /* end of text */ #define NEWDOT 0x1c ************************ m a i n LOCAL - TRANSACTION: transaction type, REOPEN: print save interrupted flag, F0 ETX CR where CR is converted to LF by UNIX ************************************************************SOH received, cancel flag also set, DEBUG: TRUE to enable debugging message, PBLOCKNO: print save block number ******.......... STX xx xx xxxxx xx ETX CR where data block is of length up to 128 characme length */ #define DATALEN 64 /* data block length */ #define BLOCKSIZE 25 /* block buffer length */ /**************/* change period to 1c hex */ #define ENQ 0x5 /* enquiry */ #define ACK 0x6 /* acknowledge */ #define LF 0x0a /* line feedD: file ptr, I, ITEMP, CTEMP & C: miscellaneous; It waits for and processes the following request from RTE16 : do*******************/ #include #define TRUE 1 #define FALSE 0 /* RTE16 request */ #define DOWNLOAD 1 /* Ho************************************************************/ char filename[FILENAMELEN+1],printname[FILENAME+1]; char buffeters (corresponding to 64 bytes after packed), checksum is the sum of all characters from length field to data block**************************************************** G L O B A L ENDRECORD: record to end transmission, BLOCK,  */ #define NEWLF 0x1e /* the mapped line feed */ #define NAK 0x16 /* negative acknowledge */ #define CAN 0x18wnload upsave print save close reopen delete The communication always starts at RTE16 sending a header record tst to RTE */ #define UPSAVE 2 /* RTE to Host */ #define PRINTSAVE 3 /* RTE to Host PRINT file */ #define CLOSE 4 /* Close Pr[DATALEN+8],block[BLOCKSIZE],checksum,ck12,etx; int blockindex,blockcount,cancel,length,index,soh,debug,pblockno; char endrec field, CR is converted to LF by UNIX end record ---------- start block end carriage of text lenBLOCKCOUNT & BLOCKINDEX: block buffer, count and index, BUFFER, LENGTH & INDEX: message buffer, length and index, CHEC /* cancel */ #define CR 0x0d /* Carriage Return */ #define NEWCR 0x1D /* New CR */ #define TAB 0x09 /o the host. Host will determine the request and talk back to RTE16. *****************************************************RINT file */ #define REOPEN 5 /* Reopen PRINT file */ #define DELETE 6 /* Delete file */ /* sync chars */ #define SOH 0ord[ENDSIZE] = {STX,'0','0','0','0','C','0',ETX}; char getrte(); /***************************************************gth number checksum of text return .................................................... STX 00 00 CKSUM, CK12 & ETX: checksum and etx, FILENAME & PRINTNAME: file names, CANCEL: RTE16 request to cancel flag, SOH:  **********************/ main () { int i,itemp,transaction,reopen; FILE *fd; char *ctemp,c; soh = reopen = debug =  /* process UPSAVE */ itemp = upsave(fd); /* flush buffer and save file even if cancelled */ putblock(fd); ame," download\n"); if (fd = fopen(filename,"r")) { /* acknowledge */ putrte(ACK); /* process DOWNLOAD */  /* process PRINTSAVE - don't initialize pblockno */ itemp = printsave(fd); /* flush buffer and save file evenprintsi("got",SOH); /* clear soh and cancel again */ cancel = soh = FALSE; /* get one message */ transaction = recei putblock(fd); fclose(fd); /* SOH ? */ if (itemp == SOH) reopen = TRUE; } else putrte(NAK); /* canFALSE; /* sign on */ printf("AMD AMDHSTCX V1.0 1/25/83\n"); printf("---------------------------------------\n\n fclose(fd); } else putrte(NAK); /* can't create file */ break; case PRINTSAVE: /* save f download(fd); /* close file */ fclose(fd); } else putrte(NAK); /* can't open file */ break if cancelled */ putblock(fd); fclose(fd); /* SOH ? */ reopen = FALSE; if (itemp == SOH) reopen = TRUE; ve(); /* check for obvious error */ if ((length <= FILENAMELEN) && (DOWNLOAD <= transaction) && (transaction <= DELE't create file */ break; case CLOSE: printss("close","\n"); /* acknowledge */ putrte(ACK);"); /* enable debugging ? */ printf("Want DEBUG option (Y/N) ? "); gets(buffer); for (ctemp=buffer; (c=(*cile name */ for (i=0; i '9') ctemp1 = ctemp1 - '7'; else ctemp1 = ctemp1 - '0'; return (((ctemp << 4) + ctemp1) & 0xff); }  case ACK: printf(" ACK"); break; case CAN: printf(" CAN"); break; case ENQ: printf(" ENQ"); break; caseKSUM. RETN - two bytes from RTE16 packed into one ***********************************************************/ getrt s ENTRY - str1,str2: ptrs to string It prints out debugging message. *************************************/ p "cancel" flag */ if (cancel == TRUE) return (CAN); /* compute "checksum" */ ctemp = getchar(); checksum =ncel" flag is to avoid hanging up when AMDHST has received unexpected cancel request or start of another header record from/******************************* p u t r t e ENTRY - BYTE: the byte It sends one byte to RTE16. ************ NAK: printf(" NAK"); break; case SOH: printf(" SOH"); break; case STX: printf(" STX"); break; } } } /e2 () { char ctemp,ctemp1; ctemp = getrte(); ctemp1 = getrte(); /* convert to upper case if necessary */ rintss(str1,str2) char *str1,*str2; { if (debug) printf("%s%s",str1,str2); } /************************************  checksum + ctemp; /* set up "cancel" and "soh" flag*/ if (ctemp == CAN) cancel = TRUE; if (ctemp == SOH) cance RTE16. It works by forcing control to flow to certain points where "cancel" is checked for. "cancel" flag wi*******************/ putrte (byte) char byte; { putchar(byte); } /******************************************************************************************************************************* g e t r t e GLOBAL - CANCEL: cancel fla if (('a' <= ctemp) && (ctemp <= 'f')) ctemp = ctemp - 'a' + 'A'; if (('a' <= ctemp1) && (ctemp1 <= 'f')) ctemp1 = ctemp1 p r i n t s i ENTRY - str1: ptr to string, sync: sync char It prints out debugging message. ************l = soh = TRUE; if (debug) printf(".%x",ctemp); return (ctemp); } /*******************************************ll be cleared after flow of control returns to the top level where SOH is expected. RETN - next byte from RTE16 ******************** p u t b u f ENTRY - BYTE: the byte GLOBAL - BUFFER[] & INDEX: message buffer and index, Cg, CHECKSUM: checksum LOCAL - CTEMP: char It reads one byte from RTE16 and accumulates CHECKSUM. Whenever - 'a' + 'A'; /* convert hex to binary */ if (ctemp > '9') ctemp = ctemp - '7'; else ctemp = ctemp - '0'; ************************/ printsi(str1,sync) char *str1,sync; { if (debug) { printf("%s",str1); switch (sync) { **************** g e t r t e 2 LOCAL - CTEMP & CTEMP1: chars It packs two bytes from RTE16 and accumulates CHEC HECKSUM: checksum It writes one byte into "buffer[index]" and computes CHECKSUM. "index" is incremented by 1. ***'; return ((temp << 4) + temp1); } /******************************************************************************* - TEMP & TEMP1: chars It packs two bytes at "buffer[index]" and "buffer[index+1]" into one. "index" is incrementedndex It reads one byte from block buffer. Make sure both "blockcount" and "blockindex" are 0 before the first call*****************************************************/ putbuf2 (byte) char byte; { char temp; /* masking */ te: block[blockcount++] = NEWCR; break; case LF : block[blockcount++] = NEWLF; break; case TAB : block[bloc***************************************************************/ putbuf (byte) char byte; { /* computes "checksum" */  g e t b l o c k ENTRY - FD: ptr to a file GLOBAL - BLOCK[], BLOCKCOUNT & BLOCKINDEX: block buffer, count and inde by 2. RETN - packed byte *************************************************************************/ char pack2 ()  to "getch". Or else do a "getblock" before the first call to "getch". RETN - either next byte or EOF *****mp = (byte >> 4) & 0xf; byte = byte & 0xf; /* convert binary to hex */ if (temp > 9) putbuf(temp + '7'); ekcount++] = NEWTAB; break; case '.' : block[blockcount++] = NEWDOT; break; default : block[bl buffer[index++] = byte; checksum = checksum + byte; } /***********************************************************x LOCAL - C: char It transfer one block from file. "blockindex" is set to 0 and "blockcount" is set to number{ char temp,temp1; temp = buffer[index++]; temp1 = buffer[index++]; /* convert hex to binary */ if (tem**************************************************************************/ char getch (fd) FILE *fd; { /* check EOF *lse putbuf(temp + '0'); if (byte > 9) putbuf(byte + '7'); else putbuf(byte + '0'); } /****************************ockcount++] = c; } blockindex = 0; } /********************************************************************************* p u t b u f 2 ENTRY - BYTE: the byte LOCAL - TEMP: char It unpacks the byte into two, stores t of bytes transfered. *******************************************************************************/ getblock (fd) Fp > '9') temp = temp - '7'; else temp = temp - '0'; if (temp1 > '9') temp1 = temp1 - '7'; else temp1 = temp1 - '0/ if ((blockcount == 0) && (blockindex == 0)) return (EOF); if (blockcount-- == 0) { /* get new block when block b********************************************* p a c k 2 GLOBAL - BUFFER[] & INDEX: message buffer and index LOCAL ******* g e t c h ENTRY - FD: ptr to a file GLOBAL - BLOCK[], BLOCKCOUNT & BLOCKINDEX: block buffer, count and ihem at "buffer[index]" and "buffer[index+1]", and computes "checksum". "index" is incremented by 2. ***************ILE *fd; { char c; for (blockcount=0; ((blockcount UNTIL (CONDITION) C WHILE (CONDITION) ENDWHILE C SWITC, C 2: UPSAVE FILE, C 3: UPSAVE PRINT FILE, C 4: CLOSE PRIN C TO COMPLETE A TRANSFER REQUEST REGARDLESS OF INVALID CONDITIONS. C THE RTE16/AMDSYS29 PROGRAMS MONITOR THE COMMUNICATIOME METHOD OF HANDLING C CHARACTER VARIABLES. C C THE MESSAGE FORMAT IS DESCRIBED AS FOLLOWS : C HEADER REE IN STRLN AND C DOWNLOAD. FOR SYSTEM 29 COMMUNICATION C D 1/13/83 ADDED COMMENTED CODE FOR VAXES RUNNING EAT" C "SWITCH" REFER TO THE RATFOR CONTROL STATEMENTS. C RATFOR GENERATES ALL LABELS GREATER THAN 23000 C LH (VARIABLE) THIS IS EQUIVALENT TO A PASCAL CASE STATEMENT C FOR (CONDITION INCREMENT VARIABLE) ENDFOR C T FILE, C 5: REOPEN PRINT FILE, C 6: DELETE FILE C FILENAME IS OF LENGTN LINES AND C WILL ISSUE A CANCEL TO ANY INVALID REQUEST. C THIS PROGRAM WILL ALSO MONITOR THE COMMUNICATION LINES AND WICORD C ------------- C START FILENAME END CARRIAGE C OF HEADER LENGT C VMS. THE CODE IS UNTESTED PEOPLE USING C A VAX SHOULD REPLACE THE 2 READS WITH C A SYSTEM CALL AND THE 'WTQIO' WITABEL 0 -99 ARE FOR ERROR CONDITIONS C LABELS 200 - 900 ARE BRANCHS C LABELS 1000 -2000 ARE FORMAT STATEMENTS C RATFOR TRANSLATES STATEMENTS LIKE C IF (CONDITION) THEN BEGIN C STATEMENTS C END ELSE BEGIN C STATEMENTH UP TO 8 BYTE, C CKSUM IS THE SUM OF ALL BYTE FROM LENGTH FIELD TO FILENAME C FIELD, C C DATALL ALWAYS C EXCEPT A REQUEST TO CANCEL ( A CONTROL X) AT ANY TIME. C C THIS PROGRAM WAS WRITTEN IN RATFOR (RATIONAL FORTH TYPE FILENAME CKSUM OF TEXT RETURN C ................................................................ C C H C A 'SYS$ASSIGN' C SEARCH FOR THE KEYWORD 'VAX' C C THIS PROGRAM SUPPORTS FILE TRANSFERS BETWEEN BOTH RTE16 AND A THIS PROGRAM WAS WRITTEN TO RUN UNDER THE RSX11 OR RT11 OPERATING C SYSTEM RUNNING DEC FORTRAN IV. IT SHOULD WORK WITH   RECORD C ----------- C C START DATA BLOCK DATA END CARRIAGE C OF TEXT LENGTH NXT C DEFINE ETX 0X3 END OF TEXT A PERIOD C DEFINE ENQ 0X5 ENQUIRY C DEFINE ************************ C RTE16 REQUEST C DEFINE DOWNLD 1 HOST TO RTE C DEFINE UPSAV 2 GRAM AMDHST C****************************************************** C M A I N C LOCAL - TRANSACTION: TRANSX TYPE, CC OF TEXT LENGTH NUMBER CKSUM OF TEXT RETURN C .................................................... C C CK BUFFER, COUNT AND INDEX, C BUFFER, LENGTH & INDEX: MESSAGE BUFFER, LENGTH AND INDEX, C SINBUF STANDARD INPUT BUFFEUMBER BLOCK CKSUM OF TEXT RETURN C ........................................................... C C STX  ACK 0X6 ACKNOWLEDGE C DEFINE LF 0X0A LINE FEED C DEFINE NAK  RTE TO HOST C DEFINE PRSAV 3 RTE TO HOST PRINT FILE C DEFINE CLOSE1 4 CLOSE PRIN REOPN: PRINT SAVE INTERRUPTED FLAG, C FD: FILE PTR, C I, ITEMP, CTEMP & C:  STX 00 00 C0 ETX CR C C N.B. ALL FILES WHICH ARE TO BE DOWNLOADED MUST BE IN THE FOLLOWING R C CHKSUM, CK12 & ETX, IETX: C CKSUM AND CETX AND THE INTEGER REPRESENTATIVE OF CETX C FILENAME & PRINTNAME XX XX XXXXX XX ETX CR C C WHERE C DATA BLOCK IS OF LENGTH UP TO 128 BYTE (CORRESPON 0X16 NEGATIVE ACKNOWLEDGE C DEFINE CAN 0X18 CANCEL C DEFINE FILLEN 8 FILE NAME T FILE C DEFINE REOPN 5 REOPEN PRINT NAME C DEFINE DELET 6 DELETE FILE C SMISCELLANEOUS; C C IT WAITS FOR AND PROCESSES THE FOLLOWING REQUEST FROM RTE16 : C C DOWNLOAD C UPSA C FORMAT: 1 .. 79 ASCII CHARACTERS FOLLOWED BY A C NEWLINE CHARACTER(S) . HEXBINFX PRODUCES CORRECTLY C : FILE NAMES, C CANCEL: RTE16 REQUEST TO CANCEL FLAG, C SOH: SOH RECEIVD, CANCEL FLAG ALSO SET, C DEBUG: .TRUE. TO ENABDING TO 64 C BYTES AFTER PACKED), C CKSUM IS THE SUM OF ALL BYTE FROM LENGTH FIELD TO DATA C LENGTH C DEFINE DATLEN 64 DATA BLOCK LENGTH C DEFINE BLKSIZ 25 BLOCK BUFFER LENGTH C *YNC CHARACTERS C DEFINE SOH 0X1 START OF HEADER C DEFINE STX 0X2 START OF TEVE C PRINT SAVE C CLOSE C REOPEN C DELETE C CTHE COMMUNICATION ALWAYS STARTS AT RTE16 SENDING A HE FORMATTED DATA. C C PRINT FILES WILL HAVE A MAXIMUM OF 32 CHARACTERS / LINE. C******************************LE DEBUGGING MESSAGE, C PBLOCKNO: PRINT SAVE BLOCK NUMBER C****************************************************** PRO BLOCK FIELD, C C END RECORD C ---------- C C START BLOCK END CARRIAGE ********************* C G L O B A L C ENDRECORD: RECORD TO END TRANSMISSION, C BLOCK, BLOCKCOUNT & BLOCKINDEX: BLO  ADER RECORD TO THE C HOST. HOST WILL DETERMINE THE REQUEST AND TALK BACK TO RTE16. IMPLICIT INTEGER(A-Z) C GLOBAL SOH/1/,STX/2/,ETX/46/,ENQ/5/,ACK/6/,LF/10/,NAK/22/,CAN/24/, &CR/13/ DATA ENDSIZ/8/,FILLEN/10/,DATLEN/64/,BLKSIZ/25/HW,STXW,ETXW,ACKW,LFW,NAKW,CANW C COMMON /LOG/ ITBILN, IMASK(16) C LOCAL VARIABLES C GETRTE IS AN CHARACTER OR BYTE FUNER DETAILS C*************************************************************** C C SIGN ON TYPE 1000 TYPE 1010 10TX,DUM1,CKSUM, & CK12, BLKIND,BLKCNT,LENGTH,INDEX,PBLKNO,VSOH,EOF,CANCEL,IETX COMMON /BUG/ DEBUG LOGICAL DE68/ DATA FOREVE/.TRUE./ VSOH = .FALSE. REOPEN = .FALSE. DEBUG = .FALSE. C CALL FOR RSX SYSTEMS VARIABLES C GLOBAL VARIABLES ARE REPRESENTED BY THE USE OF COMMON STATEMENTS C DUE TO THE ANSI PROHIBITION OF MIXING CHARACT DATA SOHW/"0401/,STXW/"1002/,ETXW/"1403/,ENQW/"2403/,ACKW/ &"3006/,LFW/"5012/,NAKW/"21042/CANW/"14030/,CRW/"6415/ CTION BYTE DNAME(10) , GETRTE,SIG BYTE FNAM1(10),PRNAM(10),DNAM1(10) BYTE PRNTMP(40) INTEGER I,IT00 FORMAT(' AMD AMDHSTFX V1.0 1/25/83') 1010 FORMAT(' ---------------------------------------') C ENABLEBUG C CONSTANT VARIABLES COMMON /CONS/ENDREC,ENDSIZ,FILLEN,DATLEN,BLKSIZ,DOWNLD,UPSAV, &PRSAV,REOPN,DELET,SOH,STX,TO ENABLE TERMINAL I/O DELETE FOR A VAX CALL WTQIO(768,5,1) C***********************************************************ER AND INTEGER TYPES C MOST VARIABLES ARE TREATED AS INTEGER IN THE MAIN PROGRAM AND C CHARACTER TYPES IN THE SUBROUTINES  C DATA IBITLN /15/ C DATA IMASK( 1) /1/,IMASK( 2) /2/ C DATA IMASK( 3) /4/,IMASK( 4) /8/ C DATA IMASK( 5EMP,TRANSX,ITEMP1 LOGICAL FOREVE,IOERR,REOPEN EQUIVALENCE (FNAME,FNAM1), (PRNAME,PRNAM1),(DNAME,DNAM1) CONSTANT D DEBUGGING ? TYPE 1020 1020 FORMAT(' WANT DEBUG OPTION (Y/N) ? ') READ (5,990) (BUFFER(II) , II=1,80) 990 FOETX,ENQ,ACK,LF,NAK,CAN,CR,SOHW,STXW, & ETXW,ENQW,ACKW,LFW,NAKW,CANW,CRW BYTE ENDREC(6) INTEGER ENDSIZ,FILLEN***** C VAX C THE FOLLOWING CODE IS SUPPOSED TO WORK FOR VAXES RUNNING C VMS. IT HAS NEVER BEEN TESTED C C CALL SY BYTE FNAME(10),PRNAME(10) BYTEBUFFER(72),SINBUF(80) INTEGER CKSUM,CK12,BLKIND,BLKCNT,LENGTH,INDEX,PBLKNO ) /16/,IMASK( 6) / 32/ C DATA IMASK( 7) /64/,IMASK( 8) / 128/ C DATA IMASK( 9) /256/,IMASK(10) / 512/ C DATA IATA DATA ENDREC/'0','0','0','0','C','0'/ DATA DOWNLD/1/,UPSAV/2/,PRSAV/3/,CLOSE1/4/,REOPN/5/,DELET/6/ DATA RMAT(80A1) DEBUG = (BUFFER(1) .EQ. 'Y') .OR. (BUFFER(1) .EQ. 'Y') C WHILE 23000 IF(.NOT.(FOREVE))GOTO 23001 C ,DATLEN,BLKSIZ INTEGER DOWNLD,UPSAV,PRSAV,REOPN,DELET INTEGER*2 SOH,STX,ETX,ENQ,ACK,LF,NAK,CAN INTEGER*2 SOS$ASSIGN('TT:',CHAN,) C CHAN SHOULD BE INTEGER*4 DECLARED IN A COMMON BLOCK C LOOK IN THE VAX I/O USERSGUIDE VOL 1 FOR FURTH INTEGER*2 IETX INTEGER*2 CETX LOGICAL EOF,VSOH,CANCEL COMMON /GLOB/ FNAME,PRNAME, BUFFER,BLOCK,SINBUF,CEMASK(11) /1024/,IMASK(12) / 2048/ C DATA IMASK(13) /4096/,IMASK(14) / 8192/ C DATA IMASK(15) /16384/,IMASK(16) / 327  WAIT FOR SOH IF(.NOT.(.NOT.VSOH))GOTO 23002 C REPEAT 23004 CONTINUE CALL PRTS CALL PUTRTE(ACKW) C PROCESS DOWNLD CALL DWNLD(FD) C C C ENDFOR 23013 CONTINUE CALL PRTSS(FNAME,'CALL DWNLD') OPEN(UNIT=1,ERR=1 UPSAVE(FD) CLOSE(UNIT=2) 23020 CONTINUE GOTO 23009 23016 CONTINUE LD .LE. TRANSX) .AND.( &TRANSX .LE. DELET) .AND. (CK12 .EQ. CKSUM) .AND. (IETX .EQ. & ETX)))GOTO 23007 C AME,' UPSAVE ') OPEN(UNIT=2,ERR=20,NAME=FNAM1,TYPE ='UNKNOWN', & FORM='FORMATTED',RECORDSIZE=1)I('WAIT1 ',SOH) SIG = GETRTE(DUM) ITEMP1 = SIG CANCEL = .FALSE. 23005 LOSE FILE CLOSE(UNIT=1) 23014 CONTINUE GOTO 23009 23010 CONTINUE 0,NAME=FNAM1 ,TYPE='OLD',FORM= & 'FORMATTED', RECORDSIZE=1) GOTO 210 10 CALL PUTRTE IF(.NOT.(I23009.EQ.( PRSAV)))GOTO 23022 CALL CLRBUF(PRNAME,10) C SAVE FILE NAME C  PROCESSING C SWITCH I23009 = (TRANSX) IF(.NOT.(I23009.EQ.( DOWNLD)))GOTO 23010 C  FD =2 GOTO 220 CALL PRTSS('UPSAVE NACK',FNAM1) 20 CALL PUTRTE(NACK IF(.NOT.(ITEMP1 .EQ. SOH))GOTO 23004 C CLEAR VSOH AND CANCEL AGAIN 23002 CONTINUE CALL PRTSI('GOT  IF(.NOT.(I23009.EQ.( UPSAV)))GOTO 23016 C SAVE FILE NAME CALL CLRBUF(FNAME,10) C (NAKW) C CAN'T OPEN FILE IOERR=.TRUE. 210 CONTINUE IF(.NOT.(.NOT FOR I=1 23023 IF(.NOT.(I.LE.LENGTH))GOTO 23025 PRNAME(I) = BUFFER(I)  SAVE FILE NAME CALL CLRBUF(FNAME,10) C FOR I=1 23011 IW) IOERR = .TRUE. 220 CONTINUE IF(.NOT.(.NOT.IOERR))GOTO 23020 C  ',SOH) VSOH = .FALSE. CANCEL = .FALSE. IOERR = .FALSE. EOF = .FALSE. C GET ONE FOR I=1 23017 IF(.NOT.(I.LE.LENGTH))GOTO 23019 FNAME(I) = BUFFER(I) .IOERR))GOTO 23014 FD=1 REWIND 1 C ACKNOWLEDGE  I=I+1 GOTO 23023 C ENDFOR 23025 CONTINUE CALL PRTSSF(.NOT.(I.LE.LENGTH))GOTO 23013 FNAME(I) = BUFFER(I) I=I+1 GOTO 23011  ACKNOWLEDGE CALL PUTRTE(ACKW) C PROCESS UPSAV ITEMP = MESSAGE TRANSX = RECEIV(DUM) C CHECK FOR OBVIOUS ERROR IF(.NOT.((LENGTH .LE. FILLEN) .AND. (DOWN I=I+1 GOTO 23017 C ENDFOR 23019 CONTINUE CALL PRTSS(FN (PRNAME,' PRTSAV ') OPEN (UNIT=3,ERR=30,FORM='FORMATTED',TYPE='NEW',NAME= & PRNAM1 ,RECORDSIZEC SUCCESFULLY FILE COPY CLOSE (UNIT=3) GOTO 240 40 CALL PUTRTE(NACKW) Q.( REOPN)))GOTO 23031 CALL PRTSS(PRNAME,' REOPEN ') OPEN(UNIT=3,ERR=40,NAME=PRNAM1,FORM='FONUE GOTO 23009 23031 CONTINUE IF(.NOT.(I23009.EQ.( DELET)))GOTO 23038 CALITEMP .EQ. SOH))GOTO 23028 REOPEN = .TRUE. 23028 CONTINUE 23026 CONTINUE  CONTINUE READ(7,45,END=50)PRNTMP WRITE(3,45) PRNTMP =1) FD =3 GOTO 230 30 CONTINUE CALL PUTRTE(NACKW) I IOERR=.TRUE. 240 CONTINUE IF(.NOT.(REOPEN .AND. (.NOT.IOERR)))GOTO 23032 C RMATTED',TYPE= & 'OLD',DISPOSE='DELETE',RECORDSIZE=1) OPEN(UNIT=7,ERR=40,NAME='PRN.TMP',FORM='FOL PRTSS(' DELETE ',DNAM1) C ACKNOWLEDGE CALL PUTRTE(ACKW) CALL CLRBUF(DNA GOTO 23009 23022 CONTINUE IF(.NOT.(I23009.EQ.( CLOSE1)))GOTO 23030 CALL PRTSS(' C GOTO 49 50 CONTINUE CLOSE(UNIT=7) CLOSE(UNIOERR=.TRUE. 230 CONTINUE C ACKNOWLEDGE IF(.NOT.(.NOT.IOERR))GOTO 23026  ACKNOWLEDGE CALL PUTRTE(ACKW) C PROCESS PRSAV - DON'T INITIALIZE PBLKNO RMATTED',TYPE= & 'NEW',DISPOSE='DELETE',RECORDSIZE=1) 42 CONTINUE READ(3,45,END=47ME,10) C FOR I=1 23039 IF(.NOT.(I.LE.LENGTH))GOTO 23041 DNAME(I) =BUFLOSE ',PRMAN1) C ACKNOWLEDGE CALL PUTRTE(ACKW) C CLOSE PRINT FILE AND T=3) C SOH ? REOPEN = .FALSE. IF(.NOT.(ITEMP .EQ. SOH))GOTO CALL PUTRTE(ACKW) C PROCESS PRSAV - INITIALIZE PBLKNO PBLKNO = 0  ITEMP =PRTSAV(3) IF(.NOT.(ITEMP .NE.ACK))GOTO 23034 C REWIND 7 ) PRNTMP 45 FORMAT(40A1) WRITE (7,45) PRNTMP GOTO 42 47 CONTINUE FER(I) I=I+1 GOTO 23039 C ENDFOR 23041 CONTINUE OIGNORE ERRORS CLOSE(UNIT=FD) GOTO 23009 23030 CONTINUE IF(.NOT.(I23009.E 23036 REOPEN = .TRUE. 23036 CONTINUE 23034 CONTINUE 23032 CONTI ITEMP = PRTSAV(FD) CLOSE(UNIT=3) C SOH ? IF(.NOT.( OPEN(UNIT=3,ERR=40,NAME=PRNAM1,FORM='FORMATTED', & TYPE='NEW',RECORDSIZE=1) 49  PEN(UNIT=4,NAME=DNAM1 ,TYPE='UNKNOWN') CLOSE(UNIT=4,DISPOSE='DELETE') C DELETE FILE AND IGNO FNAME,PRNAME, BUFFER,BLOCK,SINBUF,CETX,DUM1,CKSUM, &CK12, BLKIND,BLKCNT,LENGTH,INDEX,PBLKNO,VSOH,EOF,CANCEL,IETX C P R I N T S I C C ENTRY - STR1: STRINGS, C SYNC: SYNC CHARACTER C C IT PRINTS OUT DEBUGGING MESSAGE. C**K)))GOTO 23050 TYPE 1040 GOTO 23046 23050 CONTINUE IF(.NOT.(I23046.EQ.( SOH)))GOTO 23***** C P R I N T S S C C ENTRY - STR1,STR2: STRINGS C C IT PRINTS OUT DEBUGGING MESSAGE. C********************* IF(.NOT.(DEBUG))GOTO 23044 TYPE 1000,STR1 1000 FORMAT(1H$,10A1) C SWITCH I23046 = (SYNC) RE ERRORS 23038 CONTINUE 23009 CONTINUE GOTO 23008 C ELSE 23007 CONTINUE OMMON /BUG/ DEBUG LOGICAL DEBUG C CONSTANT VARIABLES COMMON /CONS/ENDREC,ENDSIZ,FILLEN,DATLEN,BLKSIZ,DOWNLD,UPSAV**************************************************** SUBROUTINE PRTSI(STR1,SYNC) C LOCAL VARIABLES IMPLICIT INTEG051 TYPE 1050 GOTO 23046 23051 CONTINUE IF(.NOT.(I23046.EQ.( STX)))GOTO 23052 ********************************* SUBROUTINE PRTSS(STR1,STR2) IMPLICIT INTEGER (A-Z) BYTESTR1(10) ,STR2(10) IF(.NOT.(I23046.EQ.( ACK)))GOTO 23047 TYPE 1010 GOTO 23046 23047 CONTINUE I CALL PUTRTE(NAKW) IF (DEBUG) TYPE 2000,LENGTH,FILLEN,TRANSX,CK12,CKSUM,IETX,ETX 2000 FORMAT(' LEN=',I4,'FIL, &PRSAV,REOPN,DELET,SOH,STX,ETX,ENQ,ACK,LF,NAK,CAN,CR,SOHW,STXW, &ETXW,ENQW,ACKW,LFW,NAKW,CANW,CRW BYTE ENDRER(A-Z) C GLOBAL VARIABLES BYTE FNAME(10),PRNAME(10) BYTEBUFFER(72),SINBUF(80) INTEGER CKSUM,CK12,BLKIND, TYPE 1060 23052 CONTINUE 23046 CONTINUE 1010 FORMAT(' ACK') 1020 FORMAT(' CAN') 1030 FORMAT(' EN COMMON /BUG/ DEBUG LOGICAL DEBUG IF(.NOT.(DEBUG))GOTO 23042 TYPE 1000,STR1,STR2 23042 CONTINUE F(.NOT.(I23046.EQ.( CAN)))GOTO 23048 TYPE 1020 GOTO 23046 23048 CONTINUE IF(.NOT.(I23LEN=',I4,' TRANSX=',I4,'CK12=',I4, & 'CKSUM=',I4,'IETX=',I4,' ETX=',I4) C MESSAGE ERROR 23008 CONTINUEEC(6) INTEGER ENDSIZ,FILLEN,DATLEN,BLKSIZ INTEGER DOWNLD,UPSAV,PRSAV,REOPN,DELET INTEGER*2 SOH,STX,ETX,ENQ,BLKCNT,LENGTH,INDEX,PBLKNO INTEGER*2 IETX INTEGER*2 CETX LOGICAL EOF,ERROR,VSOH,CANCEL COMMON /GLOB/Q') 1040 FORMAT(' NAK') 1050 FORMAT(' SOH') 1060 FORMAT(' STX') 23044 CONTINUE RETURN END C****** 1000 FORMAT(' ', 'PRTSS=',2(10A1)) RETURN END C****************************************************** C 046.EQ.( ENQ)))GOTO 23049 TYPE 1030 GOTO 23046 23049 CONTINUE IF(.NOT.(I23046.EQ.( NA GOTO 23000 C ENDWHILE 23001 CONTINUE STOP END C*************************************************ACK,LF,NAK,CAN INTEGER*2 SOHW,STXW,ETXW,ACKW,LFW,NAKW,CANW CLOCAL VARIABLES BYTE STR1(10) INTEGER*2 SYNC  ************************************************ C CLRBUF C CLEAR A BUFFER OF SIZE C**********************ND,BLKCNT,LENGTH,INDEX,PBLKNO,VSOH,EOF,CANCEL,IETX COMMON /BUG/ DEBUG LOGICAL DEBUG C CONSTANT VARIABLES CEL WHERE SOH IS EXPECTED. C C RETN - NEXT CHARACTER FROM RTE16 C****************************************************** HE NEXT CHARACTER FORM THE STANDARD INPUT C BUFFER . IF THEIR IS NO DATA WAITING TO BE READ C NEXTCH WAITS FOR DATA TO BE CTER FROM RTE16 AND ACCUMULATES CHKSUM. C C WHENEVER CAN OR SOH IS RECEIVED, IT SETS C UP 'CANCEL' FLAG TO FORCE 'GETRCAN) RETURN C COMPUTE 'CHECKSUM' 23056 CONTINUE CTEMP = NEXTCH(SINBUF,CANCEL) ITEMP = CTEMP ******************************** SUBROUTINE CLRBUF(STRING,ISIZE) BYTE STRING(ISIZE) INTEGER I,ISIZE C OMMON /CONS/ENDREC,ENDSIZ,FILLEN,DATLEN,BLKSIZ,DOWNLD,UPSAV, & PRSAV,REOPN,DELET,SOH,STX,ETX,ENQ,ACK,LF,NAK,CAN,CR,SOHW,S LOGICAL FUNCTION GETRTE*1(DUM) IMPLICIT INTEGER(A-Z) C GLOBAL VARIABLES BYTE FNAME(10),PRNAME(10) BYENTERED. IF THE RTE SYSTEM APPEARS C TO BE DEAD, IT IS PROBABLY NEXTCH WAITING FOR DATA. C***********************************TE(DUM)' C TO RETURN CAN ON FUTURE CALL. C C THE PURPOSE OF 'CANCEL' FLAG IS TO AVOID C UNEXPECTED CANCEL REQUEST  CKSUM = CKSUM + ITEMP C SET UP 'CANCEL' AND 'VSOH' FLAG IF(.NOT.(CTEMP .EQ. CAN))GOTO 23058 CANCEL = .TRFOR I=1 23053 IF(.NOT.(I.LE.ISIZE))GOTO 23055 STRING(I) = ' ' I = I +1 GOTO 23053 C ETXW, & ETXW,ENQW,ACKW,LFW,NAKW,CANW,CRW BYTE ENDREC(6) INTEGER ENDSIZ,FILLEN,DATLEN,BLKSIZ INTEGER DTEBUFFER(72),SINBUF(80) INTEGER CKSUM,CK12,BLKIND,BLKCNT,LENGTH,INDEX,PBLKNO INTEGER*2 IETX INTEGER*2 CETX ******************* LOGICAL FUNCTION NEXTCH*1(SINBUF) C IMPLICIT INTEGER (A-Z) COMMON /BUG/ DEBUG OR START OF C ANOTHER HEADER RECORD FROM RTE16. C C IT WORKS BY FORCING CONTROL TO FLOW TO C CERTAIN POINTS WHEREUE. 23058 CONTINUE IF(.NOT.(CTEMP .EQ. SOH))GOTO 23060 CANCEL = .TRUE. VSOH = .TRUE. 23060 CONTINUENDFOR 23055 CONTINUE RETURN END C****************************************************** C G E T R T E C C OWNLD,UPSAV,PRSAV,REOPN,DELET INTEGER*2 SOH,STX,ETX,ENQ,ACK,LF,NAK,CAN INTEGER*2 SOHW,STXW,ETXW,ACKW,LFW,NAKW,CANW LOGICAL EOF,ERROR,VSOH,CANCEL COMMON /GLOB/ FNAME,PRNAME, BUFFER,BLOCK,SINBUF,CETX,DUM1,CKSUM, & CK12, BLKI LOGICAL DEBUG BYTE SINBUF(80) INTEGER CHCNT,SINLEN,STRLN LOGICAL DATAIS,CANCEL DATA CHCNT/0/  'CANCEL' IS C CHECKED FOR. C C 'CANCEL' FLAG WILL BE CLEARED AFTER C FLOW OF CONTROL RETURNS TO THE TOP C LEV GETRTE = (CTEMP) RETURN END C****************************************************** C NEXTCH RETURNS T GLOBAL - CANCEL: CANCEL FLAG, C CHKSUM: CKSUM C C LOCAL - CTEMP: BYTE C C IT READS ONE CHARA C LOCAL VARIABLES BYTECTEMP,NEXTCH C CHECK 'CANCEL' FLAG IF(.NOT.(CANCEL))GOTO 23056 GETRTE = (  IF(.NOT.((CHCNT .EQ.0) .OR. (CHCNT.EQ.80) .OR. (CHCNT .GE. SINLEN & .OR. (CANCEL))))GOTO 23062 CHCNT=0 D ACCUMULATES CHKSUM. C C RETN - TWO CHARACTERS FROM RTE16 PACKED INTO ONE C*********************************************ORMAT(Q,80A1) GOTO 210 10 CONTINUE IF(.NOT.(I .EQ.1))GOTO 23067 DATAIS = .FAPUTES CHKSUM. C C 'INDEX' IS INCREMENTED BY 1. C****************************************************** SUBROUTINE P C %VAL(), C NOTE 1 TERM IS AN INTEGER*4 ARRAY C TERM(1) =0 C TERM(2) = "2EDFE080" IN HEX C NOTE 2S ONE CHARACTER TO RTE16. C****************************************************** SUBROUTINE PUTRTE (SIGNAL) IMPLC CONTINUE TRYING TO READ STANDARD INPUT UNTIL SOME DATA IS SEEN C THEN STORE THE DATA IN THE STANDARD INPUT BUFFER (SINBUF) C********* INTEGER FUNCTION GET2B(DUM) IMPLICIT INTEGER (A-Z) INTEGER CTEMP,CTEMP1 INTEGER ITEMP,BANDLSE. 23067 CONTINUE 23065 IF(.NOT.(DATAIS))GOTO 23064 23062 CONTINUE 210 CONTINUE CHCNT= CHCNT+1 UTBUF (CHAR) IMPLICIT INTEGER(A-Z) C GLOBAL VARIABLES BYTE FNAME(10),PRNAME(10) BYTEBUFFER(72),SINBUF(80) IO$_RDDBK CAN BE REPLACED WITH IO$M_NOECHO C NOTE 3 MORE INFORMATION ON THE SYS$QIOW CAN BE FOUND C ON PAGEICIT INTEGER (A-Z) BYTE SIGNAL TYPE 1040,SIGNAL 1040 FORMAT(1X,A1) RETURN END C****************** REPEAT 23064 CONTINUE DATAIS = .TRUE. DO 15 I=1,80 SINBUF(I) = 0 15  BYTE CH, CH1, GETRTE CH = GETRTE(DUM) CH1 = GETRTE(DUM) C CONVERT HEX TO BINARY CALL ASC2H(CH NEXTCH = (SINBUF(CHCNT)) RETURN END C****************************************************** C G E T R T E 2  INTEGER CKSUM,CK12,BLKIND,BLKCNT,LENGTH,INDEX,PBLKNO INTEGER*2 IETX INTEGER*2 CETX LOGICAL EOF,ERRO 171 OF THE SYSTEM SERVICE MANUAL C NOTE 4 CHAN HAS TO BE DECLARED IN COMMON OR PASSED AS A PARAMETER C****************************************************** C P U T B U F C C ENTRY - CHAR : THE CHARACTER C C GLOBAL - BUFFER()  CONTINUE C************************************************************** C CHANGE FOR VAX RUNNING VMS C REPLACE READ,CTEMP) CALL ASC2H(CH1,CTEMP1) ITEMP = SHIFTL(CTEMP,4) + CTEMP1 GET2B = (ITEMP) RETURN END C C C LOCAL - CTEMP & CTEMP1: BYTES C ITEMP : INTEGER C C IT PACKS TWO CHARACTERS FROM RTE16 ANR,VSOH,CANCEL COMMON /GLOB/ FNAME,PRNAME, BUFFER,BLOCK,SINBUF,CETX,DUM1,CKSUM, & CK12, BLKIND,BLKCNT,LENGTH,INDEX,**** END OF VAX CHANGE ************************ READ(5,1000,END=10) SINLEN,(SINBUF(I), I=1,SINLEN) 1000 F& INDEX: MESSAGE BUFFER AND INDEX, C CHKSUM: CKSUM C C IT WRITES ONE CHARACTER INTO 'BUFFER(INDEX)' AND COM WITH THE FOLLOWING C C C SYS$QIOW(,%VAL(CHAN),%VAL(IO$_RDDBK),,,,SINBUF,%VAL(80) C 1 ,,TERM,)****************************************************** C P U T R T E C C ENTRY - SIGNAL: THE CHARACTER C C IT SEND PBLKNO,VSOH,EOF,CANCEL,IETX COMMON /BUG/ DEBUG LOGICAL DEBUG C CONSTANT VARIABLES COMMON /CONS/ENDREC,ENDSBBLE) C IMPLICIT INTEGER (A-Z) INTEGER NIBBLE BYTE CH,HEX2A(16) DATA HEX2A/'0','1','2','3','4',' INTEGER BYTE1,ITEMPL,ITEMPH BYTE CH ITEMPH = MOD(RSHFT(BYTE1,4),16) ITEMPL = MOD(BYTE1,16) CALL HON /CONS/ENDREC,ENDSIZ,FILLEN,DATLEN,BLKSIZ,DOWNLD,UPSAV, & PRSAV,REOPN,DELET,SOH,STX,ETX,ENQ,ACK,LF,NAK,CAN,CR,SOHW,STXWUM + ITEMP RETURN END C****************************************************** C P U T B U F 2 C C ENTRY - INTEGER FUNCTION PACK2(DUM) IMPLICIT INTEGER(A-Z) C GLOBAL VARIABLES BYTE FNAME(10),PRNAME(10) BYTEBIZ,FILLEN,DATLEN,BLKSIZ,DOWNLD,UPSAV, & PRSAV,REOPN,DELET,SOH,STX,ETX,ENQ,ACK,LF,NAK,CAN,CR,SOHW,STXW, & ETXW,ENQW5','6','7','8','9','A','B','C', & 'D','E','F'/ CH = HEX2A(NIBBLE +1) RETURN END C***************2ASCI(CH,ITEMPH) CALL PUTBUF(CH) CALL H2ASCI(CH,ITEMPL) CALL PUTBUF(CH) RETURN END C********, & ETXW,ENQW,ACKW,LFW,NAKW,CANW,CRW BYTE ENDREC(6) INTEGER ENDSIZ,FILLEN,DATLEN,BLKSIZ INTEGER DOWN BYTE: THE CHARACTER C C ITEMPL & ITEMPH : THE LOW AND HIGH NIBBLE OF THE CHARACTER C C IT UNPACKS THE CHARACTER IUFFER(72),SINBUF(80) INTEGER CKSUM,CK12,BLKIND,BLKCNT,LENGTH,INDEX,PBLKNO INTEGER*2 IETX INTEGER*2 CETX ,ACKW,LFW,NAKW,CANW,CRW BYTE ENDREC(6) INTEGER ENDSIZ,FILLEN,DATLEN,BLKSIZ INTEGER DOWNLD,UPSAV,PRSAV,REOPN*************************************** C P A C K 2 C C GLOBAL - BUFFER() & INDEX: MESSAGE BUFFER AND INDEX C ********************************************** C H2ASCI (HEX TO ASCII CONVERSION) C CONVERTS THE VALUE IN LD,UPSAV,PRSAV,REOPN,DELET INTEGER*2 SOH,STX,ETX,ENQ,ACK,LF,NAK,CAN INTEGER*2 SOHW,STXW,ETXW,ACKW,LFW,NAKW,CANW CNTO TWO, STORES THEM AT 'BUFFER(INDEX)' AND C 'BUFFER(INDEX+1)', AND COMPUTES 'CHECKSUM'. C C 'INDEX' IS INCREMENTED BY LOGICAL EOF,ERROR,VSOH,CANCEL COMMON /GLOB/ FNAME,PRNAME, BUFFER,BLOCK,SINBUF,CETX,DUM1,CKSUM, & CK12, BLKIND,,DELET INTEGER*2 SOH,STX,ETX,ENQ,ACK,LF,NAK,CAN INTEGER*2 SOHW,STXW,ETXW,ACKW,LFW,NAKW,CANW CLOCAL VARIABLE  C LOCAL - TEMP & TEMP1: BYTES C C IT PACKS TWO CHARACTERS AT 'BUFFER(INDEX)' AND 'BUFFER(INDEX+1)' INTO ONE. C NIBBLE INTO A CHARACTER RETURNED IN CH C****************************************************** SUBROUTINE H2ASCI(CH,NILOCAL VARIABLES INTEGER SHIFTL INDEX = INDEX +1 CALL ASC2H(BUFFER(INDEX),TEMP) INDEX = INDEX +1  2. C****************************************************** SUBROUTINE PUTBF2 (BYTE1) IMPLICIT INTEGER (A-Z) BLKCNT,LENGTH,INDEX,PBLKNO,VSOH,EOF,CANCEL,IETX COMMON /BUG/ DEBUG LOGICAL DEBUG C CONSTANT VARIABLES COMM BYTECHAR C COMPUTES 'CHECKSUM' INDEX = INDEX +1 BUFFER(INDEX) =CHAR ITEMP = CHAR CKSUM = CKS C 'INDEX' IS INCREMENTED BY 2. C C RETN - PACKED CHARACTER C******************************************************   CALL ASC2H(BUFFER(INDEX),TEMP1) IITEMP = SHIFTL(TEMP,4) + TEMP1 PACK2 = (IITEMP) RETURN END C****************************************************** INTEGER FUNCTION RECEIV(DUM) IMPLICIT INTEGER(A-Z) C GLOBAL C BEFORE THE CKSUM FIELD. C C FIRST TWO CHARACTERS ARE PACKED INTO 'LENGTH'. C NEXT TWO CHARACTERS ARE PACKED INTO I=1 23071 IF(.NOT.(I.LE.LENGTH))GOTO 23073 BUFFER(I) = GETRTE(DUM) I=I+1 GOTO 23071 C  CONTINUE HEX = IASCII - H0 23070 CONTINUE RETURN END C********************************************REOPN,DELET,SOH,STX,ETX,ENQ,ACK,LF,NAK,CAN,CR,SOHW,STXW, & ETXW,ENQW,ACKW,LFW,NAKW,CANW,CRW BYTE ENDREC(6) *************************************************** C ASC2H C CONVERTS THE FIRST ARGUEMENT WHICH IS IN ASCII C AND PLACEVARIABLES BYTE FNAME(10),PRNAME(10) BYTEBUFFER(72),SINBUF(80) INTEGER CKSUM,CK12,BLKIND,BLKCNT,LENGTH,INDEX C 'BN' FOR EITHER TRANSX OR BLOCK NUMBER. C C THE MESSAGE OF LENGTH 'LENGTH' IS SAVED IN THE 'BUFFER()'. C C TWO ENDFOR 23073 CONTINUE C GET CKSUM CK12 = MOD(CKSUM,256) C COMPUTED CKSUM CK = GET2B(DUM) C RECEIVD********** C R E C E I V E C C GLOBAL - BUFFER() & LENGTH: MESSAGE BUFFER AND LENGTH, C CHKSUM INTEGER ENDSIZ,FILLEN,DATLEN,BLKSIZ INTEGER DOWNLD,UPSAV,PRSAV,REOPN,DELET INTEGER*2 SOH,STX,ETX,ENQ,ACK,LF,NAK,CA THE HEX RESULT IN THE SECOND ARGUEMENT C****************************************************** SUBROUTINE ASC2H(ASCII,,PBLKNO INTEGER*2 IETX INTEGER*2 CETX LOGICAL EOF,ERROR,VSOH,CANCEL COMMON /GLOB/ FNAME,PRNAME, BUFFCHARACTERS ARE THEN PACKED INTO C 'CHECKSUM' AND THE LAST CHARACTER IS SAVED IN C 'CETX'. C C C CHECKSUM COMPUTAT CKSUM C GET ETX CETX = GETRTE(DUM) IETX = CETX C RESTORE DUE TO THAT 'GETRTE(DUM)' CHANGES 'CHECKSUM' & CK12: CKSUM, C ETX: CETX C C LOCAL - BN: BLOCK NUMBER OR TRANSX TYPE, C CK: RECEN INTEGER*2 SOHW,STXW,ETXW,ACKW,LFW,NAKW,CANW CLOCAL VARIABLES BYTE GETRTE INTEGER CK,I,BN CKSUM = HEX) CLOCAL VARIABLES BYTE ASCII INTEGER IASCII,HEX INTEGER H0,H7,H9 DATA H0/48/,H7/55/,H9/57/ ER,BLOCK,SINBUF,CETX,DUM1,CKSUM, & CK12, BLKIND,BLKCNT,LENGTH,INDEX,PBLKNO,VSOH,EOF,CANCEL,IETX COMMON /BUG/ DEBUGION IS INCLUDED IN 'GETRTE(DUM)' C AND THE RESULT IS SAVED IN C 'CK12'. C RETN - BLOCK NUMBER OR TRANSX TYPE C*** CKSUM = CK RECEIV = (BN) RETURN END C****************************************************** C IVD CKSUM, C I: MISCELLANEOUS C C IT ACCEPTS ONE MESSAGE FROM RTE16 AND COMPUTES CKSUM ON THOSE CHARACTERS 0 C GET LENGTH AND BLOCK/TRANSX NUMBER LENGTH = GET2B(DUM) BN = GET2B(DUM) C GET MESSAGE C FOR  IASCII = ASCII IF(.NOT.(IASCII .GT. H9))GOTO 23069 HEX = IASCII - H7 GOTO 23070 C ELSE 23069 LOGICAL DEBUG C CONSTANT VARIABLES COMMON /CONS/ENDREC,ENDSIZ,FILLEN,DATLEN,BLKSIZ,DOWNLD,UPSAV, & PRSAV,  D O W N L O A D C C ENTRY - FD: PTR TO AN OPEN FILE C C GLOBAL - BUFFER() & INDEX: MESSAGE BUFFER AND INDEX, XW,ETXW,ACKW,LFW,NAKW,CANW C LOCAL VARIABLES INTEGER DATALN,K,I,BLKNUM BYTE CTEMP,DWNBUF(80),GETRTE BLKNUMCKSUM, & CK12, BLKIND,BLKCNT,LENGTH,INDEX,PBLKNO,VSOH,EOF,CANCEL,IETX COMMON /BUG/ DEBUG LOGICAL DEBUG C C 23085 C ENDFOR 23087 CONTINUE 23081 CONTINUE C REPEAT 23088 CONTINUE CALL PRTCK: FILE TRANSMISSION COMPLETED, C CAN: RTE16 REQUEST TO CANCEL OR START OF NEW HEADER RECEIVD C********************* FOR K =1 23082 IF(.NOT.(K.LE.DATALN))GOTO 23084 CALL PUTBUF(DWNBUF(K))  C CHKSUM: CKSUM C C LOCAL - BLOCKNO: BLOCK NUMBER, C LEAVE: LOOP CONTROL FLAG, C =0 CKSUM = 0 C REPEAT 23074 CONTINUE INDEX = 0 C CLEAR BUFFER SO STRLN WILL WORK C ONSTANT VARIABLES COMMON /CONS/ENDREC,ENDSIZ,FILLEN,DATLEN,BLKSIZ,DOWNLD,UPSAV, & PRSAV,REOPN,DELET,SOH,STX,ETX,ENSI('WAITDWNLD ',ENQ) CTEMP = GETRTE(DUM) IF (DEBUG) TYPE 1210,CTEMP 1210 FORMAT(' IN DOWNLOAD ********************************* SUBROUTINE DWNLD(FD) IMPLICIT INTEGER(A-Z) C GLOBAL VARIABLES BYTE FNAMK=K+1 GOTO 23082 C ENDFOR 23084 CONTINUE CALL PUTBF2(CKSUM) GOTO 230 ITEMP, I & CTEMP: MISCELLANEOUS C C IT SENDS FILE (ALREADY OPEN) INCLUDING AN END RECORD TO RTE16. C C FOR J=1 23077 IF(.NOT.(J.LE.80))GOTO 23079 DWNBUF(J) = ' ' J=J+1 GOTO 2307Q,ACK,LF,NAK,CAN,CR,SOHW,STXW, & ETXW,ENQW,ACKW,LFW,NAKW,CANW,CRW BYTE ENDREC(6) INTEGER ENDSIZ,FILLEN,DATLCTEMP=',I4) CALL PRTSI('FOUND2 ',CTEMP) 23089 IF(.NOT.((CTEMP .EQ. CAN) .OR. (CTEMP .EQ. ENQ) D E(10),PRNAME(10) BYTEBUFFER(72),SINBUF(80) INTEGER CKSUM,CK12,BLKIND,BLKCNT,LENGTH,INDEX,PBLKNO INTEGER*2 I81 C ELSE 23080 CONTINUE C FOUND THE END OF RECORD DATALN = 0 C FOR AFTER THE MESSAGE IS CONSTRUCTED, IT WAITS FOR ENQ TO START TRANSMISSION. C C IT RETRANSMITS UPON RECEIVING A NAK RESPONSE.7 C ENDFOR 23079 CONTINUE CALL FGETS(DWNBUF,64,EOF,DATALN) DWNBUF(DATALN +1) = 0 DATALN = STREN,BLKSIZ INTEGER DOWNLD,UPSAV,PRSAV,REOPN,DELET INTEGER*2 SOH,STX,ETX,ENQ,ACK,LF,NAK,CAN INTEGER*2 SOHW,ST .OR. (CTEMP .EQ. NAK))) GOTO 23088 C TRANSMIT THE MESSAGE C REPEAT 23091 CONTINUE IF(.NOETX INTEGER*2 CETX LOGICAL EOF,ERROR,VSOH,CANCEL COMMON /GLOB/ FNAME,PRNAME, BUFFER,BLOCK,SINBUF,CETX,DUM1, K=1 23085 IF(.NOT.(K.LE.6))GOTO 23087 BUFFER(K) = ENDREC(K) K=K+1 GOTO C C TRANSMISSION CONTINUES UNTIL EITHER END OF FILE IS REACHED, CAN OR SOH IS C# RECEIVD FROM RTE16. C C RETN - ALN(DWNBUF,1) IF(.NOT.(.NOT.EOF))GOTO 23080 CALL PUTBF2(DATALN) CALL PUTBF2(BLKNUM) C  T.(CTEMP .EQ. CAN))GOTO 23094 RETURN 23094 CONTINUE TYPE 1200,STX, (BUFFER(I), I =1,DATALN+6(10) BYTEBUFFER(72),SINBUF(80) INTEGER CKSUM,CK12,BLKIND,BLKCNT,LENGTH,INDEX,PBLKNO INTEGER*2 IETX I ENQ TO RTE16 AND WAITS FOR THE MESSAGE. C C REPLY WITH ACK TO ACCEPT THE MESSAGE OR NAK TO REJECT IT AND REQUEST C RETGOTO 23102 UPSAVE = (CAN) RETURN 23102 CONTINUE 23100 IF(.NOT.(CTEMP .EQ. STX))GOT END C****************************************************** C U P S A V E C C ENTRY - FD: PTR TO AN OPEN FILE C  INTEGER DOWNLD,UPSAV,PRSAV,REOPN,DELET INTEGER*2 SOH,STX,ENQ,ACK,LF,NAK,CAN INTEGER*2 SOHW,STXW,ETXW,ACKW,LFW), ETX 1200 FORMAT(' ',A1,70A1,A1) CALL PRTSI('WAITDWNLD2',ACK) 2000 CONTINUE CTEMNTEGER*2 CETX LOGICAL EOF,ERROR,VSOH,CANCEL COMMON /GLOB/ FNAME,PRNAME, BUFFER,BLOCK,SINBUF,CETX,DUM1,CKSUM, RANSMISSION. C C RECEIVING PROCESS CONTINUES UNTIL END RECORD, CAN OR SOH IS RECEIVD. C C RETN - ACK: FILE RECEIVD SUO 23099 CALL PRTSI('GOTUPSAVE ',CTEMP) C GET ONE MESSAGE BN12 = RECEIV(DUM) C CHECK FOR OBV C GLOBAL - BUFFER() & LENGTH: MESSAGE BUFFER AND LENGTH, C BLOCKCOUNT & BLOCKINDEX: BLOCK BUFFE,NAKW,CANW,ETX CLOCAL VARIABLES INTEGER BN12,I,BLKNO BYTECTEMP,GETRTE BLKNO = 0 CKSUM = 0 C REP = GETRTE(DUM) IF (CTEMP .EQ. CAN) RETURN IF (.NOT.((CTEMP .EQ. ACK).OR.(CTEMP .EQ. ENQ) .OR. (CT & CK12, BLKIND,BLKCNT,LENGTH,INDEX,PBLKNO,VSOH,EOF,CANCEL,IETX COMMON /BUG/ DEBUG LOGICAL DEBUG C CONSTANT VARICCESSFULLY, C CAN: RTE16 REQUEST TO CANCEL OR START OF NEW HEADER RECEIVD C*****************************************IOUS ERRORS IF ((LENGTH .LE. DATLEN) .AND. (IETX .EQ. ETX) .AND. D (CK12 .EQ. CKSUM)) GOTO 2000 C MR COUNT AND INDEX, C CHKSUM & CK12: CKSUM, C ETX: CETX C C LOCAL - BLOCKNO & PEAT 23096 CONTINUE C REQUEST MESSAGE CALL PUTRTE(ENQW) C REPEAT 23099 CONTINUE C EMP D .EQ. NAK) .OR. (CTEMP .EQ. CAN))) GOTO 2000 23092 IF(.NOT.(CTEMP .NE. NAK))GOTO 23094 CKSABLES COMMON /CONS/ENDREC,ENDSIZ,FILLEN,DATLEN,BLKSIZ,DOWNLD,UPSAV, & PRSAV,REOPN,DELET,SOH,STX,ETX,ENQ,ACK,LF,NAK************* INTEGER FUNCTION UPSAVE (FD) IMPLICIT INTEGER(A-Z) C GLOBAL VARIABLES BYTE FNAME(10),PRNAMEESSAGE ERROR CALL PUTRTE(NAKW) LENGTH = 1 GOTO 2010 2000 CONTINUE BN12: BLOCK NUMBER, C I & CTEMP: MISCELLANEOUS C C IT RECEIVS A FILE FROM RTE16. C C IT SENDS OUTWAIT FOR STX OR CAN CALL PRTSI('WAIT',STX) CTEMP = GETRTE(DUM) IF(.NOT.(CTEMP .EQ. CAN))UM = 0 BLKNUM= BLKNUM+1 IF (BLKNUM .GE. 256) BLKNUM = 0 23075 IF(.NOT.(EOF))GOTO 23074 RETURN ,CAN,CR,SOHW,STXW, & ETXW,ENQW,ACKW,LFW,NAKW,CANW,CRW BYTE ENDREC(6) INTEGER ENDSIZ,FILLEN,DATLEN,BLKSIZ   IF (.NOT. ((BN12 .EQ. BLKNO) .OR. ((LENGTH .EQ.0) D .AND. (BN12 .EQ.0)))) GOTO 2020 C VD C UNEXPECTEDLY, C SOH: START OF NEW HEADER RECEIVD AT PROPER TIME C****************************** PBLOCKNO: BLOCK NUMBER C C LOCAL - BN12: BLOCK NUMBER, C CTEMP: MISCELLANEOUS C C# IT RECEIVS AN BLKCNT = 0 BLKIND = 0 CKSUM = 0 C REPEAT 23106 CONTINUE C REQUEST MESSAGE CAL = 1 GOTO 23097 2010 CONTINUE CALL PUTRTE(ACKW) 23097 IF(.NOT.(((LENGTH.EQ.0) .AND. ( BN12.EQ.0)NSTANT VARIABLES COMMON /CONS/ENDREC,ENDSIZ,FILLEN,DATLEN,BLKSIZ,DOWNLD,UPSAV, & PRSAV,REOPN,DELET,SOH,STX,ETX,ENQ ACKNOWLEDGE CALL PUTRTE(ACKW) CKSUM = 0 BLKNO = BLKNO + 1 IF (BLKNO .GE************************ INTEGER FUNCTION PRTSAV (FD) IMPLICIT INTEGER(A-Z) C GLOBAL VARIABLES BYTE FNAME PRINT FILE FROM RTE16. C C IT SENDS OUT ENQ TO RTE16 AND WAITS FOR THE MESSAGE. C C REPLY WITH ACK TO ACCEPT THE MESSL PUTRTE(ENQW) C WAIT FOR SOH, STX OR CAN C REPEAT 23109 CONTINUE CALL PRTSI('WAITPRTSAV',S)))GOTO 23096 UPSAVE = (ACK) RETURN END C****************************************************** C P R ,ACK,LF,NAK,CAN,CR,SOHW,STXW, & ETXW,ENQW,ACKW,LFW,NAKW,CANW,CRW BYTE ENDREC(6) INTEGER ENDSIZ,FILLEN,DATLE. 256) BLKNO = 0 C WRITE BUFFER WRITE(2,1000) (BUFFER(K), K=1,LENGTH) 1000 FORMAT(80A1) (10),PRNAME(10) BYTEBUFFER(72),SINBUF(80) INTEGER CKSUM,CK12,BLKIND,BLKCNT,LENGTH,INDEX,PBLKNO INTEGER*2 IEAGE OR NAK TO REJECT IT AND REQUEST C RETRANSMISSION. C C RECEIVING PROCESS CONTINUES UNTIL END RECORD, CAN OR SOH IS RTX) CTEMP = GETRTE(DUM) CALL PRTSI('GOTPRTSAV ',CTEMP) IF(.NOT.((CTEMP .EQ. CAN) .OR. (CTI N T S A V E C C GLOBAL - INDEX & LENGTH: MESSAGE BUFFER INDEX AND LENGTH, C BLOCKCOUNT & BLON,BLKSIZ INTEGER DOWNLD,UPSAV,PRSAV,REOPN,DELET INTEGER*2 SOH,STX,ENQ,ACK,LF,NAK,CAN INTEGER*2 SOHW,STXW,ET GOTO 2010 C ELSE 2020 CONTINUE C IF THE BLOCK IS THE SAME AS THE PREVIOUS BLOCK THEN PUT AN ACK TX INTEGER*2 CETX LOGICAL EOF,ERROR,VSOH,CANCEL COMMON /GLOB/ FNAME,PRNAME, BUFFER,BLOCK,SINBUF,CETX,DUM1,CECEIVD. C# C RETN - ACK: FILE RECEIVD SUCCESSFULLY, C# CAN: RTE16 REQUEST TO CANCEL OR START OF NEW HEADER RECEIEMP .EQ. SOH)))GOTO 23112 PRTSAV = (CTEMP) RETURN 23112 CONTINUE 23110 IF(.NOT.(CTCKINDEX: BLOCK BUFFER COUNT AND INDEX, C CHKSUM & CK12: CKSUM, C ETX: CETX, C XW,ACKW,LFW,NAKW,CANW,ETX CLOCAL VARIABLES INTEGERBN12 BYTE CTEMP,GETRTE INTEGER*2 OUTBUF(40),OUTIND,OUTLE IF (BN12 .EQ. (BLKNO -1)) GOTO 2010 C ELSE MESSAGE ERROR CALL PUTRTE(NAKW) LENGTHKSUM, & CK12, BLKIND,BLKCNT,LENGTH,INDEX,PBLKNO,VSOH,EOF,CANCEL,IETX COMMON /BUG/ DEBUG LOGICAL DEBUG C CO EMP .EQ. STX))GOTO 23109 C GET ONE MESSAGE BN12 = RECEIV(DUM) C CHECK FOR OBVIOUS ERRORS IAT(40A1) RETURN END C************************ INTEGER FUNCTION RSHFT(VAR,ICOUNT) C SHIFTS THE VAR PUTRTE(NAKW) LENGTH = 1 GOTO 23107 2010 CONTINUE CALL PUTRTE(ACKW) 23107 IF(.NOT.(LEN(I) = NEWDOT IF (ITEMP .EQ. CRI) STRING(I) = NEWCR IF (ITEMP .EQ. LFI) STRING(I) = NEWLF IF (ITEMP  IF(.NOT.(INDEX .LT. LENGTH))GOTO 23117 OUTBUF(OUTIND) = PACK2(DUM) OUTIND = OUTIND +1 RACTER C IN THE STRING AFTER INDEX (WHICH IS NORMALLY THE LOCATION C OF THE ':' BYTE STRING(80) INTEGEF ((LENGTH .LE. DATLEN) .AND. ( & CK12 .EQ. CKSUM) .AND.(IETX .EQ. ETX) )GOTO 2000 C MESSAGE ERROR IABLE VAR ICOUNT PLACE TO THE RIGHT INTEGER VAR,ICOUNT,TEMP TEMP = VAR/(2**ICOUNT) 20 CONTINUE GTH .EQ.0))GOTO 23106 PRTSAV = (ACK) RETURN END C****************************************************** C.EQ. 0) GOTO 40 10 CONTINUE 40 CONTINUE STRLN = TEMP RETURN END C **************** GOTO 23116 C ENDWHILE 23117 CONTINUE OUTLEN = LENGTH/2 CALL PRIOUT(OUTBR*2 CRI,LFI,BLANK INTEGER INDEX,TEMP,ITEMP INTEGER*2 TAB,NEWTAB,NEWDOT,DOT,NEWCR,NEWLF DATA CRI/13/,LFI/10 CALL PUTRTE(NAKW) LENGTH =1 GOTO 2010 2000 CONTINUE IF ( .NOT. (PBLKNO .EQ. RSHFT = TEMP RETURN END C *********************** INTEGER FUNCTION SHIFTL(VAR,SCOUNT) C SHIFTS THE  PRIOUT PRINTS OUT OUTBUF TO THE PRINT FILE C****************************************************** SUBROUTINE PRI******* SUBROUTINE FGETS(BUFFER,BUFSIZ,ERROR,DATALN) BYTE BUFFER(80) INTEGER BUFSIZ,DATALN LOGICAL EUF,OUTLEN) CALL PUTRTE(ACKW) GOTO 2010 2020 CONTINUE IF ((PBLKNO -1) .EQ. BN12) GOTO 20/,BLANK/32/,TAB/09/,NEWTAB/31/ DATA DOT/46/,NEWDOT/28/,NEWCR/29/,NEWLF/30/ DO 10 I = INDEX,80 TEMP = IBN12)) GOTO 2020 C ACKNOWLEDGE CKSUM = 0 PBLKNO = PBLKNO +1 IF (PBLKNO .GE. VARIABLE VAR SCOUNT PLACES TO THE LEFT SHIFTL = VAR *2**IFIX(SCOUNT) RETURN END C*************************OUT(OUTBUF,OUTLEN) INTEGER*2 OUTBUF(40) INTEGER*2 OUTLEN,M WRITE(3,1000) (OUTBUF(M),M=1,OUTLEN) 1000 FORMRROR CD LOGICAL FIRST ,DEBUG COMMON /BUG/ DEBUG C GETS A LINE OF INPUT WITH AT MOST BUFSIZE CHARACTERS IN IT10 C ELSE 23114 CONTINUE C MESSAGE ERROR CALL PRTSI('PRTSAVELSE',NAK) CALL - INDEX ITEMP = STRING(I) IF (ITEMP .EQ. TAB) STRING(I) = NEWTAB IF (ITEMP .EQ. DOT) STRING256) PBLKNO = 0 C CONVERT AND WRITE BUFFER INDEX = 0 OUTIND = 1 C WHILE 23116***************************** INTEGER FUNCTION STRLN(STRING,INDEX) C RETURN THE NUMBERS OF CONSECUTIVE NON BLANK CHA  ERROR = .FALSE. READ (1,20,END=100,ERR=999) DATALN,(BUFFER(I) , I=1,DATALN) 20 FORMAT(Q,80A1) IF (DEBUåCE MANUAL C NOTE 4 CHAN HAS TO BE DECLARED IN COMMON OR PASSED AS A PARAMETER C********************** END OF VAX CHANGE *STEM MODE =Ã!µÍ y§Ê~þÊ þÊ+2ˆ þTÊ?þLÊ?þSÊþAÊÃë!€"� Íx§Â|Í�Ž ÍŽ ÍÍßþÊ’§ÂŒŽ Í>.Íú Ã`!M~********************************************************* C CHANGE FOR VAX RUNNING VMS C REPLACE READ WITH THE FOLLOWING C >ˆÓs>Óp>Ós>ÓsÛr¯2‹ 2€ 2� >2Š >2Œ >Î2‰ !ƒÍò¯2€ !¬Í y§ÊI~þYÂ12€ !ÏÛlÛ`!7 "] "_ ÍÔ*_ ë*] ÛmæÊvÛlw#}§Âv!7 ÛaæÊ�}»ÊG) TYPE 10025, BUFFER 10025 FORMAT (' PAST READ ECHO=',80A1) RETURN 100 ERROR = .TRUE. TYPE 30 30 FORMAT(å*********************** READ (5,10 , END=999) BUFFER 10 FORMAT(80A1) RETURN 999 TYPE 20 20 FORMA#Íú ~§ÂÃ!cÃŽ Íà !Ž å¯w#> w# ¨áþ,·þ ½þ:ÂÒþaÚÍÖ Ö@w#þ,Êöþ Êöþ.ÊðþaÚëÖ w#ÃÓ!— ÃÓ!š 4¯w#  C C SYS$QIOW(,%VAL(CHAN),%VAL(IO$_RDDBK),,,,BUFFER,%VAL(80) C 1 ,,TERM,) C %VAL(), C N�ë~Ó`#ë{§Â�7 "] ë"_ ÛaæÊ\Û`GÍñ O!Š ¾ÊÙþÊ+##¾Ìñþ ÂÈ> Íú ÃÈÍÎHÍÎÃ\ÛmæÊÎyÓlÉ Íô#y®ÂÄ#®Ê¸ÊÃÄ#¯¾Ê ÛaæÊú' END OF FILE REACHED') RETURN 999 ERROR =.TRUE. TYPE 40 40 FORMAT(' WARNING I/0 ERROR HAS OCCURED') åT(' NO DATA WAS READ') RETURN END üÉë!€"� Í{Ãë!€"� Íö§Â|Í�Ž ÍŽ ͧ’ͨ§ÊE!tÃ>.Íú Ã,HOST FILENAME ERROR DOWNLOAD ERROR UPSAVE ERROROTE 1 TERM IS AN INTEGER*4 ARRAY C TERM(1) =0 C TERM(2) = "2EDFE080" IN HEX C NOTE 2 IO$_RDDBK CAN BE REPLAÛ`GÍñ ¾ÀáëéÍ y§È~# Âɯ©jÊI fåÕ·ÊG¾Â8#Ã*!ÑëáÂ(áÃIáá>ÓÅ>"ÓÄ> ÓÄ<ÓÅÓÄÓÄ>(ÓůÉ960075600€4800 STOP END C****************************************************** SUBROUTINE GETS(BUFFER) C GETS A LIåå ÿAMD FILEXFER V1.0 1/25/83 $OPTIONS (Y, C/R=N)? TO DOWNLOAD ASCII FROM HOST--COMMAND IS:T=HOSTFILENAME,AMDFILE.XXX TO DOCED WITH IO$M_NOECHO C NOTE 3 MORE INFORMATION ON THE SYS$QIOW CAN BE FOUND C ON PAGE 171 OF THE SYSTEM SERVI3002400 180001501200@110ºECHO (Y, CR=N)?OPTIONS (Y, CR=N)?BAUD RATE =COMM CONTROL CODE =MONITOR MODE =SYNE OF INPUT FROM STANDARD INPUT I.E TERMINAL C THIS ROUTINE HAS TO BE MODIFIED FOR VAXEN BYTE BUFFER(80) C*****å WNLOAD FILE FROM HOST---COMMAND IS:L=HOSTFILENAME,B:AMDFILE.XXX TO UPSAVE FILE TO HOST-------COMMAND IS:S=HOSTFILENAME,AMDFILE.€0000000000000000000000000000000000000000000000000000000000000000000000000000À Ít þÊ« Þ:Âá WáåÍ& _Í& õÍ& ÁO {ñ a ¯Õå>2c ÛmæÊŽ ~ÓlÍñ #ú¦ ÂŽ Ít áÑÛmæÂÅ y°Â« :c =ÊÙ 2c ë ÛlæþÊõ þÊÙ Íñ è a Íñ <þÂï >Íf >þÉÍ Ç Íñ Í ¯###Ãå#w! åw#q! ë#~ëþ ʪþ=ʪþ Ê®þ,Ê®w# Â�ápÕÍ Ñ§>ÿÀ>2ô *� "„ >€2ƒ ¯2g 2‡ 2h ÉÍé ¯ÉÃ{*� "„ >€2ƒ O>w# Âí:‡ §À:ƒ O*„ ëåXXX (DEFAULT A:) TO UPSAVE ASCII TO HOST------COMMAND IS:A=HOSTFILENAME,AMDFILE.XXX yþÒ!!ë¯G ~G#~ghéZ]i!!t!!!ñ·Â `i"¹ÃF Í& Í& w# Í& õÍ‹ ñ« Ãá ÅåÕÍt ÍY æðõÍt ÍY Á°GÑ‚WxáÁÉ Í¢!o ~·ÊZ ÍÇ #Ã.P*‡Í. ÍÅ NEXT PCÍ� =«]ÛmæÊ ÛlÍñ þÈ y°Â É!i P>2c ÛmæÂD y°Â* :c =Ê¥ 2c Ã* ÛlÍñ æþÂ* w#>2c ÛmæÂt y°ÂZ :c =Ê¥ 2c ÃZ ÛlæÍñ wÊ¥ å:g §Êx*e G:ˆ þTÂ9~þ>.Ê4~þ> Ê4~þ> Ê4~þ> Ê4~#Ã>ÅÍI Áëw#ë ÊQÊx Ãx"e x2g !l > Íú ~Íú #~Íú >Íú Íú Íú ¯Éë"„ y2ƒ å@H!LxÔ!!Ùߨö!ü  !AAÍ5 1Íñ>ÿÉERROR: FUNCTION IS NOT IMPLEMENTED. $ÃÛaæÊ]Û`æÉÛaæÊi{Ó`É:Î §È=ÊÔ*Ï  Íf Í åÍ. ÍÅ á~åÍ ÍŠͶ ÍÝ áþ Ê» þ.ÊþåÍ“ =« Íf |·Â« }áw#Ä ¯ÃÅ >ÿ2LÍ� !ÊÞ =« Íf }´Ê« +"MÍD Ã…ÍÝ þ Âõ. ¾Ê #þ.ÂQ !i #~€G~þ.Š +†+†_x“GÅÍI Á¸Ê¼ >ºÂ´ >Íf >ÿÉ>Íf à !j ÍI 2g ÍI O:h ¹ÂÛ <2h >Íf ¯Éy§Âé :g §Âé <É>Íf >€Éõ:€ §Ê ñõÛaæÊ>ˆÓs>Óp>Ós>ÓsÛr¯2‹ 2€ 2� >2Š >2Œ >Î2‰ !ƒÍò¯2€ !¬Í y§ÊI~þYÂ12€ !ÏÛhÛ`!7 "] "_ ÍÔ*_ ë*] ÛiæÊvÛhw#}§Âv!7 ÛaæÊ�}»Ê>Íf Í §Â•!n "e Ãó2‡ =¦:ƒ րʦ¯É<É>€2ƒ *� "„ !n :ƒ Oë*„ ¯GÅ~#ëGÍ5 Á ëxþ@ÂÀ"„ y2ƒ !g >@wÍ §À:h <2h :ƒ §Â³ÃZÃ{!}åCÍ5 "Ï !Ñ ~<2Î !Ñ Í !Ø "Ï ¯2Ñ :Ò <2Ò ÉÛræ€ÂÔ{Óp>Ós>ÓsÛr{þ À ÃÔëÛaæÊò~þ$ÈÓ`# Âû ë ÍÝ þ Â.ŠͶ Í� ·Êþ=« Íf Á.0000C0.}þÒ« Íã gA>þÍS ¤Ag}ÍS ´ÃþÈÃS Âi |·Â« }!´wÃþåÍ Ñs#rÃþåÕÅ:[æÊ” û ñÓ`ÉñÉ~#Íú ~·Â !7 ÛaæÊ Û`æwþÊ> Íú þ Ê5 # à > Íú !7 Éy·Ê > +Íú > Íú >Íú à 00000000000000000000000000000000000000000�ë~Ó`#ë{§Â�7 "] ë"_ ÛaæÊ\Û`GÍñ O!Š ¾ÊÙþÊ+##¾Ìñþ ÂÈ> Íú ÃÈÍÎHÍÎÃ\ÛiæÊÎyÓhÉ Íô#y®ÂÄ#®Ê¸ÊÃÄ#¯¾Ê ÛaæÊúɯÉë"� ëÉN#V#å#AÍ5 BÍ5 áå#yÆGÆW¯†#Â" GÍ5 >.wZáÍ‚ ÉxÍ> xæÆ�'Î@'w#É~þ:ÚQ Æ æO#~þ:Úa Æ æ�#ÉGÛmæÊg xÓlÍñ ÛmæÊt > ÓlÃåÃòGÕÍ]þ Ê&þ Ê&Íú þÊ+  Ñyɯ±Ê  +> Íú >Íú à ÛaæÈ>ÿÉ!ɯɯ!g w#w! åw#q!  ë#~ëþ Ê®w# Âeî¯!g w_!€~þʦ ![4·Ã§ \Í¢·Â¦ 2[à 7ÁÑáÉÍ >?ÍÇ Ãþ Í¢!g"cÉ> åÕÅ_Í¢ÁÑáÉþÈþaØæ_Éå!f~·> Êô 5*c~#"cÍÔ áÉþ Ò Æ0ÃÇ  Û`GÍñ ¾ÀáëéÍ y§È~# Âɯ©jÊI fåÕ·ÊG¾Â8#Ã*!ÑëáÂ(áÃIáá>ÓÅ>"ÓÄ> ÓÄ<ÓÅÓÄÓÄ>(ÓůÉ960075600€4800>Íf Í §Â•!n "e Ãó2‡ =¦:ƒ րʦ¯É<É>€2ƒ *� "„ !n :ƒ Oë*„ ¯GÅ~#ëGÍ5 Á ëxþ@ÂÀ"„ y2ƒ !g >@wÍ §À:h <2h :ƒ §Â³ÃZÃ{!}CÍ5 "Ï !Ñ ~<2Î !Ñ Í !Ø "Ï ¯2Ñ :Ò <2Ò ÉÛræ€ÂÔ{Óp>Ós>ÓsÛr{þ À ÃÔëÛaæÊò~þ$ÈÓ`# Âû ë ÍÝ þ Â.ŠͶ Í� ·Êþ=« Íf Á.0000C0.}þÒ« Íã gA>þÍS ¤Ag}ÍS ´ÃþÈÃS Âi |·Â« }!´wÃþåÍ Ñs#rÃþåÕÅ:[æÊ”  ÿAMD FILEXFER V1.0 1/25/83 $OPTIONS (Y, C/R=N)? TO DOWNLOAD ASCII FROM HOST--COMMAND IS:T=HOSTFILENAME,AMDFILE.XXX TO DOû ñÓ`ÉñÉ~#Íú ~·Â !7 ÛaæÊ Û`æwþÊ> Íú þ Ê5 # à > Íú !7 Éy·Ê > +Íú > Íú >Íú à 000000000000000000000000000000000000000003002400 180001501200@110ºECHO (Y, CR=N)?OPTIONS (Y, CR=N)?BAUD RATE =COMM CONTROL CODE =MONITOR MODE =SYɯÉë"� ëÉN#V#å#AÍ5 BÍ5 áå#yÆGÆW¯†#Â" GÍ5 >.wZáÍ‚ ÉxÍ> xæÆ�'Î@'w#É~þ:ÚQ Æ æO#~þ:Úa Æ æ�#ÉGÛiæÊg xÓhÍñ ÛiæÊt > ÓhÃÃòGÕÍ]þ Ê&þ Ê&Íú þÊ+  Ñyɯ±Ê  +> Íú >Íú à ÛaæÈ>ÿÉ!ɯɯ!g w#w! åw#q!  ë#~ëþ Ê®w# Âeî¯!g w_!€~þʦ ![4·Ã§ \Í¢·Â¦ 2[à 7ÁÑáÉÍ >?ÍÇ Ãþ Í¢!g"cÉ> åÕÅ_Í¢ÁÑáÉþÈþaØæ_Éå!f~·> Êô 5*c~#"cÍÔ áÉþ Ò Æ0ÃÇ WNLOAD FILE FROM HOST---COMMAND IS:L=HOSTFILENAME,B:AMDFILE.XXX TO UPSAVE FILE TO HOST-------COMMAND IS:S=HOSTFILENAME,AMDFILE.€0000000000000000000000000000000000000000000000000000000000000000000000000000À Ít þÊ« Þ:Âá WáåÍ& _Í& õÍ& ÁO {STEM MODE =Ã!µÍ y§Ê~þÊ þÊ+2ˆ þTÊ?þLÊ?þSÊþAÊÃë!€"� Íx§Â|Í�Ž ÍŽ ÍÍßþÊ’§ÂŒŽ Í>.Íú Ã`!M~ñ a ¯Õå>2c ÛiæÊŽ ~ÓhÍñ #ú¦ ÂŽ Ít áÑÛiæÂÅ y°Â« :c =ÊÙ 2c ë ÛhæþÊõ þÊÙ Íñ è a Íñ <þÂï >Íf >þÉÍ Ç Íñ Í ¯###Ã#w! åw#q! ë#~ëþ ʪþ=ʪþ Ê®þ,Ê®w# Â�ápÕÍ Ñ§>ÿÀ>2ô *� "„ >€2ƒ ¯2g 2‡ 2h ÉÍé ¯ÉÃ{*� "„ >€2ƒ O>w# Âí:‡ §À:ƒ O*„ ëåXXX (DEFAULT A:) TO UPSAVE ASCII TO HOST------COMMAND IS:A=HOSTFILENAME,AMDFILE.XXX yþÒ!!ë¯G ~G#~ghéZ]i!!t!!!ñ·Â `i"¹ÃF Í& Í& w# Í& õÍ‹ ñ« Ãá ÅåÕÍt ÍY æðõÍt ÍY Á°GÑ‚WxáÁÉ Í¢!o ~·ÊZ ÍÇ #Ã.P*‡Í. ÍÅ NEXT PCÍ� =«#Íú ~§ÂÃ!cÃŽ Íà !Ž å¯w#> w# ¨áþ,·þ ½þ:ÂÒþaÚÍÖ Ö@w#þ,Êöþ Êöþ.ÊðþaÚëÖ w#ÃÓ!— ÃÓ!š 4¯w# Â]ÛiæÊ ÛhÍñ þÈ y°Â É!i P>2c ÛiæÂD y°Â* :c =Ê¥ 2c Ã* ÛhÍñ æþÂ* w#>2c ÛiæÂt y°ÂZ :c =Ê¥ 2c ÃZ ÛhæÍñ wÊ¥ :g §Êx*e G:ˆ þTÂ9~þ>.Ê4~þ> Ê4~þ> Ê4~þ> Ê4~#Ã>ÅÍI Áëw#ë ÊQÊx Ãx"e x2g !l > Íú ~Íú #~Íú >Íú Íú Íú ¯Éë"„ y2ƒ å@H!LxÔ!!Ùߨö!ü  !AAÍ5 1Íñ>ÿÉERROR: FUNCTION IS NOT IMPLEMENTED. $ÃÛaæÊ]Û`æÉÛaæÊi{Ó`É:Î §È=ÊÔ*Ï  Íf Í åÍ. ÍÅ á~åÍ ÍŠͶ ÍÝ áþ Ê» þ.ÊþåÍ“ =« Íf |·Â« }áw#Ä ¯ÃÅ >ÿ2LÍ� !ÊÞ =« Íf }´Ê« +"MÍD Ã…ÍÝ þ Âõ. ¾Ê #üÉë!€"� Í{Ãë!€"� Íö§Â|Í�Ž ÍŽ ͧ’ͨ§ÊE!tÃ>.Íú Ã,HOST FILENAME ERROR DOWNLOAD ERROR UPSAVE ERRORþ.ÂQ !i #~€G~þ.Š +†+†_x“GÅÍI Á¸Ê¼ >ºÂ´ >Íf >ÿÉ>Íf à !j ÍI 2g ÍI O:h ¹ÂÛ <2h >Íf ¯Éy§Âé :g §Âé <É>Íf >€Éõ:€ §Ê ñõÛaæÊ å*×:"¸:ál.ÍÖ3:Õ:æþö2Õ:É"¸:|·Â�!}·ÂŽ!ã.ÍÖ3Éõñõ·Ê¤!‘!ñã/ÍÖ3Éñ>�GÈ>)Í¢3é!#Í«'ñõÍœ)ÍÞÍÜ)̓(Ͱ0þÊÊØ!Í�&Î+ͽ1ÑÉ#Íœ%Âå! /"“!@"‘!"• ÍæÊžÍ!€ßF#x·Â±Ã~#±¯!ßb¯2r~#þ ÊÈ·Êþ"ÂÞ2rÃß+}|~#·ÊÅG:r·xÁÊþ"Âæ¯2re åÍYÑ*wåÍ\Ñ*wë`is#rÍ�në! s{·ÊS ! n}þ ÊG ! n}þ ÂS `i^#Vr+sÃ! *å*wåÍbÑÑå*Ñs#rz³Â¯ *wnÉá^#V#åë ~#foÉá^#åë& ~#foÉ!È+É!È#É!Ø+É!Ø#É!ð+É!ø+ÉÈÉÈÉØÉØÉðÉøÉ}»À|ºÉëz¼À{½Éë|ºÀ}»Éë|ªòìz!åͳÑÑ*åͶÑ*åͰÑÍ\å!,ÃK Finished converted %d Lines å͹ÑÑÁÉÃhöÈÃw(ÃÕÃ'ßÅ!ûÿ9ùDM*s#rÕ*åÍÖ3ñÍ,(õÍr&Í�&Íœ)ñÍÞÍÜ)̓(ÍG(É~þùÄm7#^#V#Í"Ͱ0ÉÅåë)))£R~õæþ�+̽1ñæ‡G~õæ`°2Ú:ñæ2ß:#~æ2Ù:~æ?>ÊS"=2Ó:#^#V#Õ^#V#ë"+w#þ Âæ+6#ÃÈÕ!×6#¯2w2x*sé!ÿÿÉ>õÍrÚ<o&åÍFáñ=þÂ-ÃÍ`Í ÍrÚ'~æÊhåÍÅÍëÍÁá6þÿ!À+ÉÍ`WÖØþ?ØÕ_å!ˆ é Can not open '%s' filname error åÍYÑÑÍ\#|µÊà !¿ Ãé enter the microword size in bits e.g. 32 åÍYÑ*å!ü Ãÿ %då·ð7Éë|ªòó|·ð7ÉzõÍZëÍZëÍ)ñ·ð|/g}/o#É|µÈÕå͉ÑÍk|/g}/o#Ñɯ2qÍZëÍZÍk:qÐ|/g}/o#É|·ð/g}/o#:q<2qÉÅÍqÁÉDM!x±ÈxGyOÒÑs#rÕ*Ñs#r* ¯w#w*s#rÕ*Ñs#rÕ*Ñs#rÕ*##Ñs#rÕ*Ñs#r!Ýà mtech2amd, Microtech to AMDASM.OBJåÛ:ë^#Vë"Ý:Ñ:ß:·Ê}"*Æ:ë!:Ú:æ@ÊŽ""Ý:áÁÉå*ñ:#w"ñ:áÉå*ñ:~þÿʪ"·Âµ"ø*ͽ1ÍÛ9áÉ+"ñ:áÉå*ñ:+"ñ:áÉå!·="ñ:6ÿ!Õ="ó:áÉå*ñ:~·áÈþÿÉå!×~æ7ÑzÈ?ÉÍ`ÅÍ åþ:>ªÍÖ@w#ÍÆþ.¶ÍÆ66ÑÁÉÅþ*>?ÊéÍñÚçw#ÂÏÁÍñØÃÞ> w#ÂçÁÉÍþ.7Èþ:7Èþ7ÈÍeÑÑ! ¯w#wÍ\ÍùÚ' Í\€ÍÒP ! 6#6!6 ÃK illegal wordsize åÍYÑÍ�|µÂ¹ ë!9ùëÁÉÃn ÃWÈÃúÅ!£ÿ9ùDM! å* ƒë)ëÃv|µÈÅÍ”`iÁÉ|·ú )ÖëxõÍÝÚ·Õz/W{/_ѯzW{_ñ=ÈõyOxGæ¯2qÍZëÍZë͉ÃM|ºØÀ}»Éëȯ|g}oÃæëÈ)Ãô|/g}/o conversion program å*&åÍVÑÑ!. ÃK HEX2AMD Version 1.0 9/20/82 åÍYÑ!V Ão enter source file name åÍYÑ*cåÍ\Ñåõ*Ù:ë*ó:s#r#ë*Û:ës#r#ë*Ý:ës#r#ë*Õ:ës#r#ë*×:ës#r#:ß:w#"ó:ñáÉåõ*ä:ë*ó:s#r#ë*æ:ës#r#ë*è:ës#r#ë*à:ës#r#ë*â:ës#r#:ê:w#"ó:ñáÉåõ*ó:+~2ßþ!ÉþaØþ{ÐÖ Éþ Ê þ Ê ÉÅÍ`·OÂE×!·æyÂ6ÁÉÕ$Ñ Â-7ÁÉÍrÚBÖo&))T])))ë!·yÁÉÕÅõå€ÍáñÁÑÉåÍe ÑÑ#|µÂÏ ! å!™ ÷ premature EOF reached - '%s' åÍh ÑÑ* 6#6!Ã! ¯w#wÍ�ë! n&åÍk ÑÍ?åÍ�#ë! n&åÍ#Éz/W{/_É!9~#foÉ!à !à ! à ! à !à !à Ÿ!9Å~#ÂAÁÉá"s!`å*"³!è"µ!ÜY"—>Û2­>Ó2°>É2¯2²!Ì"�!* å*cåÍ_ÑÑå*Ñs#rz³ÂÖ *cå!µ ÃÐ can't open '%s' file erroråÍYÑÑÍ\#|µÊP !æ à enter destination file nam*ùÍKÍžÃ+z+žz+)4Ã'Ã+ÃFÃŽÃrÃ7 :²2É!³q:³þ ÊŠ *³MÍ8 ÃÖá^#V#å*~#foÉá^#å*~#foÉá^#V#å*nÉá^#å*:+V+^+ë"×:ëV+^+ë"Õ:ëV+^+ë"Ý:ëVüÃSÃb Ã!ÃmÃmÿÃâÃÈÅÍ¡ͤͧ* ¯w#wÍ\ |µÂìͪÍ\ |µÂéÍ­ÃÑ* åͰÑ*å k ÑÑë! s#rÍ�Í?åÍ\ÑÍúå*Ñs#r! å~#fo##ëás#rÍ�ëÍËåÍ�ëÍÑå*Ñs#rÍ�ëÍå* Ñs#r`i¯w#wÍ~#foëás#rÍ�#)å*‹ÑåÍ�)ë!^ ~#foëás#r! å~#fo##ëás#rÃOÍ\ |µÊ Í�)å*‹Ñ¯w#wÍ�#)å*‹ÑåÍ�)ë!^ iå~#fo##ëás#rÃ)Í�^) ë! s#rÍ�++ëÍËë! sÍ�åÍ�ÑÍåÊÍ�åÍ\å!ÔÃlength error on line %d rlength=%d,length= %+së)ë`iå! ~#foå̓)Ñ~#fo |¢g}£o|µÊ3!Ã6!ëás#r! ^#Vr+së)ë`iå! ~#foå̓)Ñ~#fo|¢g}£o|µÊw!Ãz!ëás#r!ë͉å*­Ñs#r`i¯w#wÍ�<ÍùÒÓ*åÍ�å*&Ñn&åÍ*ÑÑ`i^#Vr+sÛ*åÍ\åÍ*ÑÑ*åÍM«åÍ*ÑÑ*åþ Ê=! n}þ Ê=! n}þ Ê=! ~#foå`i^#Vr+sëÑå! nëásÃ×! n}þÿÊdþ0ÊmþÊwþ Ê�þ Ê�þ Ê�ð!ÿÿÃñÃÓÍ�ÃñÃÓÍ�ÃñÃÓ�ÍùÒÊ Í\))))å! ^#Vr+sëë! n&åÍk ÑÑå*Ñs#r`i^#Vr+sà Í\å*Ñs#r*##^#Vr+s! å* åÍe ÑÑë! s#r~#foëás#rÃ^Í�)å*‹ÑåÍ�)ë!^ ~#foëás#rÍ�#)å*‹ÑåÍ�)ë!^ ~#foëás#r!Ãdë!®9ùëÁÉÃvÈÃâÅ!þÿ9ùDM!„dåÍsÑÑÑ!ÃdÍ� ÍåÂ.* 6#6!Ãd`i¯w#wÍ�å! nѯgÍúÒp! ånåÍ�)ë!^ ~#foÑëás`i^#Vr+sÃ4! n¯gÍúÿ|¢g ^#Vr+së)ë`iå! ~#foå̓)Ñ~#fo|¢g}£o|µÊ»!þ!ëás#r! ^#Vr+së)ë`iå! ~#foå̓)Ñ~#fo|¢g}£o|µÊÿ!Ã!ÍM­åÍ*ÑÑ*åÍ\ÿ|¢g}£oåÍ*ÑÑ*åÍ\ëÍËåÍ*ÑÑ*åÍ\åÍ*ÑÑ!WÃ_WORKINGåÍ-Ñë!9ùëÁÉÃ|ÃWÈÃúÃDÅ!Rÿ! ~#foåÍ�#Ñ6 ! ~#foåÍ�##Ñ6Í�ÃñÃÓ!¶ÃÅ switch error åÍ]Ñ!ÃñÃÓ!ÙÃìleaving getnextln åÍ]Ñë!9ùëÁÉÅ!þÿ9ùz³Êñ ! s#rÕ*Ñs#rÍ�ë! n&åÍk ÑÍ?åÍ�#ë! n&åÍk ÑÑë! s#r! å~#fo##ëás#rÍ�|µÂq !Ã`i¯w#wÍ�ÍùÆ*åÍpÑ`i¯w#wÍ�ÍùÒË*åÍ�)å*«Ñ~#foåÍsÑÑ`i^#Vr+sÑ`i¯w#wÍ�åÍ\Í?ÑÍúÒ*åÍ\åÍsÑÑ`i^#Vr}£oë! sÍ�++ëÍË)ë!^ ~#foë! s! nå! nÑ}»Ê! n&å! n&å!ÎÃû checksum error real cksum = %x, expected %xåÍsÑëás#r! ^#Vr+së)ë`iå! ~#foå̓)Ñ~#fo|¢g}£o|µÊC!ÃF!ëás#r! ^#Vr+së)ë`iå! ~#foå̓)Ñ~#fo|¢g}£o|µÊ‡9ùDM! å* åÍpÑÑë! s#rÍ�>ÿ½Â®>ÿ¼Ê½>½Âº>¼ÊãÃì!ÃÃÕ EOF unexpected åÍsÑ!ÃdÃï!ÃdÃïÃï*^#Vr+s!DM! n&9ÍÍ©Ò#! n&ÉÿÃ.! n&Ðÿë`is#rÍ�Ã;ë!9ùëÁÉÅ!èþ9ùDM! ¯w#w! 6#6̓å̓ÑÍúÒ�! ^#Vr+së)ë`iÒ Í\))))å! ^#Vr+sëë! n&åÍk ÑÑå*Ñs#r`i^#Vr+sÃw Í\åÍ\ÑÍóÒâ Í\å*Ñs#r*##^#Vr+sÃæ !÷ à  no end r+sÃÑ`i¯w#wÍ�åÍ\Í?ÑÍúÒN*åÍ�)å*‹Ñ~#foåÍsÑÑ`i^#Vr+sà ë!9ùëÁÉÃ`ÃÐÈÅ!ûÿ9ùDM`is#r! s#rÍ� åÍZÑÑÑ!ÃdÍ\ÍÒ'! n&å!^ åÍyÑÑÍ�bå*«Ñs#rÍ�`å*­Ñs#r! ¯w#wÍ�åÍ�++ÑÍúÒÅÍ�)å*‹ÑåÍ�)ë!^ !Ê!ëás#r! ^#Vr+sÃ]! ¯w#w̓åÍ\ÑÍúÒê! ^#Vr+së)ë`iå̓)ë`i~#foëás#r! ^#Vr+sÃ¥Í\ë! s#r! 6#6Í s#r! s! sÍ\Í?ë! s#r`i¯w#wÍ�åÍ�ÑÍúÒ�Í�ëÍË)ë!^ åÍ�ë! n&åÍvÑÍ?åÍ�#ë! n&åÍvÑÑëás#r`å! ~#foå̓)Ñ~#fo€|¢g}£o|µÊ«!î!ëás#r! ^#Vr+së)ë`iå! ~#foå̓)Ñ~#fo@|¢g}£o|µÊï!Ãò!ëás#r! ^#Vrecord found åÍh Ñ!Ãë!]9ùëÁÉÃ0ÿÃÕÃâÈÅ!þÿ9ùDM* åÍ$Ñ* å*cåÍ'ÑÑå*Ñs#rÍ\ÿ|¢g}£oå*«Ñs#rÍ\ë! s{þÊ×! n}þ:Ê×! n! ^#Vr+s!PÍÒÔ!·ÃÉ no colon found åÍ]Ñ!ÃñÃwÍ� åÍZÑë! s! n}·Ê=! n}·Ê=! n} ƒå̓ÑÍúÒ¶! ~#foå̓)Ñå! ^#Vr+së)ë`i~#foëás#r! ¯w#w̓ÍùÒ¨! ~#foå̓)Ñå! ~#foå̓)Ñ~#fo)å!ë!‘ s#r! ^#Vr+sënë`is{þ.ÂÈ! åÍÏÑë!“ s#r!� 4! ^#Vr+sënë`is`in&åÍÒÑ}þDÊôþUÊ0 þXÊ9 þOÊB þCʈ þSʹ ÃÑ!Í�•~#fo|·ò0! ~#fo##6#6! ~#fo~#foÁÉÁÉèÃw(Ã>"Å!yÿ9ùDM`iåÍ¢Ñ!‹ å`iåÍ¥ÑÑÃÇë!‡9ùëÁÉÃÜÞ*ÃÝ(ÃÓ*Å!þÿ9ùDMÍ�|µÂóÍÓýÍ�+++|µÂ !s{þÿÊ,$Í� å! nѯgÍ?å! nѯgë! s#rÃÝ#! ^#Vr+sÃ%! åÍD"ÑÍ� ~#foë! s#r! ^#Vr+sënë! s{·Ê«$! nåÍ�nÑ}»Â‹$! ~#fo~#foåÍ ÑÑÑåÍ�ÑÍåʤ!ÿÿÃÍ�+€Í?ë`is#r! ~#fo##~#fo|µÊL!€å! ~#foå! ~#foåÍ�ÑåÍ ÑÑÑ! ~#fo##å~#›6ë!—9ùëÁÉÃ"ç(Å!9ùDMÍ�n}·Ê<"! ^#Vr+sën&åÍ"ÑÃ"ÁÉÃP"ÃÐ&Ã'Ø&ÃI'ÃI+Å!òÿ9ùDM! ^#Vr+së~#foë! s#rÍ�ë! s#r! ^#Vr+së)ë`i~#foÑëás#r! ^#Vr+sÃF! ^#Vr+sÃÿë!9ùëÁÉÃÅä(Å!9ùDM! ~#fo~#foåÍÂÑÁÉÁÉÃîç(ÃÝ(Ãð(Å!9ùDMÍ�+|µÂ !� ^#Vr+së6-Í�•åÍ�•~#foÍúëás#r!‘ ^#Vr+s! 6 ÃH ! 6ÃH ! 6!‘ å~#foå! n&å!• ^#Vr+së~#foå!� åÍÉÑÑÑѯgÍúåÍÖÑý! ~#fo##^#Vr+sz³Ê<! ~#fo^#Vr+sën&ý!å! ~#foå! ~#fo~#foåÍÙÑÑÑë`is#r!ÍÚu!ÿÿý! ~#fo##6 ^#Vr+së$`in}·Â¨$! ^#Vr+sÕ! nëásÃS$`in}·ÂÊ$! 4Í�6! ^#Vr+sÃ…"`in}·Âû$Í�n&å! ^#Vr+së~#foåÍM"ÑÑ! 4! ^foåÍ�Ñëás#r! ~#foå~#foåÍ�ÑÍúëás#r!å!ÿÿå! ~#fo~#foåÍÑÑÑÃ! ~#fo##6#6! ~#foå! ~#foëás#r!Ãë 6! ^#Vr+sënë! s{·ÊI%Í�n}·Â²"! n&ÃS%! n&åÍA"Ñ|µÊÆ"Ã…"! n}þ%Ê#! nå! åÍD"ÑÑÍåÊö"! n&ÃS%Ã#! ^#Vr+! n&åÍåÑÁÉÍ�++|µÂ,! n&å!åÍèÑÑÁÉÍ�+++|µÂK! n&å!åÍèÑÑÁÉ! ~#fo##^#Vr+sz³Ê„! ~#fo^#Vr+sÕ! nëásëëás#rÃ1!!� ^#Vr+sÕ!• ^#Vr+së~#foëás!‘ ^#Vr+sÃ1!!� n}·ÂÌ !“ 6È#6!• ^#Vr+së~#foë! s#rÍ�n}·Ê1!Í�“|µÊ1!!� ^#ÿ#6! ~#foå! ~#foëás#r! ~#fo^#Vr+sën&ýë!9ùëÁÉÃÕÃ\%Ã&Ã5&Ø&Å!iÿ9ùDM!� ^#Vr+së~#foë! s#rÍ��ë!•#Vr+sÃ…"! n&ÃS%`in}·ÂF%! ^#Vr+së~#foåÍ� åÍ�ÑÍ?ëás#r! 4Ã…"! n&ÃS%ë!9ùëÁÉÃb%Ã\%Å!ÿÿ9ùDMÍ�åÍ� ÑÍìÒ²%Í�^#!9ùëÁÉÑÃÆà "Å!yÿ9ùDM!‹ å`iåÍ‹ÑÑ`iåÍŽÑë!‡9ùëÁÉüÃÆÅ!9ùDM! åÍ�å͹ÑÑÁÉÃÛÃ*Å!9ùDM! ~#foå!åÍ�åÍØÑÑëás#rzsÃF%! 6#6! 6 `i6! ^#Vr+sënë! s{þ*ÂH#`i4! ^#Vr+sënë! s! n&åÍG"Ñ}þXÊv#þOÊ#þDʈ#þUÊ®#þSÊ:$þCÊÍ$à %! 6î#!&ÁÉ!å! ~#foå! ~#fo~#foåÍëÑÑÑÍåʶ!ÿÿÁÉ! ~#fo##6ÿ#6! ~#foå! ~#foëás#r! ~#fo^#Vr+sÕ! nëásVr+sÕ! ^#Vr+sënëás!“ ^#Vr+s!‘ ^#Vr+sÃç Í��6! ë!� s#r!� n}·Ât!!‘ ^#Vr+s!ÍÒt!!› ^#Vr+së6 ÃM!Í�›å!� ^#V s#r! ^#Vr+sënë`is{·Êý!`in}þ%Âç!! ë!� s#r!“ 6#6!� s!� sÍ�n}þ-Â`! ^#Vr+s!� 4Í�n&åÍÌÑ}·Ê}! åÍÏÑÀ!Vr+sÕÍ� ÍëÒŸ%Í�0ç%Í�7ëás!&Ãý%Í� åÍ�åÍ� Ñ͉åÍ�åÍ_%ÑÑÑë`isÍ� åÍ�åÍ� ÑÍ)åÍ�åÍ_%ÑÑÑ`in&#&Ãý%ë!·ò !ÿÿÁÉ! ~#fo##¯w#w! ~#fo~#foÁÉÁÉÃ0ÃX*Ãm*Å!9ùDMÍ�åÍ*Ñ! ~#foåÍ�åÍ-Ñëás#rz·òb!ÿÿÁÉ! ~#foå! ~#foëás#r 6î#! åÍD"Ñ-Íå®#! 6ÿ#6ÿ! ^#Vr+s! ¯w#w! n&å! åÍD"ÑåÍJ"ÑÑ#|µÂÝ#! n&ÃS%! n&å! ^#Vr+sën&åÍJ"ÑÑë! ë&ÁÉÁÉÃÃð(ÃX)é)Å!þÿ9ùDMÍ�ÍëÒ.!Ã! ~#fo##~#foÍåÂK!Ã! ~#fo##~#fo€ëÍËÍúë`is#rÍ�å! ~#foå!r+sënëás{·Ê�!!› ^#Vr+sÃt!!� n}·ÊÎ!!‘ ^#Vr+s!ÍÒÎ!!› ^#Vr+së6 ç!Ãä!!› ^#Vr+sÕ`inëásÃú!!› ^#Vr+sÕ`inëásÃÍ� 9ùëÁÉÅ!9ùDM! n&0ÍùͯÚ1&! n&9ÍͯÁÉÁÉÃ;&Ã&Å!þÿ9ùDM`i¯w#wÍ�~#fon&åÍ8&Ñ}·Êˆ&Í� Í?åÍ�^#Vr+sënѯgÐÿëå*Ñ\ÍþÿÁÊ!å*ŸåÍs*ÑÑÉ:w·oÊ­*¯2w&ÉÅÍÁþÊþ!ÿÿÈoþ ÂÐ*Å ÍÁ. &ÉÍ7:ŸÍ)Ú~æÊÅ:ŸÍ,"s!"u*£|µÊ)+*¡åÕÕÕÍ Íá#F#Ñx·ÊŸ(~#Ã’(¯áÁÉÃ#Í Åþ ÂÁ( Í ÍÃÅ(_Í ÍæÂÑ(ÁÉÍþÊÁÉÍ7Å:ŸO*¡ëÍo`ÁÉÍ7:ŸÍ)Ú~æÊå`is#rÃI&Í�Ã�&ë!9ùëÁÉÞ&Ãß'Å!9ùDM! n&åÍ›&Ñ|µÊÅ&! n&àÿÃÊ&! n&ÁÉÁÉÅ!9ùDM! n}þ Í�Êÿ&! n}þ Í�Êÿ&! n}þ Í�ÁC:AFT .COM = C9D1 C:AMDHST .C = 2E87 C:AMDHST .FOR = 962A C:FILEXF6 .COM = D164 C:FILEXF96.COM = 0180 C:HEX2AMëÍ*sëÕÍÑþÁÊÅþÂ.+! ~þ€Â)+6*uÁÉ*£+"£*¡€"¡*u#"uÃõ*Í7*Ÿ:¡wÉÍ Í,ÚÅ FN¯xg>G�oy òx+$ÁÉåÅ:ŸÍ,"s!"u€Í*£|µ*uÊV)*¡€€~#Â-)"¡*sëÍ·*uÂV)#"u*£+"£Ã)ÁÉÍ7*£|µÈÅDM*¡ë*ŸÍ£)Ú‡)><ê{)í°ÁÉ~# åÉÁÉà 'ÃÐ&Å!ÿÿ9ùDMÍ�~#fonë`isÕÍ'Ñ|µÊ8'Í�^#Vr+sÃ'`in&Ã@'ë!9ùëÁÉÃU'Ã(Ø&Ã&Å!9ùDM! n&åÍO'Ñë! sÕÍL'Ñ|µÊ�'! åD .COM = 2B1C ååx±Â{)ÁÉ ë ë><ê—)í¸ÁÉ~+ x±Â—)ÁÉ|ºÀ}»Éï)ÃT+Í7:ŸÍ,ÚÅå*Ÿåͬ)Ñë:£*¡·ÊÑ)}|æ2qã å¾Ê*ãëÕÍÑáþÿÂø)ÑÁÃ:qwÕÍån&Éÿëásõ'! n&åÍR'Ñ}·Ê°'! ån&Ðÿëásõ'!ÿÿÁÉ! nå! n&+ÑÍÒÔ'!ÿÿÁÉÃÝ'! n&ÁÉÁÉÅ!9ùDM! n&aÍùͯÚ (! n&ZëÍZëÍ)ñ·ð|/g}/o#É|µÈÕå͉ÑÍk|/g}/o#Ñɯ2qÍZëÍZÍk:qÐ|/g}/o#É|·ð/g}/o#:q<2qÉÅÍqÁÉDM!x±ÈxGyOÒååÑþÿÊó)! Ñ{æwëÁÉÍ7¯Í,Ú2që*ŸëÅÍ&ÍþÿÁÊ:qÍ):¡·ÊP*=ÊP*=Âr:qo&ÉÍ Åë!\Í&Í!ÁÉÃv*ÃX*Ã*Í7*ŸÅåÍpåzÍͯÁÉÁÉÃ(ÃH(Ãß'Å!9ùDM! n&åÍ(Ñ|µÍ£ÂD(! n&åÍ(Ñ|µÍ£ÁÉÁÉÅ!9ùDM! n&AÍùͯÚs(! n&ZÍͯÁÉÁÉÍ Å6ÿ ëå  åååååååååååååååååååååååååå! åååååååååååååååååååååååååå" åååååååååååååååååååååååååå# åååååååååååååååååååååååååå$ åååååååååååååååååååååååååå% åååååååååååååååååååååååååå& åååååååååååååååååååååååååå' åååååååååååååååååååååååååå( åååååååååååååååååååååååååå) åååååååååååååååååååååååååå* åååååååååååååååååååååååååå+ åååååååååååååååååååååååååå, åååååååååååååååååååååååååå- åååååååååååååååååååååååååå. åååååååååååååååååååååååååå/ åååååååååååååååååååååååååå0 åååååååååååååååååååååååååå1 åååååååååååååååååååååååååå2 åååååååååååååååååååååååååå3 åååååååååååååååååååååååååå4 åååååååååååååååååååååååååå5 åååååååååååååååååååååååååå6 åååååååååååååååååååååååååå7 åååååååååååååååååååååååååå8 åååååååååååååååååååååååååå9 åååååååååååååååååååååååååå: åååååååååååååååååååååååååå; åååååååååååååååååååååååååå< åååååååååååååååååååååååååå= åååååååååååååååååååååååååå> åååååååååååååååååååååååååå? åååååååååååååååååååååååååå@ ååååååååååååååååååååååååååA ååååååååååååååååååååååååååB ååååååååååååååååååååååååååC ååååååååååååååååååååååååååD ååååååååååååååååååååååååååE ååååååååååååååååååååååååååF ååååååååååååååååååååååååååG ååååååååååååååååååååååååååH ååååååååååååååååååååååååååI ååååååååååååååååååååååååååJ ååååååååååååååååååååååååååK ååååååååååååååååååååååååååL åååååååååååååååååååååååååå