[Coco] running BASIC in RAM (was "Coco Questions")

William Astle lost at l-w.ca
Sun Oct 29 10:59:58 EST 2006


Aaron Banerjee wrote:
> I'm not sure how useful this would be, but just in case there were silent
> lurkers hoping someone would post a short quip to put your coco in all ram
> mode (with BASIC running...).  I've added comments showing what (I hope)
> is the assembly version of the driver.
>                         - Aaron
> 
> 5  DATA 26,80:REM                 ORCC   $50     MASK INTERRUPTS
> 10 DATA 142,128,0:REM             LDX    $8000   START OF BASIC
> 15 DATA 166,132:REM       LINE15  LDA    ,X
> 20 DATA 183,255,233:REM           STA    $FFDF   MAP TYPE 1
> 25 DATA 167,128:REM               STA    ,X+
> 30 DATA 183,255,222:REM           STA    $FFDE   GO BACK TO REGULAR MEM
> 35 DATA 140,255,0:REM             CMPX   $FF00   END OF RAM
> 40 DATA 38,241:REM                BNE    LINE15
> 45 DATA 183,255,223:REM           STA    $FFDF   STAY IN ALL RAM MODE
> 50 DATA 28,175:REM                ANDCC  $AF     UNMASK INTERRUPTS
> 55 DATA 57:REM                           RTS     RETURN
> 60 REMEMBER THE ALAMO!!
> 65 FOR X=3584 TO 3609
> 70 READ D
> 75 POKE X,D
> 80 NEXT X
> 85 EXEC 3584

The assembly code is not quite right. You've left off the "immediate 
mode" indicators. The code should be:

	ORCC #$50
	LDX #$8000
LINE15	LDA ,X
	STA $FFDF
	STA ,X+
	STA $FFDE
	CMPX #$FF00
	BNE LINE15
	STA $FFDF
	ANDCC #$AF
	RTS

There is a siginficant difference between $8000 and #$8000. The former 
refers to the *contents* at $8000 and the latter refers to the literal 
constant $8000. Also, the original code would not have assembled since 
ORCC and ANDCC operate only in immediate mode.

As has been noted, this should not be run on a Coco3. But, since the 
Coco3 is already in all RAM mode, it's also not necessary. There's a 
simple test to see if you're already in RAM mode:

10 A=PEEK(&H8000)
20 POKE&H8000,A+1
30 IF A=PEEK(&H8000) THEN GOSUB 1000 ELSE POKE &H8000,A
40 REM program here

990 END
1000 REM go to all ram mode here

For the above, the reasoning is that because the first two bytes of ECB 
are just a signature that's used at basic startup time, changing one of 
them cannot cause a crash. By reading the original value, adding one to 
it, and storing it back, we can test if the we have ROM. If it is ROM, 
we get back the original value otherwise we get back the new value.

The above test will also prevent the ROM/RAM copy on a Coco3 because it 
is already in RAM mode.

Observation: the basic code to test for ram mode can be added to the 
start of the assembly code as follows:

	LDA $8000
	INC $8000
	CMPA $8000
	BEQ ROMRAM
	STA $8000
	RTS
ROMRAM	ORCC #$50
	.....

Both versions of the test restore the original value at $8000 if RAM 
mode is discovered.

-- 
William Astle
finger lost at l-w.ca for further information

Geek Code V3.12: GCS/M/S d- s+:+ !a C++ UL++++$ P++ L+++ !E W++ !N w---
!D !M PS PE V-- Y+ PGP t+@ 5++ X !R tv+@ b+++@ !DI D? G e++ h+ y?



More information about the Coco mailing list