/XMODEM TRANSMIT OS/8 DEVICE HANDLER /************************************************************** /THIS 2-PAGE OS/8 DEVICE HANDLER TRANSMITS DATA VIA A KL8-E- /TYPE SERIAL PORT, USING THE XMODEM PROTOCOL. THERE ARE TWO /CO-RESIDENT HANDLERS HERE: XMT0 TRANSMITS DATA AS IT IS IN /THE OS/8 BUFFER. XMTA (INTENDED FOR OS/8 ASCII FILES) STRIPS /THE MOST-SIGNIFICANT (PARITY) BIT FROM EVERY 8-BIT BYTE. /LIMITATIONS: / 1. TRANSFERS MUST BE AN EVEN NUMBER OF 128-WORD OS/8 RECORDS. / (ONE OS/8 DATA BLOCK IS ALWAYS 2 RECORDS ANYWAY.) / 2. CRC ERROR CHECKING IS NOT SUPPORTED / 3. RETRIES ARE UNBOUNDED. (THE USER CAN TYPE ^C TO ABORT) /************************************************************** /FOR DEVICE HANDLER DOCUMENTATION, SEE THE FOLLOWING: / OS/8 SOFTWARE SUPPORT MANUAL (DEC-S8-OSSMB-A-D), / CHAPTER 4: USING DEVICE HANDLERS / SECTION 5.1: WRITING DEVICE HANDLERS / OS/8 HANDBOOK, APRIL 1974 (DEC-S8-0SHBA-A-D) / PAGES 2-56 TO 2-61: BUILD HANDLER DEVICE FORMAT /************************************************************** /REVISION HISTORY / 1.00 17 AUGUST 2020 M. EBERHARD / CREATED / 1.01 4 SEPTEMBER 2020 M. EBERHARD / ADD ASCII DATA HANDLER, XMTA, TO STRIP THE 8-BIT MSB'S / (FOR HANDLING OS/8 ASCII FILES, WHICH GENERALLY HAVE THE / MSB SET). RENAME THE NORMAL HANDLER "XMT0" /************************************************************** XMTVERSION=0101 /OCTAL VERSION DEVTYPE=0550 /DEVICE TYPE, 0NN0, /NN BETWEEN 40 AND 77 /(SEE DEC-S8-0SHBA-A-D PAGE 2-59) /------------------ /XMODEM DEFINITIONS /------------------ XTVAL=4170 /-TIMEOUT TO RECEIVE ACK OR NAK / 7737 FOR A 1-SECOND TIMEOUT / 7537 FOR A 5-SECOND TIMEOUT / 6074 FOR A 30-SECOND TIMEOUT / 4170 FOR A 60-SECOND TIMEOUT / 2265 FOR A 90-SECOND TIMEOUT /-------------------------------- / TRANSFER PORT DEFINITIONS /DTPORT MUST BE OF THE FORM 0NN0, /WHERE N IS AN OCTAL DIGIT /-------------------------------- DTPORT=0300 /2ND KL8-E /DTPORT=0400 /2ND "TELETYPE" ON THE PDP-8 SIMULATOR /CALCULATE THE SPECIFIED KL8-E IOT'S FOR THE TRANSFER PORT DTPKSF=6001+DTPORT /SKIP ON INPUT FLAG DTPKCC=6002+DTPORT /CLEAR INPUT FLAG DTPKRB=6006+DTPORT /READ INPUT BUFFER, CLEAR FLAG DTPTFL=6010+DTPORT /SET OUTPUT FLAG DTPTSF=6011+DTPORT /SKIP ON OUTPUT FLAG DTPTLS=6016+DTPORT /WRITE TO OUTPUT, CLEAR FLAG /********************************** /* DEVICE HANDLER HEADER BLOCK * /* SEE DEC-S8-0SHBA-A-D PAGE 2-57 * /********************************** *0 -2 /-NUMBER OF DEVICE HANDLERS HERE /HANDLER 1: 8-BIT DATA DEVICE XMT /DEVICE GROUP NAME DEVICE XMT0 /OS/8 DEVICE NAME (8-BIT HANDLER) DEVTYPE+1000 /DCB WORD: NOT FILE-STRUC'D, /WRITE-ONLY,DEVICE TYPE XMT0&177+4000 /2-PAGE HANDLER, /ENTRY POINT (MUST BE>24) /(SEE DEC-S8-0SHBA-A-D PAGE 2-60) ZBLOCK 2 /2 WORDS MUST BE 0 /NANDLER 2: 7-BIT DATA DEVICE XMT /DEVICE GROUP NAME DEVICE XMTA /OS/8 DEVICE NAME (7-BIT HANDLER) DEVTYPE+1000 /DCB WORD: NOT FILE-STRUC'D, /WRITE-ONLY,DEVICE TYPE XMTA&177+4000 /2-PAGE HANDLER, /ENTRY POINT (MUST BE>24) /(SEE DEC-S8-0SHBA-A-D PAGE 2-60) ZBLOCK 2 /2 WORDS MUST BE 0 /*********************** /* DEVICE HANDLER BODY * /*********************** *200 /(SEE DEC-S8-0SHBA-A-D PAGE 2-57) /VARIABLES TEMP1, /(REUSE) RXTMRH, 0 /TIMEOUT TIMER HIGH WORD XRECCNT,0 /-XMODEM RECORD COUNT BUFADR, 0 /BUFFER ADDRESS FROM CALL BPTRA, 0 /OOINTS TO BUFPTR B123A, 0 /POINTS TO BUF123 /CONSTANTS C0070, 0070 BWCMSK, 3700 /MASK FOR BUFFER WORD COUNT PMASK, 0177 /PARITY MASK NCTRLC, -3 /-ASCII ^C EOT, 4 /XMODEM EOT NACK, -6 /-XMODEM ACK ACKMNK, 6-25 /XMODEM ACK - XMODEM NAK TIMOUT, XTVAL /TIMEOUT INITIALIZER CIFCDF, CDF CIF 0 /PROTOTYPE FOR CDF CIF INSTR. /*** HANDLER INITIALIZATION *********************** /THIS SUBROUTINE GETS CALLED ONLY ON THE FIRST CALL /TO THE HANDLER, WHEN THE OS/8 RECORD NUMBER IS 0 /ON ENTRY: / AC=0 / TEMP1=7777 IF ENTRY FROM XMTO / =0177 IF ENTRY FROM XMTA / DATA FIELD IS SET TO 0 /************************************************** DELTA, XRECNO-IRET /BE POSITION-INDEPENDENT INIT, 0 /RETURN ADDRESS /POINT TO 2ND PAGE VARIABLE TABLE TAD INIT /GET PAGE ADDRESS TAD DELTA /POINT TO XRECNO DCA B123A /TEMP USE B123A AS POINTER /INITIALIZE POINTERS TO 2ND PAGE VARIABLES /AND INITIALIZE A FEW OF THESE VARIABLES DCA I B123A /XRECNO=0: START WITH RECORD 1 ISZ B123A /POINT TO DMASK TAD TEMP1 /DATA MASK IN PAGE 1 DCA I B123A /..BELONGS IN PAGE 2 ISZ B123A /POINT TO BUFPTR TAD B123A DCA BPTRA /SET UP POINTER TO BUFPTR ISZ B123A /NOW POINTS TO BUF123 /INITIALIZE TRANSFER PORT DTPTFL DTPKCC /WAIT FOR INITIAL NAK TO BEGIN TRANSFER. /ABORT WITH FATAL ERROR IF TIMEOUT ZSNAKW, JMS GETACK /GET&TEST A TRANSFER PORT BYTE SZL CLA /L=0 IF ACK, 1 IF NAK JMP I INIT /NAK: GO! JMP ZSNAKW /ACK: IGNORE IT /*** EXIT ******************************* /SEND EOT AND WAIT FOR ACK IN RESPONSE. /RESEND EOT IF NAK WHILE WAITING FOR ACK. /NORMAL-RETURN WHEN ACK ARRIVES. /(USER CAN ^C TO ABORT) /ON ENTRY: / AC=0 /**************************************** XCLOSE, DTPTSF /DEVICE READY? JMP .-1 /N: KEEP WAITING TAD EOT /SEND XMODEM EOT DTPTLS ABORT, 7600 /EXIT TO MONITOR IN FIELD 0 /(ALSO ALTERNATE CLA) JMS GETACK /GET & TEST TRANSFER PORT CHR SZL /L=0 IF ACK, 1 IF NAK JMP XCLOSE /NAK: RESEND EOT, TRY AGAIN /ACK RECEIVED /FALL INTO XMTEXT FOR NORMAL EXIT /*** EXIT ************************************* /ALL DATA SENT. RESTORE FIELD AND NORMAL-RETURN /ON ENTRY: / AC=0 / XMT POINTS TO OS/8 RECORD NUMBER /********************************************** XMTEXT, ISZ XMT /POINT TO NORMAL RETURN SKP /SKIP INTO ERREXT FOR NORMAL EXIT /*** EXIT ***************************** /HARD ERROR EXIT. ERROR-EXIT WITH AC=-1 /ON ENTRY: / XMT POINTS TO OS/8 RECORD NUMBER /************************************** ERREXT, STA /AC=-1 FOR HARD ERROR ISZ XMT /ERROR RETURN FOR ERREXT RSTFLD, HLT /(GETS OVERWRITTEN) RESTORE FIELDS JMP I XMT /AND RETURN /***************************** /* XMT0 HANDLER ENTRY POINT * /* NORMAL 8-BIT DATA HANDLER * /***************************** XMT, /COMMON POINTER FOR RETURN ETC. XMT0, XMTVERSION /THIS CODE'S VERSION NUMBER /IN RETURN ADDRESS SLOT STA /12-BIT MASK: 7777 JMP XMTC /**************************** /* XMTA HANDLER ENTRY POINT * /* 7-BIT ASCII DATA HANDLER * /**************************** XMTA, XMTVERSION /THIS CODE'S VERSION NUMBER /IN RETURN ADDRESS SLOT CLA TAD XMTA /SET UP POINTER FOR CALLING DCA XMT /..PARAMETERS, RETURN ADDRESSES TAD PMASK /7-BIT MASK: 0177 XMTC, DCA TEMP1 /DATA MASK IN THIS PAGE FOR NOW /------------------------------- /PARSE HANDLER INPUT PARAMETERS /(SEE DEC-S8-OSSMB-A-D PAGE 5-1) /------------------------------- STL CLA RAR /AC=4000 TAD I XMT /GET FUNCTION WORD, R/W BIT TO LINK AND BWCMSK /EXTRACT NUMBER OF WORDS TO TRANSFER BSW /BITS 1-5 INTO BITS 7-11 DCA XRECCNT /OS/8 128-WORD RECORD COUNT FOR NOW RDF /GET THE USER'S DATA FIELD TAD CIFCDF /FORM OUR EXIT CIF CDF DCA RSTFLD /STORE IN EXIT ROUTINE TAD I XMT /GET FUNCTION WORD AGAIN AND C0070 /ISOLATE BUFFER'S FIELD TAD CDFOP /FORM CDF BUFFER'S FIELD DCA XMTCDF /STORE WHERE IT WILL BE USEFUL ISZ XMT /POINT TO BUFFER ADDRESS TAD I XMT /GET BUFFER ADDRESS DCA BUFADR /UNTIL WE CAN REACH FIELD 0 ISZ XMT /POINT TO OS/8 BLOCK NUMBER SNL CLA /LINK=1 MEANS OUTPUT JMP ERREXT /INPUT IS AN ERROR /---------------------------------------- /SET UP FOR NEW TRANSFER IF OS/8 RECORD 0 /(SEE DEC-S8-OSSMB-A-D PAGE 5-1 ITEM 2) /ON ENTRY: / AC=0 / XMT POINTS TO OS/8 RECORD NUMBER /---------------------------------------- TAD I XMT /GET OS/8 RECORD NUMBER CDFOP, CDF 0 /THE FOLLOWING OPS ARE IN FIELD 0 /ALSO PROTOTYPE FOR CDF NN SNA CLA /RECORD 0 MEANS INITIALIZE FIRST JMS INIT /DO INITIAL SETUP IRET, /----------------------------------- /SET UP FOR EACH CALL TO THE HANDLER /NOW THAT WE CAN ACCESS FIELD 0, AND /WE HAVE POINTERS TO PAGE 2 /ON ENTRY: / AC=0 / BUFADR=OS/8 BUFFER ADDRESS /----------------------------------- TAD BUFADR /OS/8 BUFFER ADDRESS DCA I BPTRA /..INTO 2ND PAGE DCA I B123A /INIT 1-OF-3 BUFFER BYTE COUNTER /----------------------------------------------------------- /COMPUTE XMODEM RECORD COUNT = -(OS/8 RECORD COUNT)*3/2 /ALSO CHECK FOR ILLEGAL ODD NUMBER OF OS/8 128-WORD RECORDS. /BITS 1-5 & 9-11 ALL 0 MEANS CLOSE. (WE DON'T CHECK BITS /9-11 HERE. ONLY 0 IS MEANINGFUL ANYWAY.) /(SEE DEC-S8-OSSMB-A-D PAGE 4-3 ITEM 5 AND PAGE 5-3 ITEM 12) /----------------------------------------------------------- TAD XRECCNT /OS/8 128-WORD RECORD COUNT SNA JMP XCLOSE /XRECCNT=0 MEANS CLOSE HANDLER CLL RAR /DIVIDE BY 2. L SET IF ODD NUMBER SZL JMP ERREXT /ODD IS A FATAL ERROR TAD XRECCNT /AC=(OS/8 RECORD COUNT)*3/2 /L=0 STILL CIA /-XMODEM RECORD COUNT DCA XRECCNT XMTCDF, HLT /(GETS OVERWRITTEN) SET DATA FIELD /FOR OS/8 BUFFER /---------------------------------- /SEND A COMPETE XMODEM RECORD / L=0 TO SEND THE NEXT RECORD / L=1 TO RESEND THE PREVIOUS RECORD /---------------------------------- RECLUP, JMS XSENDR /------------------------------------------ /WAIT FOR ACK, WITH TIMEOUT / ACK: SEND THE NEXT RECORD IF WE HAVE ONE / NAK: RESEND THE SAME RECORD / ANYTHING ELSE: IGNORE /AC=0 HERE /------------------------------------------ XSAWAT, JMS GETACK /GET & TEST TRANSFER PORT CHR SZL /L=0 MEANS ACK, 1 MEANS NAK JMP RECLUP /WITH L=1 TO FORCE RETRY /------------------------------------------- /GOT AN ACK. SEND THE NEXT XMODEM RECORD, OR /RETURN FROM HANDLER IF THE BUFFER IS EMPTY /AC=0 AND L=0 HERE /------------------------------------------- ISZ XRECCNT /MORE IN BUFFER? JMP RECLUP /Y: SEND ANOTHER XMODEM RECORD JMP XMTEXT /DONE: NORMAL RETURN2 /*** SUBROUTINE ************************************* /RECEIVE A BYTE FROM THE TRANSFER PORT WITH TIMEOUT. /TEST FOR NAK OR ACK, WHILE CHECKING FOR ^C /FROM THE USER. IGNORE EVERYTHING EXCEPT ACK AND NAK. / /ON ENTRY / AC=0 / RXTMRL IS RANDOM. (WHO CARES?) /ON RETURN: / AC=0 / L=0 IF ACK RECEIVED / L=1 IF NAK RECEIVED /ABORT WITH HARD ERROR IF TIMEOUT /**************************************************** GETACK, 0 /(RETURN ADDRESS) TAD TIMOUT /GET TIMEOUT VALUE DCA RXTMRH /SET UP TIMER /TEST FOR TRANSFER PORT BYTE, KEEP WAITING IF NOT GAWLUP, DTPKSF /(2,6)TEST FOR BYTE JMP GAWAIT /(1.2)WAIT FOR INPUT /GET TRANSFER PORT BYTE /AC=0 HERE DTPKRB /TEST FOR ACK AND NAK, RETURN AS INDICATED, /IGNORE OTHER CHRS, WITH TIMEOUT TAD NACK /ACK? CLL /IN CASE OF ACK SNA JMP I GETACK /ACK: RETURN WITH L=0 TAD ACKMNK /ASCII ACK-ASCII NAK /NAK WILL SET L SNA CLA /IGNORE IF NEITHER ACK NOR NAK JMP I GETACK /NAK: RETURN WITH L=1 /NO BYTE YET, OR NEITHER ACK NOR NAK. BUMP TIMER, /KEEP WAITING. RXTMRL WILL OVERFLOW EVERY 32 MS GAWAIT, ISZ RXTMRL /(2.6)INNER LOOP JMP GAWLUP /(1.2) /EVERY 32 MSEC, TEST FOR ^C FROM USER AND ABORT IF SO /AC=0 HERE KRS /READ STATIC FROM KEYBOARD AND PMASK /STRIP PARITY TAD NCTRLC /IS IT ^C? SNA CLA JMP I ABORT /YES - EXIT TO MONITOR /BUMP HIGH TIMER WORD, TEST FOR TIMEOUT. ERROR-EXIT IF SO ISZ RXTMRH /TIMEOUT? JMP GAWLUP /N: KEEP WAITING /TIMEOUT: ABORT HANDLER JMP ERREXT /*** SUBROUTINE**************************************** /SEND A COMPLETE XMODEM RECORD / / THIS SUBROUTINE IS STRATEGICALLY PLACED TO SPAN THE / PAGE BOUNDARY AFTER THE "TAD XSENDR" INSTRUCTION, TO / KEEP THIS HANDLER POSITION-INDEPENDENT. THE ASSEMBLER / MAY NOT REPORT AN ERROR IF THE SPAN IS NOT POSITIONED / CORRECTLY. (CHECK FOR PAGE OVERLAP MANUALLY.) /ON ENTRY: / AC=0 / BUFPTR AND BUF123 POINT TO THE NEXT BUFFER LOCATION / XRECNO=THE PREVIOUS XMODEM RECORD NUMBER / L=0 FOR NEXT RECORD / L=1 TO RETRY PREVIOUS RECORD / IF L=1 THEN SAVPTR=BUFPTR / AND SAV123=BUF123 /****************************************************** *376 RXTMRL, /(REUSE) TIMEOUT TIMER LOW WORD XSENDR, 0 /RETURN ADDRESS (IN 1ST PAGE) TAD XSENDR /GET RETURN ADDRESS /---PAGE BREAK HERE--- DCA XSRRET /CREATE RETURN ADDRESS /IN 2ND PAGE /---------------------- /RETRY PREVIOUS RECORD? /---------------------- SZL JMP XRETRY /L SET MEANT RETRY /------------------------------------- /SAVE BUFFER LOCATION FOR XMODEM RETRY /(EACH PAIR OF BUFFER WORDS BECOMES /3 XMODEM BYTES. BUF123 TELLS US WHICH /OF THE 3 BYTES TO USE.) /------------------------------------- TAD BUFPTR DCA SAVPTR TAD BUF123 DCA SAV123 /------------------ /NEXT XMODEM RECORD /------------------ ISZ XRECNO /NEXT XMODEM RECORD NUMBER NOP /IN CASE XRECNO WRAPS /-------------------------------------------- /ENTER HERE IF NAK RECEIVED: BACK UP THE /BUFFER POINTERS AND RESEND THE XMODEM RECORD /ON ENTRY: / AC=0 /-------------------------------------------- XRETRY, TAD SAVPTR DCA BUFPTR TAD SAV123 DCA BUF123 /---------------------------------------------- /FOUR STEPS TO CREATE AND SEND AN XMODEM RECORD /ON ENTRY: / XRECNO=XMODEM RECORD NUMBER / BUFPTR=ADDRESS OF NEXT BUFFER WORD / BUF123=STARTING 8-BIY BYTE LOCATION / 0 FOR 1ST BYTE / 1 FOR 2ND BYTE / -1 FOR 3RD BYTE /---------------------------------------------- /---------------------------------- /1. SEND THE RECORD HEADER, AND SET / UP FOR THE DATA LOAD IN BETWEEN / RECORD HEADER: / SOH / RECORD NUMBER / COMPLEMENTED RECORD NUMBER /---------------------------------- CLA IAC /SEND SOH (ASCII SOH = 1) JMS TPOUT TAD XBYTES /-BYTES PER XMODEM RECORD DCA XBCOUNT /SET UP BYTE COUNT TAD XRECNO /SEND RECORD NUMBER JMS TPOUT DCA CHKSUM /INITIALIZE CHECKSUM TAD XRECNO /SEND INVERTED RECORD NUMBER CMA JMS TPOUT /------------------------------------------------------------ /2. LOOP TO SEND THE NEXT 128*2/3 12-BIT BUFFER -WORDS AS 128 / 8-BIT XMODEM BYTES, COMPUTING THE CHECKSUM AS WE GO. EACH / PAIR OF 12-BIT BUFFER WORDS BECOMES 3 XMODEM BYTES, / ENCODED AS FOLLOWS (DEC-S8-OSSMB-A-D PAGE 5-3, ITEM 11): / / 0 3 4 11 / ------------ ---------------------------- / WORD 1 |BYTE 3 <0:3>| BYTE 1 <0:7> | / ------------ ---------------------------- / WORD 2 |BYTE 3 <4:7>| BYTE 2 <0:7> | / ------------ ---------------------------- /ON ENTRY: / AC=0 / CHKSUM=0 / XBCOUNT=-128 / BUFPTR=ADDRESS OF NEXT BUFFER WORD / BUF123=0 FOR BYTE 1 / 1 FOR BYTE 2 / -1 FOR BYTE 3 /TRASHES TEMP2 /------------------------------------------------------------ XSDLUP, TAD BUF123 ISZ BUF123 /WHICH 8-BIT BYTE NEXT? JMP XSD1 /WAS -1: SEND BYTE 3 /BUF123 WAS -1: SEND BYTE 3 /AC=-1 HERE TAD BUFPTR /DECREMENT BUFPTR DCA TEMP2 /POINT TO 1ST OF 2 BUFFER WORDS TAD I TEMP2 /GET 1ST OF 2 BUFFER WORDS AND C7400 /PEEL OFF BITS <0:3> DCA TEMP2 /TEMP2<0:3> = BYTE 3<0:3> TAD I BUFPTR /GET 2ND OF 2 BUFFER WORDS AND C7400 /PEEL OFF BITS <0:3> CLL RTR CLL RTR /AC<4:7> = BYTE 3<4:7> TAD TEMP2 /COMBINE: AC<0:7> = BYTE 3<0:7> CLL RTR /PUSH INTO BITS 4:11 CLL RTR /AC<4:11>=BYTE 3<0:7> JMP XSD2 /AC=8-BIT BYTE 3 /FIX BUF123 FOR THE NEXT BYTE: /CURRENT BYTE1: AC=0, BUF123 IS AND SHOULD BE 1 /CURRENT BYTE2: AC=1, BUF123 IS 2 AND SHOULD BE -1 XSD1, CLL CML CMA IAC /BYTE 1: AC=0, L=0 /BYTE 2: AC=-1, L=1 SZA DCA BUF123 /BUF123=-1: BYTE 3 NEXT /GET A BUFFER WORD FOR BYTES 1 AND 2 /NOTE THAT THE SERIAL PORT IGNORES BITS <0:3> TAD I BUFPTR /L=1 IFF THE NEXT BYTE WILL BE BYTE 3 /DON'T ADVANCE THE ADDRESS POINTER IF SO SNL /DON'T BUMP BUFPTR IF BYTE 3 IS NEXT XSD2, ISZ BUFPTR /POINT TO NEXT PAIR OF BUFFER WORDS C7400, 7400 /NOP (BUFPTR COULD WRAP) /AC<4:11>=NEXT 8-BIT XMODEM BYTE TO SEND /COMPUTE CHECKSUM AND SEND THE XMODEM BYTE AND DMASK /STRIP PARITY IF XMTA DCA TEMP2 /TEMP2<4:11> = BYTE TO SEND TAD TEMP2 TAD CHKSUM /UPDATE CHECKSUM DCA CHKSUM TAD TEMP2 /NOTE: CALLING TPOUT TRASHES TEMP2 JMS TPOUT /SEND BYTE (AC<0:3> IGNORED) /LOOP TO SEND ALL 128 BYTES OF XMODEM RECORD DATA ISZ XBCOUNT JMP XSDLUP /LOOP FOR ALL DATA WORDS /-------------------- /3. SEND THE CHECKSUM / AC=0 HERE /-------------------- TAD CHKSUM JMS TPOUT /BITS <0:3> IGNORED BY PORT /-------------------------------- /4. RETURN TO WAIT FOR THE ACK /-------------------------------- JMP I XSRRET XSRRET, 0 /RETURN ADDRESS IN 2ND PAGE /*** SUBROUTINE *************************** /SEND BYTE IN AC<4:11> TO THE TRANSFER PORT /ON EXIT: / AC=0 /****************************************** TEMP2, /(REUSE) TPOUT, 0 /(RETURN ADDRESS) DTPTSF /DEVICE READY? JMP .-1 /N: KEEP WAITING DTPTLS /SEND BYTE TO DEVICE XBYTES, -200 /7600=-200=-BYTES PER XMODEM RECORD /ALSO ALTERNATE CLA INSTRUCTION JMP I TPOUT /RETURN /--------- /VARIABLES /--------- XBCOUNT,0 /XMODEM DATA BYTE COUNTER CHKSUM, 0 /RECORD CHECKSUM SAVPTR, 0 /BUFPTR FOR XMODEM RETRY SAV123, 0 /BUF123 FOR XMODEM RETRY /THESE 4 VARIABLES MUST BE IN THIS ORDER XRECNO, 0 /XMODEM RECORD NUMBER DMASK, 0 /DATA MASK FOR PARITY STRIPPING BUFPTR, 0 /POINTER INTO OS/8 BUFFER BUF123, 0 /3-BYTE COUNTER $