I don't get it...
BTW the oldest thing I ever used was in electronics classes... we had an old switch-based machine (dunno the model) and it had address and value switches and you would read/write values from each address in memory with those. It also had a manual clock... you flipped a switch to make the machine execute one machine cycle and load that value in memory (as opposed to it constantly going at millions per second) Really interesting stuff!
The Radar set I worked on in the Air Force did not even have a CPU, it was a huge chain of logic and a simple counter. There were AND gates hooked to specific lines on the counter so that specific "events" would be initiated at specific counts. Gigantic trails of cascading logic circuits then controlled every "event" such as turning the transmitter on and off, drawing the actual blips on the screen, etc. It was like having a hard-wired program. Every "line of code" was actually physically present as a hard-wired logic circuit. Each "subroutine" was a chain of components.
Thinking of these as an array (which actually they are - a single dimension array), and referencing them (which actually means COUNTING the locations, there can be no such thing as a zero location, because that would mean that the array does not exist. The array must have at least one element to exist. So the reference is 1 thru 256. The pointer to the array cannot contain a value of zero (not unless you want a memory leak), because it would reference a memory cell outside of the array.
When I worked in assembly, if I wanted a 1-D array, say for example I had an array of 10 1-byte values, and I had those 10 bytes free at addresses $0100 through $0109, I would use direct indexed addressing to access the array.
So for example if I wanted to grab the value of any item in that array, IIRC I would LDX with the index value from zero to nine (or use a memory location, such as another var, to hold the index) and then get the value from $0100 (direct indexed) which would return the value at memory address "$0100 + (X)".
I don't see how "zero" is impossible. I don't even believe "10" (decimal) is impossible, or would generate any kind of error either, unless some other piece of code actually allocates specific bytes to the array and then checks to see if the array is accessed with an index of something other than any of those values. But it's not as if the CPU is not capable of addressing that address in memory.
(Wow, what an incredible waste of processing time, no wonder so many languages are so ridiculously inefficient. It's like watching Norton flick his hands around for 5 minutes before doing anything.)
Must have been some bizarre totally anti-intuitive stuff you had to deal with. I don't think I would have liked it.