Amstrad Plus Forum Index

Amstrad Plus
Découverte de la gamme Old et Plus des Cpc d'Amstrad.

 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Division z80 16 Bits
Goto page: 1, 2  >
 
Post new topic   Reply to topic    Amstrad Plus Forum Index -> Programmation Cpc -> Calcul
Previous topic :: Next topic  
Author Message
Ast
Administrateur

Offline

Joined: 05 Sep 2014
Posts: 2,977
Masculin
Point(s): 390
Moyenne de points: 0.13

PostPosted: Fri 19 Jul - 17:35 (2019)    Post subject: Division z80 16 Bits Reply with quote

Salut les gars,


Je viens, enfin de revenir parmi vous, et j'aurais besoin de votre aide.
Ca fait 2 heures que je planche sur une routine de division par 12 pour mon Split-Maker.


Ce que je souhaite, je rentre avec une valeur 16 bits dans HL (par exemple) et je ressors la val de HL/12 dans A.


J'attends vos idées, Merci.
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Back to top
Publicité






PostPosted: Fri 19 Jul - 17:35 (2019)    Post subject: Publicité

PublicitéSupprimer les publicités ?
Back to top
siko


Offline

Joined: 12 Apr 2018
Posts: 33
Localisation: Civaux (86)
Masculin
Point(s): 22
Moyenne de points: 0.67

PostPosted: Fri 19 Jul - 18:11 (2019)    Post subject: Division z80 16 Bits Reply with quote

Tu trouveras des routines de division pour z80, selon la taille des registres que tu veux utiliser:

http://wikiti.brandonw.net/index.php?title=Z80_Routines:Math:Division

Par ex si tu veux diviser 2401 par 12, et avoir le résultat dans HL, et le reste dans A:

Code:
   ld HL, 2401
   ld c,12

div_hl_c:
   xor a
   ld b, 16

_loop:
   add hl, hl
   rla
   jr c, $+5
   cp c
   jr c, $+4

   sub c
   inc l
   
   djnz _loop
   
   ret




A la fin, tu as A=1 (le reste) et HL=200


Back to top
Visit poster’s website
roudoudou


Offline

Joined: 14 Jul 2016
Posts: 427
Localisation: LYON
Masculin
Point(s): 46
Moyenne de points: 0.11

PostPosted: Fri 19 Jul - 18:21 (2019)    Post subject: Division z80 16 Bits Reply with quote

on peut pas gruger genre diviser par 8, mettre de côté, diviser par 16 et soustraire à ce qu'on a mis de côté?

Back to top
siko


Offline

Joined: 12 Apr 2018
Posts: 33
Localisation: Civaux (86)
Masculin
Point(s): 22
Moyenne de points: 0.67

PostPosted: Fri 19 Jul - 18:46 (2019)    Post subject: Division z80 16 Bits Reply with quote

arf non, x/8-x/16, ca fait x/16 Smile

l'algo est en nombre de boucles constant, avec B=16. donc si on commence par diviser par 4, il ne reste plus qu'a diviser par 3, et on peut commencer avec B=14 je suppose. Et réduire encore si on sait qu'on a de plus petites valeurs.


Back to top
Visit poster’s website
Ast
Administrateur

Offline

Joined: 05 Sep 2014
Posts: 2,977
Masculin
Point(s): 390
Moyenne de points: 0.13

PostPosted: Fri 19 Jul - 19:23 (2019)    Post subject: Division z80 16 Bits Reply with quote

J'avais eu une idée du genre de celle du Roudoudou, mais au final, ça n'a pas l'air réalisable. 
Merci Siko pour ton aide.


La solution proposée par Madram… Merci à toi ô yves !


Madram wrote:
    ld hl,nombre_a_diviser
    ld de,diviseur  ; 12 pour toi. Marche avec tout sauf 0
    ld bc,-1 ; resultat
    or a
div_loop
    inc bc:sbc hl,de
    jr nc,div_loop
    add hl,de  ; Correction si tu veux hl = reste




_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Back to top
siko


Offline

Joined: 12 Apr 2018
Posts: 33
Localisation: Civaux (86)
Masculin
Point(s): 22
Moyenne de points: 0.67

PostPosted: Fri 19 Jul - 20:06 (2019)    Post subject: Division z80 16 Bits Reply with quote

Ah oui, la méthode directe, mais ca fait plus de boucle des que hl>12*16=192. Faudrait calculer en cycle a partir de quand le premier est plus efficace que le second.

Back to top
Visit poster’s website
hlide fremen


Offline

Joined: 16 Dec 2018
Posts: 46
Masculin
Point(s): 46
Moyenne de points: 1.00

PostPosted: Fri 19 Jul - 22:26 (2019)    Post subject: Division z80 16 Bits Reply with quote

En me basant sur celui de la division par 10, je me demande si ça marche aussi pour la division par 12 :
 
Code:
 DivHLby12:




Code:

;Inputs: 
;     HL 
;Outputs: 
;     HL is the quotient 
;     A is the remainder 
;     BC is 12  
ld bc,$0D0C  
xor a  
Add hl,hl:rla  
Add hl,hl:rla  
Add hl,hl:rla  
Add hl,hl:rla  
cp c  
jr c,$+4    
sub c    
inc l  
djnz $-7  
ret






Back to top
Ast
Administrateur

Offline

Joined: 05 Sep 2014
Posts: 2,977
Masculin
Point(s): 390
Moyenne de points: 0.13

PostPosted: Fri 19 Jul - 22:38 (2019)    Post subject: Division z80 16 Bits Reply with quote

J’ai remis un peu d’ordre à ta routine. Maintenant ça parait plus lisible ^^


Merci Hlide!
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Last edited by Ast on Fri 19 Jul - 23:09 (2019); edited 1 time in total
Back to top
hlide fremen


Offline

Joined: 16 Dec 2018
Posts: 46
Masculin
Point(s): 46
Moyenne de points: 1.00

PostPosted: Fri 19 Jul - 22:56 (2019)    Post subject: Division z80 16 Bits Reply with quote

c'est "add hl, hl" suivi de "rla", désolé j'ai pris le "/" pour un ou :/, vraiment fatigué ce soir.

Back to top
Ast
Administrateur

Offline

Joined: 05 Sep 2014
Posts: 2,977
Masculin
Point(s): 390
Moyenne de points: 0.13

PostPosted: Fri 19 Jul - 23:09 (2019)    Post subject: Division z80 16 Bits Reply with quote

C’est corrigé !
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Back to top
hlide fremen


Offline

Joined: 16 Dec 2018
Posts: 46
Masculin
Point(s): 46
Moyenne de points: 1.00

PostPosted: Sat 20 Jul - 15:13 (2019)    Post subject: Division z80 16 Bits Reply with quote

Allez une première tentative de décomposer la division par 12 en une division par 3 suivi d'une division par 4. Et en prime, si le reste n'a aucune importance on peut se faire l'économie de ne pas calculer les deux derniers itérations pour la division par 3 pour la transformer en division par 12 ne donnant que le quotient (qui est dans L) :

Code:

0000                          .PRAGMA   z80   
0000                START:       
0000   21 FF 02               LD   hl,767   
0003   CD 09 00               CALL   divHLby12   
0006   C3 00 00               JP   start   
0009                DIVHLBY12:     
0009   01 03 0B               LD   bc,$0B03   
000C   AF                     XOR   a   
000D   29                     ADD   hl,hl   
000E   17                     RLA     
000F   29                     ADD   hl,hl   
0010   17                     RLA     
0011   29                     ADD   hl,hl   
0012   17                     RLA     
0013                DIVLOOP:     
0013   29                     ADD   hl,hl   
0014   17                     RLA     
0015   B9                     CP   c   
0016   38 02                  JR   c,divnoc   
0018   91                     SUB   c   
0019   2C                     INC   l   
001A                DIVNOC:     
001A   10 F7                  DJNZ   divloop   
001C   C9                     RET       


Initialement, on avait 16 itérations à faire à cause du HL qui est sur 16-bit. Le diviser par 4 revient à décaler HL à droite de 2 bits mais le Z80 ne sait pas faire ça en une instruction de 1 NOP. Mais en divisant par 3, si je retire 2 itérations, ça revient à diviser par 12 car on retire 2 décalages qui multiplie L par 4 !


Back to top
hlide fremen


Offline

Joined: 16 Dec 2018
Posts: 46
Masculin
Point(s): 46
Moyenne de points: 1.00

PostPosted: Sat 20 Jul - 15:23 (2019)    Post subject: Division z80 16 Bits Reply with quote

Partant du principe que HL ne devrait contenir qu'un nombre exprimable sur 10-bit et non sur 16-bit et que la constante devrait être sur 4-bit et non 8-bit, on peut se demander s'il y a moyen de jouer sur l'itération.

Pour la deuxième tentative, je n'essayerais que de réduire HL à 10-bit.

L'idée est de décaler les bits 0-9 de HL en bits 6-15 avant de diviser par 3 et de réduire le nombre d'itération pour corriger ce décalage introduit dans HL et obtenir L = HL/12.
Code:

0000                          .PRAGMA   z80   
0000                START:       
0000   21 7B 00               LD   hl,123   
0003   CD 27 00               CALL   divHLby12   
0006   3E 0A                  LD   a,10   
0008   BD                     CP   l   
0009   20 19                  JR   nz,error   
000B   21 BD 01               LD   hl,445   
000E   CD 27 00               CALL   divHLby12   
0011   3E 25                  LD   a,37   
0013   BD                     CP   l   
0014   20 0E                  JR   nz,error   
0016   21 FF 02               LD   hl,767   
0019   CD 27 00               CALL   divHLby12   
001C   3E 3F                  LD   a,63   
001E   BD                     CP   l   
001F   20 03                  JR   nz,error   
0021                SUCCESS:     
0021   C3 21 00               JP   success   
0024                ERROR:       
0024   C3 24 00               JP   error   
0027                DIVHLBY12:     
0027   29                     ADD   hl,hl   
0028   29                     ADD   hl,hl   
0029   29                     ADD   hl,hl   
002A   29                     ADD   hl,hl   
002B   29                     ADD   hl,hl   
002C   01 03 06               LD   bc,$0603   
002F   AF                     XOR   a   
0030   29                     ADD   hl,hl   
0031   17                     RLA     
0032   29                     ADD   hl,hl   
0033   17                     RLA     
0034   29                     ADD   hl,hl   
0035   17                     RLA     
0036                DIVLOOP:     
0036   29                     ADD   hl,hl   
0037   17                     RLA     
0038   B9                     CP   c   
0039   38 02                  JR   c,divnoc   
003B   91                     SUB   c   
003C   2C                     INC   l   
003D                DIVNOC:     
003D   10 F7                  DJNZ   divloop   
003F   C9                     RET     


Back to top
Ast
Administrateur

Offline

Joined: 05 Sep 2014
Posts: 2,977
Masculin
Point(s): 390
Moyenne de points: 0.13

PostPosted: Sat 20 Jul - 15:31 (2019)    Post subject: Division z80 16 Bits Reply with quote

Excellent ! J’aime bien le fait que tous participent sur le forum !
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Back to top
hlide fremen


Offline

Joined: 16 Dec 2018
Posts: 46
Masculin
Point(s): 46
Moyenne de points: 1.00

PostPosted: Sat 20 Jul - 15:39 (2019)    Post subject: Division z80 16 Bits Reply with quote

Après réflexion, le coup du diviseur sur 4-bit au lieu de 8-bit est déjà pris en compte en fait avec les 3 paires "ADD HL,HL:RLA" (le quatrième étant dans la boucle pour récupérer un bit dans le flag C). Donc on ne doit pas pouvoir faire mieux là.

Par contre pour la version LUT je penses que l'on peut améliorer si on considère que une table de 768 entrées est un peu gros et que l'on accepte quelques cycles supplémentaires.


Back to top
hlide fremen


Offline

Joined: 16 Dec 2018
Posts: 46
Masculin
Point(s): 46
Moyenne de points: 1.00

PostPosted: Sat 20 Jul - 16:31 (2019)    Post subject: Division z80 16 Bits Reply with quote

Et enfin une version LUT qui prend une table de division par 3 en 192 entrées (chaque triplet donne le même quotient) au lieu de 768 car je divise HL par 4 pour éliminer les trois quadruplets donnant le même quotient sur une table de 768 éléments. Alors oui, je sais, La division par 4 ajoute 4 instructions de 2 NOPs.

Code:

.pragma z80

start:
 ld hl,123
 call divHLby12
 ld a,10
 cp l
 jr nz,error

 ld hl,445
 call divHLby12
 ld a,37
 cp l
 jr nz,error

 ld hl,767
 call divHLby12
 ld a,63
 cp l
 jr nz,error
 
success:
 jp success

error:
 jp error
 
divHLby12:
 srl h
 rr l
 srl h
 rr l
 ld bc,tableDivHLby12
 add hl,bc
 ld l,(hl)
 ret
 
 .macro table3,v
 db v
 db v
 db v
 .endm
 
 .macro table6,v
 table3 v
 table3 v+1
 .endm
 
 .macro table12,v
 table6 v+0
 table6 v+2
 .endm

 .macro table24,v
 table12 v+0
 table12 v+4
 .endm

 .macro table48,v
 table24 v+0
 table24 v+8
 .endm
 
 .macro table96,v
 table48 v+0
 table48 v+16
 .endm
 
 .macro table192,v
 table96 v+0
 table96 v+32
 .endm
 
 tableDivHLby12:
 table192 0

 .end


Back to top
Display posts from previous:   
Post new topic   Reply to topic    Amstrad Plus Forum Index -> Programmation Cpc -> Calcul All times are GMT + 2 Hours
Goto page: 1, 2  >
Page 1 of 2

 
Jump to:  

Index | Administration Panel | Create a forum | Free support forum | Free forums directory | Report a violation | Cookies | Charte | Conditions générales d'utilisation
Powered by phpBB © 2001, 2005 phpBB Group