LionWin: Ο emulator του homebrew Lion Computer

sly*m

Retro Member
Ο LionWin είναι ο εξομοιωτής του υπολογιστή LionComputer, που έχει σχεδιάσει και αναπτύξει ο Λέοντας (o @lliont, εδώ η σελίδα του project).

Ο LionComputer είναι ένας 16μπιτος υπολογιστής, φτιαγμένος από το μηδέν σε FPGA.
Οι FPGA είναι τσιπς που περιέχουν 'άγραφα' λογικά κυκλώματα, τα οποία με ειδική γλώσσα προγραμματισμού για hardware μπορούν να διαμορφωθούν σε κανονικές εφαρμογές ψηφιακού hardware. Έτσι ο LionComputer έχει σχεδιαστεί με την δική του CPU, έξοδο video, σειριακές θύρες, επικοινωνία με Sd Card και υλοποίηση file system (FAT συγκεκριμένα), χρησιμοποιεί RAM, σειριακό πληκτρολόγιο και ότι μπορεί να έχει ένας βασικός υπολογιστής για να λειτουργήσει.

Ο Lion είναι υλοποιημένος σε αρχιτεκτονική Von Neumann, με την έννοια ότι οι εντολές και τα δεδομένα βρίσκονται την ίδια μνήμη.

Μαθαίνοντας ότι ο Λέοντας έχει κάνει κάτι τέτοιο, ήθελα πολύ να το εξομοιώσω σε Personal Computer. Ήταν μια μεγάλη ευκαιρία για μένα να εμβαθύνω στην σχεδίαση και την αρχιτεκτονική μιας CPU. Οι γνωστοί επεξεργαστές εξομοιώνονται ήδη σε διάφορες γλώσσες και επειδή ο Lion σαν επεξεργαστής είναι μοναδικός, έκανε το εγχείρημα εξ' αρχής πάρα πολύ ενδιαφέρον.

Ο πηγαίος κώδικας του LionWin έχει ανεβεί στο GitHub. Το repository είναι εδώ:

https://github.com/manoosos/lioncomputerwin

Επειδή δεν προγραμματίζουν όλοι στα Windows για να κάνουν compile τον κώδικα, για όποιον θέλει να τον τρέξει και να πειραματιστεί, εδώ είναι ο LionWin σαν εφαρμογή:

http://www.mediafire.com/file/81lj27tacpy11yi/LionWin.zip/file

Το ζιπ θα ενημερώνεται με όποιες αλλαγες ή προσθήκες γίνονται στον κώδικα. Έτσι θα πρέπει να παρακολουθεί όποιος θέλει, το repository στο GitHub για το πότε ανεβαίνουν οι καινούριες εκδόσεις. Αυτό φαίνεται στα commits.

Επίσης στο readme της σελίδας στο GitHub υπάρχουν κάποιες λίγες οδηγίες που θα πρέπει να διαβάσει όποιος θέλει να τρέξει τον emulator και που ελπίζω να συμπληρώσω...
 
Last edited:

sly*m

Retro Member
Θα κάνω μια σύντομη περιγραφή της εφαρμογής καθώς το θέμα είναι πολύ τεχνικό για να το αναλύσουμε και μπορεί να κουράσει όσους διαβάζουν αυτό το thread και δεν ασχολούνται με προγραμματισμό.

Φυσικά αν υπάρξει ενδιαφέρον για τεχνικές λεπτομέρειες, θα υπάρξουν αναλύσεις και εξηγήσεις.

O εξομοιωτής είναι γραμμένος σε C#.

Η C# είναι μια δυνατή γλώσσα αντικειμενοστραφούς προγραμματισμού. Η σκέψη μου ήταν να υλοποιήσω την κάθε μονάδα-ενότητα του υπολογιστή σαν ξεχωριστό αντικείμενο (κλάση), ώστε να φαίνεται κατανοητό σε όποιον διαβάσει τον κώδικα και φυσικά να είναι πιο εύκολο να υλοποιηθεί και να συντηρείται ο ίδιος ο κώδικας.

Το engine του LionWin είναι το project 'LionComputerEmulator'. Εκεί περιγράφεται η όλη η λειτουργικότητα του LionComputer.
Το project δημιουργεί ένα DLL που περιέχει τα υποσύνολα του Lion, τα οποία εκτίθενται για να τα τρέξει το frontend, το project 'LionWin'.

Η CPU υλοποιείται από τις κλάσεις (από την βασική στην γενική ενότητα):

State.cs (η κατάσταση ή οι registers της μηχανής),

Operand.cs (όρος της εντολής),

Operation.cs (η εντολή),

InstructionSet.cs (το σύνολο των εντολών του Lion),

OperationProcessing.cs (οι μέθοδοι εκτέλεσης των εντολών) και

Cpu.cs​

Η κλάση Cpu πρακτικά για να τρέξει, χρειάζεται μόνο τον μηδενισμό, μέθοδος Cpu.Reset() και την κλήση της εκτέλεσης της εντολής που δείχνει ο Program Counter στη μνήμη, τη μέθοδο Cpu.Execute().

Η εντολή (Operation) από την άλλη, για να τρέξει δεν χρειάζεται τίποτα περισσότερο από τα πεδία Operation.OpCode, ο κωδικός εντολής, Operation.OpCodeValue, ο κωδικός όπως διαβάζεται από την μνήμη που δείχνει ο Program Counter, Operation.Length, το μήκος όλης της εντολής σε bytes (μαζί με τους όρους της) και Operation.Execute() που φυλάει την μέθοδο ExecuteMethod() που δείχνει στην αντίστοιχη ρουτίνα εκτέλεσης για την εντολή, στην κλάση εκτέλεσης OperationProcessing.

Όλες οι άλλες ιδιότητες ή μέθοδοι που έχουν υλοποιηθεί, όπως η μέθοδος Cpu.InstructionDecode() στην Cpu.cs ή οι όροι, Operand.cs, ή τα υπόλοιπα πεδία της εντολής, Operation.cs, εκτός από αυτά που ανέφερα, είναι για χάρη του Disassembler!

Ο Disassembler είναι ένα δυνατό εργαλείο για την ανάπτυξη και συντήρηση του LionWin.
Αν ο Λέοντας υλοποιήσει μια καινούρια εντολή στον Lion, ο Disassembler.cs είναι η πρώτη κατεργασία που θα περάσει το πιο πρόσφατο bin που θα δημιουργήσει ο Assembler του (εδώ ο Lion Assembler στο GitHub: https://github.com/lliont/Lionasm).
Ο Disassembler του LionWin δεν θα γνωρίζει την εντολή οπότε θα εντοπιστεί, θα καταχωρηθεί μια καινούρια εντολή στο IntructionSet και θα γίνει κατεργασία και 'στήσιμο' μέχρι ο Disassembler να αναπαράξει σωστά την καινούρια εντολή (φυσικά σε σχέση με τον Assembler).

Τότε θα κωδικευτεί η μέθοδος που εξυπηρετεί την εντολή στην OperationProcessing και θα τεσταριστεί αν λειτουργεί σωστά, σε σχέση με τους registers που επιρρεάζει και τις αλλαγές που κάνει στην μνήμη.

Ο Disassembler δημιουργεί ένα αρχείο κειμένου, το disassembly.lst, στον φάκελο που τρέχει ο LionWin, κάθε φορά που φορτώνεται ένα bin στην μνήμη του emulator.

Επίσης, δημιουργείται το αρχείο κειμένου instructions.txt που περιέχει όλες τις εντολές με τα opcodes τους και τις μεθόδους που τις εξυπηρετούν.

Αυτά τα πολύ γενικά για την Lion CPU.

Οι υπόλοιπες κλάσεις είναι τα υποσύνολα του υπολογιστικού συστήματος:

Η κλάση Memory περιέχει μια αλληλουχία από 64K bytes, την array Memory.Data.

Η κλάση Keyboard παρέχει την αντιστοιχία των πλήκτρων των Windows σε ASCII και την μέθοδο που δίνει τα πλήκτρα σαν ASCII στην 'εικονική' σειριακή του 'LionComputerEmulator'.

Η κλάση Display περιέχει ένα Windows Bitmap το οποίο δημιουργείται και αποδίδεται στο frontend όποτε καλείται η μέθοδος Display.Screen(). Η κλάση έχει και ένα soft blitter, την Display.BlitSprite() που βάζει τα sprites στο Bitmap. Περιέχει επίσης την videoram, την Display.Ram, η οποία είναι ανεξάρτητη της Memory.Data. Στον Lion παλιότερα η videoram ήταν στο πάνω μέρος της κανονικής μνήμης, ενώ τώρα είναι εξωτερική ανεξάρτητη μνήμη.

Η κλάση Sound παρέχει δύο κανάλια ήχου. Ο Lion έχει δύο pins για δύο κανάλια ήχου που δίνουν είτε τόνο τετράγωνου ηχητικού σήματος (Beep), ή τυχαίο θόρυβο. Ο ήχος χρησιμοποιεί την πάρα πολύ καλή βιβλιοθήκη NAudio (https://github.com/naudio/NAudio) που επιτρέπει να μπορούν να αναπαραχθούν τα δύο κανάλια ανεξάρτητα.

Η κλάση Device που εκεί υλοποιούνται οι συσκευές που έχει ή θα έχει ο Lion. Έχουν υλοποιηθεί η σειριακή θύρα, τα joysticks, η παραμετροποίηση του ήχου, των sprites και o hardware χρονιστής των milliseconds.

Όλες αυτές οι λειτουργίες εκτίθενται από το DLL. Ο LionComputerEmulator όμως τρέχει μέσα από τον LionWin.

Το project 'LionWin' περιέχει την φόρμα (frmMain.cs) που ελέγχει τον LionComputerEmulator και δείχνει την οθόνη του.

Έτσι, η φόρμα τρέχει πρώτα από όλα τον μεγάλο βρόγχο του emulator, την μέθοδο frmMain.doRun() σαν thread.

Δημιουργεί δύο threads για τον ήχο (ένα για κάθε κανάλι ήχου) και ένα thread για την Display.Screen() που τρέχει σχεδόν 60 φορές το δευτερόλεπτο και δείχνει το Bitmap σε ένα PictureBox control.

Επίσης παρέχει τα keystrokes στην κλάση Keyboard, από τα events των πλήκτρων, με την μέθοδο frmMain.KeysDispatcher().

Από τις άλλες λειτουργίες που κάνει η frmMain, σημαντικές είναι να φορτώνει binary Lion executables (.bin και .rbn-relative bin) στην μνήμη του LionComputerEmulator και να φορτώνει και να σώζει Basic αρχεία.

Γι αυτό τον λόγο, επειδή το φόρτωμα-σώσιμο των αρχείων προς και από την μνήμη του LionComputerEmulator γίνεται εύκολα στην φόρμα,στον LionComputerEmulator δεν έχει υλοποιηθεί η επικοινωνία με 'virtual Sd Card' μέσω SPI 'Lion Device' και η FAT 'Lion File System'. Έτσι δεν υποστηρίζονται οι εντολές LOAD, SAVE, DIR, DELETE, LCODE, SCODE της Lion Basic. Λίγο πονοκέφαλος, αλλά γίνεται.

Αυτά τα ολίγα προς το παρόν!

Για μένα είναι ένα συναρπαστικό project, μέσα από το οποίο έμαθα πάρα πολλά για το πως γίνονται ακριβώς οι πράξεις και γενικά η εκτέλεση των εντολών σε έναν μικροεπεξεργαστή. Αυτό δεν φαίνεται καν στον κώδικα μηχανής ενὀς επεξεργαστή, αλλά είναι πιο κάτω, στο επίπεδο των λογικών κυκλωμάτων που τον συνθέτουν. Σε αυτό το επίπεδο μερικές φορές δεν είναι ξεκάθαρο πως υλοποιούνται κάποιες εντολές. Αστειευόμενος ο Λέων έλεγε ότι η γλώσσα μηχανής είναι ήδη high level, πράγμα που είναι αλήθεια!

Τα projects αναπτύσσονται στον ελεύθερο χρόνο μας και έτσι δεν έχουμε και πολύ documentation γι αυτά. Είμαστε αισιόδοξοι ότι θα γίνουν όλα βέβαια!

Φυσικά αφού όλοι οι κώδικες (Lion Computer και LionWin) είναι ελεύθεροι, όποιος θα ήθελε να ασχοληθεί με οποιονδήποτε τρόπο με τα projects, είναι καλοδεχούμενος!
 
Last edited:

sly*m

Retro Member
Μερικά screenshots...

boot.png
Ο LionWin όταν έχει ξεκινήσει το σύστημα.

colors.png colors_list.png
Ένα Basic πρόγραμμα και το listing του.

waves.png waves_list.png
Άλλο ένα Basic πρόγραμμα. Η πρώτη φορά που ο LionWin έκανε σωστά LIST ήταν μαγική! (όχι να τρέξει σωστά κάποιο Basic πρόγραμμα, απλά να κάνει LIST...!)

astro.png
The mighty ASTRO! Ένα παιχνίδι φτιαγμένο σε Lion Java τρέχει σωστά στον LionWin!
 
Last edited:

geoanas

Commodore Vampire
Staff member
Πραγματικό διδακτορικό σε όποιον θα ήθελε να εντρυφήσει στην επιστήμη των υπολογιστών. Παρακολουθώ το project LION εδώ και πολύ καιρό. Σας θαυμάζω και επικροτώ την προσπάθεια σας. Τέτοια projects σπανίζουν, τουλάχιστον στον Ελληνικό χώρο, και πρέπει να αναδεικνύονται και να χαρακτηρίζονται από εξωστρέφεια. Αυτή είναι η πάγια θέση μου.

Η ιδέα ανάπτυξης του emulator ήταν λαμπρή, ειδικά με τον συνδιασμό της ελεύθερης διανομής των sources τόσο για τον Lion Computer όσο και για τον συν αυτώ LionWin, γιατί με αυτόν τον τρόπο κάθε απλός χρήστης μπορεί να γνωρίσει από πρώτο χέρι το project. Ο emulator είναι κάτι φιλικό και γνώριμο για τους περισσότερους από εμάς και ανοίγει την πόρτα σε περισσότερο κόσμο ώστε να ασχοληθεί και γιατί όχι να αναπτύξει κώδικα γι αυτό. Εύχομαι να δούμε κι άλλα παιχνίδια, εφαρμογές (βλ. demos!) κομμένα και ραμμένα στα μέτρα του Λέοντα.

Μπράβο σας!
 

sly*m

Retro Member
Ευχαριστούμε Geo! Θα ήταν πάρα πολύ ωραίο να υπάρχει κόσμος να προγραμματίσει ή και να φτιάξει τον Lion σαν hobby!
Λοιπόν μας λείπουν ένα monitor στην lionrom... ...καλός θα ήταν ένας c compiler... ... τι καλά να φτιαχνόταν ωραίο και ευπαρουσίαστο documentation... ...κλπ... ...κλπ... :D:p:lol:
 

Always Somewhere

Retro Enthusiast
Η ολη φάση με τον Lion Computer μου θυμίζει την γνωστή ιστορία με τα δύο φιλαρακια και τα τότε homebrew computer club.. :)


https://www.computerhistory.org/revolution/personal-computers/17/312

:rolleyes: Καπου εδω ονειρευομαι να μπορούσαμε με μια χρονομηχανή να γυριζαμε πίσω στο παρελθόν μαζι με τον Lion Computer σε ένα τέτοιο homebrew computer club της εποχής εκείνης!
 
Last edited:

geoanas

Commodore Vampire
Staff member
Η ολη φάση με τον Lion Computer μου θυμίζει την γνωστή ιστορία με τα δύο φιλαρακια και τα τότε homebrew computer clubs.. :)
...
https://www.computerhistory.org/revolution/personal-computers/17/312

:rolleyes: Καπου εδω ονειρευομαι να μπορούσαμε με μια χρονομηχανή να γυριζαμε πίσω στο παρελθόν μαζι με τον Lion Computer σε ένα τέτοιο homebrew computer club της εποχής εκείνης!
ΑΚΡΙΒΩΣ αυτό! Με κάλυψες απόλυτα :thumbup:
 

Always Somewhere

Retro Enthusiast
Ευχαριστούμε Geo! Θα ήταν πάρα πολύ ωραίο να υπάρχει κόσμος να προγραμματίσει ή και να φτιάξει τον Lion σαν hobby!
Λοιπόν μας λείπουν ένα monitor στην lionrom... ...καλός θα ήταν ένας c compiler... ... τι καλά να φτιαχνόταν ωραίο και ευπαρουσίαστο documentation... ...κλπ... ...κλπ... :D:p:lol:


Greek_First_Homebrew_Computer_Club_meeting.jpg
Χμμ... :rolleyes:

Ένα Greek Homebrew Computer Club μήπως... ??? :whistle:
 

geoanas

Commodore Vampire
Staff member
Ένα Greek Homebrew Computer Club μήπως... ??? :whistle:
Γνωρίζοντας τα περισσότερα παιδιά στο https://www.retroclub.info/ της Θεσσαλονίκης, παλιούς και νέους, πληροφορούμαι πολύ τακτικά από τους ίδιους για τα πολύ ενδιαφέροντα projects που ετοιμάζουν. Βάζω στοίχημα ότι και το εκκολαπτόμενο της Αθήνας δεν θα πάει πίσω. Με πνεύμα άδολης φιλίας και γόνιμης συνεργασίας, πολλά θαυμάσια μπορούν να γίνουν και να δείτε ότι θα γίνουν.

Εμείς εδώ θα είμαστε, τουλάχιστον εγώ προσωπικά το εγγυώμαι, για να ρίχνουμε κλεφτές ματιές στους πάγκους τους και να μεταφέρουμε τα όσα ωραία θα μας δείχνουν όλοι.
 

AEON

Tech Admin
Staff member
Ως fellow computer scientist βγάζω το καπέλο και στον Λέοντα και σε εσένα. Ξέρω πόση δουλειά και αφοσίωση απαιτείται για να φτιαχτεί κάτι τέτοιο ακόμα και ως proof of concept. Θα κάτσω το ερχόμενο ΣΚ να μελετήσω το LionWin με την ησυχία μου, όπως του αρμόζει. :)

Μια ερώτηση μόνο, γιατί ακολουθήθηκε το Von Neumann architecture δεδομένου του γνωστού bottleneck που έχει με το μειωμένο data transfer rate;
 

lliont

Retro Starter
Ευχαριστώ, όταν ξεκίνησα να φτιάχνω την cpu δεν είχα στο μυαλό μου τις επιδόσεις ουτε καν φαντάστηκα ότι θα φτιάξω ένα ολόκληρο υπολογιστή και basic/java compiler κλπ. Έτσι κι αλλιώς δεν είναι ένα προϊόν με εμπορική αξία ούτε ανταγωνίζεται κάποια άλλη cpu/υπολογιστή οπότε έφτιαξα κάτι που μου ήταν οικείο.
Αυτό που μετάνιώνω τώρα είναι ότι δεν έφτιαξα από την αρχή μεγαλύτερο address bus και τώρα για να μεγαλώσω την ram μνήμη πάνω από τα 64Κ η πρέπει να κάνω paging (που δεν μου αρέσει) η να κάνω πολύ μεγάλες αλλαγές στην cpu και τον assembler και όλα.
 

AEON

Tech Admin
Staff member
Κατανοώ πλήρως. Όπως και να έχει αποτελεί αξιολογότατη πρωτοβουλία και ωραίο υλικό για μελέτη. Όπως έλεγα πριν από λίγο και στον sly*m, ποτέ δεν ξέρεις, μετά από μερικά χρόνια μπορεί να αποκτήσει cult status και να αρχίσει κόσμος από το διεθνές scene να γράφει games για την πλατφόρμα! Όλα τα έχω δει να συμβαίνουν!
 

DAT-Alex

Retro Addict
Μπράβο Μπράβο...και πάλι Μπράβο!! στον lliont (για την προτζεκτάρα του σε FPGA) και τον Sly*m για τον emulator. Ειλικρινά το σχόλιο του Always Somewhere με κάλυψε απόλυτα περί Greek Homebrew Computer Club.

Αλήθεια ...μήπως είναι καιρός να υπάρξει κάτι τέτοιο? Ήδη στο retroclub (εδώ στην Σαλόνικα) ετοιμάζουμε κάποια προτζεκτάκια για wifi 8bit online gaming ;)
Επίσης προσωπικά γύρισα πρόσφατα το ΣΚ απο ταξίδι στο Βερολίνο (οικογενειακώς) και έπειτα και απο την επίσκεψή μου στο computerspielemuseum
έχω στο μυαλό μου όλα αυτά τα μικρά-μεγάλα προτζεκτάκια που είδα εκεί και πολλά άλλα που παιδιά απλά χρειάζεται συνεργασία και να γίνει μόνο ένα απλό βήμα. Εμείς εδώ στην χώρα μας νομίζω οτι έχουμε τι γνώσεις και μπορούμε να κανουμε ανάλογα προτζεκτάκια και μάλιστα με την μορφή open source η 'ανάπτυξη' που μπορεί να πάρει οπουδήποτε πρότζεκτ είναι νομίζω τεράστια.
 
Last edited:

sly*m

Retro Member
Ως fellow computer scientist βγάζω το καπέλο και στον Λέοντα και σε εσένα. Ξέρω πόση δουλειά και αφοσίωση απαιτείται για να φτιαχτεί κάτι τέτοιο ακόμα και ως proof of concept. Θα κάτσω το ερχόμενο ΣΚ να μελετήσω το LionWin με την ησυχία μου, όπως του αρμόζει. :)
Ευχαριστώ @AEON! Οποιεσδήποτε παρατηρήσεις, συμβουλές ή ιδέες είναι ευπρόσδεκτες!! ;)

γνωστή ιστορία με τα δύο φιλαρακια και τα τότε homebrew computer club..
Ο Lion είναι της ίδιας τεχνοτροπίας ( cpu αρχιτεκτονική σαν αυτές των αγαπημένων μας επεξεργαστών στα μέσα '70 έως αρχές '80 ) με το project των δύο φίλων της φωτό, αλλά 40 χρόνια μετά! Νομίζω δεν υπάρχει σύγκριση...
Είναι ένα project καθαρά και απόλυτα diy. Που σημαίνει ότι όλα θα φτιάχνονται στο χέρι... ούτε καν fpgasid ή κάποιο τσιπ παλέτας όπως πχ το Yamaha V9990... O Λέων θα ήθελε πιό πολύ να φτιαχτεί custom video ( ή και LionFpgaGpu φαντάζομαι, LET'S GO!!! ) και custom soundchip παρά να χρησιμοποιηθούν έτοιμες λύσεις (νομίζω). :geek:

Ευχαριστώ όλους σας για τα καλά σας λόγια παιδιά! :):lol:
 
Last edited:

lliont

Retro Starter
Ναι δεν έχει νόημα να χρησιμοποιήσω κάτι έτοιμο χαλάει η φιλοσοφία του Lion, ότι χρειάζεται πρσοπαθώ να το φτιάξω όπως μπορώ (αν μπορώ), υπάρχει ήδη video controller με 11 μονόχρωμα η 10 πολύχρωμα sprites ανάλογα το video mode (δεν είναι σε άλλο chip και δεν τον έχω βαφτίσει) και απλός sound generator με 2 κανάλια και 1 θορύβου που σιγά σιγά θα εξελίσσονται χωρίς βιασύνη μέχρι να βαρεθώ και να πω το project τελείωσε (δεν το βλέπω σύντομα :) ).
 

geoanas

Commodore Vampire
Staff member
...
Που σημαίνει ότι όλα θα φτιάχνονται στο χέρι... ούτε καν fpgasid ή κάποιο τσιπ παλέτας όπως πχ το Yamaha V9990...
Μου θύμισες το KiWi computer (με κόστος 333EUR+)

O Λέων θα ήθελε πιό πολύ να φτιαχτεί custom video ( ή και LionFpgaGpu φαντάζομαι, LET'S GO!!! ) και custom soundchip παρά να χρησιμοποιηθούν έτοιμες λύσεις (νομίζω). :geek:
Αυτό πραγματικά θα ήταν εξαιρετικά ενδιαφέρον και πρωτότυπο.
 
Top