Re: [stella] Very BASIC ASM Info needed...

Subject: Re: [stella] Very BASIC ASM Info needed...
From: "Thomas Jentzsch" <tjentzsch@xxxxxx>
Date: Wed, 7 Mar 2001 15:35:17 +0100
Manuel Polik wrote:
> Andrew Davie wrote:
> 
> > > Can someone please find _and_ explain it to me? :-)
>  
> > Well, this isn't an eor-trick.  But fairly efficient.
> > Depends on what's your poison... code size or speed.
> 
> Thanks for pointing out these two ways. The one with the table is the
> one I'll probably use, but the second one I liked more from a *style*
> point of view, since it's very clever that way.

Well, the most compact way is (as always) to count down (8 bytes):

    dec FrameCounter
    bpl .skipReset
    lda #2
    sta FrameCounter
.skipReset

But I don't know an EOR trick for this too.


> Just for the record, can someone come up with an elegant 'division by 3'
> solution? 
> (quicker than subtracting multiple numbers of '3's I mean)
> That would save a BYTE'o'RAM then, since I wouldn't have to install
> another frame counter.

I guess, what you need is a framecounter that allows you to do something every 2nd, 3rd or maybe 6th frame. I had the same problem with Thrust too. My solution was to combine both counters into one byte. I used the upper two bits for counting to 3 and the lower 6 bits for counting up to 64. 

That way I could simple define masks for the needed intervalls:

; masks for FrameCnt:
FRAME1MASK      = %00000000
FRAME2MASK      = %00000001
FRAME3MASK      = %11000000
FRAME4MASK      = %00000011
FRAME6MASK      = FRAME2MASK|FRAME3MASK     ; %11000001
FRAME8MASK      = %00000111
FRAME12MASK     = FRAME4MASK|FRAME3MASK     ; %11000011
FRAME16MASK     = %00001111
FRAME32MASK     = %00011111
FRAME48MASK     = FRAME16MASK|FRAME3MASK    ; %11001111
FRAME64MASK     = %00111111
FRAME96MASK     = FRAME32MASK|FRAME3MASK    ; %11011111
FRAME192MASK    = FRAME64MASK|FRAME3MASK    ; %11111111

And the code looked like this:
  lda FrameCnt
  and #mask
  beq doSomething

The resulting code for increasing the framecounter was a bit complicated, but I needed one byte only:
    lda     FrameCnt            ; 3
    bpl     .okCnt3             ; 2³
    ora     #$40                ; 2         reset Cnt3
.okCnt3:
    clc                         ; 2
    adc     #$40                ; 2         increase Cnt3
    sta     FrameCnt            ; 3

    and     #$3f                ; 2
    bne     .okCnt64            ; 2³
    lda     #$3f                ; 2         reset Cnt64
    BIT_W                       ; 2
.okCnt64:
    lda     #$ff                ; 2         increase Cnt64
    clc                         ; 2
    adc     FrameCnt            ; 3
    sta     FrameCnt            ; 3 = 28-32

Have fun!
_______________________________________________________
Thomas Jentzsch         | *** Every bit is sacred ! ***
tjentzsch at web dot de |


_______________________________________________________________________________
Alles unter einem Dach: Informationen, Fun, E-Mails. Bei WEB.DE: http://web.de
Die große Welt der Kommunikation: E-Mail, Fax, SMS, WAP: http://freemail.web.de


-
Archives (includes files) at http://www.biglist.com/lists/stella/archives/
Unsub & more at http://www.biglist.com/lists/stella/

Current Thread