Annotation of 43BSDReno/sys/vax/emulate.s, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1986, 1987 The Regents of the University of California.
                      3:  * All rights reserved.
                      4:  *
                      5:  * This code is derived from software contributed to Berkeley by
                      6:  * Mt. Xinu.
                      7:  *
                      8:  * Redistribution is only permitted until one year after the first shipment
                      9:  * of 4.4BSD by the Regents.  Otherwise, redistribution and use in source and
                     10:  * binary forms are permitted provided that: (1) source distributions retain
                     11:  * this entire copyright notice and comment, and (2) distributions including
                     12:  * binaries display the following acknowledgement:  This product includes
                     13:  * software developed by the University of California, Berkeley and its
                     14:  * contributors'' in the documentation or other materials provided with the
                     15:  * distribution and in all advertising materials mentioning features or use
                     16:  * of this software.  Neither the name of the University nor the names of
                     17:  * its contributors may be used to endorse or promote products derived from
                     18:  * this software without specific prior written permission.
                     19:  * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
                     20:  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
                     21:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     22:  *
                     23:  *     @(#)emulate.s   7.5 (Berkeley) 6/28/90
                     24:  */
                     25: 
                     26: #if VAX630 || VAX650
                     27: /*
                     28:  * String instruction emulation - MicroVAX only.  These routines are called
                     29:  * from locore.s when an "emulate" fault occurs on the MicroVAX.  They are
                     30:  * called with the stack set up as follows:
                     31:  *
                     32:  *       (sp): Return address of trap handler
                     33:  *      4(sp): Instruction Opcode      (also holds PSL result from emulator)
                     34:  *      8(sp): Instruction PC
                     35:  *     12(sp): Operand 1
                     36:  *     16(sp): Operand 2
                     37:  *     20(sp): Operand 3
                     38:  *     24(sp): Operand 4
                     39:  *     28(sp): Operand 5
                     40:  *     32(sp): Operand 6
                     41:  *     36(sp): old Register 11
                     42:  *     40(sp): old Register 10
                     43:  *     44(sp): Return PC
                     44:  *     48(sp): Return PSL
                     45:  *     52(sp): TOS before instruction
                     46:  *
                     47:  * R11 and r10 are available for use.  If any routine needs to use r9-r1
                     48:  * they need to save them first (unless those registers are SUPPOSED to be
                     49:  * messed with by the "instruction").  These routines leave their results
                     50:  * in registers 0-5 explicitly, as needed, and use the macros defined below
                     51:  * to link up with calling routine.
                     52:  */
                     53: 
                     54: #define return         rsb
                     55: #define savepsl                movpsl  4(sp)
                     56: #define setpsl(reg)    movl    reg,4(sp)
                     57: #define overflowpsl    movl    $2,4(sp)
                     58: #define arg1           12(sp)
                     59: #define arg2           16(sp)
                     60: #define arg3           20(sp)
                     61: #define arg4           24(sp)
                     62: #define arg5           28(sp)
                     63: #define arg6           32(sp)
                     64: #define argub(num,reg) movzbl  8+4*num(sp),reg
                     65: #define arguw(num,reg) movzwl  8+4*num(sp),reg
                     66: #define argul(num,reg) movl    8+4*num(sp),reg
                     67: #define argb(num,reg)  cvtbl   8+4*num(sp),reg
                     68: #define argw(num,reg)  cvtwl   8+4*num(sp),reg
                     69: #define argl(num,reg)  movl    8+4*num(sp),reg
                     70: #define toarg(reg,num) movl    reg,8+4*num(sp)
                     71: 
                     72: 
                     73:        .text
                     74:        .align  1
                     75:        .globl  _EMcrc
                     76: _EMcrc:
                     77:        argl(1,r11)             # (1) table address == r11
                     78:        argl(2,r0)              # (2) initial crc == r0
                     79:        argl(4,r3)              # (4) source address == r3
                     80:        arguw(3,r2)             # (3) source length == r2
                     81:        jeql    Lcrc_out
                     82: Lcrc_loop:
                     83:        xorb2   (r3)+,r0
                     84:        extzv   $0,$4,r0,r10
                     85:        extzv   $4,$28,r0,r1
                     86:        xorl3   r1,(r11)[r10],r0
                     87:        extzv   $0,$4,r0,r10
                     88:        extzv   $4,$28,r0,r1
                     89:        xorl3   r1,(r11)[r10],r0
                     90:        sobgtr  r2,Lcrc_loop
                     91:        tstl    r0
                     92: Lcrc_out:
                     93:        savepsl
                     94:        clrl    r1
                     95:        return
                     96: 
                     97: 
                     98:        .align  1
                     99:        .globl  _EMmovtc
                    100: _EMmovtc:
                    101:        arguw(1,r0)             # (1) source length == r0
                    102:        argl(2,r1)              # (2) source address == r1
                    103:        argub(3,r11)            # (3) fill character == r11
                    104:        argl(4,r3)              # (4) table address == r3
                    105:        argl(6,r5)              # (6) destination address == r5
                    106:        arguw(5,r4)             # (5) destination length == r4
                    107:        jeql    Lmovtc_out
                    108: Lmovtc_loop:
                    109:        tstl    r0
                    110:        jeql    Lmovtc_2loop
                    111:        movzbl  (r1)+,r2
                    112:        movb    (r3)[r2],(r5)+
                    113:        decl    r0
                    114:        sobgtr  r4,Lmovtc_loop
                    115:        jbr     Lmovtc_out
                    116: Lmovtc_2loop:
                    117:        movb    r11,(r5)+
                    118:        sobgtr  r4,Lmovtc_2loop
                    119: Lmovtc_out:
                    120:        cmpl    r4,r0
                    121:        savepsl
                    122:        clrl    r2
                    123:        return
                    124: 
                    125: 
                    126:        .align  1
                    127:        .globl  _EMmovtuc
                    128: _EMmovtuc:
                    129:        arguw(1,r0)             # (1) source length == r0
                    130:        argl(2,r1)              # (2) source address == r1
                    131:        argub(3,r11)            # (3) escape character == r11
                    132:        argl(4,r3)              # (4) table address == r3
                    133:        argl(6,r5)              # (6) destination address == r5
                    134:        arguw(5,r4)             # (5) destination length == r4
                    135:        jeql    Lmovtuc_out
                    136: Lmovtuc_loop:
                    137:        tstl    r0
                    138:        jeql    Lmovtuc_out
                    139:        movzbl  (r1),r2
                    140:        movzbl  (r3)[r2],r2
                    141:        cmpl    r2,r11
                    142:        jeql    Lmovtuc_out
                    143:        movzbl  (r1)+,r2
                    144:        movb    (r3)[r2],(r5)+
                    145:        decl    r0
                    146:        sobgtr  r4,Lmovtuc_loop
                    147: Lmovtuc_out:
                    148:        cmpl    r4,r0
                    149:        savepsl
                    150:        clrl    r2
                    151:        return
                    152: 
                    153: 
                    154:        .align  1
                    155:        .globl  _EMmatchc
                    156: _EMmatchc:
                    157:        argl(2,r10)             # (2) substring address == r10
                    158:        arguw(3,r2)             # (3) source length == r2
                    159:        argl(4,r3)              # (4) source address == r3
                    160:        arguw(1,r11)            # (1) substring length == r11
                    161:        jeql    Lmatchc_out     # temp source address == r1
                    162:        addl2   r10,r11         # temp substring address == r0
                    163:        tstl    r2
                    164:        jeql    Lmatchc_out
                    165: Lmatchc_loop:
                    166:        cmpb    (r10),(r3)
                    167:        jneq    Lmatchc_fail
                    168:        movl    r3,r1
                    169:        movl    r10,r0
                    170: Lmatchc_2loop:
                    171:        cmpl    r0,r11
                    172:        jeql    Lmatchc_succ
                    173:        cmpb    (r0)+,(r1)+
                    174:        jeql    Lmatchc_2loop
                    175: Lmatchc_fail:
                    176:        incl    r3
                    177:        sobgtr  r2,Lmatchc_loop
                    178:        movl    r10,r1
                    179:        subl3   r10,r11,r0
                    180:        jbr     Lmatchc_out
                    181: Lmatchc_succ:  
                    182:        movl    r1,r3
                    183:        movl    r11,r1
                    184:        clrl    r0
                    185: Lmatchc_out:
                    186:        savepsl
                    187:        return
                    188: 
                    189: 
                    190:        .align  1
                    191:        .globl  _EMspanc
                    192: _EMspanc:
                    193:        argl(2,r1)              # (2) string address == r1
                    194:        argub(4,r2)             # (4) character-mask == r2
                    195:        argl(3,r3)              # (3) table address == r3
                    196:        arguw(1,r0)             # (1) string length == r0
                    197:        jeql    Lspanc_out
                    198: Lspanc_loop:
                    199:        movzbl  (r1),r11
                    200:        mcomb   (r3)[r11],r11
                    201:        bicb3   r11,r2,r11
                    202:        jeql    Lspanc_out
                    203:        incl    r1
                    204:        sobgtr  r0,Lspanc_loop
                    205: Lspanc_out:
                    206:        savepsl
                    207:        clrl    r2
                    208:        return
                    209: 
                    210: 
                    211:        .align  1
                    212:        .globl  _EMscanc
                    213: _EMscanc:
                    214:        argl(2,r1)              # (2) string address == r1
                    215:        argub(4,r2)             # (4) character-mask == r2
                    216:        argl(3,r3)              # (3) table address == r3
                    217:        arguw(1,r0)             # (1) string length == r0
                    218:        jeql    Lscanc_out
                    219: Lscanc_loop:
                    220:        movzbl  (r1),r11
                    221:        mcomb   (r3)[r11],r11
                    222:        bicb3   r11,r2,r11
                    223:        jneq    Lscanc_out
                    224:        incl    r1
                    225:        sobgtr  r0,Lscanc_loop
                    226: Lscanc_out:
                    227:        savepsl
                    228:        clrl    r2
                    229:        return
                    230: 
                    231: 
                    232:        .align  1
                    233:        .globl  _EMskpc
                    234: _EMskpc:
                    235:        argub(1,r11)            # (1) character == r11
                    236:        argl(3,r1)              # (3) string address == r1
                    237:        arguw(2,r0)             # (2) string length == r0
                    238:        jeql    Lskpc_out       # forget zero length strings
                    239: Lskpc_loop:
                    240:        cmpb    (r1),r11
                    241:        jneq    Lskpc_out
                    242:        incl    r1
                    243:        sobgtr  r0,Lskpc_loop
                    244: Lskpc_out:
                    245:        tstl    r0              # be sure of condition codes
                    246:        savepsl
                    247:        return
                    248: 
                    249: 
                    250:        .align  1
                    251:        .globl  _EMlocc
                    252: _EMlocc:
                    253:        argub(1,r11)            # (1) character == r11
                    254:        argl(3,r1)              # (3) string address == r1
                    255:        arguw(2,r0)             # (2) string length == r0
                    256:        jeql    Lskpc_out       # forget zero length strings
                    257: Llocc_loop:
                    258:        cmpb    (r1),r11
                    259:        jeql    Llocc_out
                    260:        incl    r1
                    261:        sobgtr  r0,Llocc_loop
                    262: Llocc_out:
                    263:        tstl    r0              # be sure of condition codes
                    264:        savepsl
                    265:        return
                    266: 
                    267: 
                    268:        .align  1
                    269:        .globl  _EMcmpc3
                    270: _EMcmpc3:
                    271:        argl(2,r1)              # (2) string1 address == r1
                    272:        argl(3,r3)              # (3) string2 address == r3
                    273:        arguw(1,r0)             # (1) strings' length == r0
                    274:        jeql    Lcmpc3_out
                    275: Lcmpc3_loop:
                    276:        cmpb    (r1),(r3)
                    277:        jneq    Lcmpc3_out
                    278:        incl    r1
                    279:        incl    r3
                    280:        sobgtr  r0,Lcmpc3_loop
                    281: Lcmpc3_out:
                    282:        savepsl
                    283:        movl    r0,r2
                    284:        return
                    285: 
                    286: 
                    287:        .align  1
                    288:        .globl  _EMcmpc5
                    289: _EMcmpc5:
                    290:        argl(2,r1)              # (2) string1 address == r1
                    291:        argub(3,r11)            # (1) fill character == r11
                    292:        arguw(4,r2)             # (1) string2 length == r2
                    293:        argl(5,r3)              # (3) string2 address == r3
                    294:        arguw(1,r0)             # (1) string1 length == r0
                    295:        jeql    Lcmpc5_str2
                    296: Lcmpc5_loop:
                    297:        tstl    r2
                    298:        jeql    Lcmpc5_str1loop
                    299:        cmpb    (r1),(r3)
                    300:        jneq    Lcmpc5_out
                    301:        incl    r1
                    302:        incl    r3
                    303:        decl    r2
                    304:        sobgtr  r0,Lcmpc5_loop
                    305: Lcmpc5_str2:
                    306:        tstl    r2
                    307:        jeql    Lcmpc5_out
                    308: Lcmpc5_str2loop:
                    309:        cmpb    r11,(r3)
                    310:        jneq    Lcmpc5_out
                    311:        incl    r3
                    312:        sobgtr  r2,Lcmpc5_str2loop
                    313:        jbr     Lcmpc5_out
                    314: Lcmpc5_str1loop:
                    315:        cmpb    (r1),r11
                    316:        jneq    Lcmpc5_out
                    317:        incl    r1
                    318:        sobgtr  r0,Lcmpc5_str1loop
                    319: Lcmpc5_out:
                    320:        savepsl
                    321:        return
                    322: 
                    323: 
                    324: /*
                    325:  * Packed Decimal string operations
                    326:  */
                    327: 
                    328: #define POSITIVE       $12
                    329: #define NEGATIVE       $13
                    330: #define NEGATIVEalt    $11
                    331: 
                    332: 
                    333:        .align  1
                    334:        .globl  _EMaddp4
                    335: _EMaddp4:
                    336:        toarg(r9,6)             # save register r9 in arg6 spot
                    337:        arguw(1,r11)            # (1) source length == r11
                    338:        argl(2,r10)             # (2) source address == r10
                    339:        arguw(3,r9)             # (3) destination length == r9
                    340:        argl(4,r3)              # (4) destination address == r3
                    341:                        # arg4 will be needed later
                    342:                        # arg5 holds destination address of LSNibble temporarily
                    343:        ashl    $-1,r11,r11
                    344:        addl2   r11,r10         # source address of LSNibble
                    345:        incl    r11             # source length is in bytes
                    346:        ashl    $-1,r9,r9
                    347:        addl2   r9,r3           # r3 = destination address of LSNibble
                    348:        incl    r9              # destination length is in bytes
                    349:        toarg(r3,5)             #    stored in arg5 spot
                    350:        extzv   $0,$4,(r3),r2   # set standard +/- indicators in destination
                    351:        cmpl    r2,NEGATIVE
                    352:        jeql    L112
                    353:        cmpl    r2,NEGATIVEalt
                    354:        jeql    L111
                    355:        insv    POSITIVE,$0,$4,(r3)
                    356:        jbr     L112
                    357: L111:
                    358:        insv    NEGATIVE,$0,$4,(r3)
                    359: L112:
                    360:        extzv   $0,$4,(r10),r2  # r2 = standard +/- of source
                    361:        cmpl    r2,NEGATIVE
                    362:        jeql    L114
                    363:        cmpl    r2,NEGATIVEalt
                    364:        jeql    L113
                    365:        movl    POSITIVE,r2
                    366:        jbr     L114
                    367: L113:
                    368:        movl    NEGATIVE,r2
                    369: L114:
                    370:        cmpl    r11,r9          # if source is longer than destination
                    371:        jleq    L115
                    372:        movl    r9,r11          #       set source length == destination length
                    373: L115:
                    374:        extzv   $4,$4,(r3),r9   # r9 = LSDigit of destination
                    375:        extzv   $4,$4,(r10),r1  # r1 = LSDigit of source
                    376:        extzv   $0,$4,(r3),r0
                    377:        cmpl    r0,r2           # if signs of operands are not equal
                    378:        jeql    Laddp4_same     #       do a subtraction
                    379:        clrl    r2              # r2 is non-zero if result is non-zero
                    380:        subl2   r1,r9           # r9 = "addition" of operands' high nibble
                    381:        jbr     L119            # jump into addition loop
                    382: Laddp4_diff_loop:
                    383:        decl    r3
                    384:        extzv   $0,$4,(r3),r0
                    385:        addl2   r0,r1           # r1 = carry + next (low) nibble of source
                    386:        decl    r10
                    387:        extzv   $0,$4,(r10),r0
                    388:        subl2   r0,r1           # r1 -= next (low) nibble of destination
                    389:        jgeq    L121            # if negative result
                    390:        mnegl   $1,r9           #       r9 == carry = -1
                    391:        addl2   $10,r1          #       r1 == result += 10
                    392:        jbr     L122            # else
                    393: L121:
                    394:        clrl    r9              #       r9 == carry = 0
                    395: L122:
                    396:        insv    r1,$0,$4,(r3)   # store result low nibble
                    397:        bisl2   r1,r2
                    398:        extzv   $4,$4,(r3),r0
                    399:        addl2   r0,r9           # r9 = carry + next (high) nibble of source
                    400:        extzv   $4,$4,(r10),r0
                    401:        subl2   r0,r9           # r9 -= next (high) nibble of destination
                    402: L119:
                    403:        jgeq    L117            # if negative result
                    404:        mnegl   $1,r1           #       r1 == carry = -1
                    405:        addl2   $10,r9          #       r9 == result += 10
                    406:        jbr     L118            # else
                    407: L117:
                    408:        clrl    r1              #       r1 == carry = 0
                    409: L118:
                    410:        insv    r9,$4,$4,(r3)   # store result high nibble
                    411:        bisl2   r9,r2           # r2 is non-zero if result is non-zero
                    412:        decl    r11             # while (--source length)
                    413:        jneq    Laddp4_diff_loop
                    414:        argl(4,r10)             # r10 = address of destination MSNibble
                    415:        jbr     Laddp4_diff_carry
                    416: Laddp4_diff_carlop:
                    417:        decl    r3
                    418:        extzv   $0,$4,(r3),r0
                    419:        addl2   r0,r1           # r1 == carry += next (low) nibble
                    420:        jgeq    L127            # if less than zero
                    421:        movl    r1,r9           #       r9 == carry (must be -1)
                    422:        movl    $9,r1           #       r1 == result = 9
                    423:        jbr     L128
                    424: L127:                          # else
                    425:        clrl    r9              #       r9 == carry = 0
                    426: L128:
                    427:        insv    r1,$0,$4,(r3)   # store result
                    428:        bisl2   r1,r2
                    429:        extzv   $4,$4,(r3),r0
                    430:        addl2   r0,r9           # r9 == carry += next (high) nibble
                    431:        jgeq    L129            # if less than zero
                    432:        movl    r9,r1           # r1 == carry (must be -1)
                    433:        movl    $9,r9           # r9 == result = 9
                    434:        jbr     L130
                    435: L129:
                    436:        clrl    r1
                    437: L130:
                    438:        insv    r9,$4,$4,(r3)   # store result
                    439:        bisl2   r9,r2
                    440: Laddp4_diff_carry:
                    441:        cmpl    r3,r10
                    442:        jneq    Laddp4_diff_carlop
                    443:        tstl    r1              #       if carry out of MSN then fix up result
                    444:        jeql    Laddp4_add_done
                    445:        argl(5,r3)              # r3 == address of LSN of destination
                    446:        extzv   $0,$4,(r3),r0
                    447:        cmpl    r0,NEGATIVE     # switch sign of result
                    448:        jneq    L132
                    449:        insv    POSITIVE,$0,$4,(r3)
                    450:        jbr     L133
                    451: L132:
                    452:        insv    NEGATIVE,$0,$4,(r3)
                    453: L133:
                    454:        extzv   $4,$4,(r3),r0   # normalize result (carry out of MSN into LSN)
                    455:        subl3   r0,$10,r9       # r9 = 10 - destination LSNibble
                    456:        jbr     L134
                    457: L137:
                    458:        movl    $9,r1
                    459: Laddp4_diff_norm:
                    460:        insv    r9,$4,$4,(r3)
                    461:        cmpl    r3,r10          # while (not at MSNibble)
                    462:        jeql    Laddp4_add_done
                    463:        decl    r3
                    464:        extzv   $0,$4,(r3),r0   # low nibble = (9 + carry) - low nibble
                    465:        subl2   r0,r1
                    466:        cmpl    r1,$9
                    467:        jleq    L135
                    468:        clrl    r1
                    469:        movl    $10,r9
                    470:        jbr     L136
                    471: L135:
                    472:        movl    $9,r9
                    473: L136:
                    474:        insv    r1,$0,$4,(r3)
                    475:        extzv   $4,$4,(r3),r0   # high nibble = (9 + carry) - high nibble
                    476:        subl2   r0,r9
                    477: L134:
                    478:        cmpl    r9,$9
                    479:        jleq    L137
                    480:        clrl    r9
                    481:        movl    $10,r1
                    482:        jbr     Laddp4_diff_norm
                    483: 
                    484: Laddp4_same:                   # operands are of the same sign
                    485:        clrl    r2
                    486:        addl2   r1,r9
                    487:        jbr     L139
                    488: Laddp4_same_loop:
                    489:        decl    r3
                    490:        extzv   $0,$4,(r3),r0
                    491:        addl2   r0,r1           # r1 == carry += next (low) nibble of dest
                    492:        decl    r10
                    493:        extzv   $0,$4,(r10),r0
                    494:        addl2   r0,r1           # r1 += next (low) nibble of source
                    495:        cmpl    r1,$9           # if result > 9
                    496:        jleq    L141
                    497:        movl    $1,r9           #       r9 == carry = 1
                    498:        subl2   $10,r1          #       r1 == result -= 10
                    499:        jbr     L142
                    500: L141:                          # else
                    501:        clrl    r9              #       r9 == carry = 0
                    502: L142:
                    503:        insv    r1,$0,$4,(r3)   # store result
                    504:        bisl2   r1,r2
                    505:        extzv   $4,$4,(r10),r0
                    506:        addl2   r0,r9           # ditto for high nibble
                    507:        extzv   $4,$4,(r3),r0
                    508:        addl2   r0,r9
                    509: L139:
                    510:        cmpl    r9,$9
                    511:        jleq    L143
                    512:        movl    $1,r1
                    513:        subl2   $10,r9
                    514:        jbr     L144
                    515: L143:
                    516:        clrl    r1
                    517: L144:
                    518:        insv    r9,$4,$4,(r3)
                    519:        bisl2   r9,r2
                    520:        sobgtr  r11,Laddp4_same_loop    # while (--source length)
                    521:        argl(4,r10)             # r10 = destination address of MSNibble
                    522:        jbr     Laddp4_same_carry
                    523: Laddp4_same_cloop:
                    524:        decl    r3
                    525:        extzv   $0,$4,(r3),r0   # propagate carry up to MSNibble of destination
                    526:        addl2   r0,r1
                    527:        cmpl    r1,$10
                    528:        jneq    L147
                    529:        movl    $1,r9
                    530:        clrl    r1
                    531:        jbr     L148
                    532: L147:
                    533:        clrl    r9
                    534: L148:
                    535:        insv    r1,$0,$4,(r3)
                    536:        bisl2   r1,r2
                    537:        extzv   $4,$4,(r3),r0
                    538:        addl2   r0,r9
                    539:        cmpl    r9,$10
                    540:        jneq    L149
                    541:        movl    $1,r1
                    542:        clrl    r9
                    543:        jbr     L150
                    544: L149:
                    545:        clrl    r1
                    546: L150:
                    547:        insv    r9,$4,$4,(r3)
                    548:        bisl2   r9,r2
                    549: Laddp4_same_carry:
                    550:        cmpl    r3,r10
                    551:        jneq    Laddp4_same_cloop
                    552: 
                    553: Laddp4_add_done:
                    554:        argl(5,r3)              # r3 = destination address of LSNibble
                    555:        tstl    r2              # if zero result
                    556:        jneq    L151
                    557:        savepsl                 #       remember that for condition codes
                    558:        insv    POSITIVE,$0,$4,(r3) #   make sure sign of result is positive
                    559:        jbr     Laddp4_out
                    560: L151:                          # else
                    561:        extzv   $0,$4,(r3),r0
                    562:        cmpl    r0,NEGATIVE     #       if result is negative
                    563:        jneq    Laddp4_out
                    564:        mnegl   r2,r2           #               remember THAT in Cond Codes
                    565:        savepsl
                    566: Laddp4_out:
                    567:        argl(4,r3)
                    568:        argl(2,r1)
                    569:        clrl    r0
                    570:        clrl    r2
                    571:        argl(6,r9)              # restore r9 from stack
                    572:        return
                    573: 
                    574: 
                    575:        .align  1
                    576:        .globl  _EMmovp
                    577: _EMmovp:
                    578:        arguw(1,r11)            # (1) string length == r11
                    579:        argl(2,r10)             # (1) source address == r10
                    580:        argl(3,r3)              # (1) destination address == r3
                    581:                        # we will need arg2 and arg3 later
                    582:        clrl    r2              # r2 == non-zero if source is non-zero
                    583:        ashl    $-1,r11,r11     # length is number of bytes, not nibbles
                    584:        jeql    Lmovp_zlen
                    585: Lmovp_copy:
                    586:        bisb2   (r10),r2        # keep track of non-zero source
                    587:        movb    (r10)+,(r3)+    # move two nibbles
                    588:        sobgtr  r11,Lmovp_copy  # loop for length of source
                    589: Lmovp_zlen:
                    590:        extzv   $4,$4,(r10),r0  # look at least significant nibble
                    591:        bisl2   r0,r2
                    592:        extzv   $0,$4,(r10),r0  # check sign nibble
                    593:        cmpl    r0,NEGATIVEalt
                    594:        jeql    Lmovp_neg
                    595:        cmpl    r0,NEGATIVE
                    596:        jneq    Lmovp_pos
                    597: Lmovp_neg:                     # source was negative
                    598:        mnegl   r2,r2
                    599: Lmovp_pos:
                    600:        tstl    r2              # set condition codes
                    601:        savepsl
                    602:        jeql    Lmovp_zero
                    603:        movb    (r10),(r3)      # move last byte if non-zero result
                    604:        jbr     Lmovp_out
                    605: Lmovp_zero:
                    606:        movb    POSITIVE,(r3)   #       otherwise, make result zero and positive
                    607: Lmovp_out:
                    608:        clrl    r0
                    609:        argl(2,r1)
                    610:        clrl    r2
                    611:        argl(3,r3)
                    612:        return
                    613: 
                    614: 
                    615: /*
                    616:  *     Definitions for Editpc instruction
                    617:  *
                    618:  *  Here are the commands and their corresponding hex values:
                    619:  *
                    620:  *     EPend           0x00
                    621:  *     EPend_float     0x01
                    622:  *     EPclear_signif  0x02
                    623:  *     EPset_signif    0x03
                    624:  *     EPstore_sign    0x04
                    625:  *     EPload_fill     0x40
                    626:  *     EPload_sign     0x41
                    627:  *     EPload_plus     0x42
                    628:  *     EPload_minus    0x43
                    629:  *     EPinsert        0x44
                    630:  *     EPblank_zero    0x45
                    631:  *     EPreplace_sign  0x46
                    632:  *     EPadjust_input  0x47
                    633:  *     EPfill          0x80
                    634:  *     EPmove          0x90
                    635:  *     EPfloat         0xa0
                    636:  *
                    637:  *
                    638:  *  r4 is carved up as follows:
                    639:  *
                    640:  *     ------------------------------------------- 
                    641:  *     |                                   N Z V C |
                    642:  *     -------------------------------------------
                    643:  *
                    644:  *     fill character is stuffed into arg5 space
                    645:  *     sign character is stuffed into arg6 space
                    646:  */
                    647: 
                    648: #define SIGNIFBIT      $0
                    649: #define setsignif      bisl2   $1,r4
                    650: #define clsignif       bicl2   $1,r4
                    651: #define OVERFLOWBIT    $1
                    652: #define setoverflow    bisl2   $2,r4
                    653: #define cloverflow     bicl2   $2,r4
                    654: #define ZEROBIT                $2
                    655: #define setzero                bisl2   $4,r4
                    656: #define clzero         bicl2   $4,r4
                    657: #define NEGATIVEBIT    $3
                    658: #define setnegative    bisl2   $8,r4
                    659: #define clnegative     bicl2   $8,r4
                    660: #define putfill                movb    arg5,(r5)+
                    661: #define setfill(reg)   movb    reg,arg5
                    662: #define putsign                movb    arg6,(r5)+
                    663: #define setsign(reg)   movb    reg,arg6
                    664: 
                    665: 
                    666:        .align  1
                    667:        .globl  _EMeditpc
                    668: _EMeditpc:
                    669:        arguw(1,r11)            # (1) source length == r11
                    670:        argl(2,r10)             # (2) source address == r10
                    671:        argl(3,r3)              # (3) pattern address == r3
                    672:        argl(4,r5)              # (4) destination address == r5
                    673:                        # we will need arg1 and arg2 later
                    674:                        # arg5 and arg6 are used for fill and sign - r0 is free
                    675:        setfill($32)            # fill character is ' '
                    676:        setsign($32)            # sign character is ' '
                    677:        clrl    r4              # clear flags
                    678:        ashl    $-1,r11,r11     # source length / 2
                    679:        addl3   r11,r10,r2
                    680:        extzv   $4,$4,(r2),r1   # r1 == least significant nibble of source
                    681: L169:
                    682:        cmpl    r2,r10
                    683:        jeql    L170
                    684:        tstb    -(r2)           # loop over source packed decimal number
                    685:        jeql    L169
                    686:        incl    r1              # r1 is non-zero if source is non-zero
                    687: L170:
                    688:        addl3   r11,r10,r2
                    689:        tstl    r1
                    690:        jeql    L172            # source is zero - set flags
                    691:        extzv   $0,$4,(r2),r11
                    692:        cmpl    r11,NEGATIVEalt
                    693:        jeql    L9998           # source is negative - set sign and flags
                    694:        cmpl    r11,NEGATIVE
                    695:        jneq    L175
                    696: L9998:
                    697:        setnegative
                    698:        setsign($45)            # sign character is '-'
                    699:        jbr     L175
                    700: L172:
                    701:        setzero
                    702: L175:
                    703:        arguw(1,r2)             # (1) source length == r2
                    704: Ledit_case:
                    705:        movzbl  (r3)+,r11       # get next edit command (pattern)
                    706:        cmpl    r11,$128
                    707:        jlss    L180
                    708:        extzv   $0,$4,r11,r1    # command has a "count" arg - into r1
                    709:        ashl    $-4,r11,r11     # and shift over
                    710: L180:
                    711:        jbc     $6,r11,L181     # "shift" those commands > 64 to 16 and up
                    712:        subl2   $48,r11
                    713: L181:
                    714:        caseb   r11,$0,$0x18    # "do" the command
                    715:                                # r11 is available for use, r1 has "count" in it
                    716: Lcaseb_label:
                    717:        .word   Le_end - Lcaseb_label           # 00
                    718:        .word   Le_end_float - Lcaseb_label     # 01
                    719:        .word   Le_clear_signif - Lcaseb_label  # 02
                    720:        .word   Le_set_signif - Lcaseb_label    # 03
                    721:        .word   Le_store_sign - Lcaseb_label    # 04
                    722:        .word   Le_end - Lcaseb_label           # 05
                    723:        .word   Le_end - Lcaseb_label           # 06
                    724:        .word   Le_end - Lcaseb_label           # 07
                    725:        .word   Le_fill - Lcaseb_label          # 80
                    726:        .word   Le_move - Lcaseb_label          # 90
                    727:        .word   Le_float - Lcaseb_label         # a0
                    728:        .word   Le_end - Lcaseb_label           # b0
                    729:        .word   Le_end - Lcaseb_label           # c0
                    730:        .word   Le_end - Lcaseb_label           # d0
                    731:        .word   Le_end - Lcaseb_label           # e0
                    732:        .word   Le_end - Lcaseb_label           # f0
                    733:        .word   Le_load_fill - Lcaseb_label     # 40
                    734:        .word   Le_load_sign - Lcaseb_label     # 41
                    735:        .word   Le_load_plus - Lcaseb_label     # 42
                    736:        .word   Le_load_minus - Lcaseb_label    # 43
                    737:        .word   Le_insert - Lcaseb_label        # 44
                    738:        .word   Le_blank_zero - Lcaseb_label    # 45
                    739:        .word   Le_replace_sign - Lcaseb_label  # 46
                    740:        .word   Le_adjust_input - Lcaseb_label  # 47
                    741: Le_end:
                    742:        arguw(1,r0)
                    743:        argl(2,r1)
                    744:        clrl    r2
                    745:        decl    r3
                    746:        setpsl(r4)
                    747:        clrl    r4
                    748:        return
                    749: 
                    750: Le_end_float:
                    751:        jbs     SIGNIFBIT,r4,Ledit_case # if significance not set
                    752:        putsign                         # drop in the sign
                    753:                                        # fall into...
                    754: Le_set_signif:
                    755:        setsignif
                    756:        jbr     Ledit_case
                    757: 
                    758: Le_clear_signif:
                    759:        clsignif
                    760:        jbr     Ledit_case
                    761: 
                    762: Le_store_sign:
                    763:        putsign
                    764:        jbr     Ledit_case
                    765: 
                    766: Le_load_fill:
                    767:        setfill((r3)+)
                    768:        jbr     Ledit_case
                    769: 
                    770: Le_load_plus:
                    771:        jbs     NEGATIVEBIT,r4,Lpattern_inc     # if non-negative
                    772:                                        # fall into...
                    773: Le_load_sign:
                    774:        setsign((r3)+)
                    775:        jbr     Ledit_case
                    776: 
                    777: Le_load_minus:
                    778:        jbs     NEGATIVEBIT,r4,Le_load_sign     # if negative load the sign
                    779:        incl    r3                      # else increment pattern
                    780:        jbr     Ledit_case
                    781: 
                    782: Le_insert:
                    783:        jbc     SIGNIFBIT,r4,L196       # if significance set, put next byte
                    784:        movb    (r3)+,(r5)+
                    785:        jbr     Ledit_case
                    786: L196:                                  # else put in fill character
                    787:        putfill
                    788:                                        # and throw away character in pattern
                    789: Le_replace_sign:                       # we don't do anything with
                    790: Lpattern_inc:                          # replace sign `cause we don't
                    791:        incl    r3                      # get negative zero
                    792:        jbr     Ledit_case
                    793: 
                    794: Le_blank_zero:
                    795:        jbc     ZEROBIT,r4,Lpattern_inc # if zero
                    796:        movzbl  (r3)+,r11               # next byte is a count
                    797:        jeql    Ledit_case
                    798:        subl2   r11,r5                  # to back up over output and replace
                    799: L200:
                    800:        putfill                         # with fill character
                    801:        sobgtr  r11,L200
                    802:        jbr     Ledit_case
                    803: 
                    804: Le_adjust_input:
                    805:        movzbl  (r3)+,r0                # get count of nibbles from pattern
                    806:        subl3   r2,r0,r11
                    807:        jgeq    Ledit_case              # if length of source is > this number
                    808: L204:                                  # discard digits in source
                    809:        jlbc    r2,L206                 # use low bit of length to choose nibble
                    810:        bitb    $0xf0,(r10)             # high nibble
                    811:        jeql    L208
                    812:        setsignif                       # set significance and overflow if
                    813:        setoverflow                     #    wasted digit is non-zero
                    814:        jbr     L208
                    815: L206:
                    816:        bitb    $0xf,(r10)              # low nibble
                    817:        jeql    L209
                    818:        setsignif
                    819:        setoverflow
                    820: L209:
                    821:        incl    r10                     # increment to next byte
                    822: L208:
                    823:        decl    r2                      # decrement source length
                    824:        incl    r11                     # continue `till we're out of excess
                    825:        jlss    L204
                    826:        jbr     Ledit_case
                    827: 
                    828: Le_fill:
                    829:        tstl    r1                      # put (count in r1) fill characters
                    830:        jeql    Ledit_case
                    831: Le_fill_loop:
                    832:        putfill
                    833:        sobgtr  r1,Le_fill_loop
                    834:        jbr     Ledit_case
                    835: 
                    836: Le_move:
                    837:        tstl    r1                      # move (count in r1) characters
                    838:        jeql    Ledit_case              # from source to destination
                    839: L214:
                    840:        jlbc    r2,L215                 # read a nibble
                    841:        extzv   $4,$4,(r10),r11
                    842:        jbr     L216
                    843: L215:
                    844:        extzv   $0,$4,(r10),r11
                    845:        incl    r10
                    846: L216:
                    847:        decl    r2                      # source length CAN go negative here...
                    848:        tstl    r11
                    849:        jeql    L218                    # if non-zero
                    850:        setsignif                       # set significance
                    851: L218:
                    852:        jbc     SIGNIFBIT,r4,L219       # if significance set
                    853:        addb3   $48,r11,(r5)+           # put '0' + digit into destination
                    854:        jbr     L220
                    855: L219:                                  # else put fill character
                    856:        putfill
                    857: L220:
                    858:        sobgtr  r1,L214
                    859:        jbr     Ledit_case
                    860: 
                    861: Le_float:                              # move with floating sign character
                    862:        tstl    r1
                    863:        jeql    Ledit_case
                    864: L221:
                    865:        jlbc    r2,L222
                    866:        extzv   $4,$4,(r10),r11
                    867:        jbr     L223
                    868: L222:
                    869:        extzv   $0,$4,(r10),r11
                    870:        incl    r10
                    871: L223:
                    872:        decl    r2                      # source length CAN go negative here...
                    873:        tstl    r11
                    874:        jeql    L225
                    875:        jbs     SIGNIFBIT,r4,L226
                    876:        putsign
                    877: L226:
                    878:        setsignif
                    879: L225:
                    880:        jbc     SIGNIFBIT,r4,L227
                    881:        addb3   $48,r11,(r5)+
                    882:        jbr     L228
                    883: L227:
                    884:        putfill
                    885: L228:
                    886:        sobgtr  r1,L221
                    887:        jbr     Ledit_case
                    888: 
                    889: 
                    890:        .align  1
                    891:        .globl  _EMashp
                    892: _EMashp:
                    893:        argb(1,r11)             # (1) scale (number to shift) == r11
                    894:        arguw(2,r10)            # (2) source length == r10
                    895:        argl(3,r1)              # (3) source address == r1
                    896:        argub(4,r2)             # (4) rounding factor == r2
                    897:        arguw(5,r3)             # (5) destination length == r3
                    898:        toarg(r6,3)     # arg3 holds register 6 from caller
                    899:        argl(6,r6)              # (6) destination address == r6
                    900:                        # we need arg6 for later
                    901:                        # arg1 is used for temporary storage
                    902:                        # arg2 holds "even or odd" destination length
                    903:                        # arg4 is used as general storage
                    904:                        # arg5 is used as general storage
                    905:        ashl    $-1,r3,r0       # destination length is number of bytes
                    906:        addl2   r0,r6           # destination address == least sig nibble
                    907:        toarg(r6,1)             # save in arg1 spot for later
                    908:        ashl    $-1,r10,r0
                    909:        addl2   r0,r1           # source address == least sig nibble
                    910:        extzv   $0,$4,(r1),r0   # determine sign of source
                    911:        cmpl    r0,NEGATIVEalt
                    912:        jeql    Lashp_neg
                    913:        cmpl    r0,NEGATIVE
                    914:        jeql    Lashp_neg
                    915:        movb    POSITIVE,(r6)
                    916:        jbr     L245
                    917: Lashp_neg:
                    918:        movb    NEGATIVE,(r6)
                    919: L245:
                    920:        clrl    arg2            # arg2 is 1 if dstlen is even, 0 if odd
                    921:        blbs    r3,L246
                    922:        incl    arg2
                    923:        bisl2   $1,r3           # r3<0> counts digits going into destination
                    924: L246:                          #       and is flip-flop for which nibble to
                    925:        tstl    r11             #       write in destination (1 = high, 0 = low)
                    926:        jgeq    Lashp_left      #       (it must start out odd)
                    927:        addl2   r11,r10         # scale is negative (right shift)
                    928:        jgeq    Lashp_right
                    929:        clrl    r10             # test for shifting whole number out
                    930:        jbr     Lashp_setround
                    931: Lashp_right:
                    932:        divl3   $2,r11,r0
                    933:        addl2   r0,r1           # source address == MSNibble to be shifted off
                    934:        jlbc    r11,L249
                    935:        extzv   $4,$4,(r1),r0
                    936:        addl2   r0,r2           # round = last nibble to be shifted off + round
                    937:        jbr     Lashp_setround
                    938: L249:
                    939:        extzv   $0,$4,(r1),r0
                    940:        addl2   r0,r2           # round = last nibble to be shifted off + round
                    941: Lashp_setround:                        # r11<0> now is flip-flop for which nibble to
                    942:        incl    r11             #    read from source (1 == high, 0 == low)
                    943:        cmpl    r2,$9           # set rounding factor to one if nibble shifted
                    944:        jleq    Lashp_noround   #    off + round argument was 10 or greater
                    945:        movl    $1,r2
                    946:        jbr     Lashp_shift
                    947: Lashp_zloop:
                    948:        jlbs    r3,L257         # don't need to clear high nibble twice
                    949:        clrb    -(r6)           # clear low (and high) nib of next byte in dest
                    950: L257:
                    951:        sobgtr  r3,L258         # move to next nibble in destination, but
                    952:        incl    r3              #       don't go beyond the end.
                    953: L258:
                    954:        decl    r11
                    955: Lashp_left:                    # while scale is positive
                    956:        jneq    Lashp_zloop
                    957:        incl    r11             # r11<0> is flip-plop ... (incl sets it to one)
                    958: Lashp_noround:
                    959:        clrl    r2              # no more rounding
                    960: Lashp_shift:
                    961:        clrl    arg4            # arg4 will be used for result condition codes
                    962:        tstl    r10
                    963:        jeql    Lashp_round
                    964: Lashp_shloop:
                    965:        jlbc    r11,L260
                    966:        extzv   $4,$4,(r1),r0
                    967:        jbr     L261
                    968: L260:
                    969:        decl    r1
                    970:        extzv   $0,$4,(r1),r0
                    971: L261:
                    972:        incl    r11             # flip the source nibble flip/flop
                    973:        addl2   r0,r2           # round += next nibble
                    974:        cmpl    r2,$10          # if round == 10
                    975:        jneq    L262
                    976:        clrl    arg5            #       then result = 0 and round = 1
                    977:        movl    $1,r2
                    978:        jbr     L263
                    979: L262:                          # else
                    980:        movl    r2,arg5         #       store result and round = 0
                    981:        clrl    r2
                    982: L263:
                    983:        bisl2   arg5,arg4       # remember if result was nonzero in arg4
                    984:        decl    r3              # move to next nibble early to check
                    985:        cmpl    r3,arg2         # if we've moved passed destination limits
                    986:        jgeq    Lashp_noovfl    #       test the result for possible overflow
                    987:        movl    arg2,r3         #       ignore zero nibbles
                    988:        tstl    arg5            #       if the nibble was non-zero, overflow
                    989:        jeql    L265
                    990:        jbr     Lashp_overfl
                    991: Lashp_noovfl:                  # else
                    992:        jlbs    r3,L264
                    993:        insv    arg5,$4,$4,(r6) # put the result into destination (high or low)
                    994:        jbr     L265
                    995: L264:
                    996:        movb    arg5,-(r6)
                    997: L265:
                    998:        sobgtr  r10,Lashp_shloop        # loop for length of source
                    999: 
                   1000: Lashp_round:
                   1001:        tstl    r2              # take care of round out of high nibble
                   1002:        jeql    Lashp_zeroround
                   1003:        decl    r3
                   1004:        cmpl    r3,arg2         # if we've moved passed destination limits
                   1005:        jlss    Lashp_overfl    #       then overflow
                   1006:        jlbs    r3,L266
                   1007:        insv    arg5,$4,$4,(r6) # put the round into destination (high or low)
                   1008:        jbr     Lashp_zeroround
                   1009: L266:
                   1010:        movb    arg5,-(r6)
                   1011: 
                   1012: Lashp_zeroround:
                   1013:        argl(1,r10)             # r10 = address of destination LSNibble
                   1014:        argl(6,r3)              # r3 = address of destination MSNibble
                   1015:        movl    arg4,r11        # r11 = non-zero if destination == non-zero
                   1016:        savepsl
                   1017:        jbr     L267
                   1018: Lashp_zerofill:
                   1019:        clrb    -(r6)           # fill up MSNs of destination with zeros
                   1020: L267:
                   1021:        cmpl    r3,r6
                   1022:        jneq    Lashp_zerofill
                   1023:        extzv   $0,$4,(r10),r0  # test for negative result
                   1024:        cmpl    r0,NEGATIVE
                   1025:        jneq    Lashp_out
                   1026:        mnegl   r11,r11
                   1027:        savepsl
                   1028:        jneq    Lashp_out       # turn -0 into 0
                   1029:        insv    POSITIVE,$0,$4,(r10)
                   1030: Lashp_out:
                   1031:        clrl    r0
                   1032:        argl(3,r6)              # restore r6 from stack
                   1033:        return
                   1034: Lashp_overfl:                  #    do overflow
                   1035:        clrl    r2
                   1036:        overflowpsl
                   1037:        jbr     Lashp_out
                   1038: 
                   1039: 
                   1040:        .align  1
                   1041:        .globl  _EMcvtlp
                   1042: _EMcvtlp:
                   1043:        arguw(2,r10)            # (2) destination length == r10
                   1044:        argl(3,r3)              # (3) destination address == r3
                   1045:        ashl    $-1,r10,r10
                   1046:        addl2   r10,r3          # destination address points to Least Sig byte
                   1047:        incl    r10             # length is # of bytes, not nibbles
                   1048:        argl(1,r11)             # (1) source == r11
                   1049:        savepsl
                   1050:        jgeq    Lcvtlp_pos
                   1051:        movb    NEGATIVE,(r3)   # source is negative
                   1052:        divl3   $10,r11,r0
                   1053:        mull3   $10,r0,r1
                   1054:        subl3   r11,r1,r2       # r2 = source mod 10
                   1055:        mnegl   r0,r11          # source = -(source / 10)
                   1056:        jbr     Lcvtlp_cvt
                   1057: Lcvtlp_pos:
                   1058:        movb    POSITIVE,(r3)   # source is non-negative
                   1059:        divl3   $10,r11,r0
                   1060:        mull3   $10,r0,r1
                   1061:        subl3   r1,r11,r2       # r2 = source mod 10
                   1062:        movl    r0,r11          # source = source / 10
                   1063: Lcvtlp_cvt:
                   1064:        insv    r2,$4,$4,(r3)   # store least significant digit
                   1065:        tstl    r11
                   1066:        jeql    Lcvtlp_zloop
                   1067: Lcvtlp_loop:                   # while source is non-zero
                   1068:        decl    r10             #   and for length of destination ...
                   1069:        jeql    Lcvtlp_over
                   1070:        divl3   $10,r11,r1      # r1 = source / 10
                   1071:        mull3   $10,r1,r0
                   1072:        subl2   r0,r11          # source = source mod 10
                   1073:        movb    r11,-(r3)       # store low "nibble" in next significant byte
                   1074:        divl3   $10,r1,r11      # source = r1 / 10
                   1075:        mull3   $10,r11,r0
                   1076:        subl2   r0,r1           # r1 = source mod 10
                   1077:        insv    r1,$4,$4,(r3)   # store high nibble
                   1078:        tstl    r11
                   1079:        jneq    Lcvtlp_loop     # quit if source becomes zero
                   1080: Lcvtlp_zloop:                  # fill any remaining bytes with zeros
                   1081:        decl    r10
                   1082:        jeql    Lcvtlp_out
                   1083:        clrb    -(r3)
                   1084:        jbr     Lcvtlp_zloop
                   1085: Lcvtlp_over:
                   1086:        overflowpsl
                   1087: Lcvtlp_out:
                   1088:        clrl    r1              # r0 is already zero
                   1089:        clrl    r2
                   1090:        return
                   1091: 
                   1092: 
                   1093:        .align  1
                   1094:        .globl  _EMcvtpl
                   1095: _EMcvtpl:
                   1096:        arguw(1,r11)            # (1) source length == r11
                   1097:        argl(2,r10)             # (2) source address == r10
                   1098:        clrl    r3              # r3 == destination
                   1099:        movl    r10,r1          # r1 set up now for return
                   1100:        ashl    $-1,r11,r11     # source length is number of bytes
                   1101:        jeql    Lcvtpl_zero
                   1102: Lcvtpl_loop:                   # for source length
                   1103:        mull2   $10,r3          # destination *= 10
                   1104:        extzv   $4,$4,(r10),r0
                   1105:        addl2   r0,r3           # destination += high nibble
                   1106:        mull2   $10,r3          # destination *= 10
                   1107:        extzv   $0,$4,(r10),r0
                   1108:        addl2   r0,r3           # destination += low nibble
                   1109:        incl    r10
                   1110:        sobgtr  r11,Lcvtpl_loop
                   1111: Lcvtpl_zero:                   # least significant byte
                   1112:        mull2   $10,r3
                   1113:        extzv   $4,$4,(r10),r0
                   1114:        addl2   r0,r3           # dest = 10 * dest + high nibble
                   1115:        savepsl
                   1116:        extzv   $0,$4,(r10),r2  # test sign nibble
                   1117:        cmpl    r2,NEGATIVE
                   1118:        jeql    Lcvtpl_neg
                   1119:        cmpl    r2,NEGATIVEalt
                   1120:        jneq    Lcvtpl_out
                   1121: Lcvtpl_neg:                    # source was negative - negate destination
                   1122:        mnegl   r3,r3
                   1123:        savepsl
                   1124: Lcvtpl_out:
                   1125:        toarg(r3,3)
                   1126:        clrl    r0
                   1127:        clrl    r2
                   1128:        clrl    r3
                   1129:        return
                   1130: 
                   1131: 
                   1132:        .align  1
                   1133:        .globl  _EMcvtps
                   1134: _EMcvtps:
                   1135:        return
                   1136: 
                   1137: 
                   1138:        .align  1
                   1139:        .globl  _EMcvtsp
                   1140: _EMcvtsp:
                   1141:        return
                   1142: 
                   1143: 
                   1144:        .align  1
                   1145:        .globl  _EMaddp6
                   1146: _EMaddp6:
                   1147:        return
                   1148: 
                   1149: 
                   1150:        .align  1
                   1151:        .globl  _EMsubp4
                   1152: _EMsubp4:
                   1153:        return
                   1154: 
                   1155: 
                   1156:        .align  1
                   1157:        .globl  _EMsubp6
                   1158: _EMsubp6:
                   1159:        return
                   1160: 
                   1161: 
                   1162:        .align  1
                   1163:        .globl  _EMcvtpt
                   1164: _EMcvtpt:
                   1165:        return
                   1166: 
                   1167: 
                   1168:        .align  1
                   1169:        .globl  _EMmulp
                   1170: _EMmulp:
                   1171:        return
                   1172: 
                   1173: 
                   1174:        .align  1
                   1175:        .globl  _EMcvttp
                   1176: _EMcvttp:
                   1177:        return
                   1178: 
                   1179: 
                   1180:        .align  1
                   1181:        .globl  _EMdivp
                   1182: _EMdivp:
                   1183:        return
                   1184: 
                   1185: 
                   1186:        .align  1
                   1187:        .globl  _EMcmpp3
                   1188: _EMcmpp3:
                   1189:        return
                   1190: 
                   1191: 
                   1192:        .align  1
                   1193:        .globl  _EMcmpp4
                   1194: _EMcmpp4:
                   1195:        return
                   1196: 
                   1197: 
                   1198: #endif UVAXII
                   1199: 
                   1200: 
                   1201: #ifdef notdef
                   1202: /*
                   1203:  * Emulation OpCode jump table:
                   1204:  *     ONLY GOES FROM 0xf8 (-8) TO 0x3B (59)
                   1205:  */
                   1206: #define EMUTABLE       0x43
                   1207: #define NOEMULATE      .long noemulate
                   1208: #define        EMULATE(a)      .long _EM/**/a
                   1209:        .globl  _emJUMPtable
                   1210: _emJUMPtable:
                   1211: /* f8 */       EMULATE(ashp);  EMULATE(cvtlp); NOEMULATE;      NOEMULATE
                   1212: /* fc */       NOEMULATE;      NOEMULATE;      NOEMULATE;      NOEMULATE
                   1213: /* 00 */       NOEMULATE;      NOEMULATE;      NOEMULATE;      NOEMULATE
                   1214: /* 04 */       NOEMULATE;      NOEMULATE;      NOEMULATE;      NOEMULATE
                   1215: /* 08 */       EMULATE(cvtps); EMULATE(cvtsp); NOEMULATE;      EMULATE(crc)
                   1216: /* 0c */       NOEMULATE;      NOEMULATE;      NOEMULATE;      NOEMULATE
                   1217: /* 10 */       NOEMULATE;      NOEMULATE;      NOEMULATE;      NOEMULATE
                   1218: /* 14 */       NOEMULATE;      NOEMULATE;      NOEMULATE;      NOEMULATE
                   1219: /* 18 */       NOEMULATE;      NOEMULATE;      NOEMULATE;      NOEMULATE
                   1220: /* 1c */       NOEMULATE;      NOEMULATE;      NOEMULATE;      NOEMULATE
                   1221: /* 20 */       EMULATE(addp4); EMULATE(addp6); EMULATE(subp4); EMULATE(subp6)
                   1222: /* 24 */       EMULATE(cvtpt); EMULATE(mulp);  EMULATE(cvttp); EMULATE(divp)
                   1223: /* 28 */       NOEMULATE;      EMULATE(cmpc3); EMULATE(scanc); EMULATE(spanc)
                   1224: /* 2c */       NOEMULATE;      EMULATE(cmpc5); EMULATE(movtc); EMULATE(movtuc)
                   1225: /* 30 */       NOEMULATE;      NOEMULATE;      NOEMULATE;      NOEMULATE
                   1226: /* 34 */       EMULATE(movp);  EMULATE(cmpp3); EMULATE(cvtpl); EMULATE(cmpp4)
                   1227: /* 38 */       EMULATE(editpc); EMULATE(matchc); EMULATE(locc); EMULATE(skpc)
                   1228: 
                   1229: /*
                   1230:  * The following is called with the stack set up as follows:
                   1231:  *
                   1232:  *       (sp): Opcode
                   1233:  *      4(sp): Instruction PC
                   1234:  *      8(sp): Operand 1
                   1235:  *     12(sp): Operand 2
                   1236:  *     16(sp): Operand 3
                   1237:  *     20(sp): Operand 4
                   1238:  *     24(sp): Operand 5
                   1239:  *     28(sp): Operand 6
                   1240:  *     32(sp): Operand 7 (unused)
                   1241:  *     36(sp): Operand 8 (unused)
                   1242:  *     40(sp): Return PC
                   1243:  *     44(sp): Return PSL
                   1244:  *     48(sp): TOS before instruction
                   1245:  *
                   1246:  * Each individual routine is called with the stack set up as follows:
                   1247:  *
                   1248:  *       (sp): Return address of trap handler
                   1249:  *      4(sp): Opcode (will get return PSL)
                   1250:  *      8(sp): Instruction PC
                   1251:  *     12(sp): Operand 1
                   1252:  *     16(sp): Operand 2
                   1253:  *     20(sp): Operand 3
                   1254:  *     24(sp): Operand 4
                   1255:  *     28(sp): Operand 5
                   1256:  *     32(sp): Operand 6
                   1257:  *     36(sp): saved register 11
                   1258:  *     40(sp): saved register 10
                   1259:  *     44(sp): Return PC
                   1260:  *     48(sp): Return PSL
                   1261:  *     52(sp): TOS before instruction
                   1262:  */
                   1263: 
                   1264: SCBVEC(emulate):
                   1265:        movl    r11,32(sp)              # save register r11 in unused operand
                   1266:        movl    r10,36(sp)              # save register r10 in unused operand
                   1267:        cvtbl   (sp),r10                # get opcode
                   1268:        addl2   $8,r10                  # shift negative opcodes
                   1269:        subl3   r10,$EMUTABLE,r11       # forget it if opcode is out of range
                   1270:        bcs     noemulate
                   1271:        movl    _emJUMPtable[r10],r10   # call appropriate emulation routine
                   1272:        jsb     (r10)           # routines put return values into regs 0-5
                   1273:        movl    32(sp),r11              # restore register r11
                   1274:        movl    36(sp),r10              # restore register r10
                   1275:        insv    (sp),$0,$4,44(sp)       # and condition codes in Opcode spot
                   1276:        addl2   $40,sp                  # adjust stack for return
                   1277:        rei
                   1278: noemulate:
                   1279:        addl2   $48,sp                  # adjust stack for
                   1280:        .word   0xffff                  # "reserved instruction fault"
                   1281: SCBVEC(emulateFPD):
                   1282:        .word   0xffff                  # "reserved instruction fault"
                   1283: #endif

unix.superglobalmegacorp.com

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