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

1.1       root        1:        TITLE   fprims
                      2: 
                      3: ;      Fast 8086 assembly primitives for add, subtract, rotate left,
                      4: ;      and set precision bits for multiprecision integers.
                      5: ;      Callable from Microsoft C or Turbo C.
                      6: ;      Implemented Jan 1987 by Zhahai Stewart.
                      7: ;      Used by Philip Zimmermann's RSA public key cryptography library.
                      8: 
                      9: ;      Much faster primitives that implement a combined multiply/modulo
                     10: ;      operation are available by contacting Philip Zimmermann, 
                     11: ;      at Boulder Software Engineering, phone (303)444-4541
                     12: 
                     13: ;      Static Name Aliases
                     14: ;
                     15: _TEXT  SEGMENT  BYTE PUBLIC 'CODE'
                     16: _TEXT  ENDS
                     17: CONST  SEGMENT  WORD PUBLIC 'CONST'
                     18: CONST  ENDS
                     19: _BSS   SEGMENT  WORD PUBLIC 'BSS'
                     20: _BSS   ENDS
                     21: _DATA  SEGMENT  WORD PUBLIC 'DATA'
                     22: _DATA  ENDS
                     23: DGROUP GROUP   CONST,  _BSS,   _DATA
                     24:        ASSUME  CS: _TEXT, DS: DGROUP, SS: DGROUP, ES: DGROUP
                     25: PUBLIC _P_SETP         ;set global precision, maximum of 1024 bits
                     26: PUBLIC  _P_ADDC                ;multiprecision add with carry
                     27: PUBLIC  _P_SUBB                ;multiprecision subtract with borrow
                     28: PUBLIC  _P_ROTL                ;multiprecision rotate left 1 bit
                     29: _DATA  SEGMENT
                     30: _DATA  ENDS
                     31: _TEXT      SEGMENT
                     32: 
                     33: mswoff dw      (?)
                     34: adcx   dw      (?)
                     35: sbbx   dw      (?)
                     36: rclx   dw      (?)
                     37: 
                     38: ;--------------------------------------------------------------
                     39: ;      precision=bp+4          precision in bits
                     40: ;                              prec means precision in wds
                     41: 
                     42:        PUBLIC  _P_SETP
                     43: _P_SETP        PROC NEAR
                     44:        push    bp
                     45:        mov     bp,sp
                     46:        mov     ax,[bp+4]
                     47: 
                     48: ;      add     ax,15   round up
                     49: ;      shr     ax,4    number of words
                     50: ;      dec     ax      number - 1
                     51: ;      shl     ax,4    back to number of bits: 16 * (prec - 1)
                     52:        dec     ax      ; faster alternate way to do same thing
                     53:        and     al,0F0h
                     54: 
                     55:        cmp     ax,1008 ; 16 * (64-1)
                     56:        jg      x_setp  ; out of range
                     57: 
                     58:        shr     ax,1                    ; ax = 8 * (prec - 1)
                     59:        shr     ax,1                    ; ax = 4 * (prec - 1)
                     60: 
                     61:        mov     bx,offset adc01
                     62:        sub     bx,ax
                     63:        mov     cs:[adcx],bx    ; adcx = &adc01 - 4 * (prec - 1)
                     64: 
                     65:        mov     bx,offset sbb01
                     66:        sub     bx,ax
                     67:        mov     cs:[sbbx],bx    ; sbbx = &sbb01 - 4 * (prec - 1)
                     68: 
                     69:        mov     bx,offset rcl01
                     70:        shr     ax,1                    ; ax = 2 * (prec - 1)
                     71:        mov     cs:[mswoff],ax  ; mswoff = 2 * (prec-1) = msword offset
                     72:        sub     bx,ax
                     73:        shr     ax,1                    ; ax = prec - 1
                     74:        sub     bx,ax
                     75:        mov     cs:[rclx],bx    ; rclx = &rcl01 - 3 * (prec - 1)
                     76: 
                     77: x_setp:        pop     bp
                     78:        ret
                     79: _P_SETP        ENDP
                     80: 
                     81: 
                     82: ;--------------------------------------------------------------
                     83: ;      r1=bp+4
                     84: ;      r2=bp+6
                     85: ;      carry=bp+8
                     86: 
                     87:        PUBLIC  _P_ADDC
                     88: _P_ADDC        PROC NEAR
                     89:        push    bp
                     90:        mov     bp,sp
                     91:        push    si
                     92:        push    di
                     93: 
                     94:        mov     di,[bp+4]       ; r1
                     95:        mov     si,[bp+6]       ; r2
                     96:        add     di,cs:[mswoff]  ; offset to msw
                     97:        cld                     ; go fwd
                     98: 
                     99:        mov     al,0FFh         ; set cy flag if carry non-zero
                    100:        add     al,[bp+8]       ; carry in
                    101:        call    cs:[adcx]
                    102:        mov     ax,0            ; don't affect flags
                    103:        rcl     ax,1            ; set ax = 0 if no borrow, 1 if borrow out
                    104: 
                    105:        pop     di
                    106:        pop     si
                    107:        mov     sp,bp
                    108:        pop     bp
                    109:        ret     
                    110: _P_ADDC        ENDP
                    111: 
                    112: ;--------------------------------------------------------------
                    113: ;      r1=bp+4
                    114: ;      r2=bp+6
                    115: ;      borrow=bp+8
                    116: 
                    117:        PUBLIC  _P_SUBB
                    118: _P_SUBB        PROC NEAR
                    119:        push    bp
                    120:        mov     bp,sp
                    121:        push    si
                    122:        push    di
                    123: 
                    124:        mov     di,[bp+4]       ; r1
                    125:        mov     si,[bp+6]       ; r2
                    126:        add     di,cs:[mswoff]  ; offset to msw
                    127:        cld                     ; go fwd
                    128: 
                    129:        mov     al,0FFh         ; set cy flag if borrow non-zero
                    130:        add     al,[bp+8]       ; borrow
                    131:        call    cs:[sbbx]
                    132:        mov     ax,0            ; don't affect flags
                    133:        rcl     ax,1            ; set ax = 0 if no borrow, 1 if borrow out
                    134: 
                    135:        pop     di
                    136:        pop     si
                    137:        mov     sp,bp
                    138:        pop     bp
                    139:        ret     
                    140: _P_SUBB        ENDP
                    141: 
                    142: ;--------------------------------------------------------------
                    143: ;      r1=bp+4
                    144: ;      c=bp+6
                    145: 
                    146:        PUBLIC  _P_ROTL
                    147: _P_ROTL        PROC NEAR
                    148:        push    bp
                    149:        mov     bp,sp
                    150:        push    di
                    151: 
                    152:        mov     di,[bp+4]       ; r1
                    153:        add     di,cs:[mswoff]  ; offset to msw
                    154:        mov     al,0FFh
                    155:        add     al,[bp+6]       ; c (carry)
                    156:        call    cs:[rclx]
                    157:        mov     ax,0            ; don't affect flags
                    158:        rcl     ax,1            ; set ax = 0 if no carry, 1 if carry out
                    159: 
                    160:        pop     di
                    161:        mov     sp,bp
                    162:        pop     bp
                    163:        ret     
                    164: _P_ROTL        ENDP
                    165: 
                    166: ;========================================================================
                    167: dummy  proc    near
                    168: 
                    169: adc64: lodsw
                    170:        adc     [di-126],ax
                    171:        lodsw
                    172:        adc     [di-124],ax
                    173:        lodsw
                    174:        adc     [di-122],ax
                    175:        lodsw
                    176:        adc     [di-120],ax
                    177:        lodsw
                    178:        adc     [di-118],ax
                    179:        lodsw
                    180:        adc     [di-116],ax
                    181:        lodsw
                    182:        adc     [di-114],ax
                    183:        lodsw
                    184:        adc     [di-112],ax
                    185:        lodsw
                    186:        adc     [di-110],ax
                    187:        lodsw
                    188:        adc     [di-108],ax
                    189:        lodsw
                    190:        adc     [di-106],ax
                    191:        lodsw
                    192:        adc     [di-104],ax
                    193:        lodsw
                    194:        adc     [di-102],ax
                    195:        lodsw
                    196:        adc     [di-100],ax
                    197:        lodsw
                    198:        adc     [di-98],ax
                    199:        lodsw
                    200:        adc     [di-96],ax
                    201:        lodsw
                    202:        adc     [di-94],ax
                    203:        lodsw
                    204:        adc     [di-92],ax
                    205:        lodsw
                    206:        adc     [di-90],ax
                    207:        lodsw
                    208:        adc     [di-88],ax
                    209:        lodsw
                    210:        adc     [di-86],ax
                    211:        lodsw
                    212:        adc     [di-84],ax
                    213:        lodsw
                    214:        adc     [di-82],ax
                    215:        lodsw
                    216:        adc     [di-80],ax
                    217:        lodsw
                    218:        adc     [di-78],ax
                    219:        lodsw
                    220:        adc     [di-76],ax
                    221:        lodsw
                    222:        adc     [di-74],ax
                    223:        lodsw
                    224:        adc     [di-72],ax
                    225:        lodsw
                    226:        adc     [di-70],ax
                    227:        lodsw
                    228:        adc     [di-68],ax
                    229:        lodsw
                    230:        adc     [di-66],ax
                    231:        lodsw
                    232:        adc     [di-64],ax
                    233:        lodsw
                    234:        adc     [di-62],ax
                    235:        lodsw
                    236:        adc     [di-60],ax
                    237:        lodsw
                    238:        adc     [di-58],ax
                    239:        lodsw
                    240:        adc     [di-56],ax
                    241:        lodsw
                    242:        adc     [di-54],ax
                    243:        lodsw
                    244:        adc     [di-52],ax
                    245:        lodsw
                    246:        adc     [di-50],ax
                    247:        lodsw
                    248:        adc     [di-48],ax
                    249:        lodsw
                    250:        adc     [di-46],ax
                    251:        lodsw
                    252:        adc     [di-44],ax
                    253:        lodsw
                    254:        adc     [di-42],ax
                    255:        lodsw
                    256:        adc     [di-40],ax
                    257:        lodsw
                    258:        adc     [di-38],ax
                    259:        lodsw
                    260:        adc     [di-36],ax
                    261:        lodsw
                    262:        adc     [di-34],ax
                    263:        lodsw
                    264:        adc     [di-32],ax
                    265:        lodsw
                    266:        adc     [di-30],ax
                    267:        lodsw
                    268:        adc     [di-28],ax
                    269:        lodsw
                    270:        adc     [di-26],ax
                    271:        lodsw
                    272:        adc     [di-24],ax
                    273:        lodsw
                    274:        adc     [di-22],ax
                    275:        lodsw
                    276:        adc     [di-20],ax
                    277:        lodsw
                    278:        adc     [di-18],ax
                    279:        lodsw
                    280:        adc     [di-16],ax
                    281:        lodsw
                    282:        adc     [di-14],ax
                    283:        lodsw
                    284:        adc     [di-12],ax
                    285:        lodsw
                    286:        adc     [di-10],ax
                    287:        lodsw
                    288:        adc     [di-8],ax
                    289:        lodsw
                    290:        adc     [di-6],ax
                    291:        lodsw
                    292:        adc     [di-4],ax
                    293:        lodsw
                    294:        adc     [di-2],ax
                    295: adc01: lodsw
                    296:        adc     [di],ax
                    297:        ret
                    298: 
                    299: sbb64: lodsw
                    300:        sbb     [di-126],ax
                    301:        lodsw
                    302:        sbb     [di-124],ax
                    303:        lodsw
                    304:        sbb     [di-122],ax
                    305:        lodsw
                    306:        sbb     [di-120],ax
                    307:        lodsw
                    308:        sbb     [di-118],ax
                    309:        lodsw
                    310:        sbb     [di-116],ax
                    311:        lodsw
                    312:        sbb     [di-114],ax
                    313:        lodsw
                    314:        sbb     [di-112],ax
                    315:        lodsw
                    316:        sbb     [di-110],ax
                    317:        lodsw
                    318:        sbb     [di-108],ax
                    319:        lodsw
                    320:        sbb     [di-106],ax
                    321:        lodsw
                    322:        sbb     [di-104],ax
                    323:        lodsw
                    324:        sbb     [di-102],ax
                    325:        lodsw
                    326:        sbb     [di-100],ax
                    327:        lodsw
                    328:        sbb     [di-98],ax
                    329:        lodsw
                    330:        sbb     [di-96],ax
                    331:        lodsw
                    332:        sbb     [di-94],ax
                    333:        lodsw
                    334:        sbb     [di-92],ax
                    335:        lodsw
                    336:        sbb     [di-90],ax
                    337:        lodsw
                    338:        sbb     [di-88],ax
                    339:        lodsw
                    340:        sbb     [di-86],ax
                    341:        lodsw
                    342:        sbb     [di-84],ax
                    343:        lodsw
                    344:        sbb     [di-82],ax
                    345:        lodsw
                    346:        sbb     [di-80],ax
                    347:        lodsw
                    348:        sbb     [di-78],ax
                    349:        lodsw
                    350:        sbb     [di-76],ax
                    351:        lodsw
                    352:        sbb     [di-74],ax
                    353:        lodsw
                    354:        sbb     [di-72],ax
                    355:        lodsw
                    356:        sbb     [di-70],ax
                    357:        lodsw
                    358:        sbb     [di-68],ax
                    359:        lodsw
                    360:        sbb     [di-66],ax
                    361:        lodsw
                    362:        sbb     [di-64],ax
                    363:        lodsw
                    364:        sbb     [di-62],ax
                    365:        lodsw
                    366:        sbb     [di-60],ax
                    367:        lodsw
                    368:        sbb     [di-58],ax
                    369:        lodsw
                    370:        sbb     [di-56],ax
                    371:        lodsw
                    372:        sbb     [di-54],ax
                    373:        lodsw
                    374:        sbb     [di-52],ax
                    375:        lodsw
                    376:        sbb     [di-50],ax
                    377:        lodsw
                    378:        sbb     [di-48],ax
                    379:        lodsw
                    380:        sbb     [di-46],ax
                    381:        lodsw
                    382:        sbb     [di-44],ax
                    383:        lodsw
                    384:        sbb     [di-42],ax
                    385:        lodsw
                    386:        sbb     [di-40],ax
                    387:        lodsw
                    388:        sbb     [di-38],ax
                    389:        lodsw
                    390:        sbb     [di-36],ax
                    391:        lodsw
                    392:        sbb     [di-34],ax
                    393:        lodsw
                    394:        sbb     [di-32],ax
                    395:        lodsw
                    396:        sbb     [di-30],ax
                    397:        lodsw
                    398:        sbb     [di-28],ax
                    399:        lodsw
                    400:        sbb     [di-26],ax
                    401:        lodsw
                    402:        sbb     [di-24],ax
                    403:        lodsw
                    404:        sbb     [di-22],ax
                    405:        lodsw
                    406:        sbb     [di-20],ax
                    407:        lodsw
                    408:        sbb     [di-18],ax
                    409:        lodsw
                    410:        sbb     [di-16],ax
                    411:        lodsw
                    412:        sbb     [di-14],ax
                    413:        lodsw
                    414:        sbb     [di-12],ax
                    415:        lodsw
                    416:        sbb     [di-10],ax
                    417:        lodsw
                    418:        sbb     [di-8],ax
                    419:        lodsw
                    420:        sbb     [di-6],ax
                    421:        lodsw
                    422:        sbb     [di-4],ax
                    423:        lodsw
                    424:        sbb     [di-2],ax
                    425: sbb01: lodsw
                    426:        sbb     [di],ax
                    427:        ret
                    428: 
                    429: 
                    430: rcl64: rcl     word ptr [di-126],1
                    431:        rcl     word ptr [di-124],1
                    432:        rcl     word ptr [di-122],1
                    433:        rcl     word ptr [di-120],1
                    434:        rcl     word ptr [di-118],1
                    435:        rcl     word ptr [di-116],1
                    436:        rcl     word ptr [di-114],1
                    437:        rcl     word ptr [di-112],1
                    438:        rcl     word ptr [di-110],1
                    439:        rcl     word ptr [di-108],1
                    440:        rcl     word ptr [di-106],1
                    441:        rcl     word ptr [di-104],1
                    442:        rcl     word ptr [di-102],1
                    443:        rcl     word ptr [di-100],1
                    444:        rcl     word ptr [di-98],1
                    445:        rcl     word ptr [di-96],1
                    446:        rcl     word ptr [di-94],1
                    447:        rcl     word ptr [di-92],1
                    448:        rcl     word ptr [di-90],1
                    449:        rcl     word ptr [di-88],1
                    450:        rcl     word ptr [di-86],1
                    451:        rcl     word ptr [di-84],1
                    452:        rcl     word ptr [di-82],1
                    453:        rcl     word ptr [di-80],1
                    454:        rcl     word ptr [di-78],1
                    455:        rcl     word ptr [di-76],1
                    456:        rcl     word ptr [di-74],1
                    457:        rcl     word ptr [di-72],1
                    458:        rcl     word ptr [di-70],1
                    459:        rcl     word ptr [di-68],1
                    460:        rcl     word ptr [di-66],1
                    461:        rcl     word ptr [di-64],1
                    462:        rcl     word ptr [di-62],1
                    463:        rcl     word ptr [di-60],1
                    464:        rcl     word ptr [di-58],1
                    465:        rcl     word ptr [di-56],1
                    466:        rcl     word ptr [di-54],1
                    467:        rcl     word ptr [di-52],1
                    468:        rcl     word ptr [di-50],1
                    469:        rcl     word ptr [di-48],1
                    470:        rcl     word ptr [di-46],1
                    471:        rcl     word ptr [di-44],1
                    472:        rcl     word ptr [di-42],1
                    473:        rcl     word ptr [di-40],1
                    474:        rcl     word ptr [di-38],1
                    475:        rcl     word ptr [di-36],1
                    476:        rcl     word ptr [di-34],1
                    477:        rcl     word ptr [di-32],1
                    478:        rcl     word ptr [di-30],1
                    479:        rcl     word ptr [di-28],1
                    480:        rcl     word ptr [di-26],1
                    481:        rcl     word ptr [di-24],1
                    482:        rcl     word ptr [di-22],1
                    483:        rcl     word ptr [di-20],1
                    484:        rcl     word ptr [di-18],1
                    485:        rcl     word ptr [di-16],1
                    486:        rcl     word ptr [di-14],1
                    487:        rcl     word ptr [di-12],1
                    488:        rcl     word ptr [di-10],1
                    489:        rcl     word ptr [di-8],1
                    490:        rcl     word ptr [di-6],1
                    491:        rcl     word ptr [di-4],1
                    492:        rcl     word ptr [di-2],1
                    493: rcl01: rcl     word ptr [di],1
                    494:        ret
                    495: dummy  endp
                    496: 
                    497: _TEXT  ENDS
                    498: END

unix.superglobalmegacorp.com

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