Non c'est comme ca pour les .DRW, c'est lié à la façon dont les mots sont encodés dans le dico: le pointeur indique l'adresse de la première instruction machine donc *+2. En fait le code est très clair, même pour quelqu'un qui ne connait pas le Z80 comme moi mais qui a regardé quelques ASM de divers Forth à une époque. Voici une version annotée par mes soins sur la façon de lire le code (s'il y a des erreurs, Dominique corrigera je pense)
PSTOR: .DRW *+2 | addresse 1ere instruction machine
POP HL | recup adr
POP DE | recup value
LD A,(HL) | accu = partie passe de la valeur pointée (oui z80 c'est LSB)
ADD A,E | ajout partie basse de value
LD (HL),A | écriture partie basse de la valeur pointée
INC HL | passage à l'adresse du poids fort
LD A,(HL) | chargement accu avec poids fort
ADC A,D | ajout de la partie haute de la valeur avec carry provenant de l'addition du poids faible
LD (HL),A | sauvegarde poids fort
JP NEXT | saute à l'instruction suivante dans le thread (fil d'execution)
En fait le code fait tout pareil que le 6809, sauf que c'est octet par octet, donc avec plein d'instructions (dont addition avec propagation de retenue pour simuler 16 bits) là où le 6809 fait cela totalement nativement ou presque.
Ouais on n'a pas la possibilité de faire "LD HL,(HL)" et inversement, sinon on aurais pu faire un "ADD HL,DE" mais il aurait fallu conserver le pointeur HL. Bref, c'est sans doute une implémentation standard du Forth qui ne se prête pas bien au Z80, d'où la ressemblance en terme algorithmique avec celui du 6809 qui s'en sort bien mieux.
Ce que je comprend moins, c'est qu'il y a deux POP (deux arguments à ce que je vois) pour faire une addition et le résultat reste dans l'emplacement pointé par HL sans être rempilé pour être passé à l'instruction suivante. Est-ce que c'est NEXT qui va empiler le résultat ?
@ hlide
Plus tard, sur un autre fil je vais mettre un exemple sommaire de comment marche le Forth et sa machine virtuelle (en particulier NEXT). Et tu vas voir que c'est en fait d'une simplicité enfantine et que ça explique l'absence de Push HL
Obs : La procédure pstor : Plus_Store (+!) prend dans la pile l'adresse puis la valeur à additionner dans l'adresse ( n, adresse .. ) . Donc elle n'a pas à retourner de valeurs
ok, ça consomme juste les arguments dans la pile. Il me semble effectivement qu'un "!" est l'équivalent POKE.
J'ai consulté cette page et le moins que l'on puisse dire, c'est qu'il y a quand même pas mal de choix dans la technique de thread pour implémenter ces ENTER, NEXT, LEAVE ainsi que le mots. J'attendrais donc de savoir lequel c'est dans ton exemple.
Il faudrait que je relise la page sur les différents types de threading de Forth pour déterminer l'usage dans le cas où on ajoute ce mot devant le code. Je n'ai pas encore capter l'intérêt pour le moment.
EDIT: ça semble être dans le cas du Indirect Threaded Code (ITC). Mais même avec le pseudo-code, je ne vois pas trop comment ça donne en Z80.
Dernière modification par hlide le 14 oct. 2020 18:47, modifié 1 fois.