– איך מספרים ואותיות הופכים לצליל ותמונה במעבד

משחקי אטארי

אפשר בגדול לחשוב על כל טווח כתובות כעל “טבלה של פקודות/הגדרות” — אבל לא פקודות של המעבד עצמו, אלא רגיסטרים של חומרה שמגיבים לכתיבה/קריאה. המעבד לא “מבין” סאונד או גרפיקה; הוא פשוט כותב מספר בינארי לכתובת, והרכיב שמחובר לכתובת הזאת מפרש אותו פיזית.

משחקי אטארי

1- Memory-Mapped I/O – העיקרון

LDA #$0F
STA COLUP0   ; כתיבת 00001111 לכתובת $06 (צבע לשחקן 0)
  • הערך (ביטים) יוצא על קווי הדאטה.
  • הכתובת יוצאת על קווי הכתובת.
  • אות כתיבה מפעיל את הרכיב (TIA/RIOT), והוא שומר/מעדכן התנהגות.

2- איך מספרים הופכים לסאונד?

  • AUDC0/AUDC1 – סוג גל (ריבוע/רעש וכו').
  • AUDF0/AUDF1 – תדר (Pitch) ע"י חלוקת שעון.
  • AUDV0/AUDV1 – ווליום 0–15.
LDA #%00000110  ; סוג גל
STA AUDC0
LDA #$1A       ; תדר
STA AUDF0
LDA #$0F       ; ווליום
STA AUDV0

3- איך מספרים הופכים לגרפיקה?

  • COLUP0/COLUP1/COLUPF/COLUBK – צבעים ובהירויות.
  • GRP0/GRP1 – 8 ביטים = 8 פיקסלים של שורת ספרייט.
  • PF0/PF1/PF2 – דפוסי ה־Playfield בכל שורה.
  • RESPx + HMPx/HMOVE – מיקום אופקי מדויק בקרן הסריקה.

4- מיפוי כתובות מרכזי (VCS)

  • $00–$7F – TIA: רישומי גרפיקה/סאונד + דגלי התנגשויות.
  • $80–$FF – RIOT/PIA: RAM של 128 בתים + קלט/פלט (ג׳ויסטיק, מתגים) + טיימר.
  • $F000–$FFFF – ROM: קוד המשחק וטבלאות נתונים.

דוגמת וקטורים וקוד אתחול

; --- ROM ---
        ORG $F000
Reset:
        SEI
        CLD
        LDX #$FF
        TXS
; init TIA/PIA...
MainLoop:
        JMP MainLoop

        ORG $FFFC
        .word Reset    ; Reset Vector
        .word Reset    ; IRQ/BRK

5- “צ׳יט־שיט” קצר ל-TIA

כתובתשםשימוש
$00VSYNCהתחלת/סיום סנכרון אנכי (3 שורות)
$01VBLANKהשתקת תצוגה/קלט בזמן VBLANK
$02WSYNCהמתנה עד סוף שורת סריקה
$06COLUP0צבע/בהירות לשחקן 0
$15AUDC0סוג גל לערוץ 0
$17AUDF0תדר לערוץ 0
$19AUDV0עוצמה 0–15
$1BGRP08 ביטים = 8 פיקסלים
$10RESP0מיקום אופקי מיידי
$2AHMOVEהחלת היסטים אופקיים
$2CCXCLRאיפוס דגלי התנגשויות

6- RIOT/PIA (RAM + I/O + טיימר)

כתובתשםשימוש
$80–$FFRAMמשתני משחק
$280↔$80SWCHAקלט ג׳ויסטיקים
$282SWCHBRESET/SELECT/DIFF/BW
$284INTIMקריאת טיימר
$296TIM64Tאתחול טיימר בקצב 64

דוגמת קריאת ג׳ויסטיק + טיימר

LDA SWCHA
AND #%01100000   ; 0=לחוץ (active low)
CMP #%01100000
BEQ .no_lr
.no_lr

LDA #$2A
STA TIM64T
.wait
LDA INTIM
BNE .wait

7- אז מה זה כל הפינים במעבד?

בקצרה: קווי כתובת (Address), קווי דאטה (Data), קווי בקרה (Read/Write, Clock, Reset). הכתיבה/קריאה לרגיסטרים גורמת לשינוי במתחים בקווים המחוברים לרכיבי TIA/RIOT — וזה מה שמוליד את הסאונד, הפיקסלים והקלט בזמן אמת.

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

  • Assembly → מקודד לאופקודים (בינארי).
  • בינארי → יוצא על קווי הכתובת/דאטה + אות כתיבה/קריאה.
  • הרכיב (TIA/RIOT) מתרגם לבניית אותות (שמע/וידאו/קלט).
  • פלט: רמקול מנגן, תמונה נסרקת למסך, קלט מתקבל.

שפת Assembly – מבוא היסטורי

אסמבלי נולדה כדי להחליף כתיבה ישירה בבינארי/כרטיסים מנוקבים ומתגים. אחריה הופיעו שפות עיליות (Fortran, C, Pascal) שבסוף מתורגמות לאסמבלי.

דוגמת קוד קצרה

; טעינה, חיבור, ושמירה
LDA #10
ADC #5
STA $0200
  • LDA #10 – טוען 10 ל־A
  • ADC #5 – מוסיף 5 ל־A
  • STA $0200 – שומר לזיכרון

🔧 סימולציה חיה

מצב סימולציה

שלב נוכחי: LDA

רגיסטר A: 0

זיכרון [כתובת $0200]: עדיין ריק

✨ אפשר להרחיב את הסימולציה לפקודות נוספות, קלט מהג׳ויסטיק וטיימרים.