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

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

Re: KRF Repeat

Message par Daniel »

Merci ! Ces essais confirment bien ce que je suppose :
- L'affichage commence en R6/R7
- Il se répète automatiquement avec incrément des registres pour balayer l'écran de gauche à droite et de haut en bas.
- Il se termine en fin d'écran, ou par l'envoi d'une autre commande avant la fin du remplissage.
The execution of any command (except VRM, VSM) is suspended during the last and first TV line of an active row. This because the memory bus cannot be allocated for microprocessor access during this 104 µs period.
Il y a encore un doute, car "suspended" veut dire "interrompu" mais pas "terminé". Si l'exécution reprend à la trame suivante, le numéro de ligne est-il remis à zéro ou reste-t-il celui de la dernière ligne ?


J'attends confirmation par d'autres essais pour publier une nouvelle version de dcvg5k.
A ma connaissance les deux commandes CLF et CLG ne sont pas utilisées par la logithèque du VG5000, ni par celle de l'Alice 32, c'est pourquoi je ne m'en était pas beaucoup préoccupé. Mais grâce à ce fil de discussion il va y avoir un progrès. Merci à z80 d'avoir lancé le sujet !
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 : 20 oct. 2020 10:17Ce 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.
Pas besoin de Loop, cette commande prévoit le loop par défaut et en interne, au bout de la ligne, le numéro de colonne est remis à 0, et le numéro de ligne est incrémenté.
Dominique a écrit :- 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.
Normal, regarde le schéma Fig.9 P11/38 de la doc du 9345, l'incrémentation du numéro de ligne se fait de 8 à 31 et en boucle, la(les) ligne(s) d'état sont laissées de côté.
Je pense qu'en fait, il reboucle et re-remplis l'écran à l'infini. Ce qui serait intéressant, c'est de changer R1 pendant le remplissage, pour voir si à un moment, le VDP réactualise cette valeur depuis la BAL. (je pense que non, tant qu'on n'envoie pas de nouvelle commande, mais on n'est pas à l'abri d'une bonne surprise)
Dominique a écrit :- 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é.
Le code opérande est le même pour KRF, KRG, CLF, et CLG, c'est le bit 2 de paramètre qui différencie les instructions de remplissage d'écran de celles de remplissage de "fenêtre" caractère, et le bit 1 pour indiquer si l'on est en 24 ou 16 bits.
Si tu ne mets pas l'incrément dans R0, il doit répéter à l'infini l'écriture du caractère là où le pointeur indique.
Dominique a écrit :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.
La Datasheet du EF 9345 est évasive sur certains points, et par-dessus ça, les docs des ordinateurs sont incomplètes… :roll:
La preuve: aucun jeu commercial n'utilise le CLF et CLG si bien que l'absence d'implémentation dans l'émulateur n'a choqué personne jusqu'à présent. :P

Du coup, je me damande, KRC, KRL, KRV n'ont pas de pendant remplissage de page entier, suffit-il qu'on mette le bit 2 de paramètre à 1 pour obtenir le même effet qu'avec KRF et KRG? :mrgreen:
Daniel a écrit : 20 oct. 2020 11:07- Il se termine en fin d'écran, ou par l'envoi d'une autre commande avant la fin du remplissage.
Je pense qu'il se reboucle en début de page-écran, et à l'infini, (Sinon, la doc n'indiquerait pas d'envoyer un NOP, mais jsute d'attendre le temps nécessaire au remplissage), mais c'est un point à vérifier.
The execution of any command (except VRM, VSM) is suspended during the last and first TV line of an active row. This because the memory bus cannot be allocated for microprocessor access during this 104 µs period.
Il y a encore un doute, car "suspended" veut dire "interrompu" mais pas "terminé". Si l'exécution reprend à la trame suivante, le numéro de ligne est-il remis à zéro ou reste-t-il celui de la dernière ligne ?
Fig.10, P12/38 Il s'agit probablement d'un "hang", le processeur met de côté ce qu'il fait en mémoire pour s'occuper de charger les infos à afficher au balayage, puis les affiche, il ne reprend que pendant le temps disponible hors balayage, mais aussi pendant les moments disponibles entrelacés avec le balayage des huit autres lignes.
L'étude de la doc du EF9340/41 est très instructive et permet mieux d'appréhender les suivants (45, 47…), en commençant par intégrer le fait que c'est bien un couple de processeurs qui partagent la même mémoire, l'un fait les opérations mémoire, la communication avec le CPU de la machine, et l'autre, prioritaire en accès à la mémoire partagée, génère les caractères et produit le balayage.
J'attends confirmation par d'autres essais pour publier une nouvelle version de dcvg5k.
A ma connaissance les deux commandes CLF et CLG ne sont pas utilisées par la logithèque du VG5000, ni par celle de l'Alice 32, c'est pourquoi je ne m'en était pas beaucoup préoccupé. Mais grâce à ce fil de discussion il va y avoir un progrès. Merci à z80 d'avoir lancé le sujet !
8)
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 »

Avant de m'absenter avec 5 dans R0+exec j'ai à peu près tout tenté -> L'écran se rempli et se fige

La seule chose est qu'en mettant 4 dans R0+EXEC (donc sans INC) seul la cellule pointée par R6 R7 met le caractere donné. Mais la commande fige tout également donc impossible de lire R7
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: KRF Repeat

Message par Dominique »

Bonjour,

Je viens de faire des tests avec le programme suivant :

Code : Tout sélectionner

0005   4A00             .ORG 4a00H
0006   4A00             
0007   4A00             entree:
; Programme1 classique : Ligne 0 colonne 0 KRF repeat avec INC ($05 dans R0+EXEC)
; WAIT et NOP - Attente de KEY  
0008   4A00 C3 6E 4A    	JP Prg1

; Programme2  Ligne 0 colonne 0 KRF repeat avec INC ($05 dans R0+EXEC)
; seulement un NOP - Attente de KEY 
0009   4A03 C3 7D 4A    	JP Prg2

; Programme3 : Ligne 0 colonne 0 KRF repeat SANS INC ($04 dans R0+EXEC)
; WAIT et NOP - Attente de KEY 
0010   4A06 C3 89 4A    	JP Prg3

; Programme4 	Ligne $0B colonne 0 KRF repeat avec INC ($05 dans R0+EXEC)
; WAIT et NOP - Attente de KEY 
0011   4A09 C3 9C 4A    	JP Prg4

; Programme5 Ligne $0B colonne 0 KRF repeat avec INC ($05 dans R0+EXEC)
; plusieurs WAIT et 1 NOP - Attente de KEY 
0012   4A0C C3 AE 4A    	JP Prg5
0013   4A0F             
0014   4A0F             
0015   4A0F             fill_screen_repeat:
0016   4A0F F3          	DI
0017   4A10                 ; C
0018   4A10 16 21       	LD      D,21H	; r1 = car
0019   4A12 1E 41       	LD      E,41H	; car 65
0020   4A14 CD 56 4A    	CALL    EF9345	;    call EF9345
0021   4A17                 ; B
0022   4A17 16 22       	LD      D,22H	; r2 = car
0023   4A19 1E 01       	LD      E,01H
0024   4A1B CD 56 4A    	CALL    EF9345	;    call EF9345
0025   4A1E                 ; A
0026   4A1E 16 23       	LD      D,23H 	; R3
0027   4A20 1E 65       	LD      E,65H	; cyan/magenta dans R3 01110001 -> Bits de poids fort = 7
0028   4A22 CD 56 4A    	CALL    EF9345	;call EF9345
0029   4A25 16 26       	LD      D,26H 	; r6 = ligne (0 pour 0 et n+7 pour [1 <= n <= 24])
0030   4A27             ligne:
0031   4A27 1E 00       	LD      E,00H
0032   4A29 CD 56 4A    	CALL    EF9345	;    call EF9345
0033   4A2C 16 27       	LD      D,27H 	; r7 = colonne entre 0 et 39
0034   4A2E             colonne:
0035   4A2E 1E 00       	LD      E,00H
0036   4A30 CD 56 4A    	CALL    EF9345	;    call EF9345
0037   4A33 16 28       	LD      D,28H 	; d=40 (registre r0 + 8 execution)
0038   4A35             repeat:
0039   4A35 1E 05       	LD      E,05H 	; et e=0 krf repeat
0040   4A37 CD 56 4A    	CALL    EF9345	;    call EF9345
0041   4A3A C9          	RET
0042   4A3B             
0043   4A3B                 ; wait
0044   4A3B             wait:
0045   4A3B 01 FF 00    	LD      BC,00FFH            ;loads bc with hex 1000
0046   4A3E             outer:
0047   4A3E 11 FF 00    	LD      DE,00FFH            ;loads de with hex 1000
0048   4A41             inner:
0049   4A41 1B          	DEC     DE            	;decrements de
0050   4A42 7A          	LD      A,D            	;copies d into a
0051   4A43 B3          	OR      E              	;bitwise or of e with a (now, a = d | e)
0052   4A44 C2 41 4A    	JP      NZ,inner	;jp nz, inner-jumps back to inner: label if a is not zero
0053   4A47 0B          	DEC     BC           	;decrements bc
0054   4A48 78          	LD      A,B             ;copies b into a
0055   4A49 B1          	OR      C               ;bitwise or of c with a (now, a = b | c)
0056   4A4A C2 3E 4A    	JP      NZ,outer	;jp nz, outer-jumps back to outer: label if a is not zero
0057   4A4D C9          	RET
0058   4A4E             
0059   4A4E             NOP:
0060   4A4E 16 28       	LD      D,28H 		; d=40 (registre r0 + 8 pour l execution)
0061   4A50 1E 91       	LD      E,91H		; et e=145 nop
0062   4A52 CD 56 4A    	CALL    EF9345		;call EF9345
0063   4A55 C9          	RET     
0064   4A56             
0065   4A56             ; Ecriture registre ef9345 (d=numero du registre)
0066   4A56             EF9345:   
0067   4A56 F5          	PUSH    AF
0068   4A57 C5          	PUSH    BC
0069   4A58 CD 86 02    	CALL    0286H ; teste si EF935 est pret
0070   4A5B CD 7C 0D    	CALL    0D7CH ; ecrit dans EF9345 (D=numero du registre, E=valeur du registre)
0071   4A5E CD 86 02    	CALL    0286H
0072   4A61 C1          	POP     BC
0073   4A62 F1          	POP     AF
0074   4A63 C9          	RET     
0075   4A64             key:					; 
0076   4A64 CD B7 32    	CALL	32b7h		 	;  Lecture clavier
0077   4A67 38 FB       	JR	C, key			;  Si C alors répétition
0078   4A69 B7          	OR	A
0079   4A6A 28 F8       	JR	Z, key			; Si aucune touche
0080   4A6C FB          	EI
0081   4A6D C9          	RET
0082   4A6E         
0083   4A6E             Prg1:
0084   4A6E E5          	PUSH    HL
0085   4A6F CD 0F 4A    	CALL fill_screen_repeat
0086   4A72 CD 3B 4A    	CALL wait
0087   4A75 CD 4E 4A    	CALL NOP
0088   4A78 CD 64 4A    	CALL key
0089CALL   4A7B C1          	POP     BC
0090   4A7C C9          	RET
0091   4A7D             
0092   4A7D             Prg2:
0093   4A7D E5          	PUSH    HL
0094   4A7E CD 0F 4A    	CALL fill_screen_repeat
0095   4A81 CD 4E 4A    	CALL NOP
0096   4A84 CD 64 4A    	CALL key
0097   4A87 C1          	POP     BC
0098   4A88 C9          	RET
0099   4A89             Prg3:
0100   4A89 E5          	PUSH    HL
0101   4A8A 3E 04       	LD A,04H
0102   4A8C 32 36 4A    	LD (repeat+1),A
0103   4A8F CD 6E 4A    	CALL Prg1
0104   4A92 3E 05       	LD A,05H
0105   4A94 32 36 4A    	LD (repeat+1),A
0106   4A97 CD 64 4A    	CALL key
0107   4A9A C1          	POP     BC
0108   4A9B C9          	RET
0109   4A9C             Prg4:
0110   4A9C E5          	PUSH    HL
0111   4A9D 3E 0B       	LD A,0BH
0112   4A9F 32 28 4A    	LD (ligne+1),A
0113   4AA2 CD 6E 4A    	CALL Prg1
0114   4AA5 AF          	XOR A
0115   4AA6 32 28 4A    	LD (ligne+1),A
0116   4AA9 CD 64 4A    	CALL key
0117   4AAC C1          	POP BC
0118   4AAD C9          	RET
0119   4AAE             Prg5:
0120   4AAE E5          	PUSH    HL
0121   4AAF 3E 0B       	LD A,0BH
0122   4AB1 32 28 4A    	LD (ligne+1),A
0123   4AB4 CD 0F 4A    	CALL fill_screen_repeat
0124   4AB7 CD 3B 4A    	CALL wait
0125   4ABA CD 3B 4A    	CALL wait
0126   4ABD CD 3B 4A    	CALL wait
0127   4AC0 CD 3B 4A    	CALL wait
0128   4AC3 CD 4E 4A    	CALL NOP
0129   4AC6 AF          	XOR A
0130   4AC7 32 28 4A    	LD (ligne+1),A
0131   4ACA CD 64 4A    	CALL key
0132   4ACD C1          	POP  BC
0133   4ACE C9          	RET
0134   4ACF             .ENDtasm: Number of errors = 0
Sans surprise les programmes 1 et 2 donnent le même écran figé
EFR1.jpg
EFR1.jpg (724.27 Kio) Consulté 3312 fois
Le programme 3 (Sans incrément) donne : L'image qui suit .
le caractère suit un mode clignotant peut être en raison des valeurs d'un registre indirect, j'avoue ne pas les avoir lus.
EFR2.jpg
EFR2.jpg (720.7 Kio) Consulté 3312 fois
EFR3.jpg
EFR3.jpg (711.94 Kio) Consulté 3312 fois
Les programmes 4 et 5 ne remplissent pas la ligne 0, ce qui correspond au commentaire de ¨Papy sur le schéma Fig.9 P11/38 de la doc du 9345,"
EFR4.jpg
EFR4.jpg (751.7 Kio) Consulté 3312 fois
Si vous voyez d'autre tests à faire, n'hésitez pas, le VG est sur le bureau
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: KRF Repeat

Message par Daniel »

Pour permettre le retour au Basic après l'exécution d'un programme en langage machine, n'y a-t-il pas des registres à sauver au début et à restaurer avant le retour ? C'est l'expérience que j'ai sur Thomson, et ça pourrait peut-être expliquer l'écran figé.
Autre chose à vérifier (je ne connais pas la réponse) : la lecture du clavier est-elle possible quand les interruptions sont masquées ?
Dernière modification par Daniel le 21 oct. 2020 14:11, modifié 1 fois.
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 »

Il me semble qu'il n'y a pas de retour puisque le programme est censé au moins attendre KEY pour y retourner. Il est donc toujours dans CALL.
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: KRF Repeat

Message par Dominique »

Je peux essayer de lui demander de nous envoyer un signal pour voir s'il bloque juste avant le NOP. Peut être en lui demandant de se réinitialiser après KEY.
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: KRF Repeat

Message par Dominique »

Sur la lecture du clavier après DI je vais vérifier - Je cherche comment faire le reboot du VG.

Parlant de DI, j'ai omis de dire que si on les enlève le VG nous montre furtivement l'écran rempli comme sur les photos puis retourne à l'écran du Basic. Je vais faire un test qui supprime DI et EI pour faire une petite video.
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 »

routine en $0033 : départ à chaud

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

Re: KRF Repeat

Message par Dominique »

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

Re: KRF Repeat

Message par Dominique »

Il y a pas mal de test - Puisque Carl est aussi sur le pont, voici le programme.
KRFLM.zip
(3.69 Kio) Téléchargé 87 fois

Code : Tout sélectionner

0004   0000             
0005   4A00             .ORG 4a00H
0006   4A00             
0007   4A00             entree:
0008   4A00             
0009   4A00             ; Programme1 classique : Ligne 0 colonne 0 KRF repeat avec INC ($05 dans R0+EXEC)
0010   4A00             ; WAIT et NOP - Attente de KEY 
0011   4A00 C3 83 4A    	JP Prg1
0012   4A03             
0013   4A03             ; Programme2  Ligne 0 colonne 0 KRF repeat avec INC ($05 dans R0+EXEC)
0014   4A03             ; seulement un NOP - Attente de KEY 
0015   4A03 C3 92 4A    	JP Prg2
0016   4A06             
0017   4A06             ; Programme3 : Ligne 0 colonne 0 KRF repeat SANS INC ($04 dans R0+EXEC)
0018   4A06             ; WAIT et NOP - Attente de KEY 
0019   4A06 C3 9E 4A    	JP Prg3
0020   4A09             
0021   4A09             ; Programme4 	Ligne $0B colonne 0 KRF repeat avec INC ($05 dans R0+EXEC)
0022   4A09             ; WAIT et NOP - Attente de KEY
0023   4A09 C3 B1 4A    	JP Prg4
0024   4A0C             
0025   4A0C             ; Programme5 Ligne $0B colonne 0 KRF repeat avec INC ($05 dans R0+EXEC)
0026   4A0C             ; plusieurs WAIT et 1 NOP - Attente de KEY 
0027   4A0C C3 C3 4A    	JP Prg5
0028   4A0F             
0029   4A0F             ; Programme6 classique : Ligne 0 colonne 0 KRF repeat avec INC ($05 dans R0+EXEC)
0030   4A0F             ;  Remet les interruptions puis WAIT et NOP - Attente de KEY 
0031   4A0F C3 E4 4A    	JP Prg6
0032   4A12             
0033   4A12             ; Programme7 classique : Ligne 0 colonne 0 KRF repeat avec INC ($05 dans R0+EXEC)
0034   4A12             ; WAIT Remet les interruptions puis NOP - Attente de KEY 
0035   4A12 C3 F4 4A    	JP Prg7
0036   4A15             
0037   4A15             ; Programme8 classique : Ligne 0 colonne 0 KRF repeat avec INC ($05 dans R0+EXEC)
0038   4A15             ; WAIT  NOP Remet les interruptions puis- Attente de KEY 
0039   4A15 C3 04 4B    	JP Prg8
0040   4A18             
0041   4A18             ; Programme9 classique : AVEC interruptions - Ligne 0 colonne 0 KRF repeat avec INC ($05 dans R0+EXEC)
0042   4A18             ; WAIT et NOP - Attente de KEY 
0043   4A18 C3 14 4B    	JP Prg9
0044   4A1B             
0045   4A1B             ; Programme10 classique : Ligne 0 colonne 0 KRF repeat avec INC ($05 dans R0+EXEC)
0046   4A1B             ;  fait un départ à chaud WAIT et NOP - Attente de KEY 
0047   4A1B C3 23 4B    	JP Prg10
0048   4A1E             
0049   4A1E             ; Programme11 classique : Ligne 0 colonne 0 KRF repeat avec INC ($05 dans R0+EXEC)
0050   4A1E             ;  WAIT fait un départ à chaud et NOP - Attente de KEY 
0051   4A1E C3 35 4B    	JP Prg11
0052   4A21             
0053   4A21             ; Programme12 classique : Ligne 0 colonne 0 KRF repeat avec INC ($05 dans R0+EXEC)
0054   4A21             ;  WAIT  NOP fait un départ à chaud et- Attente de KEY 
0055   4A21 C3 47 4B    	JP Prg12
0056   4A24             
0057   4A24             fill_screen_repeat:
0058   4A24 F3          	DI
0059   4A25             fill_scr_sans_DI:
0060   4A25                 ; C
0061   4A25 16 21       	LD      D,21H	; r1 = car
0062   4A27 1E 41       	LD      E,41H	; car 65
0063   4A29 CD 6B 4A    	CALL    EF9345	;    call EF9345
0064   4A2C                 ; B
0065   4A2C 16 22       	LD      D,22H	; r2 = car
0066   4A2E 1E 01       	LD      E,01H
0067   4A30 CD 6B 4A    	CALL    EF9345	;    call EF9345
0068   4A33                 ; A
0069   4A33 16 23       	LD      D,23H 	; R3
0070   4A35 1E 65       	LD      E,65H	; cyan/magenta dans R3 01110001 -> Bits de poids fort = 7
0071   4A37 CD 6B 4A    	CALL    EF9345	;call EF9345
0072   4A3A 16 26       	LD      D,26H 	; r6 = ligne (0 pour 0 et n+7 pour [1 <= n <= 24])
0073   4A3C             ligne:
0074   4A3C 1E 00       	LD      E,00H
0075   4A3E CD 6B 4A    	CALL    EF9345	;    call EF9345
0076   4A41 16 27       	LD      D,27H 	; r7 = colonne entre 0 et 39
0077   4A43             colonne:
0078   4A43 1E 00       	LD      E,00H
0079   4A45 CD 6B 4A    	CALL    EF9345	;    call EF9345
0080   4A48 16 28       	LD      D,28H 	; d=40 (registre r0 + 8 execution)
0081   4A4A             repeat:
0082   4A4A 1E 05       	LD      E,05H 	; et e=0 krf repeat
0083   4A4C CD 6B 4A    	CALL    EF9345	;    call EF9345
0084   4A4F C9          	RET
0085   4A50             
0086   4A50                 ; wait
0087   4A50             wait:
0088   4A50 01 FF 00    	LD      BC,00FFH            ;loads bc with hex 1000
0089   4A53             outer:
0090   4A53 11 FF 00    	LD      DE,00FFH            ;loads de with hex 1000
0091   4A56             inner:
0092   4A56 1B          	DEC     DE            	;decrements de
0093   4A57 7A          	LD      A,D            	;copies d into a
0094   4A58 B3          	OR      E              	;bitwise or of e with a (now, a = d | e)
0095   4A59 C2 56 4A    	JP      NZ,inner	;jp nz, inner-jumps back to inner: label if a is not zero
0096   4A5C 0B          	DEC     BC           	;decrements bc
0097   4A5D 78          	LD      A,B             ;copies b into a
0098   4A5E B1          	OR      C               ;bitwise or of c with a (now, a = b | c)
0099   4A5F C2 53 4A    	JP      NZ,outer	;jp nz, outer-jumps back to outer: label if a is not zero
0100   4A62 C9          	RET
0101   4A63             
0102   4A63             NOP:
0103   4A63 16 28       	LD      D,28H 		; d=40 (registre r0 + 8 pour l execution)
0104   4A65 1E 91       	LD      E,91H		; et e=145 nop
0105   4A67 CD 6B 4A    	CALL    EF9345		;call EF9345
0106   4A6A C9          	RET     
0107   4A6B             
0108   4A6B             ; Ecriture registre ef9345 (d=numero du registre)
0109   4A6B             EF9345:   
0110   4A6B F5          	PUSH    AF
0111   4A6C C5          	PUSH    BC
0112   4A6D CD 86 02    	CALL    0286H ; teste si EF935 est pret
0113   4A70 CD 7C 0D    	CALL    0D7CH ; ecrit dans EF9345 (D=numero du registre, E=valeur du registre)
0114   4A73 CD 86 02    	CALL    0286H
0115   4A76 C1          	POP     BC
0116   4A77 F1          	POP     AF
0117   4A78 C9          	RET     
0118   4A79             key:	
0119   4A79 FB          	EI				; 
0120   4A7A CD B7 32    	CALL	32b7h		 	;  Lecture clavier
0121   4A7D 38 FA       	JR	C, key			;  Si C alors répétition
0122   4A7F B7          	OR	A
0123   4A80 28 F7       	JR	Z, key			; Si aucune touche
0124   4A82 C9          	RET
0125   4A83             
0126   4A83             Prg1:
0127   4A83 E5          	PUSH    HL
0128   4A84 CD 24 4A    	CALL fill_screen_repeat
0129   4A87 CD 50 4A    	CALL wait
0130   4A8A CD 63 4A    	CALL NOP
0131   4A8D CD 79 4A    	CALL key
0132   4A90 C1          	POP     BC
0133   4A91 C9          	RET
0134   4A92             
0135   4A92             Prg2:
0136   4A92 E5          	PUSH    HL
0137   4A93 CD 24 4A    	CALL fill_screen_repeat
0138   4A96 CD 63 4A    	CALL NOP
0139   4A99 CD 79 4A    	CALL key
0140   4A9C C1          	POP     BC
0141   4A9D C9          	RET
0142   4A9E             Prg3:
0143   4A9E E5          	PUSH    HL
0144   4A9F 3E 04       	LD A,04H
0145   4AA1 32 4B 4A    	LD (repeat+1),A
0146   4AA4 CD 83 4A    	CALL Prg1
0147   4AA7 3E 05       	LD A,05H
0148   4AA9 32 4B 4A    	LD (repeat+1),A
0149   4AAC CD 79 4A    	CALL key
0150   4AAF C1          	POP     BC
0151   4AB0 C9          	RET
0152   4AB1             Prg4:
0153   4AB1 E5          	PUSH    HL
0154   4AB2 3E 0B       	LD A,0BH
0155   4AB4 32 3D 4A    	LD (ligne+1),A
0156   4AB7 CD 83 4A    	CALL Prg1
0157   4ABA AF          	XOR A
0158   4ABB 32 3D 4A    	LD (ligne+1),A
0159   4ABE CD 79 4A    	CALL key
0160   4AC1 C1          	POP BC
0161   4AC2 C9          	RET
0162   4AC3             Prg5:
0163   4AC3 E5          	PUSH    HL
0164   4AC4 3E 0B       	LD A,0BH
0165   4AC6 32 3D 4A    	LD (ligne+1),A
0166   4AC9 CD 24 4A    	CALL fill_screen_repeat
0167   4ACC CD 50 4A    	CALL wait
0168   4ACF CD 50 4A    	CALL wait
0169   4AD2 CD 50 4A    	CALL wait
0170   4AD5 CD 50 4A    	CALL wait
0171   4AD8 CD 63 4A    	CALL NOP
0172   4ADB AF          	XOR A
0173   4ADC 32 3D 4A    	LD (ligne+1),A
0174   4ADF CD 79 4A    	CALL key
0175   4AE2 C1          	POP  BC
0176   4AE3 C9          	RET
0177   4AE4             Prg6:
0178   4AE4 E5          	PUSH    HL
0179   4AE5 CD 24 4A    	CALL fill_screen_repeat
0180   4AE8 FB          	EI
0181   4AE9 CD 50 4A    	CALL wait
0182   4AEC CD 63 4A    	CALL NOP
0183   4AEF CD 79 4A    	CALL key
0184   4AF2 C1          	POP     BC
0185   4AF3 C9          	RET
0186   4AF4             Prg7:
0187   4AF4 E5          	PUSH    HL
0188   4AF5 CD 24 4A    	CALL fill_screen_repeat
0189   4AF8 CD 50 4A    	CALL wait
0190   4AFB FB          	EI
0191   4AFC CD 63 4A    	CALL NOP
0192   4AFF CD 79 4A    	CALL key
0193   4B02 C1          	POP     BC
0194   4B03 C9          	RET
0195   4B04             Prg8:
0196   4B04 E5          	PUSH    HL
0197   4B05 CD 24 4A    	CALL fill_screen_repeat
0198   4B08 CD 50 4A    	CALL wait
0199   4B0B CD 63 4A    	CALL NOP
0200   4B0E FB          	EI
0201   4B0F CD 79 4A    	CALL key
0202   4B12 C1          	POP     BC
0203   4B13 C9          	RET
0204   4B14             Prg9:
0205   4B14 E5          	PUSH    HL
0206   4B15 CD 25 4A    	CALL fill_scr_sans_DI
0207   4B18 CD 50 4A    	CALL wait
0208   4B1B CD 63 4A    	CALL NOP
0209   4B1E CD 79 4A    	CALL key
0210   4B21 C1          	POP     BC
0211   4B22 C9          	RET
0212   4B23             
0213   4B23             Prg10:
0214   4B23 E5          	PUSH    HL
0215   4B24 CD 24 4A    	CALL fill_screen_repeat
0216   4B27 CD 33 00    	CALL 0033H	;Départ à chaud
0217   4B2A CD 50 4A    	CALL wait
0218   4B2D CD 63 4A    	CALL NOP
0219   4B30 CD 79 4A    	CALL key
0220   4B33 C1          	POP     BC
0221   4B34 C9          	RET
0222   4B35             
0223   4B35             Prg11:
0224   4B35 E5          	PUSH    HL
0225   4B36 CD 24 4A    	CALL fill_screen_repeat
0226   4B39 CD 50 4A    	CALL wait
0227   4B3C CD 33 00    	CALL 0033H	;Départ à chaud
0228   4B3F CD 63 4A    	CALL NOP
0229   4B42 CD 79 4A    	CALL key
0230   4B45 C1          	POP     BC
0231   4B46 C9          	RET
0232   4B47             
0233   4B47             Prg12:
0234   4B47 E5          	PUSH    HL
0235   4B48 CD 24 4A    	CALL fill_screen_repeat
0236   4B4B CD 50 4A    	CALL wait
0237   4B4E CD 63 4A    	CALL NOP
0238   4B51 CD 33 00    	CALL 0033H	;Départ à chaud
0239   4B54 CD 79 4A    	CALL key
0240   4B57 C1          	POP     BC
0241   4B58 C9          	RET
0242   4B59             .ENDtasm: Number of errors = 0
EDIT : Corrigé programme 9 c'est AVEC Interruptions EI et non pas sans comme je l'avais écrit bêtement.
Dernière modification par Dominique le 21 oct. 2020 15:53, modifié 1 fois.
Avatar de l’utilisateur
z80¯\_(ツ)_/¯
Messages : 77
Inscription : 06 oct. 2020 13:15
Localisation : Bourgogne

Re: KRF Repeat

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

Bonjour, si ça peut vous aider, voici les routines d'init et restore pour l'ef9345 que j'utilise.
Dans l'init passage en commande longue 40 col.
Dans le restore, je repasse le TGS,MAT,PAT au valeur initiales du vg5000. De cette façon l'éditeur basic remarche après les commandes ef9345.
Entre l'init et le restore, vous pouvez faire ce que vous voulez avec l'ef9345.

Code : Tout sélectionner

org $7000
main:
    di
    push hl
    push ix
    
    call init_ef9345
    call restore_ef9345
    
    ; retour basic
    pop ix
    pop hl
    ei
    ret


init_ef9345:
    ld d, $21 ; dans r1
    ld e, $01 ; 0000 0001
    call ef9345
    ld d, $28 ; r0 exec
    ld e, $81 ; commande indirection r=1-> tgs write
    call ef9345; ecrire dans le registre tgs (commandes longues)

    ld d, $21 ; dans r1
    ld e, $47 ; 0100 0111
    call ef9345
    ld d, $28 ; r0 exec
    ld e, $83 ; commande indirection r=3 -> pat write
    call ef9345; ecrire dans le registre pat

    ld d, $21 ; dans r1
    ld e, $04 ; bleu
    call ef9345
    ld d, $28 ; r0 exec avec valeur de e ligne suivante
    ld e, $82 ; commande indirection (1000 0 010) r=2 -> mat write
    call ef9345; ecrire dans le registre mat
    
    ld d, $22 ; r2
    ld e, $01 ; attributs jeu de car / att video
    call ef9345

    ld d, $23 ; r3
    ld e, $71 ; blanc/rouge dans r3 01110001 -> bits de poids fort = 7
    call ef9345    
    ret
    
    
restore_ef9345:
    ld d, $21 ; dans r1
    ld e, $00
    call ef9345
    ld d, $28 ; r0 exec
    ld e, $81 ; commande indirection r=1-> tgs write
    call ef9345; ecrire dans le registre tgs (commandes longues)

    ld d, $21 ; dans r1
    ld e, $f7
    call ef9345
    ld d, $28 ; r0 exec
    ld e, $83 ; commande indirection r=3 -> pat write
    call ef9345; ecrire dans le registre pat

    ld d, $21 ; dans r1
    ld e, $6e ; bleu
    call ef9345
    ld d, $28 ; r0 exec avec valeur de e ligne suivante
    ld e, $82 ; commande indirection (1000 0 010) r=2 -> mat write
    call ef9345; ecrire dans le registre mat
    ret
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: KRF Repeat

Message par Dominique »

Parfait, Z80 - Je vais les inclure pour voir si ça change - Il me semble que R1 aussi donne le jeu de caractères, je vais faire des variantes.

Bon de mon coté j'ai testé en priorité le programme10 qui fait un boot à chaud juste après KRF Repeat (avant le wait) et il n'a pas fait le départ à chaud, il semble donc bloqué là.

Je vous met ce que donne le programme9 (avec interruptions)

On voit bien furtivement l'écran rouge - De plus va sur KEY puisque après un appui au clavier il est retourné au Basic Peut être que Carl testera aussi . On voit bien que l'interruption a arrêté le process non encore terminé. Peut être une piste puisque j'ai fait plusieurs fois cette routine et deux ou trois fois l'écran était figé même sur cette routine AVEC (EDIT : Corrigé j'avais écrit SANS - décidément...) interruptions
video-1603287089.zip
(717.56 Kio) Téléchargé 86 fois
Dernière modification par Dominique le 21 oct. 2020 16:09, modifié 1 fois.
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, veux tu que je teste sur une vrai machine ?
pas avant ce soir...

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

Re: KRF Repeat

Message par Dominique »

Ce serait bien Carl si tu pouvais - Pas la peine de tout faire, juste le prg9 et le 10 - Si le prg10 ne fait pas le retour à chaud après KRF Repeat, pas la peine de tout refaire. C'est là qu'il bloque.
Le programme 9 serait bien, mais surtout de le filmer : on a l'impression que l'interruption arrête KRF (mais pas toujours) ça doit dépendre de l'instant exact et si KRF n'a pas terminé la page. Avec un peu de chance on peut reconstruite son remplissage - enfin il me semble....
Répondre