/XCOM: COMMUNICATION AND FILE TRANSFER PROGRAM / / / / This program runs under OS/8 version 3D, in conjunction / with a remote system using XON/XOFF protocol. / Data transfer as 8 bit, no parity. / / The following IOTs control a KL8 serial interface / connected to communication line. / / Device 40 (input), 41 (output). / VKSF=6401 /TEST VAX INPUT FLAG VKRB=6406 /READ VAX INPUT VTSF=6411 /TEST VAX OUTPUT FLAG VTLS=6416 /READ VAX OUTPUT FIXTAB / / To run the program on a different system, the four / IOT's must be adjusted to the correct device code, / and this file assembled using PAL8. The commands / to assemble, load and save the core image are / / .R PAL8 / *XCOM,LPT:. / / CTRL/R to receive file. Enter filespec (include '<') / after Command Decoder prompt (*), than . / / / /VAXCOPY - Copy file from remote system to PDP8 / / Branches to OS/8 Command Decoder to obtain filespec / from operator for input. Copies data from remote / system to a temporary memory buffer starting at / BOTTOM+1 (1000 octal) until received. / is sent to halt transmission while the buffer is / passed, characterwise, to OS/8. is sent to / enable transmission again. End of file is given by / CTRL/Z received from remote system. / / KEYBOARD CHARACTERS / CTRL/Z forces immediate end of file. Control returns / to VAXTTY. / / CTRL/Y aborts transfer without closing file. CTRL/C / sent to remote system. Control returns to VAXTTY. / / CTRL/C aborts transfer without closing file. CTRL/C / sent to remote system. Control returns to VAXTTY or / OS/8 (if ^C picked up by device handler). / / / /PDPCOPY - Copy file from PDP8 to remote system / / Branches to OS/8 Command Decoder to get OS/8 filespec / for output. The OS/8 character-oriented IO routines / supply the file as a stream of characters which are sent / to the remote system. If the remote system sends an / , the program waits for an before continuing. / An error message from the remote system recognized by a / leading '%' will abort the transfer. / / KEYBOARD CHARACTERS / / CTRL/Z will force immediate end of file and return control / to VAXTTY. / / CTRL/Y aborts transfer. CTRL/C is sent to remote system and / control returned to VAXTTY. / / CTRL/C aborts transfer. CTRL/C is sent to remote system and / control returned to OS/8 monitor. FIELD 0 *200 VAXTTY, CLA CLL /INITIALIZE FLAGS, ALL DEVICES VTLS TLS VKRB KRB CLA CLL KEYRD, KSF /ANYTHING TYPED AT KEYBOARD? JMP VAXRD /NO, LOOK TOWARDS VAX KRB /YES DCA STORE OSR AND (4000 SNA /SW0 SET? JMP .+4 /NO CLA CLL /YES TAD STORE TLS /PRINT IT CLA CLL TAD (203 /CHECK FOR ^C ON KEYBOARD CIA /OPERATOR REQUESTED EXIT TAD STORE SNA JMP I OSEXIT /EXIT TO OS8 CLA CLL TAD (222 /^R REQUESTS FILE RECEIVE CIA TAD STORE SNA JMP VAXCOPY CLA CLL TAD (224 /^T REQUESTS FILE TRANSMIT CIA TAD STORE SNA JMP PDPCOPY CLA CLL TAD STORE /RECOVER KBD CHAR FOR TRANSMISSION VAXWAIT,JMS PUTVAX /SEND ACC TO VAX VAXRD, VKSF /LOOK FOR CHAR FROM VAX JMP KEYRD /IF NOT, CHECK VDU KEYBOARD VKRB /GET CHAR FROM VAX TLS TTYWAIT,TSF JMP .-1 JMP KEYRD /LOOK FOR KEYBD CHAR AGAIN PUTVAX, 0 /SUBROUTINE SENDS 1 CHAR TO VAX VTSF JMP .-1 VTLS JMP I PUTVAX /RETURN FROM SUBROUTINE STORE, 0 OSEXIT, 7600 *400 VAXCOPY,CLA CLL TAD (23 /XOFF JMS PUTVAX /STOP INPUT TILL FILE OPENED CIF CDF 10 JMS USRCALL /GET OS8 DESTINATION FILE NAME RET1, CLA CLL TAD BOTTOM IAC DCA PTR ENABLE, TAD (21 /XON JMS PUTVAX /ACCEPT INPUT FROM VAX NXTCHR, VKSF JMP TSTKBD /NOTHING YET; CHECK KEYBOARD VKRB SNA JMP NXTCHR /IF NULL,LOOK FOR ANOTHER CHAR DCA STORE2 CLA CLL TAD (232 /CONTROL-Z SENT AT END OF FILE? CIA TAD STORE2 SNA JMP CLOS /YES, CLOSE THE OS/8 FILE CLA CLL TAD STORE2 /RECALL CHAR FOR ENTRY INTO LINE BUFFER DCA I PTR TAD PTR IAC /INCREMENT POINTER TO NEXT CHAR IN BUFFER DCA PTR TAD (212 /; AT END OF A LINE, INPUT WILL BE CIA /DISABLED AND LINE BUFFER SENT TO OS/8 TAD STORE2 SNA JMP LINESND /LAST CHAR WAS JMP NXTCHR LINESND,CLA CLL TAD (23 /XOFF JMS PUTVAX /STOP INPUT CLA CLL TAD BOTTOM /SET POINTER TO START OF LINE BUFFER (LESS 1) DCA PTR WRITE, CLA CLL /SEND BUFFER CHAR-BY-CHAR UNTIL IAC /TO OS/8 FILE TAD PTR DCA PTR TAD I PTR CIF CDF 10 JMP TODSK /1 CHAR TO FILE RET4, CLA CLL TAD (212 CIA TAD I PTR SZA /AFTER GET ANOTHER LINE JMP WRITE NXTLINE,CLA CLL TAD BOTTOM /RESET BUFFER POINTER IAC DCA PTR JMP ENABLE /READY FOR NEXT LINE TSTKBD, KSF /CHECK KEYBOARD JMP NXTCHR /IF NOTHING, LOOK AT VAX AGAIN KBD, KRB DCA STORE2 TAD (232 /CONTROL-Z; OPERATOR REQUESTS CIA /IMMEDIATE END OF FILE TAD STORE2 SNA JMP CLOS /YES, CLOSE FILE AS IS CLA CLL TAD (203 /CHECK IF ^C TO ABORT TRANSFER CIA TAD STORE2 SNA JMP ABORT /SEND CONTROL-C TO VAX CLA CLL TAD (231 /CHECK IF ^Y (ALT. ABORT COMMAND) CIA TAD STORE2 SNA JMP ABORT /YES, STOP JMP ENABLE CLOS, CLA CLL TAD (23 /GET TO DISABLE INPUT JMS PUTVAX CIF CDF 10 JMP USRCL /CLOSE FILE; RETURN VIA RET5 ABORT, CLA CLL TAD (203 /CONTROL-C JMS PUTVAX /STOP FILE TRANSFER PERMANENTLY RET5, CLA CLL TAD (21 /ENABLE VAX TRANSMITTION JMP VAXWAIT BOTTOM, 777 PTR, 0 STORE2, 0 *600 PDPCOPY,CLA CLL CIF CDF 10 JMS UCAL2 /OPEN OS/8 INPUT FILE RET10, CLA CLL VKRB /CLEAR INPUT FLAG NXT, VTSF /IS LINE READY FOR OUTPUT? JMP TKBD1 /NO; TEST FOR KEYBOARD CHAR CIF CDF 10 JMP GDATA /READ CHARACTER FROM OS/8 FILE RET20, SNA /IF , IGNORE JMP NXT DCA STORE3 TAD STORE3 SNA JMP NXT /NEXT CHAR CLA CLL TAD STORE3 /SEND ON TO VAX JMS PUTVAX VKSF /HAS VAX SENT ANYTHING? JMP NXT /NO VKRB /YES DCA STORE3 TAD (23 /XOFF, WAIT TILL CIA TAD STORE3 SNA JMP IDLE /GO AND WAIT FOR CLA CLL TAD (245 /'%' PRECEDES AN ERROR MESSAGE CIA TAD STORE3 SNA JMP VAXWAIT /AN ERROR HAS OCCURRED JMP NXT /IGNORE ANY OTHER DATA IDLE, VKSF /WAIT FOR NEW INPUT FROM VAX JMP .-1 VKRB CIA TAD (21 /CHECK FOR SZA JMP IDLE / IS ONLY WAY OUT! JMP NXT /FREE TO CONTINUE EOF, CLA CLL TAD (232 /CONTROL-Z JMP VAXWAIT /TELL VAX THAT TRANSFER IS FINISHED TKBD1, KSF /ANYTHING TYPED BY OPERATOR? JMP NXT /NO, CONTINUE TRANSFER KRB DCA STORE3 TAD (232 /^Z REQUESTS IMMEDIATE EOF CIA TAD STORE3 SNA JMP EOF CLA CLL TAD (203 /^C ABORTS TRANSFER CIA TAD STORE3 SNA JMP ABORT1 /SEND ^C TO VAX CLA CLL TAD (231 /^Y IS ALTERNATE ABORT CODE CIA TAD STORE3 SZA /JUMP TO ABORT1 IF ^Y JMP NXT /IGNORE ANY OTHER INPUT ABORT1, CLA CLL TAD (203 /LOAD CONTROL-C FOR VAX JMP VAXWAIT /TRANSFER ABORTED / STORE3, 0 FIELD 1 *6000 USRCALL,0 /USR MANIPULATIONS CLA CLL JMS I ULOCK /LOCK USR IN CORE 10 /PARAMETER MONI, JMS I MONIT /CALL MONITOR FOR FILE NAMES ETC 5 0 CLA CLL JMS OOPEN /OPEN FILE JMP MONI /ERROR OPENING FILE; RETRY CIF CDF 0 /BACK FIELD 0 JMS I USRCALL /RETURN WITH FILE OPEN USRCL, CLA CLL /GOT INSTRUCTION TO CLOSE FILE JMS OCLOSE /CLOSE OUTPUT FILE HLT /ERROR CLOSING FILE CLA CLL CIF CDF 0 JMP RET5 /RETURN TO VAXCOPY TODSK, JMS OCHAR /OUTPUT A CHARACTER HLT /ERROR ON DSK WRITE CIF CDF 0 JMP RET4 /BACK TO VAXCOPY UCAL2, 0 /INQUIRE FOR INPUT FILE CLA CLL JMS I ULOCK 10 MON2, JMS I MONIT 5 0 CLA CLL JMS IOPEN /OPEN INPUT FILE NOP CIF CDF 0 JMP I UCAL2 GDATA, CLA CLL JMS ICHAR /READ ONE CHARACTER FROM OS/8 JMP ENDFOR CIF CDF 0 JMP RET20 /RETURN TO PDPCOPY ENDFOR, SPA HLT CIF CDF 0 JMP EOF ULOCK, 7700 MONIT, 200 PAGE / OS8IO /THE COMPLETE INPUT AND OUTPUT ROUTINES AS USED IN THE OS/8 /SYSTEM WHICH WILL INPUT AND OUTPUT SINGLE ASCII CHARACTERS /(OR BINARY) TO AND FROM FILES SPECIFIED AT RUN-TIME. /COPIED FROM DEC-S8OSSMA-A-D (OS/8 SOFTWARE SUPPORT MANUAL) /26-JUL-73 /SEE APPENDIX F FOR FULL DESCRIPTION /PARAMETER DEFINITION: OUBUF=4000 /OUTPUT BUFFER STARTS AT 04000 OUCTL=4200 /AND IS 2 PAGES LONG OUDEVH=1400 /OUTPUT HANDLER IS LOADED AT 01400. WE /ALLOW 2 PAGE HANDLERS. INBUF=4400 /INPUT BUFFER STARTS AT 04400 INCTL=0200 / TWO PAGES LONG. INRECS=1 /2 PAGES = 1 RECORD INDEVH=1000 /ALLOW 2 PAGE INPUT HANDLER AT 01000 ORIGIN=6600 /THESE SUBROUTINES RESIDE AT 16600 DCB=7760 /DEVICE CONTROL TABLE FIELD 1 *ORIGIN INFLD=INCTL&70 /INPUT BUFFER FIELD OUFLD=OUCTL&70 /OUTPUT BUFFER FIELD IN7400, 7400 IOPEN, 0 /INITIALISE INPUT CLA CMA DCA INCHCT /SET TO READ FROM NEW DEVICE ISZ INEOF /FORCE A NEW INPUT FILE TAD (7617 /POINT TO CD INPUT LIST DCA INFPTR JMP I IOPEN INEOF, 0 INFPTR, 0 INPTR, 0 ICHAR, 0 /INPUT A CHARACTER IN7600, 7600 RDF /SAVE CALLING FIELD FOR RETURN TAD INCDIF DCA INRTRN INCHAR, CDF INFLD /DATA FIELD TO FIELD OF BUFFER ISZ INJMP /3-WAY UNPACKING SWITCH ISZ INCHCT /INPUT BUFFER EXHAUSTED? INJMPP, JMP INJMP /NO..UNPACK THE NEXT CHARACTER TAD INEOF /DID LAST READ GIVE EOF ON THIS DEVICE? SNA CLA JMP INGBUF /NO..CONTINUE READING GETNEW, JMS INNEWF /YES..GET NEXT INPUT FILE IF IT EXISTS JMP EOFERR /TAKE EOF EXIT FROM ICHAR INGBUF, TAD INCTR /INCTR HOLDS THE CURRENT LENGTH OF /THE INPUT FILE. WHEN THE AMOUNT REMAINING /TO READ IS LESS THAN THE SIZE OF THE /INPUT BUFFER, AN EOF IS SIGNALLED. CLL TAD (INRECS SNL DCA INCTR /UPDATE REMAINING LENGTH SZL ISZ INEOF /AND SIGNAL EOF FOR NEXT READ CLL CML CMA RTR /CONSTRUCT A CONTROL WORD FOR THIS RTR RTR TAD (INCTL+1 DCA INCTLW INCDIF, CIF CDF 0 /NOW DO A CALL TO THE INPUT HANDLER CDF 10 /WE ARE IN FIELD 1, HANDLER IN FIELD 0 JMS I INHNDL INCTLW, 0 /INPUT CONTROL WORD INBUFP, INBUF /INPUT BUFFER ADDRESS INREC, 0 /POINTER TO INPUT RECORD JMP INERRX INBREC, TAD INREC TAD (INRECS /UPDATE POINTER INTO FILE DCA INREC TAD INCTLW /NOW COMPUTE THE NUMBER OF CHARACTERS AND IN7600 /IN THIS INPUT BUFFER CLL RAL TAD INCTLW AND IN7600 CMA DCA INCHCT /NEW NUMBER OF CHARACTERS TAD INJMPP /RESET 3-WAY SWITCH DCA INJMP TAD INBUFP DCA INPTR /AND BUFFER POINTER JMP INCHAR /NOW READ THE BUFFER INERRX, ISZ INEOF /SET EOF JUST IN CASE SMA CLA /IF <0, A PHYSICAL ERROR JMP INBREC /EOF ON INPUT INERR, CLA CLL CML RAR /FATAL EOFERR, JMP INRTRN /GET OUT INJMP, HLT /3-WAY UNPACK SWITCH JMP ICHAR1 /GET FIRST OF 3 JMP ICHAR2 /SECOND ICHAR3, TAD INJMPP DCA INJMP /SET FOR FIRST CHAR. NEXT TAD I INPTR /THE THIRD WORD IS MADE OF THE HIGH IN200, AND IN7400 /ORDER BITS OF THE FIRST CLL RTR /TWO. RTR TAD INCTLW RTR RTR ISZ INPTR /POINT TO NEXT WORD JMP INCOMN /GET OUT WITH CHARACTER IN AC ICHAR2, TAD I INPTR AND IN7400 /SAVE HIGH ORDER FOR THIRD WORD DCA INCTLW ISZ INPTR ICHAR1, TAD I INPTR INCOMN, AND (377 TAD (-232 /IS IT ^Z (EOF)? SNA JMP GETNEW /YES..LOOK AT NEXT INPUT TAD (232 ISZ ICHAR /TAKE NORMAL RETURN INRTRN, 0 /CIF CDF N JMP I ICHAR INNEWF, -1 INCHCT=INNEWF CDF 10 TAD (INDEVH+1 /INITIALISE IN CASE WE NEED A NEW DCA INHNDL /MORE INPUT? TAD I INFPTR SNA JMP I INNEWF /NOPE JMS I IN200 /CALL MONITOR TO GET HANDLER 1 INHNDL, 0 HLT /VERY BAD! TAD I INFPTR AND (7760 /GET INPUT FILE LENGTH SZA TAD (17 CLL CML RTR RTR /NEGATIVE OF FILE LENGTH DCA INCTR ISZ INFPTR /POINT TO STARTING BLOCK TAD I INFPTR DCA INREC /STORE IN HANDLER CALL ISZ INFPTR /NEXT INPUT DCA INEOF /CLEAR EOF FLAG ISZ INNEWF JMP I INNEWF INCTR=IOPEN PAGE OOPEN, 0 /OPEN OUTPUT FILE OU7600, 7600 TAD OU7601 /POINT TO OUTPUT FILE NAME IN CD AREA DCA OUBLK TAD (OUDEVH+1 DCA OUHNDL /INITIALISE OUTPUT DEVICE HANDLER TAD I OU7600 /PICKUP OUTPUT DEVICE NUMBER AND (17 SNA /IS THERE ONE? JMP ONOFIL /NO..INHIBIT OUTPUT JMS I (200 /FETCH OUTPUT HANDLER 1 OUHNDL, 0 HLT /BAD THING OUENTR, TAD I OU7600 JMS I (200 /ENTER THE OUTPUT FILE 3 OUBLK, 7601 /GETS STARTING BLOCK OF HOLE OUELEN, 0 /GETS SIZE OF HOLE AVAILABLE JMP OEFAIL /FAILURE. SEE WHAT WE DID. DCA OUCCNT /CLEAR CLOSING LENGTH DCA I (OUTINH /CLEAR OUTPUT INHIBIT JMS I (OUSETP /SET UP POINTERS ISZ OOPEN OORETN, CDF CIF 10 JMP I OOPEN /RETURN O.K. OEFAIL, TAD I OU7600 /IF LENGTH = 0, GIVE OPEN ERROR AND (7760 /IF NOT, MAKE IT 0 AND TRY AGAIN SNA CLA JMP ONTERR /WAS 0. FAILED. TAD I OU7600 AND (17 /MAKE IT 0 DCA I OU7600 JMP OUENTR /AND TRY AGAIN ONTERR, CLA CLL CML RAR JMP OORETN ONOFIL, ISZ I (OUTINH /INHIBIT OUTPUT JMP OORETN OUTDMP, 0 /DUMP OUTPUT BUFFER DCA OUCTLW /STORE CONTROL WORD CDF 10 TAD I (OUTINH /IS OUTPUT INHIBITED? SZA CLA JMP OUNOWR /YEP TAD OUCCNT /IF THIS IS FIRST WRITE, START THE SNA /SEARCH FORWARD ON DECTAPE ISZ OUCTLW TAD OUBLK /GET STARTING BLOCK OF THIS DCA OUREC /TRANSFER TAD OUCTLW CLL RTL RTL RTL /COMPUTE # OF RECORDS TO OUTPUT AND (17 TAD OUCCNT /UPDATE CLOSING LENGTH DCA OUCCNT TAD OUCCNT /SEE IF CLOSING LENGTH WILL BE CLL CML /BIGGER THAN OUTPUT HOLE TAD OUELEN SNL SZA CLA JMP I OUTDMP /WILL BE TOO BIG OUCDIF, CIF CDF 0 CDF 10 JMS I OUHNDL /DO THE WRITE OUCTLW, 0 OUBUF OUREC, 0 SKP /ERROR OUNOWR, ISZ OUTDMP /TAKE NORMAL RETURN JMP I OUTDMP PTP=0020 OCLOSE, 0 /CLOSE OUTPUT FILE CDF 10 TAD I (OUTINH /IF OUTPUT INHIBITED, CLOSE IS A NOP SZA CLA JMP OCISZ /A NOP JMS I (OTYPE /DETERMINE IF OUTPUT IS TO PTP AND (770 /IF IT IS, DON'T OUTPUT A ^Z TAD (-PTP SZA CLA TAD (232 /NOT PTP, OUTPUT ^Z AS EOF JMS I (OCHAR JMP OCRET /ERROR RETURN JMS I (OCHAR /FILL WITH 0 CHARACTERS JMP OCRET FILLIP, JMS I (OCHAR /FILL TO BOUNDARY WITH 0 JMP OCRET JMS I (OTYPE /IF OUTPUT IS DIRECTORY DEVICE, FILL SPA CLA /WHOLE RECORD, ELSE HALF RECORD TAD (100 TAD (77 AND I (OUDWCT /ARE WE UP TO BOUNDARY YET? SZA CLA JMP FILLIP /NO TAD I (OUDWCT TAD (OUCTL&3700 /IS THERE A FULL WRITE LEFT? SNA JMP NODUMP /YES, BUT DON'T DO IT, AS ^Z IS OUT TAD (4000+OUFLD JMS OUTDMP /DUMP LAST BUFFER JMP OCRET NODUMP, TAD I OU7600 /GET DEVICE NUMBER JMS I (200 /CLOSE THE OUTPUT FILE 4 OU7601, 7601 /POINTER TO FILE NAME OUCCNT, 0 /CLOSING FILE LENGTH HERE SKP /ERROR OCISZ, ISZ OCLOSE /NORMAL RETURN OCRET, CDF CIF 10 /RESTORE CALLING FIELDS JMP I OCLOSE PAGE OUSETP, 0 /INITIALISE OUTPUT POINTERS TAD (OUCTL&3700 CIA DCA OUDWCT /DOUBLE WORD OUTPUT COUNT TAD (OUBUF /INITIALISE WORD POINTER DCA OUPTR TAD OUJMPE DCA OUJMP /3-WAY UNPACK SWITCH JMP I OUSETP OCHAR, 0 /OUTPUT CHARACTER ROUTINE AND (377 /ISOLATE EIGHT BITS DCA OUTEMP RDF /GET FIELD WE WERE CALLED TAD (CIF CDF 0 /FROM DCA OUCRET TAD OUTINH /OUTPUT INHIBITED? SZA CLA JMP OUCOMN /YES, NOP. OUCHAR, CDF OUFLD /GOTO DATA FIELD OF BUFFER ISZ OUJMP /BUMP CHARACTER SWITCH OUJMP, HLT /GETS JMP.,JMP+1, ETC JMP OCHAR1 JMP OCHAR2 OCHAR3, TAD OUTEMP /THIRD CHARACTER CLL RTL /HIGH ORDER BITS GO INTO THE RTL /HIGH ORDER 4 BITS OF THE AND (7400 /FIRST OF TWO WORDS TAD I OUPOLD DCA I OUPOLD TAD OUTEMP /THE SECOND DOUBLE WORD GETS CLL RTR /THE LOW ORDER BITS OF RTR /THE THIRD CHARACTER RAR AND (7400 TAD I OUPTR DCA I OUPTR TAD OUJMPE /RESET CHARACTER SWITCH DCA OUJMP ISZ OUPTR /POINT TO NEXT BUFFER WORD ISZ OUDWCT /BUMP DOUBLE COUNT AFTER /3 CHARS. JMP OUCOMN /GET OUT TAD (OUCTL /READY TO OUTPUT A BUFFER JMS I (OUTDMP /OUTPUT IT JMP OUCRET /AN ERROR JMS OUSETP /RESET OUTPUT POINTERS JMP OUCOMN OCHAR2, TAD OUPTR /POINT TO FIRST DOUBLE WORD DCA OUPOLD ISZ OUPTR /POINT OUPTR TO SECOND OCHAR1, TAD OUTEMP DCA I OUPTR OUCOMN, ISZ OCHAR /NORMAL EXIT OUCRET, HLT JMP I OCHAR OUTEMP, 0 OUPOLD, 0 OUPTR, 0 OUJMPE, JMP OUJMP OUDWCT, 0 OUTINH, 0 OTYPE, 0 /OTYPE LOOKS AT THE OUTPUT DEVICE # RDF TAD (CIF CDF 0 DCA OTRTN CDF 10 TAD I (7600 /AND LOOKS UP THE DCB WORD FOR AND (17 /THAT DEVICE TAD (DCB-1 DCA OUTEMP TAD I OUTEMP /GET DCB ENTRY OTRTN, HLT JMP I OTYPE PAGE /THIS IS A TEST PROGRAM WHICH TRANSFERS ONE FILE TO ANOTHER / FIELD 1 *2000 JMS I (7700 /LOCK MONITOR INTO CORE 10 CALLCD, JMS I (200 /CALL THE COMMAND DECODER 5 0 JMS I (IOPEN /SETUP INPUT POINTERS JMS I (OOPEN /PEN OUTPUT FILE SMA CLA /ERROR. IF AC<0, IT WAS FATAL. JMP OK /NON FILE-STRUCTURED OUTPUT JMS TERR TEXT /OPEN FAILED/ OK, JMS I (ICHAR /READ A CHARACTER JMP TSTEOF /ERROR, SEE IF EOF SNA /IGNORE BLANKS JMP OK JMS I (OCHAR /AND OUTPUT THE CHARACTER JMP OUTERR JMP OK /CONTINUE TILL EOF TSTEOF, SMA CLA /WAS IT FATAL? JMP CLOSE /NO..EOF.. CLOSE OUTPUT JMS TERR TEXT /READ ERROR/ CLOSE, JMS I (OCLOSE JMP CLERR /FILE CLOSE FAILED JMP CALLCD /NEW INPUT OUTERR, JMS TERR TEXT /OUTPUT ERROR/ CLERR, JMS TERR /CLOSE FAILURE TEXT /CLOSE FAILED/ TERR, 0 /ROUTINE TO PRINT ERROR MESSAGES TAD I TERR RTR;RTR;RTR JMS TYPIT /TYPE THE CHARACTER TAD I TERR JMS TYPIT ISZ TERR JMP TERR+1 TYPIT, 0 AND (77 /ISOLATE THE CHARACTER SNA JMP CRLF /0 TERMINATES IT TAD (300 JMS TTYOUT JMP I TYPIT CRLF, TAD (215 JMS TTYOUT TAD (212 JMS TTYOUT JMP CALLCD TTYOUT, 0 TLS TSF JMP .-1 CLA JMP I TTYOUT $