# 2.11BSD#431 - /usr/src/new/m11/lout.m11

       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

Last modified: 1982-12-11 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 596 |