Annotation of researchv10no/cmd/spitbol/cint/asmosint.s, revision 1.1.1.1

1.1       root        1: #
                      2: #      Operating System Interface to Berkeley VAX/UNIX
                      3: #                            for
                      4: #                     Macro SPITBOL V3.5
                      5: #      -----------------------------------------------
                      6: #
                      7: #              Copyright 1982
                      8: #              Dewar Information Systems Corporation
                      9: #              221 West Lake Street
                     10: #              Oak Park, Illinois 60302
                     11: #
                     12: #      register masks
                     13: #
                     14:        .set    mr0,1
                     15:        .set    mr1,2
                     16:        .set    mr2,4
                     17:        .set    mr3,8
                     18:        .set    mr4,16
                     19:        .set    mr5,32
                     20:        .set    mr6,64
                     21:        .set    mr7,128
                     22:        .set    mr8,256
                     23:        .set    mr9,512
                     24:        .set    mr10,1024
                     25:        .set    mr11,2048
                     26: #
                     27: #      c functions assume that r0 -> r5 are scratch.  however, spitbol
                     28: #      uses r2, r3, and r5.  so, need to save these registers across
                     29: #      function calls.
                     30: #
                     31:        .set    mr235,mr2+mr3+mr5
                     32: #
                     33: #      mask for all registers used by compiler. necessary for dealing
                     34: #      with load modules.
                     35: #
                     36:        .set    cmpreg,mr2+mr3+mr5+mr6+mr7+mr8+mr9+mr10
                     37: #
                     38: #      miscellaneous equates
                     39: #
                     40:        .set    ch$lk,107       # upper case letter k
                     41:        .set    ch$mn,45        # dash (minus sign)
                     42:        .set    k,1024
                     43:        .set    kwords,k*4
                     44: #
                     45: #      internal spitbol blocks
                     46: #      -----------------------
                     47: #
                     48: #      these equates describe compiler control blocks used by osint.
                     49: #
                     50: #      chain of file control blocks
                     51: #
                     52:        .set    chtyp,0         # type word
                     53:        .set    chlen,4         # block length
                     54:        .set    chnxt,8         # -> next chblk
                     55:        .set    chfcb,12        # -> fcb
                     56:        .set    chsize,16       # size of chblk
                     57: #
                     58: #      icblk - integer block
                     59: #
                     60:        .set    ictyp,0         # type word
                     61:        .set    icval,4         # integer value
                     62: #
                     63: #      scblk - string block
                     64: #
                     65:        .set    sctyp,0         # type word
                     66:        .set    sclen,4         # string length
                     67:        .set    scstr,8         # start of string
                     68: #
                     69: #      interface control blocks
                     70: #      ------------------------
                     71: #
                     72: #      these control blocks are built by the interface to handle i/o.
                     73: #      for files other than standard input, standard output, and the
                     74: #      terminal, these control blocks reside in the compiler's 
                     75: #      dynamic area. this requires appropriate setting of the type
                     76: #      words to allow proper garbage collection.
                     77: #
                     78: #      blocks with type b$xnt contain non-relocatable addresses - that
                     79: #      is, no word may contain a pointer to another block in the
                     80: #      dynamic area.
                     81: #
                     82: #      blocks with type b$xrt contain relocatable addresses - that is
                     83: #      words may contain a pointer to another block in the dynamic area.
                     84: #
                     85: #      the basic structure is:
                     86: #
                     87: #      for each input or output associated file there is:
                     88: #
                     89: #              1 ioblk  containing all global information about
                     90: #                       the file:  filename, buffer block pointer,
                     91: #                       file descriptor number, flags
                     92: #
                     93: #              1 bfblk  containing the file buffer
                     94: #
                     95: #              1 or more fcblks  containing the access mode (line or
                     96: #                       raw), the record length, and a pointer to 
                     97: #                       the ioblk
                     98: #
                     99: #      the first INPUT() or OUTPUT() call for a file creates one block
                    100: #      of each type. subsequent calls to INPUT() or OUTPUT() for a 
                    101: #      previously associated file, may cause the creation of a new fcblk.
                    102: #      allowing multiple fcblks provides the program with different
                    103: #      ways of accessing the same file. for example, one type of access
                    104: #      can be a character at a time and another entire records.
                    105: #
                    106: #      the compiler keeps track of all active fcblks, and at times
                    107: #      like end-of-job provides the inteface with a chain of all fcblks.
                    108: #
                    109: #
                    110: #      bfblk - i/o buffer control block
                    111: #
                    112:        .set    bftyp,0         # type word - b$xnt
                    113:        .set    bflen,4         # block length
                    114:        .set    bfsiz,8         # buffer size in bytes
                    115:        .set    bfrem,12        # bytes remaining
                    116:        .set    bfoff,16        # offset to next remaining byte
                    117:        .set    bfsize,20       # end of fixed portion
                    118: #
                    119: #      fcblk - file control block
                    120: #
                    121:        .set    fctyp,0         # type word - b$xrt
                    122:        .set    fclen,4         # block length
                    123:        .set    fcrsz,8         # record size ( >0 line mode / <0 raw mode) 
                    124:        .set    fciob,12        # -> ioblk 
                    125:        .set    fcsize,16       # size of fcblk
                    126: #
                    127: #      ioblk - i/o control block
                    128: #
                    129:        .set    iotyp,0         # type word - b$xrt
                    130:        .set    iolen,4         # block length
                    131:        .set    iofnm,8         # -> filename scblk
                    132:        .set    iopid,12        # pid (if one end of pipe)
                    133:        .set    iobuf,16        # -> bfblk
                    134:        .set    iofdn,20        # file descriptor number
                    135:        .set    ioflg,24        # flags
                    136:        .set    iosize,28       # size of ioelt
                    137: #
                    138: #      defines that match "spitio.h" for flags in ioflg
                    139: #
                    140:        .set    IO_INP,1        # input associated
                    141:        .set    IO_OUP,2        # output associated
                    142:        .set    IO_APP,4        # output open for append
                    143:        .set    IO_OPN,8        # file is open
                    144:        .set    IO_EOF,16       # eof on input file
                    145:        .set    IO_ERR,32       # i/o error
                    146:        .set    IO_SYS,64       # this is an osint file
                    147:        .set    IO_WRC,128      # don't do buffering
                    148:        .set    IO_PIP,256      # this is one end of a pipe
                    149:        .set    IO_DED,512      # other end of pipe died
                    150:        .set    IO_ILL,1024     # i/o illegal according to sysfc
                    151: #
                    152: #-----------
                    153: #
                    154: #      sysej - end of job
                    155: #
                    156:        .globl  sysej
                    157: sysej:
                    158:        movl    r10,_rzfcb      # copy head of fcb chain
                    159:        beqlu   1f              # if empty then nothing to close
                    160: 0:     movl    chfcb(r10),r1   # -> fcb
                    161:        pushl   fciob(r1)       # -> ioblk
                    162:        calls   $1,_osclose     # call to do close
                    163:        movl    chnxt(r10),r10  # -> next on chain
                    164:        bnequ   0b              #    and loop back for more
                    165: 1:     pushl   r7              # return &code
                    166:        calls   $1,__exit
                    167:        rsb
                    168: #
                    169: #      sysfc
                    170: #
                    171:        .globl  sysfc
                    172: sysfc:
                    173:        movl    (sp)+,(sp)      # remove stacked scblk
                    174:        pushr   $mr235
                    175:        tstl    sclen(r10)      # if null filearg1 then
                    176:        jeqlu   erxit1          #    error
                    177: #
                    178: #      get length of filename and scan off options.
                    179: #
                    180:        movl    r9,-(sp)        # -> filename scblk
                    181:        calls   $1,_lenfnm      # call to get filename length
                    182:        movl    r0,lenfname     # save length for later use
                    183:        jlss    erxit1          # length must not be negative
                    184:        movl    r9,-(sp)        # -> filename scblk
                    185:        movl    $tioblk,-(sp)   # -> temporary ioblk
                    186:        movl    r7,-(sp)        # input/output association flag
                    187:        calls   $3,_sioarg      # call to scan i/o args
                    188:        tstl    r0              # if error in args then
                    189:        jlss    erxit1          #    take error return
                    190: #
                    191: #      check for consistency of calls. cannot have both input
                    192: #      and output to same channel. if this happens, though,
                    193: #      set flag and let sysio take proper error exit.
                    194: #
                    195:        tstl    r6              # if no previous fcblk then
                    196:        beqlu   0f              #    skip
                    197:        movl    fciob(r6),r0    # -> ioblk
                    198:        movl    ioflg(r0),r0    # get previous flags
                    199:        mcoml   $IO_INP+IO_OUP,r1 # get mask for bicl
                    200:        bicl2   r1,r0           # remove all bits but INP&OUP
                    201:        bitl    tioblk+ioflg,r0 # if bits are not same then
                    202:        bnequ   0f
                    203:        bisl2   $IO_ILL,tioblk+ioflg    # then set error flag
                    204: 0:
                    205: #
                    206: #      handle null filenames here - must either have a previous
                    207: #      fcblk or specify -f arg.
                    208: #
                    209:        tstl    lenfname        # if non-null filename then
                    210:        bgtr    fcfnam          #    go handle below
                    211:        bitl    $IO_OPN,tioblk+ioflg
                    212:        bnequ   fcfarf          # if -f specified then merge w/non-null
                    213:        tstl    r6              # if no previous fcblk then
                    214:        jeqlu   erxit1          #    error
                    215:        clrl    r6              # assume that no new fcblk needed
                    216:        clrl    ioblkptr        # no ioblk ptr to stuff
                    217:        tstl    tioblk          # if however i/o args indicate one
                    218:        jeqlu   fcxit
                    219:        movl    fciob(r6),ioblkptr
                    220:        movl    $fcsize,r6      #    allocate one
                    221:        jbr     fcxit
                    222: #
                    223: #      handle real filenames and null filenames with -f arg here.
                    224: #      note that they're mutually exclusive.
                    225: #
                    226: fcfnam:        bitl    $IO_OPN,tioblk+ioflg
                    227:        jnequ   erxit1          # can't have -f arg too
                    228: fcfarf:        tstl    r6              # if previous fcblk passed then
                    229:        jnequ   erxit1          #    error
                    230:        clrl    ioblkptr
                    231:        addl3   $bfsize+3,tioblk+iopid,r6
                    232:        bicl2   $3,r6
                    233:        movl    r6,bfblksiz
                    234:        addl2   $fcsize+iosize,r6
                    235:        movl    $1,tioblk       # set newfcb flag
                    236: #
                    237: fcxit: clrl    r10             # no private fcblk
                    238:        clrl    r8              # xrblk please
                    239:        popr    $mr235
                    240:        addl2   $4,(sp)
                    241:        rsb
                    242: #
                    243: #      sysil - get input record length
                    244: #
                    245:        .globl  sysil
                    246: sysil:
                    247:        movl    fcrsz(r6),r6
                    248:        bgtr    0f
                    249:        mnegl   r6,r6
                    250: 0:
                    251:        rsb
                    252: #
                    253: #      sysin - read input record
                    254: #
                    255:        .globl  sysin
                    256: sysin:
                    257:        pushr   $mr235
                    258:        pushl   fciob(r6)       # -> ioblk
                    259:        calls   $1,_osopen      # call to open file
                    260:        tstl    r0              # if open unsuccessful then
                    261:        jnequ   erxit3          #    take error exit
                    262:        pushl   r9              # -> scblk
                    263:        pushl   fciob(r6)       # -> ioblk
                    264:        pushl   fcrsz(r6)       # push record length
                    265:        bgtr    0f
                    266:        mnegl   (sp),(sp)       # if negative then make it positive
                    267: 0:     pushl   fcrsz(r6)       # i/o mode - raw or line
                    268:        calls   $4,_osread      # call to do read
                    269:        cmpl    r0,$-1          # check for eof or input error
                    270:        jeql    erxit1          #   take eof exit
                    271:        jlss    erxit2          #   take error exit
                    272:        movl    r0,sclen(r9)    # set record length
                    273:        popr    $mr235
                    274:        addl2   $12,(sp)
                    275:        rsb
                    276: #
                    277: #      sysio
                    278: #
                    279:        .globl  sysio
                    280: sysio:
                    281:        pushr   $mr235
                    282:        bitl    $IO_ILL,tioblk+ioflg
                    283:        jnequ   erxit2          # if illegal then take error exit
                    284:        movl    r6,fcblkptr     # copy fcblk pointer for exit
                    285: #
                    286: #      fill in fcblk.
                    287: #
                    288:        tstl    tioblk+iotyp    # if no new fcb to build then
                    289:        jeqlu   iodon           #    done
                    290:        movl    $fcsize,fclen(r6)
                    291:        movl    tioblk+iolen,fcrsz(r6)
                    292:        movl    ioblkptr,fciob(r6)
                    293:        jnequ   iodon
                    294:        movab   fcsize(r6),fciob(r6)
                    295: #
                    296: #      fill in ioblk.
                    297: #
                    298:        movab   fcsize(r6),r6   # -> ioblk
                    299:        movl    $b$xrt,(r6)
                    300:        movl    $iosize,iolen(r6)
                    301:        movl    r9,iofnm(r6)
                    302:        clrl    iopid(r6)
                    303:        movab   iosize(r6),iobuf(r6)
                    304:        movl    tioblk+iofdn,iofdn(r6)
                    305:        movl    tioblk+ioflg,ioflg(r6)
                    306: #
                    307: #      if -f0 or -f1 specified then
                    308: #
                    309: #              for -f0 ensure that buffer is same as osint's
                    310: #
                    311: #              for -f1 no buffering should be done
                    312: #
                    313:        bitl    $IO_SYS,ioflg(r6)
                    314:        beqlu   9f
                    315:        cmpl    $1,iofdn(r6)
                    316:        blssu   9f
                    317:        beqlu   1f
                    318:        movl    $inpbf,iobuf(r6)
                    319:        jbr     9f
                    320: 1:     clrl    iobuf(r6)
                    321:        bisl2   $IO_WRC,ioflg(r6)
                    322: 9:
                    323: #
                    324: #      fill in bfblk
                    325: #
                    326:        movab   iosize(r6),r6   # -> bfblk
                    327:        movl    $b$xnt,(r6)
                    328:        movl    bfblksiz,bflen(r6)
                    329:        movl    tioblk+iopid,bfsiz(r6)
                    330:        clrl    bfrem(r6)
                    331:        clrl    bfoff(r6)
                    332: #
                    333: iodon: movl    fcblkptr,r10
                    334:        clrl    r8
                    335:        popr    $mr235
                    336:        addl2   $8,(sp)
                    337:        rsb
                    338: #
                    339: #      syspi - print on interactive channel (terminal)
                    340: #
                    341:        .globl  syspi
                    342: syspi:
                    343:        movl    $ttyiob,r11
                    344:        jbr     piprt
                    345: #
                    346: #      syspr - print on standard output
                    347: #
                    348:        .globl  syspr
                    349: syspr:
                    350:        movl    $oupiob,r11
                    351: #
                    352: #      handle both syspi and syspr here.
                    353: #
                    354: piprt:
                    355:        pushr   $mr235
                    356:        bisl2   $IO_WRC,ioflg(r11) # briefly set no buffering
                    357:        pushl   r9              # -> scblk
                    358:        pushl   r11             # -> ioblk
                    359:        pushl   r6              # number characters
                    360:        pushl   $1              # line mode
                    361:        calls   $4,_oswrite     # call to do write
                    362:        bicl2   $IO_WRC,ioflg(r11) # back to buffering
                    363:        tstl    r0              # if output error then
                    364:        jneq    erxit1          #    indicate error return
                    365:        popr    $mr235
                    366:        addl2   $4,(sp)
                    367:        rsb
                    368: #
                    369: #      sysrd - read from standard input
                    370: #
                    371:        .globl  sysrd
                    372: sysrd:
                    373:        pushr   $mr235
                    374:        movl    $inpiob,ioblkptr
                    375: #
                    376: #      handle both sysrd and sysri here.
                    377: #
                    378: rdmrg:
                    379:        pushl   r9              # -> scblk
                    380:        pushl   ioblkptr        # -> ioblk
                    381:        pushl   r8              # read length
                    382:        pushl   r8              # line mode
                    383:        calls   $4,_osread      # call to do read
                    384:        cmpl    r0,$-1          # check for eof or input error
                    385:        jeql    rdeof           #    take eof exit
                    386:        jlss    erxit1          #    take error exit
                    387:        movl    r0,sclen(r9)    # set read length
                    388: #
                    389: #      check for 1st record of standard input coming from a file specified
                    390: #      on the command line. if all of these conditions are true, allow
                    391: #      the program to access any arguments following the file name.
                    392: #
                    393:        tstl    rdrec1          # if already ready record 1 then
                    394:        bnequ   rdskp           #    skip
                    395:        cmpl    $inpiob,ioblkptr
                    396:        bnequ   rdskp           # if sysri entry then skip
                    397:        incl    rdrec1          # indicate read 1st record from std input
                    398:        tstl    _inpptr         # if not file from command line then
                    399:        beqlu   rdskp           #    skip
                    400:        cmpb    $'#,scstr(r9)   # if 1st char not # then
                    401:        bnequ   rdskp           #    skip
                    402:        cmpb    $'!,scstr+1(r9) # if 2nd char not ! then
                    403:        bnequ   rdskp           #    skip
                    404:        subl3   _inpcnt,_gblargc,_cmdcnt
                    405:        incl    _cmdcnt         # compute # args after filename
                    406:        movl    $1,_inpcnt      # reset input count
                    407:        brb     rdmrg           # ignore 1st record and try again
                    408: rdskp:
                    409:        popr    $mr235
                    410:        addl2   $4,(sp)
                    411:        rsb
                    412: #
                    413: #      come here to handle eof for both sysrd and sysri. if eof
                    414: #      is for sysrd, standard input, switch to next input file
                    415: #      if one exists.
                    416: #
                    417: rdeof: movl    ioblkptr,r4     # -> ioblk
                    418:        tstl    iofdn(r4)       # if not file descriptor 0 then
                    419:        jnequ   erxit1          #    real eof
                    420:        pushl   _inpptr         # push -> array of pointers
                    421:        pushl   _inpcnt         # push size of areray
                    422:        calls   $2,_swcinp      # call to switch input files
                    423:        tstl    r0              # if more to read then
                    424:        jeqlu   rdmrg           #    read it
                    425:        jmp     erxit1          # else signal eof
                    426: #
                    427: #      sysri - read from interactive channel (terminal)
                    428: #
                    429:        .globl  sysri
                    430: sysri:
                    431:        pushr   $mr235
                    432:        movl    $ttyiob,ioblkptr
                    433:        jbr     rdmrg
                    434: #
                    435: #      sysst - set file pointer
                    436: #
                    437:        .globl  sysst
                    438: sysst:
                    439:        pushr   $mr235
                    440:        pushl   fciob(r6)       # -> ioblk
                    441:        calls   $1,_osopen      # call to do open
                    442:        tstl    r0              # if file open error then
                    443:        jnequ   erxit3          #    return error
                    444: #
                    445:        movl    fciob(r6),r1    # -> ioblk
                    446:        bitl    $IO_PIP,ioflg(r1)
                    447:        jnequ   erxit4          # if pipe then set not allowed
                    448:        cmpl    iofdn(r1),$2    # if fd < 2 then
                    449:        jlssu   erxit4          #    set not allowed
                    450: #
                    451:        cmpl    $b$icl,(r7)     # if already integer then
                    452:        bnequ   0f
                    453:        movl    icval(r7),temp1 #    grab value
                    454:        brb     1f
                    455: 0:     cmpl    $b$scl,(r7)     # else if not a string then
                    456:        jnequ   erxit1          #    error
                    457:        clrl    temp3           # clear scnint character count
                    458:        pushl   $temp3          # -> temp3
                    459:        pushl   sclen(r7)       # string length
                    460:        pushab  scstr(r7)       # -> string
                    461:        calls   $3,_scnint      # call to scan integer
                    462:        movl    r0,temp1        # and save
                    463: 1:
                    464: #
                    465:        cmpl    $b$icl,(r8)     # if already integer then
                    466:        bnequ   0f
                    467:        movl    icval(r8),temp2 #    grab value
                    468:        brb     1f
                    469: 0:     cmpl    $b$scl,(r8)     # else if not a string then
                    470:        jnequ   erxit1          #    error
                    471:        clrl    temp3           # clear scnint character count
                    472:        pushl   $temp3          # -> temp3
                    473:        pushl   sclen(r8)       # string length
                    474:        pushab  scstr(r8)       # -> string
                    475:        calls   $3,_scnint      # call to scan integer
                    476:        movl    r0,temp2        # and save
                    477: 1:
                    478: #
                    479:        pushl   temp2           # whence
                    480:        pushl   temp1           # offset
                    481:        pushl   fciob(r6)       # -> ioblk
                    482:        calls   $3,_doset       # call to do set
                    483:        popr    $mr235
                    484:        addl2   $20,(sp)
                    485:        rsb
                    486: #
                    487: #      systm - get execution time so far
                    488: #
                    489:        .globl  systm
                    490: systm:
                    491:        pushr   $mr2+mr3
                    492:        movl    $tscblk+8,-(sp) # -> times buffer
                    493:        calls   $1,_times       # call to do times
                    494:        movl    tscblk+8,r5     # get user time in 60ths
                    495:        mull2   $100,r5         #    mulitply by 100 to get 6000ths
                    496:        divl2   $6,r5           #    divide by 6 to get 1000ths
                    497:        popr    $mr2+mr3
                    498:        rsb
                    499: #
                    500: #      sysxi - exit from executing program
                    501: #
                    502:        .globl  sysxi
                    503: sysxi:
                    504:        tstl    r10             # if 0 instead of scblk then
                    505:        jeqlu   xilmod          #    try to write load module 
                    506:        pushr   $mr235
                    507:        cmpl    $b$scl,(r10)    # if not scblk then
                    508:        jnequ   erxit1          #    error
                    509:        pushl   r10             # push scblk pointer
                    510:        calls   $1,_doexec      # go do exit
                    511:        jmp     erxit2          # should never return
                    512: #
                    513: #      write load module
                    514: #
                    515: xilmod:        tstl    r5              # if r5 <= 0 then
                    516:        bgtr    0f
                    517:        pushr   $mr235          #    save regs for error exits
                    518:        jbr     erxit1          #    and take error exit
                    519: 0:     pushr   $cmpreg         # else save all compiler regs
                    520: #
                    521: #      need to save stack contents, so that when load module is
                    522: #      invoked, stack can be recreated.
                    523: #
                    524:        subl3   sp,_initsp,r0   # compute depth of stack
                    525:        cmpl    r0,tscblk       # if stack won't fit in tscblk then
                    526:        jgtru   xi2big          #    big trouble
                    527:        movl    sp,r0           # -> into real stack
                    528:        movab   tscblk+scstr,r1 # -> save stack area
                    529: 1:     movl    (r0)+,(r1)+     # copy word of stack ...
                    530:        cmpl    r0,_initsp      #    until hit top word
                    531:        blssu   1b
                    532:        movl    r1,lmodstk      # set top of saved stack
                    533: #
                    534: #      before creating the load module, we must relativize the
                    535: #      compiler cells that point into the stack.  We do this by
                    536: #      temporarily negating _initsp, calling streloc, and then
                    537: #      restoring _initsp.  After the load module has been written,
                    538: #      another call to streloc will restore the stack pointers.
                    539: #
                    540:        mnegl   _initsp,_initsp # negate _initsp so streloc will subtract
                    541:        jsb     streloc         # relativize the compiler cells
                    542:        mnegl   _initsp,_initsp # restore _initsp to its previous value
                    543: #
                    544: #      create a.out header in hststr scblk.
                    545: #
                    546:        addl3   $1023,dnamp,r1  # round current memory in use
                    547:        bicl3   $0x3ff,r1,-(sp) #   to a multiple of the page size
                    548:        movab   hststr+scstr,r0 # -> a.out header block
                    549:        pushl   r0              #   which will be the other argument
                    550:        movl    $0413,(r0)+     # set magic number
                    551:        bicl3   $0x3ff,$_etext,r1 # get text size, rounded down
                    552:        movl    r1,(r0)+        #   and place it in a.out header
                    553:        subl3   r1,4(sp),(r0)+  # data size = total - text size
                    554:        clrl    (r0)+           # we will use no bss
                    555:        clrl    (r0)+
                    556:        clrl    (r0)+           # set starting address
                    557:        clrl    (r0)+
                    558:        clrl    (r0)+
                    559: #
                    560: #      call a workhorse c routine to actually write a.out file.
                    561: #      the amount of memory to write has already been pushed.
                    562: #
                    563:        calls   $2,_wrtaout     # call to write a.out
                    564: #
                    565: #      restore compiler cells to their previous values
                    566: #
                    567:        jsb     streloc         # unrelativize stack pointers
                    568: #
                    569:        tstl    r0              # if error creating a.out then
                    570:        blss    xi2big          #    return error
                    571: #
                    572: #      pop registers and set up call to sysej
                    573: #
                    574:        popr    $cmpreg         # restore all registers
                    575:        movl    r7,r10          # -> chain of fcbs
                    576:        clrl    r7              # set &CODE = 0
                    577:        jsb     sysej           # call to end run
                    578: #
                    579: #      if stack too big
                    580: #
                    581: xi2big:        popr    $cmpreg         # restore all regs
                    582:        pushr   $mr235          # push correct regs
                    583:        jbr     erxit2          # take error exit
                    584: #
                    585: #      error/ppm exits - pick up n-th word following jsb and return
                    586: #      to address contained in that word.
                    587: #
                    588: erxit1:
                    589:        popr    $mr235
                    590:        movl    (sp)+,r11
                    591:        jmp     *(r11)+
                    592: #
                    593: erxit2:
                    594:        popr    $mr235
                    595:        addl3   $4,(sp)+,r11
                    596:        jmp     *(r11)+
                    597: #
                    598: erxit3:
                    599:        popr    $mr235
                    600:        addl3   $8,(sp)+,r11
                    601:        jmp     *(r11)+
                    602: #
                    603: erxit4:
                    604:        popr    $mr235
                    605:        addl3   $12,(sp)+,r11
                    606:        jmp     *(r11)+
                    607: #
                    608: erxit5:
                    609:        popr    $mr235
                    610:        addl3   $16,(sp)+,r11
                    611:        jmp     *(r11)+
                    612: #
                    613: erxit6:
                    614:        popr    $mr235
                    615:        addl3   $20,(sp)+,r11
                    616:        jmp     *(r11)+
                    617: #
                    618: #      streloc - relocate stack pointers.  this routine adds
                    619: #      _initsp to every cell whose address appears in strellst.
                    620: #
                    621: streloc:
                    622:        pushr   $mr0+mr1
                    623:        moval   _strellst,r1    # start of list of thing to relocate
                    624:        jbr     strel1          # jump into the loop
                    625: strel0:        addl2   _initsp,(r0)    # relocate a pointer
                    626: strel1:        movl    (r1)+,r0        # fetch a pointer to a cell
                    627:        jneq    strel0          # if zero, we're done
                    628:        popr    $mr0+mr1
                    629:        rsb     
                    630: #
                    631: #      interface data area
                    632: #      -------------------
                    633: #
                    634:        .data   1
                    635: #
                    636: #      #! data areas
                    637: #
                    638:        .globl  _cmdcnt
                    639: _cmdcnt:       .long   0               # number of  command args
                    640: rdrec1:        .long   0               # read record 1 from std in flag
                    641: #
                    642: #      standard ioblks
                    643: #
                    644: inpiob:        .space  iobuf
                    645:        .long   inpbf           # -> input bfblk
                    646:        .long   0               # file descriptor
                    647:        .long   IO_INP|IO_OPN|IO_SYS
                    648: #
                    649: inpbf: .space  bfsiz
                    650:        .long   1024            # buffer size
                    651:        .long   0               # remaining chars to read
                    652:        .long   0               # offset to next character to read
                    653:        .space  1024            # buffer
                    654: #
                    655: #
                    656: oupiob:        .space  iobuf
                    657:        .long   0               # no buffer
                    658:        .long   1               # file descriptor number
                    659:        .long   IO_OUP|IO_OPN|IO_SYS
                    660: #
                    661: #
                    662: ttyiob:        .space  iobuf
                    663:        .long   ttybf           # -> tty buffer input
                    664:        .long   2               # file descriptor number
                    665:        .long   IO_INP|IO_OUP|IO_OPN|IO_SYS
                    666: #
                    667: ttybf: .space  bfsiz
                    668:        .long   258             # buffer size
                    669:        .long   0               # remaining chars to read
                    670:        .long   0               # offset to next char to read
                    671:        .space  258             # buffer
                    672:        .align  2
                    673: #
                    674:        .globl  _rzfcb
                    675: _rzfcb:        .long   0
                    676: #
                    677: fildes:        .long   0
                    678: pr_len:        .long   0
                    679: rd_len:        .long   0
                    680: lenfname: .long        0
                    681: ioblkptr: .long 0
                    682: bfblkptr: .long        0
                    683: bfblksiz: .long        0
                    684: fcblkptr: .long        0
                    685: tioblk:        .space  iosize
                    686: #
                    687: #      flag that indicates that this is a load module. also, serves
                    688: #      the dual purpose of indicating size of saved stack.
                    689: #
                    690: lmodstk: .long 0
                    691: #
                    692: temp1: .long   0
                    693: temp2: .long   0
                    694: temp3: .long   0
                    695: #
                    696: nulstr:        .long   0,0
                    697: #
                    698: tscblk:        .long   512,0
                    699:        .space  512
                    700: #
                    701: hststr:        .long   128,0
                    702:        .space  128

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.