BASIC IV ROM Routines
   
  Memory usage
  
    Submitted by Steve Fewell 
    Page Last Altered: 
    
     
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 offset (offset to the current byte being processed from the address pointed to by (&1A, &1B)) | 
| 1A | BASIC Second Text Pointer LSB [Pointer to start of BASIC text line] | 
| 1B | BASIC Second Text Pointer MSB [Pointer to start of BASIC text line] | 
| 1C | BASIC PROGRAM START [Pointer to start of BASIC program] LSB | 
| 1D | BASIC PROGRAM START [Pointer to start of BASIC program] MSB | 
| 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) | 
| 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 | |
| ... | |
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-5FF | FOR/REPEAT/GOSUB 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 = {agrp}/ FWA] | 
| 7F4-7F5 | Contains &A6A6 which is the address of the Floating-Point * function [FWA = {agrp}* FWA] | 
| 7F6-7F7 | Contains &A68D which is the address of the Floating-Point + function [FWA = {agrp}+ 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 = {agrp}] | 
| 7FC-7FD | Contains &A519 which is the address of the Floating-Point Store function [{agrp}= FWA] | 
| 07FE | Contains &4A which is the start of the zero page location of agrp (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) |