dxn -- machine virtuelle de mort
Posté le 02/01/2022 14:53
Salut ! J'ai commencé il y a quelques jours à travailler sur une machine virtuelle et son langage ASM associé destinés au gamedev expérimental. J'apprécierais énormèment des critiques sur le format du binaire, l'addressage et la syntaxe assembleur. Je suis relativement nouveau dans ce monde, et tout peut m'aider.
Je l'ai nommé dxn. dxn combine des caractéristiques de langages que j'aime dans l'idée, mais ne fonctionnent tous pas exactement comme je le souhaiterais. Les inspirations principales de dxn sont : la programmation d'un Gameboy DMG, uxn, CHIP-8 et TIS-100.
Le fichier
concept.s de mon dépôt de développement contient un exemple de programme idéal.
sample.s et
sample.dxn représentent l'avancement actuel du projet.
dxna est l'assembleur, dxnd le désassembleur.
http://kiko.ovh/cgit/dxn/
Je veux terminer une toolchain complète pour systèmes POSIX, avec l'objectif final de porter un interpréteur dxn sur calculatrice.
Maintenant que dxna et dxnd fonctionnent, je vais pouvoir attaquer le premier interpréteur de prototypage.
Merci d'avoir lu jusqu'ici, tiens
un cookie pour ton temps
Citer : Posté le 05/01/2022 10:45 | #
Comment ? Je ne savais pas que sleep(0) avait un effet. Tu as une référence de de doc ou une info du même style ?
Citer : Posté le 05/01/2022 12:40 | #
Comment ? Je ne savais pas que sleep(0) avait un effet. Tu as une référence de de doc ou une info du même style ?
L'info n'est pas clairement mentionnée quelque part, mais de ce que j'ai saisi, sleep met en pause le thread et le place à la fin de la queue du scheduler. Ça permet aux autres applications d'utiliser le CPU, et dans la situation où il y a n'y a qu'un thread actif sleep(0) met tout de même en pause pour un très court laps de temps, ce qui suffit à réduire la charge (le système appelant le scheduler X fois par seconde).
The sleep() function shall cause the calling thread to be suspended from execution until either the number of realtime seconds specified by the argument seconds has elapsed or a signal is delivered to the calling thread and its action is to invoke a signal-catching function or to terminate the process. The suspension time may be longer than requested due to the scheduling of other activity by the system.
L'utilisation de mon CPU est passée de 100% à 20% après ce changement, ça a un effet en tout cas.
Citer : Posté le 05/01/2022 12:46 | #
Fair enough, c'est sensé.
Citer : Posté le 05/01/2022 15:03 | #
dxnr : ajouté l'instruction rnd. Roguelike soon™ (or not).
La premier build jouable de mon petit jeu, dxn Race (remake du jeu Basic éponyme), est en pièce jointe.
Edit 18:23
Mis à jour le build.
Citer : Posté le 05/01/2022 15:03 | # | Fichier joint
Nah.
Ajouté le 06/01/2022 à 01:56 :
Re yo. Je ne dors jamais. J'ai passé la majeure partie de mon temps sur race dxn maintenant que dxn est relativement stable. Les specs ne sont pas encore fixées, mais on s'en approche.
dxnr supporte maintenant le changement de palette, en modifiant les valeurs des addresses FFD0 à FFD5. C'est du 3-bit, très facile à utiliser et permet de faire des petits effets stylés. Étant donné que cette fonctionnalité n'ajoute aucune instruction, elle peut être complètement ignorée par les implémentations (je pense notamment à un éventuel port graph mono). cls a enfin été implémenté.
race dxn avance, si z'êtes curieux vous pouvez regarder les sources et le build vous même. Ça avance bien sur tous les plans, et je n'ai pas rencontré de problème lié au design du jeu d'instructions. À part peut-être que les comparaisons sont un peu pénibles (faut sub/add), mais honnêtement c'est juste parce que j'ai pas configuré mon éditeur de texte pour le rendre plus facile.
http://kiko.ovh/cgit/dxn-race
Citer : Posté le 06/01/2022 14:13 | # | Fichier joint
Yop. Ajouté le support de dbs pour stocker des chaînes de caractères. J'ai créé pour l'occasion une police custom 3x4 qui couvre tous les caractères visibles de la plage ASCII. Oui, je me déteste.
Et voici le code complet de ma fonction print suivi d'un exemple d'utilisation, qui peut simplement être cat à la fin d'un programme pour l'utiliser.
print:
pop _print_y
pop _print_x
pop _print_str
movp _print_acc, @_print_str
jz @_print_acc, _print_ret
_print_char:
movp _print_acc, @_print_str
jz @_print_acc, _print_ret
sub _print_acc, #21
jnz $FFF0, _print_no_draw
add _print_acc, _print_font
movp _print_sp, @_print_acc
xsp @_print_sp, @_print_x, @_print_y
_print_no_draw:
inc _print_str
add _print_x, #4
jmp _print_char
_print_ret:
ret
_print_acc:
noop
_print_sp:
noop
_print_str:
noop
_print_x:
noop
_print_y:
noop
_print_font:
db #0
db #1011
db #55
db #7575
db #3636
db #5635
db #7357
db #22
db #2112
db #1221
db #525
db #2720
db #1200
db #700
db #1224
db #2552
db #2232
db #6143
db #3463
db #4475
db #3416
db #2536
db #2247
db #7257
db #3452
db #2020
db #1202
db #6160
db #7070
db #3430
db #2043
db #7457
db #5757
db #7573
db #7117
db #3553
db #7137
db #1137
db #7517
db #5575
db #7227
db #3227
db #5535
db #7111
db #5557
db #5553
db #7557
db #1757
db #3557
db #5357
db #7417
db #2227
db #7555
db #2555
db #2775
db #5225
db #2255
db #7147
db #3113
db #4221
db #3223
db #52
db #7000
db #21
db #5757
db #7573
db #7117
db #3553
db #7137
db #1137
db #7517
db #5575
db #7227
db #3227
db #5535
db #7111
db #5557
db #5553
db #7557
db #1757
db #3557
db #5357
db #7417
db #2227
db #7555
db #2555
db #2775
db #5225
db #2255
db #7147
db #4234
db #2222
db #1621
db #56
dbs "Hello, world!"
hello_world:
push hello_world_str
push #F ;x
push #8 ;y
call print
show
Faudrait que je rédige un tuto sur les bases de dxna, pour éviter que dxn devienne le truc mystique que je suis le seul à comprendre. Surtout que je spam de ouf, faut que je justifie au bout d'un moment
Citer : Posté le 07/01/2022 01:48 | # | Fichier joint
Le retour du fils prodige ! (Comment ça « non » ?)
J'ai tenté de porter dxnr sur calto avec gint, mais je me suis vite tapé des difficultés invisibles. Il faudra que je m'équipe de libprof et tout le barda pour, quand j'aurai rassemblé le courage, m'engager dans une session de debug intensive. Je n'ai pas hâte du tout u_u
La spec n'a pas évolué aujourd'hui (bon signe !).
Le projet a désormais un joli README, ainsi qu'une license (MIT) et des instructions de build et installation.
Les Makefile que j'ai écrit rendent le processus beaucoup moins pénible pour l'utilisateur que les feu build.sh (make; sudo make install fait le taf).
Les démos ont été mises à jour pour utiliser #bind proprement.
La rédaction d'un tutoriel d'introduction a été entamé. Vu le fonctionnement et les objectifs de dxn, il ne sera pas vraiment destiné aux nouveaux programmeurs. J'espère qu'il pourra au moins servir de support si quelqu'un souhaite comprendre le fonctionnement de la chose un jour futur.
dxnr gère désormais les divisions par zéro. Oupsi.
Une implémentation Lua de dxn a été entamée.
Je manque tellement de sommeil