The GameBoy Robot

Γεια και χαρά σε όλους

Μια γρήγορη ερώτηση: θα ενδιαφερόταν κανείς να αγοράσει αυτό το ρομποτακι; Θα το πωλουσα χωρίς το gameboy , αλλά μαζί με την supercard. Φυσικά χωρίς τις μπαταρίες, αλλά υπάρχουν στο εμπόριο. Δώρο θα ήταν η sdcard , αλλά είναι "χαλασμένη" με την έννοια ότι είχε αγοραστεί ως 2gb, αλλά αποδείχθηκε πειραγμένη και στην πραγματικότητα είναι πολύ μικρότερη. Το θετικό είναι ότι υποστηρίζεται από την supercard και είναι ότι πρέπει για το gemeboy. Πέρα από τον κώδικα για το ρομπότ, μπορείτε να έχετε και παιχνίδια αποθηκευμένα.

Το ρομπότ είναι χειροποίητο και ελάχιστα χρησιμοποιημένο. Η supercard είναι επίσης σαν καινούργια

Γράψτε εδώ αν θα ενδιαφερόσασταν

Ευχαριστώ
 
Τελευταία επεξεργασία από έναν συντονιστή:
Βήμα 12ο Ο προγραμματισμός. Το πρόγραμμα Hello World

Γεια σας και πάλι... Νομίζω το tutorial τράβηξε πολύ :D... Εντάξει τελειώνει επιτέλους, με το κομμάτι του προγραμματισμού και του κώδικα για το ρομπότ.
Βασικά να αναφέρω ότι δεν πρόκειται εδώ να σας μάθω πως να προγραμματίζετε το GameBoy Advance. Ωστόσο θα σας πω μερικά απλά πράγματα και παραδείγματα για να ξεκινήσετε

Το πρώτο πρόγραμμα που φτιάχνει κάποιος που μαθαίνει μια γλώσσα προγραμματισμού (ή όταν προγραμματίζει μια καινούργια μηχανή) είναι το hello world. Δηλαδή ένα πρόγραμμα που τυπώνει στην οθόνη ένα μήνυμα (το Hello World)
Επειδή η γλώσσα προγραμματισμού που χρησιμοποιούμε στην προκειμένη περίπτωση είναι η c, το Hello World μοιάζει κάπως έτσι:
C:
#include <stdio.h>
int main() {
   // printf() displays the string inside quotation
   printf("Hello World!");
   return 0;
}
Αυτό θα τυπώσει το μήνυμα Hello World! στην οθόνη
Δυστυχώς τα πράγματα στο GameBoy Advance δεν είναι τόσο απλά... και αυτό γιατί είναι μια διαφορετική μηχανή (δηλαδή δεν είναι pc). Στο GameBoy η printf υπάρχει σαν συνάρτηση, αλλά δεν ξέρει που να τυπώσει...
Το GameBoy έχει μια οθόνη με ανάλυση 240χ160 και κάθε pixel αντιστοιχίζεται με έναν 16bit αριθμό (αυτό ισχύει για το video mode 3 που έχει το GameBoy. Συνολικά έχει 3 διαφορετικά video modes και το 3 είναι αυτό με τη μεγαλύτερη ανάλυση, αλλά δεν είναι double buffered). Δηλαδή κάθε pixel αντιστοιχίζεται με 2 byte και όχι με 3 που ισχύει στις οθόνες μας. Αυτό σημαίνει ότι δεν μπορεί να παράγει όλα τα χρώματα RGB όπως οι οθόνες και πρέπει να χωρέσει τις τιμές για το κόκκινο, το πράσινο και το μπλε, σε 2 μόνο bytes. Ωστόσο για το ρομπότ μας, αυτός ο περιορισμός δεν έχει καμία σημασία.
Το GameBoy είναι φτιαγμένο να λειτουργεί κυρίως με sprites και σου δίνει τη δυνατότητα να αλλάζεις κάθε φορά την χρωματική παλέτα σου.

Μπορούμε να αλλάξουμε την τιμή σε οποιοδήποτε pixel της οθόνης, απλά αλλάζοντας μια τιμή σε μια συγκεκριμένη θέση μνήμης. Η θέση μνήμης που αφορά τα pixel της οθόνης, ονομάζεται videobuffer και ξεκινάει από τη διεύθυνση 0χ6000000. Δηλαδή το πρώτο pixel αντιστοιχίζεται στη διεύθυνση 0χ6000000, το δεύτερο στη διεύθυνση 0χ6000001 κ.ο.κ.
Για να ανάψουμε, ας πούμε, το κεντρικό pixel της οθόνης με λευκό χρώμα (δηλαδή αυτό που είναι στη θέση 120χ80. Θυμηθείτε ότι η ανάλυση είναι 240χ160), θα πρέπει να θέσουμε την τιμή 0χFFFF στην διεύθυνση 0χ6019320
Δεν χρειάζεται κάθε φορά να ψάχνουμε ποια είναι η θέση. Στη c μπορούμε να το κάνουμε αυτοματοποιημένα όπως παρακάτω:

C:
int main(void)
{
   unsigned short* videobuffer = (unsigned short*)0x6000000;

   *(unsigned long*)0x4000000 = (0x3|0x400);

   videobuffer[80*240 + 120] = 0xFFFF;

   while(1) {}

   return 0;
}

Στην αρχή δηλώνουμε τη θέση που ξεκινάει ο videobuffer και μετά θέτουμε το video mode σε mode 3
Στην συνέχεια ανάβουμε το κεντρικό pixel με χρώμα λευκό. Επίτηδες το έγραψα σε αυτή τη μορφή για να φαίνεται πως προκύπτει από την ανάλυση της οθόνης (240x160). Δηλαδή ο πρώτος αριθμός είναι η θέση ψ (ο 80 σε αυτήν την περίπτωση. Το μισό του 160) και ο αριθμός 120 (το μισό του 240) είναι η θέση χ

Μπορούμε να συμμαζέψουμε το κώδικα λίγο ως εξής:

C:
#define REG_DISPCNT *(unsigned long*)0x4000000
#define MODE_3 0x3
#define BG2_ENABLE 0x400
#define SetMode(mode) REG_DISPCNT = (mode)

unsigned short* videobuffer = (unsigned short*)0x6000000;

void DrawPixel(int x, int y, unsigned short color)
{
  videobuffer[y*240 + x] = color;
}

int main(void)
{
  SetMode(MODE_3 | BG2_ENABLE);
  DrawPixel(120,80,0xFFFF);

  while(1){}

  return 0;
}

Σε αυτή τη μορφή ο κώδικας είναι πιο κατανοητός και κρύβει τους περίεργους αριθμούς. Άρα όταν θέλουμε να ανάψουμε ένα οποιοδήποτε pixel στην οθόνη, απλά εκτελούμε τη συνάρτηση DrawPixel, βάζοντας ως παραμέτρους τη θέση του pixel και το επιθυμητό χρώμα
Η SetMode θέτει το video mode όπως και προηγουμένως, αλλά είναι γραμμένη σε πιο ανθρώπινη μορφή.
Το while(1) {} που υπάρχει στον κώδικα απλά βάζει το πρόγραμμα σε έναν ατελείωτο βρόχο για να μην τερματίζεται ποτέ (ο κώδικάς μας πρέπει να εκτελείται συνέχεια στο GameBoy)

Στο επομενο post θα σας δείξω πως κάνουμε compile τον κώδικα ώστε να τρέχει στον εξομοιωτή (που εγκαταστήσαμε σε προηγούμενο βήμα) και φυσικά στο ίδιο το GameBoy Advance.
Μέχρι τότε... υγεία σε όλους σας!
 
Τελευταία επεξεργασία:
Πολυ εντυπωσιακό το GB Robo-Project!! :thumbup:

Περιμένω να διαβάσω το επόμενου post. σου.
 
Βήμα 13ο Η μεταγλώττιση του κώδικα και η εκτέλεση στο GameBoy.

Χριστός Ανέστη! Υγεία και ευτυχία σε όλους!

Φτάσαμε λοιπόν στο πολυπόθητο σημείο. Στο σημείο δηλαδή που θα μεταγλωτίσσουμε (compile) τον κώδικα και θα τον εκτελέσουμε στο GameBoy Advance.
Είναι προτιμότερο να χρησιμοποιούμε έναν editor για να γράφουμε τον κώδικα μας, επειδή πέρα από τον κατάλληλο χρωματισμό των εντολών που κάνει, μας βοηθάει και σε άλλα πράγματα. Για τα Windows δύο πολύ καλοί editors για τη συγγραφή κώδικα είναι ο Notepad++ και ο Programmers Notepad. Προσωπικά χρησιμοποιώ το δεύτερο, αλλά και οι δύο είναι πολύ καλοί.

Αφού λοιπόν γράψαμε τον κώδικά μας στον editor, σειρά έχει να τον αποθηκεύσουμε κάπου στον σκληρό μας δίσκο, δίνοντάς του ένα όνομα και την κατάληξη .c, αφού πρόκειται για κώδικα γραμμένο στην γλώσσα προγραμματισμού C. Είναι προτιμότερο να τον αποθηκεύσουμε σε έναν ξεχωριστό κατάλογο (κατα προτίμηση με το ίδιο όνομα όπως του κώδικά μας).
Ας υποθέσουμε λοιπόν ότι γράψαμε τον κώδικα του προηγούμενου post, όπως φαίνεται στην εικόνα
pixel_code.png
Το αποθήκευσα με το όνομα pixel.c, αφού αυτό που κάνει είναι να φωτίζει με λευκό χρώμα, ένα μόνο pixel στο κέντρο της οθόνης. Όπως είπα καλό είναι να το αποθηκεύσουμε σε έναν κατάλογο με το ίδιο όνομα (εδώ pixel), αλλά φυσικά αυτό δεν είναι απαραίτητο. Βοηθάει όμως πάρα πολύ για να μην μπερδευόμαστε με το αρχείο μεταγλώττισης που θα φτιάξουμε στη συνέχεια. Παρόλο αυτά εγώ το αποθήκευσα κάτω από έναν κατάλογο με το όνομα gba_examples, όπως φαίνεται στην επόμενη εικόνα
pixel_c.png

Το επόμενο βήμα είναι να φτιάξουμε το αρχείο μεταγλώττισης (make), πού όταν θα το εκτελούμε θα παράγει τον εκτελέσιμο κώδικα που θα πρέπει να φορτώσουμε στο GameBoy. Το αρχείο αυτό είναι ένα αρχείο batch (με κατάληξη .bat) που εκτελείται από το command prompt των Windows, όταν κάνουμε διπλό κλικ σε αυτό... Αυτό το αρχείο τρέχει όλα τα απαραίτητα προγράμματα (που εγκαταστήσαμε στα προηγούμενα βήματα και με την σωστή σειρά) ώστε να μεταγλωττιστεί ο κώδικάς μας
Και αυτό το αρχείο μπορούμε να το γράψουμε στον ίδιο editor που γράψαμε και τον κώδικα της C (εδώ το Programmers Notepad) και φαίνεται παρακάτω

Κτυπώ δυνατά:
@echo off
set name=pixel
set path=C:\files\devkitadv\bin;%path%

IF EXIST "%CD%\%name%.gba" (
  del "%CD%\%name%.gba"
)

gcc -o "%CD%\%name%.elf" "%CD%\%name%.c"

IF EXIST "%CD%\%name%.elf" (
  objcopy -O binary "%CD%\%name%.elf" "%CD%\%name%.gba"
  gbafix "%CD%\%name%.gba"
  del "%CD%\%name%.elf"
)
pause

και ενα screenshot
make_code2.png

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


Αυτό ήταν! Το μόνο που έχουμε να κάνουμε είναι διπλό κλικ στο αρχείο make.bat και ο κώδικας θα μεταγλωτιστεί. Ένα παράθυρο θα βγει που θα πρέπει να μας πληροφορεί με το μήνυμα Rom fixed!, όπως στην εικόνα
compile.png

Αν κοιτάξουμε τώρα στον κατάλογο, θα πρέπει να έχει δημιουργηθεί ένα καινούργιο αρχείο με το ίδιο όνομα με αυτό του κώδικα, αλλά με την κατάληξη .gba. Πρόκειται για τον μεταγλωτισμένο κώδικα μας, που είναι έτοιμος να τον εκτελέσουμε στο GameBoy μας.

Πριν όμως, μπορούμε αν θέλουμε, να το δοκιμάσουμε στον εξομοιωτή που εγκαταστήσαμε σε προηγούμενο βήμα. Αυτό είναι πολύ βολικό όταν κάνουμε δοκιμές στον κώδικά μας, ώστε να μην χρειάζεται κάθε φορά να τον μεταφέρουμε στο GameBoy.
Με διπλό κλικ πάνω στο .gba αρχείο, θα τρέξει ο εξομοιωτής και αφού φορτώσει τον κώδικά μας θα τον εκτελέσει, όπως στην εικόνα.
run_sim.png

Όπως βλέπουμε δουλεύει!!! Το κεντρικό pixel της οθόνης άναψε!


Και τώρα η πολυπόθυτη στιγμή... Η εκτέλεση του κώδικα στο GameBoy.
Τα πράγματα δε θα μπορούσαν να είναι απλούστερα. Απλά αντιγράφουμε το αρχείο με την κατάληξη .gba σε μια κάρτα sd (χρησιμοποιώντας έναν card reader). Μετά την κάρτα sd την συνδέουμε στην Supercard Mini SD Adapter

IMG_20200419_180757.jpg

IMG_20200419_180826.jpg

Συνδέουμε την Supercard στο GameBoy και το ανοίγουμε. To GameBoy με τη βοήθεια της Supercard, θα διαβάσει την κάρτα sd και σε μια λίστα θα μας δείξει όλα τα αρχεία εκτελέσιμου κώδικα που έχουμε αποθηκεύσει σε αυτήν
IMG_20200419_180942.jpg
Στην περίπτωσή μας μόνο το pixle.gba υπάρχει. Το επιλέγουμε με τα βέλη (αν δεν είναι ήδη επιλεγμένο) και πατάμε το πλήκτρο Α στο GameBoy και θα δούμε αμέσως τον κώδικά μας να εκτελείται!!! :cool::cool::cool:

Σημείωση: Επειδή ο κώδιακας αναει ένα μόνο pixel στην οθόνη του GmaeBoy δεν ήταν εύκολο να το βγάλω φωτογραφία για να σας το δείξω... Ωστόσο, πιστέψτε με...δουλεύει!!!



Λίγα λόγια για το αρχείο make.bat: Εδώ πρέπει να σας πω ότι κάθε φορά που γράφουμε έναν καινούργιο κώδικα για το GameBoy, θα πρέπει να γράφουμε και το αρχείο make.bat. Ωστόσο, έτσι όπως είναι γραμμένο το make.bat, κάνει τη διαδικασία πολύ ευκολη. Απλά κάνουμε copy-paste και το μόνο που χρειάζεται να αλλάζουμε είναι το όνομα στη δεύτερη εντολή (δηλαδή σε αυτήν που λέει set name= ... ) και να βάζουμε το όνομα του αρχείου C του κώδικά μας (χωρίς την κατάληξη .c)

Δηλαδή, για παράδειγμα, αν ονομάζαμε το αρχείο του κώδικά μας, hello.c, τότε θα γράφαμε το παρακάτω στην εντολή set name του make.bat
Κτυπώ δυνατά:
set name=hello

Τα υπόλοιπα μένουν ίδια


Παρατήρηση: Στο make.bat προυποθέτω ότι έχετε εγκαταστήσει το DevKit Advance στον κατάλογο C:\files\devkitadv, όπως είχαμε αναφέρει σε προηγούμενο post. Αν το εγκαταστήσατε σε διαφορετικό κατάλογο, απλά αλλάξτε την εντολή set path=C:\files\devkitadv\bin;%path% , ώστε να παραπέμπει στον κατάλογο που είναι εγκατεστημένο το DevKit Advance
 
Τελευταία επεξεργασία:
Γεια σας παιδιά και πάλι, μετά από δύο χρόνια!!! :D:D

Ευτυχώς φτάσαμε στο τελευταίο post πάνω σε αυτό το project, όπου δεν είναι τίποτα άλλο από το link για τον κώδικα στο github
Εκεί θα βρείτε και δύο παραδείγματα κώδικα, για το πώς να χρησιμοποιείτε τη βιβλιοθήκη που έγραψα ώστε να γίνεται εύκολα ο προγραμματισμός του GameBoy και να θυμίζει λίγο από προγραμματισμό σε arduino.
Το ένα από αυτά τα παραδείγμτα είναι και ο κώδικας για το ρομπότ που πλοηγείται στο χώρο αποφεύγοντας τα εμπόδια που συναντά, το βίντεο του οποίου ανέβασα στο δεύτερο post αυτού του thread


Υγεία σε όλους και καλές διακοπές!
 
Πολύ ενδιαφέρον project, συγχαρητήρια και από μένα arximidis.
 
Πίσω
Μπλουζα