Annotation of researchv10no/cmd/PDP11/fpp/rhflibNOFIS.s, revision 1.1.1.1

1.1       root        1: .text
                      2: .globl fad,fsb,fdv,fmp,int,float /
                      3:        /each of these expects its args on the stack, and returns its
                      4:        /answer on the stack. eg.,
                      5:        /       mov alow,-(sp)
                      6:        /       mov ahi,-(sp)
                      7:        /       jsr pc,int
                      8:        /       mov (sp)+,iahi
                      9:        /       mov (sp)+,ialow
                     10:        / &&
                     11:        /       mov alow,-(sp)
                     12:        /       mov ahi,-(sp)
                     13:        /       mov blow,-(sp)
                     14:        /       mov bhi,-(sp)
                     15:        /       jsr pc,fdv
                     16:        /       mov (sp)+,a/b.hi
                     17:        /       mov (sp)+,a/b.low
                     18:        /
                     19:        /       "hi" means "most significant bits"
                     20:        /
                     21:        / MJM backwards compiled RH octal code
                     22:        / using original NORGEN listing from RH
                     23:        /
                     24: saver:
                     25:        mov r1,-(sp)
                     26:        mov r2,-(sp)
                     27:        mov r3,-(sp)
                     28:        mov r4,-(sp)
                     29:        mov r5,-(sp)
                     30:        mov 10.(sp),-(sp)
                     31:        rts r0
                     32: rest:
                     33:        mov (sp)+,r0
                     34:        mov (sp)+,r5
                     35:        mov (sp)+,r4
                     36:        mov (sp)+,r3
                     37:        mov (sp)+,r2
                     38:        mov (sp)+,r1
                     39:        rts r0
                     40: /// ***
                     41: ///
                     42: / ddiv,ddivl;  ddivl has no fancy checks
                     43: / double (actualy any size) divide
                     44: / world's slowest method (shift and subtract)
                     45: / calling seq:
                     46: /      mov numerator low part,-(sp)
                     47: /      ...
                     48: /      mov numerator high part,-(sp)
                     49: /      mov number of numerator words,-(sp)
                     50: /      mov denom low part,-(sp)
                     51: /      ...
                     52: /      mov denom high part,-(sp)
                     53: /      mov number of denom words,-(sp)
                     54: /      jsr pc,ddiv
                     55: /
                     56: / on return the quotient has overwritten the
                     57: / numerator (and is same size)
                     58: / and the remainder has overwritten the denom
                     59: / (and is same size).  remainder sign is same as
                     60: / numerator.  so that n-r=q*d.
                     61: / to bump remainder from stack user can
                     62: /   asl (sp)
                     63: /   add (sp)+,sp
                     64: / or similarly then for quotient
                     65: /
                     66: ddiv:
                     67:        cmp 2(sp),$2    / can we do quickie divide?
                     68:        bhi ugh
                     69:        blt ugh3        / maybe
                     70:        tst 4(sp)
                     71:        bne ugh
                     72:        tst 6(sp)
                     73:        bmi ugh
                     74:        cmp 8.(sp),$2
                     75:        bne ugh
                     76:        mov r0,-(sp)
                     77:        mov r1,-(sp)
                     78:        mov 14.(sp),r0
                     79:        mov 16.(sp),r1
                     80:        div 10.(sp),r0
                     81:        bvs ugh2
                     82:        blo ugh2
                     83:        mov r0,16.(sp)
                     84:        clr 14.(sp)
                     85:        mov r1,10.(sp)
                     86:        mov (sp)+,r1
                     87:        mov (sp)+,r0
                     88:        rts pc
                     89: /
                     90: ugh3:
                     91:        cmp 6(sp),$2
                     92:        bne ugh
                     93:        tst 4(sp)
                     94:        bmi ugh
                     95:        mov r0,-(sp)
                     96:        mov r1,-(sp)
                     97:        mov 12.(sp),r0
                     98:        mov 14.(sp),r1
                     99:        div 8.(sp),r0
                    100:        bvs ugh2
                    101:        blo ugh2
                    102:        mov r0,14.(sp)
                    103:        clr 12.(sp)
                    104:        mov r1,8.(sp)
                    105:        mov (sp)+,r1
                    106:        mov (sp)+,r0
                    107:        rts pc
                    108: /
                    109: ugh2:
                    110:        mov (sp)+,r1
                    111:        mov (sp)+,r0
                    112: /
                    113: ddivl:
                    114: ugh:
                    115:        jsr r0,saver
                    116:        mov sp,r5
                    117:        add $14.,r5     / point to wd (# words in denom)
                    118:        mov (r5)+,r4    / wd to r4
                    119:        add r4,r5
                    120:        add r4,r5       / bump r5 to wn (# wrds in num)
                    121:        clr -(sp)       / copy denom and zero to stack
                    122:        mov r4,r0       / set to copy d
                    123: 1:
                    124:        mov -(r5),-(sp)
                    125:        sob r0,1b
                    126:        bpl 2f  / if denom was neg we must negate it
                    127:        mov r4,r0       / wd to r0
                    128:        mov sp,r2       / addr of first wd to r2
                    129:        jsr pc,ns       / negate subroutine
                    130: 2:
                    131:        mov r4,-(sp)    / store wd
                    132:        add r4,r5
                    133:        add r4,r5       / point r5 to callers wn
                    134:        mov sp,r4       / r4 will stay pointed to my wd
                    135:        mov (r5)+,r3    / wn to r3
                    136:        add r3,r5
                    137:        add r3,r5       / r5 just past numerator
                    138:        mov r3,r0       / wn to r0
                    139: 6:
                    140:        mov -(r5),-(sp) / copy num to my stack
                    141:        sob r0,6b
                    142:        bpl 7f  / if negative we must negate it
                    143:        mov r3,r0       / wn
                    144:        mov sp,r2       / addr of first word of num
                    145:        jsr pc,ns       / negate subroutine
                    146: 7:
                    147:        add (r4),r3     / wn+wd to r3
                    148:        mov (r4),r0     / wd to r0
                    149: 8:
                    150:        clr -(sp)       / prefix wd zeroes on num
                    151:        sob r0,8b
                    152:        mov r3,-(sp)    / store wd+wn ahead of all this
                    153:        mov sp,r3       / denom fits in at r3+2
                    154:        mov -2(r5),-(sp)        / wn is iteration counter
                    155:        mov $100000,-(sp)       / quotient bit finder
                    156:        mov (r4),r0     / shift denom right one bit
                    157:        mov r4,r1       / code same as below
                    158:        tst (r1)+
                    159: t20:
                    160:        ror (r1)+
                    161:        sob r0,t20
                    162:        ror (r1)
                    163: /
                    164: / master shift and subtract loop
                    165: /
                    166: 9:
                    167:        clc     / shift quotient bit right one
                    168:        ror (sp)        / bit in question this iteration
                    169:        bhis t11        / bcc   / its still in word; no extra work.
                    170:                / bit was shifted out, we need to bump everything
                    171:        ror (sp)        / get our bit back
                    172:        dec 2(sp)       / iteration counter
                    173:        ble t12 / done if zero
                    174:        mov (r4),r0     / wd
                    175:        mov r4,r1       / addr of denom minus 2
                    176:        tst (r1)+
                    177: t13:
                    178:        mov 2(r1),(r1)+ / copy denom back one word
                    179:        sob r0,t13
                    180:        clr (r1)        / clear extra word
                    181:        cmp (r3)+,(r5)+ / bump r3 and r5 up
                    182: t11:
                    183:        bic (sp),(r5)   / assume we won't subtract
                    184:        mov (r4),r0     / shift d one bit right
                    185:        mov r4,r1
                    186:        tst (r1)+       / to first word of d
                    187: t10:
                    188:        ror (r1)+       / shift.  tst clears carry
                    189:        sob r0,t10
                    190:        ror (r1)        / extra word at end gets bits
                    191:        mov (r4),r0     / wd
                    192:        inc r0  / plus one
                    193:        mov r3,r1       / addr in numerator
                    194:        mov r4,r2       / addr in denom
                    195:        cmp (r2)+,(r1)+ / bump both
                    196: t14:
                    197:        cmp (r1)+,(r2)+ / cmp num to denom
                    198:        bne t15
                    199:        sob r0,t14
                    200:        br t21  / equal, do subtract
                    201: t15:
                    202:        blo 9b  / no subtract if num less
                    203:        dec r0  / subtract off residual word count
                    204:        asl r0  / to wrds
                    205:        add r0,r1
                    206:        add r0,r2
                    207: t21:
                    208:        mov (r4),r0
                    209:        bis (sp),(r5)   / we were wrong.. set the bit
                    210:        mov r4,-(sp)    / save r4
                    211: t16:
                    212:        sub -(r2),-(r1) / sub denom from num
                    213:        mov r1,r4
                    214: t22:
                    215:        sbc -(r4)
                    216:        blo t22 / bcs
                    217:        sob r0,t16
                    218:        sub -(r2),-(r1)
                    219:        mov (sp)+,r4    / restore r4
                    220:        br 9b
                    221: t12:
                    222:        cmp (sp)+,(sp)+ / bump sp to wd+wn
                    223:        mov (sp),r0     / wd+wn to r0
                    224:        sub (r4),r0     / wn to r0
                    225:        sub r0,r5
                    226:        sub r0,r5       / r5 now points to callers wn
                    227:        mov r5,r3
                    228:        tst (r5)+       / now to numerator
                    229:        sub (r4),r3
                    230:        sub (r4),r3     / r3 points to first wd of callers denom
                    231:        mov (r5),r2     / sign of numerator to r2
                    232:        bpl t18 / remainder if ok (positive)
                    233:        mov r4,r2       / change sign of remainder via ns
                    234:        mov (r4),r0     / wd to r0
                    235:        sub r0,r2
                    236:        sub r0,r2       / r2 points at remainder
                    237:        jsr pc,ns       / negate it
                    238:        mov (r5),r2     / sign of numerator
                    239:        bic $100000,(r5)
                    240: t18:
                    241:        xor r2,(r3)     / are signs of n and d same
                    242:        bpl t17 / yes quotient is ok (positive)
                    243:        mov -2(r5),r0   / wn to r0
                    244:        mov r5,r2
                    245:        jsr pc,ns       / negate quotient
                    246: t17:
                    247:        mov r4,r2       / now copy remainder to callers denom
                    248:        mov (r4),r0     / wd to r0
                    249:        tst -(r5)       / r5 pts to callers wn
                    250: t19:
                    251:        mov -(r2),-(r5) / copy remainder to denom
                    252:        sob r0,t19
                    253:        sub $16.,r5     / r5 pts to save area
                    254:        mov r5,sp
                    255:        jsr pc,rest
                    256:        rts pc
                    257: ns:                    / negate subroutine
                    258:        mov r0,r1
                    259: 4:
                    260:        com (r2)+
                    261:        sob r0,4b
                    262: 5:
                    263:        adc -(r2)
                    264:        sob r1,5b
                    265:        rts pc
                    266: /// ***
                    267: ///
                    268: /
                    269: / convert number on stack from flt to int
                    270: /
                    271: int:
                    272:        mov r0,-(sp)
                    273:        mov r1,-(sp)
                    274:        mov r2,-(sp)
                    275:        clr -(sp)       / sign of input number
                    276:        mov 12.(sp),r1  / low part
                    277:        mov 10.(sp),r0  / hi part
                    278:        bpl 1f  / ok
                    279:        mov $100000,(sp)        / set sign -
                    280:        bic (sp),r0     / set number plus
                    281: 1:
                    282:        mov r0,r2       / extract exponent
                    283:        bic $100177,r2
                    284:        bic r2,r0
                    285:        ash $-7,r2      / make it an integer
                    286:        bis $200,r0     / set hidden bit
                    287:        sub $200,r2     / subtr off excess 200
                    288:        ble 2f  / zero, whole thing zero.
                    289:        sub $24.,r2     / set for shift
                    290:        ashc r2,r0      / left or right
                    291: 4:
                    292:        tst (sp)+       / sign
                    293:        bpl 3f
                    294:        neg r0
                    295:        neg r1
                    296:        sbc r0
                    297: 3:
                    298:        mov r0,8.(sp)
                    299:        mov r1,10.(sp)
                    300:        mov (sp)+,r2
                    301:        mov (sp)+,r1
                    302:        mov (sp)+,r0
                    303:        rts pc
                    304: 2:
                    305:        clr r0
                    306:        clr r1
                    307:        br 4b
                    308: /
                    309: / float an integer on stack
                    310: /
                    311: float:
                    312:        mov 4(sp),-(sp)
                    313:        mov 4(sp),-(sp)
                    314:        bmi negflt
                    315:        clr -(sp)
                    316:        mov $[200+24.]*200,-(sp)        / mov $46000,-(sp)
                    317: 1:
                    318:        bit $377*200,4(sp)      / bit $77600,4(sp)
                    319:        beq 2f
                    320:        asr 4(sp)
                    321:        ror 6(sp)
                    322:        add $200,(sp)
                    323:        br 1b
                    324: 2:
                    325:        bis (sp),4(sp)
                    326:        jsr pc,fsb              // fsbx. (assuming hdwf=0; else 075016)
                    327:        mov (sp)+,4(sp)
                    328:        mov (sp)+,4(sp)
                    329:        rts pc
                    330: negflt:
                    331:        neg (sp)
                    332:        neg 2(sp)
                    333:        sbc (sp)
                    334:        bmi 3f  / overflow. avoid recursion to 0
                    335:        jsr pc,float
                    336:        bis $100000,(sp)
                    337:        mov (sp)+,4(sp)
                    338:        mov (sp)+,4(sp)
                    339:        rts pc
                    340: 3:
                    341:        cmp (sp)+,(sp)+ / toss
                    342:        mov $[200+32.]*200+100000,2(sp) / mov $150000,2(sp) / -2**-31
                    343:        clr 4(sp)
                    344:        rts pc
                    345: /// ***
                    346: ///
                    347: / 32 bit and sub mul neg
                    348: /
                    349: / jsr pd,dmul
                    350: / input is 2 32-bit no's on stack
                    351: / output is 64-bit product on stack
                    352: /      mov n low,-(sp)
                    353: /      mov n high,-(sp)
                    354: /      mov m low,-(sp)
                    355: /      mov m hi,-(sp)
                    356: /      jsr pc,dmul
                    357: /
                    358: dmul:
                    359:        jsr r0,saver
                    360:        tst 14.(sp)     / see if we can simply multiply
                    361:        bne ughx
                    362:        tst 18.(sp)
                    363:        bne ughx
                    364:        mov 16.(sp),r0
                    365:        bmi ughx
                    366:        mov 20.(sp),r2
                    367:        bmi ughx
                    368:        mul r2,r0
                    369:        mov r1,20.(sp)
                    370:        mov r0,18.(sp)
                    371:        sxt 16.(sp)
                    372:        sxt 14.(sp)
                    373:        jsr pc,rest
                    374:        rts pc
                    375: /
                    376: ughx:
                    377:        clr -(sp)       / signs differ flag
                    378:        mov sp,r5
                    379:        add $22.,r5     / r5 -> l1
                    380:        mov (r5),r0     / l1
                    381:        mov -(r5),r2    / h1
                    382:        bpl 1f  / make positive if not
                    383:        inc (sp)        / signs differ flag
                    384:        neg r2
                    385:        neg r0
                    386:        sbc r2
                    387: 1:
                    388:        mov -(r5),r1    / l2
                    389:        mov -(r5),r4    / h2
                    390:        bpl 2f  / make pos if neg
                    391:        neg r4
                    392:        neg r1
                    393:        sbc r4
                    394:        dec (sp)        / (sp) is zero of both signs same
                    395: 2:
                    396:        mov r1,-(sp)    / l2
                    397:        mov r0,-(sp)    / l1
                    398:        mov r2,-(sp)    / h1
                    399:        bic $100000,r0
                    400:        bic $100000,r1  / clear l1 l2 sign bits so mul works
                    401: ///
                    402: / stack now looks like this: low core up
                    403: /      h1<-sp
                    404: /      l1
                    405: /      l2
                    406: /      sign flag
                    407: /      r5
                    408: /      r4
                    409: /      r3
                    410: /      r2
                    411: /      r1
                    412: /      r0
                    413: /      return
                    414: /      h2  (p4=hi part of product)
                    415: /      l2  (p3)
                    416: /      h1  (p2)
                    417: /      l1  (p1)
                    418: /
                    419:        mul r4,r2       /  h1 * h2
                    420:        mov r2,(r5)+    / to p4, r5 to p3
                    421:        mov r3,(r5)+    / to p3, r5 to p2
                    422:        mov r1,r2       / l2
                    423:        mul r0,r2       / l1 * l2
                    424:        mov r2,(r5)+    / to p2, r5 to p1
                    425:        mov r3,(r5)     / to p1, r5 to p1
                    426:        mov r4,r2       / h2
                    427:        mul r0,r2       / l1 * h2
                    428:        add r3,-(r5)    / to p2, r5 to p2
                    429:        adc -(r5)       / carry to p3, r5 to p3
                    430:        adc -2(r5)      / carry to p4, r5 to p3
                    431:        add r2,(r5)     / to p3, r5 to p3
                    432:        adc -(r5)       / to p4, r5 to p4
                    433:        mov (sp),r2     / h1
                    434:        mul r1,r2       / l2 * h1
                    435:        cmp (r5)+,(r5)+ / r5 to p2
                    436:        add r3,(r5)     / to p2, r5 to p2
                    437:        adc -(r5)       / to p3, r5 to p3
                    438:        adc -2(r5)      / to p4, r5 to p3
                    439:        add r2,(r5)     / to p3
                    440:        adc -(r5)       / to p4
                    441:        tst 2(sp)       / was l1 sign bit set
                    442:        bpl 3f  / no
                    443:        cmp (r5)+,(r5)+ / r5 to p2
                    444:        mov r4,r2       / h2
                    445:        mov r1,r3       / l2
                    446:        ashc $-1,r2
                    447:        bhis 4f         / bcc
                    448:        add $100000,2(r5)       / add to p1, r5 to p2
                    449:        adc (r5)
                    450:        adc -(r5)       / r5 to p3
                    451:        adc -(r5)       / r5 to p4
                    452:        cmp (r5)+,(r5)+ /  r5 to p2
                    453: 4:
                    454:        add r3,(r5)     /  add to p2
                    455:        adc -(r5)       / to p3
                    456:        adc -(r5)       / to p4
                    457:        add r2,2(r5)    /  add to p3
                    458:        adc (r5)        /  to p4
                    459: 3:
                    460:        tst 4(sp)       /  is l2 sign bit set
                    461:        bpl 5f  / no
                    462:        mov (sp),r2     /  h1
                    463:        mov r0,r3       /  l1
                    464:        cmp (r5)+,(r5)+ /  r5 to p2
                    465:        ashc $-1,r2
                    466:        bhis 6f         / bcc
                    467:        add $100000,2(r5)       / add to p1
                    468:        adc (r5)        / to p2
                    469:        adc -(r5)       / to p3
                    470:        adc -(r5)       / to p4
                    471:        cmp (r5)+,(r5)+ / r5 to p2
                    472: 6:
                    473:        add r3,(r5)     / to p2
                    474:        adc -(r5)       / to p3
                    475:        adc -(r5)       / to p4
                    476:        add r2,2(r5)    / to p3
                    477:        adc (r5)        / to p4
                    478:        tst 2(sp)       /  is l1 sign bit set as well
                    479:        bpl 5f  /  no
                    480:        cmp (r5)+,(r5)+ / r5 to p2
                    481:        add $40000,(r5) / add to p2
                    482:        adc -(r5)       / to p3
                    483:        adc -(r5)       / to p4
                    484: 5:
                    485:        add $6,sp       / get to sign flag
                    486:        tst (sp)+
                    487:        beq 7f  / signs were same
                    488:        com (r5)+       / set product negative
                    489:        com (r5)+
                    490:        com (r5)+
                    491:        com (r5)
                    492:        adc (r5)
                    493:        adc -(r5)
                    494:        adc -(r5)
                    495:        adc -(r5)
                    496: 7:
                    497:        jsr pc,rest
                    498:        rts pc
                    499: /// ***
                    500: ///
                    501: /
                    502: / floating point operations
                    503: /      mov (arg1)+,-(sp)
                    504: /      mov (arg1)+,-(sp)
                    505: /      mov (arg2)+,-(sp)
                    506: /      mov (arg2)+,-(sp)
                    507: /      jsr pc,fad/fsb/fmp/fdv
                    508: / ans returned over arg1 and stack popped
                    509: /
                    510: fsb:
                    511:        tst 2(sp)       / jsr pc,*$tryflt, when no fltg hdware.
                    512:        bgt 1f
                    513:        bic $100000,2(sp)
                    514:        br fad
                    515: 1:
                    516:        bis $100000,2(sp)
                    517: /
                    518: fad:
                    519:        jsr r0,saver    / was: jsr pc,*$tryflt
                    520:        mov sp,r5
                    521:        add $18.,r5     / point to arg 1 (high order part)
                    522:        jsr pc,fxt      / extract exp to r0, leave dint on stack
                    523:        mov r5,r4       / point to h1 with r4
                    524:        mov r0,r1       / e1 to r1
                    525:        cmp -(r5),-(r5) / point to h2 with r5
                    526:        jsr pc,fxt      / decipher it too
                    527:        cmp r1,r0       / which has bigger (or eqal) exponent?
                    528:        bge 1f
                    529:        mov r4,r3       / swap the args so that (r4) does
                    530:        mov r5,r4
                    531:        mov r3,r5
                    532:        mov r0,r3
                    533:        mov r1,r0
                    534:        mov r3,r1
                    535: 1:
                    536:        sub r1,r0       / get negative shift count
                    537:        ash $-7,r0      / make exponent integer
                    538:        cmp r0,$-24.    / if ge 24 get a zero instead
                    539:        ble 2f
                    540:        mov (r5)+,r2    / get number in r2-r3
                    541:        mov (r5),r3
                    542:        ashc r0,r2
                    543:        adc r3
                    544:        adc r2  / round the result
                    545:        br 3f
                    546: 2:
                    547:        clr r2
                    548:        clr r3  / shifted off... get zero
                    549: 3:
                    550:        mov r1,r0       / get correct exponent to r1
                    551:        add 2(r4),r3    / add the numbers
                    552:        adc r2
                    553:        add (r4),r2
                    554:        jsr pc,dfxt     / reassemble the flt point format
                    555:        mov sp,r4
                    556:        add $18.,r4     / set to overwrite arg1
                    557:        mov r2,(r4)+
                    558:        mov r3,(r4)
                    559: exit1: / was exit; no good on unix
                    560:        jsr pc,rest
                    561:        mov (sp),4(sp)
                    562:        cmp (sp)+,(sp)+
                    563:        jmp *(sp)+      / return
                    564: /
                    565: / floating point utilities
                    566: /
                    567: fxt:
                    568: /
                    569: / in:  r5 points to high part (low addr) of flt pt num
                    570: / out: ro=exponent (bits 14-7, excess 200)
                    571: / (r5),(r5)+2=32 bit 2's compl integer part
                    572: /
                    573:        mov (r5),r0     / extract flt number componets
                    574: 3:
                    575:        bic $100177,r0  / clear fraction
                    576:        beq 4f  / if exp zero, whole number is zero
                    577:        bic r0,(r5)     / clear exp part in (r5)
                    578:        bpl 1f  / number is postive
                    579:        bis $200,(r5)   / num is negative, set hidden bit
                    580:        bic $100000,(r5)        / reset sign bit
                    581:        com (r5)+
                    582:        com (r5)
                    583:        adc (r5)
                    584:        adc -(r5)
                    585:        br 2f
                    586: 1:
                    587:        bis $200,(r5)   / set hidden bit
                    588: 2:
                    589:        rts pc
                    590: 4:
                    591:        clr 2(r5)       / make sure number is zero
                    592:        clr (r5)
                    593:        rts pc
                    594: /
                    595: / routine to reverse the procedure
                    596: /      in:  r0 = exponent
                    597: /      r2-r3 = 2's compl integer part
                    598: /      out: r2-r3 = flt pt number
                    599: /
                    600: dfxt:
                    601:        mov r2,-(sp)    / save sign
                    602:        ashc $0,r2      / check whole number for zero and sign
                    603:        beq 3f  / done if zero
                    604:        bpl 1f  / complement it if it's negative
                    605:        com r2
                    606:        com r3
                    607:        adc r3
                    608:        adc r2
                    609: 1:
                    610:        bit $077400,r2  / shift data bits out of exp
                    611:        beq 2f
                    612:        add $200,r0     / incr exponent part
                    613:        ashc $-1,r2     / divide by two
                    614:        bne 1b  / always branches
                    615:        br 6f   / you cant get here, treat as oveflow
                    616: 2:
                    617:        bit $200,r2
                    618:        bne 4f   / make sure there's a data bit for hidden bit
                    619:        sub $200,r0      / decr exponent
                    620:        ashc $1,r2       / mul by two
                    621:        bne 2b   / always branches
                    622:        br 6f    /  you cant get here
                    623: 4:
                    624:        bit $100177,r0
                    625:        bne 6f  / exponent under or over flow; don't know which
                    626:        bic $200,r2     / hide hidden bit
                    627:        bis r0,r2       / move exp into number
                    628:        tst (sp)+       / okay, what sign was it
                    629:        bpl 5f
                    630:        bis $100000,r2  / set minus
                    631: 5:
                    632:        rts pc
                    633: /
                    634: 6:
                    635: 3:
                    636:        clr r2
                    637:        clr r3
                    638:        tst (sp)+
                    639:        rts pc
                    640: //
                    641: fmp:
                    642:        jsr r0,saver    / was: jsr pc,*$tryflt
                    643:        mov sp,r5
                    644:        add $18.,r5     / r5 points to arg1 hi part (h1)
                    645:        jsr pc,fxt      / busy it out
                    646:        cmp -(r5),-(r5) / goto arg2
                    647:        mov r0,r1       / save exp
                    648:        jsr pc,fxt
                    649:        sub $[200]*200,r0       / sub $40000,r0 / subtr excess 200
                    650:        add r1,r0
                    651:        mov $2,r4
                    652: 1:
                    653:        mov (r5)+,r2    / prenormalize a little
                    654:        mov (r5)+,r3
                    655:        ashc $4,r2
                    656:        mov r3,-(sp)
                    657:        mov r2,-(sp)
                    658:        sob r4,1b       / two ints copied to stack
                    659:        jsr pc,dmul     / multiply and be fruitful
                    660:        mov (sp)+,r2
                    661:        mov (sp)+,r3    / copy high two wrds of answer
                    662:        cmp (sp)+,(sp)+ / bump past other two
                    663:        cmp -(r5),-(r5) / r5 to hi
                    664: mexit:
                    665:        jsr pc,dfxt     / cnvt to flt pt
                    666:        mov r2,(r5)+
                    667:        mov r3,(r5)
                    668:        jmp exit1       / done!
                    669: /
                    670: / divide
                    671: /
                    672: fdv:
                    673:        jsr r0,saver    / was: jsr pc,*$tryflt
                    674:        mov sp,r5       / this code same as mul and fad
                    675:        add $14.,r5     / except we pick up arg2 first
                    676:        jsr pc,fxt
                    677:        mov r0,r1
                    678:        cmp (r5)+,(r5)+ / back to arg 1
                    679:        jsr pc,fxt
                    680:        sub r1,r0       / exps subtract
                    681:        add $[200+1]*200,r0     / add $40200,r0 / add exc 200 and shift
                    682:        mov (r5)+,r2
                    683:        mov (r5),r3
                    684:        ashc $7,r2      / get full bits from 3-word numerator
                    685:        clr -(sp)       / trailing zeroes
                    686:        mov r3,-(sp)
                    687:        mov r2,-(sp)
                    688:        mov $3,-(sp)    / 3-words
                    689:        cmp -(r5),-(r5) / to arg2 l2
                    690:        mov (r5),-(sp)
                    691:        mov -(r5),-(sp) / denom
                    692:        mov $2,-(sp)    / 2-words
                    693:        jsr pc,ddiv     / divide and conquer
                    694:        add $10.,sp     / past remainder and counts
                    695:        mov (sp)+,r2    / middle word of quotient
                    696:        mov (sp)+,r3    / low word
                    697:        cmp (r5)+,(r5)+ / p5 to h1
                    698:        jmp mexit       / use fmp exit code. r5 in right place.
                    699: ///
                    700: / ***  The following from NORGEN code not being used  ***
                    701: / try hardware floating point operation to see if option installed
                    702: /
                    703: /      tryflt:
                    704: /              mov $nohdw,*$10
                    705: /              clr *$12
                    706: /              clr -(sp)
                    707: /              clr -(sp)
                    708: /              clr -(sp)
                    709: /              clr -(sp)
                    710: /              075006   / fadd sp
                    711: /              cmp (sp)+,(sp)+ / is installed. set up calls to hdw.
                    712: /              mov jump,fad
                    713: /              mov jump,fsb
                    714: /              mov jump,fmp
                    715: /              mov jump,fdv
                    716: /              mov $hfad,fad+2
                    717: /              mov $hfsb,fsb+2
                    718: /              mov $hfmp,fmp+2
                    719: /              mov $hfdv,fdv+2
                    720: /              sub $4,(sp)     / bump ret addr back 4.
                    721: /              rts pc
                    722: /      /
                    723: /      nohdw:
                    724: /              mov $saver,fad+2
                    725: /              mov $saver,fmp+2
                    726: /              mov $saver,fdv+2
                    727: /              mov test,fsb
                    728: /              mov test+2,fsb+2
                    729: /              mov jsr0,fad
                    730: /              mov jsr0,fmp
                    731: /              mov jsr0,fdv
                    732: /              add $12.,sp     / bump past 8 flt pt, 4 interrupt
                    733: /              sub $4,(sp)     / bump ret addr back to jsr
                    734: /              rts pc
                    735: /      /
                    736: /      test:
                    737: /              tst 2(sp)
                    738: /      jsr0:
                    739: /              jsr r0,*$saver
                    740: /      /
                    741: /      hfad:   sub $2,(sp)
                    742: /              mov $240,*(sp)
                    743: /              sub $2,(sp)
                    744: /              mov $75006,*(sp)
                    745: /              rts pc
                    746: /      hfsb:   sub $2,(sp)
                    747: /              mov $240,*(sp)
                    748: /              sub $2,(sp)
                    749: /              mov $75016,*(sp)
                    750: /              rts pc
                    751: /      hfmp:   sub $2,(sp)
                    752: /              mov $240,*(sp)
                    753: /              sub $2,(sp)
                    754: /              mov $75026,*(sp)
                    755: /              rts pc
                    756: /      hfdv:   sub $2,(sp)
                    757: /              mov $240,*(sp)
                    758: /              sub $2,(sp)
                    759: /              mov $75036,*(sp)
                    760: /              rts pc
                    761: /      /
                    762: /      jump:   jmp *$0

unix.superglobalmegacorp.com

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