μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό ν™œμ„±ν™” ν•΄μ£Όμ„Έμš”

Nintendo Entertainment System - CPU

 ·   ·  β˜• 10 min read  ·  ✍️ Yogo

Nintendo Entertainment System

NesDev Wiki1와 Nintendo Entertainment System Documentation2 λ¬Έμ„œλ₯Ό 기반으둜 NES μ‹œμŠ€ν…œμ„ 정리 ν•˜κ³ μž ν•©λ‹ˆλ‹€. ν•΄λ‹Ή λ¬Έμ„œμ—μ„œλŠ” ν•˜λ“œμ›¨μ–΄ 및 ν”„λ‘œμ„Έμ„œμ— λŒ€ν•œ λ‚΄μš©μ„ 많이 λ‹΄κ³  μžˆμ–΄μ„œ 이해λ₯Ό μœ„ν•΄μ„œλŠ” 기본적인 마이크둜 ν”„λ‘œμ„Έμ„œμ— λŒ€ν•œ 지식이 μš”κ΅¬λ©λ‹ˆλ‹€.

λ¬Έμ œκ°€ λ°œμƒν•  경우 ν•΄λ‹Ή ν¬μŠ€νŠΈλŠ” μ‚­μ œ λ˜λŠ” λΉ„κ³΅κ°œ 처리 λ©λ‹ˆλ‹€.

CPU μ˜€λ²„λ·°

메인 CPUλŠ” Richo 2A033 8λΉ„νŠΈ ν”„λ‘œμ„Έμ„œλ‘œ BCD λͺ¨λ“œλ₯Ό μ œκ±°ν•œ 6502 코어에 22개의 λ©”λͺ¨λ¦¬ 맡 I/O λ ˆμ§€μŠ€ν„°λ₯Ό 가지고 있으며 PSG(Programmable Sound Generator) μ‚¬μš΄λ“œ, DMA, κ²Œμž„ 컨트둀러 폴링 λ“±μ˜ κΈ°λŠ₯을 μΆ”κ°€ ν•œ CPU μž…λ‹ˆλ‹€.

λ™μž‘μ€ NTSC λͺ¨λ“œμ—μ„œ 1.79MHz, PAL λͺ¨λ“œμ—μ„œλŠ” 1.66 MHz μ†λ„λ‘œ λ™μž‘ν•˜λ©°, λ¦¬ν‹€μ—”λ””μ•ˆμ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

2kB의 μ˜¨λ³΄λ“œ λž¨μ„ ν¬ν•¨ν•˜κ³  있으며, μΉ΄νŠΈλ¦¬μ§€λ₯Ό ν†΅ν•΄μ„œ μ΅œλŒ€ 8k ~ 1MB κΉŒμ§€ ν™•μž₯된 λž¨μ„ μ‚¬μš©ν•  수 있으며 λŒ€λΆ€λΆ„ 128 ~ 384kBλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

κ·Έλž˜ν”½ 처리λ₯Ό μœ„ν•΄μ„œ λ³„λ„μ˜ PPU(Picture Processing Unit)을 μ‚¬μš©ν•˜λ©° 2kB의 λΉ„λ””μ˜€λž¨, 256B의 OAM(Object Attribute Memory)둜 μ΅œλŒ€ 64개 μŠ€ν”„λΌμ΄νŠΈ μœ„μΉ˜, 색상 및 타일 인덱슀λ₯Ό μ €μž₯ν•˜κ³ , 28 λ°”μ΄νŠΈμ˜ 온-닀이 νŒ”λ ˆνŠΈ λž¨μ€ λ°°κ²½κ³Ό μŠ€ν”„λΌμ΄νŠΈ 색을 선택할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ½˜μ†”μ˜ 2kB μ˜¨λ³΄λ“œ λž¨μ€ 타일 맡 및 속성에 μ‚¬μš©λ  수 있으며, 8kB의 타일 νŒ¨ν„΄ 둬 λ˜λŠ” 램이 μΉ΄νŠΈλ¦¬μ§€μ— 포함 될 수 μžˆμŠ΅λ‹ˆλ‹€.

μ‹œμŠ€ν…œμ€ 48개 색상과 6개의 그레이 νŒ”λ ˆνŠΈλ₯Ό μ‚¬μš©ν•  수 있으며, 쀑간 ν”„λ ˆμž„μ— μƒˆ 값을 쓰지 μ•Šκ³  μ΅œλŒ€ 25개 색을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
(배경색, 3가지 타일 색상 4μ„ΈνŠΈ, 3가지 μŠ€ν”„λΌμ΄νŠΈ 색상 4μ„ΈνŠΈ)

NES의 νŒ”λ ˆνŠΈλŠ” RGBκ°€μ•„λ‹Œ NTSCλ₯Ό 기반으둜 ν•˜λ©°, ν™”λ©΄ 쀑간에 μŠ€ν”„λΌμ΄νŠΈλ₯Ό λ‹€μ‹œ λ‘œλ“œν•˜μ§€ μ•Šκ³  총 64 개의 μŠ€ν”„λΌμ΄νŠΈλ₯Ό 화면에 ν‘œμ‹œ ν•  수 μžˆλ‹€. NES의 ν‘œμ€€ λ””μŠ€ν”Œλ ˆμ΄ ν•΄μƒλ„λŠ” 256 x 240 ν”½μ…€λ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€.

CPU λ©”λͺ¨λ¦¬ 맡

2A03은 16λΉ„νŠΈ μ–΄λ“œλ ˆμŠ€ λ²„μŠ€λ₯Ό 가지고 있고, $0000-$ffff의 μ£Όμ†Œλ‘œ 64kB λ©”λͺ¨λ¦¬λ₯Ό 지원할 수 μžˆμŠ΅λ‹ˆλ‹€.

Zero PageλŠ” $0000-$00FFλ₯Ό μ°Έμ‘° ν•©λ‹ˆλ‹€. 이 μ˜μ—­μ€ λ©”λͺ¨λ¦¬μ˜ 첫 νŽ˜μ΄μ§€μ΄μž λΉ λ₯Έ 싀행을 μœ„ν•œ λͺ…ν™•ν•œ μ–΄λ“œλ ˆμ‹± λͺ¨λ“œμ— μ˜ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€. λ©”λͺ¨λ¦¬ μ˜μ—­ 쀑 $0000-$07FFλŠ” $0800-$1FFFμ—μ„œ μ„Έλ²ˆ 미러링 λ©λ‹ˆλ‹€. 이것은 $0000 에 μ–΄λ–€ 데이터λ₯Ό κΈ°λ‘ν•˜λ©΄ $0800, $1000, $1800 에도 기둝이 λœλ‹€λŠ” 의미이며 $2000-$401F에 μœ„μΉ˜ν•œ I/O λ ˆμ§€μŠ€ν„°λ„ 8k λ§ˆλ‹€ $2008-$3FFFμ΄λ‚˜ 남은 λ ˆμ§€μŠ€ν„° μ˜μ—­μ— 미러링 λ©λ‹ˆλ‹€. SRAM(WRAM)은 Save RAM이고, μΉ΄νŠΈλ¦¬μ§€ λ‚΄ κ²Œμž„ μ €μž₯을 μœ„ν•œ RAM에 μ—‘μ„ΈμŠ€ ν•˜κΈ° μœ„ν•΄ μ‚¬μš© λ©λ‹ˆλ‹€.

$8000 λΆ€ν„°λŠ” μΉ΄νŠΈλ¦¬μ§€ PRG-ROM에 μœ„μΉ˜ν•œ μ–΄λ“œλ ˆμŠ€ μž…λ‹ˆλ‹€. PPG-ROM 16KB 뱅크가 였직 ν•˜λ‚˜μΈ κ²Œμž„μ€ $8000κ³Ό $C000에 λͺ¨λ‘ λ‘œλ“œ 되고, 2개의 PPG-ROM 16KB 뱅크λ₯Ό 가진 κ²Œμž„μ€ ν•˜λ‚˜λŠ” $8000, λ‚˜λ¨Έμ§€λŠ” $C000에 λ‘œλ“œ λ©λ‹ˆλ‹€. 2개 μ΄μƒμ˜ 뱅크λ₯Ό 가진 κ²Œμž„μ€ μ–΄λŠ 뱅크에 λ‘œλ“œ ν•  것인 κ²°μ •ν•˜κΈ° μœ„ν•΄μ„œ λ©”λͺ¨λ¦¬ 맀퍼λ₯Ό μ΄μš©ν•©λ‹ˆλ‹€. λ©”λͺ¨λ¦¬ λ§€νΌλŠ” νŠΉμ • μ£Όμ†Œ(λ˜λŠ” λ²”μœ„)에 λ©”λͺ¨λ¦¬κ°€ κΈ°λ‘λ˜λŠ” 것을 κ°μ‹œν•˜κ³  λ©”λͺ¨λ¦¬κ°€ 기둝 될 λ•Œ 뱅크λ₯Ό μŠ€μœ„μΉ­ ν•©λ‹ˆλ‹€.

// CPU λ©”λͺ¨λ¦¬ 맡
+--------------------+ $10000       +--------------------+ $10000
|                    |              |                    |
|                    |              |     PPG-ROM        |
|                    |              |     Upper Bank     |
|                    |              |                    |
|      PPG-ROM       |              +--------------------+ $C000
|                    |              |                    |
|                    |              |     PPG-ROM        |
|                    |              |     Lower Bank     |
|                    |              |                    |
+--------------------+ $8000        +--------------------+ $8000
|        SRAM        |              |        SRAM        |
+--------------------+ $6000        +--------------------+ $6000
|   Expansion ROM    |              |   Expansion ROM    |
+--------------------+ $4020        +--------------------+ $4020
|                    |              |   I/O Registers    |
|                    |              +--------------------+ $4000
|                    |              |                    |
|   I/O Registers    |              |       Mirrors      |
|                    |              |     $2000-$2007    |
|                    |              |                    |
|                    |              +--------------------+ $2008   
|                    |              |   I/O Registers    |
+--------------------+ $2000        +--------------------+ $2000   
|                    |              |                    |
|                    |              |       Mirrors      |
|                    |              |     $0000-$07FF    |
|                    |              |                    |
|        RAM         |              +--------------------+ $0800
|                    |              |        RAM         |
|                    |              +--------------------+ $0200
|                    |              |       Stack        |
|                    |              +--------------------+ $0100
|                    |              |      Zero Page     |
+--------------------+ $0000        +--------------------+ $0000
  • λ©”λͺ¨λ¦¬ 맡 ν…Œμ΄λΈ”4
Address range Size Device
$0000-$07FF $0800 2KB internal RAM
$0800-$0FFF $0800 Mirrors of $0000-$07FF
$1000-$17FF $0800 Mirrors of $0000-$07FF
$1800-$1FFF $0800 Mirrors of $0000-$07FF
$2000-$2007 $0008 NES PPU registers
$2008-$3FFF $1FF8 Mirrors of $2000-2007 (repeats every 8 bytes)
$4000-$4017 $0018 NES APU and I/O registers
$4018-$401F $0008 APU and I/O functionality that is normally disabled. See CPU Test Mode.
$4020-$FFFF $BFE0 Cartridge space: PRG ROM, PRG RAM, and mapper registers (See Note)
  • μΉ΄νŠΈλ¦¬μ§€ 곡간 λ§ˆμ§€λ§‰ 뢀뢄에 μΈν„°λŸ½νŠΈ 벑터 μœ„μΉ˜
    $FFFA-$FFFB = NMI vector
    $FFFC-$FFFD = Reset vector
    $FFFE-$FFFF = IRQ/BRK vector

λ ˆμ§€μŠ€ν„°

6502λŠ” μœ μ‚¬ν•œ ν”„λ‘œμ„Έμ„œλ³΄λ‹€ 적은 수의 λ ˆμ§€μŠ€ν„°λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€. μ„Έ 가지 특수 λͺ©μ  λ ˆμ§€μŠ€ν„°, 즉 ν”„λ‘œκ·Έλž¨ μΉ΄μš΄ν„°, μŠ€νƒ 포인터 및 μƒνƒœ λ ˆμ§€μŠ€ν„°κ°€ 있으며 각각 νŠΉμ • μš©λ„λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ 3개의 λ²”μš© λ ˆμ§€μŠ€ν„°, λˆ„μ‚°κΈ° 및 인덱슀 λ ˆμ§€μŠ€ν„° X, Yκ°€ μžˆμŠ΅λ‹ˆλ‹€. 데이터λ₯Ό μž„μ‹œλ‘œ μ €μž₯ν•˜κ±°λ‚˜ 정보λ₯Ό μ œμ–΄ν•˜λŠ” 데 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν”„λ‘œκ·Έλž¨ μΉ΄μš΄ν„°(PC)

ν”„λ‘œκ·Έλž¨ μΉ΄μš΄ν„°λŠ” λ‹€μŒμ— μ‹€ν–‰ν•  λͺ…λ Ήμ–΄μ˜ μ£Όμ†Œλ₯Ό μ €μž₯ν•˜λŠ” 16λΉ„νŠΈ λ ˆμ§€μŠ€ν„°μž…λ‹ˆλ‹€. λͺ…λ Ήμ–΄κ°€ μ‹€ν–‰λ˜λ©΄ ν”„λ‘œκ·Έλž¨ μΉ΄μš΄ν„°μ˜ 값이 μ—…λ°μ΄νŠΈλ˜λ©° 일반적으둜 μ‹œν€€μŠ€μ˜ λ‹€μŒ λͺ…λ Ήμ–΄λ‘œ μ΄λ™ν•©λ‹ˆλ‹€. 값은 λΆ„κΈ° 및 점프 λͺ…λ Ή, ν”„λ‘œμ‹œμ € 호좜 및 μΈν„°λŸ½νŠΈμ˜ 영ν–₯을 받을 수 μžˆμŠ΅λ‹ˆλ‹€.

μŠ€νƒ 포인터(SP)

μŠ€νƒμ€ $0100-$01FF λ©”λͺ¨λ¦¬ μœ„μΉ˜μ— μžˆμŠ΅λ‹ˆλ‹€. μŠ€νƒ ν¬μΈν„°λŠ” $0100μ—μ„œ μ˜€ν”„μ…‹ 역할을 ν•˜λŠ” 8λΉ„νŠΈ λ ˆμ§€μŠ€ν„°μž…λ‹ˆλ‹€. μŠ€νƒμ€ ν•˜ν–₯μ‹μœΌλ‘œ μž‘λ™ν•˜λ―€λ‘œ λ°”μ΄νŠΈκ°€ μŠ€νƒμ— ν‘Έμ‹œλ˜λ©΄ μŠ€νƒ 포인터가 κ°μ†Œν•˜κ³  μŠ€νƒμ—μ„œ λ°”μ΄νŠΈλ₯Ό κ°€μ Έμ˜€λ©΄ μŠ€νƒ 포인터가 μ¦κ°€ν•©λ‹ˆλ‹€. μŠ€νƒ μ˜μ—­μ„ μ΄ˆκ³Όν•˜λŠ” 경우 λ³„λ„λ‘œ μ˜€λ²„ν”Œλ‘œμš°κ°€ κ°μ§€λ˜μ§€ μ•Šκ³  μŠ€νƒ 포인터가 $00μ—μ„œ $FF둜 μˆœν™˜ λ©λ‹ˆλ‹€.

λˆ„μ‚°κΈ°(A)

λˆ„μ‚°κΈ°λŠ” μ‚°μˆ  및 논리 μ—°μ‚°μ˜ κ²°κ³Όλ₯Ό μ €μž₯ν•˜λŠ” 8λΉ„νŠΈ λ ˆμ§€μŠ€ν„°μž…λ‹ˆλ‹€. λˆ„μ‚°κΈ°λŠ” λ©”λͺ¨λ¦¬μ—μ„œ 쑰회된 κ°’μœΌλ‘œ μ„€μ •ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

인덱슀 λ ˆμ§€μŠ€ν„° X(X)

X λ ˆμ§€μŠ€ν„°λŠ” 일반적으둜 νŠΉμ • μ£Όμ†Œ 지정 λͺ¨λ“œμ— λŒ€ν•œ μΉ΄μš΄ν„° λ˜λŠ” μ˜€ν”„μ…‹μœΌλ‘œ μ‚¬μš©λ˜λŠ” 8λΉ„νŠΈ λ ˆμ§€μŠ€ν„°μž…λ‹ˆλ‹€. X λ ˆμ§€μŠ€ν„°λŠ” λ©”λͺ¨λ¦¬μ—μ„œ 쑰회된 κ°’μœΌλ‘œ μ„€μ •ν•  수 있으며 μŠ€νƒ ν¬μΈν„°μ˜ 값을 κ°€μ Έμ˜€κ±°λ‚˜ μ„€μ •ν•˜λŠ” 데 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

인덱슀 λ ˆμ§€μŠ€ν„° Y(Y)

Y λ ˆμ§€μŠ€ν„°λŠ” X λ ˆμ§€μŠ€ν„°μ™€ 같은 λ°©μ‹μœΌλ‘œ μΉ΄μš΄ν„°λ‘œ μ‚¬μš©λ˜κ±°λ‚˜ μ˜€ν”„μ…‹μ„ μ €μž₯ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” 8λΉ„νŠΈ λ ˆμ§€μŠ€ν„°μž…λ‹ˆλ‹€. X λ ˆμ§€μŠ€ν„°μ™€ 달리 Y λ ˆμ§€μŠ€ν„°λŠ” μŠ€νƒ 포인터에 영ν–₯을 쀄 수 μ—†μŠ΅λ‹ˆλ‹€.

μƒνƒœ λ ˆμ§€μŠ€ν„° (P)

μƒνƒœ λ ˆμ§€μŠ€ν„°λŠ” 연산이 μ‹€ν–‰ 될 λ•Œλ§ˆλ‹€ μ„ΈνŠΈ λ˜λŠ” 클리어 λ˜λŠ” λΉ„νŠΈ ν”Œλž˜κ·Έλ“€μ˜ μ§‘ν•©μœΌλ‘œ κ΅¬μ„±λ˜λŠ” λ ˆμ§€μŠ€ν„° μž…λ‹ˆλ‹€.

  • Carry Flag (C) - λ§ˆμ§€λ§‰ λͺ…λ Ήμ–΄κ°€ λΉ„νŠΈ 7μ—μ„œ μ˜€λ²„ν”Œλ‘œμš°(overflow) λ˜λŠ” λΉ„νŠΈ 0μ—μ„œ μ–Έλ”ν”Œλ‘œμš°(underflow)κ°€ λ°œμƒν•œ 경우 캐리 ν”Œλž˜κ·Έκ°€ μ„ΈνŠΈλ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 255 + 1을 μˆ˜ν–‰ν•˜λ©΄ κ²°κ³ΌλŠ” 0이 되고 캐리 λΉ„νŠΈλŠ” μ„ΈνŠΈκ°€ λ©λ‹ˆλ‹€. 이λ₯Ό 톡해 μ‹œμŠ€ν…œμ€ 첫 번째 λ°”μ΄νŠΈμ—μ„œ 계산을 μˆ˜ν–‰ν•˜κ³  캐리λ₯Ό μ €μž₯ν•œ λ‹€μŒ 두 번째 λ°”μ΄νŠΈμ—μ„œ 계산을 μˆ˜ν–‰ν•  λ•Œ ν•΄λ‹Ή 캐리λ₯Ό μ‚¬μš©ν•˜μ—¬ 8λΉ„νŠΈλ³΄λ‹€ κΈ΄ μˆ«μžμ— λŒ€ν•œ 계산을 μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 캐리 ν”Œλž˜κ·ΈλŠ” SEC(Set Carry Flag) λͺ…λ ΉμœΌλ‘œ μ„€μ •ν•˜κ³  CLC(Clear Carry) λͺ…λ ΉμœΌλ‘œ Clearν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • Zero Flag(Z) - λ§ˆμ§€λ§‰ λͺ…λ Ήμ–΄μ˜ κ²°κ³Όκ°€ 0인 경우 제둜 ν”Œλž˜κ·Έκ°€ μ„ΈνŠΈλ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 128 - 127은 0 ν”Œλž˜κ·Έλ₯Ό μ„ΈνŠΈ λ˜μ§€ μ•ŠλŠ” 반면 128 - 128은 μ„ΈνŠΈν•©λ‹ˆλ‹€.

  • Interrup Disable (I) - μΈν„°λŸ½νŠΈ λΉ„ν™œμ„±ν™” ν”Œλž˜κ·ΈλŠ” μ‹œμŠ€ν…œμ΄ IRQ에 μ‘λ‹΅ν•˜λŠ” 것을 λ°©μ§€ν•˜λŠ” 데 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이것은 SEI(Set Interrupt Disable) λͺ…령에 μ˜ν•΄ μ„€μ •λ˜κ³  IRQλŠ” CLI(Clear Interrupt Disable) λͺ…령이 싀행될 λ•ŒκΉŒμ§€ λ¬΄μ‹œλ©λ‹ˆλ‹€.

  • Decimal Mode (D) - 10μ§„μˆ˜ λͺ¨λ“œ ν”Œλž˜κ·ΈλŠ” 6502λ₯Ό BCD λͺ¨λ“œλ‘œ μ „ν™˜ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. 이 ν”Œλž˜κ·ΈλŠ” SED(Set Decimal Flag) λͺ…λ ΉμœΌλ‘œ μ„€μ •ν•˜κ³  CLD(Clear Decimal Flag)에 μ˜ν•΄ 클리어 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. (NES용 6502μ—μ„œλŠ” μ‚¬μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€)

  • Break Command (B) - BRK(Break) λͺ…령이 μ‹€ν–‰λ˜μ–΄ IRQκ°€ λ°œμƒν–ˆμŒμ„ λ‚˜νƒ€λ‚΄λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.

  • Overflow Flag (V) - 이전 λͺ…λ Ήμ–΄μ—μ„œ 잘λͺ»λœ 2의 보수 κ²°κ³Όλ₯Ό 얻은 경우 μ˜€λ²„ν”Œλ‘œμš° ν”Œλž˜κ·Έκ°€ μ„ΈνŠΈ λ©λ‹ˆλ‹€. 이것은 μ–‘μˆ˜κ°€ μ˜ˆμƒλ˜μ—ˆμ„ λ•Œ 음수λ₯Ό μ–»μ—ˆκ±°λ‚˜ κ·Έ λ°˜λŒ€μ˜ 경우λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 두 개의 μ–‘μˆ˜λ₯Ό λ”ν•˜λ©΄ κ²°κ³Ό λ˜ν•œ μ–‘μˆ˜κ°€ λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 64 + 64λŠ” sign bit둜 인해 -128 κ²°κ³Ό μ œκ³΅ν•©λ‹ˆλ‹€. λ”°λΌμ„œ 이 경우 μ˜€λ²„ν”Œλ‘œμš° ν”Œλž˜κ·Έκ°€ μ„ΈνŠΈλ©λ‹ˆλ‹€. μ˜€λ²„ν”Œλ‘œμš° ν”Œλž˜κ·ΈλŠ” λΉ„νŠΈ 6κ³Ό 7 사이와 λΉ„νŠΈ 7κ³Ό 캐리 ν”Œλž˜κ·Έ μ‚¬μ΄μ—μ„œ 캐리의 배타적 논리합을 μ·¨ν•˜μ—¬ κ²°μ •λ©λ‹ˆλ‹€. μžμ„Έν•œ 사항은 λ¬Έμ„œμ˜ Appedix Aλ₯Ό μ°Έκ³ ν•˜μ‹œκΈ° λ°”λžλ‹ˆλ‹€.

  • Negative Flag (N) - λ°”μ΄νŠΈμ˜ λΉ„νŠΈ 7은 ν•΄λ‹Ή λ°”μ΄νŠΈμ˜ λΆ€ν˜Έλ₯Ό λ‚˜νƒ€λ‚΄λ©° 0은 μ–‘μˆ˜μ΄κ³  1은 μŒμˆ˜μž…λ‹ˆλ‹€. 이 λΆ€ν˜Έ λΉ„νŠΈκ°€ 1이면 음수 ν”Œλž˜κ·Έ(λΆ€ν˜Έ ν”Œλž˜κ·ΈλΌκ³ λ„ 함)κ°€ μ„ΈνŠΈλ©λ‹ˆλ‹€.

// μƒνƒœ λ ˆμ§€μŠ€ν„°
  7   6   5   4   3   2   1   0
+-------------------------------+
| N | V |   | B | D | I | Z | C |
+-------------------------------+
// 5λΉ„νŠΈλŠ” unused

μΈν„°λŸ½νŠΈ

μΈν„°λŸ½νŠΈλŠ” μ½”λ“œμ˜ 순차 싀행을 μ€‘μ§€ν•˜κ³  μΈν„°λŸ½νŠΈμ— μ§‘μ€‘ν•˜λ„λ‘ ν•©λ‹ˆλ‹€. μΈν„°λŸ½νŠΈλŠ” 일반적으둜 νŠΉμ • 상황에 μ˜ν•΄ ν•˜λ“œμ›¨μ–΄μ— μ˜ν•΄ λ°œμƒν•˜μ§€λ§Œ, μ†Œν”„νŠΈμ›¨μ–΄μ— μ˜ν•΄ 트리거될 수 μžˆμŠ΅λ‹ˆλ‹€. NESμ—λŠ” μ„Έ 가지 μœ ν˜•μ˜ μΈν„°λŸ½νŠΈ NMI, IRQ, reset이 μžˆμŠ΅λ‹ˆλ‹€. μΈν„°λŸ½νŠΈκ°€ λ°œμƒν•  λ•Œ 점프할 μ£Όμ†ŒλŠ” $FFFA-$FFFF의 벑터 ν…Œμ΄λΈ”μ— μ €μž₯λ©λ‹ˆλ‹€. μΈν„°λŸ½νŠΈκ°€ λ°œμƒν•˜λ©΄ μ‹œμŠ€ν…œμ€ λ‹€μŒ μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

  1. μΈν„°λŸ½νŠΈ μš”μ²­μ΄ λ°œμƒ 인식
  2. ν˜„μž¬ λͺ…λ Ήμ˜ 싀행을 μ™„λ£Œ
  3. ν”„λ‘œκ·Έλž¨ μΉ΄μš΄ν„°μ™€ μƒνƒœ λ ˆμ§€μŠ€ν„°λ₯Ό μŠ€νƒμ— ν‘Έμ‹œν•©λ‹ˆλ‹€.
  4. 더 μ΄μƒμ˜ μΈν„°λŸ½νŠΈλ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ μΈν„°λŸ½νŠΈ λΉ„ν™œμ„±ν™” ν”Œλž˜κ·Έ μ„€μ •
  5. 벑터 ν…Œμ΄λΈ”μ—μ„œ ν”„λ‘œκ·Έλž¨ μΉ΄μš΄ν„°λ‘œ μΈν„°λŸ½νŠΈ 처리 λ£¨ν‹΄μ˜ μ£Όμ†Œλ₯Ό λ‘œλ“œ
  6. μΈν„°λŸ½νŠΈ 처리 루틴을 μ‹€ν–‰
  7. RTI(Return From Interrupt) λͺ…령을 μ‹€ν–‰ν•œ ν›„ μŠ€νƒμ—μ„œ ν”„λ‘œκ·Έλž¨ μΉ΄μš΄ν„°μ™€ μƒνƒœ λ ˆμ§€μŠ€ν„° 값을 κ°€μ Έμ˜΄
  8. ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 재개

IRQ λ˜λŠ” maskable μΈν„°λŸ½νŠΈλŠ” νŠΉμ • λ©”λͺ¨λ¦¬ 맀퍼에 μ˜ν•΄ μƒμ„±λ©λ‹ˆλ‹€. μΈν„°λŸ½νŠΈ λΉ„ν™œμ„±ν™” ν”Œλž˜κ·Έκ°€ μ„€μ •λœ 경우 ν”„λ‘œμ„Έμ„œμ—μ„œ λ¬΄μ‹œλ©λ‹ˆλ‹€. IRQλŠ” BRK(쀑단) λͺ…령을 μ‚¬μš©ν•˜μ—¬ μ†Œν”„νŠΈμ›¨μ–΄μ—μ„œ νŠΈλ¦¬κ±°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. IRQκ°€ λ°œμƒν•˜λ©΄ μ‹œμŠ€ν…œμ€ $FFFE 및 $FFFF에 μžˆλŠ” μ£Όμ†Œλ‘œ μ ν”„ν•©λ‹ˆλ‹€.

NMI(Non-Maskable Interrupt)λŠ” 각 ν”„λ ˆμž„μ˜ λμ—μ„œ V-Blankκ°€ λ°œμƒν•  λ•Œ PPUμ—μ„œ μƒμ„±ν•˜λŠ” μΈν„°λŸ½νŠΈ μœ ν˜•μž…λ‹ˆλ‹€. NMIλŠ” μƒνƒœ λ ˆμ§€μŠ€ν„°μ˜ μΈν„°λŸ½νŠΈ λΉ„ν™œμ„±ν™” λΉ„νŠΈμ˜ 영ν–₯을 받지 μ•ŠμœΌλ―€λ‘œ λ°œμƒ μ‹œ 항상 싀행이 μ€‘λ‹¨λ©λ‹ˆλ‹€]. κ·ΈλŸ¬λ‚˜ PPU μ œμ–΄ λ ˆμ§€μŠ€ν„° 1($2000)의 λΉ„νŠΈ 7이 μ§€μ›Œμ§€λ©΄ NMI 트리거λ₯Ό 방지할 수 μžˆμŠ΅λ‹ˆλ‹€. NMIκ°€ λ°œμƒν•˜λ©΄ μ‹œμŠ€ν…œμ€ $FFFA 및 $FFFB에 μžˆλŠ” μ£Όμ†Œλ‘œ μ ν”„ν•©λ‹ˆλ‹€.

Reset μΈν„°λŸ½νŠΈλŠ” μ‹œμŠ€ν…œμ΄ 처음 μ‹œμž‘λ  λ•Œμ™€ μ‚¬μš©μžκ°€ 리셋 λ²„νŠΌμ„ λˆ„λ₯Ό λ•Œ νŠΈλ¦¬κ±°λ©λ‹ˆλ‹€. μž¬μ„€μ •μ΄ λ°œμƒν•˜λ©΄ μ‹œμŠ€ν…œμ€ $FFFC 및 $FFFD에 μžˆλŠ” μ£Όμ†Œλ‘œ μ ν”„ν•©λ‹ˆλ‹€.
μ‹œμŠ€ν…œμ€ μž¬μ„€μ • μš”μ²­μ— κ°€μž₯ 높은 μš°μ„  μˆœμœ„λ₯Ό λΆ€μ—¬ν•˜κ³  NMI와 λ§ˆμ§€λ§‰μœΌλ‘œ IRQκ°€ λ’€λ”°λ¦…λ‹ˆλ‹€.

NESλŠ” 7 μ‚¬μ΄ν΄μ˜ μž…ν„°λŸ½νŠΈ λ ˆμ΄ν„΄μ‹œλ₯Ό κ°€μ§€λŠ”λ°, 이것은 μΈν„°λŸ½νŠΈ 처리λ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•΄μ„œλŠ” 7 CPU 사이클이 ν•„μš”ν•˜λ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

// NMI(Non-Maskable Interrupt) 처리

                     Memory
                   +---------+
+---------+ -----> |    P    | $0100 + SP - 2
|    P    |        +---------+
+---------+        |    PC   | $0100 + SP - 1
|    A    |        +---------+
+---------+       /|    PC   | $0100 + SP
|    X    |      / +---------+
+---------+     /  |         |
|    Y    |    /   +---------+
+---------+   /    |         |
|    SP   |  /     +---------+
+---------+ /      |         |
|    PC   |/       +---------+
+---------+        |         |
                   +---------+      --+
              +--> |         | bbaa   |
              |    +---------+        |
              |    |         |        |--- Interrupt Handler
              |    +---------+        |
    Interrupt |    |         |        |
    Handler   |    +---------+      --+
    Address   |    |         |
              |    +---------+
              |    |         |
              |    +---------+
              |  +-|   aa    | $FFFA
              +--| +---------+
                 +-|   bb    | $FFFB
                   +---------+
                   |         |
                   +---------+

μ–΄λ“œλ ˆμ‹± λͺ¨λ“œ

6502μ—λŠ” λ©”λͺ¨λ¦¬μ— μ•‘μ„ΈμŠ€ν•˜κΈ° μœ„ν•œ λͺ‡ 가지 λ‹€λ₯Έ μ£Όμ†Œ 지정 λͺ¨λ“œκ°€ μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ λ©”λͺ¨λ¦¬κ°€ μ•„λ‹Œ λ ˆμ§€μŠ€ν„° 컨텐츠 μƒμ—μ„œ μž‘λ™ν•˜λŠ” μ—λ“œλ ˆμ‹± λͺ¨λ“œλ„ μžˆμŠ΅λ‹ˆλ‹€. 6502μ—λŠ” 총 13개의 λ‹€λ₯Έ μ£Όμ†Œ 지정 λͺ¨λ“œκ°€ 있으며, 일뢀 λͺ…λ Ήμ–΄λŠ” λ‘˜ μ΄μƒμ˜ λ‹€λ₯Έ μ£Όμ†Œ 지정 λͺ¨λ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ£Όμ†Œ 지정 λͺ¨λ“œμ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ λ¬Έμ„œμ˜ Appendix Eμ—μ„œ 확인 κ°€λŠ₯ν•©λ‹ˆλ‹€.

λͺ…λ Ήμ–΄ 집합

6502λŠ” 56개의 λͺ…λ Ήμ–΄κ°€ μžˆμ§€λ§Œ μΌλΆ€λŠ” λ‹€λ₯Έ μ£Όμ†Œ 지정 λͺ¨λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ λ³€ν˜•μ΄ μžˆμ–΄ κ°€λŠ₯ν•œ 256개 쀑 총 151개의 μœ νš¨ν•œ opcodeλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
λͺ…령은 μ£Όμ†Œ 지정 λͺ¨λ“œμ— 따라 1λ°”μ΄νŠΈ, 2λ°”μ΄νŠΈ λ˜λŠ” 3λ°”μ΄νŠΈμž…λ‹ˆλ‹€. 첫 번째 λ°”μ΄νŠΈλŠ” opcode이고 λ‚˜λ¨Έμ§€ λ°”μ΄νŠΈλŠ” ν”Όμ—°μ‚°μžμž…λ‹ˆλ‹€.

  • λ‘œλ“œ/μ €μž₯ μž‘μ—… - λ©”λͺ¨λ¦¬μ—μ„œ λ ˆμ§€μŠ€ν„°λ₯Ό λ‘œλ“œν•˜κ±°λ‚˜ λ ˆμ§€μŠ€ν„°μ˜ λ‚΄μš©μ„ λ©”λͺ¨λ¦¬μ— μ €μž₯ν•©λ‹ˆλ‹€.

  • λ ˆμ§€μŠ€ν„° 전솑 μž‘μ—… - X λ˜λŠ” Y λ ˆμ§€μŠ€ν„°μ˜ λ‚΄μš©μ„ λˆ„μ‚°κΈ°μ— λ³΅μ‚¬ν•˜κ±°λ‚˜ λˆ„μ‚°κΈ°μ˜ λ‚΄μš©μ„ X λ˜λŠ” Y λ ˆμ§€μŠ€ν„°λ‘œ λ³΅μ‚¬ν•©λ‹ˆλ‹€.

  • μŠ€νƒ μž‘μ—… - μŠ€νƒμ„ ν‘Έμ‹œ λ˜λŠ” ν’€ν•˜κ±°λ‚˜ X λ ˆμ§€μŠ€ν„°λ₯Ό μ‚¬μš©ν•˜μ—¬ μŠ€νƒ 포인터λ₯Ό μ‘°μž‘ν•©λ‹ˆλ‹€.

  • 논리 μ—°μ‚° - λˆ„μ‚°κΈ° 및 λ©”λͺ¨λ¦¬μ— μ €μž₯된 값에 λŒ€ν•œ 논리 연산을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

  • μ‚°μˆ  μ—°μ‚° - λ ˆμ§€μŠ€ν„°μ™€ λ©”λͺ¨λ¦¬μ— λŒ€ν•œ μ‚°μˆ  연산을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

  • 증가/κ°μ†Œ - X λ˜λŠ” Y λ ˆμ§€μŠ€ν„° λ˜λŠ” λ©”λͺ¨λ¦¬μ— μ €μž₯된 값을 증가 λ˜λŠ” κ°μ†Œμ‹œν‚΅λ‹ˆλ‹€.

  • Shifts - λˆ„μ‚°κΈ° λ˜λŠ” λ©”λͺ¨λ¦¬ μœ„μΉ˜μ˜ λΉ„νŠΈλ₯Ό μ™Όμͺ½μ΄λ‚˜ 였λ₯Έμͺ½μœΌλ‘œ 1λΉ„νŠΈ μ΄λ™ν•©λ‹ˆλ‹€.

  • 점프/호좜 - μ§€μ •λœ μ£Όμ†Œμ—μ„œ λ‹€μ‹œ μ‹œμž‘ν•˜μ—¬ 순차적 μ‹€ν–‰ μ‹œν€€μŠ€λ₯Ό μ€‘λ‹¨ν•©λ‹ˆλ‹€.

  • λΆ„κΈ° - 쑰건이 좩쑱되면 μ§€μ •λœ μ£Όμ†Œμ—μ„œ λ‹€μ‹œ μ‹œμž‘ν•˜μ—¬ 순차적 μ‹€ν–‰ μ‹œν€€μŠ€λ₯Ό μ€‘λ‹¨ν•©λ‹ˆλ‹€. μ‘°κ±΄μ—λŠ” μƒνƒœ λ ˆμ§€μŠ€ν„°μ˜ νŠΉμ • λΉ„νŠΈ 검사가 ν¬ν•¨λ©λ‹ˆλ‹€.

  • μƒνƒœ λ ˆμ§€μŠ€ν„° μž‘μ—… - μƒνƒœ λ ˆμ§€μŠ€ν„°μ—μ„œ ν”Œλž˜κ·Έλ₯Ό μ„€μ •ν•˜κ±°λ‚˜ μ§€μ›λ‹ˆλ‹€.

  • μ‹œμŠ€ν…œ κΈ°λŠ₯ - 거의 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” κΈ°λŠ₯을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.