64mb Smart Basic Disk Image

In a recent post I gave a quick update on creating a 64MB disk image that I was then able to copy to microSD card and then running a quick program I made that initialized the image to be 64MB in size I could access it on the Adam using microfox’s VDD.

I have since done more testing experimenting and I was able to get a copy of Smart Basic onto the image and have it boot from the image and have access to the whole 64mb. This involved a few steps:

  1. open up the new image in FileManager and using the edit block function look at block 1, the directory block, and see what values it had for total blocks on disk, in this case FFFFh (65535) and how many blocks left, FDFFh (65533)
  2. open up an image of smart basic and look at its directory block, its total blocks was A000h (160) and blocks left after having basic as 7A00h (122)
  3. now I used the block copy feature to copy the 160kb smart basic image to the 65mb blank image. When done the image is still 65mb but the directory block on the image only reports back a 160kb image size
  4. now using file manager again I go into block 1, the directory block of the 65mb image and change A000h to FFFFh and after the blocks left I changed &A00h for E5FFh, this is FFFFh – 26, the number of blocks used by smart basic
  5. after these changes i saved them to the image and then rebooted

Here is the image to download – and it does work in the AdamEM emulator also! (BTW it is 64mb, I typed 65mb in Smart Basic)

Data Pack Image to Disk Image

I recently found myself needing to create a few CP/M data packs for customers. This is normally no problem, but I needed to load them with programs. Since I normally use the VDD all of my files are in disk images, and a CP/M disk image is limited to 160kb, where as a CP/M data pack image is 256kb. The total amount of the programs was around 200kb so I would need to import files from the PC into 2 CP/M disk images, move those images via microSD card to an Adam and then copy those to a CP/M data pack. This is very tiresome and if you have ever copied files under CP/M it really abuses the data drive. For other purposes under EOS, I normally just copy disk images to data packs and let Backup+ 3.0 correct the directory. This is a simple block copy and it works fast.

File Manager settings for copying a data pack turned disk image to a real data pack on the Adam. Note the 320k disk drive to allow for accessing mare than 160 blocks on the disk.

So I thought to myself, why not take the tape image with is 256 1kb blocks in sequential order and interleave the 256 byte records so it is now a 256kb disk image. The VDD does not care what the size of the image is. Then I can just use File Manager to do a block copy and have the CP/M image on tape. in one pass, no copying of individual files and abusing the data drive.

Included in this post is a DOS program (requires DOSBOX under windows 7 and up) that takes a data pack image (.ddp) and makes a disk image (.dsk) for you. I am also including the source code in Turbo Basic so you can see how it works.

The following zip file has a copy of the Dragon’s Lair Data Pack image and a conversion to a 256kb disk image which you can use with the VDD or in your emulator or copy back to a data pack using the File Manager Method above.

This zip file contain’s the data pack game “2010 – The Text Adventure Game” converted into an interleaved disk image as the disk image does not contain the ending sequence.

Fix It Guide: Coleco Adam Controller

The extra line is the Smart Basic cursor being caught by my screen capture program.

I have added a new video on YouTube on my Retro System Rescue channel that gives details on how to disassemble and recondition the Adam controller. In this video I make use of a simple program I wrote that lets you test all aspects of the controller in Smart Basic.

Here is the program for you to type in if you want to test your controller:

In this program I am using the values of the controller to make characters inverse if the controller is being activated. For instance on line 200 I take the value of PDL(5) and compare it to the value of 1. If they match then the result is 1 and I multiple it by 128 and add this to the ASCII value of the letter U to get an inverse U if the controller is being press up. Any other value returned by PDL(5) will cause this formula to show a normal letter U.  If you wonder why I use an ‘*’ for the ‘#’ sign on the controller this is because the number sign has the ASCII value of 35 and when you add 128 this actually tells smart basic to backspace on the screen. So I used the ‘*’.

64 MB Hard Disk for your Adam!

I have been experimenting with MicroFox’s Floppy Disk Emulator, also known as the Virtual Disk Drive (VDD). Using some software I wrote on my PC I was able to create a 64mb disk image that the VDD would open (64mb is the limit it appears) and then initialize it with EOS and it is recognized as a 64MB disk. The AdamEM emulator on the other hand doesn’t like it, but that is ok.

Here is a copy of this blank, initialized disk image. Copy some files to it, let me know how it works out.


Type In – A DDP Verifier

In the late 70’s, early 80’s there were many magazines and books devoted to the personal computers of the time that contained programs that you could type into your computer, save and use. Though tedious it was often the only way many people could get new software for their orphaned systems. With this in mind I present DDP Verify, a small type in that will let you non-destructively verify if your tapes are good or not.

Let’s Make a Tape – Squashing a Bug

To begin with you will need a blank tape and a tape containing a copy of Smart Basic. The reason for two tapes is we will be creating a quick booting tape that will be used to verify other tapes. If you happen to run any of the programs with the Smart Basic tape in drive 1 IT WILL ERASE you Smart Basic tape. If you have an original Colecovision Smart Basic version 1.0 you will want to do something before you get started. You will want to squash a bug!

There is a bug in Smart Basic in that every time you load a program with a REM or DATA statement it will add an extra space after the REM or DATA, eventually pushing your code off the line and ruining the code. To fix this is easy:

  1. Start Smart Basic
  2. Type the following code:10 PRINT “Data bump bug fix”
    20 POKE 15830,8
    30 POKE 15831,55
    40 POKE 15832,19
    50 POKE 15824,216
    60 NEW
  3. Save the code as HELLO on the tape using save HELLO (it is case sensitive)
  4. Reboot your tape and it should tell you the data bug is fixed, if not then you saved it with the wrong name

If you already have a HELLO program on your tape, load it and add the code above to it in the beginning. You can eliminate line 10 and line 60 if you want and combine all the POKEs onto one line.

Typing in the Program

Now we are ready to start typing in earnest! To create the DDP Verify tape we need to type in the loader which reads the data and the data statements which holds the program. First I will explain the loader:


1 HIMEM :39000: R = 40004: B = 40128
2 DATA 1,0,0,17,0,0,62,8,33,192,156,205,246,252,201
3 FOR K = 40000 TO 40014: READ D: POKE K,D: NEXT K
6 IF A = -3 THEN CALL 40000: PRINT " DONE":END
8 IF A = -1 THEN READ A: FOR K = 0 TO 15: POKE B,A: B = B + 1: NEXT K: GOTO 5
9 POKE B,A: B = B + 1: GOTO 5

How it works:

1 > Tell SB to not touch memory above 39000 and set up the variables R and B. R holds where we will poke tape records and B is where our tape record buffer is.

2 > This is a small machine language (ML) code that we use to access the EOS routines to write a block to tape. The variable R which we defined in line 1 points to the block low byte. Here is the code:

LD BC,0 ;Block High Byte
LD DE,0 ;Block Low Byte
LD A,8 ;Tape drive 1
LD HL,40128 ;Buffer
CALL 0FCF6h ;Write one block

3 > This line reads in the ML in line 2 and pokes it into memory starting at address 40128 which we defined on line 1

4 > This line pauses and prompts you to put in the blank tape we will be turning into a the Verify tape – PLEASE follow this instruction.

5 > This reads in a byte from the data statements. The byte can have one of 4 values:

0 – 255 = This is a byte that will be poked into memory
-1 = This tells the loader that the next byte to be read gets poked into memory 16 times – This saves on typing
-2 = This tells the loader that the next byte contains the record number this block of data gets saved to
-3 = This tells the loader we are done, write the block to tape and end

6 – 8 > These lines process the data that is read as described above

9 > Pokes the data into memory at B, increments B and then loops back to line 5 to do more

Once you have typed in the LOADER program save it. Now we will type in the code:

DDP Verify

30 DATA -2,0
31 DATA 243,049,142,211,120,050,255,255,033,050,201,017,088,246,001,003
32 DATA 000,237,176,001,000,000,205,032,253,001,192,001,205,032,253,033
33 DATA 000,000,062,003,205,041,253,033,000,008,062,002,205,041,253,205
34 DATA 056,253,017,000,004,033,000,000,001,128,000,205,023,253,033,192
35 DATA 011,062,004,205,041,253,033,000,056,062,001,205,041,253,033,128
36 DATA 056,175,205,041,253,001,001,007,205,032,253,014,003,006,001,022
37 DATA 000,030,000,033,192,011,025,017,032,000,121,203,007,203,007,203
38 DATA 007,203,007,128,205,038,253,006,031,014,023,022,000,030,000,033
39 DATA 000,008,205,054,252,062,032,017,000,003,033,000,008,205,038,253
40 DATA 062,000,050,053,201,033,054,201,205,041,201,033,187,201,205,013
41 DATA 201,205,108,252,033,005,202,205,013,201,062,028,022,000,030,006
42 DATA 205,057,252,006,255,014,001,017,000,000,197,033,184,201,205,041
43 DATA 201,001,000,000,058,255,255,033,000,001,205,243,252,032,004,062
44 DATA 079,024,020,033,110,202,205,013,201,205,108,252,033,005,202,205
45 DATA 013,201,062,127,050,053,201,205,051,252,193,019,016,204,062,001
46 DATA 185,032,006,014,000,006,001,024,193,033,007,202,058,053,201,183
47 DATA 040,003,033,059,202,205,013,201,205,108,252,024,131,058,166,254
48 DATA 087,058,165,254,095,213,062,028,022,000,030,020,205,057,252,205
49 DATA 041,201,209,062,028,205,057,252,201,126,183,200,205,057,252,035
50 DATA 024,247,000,000,000,000,012,043,045,045,045,045,045,045,045,045
51 DATA 045,045,045,045,045,045,045,045,045,045,045,045,045,045,045,045
52 DATA 045,045,045,045,045,045,043,124,032,068,068,080,032,086,101,114
53 DATA 105,102,121,032,040,099,041,032,087,105,108,108,105,097,109,032
54 DATA 072,105,099,107,115,032,124,043,045,045,045,045,045,045,045,045
55 DATA 045,045,045,045,045,045,045,045,045,045,045,045,045,045,045,045
56 DATA 045,045,045,045,045,045,043,013,010,032,111,032,061,032,082,101
57 DATA 097,100,105,110,103,032,079,032,061,032,080,097,115,115,032,127
58 DATA 032,061,032,070,097,105,108,000,111,008,000,032,082,101,112,108
59 DATA 097,099,101,032,116,097,112,101,032,119,105,116,104,032,116,104
60 DATA 101,032,116,097,112,101,013,010,032,116,111,032,098,101,032,118
61 DATA 101,114,105,102,105,101,100,032,097,110,100,032,116,104,101,110
62 DATA 013,010,032,112,114,101,115,115,032,097,110,121,032,107,101,121
63 DATA 046,046,046,032,000,024,000,032,078,111,032,101,114,114,111,114
64 DATA 115,032,112,114,101,115,101,110,116,044,032,112,114,101,115,115
65 DATA 032,097,110,121,013,010,032,107,101,121,032,116,111,032,099,111
66 DATA 110,116,105,110,117,101,046,046,046,032,000,032,069,114,114,111
67 DATA 114,040,115,041,032,112,114,101,115,101,110,116,044,032,112,114
68 DATA 101,115,115,032,097,110,121,013,010,032,107,101,121,032,116,111
69 DATA 032,099,111,110,116,105,110,117,101,046,046,046,032,000,032,065
70 DATA 100,106,117,115,116,032,116,097,112,101,032,116,104,101,110,032
71 DATA 112,114,101,115,115,013,010,032,097,110,121,032,107,101,121,032
72 DATA 116,111,032,099,111,110,116,105,110,117,101,046,046,046,032,000
73 DATA -3

This is the code for DDP – Verify. Once you have typed in it save it as VERIFY. DO NOT RUN IT – If you do it will ruin the tape you have in the drive.

After saving VERIFY remove the SMART BASIC tape and put in the blank INITIALIZED one you made. Run VERIFY and follow the prompts. When done you should be able to reset the system and DDP Verify will start. You can then follow the prompts on the screen to start verifying your tapes.

The Screen

When DDP Verify is running it will show a ‘o’ as it is reading a block, and a ‘O’ if the block passes or the checkerboard if it doesn’t. If you want to know which block it is you can  count them on the screen. Each line is 32 blocks long so if you fail on the first column on row 3 then you failed on 2 * 32 + 1 or block 65. I kept things simple to decrease the amount of code and typing in.


If you decide to do this let me know.


  • Disk & Tape images to use in an emulator and the DDP Verify basic code VERIFY.ZIP

Formatting a Disk (help needed)

I do not have an actual disk drive to test this on, I use the emulator of the floppy emulator on my Adam but if you do can you test this:

  1. Boot up CP/M on floppy
  2. Type Format
  3. When prompted put in a blank disk and format it, verify when done
  4. Boot Smart Basic
  5. Depending on your setup type CATALOG,D1 (or D3 or D5) to view the catalog of the smart basic disk
  6. Now remove the Smart Basic disk and insert the CP/M formatted disk
  7. Type INIT HELLO,D1 (or D3 or D5, again varies based on setup)
  8. Now type 10 PRINT “HELLO WORLD”
  9. Save this with SAVE WORLD
  10. Reboot with the Smart Basic disk
  11. Put the disk that was formatted with CP/M in and type LOAD WORLD
  12. Did it work?

Make Your Own 5 Minute Data Pack

This is a very brief post that I will give more information on later:

As part of the first of many new games that I will be selling for the Adam this year I have come up with a way of creating quick data packs to hold these games. My games (and other software) are standalone products and as such do not need a complete 256kb data pack to hold them. So to make it easier I have figured out how to make a data pack in 5 minutes that will hold about 20kb of data. To do this is easy, but before you do you may wish to read this post on making a true data pack as you will be doing the same thing with some minor changes.

What you need:

  • An original super game pack, buck rogers, donkey kong junior,  or the like. It can not be a normal data pack
  • a new blank audio tape – any size is ok
  • a compatible tape deck
  • a copy of file manager

Making a new tape:

To make a 5 minute tape you are going to do what is detailed in the post about making data packs from audio tapes with the exception that you will need a timer. Set the timer for 5 minutes then start recording side A. When the time goes off. stop both decks, flip both tapes and record side B. Then follow the steps in the previous post about making the holes in the new tape.

Putting software on the new tape:

You can use File Manager to copy up to 23 blocks on the new tape you created. The first block is the code that loads when you reset the Adam and needs to be on block 0. The remaining blocks hold code that you would load with a loader routine that is part of the block 0 code. I will detail how this can be done later.

Replacement Power Supply

If you are looking to dump the printer and use a newer power supply you can use this one from Jameco (RQ-50B). I have made a number of them so far. It is very easy to do if you are willing to sacrifice the power cable from the printer (click here for a video on making your own cable). Just cut the two cables off the printer and then wire them up according to the photo on the left. I use a power strip for the on and off switch.