Derniers sujets
» Oric Kong en C preview (coup de main demandé)
Mar 18 Sep 2018 - 17:01 par Ladywasky

» Interview de Vincent Baillet
Lun 17 Sep 2018 - 20:31 par didierv

» SCUBA DIVE
Lun 17 Sep 2018 - 1:15 par Symoon

» CEO MAG 338
Dim 16 Sep 2018 - 1:25 par Ladywasky

» Tyrann 2.0 sur Androïd (et facebook,...)
Jeu 6 Sep 2018 - 20:53 par Sheld67

» [PROBLEME] Commande input et générateur aléatoire
Mar 4 Sep 2018 - 4:20 par Ladywasky

» OricSpin : Télécharger et jouer
Lun 3 Sep 2018 - 9:32 par Oric1-Atmos

» fonctions supplémentaires pour OSDK
Jeu 30 Aoû 2018 - 15:46 par Ladywasky

» OricJoy : un frontend pour oricutron, avec support joystick/gamepad
Jeu 30 Aoû 2018 - 0:32 par Ladywasky

» Conversion de oric kong en C
Mer 29 Aoû 2018 - 23:47 par Ladywasky

» **NEW** EDGE for ORIC !!!!
Mer 29 Aoû 2018 - 9:31 par Davros

» Ensemble de Mandelbrot en C et en 10 lignes
Mar 28 Aoû 2018 - 17:18 par TotoShampoin

» Espace de stockage dans le forum
Mar 28 Aoû 2018 - 6:53 par maximus

» LCC65, la Compil pour ORIC
Lun 27 Aoû 2018 - 15:39 par Ladywasky

» defence-force.org ne réponds plus !
Lun 27 Aoû 2018 - 2:36 par Ladywasky

Qui est en ligne ?
Il y a en tout 3 utilisateurs en ligne :: 0 Enregistré, 0 Invisible et 3 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 152 membres enregistrés
L'utilisateur enregistré le plus récent est Legend of Myth

Nos membres ont posté un total de 7169 messages dans 537 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 : 55
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 : 82
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 : 55
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 : 82
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 : 55
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 : 82
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 : 55
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 : 55
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 : 82
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 : 55
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 : 82
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 : 55
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 : 55
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 : 55
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


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