This project's main goal was to have my diskless MSX2 (Yamaha YIS-503/IIIR) hooked to a PC that would emulate (well, actually simulate) another MSX2 machine, and with quite a bit of reverse engineering, programming, hacking and soldering to be able to download games using YIS-503/IIIR's built-in networking capabilities.
This simple circut allows any MSX equipped with Network Module to be connected to any RS-232 port. Full opto-coupling (both TX and RX), no additional power supply (necessary voltages taken from MSX and RS-232). Schematics (JPG, 68K) PCB design (PostScript, 51K) Components layout (PostScript, 83K) |
Typical packet has a header, a payload, sometimes a checksum and terminator (0x97 if there will be more packets, 83 if this is the last packet in a sequence).
F0 00 | Destination address | Packet type | Source address | Command (2 bytes - see Encoding) | Optional parameters (encoded) | Optional data byte(s) (encoded) | 16-bit checksum (encoded) | 97 (intermediate packet) 83 (last packet) |
Source and destination address can be 00 (Teacher), 01..0F (Student), and 7F (Broadcast).
Command - see Packet 0x01 description.
Maximum data bytes (without optional parameters) - 58 bytes.
Checksum is a 16-bit sum of all bytes in payload. Packets with wrong checksum are silently discarded.
Each 8-bit byte is sent as a pair of 7-bit octets, with the first octet carrying only bit 7 of original byte, and the second carries bits 6..0. This allows for sending packets across MIDI-like network (and through YM3802 chip in particular) in accordance with MIDI standards.
Example: byte 0x21 is sent as 0x00 0x21; byte 0xFF is sent as 0x01 0x7F.
There are four types of packets used in MSX network.
This is the Base type of packet. Each Base packet should be acknowledged with ACK (0x06) packet, except for specific ones (see table).
F0 | 00 | ADR2 | 01 | ADR1 | 00 | CMND | ||||||||||||||||||||||
20 NET-CLOSE-FILE | LNGTH | H | F | A | FCB (37 bytes) | CHKSUM | 83 | |||||||||||||||||||||
21 NET-SEARCH-FIRST | LNGTH | H | F | A | FCB (37 bytes) | CHKSUM | 83 | |||||||||||||||||||||
22 NET-SEARCH-NEXT | LNGTH | H | F | A | FCB (37 bytes) | CHKSUM | 83 | |||||||||||||||||||||
23 NET-DELETE-FILE | LNGTH | H | F | A | FCB (37 bytes) | CHKSUM | 83 | |||||||||||||||||||||
24 NET-READ-FILE | LNGTH | H | F | A | FCB (37 bytes) | CHKSUM | 83 | |||||||||||||||||||||
25 NET-WRITE-FILE | LNGTH | H | F | A | FCB (37 bytes) | CHKSUM | 83 | |||||||||||||||||||||
26 NET-CREATE-FILE | LNGTH | H | F | A | FCB (37 bytes) | CHKSUM | 83 | |||||||||||||||||||||
27 NET-RENAME-FILE | LNGTH | H | F | A | FCB (37 bytes) | CHKSUM | 83 | |||||||||||||||||||||
2c Master Data (first packet) | ||||||||||||||||||||||||||||
2d Master Data (subsequent packets) | ||||||||||||||||||||||||||||
2e NET-SEARCH-END | LNGTH | H | F | A | FCB (37 bytes) | CHKSUM | 83 | |||||||||||||||||||||
2f NET-OPEN-FILE | LNGTH | H | F | A | FCB (37 bytes) | CHKSUM | 83 | |||||||||||||||||||||
30 re: NET-CLOSE-FILE | ||||||||||||||||||||||||||||
31 re: NET-SEARCH-FIRST | ||||||||||||||||||||||||||||
32 re: NET-SEARCH-NEXT | ||||||||||||||||||||||||||||
33 re: NET-DELETE-FILE | ||||||||||||||||||||||||||||
34 re: NET-READ-FILE | ||||||||||||||||||||||||||||
35 re: NET-WRITE-FILE | ||||||||||||||||||||||||||||
36 re: NET-CREATE-FILE | ||||||||||||||||||||||||||||
37 re: NET-RENAME-FILE | ||||||||||||||||||||||||||||
3c Slave Data (first packet) | ||||||||||||||||||||||||||||
3d Slave Data (subsequent packets) | ||||||||||||||||||||||||||||
3e re: NET-SEARCH-END | ||||||||||||||||||||||||||||
3f re: NET-OPEN-FILE | ||||||||||||||||||||||||||||
40 SEND | LNGTH | byte 1 | byte 2 | bytes NN | CHKSUM | 97/83 | ||||||||||||||||||||||
41 SEND | LNGTH | byte 1 | byte 2 | bytes NN | CHKSUM | 97/83 | ||||||||||||||||||||||
42 SHEX (data packets) | ||||||||||||||||||||||||||||
43 SHEXS (data packets) | ||||||||||||||||||||||||||||
44 SEND-VRAM-DATA | ||||||||||||||||||||||||||||
45 SHEXS (file data packets) | LNGTH | byte 1 | byte 2 | bytes NN | CHKSUM | 97/83 | ||||||||||||||||||||||
46 MESS, TALK | ||||||||||||||||||||||||||||
47 | ||||||||||||||||||||||||||||
48 SNDCMD | ||||||||||||||||||||||||||||
49 SNDM (first packet) | LNGTH | byte 1 | byte 2 | bytes NN | CHKSUM | 97/83 | ||||||||||||||||||||||
4a SNDM (subsequent packets) | LNGTH | byte 1 | byte 2 | bytes NN | CHKSUM | 97/83 | ||||||||||||||||||||||
4b re:RECV | ||||||||||||||||||||||||||||
4c re:RHEX | LNGTH | byte 1 | byte 2 | bytes NN | CHKSUM | 97/83 | ||||||||||||||||||||||
4d re:RHEXS data | ||||||||||||||||||||||||||||
4e re:RHEXS (file) | LNGTH | byte 1 | byte 2 | bytes NN | CHKSUM | 97/83 | ||||||||||||||||||||||
4f re:63 | ||||||||||||||||||||||||||||
50 | ||||||||||||||||||||||||||||
51 re:RCVM | LNGTH | byte 1 | byte 2 | bytes NN | CHKSUM | 97/83 | ||||||||||||||||||||||
52 SHEX/SHEXS | START | END | 83 | |||||||||||||||||||||||||
53 SEND-VRAM-REGISTER | START | END | V_REGDAT (40 bytes) | 83 | ||||||||||||||||||||||||
54 re:RHEXS header | START | END | V_REGDAT (40 bytes) | 83 | ||||||||||||||||||||||||
55 SHEXS (file) | START | END | 83 | |||||||||||||||||||||||||
56 re:RECEIVE-VRAM-REGISTER | START | END | V_REGDAT (40 bytes) | 83 | ||||||||||||||||||||||||
57 RHEX | START | END | 83 | Respond with 4c | ||||||||||||||||||||||||
58 RHEXS (mem) | START | END | 83 | Respond with 54, then send 4d(s) | ||||||||||||||||||||||||
59 RECEIVE-VRAM-REGISTER | START | END | 83 | Respond with 56 | ||||||||||||||||||||||||
5a RECEIVE-VRAM-DATA | START | END | 83 | Respond with 4e | ||||||||||||||||||||||||
5b RHEXS (file) | START | END | 83 | Respond with 4e | ||||||||||||||||||||||||
5c POKE | ADDR | byte 1 | 83 | |||||||||||||||||||||||||
5d POKE (NetRAM) | ADDR | byte 1 | 83 | |||||||||||||||||||||||||
5e RUN | ||||||||||||||||||||||||||||
5f PEEK | ADDR | 83 | Respond with 61 | |||||||||||||||||||||||||
60 PEEK (NetRAM) | ADDR | 83 | Respond with 61 | |||||||||||||||||||||||||
61 re:PEEK | byte 1 | 83 | ||||||||||||||||||||||||||
62 RECV | 01 7F 01 7F | 01 7F 01 7F | 83 | |||||||||||||||||||||||||
63 | 83 | Respond with 4f | ||||||||||||||||||||||||||
64 RCVM | 83 | Respond with 51 | ||||||||||||||||||||||||||
65 STOP | 83 |
Response to PING (0x15) packet.
F0 | 00 | ADR2 | 05 | ADR1 | 83 |
This packet is used to acknowledge the reception of most Base packets.
F0 | 00 | ADR2 | 06 | ADR1 | U_STATUS | 83 |
Example:
| |||
|
Ping packet type. Every workstation upon receiving of this packet should respond with 0x05 (PONG) packet.
F0 | 00 | ADR2 | 15 | ADR1 | O_STATUS | 83 |
Master workstation sends PING to all Slave workstations in turn (01..0F) when idle, to keep list of active Slaves up to date.
Example:
| |||
|
DIR SLAVE (6H:) MASTER SLAVE PAYLOAD --- Search First ------------------------- 21 00 00 00 08 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 e5 3c 00 58 44 49 52 20 20 20 20 43 4f 4d 00 00 00 10 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ACK 31 ff 42 00 08 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 e5 ACK --- Search Next ------------------------- 22 00 00 00 08 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 e5 3c 00 53 55 42 4d 49 54 20 20 43 4f 4d 00 00 00 0a 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ACK 32 ff 42 00 08 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 e5 ACK ---------------------------- 22 00 00 00 08 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 e5 3c 00 4e 55 54 4c 20 20 20 20 43 4f 4d 00 00 00 01 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ACK 32 ff 42 ff 08 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 e5 ACK ---------------------------- 2e 00 00 00 08 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 e5 3e ff 44 00 08 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 e5 ACK --------------------------------------------------------------------------------------------------------------------------------------- COPY MASTER --> SLAVE MASTER SLAVE PAYLOAD --- Search the first file matched with wildcard -------------------------- 21 00 00 00 08 4b 55 4b 20 20 20 20 20 20 20 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 b8 3c 00 41 4f 4b 20 20 20 20 20 20 20 20 00 00 00 01 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ACK 31 ff 42 ff 08 4f 52 20 20 20 20 20 20 20 20 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 b8 ACK ----------------------------- 2e 00 00 00 08 4b 55 4b 20 20 20 20 20 20 20 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 b8 3e ff 44 00 08 4f 52 20 20 20 20 20 20 20 20 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 b8 ACK --- Delete file -------------------------- 23 00 00 00 08 4b 55 4b 20 20 20 20 20 24 24 24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3a 33 ff 42 ff 08 4f 52 20 20 20 20 20 20 24 24 24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3a ACK --- Create file -------------------------- 26 00 00 00 08 4b 55 4b 20 20 20 20 20 24 24 24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3a 36 ff 42 02 08 4f 52 20 20 20 20 20 20 24 24 24 00 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3a ACK ----------------------------- 2c data, 0x97 ACK 2d data, 0x97 ACK 2d data, 0x83 ACK --- Write sequential file -------------------------- 25 00 00 00 08 4b 55 4b 20 20 20 20 20 24 24 24 00 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3a 35 ff 42 00 08 4f 52 20 20 20 20 20 20 24 24 24 00 00 00 01 0c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 3a ACK --- Close file -------------------------- 20 00 00 00 08 41 4f 4b 20 20 20 20 20 24 24 24 00 00 00 01 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 3a 30 ff 42 02 08 4f 52 20 20 20 20 20 20 24 24 24 00 00 00 01 0c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 3a ACK --- Rename file -------------------------- 27 00 00 00 08 41 4f 4b 20 20 20 20 20 24 24 24 00 00 00 00 08 41 4f 4b 20 20 20 20 20 20 20 20 00 00 00 00 00 00 00 00 3a 37 ff 42 00 08 4f 52 20 20 20 20 20 20 24 24 24 00 00 00 00 00 4f 52 20 20 20 20 20 20 20 20 20 00 00 00 00 00 00 00 00 3a ACK ACK (?)