Memory Management: Difference between revisions

From F256 Foenix
Jump to navigationJump to search
(Created page with "The F256 line comes with 512 KB of RAM and 256 KB of flash memory. Up to 256 KB additional Memory, either RAM or Flash, can be added through the Expansion Port. === Physical Memory Layout === The address bus is 21 bits wide, allowing a total of 2<sup>21</sup> = 2 MB to be addressed. {| class="wikitable" !Address!!Purpose |- |$00:0000 - $07:FFFF||RAM |- |$80:0000 - $0F:FFFF||Flash |- |$10:0000 - $13:FFFF||Expansion Memory |- |$14:0000 - $1F:FFFF||Reserved |}")
 
(corrected start of Flash (old: $80:0000 new: $08:0000))
 
(13 intermediate revisions by 4 users not shown)
Line 1: Line 1:
The F256 line comes with 512 KB of RAM and 256 KB of flash memory. Up to 256 KB additional Memory, either RAM or Flash, can be added through the [[Expansion Port]].
The F256 line comes with 512 KB of RAM and 512 KB of flash memory. Up to 256 KB additional Memory, either RAM or Flash, can be added through the [[Expansion Port]].


=== Physical Memory Layout ===
=== Physical Memory Layout ===
Line 10: Line 10:
|$00:0000 - $07:FFFF||RAM  
|$00:0000 - $07:FFFF||RAM  
|-
|-
|$80:0000 - $0F:FFFF||Flash
|$08:0000 - $0F:FFFF||Flash
|-
|-
|$10:0000 - $13:FFFF||Expansion Memory
|$10:0000 - $13:FFFF||Expansion Memory
|-
|-
|$14:0000 - $1F:FFFF||Reserved
|$14:0000 - $1F:FFFF||Reserved
|}
=== Memory Management Unit (MMU) ===
While the address bus is generally 21 bits wide, the CPU address bus of the 65c02 and the FNX6809 is only 16 bits wide. Even though the 65816 does have a 24 bit wide address bus, it is currently not used. However, this might change with a future update.
To allow the addressing of the whole address space, 4 Memory Management Units (MMU) are provided, that translate the CPU logical address space to physical addresses.
To achieve this, each MMU has 8 <em>slots</em>, each representing an 8 KB block of the CPU addressable memory space.
The physical address space is also divided into 8 KB blocks, dividing the available 2 MB into 256 blocks.
To <em>map</em> a block of physical addresses into CPU address space, the block number is written into the according slot register of the MMU.
{| class="wikitable"
!Slot!!CPU Address Space!!Slot Register Address
|-
|0||$0000 - $1FFF|| $0008
|-
|1||$2000 - $3FFF|| $0009
|-
|2||$4000 - $5FFF|| $000A
|-
|3||$6000 - $7FFF|| $000B
|-
|4||$8000 - $9FFF|| $000C
|-
|5||$A000 - $BFFF|| $000D
|-
|6||$C000 - $DFFF|| $000E
|-
|7||$E000 - $FFFF|| $000F
|}
Only one MMU is active at any one time. To select the active MMU, the lower two bits of address $0000 (MMU_MEM_CTRL) are used.
Editing of MMUs is also controlled by MMU_MEM_CTRL ($0000): Bits 4 and 5 determine which set of MMU registers is to be edited, while bit 7 has to be set to 1 to enable editing.
When editing is enable, the block number of a physical memory area can be written to the slot register address to map that area to the address in CPU address space. If editing is not enabled (bit 7 of $0000 is 0), the slot register addresses act as ordinary memory with no side effect.
=== Memory Block Tables ===
The following table shows which block number has to be written into a slot register to make the each 8 KB block of memory available to the CPU.
{| class="wikitable" style="border: none; background: none;"
! colspan=2 scope=col| RAM
| rowspan=66 style="border: none; background: none;" |
! colspan=2 scope=col| Flash
| rowspan=66 style="border: none; background: none;" |
! colspan=2 scope=col| Expansion
|-
! scope=col | Block Number
! scope=col | Physical Address
! scope=col | Block Number
! scope=col | Physical Address
! scope=col | Block Number
! scope=col | Physical Address
|-
|$00||$00:0000 - $00:1FFF||$40||$08:0000 - $08:1FFF||$80||$10:0000 - $10:1FFF
|-
|$01||$00:2000 - $00:3FFF||$41||$08:2000 - $08:3FFF||$81||$10:2000 - $10:3FFF
|-
|$02||$00:4000 - $00:5FFF||$42||$08:4000 - $08:5FFF||$82||$10:4000 - $10:5FFF
|-
|$03||$00:6000 - $00:7FFF||$43||$08:6000 - $08:7FFF||$83||$10:6000 - $10:7FFF
|-
|$04||$00:8000 - $00:9FFF||$44||$08:8000 - $08:9FFF||$84||$10:8000 - $10:9FFF
|-
|$05||$00:A000 - $00:BFFF||$45||$08:A000 - $08:BFFF||$85||$10:A000 - $10:BFFF
|-
|$06||$00:C000 - $00:DFFF||$46||$08:C000 - $08:DFFF||$86||$10:C000 - $10:DFFF
|-
|$07||$00:E000 - $00:FFFF||$47||$08:E000 - $08:FFFF||$87||$10:E000 - $10:FFFF
|-
|$08||$01:0000 - $01:1FFF||$48||$09:0000 - $09:1FFF||$88||$11:0000 - $11:1FFF
|-
|$09||$01:2000 - $01:3FFF||$49||$09:2000 - $09:3FFF||$89||$11:2000 - $11:3FFF
|-
|$0A||$01:4000 - $01:5FFF||$4A||$09:4000 - $09:5FFF||$8A||$11:4000 - $11:5FFF
|-
|$0B||$01:6000 - $01:7FFF||$4B||$09:6000 - $09:7FFF||$8B||$11:6000 - $11:7FFF
|-
|$0C||$01:8000 - $01:9FFF||$4C||$09:8000 - $09:9FFF||$8C||$11:8000 - $11:9FFF
|-
|$0D||$01:A000 - $01:BFFF||$4D||$09:A000 - $09:BFFF||$8D||$11:A000 - $11:BFFF
|-
|$0E||$01:C000 - $01:DFFF||$4E||$09:C000 - $09:DFFF||$8E||$11:C000 - $11:DFFF
|-
|$0F||$01:E000 - $01:FFFF||$4F||$09:E000 - $09:FFFF||$8F||$11:E000 - $11:FFFF
|-
|$10||$02:0000 - $02:1FFF||$50||$0A:0000 - $0A:1FFF||$90||$12:0000 - $12:1FFF
|-
|$11||$02:2000 - $02:3FFF||$51||$0A:2000 - $0A:3FFF||$91||$12:2000 - $12:3FFF
|-
|$12||$02:4000 - $02:5FFF||$52||$0A:4000 - $0A:5FFF||$92||$12:4000 - $12:5FFF
|-
|$13||$02:6000 - $02:7FFF||$53||$0A:6000 - $0A:7FFF||$93||$12:6000 - $12:7FFF
|-
|$14||$02:8000 - $02:9FFF||$54||$0A:8000 - $0A:9FFF||$94||$12:8000 - $12:9FFF
|-
|$15||$02:A000 - $02:BFFF||$55||$0A:A000 - $0A:BFFF||$95||$12:A000 - $12:BFFF
|-
|$16||$02:C000 - $02:DFFF||$56||$0A:C000 - $0A:DFFF||$96||$12:C000 - $12:DFFF
|-
|$17||$02:E000 - $02:FFFF||$57||$0A:E000 - $0A:FFFF||$97||$12:E000 - $12:FFFF
|-
|$18||$03:0000 - $03:1FFF||$58||$0B:0000 - $0B:1FFF||$98||$13:0000 - $13:1FFF
|-
|$19||$03:2000 - $03:3FFF||$59||$0B:2000 - $0B:3FFF||$99||$13:2000 - $13:3FFF
|-
|$1A||$03:4000 - $03:5FFF||$5A||$0B:4000 - $0B:5FFF||$9A||$13:4000 - $13:5FFF
|-
|$1B||$03:6000 - $03:7FFF||$5B||$0B:6000 - $0B:7FFF||$9B||$13:6000 - $13:7FFF
|-
|$1C||$03:8000 - $03:9FFF||$5C||$0B:8000 - $0B:9FFF||$9C||$13:8000 - $13:9FFF
|-
|$1D||$03:A000 - $03:BFFF||$5D||$0B:A000 - $0B:BFFF||$9D||$13:A000 - $13:BFFF
|-
|$1E||$03:C000 - $03:DFFF||$5E||$0B:C000 - $0B:DFFF||$9E||$13:C000 - $13:DFFF
|-
|$1F||$03:E000 - $03:FFFF||$5F||$0B:E000 - $0B:FFFF||$9F||$13:E000 - $13:FFFF
|-
|$20||$04:0000 - $04:1FFF||$60||$0C:0000 - $0C:1FFF
|-
|$21||$04:2000 - $04:3FFF||$61||$0C:2000 - $0C:3FFF
|-
|$22||$04:4000 - $04:5FFF||$62||$0C:4000 - $0C:5FFF
|-
|$23||$04:6000 - $04:7FFF||$63||$0C:6000 - $0C:7FFF
|-
|$24||$04:8000 - $04:9FFF||$64||$0C:8000 - $0C:9FFF
|-
|$25||$04:A000 - $04:BFFF||$65||$0C:A000 - $0C:BFFF
|-
|$26||$04:C000 - $04:DFFF||$66||$0C:C000 - $0C:DFFF
|-
|$27||$04:E000 - $04:FFFF||$67||$0C:E000 - $0C:FFFF
|-
|$28||$05:0000 - $05:1FFF||$68||$0D:0000 - $0D:1FFF
|-
|$29||$05:2000 - $05:3FFF||$69||$0D:2000 - $0D:3FFF
|-
|$2A||$05:4000 - $05:5FFF||$6A||$0D:4000 - $0D:5FFF
|-
|$2B||$05:6000 - $05:7FFF||$6B||$0D:6000 - $0D:7FFF
|-
|$2C||$05:8000 - $05:9FFF||$6C||$0D:8000 - $0D:9FFF
|-
|$2D||$05:A000 - $05:BFFF||$6D||$0D:A000 - $0D:BFFF
|-
|$2E||$05:C000 - $05:DFFF||$6E||$0D:C000 - $0D:DFFF
|-
|$2F||$05:E000 - $05:FFFF||$6F||$0D:E000 - $0D:FFFF
|-
|$30||$06:0000 - $06:1FFF||$70||$0E:0000 - $0E:1FFF
|-
|$31||$06:2000 - $06:3FFF||$71||$0E:2000 - $0E:3FFF
|-
|$32||$06:4000 - $06:5FFF||$72||$0E:4000 - $0E:5FFF
|-
|$33||$06:6000 - $06:7FFF||$73||$0E:6000 - $0E:7FFF
|-
|$34||$06:8000 - $06:9FFF||$74||$0E:8000 - $0E:9FFF
|-
|$35||$06:A000 - $06:BFFF||$75||$0E:A000 - $0E:BFFF
|-
|$36||$06:C000 - $06:DFFF||$76||$0E:C000 - $0E:DFFF
|-
|$37||$06:E000 - $06:FFFF||$77||$0E:E000 - $0E:FFFF
|-
|$38||$07:0000 - $07:1FFF||$78||$0F:0000 - $0F:1FFF
|-
|$39||$07:2000 - $07:3FFF||$79||$0F:2000 - $0F:3FFF
|-
|$3A||$07:4000 - $07:5FFF||$7A||$0F:4000 - $0F:5FFF
|-
|$3B||$07:6000 - $07:7FFF||$7B||$0F:6000 - $0F:7FFF
|-
|$3C||$07:8000 - $07:9FFF||$7C||$0F:8000 - $0F:9FFF
|-
|$3D||$07:A000 - $07:BFFF||$7D||$0F:A000 - $0F:BFFF
|-
|$3E||$07:C000 - $07:DFFF||$7E||$0F:C000 - $0F:DFFF
|-
|$3F||$07:E000 - $07:FFFF||$7F||$0F:E000 - $0F:FFFF
|}
|}

Latest revision as of 01:48, 11 February 2024

The F256 line comes with 512 KB of RAM and 512 KB of flash memory. Up to 256 KB additional Memory, either RAM or Flash, can be added through the Expansion Port.

Physical Memory Layout[edit | edit source]

The address bus is 21 bits wide, allowing a total of 221 = 2 MB to be addressed.

Address Purpose
$00:0000 - $07:FFFF RAM
$08:0000 - $0F:FFFF Flash
$10:0000 - $13:FFFF Expansion Memory
$14:0000 - $1F:FFFF Reserved

Memory Management Unit (MMU)[edit | edit source]

While the address bus is generally 21 bits wide, the CPU address bus of the 65c02 and the FNX6809 is only 16 bits wide. Even though the 65816 does have a 24 bit wide address bus, it is currently not used. However, this might change with a future update.

To allow the addressing of the whole address space, 4 Memory Management Units (MMU) are provided, that translate the CPU logical address space to physical addresses.

To achieve this, each MMU has 8 slots, each representing an 8 KB block of the CPU addressable memory space.

The physical address space is also divided into 8 KB blocks, dividing the available 2 MB into 256 blocks.

To map a block of physical addresses into CPU address space, the block number is written into the according slot register of the MMU.

Slot CPU Address Space Slot Register Address
0 $0000 - $1FFF $0008
1 $2000 - $3FFF $0009
2 $4000 - $5FFF $000A
3 $6000 - $7FFF $000B
4 $8000 - $9FFF $000C
5 $A000 - $BFFF $000D
6 $C000 - $DFFF $000E
7 $E000 - $FFFF $000F

Only one MMU is active at any one time. To select the active MMU, the lower two bits of address $0000 (MMU_MEM_CTRL) are used.

Editing of MMUs is also controlled by MMU_MEM_CTRL ($0000): Bits 4 and 5 determine which set of MMU registers is to be edited, while bit 7 has to be set to 1 to enable editing. When editing is enable, the block number of a physical memory area can be written to the slot register address to map that area to the address in CPU address space. If editing is not enabled (bit 7 of $0000 is 0), the slot register addresses act as ordinary memory with no side effect.

Memory Block Tables[edit | edit source]

The following table shows which block number has to be written into a slot register to make the each 8 KB block of memory available to the CPU.

RAM Flash Expansion
Block Number Physical Address Block Number Physical Address Block Number Physical Address
$00 $00:0000 - $00:1FFF $40 $08:0000 - $08:1FFF $80 $10:0000 - $10:1FFF
$01 $00:2000 - $00:3FFF $41 $08:2000 - $08:3FFF $81 $10:2000 - $10:3FFF
$02 $00:4000 - $00:5FFF $42 $08:4000 - $08:5FFF $82 $10:4000 - $10:5FFF
$03 $00:6000 - $00:7FFF $43 $08:6000 - $08:7FFF $83 $10:6000 - $10:7FFF
$04 $00:8000 - $00:9FFF $44 $08:8000 - $08:9FFF $84 $10:8000 - $10:9FFF
$05 $00:A000 - $00:BFFF $45 $08:A000 - $08:BFFF $85 $10:A000 - $10:BFFF
$06 $00:C000 - $00:DFFF $46 $08:C000 - $08:DFFF $86 $10:C000 - $10:DFFF
$07 $00:E000 - $00:FFFF $47 $08:E000 - $08:FFFF $87 $10:E000 - $10:FFFF
$08 $01:0000 - $01:1FFF $48 $09:0000 - $09:1FFF $88 $11:0000 - $11:1FFF
$09 $01:2000 - $01:3FFF $49 $09:2000 - $09:3FFF $89 $11:2000 - $11:3FFF
$0A $01:4000 - $01:5FFF $4A $09:4000 - $09:5FFF $8A $11:4000 - $11:5FFF
$0B $01:6000 - $01:7FFF $4B $09:6000 - $09:7FFF $8B $11:6000 - $11:7FFF
$0C $01:8000 - $01:9FFF $4C $09:8000 - $09:9FFF $8C $11:8000 - $11:9FFF
$0D $01:A000 - $01:BFFF $4D $09:A000 - $09:BFFF $8D $11:A000 - $11:BFFF
$0E $01:C000 - $01:DFFF $4E $09:C000 - $09:DFFF $8E $11:C000 - $11:DFFF
$0F $01:E000 - $01:FFFF $4F $09:E000 - $09:FFFF $8F $11:E000 - $11:FFFF
$10 $02:0000 - $02:1FFF $50 $0A:0000 - $0A:1FFF $90 $12:0000 - $12:1FFF
$11 $02:2000 - $02:3FFF $51 $0A:2000 - $0A:3FFF $91 $12:2000 - $12:3FFF
$12 $02:4000 - $02:5FFF $52 $0A:4000 - $0A:5FFF $92 $12:4000 - $12:5FFF
$13 $02:6000 - $02:7FFF $53 $0A:6000 - $0A:7FFF $93 $12:6000 - $12:7FFF
$14 $02:8000 - $02:9FFF $54 $0A:8000 - $0A:9FFF $94 $12:8000 - $12:9FFF
$15 $02:A000 - $02:BFFF $55 $0A:A000 - $0A:BFFF $95 $12:A000 - $12:BFFF
$16 $02:C000 - $02:DFFF $56 $0A:C000 - $0A:DFFF $96 $12:C000 - $12:DFFF
$17 $02:E000 - $02:FFFF $57 $0A:E000 - $0A:FFFF $97 $12:E000 - $12:FFFF
$18 $03:0000 - $03:1FFF $58 $0B:0000 - $0B:1FFF $98 $13:0000 - $13:1FFF
$19 $03:2000 - $03:3FFF $59 $0B:2000 - $0B:3FFF $99 $13:2000 - $13:3FFF
$1A $03:4000 - $03:5FFF $5A $0B:4000 - $0B:5FFF $9A $13:4000 - $13:5FFF
$1B $03:6000 - $03:7FFF $5B $0B:6000 - $0B:7FFF $9B $13:6000 - $13:7FFF
$1C $03:8000 - $03:9FFF $5C $0B:8000 - $0B:9FFF $9C $13:8000 - $13:9FFF
$1D $03:A000 - $03:BFFF $5D $0B:A000 - $0B:BFFF $9D $13:A000 - $13:BFFF
$1E $03:C000 - $03:DFFF $5E $0B:C000 - $0B:DFFF $9E $13:C000 - $13:DFFF
$1F $03:E000 - $03:FFFF $5F $0B:E000 - $0B:FFFF $9F $13:E000 - $13:FFFF
$20 $04:0000 - $04:1FFF $60 $0C:0000 - $0C:1FFF
$21 $04:2000 - $04:3FFF $61 $0C:2000 - $0C:3FFF
$22 $04:4000 - $04:5FFF $62 $0C:4000 - $0C:5FFF
$23 $04:6000 - $04:7FFF $63 $0C:6000 - $0C:7FFF
$24 $04:8000 - $04:9FFF $64 $0C:8000 - $0C:9FFF
$25 $04:A000 - $04:BFFF $65 $0C:A000 - $0C:BFFF
$26 $04:C000 - $04:DFFF $66 $0C:C000 - $0C:DFFF
$27 $04:E000 - $04:FFFF $67 $0C:E000 - $0C:FFFF
$28 $05:0000 - $05:1FFF $68 $0D:0000 - $0D:1FFF
$29 $05:2000 - $05:3FFF $69 $0D:2000 - $0D:3FFF
$2A $05:4000 - $05:5FFF $6A $0D:4000 - $0D:5FFF
$2B $05:6000 - $05:7FFF $6B $0D:6000 - $0D:7FFF
$2C $05:8000 - $05:9FFF $6C $0D:8000 - $0D:9FFF
$2D $05:A000 - $05:BFFF $6D $0D:A000 - $0D:BFFF
$2E $05:C000 - $05:DFFF $6E $0D:C000 - $0D:DFFF
$2F $05:E000 - $05:FFFF $6F $0D:E000 - $0D:FFFF
$30 $06:0000 - $06:1FFF $70 $0E:0000 - $0E:1FFF
$31 $06:2000 - $06:3FFF $71 $0E:2000 - $0E:3FFF
$32 $06:4000 - $06:5FFF $72 $0E:4000 - $0E:5FFF
$33 $06:6000 - $06:7FFF $73 $0E:6000 - $0E:7FFF
$34 $06:8000 - $06:9FFF $74 $0E:8000 - $0E:9FFF
$35 $06:A000 - $06:BFFF $75 $0E:A000 - $0E:BFFF
$36 $06:C000 - $06:DFFF $76 $0E:C000 - $0E:DFFF
$37 $06:E000 - $06:FFFF $77 $0E:E000 - $0E:FFFF
$38 $07:0000 - $07:1FFF $78 $0F:0000 - $0F:1FFF
$39 $07:2000 - $07:3FFF $79 $0F:2000 - $0F:3FFF
$3A $07:4000 - $07:5FFF $7A $0F:4000 - $0F:5FFF
$3B $07:6000 - $07:7FFF $7B $0F:6000 - $0F:7FFF
$3C $07:8000 - $07:9FFF $7C $0F:8000 - $0F:9FFF
$3D $07:A000 - $07:BFFF $7D $0F:A000 - $0F:BFFF
$3E $07:C000 - $07:DFFF $7E $0F:C000 - $0F:DFFF
$3F $07:E000 - $07:FFFF $7F $0F:E000 - $0F:FFFF