Κεφάλαιο 4: Εκμάθηση γλώσσας συναρμολόγησης μικροεπεξεργαστή 6502

Kephalaio 4 Ekmathese Glossas Synarmologeses Mikroepexergaste 6502



Κεφάλαιο 4: Εκμάθηση γλώσσας συναρμολόγησης μικροεπεξεργαστή 6502

4.1 Εισαγωγή

Ο μικροεπεξεργαστής 6502 κυκλοφόρησε το 1975. Χρησιμοποιήθηκε ως μικροεπεξεργαστής για ορισμένους προσωπικούς υπολογιστές τότε όπως οι Apple II, Commodore 64 και BBC Micro.







Ο μικροεπεξεργαστής 6502 εξακολουθεί να παράγεται σε μεγάλους αριθμούς σήμερα. Δεν είναι πλέον μια κεντρική μονάδα επεξεργασίας που χρησιμοποιείται σε προσωπικούς υπολογιστές (laptop) σήμερα, αλλά εξακολουθεί να παράγεται σε μεγάλους αριθμούς και χρησιμοποιείται σε ηλεκτρονικές και ηλεκτρικές συσκευές σήμερα. Για να κατανοήσουμε τις πιο σύγχρονες αρχιτεκτονικές υπολογιστών, είναι πολύ χρήσιμο να εξετάσουμε έναν παλαιότερο αλλά αρκετά επιτυχημένο μικροεπεξεργαστή όπως ο 6502.



Δεδομένου ότι είναι απλός στην κατανόηση και τον προγραμματισμό, είναι ένας από τους καλύτερους (αν όχι ο καλύτερος) μικροεπεξεργαστής που χρησιμοποιείται για τη διδασκαλία της γλώσσας assembly. Η γλώσσα Assembly είναι μια γλώσσα χαμηλού επιπέδου που μπορεί να χρησιμοποιηθεί για τον προγραμματισμό ενός υπολογιστή. Σημειώστε ότι η γλώσσα συναρμολόγησης για έναν μικροεπεξεργαστή είναι διαφορετική από τη γλώσσα συναρμολόγησης ενός άλλου μικροεπεξεργαστή. Η γλώσσα συναρμολόγησης του μικροεπεξεργαστή 6502 διδάσκεται σε αυτό το κεφάλαιο. Πιο συγκεκριμένα, είναι το 65C02 που διδάσκεται, αλλά αναφέρεται απλώς ως το 6502.



Ένας διάσημος υπολογιστής στο παρελθόν ονομάζεται commodore_64. Ο 6502 είναι ένας μικροεπεξεργαστής της οικογένειας 6500. Ο υπολογιστής commodore_64 χρησιμοποιεί τον μικροεπεξεργαστή 6510. Ο μικροεπεξεργαστής 6510 είναι των 6500 μP. Το σύνολο εντολών του 6502 µP είναι σχεδόν όλες οι οδηγίες του 6510 µP. Η γνώση αυτού του κεφαλαίου και του επόμενου βασίζεται στον υπολογιστή commodore_64. Αυτή η γνώση χρησιμοποιείται ως βάση για να εξηγήσει τις σύγχρονες αρχιτεκτονικές υπολογιστών και τα σύγχρονα λειτουργικά συστήματα σε αυτό το μέρος του διαδικτυακού μαθήματος σταδιοδρομίας.





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

Ο υπολογιστής commodore_64 λέγεται ότι είναι ένας υπολογιστής λέξης υπολογιστή 8-bit. Αυτό σημαίνει ότι οι πληροφορίες αποθηκεύονται, μεταφέρονται και χειρίζονται με τη μορφή δυαδικών κωδικών οκτώ bit.



Μπλοκ διάγραμμα της μητρικής πλακέτας Commodore 64
Το μπλοκ διάγραμμα της μητρικής πλακέτας commodore 64 είναι:


Εικ. 4.1 Μπλοκ διάγραμμα της μονάδας συστήματος Commodore_64

Φανταστείτε τον μικροεπεξεργαστή 6510 σαν τον μικροεπεξεργαστή 6502. Η συνολική μνήμη είναι μια σειρά από byte (8-bit ανά byte). Υπάρχει η μνήμη τυχαίας πρόσβασης (ανάγνωσης/εγγραφής) στην οποία μπορούν να εγγραφούν ή να διαγραφούν τα byte. Όταν ο υπολογιστής είναι απενεργοποιημένος, όλες οι πληροφορίες στη μνήμη τυχαίας πρόσβασης (RAM) διαγράφονται. Υπάρχει επίσης η μνήμη μόνο για ανάγνωση (ROM). Όταν ο υπολογιστής είναι απενεργοποιημένος, οι πληροφορίες στη ROM παραμένουν (δεν διαγράφονται).

Υπάρχει η θύρα εισόδου/εξόδου (κύκλωμα) που αναφέρεται ως συσκευές εισόδου/εξόδου στο διάγραμμα. Αυτή η θύρα δεν πρέπει να συγχέεται με τις θύρες που είναι ορατές στην αριστερή και δεξιά ή την εμπρός και πίσω κάθετη επιφάνεια της μονάδας συστήματος υπολογιστή. Αυτά είναι δύο διαφορετικά πράγματα. Οι συνδέσεις από αυτήν την εσωτερική θύρα με τα περιφερειακά, όπως ο σκληρός δίσκος (ή η δισκέτα), το πληκτρολόγιο και η οθόνη δεν εμφανίζονται στο διάγραμμα.

Υπάρχουν τρεις δίαυλοι (ομάδες ηλεκτρικών πολύ μικρών αγωγών καλωδίων) στο διάγραμμα. Κάθε καλώδιο μπορεί να μεταφέρει ένα bit 1 ή bit 0. Ο δίαυλος δεδομένων, για τη μεταφορά byte οκτώ bit κάθε φορά (ένας παλμός ρολογιού) στη μνήμη RAM και στη θύρα εισόδου/εξόδου (συσκευές εισόδου/εξόδου) είναι αμφίδρομος. Ο δίαυλος δεδομένων έχει πλάτος οκτώ bit.

Όλα τα στοιχεία είναι συνδεδεμένα στο δίαυλο διευθύνσεων. Ο δίαυλος διευθύνσεων είναι μονής κατεύθυνσης από τον μικροεπεξεργαστή. Υπάρχουν δεκαέξι αγωγοί για το δίαυλο διευθύνσεων και ο καθένας φέρει ένα bit (1 ή 0). Δεκαέξι bit αποστέλλονται σε έναν παλμό ρολογιού.

Υπάρχει το λεωφορείο ελέγχου. Μερικοί από τους αγωγούς του διαύλου ελέγχου θα μεταφέρουν ένα bit ο καθένας από τον μικροεπεξεργαστή στα άλλα εξαρτήματα. Μερικές γραμμές ελέγχου μεταφέρουν τα bit από τη θύρα εισόδου/εξόδου (IO) στον μικροεπεξεργαστή.

Μνήμη υπολογιστή
Η RAM και η ROM θεωρούνται ως ένα συγκρότημα μνήμης. Αυτό το συγκρότημα αναπαρίσταται διαγραμματικά ως εξής όπου οι δεκαεξαδικοί αριθμοί έχουν το πρόθεμα «$»:


Εικ. 4.11 Διάταξη μνήμης για τον υπολογιστή Commodore 64

Η RAM είναι από 0000 16 to DFFF 16 που γράφεται από $0000 έως $DFFF. Με τη γλώσσα συναρμολόγησης 6502 μP, ένας δεκαεξαδικός αριθμός έχει το πρόθεμα «$» και δεν έχει επίθημα (υπογράφεται) με 16 ή H ή εξάγωνο. Οποιεσδήποτε πληροφορίες στη μνήμη RAM σβήνουν όταν ο υπολογιστής είναι απενεργοποιημένος. Η ROM ξεκινά από $E000 έως $FFFF. Διαθέτει υπορουτίνες που δεν σβήνουν όταν ο υπολογιστής είναι απενεργοποιημένος. Αυτές οι υπορουτίνες είναι οι συνήθως χρησιμοποιούμενες ρουτίνες που βοηθούν στον προγραμματισμό. Το πρόγραμμα χρήστη τους καλεί (ανατρέξτε στο επόμενο κεφάλαιο).

Ο χώρος (byte) από 0200 $ έως D000 $ είναι για τα προγράμματα χρήστη. Ο χώρος από D000 $ έως $DFFF είναι για πληροφορίες που σχετίζονται άμεσα με τα περιφερειακά (συσκευές εισόδου/εξόδου). Αυτό είναι μέρος του λειτουργικού συστήματος. Έτσι, το λειτουργικό σύστημα του υπολογιστή commodore-64 χωρίζεται σε δύο βασικά μέρη: το εξάρτημα στη ROM που δεν σβήνει ποτέ και το εξάρτημα από $D000 έως $DFFF που σβήνει όταν απενεργοποιείται το ρεύμα. Αυτά τα δεδομένα IO (εισόδου/εξόδου) πρέπει να φορτώνονται από έναν δίσκο κάθε φορά που ενεργοποιείται ο υπολογιστής. Σήμερα, τέτοια δεδομένα ονομάζονται περιφερειακοί οδηγοί. Τα περιφερειακά ξεκινούν από τη θύρα Input/Output Device μέσω των συνδέσεων στη μητρική πλακέτα έως τις αναγνωρίσιμες θύρες στις κατακόρυφες επιφάνειες του υπολογιστή στις οποίες είναι συνδεδεμένη η οθόνη, το πληκτρολόγιο κ.λπ. και προς τα ίδια τα περιφερειακά (οθόνη, πληκτρολόγιο κ.λπ. .).

Η μνήμη αποτελείται από 2 16 = 65.536 θέσεις byte. Σε δεκαεξαδική μορφή, αυτά είναι 10000 16 = 10000 H = 10000 γοητεύω = 10000 $ τοποθεσίες. Στους υπολογιστές, η μέτρηση στη βάση δύο, στη βάση δέκα, στη βάση δεκαέξι, κ.λπ. ξεκινά από το 0 και όχι από το 1. Έτσι, η πρώτη θέση είναι στην πραγματικότητα ο αριθμός θέσης του 000000000000000000 2 = 0 10 = 0000 16 = 0000 $. Στη γλώσσα συναρμολόγησης 6502 μP, η αναγνώριση μιας θέσης διεύθυνσης έχει πρόθεμα $ και δεν υπάρχει επίθημα ή δείκτης. Η τελευταία τοποθεσία είναι ο αριθμός τοποθεσίας 1111111111111111 2 = 65.535 10 = FFFF 16 = $FFFF και όχι 10000000000000000 2 , ή 65.536 10 ή 10000 16 , ή 10000 $. Το 100000000000000000 2 , 65.536 10 , 10000 16 , ή 10000 $ δίνει τον συνολικό αριθμό θέσεων byte.

Εδώ, 2 16 = 65.536 = 64 x 1024 = 64 x 2 10 = 64 Kbyte (Kilobytes). Το επίθημα 64 στο όνομα Commodore-64 σημαίνει 64 KB συνολικής μνήμης (RAM και ROM). Ένα byte είναι 8 bit και τα 8 bit θα μεταφερθούν σε μία θέση byte στη μνήμη.

Τα 64 Kbyte μνήμης χωρίζονται σε σελίδες. Κάθε σελίδα έχει 0100 16 = 256 10 θέσεις byte. Τα πρώτα 256 10 = πρώτο 0100 16 Τοποθεσίες είναι η σελίδα 0. Η δεύτερη είναι η σελίδα 1, η τρίτη είναι η σελίδα 2 και ούτω καθεξής.

Για να αντιμετωπιστούν οι 65.536 τοποθεσίες, απαιτούνται 16 bit για κάθε θέση (διεύθυνση). Έτσι, ο δίαυλος διευθύνσεων από τον μικροεπεξεργαστή στη μνήμη αποτελείται από 16 γραμμές. μια γραμμή για ένα μπιτ. Ένα bit είναι είτε 1 είτε 0.

Οι καταχωρητές 6502 µP
Ένας καταχωρητής είναι σαν τα κελιά byte για μια θέση μνήμης byte. Το 6502 µP έχει έξι καταχωρητές: πέντε καταχωρητές 8-bit και έναν καταχωρητή 16-bit. Ο καταχωρητής 16 bit ονομάζεται μετρητής προγράμματος που συντομεύεται ως PC. Διατηρεί τη διεύθυνση μνήμης για την επόμενη εντολή. Ένα πρόγραμμα γλώσσας συναρμολόγησης αποτελείται από οδηγίες που τοποθετούνται στη μνήμη. Απαιτούνται δεκαέξι (16) διαφορετικά bit για την αντιμετώπιση μιας συγκεκριμένης θέσης byte στη μνήμη. Σε έναν συγκεκριμένο παλμό ρολογιού, αυτά τα bit αποστέλλονται στις γραμμές διευθύνσεων 16-bit του διαύλου διευθύνσεων για την ανάγνωση μιας εντολής. Όλοι οι καταχωρητές για το 6502 µP απεικονίζονται ως εξής:


Εικ. 4.12 Καταχωρητές 6502 μP

Ο μετρητής προγράμματος ή ο υπολογιστής μπορεί να φανεί ως καταχωρητής 16-bit στο διάγραμμα. Τα χαμηλότερα σημαντικά οκτώ bit επισημαίνονται ως PCL για Program Counter Low. Τα υψηλότερα σημαντικά οκτώ bit επισημαίνονται ως PCH για το Program Counter High. Μια εντολή στη μνήμη για το Commodore-64 μπορεί να αποτελείται από ένα, δύο ή τρία byte. Τα 16 bit στον υπολογιστή δείχνουν την επόμενη εντολή που θα εκτελεστεί, στη μνήμη. Μεταξύ των κυκλωμάτων του μικροεπεξεργαστή, δύο από αυτά ονομάζονται Αριθμητική Λογική Μονάδα και Αποκωδικοποιητής εντολών. Εάν η τρέχουσα εντολή που επεξεργάζεται στο µP (μικροεπεξεργαστής) έχει μήκος ένα byte, αυτά τα δύο κυκλώματα αυξάνουν τον υπολογιστή για την επόμενη εντολή κατά 1 μονάδα. Εάν η τρέχουσα εντολή που υποβάλλεται σε επεξεργασία στο μP έχει μήκος δύο byte, που σημαίνει ότι καταλαμβάνει δύο διαδοχικά byte στη μνήμη, αυτά τα δύο κυκλώματα αυξάνουν τον υπολογιστή για την επόμενη εντολή κατά 2 μονάδες. Εάν η τρέχουσα εντολή που υποβάλλεται σε επεξεργασία στο μP έχει μήκος τρία byte, που σημαίνει ότι καταλαμβάνει τρία διαδοχικά byte στη μνήμη, αυτά τα δύο κυκλώματα αυξάνουν τον υπολογιστή για την επόμενη εντολή κατά 3 μονάδες.

Ο συσσωρευτής 'A' είναι ένας καταχωρητής γενικού σκοπού οκτώ bit που αποθηκεύει το αποτέλεσμα των περισσότερων αριθμητικών και λογικών πράξεων.

Οι καταχωρητές 'X' και 'Y' χρησιμοποιούνται για την καταμέτρηση των βημάτων του προγράμματος. Η μέτρηση στον προγραμματισμό ξεκινά από το 0. Έτσι, ονομάζονται καταχωρητές ευρετηρίου. Έχουν κάποιους άλλους σκοπούς.

Αν και ο καταχωρητής Stack Pointer, το 'S' έχει 9 bit που θεωρείται καταχωρητής οκτώ bit. Το περιεχόμενό του οδηγεί σε μια θέση byte στη σελίδα 1 της μνήμης τυχαίας πρόσβασης (RAM). Η σελίδα 1 ξεκινά από το byte $0100 (256 10 ) σε byte $01FF (511 10 ). Όταν ένα πρόγραμμα εκτελείται, μετακινείται από μια εντολή στην επόμενη διαδοχική εντολή στη μνήμη. Ωστόσο, αυτό δεν συμβαίνει πάντα. Υπάρχουν φορές που μεταβαίνει από μια περιοχή μνήμης σε μια άλλη περιοχή μνήμης για να συνεχίσει να εκτελεί τις οδηγίες εκεί, διαδοχικά. Η σελίδα 1 στη μνήμη RAM χρησιμοποιείται ως στοίβα. Η στοίβα είναι μια μεγάλη περιοχή μνήμης RAM που έχει τις επόμενες διευθύνσεις για τη συνέχεια του κώδικα από όπου υπάρχει άλμα. Οι κωδικοί με οδηγίες μετάβασης δεν βρίσκονται στη στοίβα. βρίσκονται αλλού στη μνήμη. Ωστόσο, μετά την εκτέλεση των εντολών μετάβασης, οι διευθύνσεις συνέχειας (όχι τα τμήματα κώδικα) βρίσκονται στη στοίβα. Σπρώχνονταν εκεί ως αποτέλεσμα των οδηγιών άλματος ή κλαδιού.

Ο καταχωρητής κατάστασης επεξεργαστή οκτώ bit του P είναι ένα ειδικό είδος καταχωρητή. Τα μεμονωμένα bit δεν σχετίζονται ούτε συνδέονται μεταξύ τους. Κάθε bit εκεί ονομάζεται σημαία και εκτιμάται ανεξάρτητα από τα άλλα. Οι έννοιες των σημαιών δίνονται στη συνέχεια όπως παραστεί ανάγκη.

Το πρώτο και το τελευταίο ευρετήριο bit για κάθε καταχωρητή υποδεικνύονται πάνω από κάθε καταχωρητή στο προηγούμενο διάγραμμα. Η μέτρηση του δείκτη (θέση) bit σε έναν καταχωρητή ξεκινά από το 0 στα δεξιά.

Σελίδες μνήμης σε δυαδικό, δεκαεξαδικό και δεκαδικό
Ο παρακάτω πίνακας δείχνει την αρχή των σελίδων μνήμης σε δυαδικό, δεκαεξαδικό και δεκαδικό:

Κάθε σελίδα έχει 1.000.0000 2 αριθμός byte που είναι ίδιος με 100 H αριθμός byte που είναι ίδιος με 256 10 αριθμός byte. Στο προηγούμενο διάγραμμα μνήμης, οι σελίδες υποδεικνύονται ανεβαίνουν από τη σελίδα 0 και δεν κατεβαίνουν όπως υποδεικνύεται στον πίνακα.

Οι δυαδικές, δεκαεξαδικές και δεκαδικές στήλες αυτού του πίνακα δίνουν τις διευθύνσεις θέσης byte μνήμης στις διαφορετικές βάσεις τους. Σημειώστε ότι για τη σελίδα μηδέν, μόνο τα bit για το χαμηλότερο byte είναι απαραίτητα για πληκτρολόγηση κατά την κωδικοποίηση. Τα bit για το υψηλότερο byte μπορούν να παραληφθούν αφού είναι πάντα μηδενικά (για τη σελίδα μηδέν). Για τις υπόλοιπες σελίδες, θα πρέπει να χρησιμοποιηθούν τα bit για το υψηλότερο byte.

Το υπόλοιπο αυτού του κεφαλαίου εξηγεί τη Γλώσσα συναρμολόγησης 6502 µP χρησιμοποιώντας όλες τις προηγούμενες πληροφορίες. Για να κατανοήσει γρήγορα τη γλώσσα, ο αναγνώστης πρέπει να προσθέσει και να αφαιρέσει στη βάση δεκαέξι αντί στη βάση δέκα. Στην πραγματικότητα υποτίθεται ότι είναι η βάση δύο, αλλά ο υπολογισμός στη βάση δύο είναι περίπλοκος. Θυμηθείτε ότι όταν προσθέτετε δύο αριθμούς στη βάση δύο, η μεταφορά είναι ακόμα 1 όπως στη βάση δέκα. Αλλά όταν αφαιρούμε δύο αριθμούς στη βάση δύο, ένα δάνειο είναι δύο και όχι δέκα όπως στη βάση δέκα. Όταν προσθέτουμε δύο αριθμούς στη βάση δεκαέξι, η μεταφορά είναι ακόμα 1 όπως στη βάση δέκα. Αλλά όταν αφαιρούμε δύο αριθμούς στη βάση δεκαέξι, ένα δάνειο είναι δεκαέξι και όχι δέκα όπως στη βάση δέκα.

4.2 Οδηγίες μεταφοράς δεδομένων

Εξετάστε τον ακόλουθο πίνακα των οδηγιών μεταφοράς δεδομένων στη γλώσσα συναρμολόγησης για το 6502 µP:

Όταν ένα byte (8-bit) αντιγράφεται από μια θέση byte μνήμης στον καταχωρητή συσσωρευτή, στο X Register ή στο Y Register, αυτό φορτώνεται. Όταν ένα byte αντιγράφεται από οποιονδήποτε από αυτούς τους καταχωρητές σε μια θέση byte μνήμης, αυτό σημαίνει μεταφορά. Όταν ένα byte αντιγράφεται από έναν καταχωρητή σε άλλο, αυτό εξακολουθεί να μεταφέρεται. Στη δεύτερη στήλη του πίνακα, το βέλος δείχνει την κατεύθυνση του αντιγράφου για ένα byte. Οι υπόλοιπες τέσσερις στήλες δείχνουν διαφορετικούς τρόπους διευθυνσιοδότησης.

Μια καταχώρηση στη στήλη τρόπου διεύθυνσης είναι ο πραγματικός κωδικός byte για το αντίστοιχο μνημονικό τμήμα της εντολής σε δεκαεξαδικό. Το AE, για παράδειγμα, είναι ο πραγματικός κωδικός byte για το LDX, ο οποίος πρόκειται να φορτώσει ένα byte από τη μνήμη στον καταχωρητή X σε λειτουργία απόλυτης διεύθυνσης όπως AE 16 = 10101110 2 . Έτσι, τα bit για το LDX σε μια θέση byte μνήμης είναι 10101110.

Παρατηρήστε ότι για το μνημονικό τμήμα LDX της εντολής, υπάρχουν τρία πιθανά byte που είναι τα A2, AE και A6, και το καθένα είναι για μια συγκεκριμένη λειτουργία διευθυνσιοδότησης. Όταν το byte που φορτώνεται στον καταχωρητή X δεν πρόκειται να αντιγραφεί από μια θέση byte μνήμης, η τιμή πρέπει να πληκτρολογηθεί με (ακριβώς μετά) το μνημονικό LDX στην εντολή σε δεκαεξαδικό ή δεκαδικό. Σε αυτό το κεφάλαιο, τέτοιες τιμές πληκτρολογούνται σε δεκαεξαδικό. Αυτή είναι η άμεση διευθυνσιοδότηση, επομένως το πραγματικό byte στη μνήμη που αντιπροσωπεύει το LDX είναι A2 16 = 10100010 2 και όχι ΑΕ 16 που ισούται με 10101110 2 .

Στον πίνακα, όλα τα byte κάτω από τις επικεφαλίδες του τρόπου διευθυνσιοδότησης ονομάζονται Κωδικοί Λειτουργίας που συντομεύονται ως κωδικοί λειτουργίας. Μπορεί να υπάρχουν περισσότεροι από ένας κωδικοί λειτουργίας για ένα μνημονικό, ανάλογα με τον τρόπο διευθυνσιοδότησης.

Σημείωση: Η λέξη 'φόρτωση' στη μονάδα συστήματος υπολογιστή μπορεί να έχει δύο έννοιες: μπορεί να αναφέρεται στη φόρτωση ενός αρχείου από έναν δίσκο στη μνήμη του υπολογιστή ή μπορεί να αναφέρεται στη μεταφορά ενός byte από μια θέση byte μνήμης σε έναν καταχωρητή μικροεπεξεργαστή .

Υπάρχουν περισσότεροι τρόποι διευθυνσιοδότησης από τους τέσσερις στον πίνακα για τα 6502 µP.

Εκτός αν αναφέρεται διαφορετικά, όλος ο κώδικας προγραμματισμού χρήστη σε αυτό το κεφάλαιο ξεκινά από τη διεύθυνση 0200 16 που είναι η αρχή της περιοχής χρήστη στη μνήμη.

Μνήμη M και συσσωρευτής Α

Μνήμη σε συσσωρευτή

Άμεση Διεύθυνση
Η ακόλουθη οδηγία αποθηκεύει τον αριθμό FF 16 = 255 10 στον συσσωρευτή:

LDA #$FF

Το '$' δεν χρησιμοποιείται μόνο για την αναγνώριση μιας διεύθυνσης μνήμης. Σε γενικές γραμμές, χρησιμοποιείται για να δείξει ότι ο επόμενος αριθμός που ακολουθεί είναι δεκαεξαδικός. Σε αυτήν την περίπτωση, το $FF δεν είναι η διεύθυνση οποιασδήποτε θέσης byte μνήμης. Είναι ο αριθμός 255 10 σε δεκαεξαδικό. Η βάση 16 ή οποιοσδήποτε από τους άλλους ισοδύναμους δείκτες του δεν πρέπει να είναι γραμμένος στην οδηγία της γλώσσας συναρμολόγησης. Το «#» υποδηλώνει ότι ό,τι ακολουθεί στη συνέχεια είναι η τιμή που πρέπει να τοποθετηθεί στον καταχωρητή συσσωρευτή. Η τιμή μπορεί επίσης να γραφτεί στη βάση δέκα, αλλά αυτό δεν γίνεται σε αυτό το κεφάλαιο. Το '#' σημαίνει άμεση διευθυνσιοδότηση.

Ένα μνημονικό έχει κάποια ομοιότητα με την αντίστοιχη αγγλική του φράση. 'LDA #$FF' σημαίνει φόρτωση του αριθμού 255 10 στον συσσωρευτή A. Εφόσον πρόκειται για άμεση διευθυνσιοδότηση από τον προηγούμενο πίνακα, το LDA είναι A9 και όχι AD ή A5. Το A9 στο δυαδικό είναι 101010001. Έτσι, εάν το A9 για το LDA είναι στη διεύθυνση $0200 στη μνήμη, το $FF είναι σε $0301 = 0300 + 1 διεύθυνση. Ο #$FF είναι ακριβώς ο τελεστής για το μνημονικό LDA.

Απόλυτη προσφώνηση
Εάν η τιμή του $FF είναι στη θέση $0333 στη μνήμη, η προηγούμενη εντολή είναι:

LDA $0333

Σημειώστε την απουσία του #. Σε αυτήν την περίπτωση, η απουσία # σημαίνει ότι αυτό που ακολουθεί είναι μια διεύθυνση μνήμης και όχι η τιμή ενδιαφέροντος (όχι η τιμή που πρέπει να τοποθετηθεί στον συσσωρευτή). Έτσι, ο κωδικός λειτουργίας για το LDA, αυτή τη φορά, είναι AD και όχι A9 ή A5. Ο τελεστής για το LDA εδώ είναι η διεύθυνση $0333 και όχι η τιμή $FF. Το $FF βρίσκεται σε τοποθεσία $0333 που είναι μάλλον μακριά. Η εντολή 'LDA $0333' καταλαμβάνει τρεις διαδοχικές θέσεις στη μνήμη, και όχι δύο, όπως έκανε η προηγούμενη εικόνα. Το 'AD' για το LDA βρίσκεται στην τοποθεσία $0200. Το χαμηλότερο byte του 0333 που είναι 33 βρίσκεται στην τοποθεσία $0301. Το υψηλότερο byte των 0333 $ που είναι 03 βρίσκεται στη θέση 0302 $. Αυτό είναι μικρό endianness που χρησιμοποιείται από τη γλώσσα συναρμολόγησης 6502. Οι γλώσσες συναρμολόγησης διαφορετικών μικροεπεξεργαστών είναι διαφορετικές.

Αυτό είναι ένα παράδειγμα απόλυτης διευθυνσιοδότησης. Το $0333 είναι η διεύθυνση της τοποθεσίας που έχει $FF. Η εντολή αποτελείται από τρία διαδοχικά byte και δεν περιλαμβάνει το $FF ή την πραγματική θέση του byte.

Διεύθυνση μηδενικής σελίδας

Ας υποθέσουμε ότι η τιμή $FF βρίσκεται στη θέση μνήμης $0050 στη σελίδα μηδέν. Οι θέσεις byte για τη μηδενική σελίδα ξεκινούν από 0000 $ και τελειώνουν σε 00 $ FF. Αυτά είναι 256 10 τοποθεσίες συνολικά. Κάθε σελίδα της μνήμης Commodore-64 είναι 256 10 μακρύς. Παρατηρήστε ότι το υψηλότερο byte είναι μηδέν για όλες τις πιθανές θέσεις στο χώρο μηδενικής σελίδας στη μνήμη. Ο τρόπος διευθυνσιοδότησης μηδενικής σελίδας είναι ο ίδιος με τον απόλυτο τρόπο διευθυνσιοδότησης, αλλά το υψηλότερο byte 00 δεν πληκτρολογείται στην εντολή. Έτσι, για να φορτώσετε το $FF από τη θέση $0050 στον συσσωρευτή, η εντολή λειτουργίας διεύθυνσης μηδενικής σελίδας είναι:

LDA $50

Με το LDA να είναι A5 και όχι A9 ή AD, A5 16 = 10100101 2 . Θυμηθείτε ότι κάθε byte στη μνήμη αποτελείται από 8 κελιά και κάθε κελί φιλοξενεί ένα κομμάτι. Η οδηγία εδώ αποτελείται από δύο διαδοχικά byte. Το A5 για το LDA βρίσκεται στη θέση μνήμης $0200 και η διεύθυνση $50, χωρίς το υψηλότερο byte του 00, βρίσκεται στη θέση $0301. Η απουσία του 00, που θα είχε καταναλώσει ένα byte στη συνολική μνήμη 64K, εξοικονομεί χώρο στη μνήμη.

Συσσωρευτής στη μνήμη

Απόλυτη προσφώνηση
Η ακόλουθη οδηγία αντιγράφει μια τιμή byte, όποια κι αν είναι, από τον συσσωρευτή στη θέση μνήμης των $1444:

ΕΙΝΑΙ 1444 $

Αυτό λέγεται ότι μεταφέρεται από τον συσσωρευτή στη μνήμη. Δεν φορτώνει. Η φόρτωση είναι το αντίθετο. Το byte opcode για το STA είναι 8D 16 = 10001101 2 . Αυτή η εντολή αποτελείται από τρία διαδοχικά byte στη μνήμη. Το 8D 16 βρίσκεται στην τοποθεσία $0200. Το 44 16 της διεύθυνσης $1444 βρίσκεται στην τοποθεσία $0201. Και 14 16 βρίσκεται στην τοποθεσία 0202$ – λίγη δυσκολία. Το πραγματικό byte που αντιγράφεται δεν αποτελεί μέρος της εντολής. Το 8D και όχι το 85 για τη διεύθυνση μηδενικής σελίδας (στον πίνακα) χρησιμοποιούνται εδώ για το STA.

Διεύθυνση μηδενικής σελίδας
Η ακόλουθη οδηγία αντιγράφει μια τιμή byte, όποια κι αν είναι, από τον συσσωρευτή στη θέση μνήμης των 0050 $ στη σελίδα μηδέν:

STA $0050

Το byte του opcode για το STA εδώ είναι 85 16 = 10000101 2 . Αυτή η εντολή αποτελείται από δύο διαδοχικά byte στη μνήμη. Το 85 16 βρίσκεται στην τοποθεσία $0200. Τα 50 16 της διεύθυνσης $0050 βρίσκεται στην τοποθεσία $0201. Το θέμα του endianness δεν τίθεται εδώ γιατί η διεύθυνση έχει μόνο ένα byte που είναι το χαμηλότερο byte. Το πραγματικό byte που αντιγράφεται δεν αποτελεί μέρος της εντολής. Το 85 και όχι το 8D για τη διεύθυνση μηδενικής σελίδας χρησιμοποιούνται εδώ για το STA.

Δεν έχει νόημα η χρήση της άμεσης διεύθυνσης για τη μεταφορά ενός byte από τον συσσωρευτή σε μια θέση στη μνήμη. Αυτό συμβαίνει επειδή η πραγματική τιμή όπως το $FF πρέπει να αναφέρεται στην οδηγία για άμεση διευθυνσιοδότηση. Έτσι, δεν είναι δυνατή η άμεση διευθυνσιοδότηση για τη μεταφορά μιας τιμής byte από έναν καταχωρητή στο μP σε οποιαδήποτε θέση μνήμης.

LDX, STX, LDY και STY Mnemonics
Τα LDX και STX είναι παρόμοια με τα LDA και STA, αντίστοιχα. Αλλά εδώ, χρησιμοποιείται ο καταχωρητής Χ και όχι ο καταχωρητής Α (συσσωρευτής). Τα LDY και STY είναι παρόμοια με τα LDA και STA, αντίστοιχα. Αλλά εδώ, χρησιμοποιείται ο καταχωρητής Y και όχι ο καταχωρητής Α. Ανατρέξτε στον Πίνακα 4.21 για κάθε opcode σε δεκαεξαδικό που αντιστοιχεί σε μια συγκεκριμένη μνημονική και μια συγκεκριμένη λειτουργία διευθυνσιοδότησης.

Μεταγραφές εγγραφής για εγγραφή
Τα δύο προηγούμενα σύνολα οδηγιών στον Πίνακα 4.21 αφορούν την αντιγραφή μνήμης/μικροεπεξεργαστή-καταχωρητή (μεταφορά) και την αντιγραφή καταχωρητή/καταχώρισης (μεταφορά). Οι οδηγίες TAX, TXA, TAY, TYA, TSX και TXS κάνουν την αντιγραφή (μεταφορά) από τον καταχωρητή στον μικροεπεξεργαστή σε άλλο μητρώο του ίδιου μικροεπεξεργαστή.

Για να αντιγράψετε το byte από το A στο X, η οδηγία είναι:

ΦΟΡΟΣ

Για να αντιγράψετε το byte από το X στο A, η οδηγία είναι:

TX

Για να αντιγράψετε το byte από το A στο Y, η οδηγία είναι:

ΧΕΡΙ

Για να αντιγράψετε το byte από το Y στο A, η οδηγία είναι:

TYA

Για τον υπολογιστή commodore 64, η στοίβα είναι η σελίδα 1 ακριβώς μετά τη σελίδα 0 στη μνήμη. Όπως κάθε άλλη σελίδα, αποτελείται από 25610 10 τοποθεσίες byte, από $0100 έως $01FF. Κανονικά, ένα πρόγραμμα εκτελείται από μια εντολή στην επόμενη διαδοχική εντολή στη μνήμη. Από καιρό σε καιρό, υπάρχει ένα άλμα σε άλλο τμήμα κώδικα μνήμης (σύνολο εντολών). Η περιοχή στοίβας στη μνήμη (RAM) έχει τις επόμενες διευθύνσεις εντολών από όπου σταμάτησαν τα άλματα (ή οι διακλαδώσεις) για τη συνέχιση του προγράμματος.

Ο δείκτης στοίβας 'S' είναι ένας καταχωρητής 9-bit στα 6502 µP. Το πρώτο bit (αριστερό) είναι πάντα 1. Όλες οι διευθύνσεις θέσης byte στη σελίδα 1 ξεκινούν με 1 ακολουθούμενο από 8 διαφορετικά bit για τα 256 10 τοποθεσίες. Ο δείκτης στοίβας έχει τη διεύθυνση της τοποθεσίας στη σελίδα 1, η οποία έχει τη διεύθυνση της επόμενης εντολής που το πρόγραμμα πρέπει να επιστρέψει και να συνεχίσει μετά την εκτέλεση του τρέχοντος τμήματος κώδικα. Εφόσον το πρώτο bit όλων των διευθύνσεων της στοίβας (σελίδα μία) ξεκινά με 1, ο καταχωρητής δείκτη στοίβας χρειάζεται μόνο να κρατήσει τα υπόλοιπα οκτώ bit. Εξάλλου, το πρώτο του bit, που είναι το πιο αριστερό bit (το ένατο bit που μετράει από τα δεξιά του), είναι πάντα 1.

Για να αντιγράψετε το byte από το S στο X, η οδηγία είναι:

TSX

Για να αντιγράψετε το byte από το X στο S, η οδηγία είναι:

κείμενο

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

Σημείωση: Δεν υπάρχει μεταφορά Χ σε Υ ή Υ σε Χ (αντιγραφή).

4.3 Αριθμητικές Πράξεις

Το κύκλωμα, Αριθμητική Λογική Μονάδα στα 6502 μP, μπορεί να προσθέσει μόνο δύο αριθμούς οκτώ bit τη φορά. Δεν αφαιρεί, δεν πολλαπλασιάζεται και δεν διαιρείται. Ο παρακάτω πίνακας δείχνει τους κωδικούς λειτουργίας και τους τρόπους διευθυνσιοδότησης για αριθμητικές πράξεις:

Σημείωση: Όλα τα μνημονικά για αριθμητικές πράξεις και άλλα είδη πράξεων (δηλαδή και τα 6502 μνημονικά) λαμβάνουν ένα byte κώδικα λειτουργίας (op). Εάν υπάρχουν περισσότεροι από ένας τρόποι διευθυνσιοδότησης για το μνημονικό, θα υπάρχουν διαφορετικοί κωδικοί λειτουργίας για το ίδιο μνημονικό: ένας ανά λειτουργία διευθυνσιοδότησης. Τα C, D και V στον πίνακα είναι οι σημαίες του μητρώου κατάστασης. Οι έννοιές τους θα δοθούν αργότερα, εφόσον παραστεί ανάγκη.

Πρόσθεση ανυπόγραφων αριθμών
Με το 6502 μP, οι αριθμοί με την ένδειξη είναι συμπληρωματικοί αριθμοί δύο. Οι ανυπόγραφοι αριθμοί είναι συνηθισμένοι θετικοί αριθμοί που ξεκινούν από το μηδέν. Έτσι, για ένα byte οκτώ bit, ο μικρότερος ανυπόγραφος αριθμός είναι 00000000 2 = 0 10 = 00 16 και ο μεγαλύτερος ανυπόγραφος αριθμός είναι 11111111 2 = 255 10 = FF 16 . Για δύο ανυπόγραφους αριθμούς, η πρόσθεση είναι:

A+M+C→A

Αυτό σημαίνει ότι το περιεχόμενο 8-bit του συσσωρευτή προστίθεται από την αριθμητική λογική μονάδα σε ένα byte (8-bit) από τη μνήμη. Μετά την προσθήκη των A και M, η μεταφορά στο ένατο bit πηγαίνει στο κελί σημαίας μεταφοράς στον καταχωρητή κατάστασης. Οποιοδήποτε προηγούμενο bit μεταφοράς από μια προηγούμενη προσθήκη που εξακολουθεί να βρίσκεται στο κελί σημαίας μεταφοράς στον καταχωρητή κατάστασης προστίθεται επίσης στο άθροισμα των A και M, κάνοντας A+M+C→A. Το αποτέλεσμα επανατοποθετείται στον συσσωρευτή.

Εάν η προσθήκη ενδιαφέροντος είναι:

Α + Μ

Και δεν χρειάζεται να προσθέσετε καμία προηγούμενη μεταφορά, η σημαία μεταφοράς πρέπει να διαγραφεί η οποία γίνεται 0, έτσι ώστε η προσθήκη να είναι:

A+M+0→A ίδιο με το A+M→A

Σημείωση: Αν το Μ προστεθεί στο Α, και προκύπτει μια μεταφορά 1 επειδή το αποτέλεσμα είναι μεγαλύτερο από 255 10 = 11111111 2 = FF 16 , αυτή είναι μια νέα μεταφορά. Αυτή η νέα μεταφορά του 1 αποστέλλεται αυτόματα στο κελί σημαίας μεταφοράς σε περίπτωση που χρειαστεί να αθροιστεί το επόμενο ζεύγος οκτώ bit (άλλο A + M).

Κώδικας για προσθήκη δύο ανυπόγραφων οκτώ μπιτ
00111111 2 +00010101 2 είναι το ίδιο με το 3F 16 + 15 16 που είναι ίδιο με το 63 10 +21 10 . Το αποτέλεσμα είναι 010101002 2 που είναι ίδιο με το 54 16 και 84 10 . Το αποτέλεσμα δεν υπερβαίνει τον μέγιστο αριθμό για οκτώ bit που είναι 255 10 = 11111111 2 = FF 16 . Άρα, δεν υπάρχει προκύπτουσα μεταφορά του 1. Για να το θέσω αλλιώς, η προκύπτουσα μεταφορά είναι 0. Πριν από την πρόσθεση, δεν υπάρχει προηγούμενη μεταφορά του 1. Με άλλα λόγια, η προηγούμενη μεταφορά είναι 0. Ο κωδικός για να γίνει αυτή η πρόσθεση μπορεί να είναι:

CLC
LDA #$3F
ADC #$15

Σημείωση: Κατά την πληκτρολόγηση της γλώσσας συναρμολόγησης, το πλήκτρο «Enter» του πληκτρολογίου πατιέται στο τέλος κάθε εντολής. Υπάρχουν τρεις οδηγίες σε αυτόν τον κώδικα. Η πρώτη εντολή (CLC) διαγράφει τη σημαία μεταφοράς σε περίπτωση που μια προηγούμενη προσθήκη έχει 1. Το CLC μπορεί να γίνει μόνο σε λειτουργία σιωπηρής διεύθυνσης. Το μνημονικό για τη λειτουργία σιωπηρής διεύθυνσης δεν παίρνει τελεστή. Αυτό διαγράφει το κελί μεταφοράς από τον καταχωρητή κατάστασης του P. Εκκαθάριση σημαίνει ότι δίνεται το bit του 0 στο κελί σημαίας μεταφοράς. Οι επόμενες δύο οδηγίες στον κώδικα χρησιμοποιούν τη λειτουργία άμεσης διεύθυνσης. Με την άμεση διευθυνσιοδότηση, υπάρχει μόνο ένας τελεστής για το μνημονικό που είναι ένας αριθμός (και ούτε διεύθυνση μνήμης ούτε διεύθυνση μητρώου). Και έτσι, ο αριθμός πρέπει να προηγείται από το '#'. Το '$' σημαίνει ότι ο αριθμός που ακολουθεί είναι δεκαεξαδικός.

Η δεύτερη εντολή φορτώνει τον αριθμό 3F 16 στον συσσωρευτή. Για την τρίτη εντολή, το κύκλωμα αριθμητικής λογικής μονάδας του μP παίρνει την προηγούμενη (καθαρισμένη) μεταφορά του 0 (αναγκασμένη στο 0) του κελιού σημαίας μεταφοράς, του καταχωρητή κατάστασης και την προσθέτει στο 15 16 καθώς και στην τιμή που βρίσκεται ήδη στο 3F 16 συσσωρευτής και επαναφέρει το πλήρες αποτέλεσμα στον συσσωρευτή. Σε αυτήν την περίπτωση, προκύπτει μια μεταφορά 0. Η ALU (Αριθμητική Λογική Μονάδα) στέλνει (βάζει) το 0 στο κελί σημαία μεταφοράς του καταχωρητή κατάστασης. Το μητρώο κατάστασης επεξεργαστή και το μητρώο κατάστασης σημαίνουν το ίδιο πράγμα. Εάν προέκυψε μεταφορά 1, η ALU στέλνει το 1 στη σημαία μεταφοράς του μητρώου κατάστασης.

Οι τρεις γραμμές του προηγούμενου κώδικα πρέπει να βρίσκονται στη μνήμη πριν εκτελεστούν. Ο κωδικός 1816 για CLC (σιωπηρή διεύθυνση) βρίσκεται σε θέση 0200$ byte. Ο κωδικός Α9 16 για το LDA (άμεση διεύθυνση) βρίσκεται σε θέση 0201 $ byte. Ο αριθμός 3F 10 βρίσκεται σε τοποθεσία $0202 byte. Ο κωδικός 69 16 για το LDA (άμεση διεύθυνση) βρίσκεται σε θέση 0203 $ byte. Ο αριθμός 15 10 βρίσκεται σε θέση byte $0204.

Σημείωση: Το LDA είναι μια εντολή μεταφοράς (φορτίο) και όχι μια αριθμητική εντολή (μνημονική).

Κώδικας για προσθήκη δύο ανυπόγραφων δεκαέξι μπιτ
Όλοι οι καταχωρητές στο 6502 µP είναι ουσιαστικά καταχωρητές οκτώ bit, εκτός από τον υπολογιστή (Program Counter) που είναι 16 bit. Ακόμη και ο καταχωρητής κατάστασης έχει πλάτος 8 bit, αν και τα οκτώ του bit δεν λειτουργούν μαζί. Σε αυτή την ενότητα, εξετάζεται η προσθήκη δύο 16 δυαδικών ψηφίων χωρίς υπογραφή, με μεταφορά από το πρώτο ζεύγος οκτώ μπιτ στο δεύτερο ζεύγος οκτώ μπιτ. Η μεταφορά ενδιαφέροντος εδώ είναι η μεταφορά από τη θέση του όγδοου bit στη θέση του ένατου bit.

Έστω οι αριθμοί 0010101010111111 2 = 2ABF16 16 = 10.943 10 και 0010101010010101 2 = 2A95 16 = 10.901 10 . Το άθροισμα είναι 0101010101010100 2 = 5554 16 = 21.844 10 .

Η πρόσθεση αυτών των δύο ανυπόγραφων αριθμών στη βάση δύο έχει ως εξής:

Ο παρακάτω πίνακας δείχνει την ίδια προσθήκη με τη μεταφορά του 1 από το όγδοο bit στο ένατο bit, ξεκινώντας από τα δεξιά:

Κατά την κωδικοποίηση αυτού, τα δύο χαμηλότερα byte προστίθενται πρώτα. Στη συνέχεια, η ALU (Αριθμητική Λογική Μονάδα) στέλνει τη μεταφορά του 1 από τη θέση του όγδοου bit στη θέση του ένατου bit, στο κελί σημαίας μεταφοράς στον καταχωρητή κατάστασης. Το αποτέλεσμα του 0 1 0 1 0 1 0 0 χωρίς τη μεταφορά πηγαίνει στον συσσωρευτή. Στη συνέχεια, το δεύτερο ζεύγος byte προστίθεται με τη μεταφορά. Το μνημονικό ADC σημαίνει αυτόματη προσθήκη με την προηγούμενη μεταφορά. Σε αυτή την περίπτωση, η προηγούμενη μεταφορά, που είναι 1, δεν πρέπει να αλλάξει πριν από τη δεύτερη προσθήκη. Για την πρώτη προσθήκη, καθώς οποιαδήποτε προηγούμενη μεταφορά δεν αποτελεί μέρος αυτής της πλήρους προσθήκης, πρέπει να διαγραφεί (να γίνει 0).

Για την πλήρη προσθήκη των δύο ζευγών byte, η πρώτη προσθήκη είναι:

Α + Μ + 0 -> Α

Η δεύτερη προσθήκη είναι:

Α + Μ + 1 -> Α

Επομένως, η σημαία μεταφοράς πρέπει να διαγραφεί (δεδομένη τιμή 0) ακριβώς πριν από την πρώτη προσθήκη. Το ακόλουθο πρόγραμμα του οποίου ο αναγνώστης πρέπει να διαβάσει την επεξήγηση που ακολουθεί χρησιμοποιεί την απόλυτη λειτουργία διευθυνσιοδότησης για αυτήν την άθροιση:

CLC
LDA 0213 $
ADC $0215
; δεν υπάρχει εκκαθάριση γιατί απαιτείται η τιμή σημαίας μεταφοράς
STA $0217
LDA 0214 $
ADC $0216
STA $0218

Σημειώστε ότι με τη γλώσσα συναρμολόγησης 6502, ένα ερωτηματικό ξεκινά ένα σχόλιο. Αυτό σημαίνει ότι κατά την εκτέλεση του προγράμματος, το ερωτηματικό και ό,τι βρίσκεται στα δεξιά του αγνοείται. Το πρόγραμμα που γράφτηκε προηγουμένως είναι σε αρχείο κειμένου αποθηκεύεται με το όνομα της επιλογής του προγραμματιστή και με την επέκταση“.asm. Το προηγούμενο πρόγραμμα δεν είναι το ακριβές πρόγραμμα που πηγαίνει στη μνήμη για εκτέλεση. Το αντίστοιχο πρόγραμμα στη μνήμη ονομάζεται μεταφρασμένο πρόγραμμα όπου τα μνημονικά αντικαθίστανται με τους opcodes (bytes). Οποιοδήποτε σχόλιο παραμένει στο αρχείο κειμένου της γλώσσας συναρμολόγησης και αφαιρείται πριν το μεταφρασμένο πρόγραμμα φτάσει στη μνήμη. Στην πραγματικότητα, υπάρχουν δύο αρχεία που είναι αποθηκευμένα στο δίσκο σήμερα: το αρχείο “.asm” και το αρχείο “.exe”. Το αρχείο '.asm' είναι αυτό στην προηγούμενη εικόνα. Το αρχείο '.exe' είναι το αρχείο '.asm' με όλα τα σχόλια αφαιρεμένα και όλα τα μνημονικά αντικαθίστανται από τους κωδικούς λειτουργίας τους. Όταν ανοίγει σε ένα πρόγραμμα επεξεργασίας κειμένου, το αρχείο '.exe' δεν αναγνωρίζεται. Εκτός εάν ορίζεται διαφορετικά, για τους σκοπούς αυτού του κεφαλαίου, το αρχείο “.exe” αντιγράφεται στη μνήμη ξεκινώντας από τη θέση $0200. Αυτή είναι η άλλη έννοια της φόρτωσης.

Οι δύο αριθμοί 16-bit που θα προστεθούν καταλαμβάνουν τέσσερα byte στη μνήμη για απόλυτη διευθυνσιοδότηση: δύο byte ανά αριθμό (η μνήμη είναι μια ακολουθία byte). Με την απόλυτη διευθυνσιοδότηση, ο τελεστής στο opcode βρίσκεται στη μνήμη. Το αποτέλεσμα άθροισης έχει πλάτος δύο byte και πρέπει επίσης να τοποθετηθεί στη μνήμη. Αυτό δίνει συνολικά 6 10 = 6 16 byte για εισόδους και εξόδους. Οι είσοδοι δεν προέρχονται από το πληκτρολόγιο και η έξοδος δεν είναι από την οθόνη ή τον εκτυπωτή. Οι είσοδοι βρίσκονται στη μνήμη (RAM) και η έξοδος (αθροιστικό αποτέλεσμα) επιστρέφει στη μνήμη (RAM) σε αυτήν την περίπτωση.

Πριν από την εκτέλεση ενός προγράμματος, η μεταφρασμένη έκδοση πρέπει να βρίσκεται πρώτα στη μνήμη. Κοιτάζοντας τον προηγούμενο κώδικα προγράμματος, μπορεί να φανεί ότι οι οδηγίες χωρίς το σχόλιο αποτελούν το 19 10 = 13 16 byte. Έτσι, το πρόγραμμα παίρνει από 0200 $ θέση byte στη μνήμη σε $0200 + $13 – $1 = $0212 θέσεις byte (ξεκινώντας από $0200 και όχι $0201 που σημαίνει – $1). Προσθέτοντας τα 6 byte για τους αριθμούς εισόδου και εξόδου, όλο το πρόγραμμα τελειώνει στα $0212 + $6 = $0218. Η συνολική διάρκεια του προγράμματος είναι 19 16 = 25 10 .

Το χαμηλότερο byte του augend θα πρέπει να βρίσκεται στη διεύθυνση $0213 και το υψηλότερο byte του ίδιου augend θα πρέπει να βρίσκεται στη διεύθυνση $0214 - μικρή endianness. Ομοίως, το χαμηλότερο byte του addend θα πρέπει να βρίσκεται στη διεύθυνση $0215 και το υψηλότερο byte του ίδιου addend θα πρέπει να βρίσκεται στη διεύθυνση $0216 - μικρή endianness. Το χαμηλότερο byte του αποτελέσματος (άθροισμα) θα πρέπει να βρίσκεται στη διεύθυνση $0217 και το υψηλότερο byte του ίδιου αποτελέσματος θα πρέπει να βρίσκεται στη διεύθυνση $0218 - μικρή endianness.

Ο κωδικός 18 16 για το CLC (σιωπηρή διεύθυνση) βρίσκεται στη θέση byte των 0200 $. Ο κωδικός για το 'LDA $0213', δηλαδή μ.Χ 16 για LDA (απόλυτη διευθυνσιοδότηση), βρίσκεται στη θέση byte των 0201 $. Το χαμηλότερο byte του augend που είναι 10111111 βρίσκεται στη θέση του byte μνήμης 0213 $. Να θυμάστε ότι κάθε opcode καταλαμβάνει ένα byte. Η διεύθυνση '$0213' του 'LDA $0213' βρίσκεται στις θέσεις byte των 0202 $ και 0203 $. Η εντολή 'LDA $0213' φορτώνει το κάτω byte του augend στον συσσωρευτή.

Ο κωδικός για το 'ADC $0215', δηλαδή 6D 16 για ADC (απόλυτη διευθυνσιοδότηση), βρίσκεται στη θέση byte των 0204 $. Το χαμηλότερο byte του addend που είναι 10010101 βρίσκεται στη θέση byte των 0215 $. Η διεύθυνση '$0215' του 'ADC $0215' βρίσκεται στις θέσεις byte των 0205 $ και 0206 $. Η εντολή 'ADC $0215' προσθέτει το χαμηλότερο byte του addend στο χαμηλότερο byte του augend που βρίσκεται ήδη στον συσσωρευτή. Το αποτέλεσμα τοποθετείται πίσω στον συσσωρευτή. Οποιαδήποτε μεταφορά μετά το όγδοο bit αποστέλλεται στη σημαία μεταφοράς του μητρώου κατάστασης. Το κελί σημαίας μεταφοράς δεν πρέπει να διαγραφεί πριν από τη δεύτερη προσθήκη των υψηλότερων byte. Αυτή η μεταφορά προστίθεται αυτόματα στο άθροισμα των υψηλότερων byte. Στην πραγματικότητα, μια μεταφορά 0 προστίθεται στο άθροισμα των χαμηλότερων byte αυτόματα στην αρχή (ισοδύναμο με τη μη προσθήκη μεταφοράς) λόγω CLC.

Το σχόλιο παίρνει τα επόμενα 48 10 = 30 16 bytes. Ωστόσο, αυτό παραμένει μόνο στο αρχείο κειμένου '.asm'. Δεν φτάνει στη μνήμη. Αφαιρείται από τη μετάφραση που γίνεται από το assembler (ένα πρόγραμμα).

Για την επόμενη οδηγία που είναι 'STA $0217', ο κωδικός STA που είναι 8D 16 (απόλυτη διεύθυνση) βρίσκεται στη θέση byte των $0207. Η διεύθυνση '$0217' του 'STA $0217' βρίσκεται στις θέσεις μνήμης των 0208 $ και 0209 $. Η εντολή 'STA $0217' αντιγράφει το περιεχόμενο των οκτώ bit του συσσωρευτή στη θέση μνήμης των 0217 $.

Το υψηλότερο byte του augend που είναι 00101010 βρίσκεται στη θέση μνήμης των 0214 $ και το υψηλότερο byte του πρόσθετου που είναι 00101010 βρίσκεται στη θέση byte των 02 $ 16 . Ο κωδικός ενεργοποίησης για το 'LDA $0214' που είναι AD16 για το LDA (απόλυτη διευθυνσιοδότηση) βρίσκεται στη θέση byte των $020A. Η διεύθυνση '$0214' του 'LDA $0214' βρίσκεται στις τοποθεσίες των $020B και $020C. Η εντολή 'LDA $0214' φορτώνει το υψηλότερο byte του augend στον συσσωρευτή, διαγράφοντας οτιδήποτε υπάρχει στον συσσωρευτή.

Ο κωδικός λειτουργίας για το 'ADC $0216' που είναι 6D 16 για το ADC (απόλυτη διευθυνσιοδότηση) βρίσκεται στη θέση byte των $020D. Η διεύθυνση '$0216' του 'ADC 0216' βρίσκεται στις θέσεις byte των $020E και $020F. Η εντολή 'ADC $0216' προσθέτει το υψηλότερο byte του addend στο υψηλότερο byte του augend που βρίσκεται ήδη στον συσσωρευτή. Το αποτέλεσμα τοποθετείται ξανά στον συσσωρευτή. Εάν υπάρχει μεταφορά 1, για αυτήν τη δεύτερη προσθήκη, τοποθετείται αυτόματα στο κελί μεταφοράς του μητρώου κατάστασης. Αν και η μεταφορά πέρα ​​από το δέκατο έκτο bit (αριστερά) δεν απαιτείται για αυτό το πρόβλημα, είναι ωραίο να ελέγξετε εάν όντως έγινε μεταφορά 1 ελέγχοντας εάν η σημαία μεταφοράς έγινε 1.

Για την επόμενη και τελευταία εντολή που είναι 'STA $0218', ο κωδικός ενεργοποίησης του STA που είναι 8D16 (απόλυτη διευθυνσιοδότηση) βρίσκεται στη θέση byte των 0210 $. Η διεύθυνση '$0218' του 'STA $0218' βρίσκεται στις θέσεις μνήμης των 0211 $ και 0212 $. Η εντολή 'STA $0218' αντιγράφει το περιεχόμενο των οκτώ bit του συσσωρευτή στη θέση μνήμης των 0218 $. Το αποτέλεσμα της προσθήκης των δύο αριθμών των δεκαέξι bit είναι 0101010101010100, με το χαμηλότερο byte το 01010100 στη θέση μνήμης των 0217 $ και το υψηλότερο byte του 01010101 στη θέση μνήμης των 0218 $ – μικρή endianness.

Αφαίρεση
Με το 6502 μP, οι αριθμοί με την ένδειξη είναι συμπληρωματικοί αριθμοί δύο. Ο αριθμός συμπληρώματος δύο μπορεί να είναι οκτώ, δεκαέξι μπιτ ή οποιοδήποτε πολλαπλάσιο των οκτώ μπιτ. Με το συμπλήρωμα δύο, το πρώτο bit από τα αριστερά είναι το bit πρόσημο. Για έναν θετικό αριθμό, αυτό το πρώτο bit είναι 0 για να δείξει το πρόσημο. Τα υπόλοιπα bit σχηματίζουν τον αριθμό με τον κανονικό τρόπο. Για να λάβετε το συμπλήρωμα των δύο ενός αρνητικού αριθμού, αντιστρέψτε όλα τα bit για τον αντίστοιχο θετικό αριθμό και, στη συνέχεια, προσθέστε 1 στο αποτέλεσμα από το δεξί άκρο.

Για να αφαιρέσετε έναν θετικό αριθμό από έναν άλλο θετικό αριθμό, το δευτερεύον άκρο μετατρέπεται σε αρνητικό αριθμό συμπληρώματος δύο. Στη συνέχεια, το minuend και ο νέος αρνητικός αριθμός προστίθενται με τον κανονικό τρόπο. Έτσι, η αφαίρεση των οκτώ bit γίνεται:

Όπου η μεταφορά θεωρείται ως 1. Το αποτέλεσμα στον συσσωρευτή είναι η διαφορά στο συμπλήρωμα δύο. Έτσι, για να αφαιρέσετε δύο αριθμούς, η σημαία μεταφοράς πρέπει να οριστεί (να γίνει 1).

Κατά την αφαίρεση δύο αριθμών των δεκαέξι bit, η αφαίρεση γίνεται δύο φορές όπως με την προσθήκη δύο αριθμών δεκαέξι bit. Εφόσον η αφαίρεση είναι μια μορφή πρόσθεσης με το 6502 μP, όταν αφαιρούνται δύο αριθμοί δεκαέξι bit, η σημαία μεταφοράς ορίζεται μόνο μία φορά για την πρώτη αφαίρεση. Για τη δεύτερη αφαίρεση, οποιαδήποτε ρύθμιση της σημαίας μεταφοράς γίνεται αυτόματα.

Ο προγραμματισμός της αφαίρεσης για αριθμούς οκτώ bit ή αριθμούς δεκαέξι bit γίνεται παρόμοια με τον προγραμματισμό της πρόσθεσης. Ωστόσο, η σημαία μεταφοράς πρέπει να τοποθετηθεί από την αρχή. Το μνημονικό για να γίνει αυτό είναι:

Αφαίρεση με θετικούς αριθμούς δεκαέξι bit
Θεωρήστε την αφαίρεση με τους παρακάτω αριθμούς:

Αυτή η αφαίρεση δεν περιλαμβάνει συμπλήρωμα δύο. Δεδομένου ότι η αφαίρεση σε 6502 μP γίνεται σε συμπλήρωμα δύο, η αφαίρεση στη βάση δύο γίνεται ως εξής:

Το αποτέλεσμα του συμπληρώματος των δύο είναι το ίδιο με το αποτέλεσμα που προκύπτει από τη συνηθισμένη αφαίρεση. Ωστόσο, σημειώστε ότι το 1 που πηγαίνει στη θέση δέκατου έβδομου bit από τα δεξιά αγνοείται. Το minuend και το subtrahend χωρίζονται σε δύο bit οκτώ το καθένα. Το συμπλήρωμα των δύο του 10010110 του χαμηλότερου byte του subtrahend καθορίζεται ανεξάρτητα από το υψηλότερο byte του και από οποιαδήποτε μεταφορά. Το συμπλήρωμα των δύο του 11101011 του υψηλότερου byte του subtrahend καθορίζεται ανεξάρτητα από το χαμηλότερο byte του και από οποιαδήποτε μεταφορά.

Τα 16 bit του minuend είναι ήδη στη συμπλήρωση δύο, ξεκινώντας με το 0 από τα αριστερά. Έτσι, δεν χρειάζεται καμία προσαρμογή σε bit. Με το 6502 μP, το χαμηλότερο byte του minuend χωρίς καμία τροποποίηση προστίθεται στο χαμηλότερο byte του συμπληρώματος των δύο του subtrahend. Το κάτω byte του minuend δεν μετατρέπεται σε συμπλήρωμα δύο γιατί τα δεκαέξι bit ολόκληρου του minuend πρέπει να είναι ήδη στο συμπλήρωμα δύο (με το 0 ως πρώτο bit στα αριστερά). Σε αυτήν την πρώτη προσθήκη, προστίθεται μια υποχρεωτική μεταφορά 1 λόγω της εντολής 1=0 SEC.

Στην τρέχουσα ενεργή αφαίρεση, υπάρχει μια μεταφορά 1 (προσθήκης) από το όγδοο bit στο ένατο bit (από τα δεξιά). Δεδομένου ότι αυτό είναι ουσιαστικά αφαίρεση, οποιοδήποτε bit που υποτίθεται ότι βρίσκεται στη σημαία μεταφοράς στον καταχωρητή κατάστασης συμπληρώνεται (αντιστρέφεται). Έτσι, η μεταφορά του 1 γίνεται 0 στη σημαία C. Στη δεύτερη λειτουργία, το υψηλότερο byte του minuend προστίθεται στο συμπληρωματικό byte των δύο υψηλότερων του subtrahend. Το αυτόματα συμπληρωμένο bit σημαίας μεταφοράς του καταχωρητή κατάστασης (στην περίπτωση αυτή είναι 0) προστίθεται επίσης (στα υψηλότερα byte). Οποιοδήποτε 1 υπερβαίνει το δέκατο έκτο bit από τα δεξιά αγνοείται.

Το επόμενο πράγμα είναι απλώς να κωδικοποιήσετε όλο αυτό το σχήμα ως εξής:

SEC
LDA 0213 $
SBC $0215
; δεν υπάρχει εκκαθάριση γιατί απαιτείται η ανεστραμμένη τιμή σημαίας μεταφοράς
STA $0217
LDA 0214 $
SBC $0216
STA $0218

Θυμηθείτε ότι με τη γλώσσα συναρμολόγησης 6502, ένα ερωτηματικό ξεκινά ένα σχόλιο το οποίο δεν περιλαμβάνεται στη μεταφρασμένη έκδοση του προγράμματος στη μνήμη. Οι δύο αριθμοί 16-bit για αφαίρεση καταλαμβάνουν τέσσερα byte μνήμης με απόλυτη διευθυνσιοδότηση. δύο ανά αριθμό (η μνήμη είναι μια σειρά byte). Αυτές οι είσοδοι δεν προέρχονται από το πληκτρολόγιο. Το αποτέλεσμα άθροισης είναι δύο byte και πρέπει επίσης να τοποθετηθεί στη μνήμη σε διαφορετική θέση. Αυτή η έξοδος δεν πηγαίνει στην οθόνη ή στον εκτυπωτή. πηγαίνει στη μνήμη. Αυτό δίνει συνολικά 6 10 = 6 16 byte για εισόδους και εξόδους που θα τοποθετηθούν στη μνήμη (RAM).

Πριν εκτελεστεί ένα πρόγραμμα, πρέπει πρώτα να βρίσκεται στη μνήμη. Κοιτάζοντας τον κώδικα του προγράμματος, μπορεί να φανεί ότι οι οδηγίες χωρίς το σχόλιο αποτελούν το 19 10 = 13 16 byte. Εφόσον όλα τα προγράμματα σε αυτό το κεφάλαιο ξεκινούν από τη θέση μνήμης των 0200 $, το πρόγραμμα μεταβαίνει από τη θέση των 0200 $ byte στη μνήμη στη θέση $0200 + $13 – $1 = $0212 byte (ξεκινώντας από $0200 και όχι $0201). Αυτό το εύρος δεν περιλαμβάνει την περιοχή για τα byte εισόδου και εξόδου. Οι δύο αριθμοί εισόδου παίρνουν 4 byte και ο ένας αριθμός εξόδου παίρνει 2 byte. Προσθέτοντας τα 6 byte για τους αριθμούς εισόδου και εξόδου δημιουργείται το εύρος για το πρόγραμμα που τελειώνει στα $0212 + $6 = $0218. Η συνολική διάρκεια του προγράμματος είναι 19 16 = 25 10 .

Το χαμηλότερο byte του minuend θα πρέπει να βρίσκεται στη διεύθυνση $0213 και το υψηλότερο byte του ίδιου minuend θα πρέπει να βρίσκεται στη διεύθυνση $0214 - μικρή endianness. Ομοίως, το χαμηλότερο byte του subtrahend θα πρέπει να βρίσκεται στη διεύθυνση $0215 και το υψηλότερο byte του ίδιου subtrahend θα πρέπει να βρίσκεται στη διεύθυνση $0216 - μικρή endianness. Το χαμηλότερο byte του αποτελέσματος (διαφορά) θα πρέπει να βρίσκεται στη διεύθυνση $0217 και το υψηλότερο byte του ίδιου αποτελέσματος θα πρέπει να βρίσκεται στη διεύθυνση $0218 - μικρή endianness.

Ο κωδικός 38 16 για SEC (σιωπηρή διεύθυνση) βρίσκεται στη διεύθυνση $0200. Όλα τα προγράμματα αυτού του κεφαλαίου θεωρείται ότι ξεκινούν από τη θέση μνήμης των $0200, ακυρώνοντας οποιοδήποτε πρόγραμμα θα ήταν εκεί. εκτός αν αναφέρεται διαφορετικά. Ο κωδικός για το 'LDA $0213', δηλαδή μ.Χ 16 , για το LDA (απόλυτη διεύθυνση) βρίσκεται στη θέση $0201 byte. Το χαμηλότερο byte του minuend που είναι 10111111 βρίσκεται στη θέση του byte μνήμης 0213 $. Να θυμάστε ότι κάθε opcode καταλαμβάνει ένα byte. Η διεύθυνση '$0213' του 'LDA $0213' βρίσκεται στις θέσεις byte των 0202 $ και 0203 $. Η εντολή 'LDA $0213' φορτώνει το χαμηλότερο byte του minuend στον συσσωρευτή.

Ο κωδικός για το 'SBC $0215', δηλαδή ED 16 , για το SBC (απόλυτη διεύθυνση) βρίσκεται στη θέση 0204 $ byte. Το χαμηλότερο byte του subtrahend που είναι 01101010 βρίσκεται στη θέση 0215 $ byte. Η διεύθυνση '$0215' του 'ADC $0215' βρίσκεται στις θέσεις byte των 0205 $ και 0206 $. Η εντολή 'SBC $0215' αφαιρεί το χαμηλότερο byte του subtrahend από το χαμηλότερο byte του minuend που βρίσκεται ήδη στον συσσωρευτή. Αυτή είναι η αφαίρεση του συμπληρώματος δύο. Το αποτέλεσμα τοποθετείται πίσω στον συσσωρευτή. Το συμπλήρωμα (αναστροφή) οποιασδήποτε μεταφοράς μετά το όγδοο bit αποστέλλεται στη σημαία μεταφοράς του καταχωρητή κατάστασης. Αυτή η σημαία μεταφοράς δεν πρέπει να διαγραφεί πριν από τη δεύτερη αφαίρεση με τα υψηλότερα byte. Αυτή η μεταφορά προστίθεται αυτόματα στην αφαίρεση των υψηλότερων byte.

Το σχόλιο παίρνει τα επόμενα 57 10 = 3916 16 byte. Ωστόσο, αυτό παραμένει μόνο στο αρχείο κειμένου '.asm'. Δεν φτάνει στη μνήμη. Αφαιρείται από τη μετάφραση που γίνεται από το assembler (ένα πρόγραμμα).

Για την επόμενη εντολή που είναι 'STA $0217', ο κωδικός του STA, δηλαδή 8D 16 (απόλυτη διευθυνσιοδότηση), βρίσκεται στη θέση $0207 byte. Η διεύθυνση '$0217' του 'STA $0217' βρίσκεται στις θέσεις μνήμης των 0208 $ και 0209 $. Η εντολή 'STA $0217' αντιγράφει το περιεχόμενο των οκτώ bit του συσσωρευτή στη θέση μνήμης των 0217 $.

Το υψηλότερο byte του minuend που είναι 00101010 βρίσκεται στη θέση μνήμης των 0214 $ και το υψηλότερο byte του δευτερεύοντος δίσκου που είναι 00010101 βρίσκεται στη θέση byte των 0216 $. Ο κωδικός για το 'LDA $0214', δηλαδή μ.Χ 16 για το LDA (απόλυτη διευθυνσιοδότηση), βρίσκεται στη θέση byte $020A. Η διεύθυνση '$0214' του 'LDA $0214' βρίσκεται στις τοποθεσίες των $020B και $020C. Η εντολή 'LDA $0214' φορτώνει το υψηλότερο byte του minuend στον συσσωρευτή, διαγράφοντας οτιδήποτε υπάρχει στον συσσωρευτή.

Ο κωδικός για το 'SBC $0216', δηλαδή ED 16 για SBC (απόλυτη διευθυνσιοδότηση), βρίσκεται στη θέση byte $020D. Η διεύθυνση '$0216' του 'SBC $0216' βρίσκεται στις θέσεις byte των $020E και $020F. Η εντολή 'SBC $0216' αφαιρεί το υψηλότερο byte του subtrahend από το υψηλότερο byte του minuend (συμπλήρωμα δύο) που βρίσκεται ήδη στον συσσωρευτή. Το αποτέλεσμα τοποθετείται ξανά στον συσσωρευτή. Εάν υπάρχει μεταφορά 1 για αυτή τη δεύτερη αφαίρεση, το συμπλήρωμά του τοποθετείται αυτόματα στο κελί μεταφοράς του καταχωρητή κατάστασης. Αν και η μεταφορά πέρα ​​από το δέκατο έκτο bit (αριστερά) δεν απαιτείται για αυτό το πρόβλημα, είναι ωραίο να ελέγξετε εάν η μεταφορά του συμπληρώματος συμβαίνει ελέγχοντας τη σημαία μεταφοράς.

Για την επόμενη και τελευταία οδηγία που είναι το 'STA $0218', ο κωδικός του STA, δηλαδή 8D 16 (απόλυτη διευθυνσιοδότηση), βρίσκεται στη θέση $0210 byte. Η διεύθυνση '$0218' του 'STA $0218' βρίσκεται στις θέσεις μνήμης των 0211 $ και 0212 $. Η εντολή 'STA $0218' αντιγράφει το περιεχόμενο των οκτώ bit του συσσωρευτή στη θέση μνήμης των 0218 $. Το αποτέλεσμα της αφαίρεσης με τους δύο αριθμούς των δεκαέξι bit είναι 0001010101010101 με το χαμηλότερο byte 01010101 στη θέση μνήμης των $0217 και το υψηλότερο byte του 00010101 στη θέση μνήμης 0218 $ – μικρή endianness.

Το 6502 μP έχει κύκλωμα μόνο για πρόσθεση και έμμεσα για την αφαίρεση του συμπληρώματος των δύο. Δεν έχει κύκλωμα πολλαπλασιασμού και διαίρεσης. Για να γίνει ο πολλαπλασιασμός και η διαίρεση, θα πρέπει να γραφτεί ένα πρόγραμμα γλώσσας assembly με λεπτομέρειες, συμπεριλαμβανομένης της μετατόπισης μερικών γινομένων και μερικών μερισμάτων.

4.4 Λογικές Λειτουργίες

Στο 6502 µP, το μνημονικό για το OR είναι ORA και το μνημονικό για το αποκλειστικό OR είναι το EOR. Παρατηρήστε ότι οι λογικές πράξεις δεν έχουν την υπονοούμενη διεύθυνση. Η σιωπηρή διευθυνσιοδότηση δεν παίρνει τελεστή. Κάθε ένας από τους λογικούς τελεστές πρέπει να λάβει δύο τελεστές. Το πρώτο βρίσκεται στον συσσωρευτή και το δεύτερο στη μνήμη ή στην οδηγία. Το αποτέλεσμα (8-bit) επιστρέφει στον συσσωρευτή. Το πρώτο στον συσσωρευτή είτε τοποθετείται εκεί με άμεση εντολή είτε αντιγράφεται από τη μνήμη με απόλυτη διευθυνσιοδότηση. Σε αυτήν την ενότητα, μόνο η διεύθυνση μηδενικής σελίδας χρησιμοποιείται για επεξήγηση. Αυτοί οι λογικοί τελεστές είναι όλοι τελεστές Bitwise.

ΚΑΙ
Ο παρακάτω πίνακας απεικονίζει το Bitwise AND σε δυαδικό, δεκαεξαδικό και δεκαδικό:

Όλα τα προγράμματα σε αυτό το κεφάλαιο θα πρέπει να ξεκινούν από τη θέση του byte μνήμης των $0200. Ωστόσο, τα προγράμματα σε αυτήν την ενότητα βρίσκονται στη σελίδα μηδέν, με στόχο να απεικονίσουν τη χρήση της σελίδας μηδέν χωρίς το υψηλότερο byte του 00000000 2 . Το προηγούμενο ANDing μπορεί να κωδικοποιηθεί ως εξής:

LDA #$9A ; όχι από μνήμη – άμεση διευθυνσιοδότηση
ΚΑΙ #$CD ; όχι από μνήμη – άμεση διευθυνσιοδότηση
STA $30 ; αποθηκεύει 88 $ στα 0030 $ με βάση το μηδέν

Ή
Ο παρακάτω πίνακας απεικονίζει το Bitwise OR σε δυαδικό, δεκαεξαδικό και δεκαδικό:

LDA #$9A ; όχι από μνήμη – άμεση διευθυνσιοδότηση
ORA #$CD ; όχι από μνήμη – άμεση διευθυνσιοδότηση
STA $30 ; αποθηκεύει το $CF στα 0030 $ με βάση το μηδέν

ΕΛΕΥΘΕΡΟΣ
Ο παρακάτω πίνακας απεικονίζει το Bitwise XOR σε δυαδικό, δεκαεξαδικό και δεκαδικό:

LDA #$9A ; όχι από μνήμη – άμεση διευθυνσιοδότηση
EOR #$CD ; όχι από μνήμη – άμεση διευθυνσιοδότηση
STA $30 ; αποθηκεύει 57 $ στα 0030 $ με βάση το μηδέν

4.5 Λειτουργίες μετατόπισης και περιστροφής

Τα μνημονικά και τα opcodes για τους τελεστές shift και rotate είναι:

ASL: Μετατόπιση προς τα αριστερά ενός bit του συσσωρευτή ή της θέσης μνήμης, εισάγοντας το 0 στο κενό δεξιό κελί.

LSR: Μετατοπίστε δεξιά ένα bit του συσσωρευτή ή της θέσης μνήμης, εισάγοντας το 0 στο κενό αριστερό κελί.
ROL: Περιστρέψτε ένα bit αριστερά από τη θέση του συσσωρευτή ή τη μνήμη, εισάγοντας το bit που απορρίπτεται στα αριστερά στο κενή δεξιό κελί.
ROR: Περιστρέψτε ένα bit δεξιά από τη θέση του συσσωρευτή ή τη μνήμη, εισάγοντας το bit που απορρίπτεται στα δεξιά στο κεμένο αριστερό κελί.

Για να κάνετε μια μετατόπιση ή περιστροφή με τον συσσωρευτή, η οδηγία είναι κάπως έτσι:

LSR Α

Αυτό χρησιμοποιεί έναν άλλο τρόπο διευθυνσιοδότησης που ονομάζεται λειτουργία διευθυνσιοδότησης συσσωρευτή.

Για να κάνετε μια μετατόπιση ή περιστροφή με μια θέση μνήμης byte, η οδηγία είναι κάπως έτσι:

ROR $2BCD

Όπου 2BCD είναι η θέση μνήμης.

Σημειώστε ότι δεν υπάρχει άμεση ή σιωπηρή λειτουργία διεύθυνσης για μετατόπιση ή περιστροφή. Δεν υπάρχει άμεση λειτουργία διευθυνσιοδότησης γιατί δεν έχει νόημα να μετατοπίσουμε ή να περιστρέψουμε έναν αριθμό που παραμένει μόνο στην εντολή. Δεν υπάρχει σιωπηρή λειτουργία διευθυνσιοδότησης επειδή οι σχεδιαστές του 6502 μP θέλουν μόνο το περιεχόμενο του συσσωρευτή (καταχωρητής A) ή μια θέση byte μνήμης να μετατοπίζεται ή να περιστρέφεται.

4.6 Λειτουργία σχετικής διεύθυνσης

Ο μικροεπεξεργαστής πάντα αυξάνει (κατά 1, 2 ή 3 μονάδες) τον μετρητή προγράμματος (PC) για να δείξει την επόμενη εντολή που πρόκειται να εκτελεστεί. Το 6502 µP έχει μια οδηγία της οποίας η μνημονική είναι BVS που σημαίνει Branch on Overflow Set. Το PC αποτελείται από δύο byte. Αυτή η οδηγία κάνει τον υπολογιστή να έχει διαφορετική διεύθυνση μνήμης για την εκτέλεση της επόμενης εντολής που δεν προκύπτει από μια κανονική αύξηση. Αυτό το κάνει προσθέτοντας ή αφαιρώντας μια τιμή, που ονομάζεται μετατόπιση, στο περιεχόμενο του υπολογιστή. Και έτσι, ο υπολογιστής δείχνει στη συνέχεια σε μια διαφορετική (διακλαδισμένη) θέση μνήμης για να συνεχίσει να εκτελεί ο υπολογιστής από εκεί. Η μετατόπιση είναι ένας ακέραιος από -128 10 έως +127 10 (συμπλήρωμα δύο). Έτσι, η μετατόπιση μπορεί να κάνει το άλμα να προχωρήσει στη μνήμη. Αν είναι θετικό ή πίσω στη μνήμη, ή αν είναι αρνητικό.

Η εντολή BVS παίρνει μόνο έναν τελεστή που είναι η μετατόπιση. Το BVS χρησιμοποιεί τη σχετική διευθυνσιοδότηση. Εξετάστε την ακόλουθη οδηγία:

BVS $7F

Στη βάση δύο, 7F H είναι 01111111 2 = 127 10 . Ας υποθέσουμε ότι το περιεχόμενο στον υπολογιστή για την επόμενη οδηγία είναι $0300. Η εντολή BVS προκαλεί την προσθήκη $7F (ένας θετικός αριθμός ήδη στο συμπλήρωμα δύο) στα $0300 για να δώσει $037F. Έτσι, αντί για την επόμενη εντολή που θα εκτελεστεί στη θέση μνήμης των $0300, είναι στη θέση μνήμης των $037F (περίπου μισή σελίδα διαφορά).

Υπάρχουν και άλλες οδηγίες διακλάδωσης, αλλά το BVS είναι πολύ καλό για χρήση για την απεικόνιση της σχετικής διευθυνσιοδότησης. Η σχετική διευθυνσιοδότηση ασχολείται με οδηγίες υποκαταστήματος.

4.7 Ευρετηριασμένη και Έμμεση Διεύθυνση χωριστά

Αυτές οι λειτουργίες διευθυνσιοδότησης επιτρέπουν στο 6502 µP να χειρίζεται τεράστιες ποσότητες δεδομένων σε σύντομες χρονικές περιόδους με μειωμένο αριθμό εντολών. Υπάρχουν θέσεις 64 KB για ολόκληρη τη μνήμη Comodore-64. Έτσι, για να αποκτήσετε πρόσβαση σε οποιαδήποτε θέση byte, των 16 bit, χρειάζονται δύο byte. Η μόνη εξαίρεση από την ανάγκη δύο byte είναι η σελίδα μηδέν όπου το υψηλότερο byte των $00 παραλείπεται για να εξοικονομηθεί ο χώρος που καταλαμβάνει η εντολή στη μνήμη. Με μια λειτουργία διεύθυνσης χωρίς σελίδα μηδέν, τόσο τα υψηλότερα όσο και τα χαμηλότερα byte της διεύθυνσης μνήμης 16-bit υποδεικνύονται ως επί το πλείστον με κάποιο τρόπο.

Βασική ευρετηριασμένη διεύθυνση

Απόλυτη Διεύθυνση Ευρετηρίου
Θυμηθείτε ότι ο καταχωρητής X ή Y ονομάζεται καταχωρητής ευρετηρίου. Εξετάστε την ακόλουθη οδηγία:

LDA $C453,X

Ας υποθέσουμε ότι η τιμή του 6 H βρίσκεται στο μητρώο Χ. Σημειώστε ότι το 6 δεν πληκτρολογείται πουθενά στην οδηγία. Αυτή η οδηγία προσθέτει την τιμή 6H στο C453 H που αποτελεί μέρος της πληκτρολογημένης εντολής στο αρχείο κειμένου που πρόκειται να συναρμολογηθεί ακόμη – C453 H + 6 H = C459 H . LDA σημαίνει φόρτωση ενός byte στον συσσωρευτή. Το byte που θα φορτωθεί στον συσσωρευτή προέρχεται από τη διεύθυνση $C459. Το $C459 που είναι το άθροισμα των $C453 που πληκτρολογείται με την οδηγία και το 6 H που βρίσκεται στον καταχωρητή X γίνεται η αποτελεσματική διεύθυνση από την οποία προέρχεται το byte που θα φορτωθεί στον συσσωρευτή. Αν 6 H ήταν στον καταχωρητή Y, το Y πληκτρολογείται στη θέση του X στην εντολή.

Στην πληκτρολογημένη δήλωση εντολών, το $C453 είναι γνωστό ως η βασική διεύθυνση και το 6 H στον καταχωρητή X ή Y είναι γνωστό ως το τμήμα μέτρησης ή ευρετηρίου για την ενεργή διεύθυνση. Η διεύθυνση βάσης μπορεί να αναφέρεται σε οποιαδήποτε διεύθυνση byte στη μνήμη και στα επόμενα 256 10 Οι διευθύνσεις μπορούν να προσπελαστούν, υποθέτοντας ότι ο αρχικός δείκτης (ή μέτρηση) στον καταχωρητή X ή Y είναι 0. Να θυμάστε ότι ένα byte μπορεί να δώσει συνεχές εύρος έως και 256 10 αριθμοί (δηλ. 00000000 2 στο 11111111 2 ).

Έτσι, η απόλυτη διευθυνσιοδότηση προσθέτει ό,τι έχει ήδη τοποθετηθεί (έχει τεθεί από άλλη εντολή) στον καταχωρητή X ή Y στις 16 διευθύνσεις που πληκτρολογούνται με την εντολή για να ληφθεί η ενεργή διεύθυνση. Στην πληκτρολογημένη εντολή, οι δύο καταχωρητές ευρετηρίου διακρίνονται με X ή Y που πληκτρολογούνται μετά από κόμμα. Δακτυλογραφείται είτε Χ είτε Υ. όχι και τα δύο.

Αφού πληκτρολογηθεί το πρόγραμμα σε ένα πρόγραμμα επεξεργασίας κειμένου και αποθηκευτεί με το όνομα αρχείου επέκτασης «.asm», ο assembler, που είναι άλλο πρόγραμμα, πρέπει να μεταφράσει το πληκτρολογημένο πρόγραμμα σε αυτό που (φορτώθηκε) στη μνήμη. Η προηγούμενη εντολή, η οποία είναι 'LDA $C453,X', καταλαμβάνει τρεις θέσεις byte στη μνήμη και όχι πέντε.

Θυμηθείτε ότι ένα μνημονικό όπως το LDA μπορεί να έχει περισσότερους από έναν κωδικούς (διαφορετικά byte). Ο opcode για την εντολή που χρησιμοποιεί τον καταχωρητή X είναι διαφορετικός από τον κωδικό πρόσβασης που χρησιμοποιεί τον καταχωρητή Y. Ο συναρμολογητής γνωρίζει ποιον κωδικό πρόσβασης να χρησιμοποιήσει με βάση την πληκτρολογημένη οδηγία. Ο κωδικός επιλογής ενός byte για το 'LDA $C453,X' είναι διαφορετικός από τον κωδικό ενός byte για το 'LDA $C453,Y'. Στην πραγματικότητα, ο κωδικός πρόσβασης για το LDA στο 'LDA $C453,X' είναι BD και ο κωδικός επιλογής για το LDA στο 'LDA $C453,9' είναι BD.

Εάν ο κωδικός λειτουργίας για το LDA βρίσκεται στη θέση 0200 $ byte. Στη συνέχεια, η διεύθυνση 16-bit του $C453 παίρνει την επόμενη θέση δίπλα στις θέσεις byte στη μνήμη που είναι $0201 και $0202. Το συγκεκριμένο byte opcode υποδεικνύει εάν εμπλέκεται ο καταχωρητής X ή ο καταχωρητής Y. Και έτσι, η συναρμολογημένη οδηγία γλώσσας που είναι 'LDA $C453,X' ή 'LDA $C453,Y' καταλαμβάνει τρία διαδοχικά byte στη μνήμη, και όχι τέσσερα ή πέντε.

Διεύθυνση με ευρετήριο μηδενικής σελίδας
Η διευθυνσιοδότηση ευρετηρίου μηδενικής σελίδας είναι σαν την απόλυτη διεύθυνση ευρετηρίου που περιγράφηκε προηγουμένως, αλλά το byte-στόχος πρέπει να βρίσκεται μόνο στη σελίδα μηδέν (από 0000 $ έως 00 $ FF). Τώρα, όταν έχουμε να κάνουμε με τη μηδενική σελίδα, το υψηλότερο byte που είναι πάντα 00 H για τις θέσεις μνήμης συνήθως αποφεύγεται. Έτσι, συνήθως αναφέρεται ότι η σελίδα μηδέν ξεκινά από $00 έως FF. Και έτσι, η προηγούμενη οδηγία του 'LDA $C453,X' είναι:

LDA $53.X

Το $C4, ένα υψηλότερο byte που αναφέρεται σε μια σελίδα πάνω από τη σελίδα μηδέν, δεν μπορεί να χρησιμοποιηθεί σε αυτήν την εντολή, καθώς τοποθετεί το αναμενόμενο byte στόχο που θα φορτωθεί στο συσσωρευμένο byte εκτός και πάνω από τη σελίδα μηδέν.

Όταν η τιμή που πληκτρολογείται στην εντολή προστίθεται στην τιμή του καταχωρητή ευρετηρίου, το άθροισμα δεν πρέπει να δίνει αποτέλεσμα πάνω από το μηδέν σελίδας (FF H ). Επομένως, αποκλείεται να υπάρχει μια εντολή όπως 'LDA $FF, X' και μια τιμή όπως η FF H στον καταχωρητή ευρετηρίου επειδή FF H + FF H = 200 H που είναι η θέση του πρώτου byte ($0200) της σελίδας 2 (τρίτη σελίδα) στη μνήμη, είναι μεγάλη απόσταση από τη σελίδα 0. Έτσι, με την ευρετηρίαση μηδενικής σελίδας, η πραγματική διεύθυνση πρέπει να βρίσκεται στη σελίδα μηδέν.

Έμμεση Διεύθυνση

Μετάβαση Απόλυτη Διεύθυνση
Πριν συζητήσουμε την Απόλυτη Έμμεση Διεύθυνση, είναι καλό να δούμε πρώτα την απόλυτη διευθυνσιοδότηση JMP. Ας υποθέσουμε ότι η διεύθυνση που έχει την αξία ενδιαφέροντος (byte-στόχος) είναι 8765 $. Αυτό είναι 16-bit που αποτελείται από δύο byte: το υψηλότερο byte που είναι 87 H και το χαμηλότερο byte που είναι 65 H . Έτσι, τα δύο byte για $8765 τοποθετούνται στον υπολογιστή (μετρητής προγράμματος) για την επόμενη οδηγία. Αυτό που πληκτρολογείται στο πρόγραμμα της γλώσσας assembly (αρχείο) είναι:

JMP $8765

Το πρόγραμμα εκτέλεσης στη μνήμη μεταπηδά από οποιαδήποτε διεύθυνση είχε πρόσβαση στα 8765 $. Το JMP Mnemonic έχει τρεις κωδικούς λειτουργίας που είναι 4C, 6C και 7C. Ο κωδικός ενεργοποίησης για αυτήν την απόλυτη διευθυνσιοδότηση είναι 4C. Ο κωδικός ενεργοποίησης για την απόλυτη έμμεση διεύθυνση JMP είναι 6C (ανατρέξτε στις παρακάτω εικόνες).

Απόλυτη Έμμεση Διεύθυνση
Αυτό χρησιμοποιείται μόνο με την εντολή άλματος (JMP). Ας υποθέσουμε ότι η διεύθυνση που έχει το byte ενδιαφέροντος (byte-στόχος) είναι 8765 $. Αυτό είναι 16-bit που αποτελείται από δύο byte: το υψηλότερο byte που είναι 87 H και το χαμηλότερο byte που είναι 65 H . Με απόλυτη έμμεση διευθυνσιοδότηση, αυτά τα δύο byte βρίσκονται στην πραγματικότητα σε δύο διαδοχικές θέσεις byte αλλού στη μνήμη.

Ας υποθέσουμε ότι βρίσκονται στις θέσεις μνήμης των $0210 και $0211. Στη συνέχεια, το κάτω byte της διεύθυνσης ενδιαφέροντος που είναι 65 H βρίσκεται στη διεύθυνση $0210 και το υψηλότερο byte που είναι 87 H βρίσκεται στη διεύθυνση $0211. Αυτό σημαίνει ότι το χαμηλότερο byte μνήμης ενδιαφέροντος πηγαίνει στη χαμηλότερη διαδοχική διεύθυνση και το υψηλότερο byte μνήμης ενδιαφέροντος πηγαίνει στην υψηλότερη διαδοχική διεύθυνση - μικρή endianness.

Η διεύθυνση 16-bit μπορεί να αναφέρεται σε δύο διαδοχικές διευθύνσεις στη μνήμη. Υπό αυτό το πρίσμα, η διεύθυνση $0210 αναφέρεται στις διευθύνσεις των $0210 και $0211. Το ζεύγος διευθύνσεων των $0210 και $0211 περιέχει την τελική διεύθυνση (16 bit των δύο byte) του byte-στόχου, με το χαμηλότερο byte των 65 H σε $0210 και το υψηλότερο byte των 87 H σε 0211 $. Έτσι, η εντολή άλματος που πληκτρολογείται είναι:

JMP (0210 $)

Το JMP Mnemonic έχει τρεις κωδικούς λειτουργίας που είναι 4C, 6C και 7C. Ο κωδικός επιλογής για απόλυτη έμμεση διευθυνσιοδότηση είναι 6C. Αυτό που πληκτρολογείται στο αρχείο κειμένου είναι 'JMP ($0210)'. Λόγω των παρενθέσεων, ο assembler (μεταφραστής) χρησιμοποιεί τον κωδικό 6C για JMP και όχι 4C ή 7C.

Με την απόλυτη έμμεση διευθυνσιοδότηση, υπάρχουν στην πραγματικότητα τρεις περιοχές μνήμης. Η πρώτη περιοχή μπορεί να αποτελείται από τις θέσεις byte των 0200 $, 0201 $ και 0202 $. Αυτό έχει τα τρία byte για την εντολή 'JMP ($0210)'. Η δεύτερη περιοχή, η οποία δεν είναι απαραίτητα δίπλα στην πρώτη, αποτελείται από τις δύο διαδοχικές θέσεις byte των $0210 και $0211. Είναι το χαμηλότερο byte εδώ (0210$) που πληκτρολογείται στις οδηγίες του προγράμματος της γλώσσας συναρμολόγησης. Εάν η διεύθυνση ενδιαφέροντος είναι 8765 $, το χαμηλότερο byte είναι 65 H βρίσκεται στη θέση byte $0210 και το υψηλότερο byte είναι 87 H βρίσκεται στη θέση $0211 byte. Η τρίτη περιοχή αποτελείται από μόνο μία τοποθεσία byte. Είναι της διεύθυνσης $8765 για το στοχευμένο byte (τελικό byte ενδιαφέροντος). Το ζεύγος των διαδοχικών διευθύνσεων, $0210 και $0211, περιέχει τον δείκτη $8765 που είναι η διεύθυνση ενδιαφέροντος. Μετά την υπολογιστική ερμηνεία, είναι 8765 $ που πηγαίνουν στον υπολογιστή (Μετρητής προγράμματος) για πρόσβαση στο byte-στόχο.

Έμμεση Διεύθυνση Μηδενικής Σελίδας
Αυτή η διεύθυνση είναι ίδια με την απόλυτη έμμεση διεύθυνση, αλλά ο δείκτης πρέπει να βρίσκεται στη σελίδα μηδέν. Η χαμηλότερη διεύθυνση byte της περιοχής δείκτη είναι αυτή που υπάρχει στην πληκτρολογημένη εντολή ως εξής:

JMP (50 $)

Το υψηλότερο byte του δείκτη βρίσκεται στη θέση $51 byte. Η ενεργή διεύθυνση (με αιχμή) δεν χρειάζεται να βρίσκεται στη σελίδα μηδέν.

Έτσι, με τη διευθυνσιοδότηση ευρετηρίου, η τιμή σε έναν καταχωρητή ευρετηρίου προστίθεται στη διεύθυνση βάσης που δίνεται στην εντολή για να έχουμε την αποτελεσματική διεύθυνση. Η έμμεση διευθυνσιοδότηση χρησιμοποιεί δείκτη.

4.8 Ευρετηριασμένη Έμμεση Διεύθυνση

Απόλυτη Ευρετηριασμένη Έμμεση Διεύθυνση
Αυτή η λειτουργία διευθυνσιοδότησης χρησιμοποιείται μόνο με την εντολή JMP.
Με την απόλυτη έμμεση διευθυνσιοδότηση, υπάρχει η αιχμηρή τιμή (byte) με τις δικές της δύο διαδοχικές διευθύνσεις byte. Αυτές οι δύο διαδοχικές διευθύνσεις σχηματίζουν τον δείκτη που βρίσκεται στην περιοχή δείκτη δύο διαδοχικών byte στη μνήμη. Το κάτω byte της περιοχής του δείκτη είναι αυτό που πληκτρολογείται στην εντολή μέσα σε παρένθεση. Ο δείκτης είναι η διεύθυνση της αιχμηρής τιμής. Στην προηγούμενη κατάσταση, τα 8765 $ είναι η διεύθυνση της σημειωμένης τιμής. Το $0210 (ακολουθούμενο από $0211) είναι η διεύθυνση της οποίας το περιεχόμενο είναι $8765 που είναι ο δείκτης. Με την απόλυτη λειτουργία έμμεσης διεύθυνσης, είναι ($0210) που πληκτρολογείται στο πρόγραμμα (αρχείο κειμένου), συμπεριλαμβανομένων των παρενθέσεων.

Από την άλλη πλευρά, με τη λειτουργία Absolute Indexed Indirect Addressing Mode, το κατώτερο byte διεύθυνσης για την περιοχή δείκτη σχηματίζεται προσθέτοντας την τιμή στον καταχωρητή X στην πληκτρολογημένη διεύθυνση. Για παράδειγμα, εάν ο δείκτης βρίσκεται στη θέση διεύθυνσης $0210, η πληκτρολογημένη εντολή μπορεί να είναι κάπως έτσι:

JMP ($020A,X)

Όπου ο καταχωρητής Χ έχει την τιμή 6 H . 020Α H + 6 H = 0210 H . Ο καταχωρητής Y δεν χρησιμοποιείται με αυτόν τον τρόπο διευθυνσιοδότησης.

Μηδενική σελίδα με ευρετήριο Έμμεση Διεύθυνση
Αυτή η λειτουργία διευθυνσιοδότησης χρησιμοποιεί τον καταχωρητή X και όχι τον καταχωρητή Y. Με αυτήν τη λειτουργία διευθυνσιοδότησης, εξακολουθεί να υπάρχει η αιχμηρή τιμή και ο δείκτης στην περιοχή του δείκτη διεύθυνσης δύο byte. Πρέπει να υπάρχουν δύο διαδοχικά byte στη σελίδα μηδέν για τον δείκτη. Η διεύθυνση που πληκτρολογείται στην οδηγία είναι διεύθυνση ενός byte. Αυτή η τιμή προστίθεται στην τιμή του καταχωρητή X και κάθε μεταφορά απορρίπτεται. Το αποτέλεσμα δείχνει την περιοχή του δείκτη στη σελίδα 0. Για παράδειγμα, εάν η διεύθυνση ενδιαφέροντος (σημειωμένη) είναι $8765 και βρίσκεται στις θέσεις byte $50 και $51 της σελίδας 0 και η τιμή στον καταχωρητή X είναι $30, το η πληκτρολογημένη οδηγία είναι κάπως έτσι:

LDA (20,Χ $)

Επειδή $20 + $30 = $50.

Έμμεση ευρετηριασμένη διεύθυνση
Αυτή η λειτουργία διευθυνσιοδότησης χρησιμοποιεί τον καταχωρητή Y και όχι τον καταχωρητή X. Με αυτόν τον τρόπο διευθυνσιοδότησης, υπάρχει ακόμα η αιχμηρή τιμή και η περιοχή δείκτη, αλλά το περιεχόμενο της περιοχής δείκτη λειτουργεί διαφορετικά. Πρέπει να υπάρχουν δύο διαδοχικά byte στη σελίδα μηδέν για την περιοχή του δείκτη. Η κάτω διεύθυνση της περιοχής δείκτη πληκτρολογείται στην οδηγία. Αυτός ο αριθμός (ζεύγος byte) που περιέχεται στην περιοχή δείκτη προστίθεται στην τιμή στον καταχωρητή Y για να έχει τον πραγματικό δείκτη. Για παράδειγμα, ας είναι η διεύθυνση ενδιαφέροντος (σημειωμένη) 8765 $, η τιμή του 6H είναι στον καταχωρητή Y και ο αριθμός (δύο byte) στη διεύθυνση 50 H και 51 H . Τα δύο byte μαζί είναι $875F από $875F + $6 = $8765. Η πληκτρολογημένη οδηγία είναι κάπως έτσι:

LDA (50$),Y

4.9 Οδηγίες αύξησης, μείωσης και δοκιμής BIT

Ο παρακάτω πίνακας δείχνει τις λειτουργίες των οδηγιών αύξησης και μείωσης:

Το INA και το DEA αυξάνουν και μειώνουν τον συσσωρευτή, αντίστοιχα. Αυτό ονομάζεται διευθυνσιοδότηση συσσωρευτή. Τα INX, DEX, INY και DEY είναι για τους καταχωρητές X και Y, αντίστοιχα. Δεν παίρνουν κανέναν τελεστή. Έτσι, χρησιμοποιούν την υπονοούμενη λειτουργία διευθυνσιοδότησης. Προσαύξηση σημαίνει προσθήκη 1 στον καταχωρητή ή το byte μνήμης. Μείωση σημαίνει αφαίρεση 1 από τον καταχωρητή ή το byte μνήμης.

Το INC και το DEC αυξάνουν και μειώνουν ένα byte μνήμης, αντίστοιχα (και όχι έναν καταχωρητή). Η χρήση της μηδενικής διεύθυνσης σελίδας αντί της απόλυτης διευθυνσιοδότησης είναι η εξοικονόμηση της μνήμης για την εντολή. Η μηδενική διεύθυνση σελίδας είναι ένα byte μικρότερη από την απόλυτη διεύθυνση για την εντολή στη μνήμη. Ωστόσο, η λειτουργία μηδενικής διεύθυνσης σελίδας επηρεάζει μόνο τη σελίδα μηδέν.

Η εντολή BIT ελέγχει τα bit ενός byte στη μνήμη με τα 8 bit στον συσσωρευτή, αλλά δεν αλλάζει κανένα από τα δύο. Ορίζονται μόνο ορισμένες σημαίες του καταχωρητή κατάστασης επεξεργαστή 'P'. Τα bit της καθορισμένης θέσης μνήμης είναι λογικά ΚΑΙ με αυτά του συσσωρευτή. Στη συνέχεια, ορίζονται τα ακόλουθα bit κατάστασης:

  • Το N που είναι το bit 7 και το τελευταίο bit (αριστερά) του καταχωρητή κατάστασης, λαμβάνει το bit 7 της θέσης μνήμης πριν από το ANDing.
  • Το V που είναι το bit 6 του καταχωρητή κατάστασης λαμβάνει το bit 6 της θέσης μνήμης πριν από το ANDing.
  • Η σημαία Z του καταχωρητή κατάστασης ορίζεται (γίνεται 1) εάν το αποτέλεσμα του AND είναι μηδέν (00000000 2 ). Διαφορετικά, διαγράφεται (γίνεται 0).

4.10 Σύγκριση Οδηγιών

Τα συγκριτικά μνημονικά εντολών για τα 6502 μP είναι CMP, CPX και CPY. Μετά από κάθε σύγκριση, επηρεάζονται οι σημαίες N, Z και C του καταχωρητή κατάστασης επεξεργαστή 'P'. Η σημαία N ορίζεται (γίνεται 1) όταν το αποτέλεσμα είναι αρνητικός αριθμός. Η σημαία Z ορίζεται (γίνεται 1) όταν το αποτέλεσμα είναι μηδέν (000000002). Η σημαία C ορίζεται (γίνεται 1) όταν υπάρχει μεταφορά από το οκτώ στο ένατο bit. Ο παρακάτω πίνακας δίνει μια λεπτομερή απεικόνιση

Το σημαίνει «μεγαλύτερο από». Με αυτό, ο πίνακας σύγκρισης θα πρέπει να είναι αυτονόητος.

4.11 Οδηγίες άλματος και διακλάδωσης

Ο παρακάτω πίνακας συνοψίζει τις οδηγίες άλματος και διακλάδωσης:

Η εντολή JMP χρησιμοποιεί την απόλυτη και την έμμεση διευθυνσιοδότηση. Οι υπόλοιπες οδηγίες στον πίνακα είναι οδηγίες διακλάδωσης. Χρησιμοποιούν μόνο τη σχετική διευθυνσιοδότηση με το 6502 μP. Με αυτό, ο πίνακας γίνεται αυτονόητος εάν διαβάζεται από αριστερά προς τα δεξιά και από πάνω προς τα κάτω.

Σημειώστε ότι οι κλάδοι μπορούν να εφαρμοστούν μόνο σε διευθύνσεις εντός -128 έως +127 byte από τη δεδομένη διεύθυνση. Αυτή είναι η σχετική αντιμετώπιση. Τόσο για τις οδηγίες JMP όσο και για τις οδηγίες διακλάδωσης, ο μετρητής προγράμματος (PC) επηρεάζεται άμεσα. Το 6502 µP δεν επιτρέπει στους κλάδους σε μια απόλυτη διεύθυνση, αν και το άλμα μπορεί να κάνει την απόλυτη διεύθυνση. Η εντολή JMP δεν είναι εντολή διακλάδωσης.

Σημείωση: Η σχετική διευθυνσιοδότηση χρησιμοποιείται μόνο με οδηγίες διακλάδωσης.

4.12 Η περιοχή στοίβας

Μια υπορουτίνα είναι σαν ένα από τα προηγούμενα σύντομα προγράμματα για να προσθέσετε δύο αριθμούς ή να αφαιρέσετε δύο αριθμούς. Η περιοχή στοίβας στη μνήμη ξεκινά από $0100 έως $01FF συμπεριλαμβανομένων. Αυτή η περιοχή ονομάζεται απλά στοίβα. Όταν ο μικροεπεξεργαστής εκτελεί ένα άλμα στην εντολή υπορουτίνας (JSR – ανατρέξτε στην ακόλουθη συζήτηση), πρέπει να γνωρίζει πού να επιστρέψει όταν τελειώσει. Το 6502 µP διατηρεί αυτές τις πληροφορίες (διεύθυνση επιστροφής) σε χαμηλή μνήμη από $0100 έως $01FF (η περιοχή στοίβας) και χρησιμοποιεί το περιεχόμενο καταχωρητή δείκτη στοίβας που είναι 'S' στον μικροεπεξεργαστή ως δείκτη (9 bit) στην τελευταία διεύθυνση που επιστράφηκε. που είναι αποθηκευμένο στη σελίδα 1 ($0100 έως $01FF) της μνήμης. Η στοίβα μειώνεται από $01FF και καθιστά δυνατή την ένθεση των υπορουτινών σε βάθος έως και 128 επίπεδα.

Μια άλλη χρήση του δείκτη στοίβας είναι ο χειρισμός των διακοπών. Το 6502 μP έχει τις ακίδες με την ένδειξη IRQ και NMI. Είναι πιθανό κάποια μικρά ηλεκτρικά σήματα να εφαρμοστούν σε αυτές τις ακίδες και να αναγκάσουν το 6502 μP να σταματήσει την εκτέλεση ενός προγράμματος και να το κάνει να ξεκινήσει να εκτελεί ένα άλλο. Σε αυτήν την περίπτωση, το πρώτο πρόγραμμα διακόπτεται. Όπως οι υπορουτίνες, τα τμήματα κώδικα διακοπής μπορούν να είναι ένθετα. Η επεξεργασία διακοπής συζητείται στο επόμενο κεφάλαιο.

Σημείωση : Ο δείκτης στοίβας έχει 8 bit για τη διεύθυνση χαμηλότερου byte για τη διευθυνσιοδότηση των τοποθεσιών από $0100 έως $01FF. Το υψηλότερο byte 00000001 2 υποτίθεται.

Ο παρακάτω πίνακας δίνει τις οδηγίες που συσχετίζουν τον δείκτη στοίβας 'S' με τους καταχωρητές A, X, Y και P με την περιοχή στοίβας στη μνήμη:

4.13 Υπορουτίνα Κλήση και Επιστροφή

Μια υπορουτίνα είναι ένα σύνολο εντολών που επιτυγχάνουν έναν συγκεκριμένο στόχο. Το προηγούμενο πρόγραμμα πρόσθεσης ή αφαίρεσης είναι μια πολύ σύντομη υπορουτίνα. Οι υπορουτίνες μερικές φορές ονομάζονται απλώς ρουτίνες. Η οδηγία για την κλήση μιας υπορουτίνας είναι:

JSR: Μετάβαση στο SubRoutine

Η οδηγία για την επιστροφή από μια υπορουτίνα είναι:

RTS: Επιστροφή από την υπορουτίνα

Ο μικροεπεξεργαστής έχει την τάση να εκτελεί συνεχώς τις εντολές στη μνήμη, τη μία μετά την άλλη. Ας υποθέσουμε ότι ο μικροεπεξεργαστής εκτελεί αυτήν τη στιγμή ένα τμήμα κώδικα και συναντά μια εντολή άλματος (JMP) για να πάει και να εκτελέσει ένα τμήμα κώδικα που κωδικοποιείται πίσω από το οποίο μπορεί να έχει ήδη εκτελεστεί. Εκτελεί αυτό το τμήμα κώδικα πίσω και συνεχίζει να εκτελεί όλα τα τμήματα κώδικα (εντολές) ακολουθώντας το τμήμα κώδικα πίσω, μέχρι να εκτελέσει ξανά το τρέχον τμήμα κώδικα και να συνεχίσει παρακάτω. Το JMP δεν ωθεί την επόμενη εντολή στη στοίβα.

Σε αντίθεση με το JMP, το JSR ωθεί τη διεύθυνση της επόμενης εντολής μετά τον εαυτό του από τον υπολογιστή (μετρητής προγράμματος) στη στοίβα. Η θέση στοίβας αυτής της διεύθυνσης τοποθετείται στον δείκτη στοίβας 'S'. Όταν μια εντολή RTS συναντάται (εκτελείται) στην υπορουτίνα, η διεύθυνση που πιέζεται στη στοίβα αποσύρεται από τη στοίβα και το πρόγραμμα συνεχίζει σε αυτήν την αποσυρόμενη διεύθυνση που είναι η επόμενη διεύθυνση εντολών λίγο πριν από την κλήση της υπορουτίνας. Η τελευταία διεύθυνση που αφαιρείται από τη στοίβα αποστέλλεται στον μετρητή προγράμματος. Ο παρακάτω πίνακας παρέχει τις τεχνικές λεπτομέρειες των οδηγιών JSR και RTS:

Δείτε την παρακάτω εικόνα για τις χρήσεις των JSR και RTS:

4.14 Παράδειγμα βρόχου αντίστροφης μέτρησης

Η ακόλουθη υπορουτίνα μετρά αντίστροφα από $FF έως $00 (σύνολο 256 10 μετράει):

εκκίνηση LDX #$FF ; φορτίο X με $FF = 255
βρόχος DEX ; X = X – 1
Βρόχος BNE ; αν το X δεν είναι μηδέν, τότε goto loop
RTS ; ΕΠΙΣΤΡΟΦΗ

Κάθε γραμμή έχει ένα σχόλιο. Τα σχόλια δεν μπαίνουν ποτέ στη μνήμη για εκτέλεση. Ο assembler (μεταφραστής) που μετατρέπει ένα πρόγραμμα σε αυτό που είναι στη μνήμη για εκτέλεση (εκτέλεση) αφαιρεί πάντα τα σχόλια. Ένα σχόλιο ξεκινά με ';' . Το 'start' και το 'loop' σε αυτό το πρόγραμμα ονομάζονται ετικέτες. Μια ετικέτα προσδιορίζει (το όνομα) για τη διεύθυνση της εντολής. Εάν η εντολή είναι μια εντολή ενός byte (υποδηλωμένη διεύθυνση), η ετικέτα είναι η διεύθυνση αυτής της εντολής. Εάν η εντολή είναι μια εντολή πολλών byte, η ετικέτα προσδιορίζει το πρώτο byte για την εντολή πολλών byte. Η πρώτη οδηγία για αυτό το πρόγραμμα αποτελείται από δύο byte. Υποθέτοντας ότι ξεκινά από τη διεύθυνση $0300, η ​​διεύθυνση $0300 μπορεί να αντικατασταθεί με το 'start' κάτω στο πρόγραμμα. Η δεύτερη εντολή (DEX) είναι μια εντολή με ένα byte και θα πρέπει να βρίσκεται στη διεύθυνση $0302. Αυτό σημαίνει ότι η διεύθυνση $0302 μπορεί να αντικατασταθεί με το 'loop', κάτω στο πρόγραμμα, κάτι που συμβαίνει στην πραγματικότητα στο 'BNE loop'.

'Βρόχος BNE' σημαίνει τον κλάδο στη δεδομένη διεύθυνση όταν η σημαία Z του καταχωρητή κατάστασης είναι 0. Όταν η τιμή στον καταχωρητή A ή X ή Y είναι 00000000 2 , λόγω της τελευταίας λειτουργίας, η σημαία Z είναι 1 (σετ). Έτσι, ενώ είναι 0 (όχι 1), η δεύτερη και η τρίτη οδηγία στο πρόγραμμα επαναλαμβάνονται με αυτή τη σειρά. Σε κάθε επαναλαμβανόμενη ακολουθία, η τιμή (ακέραιος αριθμός) στον καταχωρητή Χ μειώνεται κατά 1. DEX σημαίνει X = X – 1. Όταν η τιμή στον καταχωρητή Χ είναι $00 = 00000000 2 , το Z γίνεται 1. Σε εκείνο το σημείο, δεν υπάρχει πια επανάληψη των δύο εντολών. Η τελευταία εντολή RTS στο πρόγραμμα, που είναι μια εντολή ενός byte (υποδηλωμένη διεύθυνση), επιστρέφει από την υπορουτίνα. Το αποτέλεσμα αυτής της εντολής είναι να κάνει τη διεύθυνση του μετρητή προγράμματος στη στοίβα για τον κώδικα που πρόκειται να εκτελεστεί πριν από την κλήση υπορουτίνας και να επιστρέψει στον μετρητή προγράμματος (PC). Αυτή η διεύθυνση είναι η διεύθυνση της εντολής που πρόκειται να εκτελεστεί πριν κληθεί η υπορουτίνα.

Σημείωση: Όταν γράφετε ένα πρόγραμμα γλώσσας συναρμολόγησης για το 6502 μP, μόνο μια ετικέτα πρέπει να ξεκινά στην αρχή μιας γραμμής. οποιοσδήποτε άλλος κωδικός γραμμής πρέπει να μετατοπιστεί τουλάχιστον ένα διάστημα προς τα δεξιά.

Κλήση υπορουτίνας
Αγνοώντας τον χώρο μνήμης που καταλαμβάνουν οι προηγούμενες ετικέτες, το πρόγραμμα παίρνει 6 byte διαδοχικών θέσεων στη μνήμη (RAM) από 0300$ έως 0305$. Σε αυτή την περίπτωση, το πρόγραμμα είναι:

LDX #$FF ; φορτίο X με $FF = 255
DEX ; X = X – 1
BNE $0302 ; αν το X δεν είναι μηδέν, τότε goto loop
RTS ; ΕΠΙΣΤΡΟΦΗ

Ξεκινώντας από τη διεύθυνση $0200 στη μνήμη μπορεί να είναι η κλήση για την υπορουτίνα. Η οδηγία κλήσης είναι:

Έναρξη JSR ; Η αρχή είναι η διεύθυνση $0300, δηλαδή JSR $0300

Η υπορουτίνα και η κλήση της που είναι σωστά γραμμένες στο αρχείο επεξεργασίας κειμένου είναι:

εκκίνηση LDX #$FF; φορτίο X με $FF = 255
βρόχος DEX ; X = X – 1

Βρόχος BNE ; αν το X δεν είναι μηδέν, τότε goto loop
RTS ; ΕΠΙΣΤΡΟΦΗ

Έναρξη JSR : μεταβείτε στη ρουτίνα ξεκινώντας από 0300 $

Τώρα, μπορεί να υπάρχουν πολλές υπορουτίνες σε ένα μεγάλο πρόγραμμα. Όλοι τους δεν μπορούν να έχουν το όνομα «έναρξη». Θα πρέπει να έχουν διαφορετικά ονόματα. Στην πραγματικότητα, κανένα από αυτά μπορεί να μην έχει το όνομα 'start'. Το 'Start' χρησιμοποιείται εδώ για διδακτικούς λόγους.

4.15 Μετάφραση προγράμματος

Η μετάφραση ή η συναρμολόγηση ενός προγράμματος σημαίνει το ίδιο πράγμα. Σκεφτείτε το ακόλουθο πρόγραμμα:

start LDX #$FF : φορτώστε το X με $FF = 255
βρόχος DEX : X = X – 1
Βρόχος BNE : αν το X δεν είναι μηδέν, τότε βρόχος goto
RTS: επιστροφή
Έναρξη JSR : μεταβείτε στη ρουτίνα ξεκινώντας από 0300 $

Αυτό είναι το πρόγραμμα που γράφτηκε προηγουμένως. Αποτελείται από την υπορουτίνα, την έναρξη και την κλήση στην υπορουτίνα. Το πρόγραμμα μετρά αντίστροφα από 255 10 έως 0 10 . Το πρόγραμμα ξεκινά από τη διεύθυνση έναρξης χρήστη 0200 $ (RAM). Το πρόγραμμα πληκτρολογείται σε ένα πρόγραμμα επεξεργασίας κειμένου και αποθηκεύεται στο δίσκο. Έχει ένα όνομα όπως 'sample.asm' όπου 'sample' είναι το όνομα της επιλογής του προγραμματιστή, αλλά η επέκταση '.asm' για τη γλώσσα συγκρότησης πρέπει να συσχετίζεται με το όνομα αρχείου.

Το συναρμολογημένο πρόγραμμα παράγεται από ένα άλλο πρόγραμμα που ονομάζεται assembler. Ο συναρμολογητής παρέχεται από τον κατασκευαστή του 6502 μP ή από τρίτο μέρος. Ο assembler αναπαράγει το πρόγραμμα με τέτοιο τρόπο ώστε να βρίσκεται στη μνήμη (RAM) καθώς εκτελείται (εκτελείται).

Ας υποθέσουμε ότι η εντολή JSR ξεκινά από τη διεύθυνση $0200 και η υπορουτίνα ξεκινά από τη διεύθυνση $0300. Ο συναρμολογητής αφαιρεί όλα τα σχόλια και τα λευκά κενά. Τα σχόλια και τα λευκά κενά σπαταλούν τη μνήμη που είναι πάντα σπάνια. Μια πιθανή κενή γραμμή μεταξύ του προηγούμενου τμήματος κώδικα υπορουτίνας και της κλήσης υπορουτίνας είναι ένα παράδειγμα κενού διαστήματος. Το συναρμολογημένο αρχείο εξακολουθεί να είναι αποθηκευμένο στο δίσκο και ονομάζεται κάτι σαν 'sample.exe'. Το 'δείγμα' είναι το όνομα της επιλογής του προγραμματιστή, αλλά η επέκταση '.exe' θα πρέπει να υπάρχει για να υποδεικνύει ότι πρόκειται για ένα εκτελέσιμο αρχείο.

Το συναρμολογημένο πρόγραμμα μπορεί να τεκμηριωθεί ως εξής:

Η παραγωγή ενός εγγράφου όπως αυτό λέγεται ότι συναρμολογείται με το χέρι. Σημειώστε ότι τα σχόλια σε αυτό το έγγραφο δεν εμφανίζονται στη μνήμη (για εκτέλεση). Η στήλη διευθύνσεων στον πίνακα υποδεικνύει τις αρχικές διευθύνσεις των εντολών στη μνήμη. Σημειώστε ότι το 'JSR start' δηλαδή 'JSR $0300', το οποίο αναμένεται να κωδικοποιηθεί ως '20 03 00', στην πραγματικότητα κωδικοποιείται ως '20 00 03' με τη διεύθυνση byte της χαμηλότερης μνήμης να παίρνει το χαμηλότερο byte στη μνήμη και το Διεύθυνση byte υψηλότερης μνήμης λαμβάνοντας το υψηλότερο byte στη μνήμη – μικρή endianness. Ο opcode για το JSR είναι 20 16 .

Σημειώστε ότι η μετατόπιση σε μια εντολή διακλάδωσης όπως το BNE είναι ένας αριθμός συμπληρώματος δύο στην περιοχή 128 10 έως + 127 10 . Άρα, 'BNE loop' σημαίνει 'BNE -1'. 10 ' που είναι στην πραγματικότητα 'D0 FF' στην κωδική μορφή του FF 16 είναι -1 στο συμπλήρωμα δύο που γράφεται ως = 11111111 στη βάση δύο. Το πρόγραμμα assembler αντικαθιστά τις ετικέτες και τα πεδία σε πραγματικούς δεκαεξαδικούς αριθμούς (οι δεκαεξαδικοί αριθμοί είναι δυαδικοί αριθμοί που ομαδοποιούνται σε τέσσερα bit). Στην πραγματικότητα περιλαμβάνονται οι πραγματικές διευθύνσεις όπου ξεκινά κάθε εντολή.

Σημείωση: Η εντολή 'Έναρξη JSR' αντικαθίσταται από μικρότερες οδηγίες που στέλνουν το τρέχον περιεχόμενο (υψηλά και χαμηλά byte) του μετρητή προγράμματος στη στοίβα με τον δείκτη στοίβας που μειώνεται δύο φορές (μία για υψηλό byte και μία για χαμηλό byte) και στη συνέχεια φορτώνει ξανά τον υπολογιστή με τη διεύθυνση $0300. Ο δείκτης στοίβας δείχνει τώρα σε $00FD, υποθέτοντας ότι έχει αρχικοποιηθεί σε $01FF.

Επίσης, η εντολή RTS αντικαθίσταται από έναν αριθμό μικρότερων εντολών που αυξάνουν τον δείκτη στοίβας 'S' δύο φορές (μία για χαμηλό byte και μία για υψηλό byte) και τραβά τα αντίστοιχα δύο byte διεύθυνσης από τον δείκτη στοίβας στον υπολογιστή για την επόμενη οδηγία.

Σημείωση: Ένα κείμενο ετικέτας δεν πρέπει να έχει περισσότερους από 8 χαρακτήρες.

Ο 'βρόχος BNE' χρησιμοποιεί τη σχετική διευθυνσιοδότηση. Σημαίνει προσθήκη -3 10 στο επόμενο περιεχόμενο μετρητή προγράμματος 0305 $. Τα byte για το 'BNE loop' είναι 'D0 FD' όπου το FD είναι το συμπλήρωμα των δύο -3 10 .

Σημείωση: Αυτό το κεφάλαιο δεν παρουσιάζει όλες τις οδηγίες για το 6502 µP. Όλες οι οδηγίες και τα στοιχεία τους βρίσκονται στο έγγραφο με τίτλο “SY6500 8-bit Microprocessor Family”. Υπάρχει ένα αρχείο PDF με το όνομα '6502.pdf' για αυτό το έγγραφο το οποίο είναι δωρεάν διαθέσιμο στο Διαδίκτυο. Το 6502 µP που περιγράφεται σε αυτό το έγγραφο είναι 65C02.

4.16 Διακοπές

Τα σήματα οποιασδήποτε συσκευής που είναι συνδεδεμένη στις εξωτερικές θύρες (κάθετης επιφάνειας) του Commodore 64 πρέπει να περάσουν είτε από τα κυκλώματα (IC) CIA 1 ή CIA 2 πριν φτάσουν στον μικροεπεξεργαστή 6502. Τα σήματα από το δίαυλο δεδομένων του 6502 μP πρέπει να περάσουν είτε μέσω του τσιπ CIA 1 ή CIA 2 πριν φτάσουν σε οποιαδήποτε εξωτερική συσκευή. Η CIA σημαίνει Complex Interface Adapter. Στο Σχήμα 4.1 «Διάγραμμα μπλοκ της μητρικής πλακέτας Commodore_64», οι συσκευές εισόδου/εξόδου μπλοκ αντιπροσωπεύουν το CIA 1 και το CIA 2. Όταν εκτελείται ένα πρόγραμμα, μπορεί να διακοπεί για να εκτελεστεί κάποιο άλλο κομμάτι κώδικα πριν συνεχιστεί. Υπάρχει διακοπή υλικού και διακοπή λογισμικού. Για διακοπή υλικού, υπάρχουν δύο ακίδες σήματος εισόδου στο 6502 μP. Τα ονόματα αυτών των καρφίδων είναι IRQ και NMI . Αυτές δεν είναι γραμμές δεδομένων μP. Οι γραμμές δεδομένων για το μΡ είναι D7, D6, D5, D4, D3, D2, D1 και D0. με D0 για το λιγότερο σημαντικό bit και D7 για το πιο σημαντικό bit.

IRQ σημαίνει Interrupt ReQuest 'active' low. Αυτή η γραμμή εισόδου στο μP είναι συνήθως υψηλή, περίπου στα 5 βολτ. Όταν πέφτει σε περίπου 0 volt, αυτό είναι ένα αίτημα διακοπής που σηματοδοτεί το μP. Μόλις το αίτημα ικανοποιηθεί, η γραμμή επανέρχεται ψηλά. Η χορήγηση του αιτήματος διακοπής σημαίνει ότι το μP διακλαδώνεται στον κώδικα (υπορουτίνα) που χειρίζεται τη διακοπή.

NMI σημαίνει Non-Maskable Interrupt 'active' low. Ενώ ο κωδικός για IRQ εκτελείται NMI μπορεί να πάει χαμηλά. Σε αυτήν την περίπτωση, NMI χειρίζεται (εκτελείται ο δικός του κώδικας). Μετά από αυτό, ο κωδικός για IRQ συνεχίζεται. Μετά τον κωδικό για IRQ τελειώνει, ο κύριος κωδικός προγράμματος συνεχίζεται. Αυτό είναι, NMI διακόπτει το IRQ χειριστής. Το σήμα για NMI μπορεί ακόμα να δοθεί στο μP ακόμα και όταν το μP είναι σε αδράνεια και δεν χειρίζεται τίποτα ή δεν εκτελεί κύριο πρόγραμμα.

Σημείωση: Είναι στην πραγματικότητα η μετάβαση από το υψηλό στο χαμηλό, του NMI , αυτό είναι το NMI σήμα - περισσότερα για αυτό αργότερα. IRQ κανονικά προέρχεται από το CIA 1 και NMI συνήθως προέρχεται από τη CIA 2. NMI , που σημαίνει Non-Maskable Interrupt, μπορεί να θεωρηθεί ως διακοπή που δεν μπορεί να σταματήσει.

Χειρισμός διακοπών
Είτε το αίτημα είναι από IRQ ή NMI , πρέπει να ολοκληρωθεί η τρέχουσα οδηγία. Το 6502 έχει μόνο τους καταχωρητές A, X και Y. Ενώ λειτουργεί μια υπορουτίνα, μπορεί να χρησιμοποιεί αυτούς τους τρεις καταχωρητές μαζί. Ο χειριστής διακοπής εξακολουθεί να είναι υπορουτίνα, αν και δεν θεωρείται ως τέτοιος. Αφού ολοκληρωθεί η τρέχουσα εντολή, τα περιεχόμενα των καταχωρητών A, X και Y για το 65C02 µP αποθηκεύονται στη στοίβα. Η διεύθυνση της επόμενης εντολής του μετρητή προγράμματος αποστέλλεται επίσης στη στοίβα. Στη συνέχεια, το µP διακλαδώνεται στον κωδικό για τη διακοπή. Μετά από αυτό, τα περιεχόμενα των καταχωρητών A, X και Y αποκαθίστανται από τη στοίβα με την αντίστροφη σειρά με την οποία αποστέλλονται.

Παράδειγμα κωδικοποίησης για διακοπή
Για απλότητα, υποθέστε ότι η ρουτίνα για το µP IRQ Η διακοπή είναι απλώς να προσθέσετε τους αριθμούς $01 και $02 και να αποθηκεύσετε το αποτέλεσμα των $03 στη διεύθυνση μνήμης των $0400. Ο κωδικός είναι:

ISR PHA
PHX
PHY
;
LDA #01$
ADC #$02
ΚΟΣΤΙΖΟΥΝ 0400$
;
ΦΥΛΛΟ
PLX
PLA
RTI

Το ISR είναι μια ετικέτα και προσδιορίζει τη διεύθυνση μνήμης όπου βρίσκεται η εντολή PHA. ISR σημαίνει Διακοπή υπηρεσίας ρουτίνας. Τα PHA, PHX και PHY στέλνουν τα περιεχόμενα των καταχωρητών A, X και Y στη στοίβα με την ελπίδα ότι θα χρειαστούν από οποιονδήποτε κωδικό (πρόγραμμα) που εκτελείται ακριβώς πριν από τη διακοπή. Οι επόμενες τρεις οδηγίες αποτελούν τον πυρήνα του χειριστή διακοπών. Οι οδηγίες PLY, PLX και PLA πρέπει να είναι με αυτή τη σειρά και επαναφέρουν τα περιεχόμενα των καταχωρητών Y, X και A. Η τελευταία εντολή, η οποία είναι RTI, (χωρίς τελεστή) επιστρέφει τη συνέχιση της εκτέλεσης σε οποιοδήποτε κώδικα (πρόγραμμα) που εκτελείται πριν από τη διακοπή. Το RTI τραβά τη διεύθυνση της επόμενης εντολής του κώδικα που εκτελείται από τη στοίβα πίσω στον μετρητή προγράμματος. RTI σημαίνει Επιστροφή από Διακοπή. Με αυτό, ο χειρισμός διακοπής (υπορουτίνα) έχει τελειώσει.

Διακοπή λογισμικού
Ο κύριος τρόπος για να έχετε μια διακοπή λογισμικού για το 6502 μP είναι με τη χρήση της εντολής σιωπηρής διεύθυνσης BRK. Ας υποθέσουμε ότι το κύριο πρόγραμμα εκτελείται και συναντά την εντολή BRK. Από εκείνο το σημείο, η διεύθυνση της επόμενης εντολής στον υπολογιστή θα πρέπει να σταλεί στη στοίβα καθώς ολοκληρώνεται η τρέχουσα εντολή. Μια υπορουτίνα για το χειρισμό της εντολής λογισμικού θα πρέπει να ονομάζεται 'επόμενο'. Αυτή η υπορουτίνα διακοπής θα πρέπει να ωθεί τα περιεχόμενα των καταχωρητών A, X και Y στη στοίβα. Αφού εκτελεστεί ο πυρήνας της υπορουτίνας, τα περιεχόμενα των καταχωρητών Α, Χ και Υ θα πρέπει να ανασυρθούν από τη στοίβα στους καταχωρητές τους από την υπορουτίνα ολοκλήρωσης. Η τελευταία δήλωση στη ρουτίνα είναι RTI. Το περιεχόμενο του υπολογιστή αποσύρεται επίσης αυτόματα από τη στοίβα στον υπολογιστή λόγω RTI.

Σύγκριση και αντιπαραβολή της ρουτίνας υπορουτίνας και διακοπής υπηρεσίας
Ο παρακάτω πίνακας συγκρίνει και αντιπαραβάλλει τη ρουτίνα υπορουτίνας και διακοπής υπηρεσίας:

4.17 Περίληψη των 6502 Κύριων Τρόπων Διεύθυνσης

Κάθε εντολή για το 6502 είναι ένα byte, ακολουθούμενη από μηδέν ή περισσότερους τελεστές.

Λειτουργία άμεσης διεύθυνσης
Με τη λειτουργία άμεσης διεύθυνσης, μετά τον τελεστή, είναι η τιμή και όχι μια διεύθυνση μνήμης. Η τιμή πρέπει να προηγείται από το #. Εάν η τιμή είναι δεκαεξαδική, το '#' πρέπει να ακολουθείται από το '$'. Οι άμεσες οδηγίες διευθυνσιοδότησης για το 65C02 είναι: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. Ο αναγνώστης θα πρέπει να συμβουλευτεί την τεκμηρίωση για το 65C02 μP για να μάθει πώς να χρησιμοποιεί τις οδηγίες που παρατίθενται εδώ και δεν επεξηγούνται σε αυτό το κεφάλαιο. Ένα παράδειγμα εντολής είναι:

LDA #77$

Απόλυτη λειτουργία διεύθυνσης
Στη λειτουργία απόλυτης διευθυνσιοδότησης, υπάρχει ένας τελεστής. Αυτός ο τελεστής είναι η διεύθυνση της τιμής στη μνήμη (συνήθως σε δεκαεξαδικό ή ετικέτα). Υπάρχουν 64 χιλ 10 = 65.536 10 διευθύνσεις μνήμης για τα 6502 µP. Συνήθως, η τιμή ενός byte βρίσκεται σε μία από αυτές τις διευθύνσεις. Οι απόλυτες οδηγίες διεύθυνσης για το 65C02 είναι: ADC, AND, ASL, BIT, CMP, CPX, CPY, DEC, EOR, INC, JMP, JSR, LDA, LDX, LDY, LSR, ORA, ROL, ROR, SBC, STA , STX, STY, STZ, TRB, TSB. Ο αναγνώστης θα πρέπει να συμβουλευτεί την τεκμηρίωση για το 65C02 µP για να γνωρίζει πώς να χρησιμοποιεί τις οδηγίες που παρατίθενται εδώ, καθώς και για τους υπόλοιπους τρόπους διευθυνσιοδότησης που δεν εξηγούνται σε αυτό το κεφάλαιο. Ένα παράδειγμα εντολής είναι:

ΕΙΝΑΙ 1234 $

Λειτουργία σιωπηρής διεύθυνσης
Στη λειτουργία σιωπηρής διεύθυνσης, δεν υπάρχει τελεστής. Οποιοσδήποτε καταχωρητής μP εμπλέκεται υπονοείται από την οδηγία. Οι υπονοούμενες οδηγίες διεύθυνσης για το 65C02 είναι: BRK, CLC, CLD, CLI, CLV, DEX, DEY, INX, INY, NOP, PHA, PHP, PHX, PHY, PLA, PLP, PLX, PLY, RTI, RTS, SEC , SED, SEI, TAX, TAY, TSX, TXA, TXS, TYA. Ένα παράδειγμα εντολής είναι:

DEX : Μείωση του καταχωρητή X κατά μία μονάδα.

Σχετική λειτουργία διεύθυνσης
Η λειτουργία σχετικής διευθυνσιοδότησης ασχολείται μόνο με οδηγίες διακλάδωσης. Στη σχετική λειτουργία διευθυνσιοδότησης, υπάρχει μόνο ένας τελεστής. Είναι μια τιμή από -128 10 έως +127 10 . Αυτή η τιμή ονομάζεται μετατόπιση. Με βάση το πρόσημο, αυτή η τιμή προστίθεται ή αφαιρείται από την επόμενη εντολή του Μετρητή Προγράμματος για να προκύψει η διεύθυνση της προβλεπόμενης επόμενης εντολής. Οι σχετικές οδηγίες λειτουργίας διεύθυνσης είναι: BCC, BCS, BEQ, BMI, BNE, BPL, BRA, BVC, BVS. Τα παραδείγματα οδηγιών είναι:

BNE $7F : (κλάδος εάν Z = 0 στο μητρώο κατάστασης, P)

Το οποίο προσθέτει 127 στον τρέχοντα μετρητή προγράμματος (διεύθυνση προς εκτέλεση) και ξεκινά την εκτέλεση της εντολής σε αυτήν τη διεύθυνση. Ομοίως:

BEQ $F9 : (κλάδος εάν Z = : σε μητρώο κατάστασης, P)

Το οποίο προσθέτει ένα -7 στον τρέχοντα μετρητή προγράμματος και ξεκινά την εκτέλεση στη διεύθυνση του νέου μετρητή προγράμματος. Ο τελεστής είναι ένας αριθμός συμπληρώματος δύο.

Απόλυτη ευρετηριασμένη διεύθυνση
Στη διευθυνσιοδότηση απόλυτου ευρετηρίου, το περιεχόμενο του καταχωρητή X ή Y προστίθεται στη δεδομένη απόλυτη διεύθυνση (οπουδήποτε από $0000 έως $FFFF, δηλ. από 0 10 στο 65536 10 ) για να έχετε την πραγματική διεύθυνση. Αυτή η δεδομένη απόλυτη διεύθυνση ονομάζεται διεύθυνση βάσης. Εάν χρησιμοποιείται ο καταχωρητής X, η οδηγία συναρμολόγησης είναι κάπως έτσι:

LDA $C453,X

Εάν χρησιμοποιείται ο καταχωρητής Y, είναι κάτι σαν:

LDA $C453,Y

Η τιμή για τον καταχωρητή X ή Y ονομάζεται τιμή μέτρησης ή δείκτη και μπορεί να είναι οπουδήποτε από $00 (0 10 ) to $FF (250 10 ). Δεν λέγεται μετατόπιση.

Οι οδηγίες διευθυνσιοδότησης απόλυτου ευρετηρίου είναι: ADC, AND, ASL (μόνο X), BIT (με συσσωρευτή και μνήμη, μόνο με X), CMP, DEC (μόνο μνήμη και X), EOR, INC (μόνο μνήμη και X), LDA , LDX, LDY, LSR (μόνο X), ORA, ROL (μόνο X), ROR (μόνο X), SBC, STA, STZ (μόνο X).

Απόλυτη Έμμεση Διεύθυνση
Αυτό χρησιμοποιείται μόνο με την εντολή άλματος. Με αυτό, η δεδομένη απόλυτη διεύθυνση έχει μια διεύθυνση δείκτη. Η διεύθυνση του δείκτη αποτελείται από δύο byte. Ο δείκτης των δύο byte δείχνει (είναι η διεύθυνση) της τιμής του byte προορισμού στη μνήμη. Έτσι, η οδηγία της γλώσσας assembly είναι:

JMP (3456 $)

Με τις παρενθέσεις, και το $13 βρίσκεται στη θέση διεύθυνσης των $3456 ενώ το $EB είναι στη θέση διεύθυνσης των $3457 (= $3456 + 1). Στη συνέχεια, η διεύθυνση προορισμού είναι $13EB και $13EB είναι ο δείκτης. Το απόλυτο $3456 βρίσκεται σε παρένθεση στην οδηγία όπου το 34 είναι το χαμηλότερο byte και το 56 το υψηλότερο byte.

4.18 Δημιουργία συμβολοσειράς με τη γλώσσα συναρμολόγησης 6502 µP

Όπως αποδεικνύεται στο επόμενο κεφάλαιο, μετά τη δημιουργία ενός αρχείου στη μνήμη, το αρχείο μπορεί να αποθηκευτεί στο δίσκο. Πρέπει να δοθεί όνομα στο αρχείο. Το όνομα είναι παράδειγμα συμβολοσειράς. Υπάρχουν πολλά άλλα παραδείγματα συμβολοσειρών στον προγραμματισμό.

Υπάρχουν δύο κύριοι τρόποι δημιουργίας μιας συμβολοσειράς κωδικών ASCII. Και με τους δύο τρόπους, όλοι οι κώδικες (χαρακτήρες) ASCII λαμβάνουν διαδοχικές θέσεις byte στη μνήμη. Με έναν από τους τρόπους, αυτή η ακολουθία byte προηγείται από ένα ακέραιο byte που είναι το μήκος (αριθμός χαρακτήρων) στην ακολουθία (string). Με τον άλλο τρόπο, την ακολουθία χαρακτήρων διαδέχεται (ακολουθείται αμέσως) το Null byte που είναι 00 16 , δηλαδή $00. Το μήκος της συμβολοσειράς (αριθμός χαρακτήρων) δεν υποδεικνύεται με αυτόν τον άλλο τρόπο. Ο χαρακτήρας Null δεν χρησιμοποιείται με τον πρώτο τρόπο.

Για παράδειγμα, σκεφτείτε το 'Σ 'αγαπώ!' συμβολοσειρά χωρίς τα εισαγωγικά. Το μήκος εδώ είναι 11. ένα διάστημα μετράει ως ένα byte ASCII (χαρακτήρας). Ας υποθέσουμε ότι η συμβολοσειρά πρέπει να τοποθετηθεί στη μνήμη με τον πρώτο χαρακτήρα να είναι στη διεύθυνση $0300.

Ο παρακάτω πίνακας δείχνει τη ρύθμιση της μνήμης συμβολοσειρών όταν το πρώτο byte είναι 11 10 = 0Β 16 :

Ο παρακάτω πίνακας δείχνει τη ρύθμιση της μνήμης συμβολοσειρών όταν το πρώτο byte είναι 'I' και το τελευταίο byte είναι Null ($00):

Η ακόλουθη οδηγία μπορεί να χρησιμοποιηθεί για να ξεκινήσει η δημιουργία της συμβολοσειράς:

ΚΟΣΤΙΖΟΥΝ 0300$

Ας υποθέσουμε ότι το πρώτο byte βρίσκεται στον συσσωρευτή που πρόκειται να σταλεί στην τοποθεσία διεύθυνσης των $0300. Αυτή η οδηγία ισχύει και για τις δύο περιπτώσεις (και τους δύο τύπους συμβολοσειρών).

Αφού τοποθετηθούν όλοι οι χαρακτήρες στα κελιά μνήμης, ένας προς έναν, η συμβολοσειρά μπορεί να διαβαστεί χρησιμοποιώντας έναν βρόχο. Για την πρώτη περίπτωση, διαβάζεται ο αριθμός των χαρακτήρων μετά το μήκος. Για τη δεύτερη περίπτωση, οι χαρακτήρες διαβάζονται από το 'I' μέχρι να συναντηθεί ο χαρακτήρας Null που είναι 'Null'.

4.19 Δημιουργία πίνακα με τη γλώσσα συναρμολόγησης 6502 µP

Ένας πίνακας ακεραίων μεμονωμένων byte αποτελείται από διαδοχικές θέσεις byte μνήμης με τους ακέραιους αριθμούς. Στη συνέχεια, υπάρχει ένας δείκτης που δείχνει τη θέση του πρώτου ακέραιου αριθμού. Έτσι, ένας πίνακας ακεραίων αποτελείται από δύο μέρη: τον δείκτη και τη σειρά των τοποθεσιών.

Για μια σειρά από συμβολοσειρές, κάθε συμβολοσειρά μπορεί να βρίσκεται σε διαφορετική θέση στη μνήμη. Στη συνέχεια, υπάρχουν διαδοχικές θέσεις μνήμης με δείκτες όπου κάθε δείκτης δείχνει την πρώτη θέση κάθε συμβολοσειράς. Ένας δείκτης σε αυτή την περίπτωση αποτελείται από δύο byte. Εάν μια συμβολοσειρά ξεκινά με το μήκος της, ο αντίστοιχος δείκτης δείχνει τη θέση αυτού του μήκους. Εάν μια συμβολοσειρά δεν ξεκινά με το μήκος της αλλά τελειώνει με μηδενικό χαρακτήρα, ο αντίστοιχος δείκτης δείχνει τη θέση του πρώτου χαρακτήρα της συμβολοσειράς. Και υπάρχει ένας δείκτης που δείχνει στην κάτω διεύθυνση byte του πρώτου δείκτη των διαδοχικών δεικτών. Έτσι, ένας πίνακας συμβολοσειρών αποτελείται από τρία μέρη: τις συμβολοσειρές σε διαφορετικά σημεία στη μνήμη, τους αντίστοιχους διαδοχικούς δείκτες και τον δείκτη προς τον πρώτο δείκτη των διαδοχικών δεικτών.

4.20 Προβλήματα

Συνιστάται στον αναγνώστη να λύσει όλα τα προβλήματα σε ένα κεφάλαιο πριν προχωρήσει στο επόμενο κεφάλαιο.

  1. Γράψτε ένα πρόγραμμα γλώσσας συναρμολόγησης που ξεκινά από 0200 $ για τα 6502 μP και προσθέτει τους ανυπόγραφους αριθμούς του 2A94 H (προσθήκη) στο 2ABF H (augend). Αφήστε τις εισόδους και τις εξόδους να βρίσκονται στη μνήμη. Επίσης, δημιουργήστε το συναρμολογημένο έγγραφο προγράμματος με το χέρι.
  2. Γράψτε ένα πρόγραμμα γλώσσας συναρμολόγησης που ξεκινά από 0200 $ για τα 6502 μP και αφαιρεί τους ανυπόγραφους αριθμούς του 1569 H (υπόστρωμα) από 2ABF H (minuend). Αφήστε τις εισόδους και τις εξόδους να βρίσκονται στη μνήμη. Επίσης, δημιουργήστε το συναρμολογημένο έγγραφο προγράμματος με το χέρι.
  3. Γράψτε ένα πρόγραμμα γλώσσας συναρμολόγησης για τα 6502 µP που μετράει από $00 έως $09 χρησιμοποιώντας έναν βρόχο. Το πρόγραμμα θα πρέπει να ξεκινά από $0200. Επίσης, δημιουργήστε το συναρμολογημένο έγγραφο προγράμματος με το χέρι.
  4. Γράψτε ένα πρόγραμμα γλώσσας συναρμολόγησης που ξεκινά από 0200 $ για τα 6502 µP. Το πρόγραμμα έχει δύο υπορουτίνες. Η πρώτη υπορουτίνα προσθέτει τους ανυπόγραφους αριθμούς του 0203 H (augend) και 0102H (προσθήκη). Η δεύτερη υπορουτίνα προσθέτει το άθροισμα από την πρώτη υπορουτίνα που είναι 0305H έως 0006 H (augend). Το τελικό αποτέλεσμα αποθηκεύεται στη μνήμη. Καλέστε την πρώτη υπορουτίνα που είναι FSTSUB και τη δεύτερη υπορουτίνα που είναι SECSUB. Αφήστε τις εισόδους και τις εξόδους να βρίσκονται στη μνήμη. Επίσης, δημιουργήστε το συναρμολογημένο έγγραφο προγράμματος για ολόκληρο το πρόγραμμα με το χέρι.
  5. Δεδομένου ότι ένα IRQ Ο χειριστής προσθέτει $02 έως $01 στον συσσωρευτή ως χειρισμό πυρήνα ενώ NMI εκδίδεται και ο πυρήνας χειρισμός για NMI προσθέτει $05 έως $04 στον συσσωρευτή, γράψτε μια γλώσσα συναρμολόγησης και για τους δύο χειριστές, συμπεριλαμβανομένων των κλήσεών τους. Η κλήση προς το IRQ ο χειριστής θα πρέπει να βρίσκεται στη διεύθυνση των $0200. ο IRQ ο χειριστής θα πρέπει να ξεκινά από τη διεύθυνση των $0300. ο NMI ο χειριστής θα πρέπει να ξεκινά από τη διεύθυνση των $0400. Το αποτέλεσμα του IRQ ο χειριστής θα πρέπει να τοποθετηθεί στη διεύθυνση των $0500, και το αποτέλεσμα του NMI Ο χειριστής θα πρέπει να τοποθετηθεί στη διεύθυνση $0501.
  6. Εξηγήστε συνοπτικά πώς χρησιμοποιείται η εντολή BRK για την παραγωγή της διακοπής λογισμικού σε έναν υπολογιστή 65C02.
  7. Δημιουργήστε έναν πίνακα που συγκρίνει και αντιπαραβάλλει μια κανονική υπορουτίνα με μια ρουτίνα υπηρεσίας διακοπής.
  8. Εξηγήστε συνοπτικά τους κύριους τρόπους διευθυνσιοδότησης του 65C02 µP, δεδοµένων των παραδειγµάτων οδηγιών στη γλώσσα συναρµολόγησης.
  9. α) Γράψτε ένα πρόγραμμα γλώσσας μηχανής 6502 για να βάλετε το 'Σ'αγαπώ!' συμβολοσειρά κωδικών ASCII στη μνήμη, ξεκινώντας από τη διεύθυνση $0300 με το μήκος της συμβολοσειράς. Το πρόγραμμα θα πρέπει να ξεκινά από τη διεύθυνση $0200. Αποκτήστε κάθε χαρακτήρα από τον συσσωρευτή έναν προς έναν, υποθέτοντας ότι αποστέλλονται εκεί, από κάποια υπορουτίνα. Επίσης, συναρμολογήστε το πρόγραμμα με το χέρι. (Εάν χρειάζεται να γνωρίζετε τους κωδικούς ASCII για το 'I love you!'. Εδώ είναι: 'I':49 16 , χώρος : 20 16 , «l»: 6C 16 , «o»: 6F 16 , 'in':76 16 , 'e':65, 'y':79 16 , 'in':75 16 , και «!»:21 16 (Σημείωση: κάθε κωδικός καταλαμβάνει 1 byte).
    β) Γράψτε ένα πρόγραμμα γλώσσας μηχανής 6502 για να βάλετε το 'Σ'αγαπώ!' συμβολοσειρά κωδικών ASCII στη μνήμη, ξεκινώντας από τη διεύθυνση $0300 χωρίς το μήκος της συμβολοσειράς αλλά τελειώνουν σε 00 16 . Το πρόγραμμα θα πρέπει να ξεκινά από τη διεύθυνση $0200. Αποκτήστε κάθε χαρακτήρα από τον συσσωρευτή, υποθέτοντας ότι αποστέλλονται εκεί, ένας προς έναν, από κάποια υπορουτίνα. Επίσης, συναρμολογήστε το πρόγραμμα με το χέρι.