📍 Addressing Modes במעבד 6502

בוא נבין את Addressing Modes במעבד 6502/6507: איך המעבד מפרש ערכים אחרי פקודת מכונה – האם מדובר בערך ישיר (Immediate), בכתובת בזיכרון (Absolute), כתובת בדף אפס (Zero Page), כתובת עם תוספת מאוגר (Indexed), או הפניה עקיפה (Indirect).

🔍 למה זה חשוב?

  • מהירות הקוד (Zero Page מהיר יותר)
  • גודל הפקודה בזיכרון (Immediate קצר יותר)
  • סוג הפעולה (על ערכים או על זיכרון)

🧩 שלושת המצבים הראשונים

1. 📌 Immediate Mode (LDA #$80)

כשאנחנו רוצים לטעון ערך מספרי ישיר לתוך אוגר, נשתמש ב-#. לדוגמה:

LDA #10    ; טען את המספר 10
LDA #$80   ; טען את המספר 128 (בבסיס הקס)

שימושים: אתחול משתנים, הגדרת צבע, מונה התחלתי ועוד.

למה? כי אנחנו לא רוצים לקרוא מהזיכרון אלא פשוט להציב ערך.

2. 📌 Zero Page Mode (LDA $80)

כתובת בזיכרון בטווח $00–$FF. מהיר במיוחד.

LDA $80 ; קרא את הערך מהכתובת $80

למה? מהיר יותר, מתאים למשתנים זמניים.

3. 📌 Absolute Mode (LDA $1234)

טוען נתון מכתובת מלאה (16 ביט).

LDA $0200 ; קרא את התוכן מהכתובת $0200

שימושים: רגיסטרים של חומרה, משתנים גלובליים, מסך וכו'.

🧭 מצבי מיקוד מתקדמים

4. 📌 Indexed Mode (כתובת + אוגר)

LDA $2000,X ; קרא מ-$2000 + X
LDA $20,Y    ; קרא מ-$20 + Y

שימושים: לולאות על מערכים, תנועה בזיכרון.

5. 📌 Indirect Mode (עקיפה)

JMP ($1234)     ; קפוץ לכתובת ב-$1234/5
LDA ($40,X)     ; חפש כתובת דרך $40 + X
LDA ($40),Y     ; קרא מכתובת שמתחילה ב-$40 ואז הוסף Y

שימושים: מצביעים, טבלאות קפיצה, פונקציות דינאמיות.

📊 טבלה מסכמת

מצבתחבירמשמעותדוגמה
Immediate#valueטען ערך ישירLDA #10
Zero Page$00–$FFגישה מהירה לזיכרון נמוךLDA $80
Absolute$0000–$FFFFכתובת מלאהSTA $1234
Indexed,X$addr,Xכתובת + XLDA $2000,X
Indexed,Y$addr,Yכתובת + YLDA $1000,Y
Indirect($addr)עקיפהJMP ($1234)
Indirect,X($addr,X)דרך XLDA ($40,X)
Indirect),Y($addr),Yדרך YLDA ($40),Y