The screen is two banks: an atlas and a screen
Tiles and colours are written when a program loads; the map is written whenever anything moves. Sharing one 64K bank made them compete for room neither needed all of, and had a worse consequence than being cramped: a bitmap covers the whole bank, so entering bitmap mode destroyed the font. A program could not draw a picture and then say anything about it. Split, each gets a whole bank. The atlas holds the tiles and the palette, the screen holds the map or a bitmap, and a picture now costs the map and nothing else. It also leaves 48K free in the atlas, which is where the sprite table and a second page of tiles are going. No new mechanism was needed. A bank is registered by naming the port that owns it, so a device with two banks needs two ports that own memory: the base port keeps the atlas, since tiles have been at 0x0000 since there was a screen at all, and 0x3A owns the screen. The registry now answers honestly about which ports in the block bring memory, where it used to say all sixteen did. CosmOS never addresses video memory except in one place - the screen save, which walks 196 pages of it. The page number already says which bank a page is in, so screenBankFor works it out rather than keeping a second list beside screenPageFor. Grid and picture.asm register both banks; colours.asm only touches the palette and needed none of it. Tests/video.sh names the memory every write is for, because an address cannot: tile 5 and bitmap pixel 5 are both 0x0005, and a helper that guessed would be right for the tiles and silently wrong for a picture. And picture.asm gained a check, because this change broke it and nothing noticed - registering the second bank leaves DestBank pointing at it, so the palette went into the wrong one and the picture came out black. It was the only thing here found by looking rather than by a test. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E2JrLzFvuFX9fgi1LDRjrW
This commit is contained in:
co-authored by
Claude Opus 5
parent
2abc8281df
commit
66e7b84272
@@ -80,8 +80,10 @@ nextBank:
|
||||
; three bytes into the palette - which means reaching video memory, which means the
|
||||
; controller.
|
||||
|
||||
; Give the screen's memory a bank number. The screen answers on port 0x30, and bank 3 is
|
||||
; the first number software is allowed to hand out: 0, 1 and 2 belong to the machine.
|
||||
; Give the screen's memory a bank number. The screen brings TWO banks and this only wants
|
||||
; one of them: port 0x30 owns the atlas, where the tiles and the palette are, and the
|
||||
; palette is all this touches. Bank 3 is the first number software is allowed to hand out:
|
||||
; 0, 1 and 2 belong to the machine.
|
||||
INIA 0d3
|
||||
OUTA 0xE3 ; DestBank: the number being given
|
||||
INIA 0x30
|
||||
@@ -89,7 +91,7 @@ nextBank:
|
||||
INIA 0x03
|
||||
OUTA 0xE8 ; Command: RegisterBank
|
||||
|
||||
; The palette sits at the top of video memory, at 0xFC00, and entry n is at n times
|
||||
; The palette sits at the top of the atlas, at 0xFC00, and entry n is at n times
|
||||
; four. Bank 2's ink is entry 2 * 16 + 1, which is 33, and 33 * 4 is 132 - so 0xFC84.
|
||||
INIA 0xFC
|
||||
OUTA 0xE4 ; DestHigh
|
||||
|
||||
Reference in New Issue
Block a user