Documentation Hector - Forth PAMPUK

Les bouquins, les scans, les pdf ou les liens qui vont bien... ici c'est la bibliothèque.

Modérateurs : Papy.G, fneck, Carl

Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: Documentation Hector - Forth PAMPUK

Message par Dominique »

En fait c'est moi. :oops:
Pour faire court, j'avais voulu rassembler ce que fait le Forth Bandini JC. & Schiex T. du MO5.
Et j'avais pris +! au lieu de +

Il était 1H30 du mat

Le correct c'est :

Code : Tout sélectionner

                 ;****************
                 ;* LE MOT +
                 ;****************

48D1 3706                    PULU   A,B                
48D3 E3C4                    ADDD   ,U                 
48D5 0EB0                    JMP    PUT                    

                     PUT              
45B0 EDC4                    STD    ,U                 
45B2 2002                    BRA    NEXT
C'est mieux
Dernière modification par Dominique le 13 oct. 2020 09:48, modifié 1 fois.
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Documentation Hector - Forth PAMPUK

Message par __sam__ »

Oui je comprends mieux :) Je n'ose imaginer le code asm de +! sur Z80.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: Documentation Hector - Forth PAMPUK

Message par Dominique »

Le Z80 fait ça

Code : Tout sélectionner

PSTOR:  .DRW    *+2
        POP     HL
        POP     DE
        LD      A,(HL)
        ADD     A,E
        LD      (HL),A
        INC     HL
        LD      A,(HL)
        ADC     A,D
        LD      (HL),A
        JP      NEXT
        
Etant délibérément orienté Graphique Le Graforth n'a pas de +!
Il faut lire l'adresse (par un PEEKW) faire la somme et faire un POKEW

A titre d'exemple le POKEW

Code : Tout sélectionner

;*****************************
; POKEW
; IDENTIQUE A ! (SLASH)
;*****************************



81b5: ad 81                                             ; Link mot précédent
81b7: d0 cf cb c5 d7 					;POKEW
pfa_store:
$81bc	18		CLC	2
$81bd	20 2c 6a	JSR $6A2C	6		; POP TOS U (adresse) dans XA
$81c0	85 8c		STA $8C		3		; A -> ($8C)
$81c2	86 8d		STX $8D		3		; X -> ($8D)
$81c4	20 2c 6a	JSR $6A2C	6		; POP TOS U (valeur) dans XA
$81c7	a0 00		LDY #$00	2		; Y=$00
$81c9	91 8c		STA ($8C),Y	7		; A -> (($8C))
$81cb	c8		INY		2		; Y=Y+1
$81cc	8a		TXA		2		; A <== X
$81cd	91 8c		STA ($8C),Y	7		; A -> (($8C)+1)
$81cf	60		RTS		6

$6a2c	a4 9c		LDY $9C		3	; Y <- ($9C)Pointer U dans Y
$6a2e	d0 02		BNE $6A32	2	; Branch on Not Equal to zero, Z = 0
$6a30	c8		INY		2	; Y=Y+1 SI Pointer=0 -> Pointer=2
$6a31	c8		INY		2	; Y=Y+1
$6a32	88		DEY		2	; Y=Y-1
$6a33	be 00 1e	LDX $1E00,Y	4	; X <- ($1E00+Y) STACK DE DONNEES MSoctet TOS
$6a36	88		DEY		2	; Y=Y-1
$6a37	b9 00 1e	LDA $1E00,Y	4	; A <- ($1E00 + Y) STACK DE DONNEES LSoctet TOS
$6a3a	84 9c		STY $9C		3	; ($9C) <- Y - Save Pointer U
$6a3c	60		RTS		6 
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: Documentation Hector - Forth PAMPUK

Message par hlide »

Le code Z80 n'est pas clair :

1) késako PSTOR: .DRW *+2 ?
2) pas de push HL ? NEXT va considérer que le TOP est dans HL et va le pusher pour l'exécution du mot suivant ?
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Documentation Hector - Forth PAMPUK

Message par __sam__ »

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)

Code : Tout sélectionner

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.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: Documentation Hector - Forth PAMPUK

Message par hlide »

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 ?
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: Documentation Hector - Forth PAMPUK

Message par Dominique »

@ _sam_

C'est tout bon, rien à modifier.

@ 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
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: Documentation Hector - Forth PAMPUK

Message par hlide »

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.

Merci à vous deux.
Avatar de l’utilisateur
6502man
Messages : 12286
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: Documentation Hector - Forth PAMPUK

Message par 6502man »

Pas sur que tous les assembleurs Z80 sache assembler ca : .DRW *+2
mais bon on comprend que c'est l'adresse +2
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: Documentation Hector - Forth PAMPUK

Message par hlide »

Code : Tout sélectionner

DW $+2
DEFW $+2
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.
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: Documentation Hector - Forth PAMPUK

Message par Dominique »

Cette convention d'écriture .DRW *+2 devait exister à l'époque car elle vient d'un document officiel du Forth Interest Group.

On peut la remplacer par :

Code : Tout sélectionner

cf_PSTO:
       .RDW PSTOR
PSTOR:
        POP     HL              ; recup adr
        POP     DE              ; recup value
        ...........                ; etc..
        
mais c'est plus fastidieux.

Comme c'est un listing Forth il y a une bonne quantité de mots qui ont un cf_ (Code Field )égal à l'adresse où ils se trouvent + 2.
Répondre