| 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 | WRTLOC, 7777 / Address to write data to disk, auto inc |
| 39 | BUFLOC, 7777 / Address to store next word received |
| 40 | |
| 41 | *20 |
| 42 | DRIVE, 0 / Drive # * 2 |
| 43 | DRVMSK, 60 / Mask for drive bits |
| 44 | DONEFG, 0 / Set to one when fe end of data flag rx |
| 45 | WRCMD, 104 / 8 bit write |
| 46 | FILCMD, 100 / 8 bit fill buffer |
| 47 | RDCMD,106 / 8 bit read |
| 48 | EMPCMD, 102 / 8 bit empty buffer |
| 49 | RDERR, 116 / 8 bit read error |
| 50 | TRACK, 0 |
| 51 | SECT, 0 |
| 52 | SCNT, 0 |
| 53 | NUMSEC, 0 / Number of sectors received but not written |
| 54 | K37, 37 |
| 55 | K377, 377 |
| 56 | KN1, 7777 |
| 57 | M32, -32 |
| 58 | M115, -115 |
| 59 | CHKSUM, 0 |
| 60 | TEMP, 0 |
| 61 | 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 | BUFCNT, 0 / Count of words received in sector |
| 65 | ISRAC, 0 |
| 66 | ISRFLG, 0 |
| 67 | RISR, ISR |
| 68 | DECIMAL |
| 69 | NBLKSZ, -130 / 128 words + track and sector number |
| 70 | M128, -128 |
| 71 | OCTAL |
| 72 | WRITEF, WRITE |
| 73 | FREREAD,REREAD |
| 74 | STARTF, START |
| 75 | |
| 76 | SIZEFG, 0 |
| 77 | |
| 78 | L10, 10 |
| 79 | L32, 32 |
| 80 | L400, 400 |
| 81 | L412, 412 |
| 82 | L422, 422 /20 SAYS UNIT 1, 402 FOR CONVENIENCE |
| 83 | L7700, 7700 |
| 84 | L1734, 1734 |
| 85 | L4110, |
| 86 | LM3670, -3670 |
| 87 | ZOO, 0 |
| 88 | DENSW, 0 |
| 89 | SIZE, 0 |
| 90 | FN, 0 |
| 91 | LTYPE, TYPE |
| 92 | RX02, 0 |
| 93 | LLCD, 0 /REPLACED BY ROUTINE TO LOAD CMD REGISTER |
| 94 | LLCD1, LCD1 |
| 95 | LLCD2, LCD2 |
| 96 | |
| 97 | *1 |
| 98 | JMP I RISR / Interrupt handler |
| 99 | |
| 100 | *140 |
| 101 | GDHLT, HLT |
| 102 | JMP I STARTF |
| 103 | |
| 104 | *200 |
| 105 | START, CDF 0 / Init all our variables |
| 106 | CAF |
| 107 | CLA CLL OSR / Init variables changed during run |
| 108 | RTL |
| 109 | RTL |
| 110 | AND DRVMSK |
| 111 | DCA DRIVE |
| 112 | DCA DONEFG |
| 113 | DCA CHKSUM |
| 114 | IAC |
| 115 | DCA STATE |
| 116 | CMA |
| 117 | DCA WRTLOC |
| 118 | CMA |
| 119 | DCA BUFLOC |
| 120 | DCA NUMSEC |
| 121 | TAD M32 |
| 122 | DCA SCNT |
| 123 | ION / Turn on serial interrupt handler |
| 124 | CLA CLL IAC / Set bit 11 to enable interrupts |
| 125 | KIE2 |
| 126 | KRB2 |
| 127 | / RPE / Testing, use PTR with emulator |
| 128 | / RFC |
| 129 | RECAL, CLA CLL |
| 130 | INIT |
| 131 | SDN / Done? |
| 132 | JMP .-1 |
| 133 | JMS TYPE |
| 134 | ILP, CLA |
| 135 | TAD STATE / Wait for size flag to be sent |
| 136 | SZA |
| 137 | JMP ILP |
| 138 | TAD SIZE |
| 139 | AND K377 / Size received is only a byte so mask our size |
| 140 | CMA IAC |
| 141 | TAD SIZEFG |
| 142 | SZA / If disk size not same as image being sent |
| 143 | HLT / then halt |
| 144 | JMP I WRITEF |
| 145 | |
| 146 | TYPE, 0 |
| 147 | TAD L412 /MAKE A DOUBLE DENSITY READ STATUS CODE |
| 148 | TAD DRIVE |
| 149 | LCD |
| 150 | SDN |
| 151 | JMP .-1 |
| 152 | XDR /GET STATUS WORD |
| 153 | DCA RX02 |
| 154 | TAD RX02 |
| 155 | AND L32 /KEEP DENSITY ERROR; DOUBLE; QUAD |
| 156 | TAD L10 /SINGLE=10;SING/DOUB=40;DOUB=20;QUAD=22 |
| 157 | AND L422 /SINGLE=0;SING/DOUB=0;DOUB=20;QUAD=22 |
| 158 | DCA ZOO /PLACE TYPE CODE, THREE LOC.'S AFTER ENTRY POINT |
| 159 | SER |
| 160 | NORMAL, TAD ZOO /FETCH BACK TYPE CODE |
| 161 | SZA CLA /SKIP IF A SINGLE DENSITY |
| 162 | TAD L7700 /DOUBLE |
| 163 | TAD L7700 /SINGLE=7700, DOUBLE=7600 |
| 164 | DCA DENSW /PLACE FOR LOOP CONTROL |
| 165 | TAD ZOO |
| 166 | CLL RTR /PUT QUAD BIT TO LINK |
| 167 | SNA CLA /SKIP IF DOUBLE OR QUAD |
| 168 | TAD L1734 /SINGLE |
| 169 | TAD L4110 /D&Q=4110, S=6044 |
| 170 | SNL /SKIP ON QUAD, IT'S OK RIGHT NOW |
| 171 | CLL CML RAR /SINGLE AND DOUBLE DIVIDE BY 2 |
| 172 | DCA SIZE /S=7022, D=6044, Q=4110 |
| 173 | TAD DENSW /7700 IF SINGLE, 7600 IF DOUBLE |
| 174 | CLL CMA RTL /375 IF SINGLE, 775 IF DOUBLE |
| 175 | AND L400 |
| 176 | TAD DRIVE /VOILA, 400*DOUBLE + 20*DRIVE |
| 177 | DCA FN /PLACE INTO FUNCTION CONTROL WORD |
| 178 | CLA |
| 179 | TAD ZOO /FETCH BACK TYPE CODE |
| 180 | SZA CLA /SKIP IF A SINGLE DENSITY |
| 181 | TAD M128 /256 BYTES SECTOR DOUBLE |
| 182 | TAD M128 /128 BYTES SINGLE |
| 183 | TAD KN1 /2 extra bytes for sector # etc in buffer |
| 184 | TAD KN1 |
| 185 | DCA NBLKSZ |
| 186 | TAD RX02 |
| 187 | AND L10 |
| 188 | SNA CLA |
| 189 | JMP RX01 |
| 190 | TAD LLCD2 |
| 191 | DCA LLCD |
| 192 | JMP I TYPE /RETURN |
| 193 | RX01, TAD LLCD1 |
| 194 | DCA LLCD |
| 195 | JMP I TYPE /RETURN |
| 196 | |
| 197 | PAGE |
| 198 | WRITE, CLA CLL |
| 199 | IOF / Turn off interrupts so we can safely update |
| 200 | CLA / # of sectors in buffer |
| 201 | TAD NUMSEC |
| 202 | SNA |
| 203 | JMP NODAT |
| 204 | TAD KN1 |
| 205 | DCA NUMSEC |
| 206 | IAC |
| 207 | NODAT, ION |
| 208 | SZA |
| 209 | JMP WRSEC |
| 210 | CMA |
| 211 | TAD DONEFG / All data rx |
| 212 | SZA |
| 213 | JMP WRITE / no |
| 214 | JMP DONE / yes |
| 215 | |
| 216 | WRSEC, CLA CLL / We have one waiting, write it |
| 217 | CDF 10 |
| 218 | TAD I WRTLOC |
| 219 | DCA TRACK |
| 220 | TAD I WRTLOC |
| 221 | CDF 0 |
| 222 | DCA SECT |
| 223 | TAD FILCMD |
| 224 | JMS I LLCD / Do fill buffer command |
| 225 | CDF 10 |
| 226 | LOOP, STR |
| 227 | SKP |
| 228 | JMP FILL |
| 229 | SDN / All Done? |
| 230 | JMP LOOP / No |
| 231 | SER / Any errors |
| 232 | JMP WRTIT / No |
| 233 | |
| 234 | XDR / Yes, leave error in AC and halt |
| 235 | HLT |
| 236 | CLA |
| 237 | TAD RDERR |
| 238 | JMS I LLCD |
| 239 | SDN |
| 240 | JMP .-1 |
| 241 | XDR |
| 242 | HLT |
| 243 | |
| 244 | FILL, TAD I WRTLOC |
| 245 | XDR |
| 246 | CLA |
| 247 | JMP LOOP |
| 248 | |
| 249 | WRTIT, CLA CLL |
| 250 | TAD WRCMD |
| 251 | JMS I LLCD |
| 252 | STR |
| 253 | JMP .-1 |
| 254 | TAD SECT |
| 255 | XDR |
| 256 | STR |
| 257 | JMP .-1 |
| 258 | CLA |
| 259 | TAD TRACK |
| 260 | XDR |
| 261 | |
| 262 | SDN / Done? |
| 263 | JMP .-1 |
| 264 | CLA |
| 265 | SER / Any errors |
| 266 | JMP NEXT / No |
| 267 | |
| 268 | XDR / Yes, leave error in AC and halt |
| 269 | HLT |
| 270 | CLA |
| 271 | TAD RDERR |
| 272 | JMS I LLCD |
| 273 | SDN |
| 274 | JMP .-1 |
| 275 | XDR |
| 276 | HLT |
| 277 | |
| 278 | NEXT, CLA CLL |
| 279 | JMP WRITE |
| 280 | |
| 281 | DONE, CLA CLL / Done, wait for one more byte |
| 282 | TAD WRTLOC |
| 283 | IAC |
| 284 | CIA |
| 285 | TAD BUFLOC |
| 286 | SZA |
| 287 | JMP DONE |
| 288 | TAD CHKSUM / Got checksum byte, receive routine has added it |
| 289 | AND K377 / to checksum, verify final checksum (8 bit) is zero |
| 290 | SZA |
| 291 | HLT / Stop if checksum wrong |
| 292 | JMP I FREREAD |
| 293 | |
| 294 | PAGE |
| 295 | REREAD, CLA IAC / Reread disk to check for errors |
| 296 | DCA SECT |
| 297 | DCA TRACK |
| 298 | DCA CHKSUM |
| 299 | |
| 300 | RDCHK, CLA CLL / Standard read from manual |
| 301 | TAD TRACK |
| 302 | TAD SECT |
| 303 | TAD K377 |
| 304 | TAD CHKSUM |
| 305 | DCA CHKSUM |
| 306 | TAD RDCMD |
| 307 | JMS I LLCD |
| 308 | STR |
| 309 | JMP .-1 |
| 310 | TAD SECT |
| 311 | XDR |
| 312 | STR |
| 313 | JMP .-1 |
| 314 | CLA |
| 315 | TAD TRACK |
| 316 | XDR |
| 317 | |
| 318 | SDN / Done? |
| 319 | JMP .-1 |
| 320 | CLA |
| 321 | SER / Any errors |
| 322 | SKP |
| 323 | JMP ERROR |
| 324 | CLA CLL |
| 325 | TAD EMPCMD |
| 326 | JMS I LLCD |
| 327 | ELOOP, STR |
| 328 | SKP |
| 329 | JMP EMPTY |
| 330 | SDN |
| 331 | JMP ELOOP |
| 332 | SER |
| 333 | JMP GOOD |
| 334 | HLT |
| 335 | EMPTY, XDR |
| 336 | TAD CHKSUM |
| 337 | DCA CHKSUM |
| 338 | JMP ELOOP |
| 339 | |
| 340 | GOOD, CLA CLL IAC RAL / LOAD 2 |
| 341 | ISZ SCNT |
| 342 | SKP |
| 343 | JMP NXTTRK |
| 344 | TAD SECT |
| 345 | DCA SECT |
| 346 | TAD SECT |
| 347 | TAD M32 |
| 348 | SPA SNA |
| 349 | JMP RDCHK |
| 350 | IAC |
| 351 | DCA SECT |
| 352 | JMP RDCHK |
| 353 | NXTTRK, CLA IAC |
| 354 | DCA SECT |
| 355 | TAD M32 |
| 356 | DCA SCNT |
| 357 | ISZ TRACK |
| 358 | TAD TRACK |
| 359 | TAD M115 |
| 360 | SZA |
| 361 | JMP RDCHK |
| 362 | CLA CMA |
| 363 | TAD K377 / fe at end before checksum |
| 364 | TAD CHKSUM |
| 365 | CDF 10 |
| 366 | TAD I WRTLOC / received checksum |
| 367 | CDF 0 |
| 368 | AND K377 |
| 369 | JMP GDHLT |
| 370 | |
| 371 | ERROR, XDR / Yes, leave error in AC and halt |
| 372 | HLT |
| 373 | CLA |
| 374 | TAD RDERR |
| 375 | JMS I LLCD |
| 376 | SDN |
| 377 | JMP .-1 |
| 378 | XDR |
| 379 | HLT |
| 380 | JMP I STARTF |
| 381 | |
| 382 | LCD1, 0 |
| 383 | TAD FN |
| 384 | LCD |
| 385 | JMP I LCD1 |
| 386 | |
| 387 | LCD2, 0 |
| 388 | TAD FN |
| 389 | DCA CMD |
| 390 | TAD CMD |
| 391 | LCD |
| 392 | CLA |
| 393 | TAD CMD |
| 394 | CLL RTL |
| 395 | RTL |
| 396 | RAL |
| 397 | STR |
| 398 | JMP .-1 |
| 399 | XDR |
| 400 | CLA |
| 401 | JMP I LCD2 |
| 402 | CMD, 0 |
| 403 | |
| 404 | |
| 405 | PAGE |
| 406 | ISR, |
| 407 | DCA ISRAC / Save AC |
| 408 | GTF |
| 409 | DCA ISRFLG / And flags |
| 410 | CDF 10 / Buffer in field 1 |
| 411 | KSF2 / Have character waiting |
| 412 | / RSF / Testing, use PTR with emulator |
| 413 | JMP IRET / No, not our interrupt |
| 414 | CLA |
| 415 | KRB2 / Get character |
| 416 | / RRB RFC / PTR |
| 417 | DCA TEMP |
| 418 | TAD CHKSUM |
| 419 | TAD TEMP |
| 420 | DCA CHKSUM |
| 421 | TAD STATE / Find out where in sequence we are |
| 422 | SNA |
| 423 | JMP SBLK / Start of block |
| 424 | CMA IAC / STATE +1, get size flag |
| 425 | IAC |
| 426 | SZA |
| 427 | JMP DATA |
| 428 | TAD TEMP |
| 429 | DCA SIZEFG |
| 430 | DCA STATE |
| 431 | JMP IRET |
| 432 | DATA, CLA / data byte |
| 433 | TAD TEMP |
| 434 | DCA I BUFLOC |
| 435 | ISZ BUFCNT |
| 436 | JMP IRET |
| 437 | DCA STATE / End of sector, set to 0 to check header byte |
| 438 | ISZ NUMSEC / Inc number of sectors buffered |
| 439 | TAD K37 |
| 440 | CIA |
| 441 | TAD NUMSEC |
| 442 | SNA |
| 443 | HLT / To many buffered, halt. Must of had to many |
| 444 | / retries in a row |
| 445 | IRET, CLA |
| 446 | TAD ISRFLG |
| 447 | RTF |
| 448 | CLA |
| 449 | TAD ISRAC |
| 450 | JMP I 0 |
| 451 | SBLK, TAD K377 |
| 452 | CIA |
| 453 | TAD TEMP / Is is a ff? |
| 454 | SNA |
| 455 | JMP FLAGOK / Yes |
| 456 | IAC / Is it a fe? |
| 457 | SZA |
| 458 | HLT / No, halt |
| 459 | ISZ DONEFG / All data received |
| 460 | FLAGOK, STA / -1 for byte 1 |
| 461 | DCA STATE |
| 462 | TAD NBLKSZ / And setup to look for blocksize words |
| 463 | DCA BUFCNT |
| 464 | JMP IRET |
| 465 | |
| 466 | $ |