LocoPad, un éditeur de code basé sur le Web pour les développeurs CPC

Je me demandais juste… est-ce qu’il y a une limite à la taille du fichier .BAS que LocoPad enregistre sur un fichier .dsk ?

Lorsque j’essaie de lancer un truc comme le code BASIC de Sultan’s Maze, le fichier DISC.BAS résultant fait 16 Ko et ne contient qu’environ la moitié du code.

Ok, c’était un excellent retour (je ne l’avais pas testé avec des cas limites), et c’est effectivement un bug. Les données sont bien là, mais une seule entrée de répertoire a été écrite, ce qui la plafonne à 16 ko et ne chaîne pas le reste des blocs.

Retour à la case départ, j’ajoute ce correctif à la prochaine version.

Trop cool, j’ai hâte !

ROUND, REMAIN, WINDOW SWAP, ON BREAK GOSUB et ON BREAK STOP sont toutes disponibles dans le BASIC 1.0. À ma connaissance, la commande SWAP n’est pas utilisée seule.

Mise à jour LocoPad : Nouvelles fonctionnalités et corrections de bugs

Bon, après beaucoup d’efforts (et c’est la raison de mon absence de publications ces derniers temps), je peux enfin vous proposer la version suivante.

Les fonctionnalités suivantes ont été suggérées par quelqu’un qui souhaitait garder l’anonymat — aucune idée de pourquoi (tu te reconnaîtras :grin:), je vous laisse juges de leur utilité :

Nouveaux outils

  • Studio Sprite & UDG 8x8 : Éditeur de pixels visuel pour glycines et sprites, aperçu du redimensionnement en direct (1×/2×/4×), ET génération de code SYMBOL ou DATA en un clic.
  • Sound Studio : Synthétiseur 3 canaux avec panoramique, calculateur de hauteur/période, courbes de modulation d’enveloppe/hauteur (ENV/ENT), et export d’instructions SOUND. Quelques effets de base ont été ajoutés pour faire bonne mesure :smiley:
  • Calculateur de mode & coordonnées : Zone de dessin interactive pour tous les modes avec palette, mappage des cellules de texte LOCATE vers les coordonnées graphiques, et calculateur de décalage de base VRAM (&C000, &4000, &8000). Vraiment pas sûr de son bon fonctionnement car je ne peux pas le tester correctement, ne connaissant pas le flux de travail dans lequel il pourrait être utilisé (je pense avoir compris l’idée derrière, mais j’ai simplement implémenté la demande !)
  • Bibliothèque de extraits de code sélectionnés : Bibliothèque de référence recherchable couvrant les entrées manette, les interruptions trame (raster), les vecteurs du firmware et les appels disque AMSDOS. L’objectif est au mieux démonstratif — merci au même utilisateur anonyme de les avoir fournis, mais je ne les ai pas testés et ne peux pas les juger. Le fait est que nous pouvons ajouter ce genre de choses si le cœur nous en dit.

Aide au code & distinction des versions

  • Linter Locomotive BASIC : Vérification en temps réel de la plage/ordre de numérotation des lignes, de la limite de 255 caractères par ligne, des chaînes/parenthèses non fermées, des fautes de frappe sur les mots-clés, des boucles FOR/NEXT non fermées ou mal assorties, des STEP 0, des branches ouvertes (GOTO, GOSUB, RESTORE), et des limites de tableaux non déclarées (DIM). Y a-t-il d’autres vérifications que je devrais ajouter ?
  • Compatibilité BASIC 1.0 vs 1.1 (Corrigée) :
    • Merci à @Nich, j’ai vérifié à nouveau les manuels et corrigé la liste des commandes. ROUND, REMAIN, WINDOW SWAP, et ON BREAK étaient en fait bel et bien pris en charge par le BASIC 1.0 depuis le début (et SWAP isolé n’est pas un mot-clé Locomotive BASIC) (je pense avoir fait une erreur en compilant les listes json initiales).
    • Le linter et l’Inspecteur de Symboles ne ciblent désormais avec précision que les 7 vraies exclusivités du BASIC 1.1 : FRAME, FILL, COPYCHR$, DEC$, GRAPHICS PEN, GRAPHICS PAPER, et MASK.
    • Fournit des conseils de linter et des badges d’inspecteur avec des alternatives standard pour le 464 (par ex. CALL &BD19 pour FRAME).

Export & Partage

  • Export .SNA
  • Partage de lien en un clic : Encodez et partagez des programmes BASIC complets directement dans l’URL. Cela n’utilise aucun espace de stockage sur le serveur. Tout se passe dans l’URL avec un codage base64 compressé (deflate) de votre contenu. Par conséquent, il y a des problèmes inhérents liés à la longueur des URL. Si vous trouvez un moyen de le faire de manière plus efficace sans avoir besoin de comptes ou de stockage sur serveur, je serais trèèèès intéressé de vous lire !

Correction de bugs

  • Coupure DSK à 16 Ko : Merci de tester et de me faire un retour — je l’ai testé avec des données aléatoires et tout a été vérifié correctement pour moi. Je n’ai pas de listing aussi grand.

  • Plantage de la démo musicale : Correction d’un plantage dû à un argument incorrect dans le Projet 4, causé par un pas négatif invalide dans l’instruction ENV 1 (désolé pour la faute de frappe !).

…et quelques autres petites choses que j’oublie.

Absolument exceptionnel !!!

Tellement de super fonctionnalités.

Il semble que la limite des 16 Ko soit corrigée, car il a été possible de compiler et d’exécuter un fichier dsk à partir du code de Sultan’s Maze !

Un petit problème cependant. Le fichier BAS semble être sauvegardé sous forme non tokenisée, donc il met beaucoup de temps à charger.

Ah, je suis tombé sur ce problème en testant le correctif pour la coupure, et je pensais que le processus avait planté jusqu’à ce que je me penche dessus. Du coup, je me suis dit que c’était un problème pour mon « moi du futur » et j’en suis resté là :smiley:

Il faut vraiment que je me documente là-dessus, parce que je pensais que c’était plus simple que ce que j’ai réalisé par la suite. Si tu as des sources, n’hésite pas à me les partager :slight_smile:

PS : merci pour ces gentils mots :slight_smile:

PS2 : tu mets combien de temps à tourner Sultan’s Maze ?
PS3 : j’imagine qu’elle ne devrait pas s’appeler 1.0.2, mais ça a pris des proportions énormes une fois que j’ai commencé à corriger deux-trois trucs :smiley:

Pour réduire la taille de l’URL, je suppose que tu l’as déjà compressée au format zip ?

Aussi, pour réduire la taille globale du BASIC sur le CPC, tu pourrais peut-être ajouter une option « supprimer les commentaires » ?
Imagine :

10 REM First comment
20 A=10 : REM Initializer
30 GOSUB 1000
40 END: ' End of program
1000 REM SubRoutine
1010 FOR I=1 TO A:PRINT I:NEXT
1020 RETURN

pourrait être envoyé au CPC comme ceci :

20 A=10
30 GOSUB 1010
40 END
1010 FOR I=1 TO A:PRINT I:NEXT
1020 RETURN

Remarque que la ligne 30 a été modifiée comme par magie pour utiliser 1010 parce que la 1000 était un commentaire complet et qu’elle était utilisée dans une instruction GOTO, GOSUB ou THEN. Je ne me rappelle plus vraiment si le Locomotive BASIC accepte IF THEN 1000 ou pas…
Cette partie peut être laissée de côté si besoin : il suffit de garder les lignes de commentaire complètes ’ pour une gestion plus simple.

10 '
20 A=10
30 GOSUB 1000
40 END
1000 '
1010 FOR I=1 TO A:PRINT I:NEXT
1020 RETURN

J’ai créé un CPCBasicator qui sert à tokeniser du Basic ASCII depuis le Bloc-notes du PC. C’est écrit en Python, mais vous pouvez y piocher tout ce dont vous avez besoin.

Merci pour tes réponses, @SagaDS !

Reprenons-les une par une :

  1. Oui, l’URL a déjà été compressée en utilisant l’API native du navigateur CompressionStream('deflate') . Le Base64 a l’inconvénient inhérent d’introduire un surcoût d’environ 33 %. On pourrait utiliser le Base85 ou le Base91 pour une meilleure compression, mais ceux-ci introduisent des caractères %XX qui vont en réalité rallonger l’URL.
  2. Oui, supprimer les lignes REM ou ’ est facile. De plus, il existe déjà une fonction de renumérotation qui peut gérer les problèmes liés à la suppression complète de ces lignes (sinon, on pourrait transformer quelque chose comme « 10 REM ceci est un commentaire » en simplement « 10 ’ », ce qui permet de gagner des octets).
    1. Mais cela m’a fait penser qu’on pourrait peut-être créer un minificateur (minifier) BASIC plus complet. Comme supprimer les espaces inutiles, ou enchaîner les lignes courtes avec un « : ». Ou encore supprimer les lignes non référencées. Ce genre de choses (je ne vois rien d’autre pour l’instant, mais je suis sûr qu’il y en a).
  3. CPCBasicator : c’est super ! J’ai trouvé le script, est-ce qu’on pourrait l’utiliser tel quel dans LocoPad ? Je créditerai l’auteur, bien entendu !

Pour minifier encore plus, vous pouvez aussi renommer les variables avec une ou deux lettres.

Aucun problème pour utiliser mon script, vous pouvez me créditer ou non, ça m’est bien égal.
N’hésitez pas à le modifier si des problèmes surviennent. Tenez-moi juste au courant pour que je puisse mettre à jour le dépôt avec les correctifs. Et bien sûr, je vous aiderai aussi à résoudre les bugs :slight_smile:

Merci mec, tu viens de me faciliter tellement le travail :slightly_smiling_face:

Merci pour le partage de CPCBasicator.

Je ne vois qu’une introduction d’une phrase et la mention d’un commit, mais aucun code. Peux-tu vérifier, par exemple dans une session de navigation privée non authentifiée, s’il ne s’agit pas d’un problème de permissions ?

Il faut presque exactement 60 secondes à RUN"DISC" pour charger le jeu.

Si j’exporte le fichier DSK, que je le charge dans WinAPE, que je fais LOAD"DISC" puis SAVE"DISC", cela le sauvegarde sous forme tokenisée.

Ensuite, RUN"DISC" prend moins de 4 secondes.

Le projet est public et je peux accéder aux fichiers même sans être connecté… Bizarre.
Envoie-moi un MP pour qu’on regarde ça ensemble sans trop polluer le fil.

Voici le fichier Python si tu veux juste le jeter un œil.

CPCBasicator.zip (5,2 Ko)

@ervin, oui une autre façon de faire serait de sauvegarder l’ASCII dans un dsk / lancer l’émulation / ouvrir le BAS / sauvegarder (découpé en tokens) / quitter l’émulation / récupérer le nouveau dsk. Pas sûr que ce soit facile à faire avec l’émulateur par contre.

Tu peux partager le BAS/DSK de Sultan Maze ? Ce serait un bon test pour le moteur de minification…

Bien sûr !

sultan.zip (12,4 Ko)

sultan_untokenised.dsk (190,3 Ko)

sultan_tokenised.dsk (190,3 Ko)

Génial, merci !

Édit : je viens de jeter un œil, c’est assez impressionnant ce que tu peux faire avec cette quantité de code !

Ok, je viens de tester mes routines de minification sur Sultan’s Maze et j’ai obtenu une réduction de 43 % du nombre de lignes (659->375) et une réduction de la taille totale de 14,3 % (34 708->29 740 o).

Maintenant, il faut tester tout ça…

Si ça te va, @ervin, j’inclurai tes fichiers dans LocoPad sous forme de projet (aucune idée de leur statut ?).

Je suis aussi en train de déboguer mon code python avec sultan.bas…
Il faut que je travaille sur les variables qui utilisent « . » à l’intérieur. Je ne savais pas que c’était possible en Locomotive BASIC :slight_smile: Comme « ghost.drawn » : déjà corrigé.

Mais maintenant, je dois travailler sur des variables qui ressemblent à un vrai jeton : « next.f » (ça fonctionne partout sauf dans les conditions IF THEN… Ligne 5430