aboutsummaryrefslogtreecommitdiff
path: root/doc/interview.txt
diff options
context:
space:
mode:
Diffstat (limited to 'doc/interview.txt')
-rw-r--r--doc/interview.txt166
1 files changed, 0 insertions, 166 deletions
diff --git a/doc/interview.txt b/doc/interview.txt
deleted file mode 100644
index e7d375e..0000000
--- a/doc/interview.txt
+++ /dev/null
@@ -1,166 +0,0 @@
-An email interview with Alfred, author of AlfCrunch for the
-Atari 8-bit.
-
-Date: Thu, 20 Nov 2025 12:35:25 -0500
-From: Alfred
-To: B. Watson <urchlay@slackware.uk>
-Subject: Re: UnAlf
-
-On 2025-11-20 12:37 a.m., B. Watson wrote:
-
-> 1. Was AlfCrunch public domain, shareware, or...?
-
-1. AlfCrunch was public domain, although I never did distribute the
-source code, and as I recall nobody ever asked me for it. The programmer
-at ICD, Mike Gustafson did the same as you. He disassembled the DZ and
-added it to their SpartaDos X along with all the ARC routines so they
-could handle almost anything. Bob Puff at CSS did the same, so he could
-add it to his SuperUnArc. He phoned me one night to say his code was
-faster than mine at decompressing an AlfCrunch file. We had a good laugh
-about it.
-
-> 2. Do you have any old disks (or disk images), or paper
-> notes, anything that you used or referred to while developing
-> AlfCrunch? Source would be awesome (if you still have it and are
-> willing to share it). Even just the original distribution disk would
-> be good to have.
-
-2. I didn't distribute it on disk that I can recall, it was either the
-two files posted on my bbs, or perhaps they were Arc'd, I just don't
-recall now. Probably Arc'd because there was a doc file with it.
-
-I've attached the source code for LZ/DZ. This isn't the original which
-was done with Mac/65, it's broken up to use the Six Forks assembler
-which I had just started using for a bit around then.
-
-> 3. Why not ARC compatible compression? You said you ported a PC
-> program you had the source to... was it just not a matter of having
-> the source for ARC? Or did you decide to go for speed rather than
-> compatibility?
-
-3. I didn't have any source code for ARC and I didn't know what the
-various compression algorithms were. I vaguely knew about Huffman from
-work as one of the big software programs used it, but I had no idea how
-it was implemented. I read the LZW paper but I didn't really understand
-it then. Everyone hated Walden's ARC because it was so slow and it was
-bugged, but it was all there was. One day somewhere I ran across some
-guy's implementation of LZW for the pc, and I thought to try porting it
-because it had to be faster than ARC. It was in assembler, so I could
-kind of understand it. I'd seen some of the ARC source but the C code
-was just gibberish to me. It's why my version is so clunky because I was
-doing like you, just porting each x86 instruction to its sort of 6502
-variant. I couldn't make changes to the code because I didn't understand
-what it was doing back then.
-
- After I released the first version someone called me and said their
-Arcviewer didn't work on .alf files, so I quick fixed the header to be
-Arc compatible to the extent you could see what the files were, and
-that's the 1.4 version. So if you run across a 1.2, it's the same except
-for the header. I don't think hardly anyone saw 1.2 except for some
-local people because I released 1.4 so fast.
-
-> 4. Did you ever work on AlfCrunch after the 1.4 release? You mention a
-> couple of possibilities for the next version in your doc file. Did any
-> of that ever materialize (even if unreleased)?
-
-4. I did some work on a LZ 2.0 but I guess I quit on it, I only have
-some source for the LZ part. I must have thought 1.4 was good enough and
-moved on to something else.
-
-> 5. Are you OK with me redistributing the decompression code from UnAlf
-> under the WTFPL license?
->
-> 6. Are you OK with me including your AtariAge handle in my unalf
-> documentation (man page)?
-
-5 & 6. Sure you can distribute whatever you like and mention me in it.
-It's not like there's many people around who would remember me, heh.
-
-LZW is fairly straightforward (now, lol) but it can be a bit hard to get
-the idea from just reading code. The way it works is a single token is
-output that represents a string, hopefully a really long one like:
-
-token = $122= "went to the store and bought" string associated with that
-token. However I think tokens start as 9 bit values, so you actually
-output 9 bits, not just the 8.
-
-So on the compress side, you start with a table of, I think, 8 bit
-tokens, where the value is 0-$FF, which are every possible input value.
-If were only doing say ASCII text, you could cut it down to maybe 100
-tokens, not sure how many non-printables there are like SOL etc.
-
-Anyway, you start reading in bytes of data. You check a byte against the
-table and if you don't find it, you add the next token value which would
-be $100 and save that byte to that token's entry. Now that can't happen
-with the first token, because it has to be one of the starting 256
-bytes. If you find the token, then you remember it and continue by
-reading the next character. Now you're checking the table to see if
-there's a token for 1st+2nd, which there isn't. So you create a new
-token, $100, and add the 2 byte string as its value, and you output the
-token for the first byte. Now the third byte probably doesn't match the
-first byte, so it'll be the same process. Since there's no string of
-3rd+4th, you'll output the token for the third byte, and add a new token
-that represents those two bytes. Now with a good matching data file,
-like text, you'll probably see 1st+2nd again. So when it sees that first
-byte value, it says ok, I have a token for that, so it keeps reading,
-and it sees the second byte and it goes, I have a token for 1+2 too, so
-then it reads the third byte and now it goes, ok, I don't have a token
-for 1+2+3, so it outputs the token for 1+2 and creates a new token and
-stores the string 1+2+3 as it's value.
- So this process just goes on until you run out of data. With a good
-match you'll get longer and longer runs of bytes that match earlier
-strings, so you can get to the point where one token is the same as 40
-characters. That's why LZW is so good. However you run into trouble with
-something like a GIF or JPG because they're all different, you don't get
-runs of bytes. Especially not in JPG because it's already stripped out
-all the runs, which is why JPG files are so small.
-
-The decompress is similar, it just works backwards. You start with the
-same 256 byte table. You read the first token, and it matches, so you
-output the value (the token is the character initially). Since it
-matched, what you would normally do is take the string that you output
-just before this and concatenate the first letter of this string to the
-last output string and add it to the table as a new token value. Since
-there is no previous string when you read the first byte, you do
-nothing. So even if you didn't know what the starting table was, you
-could rebuild it here, because all the initial tokens will be <$100
-because they didn't match anything longer in the beginning of the
-compression, so eventually you will reconstruct the 256 entry table. You
-short-circuit that part by starting with the known table.
-
-So starting with the second token, you end up creating a bunch of second
-level entries, which are the initial table value+something. As long as
-the next token is in the table, you just keep going outputting strings
-and adding new tokens. Now what happens if you get a token that isn't in
-the table. This where the math becomes magic, I don't really understand
-the theory, but it works. You know it had to have just been created by
-the compressor. So the string that this new token represents has to at
-least start with the last token to which some new character was added.
-So you take the last string output and concatenate it's first character
-to itself. So if the last string was the value "ABCD" you create new
-token in the table and add "ABCDA" as it's value, and you output the
-string "ABCDA". And so on.
-
-Now you start with 9 bit tokens I think. At some point on the compress
-side, and on the decompress, when you code to add a new token, it's
-going to take more than 9 bits, you up the bitsize to 10, which also
-changes the highest token value you can have, which I think is what the
-MAXCDE value represents. Because of the limited memory, I think I send
-the clear code at the end of filling a 12 bit table, and start over with
-9. Fortunately on the Atari you don't have giant files, so it doesn't
-reset too often.
-
- There are a couple of special tokens, Clear which when you see it you
-clear the table, and the End token which tells you that it's the last
-token of the data.
-
-A lot of the code in LZ/DZ is the bit twiddling to concatenate the
-varying bitsize tokens in memory. I can't do that sort of math in my
-head, so it's a lot brute force shifting bits left and right to align a
-new token to the last one in memory. The other thing I didn't understand
-is I don't think the code actually stores every full string, maybe it
-does, but at the time I thought the guy was using some scheme whereby he
-was only storing one character with each new token and it somehow was
-chained to the previous string.
-
-That's about all I can tell you about it.