- 2016/1/19 – Added reference to earlier article about more memory for BASIC (and an excerpt about why BASIC is that way). Also added reference to Juan’s comment on improving the program. Added link to Facebook CoCo group.
- 2016/9/2 – Removed a duplicat line in the 2nd listing. Maybe fixed a typo or two.
Update: See this earlier article about getting more memory for BASIC. Here is an excerpt:
64K NOTE: The reason BASIC memory is the same for 32K and 64K is due to legacy designs. The 6809 processor can only address 16-bits of memory space (64K). The BASIC ROMs started in memory at $8000 (32768, the 32K halfway mark). This allowed the first 32K to be RAM for programs, and the upper 32K was for BASIC ROM, Extended BASIC ROM, Disk BASIC ROM and Program Pak ROMs. Early CoCo hackers figured out how to piggy-pack 32K RAM chips to get 64K RAM in a CoCo, but by default that RAM was “hidden” under the ROM address space. In assembly language, you could map out the ROMs and access the full 64K of RAM. But, since a BASIC program needed the BASIC ROMs, only the first 32K was available.
When 64K upgraded became available, the original BASIC would still only report about 24K free since it had never been modified to make use of the extra memory. Thus, typing “PRINT MEM” on a 32K CoCo 1 shows the same thing it does on a 512K (or greater) CoCo 3.
So how do you tell? One easy way is to just try to load a program or game that requires 64K and see if it works. But, if all you have is the CoCo, there is a short program you could type in to test. (NOTE: See a better listing later in this article.)
10 READ A$:IF A$="X" THEN END 20 POKE 20000+N,VAL("&H"+A$) 30 N=N+1:GOTO 10 40 DATA 34,01,1A,50,10,8E,80,00 50 DATA B7,FF,DE,EC,A4,AE,22,EE 60 DATA 24,B7,FF,DF,ED,A1,AF,A1 70 DATA EF,A1,10,8C,FE,FC,25,E8 80 DATA 10,8C,FF,00,24,0C,B7,FF 90 DATA DE,EC,A4,B7,FF,DF,ED,A1 100 DATA 20,EE,35,01,39 110 DATA X
Thanks to Juan Castro for passing this along. I reformatted it so no line would be longer than the 32 column screen, hoping it makes it a bit easier to type in (though it does make the program longer, needing more, shorter lines).
I believe this is the classic “ROM TO RAM” (or ROM2RAM) program that appeared somewhere in Rainbow magazine back probably around 1983. Basically, it places the system in to 64K mode (where memory addresses &H0000 to &HFFFF are all RAM) and copies the COLOR BASIC and, if installed, the EXTENDED and DISK BASIC ROMs in to that upper 64K so the system can still work.
If you type this in on a CoCo 1 or 2, then RUN it, it loads a small machine language program in starting ad memory address 20000. After this, you can type “EXEC 20000” to execute that machine language program. If you typed it in correctly, it should just return to BASIC and nothing should seem any different.
But, at this point (if it worked), the BASIC ROM is now in RAM, which means you can POKE to those memory locations and make changes.
Juan suggests an easy hack of changing where the prompt “OK” appears. He says:
Now try POKE &HABEF,89 — OK should become OY.
It worked for me in the Xroar emulator (configuration to emulated a 64K CoCo 2):Thus, if you can run this program without it crashing, and that POKE works to change something formerly in ROM, your CoCo is operating in all-RAM mode and must have more than 32K.
In the future, I will have to track down a simpler way to test for 64K. Until then, happy typing…
Update: In the comments, Juan suggested making the following changes, so the program will execute the machine language program for you:
10 READ A$:IF A$=”X” THEN 35 20 POKE 20000+N,VAL("&H"+A$) 30 N=N+1:GOTO 10 35 EXEC 20000:POKE &HABEF,89:END 40 DATA 34,01,1A,50,10,8E,80,00 50 DATA B7,FF,DE,EC,A4,AE,22,EE 60 DATA 24,B7,FF,DF,ED,A1,AF,A1 70 DATA EF,A1,10,8C,FE,FC,25,E8 80 DATA 10,8C,FF,00,24,0C,B7,FF 90 DATA DE,EC,A4,B7,FF,DF,ED,A1 100 DATA 20,EE,35,01,39 110 DATA X
With those changes, now all you have to do is type RUN and it will load the machine language program, execute it (to copy ROM in to RAM), then poke the “OK” prompt to say “OY”. Thanks, Juan!