[Coco] Setting graphics modes with Assembly

Fedor Steeman petrander at gmail.com
Tue Dec 23 15:23:56 EST 2008


Thanks, Robert, for the help, and that looks like a very elegant and useful
way to set the display offset.

I have dug up Don Inman's book on assembly language graphics and really
coming to terms with this. I keep on experimenting and learning...

Cheers,
Fedor


2008/12/20 Robert Gault <robert.gault at worldnet.att.net>


> 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

>>

>>

>

> --

> Coco mailing list

> Coco at maltedmedia.com

> http://five.pairlist.net/mailman/listinfo/coco

>




More information about the Coco mailing list