12: I/O Programming
There are two 65C22 "Versatile Interface Adapter" (VIA) I/O controllers in the system, VIA#1 at address $9F00 and VIA#2 at address $9F10. The IRQ out lines of VIA#1 is connected to the CPU's NMI line, while the IRQ out line of VIA#2 is connected to the CPU's IRQ line.
The-following tables describe the connections of the I/O pins:
VIA#1
Pin | Name | Description |
---|---|---|
PA0 | I2CDATA | I2C Data |
PA1 | I2CCLK | I2C Clock |
PA2 | NESLATCH | NES LATCH (for all controllers) |
PA3 | NESCLK | NES CLK (for all controllers) |
PA4 | NESDAT3 | NES DATA (controller 3) |
PA5 | NESDAT2 | NES DATA (controller 2) |
PA6 | NESDAT1 | NES DATA (controller 1) |
PA7 | NESDAT0 | NES DATA (controller 0) |
PB0 | Unused | |
PB1 | Unused | |
PB2 | Unused | |
PB3 | SERATNO | Serial ATN out |
PB4 | SERCLKO | Serial CLK out |
PB5 | SERDATAO | Serial DATA out |
PB6 | SERCLKI | Serial CLK in |
PB7 | SERDATAI | Serial DATA in |
CA1 | Unused | |
CA2 | Unused | |
CB1 | IECSRQ | |
CB2 | Unused |
The KERNAL uses Timer 2 for timing transmissions on the Serial Bus.
VIA#2
The second VIA is completely unused by the system. All its 16 GPIOs and 4 handshake I/Os can be freely used.
I2C Bus
The Commander X16 contains an I2C bus, which is implemented through two pins of VIA#1. The system management controller (SMC) and the real-time clock (RTC) are connected through this bus. The KERNAL APIs i2c_read_byte
and i2c_write_byte
allow talking to these devices.
System Management Controller
The system management controller (SMC) is device $42 on the I2C bus. It controls the activity LED, and can be used to power down the system or inject RESET and NMI signals. It also handles communication with the PS/2 keyboard and mouse.
Register | Value | Description |
---|---|---|
$01 | $00 | Power off |
$01 | $01 | Hard reboot |
$02 | $00 | Inject RESET |
$03 | $00 | Inject NMI |
$05 | $00/$FF | Activity LED off/on |
$07 | - | Read from keyboard buffer |
$08 | $00..$FF | Echo |
$18 | - | Read ps2 status |
$19 | $00..$FF | Send ps2 command |
$1A | $0000..$FFFF | Send ps2 command (2 bytes) |
$20 | $00 | Set mouse device ID, standard mouse |
$20 | $03 | Set mouse device ID, Intellimouse with scroll wheel |
$20 | $04 | Set mouse device ID, Intellimouse with scroll wheel+extra buttons |
$21 | - | Read from mouse buffer |
$22 | - | Get mouse device ID |
$30 | - | Get SMC firmware version, major |
$31 | - | Get SMC firmware version, minor |
$32 | - | Get SMC firmare version, patch |
$8F | $31 | Start bootloader, if present |
Real-Time-Clock
The Commander X16 contains a battery-backed Microchip MCP7940N real-time-clock (RTC) chip as device $6F. It provide a real-time clock/calendar, two alarms and 64 bytes of RAM.
Register | Description |
---|---|
$00 | Clock seconds |
$01 | Clock minutes |
$02 | Clock hours |
$03 | Clock weekday |
$04 | Clock day |
$05 | Clock month |
$06 | Clock year |
$07 | Control |
$08 | Oscillator trim |
$09 | reserved |
$0A | Alarm 0 seconds |
$0B | Alarm 0 minutes |
$0C | Alarm 0 hours |
$0D | Alarm 0 weekday |
$0E | Alarm 0 day |
$0F | Alarm 0 month |
$10 | reserved |
$11 | Alarm 1 seconds |
$12 | Alarm 1 minutes |
$13 | Alarm 1 hours |
$14 | Alarm 1 weekday |
$15 | Alarm 1 day |
$16 | Alarm 1 month |
$17 | reserved |
$18 | Power-fail minutes |
$19 | Power-fail hours |
$1A | Power-fail day |
$1B | Power-fail month |
$1C | Power-up minutes |
$1D | Power-up hours |
$1E | Power-up day |
$1F | Power-up month |
$20-$5F | 64 Bytes SRAM |
The second half of the RTC's SRAM (NVRAM) is reserved for use by the KERNAL. $20-$3F is available for use by user programs.
For more information, please refer to this device's datasheet.