Forums before death by AOL, social media and spammers... "We can't have nice things"
|    comp.lang.asm.x86    |    Ahh, the lost art of x86 assembly    |    4,675 messages    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
|    Message 2,887 of 4,675    |
|    wolfgang kern to Terje Mathisen    |
|    Re: Look back to "just for the H@ck"    |
|    21 Jul 17 10:36:28    |
      From: nowhere@never.at               Terje Mathisen wrote:       ...       >> I checked on how 16:13 encoding could work, but I sure missed the       >> trick and I would need 5 bits more (2*13 hints for 13 byte).              > When I wrote that sample code I realized that it was far simpler than I       > remembered: Just take a pair of input chars, convert them to the 0-90       > range (i.e. subtract 33), then multiply the second by 91 and add:              > This gives you a value in the 0..8280 range, which is sufficient to       > cover the 0..8191 needed to encode 13 bits, i.e. there are 89 unused       > combinations.              Yeah thanks, now I see it: 8*13 bits instead my assumed 13*8 bit.              > To make it more efficient we can do the math and realize that       >       > sum = (a-33) + (b-33)*91       >       > is the same as       >       > sum = a + b*91 - (1+91)*33       > = a + b*91 - 3036       >       > Since 91 = 64+16+8+2+1 = 9*5*2+1       > we can handle the multiplication with a few LEAs:       >       > lea eax,[eax+eax*8]       > lea eax,[eax+eax*4]       > lea eax,[eax+eax*2+1]       >       > which might be either slower or faster than a plain MUL.              >> a 16* 7-bit string to 14* 8-bit conversion will not work (no       >> 00..20), even a 16:14 variant would gain a bit more.       >>       >> my yet shortest will be a 9:7 encoding. ie: (first two bytes contain       >> 14 modify hints) a set bit 0 will sub 0x30 of 3rd byte, (bit 1..6       >> work on 4th..9th) a set bit 8 will sub 0x7e of 3rd byte, so if both       >> are set then sub both.       >>       >> and it can end early, so multiple of 7 isn't required. it gaines 5%       >> over base64. Now this is already one byte less in our Hello World :)              > Bit stealing trickery is probably less size-efficient than simple       > multiplication, shift & mask.                     > Anyway, I just remmebered that my original base91 encoder used a very       > dirty trick: It stored the output bytes in a pre-shuffled order, so that       > the decoder could push out result bytes with minimal effort.       >       > I.e. always write out 8 bits, then accumulate the remaining 5 bits and       > write out when the accumulator has at least 8 bits:       >       > xor bx,bx ; BH always zero       > nextpair:       > lodsb       > cmp al,34       > je done ; chr(34) was the end marker!       > sub al,35       > jb nextpair ; Skip all values below chr(35)       > mov bl,al       > second_char:       > lodsb       > sub al,35       > jb second_char       >       > xchg al,bl       > mov ah,91       > mul ah       > add ax,bx       >       > stosb       > mob al,bh       > shr ax,cl       > or dl,al       > sub cl,5       > ja nextpair       >       > mov ax,dx       > stosb       > mov dl,ah       > add cl,8       > jmp nextpair              > Another option is to use 5:4 coding, i.e. 5 chars of 6.4 bits each       > encodes a 32-bit value, since this will only need 85 ascii values.              I'll try on 5:4 because it may need lesser overhead than 16:13 even       the ratio increase from 1.23 to 1.25 (anyway better than 4:3).              > With the normal A-Zaz0-9 covering 62 of them, we need 23 more...       >       > Here's the table:       >       > 69 chars 6.1 bits       > 74 6.2       > 79 6.3       > 85 6.4       > 91 6.5       > 97 6.6 (This needs the full 32-126 range plus two control chars!)       >       > Terje              Thanks I got it yet,       __       wolfgang              --- SoupGate-Win32 v1.05        * Origin: you cannot sedate... all the things you hate (1:229/2)    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
(c) 1994, bbs@darkrealms.ca