01 / ΜΙΑ ΣΥΝΑΡΤΗΣΗ ΠΟΥ ΠΑΡΕΧΕΤΕ ΕΣΕΙΣ
Το όρισμα είναι μια ερώτηση στη ρουτίνα ML.
USR(x) είναι συνάρτηση BASIC που υλοποιείτε σε γλώσσα μηχανής. Η BASIC αξιολογεί το όρισμα, περνά αριθμητική τιμή στον συσσωρευτή FAC1 και καλεί την εγκατεστημένη ρουτίνα. Η συνήθης αριθμητική διαδρομή επιστρέφει τιμή στον FAC1 για χρήση στην περιβάλλουσα έκφραση.
Στο AIS4CBM δίνουμε στο όρισμα συγκεκριμένη σημασία: το πεδίο που θέλουμε από το κλειδωμένο σκάφος. Με επιλεγμένο τον αναγνώστη σκάφους, η USR(2) ζητά το MMSI, η USR(5) ζητά ταχύτητα εδάφους και η USR(34) ζητά το όνομα.
SYS χρησιμεύει για ενέργειες και κλήσεις με καταχωρητές. USR χρησιμεύει όταν η ML παρέχει τιμή που η BASIC αναθέτει, εμφανίζει ή χρησιμοποιεί σε υπολογισμό. Εδώ συνεργάζονται: μια SYS επιλέγει και ετοιμάζει το σκάφος· οι USR διαβάζουν τα πεδία του.
Η σύμβαση αριθμητικών κλήσεων της BASIC περιγράφεται στον Οδηγό συστήματος Commodore 128, ενότητα 18.42. Η επέκταση επιστροφής συμβολοσειρών του AIS4CBM εξηγείται παρακάτω.
02 / ΣΥΝΔΕΣΤΕ ΤΗΝ BASIC ΜΕ ΤΗ ΣΩΣΤΗ ΡΟΥΤΙΝΑ
Μία είσοδος USR, μία επιλεγμένη λειτουργία.
Στον C128, οι $1219/$121A κρατούν το χαμηλό και υψηλό byte διεύθυνσης στόχου USR, στην είσοδο άλματος που αρχίζει στη $1218. Η εγκατάστασή μας στρέφει αυτή την είσοδο στη usrDelegate, μια μικρή γέφυρα αλλαγής τράπεζας και επιστροφής:
setDelegateUSR:
lda #<usrDelegate
sta $1219
lda #>usrDelegate
sta $121a
rts
Μετά από επιτυχές κλείδωμα σκάφους, η getVesselDataImpl επιλέγει τη getData ως ρουτίνα πίσω από τη γέφυρα:
lda #<getData
sta usrDelegate.usrFarLo
lda #>getData
sta usrDelegate.usrFarHi
jsr setDelegateUSR
usrFarLo και usrFarHi ονομάζουν τα δύο byte διεύθυνσης μιας εντολής JSR μέσα στη γέφυρα. Η ενημέρωσή τους οδηγεί την επόμενη USR στην επιλεγμένη λειτουργία.
Αυτή η επιλογή έχει σημασία. Το API ώρας επιλέγει άλλον χειριστή: μετά τη SYS GT, η προβολή χρησιμοποιεί USR(1) και USR(2) για ώρα και ημερομηνία. Το κλείδωμα σκάφους επανεπιλέγει τον αναγνώστη πεδίων. Κρατήστε τις αναγνώσεις σκάφους μαζί· μην επιλέγετε άλλη υπηρεσία USR στη μέση τους.
Εγκατάσταση, API σκάφους και API ώρας · Mapping the Commodore 128: είσοδος άλματος USR
03 / ΔΩΣΤΕ ΕΝΑ ΣΚΑΦΟΣ ΣΤΟΝ ΑΝΑΓΝΩΣΤΗ
Κλειδώστε μία φορά. Διαβάστε όσα πεδία χρειάζεστε.
Η συναλλαγή χρησιμοποιεί δύο διαφορετικά αναγνωριστικά. Το αναγνωριστικό εγγραφής επιλέγει το σκάφος· ο επιλογέας πεδίου επιλέγει την τιμή. Η SYS λαμβάνει το αναγνωριστικό εγγραφής ως χαμηλό και υψηλό byte. Κάθε επόμενη USR λαμβάνει μόνο επιλογέα πεδίου.
Το κλείδωμα/ανάκτηση φορτώνει μεταδεδομένα και διαθέσιμα φορτία σκάφους από την REU στην περιοχή εργασίας. Επιλέγει και τον κατάλληλο πίνακα πεδίων για την κλάση σκάφους. Η USR διαβάζει από αυτά τα δεδομένα, χωρίς νέα ανάκτηση REU για κάθε πεδίο.
1000 BANK 0:SYS GV,1,LO,HI:RREG A,,,P
1010 IF (P AND 1)<>0 THEN RETURN
1020 MM=USR(2)
1030 SYS GV,4,LO,HI
1040 RETURN
Το διδακτικό απόσπασμα προϋποθέτει αρχικοποιημένο πυρήνα, GV=DEC("8022"), και έγκυρο αναγνωριστικό ήδη χωρισμένο στα LO/HI. Δεν είναι αυτόνομο πρόγραμμα. RREG αποθηκεύει την επιστρεφόμενη κατάσταση επεξεργαστή στο P· το bit 0 είναι το carry. Αν αποτύχει το κλείδωμα, επιστρέφει χωρίς ανάγνωση ή ξεκλείδωμα και η MM μένει αμετάβλητη.
Η ενέργεια 4 απελευθερώνει κλείδωμα μόνο ανάγνωσης χωρίς αποθήκευση οπτικών μεταδεδομένων. Ο χειριστής ενημέρωσης οθόνης χρησιμοποιεί την ενέργεια 0 αφού καταναλώσει και ενημερώσει τα μεταδεδομένα· αυτή η διαδρομή επιβεβαιώνει και το συμβάν σκάφους. Το παραπάνω απόσπασμα δεν επιβεβαιώνει συμβάν. Δείτε τη σύμβαση συναλλαγής του API για τη διάκριση.
Η πραγματική προβολή διαβάζει πολλά πεδία μαζί.
360 NM$=USR(34):IM=USR(6):CS$=USR(24):DE$=USR(8):DR=USR(14)/10:VT=USR(30)
Ο διάλογος έχει ήδη κλειδώσει το σκάφος και ελέγξει τα στατικά δεδομένα. Οι αναθέσεις ανακτούν όνομα, αριθμό IMO, διακριτικό κλήσης, προορισμό, βύθισμα και τύπο πλοίου. Η BASIC παραμένει υπεύθυνη για τη μορφοποίηση στην οθόνη.
| Επιλογέας | Πεδίο | Χρήση στην BASIC |
|---|---|---|
2 | MMSI | Αριθμητική ταυτότητα, όπως MM=USR(2). |
5 | Ταχύτητα ως προς το έδαφος | Προβολή κλάσης A/B: USR(5)/10 μετατρέπει δέκατα κόμβου. |
6 | Αριθμός IMO | IM=USR(6) στον χειριστή στατικών δεδομένων κλάσης A. |
24 | Διακριτικό κλήσης | Συμβολοσειρά: CS$=USR(24). |
34 | Όνομα | Συμβολοσειρά: NM$=USR(34). |
35 | Πορεία ως προς το έδαφος | USR(35)/10 μετατρέπει δέκατα μοίρας. |
Χρησιμοποιήστε τους επιλογείς και τη σημασία πεδίων της αντίστοιχης έκδοσης και κλάσης σκάφους. Η USR επιστρέφει αποθηκευμένη τιμή· η κλίμακα και οι τιμές AIS «μη διαθέσιμο» χρειάζονται ερμηνεία. Αν λείπει πεδίο ή φορτίο, ο τρέχων αναγνώστης επιστρέφει αριθμητικό μηδέν. Αυτό δεν σημαίνει αυτόματα κενή συμβολοσειρά ή μετρημένο μηδέν· ελέγξτε τη διαθεσιμότητα πριν αναθέσετε πεδίο κειμένου.
Πραγματικός διάλογος, έλεγχοι διαθεσιμότητας και αναγνώσεις πεδίων · Ορισμοί πεδίων και παραγωγή BASICFieldRef
04 / ΜΙΑ ΕΡΩΤΗΣΗ, ΔΥΟ ΕΙΔΗ ΑΠΑΝΤΗΣΗΣ
Οι αριθμοί χρησιμοποιούν FAC. Τα ονόματα χρειάζονται συμβολοσειρά BASIC.
getData μετατρέπει το όρισμα USR από τον FAC1 σε δείκτη πεδίου. Ο πίνακας εντοπίζει πηγή και μετατόπιση στην κλειδωμένη εγγραφή, και ο περιγραφέας μέγεθος και τύπο. Το MMSI προέρχεται από το αντίγραφο μητρώου· τα πεδία θέσης και στατικών στοιχείων από τα ανακτημένα φορτία.
Το αριθμητικό αποτέλεσμα αντικαθιστά το αριθμητικό όρισμα.
Για αριθμητικό πεδίο, η getDataByField αντιγράφει τα αποκωδικοποιημένα byte στη tempStoreκαι καλεί τη trans για μετατροπή σε FAC1. Η τιμή εισόδου ήταν ο επιλογέας· η τιμή εξόδου είναι η απάντηση. Για παράδειγμα, ταχύτητα κλάσης A/B με τιμή 123 γίνεται αριθμός BASIC 123, που διαιρείται με 10 για εμφάνιση 12,3 κόμβων.
Η αριθμητική διαδρομή επιστρέφει με carry μηδέν. Το μάθημα ακεραίου προς FAC αναλύει τη μετατροπή μεγαλύτερης τιμής όπως το MMSI.
Η συμβολοσειρά χρειάζεται περισσότερα από έναν δείκτη.
Για πεδίο κειμένου, η stringHandler βρίσκει το χρήσιμο μήκος, δεσμεύει χώρο μέσω των ρουτινών συμβολοσειρών BASIC, αντιγράφει χαρακτήρες στην Bank 1 και ετοιμάζει τον περιγραφέα. Έπειτα επιστρέφει με carry ένα.
Αυτό το carry είναι σύμβαση της δικής μας γέφυρας. Δεν είναι γενική δυνατότητα BASIC που μετατρέπει οποιαδήποτε USR σε συνάρτηση συμβολοσειράς. Η γέφυρα το αναγνωρίζει και ακολουθεί διαφορετική επιστροφή:
usrDelegate:
{
lda $ff00
sta initialBank+1
lda #BANK0
sta $FF00
.label usrFarLo = *+1
.label usrFarHi = *+2
jsr $0000
bcc !+
pla
pla
initialBank:
!: lda #$ff
sta $ff00
rts
}
Με carry μηδέν, η γέφυρα επαναφέρει την τράπεζα και επιστρέφει κανονικά. Με carry ένα, οι δύο εντολές PLA αφαιρούν μία αποθηκευμένη διεύθυνση επιστροφής από τη στοίβα. Μαζί με τον έτοιμο περιγραφέα συμβολοσειράς, αυτή η ειδική για τον διερμηνευτή διαδρομή επιτρέπει να λειτουργεί η NM$=USR(34) . Η προσαρμογή στοίβας ανήκει σε αυτή τη γέφυρα USR· δεν είναι γενική συνταγή επιστροφής κειμένου για οποιονδήποτε καλούντα ML.
getData, fieldSelector, getDataByField και stringHandler · Αριθμητική μετατροπή · Γέφυρα USR
05 / ΔΥΟ ΜΙΚΡΕΣ ΔΥΝΑΤΟΤΗΤΕΣ, ΜΙΑ ΣΑΦΗΣ ΠΑΡΑΔΟΣΗ
Η WAIT λέει πότε. Η USR δίνει την τιμή.
Το περιβάλλον BASIC περιμένει σχετική ειδοποίηση, παίρνει το αναγνωριστικό σκάφους, κλειδώνει μέσω SYS, διαβάζει τα πεδία μέσω USR και αποδεσμεύει. Η ML διατηρεί την αποκωδικοποιημένη αποθήκευση· η BASIC χειρίζεται τιμές που ταιριάζουν φυσικά στις εκφράσεις της.
- Εγκατάσταση πριν την κλήση. Η USR χρειάζεται έγκυρο στόχο και σωστή διαμόρφωση μνήμης.
- Επιλέξτε τη λειτουργία. Η ίδια σύνταξη USR οδηγεί στον αναγνώστη σκάφους ή άλλη υπηρεσία, ανάλογα με τον ενεργό χειριστή.
- Κρατήστε τη συναλλαγή ενιαία. Κλειδώστε, ελέγξτε την επιτυχία, διαβάστε τα διαθέσιμα πεδία και ξεκλειδώστε την ίδια εγγραφή.
- Επιστρέψτε τον τύπο που περιμένει η BASIC. Ο FAC χειρίζεται αριθμούς· η διαδρομή κειμένου ετοιμάζει περιγραφέα και προσαρμόζει την επιστροφή μέσα στον διερμηνευτή.
Κώδικας και συνοδευτικές εξηγήσεις
- Βρόχος συμβάντων με τη WAIT της BASIC — πότε πρέπει να ενεργεί η BASIC.
- Ένας βρόχος, δύο γλώσσες: IGONE — πώς η ML παίρνει χρόνο κύριας εκτέλεσης.
- API — κλήσεις, συναλλαγές εγγραφών και κοινά συμβάντα.
- basicinterface.asm — ο πλήρης αναγνώστης πεδίων σκάφους.
Τα αποσπάσματα assembly κρατούν τις τρέχουσες εντολές, χωρίς σχόλια και με απλοποιημένα κενά. Η μικρή υπορουτίνα κλειδώματος/ανάγνωσης/αποδέσμευσης είναι διδακτικό παράδειγμα· η γραμμή 360 προέρχεται από την πραγματική προβολή. Οι σύνδεσμοι GitLab ακολουθούν το main.