Difference between revisions of "V9990"
From CPCWiki - THE Amstrad CPC encyclopedia!
Line 1: | Line 1: | ||
* Reading from the Kanji ROM ports without a Kanji ROM returns databus values | * Reading from the Kanji ROM ports without a Kanji ROM returns databus values | ||
− | * Palette | + | |
+ | * Palette red data has a mask of &9F (bits red and color key bit), blue and green have a mask of 0x01f. | ||
+ | |||
+ | e.g. | ||
+ | LD BC,&FF64 | ||
+ | LD A,14 | ||
+ | OUT (C),C | ||
+ | LD BC,&FF63 | ||
+ | LD A,0 | ||
+ | OUT (C),A | ||
+ | |||
+ | LD BC,&FF61 | ||
+ | LD A,&FF ;; <- reading this component back returns &9F | ||
+ | OUT (C),A | ||
+ | LD A,&FF ;; <- reading this component back returns &1F | ||
+ | OUT (C),A | ||
+ | LD A,&FF ;; <- reading this component back returns &1F | ||
+ | OUT (C),A | ||
+ | |||
+ | * Bits 1,0 of R14 define a ternary counter. If you set this to 3 then reads and writes are ignored. | ||
+ | e.g. | ||
+ | |||
+ | e.g. | ||
+ | LD BC,&FF64 | ||
+ | LD A,14 | ||
+ | OUT (C),C | ||
+ | LD BC,&FF63 | ||
+ | LD A,3 | ||
+ | OUT (C),A | ||
+ | |||
+ | LD BC,&FF61 | ||
+ | LD A,&FF | ||
+ | OUT (C),A ;; write is not done. | ||
+ | |||
+ | LD BC,&FF64 | ||
+ | LD A,14 | ||
+ | OUT (C),C | ||
+ | LD BC,&FF63 | ||
+ | LD A,3 | ||
+ | OUT (C),A | ||
+ | |||
+ | LD BC,&FF61 | ||
+ | IN A,(C) ;; read returns last value written to port | ||
+ | |||
+ | When the ternary counter is 2, and auto-increment is enabled, the ternary counter will wrap to 0 and the palette index will increment. | ||
+ | |||
+ | e.g. | ||
+ | LD BC,&FF64 | ||
+ | LD A,14 | ||
+ | OUT (C),C | ||
+ | LD BC,&FF63 | ||
+ | LD A,2 | ||
+ | OUT (C),A | ||
+ | |||
+ | LD BC,&FF61 | ||
+ | LD A,&FF | ||
+ | OUT (C),A | ||
+ | |||
+ | ;; palette index will be 1, and ternary counter is 0. | ||
+ | |||
* If a command transfers data, and it requests data to be written to the command data port, then you can't use a read of this port to clear the data request. It must be a write. Similarly, if a command requests data to be read then you can use a write to clear the data request. | * If a command transfers data, and it requests data to be written to the command data port, then you can't use a read of this port to clear the data request. It must be a write. Similarly, if a command requests data to be read then you can use a write to clear the data request. | ||
* If you read from a write-only register you will see data-bus value because the V9990 doesn't assert data on the bus. | * If you read from a write-only register you will see data-bus value because the V9990 doesn't assert data on the bus. |
Revision as of 09:44, 6 October 2018
- Reading from the Kanji ROM ports without a Kanji ROM returns databus values
- Palette red data has a mask of &9F (bits red and color key bit), blue and green have a mask of 0x01f.
e.g.
LD BC,&FF64 LD A,14 OUT (C),C LD BC,&FF63 LD A,0 OUT (C),A LD BC,&FF61 LD A,&FF ;; <- reading this component back returns &9F OUT (C),A LD A,&FF ;; <- reading this component back returns &1F OUT (C),A LD A,&FF ;; <- reading this component back returns &1F OUT (C),A
- Bits 1,0 of R14 define a ternary counter. If you set this to 3 then reads and writes are ignored.
e.g.
e.g.
LD BC,&FF64 LD A,14 OUT (C),C LD BC,&FF63 LD A,3 OUT (C),A LD BC,&FF61 LD A,&FF OUT (C),A ;; write is not done.
LD BC,&FF64 LD A,14 OUT (C),C LD BC,&FF63 LD A,3 OUT (C),A LD BC,&FF61 IN A,(C) ;; read returns last value written to port
When the ternary counter is 2, and auto-increment is enabled, the ternary counter will wrap to 0 and the palette index will increment.
e.g.
LD BC,&FF64 LD A,14 OUT (C),C LD BC,&FF63 LD A,2 OUT (C),A LD BC,&FF61 LD A,&FF OUT (C),A
- palette index will be 1, and ternary counter is 0.
- If a command transfers data, and it requests data to be written to the command data port, then you can't use a read of this port to clear the data request. It must be a write. Similarly, if a command requests data to be read then you can use a write to clear the data request.
- If you read from a write-only register you will see data-bus value because the V9990 doesn't assert data on the bus.
- Some registers have additional bits which are not documented. The mask describes which bits are read/write and which are unchanged.
Where the mask has a '1' bit, this bit is read/write. Where the mask has a '0' bit this bit remains at 0 and can't be changed.
- Register 7 (SCREEN MODE): Mask is &FF. - Register 9 (INTERRUPT READ/WRITE): Mask is &87 - Register 15 (BACK DROP COLOR): Mask is &FF - Register 22 (SCROLL CONTROL): Mask is &C1 - Register 25 (SPRITE PATTERN GENERATOR TABLE BASE ADDRESS): Mask is &CF - Register 26 (LCD CONTROL): Mask is &FF - Register 27 (PRIORITY CONTROL): Mask is &FF