π
<-
Chat plein-écran
[^]

manipulation de l'octet caché du registre HL ?

Assembleur, Axe, ICE, BBC Basic...

manipulation de l'octet caché du registre HL ?

Unread postby emilechombier » 15 Sep 2019, 08:57

Bonjour,

J'ai dans un programme un timer qui me renvoie un nombre de cycle d'horloges stocké dans HL qui doit être divisé par 32768 pour renvoyer un nombre de secondes (on va limiter à la partie entière)
Pour cela l'idée serait soit de faire 15 rotations à droite de HL (32768=2^15) mais dans la doc du eZ80 ou les tutos (et même des forums comme Cemetech), je ne trouve pas d'instructions de rotations sur 24 bits, seulment sur 8 bits à la fois, or on n'a accès qu'à h et à l pas à hla comme vous le savez
J'ai essayé l'istruction rrd https://ez80.readthedocs.io/en/latest/docs/bit-shifts/rrd.html,
j'ai fait un test mais ça plante sous CEmu :

Code: Select all
  #include "ti83pce.inc"
   .assume ADL=1
   .db tExtTok,tAsm84CeCmp
   .org userMem
   call _ClrScrnFull
   call _homeup

   ld a,0
   ld (curRow),a
   ld hl,1000000
   rrd
   call _dispHL

   ret


Ma deuxième idée était de lire ou transférer les 9 bits de gauche (HLA + le bit fort de H) mais je n'ai pas trouvé d'instruction pour accéder à la valeur de HLA...

Je suis sûr qu'il y a un moyen simple mais après quelques jours de recherches perso, j'avoue que je commence un peu à vouloir avancer plus loin...
merci d'avance
User avatar
emilechombier
Niveau 7: EP (Espèce Protégée: geek)
Niveau 7: EP (Espèce Protégée: geek)
Level up: 8.6%
 
Posts: 51
Joined: 01 Sep 2019, 17:29
Gender: Male
Calculator(s):

Re: manipulation de l'octet caché du registre HL ?

Unread postby Limonadd » 15 Sep 2019, 17:23

ça plante parce que selon ta doc, avec rrd, hl doit contenir une adresse donc la il essaie de shift le nombre contenu à l'adresse 1000000 qui est sûrement interdite d'accès
User avatar
Limonadd
Niveau 9: IC (Compteur Infatigable)
Niveau 9: IC (Compteur Infatigable)
Level up: 96.5%
 
Posts: 82
Joined: 14 Feb 2018, 17:10
Gender: Male
Calculator(s):
Class: oui

Re: manipulation de l'octet caché du registre HL ?

Unread postby Limonadd » 15 Sep 2019, 18:02

tiens je t'ai fait un code, tu pourrais sûrement l'optimiser mais bon. Dans le code tu n'as pas dit si tu avais besoin du reste de la division, donc je ne l'ai pas pris. Si tu as besoin du reste je peux modifier le code si tu veux

Code: Select all
#include "ti83pce.inc"

   .assume ADL=1
   .db tExtTok,tAsm84CeCmp
   .org userMem

;ld hl,valeur

  ex de,hl        ;on utilise hl pour les adresses, donc on fera le shift sur de
  push hl         ;on sauvegarde la valeur du registre de
  ld hl,_saveHL
  ld (hl),de
  ld hl,_saveHLU
  ld c,(hl)       ;on stocke hlu dans c
 
  ld b,15         ;compteur
_loop:
  srl c           ;on décale en utilisant c comme hlu
  rr d
  rr e
  djnz _loop

  ld hl,_saveHL  ;on met c dans hlu
  ld (hl),e
  inc hl
  ld (hl),d
  inc hl
  ld (hl),c

  ld hl,_saveHL ;on met la sauvegarde dans de (ensuite on échange de avec hl)
  ld de,(hl)

  pop hl         ;on restaure la valeur du registre de
  ex de,hl      ; HL = HL / 32768  (le quotient, je n'ai pas repris le reste)

  push hl

  call _ClrScrnFull
  call _homeup
  pop hl
  call _DispHL  ; on affiche hl qui contient le résultat de HL / 32768
 
  ret

_saveHL:
  .db 0,0
_saveHLU:
  .db 0
User avatar
Limonadd
Niveau 9: IC (Compteur Infatigable)
Niveau 9: IC (Compteur Infatigable)
Level up: 96.5%
 
Posts: 82
Joined: 14 Feb 2018, 17:10
Gender: Male
Calculator(s):
Class: oui

Re: manipulation de l'octet caché du registre HL ?

Unread postby emilechombier » 15 Sep 2019, 20:49

un grand merci, je vais d'abord essayer tout seul comme un grand et je vais regarder ça si je suis coincé
merci pour tes explications en MP aussi
User avatar
emilechombier
Niveau 7: EP (Espèce Protégée: geek)
Niveau 7: EP (Espèce Protégée: geek)
Level up: 8.6%
 
Posts: 51
Joined: 01 Sep 2019, 17:29
Gender: Male
Calculator(s):

Re: manipulation de l'octet caché du registre HL ?

Unread postby emilechombier » 22 Sep 2019, 10:46

Juste pour informer d'éventuels lecteurs intéressés par la suite de ce topic sur la division par 32768:
Voici une méthode de division différente des 15 décalages à droite comme le montre Limonadd ci-dessus, mais par copie des 9 bits à gauche (ce qui revient au même, je sais pas si c'est plus rapide, de toute façon on s'en fout c'est pour l'affichage final des secondes...)
Code: Select all
  #include "ti83pce.inc"
   .assume ADL=1
   .db tExtTok,tAsm84CeCmp
   .org userMem
   call _ClrScrnFull
   call _homeup
   di
   
;Prépare l'affichage du texte
    ld  ix, $0900
    LD  (curRow), ix
    ld  hl, grdtours
    call _PutS
    ld  ix, $0901
    LD  (curRow), ix
    ld  hl, tours
    call _PutS

; Démarrage du chrono - code par GROSGED
    ld hl, $f1000c
    ld a, %10000
    ld (hl), a
    ld bc, $ffffff
    ld de, $5ab9ff
    ld l, $04
    ld (hl), bc
    ld l, $07
    ld (hl), de
    ld l, $0c
    inc a
    ld (hl), a

;les boucles

    LD b, 100 ; grande boucle de 100 tours
grandtour:
    LD  hl, 0
    LD (curRow), hl
    LD l, b
    CALL _dispHL
    LD c, 100 ; boucle de 100 tours
tour:
    LD  hl, 1
    LD (curRow), hl
    LD l, c
    CALL _dispHL
    DEC c
    JR NZ,tour
    DJNZ grandtour

;Arrete et affiche le chrono - code par GROSGED
    ld hl, ($f10000)
    ld de, $ffff51
    or a, a
    ex de, hl
    sbc hl, de
;affiche le timer brut
   push hl
   ld ix, 2
   ld (curRow), ix
   call _DispHL
   ld ix, $0902
   ld (curRow), ix
   ld hl, cycles
   call _PutS
   pop hl

; converti en secondes

   ex de, hl ; met HL (HL=le nombre de cycles renvoyé par le timer qu'on doit diviser pour avoir des secondes) dans DE (et met DE dans HL mais on s'en fout de ça car on va l'écraser juste après)
   ld hl, variable ; réserve 3 octets d'espace RAM,
   ld (hl), de ; met DE (donc la valeur de HL: ce qu'on doit diviser) dans cet espace L, H , HU
   ld de, 0 ; met DE à zéro (on va maintenant stocker dans DE le total des secondes, pas besoin de remettre E à zéro car on va le loader avec A plus tard)
   xor a ; met A à zéro (on va s'en servir comme registre de travail temporaire)
   inc hl ; avance d'un octet dans (HL): regarde vers H
   bit 7, (hl) ; prend le bit fort de H :on va ne pas tenir compte des 15 bits les plus faible de HL : on le divise ainsi par 32768
   jr Z, $+4; si H se termine par un 0, sauter la mise à 1 de A (laisser A à zéro)
      ld a, 1 ; il y déjà 1 seconde !
   inc hl ; on avance encore d'un octet dans (HL): on regarde donc maintenant vers HU
   sla (hl) ; on décale HU ("le 3 e octet de (HL)") de 1 vers la gauche pour laisser plus tard de la place au bit de A (cf lignes 61 62 63)
   jr NC, $+3 ; s'il n'y a pas débordement (CARRY=0) on saute la mise à 1 de D
      inc d ; on met d = 1 (ça veut dire que le résulat est supérieur à 255 secondes)
   add a, (hl) ; on ajoute le "HU décalé" dans A temporairement (pour l'instant il est à 0 ou à 1: cf lignes 61 62 63)
   ld e, a ; et on transvase A dans E
   ex de, hl ; met DE (=notre résultat) dans HL pour l'afficher (et met HL dans DE mais on s'en fout de ça car on va plus s'en servir)
   push hl ; copie HL dans la pile pour sauvegarder (car l'affichage de HL le détruit)
   ld ix, 3
   ld (curRow), ix ; affiche le total des secondes (timer/32768 soit ses 16 bits les plus forts)
   call _DispHL
   ld  ix, $0003
   ld  (curRow), ix
   ld  hl, soit
   call _PutS
   ld  ix, $0903
   ld  (curRow), ix
   ld  hl, secondes
   call _PutS   ;
   pop hl ; récupère la valeur de HL pour continuer la transformation en minutes/secondes
   
   xor a ; met à zéro A : ce sera notre compteur de soustractions = nombre de minutes
   ld de, 60 ; DE = notre diviseur = 60 (secondes dans 1 minute)
div:
   scf ; met la CARRY à 1
   ccf ; inverse la CARRY pour la mettre à zéro (on est obligé car il n'y a pas d'instruction pour remettre directement la CARRY à 0)
   sbc hl, de ; c'est la seule instruction de soustraction sur 16 bits : retire 60 du total des secondes
   jp M, findediv ; si c'est négatif oups on est allé trop loin on va s'arrêter
   inc a ; sinon augmente A de 1
   jr div ; et continue les soustractions de 60
findediv:
    cp  0 ; compare A à 0 (nombre de minutes = 0?)
    jr  Z, fin ; si c'est = 0 alors sauter tout l'affichage des minutes/secondes qui sert à rien...
    add hl, de ; HL est le reste (secondes restantes) on ajoute 60 à HL car comme on est allé trop loin pour s'arrêter il faut remettre les 60 qu'on a trop enlevé)
    push hl ; on sauvegarde HL car on va le détruire pour afficher A (les minutes d'abord)
    ld  hl, 0
    ld  l, a ; on stocke a dans HL afficher les minutes (=nombre de soustractions effectuées)
    ld  ix, 5
    ld  (curRow), ix
    call _DispHL
    ld  ix, $0005
    ld  (curRow), ix
    ld  hl, soit
    call _PutS
    ld  ix, $0905
    ld  (curRow), ix
    ld  hl, minutes
    call _PutS
    pop hl ; on récupère le nombre de seconde (= le reste de la division)
    ld  ix, 6
    ld  (curRow), ix
    call _DispHL ; ce qui reste dans HL c'est le nombre de secondes, pas la peine de la sauvegarder on s'en servira plus
    ld  ix, $0906
    ld  (curRow), ix
    ld  hl, secondes
    call _PutS
fin:
  res donePrgm,(iy+doneFlags)
  ret
grdtours:
.db "grands tours", 0
tours:
.db "tours", 0
cycles:
.db "cycles", 0
secondes:
.db "secondes.", 0
soit:
.db "soit", 0
minutes:
.db "minutes et ", 0
variable:
.db 0,0,0
User avatar
emilechombier
Niveau 7: EP (Espèce Protégée: geek)
Niveau 7: EP (Espèce Protégée: geek)
Level up: 8.6%
 
Posts: 51
Joined: 01 Sep 2019, 17:29
Gender: Male
Calculator(s):


Return to Langages alternatifs

Who is online

Users browsing this forum: No registered users and 1 guest

-
Search
-
Featured topics
Concours TI-Planet-Casio de rentrée 2019. 3 défis pour plus d'une 15aine de calculatrices graphiques et nombre de goodies sortant de l'ordinaire ! :D
Comparaisons des meilleurs prix pour acheter sa calculatrice !
12
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...

Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety 
-
Stats.
613 utilisateurs:
>549 invités
>58 membres
>6 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)