Annotation of pgp/src/3b168000.s, revision 1.1.1.3

1.1.1.3 ! root        1: # 3B1 Assembler - primitives for multi-precision math on the MC68010
        !             2: #
        !             3: # Written by Rob Stampfli  19-Oct-92 for 3B1
        !             4: # Assembler: 3B1 native assembler
        !             5: #
        !             6: # Note that the function P_SETP of the Intel primitives is not used.
        !             7: # `set_precision' has to be defined just like in `PORTABLE' mode.
        !             8: 
        !             9:            global global_precision
        !            10:            global P_ADDC
        !            11:            global P_SUBB
        !            12:            global P_ROTL
        !            13:            global P_SETP
        !            14:            global P_SMUL
        !            15: 
        !            16:            text
        !            17: 
        !            18: #boolean P_ADDC(unitptr r1, unitptr r2, boolean carry);
        !            19: # /* multiprecision add with carry r2 to r1, result in r1 */
        !            20: #Parameters: A0.l: r1, A1.l: r2, D0.b: carry
        !            21: #Result:     D0.b: new carry
        !            22: #Modifies: D0-D2/A0-A1
        !            23: 
        !            24: P_ADDC:     mov.l   4(%sp),%a0 # fetch first argument: r1
        !            25:            mov.l   8(%sp),%a1  # fetch second argument: r2
        !            26:            mov.l   12(%sp),%d1 # fetch third argument: carry
        !            27:            mov.l   %d2,-(%sp)  # save d2 -- not a Unix-PC scratch reg
        !            28:            mov.w   global_precision,%d2 # fetch # of 16 bit units
        !            29:            mov.w   %d2,%d0     # copy units
        !            30:            lsl.w   &1,%d0      # convert units to bytes (1 unit = 2 bytes)
        !            31:            add.w   %d0,%a0     # point r1 to 1 past least significant unit
        !            32:            add.w   %d0,%a1     # point r2 to 1 past least significant unit
        !            33:            lsr.w   &5,%d0      # conv bytes to (units/16); # times thru loop1
        !            34:            and.w   &15,%d2     # = (units%16); # times thru loop2
        !            35:            lsr.b   &1,%d1      # set X-bit as specified by carry arg
        !            36:            bra     adbf1
        !            37: aloop1:            #REPT    8          # 16 units per loop
        !            38:            addx.l -(%a1),-(%a0)
        !            39:            addx.l -(%a1),-(%a0)
        !            40:            addx.l -(%a1),-(%a0)
        !            41:            addx.l -(%a1),-(%a0)
        !            42:            addx.l -(%a1),-(%a0)
        !            43:            addx.l -(%a1),-(%a0)
        !            44:            addx.l -(%a1),-(%a0)
        !            45:            addx.l -(%a1),-(%a0)
        !            46: adbf1:     dbf     %d0,aloop1
        !            47:            bra adbf2
        !            48: aloop2:            addx.w -(%a1),-(%a0)
        !            49: adbf2:     dbf     %d2,aloop2
        !            50:            scs     %d0             #set returned carry
        !            51:            mov.l   (%sp)+,%d2      # restore d2
        !            52:            rts
        !            53: 
        !            54: #boolean P_SUBB(unitptr r1, unitptr r2, boolean borrow);
        !            55: # /* multiprecision subtract with borrow, r2 from r1, result in r1 */
        !            56: #Parameters: A0.l: r1, A1.l: r2, D0.b: borrow
        !            57: #Result:     D0.b: new borrow
        !            58: #Modifies: D0-D2/A0/A1
        !            59: 
        !            60: P_SUBB:     mov.l   4(%sp),%a0 # fetch first argument: r1
        !            61:            mov.l   8(%sp),%a1  # fetch second argument: r2
        !            62:            mov.l   12(%sp),%d1 # fetch third argument: carry
        !            63:            mov.l   %d2,-(%sp)  # save d2 -- not a Unix-PC scratch reg
        !            64:            mov.w   global_precision,%d2 # fetch # of 16 bit units
        !            65:            mov.w   %d2,%d0     # copy units
        !            66:            lsl.w   &1,%d0      # convert units to bytes (1 unit = 2 bytes)
        !            67:            add.w   %d0,%a0     # point r1 to 1 past least significant unit
        !            68:            add.w   %d0,%a1     # point r2 to 1 past least significant unit
        !            69:            lsr.w   &5,%d0      # conv bytes to (units/16); # times thru loop1
        !            70:            and.w   &15,%d2     # = (units%16); # times thru loop2
        !            71:            lsr.b   &1,%d1      # set X-bit as specified by carry arg
        !            72:            bra     bdbf1
        !            73: bloop1:            #REPT    8          # 16 units per loop
        !            74:            subx.l  -(%a1),-(%a0)
        !            75:            subx.l  -(%a1),-(%a0)
        !            76:            subx.l  -(%a1),-(%a0)
        !            77:            subx.l  -(%a1),-(%a0)
        !            78:            subx.l  -(%a1),-(%a0)
        !            79:            subx.l  -(%a1),-(%a0)
        !            80:            subx.l  -(%a1),-(%a0)
        !            81:            subx.l  -(%a1),-(%a0)
        !            82: bdbf1:     dbf     %d0,bloop1
        !            83:            bra bdbf2
        !            84: bloop2:            subx.w -(%a1),-(%a0)
        !            85: bdbf2:     dbf     %d2,bloop2
        !            86:            scs     %d0             # set returned carry
        !            87:            mov.l   (%sp)+,%d2      # restore d2
        !            88:            rts
        !            89: 
        !            90: #boolean P_ROTL(unitptr r1, boolean carry);
        !            91: # /* multiprecision rotate left 1 bit with carry, result in r1. */
        !            92: #Parameters: A0.l: r1, D0.b: carry
        !            93: #Result:     D0.b: new carry
        !            94: #Modifies: D0-D2/A0
        !            95: 
        !            96: P_ROTL:     mov.l   4(%sp),%a0 # fetch first argument: r1
        !            97:            mov.l   8(%sp),%d1  # fetch second argument: carry
        !            98:            mov.l   %d2,-(%sp)  # save d2 -- not a Unix-PC scratch reg
        !            99:            mov.w   global_precision,%d2 # fetch # of 16 bit units
        !           100:            mov.w   %d2,%d0     # copy units
        !           101:            lsl.w   &1,%d0      # convert units to bytes (1 unit = 2 bytes)
        !           102:            add.w   %d0,%a0     # point r1 to 1 past least significant unit
        !           103:            lsr.w   &5,%d0      # conv bytes to (units/16); # times thru loop1
        !           104:            and.w   &15,%d2     # = (units%16); # times thru loop2
        !           105:            lsr.b   &1,%d1      # set X-bit as specified by carry arg
        !           106:            bra     cdbf1
        !           107: cloop1:            #REPT    16         # note roxl.l not valid on 68010
        !           108:            roxl.w  &1,-(%a0)
        !           109:            roxl.w  &1,-(%a0)
        !           110:            roxl.w  &1,-(%a0)
        !           111:            roxl.w  &1,-(%a0)
        !           112:            roxl.w  &1,-(%a0)
        !           113:            roxl.w  &1,-(%a0)
        !           114:            roxl.w  &1,-(%a0)
        !           115:            roxl.w  &1,-(%a0)
        !           116:            roxl.w  &1,-(%a0)
        !           117:            roxl.w  &1,-(%a0)
        !           118:            roxl.w  &1,-(%a0)
        !           119:            roxl.w  &1,-(%a0)
        !           120:            roxl.w  &1,-(%a0)
        !           121:            roxl.w  &1,-(%a0)
        !           122:            roxl.w  &1,-(%a0)
        !           123:            roxl.w  &1,-(%a0)
        !           124: cdbf1:     dbf     %d0,cloop1
        !           125:            bra     cdbf2
        !           126: cloop2:            roxl.w  &1,-(%a0)
        !           127: cdbf2:     dbf     %d2,cloop2
        !           128:            scs     %d0             # set returned carry
        !           129:            mov.l   (%sp)+,%d2      # restore d2
        !           130:            rts
        !           131: 
        !           132: #void P_SETP(short nbits);
        !           133: # /* sets working precision to specified number of bits. */
        !           134: # /* only to minimize portation differences             */
        !           135: #Parameters: --
        !           136: #Result:     --
        !           137: 
        !           138: P_SETP:            rts
        !           139: 
        !           140: #void P_SMUL(MULTUNIT *prod, MULTUNIT *multiplicand, MULTUNIT multiplier)
        !           141: # /* multiprecision multiply */
        !           142: #Parameters: A0.l: prod, A1.l: multiplicand, D0.w: multiplier
        !           143: #Modifies: D0-D4/A0-A1
        !           144: #Result:     --
        !           145: #Note: prod and multiplicand have already been adjusted to point to LSB
        !           146: # prior to making the call.
        !           147: 
        !           148: P_SMUL:     mov.l   4(%sp),%a0 # fetch first argument: prod
        !           149:            mov.l   8(%sp),%a1  # fetch second argument: multiplicand
        !           150:            mov.l   12(%sp),%d0 # fetch third argument: multiplier
        !           151:            mov.l   %d2,-(%sp)  # save d2 -- not a Unix-PC scratch reg
        !           152:            mov.l   %d3,-(%sp)  # save d3 -- not a Unix-PC scratch reg
        !           153:            mov.l   %d4,-(%sp)  # save d4 -- not a Unix-PC scratch reg
        !           154:        clr.l   %d2             # clear the carry register
        !           155:        clr.l   %d4             # clear upper half of temp reg for prod
        !           156:        add.w   &2,%a0          # position prod to 1 beyond LSB
        !           157:        add.w   &2,%a1          # position multiplicand to 1 beyond LSB
        !           158:        mov.w   global_precision,%d3  # fetch size of multiplicand
        !           159:        bra     ddbf1
        !           160: 
        !           161: dloop: mov.w   -(%a1),%d1      # fetch multiplicand
        !           162:        mulu.w  %d0,%d1         # multiply by multiplier
        !           163:        mov.w   -(%a0),%d4      # fetch prod
        !           164:        add.l   %d4,%d1         # add in prod
        !           165:        add.l   %d2,%d1         # add in carry
        !           166:        mov.w   %d1,(%a0)       # store result back to prod
        !           167:        swap.w  %d1             # fetch carry info (upper 16 bits of mult)
        !           168:        mov.w   %d1,%d2         # and move it into carry
        !           169: ddbf1: dbf     %d3,dloop
        !           170: 
        !           171:        mov.w   %d2,-(%a0)      # store carry
        !           172:        mov.l   (%sp)+,%d4
        !           173:        mov.l   (%sp)+,%d3
        !           174:        mov.l   (%sp)+,%d2
        !           175:        rts

unix.superglobalmegacorp.com

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