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 > useless opcodes riddle - wtf is up with LAS and TAS?
2014-11-07 23:10
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....
 
2014-11-11 11:08
Cruzer

Registered: Dec 2001
Posts: 1048
Quoting Bitbreaker
Implement a turing complete stack machine with those two opcodes :-P
Can't be done since they can't branch.
2014-11-11 11:50
Perplex

Registered: Feb 2009
Posts: 255
Use TAS to store a branch opcode somewhere after the current program counter? :-)
2014-11-11 15:42
Cruzer

Registered: Dec 2001
Posts: 1048
Ok, if you're allowed to cheat like that. :)
2014-11-11 16:35
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
2014-11-12 12:17
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. :)
2014-11-12 17:03
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. :)
2014-11-12 17:33
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?
2016-09-04 20:29
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?
2016-09-06 14:19
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?
2016-09-24 19:30
Rastah Bar
Account closed

Registered: Oct 2012
Posts: 336
Quoting Color Bar
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.


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
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
Flashback
DeMOSic/MS^LSD^ONS
wil
Mibri/ATL^MSL^PRX
diabolus
Guests online: 126
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 Layers  (9.6)
2 No Listen  (9.6)
3 Cubic Dream  (9.6)
4 Party Elk 2  (9.6)
5 Copper Booze  (9.6)
6 Rainbow Connection  (9.5)
7 Dawnfall V1.1  (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 Crackers
1 Mr. Z  (9.9)
2 Antitrack  (9.8)
3 OTD  (9.8)
4 Fungus  (9.8)
5 S!R  (9.8)

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