Difference between revisions of "V9990"

From CPCWiki - THE Amstrad CPC encyclopedia!
Jump to: navigation, search
Line 23: Line 23:
 
  OUT (C),A  
 
  OUT (C),A  
  
* Bits 1,0 of R14 define a ternary counter. If you set this to 3 then reads and writes are ignored.  
+
* 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.
 
e.g.
  
e.g.
 
 
  LD BC,&FF64
 
  LD BC,&FF64
 
  LD A,14
 
  LD A,14

Revision as of 10:09, 6 October 2018

  • 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