home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / TelcomTools / WXMODEM.PAL (.txt) < prev    next >
Commodore BASIC  |  2019-04-13  |  23KB  |  1,002 lines

  1. 10 REM SAVE "WXMODEM.SRC",8
  2. 20 REM OPEN 2,8,2,"CRC.C800,P,W
  3. 30 [158] 700
  4. 40 ;".OPT O2
  5. 50 ; XMODEM PROTOCOL (null) 4.1
  6. 60 ; CRC AND WXMODEM ADDED 1987
  7. 70 ;    BY KERMIT R. WOODALL
  8. 80 ;
  9. 90 ;        COMMODORE 64
  10. 100 ;
  11. 110 ; THIS (null) REQUIRES CALLING
  12. 120 ; PROGRAM TO OPEN THE FILE AS
  13. 130 ; FILE #8 AND MODEM AS #5, THEN
  14. 140 ; CALL THE APPROPRIATE ROUTINE
  15. 150 ; AND TURN TRANSLATION ON WHEN
  16. 160 ; NEEDED. WHEN NEEDED ALL THE
  17. 170 ; MESSAGES CAN BE SUPPRESSED FOR
  18. 180 ; BBS USEAGE. OPTION TO TURN ON
  19. 190 ; DLE SCREENING ADDED SO THAT CBM
  20. 200 ; USERS CAN D/L OVER PC-PURSUIT,
  21. 210 ; THIS OPTION IS RECOMMENDED AS
  22. 220 ; A SIMPLE SOLUTION TO THE PROBLEM
  23. 230 ; OF D/LS OVER PC-PURSUIT.
  24. 240 ;
  25. 250 ;
  26. 260 ; XMODEM COPYRIGHT (C) 1985 BY
  27. 270 ; MICROTECHNIC SOLUTIONS, INC.
  28. 280 ; ALL RIGHTS RESERVED
  29. 290 ;
  30. 300 ; CRC/XMODEM AND WXMODEM ADDITIONS
  31. 310 ; COPYRIGHT (C) 1987 BY THE AUTHOR:
  32. 320 ; KERMIT R. WOODALL,2600 JORDAN CT.
  33. 330 ; GLEN ALLEN, VA 23060
  34. 340 ;
  35. 350 ;"     PLINK ID: KERMIT
  36. 360 ;"     QLINK ID: CURVE
  37. 370 ;
  38. 380 ; OR CALL...THE FROG POND BBS
  39. 390 ;        (804) 796-6734
  40. 400 ;            24HRS
  41. 410 ;
  42. 420 ; MANY THANKS TO TOM BROWN FOR THE
  43. 430 ; FIRST CRC CALCULATION ROUTINE AND
  44. 440 ; TO SCOTT MCGINNIS (TARTAN) FOR
  45. 450 ; EXPLAINING CRC AND WXMODEM THEORY
  46. 460 ; IN A WAY EVEN I COULD UNDERSTAND.
  47. 470 ; OTHER THANKS (null) TO THE PEOPLE WHO
  48. 480 ; DEVELOPED THESE PROTOCOLS, TO THE
  49. 490 ; COMMODORE CLUB STAFF ON PLINK WHO
  50. 500 ; PROVIDED SUPPORT AND SUGGESTIONS
  51. 510 ; DURING DEVELOPMENT AND LET'S NOT
  52. 520 ; NOT FORGET ALL THE LITTLE PEOPLE
  53. 530 ; OUT THERE TOO! OH, HI MOM!
  54. 540 ;
  55. 550 ; THIS PROTOCOL MAY BE USED IN ANY
  56. 560 ; PROGRAM, TERMINALS, BBS'S OR
  57. 570 ; WHATEVER. I DO ASK THAT ANYONE
  58. 580 ; USING THIS MACHINE LANGUAGE TO
  59. 590 ; PLEASE PROVIDE ME WITH CREDIT IN
  60. 600 ; YOUR PROGRAM FOR MY M/L & A FREE
  61. 610 ; COPY OF YOUR PROGRAM (AND ANY
  62. 620 ; UPGRADES) CALL IT..."SHAREDWAREZ"
  63. 630 ; <GRIN>...I ENCOURAGE MANY PEOPLE
  64. 640 ; TO USE THIS MACHINE LANGUAGE TO
  65. 650 ; MAKE TELECOMMUNICATIONS BETTER!
  66. 660 ;
  67. 670 ; MAY BE USED IN ANY COMMERCIAL,
  68. 680 ; SHAREWARE OR PUBLIC DOMAIN PRGS!
  69. 690 ;
  70. 700 *= $C800
  71. 710 ;
  72. 720 CHKIN  = $FFC6
  73. 730 CHKOUT = $FFC9
  74. 740 CHROUT = $FFD2
  75. 750 CLOSE  = $FFC3
  76. 760 CLRCHN = $FFCC
  77. 770 GETIN  = $FFE4
  78. 780 READSS = $FFB7
  79. 790 STOP   = $FFE1
  80. 800 INTOUT = $BDCD
  81. 810 SOH = 1
  82. 820 EOT = 4
  83. 830 ACK = 6
  84. 840 DLE = 16
  85. 850 DC1 = 17 ;X-ON
  86. 860 DC3 = 19 ;X-(null)
  87. 870 NAK = 21
  88. 880 SYN = 22
  89. 890 CAN = 24
  90. 900 JIFFY  = $A1
  91. 910 MOVE   = $C3
  92. 920 RIDBE  = $029B
  93. 930 RIDBS  = $029C
  94. 940 ENABLE = $02A1
  95. 950 CALC   = $1021 ;POLYNOMINAL FOR CRC
  96. 960 BLOCK  = $0400 ;BUFFER ON SCREEN
  97. 970 BLN    = $0400
  98. 980 BLO    = $0401
  99. 990 BLCK1  = $0402
  100. 1000 BLDATA = $0403
  101. 1010 BLCH   = $0483
  102. 1020 XMOBLK = BLOCK+$85 ;BUFFER2 ON SCREEN
  103. 1030 WXBUF  = XMOBLK ;BUFFER FOR WXMODEM
  104. 1040 WXBPTR = $8B ;POINTER TO WX BUFFER
  105. 1050 ;
  106. 1060 ; JUMP TABLES
  107. 1070 ;
  108. 1080 JMP XMD06 ; RECIEVE XMODEM FILE
  109. 1090 JMP XMD30 ; SEND XMODEM FILE
  110. 1100 ;
  111. 1110 USECRC .BYTE 0 ;"PROTOCOL TO START WITH, DEFAULT XMODEM
  112. 1120 TR[145]   .BYTE 0 ;"TRANSLATE DEFAULT OFF, 128 = ON
  113. 1130 NOMSGS .BYTE 0 ;"SUPPRESS MSGS OFF, 128 = ON
  114. 1140 DLESCN .BYTE 0 ;"USE DLE SCREENING, 128 = ON
  115. 1150 DASHPS .BYTE 64  ;"USE PLUS' IN WXMODEM 128=ON, 64=DIGITAL OUTPUT (IN ALL)
  116. 1160 RCVCHR .BYTE 0
  117. 1170 RSTAT  .BYTE 0
  118. 1180 TEMPX  .BYTE 0,0
  119. 1190 FXMO   .BYTE 0
  120. 1200 XMOSZ  .BYTE 128
  121. 1210 LSTBLK .BYTE 0
  122. 1220 PADCHR .BYTE 0
  123. 1230 ERR    .BYTE 0
  124. 1240 BLKNUM .BYTE 0
  125. 1250 BLK[195] .BYTE 132 ;XMODEM BLK [195]GTH
  126. 1260 BLK[195]1 .BYTE 131 ;THE SAME BUT [171]1
  127. 1270 CHRCNT .BYTE 0
  128. 1280 CKSUM  .BYTE 0
  129. 1290 CISFMT .BYTE 4,0,67,67,51
  130. 1300 EBUFX  .BYTE 0
  131. 1310 TBCOUNT .W[176]D $0000 ;"DA $0000
  132. 1320 CRC    .BYTE 00,00 ; CRC STORAGE
  133. 1330 POLY   .BYTE 00,00
  134. 1340 TIMOUT .BYTE 1
  135. 1350 TSTCHR .BYTE 0
  136. 1360 WLOOP  .BYTE 0
  137. 1370 DOMSGS  .BYTE 0
  138. 1380 WHOPTCL .BYTE 0
  139. 1390 WXBLKS  .BYTE 0
  140. 1400 (null)ODB  .BYTE 0,0
  141. 1410 BADB   .BYTE 0,0
  142. 1420 ;
  143. 1430 ; RECEIVE FILE
  144. 1440 ;
  145. 1450 XMD06 LDA #0 ;INITIALIZE EVERYBODY
  146. 1460 STA FXMO
  147. 1470 STA LSTBLK
  148. 1480 STA TBCOUNT
  149. 1490 STA TBCOUNT+1
  150. 1500 STA (null)ODB
  151. 1510 STA (null)ODB+1
  152. 1520 STA BADB
  153. 1530 STA BADB+1
  154. 1540 STA BLKNUM
  155. 1550 STA WXBLKS
  156. 1560 JSR SETUPB ;ACTUALLY SET DEFAULTS
  157. 1570 ;
  158. 1580 DOSHK JSR SHAKE
  159. 1590 LDA #128 ;NORMAL DATA BLOCK SIZE
  160. 1600 STA XMOSZ
  161. 1610 XMD06A LDA #0
  162. 1620 ;
  163. 1630 XMD06A1 =* ;INITIALIZE BLOCK VARIABLES
  164. 1640 STA ERR
  165. 1650 STA CHRCNT
  166. 1660 STA CKSUM
  167. 1670 ;
  168. 1680 XMD07 JSR GTXMDM ;(null) GET A MODEM CHARACTER
  169. 1690 JSR STOP
  170. 1700 BNE XMD07A1
  171. 1710 JMP XMD18 ; USER WANTS TO ABORT
  172. 1720 ;
  173. 1730 XMD07A1 LDA CHRCNT
  174. 1740 BNE XMD10
  175. 1750 LDA RCVCHR ;LOOK FOR END OF TRANSFER AS
  176. 1760 CMP #EOT ;FIRST BYTE OF BLOCK
  177. 1770 BNE XMD07A
  178. 1780 JMP XMD42
  179. 1790 XMD07A CMP #CAN ;CHECK FOR USER CANCEL
  180. 1800 BNE XMD09A
  181. 1810 JSR XMD19
  182. 1820 XMD09A CMP #SYN
  183. 1830 BNE CHKSOH ;DISREGARD THE SYN(S)
  184. 1840 JMP XMD06A ;FLAG THAT SYN WAS RECEIVED
  185. 1850 CHKSOH CMP #SOH
  186. 1860 BNE XMD07 ;WAIT FOR START OF BLOCK
  187. 1870 SOHOK LDA #4 ;IT IS START OF BLOCK!
  188. 1880 STA TIMOUT
  189. 1890 LDA BLKNUM ;IT IS START OF BLOCK!
  190. 1900 BNE NOMSGF ;BUT NOT FIRST BLOCK
  191. 1910 LDA WHOPTCL:CMP #$55:BEQ NOMSGF
  192. 1920 JSR OUTMSG ; OUTPUT PROTOCOL TYPE USED - ONLY ON THE FIRST BLOCK!
  193. 1930 LDA #$55:STA WHOPTCL ; FIX TO PREVENT MSG FROM APPEARING ON 256TH BLOCK!
  194. 1940 NOMSGF LDA RCVCHR
  195. 1950 ;
  196. 1960 XMD10 JSR CHKADD ;ADD THE DATA BYTE TO CHECKSUM
  197. 1970 CMP BLKLEN ;IS THIS END OF BLOCK
  198. 1980 BNE XMD07 ;NO - GET NEXT CHARACTER
  199. 1990 ;
  200. 2000 LDA BLO ;YES - CHECK BLOCK NUMBER
  201. 2010 CLC  ;WITH COMPLEMENT
  202. 2020 ADC BLCK1
  203. 2030 CLC
  204. 2040 CMP #255
  205. 2050 BEQ XMD12Z ;BLOCK NUMBER IS (null)OD
  206. 2060 XMD12 JSR XMD15 ;BLOCK ERROR - SEND A NAK
  207. 2070 JMP XMD06A
  208. 2080 ;
  209. 2090 XMD12Z INC BLKNUM ;NOW CHECK TO SEE IF THIS IS
  210. 2100 ;THE BLOCK NUMBER WE EXPECTED
  211. 2110 LDA BLO
  212. 2120 CMP BLKNUM
  213. 2130 BEQ XMD11 ;YES - CHECK NEXT ITEM
  214. 2140 XMD12Z1 DEC BLKNUM ;NAK THIS SUCKER!
  215. 2150 JSR XMD15 ;NOT THE RIGHT BLOCK #
  216. 2160 JMP XMD06A ;GET THE NEXT BLOCK WE ARE ON A WAIT CYCLE
  217. 2170 ;
  218. 2180 XMD11 LDA USECRC ;TEST THE CRC
  219. 2190 CMP #NAK
  220. 2200 BEQ XMD11Z ;NOT CRC MODE
  221. 2210 JSR DOCRC
  222. 2220 JSR CHKCRC
  223. 2230 CMP #0
  224. 2240 BNE XMD12Z1 ;CRC ERROR!
  225. 2250 JMP XMD11X
  226. 2260 ;
  227. 2270 XMD11Z LDA CKSUM ;NOW SEE IF OUR CALCULATED
  228. 2280 SEC  ;CHECKSUM MATCHES THE ONE
  229. 2290 SBC BLCH ;WE RECEIVED FROM THE SENDER
  230. 2300 CLC
  231. 2310 CMP BLCH
  232. 2320 BNE XMD12Z1 ;CHECKSUM ERROR - (null) NAK
  233. 2330 ;
  234. 2340 XMD11X LDA USECRC:CMP #"W":BNE XMD13
  235. 2350 JSR STOREWX ; SAVE BUFFER FOR WX
  236. 2360 LDA DASHPS:CMP #64:BEQ DODIGIT
  237. 2370 CMP #128:BEQ XMD11Y
  238. 2380 DODIGIT JSR INC(null)OD:JMP XMD11Y
  239. 2390 DOADASH LDA #0
  240. 2400 JSR OUTMSG ; OUTPUT DASHES!
  241. 2410 XMD11Y INC WXBLKS
  242. 2420 LDA WXBLKS
  243. 2430 CMP #4 ; TIME TO SAVE WXBUFFER
  244. 2440 BNE XMD13A ; NO
  245. 2450 LDA DASHPS:CMP #128:BNE XMD11W
  246. 2460 LDA #7
  247. 2470 JSR OUTMSG ; OUTPUT "+" EVERY 4TH BLOCK! (SAVES ON LONG D/LS)
  248. 2480 XMD11W LDA #0 ; YES!
  249. 2490 STA WXBLKS
  250. 2500 JSR WXACK ; SAVE & ACK IT
  251. 2510 XMD13A JMP XMD06A ; LOOP BACK
  252. 2520 ;
  253. 2530 XMD13 LDA FXMO ;STUFF INTO 2ND BUFFER IF THIS
  254. 2540 BEQ XMD40 ;IS THE FIRST BLOCK
  255. 2550 XMD14 LDY #0
  256. 2560 LDX #4
  257. 2570 XMD14D LDA XMOBLK,X ;LOOK FOR COMPUSERVE
  258. 2580 CMP CISFMT,X ;MACHINE-SPECIFIC (null)
  259. 2590 BNE XMD14B ;AND STRIP IT OUT
  260. 2600 DEX
  261. 2610 BPL XMD14D
  262. 2620 LDY #6
  263. 2630 XMD14B STY TEMPX ;WRITE THE 2ND BUFFER TO DISK
  264. 2640 ;
  265. 2650 LDX #8
  266. 2660 JSR CHKOUT
  267. 2670 XMD14A LDX TEMPX
  268. 2680 LDA XMOBLK,X
  269. 2690 BIT TRON ;TRANSLATE THE CHARACTERS IF
  270. 2700 BPL XMD14E ;THE TRANSLATE FLAG IS ON
  271. 2710 JSR CNVRT
  272. 2720 XMD14E =*
  273. 2730 XMD14E1 JSR CHROUT
  274. 2740 JSR READSS ;WATCH FOR DISK ERRORS!
  275. 2750 BNE XMDERR
  276. 2760 XMD14E2 INC TEMPX
  277. 2770 LDA XMOSZ ;IS THIS THE END OF THE
  278. 2780 CMP TEMPX ;DATA BLOCK PORTION?
  279. 2790 BNE XMD14A ;NO - KEEP WRITING TO DISK
  280. 2800 ;
  281. 2810 BIT LSTBLK ;YES - IS THIS THE LAST
  282. 2820 BPL XMD40 ;BLOCK OF THE FILE
  283. 2830 JMP XMD24 ;YES - TIME TO FINISH UP
  284. 2840 XMD40 LDX #0
  285. 2850 XMD41 LDA BLDATA,X ;MOVE 1ST BUFFER TO 2ND
  286. 2860 STA XMOBLK,X ;WE USE DOUBLE-BUFFERING FOR
  287. 2870 INX  ;ON-THE-FLY PAD STRIPPING
  288. 2880 BPL XMD41 ;MOVE 128 BYTES
  289. 2890 STX FXMO
  290. 2900 JSR XMDACK ;ACK - BLOCK (null)OD!
  291. 2910 JMP XMD06A ;LOOP BACK FOR ANOTHER
  292. 2920 ;
  293. 2930 XMDERR JSR XMD18 ;OOPS - (null)T A DISK ERROR!
  294. 2940 ;
  295. 2950 XMD42 LDA #128 ;SET LAST BLOCK INDICATOR
  296. 2960 STA LSTBLK
  297. 2970 LDX #127 ;DETERMINE WHETHER OR NOT
  298. 2980 LDA XMOBLK,X ;SENDER USED CTRL-Z OR NULL
  299. 2990 STA PADCHR ;AS A PAD CHARACTER
  300. 3000 CMP #26
  301. 3010 BEQ XMD42A ;HE USED CTRL-Z
  302. 3020 CMP #0
  303. 3030 BEQ XMD42A ;HE USED NULL
  304. 3040 JMP XMD42C
  305. 3050 XMD42A LDA XMOBLK,X ;NOW BACK UP INTO THE LAST
  306. 3060 CMP PADCHR ;BLOCK UNTIL WE FIND THE
  307. 3070 BNE XMD42C ;FINAL REAL DATA BYTE
  308. 3080 DEX
  309. 3090 BPL XMD42A
  310. 3100 JMP XMD24
  311. 3110 XMD42C INX  ;SET BLOCK SIZE TO MATCH
  312. 3120 STX XMOSZ ;END OF LAST BLOCK
  313. 3130 JMP XMD14
  314. 3140 ;
  315. 3150 CNVRT AND #127 ;CONVERT ASCII-PETASCII
  316. 3160 CMP #65
  317. 3170 BCC XMD14L
  318. 3180 CMP #91
  319. 3190 BCS XMD14L
  320. 3200 ORA #32
  321. 3210 JMP XMD14L
  322. 3220 XMD14K CMP #97
  323. 3230 BCC XMD14L
  324. 3240 CMP #123
  325. 3250 BCS XMD14L
  326. 3260 AND #223
  327. 3270 XMD14L RTS
  328. 3280 ;
  329. 3290 ; GET XMODEM CHAR
  330. 3300 ;
  331. 3310 GTXMDM JSR SETJIF ;SET CHARACTER TIMEOUT
  332. 3320 GTX01 JSR STOP ;CHECK TO SEE IF USER IS
  333. 3330 BEQ GTXEX ;PRESSING STOP KEY TO ABORT
  334. 3340 JSR GIM ;GET CHARACTER FROM MODEM
  335. 3350 BNE GTX02 ;WAS THERE A CHARACTER
  336. 3360 LDA DLESCN:CMP #128:BEQ DOADLE ; DLE MASKING IN EFFECT ANYWAY!
  337. 3370 LDA USECRC:CMP #"W":BNE OK25 ;SKIP IF NOT WXMODEM OR DLE MASKING
  338. 3380 DOADLE LDA RCVCHR
  339. 3390 CMP #DLE ;IS THIS A DLE CHARACTER
  340. 3400 BNE CHKDCS ;NO - SEE IF IT WAS AN X-ON OR X-(null)
  341. 3410 JSR GTXMDM ;YES - XLATE IT!
  342. 3420 LDA RCVCHR
  343. 3430 EOR #64 ;MASK W/64 TO RETURN IT TO NORMAL
  344. 3440 STA RCVCHR ;SAVE IT
  345. 3450 RTS
  346. 3460 ;
  347. 3470 CHKDCS CMP #DC1:BEQ GTXMDM
  348. 3480 CMP #DC3:BEQ GTXMDM ; BE SURE IT WAS NOT X-ON OR X-(null)
  349. 3490 OK25 RTS  ;YES - RETURN
  350. 3500 GTX02 JSR TSTJIF ;NO - DID WE TIME OUT YET
  351. 3510 BCC GTX01 ;NO - (null) TRY AGAIN
  352. 3520 ;
  353. 3530 LDA USECRC:CMP #"W":BNE (null)SHK0 ; WXMODEM ROUTINE FOR END OF TRANSMISSION
  354. 3540 LDA #CAN:JSR PTXMDM:LDA #CAN:JSR PTXMDM
  355. 3550 JSR WXACK ; SIGNALLED BY 11 SECOND TIMEOUT...(LOSS OF DATA NOT DETECTED!)
  356. 3560 LDA #CAN:JSR PTXMDM:LDA #CAN:JSR PTXMDM ; 2 CONTROL-X'S TELL PLINK TO END
  357. 3570 PLA:PLA
  358. 3580 JMP XMD24A ; NOW, CLOSE UP EVERYTHING AND PRINT FINAL MESSAGE!
  359. 3590 ;
  360. 3600 (null)SHK0 PLA
  361. 3610 PLA
  362. 3620 (null)SHK JMP DOSHK ;RETURN
  363. 3630 GTXEX JMP XMD18 ;USER WANTS TO ABORT
  364. 3640 ;
  365. 3650 ; CHECK CAN,NAK APPROPRIATE
  366. 3660 ;
  367. 3670 XMD15 INC ERR ;CANCEL IF 10 ERRORS IN A ROW
  368. 3680 LDA #10 ;OTHERWISE JUST NAK
  369. 3690 CMP ERR
  370. 3700 BEQ XMD18
  371. 3710 ;
  372. 3720 ; NAK HANDLING
  373. 3730 ;
  374. 3740 XMD16 LDA DASHPS:CMP #64:BNE XMD16A
  375. 3750 JSR INCBAD
  376. 3760 JMP XMD16B
  377. 3770 XMD16A LDA #1
  378. 3780 JSR OUTMSG
  379. 3790 XMD16B LDA USECRC:CMP #"W":BNE XMD16N
  380. 3800 JSR WXNAK
  381. 3810 RTS
  382. 3820 ;
  383. 3830 XMD16N LDA #NAK
  384. 3840 JSR PTXMDM
  385. 3850 XMD16R RTS
  386. 3860 ;
  387. 3870 INCBAD INC BADB:BNE IBAD1
  388. 3880 INC BADB+1
  389. 3890 IBAD1 JSR INTPRNT
  390. 3900 RTS
  391. 3910 ;
  392. 3920 ; ACK HANDLING
  393. 3930 ;
  394. 3940 XMDACK LDA DASHPS:CMP #64:BNE XMDACK2
  395. 3950 JSR INC(null)OD
  396. 3960 JMP XMDACK3
  397. 3970 XMDACK2 LDA #1
  398. 3980 JSR OUTMSG
  399. 3990 ;
  400. 4000 XMDACK3 LDA #ACK
  401. 4010 JSR PTXMDM
  402. 4020 XMDACKR RTS
  403. 4030 ;
  404. 4040 INC(null)OD INC (null)ODB:BNE I(null)OD1
  405. 4050 INC (null)ODB+1
  406. 4060 I(null)OD1 JSR INTPRNT
  407. 4070 RTS
  408. 4080 ;
  409. 4090 ; EOT
  410. 4100 ;
  411. 4110 XMD17 LDA #EOT
  412. 4120 JSR PTXMDM
  413. 4130 RTS
  414. 4140 ;
  415. 4150 ; CAN
  416. 4160 ;
  417. 4170 XMD18 LDA #CAN ;CANCEL THE TRANSFER
  418. 4180 JSR PTXMDM
  419. 4190 XMD19 LDA #4 ;DISPLAY MESSAGE TO USER
  420. 4200 JSR XMD25
  421. 4210 JSR WAITTWO
  422. 4220 PLA  ;JUMP ALL THE WAY BACK TO
  423. 4230 PLA  ;THE BASIC PROGRAM
  424. 4240 RTS
  425. 4250 ;
  426. 4260 ; ACK/NAK SEQUENCE FOR WXMODEM
  427. 4270 ;
  428. 4280 DOSEQ =* ; SEND WXMODEM SEQUENCE
  429. 4290 AND #%00000011
  430. 4300 JSR PTXMDM ;SEND THE SEQUENCE TOO
  431. 4310 SEQDONE RTS
  432. 4320 ;
  433. 4330 ; EOT HANDLING
  434. 4340 ;
  435. 4350 XMD24 LDA #ACK:JSR PTXMDM ;ACKNOWLEDGE RECEIPT OF EOT
  436. 4360 LDA USECRC:CMP #"W":BNE XMD24A ;SKIP NEXT CODE IF NOT WXMODEM
  437. 4370 LOOPEOT JSR GTXMDM:CMP #EOT:BNE LOOPEOT ; WAIT FOR SECOND EOT
  438. 4380 LDA #ACK:JSR PTXMDM ; ACK THE SECOND EOT
  439. 4390 JSR DUMPWX ; DUMP ANYTHING STILL IN BUFFER
  440. 4400 XMD24A LDA #3 ;DISPLAY COMPLETED MESSAGE
  441. 4410 XMD25 JSR OUTMSG
  442. 4420 LDA #8 ;CLOSE THE FILE AND (null) HOME
  443. 4430 JMP CLOSE
  444. 4440 ;
  445. 4450 ; SEND FILE
  446. 4460 ;
  447. 4470 XMD30 JSR STOP ;CHECK IS USING IS PRESSING
  448. 4480 BNE XMD30A ;STOP KEY
  449. 4490 JSR XMD19 ;YES - ABORT TRANSFER
  450. 4500 XMD30A LDA RIDBS ;CLEAR INPUT BUFFER
  451. 4510 STA RIDBE
  452. 4520 LDA #0 ;INITIALIZE VARIABLES
  453. 4530 STA TBCOUNT
  454. 4540 STA TBCOUNT+1
  455. 4550 STA (null)ODB
  456. 4560 STA (null)ODB+1
  457. 4570 STA BADB
  458. 4580 STA BADB+1
  459. 4590 LDA #SOH
  460. 4600 STA BLN
  461. 4610 STA BLO
  462. 4620 EOR #255
  463. 4630 STA BLCK1
  464. 4640 XMD30B JSR STOP ;CHECK STOP KEY
  465. 4650 BNE XMD30C
  466. 4660 JSR XMD17
  467. 4670 JSR XMD19
  468. 4680 XMD30C JSR GIM ;GET MODEM CHARACTER
  469. 4690 BNE XMD30B ;NO CHARACTER - LOOP
  470. 4700 XMD30C1 LDA RCVCHR
  471. 4710 CMP #CAN ;IS RECEIVER CANCELLING
  472. 4720 BNE XMD30D ;NO
  473. 4730 JSR XMD19 ;YES - TIME TO QUIT
  474. 4740 XMD30D CMP #"C" ;CHECK FOR CRC
  475. 4750 BEQ XMD30E
  476. 4760 XMD30D1 CMP #NAK ;WAS TRANSMISSION BAD
  477. 4770 BNE XMD30B ;NO
  478. 4780 ;
  479. 4790 XMD30E STA USECRC
  480. 4800 JSR SETUPB
  481. 4810 LDA WHOPTCL
  482. 4820 JSR OUTMSG
  483. 4830 ;
  484. 4840 XMD31 LDA #3 ;RETRANSMIT LAST BLOCK
  485. 4850 STA CHRCNT ;INITIALIZE BLOCK VARIABLES
  486. 4860 LDX #0
  487. 4870 STX CKSUM
  488. 4880 STX RSTAT
  489. 4890 XMD32 JSR STOP ;CHECK STOP KEY
  490. 4900 BNE XMD32A
  491. 4910 JMP XMD37X
  492. 4920 XMD32A LDX #8 ;GET CHARACTER FROM DISK
  493. 4930 JSR CHKIN
  494. 4940 JSR GETIN
  495. 4950 BIT TRON ;CHECK FOR TRANSLATE ON
  496. 4960 BPL XMD32B ;NO - BYPASS CON(null)
  497. 4970 JSR CNVRT ;YES - CONVERT TO ASCII
  498. 4980 XMD32B STA RCVCHR ;STORE THE CHARACTER
  499. 4990 JSR READSS ;WATCH DEM DISK ERRORS!
  500. 5000 AND #195 ;LOOK FOR END-OF-FILE
  501. 5010 STA RSTAT ;AND TIME-OUTS
  502. 5020 BNE XMD33A
  503. 5030 LDA RCVCHR ;CALCULATE CHECKSUM WITH
  504. 5040 JSR CHKADD ;THIS CHARACTER
  505. 5050 CMP #131   ;(null)T A FULL BLOCK YET
  506. 5060 BNE XMD32 ;NO - LOOP
  507. 5070 BEQ XMD34 ;YES - PROCESS END OF BLOCK
  508. 5080 XMD33A = *
  509. 5090 LDA RCVCHR ;CALCULATE CHECKSUM WITH
  510. 5100 JSR CHKADD ;THIS CHARACTER
  511. 5110 CMP BLKLEN1 ;IS THE BLOCK FULL
  512. 5120 BEQ XMD34 ;YES - BYPADD PADDING
  513. 5130 LDA #26 ;PAD THE FINAL BLOCK WITH
  514. 5140 STA PADCHR ;CTRL-Z UNLESS THE LAST
  515. 5150 LDA RCVCHR ;DATA CHARACTER HAPPENS TO
  516. 5160 CMP #26 ;BE A CTRL-Z
  517. 5170 BNE XMD33G ;IF IT IS THEN USE NULL
  518. 5180 LDA #0
  519. 5190 STA PADCHR
  520. 5200 XMD33G LDA PADCHR ;PAD OUT THE BLOCK UNTIL
  521. 5210 STA RCVCHR ;WE FILL IT UP
  522. 5220 XMD38A JSR CHKADD
  523. 5230 CMP BLKLEN1
  524. 5240 BNE XMD38A
  525. 5250 ;
  526. 5260 XMD34 LDA USECRC ;FILL IN THE CALCULATED
  527. 5270 CMP #NAK:BEQ DOASUM
  528. 5280 JSR DOCRC ; COMPUTE THE CRC
  529. 5290 JSR STOCRC ; ADD IT ONTO THE DATA PACKET
  530. 5300 JMP SKIPSUM ; BYPASS THE SUM
  531. 5310 ;
  532. 5320 DOASUM LDA CKSUM:STA BLCH ;CHECKSUM
  533. 5330 SKIPSUM LDA #0
  534. 5340 STA TEMPX
  535. 5350 ;
  536. 5360 XMD35 JSR STOP ;CHECK THE OLD STOP KEY
  537. 5370 BEQ XMD37X
  538. 5380 XMD35A LDX TEMPX ;NOW LET US OUTPUT THE
  539. 5390 LDA BLOCK,X ;ENTIRE BLOCK TO THE MODEM
  540. 5400 JSR PTXMDM
  541. 5410 XMD35B INC TEMPX ;DID WE FINISH THE BLOCK YET
  542. 5420 LDA BLKLEN
  543. 5430 CMP TEMPX
  544. 5440 BNE XMD35
  545. 5450 ;
  546. 5460 ;
  547. 5470 JSR SETJIF ;SET THE TIMEOUT
  548. 5480 XMD36 =*
  549. 5490 XMD36A JSR GIM ;LOOK FOR THE RECEIVER RESPONSE
  550. 5500 BEQ XMD37
  551. 5510 JSR STOP ;NO RESPONSE YET - LOOK FOR THE
  552. 5520 BEQ XMD37X ;STOP KEY
  553. 5530 JSR TSTJIF ;AND CHECK FOR A TIMEOUT
  554. 5540 BCC XMD36 ;LOOP IF NOT TIMED OUT YET
  555. 5550 BCS XMD34 ;OTHERWISE RETRANSMIT
  556. 5560 XMD37 LDA RCVCHR
  557. 5570 CMP #NAK ;DID HE SEND A NAK
  558. 5580 BNE XMD37E
  559. 5590 LDA DASHPS:CMP #64:BNE XMD37E1
  560. 5600 JSR INCBAD
  561. 5610 JMP XMD34
  562. 5620 XMD37E1 LDA #1 ;UPDATE THE DISPLAY
  563. 5630 JSR OUTMSG ;(null) BACK TO RETRANSMIT
  564. 5640 JMP XMD34
  565. 5650 XMD37E CMP #CAN ;DID HE SEND CANCEL
  566. 5660 BNE XMD37A
  567. 5670 XMD37X JSR XMD19 ;YES - THEN ABORT
  568. 5680 XMD37A CMP #ACK ;DID HE SEND ACK
  569. 5690 BNE XMD36 ;NONE OF THE ABOVE
  570. 5700 LDA DASHPS:CMP #64:BNE XMD37A1
  571. 5710 JSR INC(null)OD
  572. 5720 JMP XMD37A2
  573. 5730 XMD37A1 LDA #0
  574. 5740 JSR OUTMSG
  575. 5750 XMD37A2 LDA RSTAT ;CHECK FOR STATUS NOT ZERO
  576. 5760 BEQ XMD38 ;NO
  577. 5770 JSR XMD17 ;YES - SEND EOT
  578. 5780 JSR SETJIF ;SET TIMEOUT
  579. 5790 XMD37B LDA JIFFY ;CHECK THE TIMEOUT AND LOOK
  580. 5800 BMI XMD37C ;FOR FINAL RESPONSE FROM
  581. 5810 JSR GIM ;THE RECEIVER
  582. 5820 BNE XMD37B
  583. 5830 XMD37C LDA RSTAT ;CHECK FOR END OF FILE
  584. 5840 AND #64
  585. 5850 BEQ XMD37X ;NO - ABORT
  586. 5860 JMP XMD24A ;YES - DISPLAY COMPLETE
  587. 5870 XMD38 INC BLO ;INCREMENT THE BLOCK NUMBER
  588. 5880 LDA #255
  589. 5890 EOR BLO
  590. 5900 STA BLCK1
  591. 5910 JMP XMD31 ;BACK FOR NEXT BLOCK
  592. 5920 ;
  593. 5930 ; GET XMODEM CHAR
  594. 5940 ;
  595. 5950 GIM LDX #5
  596. 5960 JSR CHKIN
  597. 5970 JSR GETIN
  598. 5980 STA RCVCHR
  599. 5990 JSR READSS
  600. 6000 RTS
  601. 6010 ;
  602. 6020 ; TEST JIFFY
  603. 6030 ;
  604. 6040 TSTJIF LDA JIFFY
  605. 6050 CMP TIMOUT
  606. 6060 RTS
  607. 6070 ;
  608. 6080 ; SET JIFFY
  609. 6090 ;
  610. 6100 SETJIF LDA #0
  611. 6110 STA JIFFY
  612. 6120 STA JIFFY+1
  613. 6130 RTS
  614. 6140 ;
  615. 6150 ; PUT CHAR TO MODEM
  616. 6160 ;
  617. 6170 PTXMDM PHA
  618. 6180 LDX #5
  619. 6190 JSR CHKOUT
  620. 6200 PTX01 LDA ENABLE
  621. 6210 AND #3
  622. 6220 BNE PTX01
  623. 6230 PLA:TAY
  624. 6240 ;
  625. 6250 LDA DLESCN:CMP #128:BNE NODLE1 ; ONLY DO IF DLE MASKING IN EFFECT
  626. 6260 TYA
  627. 6270 CMP #DLE:BEQ DODLE2
  628. 6280 CMP #SYN:BEQ DODLE2
  629. 6290 CMP #DC1:BEQ DODLE2
  630. 6300 CMP #DC3:BEQ DODLE2
  631. 6310 ;
  632. 6320 JMP NODLE1
  633. 6330 ;
  634. 6340 DODLE2 EOR #64:TAY
  635. 6350 LDA #DLE
  636. 6360 JSR CHROUT
  637. 6370 ;
  638. 6380 NODLE1 TYA
  639. 6390 JSR CHROUT
  640. 6400 RTS
  641. 6410 ;
  642. 6420 ; CALCULATE CHECKSUM
  643. 6430 ;
  644. 6440 CHKADD LDA RCVCHR
  645. 6450 LDX CHRCNT
  646. 6460 STA BLOCK,X
  647. 6470 TAY
  648. 6480 LDA USECRC
  649. 6490 CMP #NAK
  650. 6500 BNE CHKADD1
  651. 6510 TYA
  652. 6520 CLC ;DONT DO THIS IF NOT XMODEM
  653. 6530 ADC CKSUM
  654. 6540 STA CKSUM
  655. 6550 CHKADD1 INC CHRCNT ;JUMP TO HERE
  656. 6560 INX
  657. 6570 TXA
  658. 6580 RTS
  659. 6590 ;
  660. 6600 ; OUTMSG PROMPT POINTER TABLE
  661. 6610 ;
  662. 6620 PRMTBL = *
  663. 6630 .WORD PROMPT4 ; 0
  664. 6640 .WORD PRMPT13 ; 1
  665. 6650 .WORD DISPR8  ; 2
  666. 6660 .WORD DISPR9  ; 3
  667. 6670 .WORD DISPR10 ; 4
  668. 6680 .WORD DISPR11 ; 5
  669. 6690 .WORD DISPR13 ; 6
  670. 6700 .WORD PRMPT14 ; 7
  671. 6710 .WORD INTOUT1 ; 8
  672. 6720 .WORD INTOUT2 ; 9
  673. 6730 .WORD INTOUT3 ; 10
  674. 6740 ;
  675. 6750 ; PROMPTS
  676. 6760 ;
  677. 6770 PROMPT4 .ASC "-"
  678. 6780 .BYTE 0
  679. 6790 PRMPT14 .ASC "+"
  680. 6800 .BYTE 0
  681. 6810 PRMPT13 .ASC ":"
  682. 6820 .BYTE 0
  683. 6830 DISPR8  .ASC "WXMODEM PROTOCOL   "
  684. 6840 .BYTE 13,0
  685. 6850 DISPR9  .ASC "TRANSFER COMPLETE  "
  686. 6860 .BYTE 13,0
  687. 6870 DISPR10 .ASC "TRANSFER ABORTED   "
  688. 6880 .BYTE 13,0
  689. 6890 DISPR11 .ASC "XMODEM PROTOCOL    "
  690. 6900 .BYTE 13,0
  691. 6910 DISPR13 .ASC "CRC PROTOCOL       "
  692. 6920 .BYTE 13,0
  693. 6930 INTOUT1 .ASC "BLOCKS "
  694. 6940 .BYTE 0
  695. 6950 INTOUT2 .ASC " ERRORS "
  696. 6960 .BYTE 0
  697. 6970 INTOUT3 .ASC " [145]"
  698. 6980 .BYTE 13,0
  699. 6990 ;
  700. 7000 ; OUTPUT MESSAGE TO DEVICE
  701. 7010 ;
  702. 7020 OUTMSG PHA
  703. 7030 LDA NOMSGS
  704. 7040 BEQ DOMSG
  705. 7050 PLA
  706. 7060 RTS ; SUPPRESS MSGS, JUST RETURN
  707. 7070 ;
  708. 7080 DOMSG LDX #3
  709. 7090 JSR CHKOUT
  710. 7100 PLA
  711. 7110 OUTMSG1 ASL A ;START HERE IF NOT SCREEN
  712. 7120 TAX
  713. 7130 LDA PRMTBL,X
  714. 7140 STA MOVE
  715. 7150 INX
  716. 7160 LDA PRMTBL,X
  717. 7170 STA MOVE+1
  718. 7180 LDY #0
  719. 7190 OUTLP1 LDA (MOVE),Y
  720. 7200 CMP #0
  721. 7210 BEQ OUTEND
  722. 7220 OUTLP2 JSR CHROUT
  723. 7230 OUTLP6 INY
  724. 7240 CPY #0
  725. 7250 BNE OUTLP1
  726. 7260 OUTEND RTS
  727. 7270 ;
  728. 7280 ; WAIT TWO SECONDS
  729. 7290 ;
  730. 7300 WAITTWO JSR SETJIF
  731. 7310 WAIT2 BIT JIFFY+1
  732. 7320 BPL WAIT2
  733. 7330 RTS
  734. 7340 ;
  735. 7350 ;
  736. 7360 ;   CRC PROTOCOL CALCULATION
  737. 7370 ;   FOR COMMODORE COMPUTERS
  738. 7380 ;        BY TOM BROWN
  739. 7390 ; REWRITTEN  BY KERMIT WOODALL
  740. 7400 ;
  741. 7410 ; THE POLYNOMIAL $1021 IS FOR THE
  742. 7420 ; CALCULATION 2^16 + 2^12 + 2^5 + 1
  743. 7430 ; THE NUMBER IS (null)TTEN BY USING A
  744. 7440 ; 1 IN EACH BIT CORRESPONDING TO
  745. 7450 ; THE POLYNOMIAL.
  746. 7460 ;"EG: $1021 HAS A 1 IN BIT 0,5 & 12
  747. 7470 ;
  748. 7480 ;
  749. 7490 ; FIRST, WE HAVE [164] ERASE THE OLD
  750. 7500 ; CRC [197]UE [175] INITIALIZE THE
  751. 7510 ; POLYNOMIAL WE WILL USE [129] THE
  752. 7520 ; CALCULATI[145]. [168]E THAT THE POLY
  753. 7530 ; VARIABLE CAN BE CHANGED IN [145]E
  754. 7540 ; PLACE [164] BE USED BY THE WHOLE
  755. 7550 ; ROUTINE.
  756. 7560 ; A CALLING ROUTINE WILL CALL THIS
  757. 7570 ; [145]LY [145]CE. SUBSEQUENT CALLS WILL
  758. 7580 ; BE [164] CRCALC.
  759. 7590 ;
  760. 7600 ;
  761. 7610 ;
  762. 7620 INITCRC LDA #0
  763. 7630 STA CRC ;CRC CALCULATI[145]
  764. 7640 STA CRC[170]1
  765. 7650 LDA #[177]CALC
  766. 7660 STA POLY ;POLYNOMIAL
  767. 7670 LDA #[179]CALC
  768. 7680 STA POLY[170]1
  769. 7690 RTS
  770. 7700 ;
  771. 7710 ; THIS ROUTINE WILL CALCULATE THE
  772. 7720 ; CRC CHECKSUM WITH THE BYTE
  773. 7730 ; IN THE ACCUMULA[164]R.
  774. 7740 ;
  775. 7750 ;
  776. 7760 CRCALC LDX #8 ;COUNT 8 BITS
  777. 7770 ;
  778. 7780 ; FIRST, WE X[176] BIT 7 OF [131] WITH
  779. 7790 ; BIT 15 OF CRC (BIT 15 OF HIGHBYTE)
  780. 7800 ;
  781. 7810 E[176] CRC  ;HIGH BYTE
  782. 7820 STA CRC
  783. 7830 ;
  784. 7840 ; NOW WE SH[139]T CRC (HI & LOW BYTES)
  785. 7850 ; LEFT [145]E BIT. THE ASL PUTS A 0 [181]O
  786. 7860 ; BIT 0 OF CRC LOW,SH[139]TS CRC LOW BYTE
  787. 7870 ; LEFT [145]E BIT, BIT 7 FALLING [181]O THE
  788. 7880 ; CARRY. THE ROL SH[139]TS THE CRC HIGH
  789. 7890 ; BYTE LEFT 1 BIT, THE CARRY IS MOVED
  790. 7900 ; [181]O BIT 0 OF CRC HIGH BYTE, [175] BIT
  791. 7910 ; 7 FALLS [181]O THE NOW[171]EMPTY CARRY
  792. 7920 ;
  793. 7930 LOOPC [178][172]
  794. 7940 ASL CRC[170]1 ;SH[139]T LOW BYTE
  795. 7950 ROL CRC ;NOW HIGH
  796. 7960 BCC CRCALC1
  797. 7970 ;
  798. 7980 ; BIT 15 (BIT 7 OF HIGH CRC BYTE) OF
  799. 7990 ; CRC WAS SH[139]TED [181]O THE CARRY.
  800. 8000 ; [139] THIS BIT WAS 1 [167] EXCLUSIVE[171][176]
  801. 8010 ; THE CRC WITH THE POLYNOMIAL
  802. 8020 ;
  803. 8030 LDA POLY ;POLYNOMIAL LOW
  804. 8040 E[176] CRC ;CRC LOW BYTE
  805. 8050 STA CRC
  806. 8060 LDA POLY[170]1 ;POLYNOMIAL HIGH
  807. 8070 E[176] CRC[170]1
  808. 8080 STA CRC[170]1
  809. 8090 ;
  810. 8100 ; NOW WE SH[139]T THE [131] BYTE LEFT 1 BIT
  811. 8110 ; [175] DEC[143]ENT OUR BIT COUNTER
  812. 8120 ; AS L[145]G AS IT'S [168] ZERO, WE [154]INUE
  813. 8130 ; OUR BITWISE CALCULATI[145]
  814. 8140 ;
  815. 8150 CRCALC1 [178][172]
  816. 8160 DEX  ;DEC BIT COUNT
  817. 8170 BNE LOOPC
  818. 8180 RTS  ;WHEW! D[145]E.
  819. 8190 ;
  820. 8200 ; (SHAKE) H[175]SHAKING ROUTINE
  821. 8210 ;
  822. 8220 SHAKE LDA BLKNUM
  823. 8230 BEQ W[154]1
  824. 8240 JMP XMD16
  825. 8250 W[154]1 LDA USECRC
  826. 8260 JSR PTXMDM
  827. 8270 INC WLOOP
  828. 8280 LDA WLOOP
  829. 8290 CMP #3
  830. 8300 BNE W[154]
  831. 8310 ;
  832. 8320 LDA #$00:STA WLOOP
  833. 8330 LDA USECRC
  834. 8340 CMP #"W"
  835. 8350 BNE MUSTBC
  836. 8360 LDA #6:STA WHOPTCL
  837. 8370 LDA #"C"
  838. 8380 STA USECRC
  839. 8390 LDA #1:STA TIMOUT
  840. 8400 RTS
  841. 8410 MUSTBC CMP #"C"
  842. 8420 BNE W[154]
  843. 8430 LDA #5:STA WHOPTCL
  844. 8440 LDA #NAK
  845. 8450 STA USECRC
  846. 8460 LDA #3:STA TIMOUT
  847. 8470 LDA #132:STA BLK[195]
  848. 8480 LDA #131:STA BLK[195]1
  849. 8490 ;
  850. 8500 W[154] RTS
  851. 8510 ;
  852. 8520 ; CALCULATE CRC [129] 128 BYTE BLOCK
  853. 8530 ; [129] TRANSMISSI[145] [176] RECEIVING
  854. 8540 ;
  855. 8550 DOCRC JSR INITCRC
  856. 8560 LDX #0
  857. 8570 DOCRC1 [178] [172]
  858. 8580 LDA BL[131],X:STX WLOOP
  859. 8590 JSR CRCALC
  860. 8600 LDX WLOOP:INX
  861. 8610 CPX #128
  862. 8620 BNE DOCRC1 ;CRC [129] 128 BYTES
  863. 8630 RTS
  864. 8640 ;
  865. 8650 ; CHECK THE CRC AGAINST THE TWO
  866. 8660 ; BYTES AT THE [128] OF THE [131]
  867. 8670 ; PACKET RECEIVED
  868. 8680 ;
  869. 8690 CHKCRC LDA CRC[170]1
  870. 8700 CMP BLCH[170]1 ;COMPARE LO [164] LO
  871. 8710 BNE CHKBAD
  872. 8720 LDA CRC
  873. 8730 CMP BLCH ;COMPARE HI [164] HI
  874. 8740 BNE CHKBAD
  875. 8750 ;
  876. 8760 LDA #0
  877. 8770 RTS
  878. 8780 ;
  879. 8790 CHKBAD LDA #1
  880. 8800 RTS
  881. 8810 ;
  882. 8820 ; TAKE COMPUTED CRC [175] S[164]RE [164]
  883. 8830 ; THE [128] OF THE [131] PACKET TO
  884. 8840 ; BE SENT OUT
  885. 8850 ;
  886. 8860 S[164]CRC LDA CRC
  887. 8870 STA BLCH
  888. 8880 LDA CRC[170]1
  889. 8890 STA BLCH[170]1
  890. 8900 RTS
  891. 8910 ;
  892. 8920 ;
  893. 8930 SETUPB JSR SETBUF ; SETUP ALL BASIC STUFF PER PRO[164]COL USED
  894. 8940 LDA #$00:STA WLOOP
  895. 8950 LDA #133:STA BLK[195]
  896. 8960 LDA #132:STA BLK[195]1
  897. 8970 LDA #1:STA TIMOUT
  898. 8980 LDA USECRC
  899. 8990 CMP #"W":BNE ISC
  900. 9000 LDA #2:STA WHOPTCL ;WXMODEM
  901. 9010 RTS
  902. 9020 ISC CMP #"C":BNE ISNAK
  903. 9030 LDA #6:STA WHOPTCL ;CRC
  904. 9040 RTS
  905. 9050 ISNAK LDA #5:STA WHOPTCL
  906. 9060 LDA #132:STA BLK[195]
  907. 9070 LDA #131:STA BLK[195]1 ;PLAIN XMODEM
  908. 9080 RTS
  909. 9090 ;
  910. 9100 SETBUF [178][172] ; SET WXBPTR [164] [197]UE OF WXBUF
  911. 9110 LDA #[179]WXBUF
  912. 9120 STA WXBPTR
  913. 9130 LDA #[177]WXBUF
  914. 9140 STA WXBPTR[170]1
  915. 9150 RTS
  916. 9160 ;
  917. 9170 INCBUF [178][172] ; ADD [145]E [164] WXBPTR
  918. 9180 INC WXBPTR
  919. 9190 BNE INCD[145]E
  920. 9200 INC WXBPTR[170]1
  921. 9210 INCD[145]E RTS
  922. 9220 ;
  923. 9230 DUMPWX LDA WXBPTR ; S[128] WX BUFFER [164] DISK
  924. 9240 CMP #[179]WXBUF
  925. 9250 BNE DWX1 ; IS THERE ANYTHING IN
  926. 9260 LDA WXBPTR[170]1 ; THE WXMODEM BUFFER
  927. 9270 CMP #[177]WXBUF
  928. 9280 BNE DWX1
  929. 9290 RTS ; [168]HING IN BUFFER!
  930. 9300 ;
  931. 9310 DWX1 LDA WXBPTR
  932. 9320 STA TEMPX
  933. 9330 LDA WXBPTR[170]1
  934. 9340 STA TEMPX[170]1
  935. 9350 LDX #8
  936. 9360 JSR CHKOUT
  937. 9370 JSR SETBUF
  938. 9380 DMPLOOP LDY #0
  939. 9390 LDA (WXBPTR),Y
  940. 9400 JSR CHROUT
  941. 9410 JSR INCBUF
  942. 9420 LDA WXBPTR
  943. 9430 CMP TEMPX
  944. 9440 BNE DMPLOOP
  945. 9450 LDA WXBPTR[170]1
  946. 9460 CMP TEMPX[170]1
  947. 9470 BNE DMPLOOP ;LOOP BACK [139] NEITHER LO [176] HI [178] [128]ING
  948. 9480 JSR SETBUF ; [222] [129] [130] 4 BLKS
  949. 9490 RTS
  950. 9500 ;
  951. 9510 S[164]REWX LDY #$00 ; S[164]RE CURRENT BYTE IN WXMODEM BUFFER
  952. 9520 SWX1 LDA BL[131],Y
  953. 9530 BIT TR[145]
  954. 9540 BPL SWX2
  955. 9550 JSR CNVRT
  956. 9560 SWX2 LDX #0:STA (WXBPTR),X
  957. 9570 JSR INCBUF
  958. 9580 INY
  959. 9590 CPY #128
  960. 9600 BNE SWX1 ; S[164]RE ALL 128 BYTES!
  961. 9610 RTS
  962. 9620 ;
  963. 9630 WXNAK JSR SETBUF ; [148] WXBUFFER [164] DISK [167] NAK
  964. 9640 LDA #1:STA TIMOUT ; [161] ANYTHING LEFT IN INCOMING RS232 AREA
  965. 9650 JSR SETJ[139]
  966. 9660 NX1 JSR GIM
  967. 9670 BEQ NX1 ; [203]T A BYTE, [161] M[176]E!
  968. 9680 JSR TSTJ[139]
  969. 9690 BCC NX1 ; NO TIMEOUT, TRY AGAIN
  970. 9700 LDA #4:STA TIMOUT
  971. 9710 LDA BLKNUM
  972. 9720 SEC:SBC WXBLKS
  973. 9730 STA BLKNUM ; SET BLKNUMBER BACK [164] FIRST BLOCK OF THE FOUR
  974. 9740 LDA #NAK:JSR PTXMDM
  975. 9750 LDA #1:JSR DOSEQ ; NOW, S[128] NAK[173]SEQUENCE
  976. 9760 RTS
  977. 9770 ;
  978. 9780 WXACK JSR DUMPWX
  979. 9790 LDA #ACK:JSR PTXMDM
  980. 9800 LDA #0:JSR DOSEQ ; ACK LAST BLOCK RECIEVED!
  981. 9810 LDA #ACK:JSR PTXMDM
  982. 9820 LDA #2:JSR DOSEQ ; ACK LAST BLOCK RECIEVED!
  983. 9830 LDA #ACK:JSR PTXMDM
  984. 9840 LDA #2:JSR DOSEQ ; ACK LAST BLOCK RECIEVED!
  985. 9850 LDA #ACK:JSR PTXMDM
  986. 9860 LDA #0:JSR DOSEQ ; ACK LAST BLOCK RECIEVED!
  987. 9870 RTS
  988. 9880 ;
  989. 9890 [181]PRNT LDA #8
  990. 9900 JSR OUTMSG ; OUTPUT "BLOCKS "
  991. 9910 LDX #3:STX $9A:LDX [203]ODB
  992. 9920 LDA [203]ODB[170]1
  993. 9930 JSR [181]OUT
  994. 9940 LDA #9
  995. 9950 JSR OUTMSG ; OUTPUT "ERRORS "
  996. 9960 LDX BADB
  997. 9970 LDA BADB[170]1
  998. 9980 JSR [181]OUT
  999. 9990 LDA #10
  1000. 10000 JSR OUTMSG
  1001. 10010 RTS ; WE HAVE SENT DIGITAL MSGS!
  1002.