[ZX-81] Comment est décodé le clavier ???

Placez ici vos trucs et astuces, étalez sans retenue votre savoir-faire et votre science qui va nous permettre de redonner une apparence neuve et fonctionnelle à nos bouzes.

Modérateurs : Papy.G, fneck, Carl

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

[ZX-81] Comment est décodé le clavier ???

Message par 6502man »

Quand je regarde le schéma du ZX-81 et particulièrement du côté du clavier j'e suis pas certain de bien comprendre comment est décodé le clavier ????

Schémas tiré du site de Xavier (merci à lui) :
Image

Image

Les touches pressées sont lu à travers de KBD0-KBD4 ou D0-D7 ???
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
Xavier_

Re: [ZX-81] Comment est décodé le clavier ???

Message par Xavier_ »

Un petit complément:
ZX81_KB.GIF
ZX81_KB.GIF (30.38 Kio) Consulté 3318 fois
KEYS.gif
KEYS.gif (8.39 Kio) Consulté 3318 fois
Donc, tout simplement par ligne, et colonne. ("les deux mon capitaine !", Kbd et Dx)
à l'adresse h4025 et h4026.

ROM:

Code : Tout sélectionner

; THE 'KEYBOARD SCANNING' SUBROUTINE

--------------------------------------------------------------------------------

; The keyboard is read during the vertical sync interval while no video is 
; being displayed.	Reading a port with address bit 0 low i.e. $FE starts the 
; vertical sync pulse.

mark_02BB:
KEYBOARD:
	LD	HL,$FFFF	; (16) prepare a buffer to take key.
	LD	BC,$FEFE	; (20) set BC to port $FEFE. The B register, 
				;	with its single reset bit also acts as 
				;	an 8-counter.
	IN	A,(C)		; (11) read the port - all 16 bits are put on 
				;	the address bus.	Start VSYNC pulse.
	OR	$01		; (7)	set the rightmost bit so as to ignore 
				;	the SHIFT key.

mark_02C5:
EACH_LINE:
	OR	$E0		; [7] OR %11100000
	LD	D,A		; [4] transfer to D.
	CPL			; [4] complement - only bits 4-0 meaningful now.
	CP	1		; [7] sets carry if A is zero.
	SBC	A,A		; [4] $FF if $00 else zero.
	OR	B		; [7] $FF or port FE,FD,FB....
	AND	L		; [4] unless more than one key, L will still be 
				;	$FF. if more than one key is pressed then A is 
				;	now invalid.
	LD	L,A		; [4] transfer to L.

; now consider the column identifier.

	LD	A,H		; [4] will be $FF if no previous keys.
	AND	D		; [4] 111xxxxx
	LD	H,A		; [4] transfer A to H

; since only one key may be pressed, H will, if valid, be one of
; 11111110, 11111101, 11111011, 11110111, 11101111
; reading from the outer column, say Q, to the inner column, say T.

	RLC	B		; [8]	rotate the 8-counter/port address.
				;	sets carry if more to do.
	IN	A,(C)		; [10] read another half-row.
				;	all five bits this time.

	JR	C,EACH_LINE	; [12](7) loop back, until done, to EACH_LINE

;	The last row read is SHIFT,Z,X,C,V	for the second time.

	RRA			; (4) test the shift key - carry will be reset
				;	if the key is pressed.
	RL	H		; (8) rotate left H picking up the carry giving
				;	column values -
				;	$FD, $FB, $F7, $EF, $DF.
				;	or $FC, $FA, $F6, $EE, $DE if shifted.

;	We now have H identifying the column and L identifying the row in the
;	keyboard matrix.

;	This is a good time to test if this is an American or British machine.
;	The US machine has an extra diode that causes bit 6 of a byte read from
;	a port to be reset.

	RLA			; (4) compensate for the shift test.
	RLA			; (4) rotate bit 7 out.
	RLA			; (4) test bit 6.

	SBC	A,A		; (4)		$FF or 0 {USA}
	AND	$18		; (7)		24 or 0
	ADD	A,31		; (7)		55 or 31

;	result is either 31 (USA) or 55 (UK) blank lines above and below the TV 
;	picture.

	LD	(MARGIN),A	; (13) update system variable MARGIN

	RET			; (10) return

https://cdn.hackaday.io/files/289631239 ... -02-09.htm

Des exemples de routines: https://www.sinclairzxworld.com/viewtop ... 0&start=10
Last_K est une variable systèmes en h4025/h4026 sur deux octets… comme déjà mentionné.
Dernière modification par Xavier_ le 15 oct. 2020 02:16, modifié 1 fois.
Avatar de l’utilisateur
6502man
Messages : 12286
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: [ZX-81] Comment est décodé le clavier ???

Message par 6502man »

Merci pour les précisions :D
En faite j"avais mal posé la question :::
je connait le principe de décodage d"une matrice clavier,
mais en voyant le schéma je me demandé si les touches étaient lu par KBDx ou Dx
avec le code et en regardant bien le schéma j"ai la réponse : la touche est lu par KBDx sur 5 bits, et Dx correspond aux adresses du port lu , sur le Z80 il y a que $FF ports accessibles mais le ZX81 utilise une astuce que je ne connaissait pas :
Il adresse le port I/O par une adresse 16bits alors qu'il n'y a que 256 ports adressable par le Z80 :roll:
ce qui permet d’utiliser la partie haute de l'adressage (A8-A15) :D

J'ai du ZX81 avec la nappe clavier HS il va falloir que j'en trouvent ,mais sur le net les prix des matrice ZX81 avec le port Ouch !!!!

Quand on interroge le port $FEFE ont active la ligne A8 (état bas) et donc ont peut lire la ligne : SHIFT Z X C V :wink:


PS: désolé j'utilise un clavier qwerty dans l'immediat :twisted:
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
Patrick
Messages : 2019
Inscription : 16 mai 2009 09:30
Localisation : Clermont-Ferrand

Re: [ZX-81] Comment est décodé le clavier ???

Message par Patrick »

Philippe,
Cette possibilité est également largement utilisée sur Amstrad CPC.
Patrick
Avatar de l’utilisateur
Falkor
Messages : 1701
Inscription : 28 juin 2010 12:09
Localisation : Cluny, Saône et Loire

Re: [ZX-81] Comment est décodé le clavier ???

Message par Falkor »

6502man a écrit : 14 oct. 2020 15:04mais sur le net les prix des matrice ZX81 avec le port Ouch !!!!
Tu as regardé ici ?

https://www.sellmyretro.com/offer/details/2529

(lien donné ici)
Avatar de l’utilisateur
6502man
Messages : 12286
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: [ZX-81] Comment est décodé le clavier ???

Message par 6502man »

@Patrick: tu est sur car il me semblait que le clavier sur CPC était en partie gérer par le AY-3 et la gestion non par les Datas Dx mais par les Adresses Axx ???

@Falkor: je connais bien ce site pour y avoir déjà commandé, mais la le produit n'est plus disponible et les autres annonces sont plus cher !!!
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
Patrick
Messages : 2019
Inscription : 16 mai 2009 09:30
Localisation : Clermont-Ferrand

Re: [ZX-81] Comment est décodé le clavier ???

Message par Patrick »

Je ne parle pas du clavier mais des IO sur la totalité des 16 bits de l'espace d'adressage.
Patrick
Avatar de l’utilisateur
6502man
Messages : 12286
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: [ZX-81] Comment est décodé le clavier ???

Message par 6502man »

Oups j'avais pas compris :oops: :oops:

En tout cas je connaissais pas cette particularité du Z80 d'adresser les 16bits avec OUT et IN alors que l'on ne peut accéder qu'à 256 ports :roll:
Phil.

www.6502man.com

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

Re: [ZX-81] Comment est décodé le clavier ???

Message par hlide »

Les instructions IN et OUT adressent tout le bus d'adresse. La raison pour laquelle la doc tait cet aspect est à cause de OUTI et INI : en effet, le registre B qui définit A|15..8] sert également de compteur et est décrémenté. Sous Amstrad CPC, on peut lire des séquences "OUTI : INC B : OUTI : INC B : ... : OUTI" au lieu d'un "OTIR" qui est inutilisable. Du coup, beaucoup d'architecture se contentent de 256 ports au lieu de 65536.
Notator
Messages : 1286
Inscription : 09 août 2015 20:13

Re: [ZX-81] Comment est décodé le clavier ???

Message par Notator »

6502man a écrit : 14 oct. 2020 22:25 En tout cas je connaissais pas cette particularité du Z80 d'adresser les 16bits avec OUT et IN alors que l'on ne peut accéder qu'à 256 ports :roll:
C'est exact. Contrairement à cette légende tenace, le Z80 n'est pas limité à 256 ports I/O. Rien physiquement ne le limite à cette barrière.
C'est le format 8 bits d'adressage mémoire des instructions d'entrées/sorties les plus courantes qui a entretenu cette confusion.
Mais il en est d'autres qui utilisent les registres HL (16 bits) en adressage, et permettent donc d'accéder au champ complet d'adressage du Z80 en I/O.
Notator est le nom d'un programme séquenceur Midi et notation musicale pour Atari ST(e) (puis Mac).
Avatar de l’utilisateur
6502man
Messages : 12286
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: [ZX-81] Comment est décodé le clavier ???

Message par 6502man »

Donc il y à un OUT (HL),A il me semblais que les assembleurs refusent d'autres arguments que registre 8 bits pour IN/OUT, il faut que je vérifie ....

Et ca devient très intéressant du coup pour adresser des nouveaux ports sur une machine à base de Z80, c'est marrant car il me semble que toutes
les machines à base de Z80 que j'ai put programmer n'utilise jamais de port au delà de $FF (MSX, SC3000, ...) !!!
Phil.

www.6502man.com

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

Re: [ZX-81] Comment est décodé le clavier ???

Message par hlide »

Un "OUT (HL),A" ? jamais vu dans les instructions y compris non officielles. Les "OUT (C), r" aurait du s'écrire "OUT (BC), r" pour être correct.
Avatar de l’utilisateur
hlide
Messages : 3470
Inscription : 29 nov. 2017 10:23

Re: [ZX-81] Comment est décodé le clavier ???

Message par hlide »

Un autre exemple que j'ai utilisé :

MZ-700 PRINTER PORT : $FE (control port) et $FF (data port). Il s'avère que le port $FF en lecture n'est connecté à rien. Donc je pouvais exploiter "IN A, (Ann)" ou "IN r,(BC)" pour autre chose que de l'imprimante.

Pour sélectionner une page de 4 Ko de FLASH (128 x 4 Ko = 512 Ko) à l'emplacement d'une ROM 4 Ko, je me suis servi du port $FF en INPUT de la façon suivante.

1) "LD A, page_selector : IN A,($FF)" --> /IORQ, bus A[15..8] = registre A, bus A[7..0] = $FF => registre A = bus D[7..0]. J'utilise le bus d'adresse pour accéder en lecture au bon port $FF et passer au passage le numéro de page qui sera enregistré par un 74LS273.

2) ou "LD BC, page_selector*256 + $FF : IN B,(C)" --> /IORQ, bus A[15..8] = registre B, bus A[7..0] = $FF => registre B = bus D[7..0].

Merci donc au Z80 de me permettre d'économiser un décodeur d'adresse d'entrée/sortie* et de me permettre de passer des données via le bus d'adresse en utilisant un cas non utilisé : INPUT $FF comme un OUT déguisé.

* : sur la carte-mère , il y a les signaux /W0 (OUT $FE), /W1 (OUT $FF), /R0 (IN $FE) et /R1 (IN $FF) or le dernier signal n'est pas utilisé, donc j'ai juste à récupérer A[15..8] quand le signal /R1 repasse à 1.
Avatar de l’utilisateur
6502man
Messages : 12286
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: [ZX-81] Comment est décodé le clavier ???

Message par 6502man »

Je viens de tester rapidement sur www.asm80.com et il n'accepte pas en paramètre de OUT un registre 16 bits :?
Phil.

www.6502man.com

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

Re: [ZX-81] Comment est décodé le clavier ???

Message par hlide »

On fait dire aux mnémoniques ce que l'on veut. J'ai dit que l'on aurait dû avoir "OUT (BC),r" par rapport à ce qui se passe réellement, mais la norme qui a choisi "OUT (C),r" en a décidé autrement.
Répondre