Annotation of coherent/b/lib/libc/old/dsubs.s,v, revision 1.1.1.1

1.1       root        1: head     1.1;
                      2: branch   ;
                      3: access   ;
                      4: symbols  ;
                      5: locks    bin:1.1; strict;
                      6: comment  @@;
                      7: 
                      8: 
                      9: 1.1
                     10: date     92.10.01.12.05.11;  author bin;  state Exp;
                     11: branches ;
                     12: next     ;
                     13: 
                     14: 
                     15: desc
                     16: @@
                     17: 
                     18: 
                     19: 
                     20: 1.1
                     21: log
                     22: @Initial revision
                     23: @
                     24: text
                     25: @/////////////////////////////////////////////////////////////////////////
                     26: /                                                                      /
                     27: /                                                                      /
                     28: / File:        DESSUBS.S                                               /
                     29: /                                                                      /
                     30: / Author:      JN                                                      /
                     31: /                                                                      /
                     32: / Date:        7/18/86                                                 /
                     33: /                                                                      /
                     34: / Description: Assembly language version of COHERENT (v. 2.3.35) DES    /
                     35: /             (Data Encryption Standard) subroutines converted from    /
                     36: /             'C' for speed improvement purposes.  The following       /
                     37: /             routines are replaced:                                   /
                     38: /                                                                      /
                     39: /                      permute                                         /
                     40: /                      bcopy                                           /
                     41: /                      lrot                                            /
                     42: /                      m2add                                           /
                     43: /                      dosboxes                                        /
                     44: /                                                                      /
                     45: /                                                                      /                               
                     46: /////////////////////////////////////////////////////////////////////////
                     47: 
                     48: / 
                     49: / Modifications:
                     50: /      04/01/87; JN; Fixed bug in lrot() where the array wasn't getting
                     51: /                    rotated properly for shift counts of 2.
                     52: /                              
                     53: 
                     54: /
                     55: / Note that not all of these subroutines use the same algorithms as their 'C'
                     56: / counter-parts (for speed), although the result is the same.
                     57: /
                     58: 
                     59: ///////
                     60: /
                     61: / permute(src, dest, tptr, nbits)
                     62: / char *src, *dest, *tptr;
                     63: / int nbits;
                     64: /
                     65: /      Input:  dest = pointer to place to store permuted bit array
                     66: /              src  = pointer to bit array to permute
                     67: /              tptr = pointer to table containing permution data
                     68: /              nbits = number of bits to permute
                     69: /
                     70: /      Action: Using pointer to passed table, stores permuted source
                     71: /              bit array into destination.
                     72: /
                     73: /      Returns: nothing.
                     74: /
                     75: ///////        
                     76:        
                     77:        .globl  permute_        / visible by all
                     78:        .shri                   / shared instruction
                     79: 
                     80: permute_:
                     81:        push    si
                     82:        push    di
                     83:        push    bp
                     84:        mov     bp,sp
                     85:        mov     cx,14(bp)       / get number of bits
                     86:        mov     si,12(bp)       / get pointer to table
                     87:        mov     di,10(bp)       / get pointer to dest
                     88:        mov     dx,8(bp)        / get pointer to source
                     89:        shr     cx,$1           / always even
                     90:        cld             
                     91:        
                     92: perm_0:
                     93:        lodsw                   / get 2 bit positions from table
                     94:        movb    bl,al           / get 1st bit position
                     95:        xorb    bh,bh           / zero bh
                     96:        add     bx,dx           / bx = pointer to specified source bit
                     97:        movb    al,(bx)         / get bit
                     98:                                                
                     99:        movb    bl,ah           / get 2nd bit position
                    100:        xorb    bh,bh           / zero bh
                    101:        add     bx,dx           / bx = pointer to specified source bit
                    102:        movb    ah,(bx)         / get bit
                    103:        stosw                   / store both bits
                    104:        loop    perm_0  
                    105:        
                    106:        pop     bp
                    107:        pop     di
                    108:        pop     si
                    109:        ret
                    110: 
                    111: 
                    112: 
                    113: ///////
                    114: /
                    115: / bcopy(src, dest, n)
                    116: / char *src, *dest;
                    117: / int n;
                    118: /
                    119: /      Input:  dest = pointer to dest string
                    120: /              src  = pointer to source string
                    121: /              n    = number of bytes to copy
                    122: /
                    123: /      Action: copy source string to destination.
                    124: /
                    125: /      Returns: nothing.
                    126: /
                    127: ///////        
                    128:        
                    129:        .globl  bcopy_          / visible by all
                    130:        .shri                   / shared instruction
                    131: 
                    132: bcopy_:
                    133:        push    si
                    134:        push    di
                    135:        push    bp
                    136:        mov     bp,sp
                    137:        mov     cx,12(bp)       / get count
                    138:        mov     si,8(bp)        / get pointer to source
                    139:        mov     di,10(bp)       / get pointer to dest
                    140:        cld                      
                    141:        
                    142: bcpy_0:
                    143:        shr     cx,$1           / copy words for speed
                    144:        jnc     bcpy_1          / even if no carry
                    145:        movsb                   / move odd byte
                    146: 
                    147: bcpy_1:
                    148:        rep                             
                    149:        movsw                   / copy the rest
                    150:        pop     bp
                    151:        pop     di
                    152:        pop     si
                    153:        ret
                    154: 
                    155: 
                    156: ///////
                    157: /
                    158: / lrot(bits, ns, nbits)
                    159: / char *bits;
                    160: / int ns, nbits;
                    161: /
                    162: /      Input:  bits = pointer to bit array
                    163: /              ns   = number of shifts
                    164: /              nbits = number of bits in bit array (1 or 2)
                    165: /
                    166: /      Action: rotate bit array left 'ns' number of times.  'ns'
                    167: /              must be a 1 or 2.
                    168: /
                    169: /      Returns: nothing.
                    170: /
                    171: ///////        
                    172:        
                    173:        .globl  lrot_           / visible by all
                    174:        .shri                   / shared instruction
                    175: 
                    176: lrot_:
                    177:        push    si
                    178:        push    di
                    179:        push    bp
                    180:        mov     bp,sp
                    181:        movb    dl,10(bp)       / get number of times to rotate
                    182:        mov     cx,12(bp)       / get number of bits
                    183:        cld
                    184:        mov     si,8(bp)        / point to bit array
                    185:        mov     di,si
                    186:        decb    dl              / dl = 1 or 2 
                    187:        jnz     lr2             
                    188:        call    lrot_1          / rotate left by one
                    189:        jmp     lr_ret
                    190: 
                    191: lr2:
                    192:        call    lrot_2          / rotate left by two
                    193: 
                    194: lr_ret:
                    195:        pop     bp
                    196:        pop     di
                    197:        pop     si
                    198:        ret
                    199: 
                    200:        /
                    201:        / subroutine to rotate bit array left by one
                    202:        /
                    203: 
                    204: lrot_1:
                    205:        lodsb                   / get first bit (carry)
                    206:        movb    ah,al           /  and save
                    207:        dec     cx              / already got carry bit
                    208:        rep
                    209:        movsb                   / shift left by one
                    210:        movb    al,ah           
                    211:        stosb                   / store carry bit
                    212:        ret
                    213: 
                    214: 
                    215:        /
                    216:        / subroutine to rotate bit array left by two
                    217:        /                                       
                    218: 
                    219: lrot_2:
                    220:        lodsw                   / get first bits (carry)
                    221:        shr     cx,$1           / always even
                    222:        dec     cx              / already got carry bits
                    223:                rep
                    224:        movsw                   / shift left by two
                    225:        stosw                   / store carry bits
                    226:        ret
                    227: 
                    228: 
                    229: ///////
                    230: /
                    231: / m2add(i1, i2, o, nbits)
                    232: / char *i1, *i2, *o; 
                    233: / int nbits;
                    234: /
                    235: /      Input:  i1  =  pointer to 1st bit array
                    236: /              i2  =  pointer to 2nd bit array 
                    237: /              o   =  place to store the result
                    238: /              nbits = number of bits in each bit array
                    239: /
                    240: /      Action: modulo 2 addition of bit arrays (exclusive or)
                    241: /
                    242: /      Returns: nothing.
                    243: /
                    244: ///////        
                    245:        
                    246:        .globl  m2add_          / visible by all
                    247:        .shri                   / shared instruction
                    248: 
                    249: m2add_:
                    250:        push    si
                    251:        push    di
                    252:        push    bp
                    253:        mov     bp,sp
                    254:        mov     cx,14(bp)       / get number of bits 
                    255:        mov     si,8(bp)        / get i1
                    256:        mov     bx,10(bp)       / get i2
                    257:        mov     di,12(bp)       / get dest
                    258:        shr     cx,$1           / always even
                    259:        cld                     
                    260: 
                    261: m2add_1:
                    262:        lodsw                   / get 2 bits from i1
                    263:        xor     ax,(bx)         / o = i1 xor i2
                    264:        inc     bx              / inc ptr to i2 
                    265:        inc     bx
                    266:        stosw                   / store into o
                    267:        loop    m2add_1
                    268:        pop     bp
                    269:        pop     di
                    270:        pop     si
                    271:        ret
                    272: 
                    273: 
                    274: ///////
                    275: /
                    276: / dosboxes(ibits, obits)
                    277: / char *ibits, *ibits; 
                    278: /
                    279: /      Input:  ibits  =  pointer to source (48 bit array)
                    280: /              obits  =  pointer to dest (32 bit array) 
                    281: /
                    282: /      Action: convert source array into destination array using
                    283: /              the 'S-box' functions.
                    284: /
                    285: /      Returns: nothing.
                    286: /
                    287: ///////        
                    288:        
                    289:        .globl  dosboxes_       / visible by all
                    290:        .shri                   / shared instruction
                    291: 
                    292: dosboxes_:
                    293:        push    si
                    294:        push    di
                    295:        push    bp
                    296:        mov     bp,sp
                    297:        sub     sp,$2           / allocate local space
                    298:        cld
                    299: 
                    300:        /
                    301:        / initialize variables
                    302:        /
                    303:        mov     -2(bp),$0       / count (0 - 7)
                    304:        mov     si,8(bp)        / pointer to source
                    305:        mov     di,10(bp)       / pointer to place to store result
                    306: 
                    307:        /
                    308:        / parse the source array in 6 bit pieces-- the first and last
                    309:        / bits are the S-box row, the middle 4 bits are the S-box column.
                    310:        /
                    311: 
                    312: dosbox_0:
                    313:        lodsb                   / r1
                    314:        movb    dl,al           / dl = row
                    315:        lodsb                   / c1
                    316:        movb    dh,al           / dh = column
                    317:        shlb    dh,$1
                    318:        lodsb                   / c2
                    319:        orb     dh,al
                    320:        shlb    dh,$1
                    321:        lodsb                   / c3
                    322:        orb     dh,al
                    323:        shlb    dh,$1
                    324:        lodsb                   / c4
                    325:        orb     dh,al   
                    326:        shlb    dl,$1
                    327:        lodsb                   / r2
                    328:        orb     dl,al
                    329: 
                    330:        /
                    331:        / get S-box entry using row & column address
                    332:        /
                    333:        mov     bx,-2(bp)       / get count
                    334:        movb    cl,$6           / sbox = count * 64 (size of each sbox)
                    335:        shl     bx,cl           
                    336:        movb    al,dl           / get row number
                    337:        xorb    ah,ah           / zero ah
                    338:        movb    cl,$4           / row = row # * 16
                    339:        shl     ax,cl           
                    340:        add     bx,ax           
                    341:        movb    al,dh           / get column number
                    342:        xorb    ah,ah           / zero ah
                    343:        add     bx,ax           / bx now points to the proper sbox entry
                    344:        movb    ah,Sboxes_(bx)  / get sbox entry
                    345: 
                    346:        /
                    347:        / unpack sbox entry and store in dest
                    348:        /
                    349:        mov     cx,$4           / # of significant bits in sbox entry
                    350:        shlb    ah,cl           / move to upper nybble 
                    351:                                                        
                    352: sbox_0:
                    353:        xorb    al,al           / default to zero bit 
                    354:        shlb    ah,$1           / shift left bit into carry
                    355:        jnc     sbox_1          
                    356:        incb    al              / a 1 was shifted out
                    357: 
                    358: sbox_1:
                    359:        stosb                   / store bit into dest
                    360:        loop    sbox_0
                    361: 
                    362:        /
                    363:        / do until count (bp-2) = 8 
                    364:        /                               
                    365:        inc     -2(bp)
                    366:        cmp     -2(bp),$8
                    367:        jb      dosbox_0
                    368:        mov     sp,bp           / de-allocate local space
                    369:        pop     bp
                    370:        pop     di
                    371:        pop     si
                    372:        ret
                    373: 
                    374: 
                    375: 
                    376: 
                    377: @

unix.superglobalmegacorp.com

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