Ο καταχωρητής πλάτους vsync είναι γενικά ρυθμισμένος στο 8 και διαβάζεται ως 2 line-char.
Η ρύθμιση στο 2 στα παιχνίδια τα κάνει να τρέχουν καλά, αλλά όχι με demo. Στην πραγματικότητα, στον CRTC0 διαβάζουμε το VSYNC βήμα προς βήμα (Vcc), όχι ανά line-char.
Με τον CRTC0 μπορείς να ορίσεις ένα VSYNC βάσει του καταχωρητή.
Προσπαθώ να υλοποιήσω τον CRTC0 στο FPGAmstrad.
Αλλά δεν ξέρω ποιο demo είναι CRTC1 ή CRTC0
Πρέπει να ξέρω ποιο demo είναι καθαρό CRTC0.
Για παράδειγμα, το Logon’s run δεν εμφανίζει το 3D gameboy στον CRTC0 μου, είναι αυτό το κομμάτι του demo μόνο για CRTC1;
Το Wake Up περνάει μεν την «ανίχνευση CRTC0», αλλά δεν τρέχει σε κανονική ταχύτητα.
Αυτή η ερώτηση είναι λίγο μπερδεμένη στην ανάγνωση.
Τι σημαίνει «read as 2 line-char»; Αν R3=#8x, τότε το CRTC θα δημιουργήσει ένα VSYNC 8 scanlines. Το Gate Array θα το χρησιμοποιήσει αυτό για να δημιουργήσει ένα σύνθετο σήμα συγχρονισμού (composite sync signal) 4 scanlines.
Τι σημαίνει «Setting 2»; Πρόκειται για τη ρύθμιση R3=#2x; Σε αυτήν την περίπτωση, το CRTC θα δημιουργήσει μόνο 2 scanlines με VSYNC. Δεν είμαι σίγουρος αν αυτό είναι αρκετό ώστε το Gate Array να δημιουργήσει το composite σήμα. Και ακόμα κι αν είναι, δεν είμαι βέβαιος αν το composite σήμα είναι αρκετά μεγάλο σε διάρκεια ώστε η οθόνη να μπορέσει να συγχρονιστεί με αυτό.
Τι είναι ένα CRTC0 demo, τι ένα CRTC1 demo; Ένα demo μπορεί να τρέχει και στα δύο CRTC ή μόνο σε ένα από αυτά, ανάλογα με μια ειδική χρήση ορισμένων καταχωρητών (registers). Αυτός δεν χρειάζεται να είναι απαραίτητα ο καταχωρητής R3, μπορεί κάλλιστα να είναι κάποιος άλλος.
Για αναλυτικές πληροφορίες, προτείνω το «Amstrad CPC CRTC Compendium» (AC3) από τον @Longshot της Logon System. Βρίσκεται στο https://shaker.logonsystem.eu/ .
Δεν μπορώ να πω πολλά για άλλα demos, αλλά έγραψα ο ίδιος ένα μικρό pre-demo (προς το παρόν χωρίς μουσική και χωρίς scroll text) το οποίο εκτελεί ορισμένες δοκιμές για να εντοπίσει τον τύπο του CRTC και στη συνέχεια χρησιμοποιεί τον καταχωρητή R0 για την επιλογή scanline. Δείτε στο https://codeberg.org/lightforce6128/cpc-circles#circles .
Πιο συγκεκριμένα, στο ACCC μπορείτε να συμβουλευτείτε το κεφάλαιο 14.1 για τη ρύθμιση της διάρκειας των σημάτων HSYNC (και VSYNC στα CRTC 0, 3, 4) και το κεφάλαιο 17.1 ειδικότερα για το VSYNC.
Για την αποφυγή προβλημάτων συμβατότητας, συνιστάται να ορίσετε το R3=#0x, έτσι ώστε το VSYNC στα 0, 3, 4 να έχει 16 γραμμές, όπως και στα CRTC 1 και 2. Το GATE ARRAY παράγει ένα σύνθετο σήμα το πολύ 4 γραμμών μεταξύ της 3ης και της 6ης γραμμής (ως γραμμή, εννοώ το σήμα HSYNC) μετά το σήμα VSYNC του CRTC. Ωστόσο, είναι χρήσιμο να προγραμματίσετε περισσότερες από 6 γραμμές (και επομένως 16 για λόγους ομοιομορφίας), ώστε να διατηρείται η κατάσταση του σήματος VSYNC την οποία μπορεί να διαβάσει ο Z80A από το PPI.
Δεν είστε σαφής ως προς το περιβάλλον που χρησιμοποιήσατε για να τρέξετε τα demos που αναφέρατε. Αν μιλάτε για πραγματικούς CPC (και όχι για κάποιο FPGA, όπου αναφέρατε τη μείωση του VSYNC σε 2 γραμμές), τότε είναι μάλλον παράξενο, καθώς το «Logon’s run» λειτουργεί σε όλα τα CRTC. Αν αναφερόσασταν στο FPGA ή σε κάποια παράκαμψη που μείωσε το VSYNC σε 2 (όπως είναι εφικτό στο CRTC 0), τότε απλώς δεν υπήρχε κανένας λόγος να γίνει κάτι τέτοιο.
if R3Vwidth/=x"8" and etat_vsync=DO_VSYNC then
etat_vsync:=DO_NOTHING;
crtc0_state:=STATE_R3VWIDTH_3; – είναι παγίδα
end if;
Το Logon’s run πιάστηκε στην παγίδα: κάνει R3Width=0
Το Bruce lee δεν πιάστηκε.
Το Arkanoid δεν πιάστηκε
Το bug του Buggy boy δεν πιάστηκε, άρα δεν σχετίζεται με το R3Vwidth
Όταν το R3Width είναι στο 0, τι κάνει; μια γραμμή ή τίποτα; Αν είναι γραμμή, σημαίνει ότι το 1 δεν κάνει άλλη γραμμή;
Θα πρέπει πραγματικά να συμβουλευτείς το κεφάλαιο 14.1 του ACCC, όπως ανέφερα νωρίτερα.
Εάν ορίσεις το πιο σημαντικό nibble (most significant nibble) του R3 σε 1, τότε τα CRTC 0, 3 και 4 παράγουν μία γραμμή VSYNC.
Εάν ορίσεις αυτό το nibble σε 0, τότε αυτά τα CRTC παράγουν 16 γραμμές (και όχι 0), ώστε να παραμείνουν συμβατά με μοντέλα που δεν διαθέτουν αυτήν τη δυνατότητα (όπως τα CRTC 1 και 2, τα οποία παράγουν πάντα 16 γραμμές επειδή τα bit σε αυτό το nibble είναι ανενεργά).