1*80ee5cbfSDavid du Colombier/* 2*80ee5cbfSDavid du Colombier * rfc1321 requires that I include this. The code is new. The constants 3*80ee5cbfSDavid du Colombier * all come from the rfc (hence the copyright). We trade a table for the 4*80ee5cbfSDavid du Colombier * macros in rfc. The total size is a lot less. -- presotto 5*80ee5cbfSDavid du Colombier * 6*80ee5cbfSDavid du Colombier * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All 7*80ee5cbfSDavid du Colombier * rights reserved. 8*80ee5cbfSDavid du Colombier * 9*80ee5cbfSDavid du Colombier * License to copy and use this software is granted provided that it 10*80ee5cbfSDavid du Colombier * is identified as the "RSA Data Security, Inc. MD5 Message-Digest 11*80ee5cbfSDavid du Colombier * Algorithm" in all material mentioning or referencing this software 12*80ee5cbfSDavid du Colombier * or this function. 13*80ee5cbfSDavid du Colombier * 14*80ee5cbfSDavid du Colombier * License is also granted to make and use derivative works provided 15*80ee5cbfSDavid du Colombier * that such works are identified as "derived from the RSA Data 16*80ee5cbfSDavid du Colombier * Security, Inc. MD5 Message-Digest Algorithm" in all material 17*80ee5cbfSDavid du Colombier * mentioning or referencing the derived work. 18*80ee5cbfSDavid du Colombier * 19*80ee5cbfSDavid du Colombier * RSA Data Security, Inc. makes no representations concerning either 20*80ee5cbfSDavid du Colombier * the merchantability of this software or the suitability of this 21*80ee5cbfSDavid du Colombier * software forany particular purpose. It is provided "as is" 22*80ee5cbfSDavid du Colombier * without express or implied warranty of any kind. 23*80ee5cbfSDavid du Colombier * These notices must be retained in any copies of any part of this 24*80ee5cbfSDavid du Colombier * documentation and/or software. 25*80ee5cbfSDavid du Colombier */ 26*80ee5cbfSDavid du Colombier 27*80ee5cbfSDavid du Colombier /* round 1 */ 28*80ee5cbfSDavid du Colombier DATA md5tab<>+( 0*4)(SB)/4,$0xd76aa478 29*80ee5cbfSDavid du Colombier DATA md5tab<>+( 1*4)(SB)/4,$0xe8c7b756 30*80ee5cbfSDavid du Colombier DATA md5tab<>+( 2*4)(SB)/4,$0x242070db 31*80ee5cbfSDavid du Colombier DATA md5tab<>+( 3*4)(SB)/4,$0xc1bdceee 32*80ee5cbfSDavid du Colombier DATA md5tab<>+( 4*4)(SB)/4,$0xf57c0faf 33*80ee5cbfSDavid du Colombier DATA md5tab<>+( 5*4)(SB)/4,$0x4787c62a 34*80ee5cbfSDavid du Colombier DATA md5tab<>+( 6*4)(SB)/4,$0xa8304613 35*80ee5cbfSDavid du Colombier DATA md5tab<>+( 7*4)(SB)/4,$0xfd469501 36*80ee5cbfSDavid du Colombier DATA md5tab<>+( 8*4)(SB)/4,$0x698098d8 37*80ee5cbfSDavid du Colombier DATA md5tab<>+( 9*4)(SB)/4,$0x8b44f7af 38*80ee5cbfSDavid du Colombier DATA md5tab<>+(10*4)(SB)/4,$0xffff5bb1 39*80ee5cbfSDavid du Colombier DATA md5tab<>+(11*4)(SB)/4,$0x895cd7be 40*80ee5cbfSDavid du Colombier DATA md5tab<>+(12*4)(SB)/4,$0x6b901122 41*80ee5cbfSDavid du Colombier DATA md5tab<>+(13*4)(SB)/4,$0xfd987193 42*80ee5cbfSDavid du Colombier DATA md5tab<>+(14*4)(SB)/4,$0xa679438e 43*80ee5cbfSDavid du Colombier DATA md5tab<>+(15*4)(SB)/4,$0x49b40821 44*80ee5cbfSDavid du Colombier 45*80ee5cbfSDavid du Colombier /* round 2 */ 46*80ee5cbfSDavid du Colombier DATA md5tab<>+(16*4)(SB)/4,$0xf61e2562 47*80ee5cbfSDavid du Colombier DATA md5tab<>+(17*4)(SB)/4,$0xc040b340 48*80ee5cbfSDavid du Colombier DATA md5tab<>+(18*4)(SB)/4,$0x265e5a51 49*80ee5cbfSDavid du Colombier DATA md5tab<>+(19*4)(SB)/4,$0xe9b6c7aa 50*80ee5cbfSDavid du Colombier DATA md5tab<>+(20*4)(SB)/4,$0xd62f105d 51*80ee5cbfSDavid du Colombier DATA md5tab<>+(21*4)(SB)/4,$0x02441453 52*80ee5cbfSDavid du Colombier DATA md5tab<>+(22*4)(SB)/4,$0xd8a1e681 53*80ee5cbfSDavid du Colombier DATA md5tab<>+(23*4)(SB)/4,$0xe7d3fbc8 54*80ee5cbfSDavid du Colombier DATA md5tab<>+(24*4)(SB)/4,$0x21e1cde6 55*80ee5cbfSDavid du Colombier DATA md5tab<>+(25*4)(SB)/4,$0xc33707d6 56*80ee5cbfSDavid du Colombier DATA md5tab<>+(26*4)(SB)/4,$0xf4d50d87 57*80ee5cbfSDavid du Colombier DATA md5tab<>+(27*4)(SB)/4,$0x455a14ed 58*80ee5cbfSDavid du Colombier DATA md5tab<>+(28*4)(SB)/4,$0xa9e3e905 59*80ee5cbfSDavid du Colombier DATA md5tab<>+(29*4)(SB)/4,$0xfcefa3f8 60*80ee5cbfSDavid du Colombier DATA md5tab<>+(30*4)(SB)/4,$0x676f02d9 61*80ee5cbfSDavid du Colombier DATA md5tab<>+(31*4)(SB)/4,$0x8d2a4c8a 62*80ee5cbfSDavid du Colombier 63*80ee5cbfSDavid du Colombier /* round 3 */ 64*80ee5cbfSDavid du Colombier DATA md5tab<>+(32*4)(SB)/4,$0xfffa3942 65*80ee5cbfSDavid du Colombier DATA md5tab<>+(33*4)(SB)/4,$0x8771f681 66*80ee5cbfSDavid du Colombier DATA md5tab<>+(34*4)(SB)/4,$0x6d9d6122 67*80ee5cbfSDavid du Colombier DATA md5tab<>+(35*4)(SB)/4,$0xfde5380c 68*80ee5cbfSDavid du Colombier DATA md5tab<>+(36*4)(SB)/4,$0xa4beea44 69*80ee5cbfSDavid du Colombier DATA md5tab<>+(37*4)(SB)/4,$0x4bdecfa9 70*80ee5cbfSDavid du Colombier DATA md5tab<>+(38*4)(SB)/4,$0xf6bb4b60 71*80ee5cbfSDavid du Colombier DATA md5tab<>+(39*4)(SB)/4,$0xbebfbc70 72*80ee5cbfSDavid du Colombier DATA md5tab<>+(40*4)(SB)/4,$0x289b7ec6 73*80ee5cbfSDavid du Colombier DATA md5tab<>+(41*4)(SB)/4,$0xeaa127fa 74*80ee5cbfSDavid du Colombier DATA md5tab<>+(42*4)(SB)/4,$0xd4ef3085 75*80ee5cbfSDavid du Colombier DATA md5tab<>+(43*4)(SB)/4,$0x04881d05 76*80ee5cbfSDavid du Colombier DATA md5tab<>+(44*4)(SB)/4,$0xd9d4d039 77*80ee5cbfSDavid du Colombier DATA md5tab<>+(45*4)(SB)/4,$0xe6db99e5 78*80ee5cbfSDavid du Colombier DATA md5tab<>+(46*4)(SB)/4,$0x1fa27cf8 79*80ee5cbfSDavid du Colombier DATA md5tab<>+(47*4)(SB)/4,$0xc4ac5665 80*80ee5cbfSDavid du Colombier 81*80ee5cbfSDavid du Colombier /* round 4 */ 82*80ee5cbfSDavid du Colombier DATA md5tab<>+(48*4)(SB)/4,$0xf4292244 83*80ee5cbfSDavid du Colombier DATA md5tab<>+(49*4)(SB)/4,$0x432aff97 84*80ee5cbfSDavid du Colombier DATA md5tab<>+(50*4)(SB)/4,$0xab9423a7 85*80ee5cbfSDavid du Colombier DATA md5tab<>+(51*4)(SB)/4,$0xfc93a039 86*80ee5cbfSDavid du Colombier DATA md5tab<>+(52*4)(SB)/4,$0x655b59c3 87*80ee5cbfSDavid du Colombier DATA md5tab<>+(53*4)(SB)/4,$0x8f0ccc92 88*80ee5cbfSDavid du Colombier DATA md5tab<>+(54*4)(SB)/4,$0xffeff47d 89*80ee5cbfSDavid du Colombier DATA md5tab<>+(55*4)(SB)/4,$0x85845dd1 90*80ee5cbfSDavid du Colombier DATA md5tab<>+(56*4)(SB)/4,$0x6fa87e4f 91*80ee5cbfSDavid du Colombier DATA md5tab<>+(57*4)(SB)/4,$0xfe2ce6e0 92*80ee5cbfSDavid du Colombier DATA md5tab<>+(58*4)(SB)/4,$0xa3014314 93*80ee5cbfSDavid du Colombier DATA md5tab<>+(59*4)(SB)/4,$0x4e0811a1 94*80ee5cbfSDavid du Colombier DATA md5tab<>+(60*4)(SB)/4,$0xf7537e82 95*80ee5cbfSDavid du Colombier DATA md5tab<>+(61*4)(SB)/4,$0xbd3af235 96*80ee5cbfSDavid du Colombier DATA md5tab<>+(62*4)(SB)/4,$0x2ad7d2bb 97*80ee5cbfSDavid du Colombier DATA md5tab<>+(63*4)(SB)/4,$0xeb86d391 98*80ee5cbfSDavid du Colombier 99*80ee5cbfSDavid du Colombier#define S11 7 100*80ee5cbfSDavid du Colombier#define S12 12 101*80ee5cbfSDavid du Colombier#define S13 17 102*80ee5cbfSDavid du Colombier#define S14 22 103*80ee5cbfSDavid du Colombier 104*80ee5cbfSDavid du Colombier#define S21 5 105*80ee5cbfSDavid du Colombier#define S22 9 106*80ee5cbfSDavid du Colombier#define S23 14 107*80ee5cbfSDavid du Colombier#define S24 20 108*80ee5cbfSDavid du Colombier 109*80ee5cbfSDavid du Colombier#define S31 4 110*80ee5cbfSDavid du Colombier#define S32 11 111*80ee5cbfSDavid du Colombier#define S33 16 112*80ee5cbfSDavid du Colombier#define S34 23 113*80ee5cbfSDavid du Colombier 114*80ee5cbfSDavid du Colombier#define S41 6 115*80ee5cbfSDavid du Colombier#define S42 10 116*80ee5cbfSDavid du Colombier#define S43 15 117*80ee5cbfSDavid du Colombier#define S44 21 118*80ee5cbfSDavid du Colombier 119*80ee5cbfSDavid du Colombier#define AREG R5 120*80ee5cbfSDavid du Colombier#define BREG R6 121*80ee5cbfSDavid du Colombier#define CREG R7 122*80ee5cbfSDavid du Colombier#define DREG R8 123*80ee5cbfSDavid du Colombier#define DATAREG R1 124*80ee5cbfSDavid du Colombier#define TABREG R10 125*80ee5cbfSDavid du Colombier#define STREG R11 126*80ee5cbfSDavid du Colombier#define XREG R12 127*80ee5cbfSDavid du Colombier#define ELOOPREG R13 128*80ee5cbfSDavid du Colombier#define EDREG R14 129*80ee5cbfSDavid du Colombier#define IREG R15 130*80ee5cbfSDavid du Colombier 131*80ee5cbfSDavid du Colombier#define TMP1 R9 132*80ee5cbfSDavid du Colombier#define TMP2 R2 133*80ee5cbfSDavid du Colombier#define TMP3 R3 134*80ee5cbfSDavid du Colombier#define TMP4 R4 135*80ee5cbfSDavid du Colombier 136*80ee5cbfSDavid du Colombier/* 137*80ee5cbfSDavid du Colombier * decode little endian data into x[off], then the body 138*80ee5cbfSDavid du Colombier * bodies have this form: 139*80ee5cbfSDavid du Colombier * a += FN(B,C,D); 140*80ee5cbfSDavid du Colombier * a += x[off] + t[off]; 141*80ee5cbfSDavid du Colombier * a = (a << S11) | (a >> (32 - S11)); 142*80ee5cbfSDavid du Colombier * a += b; 143*80ee5cbfSDavid du Colombier */ 144*80ee5cbfSDavid du Colombier#define BODY1(off,FN,SH,A,B,C,D)\ 145*80ee5cbfSDavid du Colombier MOVBU off(DATAREG),TMP2;\ 146*80ee5cbfSDavid du Colombier MOVBU (off+1)(DATAREG),TMP3;\ 147*80ee5cbfSDavid du Colombier MOVBU (off+2)(DATAREG),TMP1;\ 148*80ee5cbfSDavid du Colombier MOVBU (off+3)(DATAREG),TMP4;\ 149*80ee5cbfSDavid du Colombier SLL $8,TMP3;\ 150*80ee5cbfSDavid du Colombier OR TMP3,TMP2;\ 151*80ee5cbfSDavid du Colombier SLL $16,TMP1;\ 152*80ee5cbfSDavid du Colombier OR TMP1,TMP2;\ 153*80ee5cbfSDavid du Colombier SLL $24,TMP4;\ 154*80ee5cbfSDavid du Colombier OR TMP4,TMP2;\ 155*80ee5cbfSDavid du Colombier MOVW off(TABREG),TMP3;\ 156*80ee5cbfSDavid du Colombier FN(B,C,D)\ 157*80ee5cbfSDavid du Colombier ADDU TMP1,A;\ 158*80ee5cbfSDavid du Colombier MOVW TMP2,off(XREG);\ 159*80ee5cbfSDavid du Colombier ADDU TMP2,A;\ 160*80ee5cbfSDavid du Colombier ADDU TMP3,A;\ 161*80ee5cbfSDavid du Colombier SLL $SH,A,TMP1;\ 162*80ee5cbfSDavid du Colombier SRL $(32-SH),A;\ 163*80ee5cbfSDavid du Colombier OR TMP1,A;\ 164*80ee5cbfSDavid du Colombier ADDU B,A;\ 165*80ee5cbfSDavid du Colombier 166*80ee5cbfSDavid du Colombier#define BODY(off,inc,FN,SH,A,B,C,D)\ 167*80ee5cbfSDavid du Colombier MOVW off(TABREG),TMP3;\ 168*80ee5cbfSDavid du Colombier ADDU XREG,IREG,TMP4;\ 169*80ee5cbfSDavid du Colombier MOVW (TMP4),TMP2;\ 170*80ee5cbfSDavid du Colombier ADDU $(inc*4),IREG;\ 171*80ee5cbfSDavid du Colombier AND $63,IREG;\ 172*80ee5cbfSDavid du Colombier FN(B,C,D)\ 173*80ee5cbfSDavid du Colombier ADDU TMP1,A;\ 174*80ee5cbfSDavid du Colombier ADDU TMP2,A;\ 175*80ee5cbfSDavid du Colombier ADDU TMP3,A;\ 176*80ee5cbfSDavid du Colombier SLL $SH,A,TMP1;\ 177*80ee5cbfSDavid du Colombier SRL $(32-SH),A;\ 178*80ee5cbfSDavid du Colombier OR TMP1,A;\ 179*80ee5cbfSDavid du Colombier ADDU B,A;\ 180*80ee5cbfSDavid du Colombier 181*80ee5cbfSDavid du Colombier/* 182*80ee5cbfSDavid du Colombier * fn1 = ((c ^ d) & b) ^ d 183*80ee5cbfSDavid du Colombier */ 184*80ee5cbfSDavid du Colombier#define FN1(B,C,D)\ 185*80ee5cbfSDavid du Colombier XOR C,D,TMP1;\ 186*80ee5cbfSDavid du Colombier AND B,TMP1;\ 187*80ee5cbfSDavid du Colombier XOR D,TMP1;\ 188*80ee5cbfSDavid du Colombier 189*80ee5cbfSDavid du Colombier/* 190*80ee5cbfSDavid du Colombier * fn2 = ((b ^ c) & d) ^ c; 191*80ee5cbfSDavid du Colombier */ 192*80ee5cbfSDavid du Colombier#define FN2(B,C,D)\ 193*80ee5cbfSDavid du Colombier XOR B,C,TMP1;\ 194*80ee5cbfSDavid du Colombier AND D,TMP1;\ 195*80ee5cbfSDavid du Colombier XOR C,TMP1;\ 196*80ee5cbfSDavid du Colombier 197*80ee5cbfSDavid du Colombier/* 198*80ee5cbfSDavid du Colombier * fn3 = b ^ c ^ d; 199*80ee5cbfSDavid du Colombier */ 200*80ee5cbfSDavid du Colombier#define FN3(B,C,D)\ 201*80ee5cbfSDavid du Colombier XOR B,C,TMP1;\ 202*80ee5cbfSDavid du Colombier XOR D,TMP1;\ 203*80ee5cbfSDavid du Colombier 204*80ee5cbfSDavid du Colombier/* 205*80ee5cbfSDavid du Colombier * fn4 = c ^ (b | ~d); 206*80ee5cbfSDavid du Colombier */ 207*80ee5cbfSDavid du Colombier#define FN4(B,C,D)\ 208*80ee5cbfSDavid du Colombier XOR $-1,D,TMP1;\ 209*80ee5cbfSDavid du Colombier OR B,TMP1;\ 210*80ee5cbfSDavid du Colombier XOR C,TMP1;\ 211*80ee5cbfSDavid du Colombier 212*80ee5cbfSDavid du Colombier#define DATA 0 213*80ee5cbfSDavid du Colombier#define LEN 4 214*80ee5cbfSDavid du Colombier#define STATE 8 215*80ee5cbfSDavid du Colombier 216*80ee5cbfSDavid du Colombier#define XOFF (-4-16*4) 217*80ee5cbfSDavid du Colombier 218*80ee5cbfSDavid du Colombier TEXT _md5block+0(SB),$68 219*80ee5cbfSDavid du Colombier 220*80ee5cbfSDavid du Colombier MOVW len+LEN(FP),TMP1 221*80ee5cbfSDavid du Colombier ADDU DATAREG,TMP1,EDREG 222*80ee5cbfSDavid du Colombier MOVW state+STATE(FP),STREG 223*80ee5cbfSDavid du Colombier 224*80ee5cbfSDavid du Colombier MOVW 0(STREG),AREG 225*80ee5cbfSDavid du Colombier MOVW 4(STREG),BREG 226*80ee5cbfSDavid du Colombier MOVW 8(STREG),CREG 227*80ee5cbfSDavid du Colombier MOVW 12(STREG),DREG 228*80ee5cbfSDavid du Colombier 229*80ee5cbfSDavid du Colombiermainloop: 230*80ee5cbfSDavid du Colombier 231*80ee5cbfSDavid du Colombier MOVW $md5tab<>+0(SB),TABREG 232*80ee5cbfSDavid du Colombier ADDU $(16*4),DATAREG,ELOOPREG 233*80ee5cbfSDavid du Colombier MOVW $x+XOFF(SP),XREG 234*80ee5cbfSDavid du Colombier 235*80ee5cbfSDavid du Colombierloop1: 236*80ee5cbfSDavid du Colombier BODY1(0,FN1,S11,AREG,BREG,CREG,DREG) 237*80ee5cbfSDavid du Colombier BODY1(4,FN1,S12,DREG,AREG,BREG,CREG) 238*80ee5cbfSDavid du Colombier BODY1(8,FN1,S13,CREG,DREG,AREG,BREG) 239*80ee5cbfSDavid du Colombier BODY1(12,FN1,S14,BREG,CREG,DREG,AREG) 240*80ee5cbfSDavid du Colombier 241*80ee5cbfSDavid du Colombier ADDU $16,DATAREG 242*80ee5cbfSDavid du Colombier ADDU $16,TABREG 243*80ee5cbfSDavid du Colombier ADDU $16,XREG 244*80ee5cbfSDavid du Colombier 245*80ee5cbfSDavid du Colombier BNE DATAREG,ELOOPREG,loop1 246*80ee5cbfSDavid du Colombier 247*80ee5cbfSDavid du Colombier 248*80ee5cbfSDavid du Colombier MOVW $x+XOFF(SP),XREG 249*80ee5cbfSDavid du Colombier MOVW $(1*4),IREG 250*80ee5cbfSDavid du Colombier MOVW $(1*4),ELOOPREG 251*80ee5cbfSDavid du Colombierloop2: 252*80ee5cbfSDavid du Colombier BODY(0,5,FN2,S21,AREG,BREG,CREG,DREG) 253*80ee5cbfSDavid du Colombier BODY(4,5,FN2,S22,DREG,AREG,BREG,CREG) 254*80ee5cbfSDavid du Colombier BODY(8,5,FN2,S23,CREG,DREG,AREG,BREG) 255*80ee5cbfSDavid du Colombier BODY(12,5,FN2,S24,BREG,CREG,DREG,AREG) 256*80ee5cbfSDavid du Colombier 257*80ee5cbfSDavid du Colombier ADDU $16,TABREG 258*80ee5cbfSDavid du Colombier 259*80ee5cbfSDavid du Colombier BNE IREG,ELOOPREG,loop2 260*80ee5cbfSDavid du Colombier 261*80ee5cbfSDavid du Colombier 262*80ee5cbfSDavid du Colombier MOVW $(5*4),IREG 263*80ee5cbfSDavid du Colombier MOVW $(5*4),ELOOPREG 264*80ee5cbfSDavid du Colombierloop3: 265*80ee5cbfSDavid du Colombier BODY(0,3,FN3,S31,AREG,BREG,CREG,DREG) 266*80ee5cbfSDavid du Colombier BODY(4,3,FN3,S32,DREG,AREG,BREG,CREG) 267*80ee5cbfSDavid du Colombier BODY(8,3,FN3,S33,CREG,DREG,AREG,BREG) 268*80ee5cbfSDavid du Colombier BODY(12,3,FN3,S34,BREG,CREG,DREG,AREG) 269*80ee5cbfSDavid du Colombier 270*80ee5cbfSDavid du Colombier ADDU $16,TABREG 271*80ee5cbfSDavid du Colombier 272*80ee5cbfSDavid du Colombier BNE IREG,ELOOPREG,loop3 273*80ee5cbfSDavid du Colombier 274*80ee5cbfSDavid du Colombier 275*80ee5cbfSDavid du Colombier MOVW $0,IREG 276*80ee5cbfSDavid du Colombierloop4: 277*80ee5cbfSDavid du Colombier BODY(0,7,FN4,S41,AREG,BREG,CREG,DREG) 278*80ee5cbfSDavid du Colombier BODY(4,7,FN4,S42,DREG,AREG,BREG,CREG) 279*80ee5cbfSDavid du Colombier BODY(8,7,FN4,S43,CREG,DREG,AREG,BREG) 280*80ee5cbfSDavid du Colombier BODY(12,7,FN4,S44,BREG,CREG,DREG,AREG) 281*80ee5cbfSDavid du Colombier 282*80ee5cbfSDavid du Colombier ADDU $16,TABREG 283*80ee5cbfSDavid du Colombier 284*80ee5cbfSDavid du Colombier BNE IREG,R0,loop4 285*80ee5cbfSDavid du Colombier 286*80ee5cbfSDavid du Colombier MOVW 0(STREG),TMP1 287*80ee5cbfSDavid du Colombier MOVW 4(STREG),TMP2 288*80ee5cbfSDavid du Colombier MOVW 8(STREG),TMP3 289*80ee5cbfSDavid du Colombier MOVW 12(STREG),TMP4 290*80ee5cbfSDavid du Colombier ADDU TMP1,AREG 291*80ee5cbfSDavid du Colombier ADDU TMP2,BREG 292*80ee5cbfSDavid du Colombier ADDU TMP3,CREG 293*80ee5cbfSDavid du Colombier ADDU TMP4,DREG 294*80ee5cbfSDavid du Colombier MOVW AREG,0(STREG) 295*80ee5cbfSDavid du Colombier MOVW BREG,4(STREG) 296*80ee5cbfSDavid du Colombier MOVW CREG,8(STREG) 297*80ee5cbfSDavid du Colombier MOVW DREG,12(STREG) 298*80ee5cbfSDavid du Colombier 299*80ee5cbfSDavid du Colombier BNE DATAREG,EDREG,mainloop 300*80ee5cbfSDavid du Colombier 301*80ee5cbfSDavid du Colombier RET 302*80ee5cbfSDavid du Colombier 303*80ee5cbfSDavid du Colombier GLOBL md5tab<>+0(SB),$256 304*80ee5cbfSDavid du Colombier 305*80ee5cbfSDavid du Colombier END 306