KRF Repeat

Cette catégorie traite de développements récents pour nos vieilles machines, applications, jeux ou démos... Amis programmeurs, c'est ici que vous pourrez enfin devenir célèbres!

Modérateurs : Papy.G, fneck, Carl

Avatar de l’utilisateur
z80¯\_(ツ)_/¯
Messages : 77
Inscription : 06 oct. 2020 13:15
Localisation : Bourgogne

Re: KRF Repeat

Message par z80¯\_(ツ)_/¯ »

Oui c'est en $5000. J'avais oublié de préciser.
Pour être très précis, c'est compilé avec Z88dk avec l'option zorg 20480.
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: KRF Repeat

Message par Dominique »

J'ai repris le fichier et de cette façon pour moi c'est plus clair.

C'est en $50C2 que tu entres et que tu organises to KRF Repeat ?

Je regarderai plus tard - La seule chose qu m'a interpellée c'est que pour l'instruction NOP j'avais fait :

Code : Tout sélectionner

3E 28       	LD	A, $28
D3 8F       	OUT	($8F), A
3E 91       	LD	A, $91
D3 CF       	OUT	($CF), A
J'ai l'impression que tu fais différent. Mais c'est peut être rien.

Code : Tout sélectionner


508B  F3        DI   
; Ecriture registre ef9345 (d=numero du registre)
EF9345:   
508C  F5        PUSH    AF
508D  C5        PUSH    BC
508E  CD8602    CALL    0286H ; teste si EF935 est pret
5091  CD7C0D    CALL    0D7CH ; ecrit dans EF9345 (D=numero du registre, E=valeur du registre)
5094  CD8602    CALL    0286H
5097  C1        POP     BC
5098  F1        POP     AF
5099  C9        RET     

; Lecture registre ef9345 (d=numero du registre)
; la valeur est placee dans h
EF9345_READ:
509A  CD8602    CALL    0286H
509D  7A        LD      A,D
509E  D38F      OUTA    (8FH)
50A0  DBCF      INA     (CFH)
50A2  67        LD      H,A
50A3  C9        RET     

50A4  C9        RET     

._get_ef9345_register

50A5  E5        PUSH    HL

; hl = r param -> commande + registre (__z88dk_fastcall)
; ex : $8921 = Commande indirection r=0-> TGS READ & lecture R1
50A6  1628      LD      D,28H ; R0 exec
50A8  5C        LD      E,H ; Commande indirection r=0-> TGS READ
50A9  CD8C50    CALL    508CH ; CALL EF9345 Après il faut lire R1 qui contient le TGS courant
50AC  55        LD      D,L	; l contient le registre a lire (ex 21 = r1)
50AD  CD9A50    CALL    509AH	;call EF9345_READ ; d contient le registre à lire (ex 21 = r1)
50B0  6C        LD      L,H ; R1 dans l pour le retour (__z88dk_fastcall)
50B1  C1        POP     BC
50B2  C9        RET     

._set_ef9345_register
50B3  E5        PUSH    HL
    ; hl = r param -> commande + valeur registre
    ; ex : $8101 = Commande indirection r=0-> TGS WRITE avec 01
50B4  1621      LD      D,21H 	; dans R1
50B6  5D        LD      E,L 	; valeur a placer dans le registre indirect
50B7  CD8C50    CALL    508CH	;    call EF9345 ;
50BA  1628      LD      D,28H 	; R0 exec
50BC  5C        LD      E,H 	; commande indirect
50BD  CD8C50    CALL    508CH	;    call EF9345 ;
50C0  C1        POP     BC
50C1  C9        RET     

; Function fill_screen_repeat flags 0x00000208 __smallc __z88dk_fastcall 
; void fill_screen_repeat(unsigned char car)
; parameter 'unsigned char car' at sp+2 size(1)

._fill_screen_repeat
50C2  E5        PUSH    HL
    ; C
50C3  1621      LD      D,21H	; r1 = car
50C5  1E41      LD      E,41H	; car 65
50C7  CD8C50    CALL    508CH	;    call EF9345
    ; B
50CA  1622      LD      D,22H	; r2 = car
50CC  1E01      LD      E,01H
50CE  CD8C50    CALL    508CH	;    call EF9345
    ; A
50D1  1623      LD      D,23H 	; R3
50D3  1E65      LD      E,65H	; cyan/magenta dans R3 01110001 -> Bits de poids fort = 7
50D5  CD8C50    CALL    508CH	;call EF9345
50D8  1626      LD      D,26H 	; r6 = ligne (0 pour 0 et n+7 pour [1 <= n <= 24])
50DA  1E00      LD      E,00H
50DC  CD8C50    CALL    508CH	;    call EF9345
50DF  1627      LD      D,27H 	; r7 = colonne entre 0 et 39
50E1  1E00      LD      E,00H
50E3  CD8C50    CALL    508CH	;    call EF9345
50E6  1628      LD      D,28H 	; d=40 (registre r0 + 8 execution)
50E8  1E05      LD      E,05H 	; et e=0 krf repeat
50EA  CD8C50    CALL    508CH	;    call EF9345

    ; wait
50ED  010010    LD      BC,1000H            ;loads bc with hex 1000
outer:
50F0  111000    LD      DE,0010H            ;loads de with hex 1000
inner:
50F3  1B        DEC     DE            	;decrements de
50F4  7A        LD      A,D            	;copies d into a
50F5  B3        OR      E              	;bitwise or of e with a (now, a = d | e)
50F6  C2F350    JP      NZ,50F3H	;jp nz, inner-jumps back to inner: label if a is not zero
50F9  0B        DEC     BC           	;decrements bc
50FA  78        LD      A,B             ;copies b into a
50FB  B1        OR      C               ;bitwise or of c with a (now, a = b | c)
50FC  C2F050    JP      NZ,50F0H	;jp nz, outer-jumps back to outer: label if a is not zero

50FF  1628      LD      D,28H 		; d=40 (registre r0 + 8 pour l execution)
5101  1E91      LD      E,91H		; et e=145 nop
5103  CD8C50    CALL    508CH		;call EF9345
5106  C1        POP     BC
5107  C9        RET     
Avatar de l’utilisateur
z80¯\_(ツ)_/¯
Messages : 77
Inscription : 06 oct. 2020 13:15
Localisation : Bourgogne

Re: KRF Repeat

Message par z80¯\_(ツ)_/¯ »

Dominique a écrit : 19 oct. 2020 15:35 C'est en $50C2 que tu entres et que tu organises to KRF Repeat ?
oui c'est ça.

Code : Tout sélectionner

3E 28       	LD	A, $28
D3 8F       	OUT	($8F), A
3E 91       	LD	A, $91
D3 CF       	OUT	($CF), A
J'ai l'impression que ce code est identique au call EF9345 qui utilise les routines VG5000 :
- $0286 : Attente que l'EF9345 soit prêt
- $0D7C : Routine d'écriture EF9345 à l'aide des registres D et E du Z80

Si on regarde dans la rom du vg5000, on trouve ça à l'adresse 0D7C:

Code : Tout sélectionner

0d7c 0e8f      ld      c,8fh
0d7e ed51      out     (c),d
0d80 0ecf      ld      c,0cfh
0d82 ed59      out     (c),e
0d84 c9        ret     
et ça à l'adresse 0286:

Code : Tout sélectionner

0286 3e20      ld      a,20h        20=Command register
0288 d38f      out     (8fh),a
028a dbcf      in      a,(0cfh) <-
028c b7        or      a          |
028d fa8a02    jp      m,028ah ---
0290 c9        ret     
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: KRF Repeat

Message par Dominique »

Sur l'émulateur il semble bien qu'elle soit inopérante.

- KRF et KRF avec incrément marchent bien (avec incrément le registre R7 pointe bien sur la colonne suivante)
- Pour la commande KRF avec répétition ( 5 dans R0 + EXEC - J'ai même essayé 4) rien ne se passe.

- Le programme Forth veut dire : REG! = écrire dans le registre qui a été déclaré précédemment et j'ai utilisé le NOP et WAIT de l'instruction MVT-NOSTOP qui elle marche bien.
EF2.jpg
EF2.jpg (97.62 Kio) Consulté 3686 fois
- Le programme ne s'est pas mis en échec puisqu'il est en train d'attendre par lecture du clavier comme le demande la commande KEY (CALL $32B7 dans le Forth).
D'ailleurs la pile SP en $FAF2 a la bonne adresse retour.
EF1.jpg
EF1.jpg (325.21 Kio) Consulté 3686 fois
- Les registres R6 et R7 ont gardé les valeurs d'avant l'envoi de la commande.

Reste à essayer du l'ordinateur, je vais tenter ce soir ou demain soir; On sera fixé
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: KRF Repeat

Message par Daniel »

Ne cherchez pas plus longtemps : je viens de vérifier dans dcvg5k, les commandes CLG et CLF ne sont pas programmées.
Daniel
L'obstacle augmente mon ardeur.
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: KRF Repeat

Message par Dominique »

OK,

De mon coté je n'arrive pas à charger les programmes. Peut être un problème de Jack - Il me donne : Opérande mal adapté et parfois il dit qu'il a trouvé MLLOGO (le correct c'est LOGO) J'ai tenté à peu près tous les volumes de son mais rien n'y fait

Edit : trouvé : il fallait désactiver les "Améliorations audio" qui semble-t-il font tout le contraire d'améliorer
Avatar de l’utilisateur
Carl
Modérateur
Messages : 13253
Inscription : 08 avr. 2007 13:21
Localisation : http://www.doledujura.fr
Contact :

Re: KRF Repeat

Message par Carl »

A priori, ça fonctionne sur un vrai VG5000 (ne pas tenir compte des reflets :roll: ) L'écran devient noir...
Image5.jpg
Image5.jpg (91.11 Kio) Consulté 3665 fois
Suite à un CTRL Delta, l'écran reste noir ...
Image6.jpg
Image6.jpg (116.04 Kio) Consulté 3665 fois
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: KRF Repeat

Message par Dominique »

Est ce que tu as un prompt ? ou est il figé ?
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: KRF Repeat

Message par Dominique »

J'ai eu ça en mettant la lettre E et les paramètres couleur que z80¯\_(ツ)_/¯ avait mis.

Mais l'écran est figé et comme je n'avais fait que la ligne $0B il est étrange qu'il m'ait fait tout l'écran
EF3.jpg
EF3.jpg (773.62 Kio) Consulté 3662 fois
Avatar de l’utilisateur
Mokona
Messages : 1040
Inscription : 17 déc. 2016 22:01
Localisation : Nord Est des Yvelines
Contact :

Re: KRF Repeat

Message par Mokona »

Ctrl-Delta fait un reset à chaud.

La ROM ne repasse pas par l'initialisation de l'EF9345, et donc ne revient pas au mode "fixed short" (les réinitialisations à chaud sont faites sur les variables systèmes qui servent à mettre à jour l'écran à chaque IRQ, plus la redéfinition de deux caractères spéciaux).
Avatar de l’utilisateur
z80¯\_(ツ)_/¯
Messages : 77
Inscription : 06 oct. 2020 13:15
Localisation : Bourgogne

Re: KRF Repeat

Message par z80¯\_(ツ)_/¯ »

Merci pour votre aide.
Si je comprend bien, le CLF marche sur un VG5000 mais l'écran reste figé après la commande.
Et le registres R6 et R7 ne sont pas pris en compte pour cette commande. Ils sont ignorés puisque l’effacement commence en (0,0) de toute façon.
Avatar de l’utilisateur
Carl
Modérateur
Messages : 13253
Inscription : 08 avr. 2007 13:21
Localisation : http://www.doledujura.fr
Contact :

Re: KRF Repeat

Message par Carl »

Dominique, pas de prompt...
Merci Mokona.
oui, Z80, l'écran est figé.

Carl
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: KRF Repeat

Message par Daniel »

L'émulation EF8345 a été programmée en 2005. D'après mes (vieux) souvenirs, je n'ai pas programmé les commandes CLF et CLG car je n'avais pas bien compris ce qu'elles faisaient exactement. En particulier je ne savais pas quelles valeurs avaient R6 et R7 au départ et à la fin de l'exécution.

En relisant la documentation aujourd'hui, je crois comprendre que l'exécution s'arrête si une autre commande est envoyée ou si la dernière ligne de l'écran est atteinte. Est-ce juste ?

Par contre la valeur initiale de R6 et R7 est-elle prise en compte ? Ou alors R6 et R7 sont-ils remis à zéro ? Là j'ai encore un doute.

Si ces points peuvent être précisés par des essais sur la vraie machine je peux corriger dcvg5k pour en tenir compte.
Daniel
L'obstacle augmente mon ardeur.
Avatar de l’utilisateur
Papy.G
Modérateur
Messages : 3047
Inscription : 10 juin 2014 13:40
Localisation : Haute-Garonne/Gers

Re: KRF Repeat

Message par Papy.G »

Dominique a écrit : 19 oct. 2020 23:49Mais l'écran est figé et comme je n'avais fait que la ligne $0B il est étrange qu'il m'ait fait tout l'écran
Une fois la commande lancée, l'EF9345 fait son job de son coôté, et ne s'arrête que lors de l'envoi d'un NOP, ou potentiellement d'une autre commande quelconque, qui pourrait être ignorée (comme le NOP à l'initialisation du 9345, par lequel la notice indique de toujours commencer).
z80¯\_(ツ)_/¯ a écrit : 20 oct. 2020 07:05Si je comprend bien, le CLF marche sur un VG5000 mais l'écran reste figé après la commande.
Et le registres R6 et R7 ne sont pas pris en compte pour cette commande. Ils sont ignorés puisque l’effacement commence en (0,0) de toute façon.
Vu la nature de la commande, je pense que le remplissage commence à l'endroit pointé par R6 et R7, et doit reboucler en fin de page-écran. Cela peut être vérifié en ne laissant pas assez de temps au VDP pour remplir toute la page, et en lisant R6 et R7 immédiatement après. ;)
Peut-être qu'en utilisant CLG en laissant la location de la page-écran du BASIC, on peut voir se réafficher le prompt au retour.

Ces commandes sont très intéressantes, s'il s'avéraient qu'elles commencent là où les pointeurs R6 et R7 pointent, car elle permettrait de remplir un écran très rapidement (à condition de bien maîtiser le timing du CPU de la machine, et parer aux éventuelles déviances si le VDP et le CPU ne partagent pas la même base de temps).
Soyez exigeants, ne vous contentez pas de ce que l'on vous vend.
Demandez-en plus, ou faites-le vous-même.
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: KRF Repeat

Message par Dominique »

Merci Daniel, on va essayer de se coller à ça

Ce qu'on voit sur ma photo est le résultat de KRF Repeat avec 5 dans R0+exec (ligne) 0B dans R6 et (colonne) 0 dans R7. Mais je n'ai pas fait de loop lui demandant de parcourir toute les lignes.

- Comme on le voit il n'a pas touché à la ligne 0 mais a touché à ligne 8 et, ÉTRANGE, ne s'est pas arrêté à la fin de la ligne, il a continué jusqu'à la fin de l'écran. Je ne sais pas si Carl peut reprendre le listing de Z80 en arrêtant le programme avant qu'il ne fasse la ligne suivante (je ne me souviens plus si c'est $50F6 ou $50FC ?)

- J'ai tenté en mettant 04 dans R0+exec afin de ne pas mettre l'incrément (bit i de la p115 de Alice), il a bien écrit la lettre E sur fond cyan mais l'ordi était figé.

Je me pose la question : Cette commande est-elle officiellement valide pour le EF ? car le livre parle de repeat mais sauf erreur de ma part ne donne pas d'exemples. Si je lis bien le listing efface écran de la page 116 c'est un KRF avec incrément et pas de repeat puisqu'il met $01 dans R0 ligne 57 du listing.
Répondre