Μικρά μαθήματα

01 / BASIC + ΓΛΩΣΣΑ ΜΗΧΑΝΗΣ

Ένας μικρός βρόχος συμβάντων.
Με την εντολή WAIT.

Φτάνουν σκάφη. Κινείται το ποντίκι. Χτυπά το ρολόι. Πώς ξέρει ένα περιβάλλον BASIC πότε έχει δουλειά; Στο AIS4CBM, η γέφυρα είναι ένα μόνο byte.

Commodore 128 · BASIC 7.0 + assembly 8502 · Κώδικας από τη γραφική προβολή

01 / ΤΟ ΒΑΣΙΚΟ ΣΥΣΤΑΤΙΚΟ

Περιμένοντας την αλλαγή ενός bit.

Η BASIC προσφέρει έναν σύντομο τρόπο παρακολούθησης μιας θέσης μνήμης:

Σύνταξη BASIC
WAIT address,mask[,invert]

address επιλέγει το byte που θα διαβαστεί. mask επιλέγει τα bit που μας ενδιαφέρουν. Το προαιρετικό invert αντιστρέφει επιλεγμένα bit πριν τον έλεγχο· η προεπιλογή είναι μηδέν. Η εκτέλεση συνεχίζεται όταν το αποτέλεσμα γίνει μη μηδενικό:

(memory byte XOR invert) AND mask

WAIT WF,32 περιμένει να τεθεί το bit 5. WAIT WF,32,32 περιμένει να μηδενιστεί. Με μάσκα 34 (32 OR 2), οποιοδήποτε επιλεγμένο bit μπορεί να ικανοποιήσει τον έλεγχο.

02 / ΕΝΑ BYTE ΑΝΑΜΕΣΑ ΣΕ ΔΥΟ ΚΟΣΜΟΥΣ

Η γλώσσα μηχανής ειδοποιεί. Η BASIC αντιδρά.

Ο πυρήνας διατηρεί ένα byte με όνομα notifyFlag. Κάθε bit έχει σημασία. Τρία από αυτά χρησιμοποιούνται στη γραφική προβολή:

Τρεις σημαίες του AIS4CBM
ΤιμήΔυαδικάΣημασίαΠρωτόκολλο
200000010Ειδοποίηση ποντικιούΕκκρεμής σημαία προς κατανάλωση
400000100Παλμός ρολογιούBit που εναλλάσσεται
3200100000Έτοιμη ενημέρωση σκάφουςΕκκρεμής σημαία προς κατανάλωση

Μόλις ετοιμαστούν τα πεδία ενημέρωσης σκάφους, ο διαχειριστής θέτει το αντίστοιχο bit ειδοποίησης. ORA διατηρεί τα υπόλοιπα bit:

Απόσπασμα assembly · ειδοποίηση ενημέρωσης σκάφους
lda notifyFlag
ora #MESSAGE_FLAG
sta notifyFlag
Η ML ετοιμάζει τα δεδομένα, θέτει το bit 5 στο notifyFlag και η WAIT επιστρέφει. Ο χειριστής BASIC καταναλώνει και επιβεβαιώνει το συμβάν.
Η χειραψία ενημέρωσης σκάφους. Ακολουθήστε τα συνεχή βέλη προς την BASIC και τη διακεκομμένη επιβεβαίωση προς τα πίσω. Πλήρες μέγεθος ↗

Η IRQ εξυπηρετεί τον χρόνο, τη δειγματοληψία ποντικιού και τη σειριακή προσωρινή αποθήκευση. Η αποκωδικοποίηση και η δημοσίευση ενημερώσεων γίνονται στην κύρια διαδρομή εκτέλεσης, μέσω της παρέμβασης στις εντολές BASIC. Ένα ξεχωριστό bit αφύπνισης επιτρέπει στην IRQ να απελευθερώνει τη WAIT όταν πρέπει να αδειάσει η σειριακή προσωρινή μνήμη· οι παλμοί ρολογιού επαναφέρουν επίσης την BASIC στον βρόχο. Η BASIC διανέμει τις ειδοποιήσεις στις ρουτίνες του περιβάλλοντος.

03 / Ο ΠΡΑΓΜΑΤΙΚΟΣ ΒΡΟΧΟΣ

Επιλογή. Αναμονή. Χειρισμός.

Οι πρώτες τρεις εντολές της γραμμής BASIC 113, χωρισμένες για ευκολότερη ανάγνωση:

Απόσπασμα AIS4CBM · γραμμή BASIC 113
MK=PEEK(MP)
WAIT WF,MK,MS
WM=PEEK(WF) AND MK
WF
Διεύθυνση του byte ειδοποιήσεων του πυρήνα.
MP / MK
Η διεύθυνση της κοινής μάσκας ενδιαφέροντος και το αντίγραφό της για αυτή την αναμονή.
MS
Οι τελευταίες τιμές bit κατάστασης που εξυπηρετήθηκαν, μαζί με τον παλμό που εναλλάσσεται.
WM
Τα επιλεγμένα bit που διαβάστηκαν μετά την επιστροφή της WAIT.

Οι διευθύνσεις παρέχονται από το API· δεν είναι αυθαίρετη ελεύθερη RAM. Τα αποσπάσματα προϋποθέτουν αρχικοποιημένο AIS4CBM. Προορίζονται για μελέτη και δεν αποτελούν αυτόνομο πρόγραμμα.

Εκκρεμείς σημαίες και αλλαγές κατάστασης

Μια εκκρεμής σημαία ποντικιού οδηγεί στον χειριστή του:

Απόσπασμα AIS4CBM · γραμμή BASIC 114
114 IF (WM AND 2) THEN GOSUB 600:GOTO 113

Ο χειριστής καταναλώνει την ειδοποίηση κλικ και η BASIC επιστρέφει στη WAIT. Ο πλήρης βρόχος δίνει προτεραιότητα στη σειριακή αποφόρτιση και στην αλληλεπίδραση πριν από τις ενημερώσεις σκαφών.

Ο παλμός χρησιμοποιεί διαφορετική χειραψία. Η IRQ εναλλάσσει το bit 2 με EOR· η BASIC θυμάται την εξυπηρετημένη τιμή στο MS:

Απόσπασμα assembly · δημοσίευση παλμού
lda #TICK
eor notifyFlag
sta notifyFlag
Απόσπασμα AIS4CBM · γραμμή BASIC 119
119 IF (XOR(WM,MS AND MK) AND 4) THEN MS=XOR(MS,4):GOSUB 200:GOTO 113

Μετά τον χειρισμό του παλμού, το αποθηκευμένο bit συμφωνεί με το τρέχον. Η WAIT περιμένει ξανά. Η επόμενη εναλλαγή τα διαφοροποιεί, είτε η μετάβαση είναι 0 → 1 ή 1 → 0.

Χρονογραμμή του τρέχοντος bit παλμού και του τελευταίου εξυπηρετημένου bit. Οι τονισμένες περιοχές δείχνουν διαφορά μετά από ανοδική και καθοδική ακμή· κάθε διαφορά απελευθερώνει τη WAIT.
Η WAIT παρακολουθεί τη διαφορά, οπότε λειτουργούν και οι δύο ακμές. Τα σκιασμένα διαστήματα τελειώνουν όταν η BASIC καταγράψει τη νέα κατάσταση. Πλήρες μέγεθος ↗

Ένας διάλογος επιλέγει τα συμβάντα του

Η BASIC αλλάζει την κοινή μάσκα καθώς αλλάζει το περιβάλλον. Το παρακάτω απομονώνει την απενεργοποίηση ενδιαφέροντος για ενημερώσεις σκαφών:

Απλοποιημένο διδακτικό απόσπασμα · απόκρυψη μόνο της σημαίας σκάφους
POKE MP,(PEEK(MP) AND 223)

223 = 255 - 32. Ο πραγματικός διάλογος εξαιρεί προσωρινά αρκετά bit και επαναφέρει το ενδιαφέρον για σκάφη μόλις ολοκληρωθεί η μετάβαση σχεδίασης. Ο παραγωγός ML ελέγχει επίσης τη μάσκα και αναβάλλει τις κατάλληλες παραδόσεις. Η μάσκα από μόνη της αλλάζει μόνο τι αφυπνίζει τη WAIT.

04 / ΔΟΚΙΜΑΣΤΕ ΤΑ BIT

Κάντε τη WAIT να επιστρέψει.

Στείλτε κλικ ή ενημέρωση σκάφους και εξυπηρετήστε τα. Δοκιμάστε έναν παλμό, εξυπηρετήστε τον και εναλλάξτε τον ξανά. Και οι δύο ακμές αφυπνίζουν την BASIC. Αποεπιλέξτε συμβάν για να δείτε πώς η μάσκα αλλάζει τον έλεγχο.

05 / ΣΤΟ ΔΙΚΟ ΣΑΣ ΠΡΟΓΡΑΜΜΑ

Κρατήστε τη χειραψία σαφή.

  • Δημοσιεύστε τα δεδομένα πριν τη σημαία. Όταν ο καταναλωτής δει «έτοιμο», τα αντίστοιχα δεδομένα πρέπει να είναι αξιοποιήσιμα.
  • Μια σημαία δεν είναι ουρά συμβάντων. Επαναλαμβανόμενες θέσεις σημαίας συγχωνεύονται και δύο εναλλαγές μπορεί να ακυρωθούν πριν παρατηρηθούν. Χρησιμοποιήστε μετρητή ή ουρά όταν κάθε εμφάνιση μετρά.
  • Ορίστε ποιος επιβεβαιώνει κάθε bit. Η ανάγνωση/εγγραφή PEEK/POKE της BASIC δεν είναι ατομική ως προς τις διακοπές. Χρησιμοποιήστε ασφαλή επιβεβαίωση σε ML όταν υπάρχουν ταυτόχρονες εγγραφές.
  • Κρατήστε τον παραγωγό σε λειτουργία. Η WAIT δεν προχωρά αν δεν συμβεί η επιλεγμένη συνθήκη. Οι ειδοποιήσεις IRQ απαιτούν ενεργή την αντίστοιχη διακοπή.

Το αποτέλεσμα είναι μια μικρή διεπαφή ανάμεσα στη γρήγορη γλώσσα μηχανής και στους ευανάγνωστους χειριστές BASIC: ένα byte ειδοποιήσεων, μια μάσκα ενδιαφέροντος και σαφής συμφωνία για κάθε bit.

Όταν η WAIT απελευθερώσει τον χειριστή, πώς διαβάζει η BASIC τα δεδομένα σκάφους; Το συνοδευτικό μάθημα, Ρωτήστε την ML, πάρτε τιμή BASIC: USR, ακολουθεί το αίτημα πεδίου στις διαδρομές επιστροφής αριθμών και συμβολοσειρών.

Διαβάστε τον κώδικα

Οι σύνδεσμοι δείχνουν στο main του δημόσιου αποθετηρίου GitLab. Οι αριθμοί γραμμών μπορεί να αλλάζουν καθώς εξελίσσεται η εφαρμογή.

  • aiscbm8.bas — WAIT, διανομή συμβάντων και μάσκες περιβάλλοντος.
  • Basic8Config.asm — bit ειδοποιήσεων και API BASIC.
  • irqhandlers.asm — λειτουργίες IRQ και εναλλασσόμενος παλμός.
  • ais4cbmManager.asm — δημοσίευση και αναβολή ενημερώσεων σκαφών.