Btw, 4096 is the highest value for adressing Bytes with a Base-Register in Assembler.
255 is the highest value a byte could have. So 255 decimal is "FF" in hexa.
In former times at the beginning of comuters and programmings you had
always byte-commands. Remember the Assembler-Instruction MVC. It is
the same as MOVE in Cobol. The longest field you could move with one
instruction could only be 255 bytes. Also all the internal routins for accessing and handling Datasets, written bei IBM, are using ContolBlocks and special SystemServices based on that restriction.
For example, if you open a dataset in cobol-programm, in the background, the internal I/O-Routins are accessing a RDJFCB (READ-JOB-FILE-CONTROLBLOCK), where all Information of the actual dataset is stored.
It's the chaining beetween your logical file in programm and the physical file, declared in the JobControlLanguage, and the actual physical device.
Now, this RDJFCB has a special structure and field-order. Some contents are stored in only one byte. And so, the highest value could only be 255. No one would be so crazy to change all these old routins. Nothing more would work. You only could enhance these ControlBlocks with new features, but you must leave the earlier fields and flags.
And now comming to the limitation of 255 GDG's. The limit-value is stored
in on Byte of such ControlBlock. And what is the highest value you could store in one Byte ??? !!!
Thank you fore listening to my little excurse of mainframe stone-age.