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 > 6502 instruction decoding
2012-02-29 18:14
JackAsser

Registered: Jun 2002
Posts: 2014
6502 instruction decoding

Why is it that STA-opcodes always gets an implicit page-crossing penalty in comparison to their LDA counter parts?

F.e.
lda abs,x is 4/5 depending on page crossing
sta abs,x is always 5 independent of page crossing
2012-02-29 18:34
Graham
Account closed

Registered: Dec 2002
Posts: 990
LDA $1234,X

1. fetch opcode
2. fetch low byte of absolute address
3. fetch high byte of absolute address, add X to low byte
4. read byte from calculated address, increase high byte of address if X + LO overflowed
5. if X + LO overflowed, read byte again

If the same happened for STA, the 6502 would sometimes write a byte to a wrong address when doing step 4, so STA will always don't do the write at step 4 and always wait for step 5.
2012-02-29 19:15
Fresh

Registered: Jan 2005
Posts: 101
What Graham said.
The cpu is not able to check cycle hi byte decide whether to write. In lda, by the time it checks it, it has already loaded a (possibly) correct value. But then again, that's just reading.
2012-02-29 19:18
Slammer

Registered: Feb 2004
Posts: 416
Interesting. Do you have some documentation describing the internal working of the processor?
2012-02-29 19:24
Fresh

Registered: Jan 2005
Posts: 101
The good old c64doc
http://www.viceteam.org/plain/64doc.txt
Or you can try the 'real' thing:
http://www.visual6502.org
2012-02-29 20:15
JackAsser

Registered: Jun 2002
Posts: 2014
Quote: What Graham said.
The cpu is not able to check cycle hi byte decide whether to write. In lda, by the time it checks it, it has already loaded a (possibly) correct value. But then again, that's just reading.


Stupid me, but it's quite obvious... :) So... those reads actually occur, not that it matters on the C64, but another platform with full IO-address decoding would perhaps suffer from implicit IRQ-acks f.e. due to those reads then?
2012-02-29 20:15
Copyfault

Registered: Dec 2001
Posts: 478
It always made me wonder why with STA ind,x the chip developers went for a rather consequent solution (only ONE write cycle @ calculation cycle 5) whereas it seems somewhat unpolished for the RMW-opcodes (TWO write cycles: unaltered value @ calc cycle 5, changed value @ calc cycle 6).

Most probably they had no other chance; writing the same value to a register that has just been read from it should not really cause troubles.


A good documentation should be AAY64 by Ninja. At least the internal processor states are also listed there.
2012-02-29 20:21
Graham
Account closed

Registered: Dec 2002
Posts: 990
It should be mentioned that STA $1234,X reads from the same address as LDA $1234,X in step 4.

And yes, this wrong read can acknowledge IRQs. Example:

    LDX #$FF
    LDA $DC0E,X

This would read from $DC0D in cycle 4 and $DD0D in cycle 5, acknowledging both, IRQs and NMIs :)
2012-02-29 20:28
Graham
Account closed

Registered: Dec 2002
Posts: 990
Quoting Copyfault
It always made me wonder why with STA ind,x the chip developers went for a rather consequent solution (only ONE write cycle @ calculation cycle 5) whereas it seems somewhat unpolished for the RMW-opcodes (TWO write cycles: unaltered value @ calc cycle 5, changed value @ calc cycle 6).

It needs 1 cycle to actually do the ALU action.

Quote:
Most probably they had no other chance; writing the same value to a register that has just been read from it should not really cause troubles.

It does have it's effects. Acknowledging Raster IRQs with DEC $D019 only works because RMW writes the same value back that it reads. A clean way to acknowledge VIC2 IRQs would be LDA $D019 STA $D019.
2012-02-29 21:07
JackAsser

Registered: Jun 2002
Posts: 2014
RMW has two write cycles? Wow. So, on Nintendo, with auto incrementing vram-pointer when writing to $2007, this would mean that it would increment the pointer TWO times if I do say, INC $2007. Or rather, THREE times because of the one load cycle as well?
2012-02-29 21:11
TWW

Registered: Jul 2009
Posts: 545
Quote: It should be mentioned that STA $1234,X reads from the same address as LDA $1234,X in step 4.

And yes, this wrong read can acknowledge IRQs. Example:

    LDX #$FF
    LDA $DC0E,X

This would read from $DC0D in cycle 4 and $DD0D in cycle 5, acknowledging both, IRQs and NMIs :)


That is amazing! 8-D

so no more:

    lda $dc0d
    lda $dd0d


just:

    ldx #$ff
    lda $dc0e,X


cool!
2012-02-29 21:33
MagerValp

Registered: Dec 2001
Posts: 1078
Quoting Graham
A clean way to acknowledge VIC2 IRQs would be LDA $D019 STA $D019.

Or rather LDA #$FF : STA $d019.
2012-02-29 21:56
iAN CooG

Registered: May 2002
Posts: 3194
I find asl $d019 way simpler, all bits get read/written.
2012-03-01 00:33
JackAsser

Registered: Jun 2002
Posts: 2014
Quote: I find asl $d019 way simpler, all bits get read/written.

Checking out visual6502.org and the forums there it became clear that the actual instruction decoding is just an internal PLA in the CPU. It takes the current opcode and cycle into an array and get an operation value out which it executes.

I want a dump of this ROM. There is one online but it's obviously totally flawed, and the dude who did it also said he didn't know what lines that were what.

Using the visual6502 one can transcribe it properly, but it's a pain to do it. Anybody did it already?
2012-03-01 08:28
MagerValp

Registered: Dec 2001
Posts: 1078
Quoting JackAsser
Using the visual6502 one can transcribe it properly, but it's a pain to do it. Anybody did it already?

No me, but I'm also interested in it. It'd make a pretty awesome cycle exact 6502 emulation core.
2012-03-01 08:33
JackAsser

Registered: Jun 2002
Posts: 2014
Quote: Quoting JackAsser
Using the visual6502 one can transcribe it properly, but it's a pain to do it. Anybody did it already?

No me, but I'm also interested in it. It'd make a pretty awesome cycle exact 6502 emulation core.


Exactly + less code to implement it probably given you implement the ~130 sub operation (compared to 256 special case instruction as we do today more or less)
2012-03-02 18:11
Zer0-X
Account closed

Registered: Aug 2008
Posts: 78
So you're after the table like this (from the "wrong" CPU tho)?:

http://oms.wmhost.com/misc/6502_inst.png
2012-03-02 18:28
chatGPZ

Registered: Dec 2001
Posts: 11386
Quote:
Exactly + less code to implement it probably given you implement the ~130 sub operation (compared to 256 special case instruction as we do today more or less)

not really... if you look at a typical cycle exact cpu core, it already works with a lookuptable and sub operations very similar to what the cpu does :)
2012-03-02 22:55
JackAsser

Registered: Jun 2002
Posts: 2014
Quote: So you're after the table like this (from the "wrong" CPU tho)?:

http://oms.wmhost.com/misc/6502_inst.png


Yes, but I have deciphered the die-scan now into a proper table. There are errors though that I must fix first.
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
Epyx/TSA
Chesser/Blazon
rexbeng
Jetboy/Elysium
Jason/Antic
krissz
Guests online: 104
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 Diskmag Editors
1 Magic  (9.8)
2 hedning  (9.6)
3 Jazzcat  (9.5)
4 Elwix  (9.1)
5 Remix  (9.1)

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