diff options
Diffstat (limited to 'tinySIGCOMP/asm/deflate.asm')
-rw-r--r-- | tinySIGCOMP/asm/deflate.asm | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/tinySIGCOMP/asm/deflate.asm b/tinySIGCOMP/asm/deflate.asm new file mode 100644 index 0000000..f9a1469 --- /dev/null +++ b/tinySIGCOMP/asm/deflate.asm @@ -0,0 +1,131 @@ +at (32) +readonly (0) + +:index pad (2) +:extra_length_bits pad (2) +:len_value pad (2) +:extra_dist_bits pad (2) +:dist_value pad (2) + + +at (42) + +:req_feed_loc pad (1) +:req_feed_len pad (1) +:req_feed_field pad (12) +:hash_start pad (8) + +at (64) + +:byte_copy_left pad (2) +:byte_copy_right pad (2) +:input_bit_order pad (2) +:decompressed_ptr pad (2) +:length_table pad (116) +:distance_table pad (120) + +:hash_len_loc pad (2) +:state_len_loc pad (2) +:ret_params_loc pad (1) +:sigcomp_version pad (1) + +align (64) + + +readonly (1) +:initialize_memory + +set (udvm_memory_size, 8192) +set (length_table_start, (((length_table - 4) / 4) + 16384)) +set (length_table_mid, (length_table_start + 24)) +set (dist_table_start, (distance_table / 4)) + +MULTILOAD (64, 122, circular_buffer, udvm_memory_size, 5, +circular_buffer, + +0, 3, 0, 4, 0, 5, +0, 6, 0, 7, 0, 8, +0, 9, 0, 10, 1, 11, +1, 13, 1, 15, 1, 17, +2, 19, 2, 23, 2, 27, +2, 31, 3, 35, 3, 43, +3, 51, 3, 59, 4, 67, +4, 83, 4, 99, 4, 115, +5, 131, 5, 163, 5, 195, +5, 227, 0, 258, + +0, 1, 0, 2, 0, 3, +0, 4, 1, 5, 1, 7, +2, 9, 2, 13, 3, 17, +3, 25, 4, 33, 4, 49, +5, 65, 5, 97, 6, 129, +6, 193, 7, 257, 7, 385, +8, 513, 8, 769, 9, 1025, +9, 1537, 10, 2049, 10, 3073, +11, 4097, 11, 6145, 12, 8193, +12, 12289, 13, 16385, 13, 24577) + +; -- hash_len, state_len, params, version, dicts +INPUT-BYTES (6, hash_len_loc, !) +LOAD (66, $state_len_loc) +ADD(66, 64) + + +:decompress_sigcomp_msg + +:start_decomp + +INPUT-BITS (3, extra_length_bits, !) + +:next_char + +INPUT-HUFFMAN (index, end_of_msg, 4, + 7, 0, 23, length_table_start, + 1, 48, 191, 0, + 0, 192, 199, length_table_mid, + 1, 400, 511, 144) +COMPARE ($index, length_table_start, literal, end_of_msg, +length_distance) + +:literal + +set (index_lsb, (index + 1)) + +OUTPUT (index_lsb, 1) +COPY-LITERAL (index_lsb, 1, $decompressed_ptr) +JUMP (next_char) + +:length_distance + +; this is the length part + +MULTIPLY ($index, 4) +COPY ($index, 4, extra_length_bits) +INPUT-BITS ($extra_length_bits, extra_length_bits, !) +ADD ($len_value, $extra_length_bits) + +; this is the distance part + +INPUT-HUFFMAN (index, !, 1, 5, 0, 31, dist_table_start) +MULTIPLY ($index, 4) +COPY ($index, 4, extra_dist_bits) + + +INPUT-BITS ($extra_dist_bits, extra_dist_bits, !) +ADD ($dist_value, $extra_dist_bits) +LOAD (index, $decompressed_ptr) +COPY-OFFSET ($dist_value, $len_value, $decompressed_ptr) +OUTPUT ($index, $len_value) +JUMP (next_char) + +:end_of_msg + + +LOAD (req_feed_loc, 1158) +MULTILOAD (hash_start, 4, $state_len_loc, 64, decompress_sigcomp_msg, 6) +SHA-1 (hash_start, $hash_len_loc, req_feed_field) + +END-MESSAGE (req_feed_loc, ret_params_loc, $state_len_loc, 64, decompress_sigcomp_msg, 6, 0) + +readonly (0) +:circular_buffer
\ No newline at end of file |