Getting Software on to a Minimal Adam System Part 1

Hello everyone. I would like to apologize that it has been awhile since I last posted, life gets in the way. I am going to start posting more often now that things have settled down.

This post starts a series that will look at getting software into a bare minimum Coleco Adam with just a data drive, an Adam Link modem and either, Smart Basic, Smart Logo or CP/M on data tape. The reason I want to do this is to help you understand what you can do with this system without adding new hardware or spending a lot of money on software.

We will look specifically at adding software to the Adam using this bare configuration. I selected this configuration because this is how I started out and I see a lot of systems selling that have this basic settings. I will also explore how to do it without an Adam Link modem using just the joystick ports and a EVE serial port if you happen to have one.

As I post these articles feel free to ask questions and if you have a different minimum setup let me know. The articles will be in the following order over the next few weeks:

  1. Understanding the Adam Link Modem and Eve Serial ports
  2. Using CP/M (or TDOS)
  3. Using Smart Basic
  4. Using Smart Logo
  5. Using the Joystick Port
  6. Transferring Files to the Adam

AViD My Current Project

Prototype AViD
Prototype AViD

I have mentioned on Facebook and on Atari Age that I am working on a way to plug a stock Adam into a PC and have the PC then act like an Adam Disk Drive (or other SmartNet device) with no additional hardware or software being necessary on the Adam. I have given this project a name, AViD (Adam Virtual Device) I am happy to say have reached a milestone in the project.

Some background on the Adam and how it communicates

AViD plugged into the USB -RS232 adapter and extra USB 5V power for keyboard
AViD plugged into the USB -RS232 adapter and extra USB 5V power for keyboard

The disk drives and the keyboard plug into the CPU and use a quasi – serial network called SmartNet. All devices communicate on a single shared transmit and receive wire at 62,500 baud 8 bits, 1 stop bit no parity. I know these details because of a single piece of paper I got in a large Adam collection I purchased The paper was from the electronics reseller Jameco which was included when you purchased a surplus Adam keyboard from them and it gives the specs and a very simple circuit diagram to interfacing with the keyboard. This shared wire and the unusual baud rate makes it very hard to connect it to a PC (or other system) where this baud rate is not supported and this may be why nothing like this has been tried before. Researching the internet I found a USB to RS232 adapter which supports this unusual baud rate. Using this adapter, the simple circuit diagram and some software I have written I have successfully connected an Adam keyboard to a Windows 7 PC and am able to communicate with it.

Houston we have lift-off

"Hello World" from the AViD plugged into the PC
“Hello World” from the AViD plugged into the PC

Now that I can read the keyboard the next step will be to switch the system and have a real Adam ask the PC for keystrokes. These can come from the keyboard or from a text file.

Down the road

Once I am totally confident in the PC “typing” to the Adam on the SmartNet the next step will be to have the PC act as a disk drive, responding to the Adam and sending and receiving data.

The sky’s the limit

Since all communication to the keyboard, disk drives, printer and  possibly digital drives goes through the SmartNet the PC can play many roles. One may be to intercept printer commands and then print to files on the PC.

How can you help?

If any of you happen to have any details on how the Adam communicates to the drives (or vice versa) or source code (EOS or OS7) that show how this is done I would be very happy if you could leave a reply here with that information or where  I can find it. I can always be reached on FaceBook too in the Coleco Adam page.

 

Transferring files from MyZ80 (CP/M) emulator on PC to an Adam Part 1

If you are like me you you probably only have a Digital Tape Drive (or 2) on your Adam and getting software into it is close to impossible. The options available are:

  1. purchase software used on eBay (or other source)
  2. type code in yourself
  3. get an expensive used floppy drive
  4. buy an IDE adapter (more on this in a future post)
  5. “download” it from another computer using CP/M (or other software)

I am going to go into detail on option #5 using CP/M as this is the easiest and cheapest in the long run. To do this you will need the following:

  • a 300 baud AdamLink modem
  • a phone cable
  • a null phone adapter (some modems allow a direct connect, those that require a dial tone need a null phone adapter)
  • a pc with a modem on com1: that is capable of running 16 / 32 bit programs (not window 7 64 bit)
  • hyperterminal or other program to setup the modem
  • a copy of MyZ80, a CP/M emulator for the PC, a modified copy of PIP.com and a copy of UNLOAD.com
  • CP/M for  the Adam

On The PC:

To get started you need to download, extract and familiarize yourself with MyZ80, the CP/M emulator (click here to download). If you use CP/M on the Adam then this will be easy to do. MyZ80 uses CP/M 3.0 not 2.2 like the Adam but the differences are minimal. Once you are familiar with MyZ80 download PIP, extract pip.com and import it into MyZ80. Also download UNLOAD, extract and import it into MyZ80.

This copy of pip has been modified to allow you to send and receive files with handshaking using the IN: and OUT: devices.  If you are curious how this was done here is the source code.

In my next post I will show you how to:

  1. write a program to setup the modem
  2. modify a copy of PIP on the Adam so that it will work with the modem

 

Answer: A simple program to answer the phone

The following program is designed to setup the AdamLink modem in CP/M to answer the phone. Once you call the Adam with a remote computer, pressing any key on the Adam will complete the connection and allow you to then exit to CP/M and use other programs to send / receive files from the remote. I wrote this to replace the need for using AdamLink software to setup the UART and answer the phone.

; Setup AdamLink and then answer the phone


        .org    0100H

; Setup UART for 8N1 300 baud
        ld      a,080H       ; Get UART's attention
        out     (05FH),a
        out     (05FH),a
        ld      a,040H
        out     (05FH),a
        ld      a,0CH        ; 8 bits, no parity is assumed since we are not setting it
        or      03H          ; 64x clock rate, 300 baud
        or      040H         ; 1 stop bit
        out     (05FH),a     ; Now setup UART

        ld      de,Title     ; Send prompt
        ld      c,9
        call    5
        ld      c,1          ; Go wait for a key to be pressed so we know to answer the phone
        call    5
        cp      3            ; Ctrl-C?
        jp      Z,0          ; Yes, exit

        ld      a,025H       ; RXE(4h) + TXE(1H) + RTS(20H) to hang up phone
        out     (05FH),a

        ld      a,07H        ; RXE(4h) + TXE(1H) + DTR(2H) set - toggle RTS to answer
        out     (05FH),a
        ld      a,027H       ; RXE(4h) + TXE(1H) + DTR(2H) + RTS(20H) set - grab phone line and enable carrier
        out     (05FH),a

; Display modem info till ^C pressed

ModIn:
       call        KeyIn        ; Get Key if any
       jr          Z,NoKey      ; No Key jump
       cp          3            ; Ctrl-C?
       jp          Z,0          ; Yes, exit
NoKey:
       in          a,(05FH)     ; Read status
       rra                      ; Rotate RXREADY into CF
       rra
       jr          NC,ModIn     ; Wait for a byte
       in          a,(05EH)     ; Get character
       ld          e,a          ; Display what we received
       ld          c,2
       call        5
       jr          ModIn        ; do more

KeyIn:
       ld          c,0bH        ; Check if character available
       call        5
       cp          0
       jp          Z,KeyInExit  ; No Key
       ld          c,1          ; Get actual key in A
       call        5
       ld          c,a
       or          1            ; Clear Z flag
       ld          a,c
KeyInExit:
       ret

Title:
.db   "Answer 1.0",13,10
.db   13,10
.db   "Press any key to answer,",13,10
.db   "CTRL+C to exit"
.db   "$"

CP/M PIP Mods

The following modifications to CP/M’s PIP will allow you to send and receive text files using the Adam Link modem:

At the CP/M prompt type DDT PIP.COM

Once loaded type S103

Type in the following data for each address starting at 103 (do not type in the address (ie 103:)):

103: C3 104: 15 105: 01 106: C3 107: 0A
108: 01 109: 00 10A: F5 10B: DB 10C: 5F
10D: 1F 10E: 30 10F: FB 110: 79 111: D3
112: 5E 113: F1 114: C9 115: F5 116: DB
117: 5F 118: 1F 119: 1F 11A: 30 11B: FA
11C: DB 11D: 5E 11E: 32 11F: 09 120: 01
121: F1 122: C9

Type CTRL+Z to exit modify and then type G0 and enter to exit DDT

At CP/M prompt type SAVE 62 PIP.COM

Once the save is complete you can now use CP/M to send and receive files via the Adam Link modem.

To do this follow these steps:

Once you have a modem connection via Adam Link software, remove the DDP and put in your CP/M DDP and reset system (Adam Link modem will remain connected).

Once your are in CP/M:

  1. To send a text file use:
    PIP out:=filename[e]
  2. To receive a text file use:
    PIP filename=inp:[e]Once the DDP has stopped moving and PIP is showing a cursor send the text file from the remote system. After the text file is done type CTRL+Z on remote system and PIP will save the file.

You can eliminate the [e] if you do not want the transfer being echoed to the screen.

Here is the source code for the modifications to PIP

       .org        0103H
Inp:
       jp          ModIn
Out:
       jp          ModOut

CharIn:                 ; Data storage
.db    0

; Send character in C out to modem
ModOut:
       push        af
ModOutLoop:
       in          a,(05FH)
       rra
       jr          NC,ModOutLoop
       ld          a,c
       out         (05EH),a
       pop         af
       ret

; Wait for byte from modem and store it in 0109H and return
ModIn:
       push        af
ModInLoop:
       in          a,(05FH)    ; Read status
       rra                     ; Rotate RXREADY into CF
       rra
       jr          NC,ModInLoop
       in          a,(05EH)    ; Get character
       ld          (CharIn),a
       pop         af
       ret