Derniers sujets
Qui est en ligne ?
Il y a en tout 1 utilisateur en ligne :: 0 Enregistré, 0 Invisible et 1 Invité Aucun
Le record du nombre d'utilisateurs en ligne est de 29 le Mer 25 Fév 2015 - 14:01
Connexion
Statistiques
Nous avons 242 membres enregistrésL'utilisateur enregistré le plus récent est AIRBUS44
Nos membres ont posté un total de 8922 messages dans 811 sujets
Programmation BASIC
+4
Zodiac
kenneth
Dom50
maximus
8 participants
Forum Oric :: Forums :: Forum Public :: BASIC
Page 2 sur 3
Page 2 sur 3 • 1, 2, 3
Re: Programmation BASIC
Bonjour,
Les adresses sont uniquement nécessaires lorsqu'il s'agit de programmes en langage machine.
J'avais oublié de le préciser
Bon courage et bonne transformation .TAP en .COM
A plus
Les adresses sont uniquement nécessaires lorsqu'il s'agit de programmes en langage machine.
J'avais oublié de le préciser
Bon courage et bonne transformation .TAP en .COM
A plus
kiwilevrai- Messages : 263
Date d'inscription : 11/03/2014
Localisation : Nord
Re: Programmation BASIC
Ha Ok merci bien
Il ne faut pas hésiter à m'expliquer en détail, de plus je suis sur que d'autres apprécieront
Il ne faut pas hésiter à m'expliquer en détail, de plus je suis sur que d'autres apprécieront
Re: Programmation BASIC
Bine le bonjour, est il possibe de stocker des valeurs numériques avec POKE ? j'essaie de stocker les valeurs du labyrinthe directement en mémoire, mais j'ai ILLEGAL QUANTITY ERROR en voulant mettre -1
Merci
Merci
Re: Programmation BASIC
Tu peux pas stocker de valeurs négatives avec des POKE donc soit tu décales tout de 1, -1 devient 0, 0 devient 1...
Ou alors tu le code de façon standard en complément à deux mais du coup ton Max sera à 127 sur un octet au lieu de 255 et quand tu fais un PEEK tu es obligé de faire 128 - la valeur peekée.
PS : c'est dimanche matin donc je suis un peu rouillé et si ça se trouve l'opération est un peu différente mais c'est l'idée.
Oui je me suis bien planté, si tu veux le faire correctement il faut faire ça :
http://fr.wikipedia.org/wiki/Complément_à_deux
Ou alors tu le code de façon standard en complément à deux mais du coup ton Max sera à 127 sur un octet au lieu de 255 et quand tu fais un PEEK tu es obligé de faire 128 - la valeur peekée.
PS : c'est dimanche matin donc je suis un peu rouillé et si ça se trouve l'opération est un peu différente mais c'est l'idée.
Oui je me suis bien planté, si tu veux le faire correctement il faut faire ça :
http://fr.wikipedia.org/wiki/Complément_à_deux
Hialmar- Admin
- Messages : 840
Date d'inscription : 03/03/2014
Age : 54
Localisation : Toulouse
Re: Programmation BASIC
Bon j'ai essayé de faire du complément à 2 avec le BASIC Oric et c'est clairement galère puisqu'on a rien pour faire de l'arithmétique binaire.
Je te conseille plutôt de trouver tes valeurs min (exemple -10) et max (exemple 100) et de faire comme ça :
Si V contient la valeur a stocker, tu poke V-min
Ensuite après le peek tu ajoute min.
Dans mon exemple ça donne des poke adr,V+10 et des peek(adr)-10.
Attention de bien vérifier que max-min+1<=255 sinon tu va te reprendre une ILLEGAL QUANTITY ERROR.
Si tu veux des valeurs plus grandes il te faut faire avec des deek et des doke mais si ton but est d'économiser de la mémoire ça va pas être très utile.
Je te conseille plutôt de trouver tes valeurs min (exemple -10) et max (exemple 100) et de faire comme ça :
Si V contient la valeur a stocker, tu poke V-min
Ensuite après le peek tu ajoute min.
Dans mon exemple ça donne des poke adr,V+10 et des peek(adr)-10.
Attention de bien vérifier que max-min+1<=255 sinon tu va te reprendre une ILLEGAL QUANTITY ERROR.
Si tu veux des valeurs plus grandes il te faut faire avec des deek et des doke mais si ton but est d'économiser de la mémoire ça va pas être très utile.
Hialmar- Admin
- Messages : 840
Date d'inscription : 03/03/2014
Age : 54
Localisation : Toulouse
Re: Programmation BASIC
Il faut etre sur qu'il n'y ait pas de valeurs décimales, sinon tout ce qui se trouve derriere la virgule disparait. Dans le cas obligé:
pour stocker V=3.22 multiplier par 100 puis le rediviser au moment de le récuperer. Comme la valeur dépasse 255, je la place dans un double octet avec DOKE
DOKE ADR,V*100
pour lire la valeur
V=DEEK(ADR)/100
Si je prends l'exemple le plus tordu avec des valeurs négatives, décimales et grandes en suivant le conseil de Hialmar
V=-300.22
DOKE ADR,V*100+32768
Pour lire la valeur
V=(DEEK(ADR)-32768)/100
Avec ca on peut gerer de -327.68 a +327.67
A plus
pour stocker V=3.22 multiplier par 100 puis le rediviser au moment de le récuperer. Comme la valeur dépasse 255, je la place dans un double octet avec DOKE
DOKE ADR,V*100
pour lire la valeur
V=DEEK(ADR)/100
Si je prends l'exemple le plus tordu avec des valeurs négatives, décimales et grandes en suivant le conseil de Hialmar
V=-300.22
DOKE ADR,V*100+32768
Pour lire la valeur
V=(DEEK(ADR)-32768)/100
Avec ca on peut gerer de -327.68 a +327.67
A plus
kenneth- Modérateur
- Messages : 879
Date d'inscription : 13/01/2013
Age : 56
Localisation : 63
Re: Programmation BASIC
Ah oui c'est vrai j'avais supposé que tu ne gérais que des entiers.
Hialmar- Admin
- Messages : 840
Date d'inscription : 03/03/2014
Age : 54
Localisation : Toulouse
Re: Programmation BASIC
Je suis en train de lire le bouquin de Geoff Phillips et c'est super intéressant :
http://home.btconnect.com/geffers/files/contents.htm
Pour les problèmes d'optimisation mémoire il y a quelques infos là dedans :
http://home.btconnect.com/geffers/files/chap2.htm
En particulier, il dit que les variables entières ne prennent pas moins de place que les variables numériques (7 octets dans les deux cas).
Pour avoir un gain de place il faut faire des tableaux et là on passe à 2 octets par "case" du tableau ce qui est bien plus efficace. Du moins si on en a beaucoup car il y a un entête de 5 octets + 2 octets par dimension donc ça commence à être intéressant à 3 car on remplace 3*7 = 21 octets par 5 + 2 + 2*3 = 13 octets.
Bien sûr stocker avec un POKE dans un octet c'est encore mieux mais moins pratique.
http://home.btconnect.com/geffers/files/contents.htm
Pour les problèmes d'optimisation mémoire il y a quelques infos là dedans :
http://home.btconnect.com/geffers/files/chap2.htm
En particulier, il dit que les variables entières ne prennent pas moins de place que les variables numériques (7 octets dans les deux cas).
Pour avoir un gain de place il faut faire des tableaux et là on passe à 2 octets par "case" du tableau ce qui est bien plus efficace. Du moins si on en a beaucoup car il y a un entête de 5 octets + 2 octets par dimension donc ça commence à être intéressant à 3 car on remplace 3*7 = 21 octets par 5 + 2 + 2*3 = 13 octets.
Bien sûr stocker avec un POKE dans un octet c'est encore mieux mais moins pratique.
Hialmar- Admin
- Messages : 840
Date d'inscription : 03/03/2014
Age : 54
Localisation : Toulouse
Re: Programmation BASIC
^^ Oui c'est sûr qu'il faudrait potasser, mais j'ai la flemme
Par contre oui tout ce qui est en DATA peut être stocké dans des tableaux et utilisé avec STORE et RECALL (merci Chloé)
Quelqu'un sait il comment effacer le CAPS en haut à droite, mais sans passer en minuscule ?
Par contre oui tout ce qui est en DATA peut être stocké dans des tableaux et utilisé avec STORE et RECALL (merci Chloé)
Quelqu'un sait il comment effacer le CAPS en haut à droite, mais sans passer en minuscule ?
Re: Programmation BASIC
POKE48035,0maximus a écrit:
Quelqu'un sait il comment effacer le CAPS en haut à droite, mais sans passer en minuscule ?
kenneth- Modérateur
- Messages : 879
Date d'inscription : 13/01/2013
Age : 56
Localisation : 63
Re: Programmation BASIC
Attention Maxi,
si tu utilises STORE et RECALL pour sauver des variables ton jeu ne tournera pas sur disquette. Ces deux instructions ne sont pas gérées par SEDORIC.
si tu utilises STORE et RECALL pour sauver des variables ton jeu ne tournera pas sur disquette. Ces deux instructions ne sont pas gérées par SEDORIC.
Dom50- Messages : 916
Date d'inscription : 06/12/2012
Localisation : Normandie
Re: Programmation BASIC
flute, crotte de bique et caca boudin, ...
j'ai aucune pratique de sédoric (n'ayant jamais eu de lecteur de disquette)
y a t il un équivalent qui permet de ne pas mettre tous les datas dans le programme principal ? mais à part, afin d'économiser de la mémoire
j'ai aucune pratique de sédoric (n'ayant jamais eu de lecteur de disquette)
y a t il un équivalent qui permet de ne pas mettre tous les datas dans le programme principal ? mais à part, afin d'économiser de la mémoire
Re: Programmation BASIC
j'ai testé un truc qui a l'air de marcher. Je te le livre tel quel.
Ecrire un premier programme BASIC pour créer les variables. Pour gagner réellement de la place comme le disait Hialmar, il vaut mieux des variables entières (%).
(par exemple)
10 DIMA%(10,10),B%(25)
20 FORI=0TO10
25 FORJ=0TO10
30 A%(I,J)=I*J (c'est un exemple, tu peux mettre ici une série de DATAet un READ)
40 NEXTJ,I
60 FORI=0TO25
70 B%(I)=16 (encore un exemple initialisation à une valeur constante)
75 NEXT
80 SAVEO"DATA.DAT",A DEEK(#9E),E DEEK(#A0) (sauve d'un coup la zone mémoire qui contient les valeurs des deux tableaux)
Pour comprendre ce bout de listing il faut savoir que les tableaux sont stokés entre les adresses contenues dans $9E-$9F (début des tableaux) et $A0-$A1 (fin des tableaux)
Donc, on crée les tableaux normalement et on sauve sur disquette, la zonne mémoire correspondante.
Dans le programme utilisateur ci dessous:
10 DIMA%(10,10),B%(25)
20 LOAD"DATA.DAT",A DEEK(#9E)
30 PRINTB%(22)
40 PRINTA%(5,9)
On crée les tableaux par une suite d'instructions DIM identique à celle du premier programme.
puis immediatement derrière on charge les données, mais c'est là l'astuce, à la valeur actuelle (correspondant à CE listing) de l'adresse de début des tableaux. D'où le DEEK(#9E) après le LOAD.
Ca à l'air de marcher
Après l'excution du premier programme les tableaux sauvés sont entre $05AB et $06E1.
Ils sont rechargés dans le deuxième entre $054E et $0684.
Les deux PRINT donnent bien 16 et 45 ....
Ecrire un premier programme BASIC pour créer les variables. Pour gagner réellement de la place comme le disait Hialmar, il vaut mieux des variables entières (%).
(par exemple)
10 DIMA%(10,10),B%(25)
20 FORI=0TO10
25 FORJ=0TO10
30 A%(I,J)=I*J (c'est un exemple, tu peux mettre ici une série de DATAet un READ)
40 NEXTJ,I
60 FORI=0TO25
70 B%(I)=16 (encore un exemple initialisation à une valeur constante)
75 NEXT
80 SAVEO"DATA.DAT",A DEEK(#9E),E DEEK(#A0) (sauve d'un coup la zone mémoire qui contient les valeurs des deux tableaux)
Pour comprendre ce bout de listing il faut savoir que les tableaux sont stokés entre les adresses contenues dans $9E-$9F (début des tableaux) et $A0-$A1 (fin des tableaux)
Donc, on crée les tableaux normalement et on sauve sur disquette, la zonne mémoire correspondante.
Dans le programme utilisateur ci dessous:
10 DIMA%(10,10),B%(25)
20 LOAD"DATA.DAT",A DEEK(#9E)
30 PRINTB%(22)
40 PRINTA%(5,9)
On crée les tableaux par une suite d'instructions DIM identique à celle du premier programme.
puis immediatement derrière on charge les données, mais c'est là l'astuce, à la valeur actuelle (correspondant à CE listing) de l'adresse de début des tableaux. D'où le DEEK(#9E) après le LOAD.
Ca à l'air de marcher
Après l'excution du premier programme les tableaux sauvés sont entre $05AB et $06E1.
Ils sont rechargés dans le deuxième entre $054E et $0684.
Les deux PRINT donnent bien 16 et 45 ....
Dom50- Messages : 916
Date d'inscription : 06/12/2012
Localisation : Normandie
Re: Programmation BASIC
Zut j'avais raté ton message Domi
Merci beaucoup, j'en prends bonne note, il me faudra bien abandonner STORE/RECALL pour la version finale, mais pour le moment c'est plus simple pour moi d'utiliser les versions K7, car l'OSDK produit des fichiers TAP, rendez vous donc à la fin dans ...?? xx mois pour la version disquette
Merci beaucoup, j'en prends bonne note, il me faudra bien abandonner STORE/RECALL pour la version finale, mais pour le moment c'est plus simple pour moi d'utiliser les versions K7, car l'OSDK produit des fichiers TAP, rendez vous donc à la fin dans ...?? xx mois pour la version disquette
Re: Programmation BASIC
Je suis en train de réfléchir au passage du jeu au format disquette et je reviens sur ce message.
Le problème c'est qu'il faudrait sauver les tableaux indépendamment les uns des autres (comme le font STORE et RECALL).
Est-ce que quelqu'un à une idée de comment faire pour récupérer l'adresse de début et celle de fin d'un tableau ?
Je peux calculer tout ça à la main bien sûr mais si il y a une solution plus simple je suis preneur.
Je pense qu'en plus pour les tableaux de chaines de caractères ça va être encore plus compliqué.
Le problème c'est qu'il faudrait sauver les tableaux indépendamment les uns des autres (comme le font STORE et RECALL).
Est-ce que quelqu'un à une idée de comment faire pour récupérer l'adresse de début et celle de fin d'un tableau ?
Je peux calculer tout ça à la main bien sûr mais si il y a une solution plus simple je suis preneur.
Je pense qu'en plus pour les tableaux de chaines de caractères ça va être encore plus compliqué.
Hialmar- Admin
- Messages : 840
Date d'inscription : 03/03/2014
Age : 54
Localisation : Toulouse
Re: Programmation BASIC
Bon je croyais avoir trouvé une solution en utilisant les fichiers séquentiels de Sedoric mais j'ai un pb.
Voilà mon code :
J'ai repris le programme de Dom mais au lieu de sauver avec les adresses, j'ouvre un fichier séquentiel, j'y écrit les tailles de la matrice A%, puis toutes les valeurs et je ferme le fichier.
Mais ça me génère l'erreur : ?FILE NOT OPEN ERROR IN 90
Si j'exécute les commandes à la main ça marche mais pas dans le programme.
Voilà mon code :
- Code:
1 PRINT "CRETAB"
10 DIM A%(10,10)
15 DIM B%(25)
20 FOR I=0 TO 10
25 FOR J=0 TO 10
30 A%(I,J)=I*J
40 NEXT J,I
60 FOR I=0 TO 25
70 B%(I)=16
75 NEXT
80 OPEN S,"DATA.DAT",0
90 PUT 0,10
100 PUT 0,10
110 FOR I=0 TO 10
120 FOR J=0 TO 10
130 PUT 0,A%(I,J)
140 NEXT J,I
150 CLOSE 0
J'ai repris le programme de Dom mais au lieu de sauver avec les adresses, j'ouvre un fichier séquentiel, j'y écrit les tailles de la matrice A%, puis toutes les valeurs et je ferme le fichier.
Mais ça me génère l'erreur : ?FILE NOT OPEN ERROR IN 90
Si j'exécute les commandes à la main ça marche mais pas dans le programme.
- Code:
OPEN S,"DATA.TAB",0
Ready
PUT 0,10
Ready
CLOSE
Ready
OPEN S,"DATA.TAB",0
Ready
TAKE 0,A
Ready
PRINT A
10
Ready
Hialmar- Admin
- Messages : 840
Date d'inscription : 03/03/2014
Age : 54
Localisation : Toulouse
Re: Programmation BASIC
J'ai l'impression, après consultation de la doc du microdisc, que les numéros de fichiers doivent commencer à 1 et non à 0Hialmar a écrit:Mais ça me génère l'erreur : ?FILE NOT OPEN ERROR IN 90
Essaie : 80 OPEN S,"DATA.DAT",1
Ca va peut-être marcher
Dom50- Messages : 916
Date d'inscription : 06/12/2012
Localisation : Normandie
Re: Programmation BASIC
Bonsoir,
si tu ouvre ton fichier en premier ligne 5 tu n'as pas de message d'erreur !!
5 OPEN S,"DATA.DAT",0
bien sur il faut supprimer la ligne 80
à tester
si tu ouvre ton fichier en premier ligne 5 tu n'as pas de message d'erreur !!
5 OPEN S,"DATA.DAT",0
bien sur il faut supprimer la ligne 80
à tester
Invité- Invité
Re: Programmation BASIC
Merci je vais tester ça.
C'est probablement parceque l'ouverture prend du temps non ?
C'est probablement parceque l'ouverture prend du temps non ?
Hialmar- Admin
- Messages : 840
Date d'inscription : 03/03/2014
Age : 54
Localisation : Toulouse
Re: Programmation BASIC
Je viens de tester et ça marche nickel.
Pour le second programme qui ne fait que lire ça marche aussi très bien sans le délai donc ça vient probablement d'autre chose qu'un problème de vitesse.
Je remet les deux programmes au cas où ça intéresserait quelqu'un :
Pour le second programme qui ne fait que lire ça marche aussi très bien sans le délai donc ça vient probablement d'autre chose qu'un problème de vitesse.
Je remet les deux programmes au cas où ça intéresserait quelqu'un :
- Code:
1 PRINT "CRETAB"
5 OPEN S,"DATA.DAT",0
10 DIM A%(10,10)
15 DIM B%(25)
20 FOR I=0 TO 10
25 FOR J=0 TO 10
30 A%(I,J)=I*J
40 NEXT J,I
60 FOR I=0 TO 25
70 B%(I)=16
75 NEXT
85 WAIT 100
90 PUT 0,10
100 PUT 0,10
110 FOR I=0 TO 10
120 FOR J=0 TO 10
130 PUT 0,A%(I,J)
140 NEXT J,I
150 CLOSE 0
- Code:
1 PRINT "LOATAB"
5 OPEN S,"DATA.DAT",0
10 DIM A%(10,10)
15 DIM B%(25)
90 TAKE 0,A
100 TAKE 0,B
110 FOR I=0 TO A
120 FOR J=0 TO B
130 TAKE 0,A%(I,J)
135 PRINT A%(I,J)
140 NEXT J,I
150 CLOSE 0
Hialmar- Admin
- Messages : 840
Date d'inscription : 03/03/2014
Age : 54
Localisation : Toulouse
Programmation Basic
Bonsoir Hialmar,
Cela provient du fait que le SED réserve un tampon, pour les entrées sorties lors de l'ouverture d'un fichier . Donc il est préférable de déclarer tes ouvertures de fichiers avant toute affectation de variable (dans ton cas le tableau A%).
D'ailleurs dans le cas d'autres SED tel que RANDOS ou autres, il faut déclarer, au début du programme un FILES N (N représentant le nombre de tampon à réserver ).
Pour tester mes dires dans ton programme, place une Ligne 77 CLEAR et tu verras que tu n'auras pas d'anomalie, mais c'est sûr du fait du CLEAR, le tableau A% est repassé à zéro avant le OPEN.
Au fait, de mémoire, je crois que le début de la zone des tableaux se trouve en 9E et 9F. Mais je pense que c'est possible de calculer l'adresse ou est stocké un tableau.
A+
Cela provient du fait que le SED réserve un tampon, pour les entrées sorties lors de l'ouverture d'un fichier . Donc il est préférable de déclarer tes ouvertures de fichiers avant toute affectation de variable (dans ton cas le tableau A%).
D'ailleurs dans le cas d'autres SED tel que RANDOS ou autres, il faut déclarer, au début du programme un FILES N (N représentant le nombre de tampon à réserver ).
Pour tester mes dires dans ton programme, place une Ligne 77 CLEAR et tu verras que tu n'auras pas d'anomalie, mais c'est sûr du fait du CLEAR, le tableau A% est repassé à zéro avant le OPEN.
Au fait, de mémoire, je crois que le début de la zone des tableaux se trouve en 9E et 9F. Mais je pense que c'est possible de calculer l'adresse ou est stocké un tableau.
A+
Zodiac- Messages : 92
Date d'inscription : 27/01/2014
Localisation : Yvelines
Page 2 sur 3 • 1, 2, 3
Sujets similaires
» Grand concours de programmation
» basic & lib ASM___[RESOLU]
» Le Basic a 50 ans
» Problème sur mix BASIC / ASM
» Lancement automatique d'un programme Basic
» basic & lib ASM___[RESOLU]
» Le Basic a 50 ans
» Problème sur mix BASIC / ASM
» Lancement automatique d'un programme Basic
Forum Oric :: Forums :: Forum Public :: BASIC
Page 2 sur 3
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|
Dim 31 Mar 2024 - 14:35 par kenneth
» Bla Bla général du Jury
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