| |
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.... |
| |
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). |
| |
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. |
| |
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). |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
lft, ace idea ! :) |
| |
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. |
| |
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)
|
| |
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. |
| |
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. |
| |
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 - |
| |
Krill
Registered: Apr 2002 Posts: 2980 |
Quoting lftAnother 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 |