1 / RX01 RESTORE 2 / This program will receive a RX01 image and write it to the disk. The 3 / entire disk it written, with a reread check when done writing. 4 / 5 / This program should be started before the program (PC) sending the data 6 / 7 / See dump for the format of the serial data. 8 / To run start at 0200. 9 / SR9-11 shoulb be drive number 10 / Should halt at label GDHLT (140) with AC = 0 if it worked. 11 / At normal exit hitting cont will restart the program 12 13 LCD=6751 / Load the command reg with AC 14 XDR=6752 / Load or read the transfer register 15 STR=6753 / Skip on transfer request flag 16 SER=6754 / Skip on error flag 17 SDN=6755 / Skip on done flag 18 INTR=6756 / AC = 0 interrupt off, 1 = on 19 INIT=6757 / Initialize RX8/RX01 20 21 INAD=030 / Address of serial input, 30 for console 22 KCF2=6000 INAD 23 KSF2=6001 INAD 24 KCC2=6002 INAD 25 KRS2=6004 INAD 26 KIE2=6005 INAD 27 KRB2=6006 INAD 28 29 OUTAD=040 / Address of serial output, 40 for console 30 TFL2=6000 OUTAD 31 TSF2=6001 OUTAD 32 TCF2=6002 OUTAD 33 TPC2=6004 OUTAD 34 TSK2=6005 OUTAD 35 TLS2=6006 OUTAD 36 37 *10 38 000010 7777 WRTLOC, 7777 / Address to write data to disk, auto inc 39 000011 7777 BUFLOC, 7777 / Address to store next word received 40 41 *20 42 000020 0000 DRIVE, 0 / Drive # * 2 43 000021 0060 DRVMSK, 60 / Mask for drive bits 44 000022 0000 DONEFG, 0 / Set to one when fe end of data flag rx 45 000023 0104 WRCMD, 104 / 8 bit write 46 000024 0100 FILCMD, 100 / 8 bit fill buffer 47 000025 0106 RDCMD,106 / 8 bit read 48 000026 0102 EMPCMD, 102 / 8 bit empty buffer 49 000027 0116 RDERR, 116 / 8 bit read error 50 000030 0000 TRACK, 0 51 000031 0000 SECT, 0 52 000032 0000 SCNT, 0 53 000033 0000 NUMSEC, 0 / Number of sectors received but not written 54 000034 0037 K37, 37 55 000035 0377 K377, 377 56 000036 7777 KN1, 7777 57 000037 7746 M32, -32 58 000040 7663 M115, -115 59 000041 0000 CHKSUM, 0 60 000042 0000 TEMP, 0 61 000043 0000 STATE, 0 / Where in serial data we are 0 = Need ff sector head, 62 / 1 = need image size byte 63 / -1 = byte1, ... -3 = byte 3 64 000044 0000 BUFCNT, 0 / Count of words received in sector 65 000045 0000 ISRAC, 0 66 000046 0000 ISRFLG, 0 67 000047 1000 RISR, ISR 68 DECIMAL 69 000050 7576 NBLKSZ, -130 / 128 words + track and sector number 70 000051 7600 M128, -128 71 OCTAL 72 000052 0400 WRITEF, WRITE 73 000053 0600 FREREAD,REREAD 74 000054 0200 STARTF, START 75 76 000055 0000 SIZEFG, 0 77 78 000056 0010 L10, 10 79 000057 0032 L32, 32 80 000060 0400 L400, 400 81 000061 0412 L412, 412 82 000062 0422 L422, 422 /20 SAYS UNIT 1, 402 FOR CONVENIENCE 83 000063 7700 L7700, 7700 84 000064 1734 L1734, 1734 85 L4110, 86 000065 4110 LM3670, -3670 87 000066 0000 ZOO, 0 88 000067 0000 DENSW, 0 89 000070 0000 SIZE, 0 90 000071 0000 FN, 0 91 000072 0246 LTYPE, TYPE 92 000073 0000 RX02, 0 93 000074 0000 LLCD, 0 /REPLACED BY ROUTINE TO LOAD CMD REGISTER 94 000075 0722 LLCD1, LCD1 95 000076 0726 LLCD2, LCD2 96 97 *1 98 000001 5447 JMP I RISR / Interrupt handler 99 100 *140 101 000140 7402 GDHLT, HLT 102 000141 5454 JMP I STARTF 103 104 *200 105 000200 6201 START, CDF 0 / Init all our variables 106 000201 6007 CAF 107 000202 7704 CLA CLL OSR / Init variables changed during run 108 000203 7006 RTL 109 000204 7006 RTL 110 000205 0021 AND DRVMSK 111 000206 3020 DCA DRIVE 112 000207 3022 DCA DONEFG 113 000210 3041 DCA CHKSUM 114 000211 7001 IAC 115 000212 3043 DCA STATE 116 000213 7040 CMA 117 000214 3010 DCA WRTLOC 118 000215 7040 CMA 119 000216 3011 DCA BUFLOC 120 000217 3033 DCA NUMSEC 121 000220 1037 TAD M32 122 000221 3032 DCA SCNT 123 000222 6001 ION / Turn on serial interrupt handler 124 000223 7301 CLA CLL IAC / Set bit 11 to enable interrupts 125 000224 6035 KIE2 126 000225 6036 KRB2 127 / RPE / Testing, use PTR with emulator 128 / RFC 129 000226 7300 RECAL, CLA CLL 130 000227 6757 INIT 131 000230 6755 SDN / Done? 132 000231 5230 JMP .-1 133 000232 4246 JMS TYPE 134 000233 7200 ILP, CLA 135 000234 1043 TAD STATE / Wait for size flag to be sent 136 000235 7440 SZA 137 000236 5233 JMP ILP 138 000237 1070 TAD SIZE 139 000240 0035 AND K377 / Size received is only a byte so mask our size 140 000241 7041 CMA IAC 141 000242 1055 TAD SIZEFG 142 000243 7440 SZA / If disk size not same as image being sent 143 000244 7402 HLT / then halt 144 000245 5452 JMP I WRITEF 145 146 000246 0000 TYPE, 0 147 000247 1061 TAD L412 /MAKE A DOUBLE DENSITY READ STATUS CODE 148 000250 1020 TAD DRIVE 149 000251 6751 LCD 150 000252 6755 SDN 151 000253 5252 JMP .-1 152 000254 6752 XDR /GET STATUS WORD 153 000255 3073 DCA RX02 154 000256 1073 TAD RX02 155 000257 0057 AND L32 /KEEP DENSITY ERROR; DOUBLE; QUAD 156 000260 1056 TAD L10 /SINGLE=10;SING/DOUB=40;DOUB=20;QUAD=22 157 000261 0062 AND L422 /SINGLE=0;SING/DOUB=0;DOUB=20;QUAD=22 158 000262 3066 DCA ZOO /PLACE TYPE CODE, THREE LOC.'S AFTER ENTRY POINT 159 000263 6754 SER 160 000264 1066 NORMAL, TAD ZOO /FETCH BACK TYPE CODE 161 000265 7640 SZA CLA /SKIP IF A SINGLE DENSITY 162 000266 1063 TAD L7700 /DOUBLE 163 000267 1063 TAD L7700 /SINGLE=7700, DOUBLE=7600 164 000270 3067 DCA DENSW /PLACE FOR LOOP CONTROL 165 000271 1066 TAD ZOO 166 000272 7112 CLL RTR /PUT QUAD BIT TO LINK 167 000273 7650 SNA CLA /SKIP IF DOUBLE OR QUAD 168 000274 1064 TAD L1734 /SINGLE 169 000275 1065 TAD L4110 /D&Q=4110, S=6044 170 000276 7420 SNL /SKIP ON QUAD, IT'S OK RIGHT NOW 171 000277 7130 CLL CML RAR /SINGLE AND DOUBLE DIVIDE BY 2 172 000300 3070 DCA SIZE /S=7022, D=6044, Q=4110 173 000301 1067 TAD DENSW /7700 IF SINGLE, 7600 IF DOUBLE 174 000302 7146 CLL CMA RTL /375 IF SINGLE, 775 IF DOUBLE 175 000303 0060 AND L400 176 000304 1020 TAD DRIVE /VOILA, 400*DOUBLE + 20*DRIVE 177 000305 3071 DCA FN /PLACE INTO FUNCTION CONTROL WORD 178 000306 7200 CLA 179 000307 1066 TAD ZOO /FETCH BACK TYPE CODE 180 000310 7640 SZA CLA /SKIP IF A SINGLE DENSITY 181 000311 1051 TAD M128 /256 BYTES SECTOR DOUBLE 182 000312 1051 TAD M128 /128 BYTES SINGLE 183 000313 1036 TAD KN1 /2 extra bytes for sector # etc in buffer 184 000314 1036 TAD KN1 185 000315 3050 DCA NBLKSZ 186 000316 1073 TAD RX02 187 000317 0056 AND L10 188 000320 7650 SNA CLA 189 000321 5325 JMP RX01 190 000322 1076 TAD LLCD2 191 000323 3074 DCA LLCD 192 000324 5646 JMP I TYPE /RETURN 193 000325 1075 RX01, TAD LLCD1 194 000326 3074 DCA LLCD 195 000327 5646 JMP I TYPE /RETURN 196 197 PAGE 198 000400 7300 WRITE, CLA CLL 199 000401 6002 IOF / Turn off interrupts so we can safely update 200 000402 7200 CLA / # of sectors in buffer 201 000403 1033 TAD NUMSEC 202 000404 7450 SNA 203 000405 5211 JMP NODAT 204 000406 1036 TAD KN1 205 000407 3033 DCA NUMSEC 206 000410 7001 IAC 207 000411 6001 NODAT, ION 208 000412 7440 SZA 209 000413 5221 JMP WRSEC 210 000414 7040 CMA 211 000415 1022 TAD DONEFG / All data rx 212 000416 7440 SZA 213 000417 5200 JMP WRITE / no 214 000420 5313 JMP DONE / yes 215 216 000421 7300 WRSEC, CLA CLL / We have one waiting, write it 217 000422 6211 CDF 10 218 000423 1410 TAD I WRTLOC 219 000424 3030 DCA TRACK 220 000425 1410 TAD I WRTLOC 221 000426 6201 CDF 0 222 000427 3031 DCA SECT 223 000430 1024 TAD FILCMD 224 000431 4474 JMS I LLCD / Do fill buffer command 225 000432 6211 CDF 10 226 000433 6753 LOOP, STR 227 000434 7410 SKP 228 000435 5253 JMP FILL 229 000436 6755 SDN / All Done? 230 000437 5233 JMP LOOP / No 231 000440 6754 SER / Any errors 232 000441 5257 JMP WRTIT / No 233 234 000442 6752 XDR / Yes, leave error in AC and halt 235 000443 7402 HLT 236 000444 7200 CLA 237 000445 1027 TAD RDERR 238 000446 4474 JMS I LLCD 239 000447 6755 SDN 240 000450 5247 JMP .-1 241 000451 6752 XDR 242 000452 7402 HLT 243 244 000453 1410 FILL, TAD I WRTLOC 245 000454 6752 XDR 246 000455 7200 CLA 247 000456 5233 JMP LOOP 248 249 000457 7300 WRTIT, CLA CLL 250 000460 1023 TAD WRCMD 251 000461 4474 JMS I LLCD 252 000462 6753 STR 253 000463 5262 JMP .-1 254 000464 1031 TAD SECT 255 000465 6752 XDR 256 000466 6753 STR 257 000467 5266 JMP .-1 258 000470 7200 CLA 259 000471 1030 TAD TRACK 260 000472 6752 XDR 261 262 000473 6755 SDN / Done? 263 000474 5273 JMP .-1 264 000475 7200 CLA 265 000476 6754 SER / Any errors 266 000477 5311 JMP NEXT / No 267 268 000500 6752 XDR / Yes, leave error in AC and halt 269 000501 7402 HLT 270 000502 7200 CLA 271 000503 1027 TAD RDERR 272 000504 4474 JMS I LLCD 273 000505 6755 SDN 274 000506 5305 JMP .-1 275 000507 6752 XDR 276 000510 7402 HLT 277 278 000511 7300 NEXT, CLA CLL 279 000512 5200 JMP WRITE 280 281 000513 7300 DONE, CLA CLL / Done, wait for one more byte 282 000514 1010 TAD WRTLOC 283 000515 7001 IAC 284 000516 7041 CIA 285 000517 1011 TAD BUFLOC 286 000520 7440 SZA 287 000521 5313 JMP DONE 288 000522 1041 TAD CHKSUM / Got checksum byte, receive routine has added it 289 000523 0035 AND K377 / to checksum, verify final checksum (8 bit) is zero 290 000524 7440 SZA 291 000525 7402 HLT / Stop if checksum wrong 292 000526 5453 JMP I FREREAD 293 294 PAGE 295 000600 7201 REREAD, CLA IAC / Reread disk to check for errors 296 000601 3031 DCA SECT 297 000602 3030 DCA TRACK 298 000603 3041 DCA CHKSUM 299 300 000604 7300 RDCHK, CLA CLL / Standard read from manual 301 000605 1030 TAD TRACK 302 000606 1031 TAD SECT 303 000607 1035 TAD K377 304 000610 1041 TAD CHKSUM 305 000611 3041 DCA CHKSUM 306 000612 1025 TAD RDCMD 307 000613 4474 JMS I LLCD 308 000614 6753 STR 309 000615 5214 JMP .-1 310 000616 1031 TAD SECT 311 000617 6752 XDR 312 000620 6753 STR 313 000621 5220 JMP .-1 314 000622 7200 CLA 315 000623 1030 TAD TRACK 316 000624 6752 XDR 317 318 000625 6755 SDN / Done? 319 000626 5225 JMP .-1 320 000627 7200 CLA 321 000630 6754 SER / Any errors 322 000631 7410 SKP 323 000632 5310 JMP ERROR 324 000633 7300 CLA CLL 325 000634 1026 TAD EMPCMD 326 000635 4474 JMS I LLCD 327 000636 6753 ELOOP, STR 328 000637 7410 SKP 329 000640 5246 JMP EMPTY 330 000641 6755 SDN 331 000642 5236 JMP ELOOP 332 000643 6754 SER 333 000644 5252 JMP GOOD 334 000645 7402 HLT 335 000646 6752 EMPTY, XDR 336 000647 1041 TAD CHKSUM 337 000650 3041 DCA CHKSUM 338 000651 5236 JMP ELOOP 339 340 000652 7305 GOOD, CLA CLL IAC RAL / LOAD 2 341 000653 2032 ISZ SCNT 342 000654 7410 SKP 343 000655 5267 JMP NXTTRK 344 000656 1031 TAD SECT 345 000657 3031 DCA SECT 346 000660 1031 TAD SECT 347 000661 1037 TAD M32 348 000662 7550 SPA SNA 349 000663 5204 JMP RDCHK 350 000664 7001 IAC 351 000665 3031 DCA SECT 352 000666 5204 JMP RDCHK 353 000667 7201 NXTTRK, CLA IAC 354 000670 3031 DCA SECT 355 000671 1037 TAD M32 356 000672 3032 DCA SCNT 357 000673 2030 ISZ TRACK 358 000674 1030 TAD TRACK 359 000675 1040 TAD M115 360 000676 7440 SZA 361 000677 5204 JMP RDCHK 362 000700 7240 CLA CMA 363 000701 1035 TAD K377 / fe at end before checksum 364 000702 1041 TAD CHKSUM 365 000703 6211 CDF 10 366 000704 1410 TAD I WRTLOC / received checksum 367 000705 6201 CDF 0 368 000706 0035 AND K377 369 000707 5140 JMP GDHLT 370 371 000710 6752 ERROR, XDR / Yes, leave error in AC and halt 372 000711 7402 HLT 373 000712 7200 CLA 374 000713 1027 TAD RDERR 375 000714 4474 JMS I LLCD 376 000715 6755 SDN 377 000716 5315 JMP .-1 378 000717 6752 XDR 379 000720 7402 HLT 380 000721 5454 JMP I STARTF 381 382 000722 0000 LCD1, 0 383 000723 1071 TAD FN 384 000724 6751 LCD 385 000725 5722 JMP I LCD1 386 387 000726 0000 LCD2, 0 388 000727 1071 TAD FN 389 000730 3345 DCA CMD 390 000731 1345 TAD CMD 391 000732 6751 LCD 392 000733 7200 CLA 393 000734 1345 TAD CMD 394 000735 7106 CLL RTL 395 000736 7006 RTL 396 000737 7004 RAL 397 000740 6753 STR 398 000741 5340 JMP .-1 399 000742 6752 XDR 400 000743 7200 CLA 401 000744 5726 JMP I LCD2 402 000745 0000 CMD, 0 403 404 405 PAGE 406 ISR, 407 001000 3045 DCA ISRAC / Save AC 408 001001 6004 GTF 409 001002 3046 DCA ISRFLG / And flags 410 001003 6211 CDF 10 / Buffer in field 1 411 001004 6031 KSF2 / Have character waiting 412 / RSF / Testing, use PTR with emulator 413 001005 5243 JMP IRET / No, not our interrupt 414 001006 7200 CLA 415 001007 6036 KRB2 / Get character 416 / RRB RFC / PTR 417 001010 3042 DCA TEMP 418 001011 1041 TAD CHKSUM 419 001012 1042 TAD TEMP 420 001013 3041 DCA CHKSUM 421 001014 1043 TAD STATE / Find out where in sequence we are 422 001015 7450 SNA 423 001016 5251 JMP SBLK / Start of block 424 001017 7041 CMA IAC / STATE +1, get size flag 425 001020 7001 IAC 426 001021 7440 SZA 427 001022 5227 JMP DATA 428 001023 1042 TAD TEMP 429 001024 3055 DCA SIZEFG 430 001025 3043 DCA STATE 431 001026 5243 JMP IRET 432 001027 7200 DATA, CLA / data byte 433 001030 1042 TAD TEMP 434 001031 3411 DCA I BUFLOC 435 001032 2044 ISZ BUFCNT 436 001033 5243 JMP IRET 437 001034 3043 DCA STATE / End of sector, set to 0 to check header byte 438 001035 2033 ISZ NUMSEC / Inc number of sectors buffered 439 001036 1034 TAD K37 440 001037 7041 CIA 441 001040 1033 TAD NUMSEC 442 001041 7450 SNA 443 001042 7402 HLT / To many buffered, halt. Must of had to many 444 / retries in a row 445 001043 7200 IRET, CLA 446 001044 1046 TAD ISRFLG 447 001045 6005 RTF 448 001046 7200 CLA 449 001047 1045 TAD ISRAC 450 001050 5400 JMP I 0 451 001051 1035 SBLK, TAD K377 452 001052 7041 CIA 453 001053 1042 TAD TEMP / Is is a ff? 454 001054 7450 SNA 455 001055 5262 JMP FLAGOK / Yes 456 001056 7001 IAC / Is it a fe? 457 001057 7440 SZA 458 001060 7402 HLT / No, halt 459 001061 2022 ISZ DONEFG / All data received 460 001062 7240 FLAGOK, STA / -1 for byte 1 461 001063 3043 DCA STATE 462 001064 1050 TAD NBLKSZ / And setup to look for blocksize words 463 001065 3044 DCA BUFCNT 464 001066 5243 JMP IRET 465 466 $ BUFCNT 0044 BUFLOC 0011 CHKSUM 0041 CMD 0745 DATA 1027 DENSW 0067 DONE 0513 DONEFG 0022 DRIVE 0020 DRVMSK 0021 ELOOP 0636 EMPCMD 0026 EMPTY 0646 ERROR 0710 FILCMD 0024 FILL 0453 FLAGOK 1062 FN 0071 FREREA 0053 GDHLT 0140 GOOD 0652 ILP 0233 INAD 0030 INIT 6757 INTR 6756 unreferenced IRET 1043 ISR 1000 ISRAC 0045 ISRFLG 0046 K37 0034 K377 0035 KCC2 6032 unreferenced KCF2 6030 unreferenced KIE2 6035 KN1 0036 KRB2 6036 KRS2 6034 unreferenced KSF2 6031 L10 0056 L1734 0064 L32 0057 L400 0060 L4110 0065 L412 0061 L422 0062 L7700 0063 LCD 6751 LCD1 0722 LCD2 0726 LLCD 0074 LLCD1 0075 LLCD2 0076 LM3670 0065 unreferenced LOOP 0433 LTYPE 0072 unreferenced M115 0040 M128 0051 M32 0037 NBLKSZ 0050 NEXT 0511 NODAT 0411 NORMAL 0264 unreferenced NUMSEC 0033 NXTTRK 0667 OUTAD 0040 RDCHK 0604 RDCMD 0025 RDERR 0027 RECAL 0226 unreferenced REREAD 0600 RISR 0047 RX01 0325 RX02 0073 SBLK 1051 SCNT 0032 SDN 6755 SECT 0031 SER 6754 SIZE 0070 SIZEFG 0055 START 0200 STARTF 0054 STATE 0043 STR 6753 TCF2 6042 unreferenced TEMP 0042 TFL2 6040 unreferenced TLS2 6046 unreferenced TPC2 6044 unreferenced TRACK 0030 TSF2 6041 unreferenced TSK2 6045 unreferenced TYPE 0246 WRCMD 0023 WRITE 0400 WRITEF 0052 WRSEC 0421 WRTIT 0457 WRTLOC 0010 XDR 6752 ZOO 0066