The History of Computers

What are segments and offsets?

All programmers use segments and offsets in their programs.  In QB, these exist in the
forms of DEF SEG, VARSEG, and VARPTR.  But have you ever wondered what segments
and offsets are or what they do for programming?  This article will answer all of that from
the history of the segment-offset set-up in IBM/compatibles to how programmers benefit
from this set-up...

When IBM made the 1st PC in '81, they thought no one would ever need more than
1Mb of RAM (morons).  All the computers at that time were 16-bit, so only 64Kb could be
accessed (2^16=65536=64k).  (Those of us who use POKE and PEEK for graphics in screen
13h or use integers for math understand that.)  This posed as sort of a problem because
64Kb is only 1/16 of 1Mb (2^16*16=65536*2^4=1Mb).  To solve this problem, some system
of accessing the rest of the memory had to be devised.  This led to segments and offsets.
The segment-offset set-up is given in notation as FFFF:FFFF, where the hexadecimal
number before the colon is the segment, and the number after the colon is the offset.  The
segment is a value of memory that is shifted left 4 times (in binary that is *16 or that extra
2^4 that was needed to access the 1Mb of RAM).  But this leaves holes in the memory
addressing because only every 16b can be accessed.  The offset fills in these gaps by
allowing the accessing of 64Kb of memory, starting at the offset value*16.
Since the offset values are the actual byte values, you can reach every byte in memory
by going at 64k chunks at a time.  An example would be video RAM.  Its address is at
A000:0000, meaning the top-left pixel is at segment A000h and offset values 0000h to FFFFh
are the values of all the pixels.  That also means it is at bytes 40960 to 106495 in RAM.

Well, there you have it.  With this knowledge, you can access the whole 1st 1Mb or
RAM.  (If you want to use any more memory than that, you'll have to go somewhere else
because I haven't learned how to do that yet.)  Below is a listing of some useful locations
in RAM:

Description                                    Segment:Offset
Video RAM                                   A000:0000
Text Screen RAM                         B800:0000
ASCII Characters 0-127               FFA6:0014

--Danny Gump

Back