Page 1 of 1

Device #2 for Serial I/O?

Posted: Thu May 20, 2021 12:40 am
by rje

I was idly thinking about writing a game that could interact with other players via a server.

So, serial I/O via a card attached to the User Port or *wherever*.  Maybe a modem, or ethernet, or heliograph, or carrier pigeon.  Just thinking about it, and how it might be nice to abstract that protocol into the existing KERNAL I/O.  A driver to patch the lines, and custom handler code (probably a lot of code on the card itself).  That sort of thing...

...but to make programming easier, it seems right to allocate a device number for that I/O channel.

On the C64, the RS-232 interface was Device #2.

Seems the right place to start here, as well.


Device #2 for Serial I/O?

Posted: Thu May 20, 2021 5:20 am
by JimmyDansbo

I see no reason why we could not use #2. If we have to use something different, I was thinking that we might as well choose something that is recognizable from other platforms such as the PC, like $3F8. Only after I submitted my answer, I realized that we probably only have a single byte for the ID. ?


Device #2 for Serial I/O?

Posted: Thu May 20, 2021 6:59 am
by BruceMcF

I expect that the bit banged User Port serial interface will be on #2, so that is the natural one for the "main" serial port on a User Port or expansion board hardware serial port.


Device #2 for Serial I/O?

Posted: Thu May 20, 2021 9:44 pm
by TomXP411

of course, it will be #2. 

Back in the Commodore days, it was #2, and even if users added a Swiftlink (which used a 6551 ACIA), the new 6551 serial port was still accessed via port 2. The Swiftlink cartridge provided a ROM update that replaced the User port serial code with code on the cartridge. 

So add-on serial ports could either patch the KERNAL or provide their own routine in Golden RAM or in a bank at $A000

For example: 

$400 : Port number (for multi-port cards)

$401 : bytes waiting in read buffer on UART

$402 : bytes waiting in write buffer on UART

$403 : flow control state

$404 : data to send

$405 : 1 if byte was read in last call, 0 if no data received

$406 : last byte read


And the read/write routines at $410, $440, and so on:

$410 : Update status registers

$413 : Send a byte 

$415 : Read a byte

So BASIC code would look like:

Send a byte: POKE $404 : SYS $413

Read a byte: SYS $415 : IF PEEK(405) > 0 THEN A$=CHR$(406)

Check the modem status: SYS 410 : S = PEEK($403)