AllMem — BBC System Memory Map
Author: Jon Ripley, updated by J.G. Harston
Edition used: 18-Jun-2016
File: raw/AllMem.txt
Scope: A complete byte-level catalogue of MOS workspace use across the BBC A/B/B+, Electron, Master 128, Master ET, and Master Compact. Covers zero page, pages 1-3, buffer pages 8-D, sideways ROM areas, FRED/JIM/SHEILA, and the MOS jumpblock.
Summary
This is the single most useful low-level reference for “what owns this byte?” — finer-grained than the NAUG memory chapter (which is more discursive) and authoritative on BBC/Electron/Master differences. Per-byte coverage, with per-machine variants called out side-by-side. Particularly strong on:
- Zero page subdivisions (Econet/NMI/CFS/VDU partitioning) — more precise than NAUG.
- The full OSBYTE-variables table at
&236-&28F(every fxNNN ↔ address ↔ purpose mapping). - Extended vector table at
&0D9F-&0DEF. - Sideways-ROM workspace conventions for the
&0DF0-&0DFFprivate workspace high-byte register. - Electron-specific deltas (ULA register copies, ROM manager workspace).
Key technical claims (with citations to file lines)
Citations are line numbers in raw/AllMem.txt.
Zero page partitioning (lines 13-130)
&0000-&008FLanguage workspace — full 144 bytes, not just&00-&6F(which is what NAUG implies when listing the “USER&70-&8F” carve-out).&0090-&009FEconet private workspace.&00A0-&00A7Current NMI owner’s workspace.&00A0conventionally stores previous NMI owner ID.&00A8-&00AFTransient command space (NOT generic “OS scratch” — used by*commandinvocations).&00B0-&00BFFiling system scratch space.&00C0-&00CFFiling system workspace.&00D0-&00E1VDU workspace.&00E2-&00E3CFS/RFS private workspace.&00E4-&00FFGeneral MOS workspace.
VDU zero page detail (lines 68-88)
&00D0VDU Status (= OSBYTE&75). Bits: 0=printer, 1=scroll-disabled, 2=paged, 3=software-scroll, 4=shadow (Master only), 5=VDU 5, 6=cursor split, 7=VDU disabled.&00D1Graphics pixel mask.&00D2Text colour OR mask.&00D3Text colour EOR mask.&00D4Graphics colour OR mask.&00D5Graphics colour EOR mask.&00D6-&00D7Graphics character cell.&00D8-&00D9Top scan line.&00DA-&00DFTemporary workspace.&00E0-&00E1BBC/Electron: Row multiplication; Master: General workspace.
Critical OS workspace at &00E4-&00FF (lines 106-130)
&00ECInternal key number (last).&00EDInternal key number (first/penultimate).&00EEInternal key of char ignored by OSBYTE&79, AND the 1 MHz bus paging-register RAM copy (dual-purpose).&00EF / &00F0 / &00F1OSBYTE/OSWORD A / X / Y reg values during a call.&00F2-&00F3OS text pointer (star commands, filenames).&00F4Currently selected ROM.&00F5Current PHROM or RFS ROM number.&00F6-&00F7PHROM/RFSROM/OSRDSC pointer.&00F8-&00F9BBC/Electron unused; Master: Soft key expansion pointer.&00FA-&00FBGeneral OS workspace, used by buffer access code in interrupts.&00FCInterrupt Temp A reg store.&00FD-&00FEError message pointer, initially set to language version string (NOT “post-BRK return pointer” — it’s the address of the error text following a BRK).&00FFEscape flag (bit 7).
OS vectors at &0200-&0235 (lines 149-177)
Full 27-vector table. All present in our existing calls page; AllMem confirms.
OSBYTE variables &0236-&028F (lines 179-287)
Each address &023N maps to fxNNN where NNN = address − &023 mapped to OSBYTE number. The mapping is &236 = fx166 = OS-var &A6, then sequential.
Examples (used to verify the wiki’s “direct read” table):
&024Afx186&BAROM active last BRK.&0261fx209&D1Speech suppression status.&0262fx210&D2Sound suppression status.&0269fx217&D9Screen lines since last page.&027Cfx236&ECOutput stream character destination (set with FX3).&027Dfx237&EDCursor key status (set with FX4).&027Efx238&EEBBC/Electron unused; Master: keypad base.&0242fx178&B2Keyboard semaphore (BBC/Master) / undefined (Electron).
Page 2 misc workspace (lines 289-369)
&0290VDU vertical adjust (*TV first parameter).&0291Interlace toggle (*TV second parameter).&0292-&0296TIME value 1,&0297-&029BTIME value 2 (5-byte dual-copy for atomic read).&029C-&02A0OSWORD 3/4 countdown timer.&02A1-&02B0Paged ROM type table.&02B1-&02B2INKEY countdown.&02B3 / &02B4 / &02B5OSWORD 0 max line length / min char / max char.&02B6-&02BEADC channel value tables (BBC). Electron uses&02F7-&02FFinstead.&02BF-&02C8Event enable flags.- Buffer busy / start / end indexes differ BBC vs Master vs Electron — table at lines 326-336.
Page 3 VDU workspace (lines 378-445)
&0300-&0307Current graphics window (4 × 16-bit words: left col, bottom row, right col, top row — pixels).&0308-&030BCurrent text window (4 bytes: left, bottom, right, top — character cells).&030C-&030FGraphics origin (external coords).&0310-&0313Current graphics cursor (external).&0314-&0317Old graphics cursor (external).&0318 / &0319Current text cursor X / Y.&031ALine within graphics cell of cursor.&031BGraphics workspace / VDU queue.&031F-&0323VDU queue (5 bytes).&0324-&0327Current graphics cursor (internal coords).&0328-&032FBitmap read from screen by OSBYTE 135.&0330-&0349Graphics workspace.&034A-&034BText cursor address for 6845.&034C-&034DText window width in bytes.&034EHigh byte of bottom of screen memory.&034FBytes per character for current mode.&0350-&0351Screen display start address for 6845 (the OS’s view of R12/R13).&0352-&0353Bytes per screen row.&0354Screen memory size high byte.&0355Current screen mode.&0356Memory map type: 0=20K, 1=16K, 2=10K, 3=8K, 4=1K.&0357-&035AForeground/background text/graphics colours.&035B / &035CForeground/background plot mode.&035D-&035EGeneral VDU jump vector.&035FCursor start register previous setting.&0360Number of logical colours − 1.&0361Pixels per byte − 1 (zero if text-only mode).&0362 / &0363Leftmost / rightmost pixel colour mask.&0364 / &0365Text input cursor X / Y.&0366-&036EBBC/Electron: teletext output cursor char + font explosion flags + font location MSBs for char groups 32-63, 64-95, … 224-255. Master: VDU 23,16 setting, VDU 23,6 dot pattern, ECF state, foreground/background graphics colour.&036F-&037EPalette for colours 0-15.&037FUnused (used by some shadow-RAM systems).
Pages 8-9 buffers (lines 494-578)
&0800-&083FSound workspace.&0840-&087FSound channel buffers (4 × 16-byte channels).&0880-&08BFPrinter buffer (DISTINCT from sound area).&08C0-&08FFEnvelopes 1-4 (13 bytes each + 3 spare).&0900-&09BFRS423 output buffer.&09C0-&09FFSpeech buffer.&0900-&09FFoverlap: CFS/RFS BPUT sequential output buffer (mutually exclusive with RS423/Speech).&0900-&09BFEnvelopes 5-16 (same layout as 1-4, when used).&0A00-&0AFFCassette/RS423 input buffer (NOT used byLOAD).
Page B / Page C / Page D (lines 586-748)
&0B00-&0B10Soft key pointers (17 bytes = ptr per fkey 0-15 + sentinel).&0B11-&0BFFSoft key strings.- Master variant:
&0B00-&0BFFEconet workspace (station, FS station, FS network, print server type string). &0C00-&0CFFBBC/Electron: Font for ASCII 128-159. Master: Econet workspace.&0D00-&0D5FNMI handler code + workspace. Claim via service-call 12 (OSBYTE143,12,255). MUST placeRTIat&0D00if you own the workspace but don’t handle hardware NMIs.- Econet uses
&0D20-&0D5Ffor scout/acknowledge packets when active. &0D60-&0D67Econet workspace.&0D68-&0D7FMaster Econet / Electron expansion / Electron ROM manager workspace.&0D80-&0D91Econet-over-other-hardware workspace.&0D92-&0D9EMouse / trackerball workspace.&0D9F-&0DEFExtended vector table — every standard vector mirrored as 3 bytes (address low, address high, ROM number). E.g.&0DAE-&0DB0XBYTEV.&0DF0-&0DFFSideways ROMs private workspace high-byte register. ROMxhas byte at&0DF0+x. Conventionally MSB of private workspace pointer. Bit 7 disables the ROM (workspace at&8000-&FFFF= ROM area = invalid).
Master Andy workspace (lines 820-829)
&8000-&8FFF (Andy private RAM, ACCCON-bit selected):
&8000-&8020Soft key string start addresses (16 × low byte + sentinel + 16 × high byte + sentinel).&8022-&83FFSoft key string data.&8400-&87FFVDU driver workspace.&8800-&88FFVDU variables.&8900-&8FFFFont definition, chars 32-255.
Master Hazel workspace (lines 832-886)
&C000-&DBFF Sideways ROM shared / private workspace (claim via service call &21 for shared, &22 for private). Strictly: only filing systems can claim shared workspace here (via FSC 6 — vectors changing). Private workspace is per-ROM.
&DC00-&DCFFOSCLI string buffer.&DD00-&DEFFTransient command workspace.&DF00Current filing system number.&DF01Active filing system number.&DF02Library filing system number.&DF03ROM number of current filing system.&DF04-&DF05Transient command line address.&DF06-&DFC1Up to 17 filing system info blocks (11 bytes each + terminator).&DFC2-&DFDD*LIST/*TYPE/*BUILD/*APPEND/*MOVE state.&DFDE-&DFFFUnused.
Master DFS OSWORD &7F bug (line 856-858)
The Master DFS OSWORD &7F writes to page &C2 regardless of who owns the shared workspace. Documented bug, worth noting if rolling custom Master ROMs.
Page FE — SHEILA (lines 927-948)
Confirms our existing memory-map table. AllMem additions:
&FE18-&FE1FStation ID / NMI Control (BBC B / B+) vs ADC (Master) — note the Master ADC is at&FE18, not&FEC0(which holds the BBC’s ADC).&FE20-&FE2FVideo ULA plus border control plus network NMI control.&FE24-&FE27Disk control (Master).&FE80-&FE9F: 8271 FDC (B) / 1770 FDC + control (B+) / Videodisk SCSI (Master).&FEC0-&FEDF: ADC (B/B+) / “Network interface (not 6854 ADLC)“.
Page FF — MOS entry jumpblock (lines 951-981)
Full list of public entry points &FFB3-&FFF9 plus hardware vectors &FFFA-&FFFF (NMIV, RESETV, IRQV). Master adds OSWRSC (&FFB3) for writing a byte to screen.
Filed into
This ingest produces no new wiki pages — it’s a reference cross-check. The audit findings are listed in allmem-cross-reference-report (filing this back depends on user approval — see report).
Pages whose claims were validated against this source:
Contradictions found are listed below for human review.
This wiki is curated by Claude following the LLM-Wiki methodology — a human curates source documents, the LLM compiles structured cross-linked markdown. Content may contain errors, omissions, or stale claims. For authoritative information refer to the original source documents in the bbc-documents GitHub archive.