[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: 6502 ML programming




Howcum you guys are talking about computer code and stuff?
Are your browsers broken? Can't get QUAKE to boot?
Let me know if you need some help.
I know how to format my hard drive and reinstall Windows. I'm an expert.

AOL'er


Anonymous wrote:
> If you guys are still doing 6502 work, maybe you can make use of this.
> --
> 
> * RSA Data Security, Inc. MD5 Message-Digest Algorithm
> 
> *
> *  ***********************************************************************
> *  **  Message-digest routines:                                         **
> *  **  To form the message digest for a message M                       **
> *  **    (1) Initialize a context buffer mdContext using MD5Init        **
> *  **    (2) Call MD5Update on mdContext and M                          **
> *  **    (3) Call MD5Final on mdContext                                 **
> *  **  The message digest is now in the bugffer passed to MD5Final      **
> *  ***********************************************************************
> *
> 
>  ORG $2000
> 
> * Jump Table
>  JMP MD5INIT
>  JMP MD5UPD
>  JMP MD5FINAL
> 
> DIGEST HEX 00000000 ;Message digest ends up here.
>  HEX 00000000
>  HEX 00000000
>  HEX 00000000
> 
> MD5INITV HEX 01234567 ;MD5 initialization values
>  HEX 89ABCDEF
>  HEX FEDCBA98
>  HEX 76543210
> 
> MD5BYTES DS 8 ;Counts bytes in message digest so far
> 
> MD5BUFRP HEX 00 ;Pointer to current byte in partially full buffer
> 
> MD5BUFR DS 64 ;64-byte buffer for current MD5 block
> 
> * Initialize MD5 - start new message digest
> 
> MD5INIT LDX #15 ;Load initialization constants
> ]LOOP LDA MD5INITV,X
>  STA DIGEST,X
>  DEX
>  BPL ]LOOP
> 
>  LDA #0 ;Reset byte count to zero
>  LDX #7
> ]LOOP STA MD5BYTES,X
>  DEX
>  BPL ]LOOP
> 
>  STA MD5BUFRP ;Reset buffer to empty
> 
> ]RTS RTS
> 
> * MD5UPD - add a byte to the message digest
> 
> MD5UPD LDX MD5BUFRP
>  STA MD5BUFR,X
>  INX
>  STX MD5BUFRP
>  JSR INCBYTES
>  CPX #64
>  BCC ]RTS
>  LDX #0
>  STX MD5BUFRP
>  JSR MD5DOBLK
>  RTS
> 
> INCBYTES INC MD5BYTES
>  BNE ]RTS
>  INC MD5BYTES+1
>  BNE ]RTS
>  INC MD5BYTES+2
>  BNE ]RTS
> 
>  HEX 0000
> 
> * MD5FINAL - do last block and compute final digest
> 
> MD5FINAL LDA #$80
>  LDX MD5BUFRP
>  STA MD5BUFR,X
>  INX
>  STX MD5BUFRP
> ]LOOP CPX #64
>  BCC MD5FA
>  LDX #0
>  STX MD5BUFRP
>  JSR MD5DOBLK
> MD5FA LDX MD5BUFRP
>  LDA #0
>  STA MD5BUFR,X
>  INX
>  STX MD5BUFRP
>  CPX #56
>  BNE ]LOOP
> 
>  LDA MD5BYTES
>  STA MD5BUFR+56
>  LDA MD5BYTES+1
>  STA MD5BUFR+57
>  LDA MD5BYTES+2
>  STA MD5BUFR+58
>  LDA MD5BYTES+3
>  STA MD5BUFR+59
>  LDA MD5BYTES+4
>  STA MD5BUFR+60
>  LDA MD5BYTES+5
>  STA MD5BUFR+61
>  LDA MD5BYTES+6
>  STA MD5BUFR+62
>  LDA MD5BYTES+7
>  STA MD5BUFR+63
> 
>  LUP 3 ;Multiply times 8
>  LDA MD5BUFR+56 ; to convert number of bytes to number of bits
>  ASL
>  STA MD5BUFR+56
>  LDA MD5BUFR+57
>  ROL
>  STA MD5BUFR+57
>  LDA MD5BUFR+58
>  ROL
>  STA MD5BUFR+58
>  LDA MD5BUFR+59
>  ROL ;Unlikely the message would be over 500 MB
>  STA MD5BUFR+59 ;so we can stop here...
>  --^
> 
>  JSR MD5DOBLK
>  RTS
> 
> MD5TEMPB DS 16 ;Temporary buffer for a,b,c,d
> MD5TEMPV DS 4 ;Temporary 32-bit word storage (used by MD5DOBLK)
> MD5TEMP2 DS 4 ;Temporary 32-bit variable #2 (used by F,G,H,I fcns)
> 
> * Block transformation
> 
> MD5DOBLK LDX #15 ;Copy values into temp buffer
> ]LOOP LDA DIGEST,X
>  STA MD5TEMPB,X
>  DEX
>  BPL ]LOOP
> 
>  LDA #0
>  STA MD5TP
> 
> * Round 1 : F-functions
> *           a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
> 
>  JSR MD5LOADA ;1  (a,b,c,d)
>  JSR F_BCD
>  JSR NEXT_T ;(D76AA478)
>  LDA #0
>  JSR MD5ADDX
>  JSR MD5RL7 ;Rotate Left 7
>  JSR MD5ADDB
>  JSR MD5STORA
> 
>  JSR MD5LOADD ;2  (d,a,b,c)
>  JSR F_ABC
>  JSR NEXT_T ;(E8C7B756)
>  LDA #1
>  JSR MD5ADDX
>  JSR MD5RL12 ;Rotate Left 12
>  JSR MD5ADDA
>  JSR MD5STORD
> 
>  JSR MD5LOADC ;3  (c,d,a,b)
>  JSR F_DAB
>  JSR NEXT_T
>  LDA #2
>  JSR MD5ADDX
>  JSR MD5RL17 ;Rotate left 17
>  JSR MD5ADDD
>  JSR MD5STORC
> 
>  JSR MD5LOADB ;4  (b,c,d,a)
>  JSR F_CDA
>  JSR NEXT_T
>  LDA #3
>  JSR MD5ADDX
>  JSR MD5RL22 ;Rotate left 22
>  JSR MD5ADDC
>  JSR MD5STORB
> 
>  JSR MD5LOADA ;5  (a,b,c,d)
>  JSR F_BCD
>  JSR NEXT_T
>  LDA #4
>  JSR MD5ADDX
>  JSR MD5RL7 ;<<7
>  JSR MD5ADDB
>  JSR MD5STORA
> 
>  JSR MD5LOADD ;6  (d,a,b,c)
>  JSR F_ABC
>  JSR NEXT_T
>  LDA #5
>  JSR MD5ADDX
>  JSR MD5RL12 ;<<12
>  JSR MD5ADDA
>  JSR MD5STORD
> 
>  JSR MD5LOADC ;7  (c,d,a,b)
>  JSR F_DAB
>  JSR NEXT_T
>  LDA #6
>  JSR MD5ADDX
>  JSR MD5RL17 ;<<17
>  JSR MD5ADDD
>  JSR MD5STORC
> 
>  JSR MD5LOADB ;8  (b,c,d,a)
>  JSR F_CDA
>  JSR NEXT_T
>  LDA #7
>  JSR MD5ADDX
>  JSR MD5RL22 ;<<22
>  JSR MD5ADDC
>  JSR MD5STORB
> 
>  JSR MD5LOADA ;9  (a,b,c,d)
>  JSR F_BCD
>  JSR NEXT_T
>  LDA #8
>  JSR MD5ADDX
>  JSR MD5RL7
>  JSR MD5ADDB
>  JSR MD5STORA
> 
>  JSR MD5LOADD ;10  (d,a,b,c)
>  JSR F_ABC
>  JSR NEXT_T
>  LDA #9
>  JSR MD5ADDX
>  JSR MD5RL12
>  JSR MD5ADDA
>  JSR MD5STORD
> 
>  JSR MD5LOADC ;11  (c,d,a,b)
>  JSR F_DAB
>  JSR NEXT_T
>  LDA #10
>  JSR MD5ADDX
>  JSR MD5RL17
>  JSR MD5ADDD
>  JSR MD5STORC
> 
>  JSR MD5LOADB ;12  (b,c,d,a)
>  JSR F_CDA
>  JSR NEXT_T
>  LDA #11
>  JSR MD5ADDX
>  JSR MD5RL22
>  JSR MD5ADDC
>  JSR MD5STORB
> 
>  JSR MD5LOADA ;13  (a,b,c,d)
>  JSR F_BCD
>  JSR NEXT_T
>  LDA #12
>  JSR MD5ADDX
>  JSR MD5RL7
>  JSR MD5ADDB
>  JSR MD5STORA
> 
>  JSR MD5LOADD ;14  (d,a,b,c)
>  JSR F_ABC
>  JSR NEXT_T
>  LDA #13
>  JSR MD5ADDX
>  JSR MD5RL12
>  JSR MD5ADDA
>  JSR MD5STORD
> 
>  JSR MD5LOADC ;15  (c,d,a,b)
>  JSR F_DAB
>  JSR NEXT_T
>  LDA #14
>  JSR MD5ADDX
>  JSR MD5RL17
>  JSR MD5ADDD
>  JSR MD5STORC
> 
>  JSR MD5LOADB ;16  (b,c,d,a)
>  JSR F_CDA
>  JSR NEXT_T
>  LDA #15
>  JSR MD5ADDX
>  JSR MD5RL22
>  JSR MD5ADDC
>  JSR MD5STORB
> 
> * Round 2 : G-functions
> *           a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
> 
>  JSR MD5LOADA ;17  (a,b,c,d)
>  JSR G_BCD
>  JSR NEXT_T
>  LDA #1
>  JSR MD5ADDX
>  JSR MD5RL5 ;Rotate Left 5
>  JSR MD5ADDB
>  JSR MD5STORA
> 
>  JSR MD5LOADD ;18  (d,a,b,c)
>  JSR G_ABC
>  JSR NEXT_T
>  LDA #6
>  JSR MD5ADDX
>  JSR MD5RL9 ;Rotate Left 9
>  JSR MD5ADDA
>  JSR MD5STORD
> 
>  JSR MD5LOADC ;19  (c,d,a,b)
>  JSR G_DAB
>  JSR NEXT_T
>  LDA #11
>  JSR MD5ADDX
>  JSR MD5RL14 ;Rotate left 14
>  JSR MD5ADDD
>  JSR MD5STORC
> 
>  JSR MD5LOADB ;20  (b,c,d,a)
>  JSR G_CDA
>  JSR NEXT_T
>  LDA #0
>  JSR MD5ADDX
>  JSR MD5RL20 ;Rotate left 20
>  JSR MD5ADDC
>  JSR MD5STORB
> 
>  JSR MD5LOADA ;21  (a,b,c,d)
>  JSR G_BCD
>  JSR NEXT_T
>  LDA #5
>  JSR MD5ADDX
>  JSR MD5RL5
>  JSR MD5ADDB
>  JSR MD5STORA
> 
>  JSR MD5LOADD ;22  (d,a,b,c)
>  JSR G_ABC
>  JSR NEXT_T
>  LDA #10
>  JSR MD5ADDX
>  JSR MD5RL9
>  JSR MD5ADDA
>  JSR MD5STORD
> 
>  JSR MD5LOADC ;23  (c,d,a,b)
>  JSR G_DAB
>  JSR NEXT_T
>  LDA #15
>  JSR MD5ADDX
>  JSR MD5RL14
>  JSR MD5ADDD
>  JSR MD5STORC
> 
>  JSR MD5LOADB ;24  (b,c,d,a)
>  JSR G_CDA
>  JSR NEXT_T
>  LDA #4
>  JSR MD5ADDX
>  JSR MD5RL20
>  JSR MD5ADDC
>  JSR MD5STORB
> 
>  JSR MD5LOADA ;25  (a,b,c,d)
>  JSR G_BCD
>  JSR NEXT_T
>  LDA #9
>  JSR MD5ADDX
>  JSR MD5RL5
>  JSR MD5ADDB
>  JSR MD5STORA
> 
>  JSR MD5LOADD ;26  (d,a,b,c)
>  JSR G_ABC
>  JSR NEXT_T
>  LDA #14
>  JSR MD5ADDX
>  JSR MD5RL9
>  JSR MD5ADDA
>  JSR MD5STORD
> 
>  JSR MD5LOADC ;27  (c,d,a,b)
>  JSR G_DAB
>  JSR NEXT_T
>  LDA #3
>  JSR MD5ADDX
>  JSR MD5RL14
>  JSR MD5ADDD
>  JSR MD5STORC
> 
>  JSR MD5LOADB ;28  (b,c,d,a)
>  JSR G_CDA
>  JSR NEXT_T
>  LDA #8
>  JSR MD5ADDX
>  JSR MD5RL20
>  JSR MD5ADDC
>  JSR MD5STORB
> 
>  JSR MD5LOADA ;29  (a,b,c,d)
>  JSR G_BCD
>  JSR NEXT_T
>  LDA #13
>  JSR MD5ADDX
>  JSR MD5RL5
>  JSR MD5ADDB
>  JSR MD5STORA
> 
>  JSR MD5LOADD ;30  (d,a,b,c)
>  JSR G_ABC
>  JSR NEXT_T
>  LDA #2
>  JSR MD5ADDX
>  JSR MD5RL9
>  JSR MD5ADDA
>  JSR MD5STORD
> 
>  JSR MD5LOADC ;31  (c,d,a,b)
>  JSR G_DAB
>  JSR NEXT_T
>  LDA #7
>  JSR MD5ADDX
>  JSR MD5RL14
>  JSR MD5ADDD
>  JSR MD5STORC
> 
>  JSR MD5LOADB ;32  (b,c,d,a)
>  JSR G_CDA
>  JSR NEXT_T
>  LDA #12
>  JSR MD5ADDX
>  JSR MD5RL20
>  JSR MD5ADDC
>  JSR MD5STORB
> 
> * Round 3 : H-functions
> *          a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
> 
>  JSR MD5LOADA ;33  (a,b,c,d)
>  JSR H_BCD
>  JSR NEXT_T
>  LDA #5
>  JSR MD5ADDX
>  JSR MD5RL4 ;Rotate Left 4
>  JSR MD5ADDB
>  JSR MD5STORA
> 
>  JSR MD5LOADD ;34  (d,a,b,c)
>  JSR H_ABC
>  JSR NEXT_T
>  LDA #8
>  JSR MD5ADDX
>  JSR MD5RL11 ;Rotate Left 11
>  JSR MD5ADDA
>  JSR MD5STORD
> 
>  JSR MD5LOADC ;35  (c,d,a,b)
>  JSR H_DAB
>  JSR NEXT_T
>  LDA #11
>  JSR MD5ADDX
>  JSR MD5RL16 ;Rotate left 16
>  JSR MD5ADDD
>  JSR MD5STORC
> 
>  JSR MD5LOADB ;36  (b,c,d,a)
>  JSR H_CDA
>  JSR NEXT_T
>  LDA #14
>  JSR MD5ADDX
>  JSR MD5RL23 ;Rotate left 23
>  JSR MD5ADDC
>  JSR MD5STORB
> 
>  JSR MD5LOADA ;37  (a,b,c,d)
>  JSR H_BCD
>  JSR NEXT_T
>  LDA #1
>  JSR MD5ADDX
>  JSR MD5RL4
>  JSR MD5ADDB
>  JSR MD5STORA
> 
>  JSR MD5LOADD ;38  (d,a,b,c)
>  JSR H_ABC
>  JSR NEXT_T
>  LDA #4
>  JSR MD5ADDX
>  JSR MD5RL11
>  JSR MD5ADDA
>  JSR MD5STORD
> 
>  JSR MD5LOADC ;39  (c,d,a,b)
>  JSR H_DAB
>  JSR NEXT_T
>  LDA #7
>  JSR MD5ADDX
>  JSR MD5RL16
>  JSR MD5ADDD
>  JSR MD5STORC
> 
>  JSR MD5LOADB ;40  (b,c,d,a)
>  JSR H_CDA
>  JSR NEXT_T
>  LDA #10
>  JSR MD5ADDX
>  JSR MD5RL23
>  JSR MD5ADDC
>  JSR MD5STORB
> 
>  JSR MD5LOADA ;41  (a,b,c,d)
>  JSR H_BCD
>  JSR NEXT_T
>  LDA #13
>  JSR MD5ADDX
>  JSR MD5RL4
>  JSR MD5ADDB
>  JSR MD5STORA
> 
>  JSR MD5LOADD ;42  (d,a,b,c)
>  JSR H_ABC
>  JSR NEXT_T
>  LDA #0
>  JSR MD5ADDX
>  JSR MD5RL11
>  JSR MD5ADDA
>  JSR MD5STORD
> 
>  JSR MD5LOADC ;43  (c,d,a,b)
>  JSR H_DAB
>  JSR NEXT_T
>  LDA #3
>  JSR MD5ADDX
>  JSR MD5RL16
>  JSR MD5ADDD
>  JSR MD5STORC
> 
>  JSR MD5LOADB ;44  (b,c,d,a)
>  JSR H_CDA
>  JSR NEXT_T
>  LDA #6
>  JSR MD5ADDX
>  JSR MD5RL23
>  JSR MD5ADDC
>  JSR MD5STORB
> 
>  JSR MD5LOADA ;45  (a,b,c,d)
>  JSR H_BCD
>  JSR NEXT_T
>  LDA #9
>  JSR MD5ADDX
>  JSR MD5RL4
>  JSR MD5ADDB
>  JSR MD5STORA
> 
>  JSR MD5LOADD ;46  (d,a,b,c)
>  JSR H_ABC
>  JSR NEXT_T
>  LDA #12
>  JSR MD5ADDX
>  JSR MD5RL11
>  JSR MD5ADDA
>  JSR MD5STORD
> 
>  JSR MD5LOADC ;47  (c,d,a,b)
>  JSR H_DAB
>  JSR NEXT_T
>  LDA #15
>  JSR MD5ADDX
>  JSR MD5RL16
>  JSR MD5ADDD
>  JSR MD5STORC
> 
>  JSR MD5LOADB ;48  (b,c,d,a)
>  JSR H_CDA
>  JSR NEXT_T
>  LDA #2
>  JSR MD5ADDX
>  JSR MD5RL23
>  JSR MD5ADDC
>  JSR MD5STORB
> 
> * Round 4 : I-functions
> *          a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
> 
>  JSR MD5LOADA ;49  (a,b,c,d)
>  JSR I_BCD
>  JSR NEXT_T
>  LDA #0
>  JSR MD5ADDX
>  JSR MD5RL6 ;Rotate Left 6
>  JSR MD5ADDB
>  JSR MD5STORA
> 
>  JSR MD5LOADD ;50  (d,a,b,c)
>  JSR I_ABC
>  JSR NEXT_T
>  LDA #7
>  JSR MD5ADDX
>  JSR MD5RL10 ;Rotate Left 10
>  JSR MD5ADDA
>  JSR MD5STORD
> 
>  JSR MD5LOADC ;51  (c,d,a,b)
>  JSR I_DAB
>  JSR NEXT_T
>  LDA #14
>  JSR MD5ADDX
>  JSR MD5RL15 ;Rotate left 15
>  JSR MD5ADDD
>  JSR MD5STORC
> 
>  JSR MD5LOADB ;52  (b,c,d,a)
>  JSR I_CDA
>  JSR NEXT_T
>  LDA #5
>  JSR MD5ADDX
>  JSR MD5RL21 ;Rotate left 21
>  JSR MD5ADDC
>  JSR MD5STORB
> 
>  JSR MD5LOADA ;53  (a,b,c,d)
>  JSR I_BCD
>  JSR NEXT_T
>  LDA #12
>  JSR MD5ADDX
>  JSR MD5RL6
>  JSR MD5ADDB
>  JSR MD5STORA
> 
>  JSR MD5LOADD ;54  (d,a,b,c)
>  JSR I_ABC
>  JSR NEXT_T
>  LDA #3
>  JSR MD5ADDX
>  JSR MD5RL10
>  JSR MD5ADDA
>  JSR MD5STORD
> 
>  JSR MD5LOADC ;55  (c,d,a,b)
>  JSR I_DAB
>  JSR NEXT_T
>  LDA #10
>  JSR MD5ADDX
>  JSR MD5RL15
>  JSR MD5ADDD
>  JSR MD5STORC
> 
>  JSR MD5LOADB ;56  (b,c,d,a)
>  JSR I_CDA
>  JSR NEXT_T
>  LDA #1
>  JSR MD5ADDX
>  JSR MD5RL21
>  JSR MD5ADDC
>  JSR MD5STORB
> 
>  JSR MD5LOADA ;57  (a,b,c,d)
>  JSR I_BCD
>  JSR NEXT_T
>  LDA #8
>  JSR MD5ADDX
>  JSR MD5RL6
>  JSR MD5ADDB
>  JSR MD5STORA
> 
>  JSR MD5LOADD ;58  (d,a,b,c)
>  JSR I_ABC
>  JSR NEXT_T
>  LDA #15
>  JSR MD5ADDX
>  JSR MD5RL10
>  JSR MD5ADDA
>  JSR MD5STORD
> 
>  JSR MD5LOADC ;59  (c,d,a,b)
>  JSR I_DAB
>  JSR NEXT_T
>  LDA #6
>  JSR MD5ADDX
>  JSR MD5RL15
>  JSR MD5ADDD
>  JSR MD5STORC
> 
>  JSR MD5LOADB ;60  (b,c,d,a)
>  JSR I_CDA
>  JSR NEXT_T
>  LDA #13
>  JSR MD5ADDX
>  JSR MD5RL21
>  JSR MD5ADDC
>  JSR MD5STORB
> 
>  JSR MD5LOADA ;61  (a,b,c,d)
>  JSR I_BCD
>  JSR NEXT_T
>  LDA #4
>  JSR MD5ADDX
>  JSR MD5RL6
>  JSR MD5ADDB
>  JSR MD5STORA
> 
>  JSR MD5LOADD ;62  (d,a,b,c)
>  JSR I_ABC
>  JSR NEXT_T
>  LDA #11
>  JSR MD5ADDX
>  JSR MD5RL10
>  JSR MD5ADDA
>  JSR MD5STORD
> 
>  JSR MD5LOADC ;63  (c,d,a,b)
>  JSR I_DAB
>  JSR NEXT_T
>  LDA #2
>  JSR MD5ADDX
>  JSR MD5RL15
>  JSR MD5ADDD
>  JSR MD5STORC
> 
>  JSR MD5LOADB ;64  (b,c,d,a)
>  JSR I_CDA
>  JSR NEXT_T
>  LDA #9
>  JSR MD5ADDX
>  JSR MD5RL21
>  JSR MD5ADDC
>  JSR MD5STORB
> 
> * Add value to previous digest.
> * Note that this is four seperate 32-bit additions
> 
>  CLC
>  LDA MD5TEMPB
>  ADC DIGEST
>  STA DIGEST
>  LDA MD5TEMPB+1
>  ADC DIGEST+1
>  STA DIGEST+1
>  LDA MD5TEMPB+2
>  ADC DIGEST+2
>  STA DIGEST+2
>  LDA MD5TEMPB+3
>  ADC DIGEST+3
>  STA DIGEST+3
>  CLC
>  LDA MD5TEMPB+4
>  ADC DIGEST+4
>  STA DIGEST+4
>  LDA MD5TEMPB+5
>  ADC DIGEST+5
>  STA DIGEST+5
>  LDA MD5TEMPB+6
>  ADC DIGEST+6
>  STA DIGEST+6
>  LDA MD5TEMPB+7
>  ADC DIGEST+7
>  STA DIGEST+7
>  CLC
>  LDA MD5TEMPB+8
>  ADC DIGEST+8
>  STA DIGEST+8
>  LDA MD5TEMPB+9
>  ADC DIGEST+9
>  STA DIGEST+9
>  LDA MD5TEMPB+10
>  ADC DIGEST+10
>  STA DIGEST+10
>  LDA MD5TEMPB+11
>  ADC DIGEST+11
>  STA DIGEST+11
>  CLC
>  LDA MD5TEMPB+12
>  ADC DIGEST+12
>  STA DIGEST+12
>  LDA MD5TEMPB+13
>  ADC DIGEST+13
>  STA DIGEST+13
>  LDA MD5TEMPB+14
>  ADC DIGEST+14
>  STA DIGEST+14
>  LDA MD5TEMPB+15
>  ADC DIGEST+15
>  STA DIGEST+15
> 
>  RTS
> 
> * Basic MD5 functions
> 
> MD5LOADA LDA MD5TEMPB ;Put 'A' into temp variable
>  STA MD5TEMPV
>  LDA MD5TEMPB+1
>  STA MD5TEMPV+1
>  LDA MD5TEMPB+2
>  STA MD5TEMPV+2
>  LDA MD5TEMPB+3
>  STA MD5TEMPV+3
>  RTS
> 
> MD5LOADB LDA MD5TEMPB+4 ;Put 'B' into temp variable
>  STA MD5TEMPV
>  LDA MD5TEMPB+5
>  STA MD5TEMPV+1
>  LDA MD5TEMPB+6
>  STA MD5TEMPV+2
>  LDA MD5TEMPB+7
>  STA MD5TEMPV+3
>  RTS
> 
> MD5LOADC LDA MD5TEMPB+8 ;Put 'C' into temp variable
>  STA MD5TEMPV
>  LDA MD5TEMPB+9
>  STA MD5TEMPV+1
>  LDA MD5TEMPB+10
>  STA MD5TEMPV+2
>  LDA MD5TEMPB+11
>  STA MD5TEMPV+3
>  RTS
> 
> MD5LOADD LDA MD5TEMPB+12 ;Put 'D' into temp variable
>  STA MD5TEMPV
>  LDA MD5TEMPB+13
>  STA MD5TEMPV+1
>  LDA MD5TEMPB+14
>  STA MD5TEMPV+2
>  LDA MD5TEMPB+15
>  STA MD5TEMPV+3
>  RTS
> 
> MD5STORA LDA MD5TEMPV ;Store temp variable into 'A' in temp buffer
>  STA MD5TEMPB
>  LDA MD5TEMPV+1
>  STA MD5TEMPB+1
>  LDA MD5TEMPV+2
>  STA MD5TEMPB+2
>  LDA MD5TEMPV+3
>  STA MD5TEMPB+3
>  RTS
> 
> MD5STORB LDA MD5TEMPV ;Store temp variable into 'B'
>  STA MD5TEMPB+4
>  LDA MD5TEMPV+1
>  STA MD5TEMPB+5
>  LDA MD5TEMPV+2
>  STA MD5TEMPB+6
>  LDA MD5TEMPV+3
>  STA MD5TEMPB+7
>  RTS
> 
> MD5STORC LDA MD5TEMPV ;Store temp variable into 'C'
>  STA MD5TEMPB+8
>  LDA MD5TEMPV+1
>  STA MD5TEMPB+9
>  LDA MD5TEMPV+2
>  STA MD5TEMPB+10
>  LDA MD5TEMPV+3
>  STA MD5TEMPB+11
>  RTS
> 
> MD5STORD LDA MD5TEMPV ;Store temp variable into 'D'
>  STA MD5TEMPB+12
>  LDA MD5TEMPV+1
>  STA MD5TEMPB+13
>  LDA MD5TEMPV+2
>  STA MD5TEMPB+14
>  LDA MD5TEMPV+3
>  STA MD5TEMPB+15
>  RTS
> 
> MD5ADDA CLC ;Add 'A' to temp variable
>  LDA MD5TEMPB
>  ADC MD5TEMPV
>  STA MD5TEMPV
>  LDA MD5TEMPB+1
>  ADC MD5TEMPV+1
>  STA MD5TEMPV+1
>  LDA MD5TEMPB+2
>  ADC MD5TEMPV+2
>  STA MD5TEMPV+2
>  LDA MD5TEMPB+3
>  ADC MD5TEMPV+3
>  STA MD5TEMPV+3
>  RTS
> 
> MD5ADDB CLC ;Add 'B' to temp variable
>  LDA MD5TEMPB+4
>  ADC MD5TEMPV
>  STA MD5TEMPV
>  LDA MD5TEMPB+5
>  ADC MD5TEMPV+1
>  STA MD5TEMPV+1
>  LDA MD5TEMPB+6
>  ADC MD5TEMPV+2
>  STA MD5TEMPV+2
>  LDA MD5TEMPB+7
>  ADC MD5TEMPV+3
>  STA MD5TEMPV+3
>  RTS
> 
> MD5ADDC CLC ;Add 'C' to temp variable
>  LDA MD5TEMPB+8
>  ADC MD5TEMPV
>  STA MD5TEMPV
>  LDA MD5TEMPB+9
>  ADC MD5TEMPV+1
>  STA MD5TEMPV+1
>  LDA MD5TEMPB+10
>  ADC MD5TEMPV+2
>  STA MD5TEMPV+2
>  LDA MD5TEMPB+11
>  ADC MD5TEMPV+3
>  STA MD5TEMPV+3
>  RTS
> 
> MD5ADDD CLC ;Add 'D' to temp variable
>  LDA MD5TEMPB+12
>  ADC MD5TEMPV
>  STA MD5TEMPV
>  LDA MD5TEMPB+13
>  ADC MD5TEMPV+1
>  STA MD5TEMPV+1
>  LDA MD5TEMPB+14
>  ADC MD5TEMPV+2
>  STA MD5TEMPV+2
>  LDA MD5TEMPB+15
>  ADC MD5TEMPV+3
>  STA MD5TEMPV+3
>  RTS
> 
> * F function:
> *          F(X,Y,Z) = XY v not(X) Z
> 
> F_BCD LDA MD5TEMPB+4 ;B&C
>  AND MD5TEMPB+8
>  STA MD5TEMP2
>  LDA MD5TEMPB+5
>  AND MD5TEMPB+9
>  STA MD5TEMP2+1
>  LDA MD5TEMPB+6
>  AND MD5TEMPB+10
>  STA MD5TEMP2+2
>  LDA MD5TEMPB+7
>  AND MD5TEMPB+11
>  STA MD5TEMP2+3
>  CLC ;not(B)&D or (previous) -> MD5TEMPV+=
>  LDA MD5TEMPB+4
>  EOR #$FF
>  AND MD5TEMPB+12
>  ORA MD5TEMP2
>  ADC MD5TEMPV
>  STA MD5TEMPV
>  LDA MD5TEMPB+5 ;
>  EOR #$FF
>  AND MD5TEMPB+13
>  ORA MD5TEMP2+1
>  ADC MD5TEMPV+1
>  STA MD5TEMPV+1
>  LDA MD5TEMPB+6 ;
>  EOR #$FF
>  AND MD5TEMPB+14
>  ORA MD5TEMP2+2
>  ADC MD5TEMPV+2
>  STA MD5TEMPV+2
>  LDA MD5TEMPB+7 ;
>  EOR #$FF
>  AND MD5TEMPB+15
>  ORA MD5TEMP2+3
>  ADC MD5TEMPV+3
>  STA MD5TEMPV+3
>  RTS
> 
> F_ABC LDA MD5TEMPB ;A&B
>  AND MD5TEMPB+4
>  STA MD5TEMP2
>  LDA MD5TEMPB+1
>  AND MD5TEMPB+5
>  STA MD5TEMP2+1
>  LDA MD5TEMPB+2
>  AND MD5TEMPB+6
>  STA MD5TEMP2+2
>  LDA MD5TEMPB+3
>  AND MD5TEMPB+7
>  STA MD5TEMP2+3
>  CLC ;not(A)&C or (previous) -> MD5TEMPV+=
>  LDA MD5TEMPB
>  EOR #$FF
>  AND MD5TEMPB+8
>  ORA MD5TEMP2
>  ADC MD5TEMPV
>  STA MD5TEMPV
>  LDA MD5TEMPB+1 ;
>  EOR #$FF
>  AND MD5TEMPB+9
>  ORA MD5TEMP2+1
>  ADC MD5TEMPV+1
>  STA MD5TEMPV+1
>  LDA MD5TEMPB+2 ;
>  EOR #$FF
>  AND MD5TEMPB+10
>  ORA MD5TEMP2+2
>  ADC MD5TEMPV+2
>  STA MD5TEMPV+2
>  LDA MD5TEMPB+3 ;
>  EOR #$FF
>  AND MD5TEMPB+11
>  ORA MD5TEMP2+3
>  ADC MD5TEMPV+3
>  STA MD5TEMPV+3
>  RTS
> 
> F_DAB LDA MD5TEMPB+12 ;D&A
>  AND MD5TEMPB
>  STA MD5TEMP2
>  LDA MD5TEMPB+13
>  AND MD5TEMPB+1
>  STA MD5TEMP2+1
>  LDA MD5TEMPB+14
>  AND MD5TEMPB+2
>  STA MD5TEMP2+2
>  LDA MD5TEMPB+15
>  AND MD5TEMPB+3
>  STA MD5TEMP2+3
>  CLC ;not(D)&B or (previous) -> MD5TEMPV+=
>  LDA MD5TEMPB+12
>  EOR #$FF
>  AND MD5TEMPB+4
>  ORA MD5TEMP2
>  ADC MD5TEMPV
>  STA MD5TEMPV
>  LDA MD5TEMPB+13 ;
>  EOR #$FF
>  AND MD5TEMPB+5
>  ORA MD5TEMP2+1
>  ADC MD5TEMPV+1
>  STA MD5TEMPV+1
>  LDA MD5TEMPB+14 ;
>  EOR #$FF
>  AND MD5TEMPB+6
>  ORA MD5TEMP2+2
>  ADC MD5TEMPV+2
>  STA MD5TEMPV+2
>  LDA MD5TEMPB+15 ;
>  EOR #$FF
>  AND MD5TEMPB+7
>  ORA MD5TEMP2+3
>  ADC MD5TEMPV+3
>  STA MD5TEMPV+3
>  RTS
> 
> F_CDA LDA MD5TEMPB+8 ;C&D
>  AND MD5TEMPB+12
>  STA MD5TEMP2
>  LDA MD5TEMPB+9
>  AND MD5TEMPB+13
>  STA MD5TEMP2+1
>  LDA MD5TEMPB+10
>  AND MD5TEMPB+14
>  STA MD5TEMP2+2
>  LDA MD5TEMPB+11
>  AND MD5TEMPB+15
>  STA MD5TEMP2+3
>  CLC ;not(C)&A or (previous) -> MD5TEMPV+=
>  LDA MD5TEMPB+8
>  EOR #$FF
>  AND MD5TEMPB
>  ORA MD5TEMP2
>  ADC MD5TEMPV
>  STA MD5TEMPV
>  LDA MD5TEMPB+9 ;
>  EOR #$FF
>  AND MD5TEMPB+1
>  ORA MD5TEMP2+1
>  ADC MD5TEMPV+1
>  STA MD5TEMPV+1
>  LDA MD5TEMPB+10 ;
>  EOR #$FF
>  AND MD5TEMPB+2
>  ORA MD5TEMP2+2
>  ADC MD5TEMPV+2
>  STA MD5TEMPV+2
>  LDA MD5TEMPB+11 ;
>  EOR #$FF
>  AND MD5TEMPB+3
>  ORA MD5TEMP2+3
>  ADC MD5TEMPV+3
>  STA MD5TEMPV+3
>  RTS
> 
> * G Function:
> *          G(X,Y,Z) = XZ v Y not(Z)
> 
> G_BCD LDA MD5TEMPB+4 ;B&D
>  AND MD5TEMPB+12
>  STA MD5TEMP2
>  LDA MD5TEMPB+5
>  AND MD5TEMPB+13
>  STA MD5TEMP2+1
>  LDA MD5TEMPB+6
>  AND MD5TEMPB+14
>  STA MD5TEMP2+2
>  LDA MD5TEMPB+7
>  AND MD5TEMPB+15
>  STA MD5TEMP2+3
>  CLC ;not(D)&C or (previous) -> MD5TEMPV+=
>  LDA MD5TEMPB+12
>  EOR #$FF
>  AND MD5TEMPB+8
>  ORA MD5TEMP2
>  ADC MD5TEMPV
>  STA MD5TEMPV
>  LDA MD5TEMPB+13 ;
>  EOR #$FF
>  AND MD5TEMPB+9
>  ORA MD5TEMP2+1
>  ADC MD5TEMPV+1
>  STA MD5TEMPV+1
>  LDA MD5TEMPB+14 ;
>  EOR #$FF
>  AND MD5TEMPB+10
>  ORA MD5TEMP2+2
>  ADC MD5TEMPV+2
>  STA MD5TEMPV+2
>  LDA MD5TEMPB+15 ;
>  EOR #$FF
>  AND MD5TEMPB+11
>  ORA MD5TEMP2+3
>  ADC MD5TEMPV+3
>  STA MD5TEMPV+3
>  RTS
> 
> G_ABC LDA MD5TEMPB ;A&C
>  AND MD5TEMPB+8
>  STA MD5TEMP2
>  LDA MD5TEMPB+1
>  AND MD5TEMPB+9
>  STA MD5TEMP2+1
>  LDA MD5TEMPB+2
>  AND MD5TEMPB+10
>  STA MD5TEMP2+2
>  LDA MD5TEMPB+3
>  AND MD5TEMPB+11
>  STA MD5TEMP2+3
>  CLC ;not(C)&B or (previous) -> MD5TEMPV+=
>  LDA MD5TEMPB+8
>  EOR #$FF
>  AND MD5TEMPB+4
>  ORA MD5TEMP2
>  ADC MD5TEMPV
>  STA MD5TEMPV
>  LDA MD5TEMPB+9 ;
>  EOR #$FF
>  AND MD5TEMPB+5
>  ORA MD5TEMP2+1
>  ADC MD5TEMPV+1
>  STA MD5TEMPV+1
>  LDA MD5TEMPB+10 ;
>  EOR #$FF
>  AND MD5TEMPB+6
>  ORA MD5TEMP2+2
>  ADC MD5TEMPV+2
>  STA MD5TEMPV+2
>  LDA MD5TEMPB+11 ;
>  EOR #$FF
>  AND MD5TEMPB+7
>  ORA MD5TEMP2+3
>  ADC MD5TEMPV+3
>  STA MD5TEMPV+3
>  RTS
> 
> G_DAB LDA MD5TEMPB+4 ;B&D
>  AND MD5TEMPB+12
>  STA MD5TEMP2
>  LDA MD5TEMPB+5
>  AND MD5TEMPB+13
>  STA MD5TEMP2+1
>  LDA MD5TEMPB+6
>  AND MD5TEMPB+14
>  STA MD5TEMP2+2
>  LDA MD5TEMPB+7
>  AND MD5TEMPB+15
>  STA MD5TEMP2+3
>  CLC ;not(B)&A or (previous) -> MD5TEMPV+=
>  LDA MD5TEMPB+4
>  EOR #$FF
>  AND MD5TEMPB
>  ORA MD5TEMP2
>  ADC MD5TEMPV
>  STA MD5TEMPV
>  LDA MD5TEMPB+5 ;
>  EOR #$FF
>  AND MD5TEMPB+1
>  ORA MD5TEMP2+1
>  ADC MD5TEMPV+1
>  STA MD5TEMPV+1
>  LDA MD5TEMPB+6 ;
>  EOR #$FF
>  AND MD5TEMPB+2
>  ORA MD5TEMP2+2
>  ADC MD5TEMPV+2
>  STA MD5TEMPV+2
>  LDA MD5TEMPB+7 ;
>  EOR #$FF
>  AND MD5TEMPB+3
>  ORA MD5TEMP2+3
>  ADC MD5TEMPV+3
>  STA MD5TEMPV+3
>  RTS
> 
> G_CDA LDA MD5TEMPB ;C&A
>  AND MD5TEMPB+8
>  STA MD5TEMP2
>  LDA MD5TEMPB+1
>  AND MD5TEMPB+9
>  STA MD5TEMP2+1
>  LDA MD5TEMPB+2
>  AND MD5TEMPB+10
>  STA MD5TEMP2+2
>  LDA MD5TEMPB+3
>  AND MD5TEMPB+11
>  STA MD5TEMP2+3
>  CLC ;not(A)&D or (previous) -> MD5TEMPV+=
>  LDA MD5TEMPB
>  EOR #$FF
>  AND MD5TEMPB+12
>  ORA MD5TEMP2
>  ADC MD5TEMPV
>  STA MD5TEMPV
>  LDA MD5TEMPB+1 ;
>  EOR #$FF
>  AND MD5TEMPB+13
>  ORA MD5TEMP2+1
>  ADC MD5TEMPV+1
>  STA MD5TEMPV+1
>  LDA MD5TEMPB+2 ;
>  EOR #$FF
>  AND MD5TEMPB+14
>  ORA MD5TEMP2+2
>  ADC MD5TEMPV+2
>  STA MD5TEMPV+2
>  LDA MD5TEMPB+3 ;
>  EOR #$FF
>  AND MD5TEMPB+15
>  ORA MD5TEMP2+3
>  ADC MD5TEMPV+3
>  STA MD5TEMPV+3
>  RTS
> 
> * H function:
> *          H(X,Y,Z) = X xor Y xor Z
> 
> H_BCD CLC ;BxCxD
>  LDA MD5TEMPB+4
>  EOR MD5TEMPB+8
>  EOR MD5TEMPB+12
>  ADC MD5TEMPV
>  STA MD5TEMPV
>  LDA MD5TEMPB+5
>  EOR MD5TEMPB+9
>  EOR MD5TEMPB+13
>  ADC MD5TEMPV+1
>  STA MD5TEMPV+1
>  LDA MD5TEMPB+6
>  EOR MD5TEMPB+10
>  EOR MD5TEMPB+14
>  ADC MD5TEMPV+2
>  STA MD5TEMPV+2
>  LDA MD5TEMPB+7
>  EOR MD5TEMPB+11
>  EOR MD5TEMPB+15
>  ADC MD5TEMPV+3
>  STA MD5TEMPV+3
>  RTS
> 
> H_ABC CLC ;AxBxC
>  LDA MD5TEMPB
>  EOR MD5TEMPB+4
>  EOR MD5TEMPB+8
>  ADC MD5TEMPV
>  STA MD5TEMPV
>  LDA MD5TEMPB+1
>  EOR MD5TEMPB+5
>  EOR MD5TEMPB+9
>  ADC MD5TEMPV+1
>  STA MD5TEMPV+1
>  LDA MD5TEMPB+2
>  EOR MD5TEMPB+6
>  EOR MD5TEMPB+10
>  ADC MD5TEMPV+2
>  STA MD5TEMPV+2
>  LDA MD5TEMPB+3
>  EOR MD5TEMPB+7
>  EOR MD5TEMPB+11
>  ADC MD5TEMPV+3
>  STA MD5TEMPV+3
>  RTS
> 
> H_DAB CLC ;AxBxD
>  LDA MD5TEMPB
>  EOR MD5TEMPB+4
>  EOR MD5TEMPB+12
>  ADC MD5TEMPV
>  STA MD5TEMPV
>  LDA MD5TEMPB+1
>  EOR MD5TEMPB+5
>  EOR MD5TEMPB+13
>  ADC MD5TEMPV+1
>  STA MD5TEMPV+1
>  LDA MD5TEMPB+2
>  EOR MD5TEMPB+6
>  EOR MD5TEMPB+14
>  ADC MD5TEMPV+2
>  STA MD5TEMPV+2
>  LDA MD5TEMPB+3
>  EOR MD5TEMPB+7
>  EOR MD5TEMPB+15
>  ADC MD5TEMPV+3
>  STA MD5TEMPV+3
>  RTS
> 
> H_CDA CLC ;AxCxD
>  LDA MD5TEMPB
>  EOR MD5TEMPB+8
>  EOR MD5TEMPB+12
>  ADC MD5TEMPV
>  STA MD5TEMPV
>  LDA MD5TEMPB+1
>  EOR MD5TEMPB+9
>  EOR MD5TEMPB+13
>  ADC MD5TEMPV+1
>  STA MD5TEMPV+1
>  LDA MD5TEMPB+2
>  EOR MD5TEMPB+10
>  EOR MD5TEMPB+14
>  ADC MD5TEMPV+2
>  STA MD5TEMPV+2
>  LDA MD5TEMPB+3
>  EOR MD5TEMPB+11
>  EOR MD5TEMPB+15
>  ADC MD5TEMPV+3
>  STA MD5TEMPV+3
>  RTS
> 
> * I function
> *          I(X,Y,Z) = Y xor (X v not(Z))
> 
> I_BCD CLC  ~D|B^C
>  LDA MD5TEMPB+12
>  EOR #$FF
>  ORA MD5TEMPB+4
>  EOR MD5TEMPB+8
>  ADC MD5TEMPV
>  STA MD5TEMPV
>  LDA MD5TEMPB+13
>  EOR #$FF
>  ORA MD5TEMPB+5
>  EOR MD5TEMPB+9
>  ADC MD5TEMPV+1
>  STA MD5TEMPV+1
>  LDA MD5TEMPB+14
>  EOR #$FF
>  ORA MD5TEMPB+6
>  EOR MD5TEMPB+10
>  ADC MD5TEMPV+2
>  STA MD5TEMPV+2
>  LDA MD5TEMPB+15
>  EOR #$FF
>  ORA MD5TEMPB+7
>  EOR MD5TEMPB+11
>  ADC MD5TEMPV+3
>  STA MD5TEMPV+3
>  RTS
> 
> I_ABC CLC  ~C|A^B
>  LDA MD5TEMPB+8
>  EOR #$FF
>  ORA MD5TEMPB
>  EOR MD5TEMPB+4
>  ADC MD5TEMPV
>  STA MD5TEMPV
>  LDA MD5TEMPB+9
>  EOR #$FF
>  ORA MD5TEMPB+1
>  EOR MD5TEMPB+5
>  ADC MD5TEMPV+1
>  STA MD5TEMPV+1
>  LDA MD5TEMPB+10
>  EOR #$FF
>  ORA MD5TEMPB+2
>  EOR MD5TEMPB+6
>  ADC MD5TEMPV+2
>  STA MD5TEMPV+2
>  LDA MD5TEMPB+11
>  EOR #$FF
>  ORA MD5TEMPB+3
>  EOR MD5TEMPB+7
>  ADC MD5TEMPV+3
>  STA MD5TEMPV+3
>  RTS
> 
> I_DAB CLC  ~B|D^A
>  LDA MD5TEMPB+4
>  EOR #$FF
>  ORA MD5TEMPB+12
>  EOR MD5TEMPB
>  ADC MD5TEMPV
>  STA MD5TEMPV
>  LDA MD5TEMPB+5
>  EOR #$FF
>  ORA MD5TEMPB+13
>  EOR MD5TEMPB+1
>  ADC MD5TEMPV+1
>  STA MD5TEMPV+1
>  LDA MD5TEMPB+6
>  EOR #$FF
>  ORA MD5TEMPB+14
>  EOR MD5TEMPB+2
>  ADC MD5TEMPV+2
>  STA MD5TEMPV+2
>  LDA MD5TEMPB+7
>  EOR #$FF
>  ORA MD5TEMPB+15
>  EOR MD5TEMPB+3
>  ADC MD5TEMPV+3
>  STA MD5TEMPV+3
>  RTS
> 
> I_CDA CLC  ~A|C^D
>  LDA MD5TEMPB
>  EOR #$FF
>  ORA MD5TEMPB+8
>  EOR MD5TEMPB+12
>  ADC MD5TEMPV
>  STA MD5TEMPV
>  LDA MD5TEMPB+1
>  EOR #$FF
>  ORA MD5TEMPB+9
>  EOR MD5TEMPB+13
>  ADC MD5TEMPV+1
>  STA MD5TEMPV+1
>  LDA MD5TEMPB+2
>  EOR #$FF
>  ORA MD5TEMPB+10
>  EOR MD5TEMPB+14
>  ADC MD5TEMPV+2
>  STA MD5TEMPV+2
>  LDA MD5TEMPB+3
>  EOR #$FF
>  ORA MD5TEMPB+11
>  EOR MD5TEMPB+15
>  ADC MD5TEMPV+3
>  STA MD5TEMPV+3
>  RTS
> 
> *Rotate left functions
> 
> MD5RL LDA MD5TEMPV ;Rotate the 32-bit temp var left by one bit
>  ASL
>  STA MD5TEMPV
>  LDA MD5TEMPV+1
>  ROL
>  STA MD5TEMPV+1
>  LDA MD5TEMPV+2
>  ROL
>  STA MD5TEMPV+2
>  LDA MD5TEMPV+3
>  ROL
>  STA MD5TEMPV+3
>  LDA MD5TEMPV ;Take high bit and wrap around;
>  ADC #0 ; add it to empty position in lowest byte
>  STA MD5TEMPV
>  RTS
> 
> * This is somewhat sloppy but it works
> * It should be optimized to use full byte shifts when possible.
> 
> MD5RL7 LUP 7
>  JSR MD5RL
>  --^
>  RTS
> 
> MD5RL12 LUP 12
>  JSR MD5RL
>  --^
>  RTS
> 
> MD5RL17 LUP 17
>  JSR MD5RL
>  --^
>  RTS
> 
> MD5RL22 LUP 22
>  JSR MD5RL
>  --^
>  RTS
> 
> MD5RL5 LUP 5
>  JSR MD5RL
>  --^
>  RTS
> 
> MD5RL9 LUP 9
>  JSR MD5RL
>  --^
>  RTS
> 
> MD5RL14 LUP 14
>  JSR MD5RL
>  --^
>  RTS
> 
> MD5RL20 LUP 20
>  JSR MD5RL
>  --^
>  RTS
> 
> MD5RL4 LUP 4
>  JSR MD5RL
>  --^
>  RTS
> 
> MD5RL11 LUP 11
>  JSR MD5RL
>  --^
>  RTS
> 
> MD5RL16 LUP 16
>  JSR MD5RL
>  --^
>  RTS
> 
> MD5RL23 LUP 23
>  JSR MD5RL
>  --^
>  RTS
> 
> MD5RL6 LUP 6
>  JSR MD5RL
>  --^
>  RTS
> 
> MD5RL10 LUP 10
>  JSR MD5RL
>  --^
>  RTS
> 
> MD5RL15 LUP 15
>  JSR MD5RL
>  --^
>  RTS
> 
> MD5RL21 LUP 21
>  JSR MD5RL
>  --^
>  RTS
> 
> *Get data from input block and add it to temp variable
> 
> MD5ADDX ASL
>  ASL
>  CLC ;It better not be greater than 16 anyway!
>  TAX
>  LDA MD5BUFR,X
>  ADC MD5TEMPV
>  STA MD5TEMPV
>  LDA MD5BUFR+1,X
>  ADC MD5TEMPV+1
>  STA MD5TEMPV+1
>  LDA MD5BUFR+2,X
>  ADC MD5TEMPV+2
>  STA MD5TEMPV+2
>  LDA MD5BUFR+3,X
>  ADC MD5TEMPV+3
>  STA MD5TEMPV+3
>  RTS
> 
> *Get next element from table and add it to temp variable
> 
> NEXT_T LDX MD5TP
>  CLC
>  LDA MD5T+3,X ;reverse byte order
>  ADC MD5TEMPV
>  STA MD5TEMPV
>  LDA MD5T+2,X
>  ADC MD5TEMPV+1
>  STA MD5TEMPV+1
>  LDA MD5T+1,X
>  ADC MD5TEMPV+2
>  STA MD5TEMPV+2
>  LDA MD5T,X
>  ADC MD5TEMPV+3
>  STA MD5TEMPV+3
>  INX
>  INX
>  INX
>  INX
>  STX MD5TP
>  RTS
> 
> * MD5 Sine Constants
> 
> *   The following is the 64-element MD5 table T[1 ... 64] constructed from
> *   the sine function. Let T[i] denote the i-th element of the table, which
> *   is equal to the integer part of 2^32, or 4294967296, times abs(sin(i)),
> *   where i is in radians.
> *
> *   Sorry, Colin, no occult messages here. :)
> 
> * These need to be re-arranged to LSB-first
> * (which is done by the NEXT_T subroutine)
> 
> MD5TP HEX 00 ;Pointer to current element in table below
> MD5T
> 
> *  /* Round 1 */
> 
>  HEX D76AA478 ; /* 1 */
>  HEX E8C7B756 ; /* 2 */
>  HEX 242070DB ; /* 3 */
>  HEX C1BDCEEE ; /* 4 */
>  HEX F57C0FAF ; /* 5 */
>  HEX 4787C62A ; /* 6 */
>  HEX A8304613 ; /* 7 */
>  HEX FD469501 ; /* 8 */
>  HEX 698098D8 ; /* 9 */
>  HEX 8B44F7AF ; /* 10 */
>  HEX FFFF5BB1 ; /* 11 */
>  HEX 895CD7BE ; /* 12 */
>  HEX 6B901122 ; /* 13 */
>  HEX FD987193 ; /* 14 */
>  HEX A679438E ; /* 15 */
>  HEX 49B40821 ; /* 16 */
> 
> *  /* Round 2 */
> 
>  HEX F61E2562 ; /* 17 */
>  HEX C040B340 ; /* 18 */