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

04 / ΤΙΜΕΣ ΑΝΑΜΕΣΑ ΣΤΙΣ ΓΛΩΣΣΕΣ

Ρωτήστε την ML.
Πάρτε μια τιμή BASIC.

Η WAIT και η USR συχνά περνούν απαρατήρητες μέχρι η BASIC να χρειαστεί τη γλώσσα μηχανής. Η WAIT λέει στο περιβάλλον πότε να ενεργήσει. Η USR ζητά τα δεδομένα που χρειάζεται, απευθείας μέσα σε έκφραση BASIC.

Commodore 128 · BASIC 7.0 + assembly 8502 · Συνοδευτικό των μαθημάτων WAIT και FAC

01 / ΜΙΑ ΣΥΝΑΡΤΗΣΗ ΠΟΥ ΠΑΡΕΧΕΤΕ ΕΣΕΙΣ

Το όρισμα είναι μια ερώτηση στη ρουτίνα ML.

USR(x) είναι συνάρτηση BASIC που υλοποιείτε σε γλώσσα μηχανής. Η BASIC αξιολογεί το όρισμα, περνά αριθμητική τιμή στον συσσωρευτή FAC1 και καλεί την εγκατεστημένη ρουτίνα. Η συνήθης αριθμητική διαδρομή επιστρέφει τιμή στον FAC1 για χρήση στην περιβάλλουσα έκφραση.

Στο AIS4CBM δίνουμε στο όρισμα συγκεκριμένη σημασία: το πεδίο που θέλουμε από το κλειδωμένο σκάφος. Με επιλεγμένο τον αναγνώστη σκάφους, η USR(2) ζητά το MMSI, η USR(5) ζητά ταχύτητα εδάφους και η USR(34) ζητά το όνομα.

SYS χρησιμεύει για ενέργειες και κλήσεις με καταχωρητές. USR χρησιμεύει όταν η ML παρέχει τιμή που η BASIC αναθέτει, εμφανίζει ή χρησιμοποιεί σε υπολογισμό. Εδώ συνεργάζονται: μια SYS επιλέγει και ετοιμάζει το σκάφος· οι USR διαβάζουν τα πεδία του.

02 / ΣΥΝΔΕΣΤΕ ΤΗΝ BASIC ΜΕ ΤΗ ΣΩΣΤΗ ΡΟΥΤΙΝΑ

Μία είσοδος USR, μία επιλεγμένη λειτουργία.

Στον C128, οι $1219/$121A κρατούν το χαμηλό και υψηλό byte διεύθυνσης στόχου USR, στην είσοδο άλματος που αρχίζει στη $1218. Η εγκατάστασή μας στρέφει αυτή την είσοδο στη usrDelegate, μια μικρή γέφυρα αλλαγής τράπεζας και επιστροφής:

Basic8Config.asm · εγκατάσταση γέφυρας USR
setDelegateUSR:
        lda #<usrDelegate
        sta $1219
        lda #>usrDelegate
        sta $121a
        rts

Μετά από επιτυχές κλείδωμα σκάφους, η getVesselDataImpl επιλέγει τη getData ως ρουτίνα πίσω από τη γέφυρα:

Basic8Config.asm · απόσπασμα μετά το επιτυχές κλείδωμα
        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 στη μέση τους.

03 / ΔΩΣΤΕ ΕΝΑ ΣΚΑΦΟΣ ΣΤΟΝ ΑΝΑΓΝΩΣΤΗ

Κλειδώστε μία φορά. Διαβάστε όσα πεδία χρειάζεστε.

Η συναλλαγή χρησιμοποιεί δύο διαφορετικά αναγνωριστικά. Το αναγνωριστικό εγγραφής επιλέγει το σκάφος· ο επιλογέας πεδίου επιλέγει την τιμή. Η SYS λαμβάνει το αναγνωριστικό εγγραφής ως χαμηλό και υψηλό byte. Κάθε επόμενη USR λαμβάνει μόνο επιλογέα πεδίου.

Το κλείδωμα/ανάκτηση φορτώνει μεταδεδομένα και διαθέσιμα φορτία σκάφους από την REU στην περιοχή εργασίας. Επιλέγει και τον κατάλληλο πίνακα πεδίων για την κλάση σκάφους. Η USR διαβάζει από αυτά τα δεδομένα, χωρίς νέα ανάκτηση REU για κάθε πεδίο.

Απλοποιημένη υπορουτίνα BASIC · ανάγνωση μόνο MMSI
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 για τη διάκριση.

Η πραγματική προβολή διαβάζει πολλά πεδία μαζί.

aiscbm8.bas · χειριστής στατικών δεδομένων κλάσης A, γραμμή 360
360 NM$=USR(34):IM=USR(6):CS$=USR(24):DE$=USR(8):DR=USR(14)/10:VT=USR(30)

Ο διάλογος έχει ήδη κλειδώσει το σκάφος και ελέγξει τα στατικά δεδομένα. Οι αναθέσεις ανακτούν όνομα, αριθμό IMO, διακριτικό κλήσης, προορισμό, βύθισμα και τύπο πλοίου. Η BASIC παραμένει υπεύθυνη για τη μορφοποίηση στην οθόνη.

Επιλεγμένα πεδία της τρέχουσας προβολής σκάφους
ΕπιλογέαςΠεδίοΧρήση στην BASIC
2MMSIΑριθμητική ταυτότητα, όπως MM=USR(2).
5Ταχύτητα ως προς το έδαφοςΠροβολή κλάσης A/B: USR(5)/10 μετατρέπει δέκατα κόμβου.
6Αριθμός IMOIM=USR(6) στον χειριστή στατικών δεδομένων κλάσης A.
24Διακριτικό κλήσηςΣυμβολοσειρά: CS$=USR(24).
34ΌνομαΣυμβολοσειρά: NM$=USR(34).
35Πορεία ως προς το έδαφοςUSR(35)/10 μετατρέπει δέκατα μοίρας.

Χρησιμοποιήστε τους επιλογείς και τη σημασία πεδίων της αντίστοιχης έκδοσης και κλάσης σκάφους. Η USR επιστρέφει αποθηκευμένη τιμή· η κλίμακα και οι τιμές AIS «μη διαθέσιμο» χρειάζονται ερμηνεία. Αν λείπει πεδίο ή φορτίο, ο τρέχων αναγνώστης επιστρέφει αριθμητικό μηδέν. Αυτό δεν σημαίνει αυτόματα κενή συμβολοσειρά ή μετρημένο μηδέν· ελέγξτε τη διαθεσιμότητα πριν αναθέσετε πεδίο κειμένου.

04 / ΜΙΑ ΕΡΩΤΗΣΗ, ΔΥΟ ΕΙΔΗ ΑΠΑΝΤΗΣΗΣ

Οι αριθμοί χρησιμοποιούν FAC. Τα ονόματα χρειάζονται συμβολοσειρά BASIC.

getData μετατρέπει το όρισμα USR από τον FAC1 σε δείκτη πεδίου. Ο πίνακας εντοπίζει πηγή και μετατόπιση στην κλειδωμένη εγγραφή, και ο περιγραφέας μέγεθος και τύπο. Το MMSI προέρχεται από το αντίγραφο μητρώου· τα πεδία θέσης και στατικών στοιχείων από τα ανακτημένα φορτία.

Η BASIC περνά επιλογέα μέσω FAC1 στη γέφυρα USR και τον αναγνώστη σκάφους. Αριθμοί επιστρέφουν μέσω FAC1 με carry μηδέν. Κείμενο χρησιμοποιεί περιγραφέα συμβολοσειράς BASIC και τη διαδρομή carry ένα. Κάθε κλήση ακολουθεί έναν κλάδο.
Κάθε κλήση ακολουθεί τον κλάδο του τύπου του πεδίου της. Η ταχύτητα και το όνομα του παραδείγματος είναι ενδεικτικά. Πλήρες μέγεθος ↗

Το αριθμητικό αποτέλεσμα αντικαθιστά το αριθμητικό όρισμα.

Για αριθμητικό πεδίο, η getDataByField αντιγράφει τα αποκωδικοποιημένα byte στη tempStoreκαι καλεί τη trans για μετατροπή σε FAC1. Η τιμή εισόδου ήταν ο επιλογέας· η τιμή εξόδου είναι η απάντηση. Για παράδειγμα, ταχύτητα κλάσης A/B με τιμή 123 γίνεται αριθμός BASIC 123, που διαιρείται με 10 για εμφάνιση 12,3 κόμβων.

Η αριθμητική διαδρομή επιστρέφει με carry μηδέν. Το μάθημα ακεραίου προς FAC αναλύει τη μετατροπή μεγαλύτερης τιμής όπως το MMSI.

Η συμβολοσειρά χρειάζεται περισσότερα από έναν δείκτη.

Για πεδίο κειμένου, η stringHandler βρίσκει το χρήσιμο μήκος, δεσμεύει χώρο μέσω των ρουτινών συμβολοσειρών BASIC, αντιγράφει χαρακτήρες στην Bank 1 και ετοιμάζει τον περιγραφέα. Έπειτα επιστρέφει με carry ένα.

Αυτό το carry είναι σύμβαση της δικής μας γέφυρας. Δεν είναι γενική δυνατότητα BASIC που μετατρέπει οποιαδήποτε USR σε συνάρτηση συμβολοσειράς. Η γέφυρα το αναγνωρίζει και ακολουθεί διαφορετική επιστροφή:

irqbridges.asm · ολόκληρη η usrDelegate, χωρίς σχόλια
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.

05 / ΔΥΟ ΜΙΚΡΕΣ ΔΥΝΑΤΟΤΗΤΕΣ, ΜΙΑ ΣΑΦΗΣ ΠΑΡΑΔΟΣΗ

Η WAIT λέει πότε. Η USR δίνει την τιμή.

Το περιβάλλον BASIC περιμένει σχετική ειδοποίηση, παίρνει το αναγνωριστικό σκάφους, κλειδώνει μέσω SYS, διαβάζει τα πεδία μέσω USR και αποδεσμεύει. Η ML διατηρεί την αποκωδικοποιημένη αποθήκευση· η BASIC χειρίζεται τιμές που ταιριάζουν φυσικά στις εκφράσεις της.

  • Εγκατάσταση πριν την κλήση. Η USR χρειάζεται έγκυρο στόχο και σωστή διαμόρφωση μνήμης.
  • Επιλέξτε τη λειτουργία. Η ίδια σύνταξη USR οδηγεί στον αναγνώστη σκάφους ή άλλη υπηρεσία, ανάλογα με τον ενεργό χειριστή.
  • Κρατήστε τη συναλλαγή ενιαία. Κλειδώστε, ελέγξτε την επιτυχία, διαβάστε τα διαθέσιμα πεδία και ξεκλειδώστε την ίδια εγγραφή.
  • Επιστρέψτε τον τύπο που περιμένει η BASIC. Ο FAC χειρίζεται αριθμούς· η διαδρομή κειμένου ετοιμάζει περιγραφέα και προσαρμόζει την επιστροφή μέσα στον διερμηνευτή.

Κώδικας και συνοδευτικές εξηγήσεις

Τα αποσπάσματα assembly κρατούν τις τρέχουσες εντολές, χωρίς σχόλια και με απλοποιημένα κενά. Η μικρή υπορουτίνα κλειδώματος/ανάγνωσης/αποδέσμευσης είναι διδακτικό παράδειγμα· η γραμμή 360 προέρχεται από την πραγματική προβολή. Οι σύνδεσμοι GitLab ακολουθούν το main.