ΠΕΡΙΕΧΟΜΕΝΑ 1. Υπορουτίνες Μαθηµατικών Πράξεων 1.1. Προσηµασµένοι και απροσήµαστοι αριθµοί 1.2. Μετατροπές προσηµασµένων και απροσήµαστων αριθµών Cr0 Μετατροπή αριθµού 8 Bits από µορφή προσηµασµένου µε συµπλήρωµα ως προς 2 (2's Complement) στην µορφή Απόλυτη Τιµή / Πρόσηµο Cr1 Μετατροπή αριθµού 8 Bits από µορφή προσηµασµένου µε συµπλήρωµα ως προς 2 (2's Complement) στην µορφή Απόλυτη Τιµή / Πρόσηµο Cr0r1 Μετατροπή αριθµού 16 Bits από µορφή προσηµασµένου µε συµπλήρωµα ως προς 2 (2's Complement) στην µορφή Απόλυτη Τιµή / Πρόσηµο Mr0version1 Μετατροπή αριθµού 8 Bits από την µορφή απροσήµαστου (απόλυτη τιµή) στην µορφή προσηµασµένου µε συµπλήρωµα ως προς 2 Mr0 Μετατροπή αριθµού 8 Bits από την µορφή απροσήµαστου (απόλυτη τιµή)στην µορφή προσηµασµένου µε συµπλήρωµα ως προς 2 Mr0r1 Μετατροπή αριθµού 16 Bits από την µορφή απροσήµαστου (απόλυτη τιµή) στην µορφή προσηµασµένου µε συµπλήρωµα ως προς 2 CONV816 Μετατροπή προσηµασµένων αριθµών των 8 bits σε προσηµασµένους αριθµούς των 16 bits στην µορφή συµπληρώµατος ως προς 2. 1.3. Αριθµητικές πράξεις ADD16 Πρόσθεση δύο προσηµασµένων αριθµών των 16 bits στην µορφή συµπληρώµατος ως προς 2. SUB16 Αφαίρεση δύο προσηµασµένων αριθµών των 16 bits στην µορφή συµπληρώµατος ως προς 2. UMUL8 Πολλαπλασιασµός δύο απροσήµαστων αριθµών των 8 bits και παραγωγή γινοµένου των 16 bits στη µορφή απροσήµαστου αριθµού. MUL8 Πολλαπλασιασµός δύο προσηµασµένων αριθµών των 8 bits και παραγωγή γινοµένου των 16 bits στη µορφή συµπληρώµατος ως προς 2. UDIV8 ιαίρεση δύο απροσήµαστων αριθµών των 8 bits και παραγωγή πηλίκου των 8 bits και υπολοίπου των 8 bits στη µορφή απροσήµαστων αριθµών. DIV8 ιαίρεση δύο προσηµασµένων αριθµών των 8 bits και παραγωγή πηλίκου των 8 bits και υπολοίπου των 8 bits στη µορφή συµπληρώµατος ως προς 2. 2. Άλλες Υπορουτίνες DELAY Εισαγωγή χρονικής καθυστέρησης RAMP Παραγωγή περιοδικής πριονωτής κυµατοµορφής µε την µέθοδο διαίρεσης Modulo N, µε ρυθµιζόµενο αριθµό δειγµάτων σε κάθε κύκλο της κυµατοµορφής και ελεγχόµενη από διακόπτη δύο θέσεων. ROTATELIGHTS Παραγωγή φωτιστικού εφφέ που δίνει την εντύπωση ότι ένα συγκεκριµένο πρότυπο «αναµµένο φως-σβηστό φως» µετακινείται, περιστρέφεται και ανακυκλώνεται σε µια σειρά από 8 LEDs µε λειτουργία ελεγχόµενη από διακόπτη δύο θέσεων. Γενικές Παρατηρήσεις Ωρισµένες υπορουτίνες καλούνται από άλλες και για τον λόγο αυτό σε πολλά από τα παραδείγµατα που ακολουθούν, οι υπορουτίνες τελειώνουν µε την εντολή (urn). Σε δύο περιπτώσεις υπάρχουν υπορουτίνες οι οποίες µοιάζουν ίδιες αλλά δεν είναι (Cr0 - Cr1 και Mr0version1 - Mr0). Ο λόγος που περιγράφονται αυτές οι σχεδόν ίδιες υπορουτίνες είναι ότι καλούνται στη συνέχεια από άλλες υπορουτίνες και οι µικροδιαφορές τους τότε µόνον έχουν σηµασία. 1
1. Υπορουτίνες Μαθηµατικών Πράξεων Στην ενότητα αυτή παρουσιάζονται ορισµένες µαθηµατικές υπορουτίνες οι οποίες περιλαµβάνουν αριθµητικές πράξεις µε απροσήµαστους και προσηµασµένους αριθµούς των 8, 16 και 32 bits, και διάφορες σχετικές µετατροπές. 1.1. Προσηµασµένοι και απροσήµαστοι αριθµοί Οι απροσήµαστοι αριθµοί παίρνουν θετικές ακέραιες τιµές από 0 έως 2 Ν -1 όπου Ν το πλήθος των bits του αριθµού (πχ. ένας απροσήµαστος αριθµός 8 bits παίρνει ακέραιες τιµές από 0 έως 255). Για την αναπαράσταση αρνητικών αριθµών χρησιµοποιούνται προσηµασµένοι αριθµοί στην µορφή συµπληρώµατος ως προς 2. Το συµπλήρωµα ως προς 2 (2's Complement) ενός αριθµού Μ είναι ο αριθµός 2 Ν Μ, όπου Ν το πλήθος των bits του αριθµού. Πρακτικά υπολογίζεται ως εξής: Το πρώτο (ανώτερο) bit είναι 0 όταν ο αριθµός είναι θετικός. Τα υπόλοιπα bits δίνουν την απόλυτη τιµή του αριθµού ως έχουν. Το πρώτο (ανώτερο) bit είναι 1 όταν ο αριθµός είναι αρνητικός. Τα υπόλοιπα bits δίνουν την απόλυτη τιµή του αριθµού αφού όµως γίνουν οι εξής πράξεις: Αντιστροφή του κάθε bit Στον αριθµό που προκύπτει έτσι, προσθέτουµε το 1 Ένας προσηµασµένος αριθµός 8 bits αναπαριστά τις ακέραιες τιµές από -128 έως +127. Για την µετατροπή ενός προσηµασµένου σε απροσήµαστο ακολουθείται η αντίστροφη διαδικασία. 1.2. Μετατροπές προσηµασµένων και απροσήµαστων αριθµών Cr0 ***************************************************************** Όλες οι παράµετροι βρίσκονται στην πρώτη οµάδα καταχωρητών r0 έως r7 (Register bank 0) Το Bit 21H χρησιµοποιείται για να αποθηκεύει το πρόσηµο (1 για τους αρνητικούς, 0 για τους θετικούς) ================================================================= subroutine Cr0 Μετατροπή αριθµού 8 Bits από µορφή προσηµασµένου µε συµπλήρωµα ως προς 2 (2's Complement) στην µορφή Απόλυτη Τιµή / Πρόσηµο Είσοδος (input): r0 = προσηµασµένο byte Έξοδος (output): r0 = Απόλυτη Τιµή Bit 21H = Πρόσηµο (Το bit 21H γίνεται set αν στον r0 ο αριθµός είναι αρνητικός) ================================================================= 2
Cr0: mov a, r0 jb acc.7, Cr0a Ελέγχεται το bit 7. Αν είναι 1 ο αριθµός είναι αρνητικός clr 21H To bit προσήµου γίνεται clear αν ο αριθµός είναι θετικός Επιστροφή (τέλος της υπορουτίνας) Cr0a: cpl a Ο αριθµός είναι αρνητικός - inc a εύρεση της απόλυτης τιµής * mov r0, a αποθήκευση της απόλυτης τιµής setb 21H Το bit προσήµου γίνεται set ================================================================= (*): Αντί των εντολών clp a inc a µπορούν ισοδύναµα να χρησιµοποιηθούν οι dec a cpl a Επαληθεύστε τον παραπάνω ισχυρισµό µε ένα απλό παράδειγµα ================================================================= Cr1 ***************************************************************** Η υπορουτίνα αυτή είναι ακριβώς ίδια µε την Cr0 µε την εξής διαφορά: Αντί του r0 και του Bit 21H που χρησιµοποιεί η Cr0 εδώ χρησιµοποιούνται ο r1 και το Bit 22H αντίστοιχα. Ο µόνος λόγος που αναφέρεται η υπορουτίνα αυτή είναι επειδή καλείται από άλλες υπορουτίνες που περιγράφονται παρακάτω. Όλες οι παράµετροι βρίσκονται στην πρώτη οµάδα καταχωρητών r0 έως r7 (Register bank 0) Το Bit 22H χρησιµοποιείται για να αποθηκεύει το πρόσηµο (1 για τους αρνητικούς, 0 για τους θετικούς) ================================================================= subroutine Cr1 Μετατροπή αριθµού 8 Bits από µορφή προσηµασµένου µε συµπλήρωµα ως προς 2 (2's Complement) στην µορφή Απόλυτη Τιµή / Πρόσηµο Είσοδος (input): r1 = προσηµασµένο byte Έξοδος (output): r1 = Απόλυτη Τιµή Bit 22H = Πρόσηµο (Το bit 22H γίνεται set αν στον r1 ο αριθµός είναι αρνητικός) ================================================================= Cr1: mov a, r1 jb acc.7, Cr1a Ελέγχεται το bit 7. Αν είναι 1 ο αριθµός είναι αρνητικός clr 22H To bit προσήµου γίνεται clear αν ο αριθµός είναι θετικός Επιστροφή (τέλος της υπορουτίνας) 3
Cr1a: cpl a Ο αριθµός είναι αρνητικός - inc a εύρεση της απόλυτης τιµής mov r1, a αποθήκευση της απόλυτης τιµής setb 22H Το bit προσήµου γίνεται set ================================================================= Cr0r1 ***************************************************************** Όλες οι παράµετροι βρίσκονται στην πρώτη οµάδα καταχωρητών r0 έως r7 (Register bank 0) Το Bit 21H χρησιµοποιείται για να αποθηκεύει το πρόσηµο (1 για τους αρνητικούς, 0 για τους θετικούς) ================================================================= subroutine Cr0r1 Μετατροπή αριθµού 16 Bits από µορφή προσηµασµένου µε συµπλήρωµα ως προς 2 (2's Complement) στην µορφή Απόλυτη Τιµή / Πρόσηµο Είσοδος (input): r1, r0 = προσηµασµένη λέξη (word) Έξοδος (output): r1, r0 = Απόλυτη Τιµή Bit 21H = Πρόσηµο (Το bit 21H γίνεται set αν ο αριθµός είναι αρνητικός) ================================================================= Cr0r1: mov a, r1 Μεταφέρει το high byte στον accumulator jb acc.7, c0a Αν το bit 7 είναι 1 ο αριθµός είναι αρνητικός clr 21H Το bit του προσήµου γίνεται clear αν ο αριθµός είναι θετικός Τέλος c0a: setb 21H Ο αριθµός είναι αρνητικός. Το bit του προσήµου γίνεται set mov a, r0 Μετατροπή του low byte από µορφή cpl a προσηµασµένου µε συµπλήρωµα ως προς add a, #01Η 2 σε απόλυτη τιµή απροσήµαστου [*] mov r0, a Αποθήκευση του αποτελέσµατος στον r0 mov a, r1 Οµοίως για το high byte cpl a complement addc a, #00Η Η εντολή αυτή δίνεται για να συνυπολογισθεί το carry που προέκυψε από την προηγούµενη πρόσθεση κατά την µετατροπή του low byte mov r1, a Τέλος [*] ΣΗΜΕΙΩΣΗ: Οι εντολές cpl a add a, #01Η έχουν το ίδιο αποτέλεσµα µε τις 4
dec a cpl a Επαληθεύστε την παραπάνω παρατήρηση µε ένα απλό παράδειγµα Mr0version1 ***************************************************************** Η υπορουτίνα αυτή µετατρέπει απροσήµαστους αριθµούς των 8 bits σε προσηµασµένους στην µορφή συµπληρώµατος ως προς 2 Χρησιµοποιεί επίσης και ένα bit (Bit 21H) στο οποίο έχει εγγραφεί το πρόσηµο του αριθµού (1 για τους αρνητικούς, 0 για τους θετικούς) ================================================================= subroutine Mr0version1 Μετατροπή αριθµού 8 Bits από την µορφή απροσήµαστου (απόλυτη τιµή) στην µορφή προσηµασµένου µε συµπλήρωµα ως προς 2 Είσοδος (input): r0 = απόλυτη τιµή Bit 21H = Πρόσηµο (1 αν ο αριθµός είναι αρνητικός, 0 αν είναι θετικός) Έξοδος (output): r0 = Προσηµασµένος αριθµός στην µορφή συµπληρώµατος ως προς 2 ================================================================= Mr0version1: jb 21H, Mr0a Ελέγχει το πρόσηµο του αριθµού Ο αριθµός είναι θετικός και η υπορουτίνα τελειώνει χωρίς καµµία επέµβαση στον αριθµό Mr0a: mov a, r0 Ο αριθµός είναι αρνητικός cpl a Αντιστρέφει τα bits του αριθµού και inc a αυξάνει κατά ένα για να υπολογίσει το συµπλήρωµα ως προς 2 του αριθµού mov r0, a Αποθηκεύει τον αριθµό στην µορφή συµπληρώµατος ως προς 2 Τέλος Mr0 ***************************************************************** Η υπορουτίνα αυτή µετατρέπει απροσήµαστους αριθµούς των 8 bits σε προσηµασµένους στην µορφή συµπληρώµατος ως προς 2. Η υπορουτίνα είναι ίδια µε την υπορουτίνα Mr0version1 µε την εξής µόνον διαφορά: Χρησιµοποιούνται δύο bits για το πρόσηµο (τα bits 21H και 22H) στα οποία έχει εγγραφεί το πρόσηµο του αριθµού (1 για τους αρνητικούς, 0 για τους θετικούς) Ο αριθµός θεωρείται θετικός όταν τα bits 21H και 22H είναι και τα δύο ίσα µε 1 ή όταν τα bits 21H και 22H είναι και τα δύο ίσα µε 0. Αυτή η τακτική φαίνεται κατ αρχήν ότι εισάγει περιττή πολυπλοκότητα αλλά είναι χρήσιµη σε κάποιες άλλες υπορουτίνες που περιγράφονται στη συνέχεια και οι οποίες καλούν και χρησιµοποιούν την παρούσα υπορουτίνα. 5
================================================================== subroutine Mr0 Μετατροπή αριθµού 8 Bits από την µορφή απροσήµαστου (απόλυτη τιµή) στην µορφή προσηµασµένου µε συµπλήρωµα ως προς 2 Είσοδος (input): r0 = απόλυτη τιµή Bits 21H και 22H = Πρόσηµο (Ο αριθµός θεωρείται θετικός όταν τα bits 21H και 22H είναι και τα δύο ίσα µε 1 ή όταν τα bits 21H και 22H είναι και τα δύο ίσα µε 0) Έξοδος (output): r0 = Προσηµασµένος αριθµός στην µορφή συµπληρώµατος ως προς 2 ================================================================== Mr0: jb 21H, Mr0b Ελέγχει το πρόσηµο του αριθµού jb 22H, Mr0a εξετάζοντας τα bits 21H και 22H Ο αριθµός είναι θετικός επειδή bit 21H= bit 22H = 1 και η υπορουτίνα τελειώνει χωρίς καµµία επέµβαση στον αριθµό Mr0b: jnb 22H, Mr0a Ο αριθµός είναι πάλι θετικός επειδή bit 21H= bit 22H = 0 και η υπορουτίνα τελειώνει Mr0a: mov a, r0 Ο αριθµός είναι αρνητικός cpl a Αντιστρέφει τα bits του αριθµού και inc a αυξάνει κατά ένα για να υπολογίσει το συµπλήρωµα ως προς 2 του αριθµού mov r0, a Αποθηκεύει τον αριθµό στην µορφή συµπληρώµατος ως προς 2 Τέλος Mr0r1 ***************************************************************** Η υπορουτίνα αυτή µετατρέπει απροσήµαστους αριθµούς των 16 bits σε προσηµασµένους στην µορφή συµπληρώµατος ως προς 2. Η υπορουτίνα έχει παρόµοια λογική µε την υπορουτίνα Mr0. Χρησιµοποιούνται και πάλι δύο bits για το πρόσηµο (τα bits 21H και 22H) στα οποία έχει εγγραφεί το πρόσηµο του αριθµού (1 για τους αρνητικούς, 0 για τους θετικούς) Ο αριθµός θεωρείται θετικός όταν τα bits 21H και 22H είναι και τα δύο ίσα µε 1 ή όταν τα bits 21H και 22H είναι και τα δύο ίσα µε 0. Όπως και µε την υπορουτίνα Mr0 αυτή η τακτική φαίνεται κατ αρχήν ότι εισάγει περιττή πολυπλοκότητα αλλά είναι χρήσιµη σε κάποιες άλλες υπορουτίνες που περιγράφονται στη συνέχεια και οι οποίες καλούν και χρησιµοποιούν την παρούσα υπορουτίνα. ================================================================== subroutine Mr0r1 Μετατροπή αριθµού 16 Bits από την µορφή απροσήµαστου (απόλυτη τιµή) 6
στην µορφή προσηµασµένου µε συµπλήρωµα ως προς 2 Είσοδος (input): r1, r0 = απόλυτη τιµή απροσήµαστου αριθµού 16 Bits Bits 21H και 22H = Πρόσηµο (Ο αριθµός θεωρείται θετικός όταν τα bits 21H και 22H είναι και τα δύο ίσα µε 1 ή όταν τα bits 21H και 22H είναι και τα δύο ίσα µε 0) Έξοδος (output): r1, r0 = Προσηµασµένος αριθµός 16 Bits στην µορφή συµπληρώµατος ως προς 2 ================================================================== Mr0r1: jb 21H, Mr0r1b Ελέγχει το πρόσηµο του αριθµού jb 22H, Mr0r1a εξετάζοντας τα bits 21H και 22H Ο αριθµός είναι θετικός επειδή bit 21H= bit 22H = 1 και η υπορουτίνα τελειώνει χωρίς καµµία επέµβαση στον αριθµό Mr0r1b: jnb 22H, Mr0r1a Ο αριθµός είναι πάλι θετικός επειδή bit 21H= bit 22H = 0 και η υπορουτίνα τελειώνει Mr0r1a: mov a, r0 Ο αριθµός είναι αρνητικός cpl a Αντιστρέφει τα bits του αριθµού και add a, #01Η αυξάνει κατά ένα για να υπολογίσει mov r0, a το συµπλήρωµα ως προς 2 του αριθµού Η αύξηση γίνεται µε την εντολή add έτσι ώστε να ενηµερωθεί το carry επειδή ακολουθεί παρακάτω η εντολή addc mov a, r1 Εισάγεται στον Α το ανώτερο byte του αριθµού και ακολουθεί η µετατροπή του cpl a στη µορφή συµπληρώµατος ως προς 2 addc a, #00Η mov r1, a Τέλος CONV816 ***************************************************************** Η υπορουτίνα αυτή µετατρέπει προσηµασµένους αριθµούς των 8 bits σε προσηµασµένους αριθµούς των 16 bits στην µορφή συµπληρώµατος ως προς 2. ==================================================================== subroutine CONV816 Μετατροπή προσηµασµένων αριθµών των 8 bits σε προσηµασµένους αριθµούς των 16 bits στην µορφή συµπληρώµατος ως προς 2. Είσοδος (input): r0 = προσηµασµένος αριθµός των 8 bits Έξοδος (output): r1, r0 = Προσηµασµένος αριθµός των 16 Bits στην µορφή συµπληρώµατος ως προς 2 ==================================================================== CONV816: mov A, r0 jnb acc.7, Thetikos 7
Arnitikos: mov r1, #FFH Ο αριθµός είναι αρνητικός. Όλα τα bits στο ανώτερο byte (r1) γίνονται 1 Thetikos: mov r1, #00Η Ο αριθµός είναι θετικός. Όλα τα bits στο ανώτερο byte (r1) γίνονται 0 1.3. Αριθµητικές πράξεις ADD16 ***************************************************************** Η υπορουτίνα αυτή πραγµατοποιεί πρόσθεση δύο προσηµασµένων αριθµών των 16 bits. Στην αρχή της επιλέγεται µια συγκεκριµένη Οµάδα Καταχωρητών. ==================================================================== subroutine ADD16 Πρόσθεση δύο προσηµασµένων αριθµών των 16 bits στην µορφή συµπληρώµατος ως προς 2. Είσοδος (input): r1, r0 = πρώτος προσηµασµένος αριθµός των 16 bits r3, r2 = δεύτερος προσηµασµένος αριθµός των 16 bits Έξοδος (output): r1, r0 = Άθροισµα των δύο αριθµών των 16 Bits (προσηµασµένος αριθµός στην µορφή συµπληρώµατος ως προς 2) Το Carry γίνεται 1 (set) αν το αποτέλεσµα οδηγεί σε υπερχείλιση ==================================================================== ADD16: anl PSW, #0E7H Επιλογή της Οµάδας Καταχωρητών 0 (Register Bank 0) mov a, r0 Πρόσθεση των low bytes των δύο add a, r2 αριθµών mov r0, a Αποθήκευση του low byte του αποτελέσµατος mov a, r1 Πρόσθεση των high bytes των δύο addc a, r3 αριθµών µε το carry mov r1, a Αποθήκευση του high byte του αποτελέσµατος mov C, OV Ενηµέρωση του carry SUB16 ***************************************************************** Η υπορουτίνα αυτή πραγµατοποιεί αφαίρεση δύο προσηµασµένων αριθµών των 16 bits. Στην αρχή της επιλέγεται µια συγκεκριµένη Οµάδα Καταχωρητών. ==================================================================== subroutine SUB16 Αφαίρεση δύο προσηµασµένων αριθµών των 16 bits στην µορφή συµπληρώµατος ως προς 2. 8
Είσοδος (input): r1, r0 = πρώτος προσηµασµένος αριθµός των 16 bits r3, r2 = δεύτερος προσηµασµένος αριθµός των 16 bits Έξοδος (output): r1, r0 = ιαφορά των δύο αριθµών των 16 Bits [(r1,r0)-(r3,r2] (προσηµασµένος αριθµός στην µορφή συµπληρώµατος ως προς 2) Το Carry γίνεται 1 (set) αν το αποτέλεσµα οδηγεί σε υπερχείλιση ==================================================================== SUB16: anl PSW, #0E7H Επιλογή της Οµάδας Καταχωρητών 0 (Register Bank 0) mov a, r0 Εισαγωγή του low byte του 1 ου αριθµού στον acc clr C Το carry γίνεται 0 (clear) ώστε τα low bytes των δύο αριθµών να αφαιρεθούν χωρίς δανειζόµενο (borrow) subb a, r2 Αφαίρεση των low bytes mov r0, a Αποθήκευση του low byte της διαφοράς mov a, r1 subb a, r3 Αφαίρεση των high bytes µε δανειζόµενο (borrow) mov r1, a Αποθήκευση του high byte της διαφοράς mov C, OV Ενηµέρωση του carry UMUL8 ***************************************************************** Η υπορουτίνα αυτή πραγµατοποιεί πολλαπλασιασµό δύο απροσήµαστων αριθµών των 8 bits και παράγει απροσήµαστο γινόµενο των 16 bits. Στην αρχή αποθηκεύεται προσωρινά η τιµή του καταχωρητή Β στην κορυφή της στοίβας (εντολή push b) και στο τέλος η τιµή αυτή επαναφέρεται στον καταχωρητή Β (εντολή pop b) ================================================================== subroutine UMUL8 Πολλαπλασιασµός δύο απροσήµαστων αριθµών των 8 bits και παραγωγή γινοµένου των 16 bits στη µορφή απροσήµαστου αριθµού. Είσοδος: r0 = Πολλαπλασιαστέος (X) r1 = Πολλαπλασιαστής (Y) Έξοδος: r1, r0 = Γινόµενο 16 bits (P = X x Y) ================================================================== UMUL8: push b Προσωρινή αποθήκευση του Β mov a, r0 Είσοδος του Πολλαπλασιαστέου mov b, r1 Είσοδος του Πολλαπλασιαστή mul ab Πολλαπλασιασµός mov r1, b Αποθήκευση του high byte του γινοµένου mov r0, a Αποθήκευση του low byte του γινοµένου pop b Επαναφορά της αποθηκευµένης τιµής του Β 9
MUL8 ***************************************************************** Η υπορουτίνα αυτή πραγµατοποιεί πολλαπλασιασµό δύο προσηµασµένων αριθµών των 8 bits και παράγει προσηµασµένο γινόµενο των 16 bits. Στην αρχή της επιλέγεται µια συγκεκριµένη Οµάδα Καταχωρητών. ================================================================== subroutine MUL8 Πολλαπλασιασµός δύο προσηµασµένων αριθµών των 8 bits και παραγωγή γινοµένου των 16 bits στη µορφή συµπληρώµατος ως προς 2. Είσοδος: r0 = Πολλαπλασιαστέος (X) r1 = Πολλαπλασιαστής (Y) Έξοδος: r1, r0 = Γινόµενο 16 bits (P = X x Y) Καλούµενες υπορουτίνες: UMUL8, Cr0, Cr1, Mr0r1 ================================================================== MUL8: anl PSW, #0E7H Επιλογή της Οµάδας Καταχωρητών 0 Ακολουθεί η κλήση τεσσάρων υπορουτινών που έχουν ήδη περιγραφεί παραπάνω. είτε τις περιγραφές αυτές. acall Cr0 Κλήση υπορουτίνας Cr0 acall Cr1 Κλήση υπορουτίνας Cr1 acall UMUL8 Κλήση υπορουτίνας UMUL8 acall Mr0r1 Κλήση υπορουτίνας Mr0r1 UDIV8 ***************************************************************** Η υπορουτίνα αυτή πραγµατοποιεί διαίρεση δύο απροσήµαστων αριθµών των 8 bits και παράγει απροσήµαστο πηλίκο των 8 bits και απροσήµαστο υπόλοιπο των 8 bits. Στην αρχή αποθηκεύεται προσωρινά η τιµή του καταχωρητή Β στην κορυφή της στοίβας (εντολή push b) και στο τέλος η τιµή αυτή επαναφέρεται στον καταχωρητή Β (εντολή pop b) =============================================================== subroutine UDIV8 ιαίρεση δύο απροσήµαστων αριθµών των 8 bits και παραγωγή πηλίκου των 8 bits και υπολοίπου των 8 bits στη µορφή απροσήµαστων αριθµών. Είσοδος: r0 = ιαιρετέος (X) r1 = ιαιρέτης (Y) Έξοδος: r0 = Πηλίκο (Q = X / Y) r1 = Υπόλοιπο =============================================================== UDIV8: push b Προσωρινή αποθήκευση του Β mov a, r0 Είσοδος του ιαιρετέου 10
mov b, r1 Είσοδος του ιαιρέτη div ab ιαίρεση mov r0, a Αποθήκευση του Πηλίκου mov r1, b Αποθήκευση του Υπολοίπου pop b Επαναφορά της αποθηκευµένης τιµής του Β DIV8 ***************************************************************** Η υπορουτίνα αυτή πραγµατοποιεί διαίρεση δύο προσηµασµένων αριθµών των 8 bits και παράγει προσηµασµένο πηλίκο των 8 bits και προσηµασµένο υπόλοιπο των 8 bits. Στην αρχή της επιλέγεται µια συγκεκριµένη Οµάδα Καταχωρητών. ================================================================== subroutine DIV8 ιαίρεση δύο προσηµασµένων αριθµών των 8 bits και παραγωγή πηλίκου των 8 bits και υπολοίπου των 8 bits στη µορφή συµπληρώµατος ως προς 2. Είσοδος: r0 = ιαιρετέος (X) r1 = ιαιρέτης (Y) Έξοδος: r0 = Πηλίκο (Q = X / Y) r1 = Υπόλοιπο Καλούµενες υπορουτίνες: Cr0, Cr1, Mr0, UDIV8 =============================================================== DIV8: anl PSW, #0E7H Επιλογή της Οµάδας Καταχωρητών 0 Ακολουθεί η κλήση τεσσάρων υπορουτινών που έχουν ήδη περιγραφεί παραπάνω. είτε τις περιγραφές αυτές. acall Cr0 Κλήση υπορουτίνας Cr0 acall Cr1 Κλήση υπορουτίνας Cr1 acall UDIV8 Κλήση υπορουτίνας UDIV8 acall Mr0 Κλήση υπορουτίνας Mr0 11
2. Άλλες Υπορουτίνες Στην ενότητα αυτή παρουσιάζονται υπορουτίνες που εκτελούν διάφορες λειτουργίες αρκετά συνηθισµένες σε εφαρµογές µικρουπολογιστών. DELAY ***************************************************************** Η υπορουτίνα αυτή χρησιµοποιείται για να εισαγάγει µια χρονική καθυστέρηση η οποία ρυθµίζεται από δύο σταθερές που εισάγονται στους dph και dpl. Η καθυστέρηση παράγεται επειδή εκτελούνται δύο βρόχοι όσες φορές ορίζουν οι σταθερές αυτές. Η σταθερά που εισάγεται στον dpl αντιστοιχεί σε λεπτοµερή (µικροµετρική) ρύθµιση επειδή ορίζει πόσες φορές θα εκτελεσθεί ο εσωτερικός βρόχος (LOOP2). Η σταθερά που εισάγεται στον dph αντιστοιχεί σε χονδρική ρύθµιση λεπτοµερή επειδή ορίζει πόσες φορές θα εκτελεσθεί ο εξωτερικός βρόχος (LOOP1). Στην αρχή της υπορουτίνας οι υφιστάµενες τιµές των dph και dpl αποθηκεύονται προσωρινά στην στοίβα. Στο τέλος οι τιµές αυτές επαναφέρονται στους dph και dpl. Η παραγωγή µεταβλητής καθυστέρησης µπορεί να πραγµατοποιηθεί αν αντί των δύο σταθερών χρησιµοποιηθεί για την ρύθµιση της καθυστέρησης το περιεχόµενο δύο θέσεων µνήµης ή δύο καταχωρητών. Σαν άσκηση: Βρείτε την κατάλληλη τροποποίηση του παρακάτω παραδείγµατος ώστε η υπορουτίνα να παράγει µεταβλητή χρονική καθυστέρηση. ================================================================== subroutine DELAY Είσοδος: Οι σταθερές που εισάγονται στους dph και dpl (στο παράδειγµα που ακολουθεί είναι οι #5BΗ και #1CΗ αντίστοιχα) ================================================================== DELAY: push dpl Προσωρινή αποθήκευση των dph και dpl push dph στην στοίβα mov dpl, #1CΗ Είσοδος των παραµέτρων ρύθµισης στους mov dph, #5BΗ dph και dpl mov r1, dph LOOP1: mov r0, dpl Αρχή του εξωτερικού βρόχου LOOP2: nop Αρχή του εσωτερικού βρόχου djnz r0, LOOP2 Τέλος του εσωτερικού βρόχου djnz r1, LOOP1 Τέλος του εξωτερικού βρόχου pop dph Επαναφορά των τιµών των dph και dpl pop dpl από την στοίβα 12
RAMP ********************************************************************* Η υπορουτίνα αυτή παράγει µια περιοδική πριονωτή κυµατοµορφή µε την προυπόθεση ότι στο Port P1 έχει συνδεθεί ένα κύκλωµα µετατροπής από ψηφιακή πληροφορία των 8 bits σε αναλογικό σήµα (πχ ένας D/A converter των 8 bits). Επίσης η παραγωγή της κυµατοµορφής ελέγχεται από ένα διακόπτη δύο θέσεων ο οποίος έχει συνδεθεί στο Pin 0 του Port P3. Όταν ο διακόπτης συνδέει το pin αυτό στα +5Volts (τροφοδοσία) η κυµατοµορφή παράγεται κανονικά. Όταν ο διακόπτης αλλάξει θέση ώστε να συνδέει το pin στα 0 Volts (γείωση) η παραγωγή της κυµατοµορφής σταµατά. Η πριονωτή κυµατοµορφή παράγεται χρησιµοποιώντας το υπόλοιπο µιας ακέραιας διαίρεσης ενός αριθµού ο οποίος αυξάνεται κατά ένα σε κάθε επανάληψη (διαίρεση Modulo N). Το πλεονέκτηµα της τακτικής αυτής είναι ότι : ρυθµίζοντας τον διαιρέτη, δηλαδή την παράµετρο Ν, µπορούµε να καθορίσουµε το πόσα δείγµατα θα έχει σε κάθε κύκλο της η περιοδική πριονωτή : κυµατοµορφή. Η παράµετρος αυτή στο παρακάτω παράδειγµα εισάγεται στον καταχωρητή r3. Ο καταχωρητής r2 έχει τον ρόλο του διαιρετέου και αυξάνεται κατά ένα σε κάθε κύκλο έτσι ώστε να παραχθεί το επόµενο δείγµα της πριονωτής κυµατοµορφής. ====================================================================== subroutine RAMP Παραγωγή περιοδικής πριονωτής κυµατοµορφής µε την µέθοδο διαίρεσης Modulo N, µε ρυθµιζόµενο αριθµό δειγµάτων σε κάθε κύκλο της κυµατοµορφής και ελεγχόµενη από διακόπτη δύο θέσεων. Είσοδος: r3 = Η παράµετρος Ν (αριθµός δειγµάτων σε κάθε κύκλο της κυµατοµορφής) bit P3.0 = Η θέση του διακόπτη στο Pin 0 του Port P3 ====================================================================== RAMP: setb PSW.4 Επιλογή Οµάδας Καταχωρητών clr PSW.3 WAIT: mov r2, #000h Μηδενισµός του ιαιρετέου mov r3, #0AΑh Ορισµός της παραµέτρου Ν ( ιαιρέτης) Στο συγκεκριµένο παράδειγµα Ν= ΑΑ Hex mov C, P3.0 Έλεγχος της θέσης του διακόπτη Αν το pin P3.0 είναι 1 η υπορουτίνα προχωρά στην παραγωγή της κυµατοµορφής jnc WAIT διαφορετικά αναµένει (βρόχος WAIT) STEP: inc r2 Αύξηση κατά ένα του ιαιρετέου για τον mov A, r2 υπολογισµό του επόµενου δείγµατος mov B, r3 Μεταφορά του Ν στον καταχωρητή Β div AB ιαίρεση Modulo Ν mov P1, B Μεταφορά του υπολοίπου της διαίρεσης Modulo Ν στο Port P1 όπου θα µετατραπεί σε αναλογική τάση και θα είναι ένα δείγµα της κυµατοµορφής STOP: mov C, P3.0 Έλεγχος της θέσης του διακόπτη jnc WAIT Αν το pin P3.0 είναι 0 η υπορουτίνα σταµατά την παραγωγή της κυµατοµορφής και µπαίνει σε αναµονή (βρόχος WAIT) διαφορετικά προχωρά στην παραγωγή του jmp STEP επόµενου δείγµατος αναµένει (βρόχος STEP) 13
ROTATELIGHTS ********************************************************************* Η υπορουτίνα αυτή δηµιουργεί ένα φωτιστικό εφφέ που δίνει την εντύπωση ότι ένα συγκεκριµένο πρότυπο «αναµµένο φως-σβηστό φως» µετακινείται, περιστρέφεται και ανακυκλώνεται σε µια σειρά από 8 LEDs. Λειτουργεί µε την προυπόθεση ότι στα pins του Port P1 έχουν συνδεθεί 8 LEDs Επίσης η λειτουργία του εφφέ ελέγχεται από ένα διακόπτη δύο θέσεων ο οποίος έχει συνδεθεί στο Pin 0 του Port P3. Όταν ο διακόπτης συνδέει το pin αυτό στα +5Volts (τροφοδοσία) η κυµατοµορφή παράγεται κανονικά. Όταν ο διακόπτης αλλάξει θέση ώστε να συνδέει το pin στα 0 Volts (γείωση) η παραγωγή της κυµατοµορφής σταµατά. Το πρότυπο «αναµµένο φως-σβηστό φως» δηµιουργείται γράφοντας στον καταχωρητή r2 την κατάλληλη σταθερά έτσι ώστε τα bits της σταθεράς αυτής να αντιστοιχούν στα αναµµένα και σβηστά LEDs. Ανάλογα µε τον τρόπο σύνδεσης των LEDs στα pins του Port P1 η λογική αναµµένο-σβηστό να είναι αναστρέφουσα (µε έξοδο 1 στο pin το αντίστοιχο LED να είναι σβηστό) ή µη-αναστρέφουσα (µε έξοδο 1 στο pin το αντίστοιχο LED να είναι αναµµένο). Στο παράδειγµα που ακολουθεί θεωρούµε ότι έχουµε µη-αναστρέφουσα λογική και ότι το πρότυπο «αναµµένο φως [Α]-σβηστό φως [Σ]» είναι το εξής: [Σ][Α][Σ][Σ] [Σ][Α][Α][Α] Για τον λόγο αυτό η κατάλληλη σταθερά που θα µπει στον καταχωρητή r2 θα αποτελείται από τα εξής bits: 0100 0111 δηλαδή θα είναι η 47Hex. ====================================================================== subroutine ROTATELIGHTS Παραγωγή φωτιστικού εφφέ που δίνει την εντύπωση ότι ένα συγκεκριµένο πρότυπο «αναµµένο φως-σβηστό φως» µετακινείται, περιστρέφεται και ανακυκλώνεται σε µια σειρά από 8 LEDs µε λειτουργία ελεγχόµενη από διακόπτη δύο θέσεων. Είσοδος: r2 = Η κατάλληλη σταθερά που δηµιουργεί το επιθυµητό πρότυπο «αναµµένο φως-σβηστό φως» bit P3.0 = Η θέση του διακόπτη στο Pin 0 του Port P3 ====================================================================== ROTATELIGHTS: setb PSW.4 clr PSW.3 mov r2, #047h Επιλογή Οµάδας Καταχωρητών Εισαγωγή της σταθεράς που ελέγχει το πρότυπο«αναµµένο φως-σβηστό φως» WAIT: mov C, P3.0 Έλεγχος της θέσης του διακόπτη. ( είτε jnc WAIT περισσότερες εξηγήσεις στην προηγούµενη υπορουτίνα) mov A, r2 LOOP: mov P1, A Έξοδος του προτύπου στο Port P1 mov r0, #0FFh Ρύθµιση των r0 και r1 οι οποίοι καθορίζουν mov r1, #0DDh την χρονική καθυστέρηση που θα εισάγει η υπορουτίνα DELAY που ακολουθεί. acall DELAY Κλήση της υπορουτίνας DELAY (δείτε την παραπάνω) για να παρεµβάλεται κάποιος αντιληπτός χρόνος µεταξύ των µετατοπίσεων rr Μετατόπιση του προτύπου δεξιά για τoν επόµενο κύκλο STOP: mov C, P3.0 Έλεγχος της θέσης του διακόπτη. ( είτε jnc WAIT περισσότερες εξηγήσεις στην προηγούµενη jmp LOOP υπορουτίνα) 14