ZX Spectrum, Μαθηματικά πέρα από το manual


Στον ΖΧ υπάρχουν έτοιμες συναρτήσεις, τις οποίες μπορείτε να τις βρείτε σ' οποιοδήποτε manual, δεν υπάρχουν όμως όλες οι ρίζες (εκτός της τετραγωνικής), σ' αυτό θα επιστρατεύσουμε την Αλγεβρα....  

Αν θέλω τη ν-οστή ρίζα του x, χρησιμοποιώ τον τελεστή ύψωσης σε δύναμη μ' εκθέτη το (1/ν), π.χ.:


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

1. ^
2. * /
3. + -

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


Στον ΖΧ, καθορίζετε μια συνάρτηση με την τοποθέτηση της DEF δήλωσης κάπου στο πρόγραμμα. Παραδείγματος χάριν, ο καθορισμός μιας λειτουργίας FN της οποίας το αποτέλεσμα είναι το τετράγωνο ενός αριθμού...

DEF FN s(x)=x*x

Το s μετά από την DEF FN είναι το όνομα της function. Το x μέσα στις παρενθέσεις είναι ένα όνομα το οποίο αναφέρετε στο argument (ή παράμετρος) της function. Μπορείτε να χρησιμοποιήσετε ένα γράμμα γι' αυτό (ή, αν το argument είναι λέξη, ένα γράμμα με δίπλα το $).

Μετά το σύμβολο = ακολουθεί ο πραγματικός καθορισμός της function. Αυτό μπορεί να είναι οποιαδήποτε έκφραση και μπορεί επίσης να αναφερθεί το argument χρησιμοποιώντας το όνομα που έχετε δώσει (σε αυτό το παράδειγμα το x) σαν να ήταν μια συνηθισμένη μεταβλητή.

Όταν εισαγάγετε μια τέτοια γραμμή, μπορείτε να καλέσετε την function ακριβώς όπως τις ενσωματωμένες του ΖΧ functions, με τη δακτυλογράφηση του ονόματός της, FN s, ακολουθούμενο από το argument. Θυμηθείτε ότι όταν καθορίζετε μια λειτουργία οι ίδιοι, το argument πρέπει να εσωκλείεται εντός παρενθέσεων. Δοκιμάστε...

PRINT FN s(2)
PRINT FN s(3+4)
PRINT 1+ INT FN s ( LEN "chicken"/2+3)

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

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 του μηχανήματος και την αρχιτεκτονική του.

ZX_Jim Greece

e-mail: dcotsos2015@gmail.com