Protocol - TheOnlyJoey/openjvs GitHub Wiki

This page describes the JVS I/O protocol, which is meant for connecting peripherals to an arcade cabinet's main logic board. The information in this document is based on machine translations of the Jamma Video Standard, third edition (in Japanese, available here) and measurements / dumps taken from a SEGA Naomi Universal arcade machine.

Physical/electrical layers

The physical and electrical layers of the protocol consists of RS-485 and a special 'sense' line wired over regular USB-A and USB-B connectors. Messages are sent one byte at a time at 115200 baud, as one start bit (space), 8 data bits and finally a stop bit (mark). The default level of the line is 'mark'.

The sense line is used when sending out addresses to devices on the bus. This page describes the JVS I/O protocol. The information in this description comes from the original JVS spec (in Japanese; accessible here) and from captures done on a SEGA Naomi Universal arcade cabinet.

Pinout

USB A / B pinouts

  1. Sense
  2. Data -
  3. Data +
  4. Ground

Packets

A 'packet' consists of the following:

sync addr length data 1 data 2 ... data N SUM
  • 'sync' is always equal to 0xE0, just a method to separate valid packets from noise
  • 'addr' is the destination address of the packet. The bus master always has address 0, other devices on the bus acquire an address by the [address setting procedure](Address setting procedure).
  • 'length' is the length of the rest of the packet in bytes: that is, the number of data bytes plus one (the 'sum' byte).
  • 'data' are the data bytes. They tend to adhere to the command spec but this is not a requirement.

Escaping

As the 'sync' word denotes the start of a valid packet, it cannot occur in the middle of a packet. Because of this any E0 byte is escaped in the packet as the two-byte sequence D0 DF. D0 bytes are escaped as D0 CF.

Commands

Packets from the master are formatted as 'commands'. A command starts with a command code, followed by command-specific arguments. Multiple commands can be concatenated in a single packet.

A list of all possible command codes can be found at ['Command list'](Command list).

Replies

Most commands precipitate a reply from the addressed device. The exact format of the reply is specific to the command sent, but a number of status codes are common over all reply formats. At the start of the packet, a 'status' byte indicates the status of the device in general. In addition, each command reply is prefixed with a 'report' byte that indicates the result of the command. The codes used and their meanings are shown below.

The 'status' byte
code description
01 success
02 unknown or unsupported command
03 checksum failure
04 overflow
The 'report' byte
code description
01 success
02 These have to do with parameter errors
03
04 device busy
⚠️ **GitHub.com Fallback** ⚠️