4) Vector graphics
@FG Brain: Καταρχήν με πρόλαβες με το SOTB (ανεβάζω το video), ναι πρέπει να ήταν 14 και όχι 9 όπως γράφω. Ενδιαφέρον και το κολπάκι για mode0 byte scrolling, θα ξαναδώ το CRTC sheet για να δω τι παίζει με αυτούς τους registers.
Η όλη συζήτηση που κάνω δεν είναι φυσικά για να μελετήσω ποιός είναι ο καλύτερος υπολογιστής αλλά επειδή με ενδιαφέρει τεχνικά αλλά και για να διδαχθούν και οι υπόλοιποι (αν και τα μεγάλα μου κείμενα μάλλον θα κουράζουν).
C64 και vector graphics.
Είναι ενδιαφέρον ότι η σύγκρηση με τα MHz είναι άκυρη αλλά και για διαφορετικούς αλγορίθμους παίζουν άλλα πράγματα.
Καταρχήν ο Z80 στα 4Mhz δεν είναι τέσσερις φορές πιο γρήγορος από τον 6502/6510 στο 1Mhz. Αυτό εξαρτάται και από τους κύκλους μηχανής που πιάνουν αντίστοιχες εντολές στους δύο επεξεργαστές και από τις διαφορές και δυνατότητες των εντολών και καταχωρητών κάθε επεξεργαστή.
Ας πούμε η πιο συνηθισμένη εντολή για να γράφεις ένα byte στη μνήμη μπορεί να είναι η LD (HL),A στον Amstrad(Z80) που πιάνει 2 nop cycles δηλαδή 8 κύκλους μηχανής. Στον C64(6502) όλα γίνονται με direct memory addressing π.χ. STA $D020 και πιάνει 4 κύκλους μηχανής.
Αυτό στον Amstrad θα ήταν:
LD HL,&hD020
LD (HL),A
αλλά ας υποθέσουμε ότι το HL είναι φορτωμένο από πριν με τη διεύθυνση και ας συγκρίνουμε μόνο το γράψιμο στη μνήμη. Τότε ο C64 θα έτρωγε και πάλι τους μισούς κύκλους μηχανής. Twice fast at the same Mhz!
Η αντίστοιχη direct memory addresing εντολή του Amstrad είναι:
LD (&hD020),A
και τρώει 4 nop cycles (θα εξηγήσω αυτό το nop cycles μετά) δηλαδή 16 machine cycles. 4 φορές περισσότερο από την αντίστοιχη.
Ο C64 έχει και το
STA $address, X ή STA $address, Y
όπου X και Y δύο 8bit registers
δηλαδή κάτι σαν pointers, π.χ. to STA $4000, X θα γράψει στην διεύθυνση ($4000 + Χ)
και μπορείς στη συνέχεια να κάνεις INX για να αυξήσεις το X οπότε να πας στην επόμενη διεύθυνση.
Μόνο έναν κύκλο παραπάνω (5)
Του Amstrad το αντίστοιχο είναι
LD (IX+dd),Α
πολύ διαφορετικό βέβαια, γιατί τώρα ο IX είναι ο 16bit register και το νούμερο dd είναι 8bit τιμή, ανάποδο από την C64 version και πιάνει και 5 NOP cycles (20 machine cycles, 4 φορές πιο αργό και πάλι)
Αλλά θα μου πεις, για αυτό στα optimized software demo effects θα προτιμήσω να χωρέσω τις βασικές διευθύνσεις στους HL, DE, BC και να χρησιμοποιώ μόνο την πρώτη μορφή για να γράφω ή να διαβάζω από/στη μνήμη. Και όταν θέλω να πάω γειτονικά στα επόμενα values/pixels/whatever θα κάνώ ένα INC L ας πούμε ή INC H για vertical αν έχω θέσει έτσι αντίστοιχα τα data μου.
Πολλά όμως effects βολεύουν να βλέπεις σε μακριές αποστάσεις στη μνήμη. Και με τα γρήγορα opcodes για direct memory addresing του C64 και 1 κύκλο παραπάνω για τον X,Y pointer μόνο πραγματικά πολλά effects στον C64 είναι μεγάλα unrolled codes (ξετιλυγμένοι κώδικες όπου έχουν αφερεθεί τα loops και βρίσκεται μόνο η ουσία μέσα
), από ακολουθίες LDA, STA, LDA, STA, LDA , STA, STA, STA, κλπ. όπου στον Amstrad τα αντίστοιχα εφέ ή θα τα έκανες με τους αργούς, ή θα προτιμούταν για ταχύτητα να έχεις τις διευθύνσεις στου 16βιτ registers και απλά θα χανόταν αυτό το απευθείεας.
Έχω και πρακτικά και θεωρητικά (σε χαρτί) σκεφτεί διάφορα software effects πως θα μπορούσα να τα κάνω γρήγορα σε Amstrad και σε C64 και βάλε και την μισή videoram (8kb έναντι 16kb) και πραγματικά σε πολλά εφέ το 1Mhz του C64 φτάνει τα 4Mhz του Amstrad, και σε πολλά μου βγαίνουν ελαφρώς πιο αργά ή πιο γρήγορα, δηλαδή κοντράρονται!
Απίστευτο.
Και όσο αφορά τα vector graphics, για να δείτε την diversity, το πόσο δεν μετράνε τα MHz και πόσο κερδίζει εδώ ο Amstrad,.
..δυστυχώς τα demos του C64 δείχνουν πιο γρήγορα 3d vectors από τον Amstrad αλλά αυτό γιατί δεν έχει ασχοληθεί ο κόσμος στον Amstrad. Το μόνο realtime vector demo με flat polygons ας πούμε ήταν του Face Hugger του 1992 και από εκεί και πέρα ο κόσμος έκανε hardware scrollers. Και στον C64 έχω δει ακόμα και gouraud shading 3d objects με καλύτερη ταχύτητα και ποιότητα από τα flat polygons του Face Hugger Ultimate megademo.
Αλλά πιστεύω ότι μπορεί να βγάλει πιο γρήγορα (και πιο όμορφα λόγο χρωμάτων) 3d ο Amstrad λόγο opcodes και registers και πάλι.
Πολύ απλά, βασικά στοιχεία στα 3d είναι fixed point arithmetic (για μηχανήματα που δεν έχουν FPU) και interpolation, πολύ interpolation.
Καθόμουν και σκεφτόμουν μερικά πράγματα και πως θα γίνουν στον Amstrad. Οι 16bit registers είναι σωτηρία. 8-8 fixed point. Έχεις τον 16bit register HL ας πούμε που χωρίζεται στον H και τον L τους 8bitους registers. Μπορείς να παραστήσεις με τον H το ακέραιο μέρος και με τον L τον δεκαδικό χωρίς αυτό να φαίνεται. Με το ADD HL,DE που πιάνει 2 nop cycles μόνο, αν έχεις στο DE έναν άλλον αριθμό σε 8-8 fixed point μορφή (που μπορούν να προυπολογιστούν πριν το actual effect ή μόνο μια φορά per frame) μπορείς να κάνεις βήμα προς βήμα interpolation και μετά έχεις απευθείεας τον H το ακέραιο κομμάτι (δεν σε ενδιαφέρει στο τέλος το δεκαδικό) για γράψιμο του pixel color ή οτιδήποτε γίνεται κάνεις interpolate στην πορεία.
Δεν έχω κάτσει να το κάνω στην πράξη. Αλλά είναι πολύ straight forward. Σε ένα Spectrum demo, στο τελικό scroller κοτσάρανε οι coders το inner loop της texture mapping routine και χρησιμοποιούσε ακριβώς αυτά σαν θεωρία στην προηγούμενη παράγραφο.
Είναι straightforward. Στον 6502 του C64 αυτό θα έπρεπε να το κάνεις simulation με 2 8bit τιμές στη μνήμη που θα κάναν το 16bit register, additions, carry checks, πολύ παραπάνω δουλειά. Από περιέργια και θεωρητικά κάθησα και σκέφτικα αντίστοιχα γρήγορες ρουτίνες interpolation optimized για 6502 και πάλι σε αυτό ο Z80 των 4Mhz είναι 3 φορές πιο γρήγορος από τον 6502 των 1Mhz.
Και από τη στιγμή που τα 3d είναι τίγκα στα fixed point και interpolations, φαντάζεσεστε πόσο εποφελείται σε αυτά τα εφφέ με τους αντίστοιχους optimized κώδικες όμως ο CPC και ο Spectrum. Αλλά όχι λόγο Mhz!!!
Και δείτε πόσο diversity υπάρχει, πόσο δεν μετράνε τα mHz αλλά πόσο κάποιοι registers, addressing modes, διαφορετικά opcodes και αρχιτεκτονικές θα ευνοήσουν άλλους αλγορίθμους. Βάλε και τα video modes και hardware tricks. (Π.χ. στην Amiga είναι άβολα τα per pixel bitmap effects και πολύ γρήγορα τα flat polygons λόγο bitplanes). Το ενδιαφέρον για μένα αυτό είναι, πόσο μπορεί κανείς να τα μελετήσει, να γράψει κώδικα για τα δύο αντίστοιχα μηχανήματα και να δει τι είναι αυτό που κάνει τη διαφορά και όχι πάντα στους ίδιους αλγορίθμους..
..ίσως είναι incomprehensible αλλά με έπιασε και πάλι.
In a nutsheel. O C64 γ***ει σε πολλά effects (ακόμα και per pixel bitmap effects), στο 1/4 των Mhz λόγο 6510, αλλά ο CPC και ο Spectrum μπορούν να είναι καλύτεροι σε 3D λόγω Z80 και 16bit registers και σχετικά γρήγορο 16bit addition.
------------------
Btw,. περί nop timing.
1 NOP (no operation, δεν κάνει τίποτα, η εντολή που πιάνει συνήθως τα λιγότερα machine cycles) πιάνει 4 machine cycles στον Amstrad.
Γιατί στον Amstrad μετράμε και τις άλλες εντολές σαν πολλαπλάσια των κύκλων μηχανής της NOP εντολής;
Καταρχήν π.χ. η LD (HL),A πιάνει 2 NOP cycles δηλαδή 8 machince cycles στον Amstrad. Αλλά στον Spectrum πιάνει λιγότερο παρόλο που έχει τον ίδιο Z80. Νομίζω 7 ή 6.
Για κάποιο λόγο το hardware στον Amstrad στρογγυλοποιεί τους κύκλους μηχανής στα 4 cycles, δηλαδή 4,8,12,16, κλπ.. πετιούνται τζάμπα δηλαδή κανά δύο cycles. Έχει να κάνει σχέση με το συγχρονισμό του επεξεργαστή με το hardware.
From wiki:
(All CPC models were based on a Zilog Z80 processor clocked at 4MHz. Because a common pool of RAM is shared with the video circuits, the Z80 may only make a memory accesses every four cycles - which has the effect of rounding all instruction cycle lengths up to the next multiple of four. The speed is therefore roughly equivalent to a 3.3MHz machine.)
Έτσι γιατί να λέμε 4,8,12,16 cycles και αφού όλα είναι πολλαπλάσια του 4 να μην λέμε 1,2,3,4 NOP cycles (που πιάνει 4 machine cycles)
Καταλαβαίνετε και το impact. O CPC με τον Z80 στα 4Mhz δεν είναι λίγο πιο γρήγορος από τον Spectrum με τον Z80 στα 3.5Mhz, ίσα ίσα πάνω κάτω το ίδιο (το 3.3Mhz που λέει το wiki είναι estimation. Μπορεί ένας κώδικας να χρησιμοποιεί opcodes που τυχαίνει ο πραγματικός αριθμός cycles να είναι και αντίστοιχο πολλαπλάσιο του 4 οπότε ουσιαστικά να μην πετιέται τίποτα)
Πολύ ανάλυση. Θα σταματήσω εδώ..
Πάρτε και το video του