Annotation of pgp/src/fprims.asm, revision 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.