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 243 membres enregistrésL'utilisateur enregistré le plus récent est paul225l
Nos membres ont posté un total de 8922 messages dans 811 sujets
fonctions supplémentaires pour OSDK
2 participants
Forum Oric :: Forums :: Forum Public :: Programmation en C
Page 1 sur 1
fonctions supplémentaires pour OSDK
Je parle de ces fonctions là :
ATOF.S (ALPHA TO FLOAT)
ATOI.S (ALPHA TO INTEGER)
FTOA.S (FLOAT TO ALPHA)
RND.S (RND de l'ORIC)
SCRN.S (SCRN de l'ORIC)
PLOA.S (PLOT ATTRIBUT de l'ORIC)
PLOC.S (PLOT CHAR de l'ORIC)
PLOTS.S (PLOT STRING de l'ORIC)
POP.S (POP de l'ORIC)
WAIT.S (WAIT de l'ORIC)
Qui, je suppose, sont de Kiwilevrai ou zodiac.
(voir ce post : http://forums.oric.org/t104-mise-en-place-de-l-environnement-c)
ces fonctions sont absentes de l'osdk.
pour les rajouter, il suffit de les copier du répertoire "lib" du package lcc65.zip
(voir ici : http://forums.oric.org/t87-lcc65-la-compil-pour-oric)
et de les coller dans le répertoire lib de l'osdk.
Mais ce n'est pas tout : vous vous retrouverez avec une erreur de compilation si vous utilisez ces fonctions.
Pour l'instant je n'ai fait "joujou" qu'avec plotc :
Pour ce faire, il vous faudra remplacer les lignes apparaissant ainsi
et les lignes commes celles là par
pareillement, ces lignes ci poseront un problème :
il suffit de les remplacer par celles-là :
enfin, il faut rajouter ces lignes à la fin du fichier library.ndx (qui est une sorte de catalogue des fonctions) :
c'est la documentation de l'assembleur de l'OSDK (ici), qui m'a aidé.
une fois fait, la compilation passe sans problème
merci à l'auteur ou aux auteurs de ces fonctions : elles me manquaient cruellement.
ATOF.S (ALPHA TO FLOAT)
ATOI.S (ALPHA TO INTEGER)
FTOA.S (FLOAT TO ALPHA)
RND.S (RND de l'ORIC)
SCRN.S (SCRN de l'ORIC)
PLOA.S (PLOT ATTRIBUT de l'ORIC)
PLOC.S (PLOT CHAR de l'ORIC)
PLOTS.S (PLOT STRING de l'ORIC)
POP.S (POP de l'ORIC)
WAIT.S (WAIT de l'ORIC)
Qui, je suppose, sont de Kiwilevrai ou zodiac.
(voir ce post : http://forums.oric.org/t104-mise-en-place-de-l-environnement-c)
ces fonctions sont absentes de l'osdk.
pour les rajouter, il suffit de les copier du répertoire "lib" du package lcc65.zip
(voir ici : http://forums.oric.org/t87-lcc65-la-compil-pour-oric)
et de les coller dans le répertoire lib de l'osdk.
Mais ce n'est pas tout : vous vous retrouverez avec une erreur de compilation si vous utilisez ces fonctions.
Pour l'instant je n'ai fait "joujou" qu'avec plotc :
- Code:
void main()
{
SimplePrint("Hello World !");
plotc(3,3,'a');
}
Pour ce faire, il vous faudra remplacer les lignes apparaissant ainsi
- Code:
lda #LOW(adresse)
- Code:
lda #<adresse
et les lignes commes celles là par
- Code:
lda #HIGH(adresse)
- Code:
lda #>adresse
pareillement, ces lignes ci poseront un problème :
- Code:
STRING "%c"
BYTE $0
il suffit de les remplacer par celles-là :
- Code:
.asc "%c"
.byt $0
enfin, il faut rajouter ces lignes à la fin du fichier library.ndx (qui est une sorte de catalogue des fonctions) :
- Code:
-atoi.s
_atoi
-ftoa.s
_ftoa
-atof.s
_atof
-plota.s
_plota
-plotc.s
_plotc
-plots.s
_plots
-wait.s
_wait
-rnd.s
_rnd
-scrn.s
_scrn
-pop.s
_pop
-plot.s
_plot
c'est la documentation de l'assembleur de l'OSDK (ici), qui m'a aidé.
une fois fait, la compilation passe sans problème
merci à l'auteur ou aux auteurs de ces fonctions : elles me manquaient cruellement.
Ladywasky- Messages : 240
Date d'inscription : 25/08/2018
Age : 53
Re: fonctions supplémentaires pour OSDK
Je ne vais pas mettre ces routines là dans le OSDK telles qu'implémentées, parce qu'il y a beaucoup de problèmes:
- Ce ne sont pas des routines assembleur, en gros c'est le code du compilateur C après compilation, donc ca rame, et ca prend de la place.
- Elles sont redondantes, pas besoin d'avoir quatre versions de PLOT dont le code est a 90% identique (calcul de l'endroit ou on affiche)
- SCRN devrait aussi partager 90% du code de PLOT vu que ca fait la meme chose mais dans l'autre sens.
- La fonction POP est une hérésie sans non, celle la ne sera jamais dans le OSDK.
- Il y a deja une fonction random
- WAIT ne marchera que sur Oric ATMOS (appel de la ROM)
- scanf contient déja le code pour convertir des chaines de caractères vers format float ou entier, donc ATOF et ATOI devraient utiliser ca.
- printf contient déja le code pour convertir un float vers format ASCII, donc pareil.
Le but du OSDK n'est pas d'etre exhaustif et de permettre de faire tourner n'importe quel programme C standard sur l'Oric. Si c'est ce que les gens veulent faire, il y a CC65 qui fait ca très bien.
Le but du OSDK est de fournir une solution relativement optimale pour faire des programmes Oric aussi bons que possible, ce qui implique pas mal de contraintes, dont le fait de ne pas rajouter de code non optimisé.
J'ai eu pas mal de discussion avec Jérome, il va y avoir des changements (ne serait ce que pour le support téléstrat et Orix propre), mais ca va se faire de facon contrôlée.
Pour les fonctions manquantes, un truc qui marche bien c'est de juste faire des macros en C:
Ca ne devrait pas générer un code pire que le SCRN.S
- Ce ne sont pas des routines assembleur, en gros c'est le code du compilateur C après compilation, donc ca rame, et ca prend de la place.
- Elles sont redondantes, pas besoin d'avoir quatre versions de PLOT dont le code est a 90% identique (calcul de l'endroit ou on affiche)
- SCRN devrait aussi partager 90% du code de PLOT vu que ca fait la meme chose mais dans l'autre sens.
- La fonction POP est une hérésie sans non, celle la ne sera jamais dans le OSDK.
- Il y a deja une fonction random
- WAIT ne marchera que sur Oric ATMOS (appel de la ROM)
- scanf contient déja le code pour convertir des chaines de caractères vers format float ou entier, donc ATOF et ATOI devraient utiliser ca.
- printf contient déja le code pour convertir un float vers format ASCII, donc pareil.
Le but du OSDK n'est pas d'etre exhaustif et de permettre de faire tourner n'importe quel programme C standard sur l'Oric. Si c'est ce que les gens veulent faire, il y a CC65 qui fait ca très bien.
Le but du OSDK est de fournir une solution relativement optimale pour faire des programmes Oric aussi bons que possible, ce qui implique pas mal de contraintes, dont le fait de ne pas rajouter de code non optimisé.
J'ai eu pas mal de discussion avec Jérome, il va y avoir des changements (ne serait ce que pour le support téléstrat et Orix propre), mais ca va se faire de facon contrôlée.
merci à l'auteur ou aux auteurs de ces fonctions : elles me manquaient cruellement.
Pour les fonctions manquantes, un truc qui marche bien c'est de juste faire des macros en C:
- Code:
#define PLOT(x,y,c) POKE(0xBB80+(X)+(Y)*40,C)
#define SCRN(x,y) PEEK(0xBB80+(X)+(Y)*40)
Ca ne devrait pas générer un code pire que le SCRN.S
Dbug- Messages : 248
Date d'inscription : 06/01/2013
Re: fonctions supplémentaires pour OSDK
OK grand chef !
Ladywasky- Messages : 240
Date d'inscription : 25/08/2018
Age : 53
Re: fonctions supplémentaires pour OSDK
Après, si il y a des requêtes pour des fonctions vraiment utiles (conversion de programmes BASIC vers C, ca ne rentre pas dans la catégorie utile vu que le programme BASIC existe déja :p), il suffit de faire une demande claire, tout en se souvenant que le but c'est l'utilité, pas la compatibilité ISO/POSIX/UNIX ou autre truc qui ne tournerait pas bien sur un Oric 48k
Voir http://www.osdk.org/index.php?page=issues
Voir http://www.osdk.org/index.php?page=issues
Dbug- Messages : 248
Date d'inscription : 06/01/2013
Re: fonctions supplémentaires pour OSDK
Bah voilà, j'ai suivi ton conseil et j'ai viré tout ça.
Pour le wait, je me suis débrouillée comme ça :
Pour le wait, je me suis débrouillée comme ça :
- Code:
void wait(unsigned int wait_cs)
{
clock_t TIME0, TIME1;
TIME0 = clock();
do
TIME1 = clock();
while ( ((double)(TIME1-TIME0))<wait_cs );
}
Dernière édition par Ladywasky le Mer 29 Aoû 2018 - 22:01, édité 3 fois
Ladywasky- Messages : 240
Date d'inscription : 25/08/2018
Age : 53
Re: fonctions supplémentaires pour OSDK
Sur oric "double" et "float" c'est un tres tres mauvaise idée.
Il faut privilégier les octets, a defaut les valeurs entieres 16 bit.
La fonction clock est implémentée comme ca.
La principale raison pour laquelle Chema est passé au 100% assembleur c'est a cause de la place mémoire, le code généré par les compilateurs C est très très gros comparé au BASIC ou a l'assembleur propre.
Il faut privilégier les octets, a defaut les valeurs entieres 16 bit.
La fonction clock est implémentée comme ca.
- Code:
;
; clock_t clock(void) ; return the system clock
;
_clock
php
sei
ldx $0276
lda $0277
cli ; JEDE
plp
rts
- Code:
void wait(unsigned int wait_ms)
{
clock_t TIME0;
TIME0 = clock();
while ( (clock()-TIME0))<wait_cs )
{}
}
La principale raison pour laquelle Chema est passé au 100% assembleur c'est a cause de la place mémoire, le code généré par les compilateurs C est très très gros comparé au BASIC ou a l'assembleur propre.
Dbug- Messages : 248
Date d'inscription : 06/01/2013
Re: fonctions supplémentaires pour OSDK
D'accord, super, j'ai corrigé
Et surtout, j'ai compris.
Merci champion.
Et surtout, j'ai compris.
Merci champion.
Ladywasky- Messages : 240
Date d'inscription : 25/08/2018
Age : 53
Re: fonctions supplémentaires pour OSDK
Bon hé bien soit la fonction clock ne fonctionne pas, soit je suis une truffe...
Cette fonction wait continue le code sans attendre les centième de seconde qu'on lui demande;
wait(1000) ; (10 secondes) passe directement à l'instruction suivante...
Cette fonction wait continue le code sans attendre les centième de seconde qu'on lui demande;
wait(1000) ; (10 secondes) passe directement à l'instruction suivante...
Ladywasky- Messages : 240
Date d'inscription : 25/08/2018
Age : 53
Re: fonctions supplémentaires pour OSDK
Essaye ca pour voir si ca marche:
Tout ca c'est du code qui date de la première version du SDK par Fabrice, Alexios and cie... ca n'a pas du être touché depuis 1997, et je ne m'en sert pas vu que la première chose que je fait en général c'est de remplacer les IRQ de la ROM par mes propres fonctions.
- Code:
while (1)
{
printf("Clock:%u",clock());
}
Tout ca c'est du code qui date de la première version du SDK par Fabrice, Alexios and cie... ca n'a pas du être touché depuis 1997, et je ne m'en sert pas vu que la première chose que je fait en général c'est de remplacer les IRQ de la ROM par mes propres fonctions.
Dbug- Messages : 248
Date d'inscription : 06/01/2013
Re: fonctions supplémentaires pour OSDK
hé bien en fait, ton petit bout de code fonctionne. (pas avec %u, mais %d, mais ce n'est pas le soucis)
J'ai cherché, vraiment, et c'est problématique.
Il doit y avoir un problème renvoyé par clock_t(t) puisque si tu l'affecte à une variable :
donc :
affichera donc :
Maintenant, si on essaye de passer par une variable intermédiaire :
et si on remplace clock_t par unsigned int, les problèmes d'inversion d'opérateur restent là...
J'ai cherché, vraiment, et c'est problématique.
Il doit y avoir un problème renvoyé par clock_t(t) puisque si tu l'affecte à une variable :
- Code:
TIME0 = clock();
donc :
- Code:
#include <lib.h>
#include <time.h>
void wait(unsigned int wait_cs);
void main()
{
printf("start\n");
wait(1000);
printf("stop\n");
get();
}
void wait(unsigned int wait_cs)
{
clock_t TIME0, TIME1, TIMEOUT;
TIME0 = clock();
TIMEOUT = TIME0+wait_cs; // effectue une soustraction !
while ( clock()<TIMEOUT ){}; //
printf(": %d %d %d\n",TIME0, TIMEOUT, wait_cs);
}
affichera donc :
- Code:
start
: 1 999 1000
stop
- Code:
void wait(unsigned int wait_ms)
{
clock_t TIME0;
TIME0 = clock();
while ( (clock()-TIME0))<wait_cs ) //<-- comparaison qui fonctionne à l'envers et sortie de boucle immediate
{}
}
Maintenant, si on essaye de passer par une variable intermédiaire :
- Code:
void wait(unsigned int wait_ms)
{
clock_t TIME0, TIME1;
TIME0 = clock();
do {TIME1=clock();}
while ( (TIME1-TIME0))<wait_cs ) //<-- comparaison qui fonctionne à l'envers et sortie de boucle immediate
}
et si on remplace clock_t par unsigned int, les problèmes d'inversion d'opérateur restent là...
Dernière édition par Ladywasky le Jeu 30 Aoû 2018 - 15:13, édité 1 fois
Ladywasky- Messages : 240
Date d'inscription : 25/08/2018
Age : 53
Re: fonctions supplémentaires pour OSDK
Oh, non, c'est parce que la fonction clock retourne la valeur du compteur de la ROM... qui décrémente probablement.
Dbug- Messages : 248
Date d'inscription : 06/01/2013
Re: fonctions supplémentaires pour OSDK
Sauf que , le résultat qu'on obtient à l'affichage s'incrémente...
Ladywasky- Messages : 240
Date d'inscription : 25/08/2018
Age : 53
Re: fonctions supplémentaires pour OSDK
printf("%d", TIME0);
affiche un entier positif... c'est casse pied
A noter : dans osdk, printf("%u", une_variable); affiche u, la lettre "u" et non pas un entier non signé
affiche un entier positif... c'est casse pied
A noter : dans osdk, printf("%u", une_variable); affiche u, la lettre "u" et non pas un entier non signé
Ladywasky- Messages : 240
Date d'inscription : 25/08/2018
Age : 53
Re: fonctions supplémentaires pour OSDK
Au final je m'en sort en utilisant le TIMER3 de l'oric (c'est ballot parce qu'il me semble que ça ne fonctionne pas pour l'oric 1 - rom v1.0) :
- Code:
void wait(unsigned int wait_cs)
{
doke(0x0276,wait_cs);
while ( deek(0x0276)>0){};
}
Ladywasky- Messages : 240
Date d'inscription : 25/08/2018
Age : 53
Sujets similaires
» OSDK - verbosité du code généré par LCC (RCC16)...
» OSDK V1.4 et Oricutron V1.2
» OSDK link error sur (SP)
» problème de compilation c OSDK 1.14
» Bugs de la librairie C OSDK
» OSDK V1.4 et Oricutron V1.2
» OSDK link error sur (SP)
» problème de compilation c OSDK 1.14
» Bugs de la librairie C OSDK
Forum Oric :: Forums :: Forum Public :: Programmation en C
Page 1 sur 1
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