Derniers sujets
» Windows 10 DOSBOX & EUPHORIC
Aujourd'hui à 23:01 par maximus

» Blake's 7
Aujourd'hui à 16:55 par maximus

» Tyrann III - RPG Oric 2015
Aujourd'hui à 5:52 par didierv

» Capture d'écran (screenshot) en émulation
Hier à 14:39 par kenneth

» Orix : Thread de notification sur le développement
Hier à 10:56 par Jede

» L'immonde Docteur Kokus
Mar 17 Oct 2017 - 18:46 par Dom50

» Rencontre avec Emmanuel Viau (ERE informatique)
Mar 17 Oct 2017 - 18:17 par Dom50

» Organisation RAM vidéo
Mar 17 Oct 2017 - 14:26 par Davros

» OVERLAYS : est-ce accessible avec LCC65
Lun 16 Oct 2017 - 14:47 par Jede

» Holdies
Dim 15 Oct 2017 - 21:09 par Dbug

Qui est en ligne ?
Il y a en tout 3 utilisateurs en ligne :: 0 Enregistré, 1 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

Récupérer mon mot de passe

Statistiques
Nous avons 123 membres enregistrés
L'utilisateur enregistré le plus récent est james64

Nos membres ont posté un total de 5724 messages dans 419 sujets
Portail ORIC




Equivalent de la commande NEW du Basic

Voir le sujet précédent Voir le sujet suivant Aller en bas

Equivalent de la commande NEW du Basic

Message  Hialmar le Jeu 8 Mai 2014 - 18:07

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 ?
avatar
Hialmar
Admin

Messages : 815
Date d'inscription : 03/03/2014
Age : 47
Localisation : Toulouse

Revenir en haut Aller en bas

Re: Equivalent de la commande NEW du Basic

Message  assinie le Jeu 8 Mai 2014 - 19:33

L'adresse de la commande NEW est #C71B pour un Oric-1 et #C6F0 pour un Atmos.
Elle a 2 actions:

  1. 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)
  2. 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)
avatar
assinie

Messages : 171
Date d'inscription : 09/02/2014

Revenir en haut Aller en bas

Re: Equivalent de la commande NEW du Basic

Message  Hialmar le Jeu 8 Mai 2014 - 21:18

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 :
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.
avatar
Hialmar
Admin

Messages : 815
Date d'inscription : 03/03/2014
Age : 47
Localisation : Toulouse

Revenir en haut Aller en bas

Re: Equivalent de la commande NEW du Basic

Message  Hialmar le Jeu 8 Mai 2014 - 22:35

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.
avatar
Hialmar
Admin

Messages : 815
Date d'inscription : 03/03/2014
Age : 47
Localisation : Toulouse

Revenir en haut Aller en bas

Re: Equivalent de la commande NEW du Basic

Message  assinie le Ven 9 Mai 2014 - 0:03

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.
avatar
assinie

Messages : 171
Date d'inscription : 09/02/2014

Revenir en haut Aller en bas

Re: Equivalent de la commande NEW du Basic

Message  didierv le Ven 9 Mai 2014 - 5:33

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.
avatar
didierv

Messages : 490
Date d'inscription : 19/01/2014
Age : 54
Localisation : Nord de la France

http://www.dmacoco.fr

Revenir en haut Aller en bas

Re: Equivalent de la commande NEW du Basic

Message  Hialmar le Ven 9 Mai 2014 - 9:04

En mettant 0 en #87 ça marche Smile

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.
avatar
Hialmar
Admin

Messages : 815
Date d'inscription : 03/03/2014
Age : 47
Localisation : Toulouse

Revenir en haut Aller en bas

Re: Equivalent de la commande NEW du Basic

Message  Hialmar le Ven 9 Mai 2014 - 9:22

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.
avatar
Hialmar
Admin

Messages : 815
Date d'inscription : 03/03/2014
Age : 47
Localisation : Toulouse

Revenir en haut Aller en bas

Re: Equivalent de la commande NEW du Basic

Message  Hialmar le Ven 9 Mai 2014 - 11:30

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
avatar
Hialmar
Admin

Messages : 815
Date d'inscription : 03/03/2014
Age : 47
Localisation : Toulouse

Revenir en haut Aller en bas

Re: Equivalent de la commande NEW du Basic

Message  assinie le Ven 9 Mai 2014 - 11:46

D'après la table des symboles:

  • 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.
avatar
assinie

Messages : 171
Date d'inscription : 09/02/2014

Revenir en haut Aller en bas

Re: Equivalent de la commande NEW du Basic

Message  Hialmar le Ven 9 Mai 2014 - 11:52

Et ça marche Smile

Je vais re-tester avec le programme complet.
avatar
Hialmar
Admin

Messages : 815
Date d'inscription : 03/03/2014
Age : 47
Localisation : Toulouse

Revenir en haut Aller en bas

Re: Equivalent de la commande NEW du Basic

Message  Hialmar le Ven 9 Mai 2014 - 14:52

Le programme complet marche très bien.

Sur les conseils de Chema j'ai ajouté les octets #89 et #90 à ma sauvegarde.
avatar
Hialmar
Admin

Messages : 815
Date d'inscription : 03/03/2014
Age : 47
Localisation : Toulouse

Revenir en haut Aller en bas

Re: Equivalent de la commande NEW du Basic

Message  assinie le Ven 9 Mai 2014 - 15:02

Ok, bonne nouvelle  Smile 
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.
avatar
assinie

Messages : 171
Date d'inscription : 09/02/2014

Revenir en haut Aller en bas

Re: Equivalent de la commande NEW du Basic

Message  Hialmar le Ven 9 Mai 2014 - 15:06

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.
avatar
Hialmar
Admin

Messages : 815
Date d'inscription : 03/03/2014
Age : 47
Localisation : Toulouse

Revenir en haut Aller en bas

Re: Equivalent de la commande NEW du Basic

Message  Hialmar le Jeu 12 Juin 2014 - 10:12

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...
avatar
Hialmar
Admin

Messages : 815
Date d'inscription : 03/03/2014
Age : 47
Localisation : Toulouse

Revenir en haut Aller en bas

Re: Equivalent de la commande NEW du Basic

Message  assinie le Jeu 12 Juin 2014 - 23:26

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.
avatar
assinie

Messages : 171
Date d'inscription : 09/02/2014

Revenir en haut Aller en bas

Re: Equivalent de la commande NEW du Basic

Message  Hialmar le Ven 13 Juin 2014 - 8:58

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.
avatar
Hialmar
Admin

Messages : 815
Date d'inscription : 03/03/2014
Age : 47
Localisation : Toulouse

Revenir en haut Aller en bas

Re: Equivalent de la commande NEW du Basic

Message  Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum