ugBASIC est arrivé sur Olivetti Prodest PC128!

C'est la catégorie reine de l'ordinophile, 8 bits et pas un de plus!
Single board ou bus S-100 acceptés.

Modérateurs : Carl, Papy.G, fneck

spotlessmind1975
Messages : 24
Inscription : 24 oct. 2021 15:47

ugBASIC est arrivé sur Olivetti Prodest PC128!

Message par spotlessmind1975 »

[ Je suis désolé mais je ne parle pas français, c'est donc une traduction automatique. Veuillez pardonner toute erreur ou expression mal orthographiée, et reportez-vous à la version anglaise si ce n'est pas clair. ]

J'ai le plaisir de vous informer que depuis hier le compilateur croisé ugBASIC Open Source supporte le OLIVETTI PC128 PRODEST (et donc aussi le THOMSON MO6) ainsi que toute la famille des modèles THOMSON MO5.

Le compilateur peut être lancé directement depuis Linux ou Windows, génère un fichier "k7" et permet d'accéder facilement à tous les modes graphiques disponibles, notamment le BITMAP MODE 4 et BITMAP MODE 16, ainsi que celui en 40 colonnes, pour dessiner et écrire des textes avec les commandes BASIC standard.

De plus, il est capable de lire et de convertir "à la volée" tous types de ressources graphiques modernes (PNG, JPG, BMP, ...) auxquelles se réfère le programme BASIC, afin de les mettre à disposition pour mettre en œuvre des jeux et des animations.

le résultat est chargé avec la commande BASIC

Code : Tout sélectionner

CLEAR, & H2FFF : LOADM "CASS :", R : EXEC
En savoir plus:
https://ugbasic.iwashere.eu/

ugBASIC ARRIVES ON PC128 PRODEST!

I am happy to announce that from today the ugBASIC Open Source cross compiler supports the OLIVETTI PC128 PRODEST (and therefore also the THOMSON MO6) as well as the whole family of THOMSON MO5 models.

The compiler is executed directly from Linux or from Windows, it generates a "k7" file and allows you to easily access all the graphics modes available, in particular BITMAP MODE 4 and BITMAP MODE 16, as well as the 40-column one, to draw and write texts by using standard BASIC commands. In addition it is able to read and convert "on the fly" all types of modern graphic resources (PNG, JPG, BMP, ...) to which the BASIC program refers, in order to make them available to implement games and animations.

The result can be loaded by using the BASIC command:

Code : Tout sélectionner

CLEAR,&H2FFF: LOADM"CASS:",R: EXEC
To know more:
https://ugbasic.iwashere.eu/
Daniel
Messages : 14464
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: ugBASIC est arrivé sur Olivetti Prodest PC128!

Message par Daniel »

Merci. Nous attendions depuis longtemps un compilateur BASIC pour Thomson.
Mais comment fait-on pour convertir un programme BASIC Thomson en ugBASIC ?
Faut-il tout écrire, ou existe-t-il un outil pour faire automatiquement la conversion ?
Daniel
L'obstacle augmente mon ardeur.
spotlessmind1975
Messages : 24
Inscription : 24 oct. 2021 15:47

Re: ugBASIC est arrivé sur Olivetti Prodest PC128!

Message par spotlessmind1975 »

bonjour, à l'heure actuelle, ugBASIC est un langage avec sa propre syntaxe spécifique. Je ne sais pas si vous pouvez écrire un convertisseur Thomson BASIC vers ugBASIC (mais on m'a demandé d'ajouter quelques commandes de ce BASIC), mais ugBASIC fournit des primitives spécialisées. C'est un langage "isomorphe", car il permet d'écrire des programmes pour une grande variété de systèmes, sans programmation conditionnelle. Ceux qui l'ont utilisé dans l'aperçu ont déclaré qu'écrire des programmes avec ce langage simplifie beaucoup la tâche. C'est, pour ainsi dire, une langue spécialisée.

Si vous le souhaitez, vous pouvez voir un exemple de jeu écrit avec ugBASIC et également compilé pour Olivetti Prodest PC128:
https://spotlessmind1975.itch.io/4gravity
__sam__
Messages : 6366
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: ugBASIC est arrivé sur Olivetti Prodest PC128!

Message par __sam__ »

Il y a l'air d'avoir des procédures et des variables locales, des entiers 8, 16 ou 32 bits (pas trouvé de flottant), des images, des sprites (moving object). C'est super intéressant tout ca :D

J'ai regardé le code ASM, par exemple

Code : Tout sélectionner

63FD 1CFE       ANDCC  #$FE                3
63FF 88FF       EORA   #$FF                2
6401 C8FF       EORB   #$FF                2
6403 C30001     ADDD   #$0001              4 --> 9 octets, 11 cycles
et cela ressemble à la négation 16bit faite sur un Z80 (en particulier avec l'équivalent d'un Clear Carry (CLC) en $63FD). Il va sans dire qu'on peut faire beaucoup plus compact et rapide du 6809 (NEGA + NEGB + SBCA #0 --> 4 octets, 6 cycles). Le profiling indique aussi que l'on passe pas mal de temps dans la multiplication 16bits et d'autres trucs. Je ne sais pas s'il y a moyen de faire évoluer l'ASM produit (par exemple en ajoutant une couche de peephole pour simplifier les trucs comme LDA $XXXX + CMPA #$00 + BNE ou LEAX -1,X + CMPX #0 + BNE, ou encore LDD ,X + TFR D,X (D mort à la suite)), mais ca pourrait être utile.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
spotlessmind1975
Messages : 24
Inscription : 24 oct. 2021 15:47

Re: ugBASIC est arrivé sur Olivetti Prodest PC128!

Message par spotlessmind1975 »

Bonjour, et merci pour les suggestions, je suis content que vous trouviez le projet intéressant!

Je confirme qu'il n'y a pas de nombres à virgule flottante. Le langage prend en charge 15 data type différents :
- octets signés / non signés (8 bits) ;
- mots signés / non signés (16 bits) ;
- doubles mots signés/non signés (32 bits) ;
- adresse mémoire (16 bits non signés) ;
- position graphique (signé 16 bits) ;
- indice de couleur (non signé 8 bits) ;
- string statiques (non modifiables) ;
- buffer statiques (non modifiables) ;
- images statiques (non modifiables) ;
- objets mobiles graphique ;
- string dynamiques ;
- tableaux (d'octets, de mots, de doubles mots et de dynamic strings).

L'inspiration pour les algorithmes est le CPU 6502, par conséquent, les inefficacités pourraient en dépendre. Le compilateur dispose d'un "peephole optimizer", qui pourrait être utilisé pour des choses comme celle-ci, à condition que nous ne résolvions pas en optimisant le code du produit. Cependant, j'ai pris la liberté d'ajouter votre suggestion parmi les choses à faire:
https://github.com/spotlessmind1975/ugbasic/issues/167
__sam__
Messages : 6366
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: ugBASIC est arrivé sur Olivetti Prodest PC128!

Message par __sam__ »

Ah le 6502! J'hésitais entre les deux et j'ai choisi le mauvais :oops:

C'est super qu'il y ait un github. Je vais le cloner et essayer de voir si je peux aider, si j'ai du temps, je ne promets rien pour l'instant. Mais c'est vrai que ce basic m'intéresse.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
spotlessmind1975
Messages : 24
Inscription : 24 oct. 2021 15:47

Re: ugBASIC est arrivé sur Olivetti Prodest PC128!

Message par spotlessmind1975 »

Cela n'a pas d'importance! Tu avais 50% de chance, car en fait ugBASIC supporte aussi le z80. :D
Je suis flatté de la proposition: ton contribution est la bienvenue !
__sam__
Messages : 6366
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: ugBASIC est arrivé sur Olivetti Prodest PC128!

Message par __sam__ »

J'ai regardé le code sur le repo GIT et je vois quelques constructions systématiques qui ne sont pas optimales sur le 6809.

* LDr MEMORY + ANDr #$80 + BEQ LABEL (r=A ou B)
(exemple) devrait être codé comme

Code : Tout sélectionner

LDr MEMORY
BPL LABEL
* LDr MEMORY + CMPr #0 + Bcc LABEL (r=A ou B, cc=EQ ou NE, exemple1, exemple2)
Sur le mc6809 le LDr positionne les flags si bien que la comparaison à 0 est inutile

Code : Tout sélectionner

LDr MEMORY
Bcc LABEL
* EORr #$FF (r=A ou B)
(exemple) économiserait 1 octet en utilisant

Code : Tout sélectionner

COMr
* ADDr #1 (r=A ou B)
économiserait 1 octet avec

Code : Tout sélectionner

INCr
Idem avec SUBr. A noter: la retenue (C) n'est pas positionnée avec les INC/DEC, cela peut avoir une importance (et parfois on préfera utiliser une SUBB #1, par exemple dans les routines de copie/fill).

* EORr #$FF + ADDr #1 (r=A ou B) est en réalité une négation

Code : Tout sélectionner

NEGr
* LDr #0 (r=A ou B) exemple
On gagne 1 octet avec

Code : Tout sélectionner

CLRr
* BNE LBL2 + JMP LBL1 + LBL2: (exemple)
C'est vrai que BNE ne permet que de sauter entre -128 et +127. Mais on a pas besoin de cette construction avec le JMP pour sauter sur 16bits car il existe LBEQ/LBNE (long branch)

Code : Tout sélectionner

LBEQ LBL1
* LDX MEMORY1 + LDA ,X + STA MEMORY2 ou LDA MEMORY1 + LDX MEMORY 2 + STA ,X (exemple)
Le mc6809 possède un mode indirect qui fait cela plus rapidement sans utiliser X

Code : Tout sélectionner

LDA [MEMORY1]
STA MEMORY2
ou

Code : Tout sélectionner

LDA MEMORY1
STA [MEMORY2]
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
spotlessmind1975
Messages : 24
Inscription : 24 oct. 2021 15:47

Re: ugBASIC est arrivé sur Olivetti Prodest PC128!

Message par spotlessmind1975 »

Wow, merci pour tous les conseils.
Je les ajouterai au compilateur dès que possible.
En attendant, j'ai ouvert un ticket pour suivre les optimisations:
https://github.com/spotlessmind1975/ugbasic/issues/170
Merci encore!

Edit : correction du lien.
Dernière modification par spotlessmind1975 le 26 oct. 2021 13:20, modifié 1 fois.
__sam__
Messages : 6366
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: ugBASIC est arrivé sur Olivetti Prodest PC128!

Message par __sam__ »

Oui et il y en a plein d'autres à faire (le mc6809 est très puissant et le portage de code 6502 n'est pas le plus optimal).
[EDIT] le lien indiqué n'est pas le bon (il pointe sur une optimisation de threading). Le bon est celui-ci: https://github.com/spotlessmind1975/ugbasic/issues/170

Hier j'ai aussi ouvert une "issue" sur le github à propos d'une instruction machine inexistante: EOR #$FF (il manque l'accu A ou B dans l'instruction).

A noter: j'ai essayé de recompiler sous cygwin, mais ma version de "bison" n'aime pas le -Wcounterexamples apparemment et je ne suis pas allé plus loin. Il faudrait que j'essaye sous le ubuntu de WSL.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
spotlessmind1975
Messages : 24
Inscription : 24 oct. 2021 15:47

Re: ugBASIC est arrivé sur Olivetti Prodest PC128!

Message par spotlessmind1975 »

Je m'excuse pour le mauvais lien. C'est une fonctionnalité que j'implémente en ce moment, et qui va permettre de faire tourner des algorithmes en parallèle sur tous les ordinateurs pris en charge, et donc aussi sur Thomson MO5 et Olivetti Prodest PC128. L'avantage devrait être celui d'une programmation de jeux vidéo plus linéaire. Mais j'ai vu l'autre ticket, merci! Je vais le corriger au plus vite.

Oui, je suppose qu'il y a encore beaucoup de travail à faire. Je ne suis pas un expert en langage assembleur pour le processeur 6809, et donc je me suis appuyé sur l'utilisation "intuitive" des registres, mais je comprends qu'il est vraiment puissant.

Concernant la recompilation sous cygwin (donc : Windows) en fait je me rends compte que je n'ai pas indiqué la version que j'ai utilisée. Voici le résultat de la commande:

Code : Tout sélectionner

$ gcc --version
gcc.exe (MinGW.org GCC-6.3.0-1) 6.3.0
Pour Bison et Flex, cependant, je devais me procurer les dernières versions car les précédentes avaient des problèmes :

Code : Tout sélectionner

$ flex --version
flex.exe 2.6.4

Code : Tout sélectionner

$ bison --version
bison (GNU Bison) 3.7.4
Cependant, l'option "-Wcounterexamples" n'est pas nécessaire, donc si vous vous en privez puis compilez, allez-y.

Sous Linux, ça devrait être plus simple.
__sam__
Messages : 6366
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: ugBASIC est arrivé sur Olivetti Prodest PC128!

Message par __sam__ »

J'ai réinstallé bison et ca marche mieux. J'ai aussi compilé et installé usim et asm6809, et je peux me lancer dans quelques tests :)

Code : Tout sélectionner

$ make target=mo5 output=k7 test
make[1] : on entre dans le répertoire « /cygdrive/c/Users/Utilisateur/Desktop/Thomson/c6809-0.83/ugbasic/ugbc »
make[1] : on quitte le répertoire « /cygdrive/c/Users/Utilisateur/Desktop/Thomson/c6809-0.83/ugbasic/ugbc »
--- START TEST ---
syntax error: /tmp/out.asm:710:
usage: usim <hexfile>
make: *** [makefile:42: test] Segmentation fault (core dump créé)
Bref: ca marche pas (coredump durant la phase d'assemblage). J'imagine qu'il y a quelque-chose de mauvais mais quoi ?

J'ai regardé le fichier /tmp/out.asm, et je m'aperçois qu'il y a des blancs dans les arguments de certaines instructions:

Code : Tout sélectionner

DSWRITEOK

    LDY 1, X <== ici un blanc entre "1," et "X"
Je me dis que peut-être asm6809 n'aime pas cette syntaxe ?

Il y a aussi des retour à la ligne qui alternent \n et \r\n,

Code : Tout sélectionner

cls_after
	JSR CLS
	CLR _address
	CLR _address+1
	CLR _size
	CLR _address2
	CLR _address2+1
	CLR _size2
	JMP dstring_after
; /*****************************************************************************

;  * ugBASIC - an isomorphic BASIC language compiler for retrocomputers        *

;  *****************************************************************************

;  * Copyright 2021 Marco Spedaletti (asimov@mclink.it)

;  *

;  * Licensed under the Apache License, Version 2.0 (the "License");

;  * you may not use this file except in compliance with the License.

;  * You may obtain a copy of the License at
mais là c'est peut-être GIT qui fait des trucs bizarres.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
spotlessmind1975
Messages : 24
Inscription : 24 oct. 2021 15:47

Re: ugBASIC est arrivé sur Olivetti Prodest PC128!

Message par spotlessmind1975 »

Tout d'abord merci pour le patience en essayant de faire fonctionner le compilateur. Si es d'accord, je suivrais l'ordre dans lequel vous avez proposé les problèmes, afin que nous puissions vérifier si nous pouvons tous les résoudre.

Tout d'abord, la version d'usim que j'utilise a été fortement personnalisée pour collecter diverses informations à la fin de l'exécution. C'est aussi la cause du "core dump", car le module de test est peu tolérant. Par conséquent, il n'est pas possible d'utiliser celui qui est fourni "out of the box". Je devrais peut-être bifurquer le compilateur et appliquer les correctifs. En bref, je ne pense pas que la commande make "test" fonction.
J'ai ouvert un ticket pour me rappeler de le faire :
https://github.com/spotlessmind1975/ugbasic/issues/171

L'erreur que je ne comprends pas, cependant, est l'erreur de syntaxe à la ligne 710. La commande que vous indiquez ne me semble pas avoir de différences par rapport à ce que j'attends. De plus, vous êtes à l'intérieur du module qui gère les "strings" dynamiques, il ne s'agit donc pas d'un code généré dynamiquement. À ce stade, je pense qu'il peut y avoir un problème CR et LF (comme tu le suggères bien). J'ai juste essayé de compiler avec la version Windows, et cela fonctionne.

Voici la version du compilateur que j'utilise :

Code : Tout sélectionner

asm6809 --version
asm6809 2.12
__sam__
Messages : 6366
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: ugBASIC est arrivé sur Olivetti Prodest PC128!

Message par __sam__ »

Ah oui serait bien un fork de usim qui contienne vos modifications en effet, car il est important de pouvoir tester les non-régressions.

L'examen de /tmp/out.asm montre pas mal d'endroits optimisables à la fois en taille et en vitesse dans le code des bibliothèques (non généré): J'ai trouvé par exemple pas mal d'endroits où l'usage de ",X++" et ",X+" et l'usage de X en compteur au lieu de U serait plus rapide (LEAX positionne le flag Z contrairement au LEAU, ce qui économise un CMPU #0. Du coup je me disais que je pourrais modifier en local le générateur pour mieux utiliser le 6809, mais il me faut assurer de ne rien casser, et donc être capable de lancer les tests de non-regression.

Sinon j'ai la même version de asm6809:

Code : Tout sélectionner

$ asm6809.exe --version
asm6809 2.12
Copyright (C) 2018 Ciaran Anscomb
License: GNU GPL version 3 or later <http://www.gnu.org/licenses/gpl-3.0.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Je l'ai récupérée du git indiqué sur cette page: https://www.6809.org.uk/asm6809/

Je vais refaire le test dans un environnement plus "Linux" car je pense que cygwin fait des choses étranges avec les fins de lignes ce qui peut conduire à un débordement de buffer.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
spotlessmind1975
Messages : 24
Inscription : 24 oct. 2021 15:47

Re: ugBASIC est arrivé sur Olivetti Prodest PC128!

Message par spotlessmind1975 »

Oui, tu as parfaitement raison. En fait, je m'excuse de ne pas y avoir pensé avant. Cependant, j'ai également obtenu le compilateur à partir de cette source, puis je l'ai compilé avec Linux (Ubuntu 20.10) et avec Windows (msys2-runtime 2.9.0-7). Avec le résultat, j'ai compilé les exemples de programmes et je n'ai eu aucun problème de syntaxe.

Voici la commande que j'ai utilisée pour compiler tous les exemples à partir de zéro :

Code : Tout sélectionner

make target=pc128op output=k7 clean all
Avec les tests par contre, je n'utilise pas Windows et donc je ne sais pas si ça marche ou pas. Je suis désolé!
Répondre