שתפו את העמוד

למדו X ב־Y דקות

כאשר X=Uxntal

אוקסנטל (Uxntal) היא שפת סף מבוססת מחסנית שמִּתרגמת לשפת מכונה של מכונה ווירטואלית בשם אוקסן (Uxn).

תכנות של מכונת מחסנית עלול להראות מוזר בגלל השימוש בכתיב סופי, כלומר כתיב שבו הסמנים של פעולות (אופרטורים) תמיד ממוקמים בסוף הפעולה. לדוגמה, נכתוב 3 4 + במקום הכתיב הרגיל 3 + 4.

את הביטוי שנכתב בכתיב הרגיל (5 + 10) * 3 נוכל לכתוב 5 10 + 3 * בכתיב הסופי, שנקרא גם „כתיב פולני הפוך”.

( זו הערה )

( התכנות באוקסנטל נעשה כולו בעזרת שינוי המחסנית )

#12 ( דחוף בית (8 סיביות) )
#3456 ( דחוף צמד בתים (16 סיביות) )

( באוקסן 32 הוראות, ולכל הוראה שלושה מצבים אפשריים )

POP ( שלוף בית )
POP2 ( שלוף צמד בתים )

( המצבים הם:‏
  [2] (מצב צמד בתים)
  עבוד עם צמד בתים במחסנית (מצב ברירת המחדל הוא עבודה עם בתים)

  [k] (מצב הותרה)
  הפריטים עליהם מבוצעת ההוראה נשארים במחסנית

  [r] (מצב חזרה)
  ההוראה מבוצעת על מחסנית החזרה )

#12 #34 ADD ( 46 )
#12 #34 ADDk ( 12  34  46 )

( ניתן לשלב בין המצבים השונים )

#1234 #5678 ADD2k ( 12  34  56  78  68  ac )

( ההוראות החשבוניות וההוראות על סיביות הן:‏
  ADD SUB MUL DIV
  AND ORA EOR SFT )

( ניתן ליצור הוראות חדשות בעזרת מקרואים )

%MOD2 { DIV2k MUL2 SUB2 }

#1234 #0421 MOD2 ( 01  b0 )

( ---------------------------------------------------------------------------- )

( צמד בתים הוא פשוט שני בתים צמודים; ניתן גם לפעול על כל בית בנפרד )

#1234 SWP ( 34  12 )
#1234 #5678 SWP2 ( 56  78  12  34 )
#1234 #5678 SWP ( 12  34  78  56 )

( ניתן להסיר מהמחסנית כל אחד מהבתים שמרכיבים צמד בתים )

#1234 POP ( 12 )
#1234 NIP ( 34 )

( ההוראות על המחסנית עצמה הן:‏
  POP DUP NIP SWP OVR ROT )

( ---------------------------------------------------------------------------- )

( ניתן להשוות בין ערכים במחסנית )

#12 #34 EQU ( 00 )
#12 #12 EQU ( 01 )

( הוראות לוגיות דוחפות למחסנית דגל עם ערך 00 או 01 לפי התוצאה )

#12 #34 LTH
#78 #56 GTH
#0101 EQU2 ( 01 )

( ההוראות הלוגיות הן:‏
  EQU NEQ GTH LTH )

( ---------------------------------------------------------------------------- )

( הזכרון הזמין לאוקסן:‏
  ‏256 בתים במחסנית העבודה
  ‏256 בתים במחסנית החזרה
  ‏65536 בתים בזכרון
  ‏256 בתים בזכרון הקלט והפלט )

( 0000-ffff כתובות הזכרון הזמינות הן בטווח )

#12 #0200 STA ( אחסן 12 בכתובת 0200 בזכרון )
#3456 #0201 STA2 ( אחסן 3456 בכתובת 0201 בזכרון )
#0200 LDA2 ( 12  34 )

( הכתובות בדף האפס הן בנות בית יחיד )

#1234 #80 STZ2 ( אחסן 12 ב־0080, ו־34 ב־0081 )
#80 LDZ2 ( 12  34 )

( התקנים חיצוניים הם הדרך של אוקסן לתקשר עם העולם החיצון.‏
  ניתן לחבר עד 16 התקנים בעת ובעונה אחת.‏
  .10-1f הבתים של ההתקנים נקראים „פורטים”. לדוגמה, התקן הקונסולה משתמש בפורטים
  /write הפורט לכתיבה לקונסולה, שמספרו 18, נקרא בשם )

%EMIT { #18 DEO }

#31 EMIT ( הדפס "1" בקונסולה )

( תווית היא שוות ערך למיקום מסויים בתוכנית )
@parent ( parent הגדר תווית בשם )
  &child ( parent/child הגדר תת־תווית )

( ניתן לדחוף מיקומים למחסנית )
;parent ( דחוף מיקום מוחלט, באורך 2 בתים )
,parent ( דחוף מיקום יחסי, באורך בית אחד )
.parent ( דחוף מיקום בדף האפס, באורך בית אחד )

( ההוראות על הזכרון הן:‏
  LDZ STZ LDR STR
  LDA STA DEI DEO )

( ---------------------------------------------------------------------------- )

( הוראות לוגיות מאפשרות ליצור תנאים )

#12 #34 NEQ ,skip JCN
  #31 EMIT
@skip

( for ניתן גם ליצור בעזרתן לולאות )

#3a #30
@loop
  DUP EMIT ( כשהתוכנית תסיים יודפס "0123456789" בקונסולה )
  INC GTHk ,loop JCN
POP2

( while בדומה, ניתן ליצור גם לולאות )

;word
@while
  LDAk EMIT
  INC2 LDAk ,while JCN
POP2
BRK

@word "vermillion $1

( JMP2r ולחזור בעזרת ,JSR ניתן לקפוץ אל תת־שגרות בעזרת )

;word ,print-word JSR
BRK

@print-word ( word* -- )
  @while
    LDAk EMIT
    INC2 LDAk ,while JCN
  POP2
JMP2r

@word "cerulean

( ההוראות לקפיצה הן:‏
  JMP JCN JSR )

רוצה עוד?


יש לכן·ם הצעה? אולי תיקון? פתחו אישיו בריפו בגיטהאב, או צרו פול ריקווסט בעצמכן·ם!

נכתב במקור על ידי Devine Lu Linvega, ועודכן על ידי 1 א·נשים.