Derniers sujets
Qui est en ligne ?
Il y a en tout 2 utilisateurs en ligne :: 0 Enregistré, 0 Invisible et 2 Invités Aucun
Le record du nombre d'utilisateurs en ligne est de 29 le Mer 25 Fév 2015 - 14:01
Connexion
Statistiques
Nous avons 241 membres enregistrésL'utilisateur enregistré le plus récent est ben_frog
Nos membres ont posté un total de 8921 messages dans 811 sujets
Equivalent de la commande NEW du Basic
3 participants
Forum Oric :: Forums :: Forum Public :: Assembleur
Page 1 sur 1
Equivalent de la commande NEW du Basic
J'ai un programme écrit en C et ASM qui démarre, via Sedoric, un programme écrit en Basic (et vice-versa - en fait ça fait des aller-retours).
Mon problème c'est qu'apparemment je bousille la gestion des variables et des tableaux.
Donc il faudrait que je ré-initialise ça avant de charger le programme Basic avec Sedoric.
En fait il me faudrait donc l'équivalent de la commande NEW. Est-ce qu'il y a ça quelque part en ROM sous forme de routine que je pourrais appeler ?
Sinon que devrais-je faire pour faire l'équivalent en ASM ?
Mon problème c'est qu'apparemment je bousille la gestion des variables et des tableaux.
Donc il faudrait que je ré-initialise ça avant de charger le programme Basic avec Sedoric.
En fait il me faudrait donc l'équivalent de la commande NEW. Est-ce qu'il y a ça quelque part en ROM sous forme de routine que je pourrais appeler ?
Sinon que devrais-je faire pour faire l'équivalent en ASM ?
Hialmar- Admin
- Messages : 840
Date d'inscription : 03/03/2014
Age : 53
Localisation : Toulouse
Re: Equivalent de la commande NEW du Basic
L'adresse de la commande NEW est #C71B pour un Oric-1 et #C6F0 pour un Atmos.
Elle a 2 actions:
Elle a 2 actions:
- Ajuster le pointeur de fin du programme (#9C-9D) et mettre 2 octes nuls au début du programme (ce qui explique qu'on puisse récupérer un programme après un NEW)
- Effacer les variables (exécution de la comande CLEAR)
Dernière édition par assinie le Jeu 8 Mai 2014 - 19:37, édité 1 fois (Raison : Correction adresse du pointeur de fin de programme)
assinie- Messages : 271
Date d'inscription : 09/02/2014
Re: Equivalent de la commande NEW du Basic
Merci.
J'ai essayé de l'appeler mais ça continue de faire n'importe quoi.
Je tombe sur une "Formula too complex error" alors que je fais que faire ça :
Je me demande bien ce que je peux flinguer d'autre avec mon programme C.
Si vous avez une idée je suis preneur.
J'ai essayé de l'appeler mais ça continue de faire n'importe quoi.
Je tombe sur une "Formula too complex error" alors que je fais que faire ça :
- Code:
41 PRINT PEEK(#9D) PEEK(#9C)
42 PRINT PEEK(#9F) PEEK(#9E)
43 PRINT PEEK(#A1) PEEK(#A0)
44 PRINT PEEK(#A3) PEEK(#A2)
45 PRINT PEEK(#A5) PEEK(#A4)
46 PRINT PEEK(#A7) PEEK(#A6)
49 END
Je me demande bien ce que je peux flinguer d'autre avec mon programme C.
Si vous avez une idée je suis preneur.
Hialmar- Admin
- Messages : 840
Date d'inscription : 03/03/2014
Age : 53
Localisation : Toulouse
Re: Equivalent de la commande NEW du Basic
En faisant des essais/erreurs je suis parvenu à localiser la source du problème.
Ca vient des routines de tracé de lignes optimisées qui sont disponibles sur le SVN de defense-force :
http://miniserve.defence-force.org/svn/public/oric/routines/rasterization/linebench/line8.s
Je suppose que je vais devoir les abandonner pour l'instant.
C'est dommage car elles sont deux fois plus rapides que le DRAW de la ROM.
Ca vient des routines de tracé de lignes optimisées qui sont disponibles sur le SVN de defense-force :
http://miniserve.defence-force.org/svn/public/oric/routines/rasterization/linebench/line8.s
Je suppose que je vais devoir les abandonner pour l'instant.
C'est dommage car elles sont deux fois plus rapides que le DRAW de la ROM.
Hialmar- Admin
- Messages : 840
Date d'inscription : 03/03/2014
Age : 53
Localisation : Toulouse
Re: Equivalent de la commande NEW du Basic
J'ai eu un truc dans ce genre avec leFig-Forth que je l'avais modifié pour pouvoir utiliser un lecteur Jasmin.
Au retour vers le BASIC, j'avais de temps en temps le même message que toi et un reset n'y changeait rien (le message s'affichait parfois sans arrêt)
J'ai fini par trouver que c'était du au fait que le Forth utilisait la page zéro pour sa pile et pouvait écraser les pointeurs de pile BASIC en #85-87 (suivant le nombre de valeur empilées)
Le problème était résolu en mettant un 0 en #87 avant le retour au BASIC, ce qui est fait lors de l'initialisation de l'Oric.
Je ne sais pas si les programmes générés par l'OSDK touchent à cette partie de la mémoire, mais c'est peut être une piste.
Au retour vers le BASIC, j'avais de temps en temps le même message que toi et un reset n'y changeait rien (le message s'affichait parfois sans arrêt)
J'ai fini par trouver que c'était du au fait que le Forth utilisait la page zéro pour sa pile et pouvait écraser les pointeurs de pile BASIC en #85-87 (suivant le nombre de valeur empilées)
Le problème était résolu en mettant un 0 en #87 avant le retour au BASIC, ce qui est fait lors de l'initialisation de l'Oric.
Je ne sais pas si les programmes générés par l'OSDK touchent à cette partie de la mémoire, mais c'est peut être une piste.
assinie- Messages : 271
Date d'inscription : 09/02/2014
Re: Equivalent de la commande NEW du Basic
OSDK Utilisa la page 0
Voir http://osdk.defence-force.org/index?page=documentation&subpage=zeropage
mais $9A ne semble pas atteint
A voir s'il n'affecte pas un autre élément du basic.
Voir http://osdk.defence-force.org/index?page=documentation&subpage=zeropage
mais $9A ne semble pas atteint
A voir s'il n'affecte pas un autre élément du basic.
Re: Equivalent de la commande NEW du Basic
En mettant 0 en #87 ça marche
Merci beaucoup assinie.
Si vous voulez voir ce qui se passe, j'ai mis en place un petit exemple ici :
http://torguet.net/Hialmar/OSDK/
* http://torguet.net/Hialmar/OSDK/C2BasicTest.zip contient le projet OSDK.
* il vous faudra aussi soit
http://torguet.net/Hialmar/OSDK/bas2tap.exe
ou
http://torguet.net/Hialmar/OSDK/tap2dsk.exe
ou lancer le programme namer.com du dsk pour renommer le programme basic.
Merci beaucoup assinie.
Si vous voulez voir ce qui se passe, j'ai mis en place un petit exemple ici :
http://torguet.net/Hialmar/OSDK/
* http://torguet.net/Hialmar/OSDK/C2BasicTest.zip contient le projet OSDK.
* il vous faudra aussi soit
http://torguet.net/Hialmar/OSDK/bas2tap.exe
ou
http://torguet.net/Hialmar/OSDK/tap2dsk.exe
ou lancer le programme namer.com du dsk pour renommer le programme basic.
Hialmar- Admin
- Messages : 840
Date d'inscription : 03/03/2014
Age : 53
Localisation : Toulouse
Re: Equivalent de la commande NEW du Basic
Bon j'ai été trop rapide.
Maintenant ça plante beaucoup plus loin : quand je quitte le programme Basic (le vrai) et qu'il essaie de regarder combien il reste de mémoire.
Il essaie d'exécuter un opcode #72 en #20C9.
Il écrase probablement autre chose.
J'ai essayé de modifier mon petit programme de test mais malheureusement en faisant le
48 PRINT FRE("");" Octets"
Ca marche quand même.
Il doit falloir remplir plus la mémoire ou alors il y a autre chose qui cloche dans mon programme C.
Je vais essayer de trouver un programme minimaliste pour ça.
Maintenant ça plante beaucoup plus loin : quand je quitte le programme Basic (le vrai) et qu'il essaie de regarder combien il reste de mémoire.
Il essaie d'exécuter un opcode #72 en #20C9.
Il écrase probablement autre chose.
J'ai essayé de modifier mon petit programme de test mais malheureusement en faisant le
48 PRINT FRE("");" Octets"
Ca marche quand même.
Il doit falloir remplir plus la mémoire ou alors il y a autre chose qui cloche dans mon programme C.
Je vais essayer de trouver un programme minimaliste pour ça.
Hialmar- Admin
- Messages : 840
Date d'inscription : 03/03/2014
Age : 53
Localisation : Toulouse
Re: Equivalent de la commande NEW du Basic
Voilà j'en ai fait un.
Il est disponible ici :
http://torguet.net/Hialmar/OSDK/C2BasicTest.zip
(comme avant si vous voulez compiler il faut soit utiliser NAMER.COM avant d'exécuter ou prendre mes versions de tap2dsk ou bas2tap qui renomment correctement les fichiers basic).
Il ne fait pas exactement la même chose que mon programme complet mais il fait une boucle infinie autour de #D6DA.
Ce qui prouve qu'il y a un pb.
Au niveau du C, je trace une ligne diagonale (ça utilise du code différent des lignes horizontales et verticales qui faisaient planter la pile).
Si on met en commentaire le dernier DrawLine8(); (ligne 86) ça marche.
Edit: je viens de le régénérer car j'avais oublié de mettre à jour la map du programme.
La map est ici au cas où ça suffirait pour isoler le pb : http://torguet.net/Hialmar/OSDK/map.htm
Il est disponible ici :
http://torguet.net/Hialmar/OSDK/C2BasicTest.zip
(comme avant si vous voulez compiler il faut soit utiliser NAMER.COM avant d'exécuter ou prendre mes versions de tap2dsk ou bas2tap qui renomment correctement les fichiers basic).
Il ne fait pas exactement la même chose que mon programme complet mais il fait une boucle infinie autour de #D6DA.
Ce qui prouve qu'il y a un pb.
Au niveau du C, je trace une ligne diagonale (ça utilise du code différent des lignes horizontales et verticales qui faisaient planter la pile).
Si on met en commentaire le dernier DrawLine8(); (ligne 86) ça marche.
Edit: je viens de le régénérer car j'avais oublié de mettre à jour la map du programme.
La map est ici au cas où ça suffirait pour isoler le pb : http://torguet.net/Hialmar/OSDK/map.htm
Hialmar- Admin
- Messages : 840
Date d'inscription : 03/03/2014
Age : 53
Localisation : Toulouse
Re: Equivalent de la commande NEW du Basic
D'après la table des symboles:
Il faudrait faire un test
Je pense que la meilleure solution serait la seconde pour éviter de perdre en performance (une instruction du type memcpy devrait faire l'affaire)
Attention, si tu rajoutes des variables, la zone à sauvegarder sera plus grande.
Si cela résoud le problème, il restera à déterminer une zone mémoire utilisable pour la sauvegarde.
- OSDK utilise les octets de #50 à #7B ce qui ne devrait pas poser trop de problèmes sauf si on veut exécuter une commande de plus 25 octets (il s'agit d'une partie du tampon clavier)
- Ton programme utilise les octets de #7C à #88, le tampon clavier va jusqu'en #83
Il faudrait faire un test
- soit en déplaçant les variables de ton programme, la suppression de la directive .zero dans line8.s devrait faire l'affaire
- soit en copiant quelque part les octets de #84 à #88 au début du programme et en les retaurant juste avant l'appel à SwitchToCommand.
Je pense que la meilleure solution serait la seconde pour éviter de perdre en performance (une instruction du type memcpy devrait faire l'affaire)
Attention, si tu rajoutes des variables, la zone à sauvegarder sera plus grande.
Si cela résoud le problème, il restera à déterminer une zone mémoire utilisable pour la sauvegarde.
assinie- Messages : 271
Date d'inscription : 09/02/2014
Re: Equivalent de la commande NEW du Basic
Et ça marche
Je vais re-tester avec le programme complet.
Je vais re-tester avec le programme complet.
Hialmar- Admin
- Messages : 840
Date d'inscription : 03/03/2014
Age : 53
Localisation : Toulouse
Re: Equivalent de la commande NEW du Basic
Le programme complet marche très bien.
Sur les conseils de Chema j'ai ajouté les octets #89 et #90 à ma sauvegarde.
Sur les conseils de Chema j'ai ajouté les octets #89 et #90 à ma sauvegarde.
Hialmar- Admin
- Messages : 840
Date d'inscription : 03/03/2014
Age : 53
Localisation : Toulouse
Re: Equivalent de la commande NEW du Basic
Ok, bonne nouvelle
C'est bizarre pour les emplacements #89 et #90 je ne les ai pas trouvé dans la table des symboles... Il s'agit bien de 2 octets qui ne se suivent pas?
Je pense qu'on pourrait se passer de cette copie mais il faudrait préciser les emplacements des différentes variables.
De mémoire, il y a de la place disponible au début de la page zéro, à voir si elle n'est pas utilisée par Sedoric.
C'est bizarre pour les emplacements #89 et #90 je ne les ai pas trouvé dans la table des symboles... Il s'agit bien de 2 octets qui ne se suivent pas?
Je pense qu'on pourrait se passer de cette copie mais il faudrait préciser les emplacements des différentes variables.
De mémoire, il y a de la place disponible au début de la page zéro, à voir si elle n'est pas utilisée par Sedoric.
assinie- Messages : 271
Date d'inscription : 09/02/2014
Re: Equivalent de la commande NEW du Basic
D'après Geoff Phillips ( http://home.btconnect.com/geffers/files/chap5.htm ) voilà ce qui est stocké là :
#86 – Address of last temporary string.
#88 – #90 – A table of temporary strings.
En suivant les conseils de Chema j'ai essayé de remplacer les déclarations de variables par des define :
;save_a .dsb 1
;curBit .dsb 1
;chunk .dsb 1
;lastSum .dsb 1
#define save_a $00
#define curBit $01
#define chunk $02
#define lastSum $03
Pour l'instant ça fonctionne sans problème.
J'espère effectivement que je n'écrase pas des données de Sedoric.
Peut-être que je pourrais aussi sauver ces 4 octets et les restaurer avant d'appeler des commandes Sedoric.
#86 – Address of last temporary string.
#88 – #90 – A table of temporary strings.
En suivant les conseils de Chema j'ai essayé de remplacer les déclarations de variables par des define :
;save_a .dsb 1
;curBit .dsb 1
;chunk .dsb 1
;lastSum .dsb 1
#define save_a $00
#define curBit $01
#define chunk $02
#define lastSum $03
Pour l'instant ça fonctionne sans problème.
J'espère effectivement que je n'écrase pas des données de Sedoric.
Peut-être que je pourrais aussi sauver ces 4 octets et les restaurer avant d'appeler des commandes Sedoric.
Hialmar- Admin
- Messages : 840
Date d'inscription : 03/03/2014
Age : 53
Localisation : Toulouse
Re: Equivalent de la commande NEW du Basic
J'ai peut-être encore des problèmes avec mon passage C/ASM vers Basic.
On a des OUT OF MEMORY ERRORs aléatoires.
Est-ce que ça peut venir de la pile ?
Je pensais que ça pouvait venir des chaines de caractères en Basic et j'ai donc rajouté des FRE("") dans la boucle principale du Basic mais bon si vous avez d'autres idées...
On a des OUT OF MEMORY ERRORs aléatoires.
Est-ce que ça peut venir de la pile ?
Je pensais que ça pouvait venir des chaines de caractères en Basic et j'ai donc rajouté des FRE("") dans la boucle principale du Basic mais bon si vous avez d'autres idées...
Hialmar- Admin
- Messages : 840
Date d'inscription : 03/03/2014
Age : 53
Localisation : Toulouse
Re: Equivalent de la commande NEW du Basic
Si tu as ajouté des variables à ton programme depuis la dernière fois, il est possible que tu écrases les pointeurs qui gèrent les zones mémoire contenant les variables.
Il faudrait vérifier ça dans la map générée par l'OSDK.
Les adresses en questions vont de #9A à #A7:
#9A-9B: Pointeur vers l'adresse de début du programme BASIC
#9C-9D: Pointeur vers l'adresse de fin du programme BASIC ( début des variables )
#9E-9F: Pointeur vers l'adresse de début des tableaux
#A0-A1: Pointeur vers l'adresse de fin des tableaux
#A2-A3: Pointeur vers l'adresse de début des chaines
#A4-A5: Pointeur vers l'adresse de fin des chaines
#A6-A7: Pointeur vers le haut de la mémoire ( argument de la commande HIMEM )
Peut-être que certaines sont modifiées par ton programme C (avec un peu de chance quelque part du côté de #A6-A7)
Sinon je ne vois pas d'autres zones qui pourraient provoquer ce message.
Il faudrait vérifier ça dans la map générée par l'OSDK.
Les adresses en questions vont de #9A à #A7:
#9A-9B: Pointeur vers l'adresse de début du programme BASIC
#9C-9D: Pointeur vers l'adresse de fin du programme BASIC ( début des variables )
#9E-9F: Pointeur vers l'adresse de début des tableaux
#A0-A1: Pointeur vers l'adresse de fin des tableaux
#A2-A3: Pointeur vers l'adresse de début des chaines
#A4-A5: Pointeur vers l'adresse de fin des chaines
#A6-A7: Pointeur vers le haut de la mémoire ( argument de la commande HIMEM )
Peut-être que certaines sont modifiées par ton programme C (avec un peu de chance quelque part du côté de #A6-A7)
Sinon je ne vois pas d'autres zones qui pourraient provoquer ce message.
assinie- Messages : 271
Date d'inscription : 09/02/2014
Re: Equivalent de la commande NEW du Basic
Non je ne monte pas au dessus de $84.
Bon je suppose que c'est parce que je consomme un peu plus de mémoire que Maximus.
Au pire je rajouterais un GRAB en début de programme et un RELEASE à la fin.
Merci pour ton aide.
Bon je suppose que c'est parce que je consomme un peu plus de mémoire que Maximus.
Au pire je rajouterais un GRAB en début de programme et un RELEASE à la fin.
Merci pour ton aide.
Hialmar- Admin
- Messages : 840
Date d'inscription : 03/03/2014
Age : 53
Localisation : Toulouse
Sujets similaires
» [PROBLEME] Commande input et générateur aléatoire
» basic & lib ASM___[RESOLU]
» Le Basic a 50 ans
» Programmation BASIC
» Problème sur mix BASIC / ASM
» basic & lib ASM___[RESOLU]
» Le Basic a 50 ans
» Programmation BASIC
» Problème sur mix BASIC / ASM
Forum Oric :: Forums :: Forum Public :: Assembleur
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|
Jeu 21 Mar 2024 - 8:51 par Dom50
» carte mère Oric (re)tracée
Mar 5 Mar 2024 - 18:54 par kenneth
» Meurtre à Grande Vitesse
Dim 25 Fév 2024 - 5:09 par Iurius
» ORIC-1 sur LE BON COIN
Ven 23 Fév 2024 - 23:01 par Mcar
» ORIC ATMOS sur LE BON COIN
Dim 4 Fév 2024 - 12:06 par kiwilevrai
» Problème d'affichage des couleurs avec un Oric Atmos
Sam 27 Jan 2024 - 1:26 par pierbail
» Bienvenue dans le Forum des Oriciens
Mar 9 Jan 2024 - 12:33 par Dom50
» Rencontre avec Laurant Weill, co-fondateur de Loriciel, et mon garçon de 12 ans
Ven 29 Déc 2023 - 14:13 par Arcade-des-Monts
» Bonnes fêtes
Mar 26 Déc 2023 - 10:21 par Dom50
» Murders in Venice / Meutres à Venise
Sam 18 Nov 2023 - 22:44 par retroric
» Un clavier PS/2 pour tester un ORIC
Dim 27 Aoû 2023 - 9:49 par Voyageur
» Disquette 3" Sedoric
Mar 1 Aoû 2023 - 14:22 par AtomeX
» faire un 6502 avec des phototransistor
Dim 16 Juil 2023 - 17:26 par Voyageur
» Oricutron linux et DSK
Jeu 29 Juin 2023 - 18:34 par Voyageur
» No Problem !
Dim 25 Juin 2023 - 17:53 par Voyageur