[Coco] Setting graphics modes with Assembly

Robert Gault robert.gault at worldnet.att.net
Sat Dec 20 10:48:53 EST 2008


The main "error" is the first JMP $ADFB. Since you want to return to 
your program not Basic, this should be JSR $ADFB. The second use of the 
ROM routine is OK because you do want to return to Basic and therefore 
should use JMP.

$FFC0 is not The clear bit for the SAM rather A clear bit. All even 
bytes in that region act as clears, all odd bytes act as sets for a 
specific control toggle.

While it can take more code, it would probably help you to use a generic 
routine to write to the SAM control register where you specify the 
actual control word rather than bytes.

*Enter with regA equal to the 7-bit SAM value, regB = 7, regX=1st SAM byte
*Leave with SAM set for some video offset
* $E00/$200=7
	LDA	#7	the above result
	JSR	SETSAM
	...		Program code
* Video offset controller for PMODEs
SETSAM	LDB	#7	for 7-bit word
	LDX	$FFC6	first SAM offset byte
SAMLUP	RORA
	BCC	SAM2
	LEAX	1,X
	STA	,X+
	BRA	SAM3
SAM2	STA	,X++
SAM3	DECB
	BNE	SAMLUP
	RTS

The above routine can be used to setup the SAM for any video location 
merely by changing the value in regA. The same type of routine can be 
used to set any SAM mode ($FFC0-$FFC5) just by loading regB with 3 and 
regX with $FFC0.

Fedor Steeman wrote:
> Hi all,
> 
> I have been studying Chris Lomont's reference guide and, combined with your
> help, I am starting to come to grips with it. One thing I don't get yet,
> though, is how to switch from one graphics mode to another. I tried simply
> appending the following to the already written code, but that doesn't do
> anything noticeable:
> 
> 
>     LDA    #$E8        * load 1110 1000
>     STA    VDGSET    * set pmode 3
> 
> Also: how to set the equivalent of SCREEN 1,0 / 1,1 commands?
> 
> This is my complete code so far:
> 
> TXTSCR    EQU    $0400     *Start of text screen
> HIRES1    EQU    $E00    *Start of hi-res graphics screen
> VDGSET    EQU    $FF22        *PIA1 data port B: VDG Control output
> V0CLR    EQU    $FFC0        *Clear bit for Sam Chip (Graphics mode)
> V1SET    EQU    $FFC3        *Set V1 bit in Sam Chip (Graphics mode)
> V2SET    EQU    $FFC5        *set V2 bit in Sam Chip (Graphics mode)
> F0CLR    EQU    $FFC6        *Display Offset Binary, This is the CLR Bit
> (Video page offset)
> F0SET    EQU    $FFC7
> F1SET    EQU    $FFC9
> F2SET    EQU    $FFCB
> POLCAT    EQU    $A000        *Color Basic rom poll keyboard routine
> 
>     ORG    $7000
> START    LDX    #HIRES1
>     LDD    #$AAAA
> LOOP1    STD     ,X++
>     CMPX #HIRES1+$1800
>     BCS     LOOP1
> GMODE    STA    V0CLR    * set graphics mode
>     STA    V1SET    * set graphics mode
>     STA    V2SET    * set graphics mode
>     LDA    #$F8    * load 1111 1000
>     STA    F0SET    * set graphics mode
>     STA    F1SET    * set graphics mode
>     STA    F2SET    * set graphics mode
>     STA    VDGSET    * set pmode 4 equivalent
>     JMP    $ADFB    * wait for keypress
>     LDA #$E8    * load 1110 1000
>     STA    VDGSET    * set pmode 3 equivalent?
>     JMP    $ADFB
>     END START
> 
> Thanks for any input!
> 
> Cheers,
> Fedor
> 
> --
> Coco mailing list
> Coco at maltedmedia.com
> http://five.pairlist.net/mailman/listinfo/coco
> 




More information about the Coco mailing list