segunda-feira, 12 de janeiro de 2009

Interface PS/2 para porta de Joystick

Eis um circuito de teste para ligar um dispositivo PS/2 na porta de joystick do MSX. O resistor é opcional.



No protocolo PS/2, o "host" pode deter a comunicação, mantendo a linha de clock em nível baixo por mais de 100us. Por isso foi escolhido o pino 8 da porta de joystick para a linha de clock, pois no MSX esta linha fica normalmente em nível baixo.

O sinal de clock é gerado pelo dispositivo (teclado ou mouse), e a temporização é um pouco apertada (entre 60 a 100us). Por isso, as rotinas de comunicação são um loop que se repete 11 vezes. Na recepcão os bits de partida, parada e paridade são checados apenas ao final do recebimento. Já na transmissão, estes bits são previamente empacotados.

Pelas contas que fiz para a rotina de recepção, cada amostra das linhas de dados ou clock, leva cerca de 12us. O tempo de processamento do bit, leva 14us e o retorno do loop 7us. Creio ser suficiente para atender aos 30~50us de cada fase do clock.



; JPS2
; Rotinas para interface de
; dispositivos PS/2 na porta de
; Joystick do MSX
;
; Daniel José Viana, 2008
; danjovic@hotmail.com
; http://hotbit.blogspot.com
;
; Versao 0.1 11/01/2009
;
; Licenca de uso: GNU GPL
;
; compilado com PASMO Assembler
; www.arrakis.es/~ninsesabe/pasmo/


; Endereços de I/O do PSG
PSGAD: EQU 0A0H
PSGWR: EQU 0A1H
PSGRD: EQU 0A2H

; Registros do PSG

;Register 14
; 7 6 5 4 3 2 1 0
;+-----------------------------------------------+
;¦ Cas ¦ Kbd ¦ Joy ¦ Joy ¦ Joy ¦ Joy ¦ Joy ¦ Joy ¦
;¦Input¦Mode ¦Trg.B¦Trg.A¦Right¦Left ¦Back ¦ Fwd ¦
;+-----------------------------------------------+
; data clock
;Register 15
; 7 6 5 4 3 2 1 0
;+-----------------------------------------------+
;¦Kana ¦ Joy ¦Pulse¦Pulse¦Joy B¦Joy B¦Joy A¦Joy A¦
;¦ LED ¦ Sel ¦ B ¦ A ¦Pin 7¦Pin 6¦Pin 7¦Pin 6¦
;+-----------------------------------------------+
; clock data
; Constantes definidas para porta de Joystick B

; Bits do Registro 14 do PSG
DTBIT: EQU 4 ; linha DATA, leitura
CKBIT: EQU 0 ; linha CLOCK, leitura

; Bits do Registro 15 do PSG
;JOY A
;LNDATA: EQU 0 ; Linha DATA, escrita
;LNCLOCK: EQU 4 ; Linha CLOCK, escrita

;JOY B
LNDATA: EQU 2 ; Linha DATA, escrita
LNCLOCK: EQU 5 ; Linha CLOCK, escrita
ABSEL: EQU 6 ; Seleciona porta A/B

; Constantes
DTMASK: EQU ~(1<TIMEOUT: EQU 15



; Recebe um byte
; H - Byte recebido
; Flag CY - Ligado, se houver erro
;
RXPS2: SCF
CALL MUDACLOCK
LD D,11 ; 11 bits a receber
GETBIT: LD B,TIMEOUT
SAMPBIT: IN A,(PSGRD)
BIT CKBIT,A
JR Z,SHIFTBIT ; Aguarda CLOCK baixar
DJNZ SAMPBIT
JR SAIERRO
SHIFTBIT: AND DTMASK
NEG
RR H
RR L
LD B,TIMEOUT
WAITH: IN A,(PSGRD)
BIT CKBIT,A
JR NZ,PROXBIT
DJNZ WAITH
JR SAIERRO
PROXBIT: DEC D
JR NZ,GETBIT
;
AND A ; Clear Carry
CALL MUDACLOCK
;
; Registrador H
;
; st py D7 D6 D5 D4 D3 D2
; op
;
; Registrador L
; D1 D0 sta xx xx xx xx xx
; rt

RL L
RL H
RL L
RL H
;
; Registrador H
;
; D7 D6 D5 D4 D3 D2 D1 D0
;
; Registrador L
; sta xx xx xx xx xx st py
; rt op

; Testa START bit
BIT 7,L
JR NZ,SAIERRO

; Testa STOP bit
BIT 1,L
JR Z,SAIERRO

LD A,L
AND A ; flag PO->paridade esperada
; e lima flag C
BIT 0,L ; flag Z -> paridade recebida
JP PO,TESTAIMPAR
RET Z
TESTAIMPAR: RET NZ
SAIERRO: SCF
RET

;
; Muda estado da linha CLOCK
; e seleciona registro 14 do PSG
; na saída
MUDACLOCK: LD A,15
OUT (PSGAD),A
IN A,(PSGRD)
RES LNCLOCK,A
JR NC,MUDA
SET LNCLOCK,A
MUDA: SET ABSEL,A ; JOY B
;RES ABSEL,A ; JOY A
OUT (PSGWR),A
RET