|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.