# General Purpose Interface Adapter (GPIA)

## Register Map

|Byte Offset|Name|R/W|Purpose|
|:---------:|:--:|:-:|:------|
|0|GPIP|R|16-bit input port|
|2|GPOP|RW|16-bit output port|

**NOTE.**  You **must** write to GPOP using 16-bit writes.  If you use 8-bit writes, the intended byte will be set correctly; however the other half of the halfword will be changed to an unpredictable value.  It should be safe to read from the GPIA using byte reads, however.

## Input Port Map

|Bit|Name|Purpose|
|:-:|:--:|:------|
|`15`|`VSYNC`|Current state of the vertical sync pulse to the monitor.  Active low.|
|`14`|`HSYNC`|Current state of the horizontal sync pulse to the monitor.  Active low.|
|`13-3`||*unassigned*|
|`2`|`SPI_MISO`|SPI receive data.  Active high.|
|`1`|`SD_WP`|SD Card Write Protected.  Active low.  (I think.)|
|`0`|`SD_CD`|SD Card Detected.  Active low.|

## Output Port Map

|Bit|Name|Purpose|
|:-:|:--:|:------|
|`15-14`|`MGIAPG`|Selects one of three 16KB pages from IPL RAM from which the MGIA fetches video data.|
|`13`| |*unassigned*|
|`12-9`|`LEDANO`|LED anode selects.  Bit 12 is the left-most LED; bit 9 is the right-most.  Active high.|
|`8-1`|`LEDCTH`|LED cathodes.  Bit 8 is the **A** segment, bit 1 is the **DP** segment.  Active high.|
|`0`| |*unassigned*|

The following bits serve double-duty:

|Bit|Name|Purpose|
|:-:|:--:|:------|
|`12`|`SPI_LED_3`|LED enable for SPI unit 3.  Active high.|
|`11`|`SPI_LED_2`|LED enable for SPI unit 2.  Active high.|
|`10`|`SPI_LED_1`|LED enable for SPI unit 1.  Active high.|
|`9`|`SPI_LED_0`|LED enable for SPI unit 0.  Active high.|
|`3`|`SPI_CLK`|Clock to the SPI slave.  Active high.|
|`2`|`SPI_MOSI`|Data output to SPI slave.  Active high.|
|`1`|`SPI_SS`|SPI slave select output, unit 0.  Active low.|

Note that up to 4 attach SPI devices can be addressed by this GPIA core.
Bootstrap software identifies them as units 0 through 3.
Currently, only unit 0 is supported.
Units 1..3 will illuminate different activity LEDs, but
the SPI traffic will continue to route to unit 0.
This will change eventually, so don't depend on this behavior.

### MGIAPG

|Value|Video Memory Range|
|:---:|:----------------:|
|`00`|`$10000-$13FFF`|
|`01`|`$14000-$17FFF`|
|`10`|`$18000-$1BFFF`|
|`11`|`$1C000-$1FFFF` (not implemented in Nexys-2 design)|