Annotation of 3BSD/cmd/px/31writeold.s, revision 1.1

1.1     ! root        1: #
        !             2: #
        !             3: # 31writeold.s
        !             4: #
        !             5: #    The following opcodes are provided to maintain compatability
        !             6: # with the previous pascal interpreter. They convert the stack to
        !             7: # the standard I/O format then branch to the appropriate function.
        !             8: #
        !             9: # These routines, especially "calcfmt", are an abomination for which
        !            10: # I apologize in advance. The formats should be calculated by the
        !            11: # compiler and this module discarded!
        !            12: #
        !            13: _WRITB:
        !            14:        subl2   $len,sp         #allocate space for format
        !            15:        tstw    len(sp)         #'true' => minimum width = 4
        !            16:        beql    l3120
        !            17:        pushl   $4
        !            18:        brb     l3121
        !            19: l3120:
        !            20:        pushl   $5              #'false' => minimum width = 5
        !            21: l3121:
        !            22:        pushl   $2              #data size
        !            23:        pushal  wrbool          #default format
        !            24:        calls   $3,calcfmt      #r0 pts to new top of stack
        !            25:        movl    r0,sp           #update stack
        !            26:        movl    $len,r6         #set format length
        !            27:        jbr     bentry          #execute normal write
        !            28: _WRITC:
        !            29:        tstb    (r10)           #check for formatting
        !            30:        jeql    _WRITEC         #none, so go to it !
        !            31:        movzwl  (sp)+,-(sp)     #align data
        !            32:        moval   wrchr,r0        #default format string to be used
        !            33: fprint:
        !            34:        subl2   $len,sp         #allocate space for format
        !            35:        pushl   $1              #minimum field width
        !            36:        pushl   $4              #data size
        !            37:        pushl   r0              #default format
        !            38:        calls   $3,calcfmt      #r0 pts to new top of stack
        !            39:        movl    r0,sp           #update stack
        !            40:        movl    $len,r6         #set format length
        !            41:        movl    $1,r5           #number of data arguements
        !            42:        jbr     fentry          #execute normal write
        !            43: _WRHEX2:
        !            44:        cvtwl   (sp)+,-(sp)     #align data
        !            45: _WRHEX4:
        !            46:        moval   wrhex,r0        #default format string to be used
        !            47:        jbr     fprint
        !            48: _WROCT2:
        !            49:        cvtwl   (sp)+,-(sp)     #align data
        !            50: _WROCT4:
        !            51:        moval   wroct,r0        #default format string to be used
        !            52:        jbr     fprint
        !            53: _WRIT2:
        !            54:        cvtwl   (sp)+,-(sp)     #align data
        !            55: _WRIT4:
        !            56:        moval   wrint,r0        #default format string to be used
        !            57:        jbr     fprint
        !            58: _WRIT8:
        !            59:        subl2   $len,sp         #allocate space for format
        !            60:        pushl   $8              #minimum field width
        !            61:        pushl   $8              #data size
        !            62:        pushal  wrreal          #default format
        !            63:        calls   $3,calcfmt      #r0 pts to new top of stack
        !            64:        movl    r0,sp           #update stack
        !            65:        pushl   $14             #push default precision
        !            66:        pushal  -(sp)           #get field width spec, so that
        !            67:        pushal  rd4             # maximum permissable precision
        !            68:        pushal  26(sp)          # can be calculated
        !            69:        calls   $3,_sscanf      #field width returned on stack
        !            70:        subl3   $7,(sp)+,r0     #r0 = max_precision = width - required_space
        !            71:        cmpl    (sp),r0         #if precision requested < r0
        !            72:        bleq    l3122           # then use request
        !            73:        movl    r0,(sp)         # else use max permissable
        !            74: l3122:
        !            75:        movl    $len,r6         #set format length
        !            76:        movl    $3,r5           #real data and precision
        !            77:        jbr     fentry
        !            78: _WRIT82:
        !            79:        subl2   $len,sp         #allocate space for format
        !            80:        pushl   $1              #minimum field width
        !            81:        pushl   $8              #data size
        !            82:        pushal  wrfixd          #default format
        !            83:        calls   $3,calcfmt      #r0 pts to new top of stack
        !            84:        movl    r0,sp           #update stack
        !            85:        bbs     $4,-1(r10),l3123#check precision size
        !            86:        movl    len+8(sp),-(sp) #push precision
        !            87:        movl    $len+4,r6       #set format + precision length
        !            88:        brb     l3124
        !            89: l3123:
        !            90:        cvtwl   len+8(sp),-(sp) #push precision
        !            91:        movl    $len+2,r6       #set format + precision length
        !            92: l3124:
        !            93:        movl    $3,r5           #real data and precision
        !            94:        jbr     fentry
        !            95: #
        !            96: _WRITG:
        !            97:        cvtwl   1(r10),r5       #r5 has string length
        !            98:        addl3   $1,r5,r6        #make space for null terminater
        !            99:        blbc    r6,l3125        #r6 has data length
        !           100:        incl    r6
        !           101: l3125:
        !           102:        subl3   r5,r6,r0        #check for need to add terminater
        !           103:        blbs    r0,l3126        #1 => already terminated; 2 => needed
        !           104:        subl2   $2,sp           #allocate terminater space
        !           105:        movc5   r5,2(sp),$0,r6,(sp)  #put in terminater
        !           106: l3126:
        !           107:        subl2   $len,sp         #allocate space for format
        !           108:        cvtwl   1(r10),-(sp)    #push minimum string length
        !           109:        pushl   r6              #data size
        !           110:        pushal  wrstr           #default format
        !           111:        calls   $3,calcfmt      #r0 pts to new top of stack
        !           112:        movl    r0,sp           #update stack
        !           113:        addl2   $2,r10          #update lc
        !           114:        movl    $len,r5         #set format length
        !           115:        jbr     sentry          #execute normal write string
        !           116: #
        !           117: # Default formats
        !           118: #
        !           119:        .set    len,12          #maximum format size
        !           120: wrbool:        .byte   '%,'1,'0,'s, 0
        !           121: wrhex: .byte   '%,'8,'X, 0
        !           122: wroct: .byte   '%,'1,'1,'O, 0
        !           123: wrint: .byte   '%,'1,'0,'D, 0
        !           124: wrchr: .byte   '%,'c, 0
        !           125: wrstr: .byte   '%,'s, 0
        !           126:        .data
        !           127: wrreal:        .byte   ' ,'%,'2,'1,'.,'*,'e, 0
        !           128: wrfixd:        .byte   ' ,'%,'2,'1,'.,'*,'f, 0
        !           129:        .text
        !           130: #
        !           131: #
        !           132: # Routine to calculate formats and place them on the stack
        !           133: #
        !           134: 
        !           135: calcfmt:#(format, datasize, minsize)
        !           136: 
        !           137: #char  *format;        /* pointer to default format */
        !           138: #long  datasize;       /* number of bytes of data */
        !           139: #long  minsize;        /* minimum width of output field */
        !           140: 
        !           141:        .set    args,16         #size of arguements on the stack
        !           142: 
        !           143:        .word   R2|R3|R4|R5|R6|R9
        !           144:        cvtbl   (r10)+,r0       #r0 has width spec
        !           145:        bneq    l3140           #check for width spec
        !           146:        moval   args(ap), r9    # r9 pts to return sp value
        !           147:        movl    4(ap),r6        #r6 pts to default format
        !           148:        jbr     l3148
        !           149: l3140:
        !           150:        moval   len+args(ap),r1 #r1 pts to data
        !           151:        addl2   8(ap),r1        #r1 pts to width specification
        !           152:        bbs     $1,r0,l3141     #check format size
        !           153:        moval   args+4(ap), r9  # r9 pts to return sp value
        !           154:        movl    (r1),r2         #r2 has width spec
        !           155:        brb     l3142
        !           156: l3141:
        !           157:        moval   args+2(ap), r9  # r9 pts to return sp value
        !           158:        cvtwl   (r1),r2         #r2 has width spec
        !           159: l3142:
        !           160:        cmpl    r2,12(ap)       #check to meet minimum width
        !           161:        bgeq    l3143
        !           162:        movl    12(ap),r2       #if not, set to minimum width
        !           163: l3143:
        !           164:        movl    4(ap),r6        #r6 pts to default format
        !           165:        subl2   $len,sp         #allocate workspace for new format
        !           166:        movl    sp,r5           #r5 pts to new format
        !           167: l3144:
        !           168:        movb    (r6),(r5)+      #move format up to data spec
        !           169:        cmpb    (r6)+,$'%
        !           170:        bneq    l3144
        !           171:        subl2   $4,sp           #convert length to ascii
        !           172:        cvtlp   r2,$7,(sp)
        !           173:        cvtps   $7,(sp),$7,(r5) #place ascii in format
        !           174:        addl2   $4,sp
        !           175:        skpc    $'0,$7,1(r5)    #remove sign and leading zeros
        !           176:        movc3   r0,(r1),(r5)    #r3 pts to next free byte
        !           177: l3145:
        !           178:        subb3   $'0,(r6)+,r0    #move r6 over default width
        !           179:        blss    l3146           #(note: could use 'spanc' for this)
        !           180:        cmpb    r0,$9
        !           181:        bleq    l3145
        !           182: l3146:
        !           183:        decl    r6
        !           184: l3147:
        !           185:        movb    (r6)+,(r3)+     #copy remainder of format
        !           186:        bneq    l3147           #(note: could use 'movtuc' for this)
        !           187:        movl    sp,r6           #r6 pts to format to be used
        !           188: l3148:
        !           189:        movc3   8(ap),len+args(ap),( r9)  #move up data to make room for format
        !           190:        addl3   8(ap), r9,r0    #r0 pts to space for format
        !           191:        movc3   $len,(r6),(r0)  #copy in format
        !           192:        movl     r9,r0          #r0 pts to top of stack on return
        !           193:        ret

unix.superglobalmegacorp.com

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