DIP-40에 있는 6502 칩. 4자리 날짜 코드는 1985년 45주차(11월) 생산을 의미함. | |
| 생산 | 1975년 |
|---|---|
| 주요 제조사 | |
| 최대 CPU 클럭 속도 | 1 MHz ~ 3 MHz |
| 명령어 집합 | MOS 6502 |
| 트랜지스터 | 3,510, 3,218 |
| 데이터 폭 | 8비트 |
| 주소 폭 | 16비트 |
| 이전 모델 |
|
| 후속 모델 | |
| 패키지 |
|
MOS 6502는 모스 테크놀로지사의 8비트 MPU이다. 모토로라의 6809계열의 CPU로 분류되며 명칭 또한 인텔 계열이 CPU(중앙 처리 장치)라는 단어를 사용한 데 반해, 모토로라 계열은 MPU(Main Processing Unit)라는 용어를 사용한다.
프로세서 레지스터 개수가 인텔 계열의 CPU에 비해 적으나, 제로 페이지라는 메모리 에리어 중 특수한 영역을 임시 기억공간으로 활용하여 프로세서 레지스터 부족분을 메운다. 입출력을 위한 주소 공간이 별도로 준비되어 있지 않기 때문에 메인 메모리의 일정 부분을 입출력으로 사용하는 메모리 맵 입출력 방식으로 동작한다.
각 명령어는 주소 지정 모드에 따라 다른 수의 클럭 사이클이 필요하다:
모든 분기 명령어는 상대 주소 모드를 사용하며, 조건이 참일 때 -128~+127 범위로 점프한다.
| 색상 | 주소 지정 모드 | 약어 | 설명 | 예시 |
|---|---|---|---|---|
| 연한 빨강 | Implied | impl | 명령어 자체에 피연산자가 내포됨 | CLC (캐리 플래그 클리어) |
| 노랑 | Accumulator | A | 누산기(A)를 피연산자로 사용 | ASL A (누산기 왼쪽 시프트) |
| 연한 초록 | Immediate | imm | 명령어 바로 다음 바이트가 값 | LDA #$42 (A에 $42 로드) |
| 연한 주황 | Zero Page | zpg | $0000-$00FF 범위의 주소 (1바이트) | LDA $80 (주소 $0080의 값 로드) |
| 주황 | Zero Page,X | zpg,X | Zero Page 주소에 X 레지스터 값 더함 | LDA $80,X ($0080+X 주소의 값) |
| 진한 주황 | Zero Page,Y | zpg,Y | Zero Page 주소에 Y 레지스터 값 더함 | LDX $80,Y ($0080+Y 주소의 값) |
| 연한 파랑 | Absolute | abs | 16비트 절대 주소 (2바이트) | LDA $1234 (주소 $1234의 값 로드) |
| 파랑 | Absolute,X | abs,X | 절대 주소에 X 레지스터 값 더함 | LDA $1234,X ($1234+X 주소의 값) |
| 파랑 | Absolute,Y | abs,Y | 절대 주소에 Y 레지스터 값 더함 | LDA $1234,Y ($1234+Y 주소의 값) |
| 하늘색 | Indexed Indirect | X,ind | (Zero Page + X) 주소에서 16비트 주소 읽음 | LDA ($80,X) (($80+X) 위치의 포인터가 가리키는 값) |
| 진한 하늘색 | Indirect Indexed | ind,Y | Zero Page 주소에서 16비트 주소 읽고 Y 더함 | LDA ($80),Y (($80) 포인터 + Y가 가리키는 값) |
| 보라 | Indirect | ind | 주소가 가리키는 곳에서 16비트 주소 읽음 (JMP만 사용) | JMP ($1234) ($1234 위치의 포인터로 점프) |
| 분홍 | Relative | rel | 현재 PC 기준 상대 오프셋 (-128~+127) | BNE $10 (0이 아니면 PC+$10으로 분기) |
| 회색 | — | — | 미정의/비공식 opcode | — |
| x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0x | BRK impl |
ORA X,ind |
— | — | — | ORA zpg |
ASL zpg |
— | PHP impl |
ORA imm |
ASL A |
— | — | ORA abs |
ASL abs |
— |
| 1x | BPL rel |
ORA ind,Y |
— | — | — | ORA zpg,X |
ASL zpg,X |
— | CLC impl |
ORA abs,Y |
— | — | — | ORA abs,X |
ASL abs,X |
— |
| 2x | JSR abs |
AND X,ind |
— | — | BIT zpg |
AND zpg |
ROL zpg |
— | PLP impl |
AND imm |
ROL A |
— | BIT abs |
AND abs |
ROL abs |
— |
| 3x | BMI rel |
AND ind,Y |
— | — | — | AND zpg,X |
ROL zpg,X |
— | SEC impl |
AND abs,Y |
— | — | — | AND abs,X |
ROL abs,X |
— |
| 4x | RTI impl |
EOR X,ind |
— | — | — | EOR zpg |
LSR zpg |
— | PHA impl |
EOR imm |
LSR A |
— | JMP abs |
EOR abs |
LSR abs |
— |
| 5x | BVC rel |
EOR ind,Y |
— | — | — | EOR zpg,X |
LSR zpg,X |
— | CLI impl |
EOR abs,Y |
— | — | — | EOR abs,X |
LSR abs,X |
— |
| 6x | RTS impl |
ADC X,ind |
— | — | — | ADC zpg |
ROR zpg |
— | PLA impl |
ADC imm |
ROR A |
— | JMP ind |
ADC abs |
ROR abs |
— |
| 7x | BVS rel |
ADC ind,Y |
— | — | — | ADC zpg,X |
ROR zpg,X |
— | SEI impl |
ADC abs,Y |
— | — | — | ADC abs,X |
ROR abs,X |
— |
| 8x | — | STA X,ind |
— | — | STY zpg |
STA zpg |
STX zpg |
— | DEY impl |
— | TXA impl |
— | STY abs |
STA abs |
STX abs |
— |
| 9x | BCC rel |
STA ind,Y |
— | — | STY zpg,X |
STA zpg,X |
STX zpg,Y |
— | TYA impl |
STA abs,Y |
TXS impl |
— | — | STA abs,X |
— | — |
| Ax | LDY imm |
LDA X,ind |
LDX imm |
— | LDY zpg |
LDA zpg |
LDX zpg |
— | TAY impl |
LDA imm |
TAX impl |
— | LDY abs |
LDA abs |
LDX abs |
— |
| Bx | BCS rel |
LDA ind,Y |
— | — | LDY zpg,X |
LDA zpg,X |
LDX zpg,Y |
— | CLV impl |
LDA abs,Y |
TSX impl |
— | LDY abs,X |
LDA abs,X |
LDX abs,Y |
— |
| Cx | CPY imm |
CMP X,ind |
— | — | CPY zpg |
CMP zpg |
DEC zpg |
— | INY impl |
CMP imm |
DEX impl |
— | CPY abs |
CMP abs |
DEC abs |
— |
| Dx | BNE rel |
CMP ind,Y |
— | — | — | CMP zpg,X |
DEC zpg,X |
— | CLD impl |
CMP abs,Y |
— | — | — | CMP abs,X |
DEC abs,X |
— |
| Ex | CPX imm |
SBC X,ind |
— | — | CPX zpg |
SBC zpg |
INC zpg |
— | INX impl |
SBC imm |
NOP impl |
— | CPX abs |
SBC abs |
INC abs |
— |
| Fx | BEQ rel |
SBC ind,Y |
— | — | — | SBC zpg,X |
INC zpg,X |
— | SED impl |
SBC abs,Y |
— | — | — | SBC abs,X |
INC abs,X |
— |
다음 표는 NMOS 6502의 256개 opcode를 모두 포함한다. 진한 회색으로 표시된 명령어들은 MOS Technology가 공식적으로 문서화하지 않은 opcode이다. 이들은 NMOS 6502의 내부 논리 회로 특성으로 인해 작동하며, 일부는 유용한 기능을 제공한다. CMOS 버전인 65C02와 후속 프로세서인 WDC 65816에서는 대부분의 비공식 명령어가 작동하지 않으며, 공식 NOP로 대체되거나 새로운 명령어로 할당되었다.
주요 비공식 명령어:
| x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0x | BRK impl |
ORA X,ind |
JAM | SLO X,ind |
NOP zpg |
ORA zpg |
ASL zpg |
SLO zpg |
PHP impl |
ORA imm |
ASL A |
ANC imm |
NOP abs |
ORA abs |
ASL abs |
SLO abs |
| 1x | BPL rel |
ORA ind,Y |
JAM | SLO ind,Y |
NOP zpg,X |
ORA zpg,X |
ASL zpg,X |
SLO zpg,X |
CLC impl |
ORA abs,Y |
NOP impl |
SLO abs,Y |
NOP abs,X |
ORA abs,X |
ASL abs,X |
SLO abs,X |
| 2x | JSR abs |
AND X,ind |
JAM | RLA X,ind |
BIT zpg |
AND zpg |
ROL zpg |
RLA zpg |
PLP impl |
AND imm |
ROL A |
ANC imm |
BIT abs |
AND abs |
ROL abs |
RLA abs |
| 3x | BMI rel |
AND ind,Y |
JAM | RLA ind,Y |
NOP zpg,X |
AND zpg,X |
ROL zpg,X |
RLA zpg,X |
SEC impl |
AND abs,Y |
NOP impl |
RLA abs,Y |
NOP abs,X |
AND abs,X |
ROL abs,X |
RLA abs,X |
| 4x | RTI impl |
EOR X,ind |
JAM | SRE X,ind |
NOP zpg |
EOR zpg |
LSR zpg |
SRE zpg |
PHA impl |
EOR imm |
LSR A |
ALR imm |
JMP abs |
EOR abs |
LSR abs |
SRE abs |
| 5x | BVC rel |
EOR ind,Y |
JAM | SRE ind,Y |
NOP zpg,X |
EOR zpg,X |
LSR zpg,X |
SRE zpg,X |
CLI impl |
EOR abs,Y |
NOP impl |
SRE abs,Y |
NOP abs,X |
EOR abs,X |
LSR abs,X |
SRE abs,X |
| 6x | RTS impl |
ADC X,ind |
JAM | RRA X,ind |
NOP zpg |
ADC zpg |
ROR zpg |
RRA zpg |
PLA impl |
ADC imm |
ROR A |
ARR imm |
JMP ind |
ADC abs |
ROR abs |
RRA abs |
| 7x | BVS rel |
ADC ind,Y |
JAM | RRA ind,Y |
NOP zpg,X |
ADC zpg,X |
ROR zpg,X |
RRA zpg,X |
SEI impl |
ADC abs,Y |
NOP impl |
RRA abs,Y |
NOP abs,X |
ADC abs,X |
ROR abs,X |
RRA abs,X |
| 8x | NOP imm |
STA X,ind |
NOP imm |
SAX X,ind |
STY zpg |
STA zpg |
STX zpg |
SAX zpg |
DEY impl |
NOP imm |
TXA impl |
ANE imm |
STY abs |
STA abs |
STX abs |
SAX abs |
| 9x | BCC rel |
STA ind,Y |
JAM | SHA ind,Y |
STY zpg,X |
STA zpg,X |
STX zpg,Y |
SAX zpg,Y |
TYA impl |
STA abs,Y |
TXS impl |
TAS abs,Y |
SHY abs,X |
STA abs,X |
SHX abs,Y |
SHA abs,Y |
| Ax | LDY imm |
LDA X,ind |
LDX imm |
LAX X,ind |
LDY zpg |
LDA zpg |
LDX zpg |
LAX zpg |
TAY impl |
LDA imm |
TAX impl |
LXA imm |
LDY abs |
LDA abs |
LDX abs |
LAX abs |
| Bx | BCS rel |
LDA ind,Y |
JAM | LAX ind,Y |
LDY zpg,X |
LDA zpg,X |
LDX zpg,Y |
LAX zpg,Y |
CLV impl |
LDA abs,Y |
TSX impl |
LAS abs,Y |
LDY abs,X |
LDA abs,X |
LDX abs,Y |
LAX abs,Y |
| Cx | CPY imm |
CMP X,ind |
NOP imm |
DCP X,ind |
CPY zpg |
CMP zpg |
DEC zpg |
DCP zpg |
INY impl |
CMP imm |
DEX impl |
SBX imm |
CPY abs |
CMP abs |
DEC abs |
DCP abs |
| Dx | BNE rel |
CMP ind,Y |
JAM | DCP ind,Y |
NOP zpg,X |
CMP zpg,X |
DEC zpg,X |
DCP zpg,X |
CLD impl |
CMP abs,Y |
NOP impl |
DCP abs,Y |
NOP abs,X |
CMP abs,X |
DEC abs,X |
DCP abs,X |
| Ex | CPX imm |
SBC X,ind |
NOP imm |
ISC X,ind |
CPX zpg |
SBC zpg |
INC zpg |
ISC zpg |
INX impl |
SBC imm |
NOP impl |
USBC imm |
CPX abs |
SBC abs |
INC abs |
ISC abs |
| Fx | BEQ rel |
SBC ind,Y |
JAM | ISC ind,Y |
NOP zpg,X |
SBC zpg,X |
INC zpg,X |
ISC zpg,X |
SED impl |
SBC abs,Y |
NOP impl |
ISC abs,Y |
NOP abs,X |
SBC abs,X |
INC abs,X |
ISC abs,X |
; TOLOWER:
;
; Convert a null-terminated character string to all lower case.
; Maximum string length is 255 characters, plus the null term-
; inator.
;
; Parameters:
;
; SRC - Source string address
; DST - Destination string address
;
ORG $0080
;
0080 00 04 SRC .WORD $0400 ;source string pointer ($40)
0082 00 05 DST .WORD $0500 ;destination string pointer ($42)
;
0600 ORG $0600 ;execution start address
;
0600 A0 00 TOLOWER LDY #$00 ;starting index
;
0602 B1 80 LOOP LDA (SRC),Y ;get from source string
0604 F0 11 BEQ DONE ;end of string
;
0606 C9 41 CMP #'A' ;if lower than UC alphabet...
0608 90 06 BCC SKIP ;copy unchanged
;
060A C9 5B CMP #'Z'+1 ;if greater than UC alphabet...
060C B0 02 BCS SKIP ;copy unchanged
;
060E 09 20 ORA #%00100000 ;convert to lower case
;
0610 91 82 SKIP STA (DST),Y ;store to destination string
0612 C8 INY ;bump index
0613 D0 ED BNE LOOP ;next character
;
; NOTE: If .Y wraps the destination string will be left in an undefined
; state. We set carry to indicate this to the calling function.
;
0615 38 SEC ;report string too long error &...
0616 60 RTS ;return to caller
;
0617 91 82 DONE STA (DST),Y ;terminate destination string
0618 18 CLC ;report conversion completed &...
0619 60 RTS ;return to caller
;
.END