Annotation of pgp/src/8086.asm, revision 1.1.1.1

1.1       root        1: ;  Assembly primitives for RSA multiprecision library
                      2: ; 
                      3: ;  Tested with Turbo Assembler 1.0 and masm 1.00
                      4: ; 
                      5: ;  Written by Branko Lankester ([email protected])    10/10/91
                      6: 
                      7: ; define LDATA and LCODE as follows:
                      8: ; model:        small   compact medium  large
                      9: ; LDATA         0       1       0       1
                     10: ; LCODE         0       0       1       1
                     11: 
                     12: LDATA   equ     1
                     13: LCODE   equ     1
                     14: 
                     15: IF LDATA
                     16: DSTPTR  equ     es:[bx+si]
                     17: ELSE
                     18: DSTPTR  equ     [bx+si]
                     19: ENDIF
                     20: 
                     21: IF LCODE
                     22: prec    equ     [bp+6]          ; 1st arg
                     23: r1      equ     [bp+6]          ; 1st arg
                     24: IF LDATA
                     25: r2      equ     [bp+10]         ; 2nd arg
                     26: carry   equ     [bp+14]         ; 3rd arg
                     27: scarry  equ     [bp+10]         ; carry for shift (arg 2)
                     28: ELSE
                     29: r2      equ     [bp+8]
                     30: carry   equ     [bp+10]
                     31: scarry  equ     [bp+8]
                     32: ENDIF
                     33: ELSE                            ; small code model
                     34: prec    equ     [bp+4]
                     35: r1      equ     [bp+4]
                     36: IF LDATA
                     37: r2      equ     [bp+8]
                     38: carry   equ     [bp+12]
                     39: scarry  equ     [bp+8]
                     40: ELSE
                     41: r2      equ     [bp+6]
                     42: carry   equ     [bp+8]
                     43: scarry  equ     [bp+6]
                     44: ENDIF
                     45: ENDIF
                     46: 
                     47: 
                     48: _TEXT   segment byte public 'CODE'
                     49: DGROUP  group   _DATA,_BSS
                     50:         assume  cs:_TEXT,ds:DGROUP
                     51: _TEXT   ends
                     52: 
                     53: _DATA   segment word public 'DATA'
                     54: _DATA   ends
                     55: 
                     56: _BSS    segment word public 'BSS'
                     57: prec16  dw      ?               ; precision / 16 (seems to be / 256?)
                     58: unitprec dw     ?               ; precision / 16, really
                     59: addp    dw      ?               ; jump offset
                     60: subp    dw      ?
                     61: rotp    dw      ?
                     62: mulp    dw      ?
                     63: _BSS    ends
                     64: 
                     65: _TEXT   segment byte public 'CODE'
                     66: 
                     67:         public  _P_SETP
                     68:         public  _P_ADDC
                     69:         public  _P_SUBB
                     70:         public  _P_ROTL
                     71: 
                     72: IF LCODE
                     73: fprims  proc    far                     ; dummy proc
                     74: ELSE
                     75: fprims  proc    near
                     76: ENDIF
                     77: 
                     78: ;
                     79: ; ******************** set precision ********************
                     80: ;
                     81: _P_SETP:
                     82:         push    bp
                     83:         mov     bp,sp
                     84:         mov     ax, prec        ; precision in bits
                     85:         add     ax, 0fh
                     86:         mov     cl,4
                     87:         shr     ax,cl           ; prec. in units
                     88:         mov     unitprec,ax
                     89:         push    ax
                     90:         shr     ax,cl
                     91:         mov     prec16,ax       ; precision / 16
                     92:         pop     ax
                     93:         and     ax,0fh          ;   al = prec % 16
                     94:         mov     bx,ax
                     95:         mov     cx,ax
                     96:         shl     bx,1            ; multiply by 4 (=number of bytes 
                     97:         shl     bx,1            ;   in instruction sequence)
                     98:         mov     dx,bx
                     99: IFE LDATA
                    100:         sub     dx,ax           ; small model only 3 for add/sub
                    101: ENDIF
                    102:         mov     ax,offset add_ref
                    103:         sub     ax,dx
                    104:         mov     addp,ax
                    105: 
                    106:         mov     ax,offset sub_ref
                    107:         sub     ax,dx
                    108:         mov     subp,ax
                    109: 
                    110:         mov     ax,offset rot_ref
                    111:         sub     ax,bx
                    112:         mov     rotp,ax
                    113: 
                    114:         mov     ax,offset mul_ref
                    115:         shl     bx,1            ; MULU macro is 17 bytes for large data
                    116:         shl     bx,1
                    117:         sub     ax,bx
                    118:         sub     ax,cx
                    119:         mov     mulp,ax
                    120: 
                    121:         pop     bp
                    122:         ret
                    123: 
                    124: 
                    125: 
                    126: ;
                    127: ; ******************** mpi add with carry ********************
                    128: ;
                    129: ADDU    macro   n
                    130:         rept    n
                    131:                 lodsw
                    132:                 adc     DSTPTR,ax
                    133:         endm
                    134: endm
                    135: 
                    136: 
                    137: _P_ADDC:
                    138:         push    bp
                    139:         mov     bp,sp
                    140:         push    si
                    141:         mov     cx, prec16
                    142:         mov     dx, addp
                    143: IF LDATA
                    144:         push    ds
                    145:         lds     si, dword ptr r2
                    146:         les     bx, dword ptr r1
                    147: ELSE
                    148:         mov     si, r2
                    149:         mov     bx, r1
                    150: ENDIF
                    151:         sub     bx, si          ; calculate relative offset
                    152:         dec     bx
                    153:         dec     bx
                    154:         cld
                    155:         shr     byte ptr carry,1        ; load carry
                    156:         jcxz    add_units
                    157: add_16u:
                    158:         ADDU    16
                    159:         loop    add_16u
                    160: add_units:
                    161:         jmp     dx
                    162:         ADDU    15
                    163: add_ref:
                    164:         rcl     ax,1            ; return carry
                    165:         and     ax,1
                    166: IF LDATA
                    167:         pop     ds
                    168: ENDIF
                    169:         pop     si
                    170:         pop     bp
                    171:         ret
                    172: 
                    173: 
                    174: 
                    175: ;
                    176: ; ******************** mpi subtract with borrow ********************
                    177: ;
                    178: SUBU    macro   n
                    179:         rept    n
                    180:                 lodsw
                    181:                 sbb     DSTPTR,ax
                    182:         endm
                    183: endm
                    184: 
                    185: 
                    186: _P_SUBB:
                    187:         push    bp
                    188:         mov     bp,sp
                    189:         push    si
                    190:         mov     cx, prec16
                    191:         mov     dx, subp
                    192: IF LDATA
                    193:         push    ds
                    194:         lds     si, dword ptr r2
                    195:         les     bx, dword ptr r1
                    196: ELSE
                    197:         mov     si, r2
                    198:         mov     bx, r1
                    199: ENDIF
                    200:         sub     bx, si          ; calculate relative offset
                    201:         dec     bx
                    202:         dec     bx
                    203:         cld
                    204:         shr     byte ptr carry,1
                    205:         jcxz    sub_units
                    206: sub_16u:
                    207:         SUBU    16
                    208:         loop    sub_16u
                    209: sub_units:
                    210:         jmp     dx
                    211:         SUBU    15
                    212: sub_ref:
                    213:         rcl     ax,1            ; return carry
                    214:         and     ax,1
                    215: IF LDATA
                    216:         pop     ds
                    217: ENDIF
                    218:         pop     si
                    219:         pop     bp
                    220:         ret
                    221: 
                    222: 
                    223: 
                    224: ;
                    225: ; ******************** mpi rotate left ********************
                    226: ;
                    227: _P_ROTL:
                    228:         push    bp
                    229:         mov     bp,sp
                    230:         mov     cx, prec16
                    231:         mov     dx, rotp
                    232: IF LDATA
                    233:         push    ds
                    234:         lds     bx, dword ptr r1
                    235: ELSE
                    236:         mov     bx, r1
                    237: ENDIF
                    238:         shr     byte ptr scarry,1
                    239:         jcxz    rot_units
                    240: rot_16u:
                    241:         i = 0
                    242:         rept    16
                    243:                 rcl     word ptr [bx + i],1
                    244:                 i = i + 2
                    245:         endm
                    246:         lahf
                    247:         add     bx,32
                    248:         sahf
                    249:         loop    rot_16u
                    250: rot_units:
                    251:         jmp     dx
                    252:         rept    15
                    253:                 rcl     word ptr [bx],1
                    254:                 inc     bx
                    255:                 inc     bx
                    256:         endm
                    257: rot_ref:
                    258: 
                    259:         rcl     ax,1
                    260:         and     ax,1
                    261: IF LDATA
                    262:         pop     ds
                    263: ENDIF
                    264:         pop     bp
                    265:         ret
                    266: 
                    267: fprims  endp
                    268: 
                    269: _TEXT   ends
                    270: 
                    271: 
                    272: 
                    273: ; ***************************************************************
                    274: ;  P_SMUL (MULTUNIT *prod, MULTUNIT *multiplicand, MULTUNIT multiplier)
                    275: ;       mp_smul routine from Upton's modmult, converted to assembler
                    276: ;
                    277: ;       Multiply the single-word multiplier times the multiprecision integer 
                    278: ;       in multiplicand, accumulating result in prod.  The resulting 
                    279: ;       multiprecision prod will be 1 word longer than the multiplicand.   
                    280: ;       multiplicand is unit_prec words long.  We add into prod, so caller 
                    281: ;       should zero it out first.
                    282: ;
                    283: ;       NOTE:  Unlike other functions in the multiprecision arithmetic 
                    284: ;       library, both multiplicand and prod are pointing at the LSB, 
                    285: ;       regardless of byte order of the machine.  On an 80x86, this makes 
                    286: ;       no difference.  But if this assembly function is implemented
                    287: ;       on a 680x0, it becomes important.
                    288: ; ***************************************************************
                    289: ;   Variable assignments:
                    290: ;       multiplier = [bp+14]
                    291: ;       multiplicand = [ds:di]  32-bit pointer
                    292: ;       prod = [es:si]          32-bit pointer
                    293: ;       unit_prec = cx
                    294: ;       p = ax-dx
                    295: ;       carry = bx
                    296: UPTON_TEXT      SEGMENT  WORD PUBLIC 'CODE'
                    297: UPTON_TEXT      ENDS
                    298: UPTON_TEXT      SEGMENT
                    299:         ASSUME  CS: UPTON_TEXT
                    300:         ASSUME  DS: DGROUP
                    301:         PUBLIC  _P_SMUL
                    302: 
                    303: MULU    macro   n
                    304:         rept    n
                    305:                 lodsw                   ;multiplicand
                    306:                 mul     bp              ;multiplier, results (p) to AX/DX
                    307:                 add     ax,bx           ;carry
                    308:                 adc     dx,0
                    309:                 add     ax,WORD PTR es:[di]
                    310:                 adc     dx,0
                    311:                 mov     bx,dx           ;carry
                    312:                 stosw
                    313:         endm
                    314: endm
                    315: 
                    316: _P_SMUL PROC FAR
                    317:         push    bp
                    318:         mov     bp,sp
                    319:         push    di
                    320:         push    si
                    321:         push    ds
                    322:         mov     cx,prec16
                    323:         mov     ax,mulp
                    324:         push    ax
                    325: 
                    326:         sub     bx,bx           ;carry = 0, store in bx
                    327: 
                    328:         les     di,DWORD PTR [bp+6]     ;prod in es:di
                    329:         lds     si,DWORD PTR [bp+10]    ;multiplicand in ds:si
                    330:         cld
                    331:         mov     bp,[bp+14]
                    332: 
                    333:         or      cx,cx
                    334:         jnz     mul_16u
                    335:         jmp     mul_units
                    336: mul_16u:
                    337:         MULU    16
                    338:         dec     cx
                    339:         jz      mul_units
                    340:         jmp     mul_16u
                    341: mul_units:
                    342:         pop     cx
                    343:         jmp     cx
                    344:         MULU    15
                    345: mul_ref:
                    346: 
                    347:         ; We know that the high-order word of prod will always be 0
                    348:         mov     WORD PTR es:[di],bx     ;store carry in prod empty high word
                    349: 
                    350:         pop     ds
                    351:         pop     si
                    352:         pop     di
                    353:         pop     bp
                    354:         ret     
                    355: 
                    356: _P_SMUL ENDP
                    357: UPTON_TEXT   ends
                    358:         end
                    359: 

unix.superglobalmegacorp.com

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