Derniers sujets
» Cumulus sur Sell my retro
Hier à 21:15 par drpsy

» Rodmän "SPECIAL MULTI FORMAT TRIPLE CASSETTE"
Hier à 20:08 par Jede

» Nettoyage de la base de jeux
Dim 11 Nov 2018 - 19:50 par Dbug

» Traitement de texte
Ven 9 Nov 2018 - 7:51 par Symoon

» Le Secret du Tombeau
Jeu 8 Nov 2018 - 19:31 par romu3

» Oric Explorer v2.0.... Bonne et mauvaise nouvelles
Mer 7 Nov 2018 - 23:07 par goyo

» Orix : tester sur oricutron
Mer 7 Nov 2018 - 11:29 par Jede

» le retour du Commodore 64
Lun 5 Nov 2018 - 6:40 par didierv

» rêve de jeu ...
Dim 4 Nov 2018 - 20:54 par goyo

» Grand concours de programmation
Dim 4 Nov 2018 - 8:29 par didierv

» Easter egg dans Honey Kong ?
Dim 4 Nov 2018 - 0:33 par iss

» Psycho III
Dim 4 Nov 2018 - 0:17 par Symoon

» Suppression du module UHF
Sam 3 Nov 2018 - 23:40 par drpsy

» CEO-MAG 341
Sam 3 Nov 2018 - 17:18 par Symoon

» Combien de jeux d'aventure sur oric ?
Jeu 1 Nov 2018 - 18:29 par Dom50

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

Récupérer mon mot de passe

Statistiques
Nous avons 159 membres enregistrés
L'utilisateur enregistré le plus récent est mrlee

Nos membres ont posté un total de 7487 messages dans 564 sujets
Portail ORIC




fonctions supplémentaires pour OSDK

Poster un nouveau sujet   Répondre au sujet

Aller en bas

fonctions supplémentaires pour OSDK

Message par Ladywasky le Mar 28 Aoû 2018 - 19:53

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 :
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)
par
Code:
lda #<adresse

et les lignes commes celles là par
Code:
lda #HIGH(adresse)
par
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
en fait, je suis un quiche en assembleur .
c'est la documentation de l'assembleur de l'OSDK (ici), qui m'a aidé.
une fois fait, la compilation passe sans problème Wink

merci à l'auteur ou aux auteurs de ces fonctions : elles me manquaient cruellement.
avatar
Ladywasky

Messages : 95
Date d'inscription : 25/08/2018

Revenir en haut Aller en bas

Re: fonctions supplémentaires pour OSDK

Message par Dbug le Mer 29 Aoû 2018 - 18:19

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.

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 Smile

_________________

avatar
Dbug

Messages : 94
Date d'inscription : 06/01/2013

Revenir en haut Aller en bas

Re: fonctions supplémentaires pour OSDK

Message par Ladywasky le Mer 29 Aoû 2018 - 18:27

OK grand chef !
Very Happy
avatar
Ladywasky

Messages : 95
Date d'inscription : 25/08/2018

Revenir en haut Aller en bas

Re: fonctions supplémentaires pour OSDK

Message par Dbug le Mer 29 Aoû 2018 - 19:17

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 Smile

Voir http://www.osdk.org/index.php?page=issues

_________________

avatar
Dbug

Messages : 94
Date d'inscription : 06/01/2013

Revenir en haut Aller en bas

Re: fonctions supplémentaires pour OSDK

Message par Ladywasky le Mer 29 Aoû 2018 - 20:10

Bah voilà, j'ai suivi ton conseil et j'ai viré tout ç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
avatar
Ladywasky

Messages : 95
Date d'inscription : 25/08/2018

Revenir en haut Aller en bas

Re: fonctions supplémentaires pour OSDK

Message par Dbug le Mer 29 Aoû 2018 - 21:27

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.
Code:
;
; clock_t clock(void)   ; return the system clock
;
_clock
   php
   sei
   ldx $0276
   lda $0277
   cli         ; JEDE
   plp
   rts
Ca charge en #276/277 dans A et X, donc une valeur 16 bit, et on sait que ca incrémente avec le temps, donc je suppose que du code dans ce genre là devrait suffire:
Code:
void wait(unsigned int wait_ms)
 {
  clock_t TIME0; 
  TIME0 = clock();
  while ( (clock()-TIME0))<wait_cs ) 
  {}
 }
Tout octet que tu perds ici et là sont des octets que tu aimerais bien avoir plus tard.
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.


_________________

avatar
Dbug

Messages : 94
Date d'inscription : 06/01/2013

Revenir en haut Aller en bas

Re: fonctions supplémentaires pour OSDK

Message par Ladywasky le Mer 29 Aoû 2018 - 22:01

D'accord, super, j'ai corrigé Smile
Et surtout, j'ai compris.
Merci champion.
avatar
Ladywasky

Messages : 95
Date d'inscription : 25/08/2018

Revenir en haut Aller en bas

Re: fonctions supplémentaires pour OSDK

Message par Ladywasky le Jeu 30 Aoû 2018 - 13:06

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

Messages : 95
Date d'inscription : 25/08/2018

Revenir en haut Aller en bas

Re: fonctions supplémentaires pour OSDK

Message par Dbug le Jeu 30 Aoû 2018 - 13:14

Essaye ca pour voir si ca marche:

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.

_________________

avatar
Dbug

Messages : 94
Date d'inscription : 06/01/2013

Revenir en haut Aller en bas

Re: fonctions supplémentaires pour OSDK

Message par Ladywasky le Jeu 30 Aoû 2018 - 15:04

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 :
Code:
TIME0 = clock();
les opérateur + et - semblent inversés : l'addition effectue une soustraction et vice-versa avec un unsigned int, pareil pour les opérateurs de comparaison < et >

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
et
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

 }
on aura le même problème avec la comparaison (qui par ailleurs déclenche l'erreur EQ0W que j'ai posté sur defence-force, si on ne l'a pas rajouté dans MACRO.H)

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
avatar
Ladywasky

Messages : 95
Date d'inscription : 25/08/2018

Revenir en haut Aller en bas

Re: fonctions supplémentaires pour OSDK

Message par Dbug le Jeu 30 Aoû 2018 - 15:10

Oh, non, c'est parce que la fonction clock retourne la valeur du compteur de la ROM... qui décrémente probablement.

_________________

avatar
Dbug

Messages : 94
Date d'inscription : 06/01/2013

Revenir en haut Aller en bas

Re: fonctions supplémentaires pour OSDK

Message par Ladywasky le Jeu 30 Aoû 2018 - 15:14

Sauf que , le résultat qu'on obtient à l'affichage s'incrémente...
avatar
Ladywasky

Messages : 95
Date d'inscription : 25/08/2018

Revenir en haut Aller en bas

Re: fonctions supplémentaires pour OSDK

Message par Ladywasky le Jeu 30 Aoû 2018 - 15:21

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é
avatar
Ladywasky

Messages : 95
Date d'inscription : 25/08/2018

Revenir en haut Aller en bas

Re: fonctions supplémentaires pour OSDK

Message par Ladywasky le Jeu 30 Aoû 2018 - 15:46

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){};
 }
 
avatar
Ladywasky

Messages : 95
Date d'inscription : 25/08/2018

Revenir en haut Aller en bas

Re: fonctions supplémentaires pour OSDK

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

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