| 1 | / SPEAK - Types out messages from the database\r |
| 2 | / Also includes TTY output routines that unpack\r |
| 3 | / packed sixbit into mixed case ASCII.\r |
| 4 | /\r |
| 5 | FIELD1 ADVTTY\r |
| 6 | \r |
| 7 | TTY, 0 / TTY Output routine, dupe of FRTS\r |
| 8 | IOF / Protect from race conditions\r |
| 9 | SNA / Input or output?\r |
| 10 | JMP KBD / Input - read character\r |
| 11 | DCA HANGPT / Output - save char\r |
| 12 | RDF\r |
| 13 | TAD CDIF00\r |
| 14 | DCA CDFX\r |
| 15 | CDF 0\r |
| 16 | TAD% TOCHR / Output character status in FRTS\r |
| 17 | SMA SZA CLA / If gt 0, char backed up\r |
| 18 | JMP BUSY / Else must wait\r |
| 19 | LOOP, TAD% TOCHR / Get the status\r |
| 20 | CLL RAL /Busy flag in link\r |
| 21 | CLA CML RAR /Complement of busy in sign\r |
| 22 | TAD HANGPT\r |
| 23 | SPA /If tty not busy, \r |
| 24 | TLS /Send it\r |
| 25 | DCA% TOCHR /Store pos or neg, backed up or busy\r |
| 26 | TTYRET, ION /Interrupts back on\r |
| 27 | CDFX, HLT /Caller's field\r |
| 28 | JMP% TTY /Return\r |
| 29 | \r |
| 30 | CDIF00, CIF CDF\r |
| 31 | \r |
| 32 | BUSY, CDF 10 /Busy, must wait. Call Field 0 HANG routine\r |
| 33 | CIF 0\r |
| 34 | JMS% HANGPT+1\r |
| 35 | 0451 / TTUHNG\r |
| 36 | CDF 0\r |
| 37 | JMP LOOP / Try output again\r |
| 38 | \r |
| 39 | KBD, RDF\r |
| 40 | TAD CDIF00\r |
| 41 | DCA CDFX\r |
| 42 | CDF 0\r |
| 43 | TAD% TICHR / Any input?\r |
| 44 | SNA CLA\r |
| 45 | JMP WAIT / No, wait\r |
| 46 | GETIN, TAD% TICHR / Get character\r |
| 47 | DCA HANGPT / Save\r |
| 48 | DCA% TICHR / Clear buffer\r |
| 49 | TAD HANGPT\r |
| 50 | JMP TTYRET / Return\r |
| 51 | \r |
| 52 | WAIT, CDF 10\r |
| 53 | CIF 0\r |
| 54 | JMS% HANGPT+1 /Hang\r |
| 55 | 465 /KBUHNG\r |
| 56 | CDF 0\r |
| 57 | JMP GETIN /Get input\r |
| 58 | TOCHR, 4\r |
| 59 | TICHR, 5\r |
| 60 | HANGPT, ADDR #HANG\r |
| 61 | /\r |
| 62 | / Terminal line input routine. Used because the FRTS input is quite limited.\r |
| 63 | / This one handles scope rubouts and allows lower case input.\r |
| 64 | / Inputs: Array Returned characters, stored one sixbit per array word\r |
| 65 | / (The FORTRAN input routine is set up this way to unpack)\r |
| 66 | / Size Number of characters to allow\r |
| 67 | / Prompt Prompt string\r |
| 68 | FIELD1 RDLIN\r |
| 69 | /\r |
| 70 | ENTRY RDLINE\r |
| 71 | RDLINE, JA #RLST\r |
| 72 | #RLXR, ORG .+10\r |
| 73 | TEXT +RDLINE+\r |
| 74 | #RLRET, SETX #RLXR\r |
| 75 | SETB #RLBAS\r |
| 76 | JA .+3\r |
| 77 | #RLBAS, ORG .+6\r |
| 78 | BUFPT, ORG .+3\r |
| 79 | BUFLEN, ORG .+3\r |
| 80 | \r |
| 81 | ORG #RLBAS+30\r |
| 82 | FNOP\r |
| 83 | JA #RLRET\r |
| 84 | FNOP\r |
| 85 | #RGOBK, 0;0\r |
| 86 | #RLRTN, BASE #RLBAS\r |
| 87 | JA #RGOBK\r |
| 88 | #RLST, STARTD\r |
| 89 | 0210\r |
| 90 | FSTA #RGOBK,0\r |
| 91 | 0200\r |
| 92 | SETX #RLXR\r |
| 93 | SETB #RLBAS\r |
| 94 | LDX 0,1\r |
| 95 | FSTA #RLBAS\r |
| 96 | FLDA% #RLBAS,1+\r |
| 97 | FSTA BUFPT\r |
| 98 | FLDA% #RLBAS,1+\r |
| 99 | FSTA BUFLEN\r |
| 100 | STARTF\r |
| 101 | /\r |
| 102 | / Pass down size to '8' code\r |
| 103 | /\r |
| 104 | SETX BUFSIZ \r |
| 105 | FLDA% BUFLEN\r |
| 106 | FNEG / Make it negative\r |
| 107 | ATX 0 / Pass buffer len\r |
| 108 | SETX #RLXR\r |
| 109 | TRAP4 GETLIN / Get input line\r |
| 110 | JA #RLRTN / And return\r |
| 111 | / Input reader\r |
| 112 | \r |
| 113 | FIELD1 GETLN\r |
| 114 | \r |
| 115 | GETLIN, 0\r |
| 116 | CLA\r |
| 117 | DCA OFFSET / Start at offset zero\r |
| 118 | TAD% SCOPT\r |
| 119 | AND K200\r |
| 120 | DCA SCOPE\r |
| 121 | TAD% BUFFLD+1 / Get CDF for buffer\r |
| 122 | AND FLDMSK\r |
| 123 | CLL RTL\r |
| 124 | RAL\r |
| 125 | TAD CDFG\r |
| 126 | DCA BUFCDF\r |
| 127 | /\r |
| 128 | / Go get an input character\r |
| 129 | /\r |
| 130 | GETNXT, JMS% PTTY+1 / Called with zero to get char\r |
| 131 | DCA INCH / Save input\r |
| 132 | /\r |
| 133 | / Specials?\r |
| 134 | /\r |
| 135 | TAD INCH\r |
| 136 | TAD MDEL / Delete?\r |
| 137 | SNA CLA\r |
| 138 | JMP DELETE / Handle that\r |
| 139 | TAD INCH\r |
| 140 | TAD MCR / CR?\r |
| 141 | SNA CLA\r |
| 142 | JMP ENTER / End of line, let's go.\r |
| 143 | TAD INCH\r |
| 144 | TAD MSPC / Less than space?\r |
| 145 | SPA CLA\r |
| 146 | JMP BELL / Nope, ignore\r |
| 147 | TAD OFFSET\r |
| 148 | TAD BUFSIZ / Room left?\r |
| 149 | SMA CLA\r |
| 150 | JMP BELL / Bell if not\r |
| 151 | TAD INCH\r |
| 152 | JMS% PTTY+1 / Echo it\r |
| 153 | TAD INCH\r |
| 154 | TAD LWRA / Is it lowercase?\r |
| 155 | SPA CLA\r |
| 156 | JMP UPPER / No, store it\r |
| 157 | TAD INCH\r |
| 158 | TAD LWRZ\r |
| 159 | SMA CLA\r |
| 160 | JMP UPPER / More than lowercase z\r |
| 161 | TAD INCH\r |
| 162 | TAD AMINA / Adjust to uppercase\r |
| 163 | DCA INCH\r |
| 164 | UPPER, JMS STORE / Store this character\r |
| 165 | JMP GETNXT / Get more\r |
| 166 | / Store a character in the output buffer\r |
| 167 | / using the current offset\r |
| 168 | /\r |
| 169 | \r |
| 170 | STORE, 0\r |
| 171 | TAD OFFSET\r |
| 172 | TAD OFFSET\r |
| 173 | TAD OFFSET / Count FPP words\r |
| 174 | TAD% BUFPTR+1 / Pointer to exponent word\r |
| 175 | DCA BPT\r |
| 176 | TAD K27 / Exponent 27 for integer\r |
| 177 | JMS STO\r |
| 178 | JMS STO / Zero high word\r |
| 179 | TAD INCH / Char value\r |
| 180 | AND SIXMSK / Convert to sixbit\r |
| 181 | JMS STO / Store in buffer\r |
| 182 | CDF 10 / Back to my field\r |
| 183 | ISZ OFFSET / One more in the buffer\r |
| 184 | SPC, 240 / Really shouldn't overflow; harmless AND\r |
| 185 | JMP% STORE / Return\r |
| 186 | STO, 0\r |
| 187 | BUFCDF, HLT / Gets CDF for buffer field\r |
| 188 | DCA% BPT\r |
| 189 | ISZ BPT / Next word\r |
| 190 | JMP% STO / Return if no skip\r |
| 191 | TAD BUFCDF\r |
| 192 | TAD BS / Next field\r |
| 193 | DCA BUFCDF\r |
| 194 | JMP% STO\r |
| 195 | \r |
| 196 | BELL, TAD BEL / Warn the user\r |
| 197 | JMS% PTTY+1\r |
| 198 | JMP GETNXT\r |
| 199 | \r |
| 200 | DELETE, TAD OFFSET / How far into the buffer are we?\r |
| 201 | SNA CLA\r |
| 202 | JMP BELL / Ignore extra deletes\r |
| 203 | TAD SCOPE\r |
| 204 | SNA CLA\r |
| 205 | JMP DUMBDL / Simple fortran-format delete\r |
| 206 | TAD BS\r |
| 207 | JMS% PTTY+1\r |
| 208 | TAD SPC\r |
| 209 | JMS% PTTY+1\r |
| 210 | TAD BS\r |
| 211 | JMS% PTTY+1\r |
| 212 | JMP FIXOFF / Fix the offset\r |
| 213 | DUMBDL, TAD K334 / Backslash\r |
| 214 | JMS% PTTY+1\r |
| 215 | FIXOFF, CLA CMA\r |
| 216 | TAD OFFSET\r |
| 217 | DCA OFFSET\r |
| 218 | JMP GETNXT\r |
| 219 | \r |
| 220 | ENTER, TAD CR / Send a RETURN\r |
| 221 | JMS% PTTY+1\r |
| 222 | CLRLP, TAD OFFSET / Is there space available?\r |
| 223 | TAD BUFSIZ\r |
| 224 | SMA CLA\r |
| 225 | JMP CLRDN\r |
| 226 | TAD SPC\r |
| 227 | DCA INCH\r |
| 228 | JMS STORE\r |
| 229 | JMP CLRLP\r |
| 230 | CLRDN, CIF CDF 0\r |
| 231 | JMP% GETLIN\r |
| 232 | \r |
| 233 | BUFSIZ, 0\r |
| 234 | SCOPT, 7726 / Scope flag in OS/8\r |
| 235 | K200, 200\r |
| 236 | MDEL, -377 / Delete \r |
| 237 | MCR, -215\r |
| 238 | CR, 215\r |
| 239 | MSPC, -240\r |
| 240 | BEL, 207\r |
| 241 | LWRA, -341\r |
| 242 | LWRZ, -373\r |
| 243 | AMINA, -40 / Add to "a" to make "A"\r |
| 244 | BPT,\r |
| 245 | BUFFLD, ADDR BUFPT+1\r |
| 246 | SCOPE,\r |
| 247 | BUFPTR, ADDR BUFPT+2\r |
| 248 | OFFSET,\r |
| 249 | PTTY, ADDR TTY\r |
| 250 | BS, 10\r |
| 251 | K334, 334\r |
| 252 | CDFG, CDF 0\r |
| 253 | K27, 27\r |
| 254 | SIXMSK, 77\r |
| 255 | FLDMSK, 7\r |
| 256 | INCH, 0\r |
| 257 | \r |
| 258 | /\r |
| 259 | / Fortran-callable message printer\r |
| 260 | / Put here to avoid wasting the rest of the page.\r |
| 261 | / Arguments:\r |
| 262 | / BUF Buffer pointer\r |
| 263 | / COUNT Number of characters to write, zero to look for end\r |
| 264 | / CRFLAG Carriage return flags.\r |
| 265 | / Bit 11 (1) = no lead LF\r |
| 266 | / Bit 10 (2) = no trail CR\r |
| 267 | / Bit 9 (4) = start lowercase\r |
| 268 | /\r |
| 269 | ENTRY SIXOUT\r |
| 270 | SIXOUT, JA #STRT\r |
| 271 | #SXR, ORG .+10\r |
| 272 | TEXT +SIXOUT+\r |
| 273 | #SRET, SETX #SXR\r |
| 274 | SETB #SBASE\r |
| 275 | JA .+3\r |
| 276 | #SBASE, ORG .+6\r |
| 277 | CNT, ORG .+3\r |
| 278 | SFLAG, ORG .+3\r |
| 279 | \r |
| 280 | ORG #SBASE+30\r |
| 281 | FNOP\r |
| 282 | JA #SRET\r |
| 283 | FNOP\r |
| 284 | #SGOBK, 0;0\r |
| 285 | #SRTN, BASE #SBASE\r |
| 286 | JA #SGOBK\r |
| 287 | #STRT, STARTD\r |
| 288 | 0210\r |
| 289 | FSTA #SGOBK,0\r |
| 290 | 0200\r |
| 291 | SETX #SXR\r |
| 292 | SETB #SBASE\r |
| 293 | LDX 0,1\r |
| 294 | FSTA #SBASE\r |
| 295 | FLDA% #SBASE,1+\r |
| 296 | FSTA BUF / Buffer pointer\r |
| 297 | FLDA% #SBASE,1+ / Count\r |
| 298 | FSTA CNT\r |
| 299 | FLDA% #SBASE,1+ / Carriage control flag\r |
| 300 | FSTA SFLAG\r |
| 301 | STARTF\r |
| 302 | FLDA% CNT\r |
| 303 | SETX COUNT\r |
| 304 | ATX 0\r |
| 305 | FLDA% SFLAG\r |
| 306 | ATX 1\r |
| 307 | SETX #SXR\r |
| 308 | TRAP4 SIX8 /Call the 8-mode output routine\r |
| 309 | JA #SRTN\r |
| 310 | \r |
| 311 | FIELD1 SXOUT\r |
| 312 | ENTRY SIX8 / Mixed case output routine\r |
| 313 | \r |
| 314 | SIX8, 0\r |
| 315 | TAD CRFLAG /Suppresss carriage control?\r |
| 316 | RAR /Low bit suppresses lead LF\r |
| 317 | SZL CLA\r |
| 318 | JMP .+4 /No leading LF\r |
| 319 | CDF 10 / My field\r |
| 320 | TAD LF /Linefeed\r |
| 321 | JMS% TTYPTR+1 /Output it\r |
| 322 | TAD CRFLAG\r |
| 323 | AND K4 /Start in lower case?\r |
| 324 | SZA CLA\r |
| 325 | TAD K40 /Yes\r |
| 326 | TAD HUN /Reset conversion factor\r |
| 327 | DCA SHIFT\r |
| 328 | TAD BUF /Buffer field\r |
| 329 | AND K7 /Just the field bits\r |
| 330 | CLL RAL\r |
| 331 | RTL /Into place\r |
| 332 | TAD CDF0 /Into CDF instruction\r |
| 333 | DCA CDF1\r |
| 334 | TAD CDF1\r |
| 335 | DCA CDF2\r |
| 336 | TAD COUNT /Get buffer length\r |
| 337 | SNA\r |
| 338 | JMP NOTRIM /Zero means it has a terminating "@"\r |
| 339 | /\r |
| 340 | / Find the end of the string\r |
| 341 | /\r |
| 342 | CLA CMA /End is start + len - 1\r |
| 343 | TAD COUNT /String len in words\r |
| 344 | TAD BUF+1 /End of the string\r |
| 345 | DCA PTR /Pointer to end\r |
| 346 | TAD COUNT /Invert count\r |
| 347 | CMA IAC\r |
| 348 | DCA COUNT\r |
| 349 | CDF1, HLT\r |
| 350 | FNDEND, TAD% PTR\r |
| 351 | TAD K3740 / - ' ' (two spaces)\r |
| 352 | SZA CLA / Skip if blank\r |
| 353 | JMP NONBLK\r |
| 354 | ISZ COUNT /Count another\r |
| 355 | SKP\r |
| 356 | JMP NONBLK /If empty, done\r |
| 357 | CLA CMA / -1\r |
| 358 | TAD PTR\r |
| 359 | DCA PTR /Back pointer up\r |
| 360 | JMP FNDEND /Keep looking\r |
| 361 | \r |
| 362 | NONBLK, TAD COUNT\r |
| 363 | SNA CLA /Skip if output left\r |
| 364 | JMP DONE /Nothing if count zero already\r |
| 365 | NOTRIM, TAD BUF+1 /Reset pointer to start\r |
| 366 | DCA PTR\r |
| 367 | CDF2, HLT\r |
| 368 | TAD% PTR /Get word\r |
| 369 | DCA STEMP /Save\r |
| 370 | TAD STEMP\r |
| 371 | RTR\r |
| 372 | RTR\r |
| 373 | RTR /First sixbit\r |
| 374 | JMS OUTONE /Convert and output it\r |
| 375 | TAD STEMP /Second sixbit\r |
| 376 | JMS OUTONE\r |
| 377 | ISZ PTR /Bump pointer\r |
| 378 | SKP /OK if no skip\r |
| 379 | JMP NEWFLD /Next field otherwise\r |
| 380 | INCCNT, ISZ COUNT\r |
| 381 | JMP CDF2 /Keep outputting\r |
| 382 | DONE, CLA\r |
| 383 | TAD CRFLAG /Suppress trailing CR?\r |
| 384 | RTR /2 bit suppresses trailing CR\r |
| 385 | SZL CLA /If zero, write it.\r |
| 386 | JMP OUT /Yes, leave now\r |
| 387 | CDF 10 /My field\r |
| 388 | TAD CRTN\r |
| 389 | JMS% TTYPTR+1\r |
| 390 | OUT, CIF CDF 0\r |
| 391 | JMP% SIX8\r |
| 392 | \r |
| 393 | NEWFLD, TAD CDF1\r |
| 394 | TAD K10 /Next field\r |
| 395 | DCA CDF1\r |
| 396 | TAD CDF1\r |
| 397 | DCA CDF2\r |
| 398 | JMP INCCNT\r |
| 399 | \r |
| 400 | OUTONE, 0\r |
| 401 | AND K77 /Mask\r |
| 402 | SNA\r |
| 403 | JMP DONE / End of string\r |
| 404 | TAD K7743 / minus '['\r |
| 405 | SNA\r |
| 406 | JMP SETLWR /Set to lowercase shift\r |
| 407 | TAD K2 / ok, ']'?\r |
| 408 | SNA\r |
| 409 | JMP SETUPR /Set to uppercase\r |
| 410 | TAD K7773 /Restore\r |
| 411 | SPA\r |
| 412 | TAD SHIFT /For positive, shift it\r |
| 413 | TAD K40 /Else it's not alphabetic\r |
| 414 | CDF 10 /My field\r |
| 415 | JMS% TTYPTR+1 /Output it\r |
| 416 | JMP% OUTONE /Done\r |
| 417 | \r |
| 418 | SETLWR, TAD K40 /Reset shift\r |
| 419 | SETUPR, TAD HUN /For upper/lower\r |
| 420 | DCA SHIFT\r |
| 421 | JMP% OUTONE\r |
| 422 | \r |
| 423 | TTYPTR, ADDR TTY\r |
| 424 | SHIFT, 140 /Shift value\r |
| 425 | / COUNT and CRFLAG must stay together\r |
| 426 | COUNT, 0 /Num words to output. \r |
| 427 | CRFLAG, 0 /1 - no leading LF, 2 no trailing CR\r |
| 428 | PTR, 0\r |
| 429 | CRTN, 15\r |
| 430 | LF, 12\r |
| 431 | K3740, 3740 /minus blank\r |
| 432 | BUF, 0;0;0 /Buffer 15-bit address\r |
| 433 | STEMP, 0\r |
| 434 | K77, 77 /sixbit mask\r |
| 435 | K7, 7\r |
| 436 | K4, 4\r |
| 437 | K40, 40\r |
| 438 | CDF0, CDF\r |
| 439 | HUN, 100\r |
| 440 | K7743, 7743\r |
| 441 | K7773, 7773\r |
| 442 | K10, 10 /Field increment\r |
| 443 | K2, 2\r |
| 444 | \r |
| 445 | SECT SPEAK\r |
| 446 | /C\r |
| 447 | / SUBROUTINE SPEAK(N)\r |
| 448 | /C\r |
| 449 | /C PRINT THE MESSAGE IN RECORD N OF THE RANDOM ACCESS MESSAGE FILE.\r |
| 450 | /C\r |
| 451 | / IMPLICIT INTEGER (A-Z)\r |
| 452 | / COMMON /TXTCOM/ RTEXT,LINES,ASCVAR\r |
| 453 | / COMMON /ALPHAS/ BLANK,EOF\r |
| 454 | / DIMENSION RTEXT(205),LINES(36)\r |
| 455 | /C\r |
| 456 | EXTERN IO\r |
| 457 | EXTERN #HANG\r |
| 458 | JA #ST\r |
| 459 | #XR, ORG .+10\r |
| 460 | TEXT +SPEAK+\r |
| 461 | #RET, SETX #XR\r |
| 462 | SETB #BASE\r |
| 463 | JA .+3\r |
| 464 | #BASE, ORG .+6\r |
| 465 | N, ORG .+3\r |
| 466 | #DOTMP, ORG .+3\r |
| 467 | BLANK, TEXT + +\r |
| 468 | EOF, TEXT +>$< +\r |
| 469 | ONE, F 1.0\r |
| 470 | FOUR, F 4.0\r |
| 471 | ORG #BASE+30\r |
| 472 | FNOP\r |
| 473 | JA #RET\r |
| 474 | FNOP\r |
| 475 | #GOBAK, 0;0\r |
| 476 | I, ORG .+0003\r |
| 477 | L, ORG .+0003\r |
| 478 | OLDLOC, ORG .+0003\r |
| 479 | #LBL=.\r |
| 480 | COMMON TXTCOM\r |
| 481 | RTEXT, ORG .+1147\r |
| 482 | LINES, ORG .+0044\r |
| 483 | ASCVAR, ORG .+0003\r |
| 484 | TXTLOC, ORG .+0003\r |
| 485 | DATA, ORG .+0352\r |
| 486 | ORG #LBL\r |
| 487 | #RTN, BASE #BASE\r |
| 488 | JA #GOBAK\r |
| 489 | #ST, STARTD\r |
| 490 | 0210\r |
| 491 | FSTA #GOBAK,0\r |
| 492 | 0200\r |
| 493 | SETX #XR\r |
| 494 | SETB #BASE\r |
| 495 | LDX 0,1\r |
| 496 | FSTA #BASE\r |
| 497 | FLDA% #BASE,1+\r |
| 498 | FSTA N\r |
| 499 | STARTF\r |
| 500 | / IF(N.EQ.0)RETURN\r |
| 501 | FLDA% N\r |
| 502 | JEQ #RTN\r |
| 503 | / READ(2'N) LOC,LINES\r |
| 504 | FLDA N\r |
| 505 | STARTD\r |
| 506 | FSTA #G0002\r |
| 507 | STARTF\r |
| 508 | JSR IO\r |
| 509 | JA .+0004\r |
| 510 | #G0002, JA .\r |
| 511 | / IF(LINES(1).EQ.EOF)RETURN\r |
| 512 | FLDA ONE\r |
| 513 | ATX 7\r |
| 514 | FLDA LINES-0003,7\r |
| 515 | FSUB EOF\r |
| 516 | JEQ #RTN\r |
| 517 | /1 OLDLOC = LOC\r |
| 518 | #1, FLDA TXTLOC\r |
| 519 | FSTA OLDLOC\r |
| 520 | FLDA ONE\r |
| 521 | FSTA I\r |
| 522 | \r |
| 523 | / DO 3 I=36,1,-1\r |
| 524 | / Set COUNT to the number of words (36 or 44 octal)\r |
| 525 | SETX COUNT\r |
| 526 | LDX 44,0 /44 words\r |
| 527 | LDX 0,1 /With carriage control\r |
| 528 | SETX #XR\r |
| 529 | / L=I\r |
| 530 | /3 CONTINUE\r |
| 531 | /5 TYPE 2,(LINES(I),I=1,L)\r |
| 532 | #5, FLDA LINEPT\r |
| 533 | FSTA BUF /Set buffer pointer\r |
| 534 | TRAP4 SIX8\r |
| 535 | \r |
| 536 | FLDA% N\r |
| 537 | FADD ONE\r |
| 538 | FSTA% N\r |
| 539 | FLDA N\r |
| 540 | / READ(2'ASCVAR) LOC,LINES\r |
| 541 | STARTD\r |
| 542 | FSTA #G0006\r |
| 543 | STARTF\r |
| 544 | JSR IO\r |
| 545 | JA .+0004\r |
| 546 | #G0006, JA .\r |
| 547 | / IF(LOC .EQ. OLDLOC) GO TO 1\r |
| 548 | FLDA TXTLOC\r |
| 549 | FSUB OLDLOC\r |
| 550 | JEQ #1\r |
| 551 | EXTERN #WRITO\r |
| 552 | TRAP3 #WRITO\r |
| 553 | JA FOUR\r |
| 554 | JA #10+2\r |
| 555 | EXTERN #RENDO\r |
| 556 | TRAP3 #RENDO\r |
| 557 | \r |
| 558 | /10 RETURN\r |
| 559 | #10, JA #RTN\r |
| 560 | / (1X)\r |
| 561 | 5061\r |
| 562 | 3051\r |
| 563 | /2 FORMAT(' ',36A2) PDP/8: (' ',12A6)\r |
| 564 | LINEPT, ADDR LINES\r |
| 565 | 0\r |
| 566 | END\r |