6502 datapath

From VisualChips

(Difference between revisions)
Jump to: navigation, search
(small re-order in preparation for a signal name cross-reference)
(A note on signal naming: first cut of table)
Line 85: Line 85:
will be found as
will be found as
* dpc4_SSB,dpc5_SADL,dpc6_SBS,dpc7_SS
* dpc4_SSB,dpc5_SADL,dpc6_SBS,dpc7_SS
 +
 +
As Balazs used another naming scheme in his very useful schematic, we should also cross-reference his names.
 +
 +
{|
 +
| Y/SB
 +
|dpc0_YSB || drive sb from y
 +
|-
 +
| SB/Y
 +
|dpc1_SBY || load y from sb
 +
|-
 +
| X/SB
 +
|dpc2_XSB || drive sb from x
 +
|-
 +
| SB/X
 +
|dpc3_SBX || load x from sb
 +
|-
 +
| S/SB
 +
|dpc4_SSB || drive sb from stack pointer
 +
|-
 +
| S/ADL
 +
|dpc5_SADL || drive adl from stack pointer
 +
|-
 +
| SB/S
 +
|dpc6_SBS || load stack pointer from sb
 +
|-
 +
| S/S
 +
|dpc7_SS || recirculate stack pointer
 +
|-
 +
| notDB/ADD
 +
|dpc8_nDBADD || alu b side: select not-idb input
 +
|-
 +
| DB/ADD
 +
|dpc9_DBADD || alu b side: select idb input
 +
|-
 +
| ADL/ADD
 +
|dpc10_ADLADD || alu b side: select adl input
 +
|-
 +
| SB/ADD
 +
|dpc11_SBADD || alu a side: select sb
 +
|-
 +
| 0/ADD
 +
|dpc12_0ADD || alu a side: select zero
 +
|-
 +
| ORS
 +
|dpc13_ORS || alu op: a or b
 +
|-
 +
| SRS
 +
|dpc14_SRS || alu op: logical right shift
 +
|-
 +
| ANDS
 +
|dpc15_ANDS || alu op: a and b
 +
|-
 +
| EORS
 +
|dpc16_EORS || alu op: a xor b (?)
 +
|-
 +
| SUMS
 +
|dpc17_SUMS || alu op: a plus b (?)
 +
|-
 +
| DAA
 +
|dpc18_#DAA || decimal related (inverted)
 +
|-
 +
| ADD/SB(7)
 +
|dpc19_ADDSB7 || alu to sb bit 7 only
 +
|-
 +
| ADD/SB(0-6)
 +
|dpc20_ADDSB06 || alu to sb bits 6-0 only
 +
|-
 +
| ADD/ADL
 +
|dpc21_ADDADL || alu to adl
 +
|-
 +
| DSA
 +
|dpc22_#DSA || decimal related/SBC only (inverted)
 +
|-
 +
| SB/AC
 +
|dpc23_SBAC || (optionally decimal-adjusted) sb to acc
 +
|-
 +
| AC/SB
 +
|dpc24_ACSB || acc to sb
 +
|-
 +
| SB/DB
 +
|dpc25_SBDB || sb pass-connects to idb (bi-directionally)
 +
|-
 +
| AC/DB
 +
|dpc26_ACDB || acc to idb
 +
|-
 +
| SB/ADH
 +
|dpc27_SBADH || sb pass-connects to adh (bi-directionally)
 +
|-
 +
| 0/ADH0
 +
|dpc28_0ADH0 || zero to adh0 bit0 only
 +
|-
 +
| 0/ADH(1-7)
 +
|dpc29_0ADH17 || zero to adh bits 7-1 only
 +
|-
 +
| ADH/PCH
 +
|dpc30_ADHPCH || load pch from adh
 +
|-
 +
| PCH/PCH
 +
|dpc31_PCHPCH || load pch from pch incremented
 +
|-
 +
| PCH/ADH
 +
|dpc32_PCHADH || drive adh from pch incremented
 +
|-
 +
| PCH/DB
 +
|dpc33_PCHDB || drive idb from pch incremented
 +
|-
 +
| PCLC
 +
|dpc34_PCLC || pch carry in and pcl FF detect?
 +
|-
 +
| PCHC
 +
|dpc35_PCHC || pcl 0x?F detect - half-carry
 +
|-
 +
| I/PC
 +
|dpc36_#IPC || pcl carry in (inverted)
 +
|-
 +
| PCL/DB
 +
|dpc37_PCLDB || drive idb from pcl incremented
 +
|-
 +
| PCL/ADL
 +
|dpc38_PCLADL || drive adl from pcl incremented
 +
|-
 +
| PCL/PCL
 +
|dpc39_PCLPCL || load pcl from pcl incremented
 +
|-
 +
| ADL/PCL
 +
|dpc40_ADLPCL || load pcl from adl
 +
|-
 +
| DL/ADL
 +
|dpc41_DL/ADL || pass-connect adl to mux node driven by idl
 +
|-
 +
| DL/ADH
 +
|dpc42_DL/ADH || pass-connect adh to mux node driven by idl
 +
|-
 +
| DL/DB
 +
|dpc43_DL/DB || pass-connect idb to mux node driven by idl
 +
|-
 +
|}

Revision as of 11:23, 18 February 2011

This page discusses the 6502 datapath, using the terminology from Hanson's Block Diagram and is probably best understood by reference to it

We're interested in which datapath control signals are active in each of the two phases.

All datapath control signals are latched at the end of phi2, i.e. the start of a full cycle. We describe their timing from that point onward, working broadly from left to right. (Which is right to left on Balazs' schematic)

Contents

External busses and signals

DOR is latched from DB during phi1, and driven in phi2, if a write is done (and, on the 6501, when the asynchronous DBE is on).

DL is latched during phi2, and then put on ADL, ADH, or DB on the next phi1 and phi2.

ABL and ABH can be loaded from ADL and ADH respectively during phi1.

R/#W is set during phi1 as well.

Address values

ADL/ABL, ADH/ABH
We already saw these. Effective on phi1.
0/ADL0, 0/ADL1, 0/ADL2, 0/ADH0, 0/ADH(1-7)
These set the interrupt vector fetch address, and the zero page and stack high address. Effective on phi1 and phi2.


The register file

Y/SB, X/SB, SB/Y, SB/X
Move the X and Y registers from/to the SB. Effective on phi1.
SB/S, S/S, effective on phi1.
S/SB, S/ADL, effective on phi1 and phi2.
The S register is actually two latches in series. This makes it possible to read a value from SB and write a value to ADL at the same time. On phi2, the value from the "in" latch is forwarded to the "out" latch (and onto the driven bus, if any).

(Note the two "tuning fork" structures, which have contacts either on the top or bottom, which select whether X, Y, A write SB and DB only during phi1, or slightly longer, during "not phi2". We think this might be a timing fix, or an option left open until after silicon showed which choice worked best)

ALU inputs

SB/ADD, 0/ADD, nDB/ADD, DB/ADD, ADL/ADD
Two options for one side, three for the other. Effective on phi1.

ALU operation selection

ANDS, EORS, ORS, 1/ADDC, SRS, SUMS, DAA, DSA
Select the ALU operation. Effective on phi2 and the next phi1. During phi1 it will compute garbage.

(The overflow and carry out signals AVR and ACR are output from the ALU back to the control logic, latched at the end of phi2. The decimal carries are latched then as well).

ALU output register

The ALU output register (ADD) is written during phi2. The value can be used the next cycle:

ADD/SB7, ADD/SB(0-6), ADD/ADL, effective on phi1 and phi2.
The ADL output is for address calculations. For output to SB, the top bit is handled separately for rotate right instructions: the ALU always computes a zero there; by not driving it to the bus a one will be read.
SB/AC, effective on phi1.
Lines 1-3,5-7 are fed through the decimal adjust first, to finish the proper BCD add/subtract result if necessary, before writing it to the accumulator.
AC/SB, AC/DB, effective on phi1
write the A reg back to one of the busses.

The Program Counter

ADH/PCH, PCH/PCH, PCL/PCL, ADL/PCL
select whether to use the current PC, or take a new value from the internal address busses. Effective on phi1.
PCH/DB, PCL/DB, PCH/ADH, PCL/ADL
write the PC to one of the busses. Effective on phi1 and phi2. On phi1, it's the old value, on phi2, the new.
I/PC, effective during phi2 and the next phi1
increment the PC, or not.
P/DB
Write the flag values to the DB; effective on phi1 and phi2. The DB can be read to set the flag values as well; it is read during phi1.
SB/DB, SB/ADH
Connect two busses together. Effective on phi1 and phi2.

Precharge

Several of the internal busses are driven high during phi2, as a sort of precharge. In fact commonly they are also driven by data signals during phi2, causing an intermediate voltage to appear on the bus.

A note on signal naming

In our Javascript simulation the datapath control signals are tabulated according to Hanson's names, but in the layout they are named with a prefix according to their position across the chip. So

  • SSB, SADL, SBS, SS

will be found as

  • dpc4_SSB,dpc5_SADL,dpc6_SBS,dpc7_SS

As Balazs used another naming scheme in his very useful schematic, we should also cross-reference his names.

Y/SB dpc0_YSB drive sb from y
SB/Y dpc1_SBY load y from sb
X/SB dpc2_XSB drive sb from x
SB/X dpc3_SBX load x from sb
S/SB dpc4_SSB drive sb from stack pointer
S/ADL dpc5_SADL drive adl from stack pointer
SB/S dpc6_SBS load stack pointer from sb
S/S dpc7_SS recirculate stack pointer
notDB/ADD dpc8_nDBADD alu b side: select not-idb input
DB/ADD dpc9_DBADD alu b side: select idb input
ADL/ADD dpc10_ADLADD alu b side: select adl input
SB/ADD dpc11_SBADD alu a side: select sb
0/ADD dpc12_0ADD alu a side: select zero
ORS dpc13_ORS alu op: a or b
SRS dpc14_SRS alu op: logical right shift
ANDS dpc15_ANDS alu op: a and b
EORS dpc16_EORS alu op: a xor b (?)
SUMS dpc17_SUMS alu op: a plus b (?)
DAA dpc18_#DAA decimal related (inverted)
ADD/SB(7) dpc19_ADDSB7 alu to sb bit 7 only
ADD/SB(0-6) dpc20_ADDSB06 alu to sb bits 6-0 only
ADD/ADL dpc21_ADDADL alu to adl
DSA dpc22_#DSA decimal related/SBC only (inverted)
SB/AC dpc23_SBAC (optionally decimal-adjusted) sb to acc
AC/SB dpc24_ACSB acc to sb
SB/DB dpc25_SBDB sb pass-connects to idb (bi-directionally)
AC/DB dpc26_ACDB acc to idb
SB/ADH dpc27_SBADH sb pass-connects to adh (bi-directionally)
0/ADH0 dpc28_0ADH0 zero to adh0 bit0 only
0/ADH(1-7) dpc29_0ADH17 zero to adh bits 7-1 only
ADH/PCH dpc30_ADHPCH load pch from adh
PCH/PCH dpc31_PCHPCH load pch from pch incremented
PCH/ADH dpc32_PCHADH drive adh from pch incremented
PCH/DB dpc33_PCHDB drive idb from pch incremented
PCLC dpc34_PCLC pch carry in and pcl FF detect?
PCHC dpc35_PCHC pcl 0x?F detect - half-carry
I/PC dpc36_#IPC pcl carry in (inverted)
PCL/DB dpc37_PCLDB drive idb from pcl incremented
PCL/ADL dpc38_PCLADL drive adl from pcl incremented
PCL/PCL dpc39_PCLPCL load pcl from pcl incremented
ADL/PCL dpc40_ADLPCL load pcl from adl
DL/ADL dpc41_DL/ADL pass-connect adl to mux node driven by idl
DL/ADH dpc42_DL/ADH pass-connect adh to mux node driven by idl
DL/DB dpc43_DL/DB pass-connect idb to mux node driven by idl
Personal tools