| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
useless opcodes riddle - wtf is up with LAS and TAS?
Due to my emulator related activities in the last year(s) i digged more into the so called "illegal" opcodes, and the result is a nice (hopefully) PDF that i'll publish soonish (when some of you lazy bastards are done proofreading =D) - which includes complete state of the art reference to all of these, plus a bunch of real world examples on how to use these (sometimes very weird behaving) instructions... (in large part provided by bitbreaker, thumbs up!) Its about time for a comprehensive document on this topic that is suitable for normal people =)
however, two opcodes seem to be completely useless and so far i cant think of what to use them for in real world code:
- LAS abs,y ($BB) (A,X,SP = addr & SP)
- TAS abs,y ($9B) (SP = A & X ; addr = SP & addrhi+1)
if any of you have used these before, or for whatever reason have an idea on what to do with them - let me know please, this is your chance to earn some karma upgrade points :o)
(and as a sidenote, some not so obvious *short* snippets that are using SLO, RLA, RRA or ISC are welcome too)
let's bust some more myths! |
|
... 26 posts hidden. Click here to view all posts.... |
| |
Cruzer
Registered: Dec 2001 Posts: 1048 |
Quoting BitbreakerImplement a turing complete stack machine with those two opcodes :-P Can't be done since they can't branch. |
| |
Perplex
Registered: Feb 2009 Posts: 255 |
Use TAS to store a branch opcode somewhere after the current program counter? :-) |
| |
Cruzer
Registered: Dec 2001 Posts: 1048 |
Ok, if you're allowed to cheat like that. :) |
| |
Mixer
Registered: Apr 2008 Posts: 452 |
Funny opcodes those LAS and TAS
TAS $fe00,y would let you insert any SP value on that page.
TAS $7e00,y would let you insert any SP value AND #$7f on that page, etc.
Sort of having an extra register.Except that SP gets replaced by A and X.
On the other hand perhaps this is a way to do 2 AND operations at the same time?
TAS ADDR,Y: ADDR=SP and ADDRHI+1, SP=A and X.
; perhaps when calculating and #$f8 and and #$07
ldy #$00
lda #$07
ldx ycoordinate,y
txs
tas $f700,y ; f700,y has Ycoord & F8 , SP has ycoord & 07
; perhaps use prepared stack, PLA here?
tas $fe00,y ; if this is correct, fe00,y now has ycoord & 07
;2+2+4+2+5+5
;$f700=y &f8, SP=Y &07
Same could be written without stackpointer like this.
ldy #$00
lax ycordinate,y
and #$f8
sta $f700,y
lda #$07
sax $fe00,y
;4+2+4+2+4+2
and with tables
ldy #$00
ldx yycoordinate,y
lda table1,x ; X and f8
sta $f700,y
lda table2,x ; X and 07
sta $fe00,y
;2+4+4+4+4+4 |
| |
Martin Piper
Registered: Nov 2007 Posts: 722 |
I agree a full optimiser would be a bit of a challenge since an optimiser would really need some useful context about expected register input ranges, scan line and position it's expected to execute on and possibly zero page context to make good suggestions. Although it's possible to tell the assembler expected input ranges and the like by using some source code directives.
However a simple optimiser would be easily doable.
For example if it spots:
ROR $f00d
ADC $f00d
It could automatically suggest RRA $f00d
If there are stability prerequisites like the instruction needing to be in a particular bank or scan line position then it could simply output the code hint to a separate file (or output a warning) and let the coder make the change or ignore it.
It would help where someone doesn't quite remember the extended opcode set yet. :) |
| |
Frantic
Registered: Mar 2003 Posts: 1648 |
Not sure if anybody mentioned something like this already, but the only thing I can think of is that you may use "las TABLE,y" to AND the stack pointer with the contents of the Y register (if pointing to a table with values 00..FF sequentially laid out) and storing the result back into the stack pointer. At TABLE you may also have a different sort of table, that would allow you to specify exactly what sort of values you actually want to AND with the stack pointer, so in a way it would be more flexible than a normal AND instruction as well. As a special case you could fill the entire 256 bytes of that table with the same value, to make the AND operation independent of the contents of the Y register and always AND with the same value.
You would also have the result of the operation in both A and X. Good or bad..
As for what contexts this may be useful.. don't ask me! :) So.. perhaps not that much of a contribution to the discussion after all... At least it is the fastest way I can think of of actually ANDing the stack pointer with something, and storing the result back to the stack pointer. Four cycles, if TABLE is page aligned.
Possibly I misunderstood how LAS works altogether. :) |
| |
soci
Registered: Sep 2003 Posts: 480 |
Quoting Martin Piper
For example if it spots:
ROR $f00d
ADC $f00d
It could automatically suggest RRA $f00d
Is there a practical use of this opcode, except on a Z80? |
| |
Rastah Bar Account closed
Registered: Oct 2012 Posts: 336 |
I may have found some use for the TAS opcode. Suppose I want to let the sprite image depend on it's y position on the screen.
For example make it bigger for larger y to create an illusion of depth. Suppose bank 1 is used and screen memory starts at $7800.
Then the sprite image pointers are at $7bf8-$7bff. The trick I'm thinking about uses the and+store operation of TAS, for example
LDY #spritenumber
LAX #yposition
TAS $7BF8,Y ;TAS performs and #$7C, allowing for 32 different sprite images.
PLA
STA $D027,Y ;Assuming I have color data on the stack. Just as an example of using that TAS modifies SP.
What do you think about this? |
| |
Rastah Bar Account closed
Registered: Oct 2012 Posts: 336 |
There are also other possibilities. To display an animation, LAX #counter can show a new image every 4th value (since bits 0 and 1 of $7c are 0). For each image, 4 values of data can be put on the stack, e.g., sprite color, X position LSB, X position MSB, Y position.
Or can this be done more efficiently without TAS? |
| |
Rastah Bar Account closed
Registered: Oct 2012 Posts: 336 |
Quoting Color BarSuppose bank 1 is used and screen memory starts at $7800.
Then the sprite image pointers are at $7bf8-$7bff. The trick I'm thinking about uses the and+store operation of TAS, for example
LDY #spritenumber
LAX #yposition
TAS $7BF8,Y ;TAS performs and #$7C, allowing for 32 different sprite images.
PLA
STA $D027,Y ;Assuming I have color data on the stack. Just as an example of using that TAS modifies SP.
The use of the stack looks perhaps a bit "constructed", but the sprite image pointer trick may be a good application of SHX, SHY, or even SHA, e.g.:
LDY #spritenumber
LDX #spritecoordinate
SHX $7BF8,Y
|
Previous - 1 | 2 | 3 | 4 - Next |