01 / ΤΟ ΒΑΣΙΚΟ ΣΥΣΤΑΤΙΚΟ
Περιμένοντας την αλλαγή ενός bit.
Η 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 έχει σημασία. Τρία από αυτά χρησιμοποιούνται στη γραφική προβολή:
| Τιμή | Δυαδικά | Σημασία | Πρωτόκολλο |
|---|---|---|---|
| 2 | 00000010 | Ειδοποίηση ποντικιού | Εκκρεμής σημαία προς κατανάλωση |
| 4 | 00000100 | Παλμός ρολογιού | Bit που εναλλάσσεται |
| 32 | 00100000 | Έτοιμη ενημέρωση σκάφους | Εκκρεμής σημαία προς κατανάλωση |
Πηγή: σταθερές ειδοποιήσεων στο Basic8Config.asm.
Μόλις ετοιμαστούν τα πεδία ενημέρωσης σκάφους, ο διαχειριστής θέτει το αντίστοιχο bit ειδοποίησης. ORA διατηρεί τα υπόλοιπα bit:
lda notifyFlag
ora #MESSAGE_FLAG
sta notifyFlag
Δείτε το φορτίο να δημοσιεύεται πριν τη σημαία.
Η IRQ εξυπηρετεί τον χρόνο, τη δειγματοληψία ποντικιού και τη σειριακή προσωρινή αποθήκευση. Η αποκωδικοποίηση και η δημοσίευση ενημερώσεων γίνονται στην κύρια διαδρομή εκτέλεσης, μέσω της παρέμβασης στις εντολές BASIC. Ένα ξεχωριστό bit αφύπνισης επιτρέπει στην IRQ να απελευθερώνει τη WAIT όταν πρέπει να αδειάσει η σειριακή προσωρινή μνήμη· οι παλμοί ρολογιού επαναφέρουν επίσης την BASIC στον βρόχο. Η BASIC διανέμει τις ειδοποιήσεις στις ρουτίνες του περιβάλλοντος.
Για τον χρονοπρογραμματισμό αυτής της διάταξης, διαβάστε Ένας βρόχος, δύο γλώσσες: IGONE.
03 / Ο ΠΡΑΓΜΑΤΙΚΟΣ ΒΡΟΧΟΣ
Επιλογή. Αναμονή. Χειρισμός.
Οι πρώτες τρεις εντολές της γραμμής 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. Προορίζονται για μελέτη και δεν αποτελούν αυτόνομο πρόγραμμα.
Ορισμός διευθύνσεων · Πλήρης βρόχος WAIT και διανομής
Εκκρεμείς σημαίες και αλλαγές κατάστασης
Μια εκκρεμής σημαία ποντικιού οδηγεί στον χειριστή του:
114 IF (WM AND 2) THEN GOSUB 600:GOTO 113
Ο χειριστής καταναλώνει την ειδοποίηση κλικ και η BASIC επιστρέφει στη WAIT. Ο πλήρης βρόχος δίνει προτεραιότητα στη σειριακή αποφόρτιση και στην αλληλεπίδραση πριν από τις ενημερώσεις σκαφών.
Ο παλμός χρησιμοποιεί διαφορετική χειραψία. Η IRQ εναλλάσσει το bit 2 με EOR· η BASIC θυμάται την εξυπηρετημένη τιμή στο MS:
lda #TICK
eor notifyFlag
sta notifyFlag
119 IF (XOR(WM,MS AND MK) AND 4) THEN MS=XOR(MS,4):GOSUB 200:GOTO 113
Μετά τον χειρισμό του παλμού, το αποθηκευμένο bit συμφωνεί με το τρέχον. Η WAIT περιμένει ξανά. Η επόμενη εναλλαγή τα διαφοροποιεί, είτε η μετάβαση είναι 0 → 1 ή 1 → 0.
Δημοσίευση παλμού και έλεγχος προστασίας · Χειριστές αλλαγής κατάστασης στην BASIC
Ένας διάλογος επιλέγει τα συμβάντα του
Η BASIC αλλάζει την κοινή μάσκα καθώς αλλάζει το περιβάλλον. Το παρακάτω απομονώνει την απενεργοποίηση ενδιαφέροντος για ενημερώσεις σκαφών:
POKE MP,(PEEK(MP) AND 223)
223 = 255 - 32. Ο πραγματικός διάλογος εξαιρεί προσωρινά αρκετά bit και επαναφέρει το ενδιαφέρον για σκάφη μόλις ολοκληρωθεί η μετάβαση σχεδίασης. Ο παραγωγός ML ελέγχει επίσης τη μάσκα και αναβάλλει τις κατάλληλες παραδόσεις. Η μάσκα από μόνη της αλλάζει μόνο τι αφυπνίζει τη WAIT.
Αλλαγές μάσκας διαλόγου σκάφους · Έλεγχος παράδοσης στην πλευρά του παραγωγού
04 / ΔΟΚΙΜΑΣΤΕ ΤΑ BIT
Κάντε τη WAIT να επιστρέψει.
Στείλτε κλικ ή ενημέρωση σκάφους και εξυπηρετήστε τα. Δοκιμάστε έναν παλμό, εξυπηρετήστε τον και εναλλάξτε τον ξανά. Και οι δύο ακμές αφυπνίζουν την BASIC. Αποεπιλέξτε συμβάν για να δείτε πώς η μάσκα αλλάζει τον έλεγχο.
2. Δημοσιεύστε μια ειδοποίηση
- Byte σημαιών · PEEK(WF)
- 0
- Μάσκα ενδιαφέροντος · MK
- 38
- Τελευταίος παλμός που εξυπηρετήθηκε · MS
- 0
(0 XOR 0) AND 38 = 0
Η WAIT ελέγχει τη μνήμηΚανένα επιλεγμένο συμβάν δεν διαφέρει από την εξυπηρετημένη κατάστασή του.
Μοντέλο τριών σημαιών στον φυλλομετρητή. Ο «Χειρισμός» μηδενίζει τις επιλεγμένες σημαίες ποντικιού/σκάφους και θυμάται τον παλμό. Η αλλαγή επιλογής αξιολογεί νέα συνθήκη WAIT· η πραγματική BASIC διαβάζει τα ορίσματα στην αρχή της WAIT. Το πρόγραμμα έχει ξεχωριστούς χειριστές και κανόνες παράδοσης στην πλευρά του παραγωγού.
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 — δημοσίευση και αναβολή ενημερώσεων σκαφών.
Περαιτέρω ανάγνωση: Οδηγός συστήματος Commodore 128: WAIT και η ρουτίνα WAIT της ROM του C128, όπου ο βρόχος ελέγχου εκτελεί XOR και μετά AND.