Kirjautuminen

Haku

Tehtävät

Koodivinkit: Assembly: MD5-tiivisteen laskenta (6502)

Kirjoittaja: qalle; viimeksi muokattu 09.08.2017.

Tagit: algoritmit, kryptografia

6502-konekielinen alirutiini, joka laskee 0–7-tavuisen tavujonon MD5-tiivisteen. Olen portannut alirutiinin Wikipedian pseudokoodista. Kääntämiseen tarvitaan Ophis-assembler. Olen kehittänyt alirutiinin NES:ille mutta se toimii todennäköisesti muillakin koneilla. Alirutiini ei sisällä mitään ylimääräistä kuten käyttöliittymää.

Alirutiini vie käännettynä 9 993 tavua. Ajamiseen kuluu noin 15 000 kellojaksoa eli prosessorin nopeudesta riippuen noin sadasosasekunti.

md5.asm

Alirutiinin lähdekoodi Ophis-assemblerille.

    .outfile "md5.bin"  ; mille nimelle käännetään

    .require "md5-macros.asm"  ; lue makrotiedosto

md5_algo:
    ; laskee tavujonon MD5-tiivisteen;
    ; portattu koodista osoitteessa http://en.wikipedia.org/wiki/MD5#Pseudocode
    ;
    ; vaatii ennalta lasketut aputaulukot:
    ;     - shl4_table (256 tavua): arvo indeksissä = (indeksi << 4) & 0xff
    ;     - shr4_table (256 tavua): arvo indeksissä = indeksi >> 4
    ;
    ; syöte:
    ;     - little-endian-kaksoissana m0: viestin tavut 0-3
    ;     - little-endian-kaksoissana m1: viestin tavut 4-7
    ;       (itse viesti voi olla 0-7 tavua pitkä; välittömästi sen jälkeen on
    ;       oltava yksi 0x80-tavu ja tarvittaessa 0x00-tavuja)
    ;     - tavu message_length_in_bits: itse viestin pituus bitteinä (ei
    ;       0x80-tavua eikä myöhempiä); 0-56; jaollinen 8:lla
    ;
    ; palauttaa:
    ;     - little-endian-kaksoissanat s0, s1, s2, s3: viestin tiiviste
    ;
    ; käyttää tilapäismuuttujia:
    ;     - little-endian-kaksoissanat tempdw, tempdw2

    ; alusta algoritmin tila
    `dw_copy_const $67452301, s0
    `dw_copy_const $efcdab89, s1
    `dw_copy_const $98badcfe, s2
    `dw_copy_const $10325476, s3

    ; kierros 0
    `dw_xor_and_xor s3, s2, s1, tempdw
    `dw_add_mem s0, tempdw
    `dw_add_mem m0, tempdw
    `dw_add_const $d76aa478, tempdw
    `dw_rol7 tempdw
    `dw_add_mem_to_mem tempdw, s1, s0

    ; kierros 1
    `dw_xor_and_xor s2, s1, s0, tempdw
    `dw_add_mem s3, tempdw
    `dw_add_mem m1, tempdw
    `dw_add_const $e8c7b756, tempdw
    `dw_rol12 tempdw
    `dw_add_mem_to_mem tempdw, s0, s3

    ; kierros 2
    `dw_xor_and_xor s1, s0, s3, tempdw
    `dw_add_mem s2, tempdw
    `dw_add_const $242070db, tempdw
    `dw_rol17 tempdw
    `dw_add_mem_to_mem tempdw, s3, s2

    ; kierros 3
    `dw_xor_and_xor s0, s3, s2, tempdw
    `dw_add_mem s1, tempdw
    `dw_add_const $c1bdceee, tempdw
    `dw_rol22 tempdw
    `dw_add_mem_to_mem tempdw, s2, s1

    ; -------------------------------------------------------------------------

    ; kierros 4
    `dw_xor_and_xor s3, s2, s1, tempdw
    `dw_add_mem s0, tempdw
    `dw_add_const $f57c0faf, tempdw
    `dw_rol7 tempdw
    `dw_add_mem_to_mem tempdw, s1, s0

    ; kierros 5
    `dw_xor_and_xor s2, s1, s0, tempdw
    `dw_add_mem s3, tempdw
    `dw_add_const $4787c62a, tempdw
    `dw_rol12 tempdw
    `dw_add_mem_to_mem tempdw, s0, s3

    ; kierros 6
    `dw_xor_and_xor s1, s0, s3, tempdw
    `dw_add_mem s2, tempdw
    `dw_add_const $a8304613, tempdw
    `dw_rol17 tempdw
    `dw_add_mem_to_mem tempdw, s3, s2

    ; kierros 7
    `dw_xor_and_xor s0, s3, s2, tempdw
    `dw_add_mem s1, tempdw
    `dw_add_const $fd469501, tempdw
    `dw_rol22 tempdw
    `dw_add_mem_to_mem tempdw, s2, s1

    ; -------------------------------------------------------------------------

    ; kierros 8
    `dw_xor_and_xor s3, s2, s1, tempdw
    `dw_add_mem s0, tempdw
    `dw_add_const $698098d8, tempdw
    `dw_rol7 tempdw
    `dw_add_mem_to_mem tempdw, s1, s0

    ; kierros 9
    `dw_xor_and_xor s2, s1, s0, tempdw
    `dw_add_mem s3, tempdw
    `dw_add_const $8b44f7af, tempdw
    `dw_rol12 tempdw
    `dw_add_mem_to_mem tempdw, s0, s3

    ; kierros 10
    `dw_xor_and_xor s1, s0, s3, tempdw
    `dw_add_mem s2, tempdw
    `dw_add_const $ffff5bb1, tempdw
    `dw_rol17 tempdw
    `dw_add_mem_to_mem tempdw, s3, s2

    ; kierros 11
    `dw_xor_and_xor s0, s3, s2, tempdw
    `dw_add_mem s1, tempdw
    `dw_add_const $895cd7be, tempdw
    `dw_rol22 tempdw
    `dw_add_mem_to_mem tempdw, s2, s1

    ; -------------------------------------------------------------------------

    ; kierros 12
    `dw_xor_and_xor s3, s2, s1, tempdw
    `dw_add_mem s0, tempdw
    `dw_add_const $6b901122, tempdw
    `dw_rol7 tempdw
    `dw_add_mem_to_mem tempdw, s1, s0

    ; kierros 13
    `dw_xor_and_xor s2, s1, s0, tempdw
    `dw_add_mem s3, tempdw
    `dw_add_const $fd987193, tempdw
    `dw_rol12 tempdw
    `dw_add_mem_to_mem tempdw, s0, s3

    ; kierros 14
    `dw_xor_and_xor s1, s0, s3, tempdw
    `dw_add_mem s2, tempdw
    `dw_add_const $a679438e, tempdw
    `dw_add_membyte message_length_in_bits, tempdw
    `dw_rol17 tempdw
    `dw_add_mem_to_mem tempdw, s3, s2

    ; kierros 15
    `dw_xor_and_xor s0, s3, s2, tempdw
    `dw_add_mem s1, tempdw
    `dw_add_const $49b40821, tempdw
    `dw_rol22 tempdw
    `dw_add_mem_to_mem tempdw, s2, s1

    ; -------------------------------------------------------------------------

    ; kierros 16
    `dw_xor_and_xor s2, s1, s3, tempdw
    `dw_add_mem s0, tempdw
    `dw_add_mem m1, tempdw
    `dw_add_const $f61e2562, tempdw
    `dw_rol5 tempdw
    `dw_add_mem_to_mem tempdw, s1, s0

    ; kierros 17
    `dw_xor_and_xor s1, s0, s2, tempdw
    `dw_add_mem s3, tempdw
    `dw_add_const $c040b340, tempdw
    `dw_rol9 tempdw
    `dw_add_mem_to_mem tempdw, s0, s3

    ; kierros 18
    `dw_xor_and_xor s0, s3, s1, tempdw
    `dw_add_mem s2, tempdw
    `dw_add_const $265e5a51, tempdw
    `dw_rol14 tempdw
    `dw_add_mem_to_mem tempdw, s3, s2

    ; kierros 19
    `dw_xor_and_xor s3, s2, s0, tempdw
    `dw_add_mem m0, tempdw
    `dw_add_mem s1, tempdw
    `dw_add_const $e9b6c7aa, tempdw
    `dw_rol20 tempdw
    `dw_add_mem_to_mem tempdw, s2, s1

    ; -------------------------------------------------------------------------

    ; kierros 20
    `dw_xor_and_xor s2, s1, s3, tempdw
    `dw_add_mem s0, tempdw
    `dw_add_const $d62f105d, tempdw
    `dw_rol5 tempdw
    `dw_add_mem_to_mem tempdw, s1, s0

    ; kierros 21
    `dw_xor_and_xor s1, s0, s2, tempdw
    `dw_add_mem s3, tempdw
    `dw_add_const $02441453, tempdw
    `dw_rol9 tempdw
    `dw_add_mem_to_mem tempdw, s0, s3

    ; kierros 22
    `dw_xor_and_xor s0, s3, s1, tempdw
    `dw_add_mem s2, tempdw
    `dw_add_const $d8a1e681, tempdw
    `dw_rol14 tempdw
    `dw_add_mem_to_mem tempdw, s3, s2

    ; kierros 23
    `dw_xor_and_xor s3, s2, s0, tempdw
    `dw_add_mem s1, tempdw
    `dw_add_const $e7d3fbc8, tempdw
    `dw_rol20 tempdw
    `dw_add_mem_to_mem tempdw, s2, s1

    ; -------------------------------------------------------------------------

    ; kierros 24
    `dw_xor_and_xor s2, s1, s3, tempdw
    `dw_add_mem s0, tempdw
    `dw_add_const $21e1cde6, tempdw
    `dw_rol5 tempdw
    `dw_add_mem_to_mem tempdw, s1, s0

    ; kierros 25
    `dw_xor_and_xor s1, s0, s2, tempdw
    `dw_add_mem s3, tempdw
    `dw_add_const $c33707d6, tempdw
    `dw_add_membyte message_length_in_bits, tempdw
    `dw_rol9 tempdw
    `dw_add_mem_to_mem tempdw, s0, s3

    ; kierros 26
    `dw_xor_and_xor s0, s3, s1, tempdw
    `dw_add_mem s2, tempdw
    `dw_add_const $f4d50d87, tempdw
    `dw_rol14 tempdw
    `dw_add_mem_to_mem tempdw, s3, s2

    ; kierros 27
    `dw_xor_and_xor s3, s2, s0, tempdw
    `dw_add_mem s1, tempdw
    `dw_add_const $455a14ed, tempdw
    `dw_rol20 tempdw
    `dw_add_mem_to_mem tempdw, s2, s1

    ; -------------------------------------------------------------------------

    ; kierros 28
    `dw_xor_and_xor s2, s1, s3, tempdw
    `dw_add_mem s0, tempdw
    `dw_add_const $a9e3e905, tempdw
    `dw_rol5 tempdw
    `dw_add_mem_to_mem tempdw, s1, s0

    ; kierros 29
    `dw_xor_and_xor s1, s0, s2, tempdw
    `dw_add_mem s3, tempdw
    `dw_add_const $fcefa3f8, tempdw
    `dw_rol9 tempdw
    `dw_add_mem_to_mem tempdw, s0, s3

    ; kierros 30
    `dw_xor_and_xor s0, s3, s1, tempdw
    `dw_add_mem s2, tempdw
    `dw_add_const $676f02d9, tempdw
    `dw_rol14 tempdw
    `dw_add_mem_to_mem tempdw, s3, s2

    ; kierros 31
    `dw_xor_and_xor s3, s2, s0, tempdw
    `dw_add_mem s1, tempdw
    `dw_add_const $8d2a4c8a, tempdw
    `dw_rol20 tempdw
    `dw_add_mem_to_mem tempdw, s2, s1

    ; -------------------------------------------------------------------------

    ; kierros 32
    `dw_xor_xor s1, s2, s3, tempdw
    `dw_add_mem s0, tempdw
    `dw_add_const $fffa3942, tempdw
    `dw_rol4 tempdw
    `dw_add_mem_to_mem tempdw, s1, s0

    ; kierros 33
    `dw_xor_xor s0, s1, s2, tempdw
    `dw_add_mem s3, tempdw
    `dw_add_const $8771f681, tempdw
    `dw_rol11 tempdw
    `dw_add_mem_to_mem tempdw, s0, s3

    ; kierros 34
    `dw_xor_xor s0, s1, s3, tempdw
    `dw_add_mem s2, tempdw
    `dw_add_const $6d9d6122, tempdw
    `dw_rol16 tempdw
    `dw_add_mem_to_mem tempdw, s3, s2

    ; kierros 35
    `dw_xor_xor s0, s2, s3, tempdw
    `dw_add_mem s1, tempdw
    `dw_add_const $fde5380c, tempdw
    `dw_add_membyte message_length_in_bits, tempdw
    `dw_rol23 tempdw
    `dw_add_mem_to_mem tempdw, s2, s1

    ; -------------------------------------------------------------------------

    ; kierros 36
    `dw_xor_xor s1, s2, s3, tempdw
    `dw_add_mem s0, tempdw
    `dw_add_mem m1, tempdw
    `dw_add_const $a4beea44, tempdw
    `dw_rol4 tempdw
    `dw_add_mem_to_mem tempdw, s1, s0

    ; kierros 37
    `dw_xor_xor s0, s1, s2, tempdw
    `dw_add_mem s3, tempdw
    `dw_add_const $4bdecfa9, tempdw
    `dw_rol11 tempdw
    `dw_add_mem_to_mem tempdw, s0, s3

    ; kierros 38
    `dw_xor_xor s0, s1, s3, tempdw
    `dw_add_mem s2, tempdw
    `dw_add_const $f6bb4b60, tempdw
    `dw_rol16 tempdw
    `dw_add_mem_to_mem tempdw, s3, s2

    ; kierros 39
    `dw_xor_xor s0, s2, s3, tempdw
    `dw_add_mem s1, tempdw
    `dw_add_const $bebfbc70, tempdw
    `dw_rol23 tempdw
    `dw_add_mem_to_mem tempdw, s2, s1

    ; -------------------------------------------------------------------------

    ; kierros 40
    `dw_xor_xor s1, s2, s3, tempdw
    `dw_add_mem s0, tempdw
    `dw_add_const $289b7ec6, tempdw
    `dw_rol4 tempdw
    `dw_add_mem_to_mem tempdw, s1, s0

    ; kierros 41
    `dw_xor_xor s0, s1, s2, tempdw
    `dw_add_mem m0, tempdw
    `dw_add_mem s3, tempdw
    `dw_add_const $eaa127fa, tempdw
    `dw_rol11 tempdw
    `dw_add_mem_to_mem tempdw, s0, s3

    ; kierros 42
    `dw_xor_xor s0, s1, s3, tempdw
    `dw_add_mem s2, tempdw
    `dw_add_const $d4ef3085, tempdw
    `dw_rol16 tempdw
    `dw_add_mem_to_mem tempdw, s3, s2

    ; kierros 43
    `dw_xor_xor s0, s2, s3, tempdw
    `dw_add_mem s1, tempdw
    `dw_add_const $04881d05, tempdw
    `dw_rol23 tempdw
    `dw_add_mem_to_mem tempdw, s2, s1

    ; -------------------------------------------------------------------------

    ; kierros 44
    `dw_xor_xor s1, s2, s3, tempdw
    `dw_add_mem s0, tempdw
    `dw_add_const $d9d4d039, tempdw
    `dw_rol4 tempdw
    `dw_add_mem_to_mem tempdw, s1, s0

    ; kierros 45
    `dw_xor_xor s0, s1, s2, tempdw
    `dw_add_mem s3, tempdw
    `dw_add_const $e6db99e5, tempdw
    `dw_rol11 tempdw
    `dw_add_mem_to_mem tempdw, s0, s3

    ; kierros 46
    `dw_xor_xor s0, s1, s3, tempdw
    `dw_add_mem s2, tempdw
    `dw_add_const $1fa27cf8, tempdw
    `dw_rol16 tempdw
    `dw_add_mem_to_mem tempdw, s3, s2

    ; kierros 47
    `dw_xor_xor s0, s2, s3, tempdw
    `dw_add_mem s1, tempdw
    `dw_add_const $c4ac5665, tempdw
    `dw_rol23 tempdw
    `dw_add_mem_to_mem tempdw, s2, s1

    ; -------------------------------------------------------------------------

    ; kierros 48
    `dw_not_or_xor s3, s1, s2, tempdw
    `dw_add_mem m0, tempdw
    `dw_add_mem s0, tempdw
    `dw_add_const $f4292244, tempdw
    `dw_rol6 tempdw
    `dw_add_mem_to_mem tempdw, s1, s0

    ; kierros 49
    `dw_not_or_xor s2, s0, s1, tempdw
    `dw_add_mem s3, tempdw
    `dw_add_const $432aff97, tempdw
    `dw_rol10 tempdw
    `dw_add_mem_to_mem tempdw, s0, s3

    ; kierros 50
    `dw_not_or_xor s1, s3, s0, tempdw
    `dw_add_mem s2, tempdw
    `dw_add_const $ab9423a7, tempdw
    `dw_add_membyte message_length_in_bits, tempdw
    `dw_rol15 tempdw
    `dw_add_mem_to_mem tempdw, s3, s2

    ; kierros 51
    `dw_not_or_xor s0, s2, s3, tempdw
    `dw_add_mem s1, tempdw
    `dw_add_const $fc93a039, tempdw
    `dw_rol21 tempdw
    `dw_add_mem_to_mem tempdw, s2, s1

    ; -------------------------------------------------------------------------

    ; kierros 52
    `dw_not_or_xor s3, s1, s2, tempdw
    `dw_add_mem s0, tempdw
    `dw_add_const $655b59c3, tempdw
    `dw_rol6 tempdw
    `dw_add_mem_to_mem tempdw, s1, s0

    ; kierros 53
    `dw_not_or_xor s2, s0, s1, tempdw
    `dw_add_mem s3, tempdw
    `dw_add_const $8f0ccc92, tempdw
    `dw_rol10 tempdw
    `dw_add_mem_to_mem tempdw, s0, s3

    ; kierros 54
    `dw_not_or_xor s1, s3, s0, tempdw
    `dw_add_mem s2, tempdw
    `dw_add_const $ffeff47d, tempdw
    `dw_rol15 tempdw
    `dw_add_mem_to_mem tempdw, s3, s2

    ; kierros 55
    `dw_not_or_xor s0, s2, s3, tempdw
    `dw_add_mem s1, tempdw
    `dw_add_mem m1, tempdw
    `dw_add_const $85845dd1, tempdw
    `dw_rol21 tempdw
    `dw_add_mem_to_mem tempdw, s2, s1

    ; -------------------------------------------------------------------------

    ; kierros 56
    `dw_not_or_xor s3, s1, s2, tempdw
    `dw_add_mem s0, tempdw
    `dw_add_const $6fa87e4f, tempdw
    `dw_rol6 tempdw
    `dw_add_mem_to_mem tempdw, s1, s0

    ; kierros 57
    `dw_not_or_xor s2, s0, s1, tempdw
    `dw_add_mem s3, tempdw
    `dw_add_const $fe2ce6e0, tempdw
    `dw_rol10 tempdw
    `dw_add_mem_to_mem tempdw, s0, s3

    ; kierros 58
    `dw_not_or_xor s1, s3, s0, tempdw
    `dw_add_mem s2, tempdw
    `dw_add_const $a3014314, tempdw
    `dw_rol15 tempdw
    `dw_add_mem_to_mem tempdw, s3, s2

    ; kierros 59
    `dw_not_or_xor s0, s2, s3, tempdw
    `dw_add_mem s1, tempdw
    `dw_add_const $4e0811a1, tempdw
    `dw_rol21 tempdw
    `dw_add_mem_to_mem tempdw, s2, s1

    ; -------------------------------------------------------------------------

    ; kierros 60
    `dw_not_or_xor s3, s1, s2, tempdw
    `dw_add_mem s0, tempdw
    `dw_add_const $f7537e82, tempdw
    `dw_rol6 tempdw
    `dw_add_mem_to_mem tempdw, s1, s0

    ; kierros 61
    `dw_not_or_xor s2, s0, s1, tempdw
    `dw_add_mem s3, tempdw
    `dw_add_const $bd3af235, tempdw
    `dw_rol10 tempdw
    `dw_add_mem_to_mem tempdw, s0, s3

    ; kierros 62
    `dw_not_or_xor s1, s3, s0, tempdw
    `dw_add_mem s2, tempdw
    `dw_add_const $2ad7d2bb, tempdw
    `dw_rol15 tempdw
    `dw_add_mem_to_mem tempdw, s3, s2

    ; kierros 63
    `dw_not_or_xor s0, s2, s3, tempdw
    `dw_add_mem s1, tempdw
    `dw_add_const $eb86d391, tempdw
    `dw_rol21 tempdw
    `dw_add_mem_to_mem tempdw, s2, s1

    ; lisää tiivisteeseen samat vakiot kuin alussa
    `dw_add_const $67452301, s0
    `dw_add_const $efcdab89, s1
    `dw_add_const $98badcfe, s2
    `dw_add_const $10325476, s3

    rts

md5-macros.asm

Alirutiinin käyttämät makrot.

; makroja, jotka liittyvät 32-bittisiin little-endian-kaksoissanoihin (vähiten
; merkitsevä tavu ensin);
; apumakrojen (kutsutaan vain tästä tiedostosta) nimet alkavat "_":lla;
; muiden makrojen nimet alkavat "dw_":lla

; -----------------------------------------------------------------------------

; 32-bittinen kierto vasemmalle ilman muistibittiä aputaulukoita käyttäen
; (kierto 4 + 8n bittiä, aina 80 kellojaksoa)

.macro _nybble_combine
    ; (_1 << 4) | (_2 >> 4) -> _3
    ldx _1
    lda shl4_table,x
    ldx _2
    ora shr4_table,x
    sta _3
.macend

.macro dw_rol4
    ;     tavu3    tavu2    tavu1    tavu0
    ;    abcdefgh ijklmnop qrstuvwx yzABCDEF
    ; -> efghijkl mnopqrst uvwxyzAB CDEFabcd

    `_nybble_combine _1 + 3, _1 + 2, tempdw2 + 3
    `_nybble_combine _1 + 1, _1 + 0, tempdw2 + 1
    `_nybble_combine _1 + 2, _1 + 1, _1 + 2
    `_nybble_combine _1 + 0, _1 + 3, _1 + 0

    lda tempdw2 + 1
    sta _1 + 1
    lda tempdw2 + 3
    sta _1 + 3
.macend

.macro dw_rol12
    ;     tavu3    tavu2    tavu1    tavu0
    ;    abcdefgh ijklmnop qrstuvwx yzABCDEF
    ; -> mnopqrst uvwxyzAB CDEFabcd efghijkl

    `_nybble_combine _1 + 2, _1 + 1, tempdw2 + 3
    `_nybble_combine _1 + 1, _1 + 0, tempdw2 + 2
    `_nybble_combine _1 + 0, _1 + 3, _1 + 1
    `_nybble_combine _1 + 3, _1 + 2, _1 + 0

    lda tempdw2 + 2
    sta _1 + 2
    lda tempdw2 + 3
    sta _1 + 3
.macend

.macro dw_rol20
    ;     tavu3    tavu2    tavu1    tavu0
    ;    abcdefgh ijklmnop qrstuvwx yzABCDEF
    ; -> uvwxyzAB CDEFabcd efghijkl mnopqrst

    `_nybble_combine _1 + 2, _1 + 1, tempdw2 + 0
    `_nybble_combine _1 + 1, _1 + 0, tempdw2 + 3
    `_nybble_combine _1 + 3, _1 + 2, _1 + 1
    `_nybble_combine _1 + 0, _1 + 3, _1 + 2

    lda tempdw2 + 0
    sta _1 + 0
    lda tempdw2 + 3
    sta _1 + 3
.macend

; -----------------------------------------------------------------------------

; 32-bittinen kierto vasemmalle ilman muistibittiä ilman aputaulukoita

.macro _dw_rol_bit
    ; kierrä 1 bitti vasemmalle olettaen, että ENITEN merkitsevä tavu on A:ssa
    ; 19 kellojaksoa
    cmp #%10000000
    rol _1 + 0
    rol _1 + 1
    rol _1 + 2
    rol
.macend

.macro _dw_ror_bit
    ; kierrä 1 bitti oikealle olettaen, että VÄHITEN merkitsevä tavu on SEKÄ
    ; A:SSA ETTÄ MUISTISSA
    ; 22 kellojaksoa
    lsr
    ror _1 + 3
    ror _1 + 2
    ror _1 + 1
    ror _1 + 0
.macend

.macro _dw_rol_byte_lsb
    ; kierrä 1 tavu vasemmalle jättäen uuden VÄHITEN merkitsevän tavun VAIN
    ; A:HAN
    ; _1+0 -> _1+1 -> _1+2 -> _1+3 -> A
    ; 21 kellojaksoa
    lda _1 + 3
    ldx _1 + 2
    stx _1 + 3
    ldx _1 + 1
    stx _1 + 2
    ldx _1 + 0
    stx _1 + 1
.macend

.macro _dw_rol_byte_msb
    ; kierrä 1 tavu vasemmalle jättäen uuden ENITEN merkitsevän tavun
    ; VAIN A:HAN
    ; _1+3 -> _1+0 -> _1+1 -> _1+2 -> A
    ; 21 kellojaksoa
    lda _1 + 2
    ldx _1 + 1
    stx _1 + 2
    ldx _1 + 0
    stx _1 + 1
    ldx _1 + 3
    stx _1 + 0
.macend

.macro _dw_ror_byte
    ; kierrä 1 tavu oikealle jättäen uuden VÄHITEN merkitsevän tavun VAIN A:HAN
    ; _1+0 -> _1+3 -> _1+2 -> _1+1 -> A
    ; 21 kellojaksoa
    lda _1 + 1
    ldx _1 + 2
    stx _1 + 1
    ldx _1 + 3
    stx _1 + 2
    ldx _1 + 0
    stx _1 + 3
.macend

.macro _dw_swap_words_lsb
    ; vaihda sanat keskenään jättäen uuden VÄHITEN merkitsevän tavun VAIN A:HAN
    ; 21 kellojaksoa
    lda _1 + 3
    ldx _1 + 1
    stx _1 + 3
    sta _1 + 1
    lda _1 + 2
    ldx _1 + 0
    stx _1 + 2
.macend

.macro _dw_swap_words_msb
    ; vaihda sanat keskenään jättäen uuden ENITEN merkitsevän tavun VAIN A:HAN
    ; 21 kellojaksoa
    lda _1 + 0
    ldx _1 + 2
    stx _1 + 0
    sta _1 + 2
    lda _1 + 1
    ldx _1 + 3
    stx _1 + 1
.macend

.macro dw_rol5  ; 90 kellojaksoa
    `_dw_rol_byte_lsb _1
    sta _1 + 0
    `_dw_ror_bit _1
    `_dw_ror_bit _1
    `_dw_ror_bit _1
.macend

.macro dw_rol6  ; 68 kellojaksoa
    `_dw_rol_byte_lsb _1
    sta _1 + 0
    `_dw_ror_bit _1
    `_dw_ror_bit _1
.macend

.macro dw_rol7  ; 46 kellojaksoa
    `_dw_rol_byte_lsb _1
    sta _1 + 0
    `_dw_ror_bit _1
.macend

.macro dw_rol9  ; 43 kellojaksoa
    `_dw_rol_byte_msb _1
    `_dw_rol_bit _1
    sta _1 + 3
.macend

.macro dw_rol10  ; 62 kellojaksoa
    `_dw_rol_byte_msb _1
    `_dw_rol_bit _1
    `_dw_rol_bit _1
    sta _1 + 3
.macend

.macro dw_rol11  ; 81 kellojaksoa
    `_dw_rol_byte_msb _1
    `_dw_rol_bit _1
    `_dw_rol_bit _1
    `_dw_rol_bit _1
    sta _1 + 3
.macend

.macro dw_rol14  ; 68 kellojaksoa
    `_dw_swap_words_lsb _1
    sta _1 + 0
    `_dw_ror_bit _1
    `_dw_ror_bit _1
.macend

.macro dw_rol15  ; 46 kellojaksoa
    `_dw_swap_words_lsb _1
    sta _1 + 0
    `_dw_ror_bit _1
.macend

.macro dw_rol16  ; 24 kellojaksoa
    `_dw_swap_words_lsb _1
    sta _1 + 0
.macend

.macro dw_rol17  ; 43 kellojaksoa
    `_dw_swap_words_msb _1
    `_dw_rol_bit _1
    sta _1 + 3
.macend

.macro dw_rol21  ; 90 kellojaksoa
    `_dw_ror_byte _1
    sta _1 + 0
    `_dw_ror_bit _1
    `_dw_ror_bit _1
    `_dw_ror_bit _1
.macend

.macro dw_rol22  ; 68 kellojaksoa
    `_dw_ror_byte _1
    sta _1 + 0
    `_dw_ror_bit _1
    `_dw_ror_bit _1
.macend

.macro dw_rol23  ; 46 kellojaksoa
    `_dw_ror_byte _1
    sta _1 + 0
    `_dw_ror_bit _1
.macend

; -----------------------------------------------------------------------------

; argumentit: lähde vakio, kohde muisti

.macro _copy_const
    lda #_1
    sta _2
.macend

.macro dw_copy_const
    `_copy_const _1 & $ff, _2 + 0
    `_copy_const [_1 / $100] & $ff, _2 + 1
    `_copy_const [_1 / $10000] & $ff, _2 + 2
    `_copy_const [_1 / $1000000] & $ff, _2 + 3
.macend

; -----------------------------------------------------------------------------

; argumentit: lähde vakio, lähde/kohde muisti

.macro _add_const
    lda #_1
    adc _2
    sta _2
.macend

.macro dw_add_const
    clc
    `_add_const _1 & $ff, _2 + 0
    `_add_const [_1 / $100] & $ff, _2 + 1
    `_add_const [_1 / $10000] & $ff, _2 + 2
    `_add_const [_1 / $1000000] & $ff, _2 + 3
.macend

; -----------------------------------------------------------------------------

; argumentit: lähde muisti, lähde/kohde muisti

.macro _add_mem
    lda _1
    adc _2
    sta _2
.macend

.macro dw_add_mem
    clc
    `_add_mem _1 + 0, _2 + 0
    `_add_mem _1 + 1, _2 + 1
    `_add_mem _1 + 2, _2 + 2
    `_add_mem _1 + 3, _2 + 3
.macend

; -----------------------------------------------------------------------------

; argumentit: lähde muisti, lähde muisti, kohde muisti

.macro _add_mem_to_mem
    lda _1
    adc _2
    sta _3
.macend

.macro dw_add_mem_to_mem
    clc
    `_add_mem_to_mem _1 + 0, _2 + 0, _3 + 0
    `_add_mem_to_mem _1 + 1, _2 + 1, _3 + 1
    `_add_mem_to_mem _1 + 2, _2 + 2, _3 + 2
    `_add_mem_to_mem _1 + 3, _2 + 3, _3 + 3
.macend

; -----------------------------------------------------------------------------

.macro dw_add_membyte
    ; argumentit: lähde muisti tavu, lähde/kohde muisti kaksoissana
    clc
    `_add_mem _1, _2 + 0
    `_add_const 0, _2 + 1
    `_add_const 0, _2 + 2
    `_add_const 0, _2 + 3
.macend

; -----------------------------------------------------------------------------

; ((_1 XOR _2) AND _3) XOR _1 -> _4

.macro _xor_and_xor
    lda _1
    eor _2
    and _3
    eor _1
    sta _4
.macend

.macro dw_xor_and_xor
    `_xor_and_xor _1 + 0, _2 + 0, _3 + 0, _4 + 0
    `_xor_and_xor _1 + 1, _2 + 1, _3 + 1, _4 + 1
    `_xor_and_xor _1 + 2, _2 + 2, _3 + 2, _4 + 2
    `_xor_and_xor _1 + 3, _2 + 3, _3 + 3, _4 + 3
.macend

; -----------------------------------------------------------------------------

; _1 XOR _2 XOR _3 -> _4

.macro _xor_xor
    lda _1
    eor _2
    eor _3
    sta _4
.macend

.macro dw_xor_xor
    `_xor_xor _1 + 0, _2 + 0, _3 + 0, _4 + 0
    `_xor_xor _1 + 1, _2 + 1, _3 + 1, _4 + 1
    `_xor_xor _1 + 2, _2 + 2, _3 + 2, _4 + 2
    `_xor_xor _1 + 3, _2 + 3, _3 + 3, _4 + 3
.macend

; -----------------------------------------------------------------------------

; ((NOT _1) OR _2) XOR _3 -> _4

.macro _not_or_xor
    lda _1
    eor #%11111111
    ora _2
    eor _3
    sta _4
.macend

.macro dw_not_or_xor
    `_not_or_xor _1 + 0, _2 + 0, _3 + 0, _4 + 0
    `_not_or_xor _1 + 1, _2 + 1, _3 + 1, _4 + 1
    `_not_or_xor _1 + 2, _2 + 2, _3 + 2, _4 + 2
    `_not_or_xor _1 + 3, _2 + 3, _3 + 3, _4 + 3
.macend

lähdekoodi raakana

Lähdekoodi makrot aukikirjoitettuina ja ilman kommentteja.

    lda #$01
    sta s0+0
    lda #$23
    sta s0+1
    lda #$45
    sta s0+2
    lda #$67
    sta s0+3
    lda #$89
    sta s1+0
    lda #$ab
    sta s1+1
    lda #$cd
    sta s1+2
    lda #$ef
    sta s1+3
    lda #$fe
    sta s2+0
    lda #$dc
    sta s2+1
    lda #$ba
    sta s2+2
    lda #$98
    sta s2+3
    lda #$76
    sta s3+0
    lda #$54
    sta s3+1
    lda #$32
    sta s3+2
    lda #$10
    sta s3+3
    lda s3+0
    eor s2+0
    and s1+0
    eor s3+0
    sta tempdw+0
    lda s3+1
    eor s2+1
    and s1+1
    eor s3+1
    sta tempdw+1
    lda s3+2
    eor s2+2
    and s1+2
    eor s3+2
    sta tempdw+2
    lda s3+3
    eor s2+3
    and s1+3
    eor s3+3
    sta tempdw+3
    clc
    lda s0+0
    adc tempdw+0
    sta tempdw+0
    lda s0+1
    adc tempdw+1
    sta tempdw+1
    lda s0+2
    adc tempdw+2
    sta tempdw+2
    lda s0+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda m0+0
    adc tempdw+0
    sta tempdw+0
    lda m0+1
    adc tempdw+1
    sta tempdw+1
    lda m0+2
    adc tempdw+2
    sta tempdw+2
    lda m0+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$78
    adc tempdw+0
    sta tempdw+0
    lda #$a4
    adc tempdw+1
    sta tempdw+1
    lda #$6a
    adc tempdw+2
    sta tempdw+2
    lda #$d7
    adc tempdw+3
    sta tempdw+3
    lda tempdw+3
    ldx tempdw+2
    stx tempdw+3
    ldx tempdw+1
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+1
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s1+0
    sta s0+0
    lda tempdw+1
    adc s1+1
    sta s0+1
    lda tempdw+2
    adc s1+2
    sta s0+2
    lda tempdw+3
    adc s1+3
    sta s0+3
    lda s2+0
    eor s1+0
    and s0+0
    eor s2+0
    sta tempdw+0
    lda s2+1
    eor s1+1
    and s0+1
    eor s2+1
    sta tempdw+1
    lda s2+2
    eor s1+2
    and s0+2
    eor s2+2
    sta tempdw+2
    lda s2+3
    eor s1+3
    and s0+3
    eor s2+3
    sta tempdw+3
    clc
    lda s3+0
    adc tempdw+0
    sta tempdw+0
    lda s3+1
    adc tempdw+1
    sta tempdw+1
    lda s3+2
    adc tempdw+2
    sta tempdw+2
    lda s3+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda m1+0
    adc tempdw+0
    sta tempdw+0
    lda m1+1
    adc tempdw+1
    sta tempdw+1
    lda m1+2
    adc tempdw+2
    sta tempdw+2
    lda m1+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$56
    adc tempdw+0
    sta tempdw+0
    lda #$b7
    adc tempdw+1
    sta tempdw+1
    lda #$c7
    adc tempdw+2
    sta tempdw+2
    lda #$e8
    adc tempdw+3
    sta tempdw+3
    ldx tempdw+2
    lda shl4_table,x
    ldx tempdw+1
    ora shr4_table,x
    sta tempdw2+3
    ldx tempdw+1
    lda shl4_table,x
    ldx tempdw+0
    ora shr4_table,x
    sta tempdw2+2
    ldx tempdw+0
    lda shl4_table,x
    ldx tempdw+3
    ora shr4_table,x
    sta tempdw+1
    ldx tempdw+3
    lda shl4_table,x
    ldx tempdw+2
    ora shr4_table,x
    sta tempdw+0
    lda tempdw2+2
    sta tempdw+2
    lda tempdw2+3
    sta tempdw+3
    clc
    lda tempdw+0
    adc s0+0
    sta s3+0
    lda tempdw+1
    adc s0+1
    sta s3+1
    lda tempdw+2
    adc s0+2
    sta s3+2
    lda tempdw+3
    adc s0+3
    sta s3+3
    lda s1+0
    eor s0+0
    and s3+0
    eor s1+0
    sta tempdw+0
    lda s1+1
    eor s0+1
    and s3+1
    eor s1+1
    sta tempdw+1
    lda s1+2
    eor s0+2
    and s3+2
    eor s1+2
    sta tempdw+2
    lda s1+3
    eor s0+3
    and s3+3
    eor s1+3
    sta tempdw+3
    clc
    lda s2+0
    adc tempdw+0
    sta tempdw+0
    lda s2+1
    adc tempdw+1
    sta tempdw+1
    lda s2+2
    adc tempdw+2
    sta tempdw+2
    lda s2+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$db
    adc tempdw+0
    sta tempdw+0
    lda #$70
    adc tempdw+1
    sta tempdw+1
    lda #$20
    adc tempdw+2
    sta tempdw+2
    lda #$24
    adc tempdw+3
    sta tempdw+3
    lda tempdw+0
    ldx tempdw+2
    stx tempdw+0
    sta tempdw+2
    lda tempdw+1
    ldx tempdw+3
    stx tempdw+1
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    sta tempdw+3
    clc
    lda tempdw+0
    adc s3+0
    sta s2+0
    lda tempdw+1
    adc s3+1
    sta s2+1
    lda tempdw+2
    adc s3+2
    sta s2+2
    lda tempdw+3
    adc s3+3
    sta s2+3
    lda s0+0
    eor s3+0
    and s2+0
    eor s0+0
    sta tempdw+0
    lda s0+1
    eor s3+1
    and s2+1
    eor s0+1
    sta tempdw+1
    lda s0+2
    eor s3+2
    and s2+2
    eor s0+2
    sta tempdw+2
    lda s0+3
    eor s3+3
    and s2+3
    eor s0+3
    sta tempdw+3
    clc
    lda s1+0
    adc tempdw+0
    sta tempdw+0
    lda s1+1
    adc tempdw+1
    sta tempdw+1
    lda s1+2
    adc tempdw+2
    sta tempdw+2
    lda s1+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$ee
    adc tempdw+0
    sta tempdw+0
    lda #$ce
    adc tempdw+1
    sta tempdw+1
    lda #$bd
    adc tempdw+2
    sta tempdw+2
    lda #$c1
    adc tempdw+3
    sta tempdw+3
    lda tempdw+1
    ldx tempdw+2
    stx tempdw+1
    ldx tempdw+3
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+3
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s2+0
    sta s1+0
    lda tempdw+1
    adc s2+1
    sta s1+1
    lda tempdw+2
    adc s2+2
    sta s1+2
    lda tempdw+3
    adc s2+3
    sta s1+3
    lda s3+0
    eor s2+0
    and s1+0
    eor s3+0
    sta tempdw+0
    lda s3+1
    eor s2+1
    and s1+1
    eor s3+1
    sta tempdw+1
    lda s3+2
    eor s2+2
    and s1+2
    eor s3+2
    sta tempdw+2
    lda s3+3
    eor s2+3
    and s1+3
    eor s3+3
    sta tempdw+3
    clc
    lda s0+0
    adc tempdw+0
    sta tempdw+0
    lda s0+1
    adc tempdw+1
    sta tempdw+1
    lda s0+2
    adc tempdw+2
    sta tempdw+2
    lda s0+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$af
    adc tempdw+0
    sta tempdw+0
    lda #$0f
    adc tempdw+1
    sta tempdw+1
    lda #$7c
    adc tempdw+2
    sta tempdw+2
    lda #$f5
    adc tempdw+3
    sta tempdw+3
    lda tempdw+3
    ldx tempdw+2
    stx tempdw+3
    ldx tempdw+1
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+1
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s1+0
    sta s0+0
    lda tempdw+1
    adc s1+1
    sta s0+1
    lda tempdw+2
    adc s1+2
    sta s0+2
    lda tempdw+3
    adc s1+3
    sta s0+3
    lda s2+0
    eor s1+0
    and s0+0
    eor s2+0
    sta tempdw+0
    lda s2+1
    eor s1+1
    and s0+1
    eor s2+1
    sta tempdw+1
    lda s2+2
    eor s1+2
    and s0+2
    eor s2+2
    sta tempdw+2
    lda s2+3
    eor s1+3
    and s0+3
    eor s2+3
    sta tempdw+3
    clc
    lda s3+0
    adc tempdw+0
    sta tempdw+0
    lda s3+1
    adc tempdw+1
    sta tempdw+1
    lda s3+2
    adc tempdw+2
    sta tempdw+2
    lda s3+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$2a
    adc tempdw+0
    sta tempdw+0
    lda #$c6
    adc tempdw+1
    sta tempdw+1
    lda #$87
    adc tempdw+2
    sta tempdw+2
    lda #$47
    adc tempdw+3
    sta tempdw+3
    ldx tempdw+2
    lda shl4_table,x
    ldx tempdw+1
    ora shr4_table,x
    sta tempdw2+3
    ldx tempdw+1
    lda shl4_table,x
    ldx tempdw+0
    ora shr4_table,x
    sta tempdw2+2
    ldx tempdw+0
    lda shl4_table,x
    ldx tempdw+3
    ora shr4_table,x
    sta tempdw+1
    ldx tempdw+3
    lda shl4_table,x
    ldx tempdw+2
    ora shr4_table,x
    sta tempdw+0
    lda tempdw2+2
    sta tempdw+2
    lda tempdw2+3
    sta tempdw+3
    clc
    lda tempdw+0
    adc s0+0
    sta s3+0
    lda tempdw+1
    adc s0+1
    sta s3+1
    lda tempdw+2
    adc s0+2
    sta s3+2
    lda tempdw+3
    adc s0+3
    sta s3+3
    lda s1+0
    eor s0+0
    and s3+0
    eor s1+0
    sta tempdw+0
    lda s1+1
    eor s0+1
    and s3+1
    eor s1+1
    sta tempdw+1
    lda s1+2
    eor s0+2
    and s3+2
    eor s1+2
    sta tempdw+2
    lda s1+3
    eor s0+3
    and s3+3
    eor s1+3
    sta tempdw+3
    clc
    lda s2+0
    adc tempdw+0
    sta tempdw+0
    lda s2+1
    adc tempdw+1
    sta tempdw+1
    lda s2+2
    adc tempdw+2
    sta tempdw+2
    lda s2+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$13
    adc tempdw+0
    sta tempdw+0
    lda #$46
    adc tempdw+1
    sta tempdw+1
    lda #$30
    adc tempdw+2
    sta tempdw+2
    lda #$a8
    adc tempdw+3
    sta tempdw+3
    lda tempdw+0
    ldx tempdw+2
    stx tempdw+0
    sta tempdw+2
    lda tempdw+1
    ldx tempdw+3
    stx tempdw+1
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    sta tempdw+3
    clc
    lda tempdw+0
    adc s3+0
    sta s2+0
    lda tempdw+1
    adc s3+1
    sta s2+1
    lda tempdw+2
    adc s3+2
    sta s2+2
    lda tempdw+3
    adc s3+3
    sta s2+3
    lda s0+0
    eor s3+0
    and s2+0
    eor s0+0
    sta tempdw+0
    lda s0+1
    eor s3+1
    and s2+1
    eor s0+1
    sta tempdw+1
    lda s0+2
    eor s3+2
    and s2+2
    eor s0+2
    sta tempdw+2
    lda s0+3
    eor s3+3
    and s2+3
    eor s0+3
    sta tempdw+3
    clc
    lda s1+0
    adc tempdw+0
    sta tempdw+0
    lda s1+1
    adc tempdw+1
    sta tempdw+1
    lda s1+2
    adc tempdw+2
    sta tempdw+2
    lda s1+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$01
    adc tempdw+0
    sta tempdw+0
    lda #$95
    adc tempdw+1
    sta tempdw+1
    lda #$46
    adc tempdw+2
    sta tempdw+2
    lda #$fd
    adc tempdw+3
    sta tempdw+3
    lda tempdw+1
    ldx tempdw+2
    stx tempdw+1
    ldx tempdw+3
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+3
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s2+0
    sta s1+0
    lda tempdw+1
    adc s2+1
    sta s1+1
    lda tempdw+2
    adc s2+2
    sta s1+2
    lda tempdw+3
    adc s2+3
    sta s1+3
    lda s3+0
    eor s2+0
    and s1+0
    eor s3+0
    sta tempdw+0
    lda s3+1
    eor s2+1
    and s1+1
    eor s3+1
    sta tempdw+1
    lda s3+2
    eor s2+2
    and s1+2
    eor s3+2
    sta tempdw+2
    lda s3+3
    eor s2+3
    and s1+3
    eor s3+3
    sta tempdw+3
    clc
    lda s0+0
    adc tempdw+0
    sta tempdw+0
    lda s0+1
    adc tempdw+1
    sta tempdw+1
    lda s0+2
    adc tempdw+2
    sta tempdw+2
    lda s0+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$d8
    adc tempdw+0
    sta tempdw+0
    lda #$98
    adc tempdw+1
    sta tempdw+1
    lda #$80
    adc tempdw+2
    sta tempdw+2
    lda #$69
    adc tempdw+3
    sta tempdw+3
    lda tempdw+3
    ldx tempdw+2
    stx tempdw+3
    ldx tempdw+1
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+1
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s1+0
    sta s0+0
    lda tempdw+1
    adc s1+1
    sta s0+1
    lda tempdw+2
    adc s1+2
    sta s0+2
    lda tempdw+3
    adc s1+3
    sta s0+3
    lda s2+0
    eor s1+0
    and s0+0
    eor s2+0
    sta tempdw+0
    lda s2+1
    eor s1+1
    and s0+1
    eor s2+1
    sta tempdw+1
    lda s2+2
    eor s1+2
    and s0+2
    eor s2+2
    sta tempdw+2
    lda s2+3
    eor s1+3
    and s0+3
    eor s2+3
    sta tempdw+3
    clc
    lda s3+0
    adc tempdw+0
    sta tempdw+0
    lda s3+1
    adc tempdw+1
    sta tempdw+1
    lda s3+2
    adc tempdw+2
    sta tempdw+2
    lda s3+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$af
    adc tempdw+0
    sta tempdw+0
    lda #$f7
    adc tempdw+1
    sta tempdw+1
    lda #$44
    adc tempdw+2
    sta tempdw+2
    lda #$8b
    adc tempdw+3
    sta tempdw+3
    ldx tempdw+2
    lda shl4_table,x
    ldx tempdw+1
    ora shr4_table,x
    sta tempdw2+3
    ldx tempdw+1
    lda shl4_table,x
    ldx tempdw+0
    ora shr4_table,x
    sta tempdw2+2
    ldx tempdw+0
    lda shl4_table,x
    ldx tempdw+3
    ora shr4_table,x
    sta tempdw+1
    ldx tempdw+3
    lda shl4_table,x
    ldx tempdw+2
    ora shr4_table,x
    sta tempdw+0
    lda tempdw2+2
    sta tempdw+2
    lda tempdw2+3
    sta tempdw+3
    clc
    lda tempdw+0
    adc s0+0
    sta s3+0
    lda tempdw+1
    adc s0+1
    sta s3+1
    lda tempdw+2
    adc s0+2
    sta s3+2
    lda tempdw+3
    adc s0+3
    sta s3+3
    lda s1+0
    eor s0+0
    and s3+0
    eor s1+0
    sta tempdw+0
    lda s1+1
    eor s0+1
    and s3+1
    eor s1+1
    sta tempdw+1
    lda s1+2
    eor s0+2
    and s3+2
    eor s1+2
    sta tempdw+2
    lda s1+3
    eor s0+3
    and s3+3
    eor s1+3
    sta tempdw+3
    clc
    lda s2+0
    adc tempdw+0
    sta tempdw+0
    lda s2+1
    adc tempdw+1
    sta tempdw+1
    lda s2+2
    adc tempdw+2
    sta tempdw+2
    lda s2+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$b1
    adc tempdw+0
    sta tempdw+0
    lda #$5b
    adc tempdw+1
    sta tempdw+1
    lda #$ff
    adc tempdw+2
    sta tempdw+2
    lda #$ff
    adc tempdw+3
    sta tempdw+3
    lda tempdw+0
    ldx tempdw+2
    stx tempdw+0
    sta tempdw+2
    lda tempdw+1
    ldx tempdw+3
    stx tempdw+1
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    sta tempdw+3
    clc
    lda tempdw+0
    adc s3+0
    sta s2+0
    lda tempdw+1
    adc s3+1
    sta s2+1
    lda tempdw+2
    adc s3+2
    sta s2+2
    lda tempdw+3
    adc s3+3
    sta s2+3
    lda s0+0
    eor s3+0
    and s2+0
    eor s0+0
    sta tempdw+0
    lda s0+1
    eor s3+1
    and s2+1
    eor s0+1
    sta tempdw+1
    lda s0+2
    eor s3+2
    and s2+2
    eor s0+2
    sta tempdw+2
    lda s0+3
    eor s3+3
    and s2+3
    eor s0+3
    sta tempdw+3
    clc
    lda s1+0
    adc tempdw+0
    sta tempdw+0
    lda s1+1
    adc tempdw+1
    sta tempdw+1
    lda s1+2
    adc tempdw+2
    sta tempdw+2
    lda s1+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$be
    adc tempdw+0
    sta tempdw+0
    lda #$d7
    adc tempdw+1
    sta tempdw+1
    lda #$5c
    adc tempdw+2
    sta tempdw+2
    lda #$89
    adc tempdw+3
    sta tempdw+3
    lda tempdw+1
    ldx tempdw+2
    stx tempdw+1
    ldx tempdw+3
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+3
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s2+0
    sta s1+0
    lda tempdw+1
    adc s2+1
    sta s1+1
    lda tempdw+2
    adc s2+2
    sta s1+2
    lda tempdw+3
    adc s2+3
    sta s1+3
    lda s3+0
    eor s2+0
    and s1+0
    eor s3+0
    sta tempdw+0
    lda s3+1
    eor s2+1
    and s1+1
    eor s3+1
    sta tempdw+1
    lda s3+2
    eor s2+2
    and s1+2
    eor s3+2
    sta tempdw+2
    lda s3+3
    eor s2+3
    and s1+3
    eor s3+3
    sta tempdw+3
    clc
    lda s0+0
    adc tempdw+0
    sta tempdw+0
    lda s0+1
    adc tempdw+1
    sta tempdw+1
    lda s0+2
    adc tempdw+2
    sta tempdw+2
    lda s0+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$22
    adc tempdw+0
    sta tempdw+0
    lda #$11
    adc tempdw+1
    sta tempdw+1
    lda #$90
    adc tempdw+2
    sta tempdw+2
    lda #$6b
    adc tempdw+3
    sta tempdw+3
    lda tempdw+3
    ldx tempdw+2
    stx tempdw+3
    ldx tempdw+1
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+1
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s1+0
    sta s0+0
    lda tempdw+1
    adc s1+1
    sta s0+1
    lda tempdw+2
    adc s1+2
    sta s0+2
    lda tempdw+3
    adc s1+3
    sta s0+3
    lda s2+0
    eor s1+0
    and s0+0
    eor s2+0
    sta tempdw+0
    lda s2+1
    eor s1+1
    and s0+1
    eor s2+1
    sta tempdw+1
    lda s2+2
    eor s1+2
    and s0+2
    eor s2+2
    sta tempdw+2
    lda s2+3
    eor s1+3
    and s0+3
    eor s2+3
    sta tempdw+3
    clc
    lda s3+0
    adc tempdw+0
    sta tempdw+0
    lda s3+1
    adc tempdw+1
    sta tempdw+1
    lda s3+2
    adc tempdw+2
    sta tempdw+2
    lda s3+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$93
    adc tempdw+0
    sta tempdw+0
    lda #$71
    adc tempdw+1
    sta tempdw+1
    lda #$98
    adc tempdw+2
    sta tempdw+2
    lda #$fd
    adc tempdw+3
    sta tempdw+3
    ldx tempdw+2
    lda shl4_table,x
    ldx tempdw+1
    ora shr4_table,x
    sta tempdw2+3
    ldx tempdw+1
    lda shl4_table,x
    ldx tempdw+0
    ora shr4_table,x
    sta tempdw2+2
    ldx tempdw+0
    lda shl4_table,x
    ldx tempdw+3
    ora shr4_table,x
    sta tempdw+1
    ldx tempdw+3
    lda shl4_table,x
    ldx tempdw+2
    ora shr4_table,x
    sta tempdw+0
    lda tempdw2+2
    sta tempdw+2
    lda tempdw2+3
    sta tempdw+3
    clc
    lda tempdw+0
    adc s0+0
    sta s3+0
    lda tempdw+1
    adc s0+1
    sta s3+1
    lda tempdw+2
    adc s0+2
    sta s3+2
    lda tempdw+3
    adc s0+3
    sta s3+3
    lda s1+0
    eor s0+0
    and s3+0
    eor s1+0
    sta tempdw+0
    lda s1+1
    eor s0+1
    and s3+1
    eor s1+1
    sta tempdw+1
    lda s1+2
    eor s0+2
    and s3+2
    eor s1+2
    sta tempdw+2
    lda s1+3
    eor s0+3
    and s3+3
    eor s1+3
    sta tempdw+3
    clc
    lda s2+0
    adc tempdw+0
    sta tempdw+0
    lda s2+1
    adc tempdw+1
    sta tempdw+1
    lda s2+2
    adc tempdw+2
    sta tempdw+2
    lda s2+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$8e
    adc tempdw+0
    sta tempdw+0
    lda #$43
    adc tempdw+1
    sta tempdw+1
    lda #$79
    adc tempdw+2
    sta tempdw+2
    lda #$a6
    adc tempdw+3
    sta tempdw+3
    clc
    lda message_length_in_bits
    adc tempdw+0
    sta tempdw+0
    lda #$00
    adc tempdw+1
    sta tempdw+1
    lda #$00
    adc tempdw+2
    sta tempdw+2
    lda #$00
    adc tempdw+3
    sta tempdw+3
    lda tempdw+0
    ldx tempdw+2
    stx tempdw+0
    sta tempdw+2
    lda tempdw+1
    ldx tempdw+3
    stx tempdw+1
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    sta tempdw+3
    clc
    lda tempdw+0
    adc s3+0
    sta s2+0
    lda tempdw+1
    adc s3+1
    sta s2+1
    lda tempdw+2
    adc s3+2
    sta s2+2
    lda tempdw+3
    adc s3+3
    sta s2+3
    lda s0+0
    eor s3+0
    and s2+0
    eor s0+0
    sta tempdw+0
    lda s0+1
    eor s3+1
    and s2+1
    eor s0+1
    sta tempdw+1
    lda s0+2
    eor s3+2
    and s2+2
    eor s0+2
    sta tempdw+2
    lda s0+3
    eor s3+3
    and s2+3
    eor s0+3
    sta tempdw+3
    clc
    lda s1+0
    adc tempdw+0
    sta tempdw+0
    lda s1+1
    adc tempdw+1
    sta tempdw+1
    lda s1+2
    adc tempdw+2
    sta tempdw+2
    lda s1+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$21
    adc tempdw+0
    sta tempdw+0
    lda #$08
    adc tempdw+1
    sta tempdw+1
    lda #$b4
    adc tempdw+2
    sta tempdw+2
    lda #$49
    adc tempdw+3
    sta tempdw+3
    lda tempdw+1
    ldx tempdw+2
    stx tempdw+1
    ldx tempdw+3
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+3
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s2+0
    sta s1+0
    lda tempdw+1
    adc s2+1
    sta s1+1
    lda tempdw+2
    adc s2+2
    sta s1+2
    lda tempdw+3
    adc s2+3
    sta s1+3
    lda s2+0
    eor s1+0
    and s3+0
    eor s2+0
    sta tempdw+0
    lda s2+1
    eor s1+1
    and s3+1
    eor s2+1
    sta tempdw+1
    lda s2+2
    eor s1+2
    and s3+2
    eor s2+2
    sta tempdw+2
    lda s2+3
    eor s1+3
    and s3+3
    eor s2+3
    sta tempdw+3
    clc
    lda s0+0
    adc tempdw+0
    sta tempdw+0
    lda s0+1
    adc tempdw+1
    sta tempdw+1
    lda s0+2
    adc tempdw+2
    sta tempdw+2
    lda s0+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda m1+0
    adc tempdw+0
    sta tempdw+0
    lda m1+1
    adc tempdw+1
    sta tempdw+1
    lda m1+2
    adc tempdw+2
    sta tempdw+2
    lda m1+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$62
    adc tempdw+0
    sta tempdw+0
    lda #$25
    adc tempdw+1
    sta tempdw+1
    lda #$1e
    adc tempdw+2
    sta tempdw+2
    lda #$f6
    adc tempdw+3
    sta tempdw+3
    lda tempdw+3
    ldx tempdw+2
    stx tempdw+3
    ldx tempdw+1
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+1
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s1+0
    sta s0+0
    lda tempdw+1
    adc s1+1
    sta s0+1
    lda tempdw+2
    adc s1+2
    sta s0+2
    lda tempdw+3
    adc s1+3
    sta s0+3
    lda s1+0
    eor s0+0
    and s2+0
    eor s1+0
    sta tempdw+0
    lda s1+1
    eor s0+1
    and s2+1
    eor s1+1
    sta tempdw+1
    lda s1+2
    eor s0+2
    and s2+2
    eor s1+2
    sta tempdw+2
    lda s1+3
    eor s0+3
    and s2+3
    eor s1+3
    sta tempdw+3
    clc
    lda s3+0
    adc tempdw+0
    sta tempdw+0
    lda s3+1
    adc tempdw+1
    sta tempdw+1
    lda s3+2
    adc tempdw+2
    sta tempdw+2
    lda s3+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$40
    adc tempdw+0
    sta tempdw+0
    lda #$b3
    adc tempdw+1
    sta tempdw+1
    lda #$40
    adc tempdw+2
    sta tempdw+2
    lda #$c0
    adc tempdw+3
    sta tempdw+3
    lda tempdw+2
    ldx tempdw+1
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+1
    ldx tempdw+3
    stx tempdw+0
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    sta tempdw+3
    clc
    lda tempdw+0
    adc s0+0
    sta s3+0
    lda tempdw+1
    adc s0+1
    sta s3+1
    lda tempdw+2
    adc s0+2
    sta s3+2
    lda tempdw+3
    adc s0+3
    sta s3+3
    lda s0+0
    eor s3+0
    and s1+0
    eor s0+0
    sta tempdw+0
    lda s0+1
    eor s3+1
    and s1+1
    eor s0+1
    sta tempdw+1
    lda s0+2
    eor s3+2
    and s1+2
    eor s0+2
    sta tempdw+2
    lda s0+3
    eor s3+3
    and s1+3
    eor s0+3
    sta tempdw+3
    clc
    lda s2+0
    adc tempdw+0
    sta tempdw+0
    lda s2+1
    adc tempdw+1
    sta tempdw+1
    lda s2+2
    adc tempdw+2
    sta tempdw+2
    lda s2+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$51
    adc tempdw+0
    sta tempdw+0
    lda #$5a
    adc tempdw+1
    sta tempdw+1
    lda #$5e
    adc tempdw+2
    sta tempdw+2
    lda #$26
    adc tempdw+3
    sta tempdw+3
    lda tempdw+3
    ldx tempdw+1
    stx tempdw+3
    sta tempdw+1
    lda tempdw+2
    ldx tempdw+0
    stx tempdw+2
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s3+0
    sta s2+0
    lda tempdw+1
    adc s3+1
    sta s2+1
    lda tempdw+2
    adc s3+2
    sta s2+2
    lda tempdw+3
    adc s3+3
    sta s2+3
    lda s3+0
    eor s2+0
    and s0+0
    eor s3+0
    sta tempdw+0
    lda s3+1
    eor s2+1
    and s0+1
    eor s3+1
    sta tempdw+1
    lda s3+2
    eor s2+2
    and s0+2
    eor s3+2
    sta tempdw+2
    lda s3+3
    eor s2+3
    and s0+3
    eor s3+3
    sta tempdw+3
    clc
    lda m0+0
    adc tempdw+0
    sta tempdw+0
    lda m0+1
    adc tempdw+1
    sta tempdw+1
    lda m0+2
    adc tempdw+2
    sta tempdw+2
    lda m0+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda s1+0
    adc tempdw+0
    sta tempdw+0
    lda s1+1
    adc tempdw+1
    sta tempdw+1
    lda s1+2
    adc tempdw+2
    sta tempdw+2
    lda s1+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$aa
    adc tempdw+0
    sta tempdw+0
    lda #$c7
    adc tempdw+1
    sta tempdw+1
    lda #$b6
    adc tempdw+2
    sta tempdw+2
    lda #$e9
    adc tempdw+3
    sta tempdw+3
    ldx tempdw+2
    lda shl4_table,x
    ldx tempdw+1
    ora shr4_table,x
    sta tempdw2+0
    ldx tempdw+1
    lda shl4_table,x
    ldx tempdw+0
    ora shr4_table,x
    sta tempdw2+3
    ldx tempdw+3
    lda shl4_table,x
    ldx tempdw+2
    ora shr4_table,x
    sta tempdw+1
    ldx tempdw+0
    lda shl4_table,x
    ldx tempdw+3
    ora shr4_table,x
    sta tempdw+2
    lda tempdw2+0
    sta tempdw+0
    lda tempdw2+3
    sta tempdw+3
    clc
    lda tempdw+0
    adc s2+0
    sta s1+0
    lda tempdw+1
    adc s2+1
    sta s1+1
    lda tempdw+2
    adc s2+2
    sta s1+2
    lda tempdw+3
    adc s2+3
    sta s1+3
    lda s2+0
    eor s1+0
    and s3+0
    eor s2+0
    sta tempdw+0
    lda s2+1
    eor s1+1
    and s3+1
    eor s2+1
    sta tempdw+1
    lda s2+2
    eor s1+2
    and s3+2
    eor s2+2
    sta tempdw+2
    lda s2+3
    eor s1+3
    and s3+3
    eor s2+3
    sta tempdw+3
    clc
    lda s0+0
    adc tempdw+0
    sta tempdw+0
    lda s0+1
    adc tempdw+1
    sta tempdw+1
    lda s0+2
    adc tempdw+2
    sta tempdw+2
    lda s0+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$5d
    adc tempdw+0
    sta tempdw+0
    lda #$10
    adc tempdw+1
    sta tempdw+1
    lda #$2f
    adc tempdw+2
    sta tempdw+2
    lda #$d6
    adc tempdw+3
    sta tempdw+3
    lda tempdw+3
    ldx tempdw+2
    stx tempdw+3
    ldx tempdw+1
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+1
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s1+0
    sta s0+0
    lda tempdw+1
    adc s1+1
    sta s0+1
    lda tempdw+2
    adc s1+2
    sta s0+2
    lda tempdw+3
    adc s1+3
    sta s0+3
    lda s1+0
    eor s0+0
    and s2+0
    eor s1+0
    sta tempdw+0
    lda s1+1
    eor s0+1
    and s2+1
    eor s1+1
    sta tempdw+1
    lda s1+2
    eor s0+2
    and s2+2
    eor s1+2
    sta tempdw+2
    lda s1+3
    eor s0+3
    and s2+3
    eor s1+3
    sta tempdw+3
    clc
    lda s3+0
    adc tempdw+0
    sta tempdw+0
    lda s3+1
    adc tempdw+1
    sta tempdw+1
    lda s3+2
    adc tempdw+2
    sta tempdw+2
    lda s3+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$53
    adc tempdw+0
    sta tempdw+0
    lda #$14
    adc tempdw+1
    sta tempdw+1
    lda #$44
    adc tempdw+2
    sta tempdw+2
    lda #$02
    adc tempdw+3
    sta tempdw+3
    lda tempdw+2
    ldx tempdw+1
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+1
    ldx tempdw+3
    stx tempdw+0
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    sta tempdw+3
    clc
    lda tempdw+0
    adc s0+0
    sta s3+0
    lda tempdw+1
    adc s0+1
    sta s3+1
    lda tempdw+2
    adc s0+2
    sta s3+2
    lda tempdw+3
    adc s0+3
    sta s3+3
    lda s0+0
    eor s3+0
    and s1+0
    eor s0+0
    sta tempdw+0
    lda s0+1
    eor s3+1
    and s1+1
    eor s0+1
    sta tempdw+1
    lda s0+2
    eor s3+2
    and s1+2
    eor s0+2
    sta tempdw+2
    lda s0+3
    eor s3+3
    and s1+3
    eor s0+3
    sta tempdw+3
    clc
    lda s2+0
    adc tempdw+0
    sta tempdw+0
    lda s2+1
    adc tempdw+1
    sta tempdw+1
    lda s2+2
    adc tempdw+2
    sta tempdw+2
    lda s2+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$81
    adc tempdw+0
    sta tempdw+0
    lda #$e6
    adc tempdw+1
    sta tempdw+1
    lda #$a1
    adc tempdw+2
    sta tempdw+2
    lda #$d8
    adc tempdw+3
    sta tempdw+3
    lda tempdw+3
    ldx tempdw+1
    stx tempdw+3
    sta tempdw+1
    lda tempdw+2
    ldx tempdw+0
    stx tempdw+2
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s3+0
    sta s2+0
    lda tempdw+1
    adc s3+1
    sta s2+1
    lda tempdw+2
    adc s3+2
    sta s2+2
    lda tempdw+3
    adc s3+3
    sta s2+3
    lda s3+0
    eor s2+0
    and s0+0
    eor s3+0
    sta tempdw+0
    lda s3+1
    eor s2+1
    and s0+1
    eor s3+1
    sta tempdw+1
    lda s3+2
    eor s2+2
    and s0+2
    eor s3+2
    sta tempdw+2
    lda s3+3
    eor s2+3
    and s0+3
    eor s3+3
    sta tempdw+3
    clc
    lda s1+0
    adc tempdw+0
    sta tempdw+0
    lda s1+1
    adc tempdw+1
    sta tempdw+1
    lda s1+2
    adc tempdw+2
    sta tempdw+2
    lda s1+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$c8
    adc tempdw+0
    sta tempdw+0
    lda #$fb
    adc tempdw+1
    sta tempdw+1
    lda #$d3
    adc tempdw+2
    sta tempdw+2
    lda #$e7
    adc tempdw+3
    sta tempdw+3
    ldx tempdw+2
    lda shl4_table,x
    ldx tempdw+1
    ora shr4_table,x
    sta tempdw2+0
    ldx tempdw+1
    lda shl4_table,x
    ldx tempdw+0
    ora shr4_table,x
    sta tempdw2+3
    ldx tempdw+3
    lda shl4_table,x
    ldx tempdw+2
    ora shr4_table,x
    sta tempdw+1
    ldx tempdw+0
    lda shl4_table,x
    ldx tempdw+3
    ora shr4_table,x
    sta tempdw+2
    lda tempdw2+0
    sta tempdw+0
    lda tempdw2+3
    sta tempdw+3
    clc
    lda tempdw+0
    adc s2+0
    sta s1+0
    lda tempdw+1
    adc s2+1
    sta s1+1
    lda tempdw+2
    adc s2+2
    sta s1+2
    lda tempdw+3
    adc s2+3
    sta s1+3
    lda s2+0
    eor s1+0
    and s3+0
    eor s2+0
    sta tempdw+0
    lda s2+1
    eor s1+1
    and s3+1
    eor s2+1
    sta tempdw+1
    lda s2+2
    eor s1+2
    and s3+2
    eor s2+2
    sta tempdw+2
    lda s2+3
    eor s1+3
    and s3+3
    eor s2+3
    sta tempdw+3
    clc
    lda s0+0
    adc tempdw+0
    sta tempdw+0
    lda s0+1
    adc tempdw+1
    sta tempdw+1
    lda s0+2
    adc tempdw+2
    sta tempdw+2
    lda s0+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$e6
    adc tempdw+0
    sta tempdw+0
    lda #$cd
    adc tempdw+1
    sta tempdw+1
    lda #$e1
    adc tempdw+2
    sta tempdw+2
    lda #$21
    adc tempdw+3
    sta tempdw+3
    lda tempdw+3
    ldx tempdw+2
    stx tempdw+3
    ldx tempdw+1
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+1
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s1+0
    sta s0+0
    lda tempdw+1
    adc s1+1
    sta s0+1
    lda tempdw+2
    adc s1+2
    sta s0+2
    lda tempdw+3
    adc s1+3
    sta s0+3
    lda s1+0
    eor s0+0
    and s2+0
    eor s1+0
    sta tempdw+0
    lda s1+1
    eor s0+1
    and s2+1
    eor s1+1
    sta tempdw+1
    lda s1+2
    eor s0+2
    and s2+2
    eor s1+2
    sta tempdw+2
    lda s1+3
    eor s0+3
    and s2+3
    eor s1+3
    sta tempdw+3
    clc
    lda s3+0
    adc tempdw+0
    sta tempdw+0
    lda s3+1
    adc tempdw+1
    sta tempdw+1
    lda s3+2
    adc tempdw+2
    sta tempdw+2
    lda s3+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$d6
    adc tempdw+0
    sta tempdw+0
    lda #$07
    adc tempdw+1
    sta tempdw+1
    lda #$37
    adc tempdw+2
    sta tempdw+2
    lda #$c3
    adc tempdw+3
    sta tempdw+3
    clc
    lda message_length_in_bits
    adc tempdw+0
    sta tempdw+0
    lda #$00
    adc tempdw+1
    sta tempdw+1
    lda #$00
    adc tempdw+2
    sta tempdw+2
    lda #$00
    adc tempdw+3
    sta tempdw+3
    lda tempdw+2
    ldx tempdw+1
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+1
    ldx tempdw+3
    stx tempdw+0
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    sta tempdw+3
    clc
    lda tempdw+0
    adc s0+0
    sta s3+0
    lda tempdw+1
    adc s0+1
    sta s3+1
    lda tempdw+2
    adc s0+2
    sta s3+2
    lda tempdw+3
    adc s0+3
    sta s3+3
    lda s0+0
    eor s3+0
    and s1+0
    eor s0+0
    sta tempdw+0
    lda s0+1
    eor s3+1
    and s1+1
    eor s0+1
    sta tempdw+1
    lda s0+2
    eor s3+2
    and s1+2
    eor s0+2
    sta tempdw+2
    lda s0+3
    eor s3+3
    and s1+3
    eor s0+3
    sta tempdw+3
    clc
    lda s2+0
    adc tempdw+0
    sta tempdw+0
    lda s2+1
    adc tempdw+1
    sta tempdw+1
    lda s2+2
    adc tempdw+2
    sta tempdw+2
    lda s2+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$87
    adc tempdw+0
    sta tempdw+0
    lda #$0d
    adc tempdw+1
    sta tempdw+1
    lda #$d5
    adc tempdw+2
    sta tempdw+2
    lda #$f4
    adc tempdw+3
    sta tempdw+3
    lda tempdw+3
    ldx tempdw+1
    stx tempdw+3
    sta tempdw+1
    lda tempdw+2
    ldx tempdw+0
    stx tempdw+2
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s3+0
    sta s2+0
    lda tempdw+1
    adc s3+1
    sta s2+1
    lda tempdw+2
    adc s3+2
    sta s2+2
    lda tempdw+3
    adc s3+3
    sta s2+3
    lda s3+0
    eor s2+0
    and s0+0
    eor s3+0
    sta tempdw+0
    lda s3+1
    eor s2+1
    and s0+1
    eor s3+1
    sta tempdw+1
    lda s3+2
    eor s2+2
    and s0+2
    eor s3+2
    sta tempdw+2
    lda s3+3
    eor s2+3
    and s0+3
    eor s3+3
    sta tempdw+3
    clc
    lda s1+0
    adc tempdw+0
    sta tempdw+0
    lda s1+1
    adc tempdw+1
    sta tempdw+1
    lda s1+2
    adc tempdw+2
    sta tempdw+2
    lda s1+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$ed
    adc tempdw+0
    sta tempdw+0
    lda #$14
    adc tempdw+1
    sta tempdw+1
    lda #$5a
    adc tempdw+2
    sta tempdw+2
    lda #$45
    adc tempdw+3
    sta tempdw+3
    ldx tempdw+2
    lda shl4_table,x
    ldx tempdw+1
    ora shr4_table,x
    sta tempdw2+0
    ldx tempdw+1
    lda shl4_table,x
    ldx tempdw+0
    ora shr4_table,x
    sta tempdw2+3
    ldx tempdw+3
    lda shl4_table,x
    ldx tempdw+2
    ora shr4_table,x
    sta tempdw+1
    ldx tempdw+0
    lda shl4_table,x
    ldx tempdw+3
    ora shr4_table,x
    sta tempdw+2
    lda tempdw2+0
    sta tempdw+0
    lda tempdw2+3
    sta tempdw+3
    clc
    lda tempdw+0
    adc s2+0
    sta s1+0
    lda tempdw+1
    adc s2+1
    sta s1+1
    lda tempdw+2
    adc s2+2
    sta s1+2
    lda tempdw+3
    adc s2+3
    sta s1+3
    lda s2+0
    eor s1+0
    and s3+0
    eor s2+0
    sta tempdw+0
    lda s2+1
    eor s1+1
    and s3+1
    eor s2+1
    sta tempdw+1
    lda s2+2
    eor s1+2
    and s3+2
    eor s2+2
    sta tempdw+2
    lda s2+3
    eor s1+3
    and s3+3
    eor s2+3
    sta tempdw+3
    clc
    lda s0+0
    adc tempdw+0
    sta tempdw+0
    lda s0+1
    adc tempdw+1
    sta tempdw+1
    lda s0+2
    adc tempdw+2
    sta tempdw+2
    lda s0+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$05
    adc tempdw+0
    sta tempdw+0
    lda #$e9
    adc tempdw+1
    sta tempdw+1
    lda #$e3
    adc tempdw+2
    sta tempdw+2
    lda #$a9
    adc tempdw+3
    sta tempdw+3
    lda tempdw+3
    ldx tempdw+2
    stx tempdw+3
    ldx tempdw+1
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+1
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s1+0
    sta s0+0
    lda tempdw+1
    adc s1+1
    sta s0+1
    lda tempdw+2
    adc s1+2
    sta s0+2
    lda tempdw+3
    adc s1+3
    sta s0+3
    lda s1+0
    eor s0+0
    and s2+0
    eor s1+0
    sta tempdw+0
    lda s1+1
    eor s0+1
    and s2+1
    eor s1+1
    sta tempdw+1
    lda s1+2
    eor s0+2
    and s2+2
    eor s1+2
    sta tempdw+2
    lda s1+3
    eor s0+3
    and s2+3
    eor s1+3
    sta tempdw+3
    clc
    lda s3+0
    adc tempdw+0
    sta tempdw+0
    lda s3+1
    adc tempdw+1
    sta tempdw+1
    lda s3+2
    adc tempdw+2
    sta tempdw+2
    lda s3+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$f8
    adc tempdw+0
    sta tempdw+0
    lda #$a3
    adc tempdw+1
    sta tempdw+1
    lda #$ef
    adc tempdw+2
    sta tempdw+2
    lda #$fc
    adc tempdw+3
    sta tempdw+3
    lda tempdw+2
    ldx tempdw+1
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+1
    ldx tempdw+3
    stx tempdw+0
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    sta tempdw+3
    clc
    lda tempdw+0
    adc s0+0
    sta s3+0
    lda tempdw+1
    adc s0+1
    sta s3+1
    lda tempdw+2
    adc s0+2
    sta s3+2
    lda tempdw+3
    adc s0+3
    sta s3+3
    lda s0+0
    eor s3+0
    and s1+0
    eor s0+0
    sta tempdw+0
    lda s0+1
    eor s3+1
    and s1+1
    eor s0+1
    sta tempdw+1
    lda s0+2
    eor s3+2
    and s1+2
    eor s0+2
    sta tempdw+2
    lda s0+3
    eor s3+3
    and s1+3
    eor s0+3
    sta tempdw+3
    clc
    lda s2+0
    adc tempdw+0
    sta tempdw+0
    lda s2+1
    adc tempdw+1
    sta tempdw+1
    lda s2+2
    adc tempdw+2
    sta tempdw+2
    lda s2+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$d9
    adc tempdw+0
    sta tempdw+0
    lda #$02
    adc tempdw+1
    sta tempdw+1
    lda #$6f
    adc tempdw+2
    sta tempdw+2
    lda #$67
    adc tempdw+3
    sta tempdw+3
    lda tempdw+3
    ldx tempdw+1
    stx tempdw+3
    sta tempdw+1
    lda tempdw+2
    ldx tempdw+0
    stx tempdw+2
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s3+0
    sta s2+0
    lda tempdw+1
    adc s3+1
    sta s2+1
    lda tempdw+2
    adc s3+2
    sta s2+2
    lda tempdw+3
    adc s3+3
    sta s2+3
    lda s3+0
    eor s2+0
    and s0+0
    eor s3+0
    sta tempdw+0
    lda s3+1
    eor s2+1
    and s0+1
    eor s3+1
    sta tempdw+1
    lda s3+2
    eor s2+2
    and s0+2
    eor s3+2
    sta tempdw+2
    lda s3+3
    eor s2+3
    and s0+3
    eor s3+3
    sta tempdw+3
    clc
    lda s1+0
    adc tempdw+0
    sta tempdw+0
    lda s1+1
    adc tempdw+1
    sta tempdw+1
    lda s1+2
    adc tempdw+2
    sta tempdw+2
    lda s1+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$8a
    adc tempdw+0
    sta tempdw+0
    lda #$4c
    adc tempdw+1
    sta tempdw+1
    lda #$2a
    adc tempdw+2
    sta tempdw+2
    lda #$8d
    adc tempdw+3
    sta tempdw+3
    ldx tempdw+2
    lda shl4_table,x
    ldx tempdw+1
    ora shr4_table,x
    sta tempdw2+0
    ldx tempdw+1
    lda shl4_table,x
    ldx tempdw+0
    ora shr4_table,x
    sta tempdw2+3
    ldx tempdw+3
    lda shl4_table,x
    ldx tempdw+2
    ora shr4_table,x
    sta tempdw+1
    ldx tempdw+0
    lda shl4_table,x
    ldx tempdw+3
    ora shr4_table,x
    sta tempdw+2
    lda tempdw2+0
    sta tempdw+0
    lda tempdw2+3
    sta tempdw+3
    clc
    lda tempdw+0
    adc s2+0
    sta s1+0
    lda tempdw+1
    adc s2+1
    sta s1+1
    lda tempdw+2
    adc s2+2
    sta s1+2
    lda tempdw+3
    adc s2+3
    sta s1+3
    lda s1+0
    eor s2+0
    eor s3+0
    sta tempdw+0
    lda s1+1
    eor s2+1
    eor s3+1
    sta tempdw+1
    lda s1+2
    eor s2+2
    eor s3+2
    sta tempdw+2
    lda s1+3
    eor s2+3
    eor s3+3
    sta tempdw+3
    clc
    lda s0+0
    adc tempdw+0
    sta tempdw+0
    lda s0+1
    adc tempdw+1
    sta tempdw+1
    lda s0+2
    adc tempdw+2
    sta tempdw+2
    lda s0+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$42
    adc tempdw+0
    sta tempdw+0
    lda #$39
    adc tempdw+1
    sta tempdw+1
    lda #$fa
    adc tempdw+2
    sta tempdw+2
    lda #$ff
    adc tempdw+3
    sta tempdw+3
    ldx tempdw+3
    lda shl4_table,x
    ldx tempdw+2
    ora shr4_table,x
    sta tempdw2+3
    ldx tempdw+1
    lda shl4_table,x
    ldx tempdw+0
    ora shr4_table,x
    sta tempdw2+1
    ldx tempdw+2
    lda shl4_table,x
    ldx tempdw+1
    ora shr4_table,x
    sta tempdw+2
    ldx tempdw+0
    lda shl4_table,x
    ldx tempdw+3
    ora shr4_table,x
    sta tempdw+0
    lda tempdw2+1
    sta tempdw+1
    lda tempdw2+3
    sta tempdw+3
    clc
    lda tempdw+0
    adc s1+0
    sta s0+0
    lda tempdw+1
    adc s1+1
    sta s0+1
    lda tempdw+2
    adc s1+2
    sta s0+2
    lda tempdw+3
    adc s1+3
    sta s0+3
    lda s0+0
    eor s1+0
    eor s2+0
    sta tempdw+0
    lda s0+1
    eor s1+1
    eor s2+1
    sta tempdw+1
    lda s0+2
    eor s1+2
    eor s2+2
    sta tempdw+2
    lda s0+3
    eor s1+3
    eor s2+3
    sta tempdw+3
    clc
    lda s3+0
    adc tempdw+0
    sta tempdw+0
    lda s3+1
    adc tempdw+1
    sta tempdw+1
    lda s3+2
    adc tempdw+2
    sta tempdw+2
    lda s3+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$81
    adc tempdw+0
    sta tempdw+0
    lda #$f6
    adc tempdw+1
    sta tempdw+1
    lda #$71
    adc tempdw+2
    sta tempdw+2
    lda #$87
    adc tempdw+3
    sta tempdw+3
    lda tempdw+2
    ldx tempdw+1
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+1
    ldx tempdw+3
    stx tempdw+0
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    sta tempdw+3
    clc
    lda tempdw+0
    adc s0+0
    sta s3+0
    lda tempdw+1
    adc s0+1
    sta s3+1
    lda tempdw+2
    adc s0+2
    sta s3+2
    lda tempdw+3
    adc s0+3
    sta s3+3
    lda s0+0
    eor s1+0
    eor s3+0
    sta tempdw+0
    lda s0+1
    eor s1+1
    eor s3+1
    sta tempdw+1
    lda s0+2
    eor s1+2
    eor s3+2
    sta tempdw+2
    lda s0+3
    eor s1+3
    eor s3+3
    sta tempdw+3
    clc
    lda s2+0
    adc tempdw+0
    sta tempdw+0
    lda s2+1
    adc tempdw+1
    sta tempdw+1
    lda s2+2
    adc tempdw+2
    sta tempdw+2
    lda s2+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$22
    adc tempdw+0
    sta tempdw+0
    lda #$61
    adc tempdw+1
    sta tempdw+1
    lda #$9d
    adc tempdw+2
    sta tempdw+2
    lda #$6d
    adc tempdw+3
    sta tempdw+3
    lda tempdw+3
    ldx tempdw+1
    stx tempdw+3
    sta tempdw+1
    lda tempdw+2
    ldx tempdw+0
    stx tempdw+2
    sta tempdw+0
    clc
    lda tempdw+0
    adc s3+0
    sta s2+0
    lda tempdw+1
    adc s3+1
    sta s2+1
    lda tempdw+2
    adc s3+2
    sta s2+2
    lda tempdw+3
    adc s3+3
    sta s2+3
    lda s0+0
    eor s2+0
    eor s3+0
    sta tempdw+0
    lda s0+1
    eor s2+1
    eor s3+1
    sta tempdw+1
    lda s0+2
    eor s2+2
    eor s3+2
    sta tempdw+2
    lda s0+3
    eor s2+3
    eor s3+3
    sta tempdw+3
    clc
    lda s1+0
    adc tempdw+0
    sta tempdw+0
    lda s1+1
    adc tempdw+1
    sta tempdw+1
    lda s1+2
    adc tempdw+2
    sta tempdw+2
    lda s1+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$0c
    adc tempdw+0
    sta tempdw+0
    lda #$38
    adc tempdw+1
    sta tempdw+1
    lda #$e5
    adc tempdw+2
    sta tempdw+2
    lda #$fd
    adc tempdw+3
    sta tempdw+3
    clc
    lda message_length_in_bits
    adc tempdw+0
    sta tempdw+0
    lda #$00
    adc tempdw+1
    sta tempdw+1
    lda #$00
    adc tempdw+2
    sta tempdw+2
    lda #$00
    adc tempdw+3
    sta tempdw+3
    lda tempdw+1
    ldx tempdw+2
    stx tempdw+1
    ldx tempdw+3
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+3
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s2+0
    sta s1+0
    lda tempdw+1
    adc s2+1
    sta s1+1
    lda tempdw+2
    adc s2+2
    sta s1+2
    lda tempdw+3
    adc s2+3
    sta s1+3
    lda s1+0
    eor s2+0
    eor s3+0
    sta tempdw+0
    lda s1+1
    eor s2+1
    eor s3+1
    sta tempdw+1
    lda s1+2
    eor s2+2
    eor s3+2
    sta tempdw+2
    lda s1+3
    eor s2+3
    eor s3+3
    sta tempdw+3
    clc
    lda s0+0
    adc tempdw+0
    sta tempdw+0
    lda s0+1
    adc tempdw+1
    sta tempdw+1
    lda s0+2
    adc tempdw+2
    sta tempdw+2
    lda s0+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda m1+0
    adc tempdw+0
    sta tempdw+0
    lda m1+1
    adc tempdw+1
    sta tempdw+1
    lda m1+2
    adc tempdw+2
    sta tempdw+2
    lda m1+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$44
    adc tempdw+0
    sta tempdw+0
    lda #$ea
    adc tempdw+1
    sta tempdw+1
    lda #$be
    adc tempdw+2
    sta tempdw+2
    lda #$a4
    adc tempdw+3
    sta tempdw+3
    ldx tempdw+3
    lda shl4_table,x
    ldx tempdw+2
    ora shr4_table,x
    sta tempdw2+3
    ldx tempdw+1
    lda shl4_table,x
    ldx tempdw+0
    ora shr4_table,x
    sta tempdw2+1
    ldx tempdw+2
    lda shl4_table,x
    ldx tempdw+1
    ora shr4_table,x
    sta tempdw+2
    ldx tempdw+0
    lda shl4_table,x
    ldx tempdw+3
    ora shr4_table,x
    sta tempdw+0
    lda tempdw2+1
    sta tempdw+1
    lda tempdw2+3
    sta tempdw+3
    clc
    lda tempdw+0
    adc s1+0
    sta s0+0
    lda tempdw+1
    adc s1+1
    sta s0+1
    lda tempdw+2
    adc s1+2
    sta s0+2
    lda tempdw+3
    adc s1+3
    sta s0+3
    lda s0+0
    eor s1+0
    eor s2+0
    sta tempdw+0
    lda s0+1
    eor s1+1
    eor s2+1
    sta tempdw+1
    lda s0+2
    eor s1+2
    eor s2+2
    sta tempdw+2
    lda s0+3
    eor s1+3
    eor s2+3
    sta tempdw+3
    clc
    lda s3+0
    adc tempdw+0
    sta tempdw+0
    lda s3+1
    adc tempdw+1
    sta tempdw+1
    lda s3+2
    adc tempdw+2
    sta tempdw+2
    lda s3+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$a9
    adc tempdw+0
    sta tempdw+0
    lda #$cf
    adc tempdw+1
    sta tempdw+1
    lda #$de
    adc tempdw+2
    sta tempdw+2
    lda #$4b
    adc tempdw+3
    sta tempdw+3
    lda tempdw+2
    ldx tempdw+1
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+1
    ldx tempdw+3
    stx tempdw+0
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    sta tempdw+3
    clc
    lda tempdw+0
    adc s0+0
    sta s3+0
    lda tempdw+1
    adc s0+1
    sta s3+1
    lda tempdw+2
    adc s0+2
    sta s3+2
    lda tempdw+3
    adc s0+3
    sta s3+3
    lda s0+0
    eor s1+0
    eor s3+0
    sta tempdw+0
    lda s0+1
    eor s1+1
    eor s3+1
    sta tempdw+1
    lda s0+2
    eor s1+2
    eor s3+2
    sta tempdw+2
    lda s0+3
    eor s1+3
    eor s3+3
    sta tempdw+3
    clc
    lda s2+0
    adc tempdw+0
    sta tempdw+0
    lda s2+1
    adc tempdw+1
    sta tempdw+1
    lda s2+2
    adc tempdw+2
    sta tempdw+2
    lda s2+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$60
    adc tempdw+0
    sta tempdw+0
    lda #$4b
    adc tempdw+1
    sta tempdw+1
    lda #$bb
    adc tempdw+2
    sta tempdw+2
    lda #$f6
    adc tempdw+3
    sta tempdw+3
    lda tempdw+3
    ldx tempdw+1
    stx tempdw+3
    sta tempdw+1
    lda tempdw+2
    ldx tempdw+0
    stx tempdw+2
    sta tempdw+0
    clc
    lda tempdw+0
    adc s3+0
    sta s2+0
    lda tempdw+1
    adc s3+1
    sta s2+1
    lda tempdw+2
    adc s3+2
    sta s2+2
    lda tempdw+3
    adc s3+3
    sta s2+3
    lda s0+0
    eor s2+0
    eor s3+0
    sta tempdw+0
    lda s0+1
    eor s2+1
    eor s3+1
    sta tempdw+1
    lda s0+2
    eor s2+2
    eor s3+2
    sta tempdw+2
    lda s0+3
    eor s2+3
    eor s3+3
    sta tempdw+3
    clc
    lda s1+0
    adc tempdw+0
    sta tempdw+0
    lda s1+1
    adc tempdw+1
    sta tempdw+1
    lda s1+2
    adc tempdw+2
    sta tempdw+2
    lda s1+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$70
    adc tempdw+0
    sta tempdw+0
    lda #$bc
    adc tempdw+1
    sta tempdw+1
    lda #$bf
    adc tempdw+2
    sta tempdw+2
    lda #$be
    adc tempdw+3
    sta tempdw+3
    lda tempdw+1
    ldx tempdw+2
    stx tempdw+1
    ldx tempdw+3
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+3
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s2+0
    sta s1+0
    lda tempdw+1
    adc s2+1
    sta s1+1
    lda tempdw+2
    adc s2+2
    sta s1+2
    lda tempdw+3
    adc s2+3
    sta s1+3
    lda s1+0
    eor s2+0
    eor s3+0
    sta tempdw+0
    lda s1+1
    eor s2+1
    eor s3+1
    sta tempdw+1
    lda s1+2
    eor s2+2
    eor s3+2
    sta tempdw+2
    lda s1+3
    eor s2+3
    eor s3+3
    sta tempdw+3
    clc
    lda s0+0
    adc tempdw+0
    sta tempdw+0
    lda s0+1
    adc tempdw+1
    sta tempdw+1
    lda s0+2
    adc tempdw+2
    sta tempdw+2
    lda s0+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$c6
    adc tempdw+0
    sta tempdw+0
    lda #$7e
    adc tempdw+1
    sta tempdw+1
    lda #$9b
    adc tempdw+2
    sta tempdw+2
    lda #$28
    adc tempdw+3
    sta tempdw+3
    ldx tempdw+3
    lda shl4_table,x
    ldx tempdw+2
    ora shr4_table,x
    sta tempdw2+3
    ldx tempdw+1
    lda shl4_table,x
    ldx tempdw+0
    ora shr4_table,x
    sta tempdw2+1
    ldx tempdw+2
    lda shl4_table,x
    ldx tempdw+1
    ora shr4_table,x
    sta tempdw+2
    ldx tempdw+0
    lda shl4_table,x
    ldx tempdw+3
    ora shr4_table,x
    sta tempdw+0
    lda tempdw2+1
    sta tempdw+1
    lda tempdw2+3
    sta tempdw+3
    clc
    lda tempdw+0
    adc s1+0
    sta s0+0
    lda tempdw+1
    adc s1+1
    sta s0+1
    lda tempdw+2
    adc s1+2
    sta s0+2
    lda tempdw+3
    adc s1+3
    sta s0+3
    lda s0+0
    eor s1+0
    eor s2+0
    sta tempdw+0
    lda s0+1
    eor s1+1
    eor s2+1
    sta tempdw+1
    lda s0+2
    eor s1+2
    eor s2+2
    sta tempdw+2
    lda s0+3
    eor s1+3
    eor s2+3
    sta tempdw+3
    clc
    lda m0+0
    adc tempdw+0
    sta tempdw+0
    lda m0+1
    adc tempdw+1
    sta tempdw+1
    lda m0+2
    adc tempdw+2
    sta tempdw+2
    lda m0+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda s3+0
    adc tempdw+0
    sta tempdw+0
    lda s3+1
    adc tempdw+1
    sta tempdw+1
    lda s3+2
    adc tempdw+2
    sta tempdw+2
    lda s3+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$fa
    adc tempdw+0
    sta tempdw+0
    lda #$27
    adc tempdw+1
    sta tempdw+1
    lda #$a1
    adc tempdw+2
    sta tempdw+2
    lda #$ea
    adc tempdw+3
    sta tempdw+3
    lda tempdw+2
    ldx tempdw+1
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+1
    ldx tempdw+3
    stx tempdw+0
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    sta tempdw+3
    clc
    lda tempdw+0
    adc s0+0
    sta s3+0
    lda tempdw+1
    adc s0+1
    sta s3+1
    lda tempdw+2
    adc s0+2
    sta s3+2
    lda tempdw+3
    adc s0+3
    sta s3+3
    lda s0+0
    eor s1+0
    eor s3+0
    sta tempdw+0
    lda s0+1
    eor s1+1
    eor s3+1
    sta tempdw+1
    lda s0+2
    eor s1+2
    eor s3+2
    sta tempdw+2
    lda s0+3
    eor s1+3
    eor s3+3
    sta tempdw+3
    clc
    lda s2+0
    adc tempdw+0
    sta tempdw+0
    lda s2+1
    adc tempdw+1
    sta tempdw+1
    lda s2+2
    adc tempdw+2
    sta tempdw+2
    lda s2+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$85
    adc tempdw+0
    sta tempdw+0
    lda #$30
    adc tempdw+1
    sta tempdw+1
    lda #$ef
    adc tempdw+2
    sta tempdw+2
    lda #$d4
    adc tempdw+3
    sta tempdw+3
    lda tempdw+3
    ldx tempdw+1
    stx tempdw+3
    sta tempdw+1
    lda tempdw+2
    ldx tempdw+0
    stx tempdw+2
    sta tempdw+0
    clc
    lda tempdw+0
    adc s3+0
    sta s2+0
    lda tempdw+1
    adc s3+1
    sta s2+1
    lda tempdw+2
    adc s3+2
    sta s2+2
    lda tempdw+3
    adc s3+3
    sta s2+3
    lda s0+0
    eor s2+0
    eor s3+0
    sta tempdw+0
    lda s0+1
    eor s2+1
    eor s3+1
    sta tempdw+1
    lda s0+2
    eor s2+2
    eor s3+2
    sta tempdw+2
    lda s0+3
    eor s2+3
    eor s3+3
    sta tempdw+3
    clc
    lda s1+0
    adc tempdw+0
    sta tempdw+0
    lda s1+1
    adc tempdw+1
    sta tempdw+1
    lda s1+2
    adc tempdw+2
    sta tempdw+2
    lda s1+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$05
    adc tempdw+0
    sta tempdw+0
    lda #$1d
    adc tempdw+1
    sta tempdw+1
    lda #$88
    adc tempdw+2
    sta tempdw+2
    lda #$04
    adc tempdw+3
    sta tempdw+3
    lda tempdw+1
    ldx tempdw+2
    stx tempdw+1
    ldx tempdw+3
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+3
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s2+0
    sta s1+0
    lda tempdw+1
    adc s2+1
    sta s1+1
    lda tempdw+2
    adc s2+2
    sta s1+2
    lda tempdw+3
    adc s2+3
    sta s1+3
    lda s1+0
    eor s2+0
    eor s3+0
    sta tempdw+0
    lda s1+1
    eor s2+1
    eor s3+1
    sta tempdw+1
    lda s1+2
    eor s2+2
    eor s3+2
    sta tempdw+2
    lda s1+3
    eor s2+3
    eor s3+3
    sta tempdw+3
    clc
    lda s0+0
    adc tempdw+0
    sta tempdw+0
    lda s0+1
    adc tempdw+1
    sta tempdw+1
    lda s0+2
    adc tempdw+2
    sta tempdw+2
    lda s0+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$39
    adc tempdw+0
    sta tempdw+0
    lda #$d0
    adc tempdw+1
    sta tempdw+1
    lda #$d4
    adc tempdw+2
    sta tempdw+2
    lda #$d9
    adc tempdw+3
    sta tempdw+3
    ldx tempdw+3
    lda shl4_table,x
    ldx tempdw+2
    ora shr4_table,x
    sta tempdw2+3
    ldx tempdw+1
    lda shl4_table,x
    ldx tempdw+0
    ora shr4_table,x
    sta tempdw2+1
    ldx tempdw+2
    lda shl4_table,x
    ldx tempdw+1
    ora shr4_table,x
    sta tempdw+2
    ldx tempdw+0
    lda shl4_table,x
    ldx tempdw+3
    ora shr4_table,x
    sta tempdw+0
    lda tempdw2+1
    sta tempdw+1
    lda tempdw2+3
    sta tempdw+3
    clc
    lda tempdw+0
    adc s1+0
    sta s0+0
    lda tempdw+1
    adc s1+1
    sta s0+1
    lda tempdw+2
    adc s1+2
    sta s0+2
    lda tempdw+3
    adc s1+3
    sta s0+3
    lda s0+0
    eor s1+0
    eor s2+0
    sta tempdw+0
    lda s0+1
    eor s1+1
    eor s2+1
    sta tempdw+1
    lda s0+2
    eor s1+2
    eor s2+2
    sta tempdw+2
    lda s0+3
    eor s1+3
    eor s2+3
    sta tempdw+3
    clc
    lda s3+0
    adc tempdw+0
    sta tempdw+0
    lda s3+1
    adc tempdw+1
    sta tempdw+1
    lda s3+2
    adc tempdw+2
    sta tempdw+2
    lda s3+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$e5
    adc tempdw+0
    sta tempdw+0
    lda #$99
    adc tempdw+1
    sta tempdw+1
    lda #$db
    adc tempdw+2
    sta tempdw+2
    lda #$e6
    adc tempdw+3
    sta tempdw+3
    lda tempdw+2
    ldx tempdw+1
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+1
    ldx tempdw+3
    stx tempdw+0
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    sta tempdw+3
    clc
    lda tempdw+0
    adc s0+0
    sta s3+0
    lda tempdw+1
    adc s0+1
    sta s3+1
    lda tempdw+2
    adc s0+2
    sta s3+2
    lda tempdw+3
    adc s0+3
    sta s3+3
    lda s0+0
    eor s1+0
    eor s3+0
    sta tempdw+0
    lda s0+1
    eor s1+1
    eor s3+1
    sta tempdw+1
    lda s0+2
    eor s1+2
    eor s3+2
    sta tempdw+2
    lda s0+3
    eor s1+3
    eor s3+3
    sta tempdw+3
    clc
    lda s2+0
    adc tempdw+0
    sta tempdw+0
    lda s2+1
    adc tempdw+1
    sta tempdw+1
    lda s2+2
    adc tempdw+2
    sta tempdw+2
    lda s2+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$f8
    adc tempdw+0
    sta tempdw+0
    lda #$7c
    adc tempdw+1
    sta tempdw+1
    lda #$a2
    adc tempdw+2
    sta tempdw+2
    lda #$1f
    adc tempdw+3
    sta tempdw+3
    lda tempdw+3
    ldx tempdw+1
    stx tempdw+3
    sta tempdw+1
    lda tempdw+2
    ldx tempdw+0
    stx tempdw+2
    sta tempdw+0
    clc
    lda tempdw+0
    adc s3+0
    sta s2+0
    lda tempdw+1
    adc s3+1
    sta s2+1
    lda tempdw+2
    adc s3+2
    sta s2+2
    lda tempdw+3
    adc s3+3
    sta s2+3
    lda s0+0
    eor s2+0
    eor s3+0
    sta tempdw+0
    lda s0+1
    eor s2+1
    eor s3+1
    sta tempdw+1
    lda s0+2
    eor s2+2
    eor s3+2
    sta tempdw+2
    lda s0+3
    eor s2+3
    eor s3+3
    sta tempdw+3
    clc
    lda s1+0
    adc tempdw+0
    sta tempdw+0
    lda s1+1
    adc tempdw+1
    sta tempdw+1
    lda s1+2
    adc tempdw+2
    sta tempdw+2
    lda s1+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$65
    adc tempdw+0
    sta tempdw+0
    lda #$56
    adc tempdw+1
    sta tempdw+1
    lda #$ac
    adc tempdw+2
    sta tempdw+2
    lda #$c4
    adc tempdw+3
    sta tempdw+3
    lda tempdw+1
    ldx tempdw+2
    stx tempdw+1
    ldx tempdw+3
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+3
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s2+0
    sta s1+0
    lda tempdw+1
    adc s2+1
    sta s1+1
    lda tempdw+2
    adc s2+2
    sta s1+2
    lda tempdw+3
    adc s2+3
    sta s1+3
    lda s3+0
    eor #$ff
    ora s1+0
    eor s2+0
    sta tempdw+0
    lda s3+1
    eor #$ff
    ora s1+1
    eor s2+1
    sta tempdw+1
    lda s3+2
    eor #$ff
    ora s1+2
    eor s2+2
    sta tempdw+2
    lda s3+3
    eor #$ff
    ora s1+3
    eor s2+3
    sta tempdw+3
    clc
    lda m0+0
    adc tempdw+0
    sta tempdw+0
    lda m0+1
    adc tempdw+1
    sta tempdw+1
    lda m0+2
    adc tempdw+2
    sta tempdw+2
    lda m0+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda s0+0
    adc tempdw+0
    sta tempdw+0
    lda s0+1
    adc tempdw+1
    sta tempdw+1
    lda s0+2
    adc tempdw+2
    sta tempdw+2
    lda s0+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$44
    adc tempdw+0
    sta tempdw+0
    lda #$22
    adc tempdw+1
    sta tempdw+1
    lda #$29
    adc tempdw+2
    sta tempdw+2
    lda #$f4
    adc tempdw+3
    sta tempdw+3
    lda tempdw+3
    ldx tempdw+2
    stx tempdw+3
    ldx tempdw+1
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+1
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s1+0
    sta s0+0
    lda tempdw+1
    adc s1+1
    sta s0+1
    lda tempdw+2
    adc s1+2
    sta s0+2
    lda tempdw+3
    adc s1+3
    sta s0+3
    lda s2+0
    eor #$ff
    ora s0+0
    eor s1+0
    sta tempdw+0
    lda s2+1
    eor #$ff
    ora s0+1
    eor s1+1
    sta tempdw+1
    lda s2+2
    eor #$ff
    ora s0+2
    eor s1+2
    sta tempdw+2
    lda s2+3
    eor #$ff
    ora s0+3
    eor s1+3
    sta tempdw+3
    clc
    lda s3+0
    adc tempdw+0
    sta tempdw+0
    lda s3+1
    adc tempdw+1
    sta tempdw+1
    lda s3+2
    adc tempdw+2
    sta tempdw+2
    lda s3+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$97
    adc tempdw+0
    sta tempdw+0
    lda #$ff
    adc tempdw+1
    sta tempdw+1
    lda #$2a
    adc tempdw+2
    sta tempdw+2
    lda #$43
    adc tempdw+3
    sta tempdw+3
    lda tempdw+2
    ldx tempdw+1
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+1
    ldx tempdw+3
    stx tempdw+0
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    sta tempdw+3
    clc
    lda tempdw+0
    adc s0+0
    sta s3+0
    lda tempdw+1
    adc s0+1
    sta s3+1
    lda tempdw+2
    adc s0+2
    sta s3+2
    lda tempdw+3
    adc s0+3
    sta s3+3
    lda s1+0
    eor #$ff
    ora s3+0
    eor s0+0
    sta tempdw+0
    lda s1+1
    eor #$ff
    ora s3+1
    eor s0+1
    sta tempdw+1
    lda s1+2
    eor #$ff
    ora s3+2
    eor s0+2
    sta tempdw+2
    lda s1+3
    eor #$ff
    ora s3+3
    eor s0+3
    sta tempdw+3
    clc
    lda s2+0
    adc tempdw+0
    sta tempdw+0
    lda s2+1
    adc tempdw+1
    sta tempdw+1
    lda s2+2
    adc tempdw+2
    sta tempdw+2
    lda s2+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$a7
    adc tempdw+0
    sta tempdw+0
    lda #$23
    adc tempdw+1
    sta tempdw+1
    lda #$94
    adc tempdw+2
    sta tempdw+2
    lda #$ab
    adc tempdw+3
    sta tempdw+3
    clc
    lda message_length_in_bits
    adc tempdw+0
    sta tempdw+0
    lda #$00
    adc tempdw+1
    sta tempdw+1
    lda #$00
    adc tempdw+2
    sta tempdw+2
    lda #$00
    adc tempdw+3
    sta tempdw+3
    lda tempdw+3
    ldx tempdw+1
    stx tempdw+3
    sta tempdw+1
    lda tempdw+2
    ldx tempdw+0
    stx tempdw+2
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s3+0
    sta s2+0
    lda tempdw+1
    adc s3+1
    sta s2+1
    lda tempdw+2
    adc s3+2
    sta s2+2
    lda tempdw+3
    adc s3+3
    sta s2+3
    lda s0+0
    eor #$ff
    ora s2+0
    eor s3+0
    sta tempdw+0
    lda s0+1
    eor #$ff
    ora s2+1
    eor s3+1
    sta tempdw+1
    lda s0+2
    eor #$ff
    ora s2+2
    eor s3+2
    sta tempdw+2
    lda s0+3
    eor #$ff
    ora s2+3
    eor s3+3
    sta tempdw+3
    clc
    lda s1+0
    adc tempdw+0
    sta tempdw+0
    lda s1+1
    adc tempdw+1
    sta tempdw+1
    lda s1+2
    adc tempdw+2
    sta tempdw+2
    lda s1+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$39
    adc tempdw+0
    sta tempdw+0
    lda #$a0
    adc tempdw+1
    sta tempdw+1
    lda #$93
    adc tempdw+2
    sta tempdw+2
    lda #$fc
    adc tempdw+3
    sta tempdw+3
    lda tempdw+1
    ldx tempdw+2
    stx tempdw+1
    ldx tempdw+3
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+3
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s2+0
    sta s1+0
    lda tempdw+1
    adc s2+1
    sta s1+1
    lda tempdw+2
    adc s2+2
    sta s1+2
    lda tempdw+3
    adc s2+3
    sta s1+3
    lda s3+0
    eor #$ff
    ora s1+0
    eor s2+0
    sta tempdw+0
    lda s3+1
    eor #$ff
    ora s1+1
    eor s2+1
    sta tempdw+1
    lda s3+2
    eor #$ff
    ora s1+2
    eor s2+2
    sta tempdw+2
    lda s3+3
    eor #$ff
    ora s1+3
    eor s2+3
    sta tempdw+3
    clc
    lda s0+0
    adc tempdw+0
    sta tempdw+0
    lda s0+1
    adc tempdw+1
    sta tempdw+1
    lda s0+2
    adc tempdw+2
    sta tempdw+2
    lda s0+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$c3
    adc tempdw+0
    sta tempdw+0
    lda #$59
    adc tempdw+1
    sta tempdw+1
    lda #$5b
    adc tempdw+2
    sta tempdw+2
    lda #$65
    adc tempdw+3
    sta tempdw+3
    lda tempdw+3
    ldx tempdw+2
    stx tempdw+3
    ldx tempdw+1
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+1
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s1+0
    sta s0+0
    lda tempdw+1
    adc s1+1
    sta s0+1
    lda tempdw+2
    adc s1+2
    sta s0+2
    lda tempdw+3
    adc s1+3
    sta s0+3
    lda s2+0
    eor #$ff
    ora s0+0
    eor s1+0
    sta tempdw+0
    lda s2+1
    eor #$ff
    ora s0+1
    eor s1+1
    sta tempdw+1
    lda s2+2
    eor #$ff
    ora s0+2
    eor s1+2
    sta tempdw+2
    lda s2+3
    eor #$ff
    ora s0+3
    eor s1+3
    sta tempdw+3
    clc
    lda s3+0
    adc tempdw+0
    sta tempdw+0
    lda s3+1
    adc tempdw+1
    sta tempdw+1
    lda s3+2
    adc tempdw+2
    sta tempdw+2
    lda s3+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$92
    adc tempdw+0
    sta tempdw+0
    lda #$cc
    adc tempdw+1
    sta tempdw+1
    lda #$0c
    adc tempdw+2
    sta tempdw+2
    lda #$8f
    adc tempdw+3
    sta tempdw+3
    lda tempdw+2
    ldx tempdw+1
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+1
    ldx tempdw+3
    stx tempdw+0
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    sta tempdw+3
    clc
    lda tempdw+0
    adc s0+0
    sta s3+0
    lda tempdw+1
    adc s0+1
    sta s3+1
    lda tempdw+2
    adc s0+2
    sta s3+2
    lda tempdw+3
    adc s0+3
    sta s3+3
    lda s1+0
    eor #$ff
    ora s3+0
    eor s0+0
    sta tempdw+0
    lda s1+1
    eor #$ff
    ora s3+1
    eor s0+1
    sta tempdw+1
    lda s1+2
    eor #$ff
    ora s3+2
    eor s0+2
    sta tempdw+2
    lda s1+3
    eor #$ff
    ora s3+3
    eor s0+3
    sta tempdw+3
    clc
    lda s2+0
    adc tempdw+0
    sta tempdw+0
    lda s2+1
    adc tempdw+1
    sta tempdw+1
    lda s2+2
    adc tempdw+2
    sta tempdw+2
    lda s2+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$7d
    adc tempdw+0
    sta tempdw+0
    lda #$f4
    adc tempdw+1
    sta tempdw+1
    lda #$ef
    adc tempdw+2
    sta tempdw+2
    lda #$ff
    adc tempdw+3
    sta tempdw+3
    lda tempdw+3
    ldx tempdw+1
    stx tempdw+3
    sta tempdw+1
    lda tempdw+2
    ldx tempdw+0
    stx tempdw+2
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s3+0
    sta s2+0
    lda tempdw+1
    adc s3+1
    sta s2+1
    lda tempdw+2
    adc s3+2
    sta s2+2
    lda tempdw+3
    adc s3+3
    sta s2+3
    lda s0+0
    eor #$ff
    ora s2+0
    eor s3+0
    sta tempdw+0
    lda s0+1
    eor #$ff
    ora s2+1
    eor s3+1
    sta tempdw+1
    lda s0+2
    eor #$ff
    ora s2+2
    eor s3+2
    sta tempdw+2
    lda s0+3
    eor #$ff
    ora s2+3
    eor s3+3
    sta tempdw+3
    clc
    lda s1+0
    adc tempdw+0
    sta tempdw+0
    lda s1+1
    adc tempdw+1
    sta tempdw+1
    lda s1+2
    adc tempdw+2
    sta tempdw+2
    lda s1+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda m1+0
    adc tempdw+0
    sta tempdw+0
    lda m1+1
    adc tempdw+1
    sta tempdw+1
    lda m1+2
    adc tempdw+2
    sta tempdw+2
    lda m1+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$d1
    adc tempdw+0
    sta tempdw+0
    lda #$5d
    adc tempdw+1
    sta tempdw+1
    lda #$84
    adc tempdw+2
    sta tempdw+2
    lda #$85
    adc tempdw+3
    sta tempdw+3
    lda tempdw+1
    ldx tempdw+2
    stx tempdw+1
    ldx tempdw+3
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+3
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s2+0
    sta s1+0
    lda tempdw+1
    adc s2+1
    sta s1+1
    lda tempdw+2
    adc s2+2
    sta s1+2
    lda tempdw+3
    adc s2+3
    sta s1+3
    lda s3+0
    eor #$ff
    ora s1+0
    eor s2+0
    sta tempdw+0
    lda s3+1
    eor #$ff
    ora s1+1
    eor s2+1
    sta tempdw+1
    lda s3+2
    eor #$ff
    ora s1+2
    eor s2+2
    sta tempdw+2
    lda s3+3
    eor #$ff
    ora s1+3
    eor s2+3
    sta tempdw+3
    clc
    lda s0+0
    adc tempdw+0
    sta tempdw+0
    lda s0+1
    adc tempdw+1
    sta tempdw+1
    lda s0+2
    adc tempdw+2
    sta tempdw+2
    lda s0+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$4f
    adc tempdw+0
    sta tempdw+0
    lda #$7e
    adc tempdw+1
    sta tempdw+1
    lda #$a8
    adc tempdw+2
    sta tempdw+2
    lda #$6f
    adc tempdw+3
    sta tempdw+3
    lda tempdw+3
    ldx tempdw+2
    stx tempdw+3
    ldx tempdw+1
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+1
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s1+0
    sta s0+0
    lda tempdw+1
    adc s1+1
    sta s0+1
    lda tempdw+2
    adc s1+2
    sta s0+2
    lda tempdw+3
    adc s1+3
    sta s0+3
    lda s2+0
    eor #$ff
    ora s0+0
    eor s1+0
    sta tempdw+0
    lda s2+1
    eor #$ff
    ora s0+1
    eor s1+1
    sta tempdw+1
    lda s2+2
    eor #$ff
    ora s0+2
    eor s1+2
    sta tempdw+2
    lda s2+3
    eor #$ff
    ora s0+3
    eor s1+3
    sta tempdw+3
    clc
    lda s3+0
    adc tempdw+0
    sta tempdw+0
    lda s3+1
    adc tempdw+1
    sta tempdw+1
    lda s3+2
    adc tempdw+2
    sta tempdw+2
    lda s3+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$e0
    adc tempdw+0
    sta tempdw+0
    lda #$e6
    adc tempdw+1
    sta tempdw+1
    lda #$2c
    adc tempdw+2
    sta tempdw+2
    lda #$fe
    adc tempdw+3
    sta tempdw+3
    lda tempdw+2
    ldx tempdw+1
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+1
    ldx tempdw+3
    stx tempdw+0
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    sta tempdw+3
    clc
    lda tempdw+0
    adc s0+0
    sta s3+0
    lda tempdw+1
    adc s0+1
    sta s3+1
    lda tempdw+2
    adc s0+2
    sta s3+2
    lda tempdw+3
    adc s0+3
    sta s3+3
    lda s1+0
    eor #$ff
    ora s3+0
    eor s0+0
    sta tempdw+0
    lda s1+1
    eor #$ff
    ora s3+1
    eor s0+1
    sta tempdw+1
    lda s1+2
    eor #$ff
    ora s3+2
    eor s0+2
    sta tempdw+2
    lda s1+3
    eor #$ff
    ora s3+3
    eor s0+3
    sta tempdw+3
    clc
    lda s2+0
    adc tempdw+0
    sta tempdw+0
    lda s2+1
    adc tempdw+1
    sta tempdw+1
    lda s2+2
    adc tempdw+2
    sta tempdw+2
    lda s2+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$14
    adc tempdw+0
    sta tempdw+0
    lda #$43
    adc tempdw+1
    sta tempdw+1
    lda #$01
    adc tempdw+2
    sta tempdw+2
    lda #$a3
    adc tempdw+3
    sta tempdw+3
    lda tempdw+3
    ldx tempdw+1
    stx tempdw+3
    sta tempdw+1
    lda tempdw+2
    ldx tempdw+0
    stx tempdw+2
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s3+0
    sta s2+0
    lda tempdw+1
    adc s3+1
    sta s2+1
    lda tempdw+2
    adc s3+2
    sta s2+2
    lda tempdw+3
    adc s3+3
    sta s2+3
    lda s0+0
    eor #$ff
    ora s2+0
    eor s3+0
    sta tempdw+0
    lda s0+1
    eor #$ff
    ora s2+1
    eor s3+1
    sta tempdw+1
    lda s0+2
    eor #$ff
    ora s2+2
    eor s3+2
    sta tempdw+2
    lda s0+3
    eor #$ff
    ora s2+3
    eor s3+3
    sta tempdw+3
    clc
    lda s1+0
    adc tempdw+0
    sta tempdw+0
    lda s1+1
    adc tempdw+1
    sta tempdw+1
    lda s1+2
    adc tempdw+2
    sta tempdw+2
    lda s1+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$a1
    adc tempdw+0
    sta tempdw+0
    lda #$11
    adc tempdw+1
    sta tempdw+1
    lda #$08
    adc tempdw+2
    sta tempdw+2
    lda #$4e
    adc tempdw+3
    sta tempdw+3
    lda tempdw+1
    ldx tempdw+2
    stx tempdw+1
    ldx tempdw+3
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+3
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s2+0
    sta s1+0
    lda tempdw+1
    adc s2+1
    sta s1+1
    lda tempdw+2
    adc s2+2
    sta s1+2
    lda tempdw+3
    adc s2+3
    sta s1+3
    lda s3+0
    eor #$ff
    ora s1+0
    eor s2+0
    sta tempdw+0
    lda s3+1
    eor #$ff
    ora s1+1
    eor s2+1
    sta tempdw+1
    lda s3+2
    eor #$ff
    ora s1+2
    eor s2+2
    sta tempdw+2
    lda s3+3
    eor #$ff
    ora s1+3
    eor s2+3
    sta tempdw+3
    clc
    lda s0+0
    adc tempdw+0
    sta tempdw+0
    lda s0+1
    adc tempdw+1
    sta tempdw+1
    lda s0+2
    adc tempdw+2
    sta tempdw+2
    lda s0+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$82
    adc tempdw+0
    sta tempdw+0
    lda #$7e
    adc tempdw+1
    sta tempdw+1
    lda #$53
    adc tempdw+2
    sta tempdw+2
    lda #$f7
    adc tempdw+3
    sta tempdw+3
    lda tempdw+3
    ldx tempdw+2
    stx tempdw+3
    ldx tempdw+1
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+1
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s1+0
    sta s0+0
    lda tempdw+1
    adc s1+1
    sta s0+1
    lda tempdw+2
    adc s1+2
    sta s0+2
    lda tempdw+3
    adc s1+3
    sta s0+3
    lda s2+0
    eor #$ff
    ora s0+0
    eor s1+0
    sta tempdw+0
    lda s2+1
    eor #$ff
    ora s0+1
    eor s1+1
    sta tempdw+1
    lda s2+2
    eor #$ff
    ora s0+2
    eor s1+2
    sta tempdw+2
    lda s2+3
    eor #$ff
    ora s0+3
    eor s1+3
    sta tempdw+3
    clc
    lda s3+0
    adc tempdw+0
    sta tempdw+0
    lda s3+1
    adc tempdw+1
    sta tempdw+1
    lda s3+2
    adc tempdw+2
    sta tempdw+2
    lda s3+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$35
    adc tempdw+0
    sta tempdw+0
    lda #$f2
    adc tempdw+1
    sta tempdw+1
    lda #$3a
    adc tempdw+2
    sta tempdw+2
    lda #$bd
    adc tempdw+3
    sta tempdw+3
    lda tempdw+2
    ldx tempdw+1
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+1
    ldx tempdw+3
    stx tempdw+0
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    cmp #$80
    rol tempdw+0
    rol tempdw+1
    rol tempdw+2
    rol
    sta tempdw+3
    clc
    lda tempdw+0
    adc s0+0
    sta s3+0
    lda tempdw+1
    adc s0+1
    sta s3+1
    lda tempdw+2
    adc s0+2
    sta s3+2
    lda tempdw+3
    adc s0+3
    sta s3+3
    lda s1+0
    eor #$ff
    ora s3+0
    eor s0+0
    sta tempdw+0
    lda s1+1
    eor #$ff
    ora s3+1
    eor s0+1
    sta tempdw+1
    lda s1+2
    eor #$ff
    ora s3+2
    eor s0+2
    sta tempdw+2
    lda s1+3
    eor #$ff
    ora s3+3
    eor s0+3
    sta tempdw+3
    clc
    lda s2+0
    adc tempdw+0
    sta tempdw+0
    lda s2+1
    adc tempdw+1
    sta tempdw+1
    lda s2+2
    adc tempdw+2
    sta tempdw+2
    lda s2+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$bb
    adc tempdw+0
    sta tempdw+0
    lda #$d2
    adc tempdw+1
    sta tempdw+1
    lda #$d7
    adc tempdw+2
    sta tempdw+2
    lda #$2a
    adc tempdw+3
    sta tempdw+3
    lda tempdw+3
    ldx tempdw+1
    stx tempdw+3
    sta tempdw+1
    lda tempdw+2
    ldx tempdw+0
    stx tempdw+2
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s3+0
    sta s2+0
    lda tempdw+1
    adc s3+1
    sta s2+1
    lda tempdw+2
    adc s3+2
    sta s2+2
    lda tempdw+3
    adc s3+3
    sta s2+3
    lda s0+0
    eor #$ff
    ora s2+0
    eor s3+0
    sta tempdw+0
    lda s0+1
    eor #$ff
    ora s2+1
    eor s3+1
    sta tempdw+1
    lda s0+2
    eor #$ff
    ora s2+2
    eor s3+2
    sta tempdw+2
    lda s0+3
    eor #$ff
    ora s2+3
    eor s3+3
    sta tempdw+3
    clc
    lda s1+0
    adc tempdw+0
    sta tempdw+0
    lda s1+1
    adc tempdw+1
    sta tempdw+1
    lda s1+2
    adc tempdw+2
    sta tempdw+2
    lda s1+3
    adc tempdw+3
    sta tempdw+3
    clc
    lda #$91
    adc tempdw+0
    sta tempdw+0
    lda #$d3
    adc tempdw+1
    sta tempdw+1
    lda #$86
    adc tempdw+2
    sta tempdw+2
    lda #$eb
    adc tempdw+3
    sta tempdw+3
    lda tempdw+1
    ldx tempdw+2
    stx tempdw+1
    ldx tempdw+3
    stx tempdw+2
    ldx tempdw+0
    stx tempdw+3
    sta tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    lsr
    ror tempdw+3
    ror tempdw+2
    ror tempdw+1
    ror tempdw+0
    clc
    lda tempdw+0
    adc s2+0
    sta s1+0
    lda tempdw+1
    adc s2+1
    sta s1+1
    lda tempdw+2
    adc s2+2
    sta s1+2
    lda tempdw+3
    adc s2+3
    sta s1+3
    clc
    lda #$01
    adc s0+0
    sta s0+0
    lda #$23
    adc s0+1
    sta s0+1
    lda #$45
    adc s0+2
    sta s0+2
    lda #$67
    adc s0+3
    sta s0+3
    clc
    lda #$89
    adc s1+0
    sta s1+0
    lda #$ab
    adc s1+1
    sta s1+1
    lda #$cd
    adc s1+2
    sta s1+2
    lda #$ef
    adc s1+3
    sta s1+3
    clc
    lda #$fe
    adc s2+0
    sta s2+0
    lda #$dc
    adc s2+1
    sta s2+1
    lda #$ba
    adc s2+2
    sta s2+2
    lda #$98
    adc s2+3
    sta s2+3
    clc
    lda #$76
    adc s3+0
    sta s3+0
    lda #$54
    adc s3+1
    sta s3+1
    lda #$32
    adc s3+2
    sta s3+2
    lda #$10
    adc s3+3
    sta s3+3
    rts

Kommentit

Matti Holopainen [05.08.2017 22:09:14]

Lainaa #

Ihailen tätä suoritusta. En lähde arvioimaan, voisiko sitä lyhentää tai nopeuttaa.

Tämä on juuri sitä, mitä oli pakko tehdä 70-80 -luvuilla, jos ei ollut sopivia kääntäjiä, jolloin kaikki oli koodattava itse assemblerilla.

Ymmärrys tietokoneen käskykannasta on nykyään varmaan aika harvojen herkkua. Ei sitä kaikkien tarvitsekaan ymmärtää, mutta ne, jotka ymmärtävät, ovat kunkkuja!

Grez [05.08.2017 23:59:45]

Lainaa #

Matti Holopainen kirjoitti:

Ymmärrys tietokoneen käskykannasta on nykyään varmaan aika harvojen herkkua. Ei sitä kaikkien tarvitsekaan ymmärtää, mutta ne, jotka ymmärtävät, ovat kunkkuja!

En nyt tiedä tekeekö assemblerin ymmärtäminen automaattisesti kunkuksi tekevä juttu. Itse osaan kyllä tarvittaessa kirjoittaa ja olen kirjoittanut assembleria useillekin erilaisille prosessoreille ja hyvin harvoissa tilanteissa siitä on todellista hyötyä. Tosiaan silloin joskus kun kääntäjiä ei ollut, tilanne olikin toinen.

Viimeksi kirjoitin mikrokontrollerille yksinkertaisen systeemin assemblerilla, koska niin sain todella helposti tarkan ajoituksen tehtyä ja siitä tuli vain reilu 200 riviä (ilman kommentteja ja tyhjiä rivejä ehkä noin 100 riviä). C:llä koodia olisi tullut ehkä 30 riviä, mutta sitten olisi pitänyt toteuttaa ajoitus laskureilla ja siitä olisi tullut helposti toinen mokoma tai sitten viritellä C:stä käännettyä assemblerkoodia.. Monimutkaisemmassa tapauksessa kokonaan assemblerilla kirjoittaminen ei olisi ollut järkevää.

qalle [08.08.2017 06:22:10]

Lainaa #

Optimoin koodia. Se vie nyt 9 921 tavua ja ajaminen kestää 15 548 kellojaksoa (pl. rts).

Jaksoin päivittää vain tuon "kokonainen NES-ohjelma"-linkin takana olevan tiedoston (sivun alussa; ks. tiedostot "md5-algo.asm" ja "md5-algo-macros.asm").

qalle [09.08.2017 02:02:15]

Lainaa #

Nopeutin ohjelmaa noin 200 kellojaksolla ja päivitin myös itse koodivinkin. Koodissa näyttäisi olevan vieläkin parantamisen varaa; huomasin raakakoodissa käskyt "sta tempdw+3" ja "lda tempdw+3" peräkkäin. Valmiiksilaskettuja aputaulukoitakin voisi käyttää enemmän.

Kirjoita kommentti

Muista lukea keskustelun ohjeet.
Tietoa sivustosta