The Color Computer has a large selection on software on rom, available in what RadioShack called a Program Pak. You can't beat software in rom, switch on till your application is ready to work is typically about 2 seconds. If you have a favorite cassette or disk based program, often it can be transferred to a Pak. Or you can write your own assembly language or Basic programs and have them programmed onto the Pak. If you are using a CoCo as a dedicated controller, this also saves the hassle of having to load in your control program every time you power it up.
Assembly language programs can be placed on the pak fairly easily, as long as
they are less than
15 3/4 K, and are written in position independant code. Non position independant code programs can often be transferred from the pak to their original load address, and executed from there.
Basic programs require a little more work, as there is some setup required on top of just loading the program in from the pak. The finished results are fairly impressive though, even fairly large programs are automatically running in just seconds, from switch on, with no key input required. If you have a dedicated application for your CoCo, and want to do away with the loading of the software from disk or tape, keep reading for the complete procedure. Remember all addresses/data are shown in base 10 decimal.
Romming a Basic program in a Pak
This procedure has been tested with all 3 CoCo models, cassette or disk based.
1 : Determine the start and end locations of the
Basic program you want to rom. Once you have
loaded in or typed in your program, four locations in memory hold the start and end
addresses of the Basic program in memory. The first 16 bit address is at decimal 25, the second
(end) address is at at 27. Type in the following and enter it a line at a time, DO NOT assign line
numbers and run as a program, as this will change the values you are trying to read.
Record values A,B,S,C,D,E
You will find the
start address will vary depending on what PCLEAR was set at originally,
and will be different depending on if system is cassette or disk based. Note that the start
address that you read is actually one higher than the start of data. All Basic programs start with
a 0 before the text, but the value you read in the above procedure is the start of text. This is
important in the next step. Take the value you read in (S) and subtract 1 from it, for use in step 2.
2 : Save the tokenized Basic program. This is where
it is best that you dust off the old cassette
deck and type in CSAVEM "name", load address (S-1), end address (E), 0
You could alternatively do this to your drive with a SAVEM command, but since the
program is destined to be run in a Program Pak, loading in from the cassette WITHOUT
the drive controller in place, allows a more accurate simulation of how the program will run
once it is auto-booted in from the Pak.
3 : Test the program for operation and conflicting
commands before you have it programmed
onto eprom. Start with the computer off, power it up. If you have a CoCo3, you have to
enter one additional command, POKE 65502,0 . This will simulate the Program Pak
installed. DON'T do this Poke if you have a CoCo1 or 2. CLOADM or LOADM what you
had previously saved. Poke in the start and end addresses from above as follows:
POKE 25, A
POKE 26, B
POKE 27, C
POKE 28, D
Complete initializing Basic
by entering the following lines. Remember don't assign line
numbers, just enter them one line at a time.
You should now be able to LIST,
RUN, EDIT and perform all other Basic functions on the
program that was loaded in as machine code. If you have a CoCo3, and your program
includes any Super Extended commands, start your Basic program with a POKE 65503,0.
If everything looks good, your code is ready to be programmed onto the cartridge eprom.
The cartridge eprom will contain a small loader and auto-boot program,
placed at the cartridge start address. You need to add the load address of the Basic program (S-1)
from Step 2 above into Line 200. Source code for this loader and auto start program is as follows:
BASLOD - LOADER
100 LOADER LDA #85 SET WARM RESET
110 STA 113
120 LDD #32960 SET EXTENDED BASIC RESET VECTOR
130 STD 114
140 JSR 47452 SET UP PARAMETERS FOR BASIC
150 LDA #53 RESTORE INTERRUPTS
160 STA 65283 THAT ARE
170 LDA #52 DISABLED ON
180 STA 65315 CARTRIDGE AUTO START
190 BASIN LDX #BASDES + 49152
200 LDY #address THIS IS LOAD ADDRESS OF BASIC (S-1)
210 STY 25 SAVE IT IN BASIC START
220 INC 26 CORRECT THE ACTUAL START VALUE
230 TNSFER CLRB SET END COUNTER TO ZERO
240 TNSFR2 LDA ,X+ GET FIRST BYTE FROM ROMPAK
250 STA ,Y+ TRANSFER BYTE TO BASIC RAM
260 BNE TNSFR2 NON ZERO DATA, KEEP TRANSFERRING
270 ENDCHK INCB ZERO DATA DETECTED, INCREMENT "0" COUNTER
280 CMPB #4 IS THERE 4 CONSECUTIVE ZERO'S?
290 BEQ LODDON IF YES, STOP TRANSFER
300 LDA ,X+ LOAD NEXT ROMPAK BYTE AFTER ZERO
310 STA ,Y+ TRANSFER BYTE TO BASIC RAM
320 BNE TNSFER NON ZERO DATA, RETURN TO MAIN LOOP
330 BRA ENDCHK ZERO DATA, INCREMENT COUNTER, STAY IN ZERO LOOP
340 LODDON LEAY -1,Y ; CORRECT BASIC END ADDRESS
350 STY 27 SAVE END ADDRESS FOR BASIC
360 AUTRUN LDX #733 BASIC LINE INPUT BUFFER
370 LDD #21077 LOAD LETTERS "RU"
380 STD ,X++
390 LDD #19968 LOAD "N" AND END
400 STD ,X++
410 LDB #4 INDICATE 4 CHARACTERS
430 STA 112 SET CONSOLE IN BUFFER FLAG
440 LDX #732 POINT TO LINE INPUT BUFFER
450 JMP 44159 START MAIN BASIC LOOP
460 BASLOD FCB 255 BASIC PROGRAM DATA STARTS HERE
There is 1 absolute address in the above listing that can be changed depending on your
system and the program memory requirements. Line 200, is the load point in ram, common points are 7680, 9728. This can be changed, especially if you will not be running a disk drive. I currently use 7680 as this is the Extended Basic default
Assemble the boot loader and burn on to the eprom at address 0 for 8 and 16K
devices. If your rom board is standard and you are using a 32K device, usually
16384 is the correct address to locate the boot loader. (This is due to to the
high address line A14 on the rom board tied to 5V) Some paks are tied low, you
can write the loader to 0. Burn the Basic program data immediately following the
loader . (Overwrite the 255 data byte at BASLOD) The first byte at BASLOD should
be a zero, your end of Basic data should be 4 consecutive zeros.
What happens when your CoCo starts with the cartridge in place, is as follows:
The boot loader starts, and moves the Basic in from cartridge rom into ram.
Basic is initialized to recognize this non standard load.
RUN is entered automatically to start the Basic program.
More details on the above items, pulled directly from Extended Basic Unravelled Disassembly
Decimal conversions are in black
0019 25 TXTTAB
*PV BEGINNING OF BASIC PROGRAM
001B 27 VARTAB RMB 2 *PV START OF VARIABLES
0071 113 RSTFLG RMB 1 *PV WARM START FLAG: $55 = WARM, OTHER = COLD
0072 114 RSTVEC RMB 2 *PV WARM START VECTOR - JUMP ADDRESS FOR WARM START
B95C 47452 JSR LA35F SET UP TAB WIDTH, ZONE ETC. This routine sets up some I/O parameters for Basic's use
Assembling your own Eprom Pak
Start with a standard Program Pak game that uses a 28 pin DIP chip. Most older cartridges use a 24 pin rom, and some newer paks have no DIP, just a blob on the board. If you can count 14 pins when you slide the protective door back on the Pak, you have a good candidate. On this donor cartridge, you will be destroying the rom chip when you remove it, so take a copy of it before you start if you ever want to play it again. My eprom programmer also has a CoCo cartridge slot that allows me to make a direct copy into a new eprom, before I remove the rom. This rom also makes a good test once you are done assembling your Pak, just plug the eprom into your Eprom Pak and see if the game plays normally.
Open the cartridge, there is a screw hidden under the label. Verify that it has a 28 pin DIP chip before proceeding. If all looks good, remove the chip, taking care not to damage the board. Best method if you do not have desoldering tooling is to cut all the pins, remove the chip, then desolder the pins individually. Boards I have seen will accept 8, 16, or 32K devices, although the maximum addressable in unmodified form is about 15 3/4 K.
Solder in a 28 pin socket, be sure you marked pin one of the original rom, so you can orient the new device correctly. Optionally, you can disconnect connector traces 7 and 8, and install a small switch to control this connection. This switch will allow auto booting, or manual starting of your program, dependant on switch position. Carefully check for solder bridges or other defects before plugging in your Pak. Install your programmed eprom and assemble the Pak.
This page is looking for a new home, as
I will be taking my CoCo site down soon. It desperately needs a rewrite as
it has lost some of its formatting. If interested, follow the Index link below
to my email address to contact me.
This page last revised Dec 28, 2003