×   Main Menu ALL The 8BS News Manuals (New menu) Links Worth a Look Tools Disc and Basic Webring Site Map 8BS Guestbook Old Guest Book Me The Barnsley Rovers   
8-Bit Software

The BBC and Master Computer Public Domain Library


BASIC IV ROM Routines

Memory usage

Submitted by Steve Fewell

This page contains a listing of the main memory locations used by the BASIC ROM. Some of the addresses listed on this page will have multiple uses - in this case, only the most common usage will be given.

The listing is in address order (zero page first):

Address (in hex) Description of usage
00 LOMEM [Pointer to start of BASIC variables]  LSB
01 LOMEM [Pointer to start of BASIC variables]  MSB
02 VARTOP [Pointer to end of BASIC variables] LSB
03 VARTOP [Pointer to end of BASIC variables] MSB
04 BASIC Stack Pointer [Pointer to latest entry in BASIC Stack] LSB
05 BASIC Stack Pointer [Pointer to latest entry in BASIC Stack] MSB
06 HIMEM  [Pointer to start of memory-mapped screen area] LSB
07 HIMEM  [Pointer to start of memory-mapped screen area] MSB
08 ERL [Address of the BASIC line in which the last error occurred] LSB
09 ERL [Address of the BASIC line in which the last error occurred] MSB
0A BASIC Text Pointer offset (offset to the current byte being processed from the address pointed to by (&B, &C))
0B BASIC Text Pointer LSB [Pointer to start of BASIC text line]
0C BASIC Text Pointer MSB [Pointer to start of BASIC text line]
0D Random Number working area
0E Random Number working area
0F Random Number working area
10 Random Number working area
11 Random Number working area
12 TOP [Pointer to the end of the BASIC program - not including variables] LSB
13 TOP [Pointer to the end of the BASIC program - not including variables] MSB
14 PRINT BYTES - The number of bytes to include in a print output field
15 PRINT FLAG - 0 = Decimal, N = Hexadecimal
16 Pointer to BASIC Error routine code [either the default, or the code which occurs after an ON ERROR statement] LSB
17 Pointer to BASIC Error routine code [either the default, or the code which occurs after an ON ERROR statement] MSB
The default value of (&16, &17) is &B2AF.
18 PAGE (DIV by 256). The page number where the BASIC program starts. The page offset is always 00.
19 BASIC Second Text Pointer LSB [Pointer to start of BASIC text line]
1A BASIC Second Text Pointer MSB [Pointer to start of BASIC text line]
1B BASIC Second Text Pointer offset (offset to the current byte being processed from the address pointed to by (&19, &1A))
1C BASIC PROGRAM START [Pointer to start of BASIC program] LSB (when program is not running) /
Next DATA Location LSB (when program is running)
1D BASIC PROGRAM START [Pointer to start of BASIC program] MSB (when program is not running) /
Next DATA Location MSB (when program is running)
1E COUNT - The number of bytes printed since the last new line
1F LISTO flag (0 = off, 1 = a space after each line number, 2 = Indent FOR, 4 = Indent REPEAT), the top bit is also set for *EDIT mode
20 TRACE flag (0 = off, 1 = on)
21 Maximum TRACE LINE number (LSB)
22 Maximum TRACE LINE number (MSB)
23 WIDTH
24 Current REPEAT level
25 Current GOSUB level
26 15* Current FOR level
27 Variable type (00 = byte, 04 = integer, 05 = floating-point, &81 = String,  &A4 = Function, &F2 = Procedure)
28 OPT flag (0 - list, 1 - errors, 2 = relocate)
29
2A IWA - Integer working area -> LSB
2B IWA - Integer working area -> byte 2
2C IWA - Integer working area -> byte 3
2D IWA - Integer working area -> MSB
2E FWA - Floating-point working area A -> Sign byte
2F FWA - Floating-point working area A -> Exponent overflow byte
30 FWA - Floating-point working area A -> Exponent byte
31 FWA - Floating-point working area A -> Mantissa byte 1
32 FWA - Floating-point working area A -> Mantissa byte 2
33 FWA - Floating-point working area A -> Mantissa byte 3
34 FWA - Floating-point working area A -> Mantissa byte 4
35 FWA - Floating-point working area A -> Mantissa rounding byte
36 Current length of String in the String working area buffer (&600 - &6FF)
37 Pointer to next BASIC character [LSB] Also: Pointer to Integer variable.
38 Pointer to next BASIC character [MSB] Also: Pointer to Integer variable.
39
3A
3B FWB - Floating-point working area B -> Sign byte
3C FWB - Floating-point working area B -> Exponent byte
3D FWB - Floating-point working area B -> Mantissa byte 1
3E FWB - Floating-point working area B -> Mantissa byte 2
3F FWB - Floating-point working area B -> Mantissa byte 3
40 FWB - Floating-point working area B -> Mantissa byte 4
41 FWB - Floating-point working area B -> Mantissa rounding byte
42
43
44
45
46
47 Number of decimal points found in number [used by ASCII to binary number routine]
48
49
4A argp - pointer to Floating-Point variable LSB
4B argp - pointer to Floating-Point variable MSB
4C
4D
4E
4F
50
51
52
53
54
55
56
57
58
59
5A
5B
5C
5D
5E
5F
60
61
62
63
64
65
66
67
68
69
6A
6B
6C
6D
6E
6F
70
71
72
73
74
75
76
77
78
79
7A
7B
7C
7D
7E
7F
...
F9
FA
FB
FC
FD MOS Error Message pointer LSB [Error Number, Error String]
FE MOS Error Message pointer MSB [Error Number, Error String]
FF MOS Error Byte (Top bit set if error occurred?)
...

The following locations contain the values that BASIC assigns to any MOS vectors:
0202-0203 BASIC assigns the address &B278 to the BRK vector, as this points to the BASIC ROM code which BASIC wants to be executed every time an error condition occurs (generated by a BRK command in assembly language).
...

The following locations contain the values of the resident integer variables:
400-403 @% value LSB first
404-407 A% value LSB first
408-40B B% value LSB first
40C-40F C% value LSB first
410-413 D% value LSB first
414-417 E% value LSB first
418-41B F% value LSB first
41C-41F G% value LSB first
420-423 H% value LSB first
424-427 I% value LSB first
428-42B J% value LSB first
42C-42F K% value LSB first
430-433 L% value LSB first
434-437 M% value LSB first
438-43B N% value LSB first
43C-43F O% value LSB first
440-443 P% value LSB first
444-447 Q% value LSB first
448-44B R% value LSB first
44C-44F S% value LSB first
450-453 T% value LSB first
454-457 U% value LSB first
458-45B V% value LSB first
45C-45F W% value LSB first
460-463 X% value LSB first
464-467 Y% value LSB first
468-46B Z% value LSB first

The following locations contain the values of some temporary Floating-Point variables, in packed (variable) form:
46C-470 Temporary Floating-Point variable area 1
471-475 Temporary Floating-Point variable area 2
476-47A Temporary Floating-Point variable area 3
47B-47F Temporary Floating-Point variable area 4

The following locations contain the variable pointer tables.
[from Colin Pharo] There is a variable look-up table for each character with which a variable name in BASIC can start. Each pair of addresses is a  pointer (low byte, high byte) to the variables whose names start with that particular character.

The "variable look-up" table pointed to by each set of 2-bytes is stored in the variable area above the program TOP and has the following format:
* 2-byte pointer to the next variable (Low byte, high byte] [&0000 specifies the last variable in the table]
* The name of the variable (without the first character - which is already known, as it was used to find this table)
* End of name marker -> &00
* Variable details/variable contents.

The variable details/variable contents have the following formats:
* for Integer variables -->The value of the integer (in 4-byte format)
* for Floating-Point variables -->The value of the Floating-Point number (in 5-byte packed floating-point format)
* for String variables --> A pointer to the value of the string [Low byte, high byte], followed by the maximum size allocated to the string [1 byte], and the current size of the string [1 byte]. Note: The String value is stored without the &00 terminator byte.
* for Arrays --> 2 * The number of dimensions + 1 [1 byte], The number of elements in the first dimension, The number of elements in the second dimension. Followed by the contents of each array element (in the format described above [That is 4-bytes for Integer, 5-bytes for Floating-point number or 4-bytes for String]).
480-481 Variable Pointer table address [Low byte, high byte] for variables beginning with @
482-483 Variable Pointer table address [Low byte, high byte] for variables beginning with A
484-485 Variable Pointer table address [Low byte, high byte] for variables beginning with B
486-487 Variable Pointer table address [Low byte, high byte] for variables beginning with C
488-489 Variable Pointer table address [Low byte, high byte] for variables beginning with D
48A-48B Variable Pointer table address [Low byte, high byte] for variables beginning with E
48C-48D Variable Pointer table address [Low byte, high byte] for variables beginning with F
48E-48F Variable Pointer table address [Low byte, high byte] for variables beginning with G
490-491 Variable Pointer table address [Low byte, high byte] for variables beginning with H
492-493 Variable Pointer table address [Low byte, high byte] for variables beginning with I
494-495 Variable Pointer table address [Low byte, high byte] for variables beginning with J
496-497 Variable Pointer table address [Low byte, high byte] for variables beginning with K
498-499 Variable Pointer table address [Low byte, high byte] for variables beginning with L
49A-49B Variable Pointer table address [Low byte, high byte] for variables beginning with M
49C-49D Variable Pointer table address [Low byte, high byte] for variables beginning with N
49E-49F Variable Pointer table address [Low byte, high byte] for variables beginning with O
4A0-4A1 Variable Pointer table address [Low byte, high byte] for variables beginning with P
4A2-4A3 Variable Pointer table address [Low byte, high byte] for variables beginning with Q
4A4-4A5 Variable Pointer table address [Low byte, high byte] for variables beginning with R
4A6-4A7 Variable Pointer table address [Low byte, high byte] for variables beginning with S
4A8-4A9 Variable Pointer table address [Low byte, high byte] for variables beginning with T
4AA-4AB Variable Pointer table address [Low byte, high byte] for variables beginning with U
4AC-4AD Variable Pointer table address [Low byte, high byte] for variables beginning with V
4AE-4AF Variable Pointer table address [Low byte, high byte] for variables beginning with W
4B0-4B1 Variable Pointer table address [Low byte, high byte] for variables beginning with X
4B2-4B3 Variable Pointer table address [Low byte, high byte] for variables beginning with Y
4B4-4B5 Variable Pointer table address [Low byte, high byte] for variables beginning with Z
4B6-4B7 Variable Pointer table address [Low byte, high byte] for variables beginning with [
4B8-4B9 Variable Pointer table address [Low byte, high byte] for variables beginning with \
4BA-4BB Variable Pointer table address [Low byte, high byte] for variables beginning with ]
4BC-4BD Variable Pointer table address [Low byte, high byte] for variables beginning with ^
4BE-4BF Variable Pointer table address [Low byte, high byte] for variables beginning with _
4C0-4C1 Variable Pointer table address [Low byte, high byte] for variables beginning with '
4C2-4C3 Variable Pointer table address [Low byte, high byte] for variables beginning with a
4C4-4C5 Variable Pointer table address [Low byte, high byte] for variables beginning with b
4C6-4C7 Variable Pointer table address [Low byte, high byte] for variables beginning with c
4C8-4C9 Variable Pointer table address [Low byte, high byte] for variables beginning with d
4CA-4CB Variable Pointer table address [Low byte, high byte] for variables beginning with e
4CC-4CD Variable Pointer table address [Low byte, high byte] for variables beginning with f
4CE-4CF Variable Pointer table address [Low byte, high byte] for variables beginning with g
4D0-4D1 Variable Pointer table address [Low byte, high byte] for variables beginning with h
4D2-4D3 Variable Pointer table address [Low byte, high byte] for variables beginning with i
4D4-4D5 Variable Pointer table address [Low byte, high byte] for variables beginning with j
4D6-4D7 Variable Pointer table address [Low byte, high byte] for variables beginning with k
4D8-4D9 Variable Pointer table address [Low byte, high byte] for variables beginning with l
4DA-4DB Variable Pointer table address [Low byte, high byte] for variables beginning with m
4DC-4DD Variable Pointer table address [Low byte, high byte] for variables beginning with n
4DE-4DF Variable Pointer table address [Low byte, high byte] for variables beginning with o
4E0-4E1 Variable Pointer table address [Low byte, high byte] for variables beginning with p
4E2-4E3 Variable Pointer table address [Low byte, high byte] for variables beginning with q
4E4-4E5 Variable Pointer table address [Low byte, high byte] for variables beginning with r
4E6-4E7 Variable Pointer table address [Low byte, high byte] for variables beginning with s
4E8-4E9 Variable Pointer table address [Low byte, high byte] for variables beginning with t
4EA-4EB Variable Pointer table address [Low byte, high byte] for variables beginning with u
4EC-4ED Variable Pointer table address [Low byte, high byte] for variables beginning with v
4EE-4EF Variable Pointer table address [Low byte, high byte] for variables beginning with w
4F0-4F1 Variable Pointer table address [Low byte, high byte] for variables beginning with x
4F2-4F3 Variable Pointer table address [Low byte, high byte] for variables beginning with y
4F4-4F5 Variable Pointer table address [Low byte, high byte] for variables beginning with z
4F6-4F7 Variable Pointer table address [Low byte, high byte] for Procedures
4F8-4F9 Variable Pointer table address [Low byte, high byte] for Functions
04FA
04FB
04FC
04FD
04FE
04FF
500-527 The REPEAT Start address Stack
(&0500-&0513 is the start address LSB stack and &0514-&0527 is the start address MSB stack)
528-5BD The FOR Loop Stack
A maximum of 10 FOR loop details can be stored. Each FOR block is 15 bytes long.
The 1st FOR block (&0528-&0536) has the following layout:
Byte 1 (&0528) is the variable location - LSB.
Byte 2 (&0529) is the variable location - MSB
Byte 3 (&052A) is the variable type
Byte 4 (&052B) - Byte 8 (&052F) is the STEP value (Float (5-byte) / Integer (4-byte))
Byte 9 (&0530) - Byte 13 (&0534) is the TO value (Float (5-byte) / Integer (4-byte))
Byte 14 (&0535) is the program location of the start of the first statement within the FOR loop - LSB
Byte 15 (&0536) is the program location of the start of the first statement within the FOR loop - MSB
The 2nd FOR block (&0537-&0545) has the following layout:
Byte 1 (&0537) is the variable location - LSB.
Byte 2 (&0538) is the variable location - MSB
Byte 3 (&0539) is the variable type
Byte 4 (&053A) - Byte 8 (&053E) is the STEP value (Float (5-byte) / Integer (4-byte))
Byte 9 (&053F) - Byte 13 (&0543) is the TO value (Float (5-byte) / Integer (4-byte))
Byte 14 (&0544) is the program location of the start of the first statement within the FOR loop - LSB
Byte 15 (&0545) is the program location of the start of the first statement within the FOR loop - MSB
The 3rd FOR block (&0546-&0554) has the following layout:
Byte 1 (&0546) is the variable location - LSB.
Byte 2 (&0547) is the variable location - MSB
Byte 3 (&0548) is the variable type
Byte 4 (&0549) - Byte 8 (&054D) is the STEP value (Float (5-byte) / Integer (4-byte))
Byte 9 (&054E) - Byte 13 (&0552) is the TO value (Float (5-byte) / Integer (4-byte))
Byte 14 (&0553) is the program location of the start of the first statement within the FOR loop - LSB
Byte 15 (&0554) is the program location of the start of the first statement within the FOR loop - MSB
The 4th FOR block (&0555-&0563) has the following layout:
Byte 1 (&0555) is the variable location - LSB.
Byte 2 (&0556) is the variable location - MSB
Byte 3 (&0557) is the variable type
Byte 4 (&0558) - Byte 8 (&055C) is the STEP value (Float (5-byte) / Integer (4-byte))
Byte 9 (&055D) - Byte 13 (&0561) is the TO value (Float (5-byte) / Integer (4-byte))
Byte 14 (&0562) is the program location of the start of the first statement within the FOR loop - LSB
Byte 15 (&0563) is the program location of the start of the first statement within the FOR loop - MSB
The 5th FOR block (&0564-&0572) has the following layout:
Byte 1 (&0564) is the variable location - LSB.
Byte 2 (&0565) is the variable location - MSB
Byte 3 (&0566) is the variable type
Byte 4 (&0567) - Byte 8 (&056B) is the STEP value (Float (5-byte) / Integer (4-byte))
Byte 9 (&056C) - Byte 13 (&0570) is the TO value (Float (5-byte) / Integer (4-byte))
Byte 14 (&0571) is the program location of the start of the first statement within the FOR loop - LSB
Byte 15 (&0572) is the program location of the start of the first statement within the FOR loop - MSB
The 6th FOR block (&0573-&0581) has the following layout:
Byte 1 (&0573) is the variable location - LSB.
Byte 2 (&0574) is the variable location - MSB
Byte 3 (&0575) is the variable type
Byte 4 (&0576) - Byte 8 (&057A) is the STEP value (Float (5-byte) / Integer (4-byte))
Byte 9 (&057B) - Byte 13 (&057F) is the TO value (Float (5-byte) / Integer (4-byte))
Byte 14 (&0580) is the program location of the start of the first statement within the FOR loop - LSB
Byte 15 (&0581) is the program location of the start of the first statement within the FOR loop - MSB
The 7th FOR block (&0582-&0590) has the following layout:
Byte 1 (&0582) is the variable location - LSB.
Byte 2 (&0583) is the variable location - MSB
Byte 3 (&0584) is the variable type
Byte 4 (&0585) - Byte 8 (&0589) is the STEP value (Float (5-byte) / Integer (4-byte))
Byte 9 (&058A) - Byte 13 (&058E) is the TO value (Float (5-byte) / Integer (4-byte))
Byte 14 (&058F) is the program location of the start of the first statement within the FOR loop - LSB
Byte 15 (&0590) is the program location of the start of the first statement within the FOR loop - MSB
The 8th FOR block (&0591-&059F) has the following layout:
Byte 1 (&0591) is the variable location - LSB.
Byte 2 (&0592) is the variable location - MSB
Byte 3 (&0593) is the variable type
Byte 4 (&0594) - Byte 8 (&0598) is the STEP value (Float (5-byte) / Integer (4-byte))
Byte 9 (&0599) - Byte 13 (&059D) is the TO value (Float (5-byte) / Integer (4-byte))
Byte 14 (&059E) is the program location of the start of the first statement within the FOR loop - LSB
Byte 15 (&059F) is the program location of the start of the first statement within the FOR loop - MSB
The 9th FOR block (&05A0-&05AE) has the following layout:
Byte 1 (&05A0) is the variable location - LSB.
Byte 2 (&05A1) is the variable location - MSB
Byte 3 (&05A2) is the variable type
Byte 4 (&05A3) - Byte 8 (&05A7) is the STEP value (Float (5-byte) / Integer (4-byte))
Byte 9 (&05A8) - Byte 13 (&05AC) is the TO value (Float (5-byte) / Integer (4-byte))
Byte 14 (&05AD) is the program location of the start of the first statement within the FOR loop - LSB
Byte 15 (&05AE) is the program location of the start of the first statement within the FOR loop - MSB
The 10th FOR block (&05AF-&05BD) has the following layout:
Byte 1 (&05AF) is the variable location - LSB.
Byte 2 (&05B0) is the variable location - MSB
Byte 3 (&05B1) is the variable type
Byte 4 (&05B2) - Byte 8 (&05B6) is the STEP value (Float (5-byte) / Integer (4-byte))
Byte 9 (&05B7) - Byte 13 (&05BB) is the TO value (Float (5-byte) / Integer (4-byte))
Byte 14 (&05BC) is the program location of the start of the first statement within the FOR loop - LSB
Byte 15 (&05BD) is the program location of the start of the first statement within the FOR loop - MSB
5BE-5CB Unused
These 14 bytes are unused.
5CC-5FF The GOSUB Return address Stack
(&05CC-&05E5 is the return address LSB stack and &05E6-&05FF is the return address MSB stack)
600-6FF SWA - String working area/buffer [also: call parameter block]
700-7EF BASIC Line Input buffer

The following address are pointers [Low Byte, High byte] to specific floating-point routines in the BASIC ROM. BASIC provides these addresses as fixed external pointers to these often used routines within the BASIC ROM. The details in addresses &07F0 to &07FF are exactly the same as those in the BASIC4 ROM locations &BF14 to &BF23.
7F0-7F1 Contains &A7B8 which is the address of the Floating-Point SQR function [FWA = SQR(FWA)]
7F2-7F3 Contains &A5EE which is the address of the Floating-Point  / function [FWA = {argp}/ FWA]
7F4-7F5 Contains &A6A6 which is the address of the Floating-Point * function [FWA = {argp}* FWA]
7F6-7F7 Contains &A68D which is the address of the Floating-Point + function [FWA = {argp}+ FWA]
7F8-7F9 Contains &ACCA which is the address of the Floating-Point Compliment function [FWA = -FWA]
7FA-7FB Contains &A541 which is the address of the Floating-Point Load function [FWA = {argp}]
7FC-7FD Contains &A519 which is the address of the Floating-Point Store function [{argp}= FWA]
07FE Contains &4A which is the start of the zero page location of argp (a pointer to a floating-point variable)
07FF Contains &2E which is the start of the zero page location for the FWA (Floating-Point working area A)

 


 Back to 8BS
Or