[Main] [Docs] [Installs] [Search] [Team] [Guestbook] [Links]

Σχηματική ροή εκτέλεσης

Ο ακόλουθος πίνακας δείχνει την ροή προγράμματος όταν θα εκτελεστεί μια εγκατάσταση του WHDLoad. Ελπίζω να σας βοηθήσει να καταλάβετε πως δουλεύει το WHDLoad και πως το WHDLoad, το Slave και το εγκατεστημένο πρόγραμμα συνεργάζονται.

Ο ΧΡΗΣΤΗΣ
  • ξεκινάει το demo ή παιχνίδι κάνοντας κλικ στο εικονίδιο ή ξεκινώντας το WHDLoad από τη γραμμή εντολών
Το Λειτουργικό Σύστημα
  • φορτώνει το εκτελέσιμο αρχείο του WHDLoad και το ξεκινάει
Το WHDLoad
  • ελέγχει το περιβάλλον Software και Hardware
  • φορτώνει και ελέγχει το Slave
  • κατανέμει την απαιτούμενη μνήμη για το εγκατεστημένο πρόγραμμα
  • εάν η Preload/Sέχει ενεργοποιηθεί φορτώνει τους εικονικούς δίσκους και τα αρχεία στην RAM (εφόσον υπάρχει διαθέσιμη ελεύθερη μνήμη)
  • κλείνει το OS (απενεργοποιεί το mutitasking και τα interrupts, υποβαθμίζει το hardware γραφικών σε OCS, ξεκινά όλο το hardware με ορισμένες τιμές)
  • μεταπηδάει στο Slave
Slave
  • φορτώνει το κυρίως εκτελέσιμο αρχείο του εγκατεστημένου προγράμματος καλώντας μια συνάρτηση του WHDLoad (π.χ. resload_DiskLoad ή resload_LoadFile)
  • διορθώνει το κυρίως εκτελέσιμο αρχείο (ότι το πρόγραμμα θα φορτώσει τα δεδομένα του μέσω του Slave, να διορθώσει προβλήματα συμβατότητας, να ενεργοποιήσει μια έξοδο από το πρόγραμμα)
  • καλεί το κυρίως εκτελέσιμο αρχείο
Εγκατεστημένο πρόγραμμα
  • θα κάνει τα πράγματά του
  • στο φόρτωμα δεδομένων από τον δίσκο θα καλέσει το Slave (επειδή το Slave το έχει διορθώσει έτσι προηγουμένως), και το Slave θα καλέσει το WHDLoad, και το WHDLoad θα ενεργοποιήσει μερικώς το OS για να φορτώσει τα δεδομένα (μόνο αν τα δεδομένα δεν είναι ήδη με Preload), μετά επιστρέφει και το εγκατεστημένο πρόγραμμα συνεχίζει
Ο ΧΡΗΣΤΗΣ
  • βγαίνει από το πρόγραμμα πατώντας το QuitKey
το Slave
  • επιστρέφει στο WHDLoad καλώντας την resload_Abort
το WHDLoad
  • επανενεργοποιεί το OS (επαναφέρει τους καταχωρητές hardware, την οθόνη και τη μνήμη)
  • απελευθερώνει όλους τους κατανεμημένους πόρους
  • και επιστρέφει στο OS

Πως να εγκαταστήσετε έναν απλό trackloader μιας δισκέτας

Αυτός είναι ένα πολύ μικρός και σύντομος οδηγός βήμα-βήμα για το πως να δημιουργήσετε μια εγκατάσταση για ένα demo/παιχνίδι NDOS χρησιμοποιώντας το WHDLoad. Ο οδηγός αντιπροσωπεύει μια ιδανική απλή περίπτωση. Στον πραγματικό κόσμο μια τέτοια περίπτωση μάλλον δεν θα υπάρξει ποτέ. Για ειδικές περιπτώσεις και προβλήματα, διαβάστε τα κεφάλαια που ακολουθούν.
  1. Προεργασία
  2. Το Slave
    Για την εγγραφή του slave χρειαζόμαστε τις παρακάτω πληροφορίες:
    1. Που στο δίσκο βρίσκεται το κυρίως εκτελέσιμο αρχείο;
    2. Που μέσα στο κυρίως εκτελέσιμο αρχείο βρίσκεται ο disk loader;
    Για να πάρουμε αυτές τις πληροφορίες πρώτα αναλύουμε το bootblock. Τις περισσότερες φορές το κυρίως εκτελέσιμο αρχείο θα φορτωθεί από εδώ μέσω της exec.DoIO(). Μερικές φορές ένας ειδικός trackloader μπορεί να βρίσκεται στο bootblock. Τώρα γράφουμε ένα Slave που θα εξομοιώσει το bootblock και θα φορτώσει το κυρίως εκτελέσιμο αρχείο από τον εικονικό δίσκο. Τώρα εξάγουμε το κυρίως εκτελέσιμο αρχείο από την εικόνα ή από μια ένδειξη μνήμης. Μετά από αυτό πρέπει να βρούμε τον loader στο κυρίως εκτελέσιμο αρχείο. Ένας γρήγορος τρόπος είναι να ψάξουμε για το μοτίβο $AAAAAAAA (χρησιμοποιείται από την αποκωδικοποίηση MFM) με έναν επεξεργαστή hex. Μετά αποκόβουμε την περιοχή (+/- $1000 bytes) που βρήκαμε, την κάνουμε disassemble, και ψάχνουμε για την αρχή της ρουτίνας. Καταννοούμε τη λίστα παραμέτρων. Τώρα χρησιμοποιούμε κώδικα για το Slave που θα διορθώσει αυτή τη ρουτίνα του loader με τέτοιο τρόπο που όλες οι κλήσεις στο loader θα προωθούνται στο Slave. Το Slave τότε θα προσαρμόσει τις παραμέτρους και θα καλέσει τη συνάρτηση του WHDLoad resload_DiskLoad.
  3. Στην ιδανική περίπτωση η εγκατάσταση είναι τώρα ολοκληρωμένη.
    Ένα πράγμα που απομένει είναι να δημιουργήσουμε ένα ωραίο Εικονίδιο. Εξάγετε δύο εικόνες χρησιμοποιώντας το χαρακτηριστικό snoop του WHDLoad και το SP ή ένα πρόγραμμα παγώματος ή το UAE για να κάνετε εξαγωγή εικόνων και να φτιάξετε το εικονίδιο. Προτείνεται η παλέτα 16 χρωμάτων του RomIcon.

Πιθανά προβλήματα και ειδικές περιπτώσεις

Μη κανονικός trackloader

Μερικά προγράμματα χρησιμοποιούν δική τους μορφή δίσκου (disk format). Αυτό σημαίνει ότι το DIC δεν μπορεί να δημιουργήσει εικονικούς δίσκους. Για τη δημιουργία αρχείων ή εικόνων από τέτοια δισκέτα προτείνεται η χρήση του RawDIC. Δείτε τις οδηγίες του RawDIC για περισσότερες πληροφορίες.

Πολλαπλές δισκέτες

Εάν το πρόγραμμα χρησιμοποιεί περισσότερες από μια δισκέτες το slave πρέπει να προωθήσει τις προσβάσεις δισκετών στο κατάλληλο αρχείο εικόνας. Μερικές φορές αυτό δεν είναι εύκολο. Μερικά προγράμματα υποστηρίζουν περισσότερους από έναν οδηγούς δισκέτας, οπότε μπορείτε να χρησιμοποιήσετε τον αριθμό του οδηγού για την επιλογή της δισκέτας. Τα περισσότερα προγράμματα χρησιμοποιούν ένα ID σε κάθε δισκέτα για να τις ξεχωρίσουν. Σε αυτή τη περίπτωση, χρησιμοποιούμε μια μεταβλητή που κρατάει τον αριθμό της δισκέτας, και σε κάθε πρόσβαση στο ID της δισκέτας (καθορίζουμε τέτοια πρόσβαση αναλύοντας τις παραμέτρους για το disk loader) αυξάνουμε τη μεταβλητή (αν φτάσουμε στη τελευταία δισκέτα, το μειώνουμε). Οπότε ελπίζουμε ότι ο loader θα διαβάσει το ID ξανά και ξανά μέχρι να εισαχθεί η σωστή δισκέτα. Ίσως υπάρχει ένα αίτημα από το πρόγραμμα για να εισάγει ο χρήστης την κατάλληλη δισκέτα, απενεργοποιήστε το.

Αποθήκευση Highscore

Δεν υπάρχουν πολλά να πούμε εδώ. Χρησιμοποιούμε την resload_SaveFile για να γράψουμε στη κατάλληλη περιοχή μνήμης στη δισκέτα. Αν θέλετε, κρυπτογραφήστε τη ώστε οι χαμένοι να μην μπορούν να τη διορθώσουν πολύ εύκολα. Δεν προτείνεται να γράψετε απευθείας σε εικονικούς δίσκους (χρησιμοποιώντας resload_SaveFileOffset), γιατί αν μερικές φορές κάτι πάει στραβά (π.χ. κατάρρευση συστήματος) είναι πιθανόν τα εικονικά αρχεία να πάθουν ζημιά.

Αποθήκευση παιχνιδιών (Savegames)

Ο χειρισμός αποθήκευσης παιχνιδιών είναι ο ίδιος με τα highscore.

Προσβάσεις στο λειτουργικό σύστημα

Στο χρόνο που εκτελείται το slave και το εγκατεστημένο πρόγραμμα, απολύτως κανένα λειτουργικό δεν υπάρχει ή είναι προσβάσιμο ούτε έχει νόημα να προσπελάσουμε! Συνεπώς όλες οι προσβάσεις που επιχειρούνται από το εγκατεστημένο πρόγραμμα πρέπει να απενεργοποιηθούν. Αν δεν υπάρχουν πολλές, και δεν έχουν νόημα στο περιβάλλον του WHDLoad (όπως η exec.Disable() ή exec.SuperState()) απλά κάντε τις NOP ($4e71). Αν οι προσβάσεις έχουν κάποια σημαντική λειτουργία (όπως exec.DoIO()), προωθήστε τις στο Slave και εξομοιώστε τις. Αν υπάρχουν πολλές, δημιουργήστε μια απλή simple exec.library σε μια μη χρησιμοποιούμενη περιοχή μνήμης (εκκινήστε τη longword στη διεύθυνση $4). Μπορείτε να ελέγξετε τον πηγαίο κώδικα για το Oscar.slave, που εξομοιώνει την exec.AllocMem(). Για να εντοπίσετε προσβάσεις στο λειτουργικό, η αρχική execbase έχει οριστεί σε $f0000001 με την πρόθεση όλες οι ρουτίνες που χρησιμοποιούν την execbase να δημιουργήσουν μια εξαίρεση "Address Error".
Εάν υπάρχει βαριά χρήση λειτουργιών του λειτουργικού, χρησιμοποιούμε ένα από τα πακέτα kickemu που μπορούν να βρεθούν στο πακέτο whdload-dev. Υπάρχει ένα πακέτο για Kick 1.3 ('src/sources/whdload/kick13.s') και ένα για Kick 3.1 ('src/sources/whdload/kick31.s'). Αυτά τα πακέτα απαιτούν ένα αυθεντικό εικονικό αρχείο kickstart και θα δημιουργήσουν ένα πλήρες περιβάλλον λειτουργικού μέσα στο χώρο του WHDLoad. Συμβουλευτείτε επίσης το κατάλληλο readme που δίνεται για περισσότερες πληροφορίες.

Συχνά προβλήματα συμβατότητας

Περιορισμένος χώρος διευθύνσεων σε 68000/68010/68ec020

Σε αυτούς τους επεξεργαστές ο χώρος διευθύνσεων είναι περιορισμένος στα 16 MB ($000000...$ffffff) γιατί αυτοί οι CPU έχουν μόνο 24 γραμμές διευθύνσεων. Σαν αποτέλεσμα όλες οι προσβάσεις σε μεγαλύτερες διευθύνσεις γίνονται στα χαμηλότερα 16 MB αγνοώντας τα πιο σημαντικά 8 bits. Μερικά προγράμματα χρησιμοποιούν αυτά τα bits για να αποθηκεύουν δεδομένα, ή απλά ξεχνούν να τα καθαρίσουν. Σε έναν επεξεργαστή με πλήρες 4 GB χώρο διευθύνσεων όπως οι 68020/680ec30/68030/68040/68060 αυτό δεν θα λειτουργήσει, γιατί θα προσπελαστεί ολόκληρη η διεύθυνση 32-bit.
Για να το λύσουμε αυτό πρέπει να διορθώσουμε αυτές τις προσβάσεις και να τις προωθήσουμε στις κατάλληλες διευθύσεις.
Μερικές φορές ο λόγος για προσβάσεις σε περίεργες διευθύνσεις μπορεί να είναι ένας μη αρχικοποιημένος δείκτης. Σε τέτοια περίπτωση μπορεί να βοηθήσει να καθαρίσουμε την $400 - ws_BaseMemSize.

Διαφορετικά πλαίσια στοίβας (stackframes) σε κάθε επεξεργαστή

Τα πλαίσια στοίβας που δημιουργούνται από τον επεξεργαστή στις διακοπές (interrupts) και εξαιρέσεις είναι διαφορετικά για τα μέλη της οικογένειας των 68k. Σε έναν 68000 ένα πλαίσιο στοίβας είναι 6 bytes, εκτός για Σφάλματα Διαύλου και Διευθύνσεων. Το πλαίσιο στοίβας περιέχει το αποθηκευμένο SR στον (a7) και το αποθηκευμένο PC στον (2,a7). Σε όλους τους άλλους επεξεργαστές (68010+) το ελάχιστο πλαίσιο στοίβας είναι 8 bytes και επιπλέον περιέχει τον αριθμό vector σαν word στον (6,a7). Αυτή η μορφή Four-Word του πλαισίου στοίβας $0 δημιουργείται για την "Trap #xx" και τις διακοπές (Interrupts) σε 68010-68060. Τα πλαίσια στοίβας σε άλλες εξαιρέσεις είναι διαφορετικά σε κάθε επεξεργαστή. Η εντολή RTE λειτουργεί διαφορετικά στον 68000 σε σύγκριση με τον 68010+. Σε έναν 68000 απλά επαναφέρει τον SR και PC και συνεχίζει την εκτέλεση του προγράμματος στην διεύθυνση που είχε διακοπεί. Στον 68010+ θα απελευθερώσει επιπλέον το πλαίσιο στοίβας ανάλογα την μορφή του πλαισίου στοίβας.
Μερικά προγράμματα σπρώχνουν μια διεύθυνση (PC) και ένα SR και μετά εκτελούν μια εντολή RTE. Αυτό δουλεύει μόνο σε έναν 68000, σε 68010+ αυτό θα έχει απροσδόκητα αποτελέσματα.
Αν ένα πρόγραμμα το κάνει, θα πρέπει να το φτιάξουμε. Μερικές φορές ίσως είναι αρκετό να αντικατασταθεί η RTE με ένα RTR.

MOVEM.x RL,-(An) σε 68000/010 και 68020-68060

Υπάρχει διαφορά αν ο καταχωρητής που θα χρησιμοποιηθεί σε predecrement mode (RL) περιέχεται επίσης στη λίστα καταχωρητών. Για τους 68020-68060 η τιμή που γράφεται στη μνήμη είναι η αρχική τιμή του καταχωρητή decremented από μέγεθος της εργασίας. Οι 68000 και 68010 γράφουν την αρχική τιμή του καταχωρητή (not decremented).
Επειδή μια τέτοια κατασκευή δεν είναι πολύ χρήσιμη, κανένα λογισμικό δεν είναι γνωστό να έχει προβλήματα λόγω αυτού.

Γενικές οδηγίες για εγγραφή εγκαταστάσεων

Συμβουλές & κόλπα

Τι είναι καλύτερο, η χρήση εικονικών δίσκων ή αρχείων;

Μερικές φορές θα έχετε την επιλογή να χρησιμοποιήσετε εικονικούς δίσκους ή πραγματικά αρχεία. Και τα δύο έχουν τα πλεονεκτήματά τους. Η χρήση των εικονικών δίσκων είναι συνήθως ο ευκολότερος και γρηγορότερος τρόπος για τη δημιουργία του Slave. Αλλά τα πραγματικά αρχεία γίνονται πιο εύκολα αποθηκευμένα προσωρινά - cached (αν υπάρχει πολύ λίγη μνήμη ή η μνήμη είναι κατακερματισμένη). Ο απαραίτητος χώρος στο δίσκο θα είναι επίσης μικρότερος με πραγματικά αρχεία αντί για εικονικά αρχεία. Χρησιμοποιήστε εικονικούς δίσκους μόνο αν υπάρχουν πολλά αρχεία (περισσότερα από 30).
[Main] [Docs] [Installs] [Search] [Team] [Guestbook] [Links]