diff --git a/content/isa-docs/lc-2/memory.md b/content/isa-docs/lc-2/memory.md new file mode 100644 index 0000000..fee4cd9 --- /dev/null +++ b/content/isa-docs/lc-2/memory.md @@ -0,0 +1,81 @@ ++++ +title = "Memory" +weight = 110 ++++ + +LC-2 has a 16-bit address bus, giving a linear address space of 65,536 +locations, numbered from `0x0000` to `0xFFFF`. Memory is canonically divided +into 27 pages of 29 words each. There is no segmentation, +no paging, and no virtual memory: every address maps directly to a physical +location.[^lc2-overview] + +[^lc2-overview]: {{< cite-ics edition="1" chapter="Appendix A: The LC-2 ISA" page="429" >}} + +Addressability is 16 bits: each location in memory holds exactly one word, +matching the width of the data bus. A single memory access always transfers a +full 16-bit value, never a partial word, which is also why the concept of +endianness does not apply here: there is no multi-byte value to order within a +single access. + +## Memory Map + +The memory map below reflects the conventions of the standard LC-2 operating +system, not the ISA itself. The ISA only defines the trap vector table at +`0x0000 - 0x00FF`. Everything else, from the location of the OS to the boundary +of userspace, is a software convention rather than a hardware requirement. + +| Range | Purpose | +|:-------------------:|:-------------------------------------:| +| `0x0000` - `0x00FF` | Trap Vector Table[^lc2-trap] | +| `0x0100` - `0x2FFF` | Operating System[^matt-postiff-guide] | +| `0x3000` - `0xCFFF` | Userspace | +| `0xD000` - `0xFFFF` | Device Registers | + +[^lc2-trap]: {{< cite-ics edition="1" chapter="Appendix A.3 The Instruction Set" page="448" page-end="449" >}} +[^matt-postiff-guide]: {{< cite-web + author="Postiff, Matthew A." + title="LC-2 Programmer's Reference and User Guide" + site="University of Texas" + url="https://www.cs.utexas.edu/~fussell/courses/cs310h/simulator/lc2.pdf" + format="PDF" + accessed="August 31, 2026" + url-archived="https://web.archive.org/web/20251205052350/https://www.cs.utexas.edu/~fussell/courses/cs310h/simulator/lc2.pdf" + url-archived-date="December 05, 2025" +>}} + +## Stack + +The ISA does not define a stack as a distinct hardware structure, but it +assumes one exists by convention. R6 is used as the stack pointer, and the +stack is assumed to grow toward `0xFFFF`. + +This convention is not optional in practice: the `RTI` instruction relies on it +directly. When an interrupt is serviced, the CC and PC are pushed onto the +stack. `RTI` pops them back in reverse order to resume execution. Any deviation +from the R6 convention would break interrupt handling.[^lc2-rti] + +[^lc2-rti]: {{< cite-ics edition="1" chapter="Appendix A.3 The Instruction Set" page="444" >}} + +## Memory-Mapped I/O + +LC-2 uses memory-mapped I/O: devices are accessed using the same load and store +instructions used for regular memory, with no dedicated I/O instructions in the +ISA.[^lc2-mmio] + +[^lc2-mmio]: {{< cite-ics edition="1" chapter="8.1.2 Memroy Mapped I/O Versus Special Input/Output Instructions" page="158" >}} + +The standard LC-2 operating system maps the following devices into the top of +the address space. These are not defined by the ISA: they are the devices +assumed by the reference implementation and its OS. + +| Address | Register | Description | +|:--------:|:-------------------------------------------------------:|:------------------------------------------------------------------------------------------------------------------------| +| `0xF3FC` | Video Status Register (`CRTSR`)[^lc2-devices-registers] | Bit 15, the ready bit, indicates whether the video device is ready to receive another character to print on the screen. | +| `0xF3FD` | Horizontal Screen Position[^matt-postiff-guide] | Not implemented. | +| `0xF3FE` | Vertical Screen Position | Not implemented. | +| `0xF3FF` | Video Data Register (`CRTDR`) | A character written in the low byte of this register will be displayed on screen. | +| `0xF400` | Keyboard Status Register (`KBSR`) | Bit 15, the ready bit, indicates whether the keyboard has received a new character. | +| `0xF401` | Keyboard Data Register (`KBDR`) | The lower byte contain the last character typed on the keyboard. | +| `0xFFFF` | Machine Control Register (`MCR`) | Bit 15 is the clock enable bit. When cleared, instruction processing stops because the clock signal stops pulsing. | + +[^lc2-devices-registers]: {{< cite-ics edition="1" chapter="Appendix A: The LC-2 ISA" page="430" >}}