לדלג לתוכן

1.7 קלט ופלט הרצאה

הקדמה: מהו Bus?

המעבד מחובר לזכרון, ולרכיבי הקלט פלט באמצעות Bus-ים.
הbus-ים מחברים את כל החלקים במחשב ומאפשרים להעביר מידע בין חלק וחלק.
הbus-ים מחולקים ב3 ערוצים שונים, שלכל ערוץ יש יעוד משלו.

1. Address Bus – ערוץ כתובות

• ערוץ זה מעביר כתובות זכרון שהמעבד רוצה לגשת אליו כאשר אנחנו מבצעים הוראה כלשהי שמעבירה כתובות.
• במעבד 8086, זהו ערוץ ברוחב של 20 ביט – מאפשר גישה ל־1MB של זיכרון (2²⁰).
זוהי הסיבה שבמעבדי 8086 הגודל המקסימלי של הRAM לא יעלה על 1MB, כי הaddress bus יכול להכיל עד 1MB של כתובות.

2. Data Bus – ערוץ נתונים

• דרכו עוברים הנתונים עצמם – בין אם זה מידע, הוראות, ועוד.
• ברוחב 16 ביט (ב־8086), כלומר בכל מחזור ניתן להעביר עד 2 בתים.

3. Control Bus – ערוץ פיקוד

  • האם מדובר בפעולת קריאה (READ) או כתיבה (WRITE) מהRAM, או מהIO.

הקדמה: מהו קלט/פלט?

הI/O – Input/Output – משמעו תקשורת עם התקני חומרה חיצוניים:
מקלדת, מסך, עכבר, כוננים, כרטיסי קול, בקרים טוריים, תקשורת רשת ועוד.

למעבד אין "חיבור ישיר" להתקן – הוא שולח וקולט נתונים דרך ממשקים חשמליים הקרויים פורטי קלט/פלט (I/O Ports).


שתי גישות ל־I/O

1. Memory-Mapped I/O

גישה שבה ה־I/O משולב בתוך מרחב ה־RAM, כמו כל כתובת רגילה בזיכרון.
לא נשתמש בגישה זו במעבד 8086 (היא רלוונטית יותר למעבדים מתקדמים יותר כמו ARM או x86 מודרני).

2. Port-Mapped I/O (נקרא גם Isolated I/O)

גישה בה יש מרחב נפרד של כתובות ייעודיות ל־I/O.
במעבד 8086 יש 64KB של פורטים (כתובות מ־0x0000 עד 0xFFFF), אבל בפועל לרוב משתמשים רק ב־256 פורטים (0x000xFF).


כיצד ניגשים לפורטים?

המעבד מספק פקודות מיוחדות לעבודה עם פורטים:

  • IN – קוראת מידע מהתקן I/O (כלומר – קלט)

  • OUT – שולחת מידע להתקן I/O (כלומר – פלט)


הסינטקס

פקודת IN

in AL, DX    ; קריאה מהפורט שכתוב ב-DX, התוצאה תיכנס ל-AL (8 ביט)
in AX, DX    ; קריאה של 16 ביט

פקודת OUT

out DX, AL   ; שלח את AL לפורט שכתוב ב-DX (8 ביט)
out DX, AX   ; שלח 16 ביט לפורט

שים לב: הרגיסטר DX משמש תמיד לכתובת הפורט


דוגמה: קריאה מפורט והצגה במסך

mov dx, 0x60       ; כתובת של פורט מקלדת (Keyboard Data Port)
in al, dx          ; קרא תו מהמקלדת
mov ah, 0Eh        ; שירות תצוגה של BIOS
int 10h            ; הצג את התו שקראת

דוגמה: כתיבה לפורט תיאורטי של נוריות לד

נניח שיש לנו כרטיס שמחובר ל־PORT 0x300, והדלקת נוריות תלויה בערך שנשלח:

mov dx, 0x300
mov al, 0b10101010   ; הדלק רק חלק מהנוריות
out dx, al

תקציר פורטים חשובים

פורט שימוש
0x60 קריאה מהמקלדת (Keyboard Data Port)
0x61 מקלדת / צלילים (BIOS keyboard control)
0x64 פקודות למקלדת
0x3F8 COM1 – פורט סידורי
0x378 LPT1 – מדפסת
0x400x43 תדר של הטיימר הפנימי
0x201 Game port / ג'ויסטיק

מה קורה "מאחורי הקלעים"?

  • כשמבצעים OUT dx, al, המעבד מעביר את הערך שבAL דרך ה־Data Bus, וכתובת הפורט דרך Address Bus.

  • המעבד גם מפעיל את אות ה־IO Write (בניגוד ל־Memory Write) דרך ה־Control Bus.

  • ההתקן שאליו מופנה הפורט מקבל את האות ומגיב בהתאם.


קריאה חוזרת – קריאת תו עד שהתקבל קלט

wait_key:
  in al, 0x64       ; בודק האם יש תו מוכן
  test al, 1        ; בדיקה של ביט 0 – מוכן?
  jz wait_key       ; אם לא – המתן
  in al, 0x60       ; קרא את התו

כתיבת קוד דרייבר פשוט למקלדת

keyboard_loop:
    in al, 0x64         ; לבדוק סטטוס של המקלדת
    test al, 1          ; אם ביט 0 דולק – יש תו מוכן
    jz keyboard_loop    ; אם לא – המשך לחכות
    in al, 0x60         ; קבל את התו
    mov ah, 0Eh
    int 10h             ; הדפס את התו
    jmp keyboard_loop