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

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

unix.superglobalmegacorp.com

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