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 241 membres enregistrésL'utilisateur enregistré le plus récent est ben_frog
Nos membres ont posté un total de 8921 messages dans 811 sujets
Calcul en langage machine [RESOLU]
+3
didierv
Dom50
Sheld67
7 participants
Forum Oric :: Forums :: Forum Public :: Assembleur
Page 1 sur 1
Calcul en langage machine [RESOLU]
Salut la Communauté,
Pour les besoins d'un nouveau jeu en langage machine, je cherche le moyen de réaliser la division de deux entiers.
J'ai vainement tenté la programmation suivante:
lda #200
jsr $DF24 ; A --> ACC1
jsr $DEE8 ; ACC1 --> ACC2
lda 01 ; contient 1, 2, 4 ou 8 (selon le niveau choisi pour le jeu)
jsr $DF24
jsr $DDE7 ; ACC2/ACC1 --> ACC1
jsr $D922 ; ACC1 --> YA
sty 03 ; contient la valeur 'n' qui sert lors de la boucle d'attente principale du jeu (plus le niveau de jeu est élevé, plus la valeur 'n' est faible et plus le jeu est rapide).
Ce programme me retourne un ?ILLEGAL QUANTITY ERROR et refuse de placer le moindre résultat en 03.
Où ai-je fauté ?
Pour les besoins d'un nouveau jeu en langage machine, je cherche le moyen de réaliser la division de deux entiers.
J'ai vainement tenté la programmation suivante:
lda #200
jsr $DF24 ; A --> ACC1
jsr $DEE8 ; ACC1 --> ACC2
lda 01 ; contient 1, 2, 4 ou 8 (selon le niveau choisi pour le jeu)
jsr $DF24
jsr $DDE7 ; ACC2/ACC1 --> ACC1
jsr $D922 ; ACC1 --> YA
sty 03 ; contient la valeur 'n' qui sert lors de la boucle d'attente principale du jeu (plus le niveau de jeu est élevé, plus la valeur 'n' est faible et plus le jeu est rapide).
Ce programme me retourne un ?ILLEGAL QUANTITY ERROR et refuse de placer le moindre résultat en 03.
Où ai-je fauté ?
Dernière édition par Sheld67 le Sam 30 Mai 2015 - 11:22, édité 1 fois
Sheld67- Messages : 73
Date d'inscription : 06/04/2014
Re: Calcul en langage machine [RESOLU]
bonjour,
Tu utilises un système sous Sedoric ?
Si c'est le cas, il faut faire attention de bien apeller les routines en ROM et non les routines Sedoric en RAM overlay.
Sinon, pour diviser un nombre inférieur à 255 par 2, 4 ou 8. Il y a plus simple et plus rapide.
Il suffit de décaler les bits vers la droite autant de fois que la puissance de 2 par laquelle on souhaite diviser
LDA 02 (si 02 contient tempo maxi)
LSR
STA 03 divise par 2
LDA 02
LSR
LSR divise par 4
STA 03
LDA 02
LSR
LSR
LSR divise par 8
STA 03
Tu utilises un système sous Sedoric ?
Si c'est le cas, il faut faire attention de bien apeller les routines en ROM et non les routines Sedoric en RAM overlay.
Sinon, pour diviser un nombre inférieur à 255 par 2, 4 ou 8. Il y a plus simple et plus rapide.
Il suffit de décaler les bits vers la droite autant de fois que la puissance de 2 par laquelle on souhaite diviser
LDA 02 (si 02 contient tempo maxi)
LSR
STA 03 divise par 2
LDA 02
LSR
LSR divise par 4
STA 03
LDA 02
LSR
LSR
LSR divise par 8
STA 03
Dom50- Messages : 916
Date d'inscription : 06/12/2012
Localisation : Normandie
Re: Calcul en langage machine [RESOLU]
Bonjour,
Et voici l'adresse de bonnes routines générales 6502 : www.6502.org
et plus spécifiquement une routine dédiée à la division http://6502.org/source/integers/ummodfix/ummodfix.htm
Une autre solution, si tu as besoin d'être plus rapide et que tes nombres ne sont pas trop grands est d'avoir des tables en memoire (mais il faut aussi ne pas avoir trop besoin de place )
Et voici l'adresse de bonnes routines générales 6502 : www.6502.org
et plus spécifiquement une routine dédiée à la division http://6502.org/source/integers/ummodfix/ummodfix.htm
Une autre solution, si tu as besoin d'être plus rapide et que tes nombres ne sont pas trop grands est d'avoir des tables en memoire (mais il faut aussi ne pas avoir trop besoin de place )
Re: Calcul en langage machine [RESOLU]
Bonjour,Sheld67 a écrit:Salut la Communauté,
Pour les besoins d'un nouveau jeu en langage machine, je cherche le moyen de réaliser la division de deux entiers.
.../...
Ce programme me retourne un ?ILLEGAL QUANTITY ERROR et refuse de placer le moindre résultat en 03.
Où ai-je fauté ?
Je ne comprends pas trop pourquoi tu fais des appels à des routines complexes de la ROM qui sont prévues pour traiter des nombres flottants pour ton besoin qui est simplement de diviser 2 entiers ?
Quoi qu'il ne soit, d'après la routine de la ROM en D922 (sur Oric Atmos), l'erreur que tu obtiens est due soit à un problème de signe négatif, soit à un problème d'exposant... Encore une fois, les routines de la ROM pour l'arithmétique des nombres flottants sont complexes, et d'ailleurs pas forcément très clairement expliquées dans "L'Oric à Nu", que tu as utilisé je pense comme référence pour trouver les adresses des routines que tu appelles... Il y a notamment des différences entre traitements/routines sur nombres signés et nombres non signés...
Bref, à ta place je suivrais le conseil de Didier et j'essaierais de réutiliser des routines standard 6502 de division d'entiers...
Bonne chance en tous cas, c'est vrai que le 6502 c'était pas facile, personnellement ça m'a fait drôle aussi d'y revenir, je me rappelais plus qu'effectivement il n'y avait même pas d'instruction de multiplication ou de division !
Laurent
Re: Calcul en langage machine [RESOLU]
Bienvenue Laurent
kenneth- Modérateur
- Messages : 878
Date d'inscription : 13/01/2013
Age : 56
Localisation : 63
Re: Calcul en langage machine [RESOLU]
Bonjour Kenneth,
Ah oui, j'ai du oublié de me présenter, désolé... Peut-être y-a-t-il un forum dédié pour les présentations que je n'ai pas vu ?
Quoi qu'il en soit... Je suis donc Laurent, tout nouvel inscrit au CEO, pas tout jeune puisqu'ayant eu un Oric Atmos en étant ado... Et toujours possesseur d'un Atmos et d'un Oric-1 qui sont au grenier et que j'aimerais bien ressortir si j'avais davantage de place dans mon 2 pièces parisien...
J'en profite pour remercier l'ensemble de la communauté Oric, les créateurs et administrateurs de oric.org, le CEO, defence-force.org.... C'est vraiment un plaisir de revivre ces années Oric grâce à vous!!
Ah oui, j'ai du oublié de me présenter, désolé... Peut-être y-a-t-il un forum dédié pour les présentations que je n'ai pas vu ?
Quoi qu'il en soit... Je suis donc Laurent, tout nouvel inscrit au CEO, pas tout jeune puisqu'ayant eu un Oric Atmos en étant ado... Et toujours possesseur d'un Atmos et d'un Oric-1 qui sont au grenier et que j'aimerais bien ressortir si j'avais davantage de place dans mon 2 pièces parisien...
J'en profite pour remercier l'ensemble de la communauté Oric, les créateurs et administrateurs de oric.org, le CEO, defence-force.org.... C'est vraiment un plaisir de revivre ces années Oric grâce à vous!!
Re: Calcul en langage machine [RESOLU]
Bienvenu Laurent
Dr X7FFF- Messages : 13
Date d'inscription : 15/11/2014
Calcul en langage machine [RESOLU]
Merci à tous pour vos réponses.
Voici finalement le code utilisé pour les besoins du jeu "Black Mamba" :
LINIT_SPEED lda #120 ; valeur de référence pour le niveau 1 du jeu (équivaut à 1,2 s d'attente)
ldy LEVEL ; le niveau du jeu est stocké en page zéro (entre 1 et 4)
LLOOP dey
beq LEND_INIT_SPEED ; si on a décrémenté jusqu'à avoir Y = 0 alors sortir
lsr a ; sinon diviser A par 2 (c'est là qu'est l'astuce...)
bne LLOOP ; reboucler
LEND_INIT_SPEED sta GAME_SPEED ; sauver la nouvelle valeur de vitesse du jeu
rts
En d'autres termes, voici les temps d'attente correspondant à chaque niveau de jeu :
- Niveau 1 = 1,2 s
- Niveau 2 = 0,60 s
- Niveau 3 = 0,30 s
- Niveau 4 = 0,10 s (ça commence à être rapide)
Je considère le sujet comme résolu !
Voici finalement le code utilisé pour les besoins du jeu "Black Mamba" :
LINIT_SPEED lda #120 ; valeur de référence pour le niveau 1 du jeu (équivaut à 1,2 s d'attente)
ldy LEVEL ; le niveau du jeu est stocké en page zéro (entre 1 et 4)
LLOOP dey
beq LEND_INIT_SPEED ; si on a décrémenté jusqu'à avoir Y = 0 alors sortir
lsr a ; sinon diviser A par 2 (c'est là qu'est l'astuce...)
bne LLOOP ; reboucler
LEND_INIT_SPEED sta GAME_SPEED ; sauver la nouvelle valeur de vitesse du jeu
rts
En d'autres termes, voici les temps d'attente correspondant à chaque niveau de jeu :
- Niveau 1 = 1,2 s
- Niveau 2 = 0,60 s
- Niveau 3 = 0,30 s
- Niveau 4 = 0,10 s (ça commence à être rapide)
Je considère le sujet comme résolu !
Sheld67- Messages : 73
Date d'inscription : 06/04/2014
r
Bonjour,
Tout d'abord je m'excuse pour répondre à un sujet résolu il y a 3 ans.
Ensuite ma réponse n'est pas adapté au problème initial car elle utilise le calcul flottant pour une division entre 2 entiers.
Jutilise les routines fournit dans "Au coeur de l'oric atmos" page 57.
ACCU1 et ACCU2 sont situé en page zéro sur 5 octets chacuns
$D0--$D5 accu1
$D8--$DD accu2
Soit une division entre 2 entiers (16 bits). avec LL octet faible et HH octet fort.
dans $00-01 : le dividande: LL,HH
dans $02-03 : le diviseur: ll,hh
Le quotient trouvé sera rangé dans $00-01
A4,00 LDY 00 ' Y <--LL
A5,01 LDA 01 ' A <--HH
20,99,D4 JSR D499 ' YA --> ACCU1
20,E5,DE JSR DEE5 ' ACCU1 --> ACCU2
A4,02 LDY 02 ' Y <-- ll
A5,03 LDA 03 ' A <-- hh
20,99,D4 JSR D499 ' YA --> ACCU1
20,E7,DD JSR DDE7 ' ACCU2 / ACCU1 --> ACCU1
20,2C,D9 JSR D92C ' ACCU1 ---> entier (HHLL) en $D3-D4 (Attention ici l'octet Fort se retrouve dans $D3 et dans $D4 l'octet faible)
A5,D4 LDA D4 ' A <-- $D4
85,00 STA 00 ' A --> $00 (poids faible)
A5,D3 LDA D3 ' A <-- $D3
85,01 STA 01 ' A --> $01 (poids Fort)
60 RTS
Voila
Tout d'abord je m'excuse pour répondre à un sujet résolu il y a 3 ans.
Ensuite ma réponse n'est pas adapté au problème initial car elle utilise le calcul flottant pour une division entre 2 entiers.
Jutilise les routines fournit dans "Au coeur de l'oric atmos" page 57.
ACCU1 et ACCU2 sont situé en page zéro sur 5 octets chacuns
$D0--$D5 accu1
$D8--$DD accu2
Soit une division entre 2 entiers (16 bits). avec LL octet faible et HH octet fort.
dans $00-01 : le dividande: LL,HH
dans $02-03 : le diviseur: ll,hh
Le quotient trouvé sera rangé dans $00-01
A4,00 LDY 00 ' Y <--LL
A5,01 LDA 01 ' A <--HH
20,99,D4 JSR D499 ' YA --> ACCU1
20,E5,DE JSR DEE5 ' ACCU1 --> ACCU2
A4,02 LDY 02 ' Y <-- ll
A5,03 LDA 03 ' A <-- hh
20,99,D4 JSR D499 ' YA --> ACCU1
20,E7,DD JSR DDE7 ' ACCU2 / ACCU1 --> ACCU1
20,2C,D9 JSR D92C ' ACCU1 ---> entier (HHLL) en $D3-D4 (Attention ici l'octet Fort se retrouve dans $D3 et dans $D4 l'octet faible)
A5,D4 LDA D4 ' A <-- $D4
85,00 STA 00 ' A --> $00 (poids faible)
A5,D3 LDA D3 ' A <-- $D3
85,01 STA 01 ' A --> $01 (poids Fort)
60 RTS
Voila
zeolib- Messages : 4
Date d'inscription : 24/02/2018
Sujets similaires
» Résultat inattendu en langage machine
» Langage FOCAL
» [BASIC] - SON type machine à écrire
» Euphoric et Windows 8 [Résolu]
» [résolu]Utilitaire Hex2Oric
» Langage FOCAL
» [BASIC] - SON type machine à écrire
» Euphoric et Windows 8 [Résolu]
» [résolu]Utilitaire Hex2Oric
Forum Oric :: Forums :: Forum Public :: Assembleur
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|
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
» No Problem !
Dim 25 Juin 2023 - 17:53 par Voyageur