Bubble sort, μέθοδος ταξινόμησης

Πολλές φορές στα προγράμματά μας, έχουμε δεδομένα σε πίνακα και θέλουμε να τα ταξινομήσουμε (π.χ. περιέχουν ονόματα που τα θέλουμε με σειρά αλφαβητική). Ο παρακάτω κώδικας είναι ο ποιο απλός και ονομάζεται "ταξινόμηση της φυσαλίδας". Η δομή που χρησιμοποιώ παρακάτω, είναι "μη δομημένου"  προγραμματισμού, για να ταιριάζει σ' όλες τις εκδόσεις Basic των 8bit υπολογιστών μας.

100 LET swap=0
110 FOR i=2 TO
length(A)
120 IF A[i-1] A[i] THEN 
    LET temp=A[i-1]: 
    LET A[i-1]=A[i]:
    LET A[i]=TEMP: 
    LET swap=1
130 NEXT i
140 IF swap = 1 THEN GOTO 100

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

ZX81 HiRes, UDG's

Εφ' όσον έχουμε εξοπλίσει τον ZX81 μας με τη δυνατότητα γραφικών (που έχω αναλυτικά εδώ), μπορούμε να έχουμε μικρούς γραφικούς χαρακτήρες, ή και τα Ελληνικά γράμματα!

Η διαδικασία είναι εύκολη αν έχουμε φορτώσει το HRG-16K (ή το HRG-64K ανάλογα το είδος της μνήμης που έχουμε τροποποιήσει), γράφοντας τις παρακάτω γραμμές:

10 LET HRG=32736
20 PRINT USR HRG, ON
30 PRINT USR HRG, UDGNEW
40 PRINT USR HRG, UDGSET, CODE "A", 24, 24, 16, 126, 24, 60, 36, 102

Μετά την εκτέλεση των παραπάνω εντολών, στη θέση του Α θα εμφανίζεται το "ανθρωπάκι" του παραδείγματος, που βρίσκεται εδώ.

ZX Spectrum 128K+3, Printer port


Ως γνωστό στους κατόχους του, ο plus 3 έχει επιπλέον και μια έξοδο παράλληλου εκτυπωτή. Σ' αυτή την έξοδο μπορούμε να συνδέσουμε οποιοδήποτε παράλληλο εκτυπωτή για σύγχρονο PC, αρκεί να έχουμε φτιάξει το παρακάτω καλώδιο.
Ο plus 3 έχει σαν προεπιλογή από τη rom του τη παράλληλη έξοδο, οπότε δε χρειάζεται να κάνουμε τίποτ' άλλο, δουλεύουν κανονικά οι εντολές LLIST και LPRINT.

Χρειαζόμαστε ένα εσωτερικό καλώδιο σύνδεσης για disk drive 5.25" (34pin) και ένα 25pin d-Sub. H αρίθμηση είναι από την πλευρά που φαίνονται εξωτερικά! 


Πρέπει με ξυράφι ν' αφαιρέσουμε την ασφάλεια στο καλώδιο του drive, γιατί η παράλληλη του Spectrum, έχει το "κενό" ασφαλείας μεταξύ 4ου και 5ου pin.


Στη δική μου κατασκευή, έφτιαξα από την αρχή και τις δύο "επαφές".

TIP
Επειδή και ο Amstrad CPC έχει (όμοια) θύρα παράλληλου εκτυπωτή, μπορεί να μη ταιριάζει το pinout (επειδή στέλνει 7bit χαρακτήρες), με τη παραπάνω συνδεσμολογία όμως, μπορούμε να συνδέσουμε και εκεί τον εκτυπωτή μας! Στην ουσία, συνδέουμε με την γείωση το 8ο bit, ώστε να μπορεί να δουλέψει ο εκτυπωτής!

MSX, UDG's

Οι MSX υποστηρίζουν UDG's σε Screen 1 mode. Για να βρούμε την διεύθυνση του πρώτου byte του χαρακτήρα που θέλουμε ν' αλλάξουμε, χρησιμοποιούμε τη παράσταση BASE(7)+ASC(a$)*8, όπου α$ είναι ο χαρακτήρας μας.

Αφού επιλέξουμε ένα χαρακτήρα κι' έχουμε βρει τα bytes που του αντιστοιχούν (το πως περιγράφεται στην σελίδα Βοηθήματα στο θέμα Σχεδιασμός UDG's), γράφουμε τον παρακάτω κώδικα:

10 SCREEN 1
20 AD=BASE(7)+ASC(a$)*8
30 FOR J=0 TO 7
40 READ R:VPOKE AD+J,R
50 NEXT J
60 DATA 24,24,16,126,24,60,36,102

Οπου a$, ο χαρακτήρας που θέλουμε ν' αντικαταστήσουμε με το "ανθρωπάκι" του παραδείγματος. Δεν μπορούν ν' αντικατασταθούν όλοι οι γραφικοί χαρακτήρες του msx, πρέπει λοιπόν να κάνουμε δοκιμές! Προτείνω τους χαρακτήρες που εμφανίζονται με ταυτόχρονο πάτημα του πλήκτρου "GRPH".

ZX Spectrum 48K/128K, UDG's

Η Sinclair Basic του ZX, υποστηρίζει UDG's στους χαρακτήρες A έως S σε Graph Mode (δηλαδή επιλέγοντας πριν το graph mode "G"), με συνολικά 19 χαρακτήρες.

Η USR είναι μια συνάρτηση που μετατρέπει ένα γράμμα-μεταβλητή (string argument) στη διεύθυνση του πρώτου byte στη μνήμη, για την αντιστοιχία του user defined graphic. Το string argument πρέπει να είναι ένα γράμμα από το A έως το S. Η POKE εντολή εγκαθιστά έναν αριθμό σε μια θέση μνήμης, παρακάμπτοντας τους μηχανισμούς που χρησιμοποιούνται κανονικά από την BASIC.

Αφού επιλέξουμε ένα χαρακτήρα απ' αυτούς κι' έχουμε βρει τα bytes που του αντιστοιχούν (το πως περιγράφεται στην σελίδα Βοηθήματα στο θέμα Σχεδιασμός UDG's), γράφουμε τον παρακάτω κώδικα:

10 FOR n=0 TO 7
20 READ r : POKE USR "Α"+n, r
30 NEXT n
40 DATA 24,24,16,126,24,60,36,102


Αφού το "τρέξουμε"....

Αυτός ο χαρακτήρας θα εμφανίζεται με το  πάτημα GRAPH+A.

Σχεδιασμός UDG's

User Defined Graphics, σημαίνει ορισμένα από τον χρήστη γραφικά. Είναι χρήσιμα στο να εισάγουμε στα προγράμματά μας ειδικούς χαρακτήρες (όπως τα Ελληνικά γράμματα που λείπουν από το Λατινικό πληκτρολόγιο), ή να σχεδιάσουμε γραφικά για "απλά" παιχνίδια.

Κάθε χαρακτήρας αποτελείται από μια ομάδα 8x8 pixel's, πρέπει να σχεδιάσουμε σ' ένα τέτοιο πίνακα τον χαρακτήρα που θέλουμε, και μετά να βρούμε τον ακέραιο αριθμό που αντιστοιχεί σε κάθε γραμμή του (όπως φαίνεται στο παρακάτω σχεδιάγραμμα).



Κάθε pixel στην γραμμή του, αντιστοιχεί σε μια δύναμη του 2, π.χ. το πρώτο είναι 2^7, το δεύτερο 2^6 μέχρι το όγδοο που είναι 2^0=1. Πρέπει να προσθέσουμε τους ακέραιους αυτούς όπως φαίνεται στο παραπάνω παράδειγμα και το σύνολο των 8 αυτών ακεραίων που προκύπτουν, αποτελεί τα DATA του χαρακτήρα μας.

Αυτοί οι οκτώ αριθμοί αποθηκεύονται σε οκτώ θέσεις (bytes) στην RAM που αντιστοιχούν στον χαρακτήρα. Κάθε μια από αυτές τις θέσεις έχει μια διεύθυνση. Το πως "περνάμε" αυτά τα δεδομένα στο μηχάνημά μας, εξαρτάται από την Basic του μηχανήματος και την αρχιτεκτονική του.