SAVE "WXMODEM.SRC",8; OPEN 2,8,2,"CRC.C800,P,WE 700S(;".OPT O2n2; XMODEM PROCOL 4.1<; CRC WXMODEM ADDED 1987F; BY KERMIT R. WOODALLP;Z; COMMODE 64d;n; THIS REQUIRES CALLING x; PROGRAM THE FILE AS+ ; FILE #8 MODEM AS #5, N ; CALL THE APPROPRIATE ROUTINEm ; TURN TRANSLATI WHEN ; NEEDED. WHEN NEEDED ALL THE ; MESSAGES CAN BE SUPPRESSED ; BBS USEAGE. OPTI TURN ; DLE SCREENING ADDED SO THAT CBM ; USERS CAN DL OVER PCPURSUIT,? ; THIS OPTI IS RECOMMED ASd ; A SIMPLE SOLUTI THE PROBLEM ; OF DLS OVER PCPURSUIT. ; ; ; XMODEM COPYRIGHT (C) 1985 BY ; MICROTECHNIC SOLUTIS, INC. ; ALL RIGHTS RESERVED "; ,; CRCXMODEM WXMODEM ADDITIS? 6; COPYRIGHT (C) 1987 BY THE AUTH:f @; KERMIT R. WOODALL,2600 JDAN CT.} J; G AL, VA 23060 T; ^;" PLINK ID: KERMIT h;" QLINK ID: CURVE r; |; CALL...THE FROG PD BBS ; (804) 7966734 ; 24HRS ;< ; MANY THANKS M BROWN THEa ; FIRST CRC CALCULATI ROUTINE ; SCOTT MCGINNIS (TAR) ; LAINING CRC WXMODEM THEY ; IN A WAY EVEN I COULD UNDERSD. ; OTHER THANKS THE PEOPLE WHO ; DEVELOPED THESE PROCOLS, THE< ; COMMODE CLUB STAFF PLINK WHO_ ; PROVIDED SUPPT SUGGESTIS ; DURING DEVELOPMENT 'S ; ALL THE LITTLE PEOPLE ; OUT THERE O! OH, HI MOM! ; &; THIS PROCOL MAY BE USED IN ANY0; PROGRAM, TERMINALS, BBS'S 3:; WHATEVER. I DO ASK THAT ANYEUD; UG THIS MACHINE LANGUAGE |N; PLEASE PROVIDE ME WITH CREDIT INX; YOUR PROGRAM MY ML & A Eb; COPY OF YOUR PROGRAM ( ANYl; UPGRADES) CALL IT..."SHAREDWAREZ"v; GRIN...I ENCOURAGE MANY PEOPLE4; USE THIS MACHINE LANGUAGE Y; MAKE TELECOMMUNICATIS BETTER!_;; MAY BE USED IN ANY COMMERCIAL,; SHAREWARE PUBLIC DOMAIN PRGS!; $C800;CHKIN $FFC6CHKOUT $FFC9CHROUT $FFD2  $FFC3CHN $FFCC-IN $FFE4= SS $FFB7M $FFE1^ OUT $BDCDj*SOH 1v4EOT 4>ACK 6HDLE 16RDC1 17 ;X\DC3 19 ;XfNAK 21pSYN 22zCAN 24JFY $A1MOVE $C3RIDBE $029B!RIDBS $029C4ENABLE $02A1ZCALC $1021 ;POLYNOMINAL CRC~BLOCK $0400 ;BUFFER SCREENBLN $0400BLO $0401BLCK1 $0402BL = $0403BLCH $0483XMOBLK BLOCK$85 ;BUFFER2 SCREEN)WXBUF XMOBLK ;BUFFER WXMODEMMWXBPTR $8B ;POER WX BUFFERS;e$; JUMP TABLESk.;8JMP XMD06 ; RECIEVE XMODEM FILEBJMP XMD30 ; S XMODEM FILEL;VUSECRC .BYTE 0 ;"PROTOCOL TO START WITH, DEFAULT XMODEM$`TR .BYTE 0 ;"TRANSLATE DEFAULT OFF, 128 = ONUjNOMSGS .BYTE 0 ;"SUPPRESS MSGS OFF, 128 = ONtDLESCN .BYTE 0 ;"USE DLE SCREENING, 128 = ON~DASHPS .BYTE 64 ;"USE PLUS' IN WXMODEM 128=ON, 64=DIGITAL OUTPUT (IN ALL)RCVCHR .BYTE 0RSTAT .BYTE 0TEMPX .BYTE 0,0#FXMO .BYTE 08XMOSZ .BYTE 128KLSTBLK .BYTE 0^PADCHR .BYTE 0qERR .BYTE 0BLKNUM .BYTE 0BLK .BYTE 132 ;XMODEM BLK GTHBLK1 .BYTE 131 ;THE SAME BUT 1CHRCNT .BYTE 0CKSUM .BYTE 0 CISFMT .BYTE 4,0,67,67,51$EBUFX .BYTE 0FTBCOUNT .WD $0000 ;"DA $0000j(CRC .BYTE 00,00 ; CRC SRAGE2POLY .BYTE 00,00<TIMOUT .BYTE 1FTSTCHR .BYTE 0PWLOOP .BYTE 0ZDOMSGS .BYTE 0dWHOPTCL .BYTE 0nWXBLKS .BYTE 0 xODB .BYTE 0,0BADB .BYTE 0,0%;8; RECEIVE FILE>;eXMD06 LDA #0 ;INITIALIZE EVERYBODYrSTA FXMOSTA LSTBLKSTA TBCOUNTSTA TBCOUNT1STA ODBSTA ODB1STA BADBSTA BADB1STA BLKNUMSTA WXBLKSJSR SETUPB ;ACTUALLY SET AULTS#";7,DOSHK JSR SHAKEX6LDA #128 ;NMAL BLOCK SIZEf@STA XMOSZxJXMD06A LDA #0~T;^XMD06A1 ;INITIALIZE BLOCK VARIABLEShSTA ERRrSTA CHRCNT|STA CKSUM;XMD07 JSR GTXMDM ; A MODEM CHARACTERJSR BNE XMD07A1@JMP XMD18 ; USER WANTS ABTF;]XMD07A1 LDA CHRCNTkBNE XMD10LDA RCVCHR ;LOOK OF TRANSFER ASCMP #EOT ;FIRST BYTE OF BLOCKBNE XMD07AJMP XMD42XMD07A CMP #CAN ;CHECK USER CANCEL BNE XMD09AJSR XMD19,XMD09A CMP #SYNQ&BNE CHKSOH ;DISREGARD THE SYN(S)|0JMP XMD06A ;FLAG THAT SYN WAS RECEIVED:CHKSOH CMP #SOHDBNE XMD07 ; START OF BLOCKNSOHOK LDA #4 ;IT IS START OF BLOCK!XSTA TIMOUTbLDA BLKNUM ;IT IS START OF BLOCK!1lBNE NOMSGF ;BUT FIRST BLOCKUvLDA WHOPTCL:CMP #$55:BEQ NOMSGFJSR OUTMSG ; OUTPUT PROCOL TYPE USED LY THE FIRST BLOCK!LDA #$55:STA WHOPTCL ; FIX PREVENT MSG FROM APPEARING 256TH BLOCK!NOMSGF LDA RCVCHR;0XMD10 JSR CHKADD ;ADD THE BYTE TO CHECKSUMQCMP BLK ;IS THIS OF BLOCKsBNE XMD07 ;NO CHARACTERy;LDA BLO ;YES CHECK BLOCK NUMBERCLC ;WITH COMPLEMENTADC BLCK1CLCCMP #255BEQ XMD12Z ;BLOCK NUMBER IS OD+ XMD12 JSR XMD15 ;BLOCK ERR S A NAK:JMP XMD06A@ ;q*XMD12Z INC BLKNUM ;NOW CHECK SEE THIS IS4;THE BLOCK NUMBER WE ECTED>LDA BLOHCMP BLKNUMRBEQ XMD11 ;YES CHECK ITEM\XMD12Z1 DEC BLKNUM ;NAK THIS SUCKER!fJSR XMD15 ; THE RIGHT BLOCK #KpJMP XMD06A ; THE BLOCK WE ARE A CYCLEQz;tXMD11 LDA USECRC ;TEST THE CRCCMP #NAKBEQ XMD11Z ; CRC MODEJSR DOCRCJSR CHKCRCCMP #0BNE XMD12Z1 ;CRC ERR!JMP XMD11X;#XMD11Z LDA CKSUM ;NOW SEE OUR CALCULATEDESEC ;CHECKSUM MATCHES THE EmSBC BLCH ;WE RECEIVED FROM THE SERuCLC CMP BLCH BNE XMD12Z1 ;CHECKSUM ERR NAK ;$ XMD11X LDA USECRC:CMP #"W":BNE XMD13. JSR SREWX ; BUFFER WX8 LDA DASHPS:CMP #64:BEQ DODIGIT2B CMP #128:BEQ XMD11YTL DODIGIT JSR INCOD:JMP XMD11YgV DOADASH LDA #0` JSR OUTMSG ; OUTPUT DASHES!j XMD11Y INC WXBLKSt LDA WXBLKS~ CMP #4 ; TIME WXBUFFER BNE XMD13A ; NO LDA DASHPS:CMP #128:BNE XMD11W LDA #7J JSR OUTMSG ; OUTPUT "+" EVERY 4TH BLOCK! (S LG DLS)c XMD11W LDA #0 ; YES!r STA WXBLKS JSR WXACK ; & ACK IT XMD13A JMP XMD06A ; LOOP BACK ; XMD13 LDA FXMO ;STUFF O 2ND BUFFER THIS! BEQ XMD40 ;IS THE FIRST BLOCK! XMD14 LDY #0"! LDX #4M! XMD14D LDA XMOBLK,X ;LOOK COMPUSERVEq! CMP CISFMT,X ;MACHINESPECIC ! BNE XMD14B ; STRIP IT OUT!( DEX!2 BPL XMD14D!< LDY #6!F XMD14B STY TEMPX ;WRITE THE 2ND BUFFER DISK!P ;!Z LDX #8"d JSR CHKOUT"n XMD14A LDX TEMPX*"x LDA XMOBLK,XR" BIT TR ;TRANSLATE THE CHARACTERS z" BPL XMD14E ;THE TRANSLATE FLAG IS " JSR CNVRT" XMD14E " XMD14E1 JSR CHROUT" JSR SS ;WATCH DISK ERRS!" BNE XMDERR" XMD14E2 INC TEMPX# LDA XMOSZ ;IS THIS THE OF THE7# CMP TEMPX ; BLOCK PORTION?`# BNE XMD14A ;NO KEEP WRITING DISKf# ;# BIT LSTBLK ;YES IS THIS THE LAST# BPL XMD40 ;BLOCK OF THE FILE# JMP XMD24 ;YES TIME FINISH UP# XMD40 LDX #0$" XMD41 LDA BL,X ;MOVE 1ST BUFFER TO 2ND=$, STA XMOBLK,X ;WE USE DOUBLEBUFFERING _$6 INX ;THEFLY PAD STRIPPING}$@ BPL XMD41 ;MOVE 128 BYTES$J STX FXMO$T JSR XMDACK ;ACK BLOCK OD!$^ JMP XMD06A ;LOOP BACK AHER$h ;%r XMDERR JSR XMD18 ;OOPS T A DISK ERR!%| ;2% XMD42 LDA #128 ;SET LAST BLOCK INDICARA% STA LSTBLKe% LDX #127 ;DETERMINE WHETHER % LDA XMOBLK,X ;SER USED CTRLZ NULL% STA PADCHR ;AS A PAD CHARACTER% CMP #26% BEQ XMD42A ;HE USED CTRLZ% CMP #0& BEQ XMD42A ;HE USED NULL& JMP XMD42CE& XMD42A LDA XMOBLK,X ;NOW BACK UP O THE LASTm& CMP PADCHR ;BLOCK UNTIL WE FIND THE& BNE XMD42C ;FINAL REAL BYTE& DEX& BPL XMD42A& JMP XMD24&& XMD42C INX ;SET BLOCK SIZE MATCH&0 STX XMOSZ ; OF LAST BLOCK ': JMP XMD14'D ;3'N CNVRT #127 ;CVERT IIPETII?'X CMP #65N'b BCC XMD14LZ'l CMP #91i'v BCS XMD14Lt' A #32' JMP XMD14L' XMD14K CMP #97' BCC XMD14L' CMP #123' BCS XMD14L' #223' XMD14L RTS' ;' ; XMODEM CHAR' ;'( GTXMDM JSR SETJ ;SET CHARACTER TIMEOUTN( GTX01 JSR ;CHECK SEE USER ISq( BEQ GTXEX ;PRESG KEY ABT( JSR GIM ; CHARACTER FROM MODEM( BNE GTX02 ;WAS THERE A CHARACTER( LDA DLESCN:CMP #128:BEQ DOADLE ; DLE MASKING IN EFFECT ANYWAY!>)* LDA USECRC:CMP #"W":BNE OK25 ;SKIP WXMODEM DLE MASKINGT)4 DOADLE LDA RCVCHRz)> CMP #DLE ;IS THIS A DLE CHARACTER)H BNE CHKDCS ;NO SEE IT WAS AN X X)R JSR GTXMDM ;YES XLATE IT!)\ LDA RCVCHR)f E #64 ;MASK W64 IT NMAL*p STA RCVCHR ; IT*z RTS * ;?* CHKDCS CMP #DC1:BEQ GTXMDMt* CMP #DC3:BEQ GTXMDM ; BE SURE IT WAS X X* OK25 RTS ;YES * GTX02 JSR TSTJ ;NO DID WE TIME OUT YET* BCC GTX01 ;NO TRY AGAIN* ;&+ LDA USECRC:CMP #"W":BNE SHK0 ; WXMODEM ROUTINE OF TRANSMISSIR+ LDA #CAN:JSR PTXMDM:LDA #CAN:JSR PTXMDM+ JSR WXACK ; SIGNALLED BY 11 SECD TIMEOUT...(LOSS OF NOT DETECTED!)+ LDA #CAN:JSR PTXMDM:LDA #CAN:JSR PTXMDM ; 2 ROLX'S TELL PLINK + PLA:PLA), JMP XMD24A ; NOW, UP EVERYTHING FINAL MESSAGE!/,;=,SHK0 PLAE,PLA[,$SHK JMP DOSHK ;,.GTXEX JMP XMD18 ;USER WANTS ABT,8;,B; CHECK CAN,NAK APPROPRIATE,L;,VXMD15 INC ERR ;CANCEL 10 ERRS IN A ROW,`LDA #10 ;OTHERWISE JUST NAK-jCMP ERR-tBEQ XMD18-~;--; NAK HLING3-;[-XMD16 LDA DASHPS:CMP #64:BNE XMD16Aj-JSR INCBADy-JMP XMD16B-XMD16A LDA #1-JSR OUTMSG-XMD16B LDA USECRC:CMP #"W":BNE XMD16N-JSR WXNAK-RTS-;-XMD16N LDA #NAK.JSR PTXMDM. XMD16R RTS.;6.INCBAD INC BADB:BNE IBAD1E.(INC BADB1Y.2IBAD1 JSR PRNTa.<RTSg.F;x.P; ACK HLING~.Z;.dXMDACK LDA DASHPS:CMP #64:BNE XMDACK2.nJSR INCOD.xJMP XMDACK3.XMDACK2 LDA #1.JSR OUTMSG.;/XMDACK3 LDA #ACK/JSR PTXMDM#/XMDACKR RTS)/;G/INCOD INC ODB:BNE IOD1V/INC ODB1j/IOD1 JSR PRNTr/RTSx/;/; EOT/;/XMD17 LDA #EOT/JSR PTXMDM/"RTS/,;/6; CAN/@;/JXMD18 LDA #CAN ;CANCEL THE TRANSFER/TJSR PTXMDM(0^XMD19 LDA #4 ;DISPLAY MESSAGE USER60hJSR XMD25C0rJSR TWOe0|PLA ;JUMP ALL THE WAY BACK 0PLA ;THE BASIC PROGRAM0RTS0;0; ACKNAK SEQUENCE WXMODEM0;0DOSEQ ; S WXMODEM SEQUENCE0 #%00000011 1JSR PTXMDM ;S THE SEQUENCE O1SEQDE RTS"1;31; EOT HLING91;s1XMD24 LDA #ACK:JSR PTXMDM ;ACKNOWLEDGE RECEIPT OF EOT1LDA USECRC:CMP #"W":BNE XMD24A ;SKIP CODE WXMODEM1LOOPEOT JSR GTXMDM:CMP #EOT:BNE LOOPEOT ; SECD EOT2LDA #ACK:JSR PTXMDM ; ACK THE SECD EOTF2&JSR DUMPWX ; DUMP ANYTHING STILL IN BUFFERq20XMD24A LDA #3 ;DISPLAY COMPED MESSAGE2:XMD25 JSR OUTMSG2DLDA #8 ; THE FILE HOME2NJMP 2X;2b; S FILE2l;2vXMD30 JSR ;CHECK IS UG IS PRESG3BNE XMD30A ; KEY+3JSR XMD19 ;YES ABT TRANSFERP3XMD30A LDA RIDBS ;CLEAR BUFFER^3STA RIDBE3LDA #0 ;INITIALIZE VARIABLES3STA TBCOUNT3STA TBCOUNT13STA ODB3STA ODB13STA BADB3STA BADB13LDA #SOH3STA BLN3STA BLO 4 E #2554STA BLCK164 XMD30B JSR ;CHECK KEYE4*BNE XMD30CS44JSR XMD17a4>JSR XMD194HXMD30C JSR GIM ; MODEM CHARACTER4RBNE XMD30B ;NO CHARACTER LOOP4\XMD30C1 LDA RCVCHR4fCMP #CAN ;IS RECEIVER CANCELLING4pBNE XMD30D ;NO5zJSR XMD19 ;YES TIME QUIT<5XMD30D CMP #"C" ;CHECK CRCK5BEQ XMD30Eu5XMD30D1 CMP #NAK ;WAS TRANSMISSI BAD5BNE XMD30B ;NO5;5XMD30E STA USECRC5JSR SETUPB5LDA WHOPTCL5JSR OUTMSG5;6XMD31 LDA #3 ;RETRANSMIT LAST BLOCK+6STA CHRCNT ;INITIALIZE BLOCK VARIABLES66LDX #0D6STX CKSUMR6STX RSTATo6XMD32 JSR ;CHECK KEY~6$BNE XMD32A6.JMP XMD37X68XMD32A LDX #8 ; CHARACTER FROM DISK6BJSR CHKIN6LJSR IN6VBIT TR ;CHECK TRANSLATE 7`BPL XMD32B ;NO BYPASS C37jJSR CNVRT ;YES CVERT II]7tXMD32B STA RCVCHR ;SRE THE CHARACTER7~JSR SS ;WATCH DEM DISK ERRS!7 #195 ;LOOK OFFILE7STA RSTAT ; TIMEOUTS7BNE XMD33A7LDA RCVCHR ;CALCULATE CHECKSUM WITH8JSR CHKADD ;THIS CHARACTER28CMP #131 ;T A FULL BLOCK YETK8BNE XMD32 ;NO LOOPs8BEQ XMD34 ;YES PROCESS OF BLOCK8XMD33A 8LDA RCVCHR ;CALCULATE CHECKSUM WITH8JSR CHKADD ;THIS CHARACTER8CMP BLK1 ;IS THE BLOCK FULL9BEQ XMD34 ;YES BYPADD PADDING49 LDA #26 ;PAD THE FINAL BLOCK WITH[9STA PADCHR ;CTRLZ UNLESS THE LAST9LDA RCVCHR ; CHARACTER HAPPENS TO9(CMP #26 ;BE A CTRLZ92BNE XMD33G ; IT IS USE NULL9<LDA #09FSTA PADCHR:PXMD33G LDA PADCHR ;PAD OUT THE BLOCK UNTIL%:ZSTA RCVCHR ;WE FILL IT UP;:dXMD38A JSR CHKADDI:nCMP BLK1X:xBNE XMD38A^:;:XMD34 LDA USECRC ;FILL IN THE CALCULATED:CMP #NAK:BEQ DOASUM:JSR DOCRC ; COMPUTE THE CRC:JSR SCRC ; ADD IT THE PACKET ;JMP SKIPSUM ; BYPASS THE SUM;;9;DOASUM LDA CKSUM:STA BLCH ;CHECKSUML;SKIPSUM LDA #0Z;STA TEMPX`;;;XMD35 JSR ;CHECK THE OLD KEY;BEQ XMD37X;XMD35A LDX TEMPX ;NOW US OUTPUT THE;LDA BLOCK,X ;ENTIRE BLOCK THE MODEM;JSR PTXMDM)<"XMD35B INC TEMPX ;DID WE FINISH THE BLOCK YET6<,LDA BLKD<6CMP TEMPXR<@BNE XMD35XXMD37E1 LDA #1 ;UPDATE THE DISPLAY?>JSR OUTMSG ; BACK RETRANSMITM>JMP XMD34s>XMD37E CMP #CAN ;DID HE S CANCEL>BNE XMD37A>&XMD37X JSR XMD19 ;YES ABT>0XMD37A CMP #ACK ;DID HE S ACK>:BNE XMD36 ;NE OF THE ABOVE ?DLDA DASHPS:CMP #64:BNE XMD37A1?NJSR INCOD*?XJMP XMD37A2=?bXMD37A1 LDA #0L?lJSR OUTMSGy?vXMD37A2 LDA RSTAT ;CHECK STATUS ZERO?BEQ XMD38 ;NO?JSR XMD17 ;YES S EOT?JSR SETJ ;SET TIMEOUT?XMD37B LDA JFY ;CHECK THE TIMEOUT LOOK@BMI XMD37C ; FINAL RESPSE FROM/@JSR GIM ;THE RECEIVER>@BNE XMD37Bf@XMD37C LDA RSTAT ;CHECK OF FILEp@ #64@BEQ XMD37X ;NO ABT@JMP XMD24A ;YES DISPLAY COMPE@XMD38 INC BLO ;INCENT THE BLOCK NUMBER@LDA #255@E BLOA STA BLCK1AJMP XMD31 ;BACK BLOCK%A ;9A*; XMODEM CHAR?A4;NA>GIM LDX #5\AHJSR CHKINhARJSR INwA\STA RCVCHRAfJSR SSApRTSAz;A; TEST JFYA;ATSTJ LDA JFYACMP TIMOUTARTSA;A; SET JFYA;ASETJ LDA #0 BSTA JFYBSTA JFY1!BRTS'B;>B; PUT CHAR MODEMDB;SBPTXMDM PHA^B$LDX #5mB.JSR CHKOUTB8PTX01 LDA ENABLEBB #3BLBNE PTX01BVPLA:TAYB`;BjLDA DLESCN:CMP #128:BNE NODLE1 ; LY DO DLE MASKING IN EFFECTBtTYAC~CMP #DLE:BEQ DODLE2'CCMP #SYN:BEQ DODLE2?CCMP #DC1:BEQ DODLE2WCCMP #DC3:BEQ DODLE2]C;lCJMP NODLE1rC;CDODLE2 E #64:TAYCLDA #DLECJSR CHROUTC;CNODLE1 TYACJSR CHROUTCRTSC ;C; CALCULATE CHECKSUMC; D(CHKADD LDA RCVCHRD2LDX CHRCNT*D<STA BLOCK,X2DFTAYADPLDA USECRCNDZCMP #NAK^DdBNE CHKADD1fDnTYADxCLC ;DT DO THIS XMODEMDADC CKSUMDSTA CKSUMDCHKADD1 INC CHRCNT ;JUMP HEREDINXDTXADRTSD;E; OUTMSG PROMPT POER TABLE E;EPRMTBL .E.WD PROMPT4 ; 0CE.WD PRMPT13 ; 1XE.WD DISPR8 ; 2mE.WD DISPR9 ; 3E.WD DISPR10 ; 4E.WD DISPR11 ; 5E".WD DISPR13 ; 6E,.WD PRMPT14 ; 7E6.WD OUT1 ; 8E@.WD OUT2 ; 9EJ.WD OUT3 ; 10FT;F^; PROMPTSFh;(FrPROMPT4 . "-"4F|.BYTE 0GFPRMPT14 . "+"SF.BYTE 0fFPRMPT13 . ":"rF.BYTE 0FDISPR8 . "WXMODEM PROTOCOL "F.BYTE 13,0FDISPR9 . "TRANSFER COMPLETE "F.BYTE 13,0FDISPR10 . "TRANSFER ABORTED "G.BYTE 13,03GDISPR11 . "XMODEM PROTOCOL "BG.BYTE 13,0gGDISPR13 . "CRC PROTOCOL "vG.BYTE 13,0GOUT1 . "BLOCKS "G.BYTE 0G&OUT2 . " ERRORS "G0.BYTE 0G:OUT3 . " "GD.BYTE 13,0GN;HX; OUTPUT MESSAGE DEVICEHb;HlOUTMSG PHA&HvLDA NOMSGS4HBEQ DOMSGOUTLP6 INYlIHCPY #0{IRBNE OUTLP1I\OUT RTSIf;Ip; TWO SECDSIz;ITWO JSR SETJI2 BIT JFY1IBPL 2IRTSI;I; J; CRC PROCOL CALCULATI'J; COMMODE COMPUTERS@J; BY M BROWNcJ; REWRITTEN BY KERMIT WOODALLiJ;J; THE POLYNOMIAL $1021 IS THEJ; CALCULATI 216 212 25 1J; THE NUMBER IS TTEN BY UG AJ; 1 IN EACH BIT CRESPDING K; THE POLYNOMIAL.7K$;"EG: $1021 HAS A 1 IN BIT 0,5 & 12=K.;CK8;hKB; FIRST, WE HAVE ERASE THE OLDKL; CRC UE INITIALIZE THEKV; POLYNOMIAL WE WILL USE THEK`; CALCULATI. E THAT THE POLYKj; VARIABLE CAN BE CHANGED IN ELt; PLACE BE USED BY THE WHOLE#L~; ROUTINE.JL; A CALLING ROUTINE WILL CALL THISoL; LY CE. SUBSEQUENT CALLS WILLL; BE CRCALC.L;L;L;LINITCRC LDA #0LSTA CRC ;CRC CALCULATILSTA CRC1LLDA #CALCLSTA POLY ;POLYNOMIALMLDA #CALCMSTA POLY1M RTS%M;KM; THIS ROUTINE WILL CALCULATE THElM(; CRC CHECKSUM WITH THE BYTEM2; IN THE ACCUMULAR.M<;MF;MPCRCALC LDX #8 ;COUNT 8 BITSMZ;Md; FIRST, WE X BIT 7 OF WITHNn; BIT 15 OF CRC (BIT 15 OF HIGHBYTE) Nx; NE CRC ;HIGH BYTE,NSTA CRC2N;YN; NOW WE SHT CRC (HI & LOW BYTES)N; LEFT E BIT. THE ASL PUTS A 0 ON; BIT 0 OF CRC LOW,SHTS CRC LOW BYTEN; LEFT E BIT, BIT 7 FALLING O THEN; CARRY. THE ROL SHTS THE CRC HIGH$O; BYTE LEFT 1 BIT, THE CARRY IS MOVEDKO; O BIT 0 OF CRC HIGH BYTE, BITpO; 7 FALLS O THE NOWEMPTY CARRYvO;OLOOPC OASL CRC1 ;SHT LOW BYTEOROL CRC ;NOW HIGHOBCC CRCALC1O";O,; BIT 15 (BIT 7 OF HIGH CRC BYTE) OFP6; CRC WAS SHTED O THE CARRY.=P@; THIS BIT WAS 1 EXCLUSIVE_PJ; THE CRC WITH THE POLYNOMIALePT;P^LDA POLY ;POLYNOMIAL LOWPhE CRC ;CRC LOW BYTEPrSTA CRCP|LDA POLY1 ;POLYNOMIAL HIGHPE CRC1PSTA CRC1P;Q; NOW WE SHT THE BYTE LEFT 1 BIT0Q; DECENT OUR BIT COUNTERVQ; AS LG AS IT'S ZERO, WE INUEsQ; OUR BITWISE CALCULATIyQ;QCRCALC1 QDEX ;DEC BIT COUNTQBNE LOOPCQRTS ;WHEW! DE.Q;Q ; (SHAKE) HSHAKING ROUTINEQ ;R SHAKE LDA BLKNUMR& BEQ W1R0 JMP XMD161R: W1 LDA USECRC@RD JSR PTXMDMNRN INC WLOOP\RX LDA WLOOPgRb CMP #3rRl BNE WxRv ;R LDA #$00:STA WLOOPR LDA USECRCR CMP #"W"R BNE MUSTBCR LDA #6:STA WHOPTCLR LDA #"C"R STA USECRCS LDA #1:STA TIMOUT S RTSS MUSTBC CMP #"C"*S BNE WAS LDA #5:STA WHOPTCLNS LDA #NAK]S!STA USECRCsS !LDA #3:STA TIMOUTS!LDA #132:STA BLKS !LDA #131:STA BLK1S*!;S4!W RTSS>!;SH!; CALCULATE CRC 128 BYTE BLOCKSR!; TRANSMISSI RECEIVINGT\!;Tf!DOCRC JSR INITCRC#Tp!LDX #02Tz!DOCRC1 JT!LDA BL,X:STX WLOOPYT!JSR CRCALCkT!LDX WLOOP:INXxT!CPX #128T!BNE DOCRC1 ;CRC 128 BYTEST!RTST!;T!; CHECK THE CRC AGAINST THE TWOT!; BYTES AT THE OF THE T!; PACKET RECEIVEDU!;U!CHKCRC LDA CRC19U!CMP BLCH1 ;COMPARE LO LOHU"BNE CHKBADTU"LDA CRCrU"CMP BLCH ;COMPARE HI HIU$"BNE CHKBADU.";U8"LDA #0UB"RTSUL";UV"CHKBAD LDA #1U`"RTSUj";Ut"; TAKE COMPUTED CRC SRE V~"; THE OF THE PACKET TOV"; BE SENT OUTV";*V"SCRC LDA CRC7V"STA BLCHEV"LDA CRC1TV"STA BLCH1\V"RTSbV";hV";V"SETUPB JSR SETBUF ; SETUP ALL BASIC STUFF PER PROCOL USEDV"LDA #$00:STA WLOOPV"LDA #133:STA BLKV#LDA #132:STA BLK1W #LDA #1:STA TIMOUTW#LDA USECRC%W#CMP #"W":BNE ISCEW(#LDA #2:STA WHOPTCL ;WXMODEMMW2#RTShW<#ISC CMP #"C":BNE ISNAKWF#LDA #6:STA WHOPTCL ;CRCWP#RTSWZ#ISNAK LDA #5:STA WHOPTCLWd#LDA #132:STA BLKWn#LDA #131:STA BLK1 ;PLAIN XMODEMWx#RTSW#;X#SETBUF ; SET WXBPTR UE OF WXBUF,X#LDA #WXBUF;X#STA WXBPTRKX#LDA #WXBUF\X#STA WXBPTR1dX#RTSjX#;X#INCBUF ; ADD E WXBPTRX#INC WXBPTRX#BNE INCDEX#INC WXBPTR1X#INCDE RTSX$;X$DUMPWX LDA WXBPTR ; S WX BUFFER DISK Y$CMP #WXBUF.Y"$BNE DWX1 ; IS THERE ANYTHING INTY,$LDA WXBPTR1 ; THE WXMODEM BUFFERdY6$CMP #WXBUFqY@$BNE DWX1YJ$RTS ; HING IN BUFFER!YT$;Y^$DWX1 LDA WXBPTRYh$STA TEMPXYr$LDA WXBPTR1Y|$STA TEMPX1Y$LDX #8Y$JSR CHKOUTY$JSR SETBUFZ$DMPLOOP LDY #0$Z$LDA (WXBPTR),Y3Z$JSR CHROUTBZ$JSR INCBUFQZ$LDA WXBPTR_Z$CMP TEMPXoZ$BNE DMPLOOPZ$LDA WXBPTR1Z$CMP TEMPX1Z$BNE DMPLOOP ;LOOP BACK NEITHER LO HI INGZ%JSR SETBUF ; 4 BLKSZ%RTSZ%;*[&%SREWX LDY #$00 ; SRE CURRENT BYTE IN WXMODEM BUFFER=[0%SWX1 LDA BL,YI[:%BIT TRV[D%BPL SWX2d[N%JSR CNVRT[X%SWX2 LDX #0:STA (WXBPTR),X[b%JSR INCBUF[l%INY[v%CPY #128[%BNE SWX1 ; SRE ALL 128 BYTES![%RTS[%;\%WXNAK JSR SETBUF ; WXBUFFER DISK NAKF\%LDA #1:STA TIMOUT ; ANYTHING LEFT IN INCOMING RS232 AREAT\%JSR SETJd\%NX1 JSR GIM\%BEQ NX1 ; T A BYTE, ME!\%JSR TSTJ\%BCC NX1 ; NO TIMEOUT, TRY AGAIN\%LDA #4:STA TIMOUT\%LDA BLKNUM\%SEC:SBC WXBLKS,]&STA BLKNUM ; SET BLKNUMBER BACK FIRST BLOCK OF THE FOURD] &LDA #NAK:JSR PTXMDMp]&LDA #1:JSR DOSEQ ; NOW, S NAKSEQUENCEx] &RTS~]*&;]4&WXACK JSR DUMPWX]>&LDA #ACK:JSR PTXMDM]H&LDA #0:JSR DOSEQ ; ACK LAST BLOCK RECIEVED!]R&LDA #ACK:JSR PTXMDM#^\&LDA #2:JSR DOSEQ ; ACK LAST BLOCK RECIEVED!;^f&LDA #ACK:JSR PTXMDMk^p&LDA #2:JSR DOSEQ ; ACK LAST BLOCK RECIEVED!^z&LDA #ACK:JSR PTXMDM^&LDA #0:JSR DOSEQ ; ACK LAST BLOCK RECIEVED!^&RTS^&;^&PRNT LDA #8^&JSR OUTMSG ; OUTPUT "BLOCKS "_&LDX #3:STX $9A:LDX ODB_&LDA ODB1,_&JSR OUT7_&LDA #9Y_&JSR OUTMSG ; OUTPUT "ERRORS "f_&LDX BADBu_&LDA BADB1_&JSR OUT_'LDA #10_'JSR OUTMSG_'RTS ; WE HAVE SENT DIGITAL MSGS!G ; OUTPUT "ERRORS "f_&LDX BADBu_&LDA BADB1_&JSR O