OS memory services


Operatingsystems offer some kind of mechanism for (both system and user) software toaccess memory.

   
Inthe most simple approach, the entire memory of the computer is turned over toprograms. This approach is most common in single tasking systems (only oneprogram running at a time). Even in this approach, there often will be certainportions of memory designated for certain purposes (such as low memoryvariables, areas for operating system routines, memory mapped hardware, video RAM,etc.).
    
Withhardware support for virtual memory, operating systems can give programs theillusion of having the entire memory to themselves (or even give the illusionthere is more memory than there actually is, using disk space to provide theextra “memory”), when in reality the operating system is continually movingprograms around in memory and dynamically assigning physical memory as needed.Even with this approach, it is possible that some virtual memory locations aremapped to their actual physical addresses (such as for access to low memoryvariables, video RAM, or similar areas).
    
Thetask of dividing up the available memory space in both of these approaches isleft to the programmer and the compiler. Many modern languages (including Cand C++) have service routines forallocating and deallocating blocks of memory.
    
Someoperating systems go beyond basic flat mapping of memory and provide operatingsystem routines for allocating and deallocating memory. The Macintosh, for example, has two heaps (a system heap and anapplication heap) and an entire set of operating system routines forallocating, deallocating, and managing blocks of memory. The NeXTgoes even further and creates an object oriented set of services for memorymanagement.
    
Withhardware support for segments or demand paging, some operating systems (such asMVS and OS/2)provide operating system routines for programs to manage segments or pages ofmemory.

Basic memory software approaches


Staticand dynamic approaches

    
Thereare two basic approaches to memory usage: static and dynamic.
    
Static memory approaches assume that the addressesdon’t change. This may be a virtual memory illusion, or may be the actualphysical layout. The static memory allocation may be through absolute addressesor through PC relative addresses (to allow for relocatable, reentrant, and/orrecursive software), but in either case, the compiler or assembler generates aset of addresses that can not change for the life of a program or process.
    
Dynamic memory approaches assume that theaddresses can change (although change is often limited to predefined possibleconditions). The two most common dynamic approaches are the use of stack framesand the use of pointers or handlers. Stack frames are used primarily fortemporary data (such as fucntion or subroutine variables or loop counters).Handles and pointers are used for keeping track of dynamically allocated blocksof memory.

Absolute addressing

    
Tolook at memory use by programs and operating systems, let’s first examine themore simple problem of a single program with complete control of the computer (suchas in a small-scale embedded system or the earliest days of computing).
    
Themost basic form of memory access is absolute addressing, in which theprogram explicitely names the address that is going to be used. An address is anumeric label for a specific location in memory. The numbering system isusually in bytes and always starts counting with zero. The first byte ofphysical memory is at address 0, the second byte of physical memory is ataddress 1, the third byte of physical memory is at address 2, etc. Someprocessors use word addressing rather than byte addressing. The theoreticalmaximum address is determined by the address size of a processor (a 16 bitaddress space is limited to no more than 65536 memory locations, a 32 bitaddress space is limited to approximately 4 GB of memory locations). The actualmaximum is limited to the amount of RAM (and ROM) physically installed in thecomputer.
    
Aprogrammer assigns specific absolute addresses for data structures and programroutines. These absolute addresses might be assigned arbitrarily or might haveto match specific locations expected by an operating system. In practice, theassembler or complier determines the absolute addresses through an orderlypredictable assignment scheme (with the ability for the programmer to overridethe compiler’s scheme to assign specific operating system mandated addresses).
    
Thissimple approach takes advantage of the fact that the compiler or assembler canpredict the exact absolute addresses of every program instruction or routineand every data structure or data element. For almost every processor, absoluteaddresses are the fastest form of memory addressing. The use of absoluteaddresses makes programs run faster and greatly simplifies the task of compilingor assembling a program.
    
Somehardware instructions or operations rely on fixed absolute addresses. Forexample, when a processor is first turned on, where does it start? Mostprocessors have a specific address that is used as the address of the firstinstruction run when the processer is first powered on. Some processors providea method for the start address to be changed for future start-ups. Sometimesthis is done by storing the start address internally (with some method forsoftware or external hardware to change this value). For example, on power upthe Motorola 680x0, the processor loads the interrupt stack pointer with thelongword value located at address 000 hex, loads the program counter with thelongword value located at address 004 hex, then starts execution at the frshlyloaded program counter location. Sometimes this is done by reading the startaddress from a data line (or other external input) at power-up (and in thiscase, there is usually fixed external hardware that always generates the samepre-assigned start address).
    
Anothercommon example of hardware related absolute addressing is the handling oftraps, exceptions, and interrupts. A processor often has specific memoryaddresses set aside for specific kinds of traps, exceptions, and interrupts.Using a specific example, a divide by zero exception on the Motorola 680x0produces an exception vector number 5, with the address of the exceptionhandler being fetched by the hardware from memory address 014 hex.
    
Somesimple microprocessor operating systems relied heavily on absolute addressing.An example would be the MS-DOS expectation that the start of aprogram would always be located at absolute memory address x100h (hexadecimal100, or decimal 256). A typical compiler or assembler directive for this wouldbe the ORG directive (for “origin”).
    
Thekey disadvantage of absolute addressing is that multiple programs clash witheach other, competing to use the same absolute memory locations for (possiblydifferent) purposes.

 

Overlay

    
So,how do you implement multiple programs on an operating system using absoluteaddresses? Or, for early computers, how do you implement a program that islarger than available RAM (especially at a time when processors rarely had morethan 1k, 2k, or 4k of RAM? The earliest answer was overlay systems.
    
Withan overlay system, each program or program segment is loaded into the exactsame space in memory. An overlay handler exists in another area of memory andis responsible for swapping overlay pages or overlay segments (both are thesame thing, but different operating systems used different terminology). When aoverlay segment completes its work or needs to access a routine in anotheroverlay segment, it signals the overlay handler, which then swaps out the oldprogram segment and swaps in the next program segment.
    
Anoverlay handler doesn’t take much memory. Typically, the memory space thatcontained the overlay handler was also padded out with additional routines.These might include key device drivers, interrupt handlers, exception handlers,and small commonly used routines shared by many programs (to save time insteadof continual swapping of the small commonly used routines).
    
Inearly systems, all data was global, meaning that it was shared by andavailable for both read and writes by any running program (in modern times,global almost always means available to a single entire program, no longermeaning available to all software on a computer). A section of memory was setaside for shared system variables, device driver variables, and interrupthandler variables. An additional area would be set aside as “scratch” ortemporary data. The temporary data area would be available for individualprograms. Because the earliest operating systems were batch systems, only oneprogram other than the operating system would be running at any one time, so itcould use the scratch RAM any way it wanted, saving any long term data tofiles.

 

Relocatablesoftware


Ascomputer science advance, hardware started to have support for relocatableprograms and data. This would allow an operating system to load a programanywhere convenient in memory (including a different location each time theprogram was loaded). This was a necessary step for the jump to interactiveoperating systems, but was also useful in early batch systems to allow formultiple overlay segments.

 

Demandpaging and swapping

    
Overlaysystems were superceded by demand paging and swapping systems. Ina swapping system, the operating system swaps out an entire program andits data (and any other context information).
    
Ina swapping system, instead of having programs explicitely requestoverlays, programs were divided into pages. The operating system would load aprogram’s starting page and start it running. When a program needed to access adata page or program page not currently in main memory, the hardware wouldgenerate a page fault, and the operating system would fetch therequested page from external storage. When all available pages were filled, theoperating system would use one of many schemes for figuring out which page todelete from memory to make room for the new page (and if it was a data pagethat had any changes, the operating system would have to store a temporary copyof the data page). The question of how to decide which page to delete is one ofthe major problems facing operating system designers.

 

Programcounter relative

    
Oneapproach for making programs relocatable is program counter relativeaddressing. Instead of branching using absolute addresses, branches(including subroutine calls, jumps, and other kinds of branching) were based ona relative distance from the current program counter (which points to theaddress of the currently executing instruction). With PC relative addreses, theprogram can be loaded anywhere in memory and still work correctly. The locationof routines, subroutines, functions, and constant data can be determined by thepositive or negative distance from the current instruction.
    
Programcounter relative addressing can also be used for determining the address ofvariables, but then data and code get mixed in the same page or segment. At aminimum, mixing data and code in the same segment is bad programming practice,and in most cases it clashes with more sophisticated hardware systems (such asprotected memory).

 

Basepointers

    
Basepointers (sometimescalled segment pointers or page pointers) are special hardware registers thatpoint to the start (or base) of a particular page or segment of memory.Programs can then use an absolute address within a page and either explicitlyadd the absolute address to the contents of a base pointer or rely on thehardware to add the two together to form the actual effective address ofthe memory access. Which method was used would depend on the processorcapabilities and the operatign system design. Hiding the base pointer from theapplication program both made the program easier to compile and allowed for theoperating system to implement program isolation, data/code isolation, protectedmemory, and other sophisticated services.
    
Asan example, the Intel 80x86 processor has a code segment pointer, a datasegment pointer, a stack segment pointer, and an extra segment pointer. When aprogram is loaded into memory, an operating system running on the Intel 80x86sets the segment pointers with the beginning of the pages assigned for eachpurpose for that particular program. If a program is swapped out, when it getsswapped back in, the operating system sets the segment pointers to the newmemory locations for each segment. The program continues to run, without beingaware that it has been moved in memory.

Indirection, pointers, and handles

    
Amethod for making data relocatable is to use indirection. Instead ofhard coding an absolute memory address for a variable or data structure, theprogram uses a pointer that gives the memory address of the variable ordata structure. Many processors have address pointer registers and a variety ofindirect addressing modes available for software.
   
Inthe most simple use of address pointers, software generates the effectiveaddress for the pointer just before it is used. Pointers can also be stored,but then the data can’t be moved (unless there is additional hardware support,such as virtual memory or base/segment pointers).
    
Closelyrelated to pointers are handles. Handles are two levels of indirection,or a pointer to a pointer. Instead of the program keeping track of an addresspointer to a block of memory that can’t be moved, the program keeps track of apointer to a pointer. Now, the operating system or the application program canmove the underlying block of data. As long as the program uses the handleinstead of the pointer, the operating system can freely move the data block andupdate the pointer, and everything will continue to resolve correctly.
    
Becauseit is faster to use pointers than handles, it is common for software to converta handle into a pointer and use the pointer for data accesses. If this is done,there must be some mechanism to make sure that the data block doesn’t movewhile the program is using the pointer. As an example, the Macintosh uses a system where data blocks can only be moved atspecific known times, and an application program can rely on pointers derivedfrom handles remaining valid between those known, specified times.

 

Stackframes

    
Stackframes are a methodfor generating temporary variables, especially for subroutines, functions, andloops. An are of memory is temporarily allocated on the system or processstack. In a simple version, the variables in the stack frame are accessed byusing the stack pointer and an offset to point to the actual location inmemory. This simple approach has the problem that there are many hardwareinstructions that change the stack pointer. The more sophisticated and stableapproach is to have a second pointer called a frame pointer. The framepointer can be set up in software using any address register. Many modernprocessors also have specific hardware instructions that allocate the stackframe and set up the frame pointer at the same time. Some processors have aspecific hardware frame pointer register.

 

Virtualmemory

    
Virtualmemory is atechnique in which each process generates addresses as if it had sole access tothe entire logical address space of the processor, but in reality memorymanagement hardware remaps the logical addresses into actual physicaladdresses in physical address space. The DEC VAX-11 gets it name fromthis technique, VAX standing for Virtual Address eXtension.
    
Virtualmemory can go beyond just remapping logical addresses into physical addresses.Many virtual memory systems also include software for page or segment swapping,shuffling portions of a program to and from a hard disk, to give the softwarethe impression of having much more RAM than is actually installed on thecomputer.

Memory hardware issues


Mainstorage

    
Mainstorage is also called memory or internal memory (to distinguish fromexternal memory, such as hard drives). An older term is working storage.
    
Mainstorage is fast (at least a thousand times faster than external storage, suchas hard drives). Main storage (with a few rare exceptions) is volatile, thestored information being lost when power is turned off.
    
Alldata and instructions (programs) must be loaded into main storage for thecomputer processor.
    
RAM is Random Access Memory, and is thebasic kind of internal memory. RAM is called “random access” because theprocessor or computer can access anylocation in memory (as contrasted with sequential access devices, which must beaccessed in order). RAM has been made from reed relays, transistors, integratedcircuits, magnetic core, or anything that can hold and store binary values(one/zero, plus/minus, open/close, positive/negative, high/low, etc.). Mostmodern RAM is made from integrated circuits. At one time the most common kindof memory in mainframes was magnetic core, so many older programmers will referto main memory as core memory even when the RAM is made from more moderntechnology. Static RAM is called static because it will continue to holdand store information even when power is removed. Magnetic core and reed relaysare examples of static memory. Dynamic RAM is called dynamic because itloses all data when power is removed. Transistors and integrated circuits areexamples of dynamic memory. It is possible to have battery back up for devicesthat are normally dynamic to turn them into static memory.
    
ROM is Read Only Memory (it is alsorandom access, but only for reads). ROM is typically used to store thigns thatwill never change for the life of the computer, such as low level portions ofan operating system. Some processors (or variations within processor families)might have RAM and/or ROM built into the same chip as the processor (normallyused for processors used in standalone devices, such as arcade video games,ATMs, microwave ovens, car ignition systems, etc.). EPROM is ErasableProgrammable Read Only Memory, a special kind of ROM that can be erased andreprogrammed with specialized equipment (but not by the processor it isconnected to). EPROMs allow makers of industrial devices (and other similarequipment) to have the benefits of ROM, yet also allow for updating orupgrading the software without having to buy new ROM and throw out the old (theEPROMs are collected, erased and rewritten centrally, then placed back into themachines).
    
Registers and flags are a special kindof memory that exists inside a processor. Typically a processor will haveseveral internal registers that are much faster than main memory. Theseregisters usually have specialized capabilities for arithmetic, logic, andother operations. Registers are usually fairly small (8, 16, 32, or 64 bits forinteger data, address, and control registers; 32, 64, 96, or 128 bits forfloating point registers). Some processors separate integer data and addressregisters, while other processors have general purpose registers that can beused for both data and address purposes. A processor will typically have one to32 data or general purpose registers (processors with separate data and addressregisters typically split the register set in half). Many processors havespecial floating point registers (and some processors have general purposeregisters that can be used for either integer or floating point arithmetic).Flags are single bit memory used for testing, comparison, and conditionaloperations (especially conditional branching).

 

Externalstorage

    
Externalstorage is anystorage other than main memory. In modern times this is mostly hard drives andremoveable media (such as floppy disks, Zip disks, optical media, etc.). Withthe advent of USB and FireWire hard drives, the line between permanent harddrives and removeable media is blurred. Other kinds of external storage includetape drives, drum drives, paper tape, and punched cards. Random access or indexedaccess devices (such as hard drives, removeable media, and drum drives) providean extension of memory (although usually accessed through logical filesystems). Sequential access devices (such as tape drives, paper tapepunch/readers, or dumb terminals) provide for off-line storage of large amountsof information (or back ups of data) and are often called I/O devices (forinput/output).

 

Buffers

    
Buffers are areas in main memory that areused to store data (or instructions) being transferred to or from externalmemory.

Low memory


Summary: Low memory is thememory at the beginning of the address space. Some processors use designatedlow memory addresses during power on, exception processing, interruptprocessing, and other hardware conditions. Some operating systems usedesignated low memory addresses for global system variables, global systemstructures, jump tables, and other system purposes.
  • PC-DOS and MS-DOS low memory
    • BIOS Communication Area
    • Reserved
    • Inter-Application (User) Communication Area
    • DOS Communication Area
  • Macintosh low memory

 

PC-DOSand MS-DOS low memory


    Addressesare hexadecimal in segment: offset form.

BIOS CommunicationArea


0000:0400h-0000:04ABh
    0000:0400h-000:0407h   addressesof RS232 adaptors
    0000:0408h-0000:040Fh   addressesof printers

0000:0410h-0000:0411h   equipmentflag: Also returned by interrupt 11h. MS-DOS only sets this value at startup.Programs that switch video adapters or switch modes in mulitadapter video cardsshould correctly set bit pair 5:4 — 00=not used, 01=CGA card 40 columns, 10=CGAcard 80 columns, 11=monochrome card

    0000:0412h   initializationflag

    0000:0413h-0000:0414h   memorysize: normally accessed via interrupt 12h.

    0000:0415h-0000:0416h   amountof memory in I/O channel

    0000:0417h-0000:043Dh   keyboarddata area 1: keyboard status flags and 15-byte keyboard buffer. Normally readvia interrupt 16h.

    0000:043Eh-0000:0448h   diskettedata

    0000:0449h-0000:0466h   videocontrol data area 1: normally accessed via interrupt 10h.

    0000:00467h--0000:046Bh   cassettedata; in some models of PS/2 this contains the far (doubleword) address of thecode that resets the computer while preserving memory.

    0000:046Ch-0000:0470h   timedata: normally accessed via interrupt 1Ah.

    0000:0471h   breakflag: set to 1 if the break key has been pressed.

    0000:0472h-0000:0473h   resetflag: if set to 1234h, the BIOS initialization routine (starting at segmentFFFFh) will bypass the memory check normally performed during a cold boot. Inmany models of the PS/2, if the flag is set to 4321h, the system will perform areset operation without erasing memory.

Reserved


0000:04ACh-0000:04EFh
    Reservedfor BIOS.

 

Inter-Application (User)Communication Area


0000:04F0h-0000:04FFh

    Maybe used by any program in any way. Originally intended for communications andexchange of data between programs, but because Microsoft couldn’t figure out astandard, the area is in complete anarchy and programs should assume that otherprograms will act destructively on any attempts to use the area.

DOS Communication Area


0000:0500h-0000:05FFh
    Reservedfor use by DOS and BASIC.
    0000:0500   printscreen status flag: one byte value — 0=print screen not active or successfultermination, 1=print screen in progress, 255=error occurred during printscreen.

 

Macintoshlow memory

    0x0000   unassigned
    0x0004   ResetSPPC
    0x0008   BusError
    0x000C   AddrErr
    0x0010   Illegal
    0x0014   ZeroDiv
    0x0018   ChkError
    0x001C   TrapVErr
    0x0020   Privileg
    0x0024   Trace
    0x0028   Line1010
    0x002C   Line 1111
    0x0030   unassigned
    0x0034   Coproces
    0x0038   FmtErrVect
    0x003C   Uninited
    0x0040   Unassig2
    0x0060   Spurious
    0x0064   AutoInt1
    0x0068   AutoInt2
     0x006C   AutoInt3
    0x0070   AutoInt4
    0x0074   AutoInt5
    0x0078   AutoInt6
    0x007C   AutoInt7
    0x0080   TRAPtble
    0x00C0   FP-68881
    0x00DC   reserved
    0x00E0   PMMU
    0x00E0   SMgrOldCore
    0x00EC   reserved
    0x0100   MonkeyLives
    0x0100   SysCom
    0x0102   ScrVRes
    0x0104   ScrHRes
    0x0106   ScreenRow
    0x0108   MemTop
    0x010C   BufPtr
    0x0110   StkLowPtr
    0x0114   HeapEnd
    0x0118   TheZone
    0x011C   UTableBase
    0x0120   MacJmp
    0x0124   DskRtnAdr
    0x0128   PollRtnAdr
    0x012C   DskVerify
    0x012D   LoadTrap
    0x012E   MmInOK
    0x012F   CPUFlag
    0x012F   DskWr11
    0x0130   ApplLimit
     0x0134   SonyVars
    0x0138   PWMValue
    0x013A   PollStack
    0x013E   PollProc
    0x0142   DskErr
    0x0144   SysEvtMask
    0x0146   SysEvtBuf
    0x014A   EventQueue
    0x0154   EvtBufCnt
    0x0156   RndSeed
    0x015A   SysVersion
    0x015C   SEvtEnb
    0x015D   DSWndUpdate
    0x015E   FontFlag
    0x015F   IntFlag
    0x0160   VBLQueue
    0x016A   Ticks
    0x016E   MBTicks
    0x0172   MBState
    0x0173   Tocks
    0x0174   KeyMap
    0x017C   KeyPadMap
    0x0180   unknown
    0x0184   KeyLast
    0x0186   KeyTime
    0x018A   KeyRepTime
    0x018E   KeyThresh
    0x0190   KeyRepThresh
    0x0192   Lvl1DT
    0x01B2   Lvl2DT
    0x01D2   UnitNtryCnt
    0x01D4   VIA
    0x01D8   SCCRd
    0x01DC   SCCWr
    0x01E0   IWM
    0x01E4   GetParam
    0x01F8   SysParam
    0x01F8   SPValid
    0x01F9   SPATalkA
    0x01FA   SPATalkB
    0x01FB   SPConfig
    0x01FC   SPPortA
    0x01FE   SPPortB
    0x0200   SPAlarm
    0x0204   SPFont
    0x0206   SPKbd
    0x0207   SPPrint
    0x0208   SPVolCtl
    0x0209   SPClikCaret
    0x020A   SPMisc1
    0x020B   CDeskPat
    0x020C   Time
    0x0210   BootDrive
    0x0212   JShell
    0x0214   SFSaveDisk
    0x0216   KbdVars
    0x0218   KbdLast
    0x021A   JKybdTask
    0x021E   KbdType
    0x021F   AlarmState
    0x0220   MemErr
    0x0222   JFigTrkSpd
    0x0226   JDiskPrime
    0x022A   JRdAddr
    0x022E   JRdData
    0x0232   JWrData
    0x0236   JSeek
    0x023A   JSetUpPoll
    0x023E   JRecal
    0x0242   JControl
    0x0246   JWakeUp
    0x024A   JReSeek
    0x024E   JMakeSpdTbl
    0x0252   JAdrDisk
    0x0256   JSetSpeed
    0x025A   NiblTbl
    0x025E   FlEvtMask
    0x0260   SdVolume
    0x0261   Finder
    0x0262   SoundVars
    0x0262   SoundPtr
    0x0266   SoundBase
    0x026A   SoundVBL
    0x027A   SoundDCE
    0x027E   SoundActive
    0x027F   SoundLevel
    0x0280   CurPitch
    0x0282   SoundLast
    0x0282   Switcher
    0x0286   SwitcherTPtr
    0x028A   RSDHndl
    0x028E   ROM85
    0x0290   PortAUse
    0x0291   PortBUse
    0x0292   ScreenVars
    0x029A   JGNEFilter
    0x029E   Key1Trans
    0x02A2   Key2Trans
    0x02A6   SysZone
    0x02AA   ApplZone
    0x02AE   ROMBase
    0x02B2   RAMBase
    0x02B6   BasicGlob
    0x02B6   ExpandMem
    0x02BA   DSAlertTab
    0x02BE   ExtStsDT
    0x02CE   SCCASts
    0x02CF   SCCBSts
    0x02D0   SerialVars
    0x02D8   ABusVars
    0x02E0   FinderName
    0x02F0   DoubleTime
    0x02F4   CaretTime
    0x02F8   ScrDmpEnb
    0x02F9   ScrDmpType
    0x02FA   TagData
    0x02FC   BufTgFNum
    0x0300   BufTgFFlg
    0x0302   BufTgFBkNum
    0x0304   BufTgDate
        
    0x0308   DrvQHdr
    0x0312   PWMBuf2
    0x0316   MacPgm
    0x031A   Lo3Bytes
    0x031E   MinStack
    0x0322   DefltStack
    0x0326   MMDefFlags
    0x0328   GZRootHnd
    0x032C   GZRootPtr
    0x0330   GZMoveHnd
    0x0334   DSDrawProc
    0x0338   EjectNotify
    0x033C   IAZNotify
    0x0340   CkdDB
    0x0342   NxtDB
    0x0344   MaxDB
    0x0346   FlushOnly
    0x0347   RegRscr
    0x0348   FLckUnlck
    0x0349   FrcSync
    0x034A   NewMount
    0x034C   DrMstrBlk
    0x034E   FCBSPtr
    0x0352   DefVCBPtr
   0x0356   VCBQHdr
    0x0360   FSBusy
    0x0362   FSQHead
    0x0366   FSQTail
    0x036A   RgSvArea
    0x0372   WDCBsPtr
    0x0376   HFSVars
    0x0384   DefVRefnum
    0x0392   HFSDSErr
    0x0398   CurDirStore
    0x03A2   ErCode
    0x03A4   Params
    0x03D6   FSTemp8
    0x03DE   FSTemp4
    0x03E2   FSQueueHook
    0x03E6   ExtFSHook
    0x03EA   DskSwtchHook
    0x03EE   RegstVol
    0x03F2   ToExtFS
    0x03F6   FSFCBLen
    0x03F8   DSAlertRect
    0x0400   OSTable
    0x0800   GrafBegin
    0x0800   JHideCursor
    0x0804   JShowCursor
    0x0808   JShieldCursor
    0x080C   JScrnAddr
    0x0810   JScrnSize
    0x0814   JInitCursor
    0x0818   JSetCrsr
    0x081C   JCrsrObscure
    0x0820   JUpdateProc
    0x0824   ScrnBase
    0x0828   MTemp
    0x082C   RawMouse
    0x0830   Mouse
    0x0834   CrsrPin
    0x083C   CrsrRect
    0x0844   TheCrsr
    0x0888   CrsrAddr
    0x088C   JAllocCrsr
    0x0890   JSetCCrsr
    0x0894   JOpcodeProc
    0x0898   CrsrBase
    0x089C   CrsrDevice
    0x08A0   SrcDevice
    0x08A4   MainDevice
    0x08A8   DeviceList
    0x08AC   CrsrRow
    0x08AE   unknown
    0x08B0   QDColors
    0x08CC   CrsrVis
    0x08CD   CrsrBusy
    0x08CE   CrsrNew
    0x08CF   CrsrCouple
    0x08D0   CrsrState
    0x08D2   CrsrObscure
    0x08D3   CrsrScale
    0x08D4   unknown
    0x08D6   MouseMask
    0x08DA   MouseOffset
    0x08DE   JournalFlag
    0x08E0   JSwapFont
    0x08E4   WidthListHand
    0x08E8   JournalRef
    0x08EA   unknown
    0x08EC   CrsrThresh
    0x08EE   JCrsrTask
    0x08F2   WWExist
    0x08F3   QDExist
    0x08F4   JFetch
    0x08F8   JStash
    0x08FC   JIODone
    0x0900   CurApRefNum
    0x0902   LaunchFlag
    0x0903   FondState
    0x0904   CurrentA5
    0x0908   CurStackBase
    0x090C   LoadFiller
    0x0910   CurApName
    0x0930   SaveSegHandle
    0x0934   CurJTOffset
    0x0936   CurPageOption
    0x0938   HiliteMode
    0x0939   unknown
    0x093A   LoaderPBlock
    0x0944   PrintErr
    0x0946   ChooserBits
    0x0954   CoreEditVars
    0x0960   ScrapSize
    0x0964   ScrapHandle
    0x0968   ScrapCount
    0x096A   ScrapState
    0x096C   ScrapName
    0x0970   ScrapTag
    0x0980   RomFont0
    0x0984   ApFontID
    0x0986   SaveFondFlags
    0x0987   FMDefaultSize
    0x0988   CurFMInput
    0x098A   CurFMSize
    0x098C   CurFMFace
    0x098D   CurFMNeedBits
    0x098E   CurFMDevice
    0x0990   CurFMNumer
    0x0994   CurFMDenom
    0x0998   FOutError
    0x099A   FOutFontHandle
    0x099E   FOutBold
    0x099F   FOutItalic
    0x09A0   FOutULOffset
    0x09A1   FOutULShadow
    0x09A2   FOutULThick
    0x09A3   FOutShadow
    0x09A4   FOutExtra
    0x09A5   FOutAccent
    0x09A6   FOutDescent
    0x09A7   FOutWidMax
    0x09A8   FOutLeading
    0x09A9   FOutUnused
    0x09AA   FOutNumer
    0x09AE   FOutDenom
    0x09B2   FMDotsPerInch
    0x09B6   FMStyleTab
    0x09CE   ToolScratch
    0x09D6   WindowList
    0x09DA   SaveUpdate
    0x09DC   PaintWhite
    0x09DE   WMgrPort
    0x09E2   DeskPort
    0x09E6   OldStructure
    0x09EA   OldContent
    0x09EE   GrayRgn
    0x09F2   SaveVisRgn
    0x09F6   DragHook
    0x09FA   TempRect
    0x0A02   OneOne
    0x0A06   MinusOne
    0x0A0A   TopMenuItem
    0x0A0C   AtMenuBotom
    0x0A0E   IconBitMap
    0x0A1C   MenuList
    0x0A20   MBarEnable
    0x0A22   CurDeKind
    0x0A24   MenuFlash
    0x0A26   TheMenu
    0x0A28   SavedHandle
    0x0A2C   MBarHook
    0x0A30   MenuHook
    0x0A34   DragPattern
    0x0A3C   DeskPattern
    0x0A44   DragFlag
    0x0A46   CurDragAction
    0x0A4A   FPState
    0x0A50   TopMapHndl
    0x0A54   SysMapHndl
    
    0x0A58   SysMap
    0x0A5A   CurMap
    0x0A5C   ResReadOnly
    0x0A5E   ResLoad
    0x0A60   ResErr
    0x0A62   TaskLock
    0x0A63   FScaleDisable
    0x0A64   CurActivate
    0x0A68   CurDeactive
    0x0A6C   DeskHook
    0x0A70   TEDoText
    0x0A74   TERecal
    0x0A78   ApplScratch
    0x0A84   GhostWindow
    0x0A88   CloseOrnHook
    0x0A8C   ResumeProc
    0x0A90   SaveProc
    0x0A94   SaveSP
    0x0A98   ANumber
    0x0A9A   ACount
    0x0A9C   DABeeper
    0x0AA0   DAStrings
    0x0AB0   TEScrpLength
    0x0AB2   unknown
    0x0AB4   TEScrpHandle
    0x0AB8   AppPacks
    0x0AD8   SysResName
    0x0AE8   SoundGlue
    0x0AEC   AppParmHandle
    0x0AF0   DSErrCode
    0x0AF2   ResErrProc
    0x0AF6   TEWdBreak
    0x0AFA   DlgFont
    0x0AFC   LastTGlobal
    0x0B00   TrapAgain
    0x0B04   KeyMVars
    0x0B06   ROMMapHndl
    0x0B0A   PWMBuf1
    0x0B0E   BootMask
    0x0B10   WidthPtr
    0x0B14   AtalkHk1
    0x0B18   AtalkHk2
    0x0B1C   FourDHack
    0x0B20   unknown
    0x0B22   HWCfgFlags
    0x0B24   TimeSCSIDB
    0x0B26   TopMenuItem
    0x0B28   AtMenuBottom
    0x0B2A   WidthTabHandle
    0x0B2E   SCSIDrvrs
    0x0B30   TimeVars
    0x0B34   BtDskRfn
    0x0B36   BootTmp8
    0x0B3E   unknown
    0x0B3F   T1Arbitrate
    0x0B4C   JDiskSel
    0x0B44   JSendCmd
    0x0B48   JDCDReset
    0x0B4C   LastSPExtra
    0x0B50   AppleShare
    0x0B54   MenuDisable
    0x0B58   MBDFHndl
    0x0B5C   MBSaveLoc
    0x0B60   BNMQHd
    0x0B64   Twitcher1
    0x0B68   unknown
    0x0B7C   Twitcher2
    0x0B80   RMgrHiVars
    0x0B9E   RomMapInsert
    0x0B9F   TmpResLoad
    0x0BA0   IntlSpec
    0x0BA0   SMgrCore
    0x0BA4   RMgrPerm
    0x0BA5   WordRedraw
    0x0BA6   SysFontFam
    0x0BA8   SysFontSize
    0x0BAA   MBarHeight
    0x0BAC   TESysJust
    0x0BAE   HiHeapMask
    0x0BB2   SegHiEnable
    0x0BB3   FDevDisable
    0x0BB4   CMVector
    0x0BB8   XFSGlobs
    0x0BBC   ShutDownQHdr
    0x0BC0   NewUnused
    0x0BC2   LastFOND
    0x0BC6   FONDID
    0x0BC8   App2Packs
    0x0BE8   MAErrProc
    0x0BEC   MASuperTab
    0x0BF0   MimeGlobs
    0x0BF4   FractEnable
    0x0BF5   UsedWidths
    0x0BF6   FScaleHFact
    0x0BFA   FScaleVFact
    0x0BFE   unknown
    0x0C00   SCSIBase
    0x0C04   SCSIDMA
    0x0C08   SCSIHsk
    0x0C0C   SCSIGlobals
    0x0C10   RGBBlack
    0x0C16   RGBWhite
    0x0C1C   unknown
    0x0C20   RowBits
    0x0C22   ColLines
    0x0C24   ScreenBytes
    0x0C28   IOPMgrVars
    0x0C2C   NMIFlag
    0x0C2D   VidType
    0x0C2E   VidMode
    0x0C2F   SCSIPoll
    0x0C30   SEVarBase
    0x0CB0   MMUFlags
    0x0CB1   MMUType
    0x0CB2   MMU32bit
    0x0CB3   WhichBox
    0x0CB4   MMUTbl
    0x0CB   MMUTblSize
    0x0CBC   SInfoPtr
    0x0CC0   ASCBase
    0x0CC4   SMGlobals
    0x0CC8   TheGDevice
    0x0CCC   CQDGlobals
    0x0CD0   AuxWinHead
    0x0CD4   AuxCtlHead
    0x0CD8   DeskCPat
    0x0CDC   SetOSDefKey
    0x0CE0   LastBinPat
    0x0CE8   DeskPatEnable
    0x0CEA   unknown
    0x0CF8   ADBBase
    0x0CFC   WarmStart
    0x0D00   TimeDBRA
    0x0D02   TimeSCCDB
    0x0D04   SlotQDT
    0x0D08   SlotPrTbl
    0x0D0C   SlotVBLQ
    0x0D10   ScrnVBLPtr
    0x0D14   SlotTICKS
    0x0D18   PowerMgrVars
    0x0D1C   AGBHandle
    0x0D20   TableSeed
    0x0D24   SRsrcTblPtr
    0x0D28   JVBLTask
    0x0D2C   WMgrCPort
    0x0D30   VertRRate
    0x0D32   SynListHandle
    0x0D36   LastFore
    0x0D3E   LastMode
    0x0D40   LastDepth
    0x0D42   FMExist
    0x0D43   SavedHilite
    0x0D44   unknown
    0x0D50   MenuCInfo
    0x0D54   MBProcHndl
    0x0D58   MBSaveLoc
    0x0D58   MRect
    0x0D5C   MBFlash
    0x0D5C   MenuCInfo
    0x0D60   ChunkyDepth
    0x0D62   CrsrPtr
    0x0D64   unknown
    0x0D66   PortList
    0x0D6A   MickeyBytes
    0x0D6E   QDErr
    0x0D70   VIA2DT
    0x0D90   SInitFlags
    0x0D92   DTQFlags
    0x0D92   DTQueue
    0x0D94   DtskQHdr
    0x0D98   DTskQTail
    0x0D9C   JDTInstall
    0x0DA0   HiliteRGB
    0x0DA6   TimeSCSIDB
    0x0DA8   DSCtrAdj
    0x0DAC   IconTLAddr
    0x0DB0   VideoInfoOK
    0x0DB4   EndSRTPtr
    0x0DB8   SDMJmpTblPtr
    0x0DBC   JSwapMMU
    0x0DC0   SdmBusErr
    0x0DC4   LastTxGDevice
    0x0DC8   PmgrHandle
    0x0DCC   LayerPalette
    0x0E00   ToolTable
    0x1E00   SystemHeap