% %18000000 % DEFINITIONS FOR APPLE PROTOCOL (WITHIN TTY REQUESTS) %18000100 % %18000200 DEFINE 18000300 UPLOADBLOCKING= 14 # % NUMBER OF RECORDS PER BLOCK 18000400 % FOR UPLOADING, MINUS 1 18000500 , APPLETRANSNO = TALLY[0]# 18000700 , APPLECODE = TALLY[2]# 18000900 , DEQUEUE = APPLETRANSNO [5] # 18001000 , BREAKNOTICE = APPLETRANSNO [6] # 18001100 , WAIT4QUEUED = APPLETRANSNO [7] # 18001200 , STOPONBRK = BREAK:STOPPED # 18001300 , APPLESWITCHBASE (X, Y) 18001400 = BREAK : STOPPED 18001500 , LOSSOFCARRIER : STOPPED 18001600 , BUFOVFL : X 18001700 , STOPBIT : X 18001800 , Y 18001900 # 18002000 , APPLESW97 = APPLESWITCHBASE ( NULL 18002100 , TIMEOUT : STOPPED 18002200 ) 18002300 # 18002400 , APPLEERRSW(X,Y)= APPLESWITCHBASE (X,Y) # 18002500 , XMIT(X) = BEGIN 18002600 CRC[0] = CRC[0] + X. 18002700 CHAR= X OR 4"80". % SET PARITY BIT 18002800 TRANSMIT [STOPONBRK]. 18002900 END 18003000 # 18003100 , XMITONE = XMIT(CHAR) # 18003200 , SENDTRANSNO = BEGIN 18003300 CHAR = APPLETRANSNO AND 4"0F". % STRIP OFF [7:4] 18003400 CHAR = CHAR + 4"41". % THIS MAKES ASCII A-P FROM 018003500 XMITONE. 18003600 END 18003700 # 18003800 , SENDHEXCHAR(X)=BEGIN 18003900 IF X >9 THEN CHAR = X + 4"37" %ASCII A-F 18004000 ELSE CHAR = X OR 4"30". %ASCII 0-9 18004100 XMITONE. 18004200 END 18004300 # 18004400 , SENDCRC = BEGIN 18004500 CRC[1] = CRC[0] AND 4"0F". 18004600 CRC[0] = CRC[0] ASR 4. 18004700 SENDHEXCHAR (CRC[0]). 18004800 SENDHEXCHAR (CRC[1]). 18004900 END. 18005000 # 18005100 , SENDPADDING = TRANSMIT "BB" [STOPONBRK] # 18005200 , REPLY (TYPE, FATAL) = % SEND ACKNOWLEDGEMENT OR 18005300 BEGIN % CONTROL MSG TO APPLE 18005400 CODE = ASCII. 18005500 INITIATE TRANSMIT. 18005600 CRC[0] = 0. 18005700 SENDPADDING. 18005800 CODE = BINARY. 18005900 XMIT (ASCIISTX). 18006000 SENDTRANSNO. 18006100 XMIT (TYPE). 18006200 IF FATAL THEN XMIT(ASCIIA) ELSE XMIT(ASCIIB). 18006300 XMIT (ASCIIETX). 18006400 SENDCRC. 18006500 XMIT (ASCIICR). 18006600 FINISH TRANSMIT. 18006700 END 18006800 # 18006900 , STOPTHEAPPLE = 18007000 BEGIN 18007100 REPLY (ASCIICAN, TRUE). 18007200 CODE=ASCII. 18007300 INITIATE RECEIVE. 18007400 RECEIVE (5 SEC) CHAR [97,END:STOPPED]. 18007500 IF CHAR = "S" THEN 18007600 BEGIN 18007700 RECEIVE (150 MILLI) "TOP" [97, FORMATERR:RETRYSTOP]. 18007800 RECEIVE (150 MILLI) CHAR [97, END: STOPPED]. 18007900 END. 18008000 RETRYSTOP: % TRY TO STOP THE APPLE AGAIN 18008100 DISCARDTHEREST (RETRYSTOP,RETRYSTOP1). 18008200 RETRYSTOP1: 18008220 % TOGGLE LAST BIT OF TRANS NBR: ALTERNATE GOOD AND BAD 18008240 % TRANSMISSION NUMBERS TO SHAKE APPLE LOOSE 18008250 APPLETRANSNO=APPLETRANSNO XOR 1. 18008260 GO STOPAPPLE. % TO TRY AGAIN 18008280 END. 18008300 # 18008400 , IFWRONGTRANSNO= 18008500 CHAR = CHAR - 4"41". %CONVERT FROM 7"A->P" TO 0-F 18008600 IF CHAR < 4"10" THEN 18008700 BEGIN 18008800 CHAR = CHAR XOR APPLETRANSNO. %EXPOSE 18008900 CHAR = CHAR AND 4"0F". %DIFFERENCE 18009000 END. 18009100 IF CHAR NEQ 0 % THEN WE RECEIVED WRONG TRANS # 18009200 # 18009300 , INCREMENTTRANS = 18009400 BEGIN 18009500 APPLETRANSNO = APPLETRANSNO + 1. 18009600 APPLETRANSNO[4] = FALSE. 18009700 END 18009800 # 18009900 , MASKOFFPARITY= CHAR[7] = FALSE # 18010000 , RECEIVEONE(X)= RECEIVE (150 MILLI) CHAR [99,END:X] # 18010100 , IFRECEIVE = RECEIVEONE (NAKEND). 18010200 IF CHAR = 18010300 # 18010400 , DISCARDTHEREST (LOOP, EXIT) = 18010500 BEGIN 18010600 RECEIVEONE (EXIT). 18010700 GO LOOP. 18010800 END 18010900 # 18011000 , STOPORSKIPPADDING (WHENSTOP) = 18011100 IF CHAR = "A" THEN % SKIP INITIAL "A"S WHICH ARE 18011200 BEGIN % PADDING INSERTED BY APPLE 18011300 SKIPFIRSTAS: 18011400 IFRECEIVE "A" THEN GO SKIPFIRSTAS. 18011500 END 18011600 ELSE 18011700 IF CHAR = "S" THEN 18011800 BEGIN 18011900 IFRECEIVE "T" THEN 18012000 BEGIN 18012100 IFRECEIVE "O" THEN 18012200 BEGIN 18012300 IFRECEIVE "P" THEN 18012400 BEGIN 18012500 RECEIVEONE (STOPRECEIVED). 18012600 IF FALSE THEN 18012700 BEGIN 18012800 STOPRECEIVED: WHENSTOP. 18012900 END.END.END.END.END 18013000 # 18013100 . 18013200 % 18020000 % DEFINES FOR KERMIT REQUESTS (WITHIN TTY REQUESTS) 18020100 % 18020200 DEFINE 18020300 KERCNT = TALLY [0] # 18020400 , KERSEQ = TALLY [3] # 18020500 , KERCHAR(X) = X + 32 # 18020600 , KERUNCHAR(X) = X - 32 # 18020700 , KERCTL(X) = X XOR 64 # 18020800 , KERRCV = RECEIVE (50 MILLI) # 18020900 , KERRCVCHAR = KERRCV CHAR # 18021000 , KERCALCBCC = 18021100 BEGIN 18021200 KERCNT = CRC[0] AND 4"C0". 18021300 KERCNT = KERCNT ASR 6. 18021400 CRC[0] = CRC[0] + KERCNT. 18021500 CRC[0] = CRC[0] AND 4"3F". 18021600 CRC[0] = KERCHAR (CRC[0]). 18021700 END # 18021800 , KERPKTHEAD (CNT,TYPE) = 18021900 BEGIN 18022000 INITIATE TRANSMIT. 18022100 KERTRANSMIT(SOH). % SEND MARK 18022200 KERTRANSMIT(CNT). % SEND COUNT 18022300 CHAR = KERSEQ. 18022400 KERTRANSMIT(CHAR). % SEND SEQ 18022500 CRC[0] = CNT + CHAR. 18022600 KERTRANSMIT(TYPE). 18022700 CRC[0] = CRC[0] + CHAR. 18022800 END # 18022900 , KERPKTTAIL = 18023000 BEGIN 18023100 KERCALCBCC. 18023200 CHAR = CRC[0]. 18023250 KERTRANSMIT(CHAR). 18023300 IF CHAR = 4"20" THEN KERTRANSMIT(4"58"). % BUG IN ALTOS18023400 KERTRANSMIT(CR). 18023500 FINISH TRANSMIT. 18023600 END # 18023700 , KERREPLY (TYPE) = % SEND AN EMPTY PACKET (E.G. ACK, NAK, BRK) 18023800 BEGIN 18023900 KERPKTHEAD (4"23",TYPE). 18024000 KERPKTTAIL. 18024100 CODE=ASCII 18024200 END # 18024300 . 18024400 22000000 REQUEST READTELETYPE: %************************************************22000200 % TOG 0 NEW LINE 22000400 % TOG 1 CR REQUIRED FOR NEW LINE 22000600 % TOG 2 READ PAPER TAPE 22000800 % TOG 3 ERROR TERMINATION READING PAPER TAPE 22001000 % TOG 4 TURN OFF SEQUENCE MODE 22001200 % TOG 5 PAPERMOTION=TRUE ON LAST OUTPUT 22001400 % TOG 6 END OF PAPER TAPE PUNCH 22001600 % TOG 7 PUNCH PAPER TAPE HEADER 22001800 % CRC 0 TEMPORARY COUNTER 22002000 % CRC 1 TEMPORARY CHARACTER STORAGE 22002200 % TALLY 0 APPLE FILE XFER PROTOTOL XMISSION # 22002400 % TALLY 1 ***** AVAILABLE ***** 22002600 % TALLY 2 APPLE/KERMIT PROTOCOL CONTROL INFO 22002800 %***********************************************************************22003000 DEFINE 22003200 TURNOFFSEQUENCE = TOG[4]#. 22003400 ERROR[0] = 22003600 STOPBIT:STOPBITERR, 22003800 BUFOVFL:BUFOVFLERR, 22004000 BREAK:BROKEN. 22004200 22004400 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%22004600 % APPLE PROTOCOL 22004800 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%22005000 22005200 DEFINE BEIMPATIENT = APPLECODE [3] # %%%%%%%%%% 22005400 , EOTFOUND = APPLECODE [3] # % DEFINE 22005600 , REPORTDOWNRESULT = APPLECODE [2] # % BITS 22005800 , GETFILENAME = APPLECODE [1] # % IN 22006000 , UPLOADING = APPLECODE [0] # % APPLECODE 22006200 22006400 , FIRSTRECEIVE (TIME,ONEND)= 22006600 RECEIVE (TIME) CHAR [98, END:ONEND 22006800 ,CONTROL:CONTROLMSGRECD 22007000 ,WRU :CONTROLMSGRECD 22007200 ] 22007400 # 22007600 , RECEIVEFIRSTCHAR (TIMELIMIT) = 22007800 FIRSTRECEIVE (TIMELIMIT,STOPPED) # 22007900 , RECEIVECHAR(X) = 22008000 BEGIN 22008200 RECEIVEONE (X). 22008400 MASKOFFPARITY. 22008600 CRC[0] = CRC[0] + CHAR 22008800 END 22009000 # 22009200 , GETHEXCHAR = 22009400 BEGIN 22009600 RECEIVEONE (NAKIT). 22009800 MASKOFFPARITY. 22010000 CHAR = CHAR - 4"30". 22010200 IF CHAR > 9 THEN CHAR = CHAR - 7. % FOR A-F 22010400 IF CHAR > 4"0F" THEN GO BADTEXT. 22010600 END 22010800 # 22011000 , STOREX(X) = STORE X [ENDOFBUFFER : NAKIT] # 22011200 , REPEATTILFULL = 22011400 IF LINECOUNT = UPLOADBLOCKING THEN 22011600 GO RETURNMSG 22011800 ELSE 22012000 BEGIN 22012200 LINECOUNT = LINECOUNT +1. 22012400 GO NEXTDATABLOCK 22012600 END 22012800 # 22013000 . 22013200 % KERMIT DEFINES: 22013210 DEFINE KPKTRCV = 22013215 BEGIN 22013220 KERRCVCHAR [150]. 22013225 CRC[0] = CRC[0] + CHAR. 22013230 END # 22013235 , KERTRANSMIT(WHAT) = TRANSMIT WHAT [BREAK: KBROKEN] # 22013240 , ENFORCEHALFDUP (AGAIN,NEXT) = 22013245 BEGIN 22013250 KERRCVCHAR [BREAK: KBROKEN, BUFOVFL: NULL 22013252 ,STOPBIT:NULL, TIMEOUT:NEXT]. 22013255 GO AGAIN 22013260 END # 22013265 . 22013270 ERROR[97] = APPLESW97. 22013400 ERROR[98] = APPLEERRSW (SKIPFIRSTAS,TIMEOUT:NAKIT ). 22013600 ERROR[99] = APPLEERRSW (BADTEXT,TIMEOUT:STOPPED). 22013800 ERROR [150] = BREAK: KBROKEN ,BUFOVFL: KNAK 22013810 ,STOPBIT:KNAK ,TIMEOUT: KNAK . 22013820 22014000 CODE=ASCII. 22014005 IF DEQUEUE THEN 22014010 BEGIN 22014015 DEQUEUE=FALSE. 22014020 BREAK[TRANSMIT]=TRUE. 22014025 TERMINATE ERROR. 22014030 END. 22014035 IF APPLECODE = 4"FF" THEN % KERMIT AUTO RCV DATA MODE 22014045 %%%%%%%%%%%%%%%%%%% 22014050 % KERMIT AUTO RECEIVE -- FOR RECEIVING AND ACKING KERMIT 22014055 % "D" PACKETS, UNTIL SOME OTHER PACKET 22014060 % COMES ALONG 22014065 %%%%%%%%%%%%%%%%%% 22014070 BEGIN 22014075 APPLECODE = 0. % ONLY STAY IN RCV MODE IF SPECIFICALLY OK TO DO SO22014080 INITIATE RECEIVE (NULL). 22014085 KERCNT = 2. % ALLOW 1 RETRY LOOKING FOR SOH 22014090 KWAIT1: 22014095 IF KERCNT=0 THEN GO RECVCHAR % DROP OUT OF AUTO RCV 22014100 ELSE 22014105 BEGIN 22014110 RECEIVE (5 SEC) CHAR [BREAK:RECVCHAR % DROP OUT OF AUTO RCV 22014115 ,BUFOVFL:KWAIT1, STOPBIT:KWAIT1 22014120 ,TIMEOUT:KSENDNAK 22014125 ,SOH: KSTARTPKT 22014130 ,CONTROL: CONTROLMSGRECD]. 22014132 KWAIT2: KERRCVCHAR [BREAK:BROKEN % DROP OUT OF AUTO RECV 22014135 ,BUFOVFL: KWAIT1, STOPBIT:KWAIT2, TIMEOUT: KWAIT3 22014140 ,SOH: KSTARTPKT]. 22014145 GO KWAIT2. % KEEP LOOKING FOR SOH 22014150 KWAIT3: KERCNT= KERCNT-1. % DECREMENT SOH WAIT RETRY COUNT 22014155 GO KWAIT1. 22014160 KSTARTPKT: % SOH HAS BEEN RECEIVED: RECEIVE PACKET 22014165 CODE=BINARY. % PREVENT TRANSLATION TO EBCDIC 22014170 CRC[0]=0. 22014175 KPKTRCV. % GET COUNT 22014180 KERCNT= KERUNCHAR (CHAR). 22014185 KERCNT= KERCNT -3. % NUMBER CHARACTERS OF DATA 22014190 KPKTRCV. % GET SEQ 22014195 GETSPACE [KNAK]. 22014200 IF CHAR = KERSEQ THEN 22014205 BEGIN 22014210 KPKTRCV. % GET TYPE 22014215 IF CHAR = 4"44" THEN % "D" PACKET 22014220 BEGIN 22014225 STORE 4"BF". % MARK AS NDL PROCESSED "D" PKT 22014230 KGETDATA: IF KERCNT NEQ 0 THEN % PACKET DATA LOOP 22014235 BEGIN 22014240 KPKTRCV. 22014245 KERCNT= KERCNT - 1. 22014250 IF CHAR = 4"23" THEN % # = QUOTE FOR CNTL CHAR 22014255 IF KERCNT > 0 THEN % WHICH IT SHOULD BE 22014260 BEGIN 22014265 KPKTRCV. % GET QUOTED CHAR 22014270 KERCNT= KERCNT -1. 22014275 IF CHAR NEQ 4"23" THEN % NOTE: "##"="#"22014280 CHAR= KERCTL(CHAR). 22014285 END. 22014290 STORE. 22014295 GO KGETDATA. % LOOP FOR MORE 22014300 END. 22014305 KERRCVCHAR [150]. % GET CRC[0] 22014310 KERCALCBCC. % COMPARE OUR BCC WITH REMOTE'S 22014315 IF CRC[0]=CHAR THEN % BCC OK 22014320 BEGIN 22014325 KACK: ENFORCEHALFDUP (KACK,KSENDACK). 22014330 KSENDACK: KERREPLY (4"59"). % SEND "Y" PKT 22014335 IF KERSEQ = 4"5F" THEN KERSEQ= 4"20" % FOLD SEQ22014340 ELSE KERSEQ= KERSEQ+1. % INCREMENT SEQ 22014345 APPLECODE=4"FF". % STAY IN AUTO RCV MODE 22014350 END 22014355 ELSE % BAD BCC 22014360 IF RETRY = 0 THEN % TOO MANY NAKS 22014365 BEGIN 22014370 KBRK: ENFORCEHALFDUP(KBRK,KSENDBRK). 22014375 KSENDBRK: KERREPLY (4"42"). % SEND "B" PKT 22014380 INITIALIZE TEXT. % SEND FAKE "B" PKT TO PGM 22014385 STORE SOH. 22014390 STORE 4"23". % PKT LENGTH 22014395 CHAR= KERSEQ. 22014396 STORE. % SEQ # 22014400 STORE 4"42". % "B" 22014405 CHAR = CRC[0]. % BCC IS: 22014406 STORE. % SAME AS IN PKT SENT TO RMT 22014410 END 22014415 ELSE % RETRY NOT EXHAUSTED-- SEND NAK PKT 22014420 BEGIN 22014425 KNAK: ENFORCEHALFDUP(KNAK,KSENDNAK). 22014430 KSENDNAK: KERREPLY(4"4E"). % SEND "N" PKT 22014435 RETRY= RETRY - 1. 22014440 APPLECODE=4"FF". % STAY IN AUTO RCV 22014445 KERCNT=0. 22014446 TERMINATE NOINPUT. 22014450 END. END 22014455 ELSE % NOT "D" PKT 22014460 BEGIN 22014465 CRC[0]= CHAR. % SAVE PACKET TYPE 22014470 STORE SOH. 22014475 KERCNT= KERCNT + 3. % RESTORE COUNT 22014480 CHAR= KERCHAR(KERCNT). 22014485 STORE. 22014490 CHAR= KERSEQ. 22014492 STORE. % SEQ # 22014495 CHAR= CRC[0]. % HOLDS PACKET TYPE 22014500 STORE. 22014502 KRCVTEXT: CODE=ASCII. 22014505 KERCNT=0. 22014506 GO RECVTEXT. % GET REST OF PACKET 22014510 END.END 22014515 ELSE % MIS-MATCHED SEQ 22014520 BEGIN 22014525 IF CHAR = 4"5F" AND KERSEQ = 4"20" THEN % WAS REXMITTED22014530 BEGIN 22014535 KERSEQ= 4"5F". 22014540 GO KRTXACK. 22014545 END 22014550 ELSE % NOT RETRANSMIT OF FOLLOWED BY SEQ FOLD AROUND 22014555 BEGIN 22014560 CHAR = CHAR + 1. % BUMP UP RECEIVED PACKET # 22014565 IF CHAR = KERSEQ THEN % PACKET WAS RETRANSMITTED 22014570 BEGIN 22014575 KERSEQ= KERSEQ - 1. % BACK UP OUR PACKET COUNT 22014580 KRTXACK: STORE 4"BF". % RETURN EMPTY PACKET TO PGM 22014585 GO KACK. % RE-ACK THE PACKET 22014590 END 22014595 ELSE % NOT A RETRANSMITTED PACKET 22014600 BEGIN 22014605 KPKTRCV. % GET TYPE 22014610 IF CHAR = 4"53" THEN % "S" PKT 22014615 % SEND GARBAGE TO PGM - THEN WAIT FOR 22014620 % RETRANSMIT OF "S" PACKET 22014625 GO KRCVTEXT 22014630 ELSE % STRAY PACKET -- NAK IT 22014635 GO KNAK. 22014640 END.END.END. 22014645 CODE = ASCII. % NORMAL EXIT 22014650 INITIALIZE RETRY. 22014655 KERCNT= 0. 22014656 GO RETURNMSG. 22014660 KBROKEN: 22014665 CODE=ASCII. 22014670 GO BROKEN. 22014675 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 22014680 END.END % OF KERMIT AUTO RECIEVE 22014685 % 22014690 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 22014695 ELSE % NORMAL APPLE CODE HERE 22014700 IF APPLECODE NEQ 0 THEN 22014710 BEGIN 22014720 IF BREAKNOTICE AND NOT WAIT4QUEUED THEN 22014800 % WE HAVE TO NOTIFY PROGRAM OF BREAK 22015000 BREAKNOTICE = FALSE % AND THEN GO STOPPED 22015200 ELSE 22015400 IF REPORTDOWNRESULT THEN 22015600 IF APPLECODE = 4"04" THEN % NO OTHER BITS SET (NO ERRS) 22015800 BEGIN 22016000 GETSPACE [TRYAGAIN]. 22016200 STORE DOWNLOADEDOK [ENDOFBUFFER:TRYAGAIN]. 22016400 GO FINISHEDREQUEST. 22016600 END 22016800 ELSE % GO STOPPED 22017000 ELSE 22017200 BEGIN 22017400 LINECOUNT = 0. 22017600 IF GETFILENAME AND BEIMPATIENT THEN RETRY=100. 22017800 NEXTDATABLOCK: 22018000 CODE = ASCII. 22018200 IF GETFILENAME THEN 22018400 BEGIN 22018600 IF WAIT4QUEUED THEN % GO TO XMIT REQUEST ONCE 22018800 BEGIN % SOMETHING IS QUEUED 22019000 LINE(BUSY) = FALSE. 22019200 IF STATION(QUEUED) THEN 22019400 TERMINATE NOINPUT. 22019600 END. 22019800 INITIATE RECEIVE (NULL). 22020000 IF BEIMPATIENT THEN % WE MAY HAVE MISSED THE 22020200 BEGIN % TRANSMISSION, IN WHICH CASE 22020400 APPLETRANSNO = 0. % WE CAN PROD THE APPLE TO 22020600 FIRSTRECEIVE (10 SEC, SKIPFIRSTSTOP). % SEND ANOTHER 22020800 IF FALSE THEN %ONLY IF WE GOT A CR ABOVE 22020840 BEGIN 22020860 SKIPFIRSTSTOP: RECEIVE (150 MILLI) "STOP" [99,FORMATERR:STOPPED]. 22020880 RECEIVE (150 MILLI) CHAR [97,END:STOPSKIPPED]. 22020900 GO STOPPED. % WASN'T A CR 22020920 STOPSKIPPED: RECEIVEFIRSTCHAR(NULL). 22020940 END. 22020960 BEIMPATIENT = FALSE. 22021000 END 22021200 ELSE RECEIVEFIRSTCHAR (NULL). 22021400 INITIALIZE RETRY. 22023400 LINE(BUSY) = TRUE. 22023600 END 22023800 ELSE 22024000 BEGIN 22024200 INITIATE RECEIVE (NULL). 22024400 RECEIVEFIRSTCHAR (5 SEC). 22024600 END. 22024800 STOPORSKIPPADDING (GO STOPPED). 22025000 IF WAIT4QUEUED THEN % WE WANT TO DETECT A "STOP" OR MANUAL 22025200 IGNORETHEREST: % KEYIN, BUT IGNORE ANYTHING ELSE 22025400 DISCARDTHEREST(IGNORETHEREST,TRYAGAIN) 22025600 ELSE GETSPACE [TRYAGAIN]. 22025800 ISTHISSTX: 22026000 IF CHAR=STX THEN 22026200 BEGIN 22026400 STXFOUND: CODE=BINARY. 22026600 CRC[0] = CHAR. 22026800 RECEIVECHAR (NAKIT). 22027000 IF GETFILENAME THEN 22027200 BEGIN 22027400 APPLETRANSNO= CHAR-4"41". 22027600 APPLETRANSNO= APPLETRANSNO AND 4"0F". 22027800 % NOTE THAT BITS 4-7 ARE ZEROED -- 22028000 % BEWARE OF BOOLEANS USING THESE BITS. 22028200 END 22028400 ELSE 22028600 BEGIN 22028800 IFWRONGTRANSNO THEN GO BADTEXT. 22029000 END. 22029200 RECEIVECHAR (NAKIT). 22029400 IF CHAR = ASCIICAN OR CHAR = ASCIISI THEN 22029600 CANNED: DISCARDTHEREST (CANNED,STOPAPPLE) 22029800 ELSE 22030000 IF CHAR = ASCIIACK OR CHAR = ASCIINAK THEN 22030200 GO BADTEXT 22030400 ELSE 22030600 IF CHAR = ASCIISOH THEN % FILE NAME FOLLOWS 22030800 IF GETFILENAME THEN % THIS IS WHAT WE WANT 22031000 BEGIN 22031200 STOREX (FILEFOLLOWS). 22031400 RECEIVECHAR(NAKIT). % PREPARE TO TRANS- 22031600 END % FER TEXT 22031800 ELSE GO NAKIT % UNEXPECTED 22032000 ELSE % THIS IS A BLOCK OF DATA 22032200 IF GETFILENAME THEN GO NAKIT % UNEXPECTED 22032400 ELSE EOTFOUND=FALSE. 22032600 STORETEXT: IF CHAR = ASCIIEOT THEN EOTFOUND=TRUE. 22032800 STOREX (CHAR). 22033000 RECEIVECHAR (NAKIT). 22033200 IF CHAR NEQ ASCIIETX THEN GO STORETEXT. 22033400 22033600 % CHECK CRC: 22033800 GETHEXCHAR. 22034000 CHAR = CHAR ASL 4. 22034200 CRC[0] = CRC[0] XOR CHAR. %CHECK LEFT 4 BITS 22034400 GETHEXCHAR. 22034600 CRC[0] = CRC[0] XOR CHAR. 22034800 CODE=ASCII. 22035000 IF CRC[0] NEQ 0 THEN 22035200 BEGIN 22035400 EOTFOUND=FALSE. 22035600 BADTEXT: DISCARDTHEREST (BADTEXT, NAKIT) 22035800 END 22036000 ELSE % EVERYTHING REC'D OK 22036200 BEGIN 22036400 RECEIVEONE(GOTIT). 22036600 GO NAKIT. % NOT A CR AT END 22036800 GOTIT: INITIALIZE RETRY. 22037000 IF UPLOADING THEN 22037200 IF EOTFOUND THEN 22037400 BEGIN 22037600 FINISHEDREQUEST: APPLECODE=0. 22037800 GO RETURNMSG 22038000 END 22038200 ELSE 22038400 BEGIN 22038600 STOREX(ASCIICR). % MARK RECORD AS GOOD 22038800 REPLY (ASCIIACK, FALSE). 22039000 INCREMENTTRANS. 22039200 REPEATTILFULL. 22039400 END 22039600 ELSE % GETFILENAME 22039800 BEGIN 22040000 WAIT4QUEUED=TRUE. 22040200 GO RETURNMSG. 22040400 END.END.END 22040600 ELSE IF CHAR=NAK THEN GO BADTEXT 22040800 ELSE % KEEP LOOKING FOR STX 22041000 BEGIN 22041200 RECEIVEONE (NAKEND). 22041400 GO ISTHISSTX. 22041600 END. 22041800 22042000 NAKIT: REPLY (ASCIINAK,FALSE). 22042200 NAKEND: IF RETRY > 0 THEN 22042400 BEGIN 22042600 RETRY=RETRY-1. 22042800 IF UPLOADING THEN 22043000 IF LINECOUNT=0 THEN % NO PRIOR RECORDS TO LOOSE 22043200 GO TRYAGAIN % IN THIS BLOCK 22043400 ELSE 22043600 BEGIN 22043800 STOREX(ASCIIETX). % MARK RECORD AS BAD 22044000 REPEATTILFULL. 22044200 END 22044400 ELSE 22044600 BEGIN 22044800 TRYAGAIN: INITIALIZE TEXT. 22045000 PAUSE. 22045200 GO NEXTDATABLOCK. 22045400 END.END. 22045600 22045800 STOPAPPLE: 22046000 STOPTHEAPPLE 22046200 END. 22046400 STOPPED: 22046600 INITIALIZE TEXT. 22046800 INITIALIZE RETRY. 22047000 PAUSE. 22047200 GETSPACE [STOPPED]. % SIGNAL A BREAK 22047400 STORE ASCIICAN [ENDOFBUFFER:STOPPED]. % CONDITION TO PROGRAM 22047600 CODE=ASCII. 22047800 22048000 GETOUT: 22048200 APPLECODE = 0. 22048400 GO ENDOFINPUT. 22048600 22048800 CONTROLMSGRECD: % SOMEONE KEYED IN A CONTROL MESSAGE -- PASS IT 22049000 LINE(BUSY)=TRUE. % ON TO THE MCS 22049200 APPLECODE = 0. 22049400 GETSPACE [CANTGETSPACE]. 22049600 STORE [ENDOFBUFFER:TOOLONG]. 22049800 BREAKNOTICE=TRUE. 22050000 GO RECVTEXT. 22050200 END. 22050400 22050600 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%22050800 % END OF APPLE PROTOCOL 22051000 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%22051200 22051400 22051600 IF NEWLINE THEN 22051800 BEGIN 22052000 NEWLINE=FALSE. 22052200 SENDCR: 22052400 INITIATE TRANSMIT. 22052600 IF CRREQUIRED THEN 22052800 TRANSMIT CR [BREAK:SENDCR]. 22053000 CRREQUIRED = TRUE. 22053200 WAITFORCR. 22053400 TRANSMIT LF [BREAK:SENDCR]. 22053600 FINISH TRANSMIT. 22053800 END. 22054000 IF SEQUENCE THEN 22054200 BEGIN 22054400 INITIATE TRANSMIT. 22054600 TRANSMIT SEQUENCE [BREAK:TERMSEQMODE]. 22054800 TRANSMIT " " [BREAK:TERMSEQMODE]. 22055000 FINISH TRANSMIT. 22055200 NEWLINE = TRUE. 22055400 TURNOFFSEQUENCE = FALSE. 22055600 CONTROLFLAG = FALSE. 22055800 LINE(BUSY) = FALSE. 22056000 IF STATION(QUEUED) THEN 22056200 TERMINATE NOINPUT. 22056400 INITIATE RECEIVE. 22056600 RECVCHARSEQ: 22056800 RECEIVE(NULL) CHAR [0, 22057000 END:TERMSEQMODE, 22057200 "@":TERMSEQMODE, 22057400 "*":TERMSEQMODE, 22057600 WRU:TERMSEQMODE, 22057800 LINEDELETE:DELETELINE, 22058000 BACKSPACE:RECVCHARSEQ, 22058200 CONTROL:NULL]. 22058400 NEWLINE = FALSE. 22058600 END 22058800 ELSE 22059000 BEGIN 22059200 LINE(BUSY)=FALSE. 22059400 IF STATION(QUEUED) THEN 22059600 TERMINATE NOINPUT. 22059800 INITIATE RECEIVE. 22060000 RECVCHAR: 22060200 RECEIVE (NULL) CHAR [0, 22060400 END:ENDOFINPUT, 22060600 BACKSPACE:RECVCHAR, 22060800 LINEDELETE:RECVCHAR, 22061000 CONTROL:NULL, 22061200 WRU:ENDOFINPUT]. 22061400 END. 22061600 LINE(BUSY) = TRUE. 22061800 GETSPACE[CANTGETSPACE]. 22062000 STORE [ENDOFBUFFER:TOOLONG]. 22062200 RECVTEXT: 22062400 RECEIVE (NULL) TEXT[0 22062600 ,ENDOFBUFFER:TOOLONG 22062800 ,END 22063000 % , WRU THIS LINE REMOVED 22063200 ,BACKSPACE:NULL 22063400 ,LINEDELETE:DELETELINE 22063600 ]. 22063800 ENDOFTEXT: 22064000 IF CHAR = CR THEN % CR IS END CHAR 22064200 CRREQUIRED = FALSE. 22064400 IF SEQUENCE THEN 22064600 BEGIN 22064800 STORE SEQUENCE. 22065000 IF CONTROLFLAG THEN 22065200 TURNOFFSEQUENCE = TRUE. 22065400 IF TURNOFFSEQUENCE THEN 22065600 SEQUENCE = FALSE 22065800 ELSE 22066000 INCREMENT SEQUENCE[SEQOFLOW]. 22066200 END. 22066400 ENDOFINPUT: 22066600 GETSPACE[CANTGETSPACE]. 22066800 TERMINATE LOGICALACK. 22067000 IF CONTROLFLAG THEN % GOT CONTROL MSG-- WAS IT "?BRK"? 22067010 BEGIN 22067020 FETCH. % IGNORE CONTROL CHAR 22067030 FETCH [ENDOFBUFFER:NOTBRK]. 22067040 PAUSE. 22067050 IF CHAR="B" OR CHAR=4"82" THEN 22067060 BEGIN 22067070 FETCH [ENDOFBUFFER:NOTBRK]. 22067080 IF CHAR="R" OR CHAR=4"99" THEN 22067090 BEGIN 22067100 FETCH [ENDOFBUFFER:NOTBRK]. 22067110 IF CHAR="K" OR CHAR=4"92" THEN 22067120 FETCH [ENDOFBUFFER:FAKEBREAK]. 22067130 END.END.END. 22067140 NOTBRK: 22067150 NEWLINE=TRUE. 22067200 RETURNMSG: 22067400 $ SET OMIT = ENHANCED 22067600 TERMINATE NORMAL. 22067800 $ SET OMIT = NOT ENHANCED 22068000 TERMINATE NORMAL [SYSTEMDOWN:NULL]. 22068200 DELAY (10 MILLI). 22068400 GO RETURNMSG. 22068600 $ POP OMIT OMIT 22068800 $ SET AUXLOGIC=AUXCODE 22069000 SEQOFLOW: 22069200 INITIATE TRANSMIT. 22069400 TRANSMIT SEQOVFLMSG [BREAK:TERMSEQMODE]. 22069600 FINISH TRANSMIT. 22069800 SEQERR = TRUE. 22070000 $ POP AUXLOGIC 22070200 TERMSEQMODE: 22070400 LINE(BUSY) = TRUE. 22070600 GETSPACE[CANTGETSPACE]. 22070800 TURNOFFSEQUENCE = TRUE. 22071000 IF CHAR = "@" THEN 22071200 BEGIN 22071400 STORESPEC: 22071600 STORE [ENDOFBUFFER:TOOLONG]. 22071800 GO TO RECVTEXT. 22072000 END. 22072200 IF CHAR = "*" THEN 22072400 GO TO STORESPEC. 22072600 GO TO ENDOFTEXT. 22072800 $ SET AUXLOGIC=AUXCODE % READTELETYPE STOPBITERR 22073000 STOPBITERR: 22073200 LINE(BUSY) = TRUE. 22073400 INITIATE TRANSMIT. 22073600 TRANSMIT ERRMSG [BREAK:NULL]. 22073800 FINISH TRANSMIT. 22074000 IF RETRY > 0 THEN 22074200 BEGIN 22074400 RETRY = RETRY - 1. 22074600 TERMINATE NOINPUT. 22074800 END. 22075000 TERMINATE ERROR. 22075200 BUFOVFLERR: 22075400 LINE(BUSY) = TRUE. 22075600 DELAY(200 MILLI). 22075800 INITIATE TRANSMIT. 22076000 TRANSMIT BUFOVFLMSG [BREAK:NULL]. 22076200 FINISH TRANSMIT. 22076400 TERMINATE ERROR. 22076600 FAKEBREAK: 22076620 DEQUEUE = TRUE. 22076640 LINE(BUSY) = FALSE. 22076660 TERMINATE NOINPUT. 22076680 $ POP AUXLOGIC 22076800 BROKEN: 22077000 LINE(BUSY) = TRUE. 22077200 BREAK[RECEIVE] = FALSE. 22077400 DELAY(200 MILLI). 22077600 DELETELINE: 22077800 INITIATE TRANSMIT. 22078000 TRANSMIT "DEL" [BREAK:NULL]. 22078200 FINISH TRANSMIT. 22078400 NEWLINE=TRUE. 22078600 TERMINATE NOINPUT. 22078800 $ SET AUXLOGIC=AUXCODE % READTELETYPE TOOLONG 22079000 TOOLONG: 22079200 INITIATE TRANSMIT. 22079400 TRANSMIT OVERFLOWMSG [BREAK:NULL]. 22079600 FINISH TRANSMIT. 22079800 INITIATE RECEIVE. 22080000 RECEIVE (NULL) CHAR [0 22080200 ,END:ENDOFINPUT 22080400 ,WRU:ENDOFINPUT 22080600 ,BACKSPACE:NULL 22080800 ,LINEDELETE:DELETELINE 22081000 ]. 22081200 GO TO TOOLONG. 22081400 $ POP AUXLOGIC 22081600 CANTGETSPACE: 22081800 INITIATE TRANSMIT. 22082000 IF SYSTEMDUMPING THEN 22082200 TRANSMIT DUMPMSG [BREAK:NULL] 22082400 ELSE 22082600 TRANSMIT WAITMSG [BREAK:NULL]. 22082800 FINISH TRANSMIT. 22083000 NEWLINE=TRUE. 22083200 IF NOT STATION(QUEUED) THEN 22083400 BEGIN 22083600 LINE(BUSY)=FALSE. 22083800 TRYFORSPACE: 22084000 IF NOSPACE THEN 22084200 BEGIN 22084400 RECEIVE (5 SEC) CHAR 22084600 [STOPBIT:NULL 22084800 ,BUFOVFL:NULL 22085000 ,BREAK:NULL 22085200 ,TIMEOUT:TRYFORSPACE 22085400 ]. 22085600 GO TO CANTGETSPACE. 22085800 END. 22086000 INITIATE TRANSMIT. 22086200 TRANSMIT OKMSG [BREAK:NULL]. 22086400 FINISH TRANSMIT. 22086600 END. 22086800 TERMINATE NOINPUT. 22087000 %***********************************************************************22087200 22087400 REQUEST WRITETELETYPE: %***********************************************22100000 DEFINE FETCHANOTHER = FETCH [ENDOFBUFFER:NOTAPPLEBLOCK] # 22100200 , IFSENDING = FETCHANOTHER. 22100400 IF CHAR = 22100600 # 22100800 , READYTODOWNLOAD = APPLECODE=READYTODOWNLOADOP # 22101000 , KERTRANSMIT(WHAT) = TRANSMIT WHAT [BREAK:KBROKEN] # 22101010 . 22101200 ERROR[97] = APPLESW97. 22101400 ERROR[98] = APPLEERRSW(SKIPFIRSTAS, TIMEOUT:NAKEND ). 22101600 ERROR[99] = APPLEERRSW(NAKED,TIMEOUT:STOPPED). 22101800 22102000 CODE = ASCII. 22102100 IF DEQUEUE THEN 22102150 BEGIN 22102160 BREAK[TRANSMIT]=TRUE. 22102170 GO BROKEN 22102180 END. 22102190 INITIATE TRANSMIT. 22102200 IF NEWLINE THEN 22102400 BEGIN 22102600 NEWLINE=FALSE. 22102800 IF CRREQUIRED THEN 22103000 TRANSMIT CR [BREAK:BROKEN]. 22103200 CRREQUIRED = TRUE. 22103400 WAITFORCR. 22103600 TRANSMIT LF [BREAK:BROKEN]. 22103800 END. 22104000 IF PAGE THEN 22104200 TRANSMIT FF [BREAK:BROKEN]. 22104400 IF PAPERMOTION THEN 22104600 BEGIN 22104800 PRINTEDAFTER = TRUE. 22105000 MOVEPAPER: 22105200 IF CARRIAGE THEN 22105400 BEGIN 22105600 TRANSMIT CR [BREAK:BROKEN]. 22105800 WAITFORCR. 22106000 END. 22106200 IF LINEFEED THEN 22106400 TRANSMIT LF [BREAK:BROKEN]. 22106600 TEMPCOUNTER = SKIPCONTROL. 22106800 IF TEMPCOUNTER = 0 THEN 22107000 IF PAPERMOTION THEN 22107200 GO TO XMITMSG 22107400 ELSE 22107600 GO TO ENDXMIT. 22107800 IF SKIP THEN 22108000 BEGIN 22108200 SKIPLINES: 22108400 IF TEMPCOUNTER NEQ 0 THEN 22108600 BEGIN 22108800 TRANSMIT VT [BREAK:BROKEN]. 22109000 IF ADAPTER LEQ 6 THEN 22109200 DELAY(100 MILLI). 22109400 END. 22109600 END 22109800 ELSE 22110000 IF SPACE THEN 22110200 BEGIN 22110400 TEMPCOUNTER = TEMPCOUNTER - 1. % 1 LF ALREADY DONE 22110600 SPACELINES: 22110800 IF TEMPCOUNTER NEQ 0 THEN 22111000 BEGIN 22111200 TRANSMIT LF [BREAK:BROKEN]. 22111400 TEMPCOUNTER = TEMPCOUNTER - 1. 22111600 GO TO SPACELINES. 22111800 END. 22112000 END. 22112200 IF NOT PAPERMOTION THEN 22112400 GO TO ENDXMIT. 22112600 END 22112800 ELSE 22113000 IF PRINTEDAFTER THEN 22113200 BEGIN 22113400 TRANSMIT CRNULLF [BREAK:BROKEN]. 22113600 WAITFORCR. 22113800 PRINTEDAFTER = FALSE. 22114000 END. 22114200 TEMPCOUNTER = 0. 22114400 IF NOT CARRIAGE THEN 22114600 BEGIN 22114800 22115000 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%22115200 % APPLE PROTOCOL 22115400 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%22115600 22115800 IF DEQUEUE THEN GO STOPPED. % CLEAR OUT ANY QUEUED MESSAGES 22116000 22116200 STARTAPPLE: 22116400 22116600 APPLECODE=0. 22116800 FETCHANOTHER. 22117000 % KERMIT CODE: 22117005 IF CHAR = 4"BF" THEN 22117010 BEGIN 22117015 FETCHANOTHER. % PAD COUNT 22117020 FETCHANOTHER. % PAD CHAR 22117025 FETCHANOTHER. % COUNT 22117030 FETCHANOTHER. % SEQ 22117035 KERSEQ= CHAR. 22117040 FETCHANOTHER. % TYPE 22117045 FETCH [ENDOFBUFFER: KERISOK]. % SHOULD HAVE END OF BUFFER 22117050 IF FALSE THEN % NORMAL PATH--ENTERED IF JUST ENUF CHARS 22117055 BEGIN 22117060 KERISOK: 22117065 CODE=BINARY. 22117066 KERREPLY (4"59"). % SEND "Y" (ACK) PKT 22117070 IF KERSEQ = 4"5F" THEN KERSEQ= 4"20" % FOLD SEQ 22117075 ELSE KERSEQ= KERSEQ + 1. % INCREMENT SEQ 22117080 APPLECODE= 4"FF". % GO INTO AUTO RCV MODE 22117085 KBROKEN: 22117086 CODE=ASCII. 22117088 GO CHECK4RECV. 22117090 END 22117095 ELSE GO NOTAPPLEBLOCK. % NOT A KERMIT AUTO RECV REQUEST AFTER ALL 22117100 END. 22117105 CHAR = CHAR - 4"B0". 22117200 GO TO CHAR ( B0, B1, B2, B3, B4, B5, B6, B7 22117400 , B8, B9, BA, BB, BC 22117600 ). 22117800 IF FALSE THEN 22118000 IF FALSE THEN 22118200 B0: APPLECODE=READYTOUPLOADOP 22118400 ELSE IF FALSE THEN 22118600 B1: 22118800 ELSE IF FALSE THEN 22119000 B2: APPLECODE=READYTODOWNLOADOP 22119200 ELSE IF FALSE THEN 22119400 B3: 22119600 ELSE IF FALSE THEN 22119800 B4: APPLECODE=ABORTOP 22120000 ELSE IF FALSE THEN 22120200 B5: APPLECODE=FINISHUPLOADOP 22120400 ELSE IF FALSE THEN 22120600 B6: APPLECODE=DOWNLOADOP 22120800 ELSE IF FALSE THEN 22121000 B7: APPLECODE=FINISHDOWNLOADOP 22121200 ELSE IF FALSE THEN 22121400 B8: APPLECODE=GETFILEOP 22121600 ELSE IF FALSE THEN 22121800 B9: 22122000 ELSE IF FALSE THEN 22122200 BA: % APPLECODE=UPLOADOP % THIS IS NO LONGER SENT TO NDL 22122400 ELSE IF FALSE THEN 22122600 BB: 22122800 ELSE IF FALSE THEN 22123000 BC: APPLECODE=PROMPTOP 22123200 . 22123400 IF APPLECODE NEQ 0 THEN 22123600 BEGIN % AN APPLE REQUEST HAS BEEN MADE: 22123800 WAIT4QUEUED=FALSE. % WE'VE BEEN WAITING TO GET HERE!!! 22124000 IF BREAKNOTICE THEN % NOTIFY PGM THAT A BRK HAS OCCURED 22124200 BEGIN 22124400 BREAKNOTICE=FALSE. 22124600 GO STOPPED 22124800 END 22125000 ELSE 22125200 IF APPLECODE GEQ 4"10" THEN 22125400 BEGIN 22125600 IF APPLECODE GEQ 4"40" THEN 22125800 BEGIN 22126000 CRC[0] = 0. 22126200 SENDPADDING. 22126400 CODE=BINARY. 22126600 XMIT(ASCIISTX). 22126800 IF READYTODOWNLOAD THEN INCREMENTTRANS. 22127000 SENDTRANSNO. 22127200 IF APPLECODE[7] THEN %XMIT CAN OR ACK 22127400 BEGIN 22127600 IF APPLECODE[6] THEN % CAN 22127800 BEGIN 22128000 XMIT(ASCIICAN). 22128200 IF APPLECODE[5] THEN XMIT(ASCIIB) %PROMPT MSG 22128400 ELSE XMIT(ASCIIA). %FATAL MESSAG22128600 APPLECODE = APPLECODE AND 4"1F" 22128800 END 22129000 ELSE % ACK 22129200 BEGIN 22129400 XMIT(ASCIIACK). 22129600 IF APPLECODE[4] THEN 22129800 IF APPLECODE[5] THEN % READYTODOWNLOAD 22130000 ELSE XMIT(ASCIIB) % FINISHUPLOAD 22130200 ELSE XMIT(ASCIIB ). % READYTOUPLOAD 22130400 APPLECODE[7]=APPLECODE[5]. %SET PATIENCE BIT 22130600 APPLECODE =APPLECODE AND 4"9F" 22130800 END.END. 22131000 XMITTEXT: FETCH [ENDOFBUFFER:ENDOFTEXT]. 22131200 XMIT(CHAR). 22131400 GO XMITTEXT. 22131600 ENDOFTEXT: IF APPLECODE[5] THEN XMIT(ASCIIEOT). 22131800 XMIT(ASCIIETX). 22132000 SENDCRC. 22132200 XMIT(ASCIICR). 22132400 CODE=ASCII. 22132600 FINISH TRANSMIT. 22132800 IF NOT APPLECODE[4] THEN GO ENDACK. 22133000 END. 22133200 IF APPLECODE[4] THEN % NEED SOME ACKNOWLEDGEMENT 22133400 BEGIN 22133600 IF TRUE THEN 22133700 BEGIN 22133750 INITIATE RECEIVE. 22133800 RECEIVE (NULL ) CHAR [98,END:STOPPED]. 22134200 APPLECODE=APPLECODE AND 4"1F" %STRIP OFF XMIT CODE 22134600 END 22134610 ELSE 22134620 WAITFORNEXTREPLY: 22134640 RECEIVE (20 SEC) CHAR [98,END:STOPPED]. 22134660 STOPORSKIPPADDING (IF APPLECODE[3] THEN 22134800 GO ENDACK 22135000 ELSE GO STOPPED 22135200 ). 22135400 ISTHISSTX: 22135600 IF CHAR = STX THEN 22135800 BEGIN 22136000 STXFOUND: CODE=BINARY. 22136200 RECEIVEONE(NAKEND). 22136400 MASKOFFPARITY. 22136600 CODE=ASCII. 22136800 IFWRONGTRANSNO THEN % WRONG TRANS # 22137000 GO NAKED 22137200 ELSE 22137400 BEGIN 22137600 RECEIVEONE(NAKEND). 22137800 IF CHAR = ACK THEN 22138000 BEGIN 22138200 ACKED: DISCARDTHEREST(ACKED,ACKEND). 22138400 ACKEND: IF APPLECODE[3] THEN GO NAKEND. 22138600 ENDACK: INITIALIZE RETRY. 22138800 INCREMENTTRANS. 22139000 IF APPLECODE[4] AND NOT APPLECODE[3] THEN 22139200 BEGIN % (DOWNLOADING) 22139400 APPLECODE=0. 22139600 GO RETURNMSG 22139800 END. 22140000 APPLECODE=APPLECODE AND 4"07". %STRIP OFF 22140200 % XMIT CODES AND ERR INDICATOR (BIT #3) 22140400 GO CHECK4RECV 22140600 END 22140800 ELSE 22141000 BEGIN 22141200 IF CHAR = CAN THEN 22141400 CANNED: DISCARDTHEREST(CANNED,STOPAPPLE) 22141600 ELSE % EITHER A NAK OR 22141800 % SOMETHING UNEXPECTED 22142000 BEGIN 22142200 NAKED: DISCARDTHEREST(NAKED,NAKEND). 22142400 NAKEND: IF RETRY > 0 THEN 22142600 BEGIN 22142800 RETRY = RETRY - 1. 22143000 CODE=ASCII. 22143200 TERMINATE NOINPUT 22143400 END.END. 22143600 STOPAPPLE: % TELL APPLE TO GO AWAY: 22143800 STOPTHEAPPLE. 22144000 END.END.END 22144200 ELSE IF CHAR = NAK THEN GO NAKED 22144400 ELSE 22144600 BEGIN 22144800 RECEIVEONE (WAITFORNEXTREPLY). 22145000 GO ISTHISSTX 22145200 END. 22145400 STOPPED: 22145600 BREAK[TRANSMIT] = TRUE. 22145800 CODE = ASCII. 22146000 DEQUEUE=TRUE. 22146200 IF APPLECODE=DOWNLOADOP OR APPLECODE=FINISHDOWNLOADOP THEN 22146400 BREAKNOTICE=TRUE 22146600 ELSE APPLECODE=APPLECODE AND 4"0F". % MASK OFF XMIT CODES 22146800 GO BROKEN. 22147000 END.END. 22147200 CHECK4RECV: 22147400 IF APPLECODE NEQ 0 THEN 22147600 BEGIN 22147800 DEQUEUE=TRUE. % ACCEPT NO MORE TRANSMISSIONS UNTIL 22148000 INITIALIZE RETRY % THIS REQUEST HAS BEEN SERVICED 22148200 END. 22148400 GO ENDXMIT 22148600 END. 22148800 22149000 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%22149200 % END OF APPLE PROTOCOL 22149400 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%22149600 22149800 NOTAPPLEBLOCK: 22150000 INITIALIZE TEXT. 22150200 TRANSMIT TEXT[BREAK:BROKEN]. 22150400 GO TO ENDOFMSG. 22150600 END. 22150800 XMITMSG: 22151000 FETCH[ENDOFBUFFER:ENDOFMSG]. 22151200 DELETEBLANKS(TEMPCOUNTER,TEMPSTORAGE,BROKEN). 22151400 IF CHAR = CR THEN 22151600 WAITFORCR. 22151800 GO XMITMSG. 22152000 ENDOFMSG: 22152200 IF NOT PAPERMOTION THEN 22152400 GO TO MOVEPAPER. 22152600 ENDXMIT: 22152800 FINISH TRANSMIT. 22153000 RETURNMSG: 22153200 $ SET OMIT = ENHANCED 22153400 TERMINATE NORMAL. 22153600 $ SET OMIT = NOT ENHANCED 22153800 TERMINATE NORMAL [SYSTEMDOWN:NULL]. 22154000 DELAY (10 MILLI). 22154200 GO RETURNMSG. 22154400 $ POP OMIT OMIT 22154600 BROKEN: 22154800 NEWLINE=TRUE. 22155000 DEQUEUE=TRUE. 22155100 BREAK[TRANSMIT]=TRUE. 22155150 TERMINATE ERROR. 22155200 %***********************************************************************22155400 22155600