/XMODEM RECEIVE OS/8 DEVICE HANDLER VERS. 1.01 Page 1 1 /XMODEM RECEIVE OS/8 DEVICE HANDLER VERS. 1.01 2 /************************************************************** 3 /THIS 2-PAGE OS/8 DEVICE HANDLER RECEIVES BINARY DATA VIA 4 /A KL8-E-TYPE SERIAL PORT, USING THE XMODEM PROTOCOL. 5 /LIMITATIONS: 6 / 1. CRC ERROR CHECKING IS NOT SUPPORTED 7 / 2. NO LIMIT ON RETRIES. BUT THE USER CAN ^C FROM THE CONSOLE. 8 /************************************************************** 9 /FOR DEVICE HANDLER DOCUMENTATION, SEE THE FOLLOWING: 10 / OS/8 SOFTWARE SUPPORT MANUAL (DEC-S8-OSSMB-A-D), 11 / CHAPTER 4: USING DEVICE HANDLERS 12 / SECTION 5.1: WRITING DEVICE HANDLERS 13 / OS/8 HANDBOOK, APRIL 1974 (DEC-S8-0SHBA-A-D) 14 / PAGES 2-56 TO 2-61: BUILD HANDLER DEVICE FORMAT 15 /************************************************************** 16 /REVISION HISTORY 17 / 1.01 27 SEPTEMBER 2023 M. EBERHARD 18 / COMMENT CORRECTIONS ONLY 19 / 1.00 23 AUGUST 2020 M. EBERHARD 20 / CREATED 21 /************************************************************** 22 /LIMIATIONS: 23 / 1. XMODEM-CRC IS NOT SUPPORTED 24 / 2. THE BUFFER SIZE MUST BE AN EVEN NUMBER OF 128-WORD 25 / OS/8 RECORDS. (ODD WILL GENERATE A FATAL ERROR RETURN) 26 / 3. RETRIES ARE UNLIMITED. (THE XMODEM SPEC SAYS TO ABORT 27 / AFTER 10 RETRIES OF ANY RECORD. THE USER CAN ALWAYS 28 / ABORT WITH ^C) 29 /************************************************************** 30 0100 XMRVERSION=0100 /OCTAL VERSION 31 32 0560 DEVTYPE=0560 /DEVICE TYPE, 0NN0, 33 /NN BETWEEN 40 AND 77 34 /(SEE DEC-S8-0SHBA-A-D PAGE 2-59) 35 36 /-------------------------------- 37 /TRANSFER PORT DEFINITIONS 38 /DTPORT MUST BE OF THE FORM 0NN0, 39 /WHERE N IS AN OCTAL DIGIT 40 /-------------------------------- 41 42 /DTPORT=0030 /OS/8 CONSOLE 43 0300 DTPORT=0300 /2ND KL8-E 44 /DTPORT=0400 /2ND "TELETYPE" ON THE PDP-8 SIMULATOR 45 46 /CALCULATE THE SPECIFIED KL8-E IOT'S FOR THE TRANSFER PORT 47 48 6301 DTPKSF=6001+DTPORT /SKIP ON INPUT FLAG 49 6302 DTPKCC=6002+DTPORT /CLEAR INPUT FLAG 50 6306 DTPKRB=6006+DTPORT /READ INPUT BUFFER, CLEAR FLAG /XMODEM RECEIVE OS/8 DEVICE HANDLER VERS. 1.01 Page 2 51 6310 DTPTFL=6010+DTPORT /SET OUTPUT FLAG 52 6311 DTPTSF=6011+DTPORT /SKIP ON OUTPUT FLAG 53 6316 DTPTLS=6016+DTPORT /WRITE TO OUTPUT, CLEAR FLAG 54 55 /********************************** 56 /* DEVICE HANDLER HEADER BLOCK * 57 /* SEE DEC-S8-0SHBA-A-D PAGE 2-57 * 58 /********************************** 59 0000 *0 60 00000 7777 -1 /-NUMBER OF DEVICE HANDLERS HERE 61 62 00001 3015 DEVICE XMR /DEVICE GROUP NAME 00002 2200 63 00003 3015 DEVICE XMR /OS/8 DEVICE NAME 00004 2200 64 00005 1560 DEVTYPE+1000 /DCB WORD: NOT FILE-STRUC'D, 65 /WRITE-ONLY,DEVICE TYPE 66 00006 4070 XMR&177+4000 /ENTRY POINT (MUST BE>24) 67 /4000 INDICATES 2-PAGE HANDLER 68 /(SEE DEC-S8-0SHBA-A-D PAGE 2-60) 69 00007 0000 ZBLOCK 2 /2 WORDS MUST BE 0 00010 0000 70 71 /*********************** 72 /* DEVICE HANDLER BODY * 73 /*********************** 74 0200 *200 /(SEE DEC-S8-0SHBA-A-D PAGE 2-57) 75 76 /VARIABLES 77 78 00200 0000 BUFADR, 0 /BUFFER ADDRESS 79 80 00201 0000 BPTRA, 0 /BUFPTR ADDRESS 81 00202 0000 B123A, 0 /BUF123 ADDRESS 82 00203 0000 SPTRA, 0 /BUFPTR ADDRESS 83 00204 0000 S123A, 0 /BUF123 ADDRESS 84 85 00205 0000 PRVREC, 0 /PREVIOUS XMODEM RECORD NUMBER 86 00206 0000 XRECCNT,0 /NUMBER OF XWINDOW RECORDS THAT FIT 87 88 /CONSTANTS 89 90 00207 0232 CTLZ, 232 /OS/8 EOF MARK 91 00210 4400 CTLZH, 4400 /CTLZ<0:3> IN <0:3> 92 /CTLZL, 5000 /CTLZ<4:7> IN <0:3> 93 00211 4546 CZLMCZ, 5000-232 /CTLZL - CTLZ 94 00212 3700 BWCMSK, 3700 /MASK FOR BUFFER WORD COUNT 95 00213 6203 CIFCDF, CDF CIF 0 /PROTOTYPE CDF CIF INSTRUCTION 96 97 /*** INITIALIZATION *** /XMODEM RECEIVE OS/8 DEVICE HANDLER VERS. 1.01 Page 3 98 /ON ENTRY: 99 / AC=0 100 /********************** 101 00214 0252 DELTA, NEWREC-IRET /BE POSITION-INDEPENDENT 102 103 TEMP1, /(REUSE) 104 00215 0000 INIT, 0 105 106 /INITIALIZE THE SERIAL PORT 107 108 00216 6302 DTPKCC /CLEAR INPUT FLAG 109 00217 6310 DTPTFL /SET OUTPUT FLAG 110 111 /INITIALIZE PAGE 1 VARIABLES 112 113 00220 3205 DCA PRVREC 114 115 /COMPUTE & REMEMBER ADDRESSES OF PAGE 2 VARIABLES 116 /INITALIZE PAGE 2 VARIABLES TOO 117 118 00221 1215 TAD INIT /GET PAGE ADDRESS 119 00222 1214 TAD DELTA /POINT TO NEWREC 120 00223 3204 DCA S123A /TEMP USE S123A AS POINTER 121 00224 7040 CMA 122 00225 3604 DCA I S123A /INITIALIZE TO -1 FOR INIT NAKS 123 124 00226 2204 ISZ S123A /POINT TO BUFPTR 125 00227 1204 TAD S123A 126 00230 3201 DCA BPTRA /CREATE LINK TO BUFPTR 127 128 00231 2204 ISZ S123A /POINT BUF123 129 00232 1204 TAD S123A 130 00233 3202 DCA B123A /CREATE LINK TO BUF123 131 132 00234 2204 ISZ S123A /POINT TO SAVPTR 133 00235 1204 TAD S123A 134 00236 3203 DCA SPTRA /CREATE LINK TO SAVPTR 135 136 00237 2204 ISZ S123A /FINALLY BECOMES LINK TO SAV123 137 138 00240 5615 JMP I INIT /RETURN 139 140 /*** EXIT ************************************************* 141 /RECEIVED THE EOT. INSTALL A ^Z AND FILL THE REST OF THE 142 /BUFFER WITH 0'S, THEN INDICATE THE END OF FILE VIA A SOFT- 143 /ERROR RETURN (RETURN1 WITH AC=0). 144 /(SEE DEC-S8-OSSMB-A-D PAGE 5-1 AND 5-3 ITEM 11) 145 /NOTE THAT THE BUFFER CAN'T BE COMPLETELY FULL WHEN THE EOT 146 /ARRIVES, BECAUSE WE HAD NO IDEA THAT THE NEXT RECORD WOULD 147 /IN FACT BE THE EOT - SO MUST HAVE ROOM FOR A RECORD. /XMODEM RECEIVE OS/8 DEVICE HANDLER VERS. 1.01 Page 4 148 / 149 /ON ENTRY: 150 / DATA FIELD IS FIELD 0 (WHERE WE ARE RUNNING) 151 / AC=0 152 / BUFADR = -(LAST BUFFER ADDRESS+1) 153 / BUFPTR = NEXT BUFFER ADDRESS TO WRITE 154 / (SPECIAL CASE IF BUF123=-1, FOR BYTE 3) 155 / BUF123 = NEXT BYTE 1-2-3 POSITION 156 / 0 FOR BYTE 1 157 / 1 FOR BYTE 2 158 / -1 FOR BYTE 3 (MEANING THE ^Z MUST BE SPLIT) 159 / BPTRA POINTS TO BUFPTR IN FIELD 0 160 / B123A POINTS TO BUF123 IN FIELD 0 161 /********************************************************** 162 00241 1601 GOTEOT, TAD I BPTRA /GET BUFPTR, THE FINAL ADDRESS 163 00242 3201 DCA BPTRA /..MOVED TO THIS PAGE 164 165 00243 1602 TAD I B123A /WHICH 1-OF-3 BYTES? 166 167 00244 7402 XMCDF2, HLT /(GETS OVERWRITTEN) 168 /SET DATA FIELD FOR BUFFER 169 170 /AC=0 FOR BYTE 1, 1 FOR BYTE 2 NEXT, -1 FOR BYTE3 171 /AS THE NEXT BUFFER 8-BIT BYTE. IF THE NEXT BYTE 172 /IS BYTE 3, THEN THE TERMINATING ^Z MUST BE SPLIT 173 /ACROSS THE LAST TWO 12-BIT BUFFER WORDS. 174 175 00245 7700 SMA CLA /IS IT -1? 176 00246 5257 JMP GEOT1 /N: BYTE 1 OR 2 177 178 00247 7240 STA /-1 179 00250 1201 TAD BPTRA /AC=-1: BACK UP TO WORD 1 180 00251 3215 DCA TEMP1 181 182 00252 1615 TAD I TEMP1 /INSTALL CTLZ<0:3> 183 00253 1210 TAD CTLZH /IN BITS <0:3> 184 00254 3615 DCA I TEMP1 185 186 00255 1601 TAD I BPTRA /GET LAST BUFFER WORD TO INSTALL 187 /..CTLZ<4:7> IN BITS <0:3> 188 00256 1211 TAD CZLMCZ /THIS WILL BECOME CTLZL COMBINED 189 /..WITH THE LAST BYTE OF DATA 190 191 /JUMP HERE IF BYTE 1 OR BYTE 2 IS NEXT: 192 /INSTALL A ^Z IN THE BYTE 1 OR BYTE 2 LOCATION 193 194 00257 1207 GEOT1, TAD CTLZ /INSTALL ^Z THERE 195 196 /AC=CTLZ OR CTLZL COMBINED WITH THE LAST BYTE OF DATA. 197 /INSTALL THIS IN THE BUFFER, AND FILL THE REST OF THE /XMODEM RECEIVE OS/8 DEVICE HANDLER VERS. 1.01 Page 5 198 /BUFFER WITH 0'S. 199 200 00260 3601 CLRLUP, DCA I BPTRA /0 201 00261 2201 ISZ BPTRA /NEXT ADDRESS 202 203 00262 0070 C0070, 0070 /A HARMLESS "AND" INSTRUCTION 204 /SINCE BPTRA CAN WRAP 205 206 00263 1201 TAD BPTRA /NEXT ADDRESS TO WRITE 207 00264 1200 TAD BUFADR /-(LAST BUFFER ADDRESS +1) 208 00265 7640 SZA CLA /END YET? 209 00266 5260 JMP CLRLUP /N: KEEP CLEARING 210 211 /RETURN1 FROM HANDLER, WITH AC=0 INDICATING EOF 212 213 00267 5372 JMP EOTEXT /RETURN1 FROM HANDLER 214 215 /*********************** 216 /* HANDLER ENTRY POINT * 217 /*********************** 218 00270 0100 XMR, XMRVERSION /THIS CODE'S VERSION NUMBER 219 /..IN ITS RETURN ADDRESS SLOT 220 221 /------------------------------- 222 /PARSE HANDLER INPUT PARAMETERS 223 /(SEE DEC-S8-OSSMB-A-D PAGE 5-1) 224 /------------------------------- 225 00271 7330 STL CLA RAR /AC=4000 226 00272 1670 TAD I XMR /GET FUNCTION WORD, R/W BIT TO LINK 227 00273 0212 AND BWCMSK /EXTRACT MAX # OF RECORDS TO TRANSFER 228 00274 7002 BSW /BITS 1-5 INTO BITS 7-11 229 00275 3206 DCA XRECCNT /OS/8 128-WORD RECORD COUNT FOR NOW 230 231 00276 6214 RDF /FIND OUT THE USER'S INSTR. FIELD 232 00277 1213 TAD CIFCDF /FORM OUR EXIT CIF CDF 233 00300 3373 DCA RSTFLD /STORE AWAY FOR EXIT ROUTINE 234 235 00301 1670 TAD I XMR /GET FUNCTION WORD AGAIN 236 00302 0262 AND C0070 /ISOLATE FIELD OF BUFFER 237 00303 1316 TAD CDFOP /FORM CDF TO BUFFER'S FIELD 238 00304 3347 DCA XMCDF1 /STORE WHERE IT WILL BE USEFUL 239 00305 1347 TAD XMCDF1 /..TWO PLACES 240 00306 3244 DCA XMCDF2 241 242 00307 2270 ISZ XMR /POINT TO BUFFER ADDRESS 243 00310 1670 TAD I XMR /GET BUFFER ADDRESS 244 00311 3200 DCA BUFADR /AND SAVE IT IN PAGE 1 245 246 00312 2270 ISZ XMR /POINT TO OS/8 RECORD NUMBER 247 /XMODEM RECEIVE OS/8 DEVICE HANDLER VERS. 1.01 Page 6 248 00313 7630 SZL CLA /LINK=1 MEANS OUTPUT 249 00314 5371 JMP ERREXT /OUTPUT IS AN ERROR: ERROR RETURN 250 251 /------------------------------------------------------ 252 /SET UP FOR NEW TRANSFER IF STARTING WITH 0S/8 RECORD 0 253 /(SEE DEC-S8-OSSMB-A-D PAGE 5-1 ITEM 2) 254 /ON ENTRY: 255 / AC=0 256 / L=0 257 / XMT POINTS TO OS/8 RECORD NUMBER 258 /------------------------------------------------------ 259 00315 1670 TAD I XMR /GET OS/8 RECORD NUMBER 260 261 00316 6201 CDFOP, CDF 0 /THE FOLLOWING OPS ARE IN FIELD 0 262 /ALSO PROTOTYPE FOR CDF NN 263 264 00317 7650 SNA CLA /RECORD 0 MEANS INITIALIZE 1ST 265 00320 4215 JMS INIT 266 IRET, 267 268 /-------------------------------------------------- 269 /INITIALIZE VARIABLES FOR EACH CALL TO THIS HANDLER 270 /-------------------------------------------------- 271 00321 1200 TAD BUFADR 272 00322 3601 DCA I BPTRA /PUT BUFFER ADDRESS INTO PAGE 2 273 00323 3602 DCA I B123A /INITIALIZE 1-2-3 BYTE COUNTER 274 275 /------------------------------------------------- 276 /COMPUTE AND REMEMBER THE LAST BUFFER ADDRESS. 277 /ALSO TEST XRECCNT FOR BITS 1-5 & 9-11 ALL 0, 278 /WHICH MEANS CLOSE. (WE DON'T ACTUALLY CHECK 279 /BITS 9-11 HERE. ONLY 0 IS MEANINGFUL ANYWAY.) 280 /ON ENTRY: 281 / AC=0 282 / XRECCNT<7:11> = # OF 128-WORD RECORDS IN BUFFER 283 / BUFADR = FIRST BUFFER ADDRESS 284 /ON EXIT: 285 / AC=0 286 / BUFADR = -(LAST BUFFER ADDRESS+1) 287 /------------------------------------------------- 288 00324 1206 TAD XRECCNT /NUMBER OF 128-WORD RECORDS 289 290 00325 7450 SNA 291 00326 5367 JMP NRMEXT /XRECCNT=0 MEANS CLOSE (DO NOTHING) 292 293 00327 7002 BSW /BITS <7:11> INTO BITS <1:5> 294 00330 7104 CLL RAL /..AND THEN INTO <0:4>, TO BE THE 295 /..NUMBER OF 12-BIT WORDS IN BUFFER 296 297 00331 1200 TAD BUFADR /+ 1ST BUFFER ADDRESS /XMODEM RECEIVE OS/8 DEVICE HANDLER VERS. 1.01 Page 7 298 00332 7041 CIA /MAKE IT NEGATIVE FOR COMPARING 299 00333 3200 DCA BUFADR /-(LAST BUFFER ADDRESS+1) 300 301 /----------------------------------------------------------- 302 /COMPUTE XMODEM RECORD COUNT = -(OS/8 RECORD COUNT)*3/2 303 /ALSO CHECK FOR ILLEGAL ODD NUMBER OF OS/8 RECORDS. 304 /(ONE OS/8 BLOCK COMPRISES TWO 128-WORD RECORDS) 305 /(SEE DEC-S8-OSSMB-A-D PAGE 4-3 ITEM 5 AND PAGE 5-3 ITEM 12) 306 /ON ENTRY: 307 / AC=0 308 / XRECCNT=NUMBER OF 0S/8 128-WORD RECORDS 309 /ON EXIT: 310 / AC=0 311 / XRECCNT=-(NUMBER OF 128-BYTE XMODEM RECORDS) 312 /----------------------------------------------------------- 313 00334 1206 TAD XRECCNT /OS/8 128-WORD RECORD COUNT 314 00335 7110 CLL RAR /DIVIDE BY 2, REMAINDER TO L 315 00336 7430 SZL 316 00337 5371 JMP ERREXT /ODD IS AN ERROR: FATAL ERROR RETURN 317 318 00340 1206 TAD XRECCNT /(OS/8 RECORD COUNT)*3/2 319 320 00341 7041 CIA /MAKE IT NEGATIVE FOR COUNTER 321 00342 3206 DCA XRECCNT 322 323 /--------------------------------------------------- 324 /RECEIVE AND VALIDATE AN XMODEM RECORD 325 /ON ENTRY: 326 / ACHCHR=NAK THE FIRST TIME, ACK THEREAFTER 327 / PRVREC=PREVIOUS XMODEM RECORD NUMBER 328 / BUFPTR=ADDRESS OF NEXT BUFFER WORD 329 / BUF123=STARTING 8-BIY BYTE LOCATION 330 / 0 FOR 1ST BYTE 331 / 1 FOR 2ND BYTE 332 / -1 FOR 3RD BYTE 333 /--------------------------------------------------- 334 RECLUP, 335 336 /------------------------------------- 337 /SAVE BUFFER LOCATION FOR XMODEM RETRY 338 /ON ENTRY: 339 / AC=0 340 /------------------------------------- 341 00343 1601 TAD I BPTRA 342 00344 3603 DCA I SPTRA 343 00345 1602 TAD I B123A 344 00346 3604 DCA I S123A 345 346 /------------------------------------------------------ 347 /GO TO PAGE 2 TO RECEIVE THE ENTIRE NEXT XMODEM RECORD. /XMODEM RECEIVE OS/8 DEVICE HANDLER VERS. 1.01 Page 8 348 /GETREC RETURNS WITH DATA FIELD=0 349 /------------------------------------------------------ 350 GOGETR, /ENTRY FOR IGNORING REPEATED REC 351 352 00347 7402 XMCDF1, HLT /(GETS OVERWRITTEN) 353 /SET DATA FIELD FOR BUFFER 354 355 00350 4376 JMS GETREC /GET RECORD DATA 356 00351 5371 JMP ERREXT /RETURN1 MEANS FATAL ERROR 357 00352 5241 JMP GOTEOT /RETURN2 MEANS EOT RECEIVED 358 /RETURN3 MEANS GOOD RECORD 359 /AC=NEW RECORD NUMBER 360 361 /----------------------------------------- 362 /GOT AN ERROR-FREE RECORD. SEE IF IT'S THE 363 /RIGHT RECORD NUMBER. ABORT IF NOT. 364 /ON ENTRY: 365 / AC=NEWREC > 0 366 /----------------------------------------- 367 00353 7041 CIA /SUBTRACT NEWREC 368 00354 1205 TAD PRVREC /..FROM PREVIOUS RECORD 369 370 00355 7450 SNA /SAME RECORD? 371 00356 5347 JMP GOGETR /Y: IGNORE IT 372 373 /AC=PRVREC - NEWREC <> 0 374 375 00357 7001 IAC /TEST 376 00360 0364 AND BMASK1 /BOTTOM 8 BITS ONLY 377 00361 7640 SZA CLA 378 00362 5371 JMP ERREXT /LOST RECORD FATAL ERROR 379 380 /CORRECT (NEXT SEQUENTIAL) RECORD RECEIVED WITHOUT ERRORS. 381 /UPDATE PRVREC 382 383 00363 2205 ISZ PRVREC /WON'T WRAP UNTIL 4K RECORDS... 384 385 00364 0377 BMASK1, 0377 /BYTE MASK 386 /ALSO HARMLESS "AND" INSTRUCTION 387 /SINCE PRVREC COULD POSSIBLY WRAP 388 389 /MORE ROOM FOR RECORDS? LOOP TO GET THEM 390 /AC=0 391 00365 2206 ISZ XRECCNT /ROOM FOR ANOTHER? 392 00366 5343 JMP RECLUP 393 394 /----------------------------------------------------------- 395 /EXITS FROM HANDLER 396 / NRMEXT IS THE NORMAL EXIT FOR A FULL BUFFER 397 / ON ENTRY: /XMODEM RECEIVE OS/8 DEVICE HANDLER VERS. 1.01 Page 9 398 / AC=0 399 / ON EXIT VIA RETURN2 400 / AC=0 401 / ERREXT INIDCATES A FATAL ERROR: 402 / -HANDLER CALL FOR OUTPUT 403 / -HANDLER CALL WITH ODD NUMBER OF 128-WORD RECORDS 404 / -TIMEOUT WAITING FOR THE SENDER 405 / -A LOST XMODEM RECORD 406 / ON EXIT VIA RETURN1 407 / AC=-1 408 / EOTEXT INDICATES END OF FILE; THE EOT WAS ENCOUNTERED 409 / ON ENTRY: 410 / AC=0 411 / ON EXIT VIA RETURN1 412 / AC=0 413 / A ^Z HAS BEEN INSALLED IN THE BUFFER AFTER THE LAST 414 / WORD, AND THE REMAINDER OF THE BUFFER IS ZEROED. 415 /----------------------------------------------------------- 416 00367 2270 NRMEXT, ISZ XMR /POINT TO NORMAL RETURN2 417 00370 5372 JMP EOTEXT /SKIP OVER ERROR 418 00371 7240 ERREXT, STA /AC=-1 FOR FATAL ERROR 419 420 00372 2270 EOTEXT, ISZ XMR /FATAL ERROR OR EOF RETURN1 421 422 00373 7402 RSTFLD, HLT /(GETS OVERWRITTEN) RESTORE FIELDS 423 00374 5670 JMP I XMR /AND RETURN 424 425 /*** SUBROUTINE ************************************** 426 /RECEIVE A COMPLETE XMODEM RECORD, WRITING ITS DATA 427 /INTO THE OS/8 BUFFER, WITH RETRIES ON CHECKSUM ERRORS 428 /AND TIMEOUTS ON RECEIVED CHARACTERS 429 / 430 /THIS SUBROUTINE CROSSES THE PAGE BOUNDARY 431 / 432 /ON ENTRY: 433 / AC=0 434 / BUFPTR=ADDRESS OF NEXT BUFFER WORD 435 / BUF123=0 FOR BYTE 1 436 / 1 FOR BYTE 2 437 / -1 FOR BYTE 3 438 / SAVPTR=BUFPTR 439 / SAV123=BUF123 440 / NEWREC = 0 ON FIRST CALL 441 /ON EXIT: 442 / RETURN1 (FATAL TIMEOUT): 443 / AC=0 444 / DATA FIELD IS 0 445 / RETURN2 (EOT RECEIVED): 446 / AC=0 447 / BUF123=NEXT 1-OF-3 POSITION: /XMODEM RECEIVE OS/8 DEVICE HANDLER VERS. 1.01 Page 10 448 / 0: BYTE 1, 1: BYTE 2, -1: BYTE 3 449 / IF BUF123=0: BUFPTR=NEXT BUFFER ADDRESS TO WRITE 450 / OTHERWISE BUFPTR=LAST BUFFER ADDRESS WRITTEN 451 / DATA FIELD IS 0 452 / RETURN3(SUCCESS): 453 / AC=0 454 / NEWREC=RECEIVED RECORD NUMBER 455 / BUF123=NEXT 1-OF-3 POSITION: 456 / 0: BYTE 1, 1: BYTE 2, -1: BYTE 3 457 / IF BUF123=-1, BUFPTR=LAST BUFFER ADDRESS WRITTEN 458 / OTHERWISE BUFPTR=NEXT BUFFER ADDRESS TO WRITE 459 / DATA FIELD IS 0 460 /***************************************************** 461 0376 *376 /MAKE ALIGNMENT MAGIC 462 463 00376 0000 GETREC, 0 /RETURN ADDRESS 464 465 00377 1376 TAD GETREC /RETURN ADDRESS 466 467 /---PAGE BREAK HERE--- 468 469 00400 3324 DCA GRRET /CREATE RETURN ADDRESS 470 471 /---------------------------------------------- 472 /ACK THE PREVIOUS RECORD (OR NAK IF ERROR) 473 /ON ENTRY: 474 / AC=0 475 / NEWREC<0 TO START THE TRANSFER (WITH NAKS) 476 /ON ENTRY AT XRETRY: 477 / AC=0 478 /---------------------------------------------- 479 00401 1373 TAD NEWREC /1ST RECORD? 480 00402 7710 SPA CLA /<0 MEANS YES, SO SEND NAK 481 482 00403 1364 XRETRY, TAD NAKMAK /Y: SEND NAK INSTEAD 483 00404 4325 JMS SNDACK /SEND NAK OR ACK 484 485 /BACK UP IF THIS IS A RETRY 486 487 00405 1376 TAD SAVPTR /BACK UP THE BUFFER POINTERS 488 00406 3374 DCA BUFPTR 489 00407 1377 TAD SAV123 490 00410 3375 DCA BUF123 491 492 /------------------------------- 493 /SET UP FOR RECEIVING ONE RECORD 494 /------------------------------- 495 00411 3325 DCA CHKSUM /INITIALIZE CHECKSUM 496 497 00412 1332 TAD XBYTES /-BYTES PER XMODEM RECORD /XMODEM RECEIVE OS/8 DEVICE HANDLER VERS. 1.01 Page 11 498 00413 3367 DCA XBCOUNT /SET UP BYTE COUNT 499 500 /-------------------------------- 501 /GET THE RECORD HEADER 502 / RECORD HEADER: 503 / SOH 504 / RECORD NUMBER 505 / COMPLEMENTED RECORD NUMBER 506 /ON ENTRY: 507 / AC=0 508 /-------------------------------- 509 00414 1306 TAD SOHTO /SOH TIMEOUT VALUE 510 00415 3371 DCA RXTMRH 511 512 00416 1373 TAD NEWREC /FIRST RECORD (NEWREC<0)? 513 00417 4334 JMS TPIN /GET TRANSFER PORT BYTE WITH TIMEOUT 514 00420 1365 TAD NSOH /RECEIVED AN SOH? (-1 IF TIMEOUT) 515 00421 7450 SNA 516 00422 5235 JMP GOTSOH 517 518 /NOT AN SOH. WAS IT THE EOT? 519 /WE WILL FALL THROUGH HERE ON INITIAL NAK TIMEOUT 520 521 00423 1366 TAD SOHMEOT /EOT? 522 00424 7650 SNA CLA 523 00425 5233 JMP GOTEOH /Y: DONE WITH TRANSFER 524 525 /NEITHER SOH NOR EOT, OR FAILED RECORD NUMBER. IT IS 526 /GARBAGE. WAIT UNTIL LINE IS QUIET FOR 1 SECOND, AND 527 /THEN SEND A NAK TO TRY AGAIN 528 529 00426 7240 PURGE, STA /TELL TPIN TO RETURN HERE IF TIMEOUT 530 00427 4334 JMS TPIN /RETURN HERE IF TIMEOUT 531 00430 7700 SMA CLA /<0 MEANS TIMEOUT 532 00431 5226 JMP PURGE />=0 NO TIMEOUT, EAT MORE GARBAGE 533 00432 5203 JMP XRETRY /LINE IS QUIET, TRY AGAIN 534 535 /Y: ACK THE EOT AND RETURN 536 537 00433 4325 GOTEOH, JMS SNDACK 538 00434 5321 JMP GRRET2 /RETURN2 539 540 /GOT AN SOH. NOW GET AND VALIDATE THE RECORD NUMBER 541 /AC=0 HERE 542 543 00435 4334 GOTSOH, JMS TPIN /GET RECORD NUMBER 544 00436 3373 DCA NEWREC /AC=RECORD NUMBER 545 546 00437 4334 JMS TPIN /GET INVERTED RECORD NUMBER 547 00440 7001 IAC /AC=NEGATIVE RECORD NUMBER /XMODEM RECEIVE OS/8 DEVICE HANDLER VERS. 1.01 Page 12 548 00441 1373 TAD NEWREC /COMPARE TO POSITIVE 549 00442 0362 AND BMASK2 /8-BITS PLEASE 550 00443 7640 SZA CLA /CORRECT INVERTED RECORD NUMBER? 551 00444 5226 JMP PURGE /N: PURGE GARBAGE 552 553 /--------------------------------------------------------- 554 /LOOP TO RECEIVE THE NEXT 128 8-BIT XMODEM BYTES, AND SAVE 555 /THEM IN THE NEXT 128*2/3 12-BIT BUFFER WORDS, COMPUTING 556 /THE CHECKSUM AS WE GO. EACH 3 XMODEM BYTES BECOMES TWO 557 /12-BIT BUFFER WORDS, ENCODED AS FOLLOWS 558 /(DEC-S8-OSSMB-A-D PAGE 5-3, ITEM 11): 559 / 560 / 0 3 4 11 561 / ------------ ---------------------------- 562 / WORD 1 |BYTE 3 <0:3>| BYTE 1 <0:7> | 563 / ------------ ---------------------------- 564 / WORD 2 |BYTE 3 <4:7>| BYTE 2 <0:7> | 565 / ------------ ---------------------------- 566 /ON ENTRY: 567 / AC=0 568 / CHKSUM=0 569 / XBCOUNT=-128 570 / BUFPTR=ADDRESS OF NEXT BUFFER WORD 571 / BUF123=0 FOR BYTE 1 572 / 1 FOR BYTE 2 573 / -1 FOR BYTE 3 574 /ON EXIT: 575 / (SEE ABOVE COMMENT) 576 /--------------------------------------------------------- 577 00445 4334 XRDLUP, JMS TPIN /GET BYTE INTO AC AND RXBYTE 578 00446 1325 TAD CHKSUM 579 00447 3325 DCA CHKSUM 580 581 /ENQUEUE RXBYTE, PACKING IT INTO THE BUFFER 582 /THE WAY OS/8 LIKES IT 583 584 00450 1375 TAD BUF123 585 00451 2375 ISZ BUF123 /WHICH 8-BIT BYTE NEXT? 586 00452 5277 JMP XRD1 /WAS -1: ENQUEUE AS BYTE 3 587 588 /BUF123 WAS -1: ENQUEUE RXBYTE AS BYTE 3, SPLIT ACROSS 2 589 /BUFFER WORDS. SINCE THIS MIGHT BE THE FIRST BYTE OF A 590 /RETRIED XMODEM RECORD, WE CAN'T ASSUME THAT THE T0P 4 591 /BITS OF THESE 2 BUFFER WORDS ARE 0. 592 /AC=-1 HERE 593 594 00453 1374 TAD BUFPTR /DECREMENT BUFPTR 595 00454 3334 DCA TEMP2 /POINT TO 1ST OF 2 BUFFER WORDS 596 597 00455 1734 TAD I TEMP2 /CLEAR WORD 1<0:3> /XMODEM RECEIVE OS/8 DEVICE HANDLER VERS. 1.01 Page 13 598 00456 0362 AND BMASK2 599 00457 3734 DCA I TEMP2 600 601 00460 1774 TAD I BUFPTR /CLEAR WORD 2<0:3> 602 00461 0362 AND BMASK2 603 00462 3774 DCA I BUFPTR 604 605 00463 1370 TAD RXBYTE /MOVE RECEIVED BYTE<0:7> 606 00464 7106 CLL RTL /..FROM RXBYTE<4:11> 607 00465 7106 CLL RTL /..TO RXBYTE<0:7> 608 00466 0306 AND C7400 /AC<0:3>=RECEIVED BYTE<0:3> 609 00467 1734 TAD I TEMP2 /COMBINE INTO 1ST BUFFER WORD 610 00470 3734 DCA I TEMP2 611 612 00471 1370 TAD RXBYTE /NOW FOR RECEIVED BYTE<4:7> 613 00472 7002 BSW 614 00473 7006 RTL /..INTO BITS <0:3> 615 00474 0306 AND C7400 /AC<0:3>=RECEIVED BYTE<4:7> 616 617 00475 1774 TAD I BUFPTR /COMBINE INTO 2ND BUFFER WORD 618 00476 3370 DCA RXBYTE /AND A=0 NOW 619 620 /AC=0 FOR BYTE 1 OR BYTE 3 621 /AC=1 FOR BYTE 2, AND BUF123=2 (WHICH MUST BE SET TO -1) 622 /WORD TO WRITE I IN RXBYTE 623 624 00477 7161 XRD1, CLL CML CMA IAC /L=0 AND AC=0 IF BYTE 1 OR BYTE 3 625 /L=1 AND AC=-1 IF BYTE 2 626 00500 7440 SZA /BYTE 2? 627 00501 3375 DCA BUF123 /WAS BYTE 2: BUF123=-1 628 629 00502 1370 TAD RXBYTE 630 00503 3774 DCA I BUFPTR /ENQUEUE BYTE 1 OR 2 631 632 00504 7420 SNL /DON'T BUMP BUFPTR IF BYTE 2 633 00505 2374 ISZ BUFPTR /POINT TO NEXT 12-BIT WORD 634 635 SOHTO, /8-SECOND TIMEOUT TO RECEIVE SOH 636 00506 7400 C7400, 7400 /HARMLESS "NOP" INSTRUCTION 637 /IN CASE BUFFER WRAPS 638 639 /NEXT XMODEM BYTE, UNLESS WE'RE DONE 640 641 00507 2367 XRD4, ISZ XBCOUNT 642 00510 5245 JMP XRDLUP /LOOP FOR ALL DATA WORDS 643 644 /GET AND VERIFY THE RECORD CHECKSUM 645 646 00511 4334 JMS TPIN /GET CHECKSUM AT END OF RECORD 647 00512 7041 CIA /XMODEM RECEIVE OS/8 DEVICE HANDLER VERS. 1.01 Page 14 648 00513 1325 TAD CHKSUM /COMPARE TO COMPUTED CHECKSUM 649 00514 0362 AND BMASK2 /STRIP THE HIGH BITS 650 651 00515 7640 SZA CLA /CHECKSUM MATCH? 652 00516 5203 JMP XRETRY /N: NAK IT AND TRY AGAIN 653 654 00517 1373 TAD NEWREC /NEW RECORD NUMBER FOR RETURN3 655 656 /FALL INTO RETURN3 FOR SUCCESSFUL RETURN 657 658 /------------------------------------- 659 /RETURNS FROM GETREC WITH DATA FIELD=0 660 /ON ENTRY: 661 / AC=NEWREC FOR RETURN3, 0 OTHERWISE 662 / GRRET POINTS TO RETURN1 FROM GETREC 663 /------------------------------------- 664 00520 2324 ISZ GRRET /RETURN3 (SUCCESS) 665 00521 2324 GRRET2, ISZ GRRET /RETURN2 (EOT RECEIVED) 666 GRRET1, /RETURN1 (FATAL ERROR) 667 00522 6201 CDF 0 /BACK TO FIELD 0 668 00523 5724 JMP I GRRET 669 670 00524 0000 GRRET, 0 /PAGE-JUMPING RETURN ADDRESS 671 672 /*** SUBROUTINE ********************** 673 / SEND NAK OR ACK TO THE TRANSFER PORT 674 /ON ENTRY: 675 / AC=0 TO SEND AN ACK 676 / AC=NAKMAK TO SEND NK 677 /ON EXIT: 678 / AC=0 679 /TRASHES CHKSUM 680 /************************************* 681 CHKSUM, /(REUSE) XMODEM CHECKSUM 682 683 00525 0000 SNDACK, 0 684 00526 1363 TAD ACK /FORM ACK OR NAK 685 686 00527 6311 DTPTSF /DEVICE READY? 687 00530 5327 JMP .-1 /N: KEEP WAITING 688 689 00531 6316 DTPTLS /SEND AC TO DEVICE 690 691 ABORT, /EXIT TO MONITOR AT 7600 IN PAGE 0 692 00532 7600 XBYTES, -200 /7600=-200=-BYTES PER XMODEM RECORD 693 /ALSO ALTERNATE "CLA" 694 00533 5725 JMP I SNDACK /RETURN 695 696 /*** SUBROUTINE *************************************** 697 /RECEIVE A TRANSFER PORT BYTE WITH TIMEOUT AND TEST FOR /XMODEM RECEIVE OS/8 DEVICE HANDLER VERS. 1.01 Page 15 698 /USER ^C. (SEE DEC-S8-OSSMB-A-D OS8 PAGE 5-2 ITEM 4) 699 /SOME RXTMRH TIMEOUT VALUES: 700 / 1-SECOND TIMEOUT: 7741 701 / 2-SECOND TIMEOUT: 7700 702 / 5-SECOND TIMEOUT: 7545 703 / 8-SECOND TIMEOUT: 7400 704 / 10-SECOND TIMEOUT: 7312 705 / 30-SECOND TIMEOUT: 6136 706 / 60-SECOND TIMEOUT: 4274 707 /ON ENTRY: 708 / AC>=0 IF TIMEOUT ABORTS 709 / AC<0 IF TIMEOUT RETURNS 710 / RXTMRH=TIMEOUT VALUE (>0) 711 / RXTMRL IS RANDOM. (WHO CARES?) 712 /ON SUCCESS RETURN: 713 / AC=RXBYTE=RECEIVED BYTE >=0 714 / RXTMRH=DATATO 715 /ON TIMEOUT RETURN 716 / AC=AC VALUE FROM ENTRY 717 / RXBYTE<0 718 /HARD JUMP TO GRRET1 WITH AC=0 IF NOT TIMEOUT RETURN 719 /TRASHES TEMP2 720 /****************************************************** 721 TEMP2, /(REUSE) 722 00534 0000 TPIN, 0 /RETURN ADDRESS 723 00535 3370 DCA RXBYTE /<0 MEANS RETURN ON ERROR 724 725 /7.6 US PER INNER-LOOP PASS. 726 /AC=0 THROUGHOUT THE LOOP UNTIL A BYTE ARRIVES 727 728 /TEST FOR TRANSFER PORT BYTE, KEEP WAITING IF NOT, 729 /WITH TIMEOUT 730 731 00536 6301 TPILUP, DTPKSF /(2,6)TEST FOR BYTE 732 00537 5346 JMP TPIWAT /(1.2)WAIT FOR INPUT 733 734 00540 6306 DTPKRB /GET TRANSFER PORT BYTE 735 00541 3370 DCA RXBYTE /STASH IT FOR A MOMENT 736 737 00542 1357 TPIRET, TAD DATATO /RESET TIMEOUT TIMER 738 00543 3371 DCA RXTMRH 739 740 00544 1370 TAD RXBYTE /RECOVER BYTE FOR RETURN 741 00545 5734 JMP I TPIN /RETURN WITH AC=BYTE 742 743 /NO BYTE YET. BUMP TIMER AND CHECK FOR TIMEOUT 744 745 /TEST FOR ^C FROM USER, AND ABORT FROM GETREC IF SO. 746 747 00546 2372 TPIWAT, ISZ RXTMRL /(2.6)INNER LOOP /XMODEM RECEIVE OS/8 DEVICE HANDLER VERS. 1.01 Page 16 748 00547 5336 JMP TPILUP /(1.2) 749 750 /EVERY 32 MSEC, TEST FOR ^C FROM USER, 751 /AND ABORT FROM GETREC IF SO. 752 753 00550 6034 KRS /READ STATIC FROM KEYBOARD 754 00551 1366 TAD NCTRLC /^C ABORT? 755 00552 7650 SNA CLA 756 00553 5732 JMP I ABORT /YES - EXIT TO MONITOR 757 758 /BUMP HIGH TIMER WORD, TEST FOR TIMEOUT. 759 760 00554 2371 ISZ RXTMRH /TIMEOUT? 761 00555 5336 JMP TPILUP /N: KEEP WAITING 762 763 /TIMEOUT. ABORT OR RETURN? 764 /AC=0 765 00556 1370 TAD RXBYTE /RETURN ON TIMEOUT? 766 00557 7700 DATATO, SMA CLA /OPCODE=7700, FOR 2-SECOND TIMEOUT 767 00560 5322 JMP GRRET1 /N: ABORT GETREC VIA ITS RETURN1 768 00561 5342 JMP TPIRET /Y:TIMEOUT RETURN, AC<0 769 770 /CONSTANTS 771 772 00562 0377 BMASK2, 0377 /BYTE MASK 773 00563 0006 ACK, 6 /XMODEM ACK 774 00564 0017 NAKMAK, 25-6 /XMODEM NAK - XMODEM ACK 775 M0001, 776 00565 7777 NSOH, -1 /-XMODEM SOH 777 NCTRLC, /-ASCII ^C=-3 778 00566 7775 SOHMEOT,-3 /XMODEM SOH - XMODEM EOT = 1-4 = -3 779 780 /VARIABLES 781 782 00567 0000 XBCOUNT,0 /-XMODEM BYTE COUNT 783 784 00570 0000 RXBYTE, 0 /RECEIVED BYTE 785 00571 0000 RXTMRH, 0 /TIMEOUT TIMER HIGH WORD 786 00572 0000 RXTMRL, 0 /TIMEOUT TIMER LOW WORD 787 788 /THESE 5 MUST STAY IN THIS ORDER 789 790 00573 0000 NEWREC, 0 /NEW RECORD NUMBER 791 792 00574 0000 BUFPTR, 0 /POINTER INTO OS/8 BUFFER 793 00575 0000 BUF123, 0 /3-BYTE COUNTER 794 00576 0000 SAVPTR, 0 /BUFPTR FOR XMODEM RETRY 795 00577 0000 SAV123, 0 /BUF123 FOR XMODEM RETRY 796 797 $ No detected errors No links generated