1: .title lout 2: 3: 4: .ident /10may4/ 5: 6: .mcall (at)always,ch.mne,st.flg,ct.mne 7: .mcall (at)bisbic 8: always 9: ch.mne 10: st.flg 11: ct.mne 12: 13: .mcall (at)xmit,param,putlp 14: .macro putlin addr ;use listing flags 15: .if dif <addr><r0> 16: mov addr,r0 17: .endc 18: call putlin 19: .endm 20: .mcall (at)genswt,error 21: .mcall (at)zwrite 22: .mcall (at)genedt,setnz 23: .mcall (at)scanw,next,zap 24: .mcall (at)sdebug,ndebug 25: 26: 27: param lpp, 60. ; 28: param ttllen, 32. 29: param stllen, 64. 30: 31: .globl codrol, errrol, lcdrol, symrol, secrol 32: .globl lcbegl, linend, lcendl 33: .globl linbuf, cdrsav, endp2l 34: 35: .globl linnum, seqend, pagnum, pagext 36: .globl ffcnt, lppcnt 37: .globl dflgbm, opclas 38: 39: 40: .globl edmask, ed.cdr, ed.lc 41: 42: 43: srclen = 204 ;********************* 44: octlen = 60 ;********************* 45: 46: mx.on =lc.md!lc.mc!lc.ld!lc.toc!lc.sym!lc.cnd!lc.bin!lc.loc!lc.seq 47: 48: 49: 50: .globl lc.cnd 51: .globl exmflg 52: .globl lstchn, cmochn, lstflg, putoc 53: .globl mx.flg, my.flg 54: .globl crfref 55: 56: .globl clcfgs, clcloc, clcmax 57: .globl clcnam, clcsec, cpopj 58: .globl errbts 59: .globl flags, getchr, getnb, getsym 60: .globl mode 61: .globl rolndx, rolupd 62: .globl sector, setpf0, setpf1 63: .globl setsym 64: .globl symbol, tstarg, value 65: 66: .globl expr, pcroll, prgttl 67: .globl setwrd, setbyt, tstr50, mulr50 68: .globl r50unp 69: 70: .globl setchr 71: 72: ;globals defined in assembler 73: 74: .globl setlc 75: 76: .globl chrpnt, getr50, pass 77: .globl putkb, putkbl, putlp 78: 79: .globl dnc, movbyt, savreg, xmit0 80: .globl linbuf, errcnt 81: 82: ;globals defined in mcexec 83: 84: .globl dattim 85: .globl hdrttl 86: .globl io.eof, io.tty, io.err 87: 88: .globl ioftbl, cnttbl, buftbl 89: 90: 91: 92: .globl argcnt, cttbl 93: .globl endlin 94: .globl getlin, lblend, lcendl, lcflag 95: .globl lcmask, lc.mc, lc.md, lc.me 96: .globl lst.kb, lst.lp, lstdev 97: xitsec ;start in default sector 98: 99: endlin: ;end of line processor 100: call savreg 101: clr rolupd ;set to fetch from code roll 102: tstb cttbl(r5) ;eol or semi-colon? 103: ble lout1 ; yes 104: error 19,q,<random junk at end of statement ignored> 105: 106: lout1: .if ndf xedcdr 107: movb cdrsav,linbuf+72. ;replace borrowed char 108: .endc 109: mov pass,-(sp) ;pass 1? 110: beq 9$ ; yes 111: call mx.mx ; <<< REEDS june 81 112: mov lstdev,(sp) ;init listing flag 113: 114: tst errbts ;any errors? 115: bne 7$ ; yes, go directly, do not collect, etc. 116: tstb (sp) ;any listing device? 117: beq 9$ ; no 118: bit #lc.ld,lcflag ;listing directive? 119: bne 5$ ; yes 120: tst mx.flg ; <<< REEDS june 81 121: bne 80$ ; <<< REEDS june 81: in mx mode we ignore .list 122: tst lclvl ;test over-under ride 123: blt 5$ ;if <0, list only if errors 124: bgt 8$ ;if >0, list unconditionally 125: 80$: bit #lc.com,lcmask ;comment suppression? 126: beq 2$ ; no 127: mov chrpnt,lcendl ;yes, assume we're sitting at comment 128: 2$: bit #lc.src,lcmask ;line suppression? 129: beq 3$ ; no 130: mov #linbuf,lcendl ;yes, point to start of buffer 131: 3$: 132: .if ndf xmacro 133: tstb <^pl rolsiz>+codrol+1 ;anything in code roll? 134: beq 4$ ; no 135: bit #lc.meb,lcmask ;macro binary expansion? 136: bne 4$ ; no 137: bic #lc.me,lcflag ;yes, ignore me flag 138: .endc 139: 4$: bit lcmask,lcflag ;anything suppressed? 140: beq 9$ ; no, use current flags 141: 5$: clr (sp) ;yes, clear listing mode 142: br 9$ 143: 7$: swab (sp) ;error, set to error flags 144: 8$: mov #linbuf,lcbegl ;list entire line 145: mov #linend,lcendl 146: 9$: call pcroll ;process entry on code roll 147: endl10: movb (sp),lstreq ;anything requested? 148: beq endl20 ; no 149: clrb @lcendl ;set asciz terminator 150: mov #octbuf,r2 151: 11$: mov #space*400+space,(r2)+ ;blank fill 152: cmp #linbuf,r2 ;test for end (beginning of line buffer) 153: bne 11$ 154: 155: endl50: mov #octbuf,r2 ;point to start of buffer 156: call tsterr ;set error flags 157: mov #linnum,r0 158: mov (r0)+,r1 159: cmp r1,(r0) 160: beq 2$ 161: mov r1,(r0) 162: bit #lc.seq,lcmask 163: bne 2$ 164: mov r2,r4 165: call dnc 166: mov #octbuf+7,r0 167: 1$: movb -(r2),-(r0) 168: movb #space,(r2) 169: cmp r2,r4 170: bhi 1$ 171: mov #octbuf+7,r2 172: 2$: movb #tab,(r2)+ 173: 21$: mov #pf0,r1 174: bit #lc.loc,lcmask 175: bne 4$ 176: tst (r1) 177: beq 3$ 178: call setwrd 179: 3$: movb #tab,(r2)+ 180: 4$: clr (r1) 181: mov #pf1,r1 182: bit #lc.bin,lcmask 183: bne endl19 184: mov #1,r4 185: bit #lc.ttm,lcmask 186: beq 41$ 187: cmpb (r4)+,(r4)+ ; cheap increment by 2 188: 41$: tst (r1) 189: beq 6$ 190: 5$: call setwdb 191: 6$: movb #tab,(r2)+ 192: clr (r1) 193: dec r4 194: beq endl19 195: tst rolupd 196: beq 6$ 197: call pcroll 198: br 5$ 199: endl19: mov lcbegl,r1 ;point to start of listing line 200: call movbyt ;move over 201: putlin #octbuf ; test for header and list 202: call err.pr 203: endl20: 204: clrb @lcbegl ;don't dupe line 205: tst rolupd ;finished? 206: beq endl30 ; yes, don't loop 207: call pcroll 208: beq endl30 ;exit if empty 209: bit #lc.bex!lc.bin,lcmask ;binary extension suppressed? 210: beq endl10 ; no 211: br endl20 ;yes, don't list 212: 213: endl30: tst (sp)+ ;prune listing flag 214: zap codrol ;clear the code roll 215: mov clcloc,r0 216: cmp r0,clcmax ;new high for sector? 217: blos 31$ ; no 218: mov r0,clcmax ;yes, set it 219: 31$: return 220: 221: setwdb: ;list word or byte 222: tst (r1) ;anything for second field? 223: beq 9$ ; no 224: mov #setwrd,-(sp) ;assume word 225: bit #dflgbm,opclas ;true? 226: beq 1$ ; yes 227: mov #setbyt,(sp) ;no, byte 228: 1$: call @(sp)+ ;call routine 229: bit #77*400,(r1) ;test for linker modification 230: beq 9$ 231: 232: bit #5100,(r1) ;if one of these isnt set I dont know 233: bne 12$ ;what is going on, so lets mark it ? 234: movb #'?,(r2) 235: br 9$ 236: 12$: 237: movb #ch.xcl,(r2) ; ' marks psect relocation 238: bit #4000,(r1) 239: bne 10$ 240: movb #'",(r2) ; " location counter relocation 241: 10$: 242: bit #glbflg,(r1) 243: beq 2$ 244: movb #'G,(r2) 245: tst symbol ; harvard m11 uses global syms with funny 246: bne 2$ ; names for complex relocation 247: movb #'C,(r2) 248: 2$: tstb (r2)+ 249: 9$: return 250: 251: tsterr: ;test and process errors 252: mov errbts,r0 ;any errors? 253: beq 9$ ; no 254: bic #err.,r0 ;yes, ".print"? 255: beq 4$ ; yes 256: inc errcnt ;bump error count 257: call err.sh 258: 4$: mov #errmne-1,r1 259: 1$: tstb (r1)+ ;move char pntr and clear carry 260: ror errbts ;rotate error bits 261: bcc 2$ 262: movb (r1),(r2)+ 263: .if ndf xcref 264: movb (r1),r0 ;fetch character 265: call tstr50 ;convert to rad50 266: call mulr50 ;left justify 267: call mulr50 268: mov r0,symbol ;store 269: clr symbol+2 270: mov #errrol,rolndx ;prepare to cref 271: call crfref ;do so 272: .endc 273: br 1$ 274: 275: 2$: bne 1$ 276: 9$: return 277: 278: 279: .globl fileln 280: .globl putli2 281: err.sh:: 282: call savreg 283: tst lstflg 284: bne 9$ 285: 286: ; printf("%s: line %d: %s\n", infile, fileln, errmess) 287: 288: mov #err.bx,r2 289: tstb err.by 290: beq 1$ 291: mov #err.by,r1 292: call movbyt 293: mov #err.s1,r1 294: call movbyt 295: mov fileln,r1 296: call dnc 297: tst err.xx 298: beq 2$ 299: mov #err.s2,r1 300: call movbyt 301: 1$: mov err.xx,r1 302: call movbyt 303: clr err.xx 304: 2$: 305: clrb (r2) 306: mov #err.bx,r2 307: mov #lst.kb,r4 308: call putli2 309: 9$: 310: return 311: 312: .data 313: err.s1: .asciz /: line / 314: .even 315: err.s2: .asciz /: / 316: 317: .bss 318: err.bx: .blkw 60 319: err.by:: .blkw 60 320: 321: entsec impure 322: errcnt: .blkw ;error counter 323: entsec implin 324: errbts: .blkw ;error flags 325: err.xx:: .blkw ;error message 326: xitsec 327: .if ndf xedcdr 328: genedt cdr 329: entsec impure 330: cdrsav: .blkw ;saved char from card format 331: .endc 332: entsec impure 333: octbuf: 334: octerp: .blkb 0 335: octseq: .blkb 2 336: octpf0: .blkb 7 337: octpf1: .blkb octlen-<.-octbuf> 338: linbuf: .blkw srclen/2 339: linend: .blkw 1 340: 341: .data 342: tmpcnt = 1 343: errmne: .irpc char,< abeilmnopqrtuz> 344: .ascii /char/ 345: .globl err.'char 346: err.'char= tmpcnt 347: tmpcnt = tmpcnt+tmpcnt 348: .endm 349: 350: xitsec 351: .globl title, sbttl 352: 353: title: 354: call getsym ;get a symbol 355: bne title1 ; error if null 356: error 20,a,<missing title> 357: return 358: 359: title1: mov r0,prgttl ;move into storage 360: mov symbol+2,prgttl+2 361: call setsym ;point to start of title 362: mov #ttlbuf,r2 ;point to buffer 363: movb #ff,(r2)+ ;store page eject 364: clr r3 ;clear position conter 365: 2$: .if ndf xedlc ;>>>gh 7/20/78 to not automatically upper-case 366: bit #ed.lc,edmask ;lower case enabled? 367: bne 6$ ; no, leave as upper case 368: mov chrpnt,r5 ;fake for ovlay pic 369: movb (r5),r5 ;fetch original character 370: 6$: .endc 371: movb r5,(r2) ;plunk the next char in the buffer 372: beq 5$ ;branch if end 373: cmp r5,#tab ;a tab? 374: bne 3$ ; no 375: bis #7,r3 ;yes, compensate 376: 3$: inc r3 ;update position counter 377: cmp r3,#ttllen ;within bounds? 378: bhis 4$ ; no 379: tstb (r2)+ ;yes, move pointer 380: 4$: call getchr ;get the next character 381: bne 2$ ;loop if not end 382: 5$: movb #tab,(r2)+ ;set separator 383: .globl vernam 384: mov vernam,r1 385: call movbyt ;set version number, etc. 386: mov #dattim,r1 387: call movbyt ;date and time 388: mov r2,ttlbrk ;remember break point 389: clrb (r2) 390: return 391: 392: .data 393: defttl:: .asciz /.main./ ;default title 394: 395: entsec impure 396: ttlbrk: .blkw ;break location 397: ttlbuf: .blkb ttllen-1!7+1+1 ;modulo tab + ff 398: .blkb 20. ;intro msg 399: .iif ndf xtime, .blkb 20. ;time & date 400: .blkb 20. ;page number 401: .even 402: xitsec 403: 404: 405: 406: sbttl: ;sub-title directive 407: mov #stlbuf,r2 ;point to sub-title buffer 408: tst pass ;pass one? 409: beq 2$ ; yes 410: 1$: .if ndf xedlc ;>>>gh 7/20/78 to not automatically upper-case 411: bit #ed.lc,edmask ;lower case enabled? 412: bne 4$ ; no, leave as upper case 413: mov chrpnt,r5 ;fake for ovlay pic 414: movb (r5),r5 ;fetch original character 415: 4$: .endc 416: movb r5,(r2)+ ;move character in 417: beq 13$ ; branch if end 418: call getchr ;get the next character 419: cmp r2,#stlbuf+stllen-1 ;test for end 420: blo 1$ 421: tstb -(r2) ;polish off line 422: br 1$ 423: 424: 2$: bit #lc.toc,lcmask 425: bne 13$ 426: tstb lstdev ;any listing device? 427: beq 13$ ; no, exit 428: tst mx.flg ; <<< REEDS june 81 429: bne 13$ ; <<< 430: mov #toctxt,r1 431: call movbyt ;set table of contents 432: call setsym ;point to ".sbttl" 433: 3$: call getr50 ;get radix-50 char 434: bgt 3$ ;stop at first terminator 435: mov chrpnt,r2 ;set pointer 436: .if ndf xlcseq 437: mov linnum,r0 438: call 10$ 439: movb #ch.sub,-(r2) 440: .iff 441: movb #tab,-(r2) 442: .endc 443: mov pagnum,r0 444: call 10$ 445: movb #space,-(r2) 446: 447: tst lstflg 448: beq 15$ 449: bisb lstdev,lstreq 450: 15$: putlin r2 ;output 451: return 452: 453: 10$: mov #4,r4 ; << REEDS. changed to 4 digit field from 3 454: 11$: movb #space,-(r2) 455: mov r0,r1 456: beq 12$ 457: clr r0 458: div #^d10,r0 459: add #dig.0,r1 460: movb r1,(r2) 461: 12$: sob r4,11$ 462: 13$: return 463: 464: .data 465: toctxt: .asciz /table of contents/ 466: 467: entsec imppas 468: stlbuf: .blkw <stllen+2>/2 ;sub-title buffer 469: 470: xitsec 471: .globl print, error 472: 473: 474: .enabl lsb 475: 476: print: 477: error 0,<>,<user generated error> ; null error (dont count) 478: br error1 479: 480: error: error 53,p,<user generated error> 481: error1: call setpf0 ;print location field 482: call expr ;evaluate expression 483: beq 2$ ;branch if null 484: call setpf1 ;non-null, list value 485: 2$: return 486: 487: .dsabl lsb 488: 489: 490: .globl rem 491: 492: rem: ; ".rem" directive 493: mov r5,r3 ;set terminating character 494: bne rem1 ;branch if non-null 495: error 22,a,<missing delimiting character> 496: ;error, no delimiting character 497: return 498: 499: rem1: call getchr ;get the next character 500: 2$: tst r5 ;end of line? 501: bne 3$ ; no 502: call endlin ;yes, polish off line 503: call getlin ;get next line 504: beq 2$ ;loop if no eof 505: return ;eof, exit 506: 507: 3$: cmp r5,r3 ;is this the terminator? 508: bne rem1 ; no 509: jmp getnb ;yes, bypass and exit 510: 511: .sbttl listing control 512: 513: .globl nlist, list 514: 515: nlist: com r3 ;make r3 -1 516: list: 517: asl r3 ;make r3 0/-2 518: inc r3 ;now 1/-1 519: 1$: call tstarg ;test for another argument 520: bne 2$ ; valid 521: tst argcnt ;null, first? 522: bne list7 ; no, we're through 523: inc argcnt ;yes, mark it 524: 2$: call getsym ;try for a symbol 525: scanw lcdrol ;look it up in the table 526: beq 6$ ; error if not found 527: clr r2 528: sec 529: 3$: rol r2 530: sob r0,3$ 531: tst exmflg ;called from command string? 532: beq 11$ ; no 533: bis r2,lcmcsi ;yes, set disable bits 534: bisbic lcdeft ;change the default values 535: br 12$ ; and skip test 536: 537: 11$: bit r2,lcmcsi ;this flag off limits? 538: bne 5$ ; yes 539: 12$: bic r2,lcmask 540: bit r2,#lc. ;null? 541: beq 4$ ; no 542: call pagex ;set listing control 543: add r3,lclvl ;yes, update level count 544: beq 5$ ;don't set flag if back to zero 545: 4$: tst r3 546: bpl 5$ ;.list, branch 547: bis r2,lcmask 548: 5$: br 1$ ;try for more 549: 550: 6$: error 23,a,<unknown .list/.nlist argument> 551: list7: return 552: 553: genswt li,list ;generate /li 554: genswt nl,nlist ; and /nl switch entries 555: 556: .globl page 557: page: inc ffcnt ;simulate ff after this line 558: pagex: bis #lc.ld,lcflag ;flag as listing directive 559: return 560: 561: .macro genlct mne,init ;generate listing control table 562: lc.'mne= 1 563: .rept <.-lctbas>/2 564: lc.'mne= lc.'mne+lc.'mne 565: .endm 566: .rad50 /mne/ 567: .if nb <init> 568: lcinit= lcinit+lc.'mne 569: .endc 570: .endm 571: 572: lcinit= 0 573: 574: entsec lctsec 575: lctbas = . 576: genlct seq 577: genlct loc 578: genlct bin 579: genlct src 580: genlct com 581: genlct bex 582: genlct md 583: genlct mc 584: genlct me ,1 585: genlct meb,1 586: genlct cnd 587: genlct ld ,1 588: genlct ttm,1 589: genlct toc 590: genlct sym 591: genlct < > ;null 592: 593: xitsec 594: 595: genswt fl,profl 596: flsbts= lc.seq!lc.loc!lc.bin!lc.bex!lc.me!lc.meb!lc.toc!lc.sym 597: profl: 598: mov #flsbts,lcmcsi 599: mov #flsbts,lcmask 600: return 601: 602: .globl eddflt,ucflag 603: uc.set:: 604: bis #ed.lc,eddflt 605: um.set:: 606: inc ucflag 607: return 608: 609: .data 610: .even 611: ucflag:: .word ; if set, dont do case trnslation in macros 612: entsec dpure 613: lcdeft: .word lcinit ; default value for lcmask 614: xitsec 615: entsec impure 616: lcmask: .blkw ;mask bits 617: lclvl: .blkw ;level count 618: lcmcsi: .blkw ;command string storage 619: 620: entsec implin 621: lcflag: .blkw ;flag bits 622: lcbegl: .blkw ;pointer to start of line 623: lcendl: .blkw ;pointer to end of line 624: lblend: .blkw ;end of label (for parsing) 625: 626: xitsec 627: 628: setlc: 629: mov lcdeft,lcmask ;default flags 630: clr lclvl 631: clr lcmcsi 632: return 633: 634: .sbttl listing stuff 635: 636: setpf0: ;set print field zero 637: sdebug <setpf0> 638: mov clcfgs,pf0 ;set current location flags 639: bisb #100,pf0+1 ;assume word 640: mov clcloc,pf0+2 ;set location 641: return 642: 643: setpf1: ;set print field one 644: mov mode,pf1 ;set mode of current value 645: bisb #100,pf1+1 ;assume word 646: mov value,pf1+2 647: return 648: 649: entsec implin 650: pf0: .blkw 2 651: pf1: .blkw 2 652: xitsec 653: endp2l: ;end pass2 listing 654: call err.pr ; flush out last error message 655: mov #symtxt,r1 656: mov #stlbuf,r2 657: call movbyt ;set "symbol table" sub-title 658: tstb lstdev ;any listing output? 659: beq endp2d ; no 660: bit #lc.sym,lcmask ;symbol table suppression? 661: bne endp2d ; yes 662: inc ffcnt ;force new page 663: clr lppcnt ;force new page 664: inc pagnum 665: mov #-1,pagext 666: clr rolupd ;set for symbol table scan 667: 2$: mov #linbuf,r2 ;point to storage 668: 3$: next symrol ;get the next symbol 669: beq endp2a ; no more 670: bit #regflg,mode ;register? 671: bne 3$ ; yes, don't list 672: call r50unp ;unpack the symbol 673: mov #endp2t,r3 674: call endp2p 675: mov #mode,r1 ;point to mode bits 676: bit #defflg,(r1) ;defined? 677: beq 4$ ; no 678: call setwrd 679: br 6$ 680: 681: 4$: mov #stars,r1 682: call movbyt ;undefined, substitute ****** 683: 6$: call endp2p 684: .iif df rsx11d, call endp2x 685: mov #sector,r1 686: cmpb #1,(r1) 687: bge 10$ 688: cmpb -(r1),-(r1) 689: call setbyt 690: 10$: movb #tab,(r2)+ ;separator 691: cmp r2,#linbuf+50. ;enough for one line? 692: blo 3$ ; no 693: call endp2b ;output line 694: br 2$ ;next line 695: 696: 697: endp2a: ; print .psect list 698: 699: .if ndf xrel 700: clr rolupd ;set for sector scan 701: 21$: call endp2b ;output line 702: next secrol ;get the next entry 703: beq endp2d ; exit if end of roll 704: movb #'<,(r2)+ 705: call r50unp ;print the name, 706: movb #'>,(r2)+ 707: movb #tab,(r2)+ 708: mov #value,r1 709: call setwrd ; the value, 710: movb #tab,(r2)+ 711: mov #sector-2,r1 712: call setbyt ; and the entry number 713: movb #tab,(r2)+ 714: mov #flags-2,r1 715: call setbyt ; and the attributes 716: br 21$ 717: .endc 718: 719: endp2b: clrb (r2) 720: mov lstdev,lstreq ; we want output 721: putlin #linbuf 722: mov #linbuf,r2 ;reset to start of buffer 723: endp2d: return 724: 725: endp2p: call endp2x 726: endp2x: mov (r3)+,r0 727: bit (r3)+,mode 728: bne 32$ 729: swab r0 730: 32$: movb r0,(r2)+ 731: return 732: 733: entsec dpure 734: endp2t: 735: .ascii / =/ 736: .word lblflg 737: .ascii /% / 738: .word regflg 739: .ascii /r / 740: .word relflg 741: .ascii /g / 742: .word glbflg 743: .if df rsx11d 744: .ascii /x / 745: .word dfgflg 746: .endc 747: 748: .data 749: stars: .asciz /******/ 750: symtxt: .asciz /symbol table/ 751: xitsec 752: lst.kb= 1 ;teletype listing 753: lst.lp= 2 ;lpt listing 754: 755: 756: xitsec 757: 758: ; 759: ; These routines are high level. They make output go to 760: ; more than one device, they add page headers. The dogsbody 761: ; low guy is 'putli2', who in turn calls on 'o.kblp', which 762: ; interfaces with the file buffering guys directly. 763: ; 764: 765: putkb: mov #lst.kb,lstreq ;set request 766: br putlix 767: 768: putkbl: mov #lst.kb,lstreq ;set for tty 769: putlp: tst lstflg ;doing a listing? 770: beq putlix ;no 771: bisb lstdev,lstreq ;lpt 772: ; 773: ; output a line plain & simple 774: ; 775: putlix: 776: call savreg 777: mov r0,r2 778: movb lstreq,r4 779: call putli2 780: return 781: 782: putlin: ;output a line with page heading if needed 783: call savreg ;stack registers 784: mov r0,r2 ;arg to r2 785: movb lstreq,r4 ;get request 786: clr lstreq ;clear it 787: tst r4 788: beq 9$ ;just exit if empty 789: bgt 2$ ;omit header if not listing 790: dec lppcnt ;yes, decrement count 791: bgt 2$ ;skip if not time 792: call putpag 793: 2$: 794: call err.pr 795: call putli2 ;print out the line 796: 9$: return 797: 798: 799: putli2: 800: movb (r2)+,r1 ;get a char. 801: beq 21$ ;end on null 802: call o.kblp ;transmit appropriately 803: br putli2 ;till null 804: 21$: 805: movb #lf,r1 ; used to be cr/lf 806: call o.kblp 807: bit #lst.kb,r4 ;if sending to cmochn, 808: beq 9$ ;no 809: zwrite cmo ;yes, send it now 810: 9$: return 811: 812: o.kblp: bic #177600,r1 ;just 7 bits, please. 813: bit #lst.kb,r4 ;cmo on? 814: beq 1$ ;no 815: mov #cmochn,r0 ;yes 816: call putoc 817: 1$: bit #lst.lp,r4 ;lst on? 818: beq 2$ ;no 819: mov #lstchn,r0 ;yes 820: call putoc 821: 2$: return 822: ; put out a page heading 823: putpag: 824: ;mov #lpp,lppcnt ;reset count 825: mov #lpp-4,lppcnt ;reset count, compensate for bug introduced 826: ;by rearranging pagination logic 827: mov r2,-(sp) ;stack current pointer 828: mov ttlbrk,r2 ;end of pre-set title 829: tst pass 830: beq 11$ 831: mov #pagmne,r1 832: call movbyt ;move "page" into position 833: mov pagnum,r1 834: call dnc ;convert to decimal 835: inc pagext 836: beq 11$ 837: movb #'-,(r2)+ 838: mov pagext,r1 839: inc r1 840: call dnc 841: 11$: clrb (r2) 842: tst mx.flg ; <<< REEDS june 81 843: bne 100$ 844: putlp #ttlbuf ;print title 845: putlp #stlbuf ; sub-title, 846: 100$: 847: putlp #crlf ; and a blank line 848: mov (sp)+,r2 849: return 850: entsec impure 851: lstreq: .blkw ;list request flags 852: lstdev: .blkb 2 ;error(lh), listing(rh) 853: 854: .data 855: pagmne: .ascii / page / 856: crlf: .asciz // 857: xitsec 858: 859: 860: 861: .macro putl x ; printf("%s\n", mx.lin) 862: mov x,mx.tmp 863: call putl 864: .endm 865: putl: 866: .irpc xx,<012345> 867: mov r'xx,-(sp) 868: .endm 869: mov mx.tmp,r2 870: mov #lst.lp,r4 871: call putli2 872: .irpc xx,<543210> 873: mov (sp)+,r'xx 874: .endm 875: return 876: 877: putsc: 878: call savreg 879: mov mdepth,r4 880: 1$: 881: movb #';,r1 882: call mx.put 883: dec r4 884: bpl 1$ 885: movb #tab,r1 886: call mx.put 887: return 888: mx.put: 889: call savreg 890: mov #lst.lp,r4 891: bic #177600,r1 892: mov #lstchn,r0 893: call putoc 894: return 895: mx.mx: 896: call savreg 897: tst mx.flg 898: beq 1$ 899: mov #mx.on,lcmask 900: tst errbts 901: beq 3$ 902: putl #mxstar 903: call err.pr 904: 3$: 905: tst mx.2 ; is it a .narg, etc. directive? 906: beq 2$ 907: clr mx.2 908: tst my.flg 909: bne 20$ 910: call putsc ; ;.narg frodo 911: putl #linbuf 912: 20$: 913: putl #mx.gen ; ; generates: 914: putl #mx.pxx ; frodo = 5280 915: br 1$ 916: 2$: 917: tst my.flg ; is it otherwise suppressed & are 918: bne 1$ ; we listing such? 919: bit lcmask,lcflag ; anything supppressed? 920: beq 1$ 921: call putsc 922: putl #linbuf 923: 1$: 924: return 925: 926: err.pr: 927: call savreg 928: mov r0,-(sp) 929: mov r5,-(sp) 930: tst err.xx 931: beq 1$ 932: mov #lst.kb,r4 933: tst lstflg 934: beq 2$ 935: mov #lst.lp,r4 936: 2$: 937: mov err.xx,r2 938: call putli2 939: clr err.xx 940: 1$: 941: mov (sp)+,r5 942: mov (sp)+,r0 943: return 944: 945: .bss 946: mdepth:: .blkw 1 947: xitsec 948: entsec mixed 949: mx.gen:: .asciz /;*** generates:/ 950: mxstar:: .asciz /*** error ***/ 951: mx.pxx: .ascii <tab> 952: mx.sym:: .ascii /symbol = / 953: mx.num:: .ascii /65000/ 954: .even 955: mx.2:: .blkw 956: mx.tmp: .blkw ; space for putl(arg) 957: 958: .end