Spectrum memory map when running BBCBasic or BBC MOS ==================================================== Memory Layout Overview ---------------------- &0000 ROM &4000 Screen &4000 Lowest possible Low Water Mark with Shadow Screen &5B00 Spectrum printer buffer - may be usable as workspace &5C00 Spectrum workspace &6000 Lowest possible Low Water Mark without Shadow Screen &FF00 Highest possible High Water Mark for BBC environment &FF80 BBC MOS Interface addresses Spectrum Memory Map ------------------- &0000 Onboard Rom &4000 Screen bitmap &5800 Screen colourmap &5B00 Previously printer buffer &5C00 Spectrum system variables &5CB6 Interface 1 System Variables &5CF0 A single microdrive map NB: Microdrive LOAD pushes 32 byte map onto stack &5D10 Start of CHANS standard channels extend to: &5D24 a single microdrive channel would extend to: &5F77 &80 byte, terminating CHANS area &5F78 &80 PROG, VARS &5F79 &0D E_LINE &5F7A &80 &5F7B WORKSP, STKBOT, STKEND 129 bytes of workspace for Spectrum routines Spectrum will never give 'Out of memory' error, as SP is always above &6000, at or below HIMEM Eg, Microdrive LOAD pushes 32 byte map onto stack, this will go onto stack at HIMEM, around &F300 &5FFD End of spare space &5FFC ERR_SP &5FFE &00 &5FFF &3E RAMTOP - End of Spectrum memory area BBC BASIC Memory use ==================== &6000 Default PAGE &F000 Default HIMEM &F000 BBC BASIC String buffer &F100 BBC BASIC Comand buffer &F200 System variables &F4CE Control block used by Basic &F4CE-F => String buffer &F4D0 Max char value &F4D1 Min char value &F4D2 Max input string length &F4D3 Last byte of longest control block used BBC MOS Memory use ================== &F200 CLICOM input buffer (255 bytes max - up to &FF) &F300 NMI Code Space &F300-1 Initialised to RETN &F37F End of NMI code space &F380 Reserved for sideways ROM access Could be small transient command buffer up to &F3FF &F3E0 Error buffer - Spectrum errors translated into strings (up to 30 bytes) Temporary stack from &F3FF downwards &F400 VDU workspace &F400 UDCs &F480 VDU queue and workspace &F490 ROM table &F4A0 MOS workspace &F4A0-1 Ticker &F4A2-3 CopyAddr &F4A4-5 &F4A6-7 &F4A8 Filing system workspace &F4A8 CURDRV - Current filing system &F4A9 CATFLG &F4AA &F4AB &F4AC Tape Load Header &F4AC Filetype &F4AD-B5 Filename &F4B7-8 Length &F4B9-A LOAD &F4BB-C EXEC &F4BD Tape Save Header, Tape Search Header &F4BD Filetype &F4BE-C7 Filename &F4C8-9 Length &F4CA-B LOAD &F4CC-D EXEC &F4CE Control block, eg for OsFile: &F4CE-F => Filename &F4D0-3 LOAD &F4D4-7 EXEC &F4D8-B Length/Start &F4DC-F Attrs/End &F4C6 Enough space in ROM for MOS code &F4E0 MOS code BBC MOS Interface Addresses --------------------------- &FF80 Escape flag &FF81 TEMPA &FF82 FAULT &FF84 DEFERR &FF86 LPTR Command line tail pointer &FF88 MEMBOT Bottom of available memory &FF8A MEMTOP Top of available memory &FF8C ROMPORT (ROM paging port - now unused) &FF8E SCREEN Timex display setting, (port &FF value)*2, b7=1 - no Timex screen &FF8F ROMSEL Currently selected ROM &FF90 ZXROM Value to send to ROMPAGE to select ZXROM &FF91 BBCROM Value to send to ROMPAGE to select BBCROM &FF92 ROMPAGE Page bottom 16K of memory &FF95 SERVICE &FF98 _BDOSRun Cold start entry point &FF9B _BDOSWarm QUIT &FF9E [PR_OUT] &FFA1 RD_DEC &FFA4 RD_HEX &FFA7 OSQUIT Exit current environment &FFAA PR_HEX Print A in hex &FFAD PR2HEX Print HL in hex &FFB0 USERINT &FFB3 PR_TEXT Print inline text until NOP &FFB6 [PRNT_C] &FFB9 CLICOM &FFBC ERRJMP &FFBF INITERR &FFC2 [SEEK_0] &FFC5 [TSTKBD] &FFC8 [TERM] &FFCB OSFSC &FFCE OSFIND &FFD1 OSGBPB &FFD4 OSBPUT &FFD7 OSBGET &FFDA OSARGS &FFDD OSFILE &FFE0 OSRDCH &FFE3 OSASCI &FFE7 OSNEWL &FFEC PRNTCR &FFEE OSWRCH &FFF1 OSWORD &FFF4 OSBYTE &FFF7 OS_CLI &FFFA BRKV &FFFC EVENTV &FFFE IRQV ROM Paging Values ----------------- +---+---+---+---+---+---+---+---+ | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +---+---+---+---+---+---+---+---+ | +---+---+---+----- Timex MMU bits 2-5 | +--- 0 : b7-b4 used to page ROMs with &7FFD +--- 1 : b4=0: DOCK paged in, b4=1: EX paged in On the Spectrum SE with no ROM expansion, this gives the following values: &00 - HOME ROM 0 &10 - HOME ROM 1 &20 - DOCK &30 - EX