- In the following "databus" means that the v9990 doesn't assert the bus, it doesn't provide data, so the value read is "floating-bus" or the value on the z80 databus at the time. More commonly on CPC it's &ff, but there are some configurations of CPC where this differs.
- Reading from the Kanji ROM ports without a Kanji ROM returns databus values
- Reading from the write only ports (or unused ports) 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. If auto increment is enabled, it will increment as normal. palette index will increment and ternary counter will go to 0.
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