Log inRegister an accountBrowse CSDbHelp & documentationFacts & StatisticsThe forumsAvailable RSS-feeds on CSDbSupport CSDb Commodore 64 Scene Database
You are not logged in - nap
CSDb User Forums


Forums > C64 Coding > LDA (ZP,x)
2016-05-16 14:31
oziphantom

Registered: Oct 2014
Posts: 490
LDA (ZP,x)

Has anybody ever used this opcode and if so what for?
 
... 33 posts hidden. Click here to view all posts....
 
2016-05-16 18:59
lft

Registered: Jul 2007
Posts: 369
I use it exactly like that in my latest playroutine.

Another use is when you'd really want to do (zp), but you need the y register for something else, and you have a known constant in x. Then you can do (zp-constant,x).

Finally, cmp (0,x) is a convenient 6-cycle 2-byte nop (although it clobbers the flags).
2016-05-16 19:15
Bitbreaker

Registered: Oct 2002
Posts: 508
used it a few times as substitute for lda (zp) when x is fix and known lda (<(zp - x_),x) (lda (zp),y is cheaper however to do so)
Now also ponder about lax (zp,x) which could give some x = f(x) results :-D But it could also work as ldx (zp) with the above scenario whenever you can allow to clobber x.
2016-05-16 19:17
lft

Registered: Jul 2007
Posts: 369
Another thing I've had in mind, but never actually implemented, is this: Suppose you're doing something like kefrens bars with open sideborders. You repeat the last line of a row of characters and modify the font on the fly. But in the borders, you repeat sprite data, let's say one sprite on either side. That means you have a single graphics buffer consisting of 46 bytes, but those bytes are distributed somewhat irregularly in RAM. So make a table in zp consisting of 46 pointers to them. Then use (zp,x) in the drawing operations. You can even access neighbouring cells with (zp-2,x) and (zp+2,x).
2016-05-16 19:31
Oswald

Registered: Apr 2002
Posts: 5094
lft, ace idea ! :)
2016-05-16 19:59
Slammer

Registered: Feb 2004
Posts: 416
I think the (zp,x) idea have already been used for kefrensbars. I don't remember which demo but I guess it was one from Booze.
2016-05-17 04:30
Skate

Registered: Jul 2003
Posts: 494
I just checked my source codes directory. I've used it a few times.

In Snapshot / Glance demo's horizontal raycaster part uses something like;

	lax DATAS,y
	sta (MAP_POINTER,x)
	lda tColor,x
	ldx #$00
	sta (COLOR_POINTER,x)


So, first one really uses x as an index and second one uses x as a zero, more likely a sta(ZP). Of course this is in a loop and y register should not be affected.

This is from one of my unreleased codes;

	lax $c0 ; lda #0 : ldx #0
	sta (copyTo,x)


Just put a zero to the address pointed at copyTo. $c0 already had a zero of course.

This one is from my recent sierpinski entry.

	lax $02
	sec
-	ror
	dey
	bpl -
	ora (plotAddress,x)
	sta (plotAddress,x)


I think what is does is clear.

And last but not least, this is one of my stable raster routines to wait for 8 cycles at some point.

	sre ($ff,x)
2016-05-17 07:27
ready.

Registered: Feb 2003
Posts: 441
Useful when you need to use zero page pointers but want to preserve y, for example:

ldy whatever
ldx #0
lda (ZP0),y
sta (ZP1,x)

I use this when moving data from one area to another one.
2016-05-17 08:07
soci

Registered: Sep 2003
Posts: 480
It's more popular in some forth implementations where the data stack is on zero page and is not split.
2016-05-17 08:25
Oswald

Registered: Apr 2002
Posts: 5094
Quote: Useful when you need to use zero page pointers but want to preserve y, for example:

ldy whatever
ldx #0
lda (ZP0),y
sta (ZP1,x)

I use this when moving data from one area to another one.


god no! why? thats butt ugly and there are numerous ways round that preserve X instead of Y or selfmod.ű


moving data efficiently

ldx #0
ldy #numofpages

-
lda src,x
sta dst,x
dex
bne -

inc srcaddrhi
inc dstaddrhi
dey
bne -
2016-05-17 11:06
Krill

Registered: Apr 2002
Posts: 2980
Quoting lft
Another thing I've had in mind, but never actually implemented, is this: Suppose you're doing something like kefrens bars with open sideborders. You repeat the last line of a row of characters and modify the font on the fly. But in the borders, you repeat sprite data, let's say one sprite on either side. That means you have a single graphics buffer consisting of 46 bytes, but those bytes are distributed somewhat irregularly in RAM. So make a table in zp consisting of 46 pointers to them. Then use (zp,x) in the drawing operations. You can even access neighbouring cells with (zp-2,x) and (zp+2,x).
You can do this, but it wastes a lot of cycles. You'd only do it like this if you're under serious memory constraints... :)
Under normal demo conditions (almost all 64K available) you'd have as many chunks of unrolled optimised code as you have bar X positions. Then you'd execute one of those in each rasterline of the effect.
Previous - 1 | 2 | 3 | 4 | 5 - Next
RefreshSubscribe to this thread:

You need to be logged in to post in the forum.

Search the forum:
Search   for   in  
All times are CET.
Search CSDb
Advanced
Users Online
pcollins/Quantum
Magic/Nah-Kolor
Didi/Laxity
Guests online: 71
Top Demos
1 Next Level  (9.7)
2 13:37  (9.7)
3 Mojo  (9.7)
4 Coma Light 13  (9.6)
5 Edge of Disgrace  (9.6)
6 What Is The Matrix 2  (9.6)
7 The Demo Coder  (9.6)
8 Uncensored  (9.6)
9 Comaland 100%  (9.6)
10 Wonderland XIV  (9.6)
Top onefile Demos
1 No Listen  (9.6)
2 Layers  (9.6)
3 Cubic Dream  (9.6)
4 Party Elk 2  (9.6)
5 Copper Booze  (9.6)
6 Dawnfall V1.1  (9.5)
7 Rainbow Connection  (9.5)
8 Onscreen 5k  (9.5)
9 Morph  (9.5)
10 Libertongo  (9.5)
Top Groups
1 Performers  (9.3)
2 Booze Design  (9.3)
3 Oxyron  (9.3)
4 Triad  (9.3)
5 Censor Design  (9.3)
Top NTSC-Fixers
1 Pudwerx  (10)
2 Booze  (9.7)
3 Stormbringer  (9.7)
4 Fungus  (9.6)
5 Grim Reaper  (9.3)

Home - Disclaimer
Copyright © No Name 2001-2024
Page generated in: 0.041 sec.