Jump to content

Recommended Posts

I need to add two 16-bit integers (let's call them A and B; A is signed, B isn't) and get the result, less 1. Sure I can do a 16-bit decrement on the result of the addition, but 16-bit DECs require a branch instruction (for MSB roll-over) and I'm trying to save cycles. I considered using a 256 byte look up table of the index value less 1, but this comes unstuck when then LSB is zero, since element 0 is $FF:

 

	ldx a
	lda Less1Tab,x
	clc
	adc b
	sta c
	lda a+1
	adc b+1
	sta c+1
	rts

Less1Tab
	.byte $FF
?Value = $0
	.rept 255
	.byte ?Value
?Value = ?Value+1
	.endr
Making the first element of the LUT $FF seemed like a great idea until I realized it sets the carry flag when subtracting 1 from 0, messing up the MSB. Any more complex and it'll be easier to DEC the result. Any ingenious ideas?

Share this post


Link to post
Share on other sites

I don't see why the branch is an issue. This is the first straight optimized way that comes to my mind


clc
lda a
adc b
tax "+2
lda a+1
adc b+1
cpx #0 "+2
beq not_0 "+2/+3
sbc #1 "+2/0, C==1 because X>0
not_0
dex "+2
stx c
sta c+1

 

sums up to 9/10 additional cycles

  • Like 1

Share this post


Link to post
Share on other sites

Doing the usual 16-bit decrement after the fact averages at eleven cycles, assuming ZP, no page cross on branch, and the MSB being avoided most of the time. So yours is a bit better!

Share this post


Link to post
Share on other sites

Not so fast, but maybe it will be helpfull:

        clc
        lda a
        adc b
        php
        clc
        adc #$ff
        sta c
        lda a+1
        adc b+1
        plp
        adc #$ff
        sta c+1
  • Like 1

Share this post


Link to post
Share on other sites

The code from JAC! does not need the branch...

clc
lda a
adc b
tax
lda a+1
adc b+1
cpx #1
sbc #0
sta c+1
dex
stx c

  • Like 3

Share this post


Link to post
Share on other sites

Argh, should have seen this. Looks like I need more practise coding A8 directly again ;-)

  • Like 1

Share this post


Link to post
Share on other sites

I did consider if subtracting the one's complement would do this but that ends up adding one instead.

 

Is result for zero plus zero then minus one (all bits ones). Are you using signed or unsigned numbers?

Share this post


Link to post
Share on other sites

A is signed, B is not (which is just to say B is never >32767). So result may be negative.

Just tested Mapa's modified version of Peter's code and it works nicely, of course. I'll take the three cycle saving, and it looks less clumsy than sticking a DEW after the addition. ;)

Thanks for your help. I thought this quite an interesting little problem. The chosen solution also has the advantage that the second set of coordinates are left pre-loaded in the A and X registers, meaning I can fall straight into the first signed 16 bit clipping comparison without re-loading anything. :)

	.proc Clip
	clc
	lda cx1
	adc Width
	tax
	lda cx1+1
	adc Width+1
	cpx #1
	sbc #0
	sta cx2+1
	dex
	stx cx2
	
	cpx XMin		; is cx2 < XMin?
	sbc XMin+1
	svc
	eor #$80
	bmi NoDraw
	
	clc
	lda cy1
	adc Height
	tax
	lda cy1+1
	adc Height+1
	cpx #1
	sbc #0
	sta cy2+1
	dex
	stx cy2
	
	cpx YMin		; is cy2 < YMin?
	sbc YMin+1
	svc
	eor #$80
	bmi NoDraw

	cmps16 YMax cy1		; is YMax < cy?
	bmi NoDraw
	cmps16 XMax cx1		; is XMax < cx?
NoDraw
	rts
	.endp
Edited by flashjazzcat
  • Like 5

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...