Autor Wątek: Klawiatura PS2 do ZX48,+  (Przeczytany 12046 razy)

gregoryi

  • ****
  • Wiadomości: 288
  • Miejsce pobytu:
    Opole
Klawiatura PS2 do ZX48,+
« dnia: 2017.02.16, 14:27:43 »
Witam.
Nigdzie nie mogę znaleźć normalnego schematu do zrobienia płytki.
Chodzi mi o zamontowanie płytki do wewnątrz komputera czyli mamy dostęp złącz klawiaturowych.
Została mi jedna płytka zx48 i chciałbym wykorzystać ją, obudowę zastępczą już mam.

Znalazłem tylko projekt na 8051, ale nie posiadam programatora .
Czy jest możliwe zbudowanie takiego interfejsu na Arduino Uno?
ZX Spectrum 16, ZX Spectrum 48, ZX Spectrum 128 +2 Grey, ZX Spectrum 128 +3, Amstrad 6128, Commodore 64C, Amiga 600, Klony - Harlequin 48 Rev G, Harlequin 128 Rev 2D, Just Speecy 128, ZX Nuvo 128

pear

  • *****
  • Wiadomości: 5511
  • Miejsce pobytu:
    Będzin
  • Z80 only
Odp: Klawiatura PS2 do ZX48,+
« Odpowiedź #1 dnia: 2017.02.16, 14:30:07 »
Dzisiaj przyszły płytki interfejsu PS/2 do Chrome.
Montuje się ją pod procesor.
Jak poskładam, to mogę sprawdzić, czy zadziała ze zwykłym ZX48.
ZX/Enterprise/CPC/Robotron/C128D

gregoryi

  • ****
  • Wiadomości: 288
  • Miejsce pobytu:
    Opole
Odp: Klawiatura PS2 do ZX48,+
« Odpowiedź #2 dnia: 2017.02.16, 16:07:20 »
Ja tam wolałbym schemat jakiś działający.
Mogę sam sobie zrobić ale jeżeli jest to na xilinxie czy 8051 to nie mam czym zaprogramować.
Jedyne co mam to arduino.
ZX Spectrum 16, ZX Spectrum 48, ZX Spectrum 128 +2 Grey, ZX Spectrum 128 +3, Amstrad 6128, Commodore 64C, Amiga 600, Klony - Harlequin 48 Rev G, Harlequin 128 Rev 2D, Just Speecy 128, ZX Nuvo 128

zaxon

  • *****
  • Wiadomości: 4695
Odp: Klawiatura PS2 do ZX48,+
« Odpowiedź #3 dnia: 2017.02.16, 16:22:01 »
Jak masz arduino to je przerob na programator do 8051 , http://www.instructables.com/id/ARDUINO-AS-A-8051-PROGRAMMER/?ALLSTEPS  ;) A potem to juz z gorki. http://www.zxprojects.com/index.php/ps2-adapter
Siedem kilo smalcu,gesich jajek kopa,zeby moc to polknac tegiego trza chlopa. GG 3456993

Gryzor

  • *****
  • Wiadomości: 2010
  • Miejsce pobytu:
    Warszawa
Odp: Klawiatura PS2 do ZX48,+
« Odpowiedź #4 dnia: 2017.02.16, 17:01:51 »
Solidny PS/2 do ZXa, to jest moje marzenie od lat. Jedyne co mam, to IF1Bis, ale ten nie dziala ze standardowym ROM (wymaga wlasnych procedur).
Z drugiej strony mozna go uzywac na Amstradach.

trojacek

  • *****
  • Wiadomości: 6846
  • Miejsce pobytu:
    Warszawa
Odp: Klawiatura PS2 do ZX48,+
« Odpowiedź #5 dnia: 2017.02.16, 17:27:58 »
Też o tym marzę ;)
Ale co tam interfejs, same klawiatury PC sprawiają problemy, bo dość różnie obsługują jednoczesne wciśnięcie kilku klawiszy.
Albo wcale nie obsługują.
« Ostatnia zmiana: 2017.02.16, 20:45:23 wysłana przez trojacek »

steev

  • *****
  • Wiadomości: 1366
  • Miejsce pobytu:
    inode 42
Odp: Klawiatura PS2 do ZX48,+
« Odpowiedź #6 dnia: 2017.02.16, 21:14:14 »
Ja tam wolałbym schemat jakiś działający.
Mogę sam sobie zrobić ale jeżeli jest to na xilinxie czy 8051 to nie mam czym zaprogramować.
Jedyne co mam to arduino.
Skoro masz arduino, to możesz programować CPLDki xilinxa.
Szukaj pod hasłem SVF player.
Np. tu.
Machines should work. People should think.

steev

  • *****
  • Wiadomości: 1366
  • Miejsce pobytu:
    inode 42
Odp: Klawiatura PS2 do ZX48,+
« Odpowiedź #7 dnia: 2017.02.16, 21:31:55 »
Czy jest możliwe zbudowanie takiego interfejsu na Arduino Uno?
Nie znam się na *duino jako takim, ale spokojnie powinno się dać zrobić na prockach klasy atmega.
Port PS/2 (jeśli traktować go jako tylko do odczytu, bez wysyłania danych do klawiatury) to tak naprawdę zwykły port szeregowy,
Można go zrobić na SPI, UART albo przez bitbanging.
Mógłbyś np. rozważyć ten (lub podobny) szalenie drogi minimoduł i spróbować.
Albo korzystając ze środowiska arduino, albo pardon my french, 'bare metal' ;)

Z mojego doświadczenia (z chińską klawiaturą PS2/USB) - robiłem przez SPI, i pomiędzy klawiaturą a SPI musiałem wstawić debouncery na obu sygnałach (CLK i DATA). Nie wiem jak sobie poradzi atmega, może nie potrzebować, ale warto mieć w pamięci :)
Machines should work. People should think.

pear

  • *****
  • Wiadomości: 5511
  • Miejsce pobytu:
    Będzin
  • Z80 only
Odp: Klawiatura PS2 do ZX48,+
« Odpowiedź #8 dnia: 2017.02.17, 07:58:09 »
Mogę się podzielić niskopoziomową obsługą PS/2 dla 8051.
Zrobiona na przerwaniu zewnętrznym INT0.
Oryginalnie na potrzeby komunikacji z myszką. Różnica w obsłudze klawiatury i myszy jest dopiero w następnej warstwie.
Taktowanie mikrokontrolera 12MHz.
Copyright :) Kod mój własny, do użytku na własne potrzeby.
;*** PS/2 low layer service EQU ************************************************
PS2RxCnt        data    017h    ; r7_2=11 bits rx counter         
;    11   10    9    8    7    6    5    4    3    2    1
; START,  D0,  D1,  D2,  D3,  D4,  D5,  D6,  D7,Podd,STOP
PS2TxCnt        data    016h    ; r6_2=12 bits tx counter         
;    12   11   10    9    8    7    6    5    4    3    2    1
; START,  D0,  D1,  D2,  D3,  D4,  D5,  D6,  D7,Podd,STOP, ACK
PS2RxBUF        data    015h    ; r5_2 rx buffer ptr           
PS2TxBUF        data    014h    ; r4_2 tx buffer
PS2ErrCnt       data    012h    ; r2_2 error counter >3 fail & init mouse
PS2RdPtr        data    011h    ; r1_2 PS2RdPTR             
PS2RxPtr        data    010h    ; r0_2 PS2RxPTR             
PS2RxPE         bit     070h    ; bit PS2RxPE=0 parity
                                ; after transmition rxPE=0 error, rxPE=1 OK
PS2TxPE         bit     071h    ; bit PS2TxPE=0 parity
PS2Error        bit     072h    ; bit PS2Error=0
PS2TxON         bit     073h    ; bit PS2TxON =0 receive, =1 transmit
PS2RxON         bit     EX0     ; INT0
PS2CLK          bit     INT0    ; CLK line
PS2DAT          bit     P3.4    ; DATA line
PS2RxAddr       equ     021h    ; buffer address for PS2 received data
;-------------------------------------------------------------------------------                     
PS2_VAR_INIT    MACRO
        clr     PS2Error                ; +1            clear error
        mov     PS2RxPtr,#PS2RxAddr     ; +2            init buffer ptr
        mov     PS2RdPtr,#PS2RxAddr     ; +2            init read ptr
        mov     PS2RxCnt,#11            ; +2            init rx bit counter
        mov     PS2TxCnt,#12            ; +2 = 9        init tx bit counter
ENDM
;*******************************************************************************       
HDW_INT_START   MACRO   GPR_SET         ; hardware interrupt start
                push    psw             ; save flags
                push    acc             ; save accumulator
IF (GPR_SET>=0) AND (GPR_SET<=3)
GPR_PSW         SET     GPR_SET SHL 3   
                mov     psw,#GPR_PSW    ; select registers set
ENDIF
ENDM   
;-------------------------------------------------------------------------------                     
HDW_INT_END     MACRO                   ; hardware interrupt end
                pop     acc             ; restore accumulator
                pop     psw             ; restore flags
                reti                    ; return from interrupt
ENDM   
;*** int0 **********************************************************************
                org     00003h
                ljmp    ps2service
;*** PS/2 low layer service ****************************************************
                                        ; tacts limit 60 @12MHz (120 @24MHz)
ps2service:                             ; +4 interrupt system delay + jump
        HDW_INT_START   2               ; +6  using set #2 of GPR
        jb      PS2TxON,ps2host         ; +2
ps2receiver:
        cjne    r7,#11,ps2rx_ctrl2      ; +2  is START bit ?
        clr     PS2RxPE                 ; +1  init parity
        sjmp    ps2rx_dec               ; +2
ps2rx_ctrl2:     
        cjne    r7,#2,ps2rx_ctrl1       ; +2  is parity bit ?
        mov     c,PS2DAT                ; +1  get parity bit
        jnc     ps2rx_dec               ; +2  parity control
        cpl     PS2RxPE                 ; +1  if data_bit=1 then complement
        sjmp    ps2rx_dec               ; +2
ps2rx_ctrl1:
        cjne    r7,#1,ps2rx_data        ; +2  is STOP bit ?
        jb      PS2RxPE,ps2rx_store     ; +2  if not correct parity
        setb    PS2Error                ; +1  then set error flag
ps2rx_store:
        mov     @r0,PS2RxBUF            ; +2  store byte in the buffer
        inc     r0                      ; +1  increment buf ptr
        mov     r7,#11                  ; +1  init bit counter for next service
        sjmp    ps2rx_end               ; +2
ps2rx_data:
        mov     c,PS2DAT                ; +1  get PS/2 DATA bit
        jnc     ps2rx_odd               ; +2  parity control 
        cpl     PS2RxPE                 ; +1  if data_bit=1 then complement
ps2rx_odd:
        mov     a,r5                    ; +1  get buffered data
        rrc     a                       ; +1  shift next data bit
        mov     r5,a                    ; +1  store data
ps2rx_dec:
        dec     r7                      ; +1  decrement bit counter
ps2rx_end:
        jnb     PS2Error,ps2rx_end2     ; +2  if error
        inc     r2                      ; +1  then increment error counter
ps2rx_end2:
        HDW_INT_END                     ; +6 = 27..37 tacts
;-------------------------------------------------------------------------------
ps2host:                                ; +12 host mode
        cjne    r6,#12,ps2tx_ctrl3      ; +2  is START bit ?
        setb    PS2TxPE                 ; +1  init parity
        sjmp    ps2tx_dec               ; +2 
ps2tx_ctrl3:     
        cjne    r6,#3,ps2tx_ctrl2       ; +2  is parity bit ?
        mov     c,PS2TxPE               ; +1  set parity bit
        sjmp    ps2tx_set               ; +2 
ps2tx_ctrl2:
        cjne    r6,#2,ps2tx_ctrl1       ; +2  is STOP bit ?
        setb    PS2DAT                  ; +1  set STOP bit
        sjmp    ps2tx_dec               ; +2 
ps2tx_ctrl1:
        cjne    r6,#1,ps2tx_data        ; +2  is ACK bit ?
        mov     c,PS2DAT                ; +1  get ACK bit
        mov     PS2Error,c              ; +1  store ACK as error flag
        clr     PS2TxON                 ; +1  disable transmitter
        sjmp    ps2tx_end               ; +2 
ps2tx_data:
        mov     a,r4                    ; +1  get data to send
        rrc     a                       ; +1  shift next bit to send
        mov     r4,a                    ; +1  store rest of data
        jnc     ps2tx_set               ; +2  parity control     
        cpl     PS2TxPE                 ; +1  if 1 then complement
ps2tx_set:
        mov     PS2DAT,c                ; +1  set PS/2 DATA bit
ps2tx_dec:
        dec     r6                      ; +1  decrement bit counter
ps2tx_end:
        jnb     PS2Error,ps2tx_end2     ; +2  if error
        inc     r2                      ; +1  then increment error counter
ps2tx_end2:
        HDW_INT_END                     ; +6 = 27..37 tacts
;*******************************************************************************
ps2in:  ; get byte from PS/2 data buffer
; cy=1 then acc=received byte
; cy=0 no data
; using: acc,r1,cy
        mov     a,PS2RxPtr              ; compare RxPtr & RdPtr
        xrl     a,PS2RdPtr              ; data in buffer ?
        clr     c                       ; if not, then clear CY
        jz      ps2in_end               ; and return
        mov     r1,PS2RdPtr             ; ptr to byte in buffer
        mov     a,@r1                   ; read byte
        inc     PS2RdPtr                ; increment read ptr
        setb    c                       ; set CY, byte in acc
ps2in_end:
        ret
;*******************************************************************************
ps2out: ; send PS/2 byte
; acc=byte to send
; using: acc,r1,cy
        mov     PS2TxBUF,a              ; store data to send
        clr     PS2RxON                 ; disable PS2 INT
        clr     PS2CLK                  ; bring CLK line low for at least 100 us
        PS2_VAR_INIT                    ; +9 us (@12MHz)  init variables
        mov     r1,#44                  ; +1  wait loop 88 us
        djnz    r1,$                    ; +44*2
        setb    PS2TxON                 ; +1  enable transmitter
        clr     PS2DAT                  ; +1  bring DATA line low (START bit)
        setb    PS2CLK                  ; release CLK line
        setb    PS2RxON                 ; enable PS2 INT
        ret
;*******************************************************************************
PS2init:
        clr     PS2RxON                 ; disable receiver INT
        clr     PS2TxON                 ; disable transmitter
        setb    PS2CLK                  ; release CLK line
        setb    PS2DAT                  ; release DATA line
        PS2_VAR_INIT                    ; init variables
        setb    IT0                     ; edge triggered
        ret
;*** end of {ps2svc.sub} *******************************************************
ZX/Enterprise/CPC/Robotron/C128D

rafni

  • **
  • Wiadomości: 57
  • Miejsce pobytu:
    Poznań/Puszczykowo
Odp: Klawiatura PS2 do ZX48,+
« Odpowiedź #9 dnia: 2017.03.07, 14:12:25 »
Pear,

czy możesz coś więcej napisać o projekcie klawiatury z płytką pod procesor ?
Speccy 48+/+2e, Didaktik 'M', Amstrad CPC-464, SiDi FPGA, Geoff's ColorMaximite, ColorMaximite2, Timex 2048(dead), A500rev6A+IDE256MB+1MBmoboCHIPmod+DF1Gotek, pure A500rev6A, Atari 1040STF, Atari2600clone, Raspberry Pi1 i Pi3, OrangePi1, Banana Pi M2, 51uC, ATMega

pear

  • *****
  • Wiadomości: 5511
  • Miejsce pobytu:
    Będzin
  • Z80 only
Odp: Klawiatura PS2 do ZX48,+
« Odpowiedź #10 dnia: 2017.03.07, 17:03:48 »
Dla ścisłości płytka interfejsu PS/2, którą chcę przetestować, jest zaprojektowana dla Chrome (i to nie jest mój projekt, z wyjątkiem samego wzoru płytki).
Powyżej zamieściłem tylko swoje źródła do niskopoziomowej komunikacji na PS/2, które wykorzystałem w jeszcze innym interfejsie (dla myszki do Enterprise). Może się przydadzą.

A wracając do interfejsu dla Chrome, to póki co nie działa tak jak powinien.
Jestem w kontakcie z autorem. Na razie poprawiamy sam projekt Chrome. Interfejs będzie następny.
ZX/Enterprise/CPC/Robotron/C128D

gregoryi

  • ****
  • Wiadomości: 288
  • Miejsce pobytu:
    Opole
Odp: Klawiatura PS2 do ZX48,+
« Odpowiedź #11 dnia: 2017.03.12, 21:11:25 »
Na stronie:
http://www.avray.ru/zx-spectrum-ps2-keyboard/
jest wydaje mi się dosyć fajny projekt klawiatury ps2 wpinanej do złącz.
Jest tylko jeden problem dla mnie, jak zdekodować port FE gdyż potrzebny jest do projektu?
ZX Spectrum 16, ZX Spectrum 48, ZX Spectrum 128 +2 Grey, ZX Spectrum 128 +3, Amstrad 6128, Commodore 64C, Amiga 600, Klony - Harlequin 48 Rev G, Harlequin 128 Rev 2D, Just Speecy 128, ZX Nuvo 128

KrisZX

  • *****
  • Wiadomości: 788
  • Miejsce pobytu:
    Wodzisław Śl
Odp: Klawiatura PS2 do ZX48,+
« Odpowiedź #12 dnia: 2017.03.13, 16:23:55 »
Nigdy nie spotkałem się z interfejsem PS2 do ZX 48 wpinanym w złącza klawiatury. Ale od dawna w sieci jest projekt PS2 na szynę do ZX48. W dodatku przelotowy. Dziś pewnie można by go odświeżyć i dostosować do współczesnych realiów. http://trastero.speccy.org/cosas/droy/imar3/imar3_e.htm
Timex 2048, TI of TTL FDD35, Timex 2068, Chrome 128, Harlequin, Just Speccy 128

Gryzor

  • *****
  • Wiadomości: 2010
  • Miejsce pobytu:
    Warszawa
Odp: Klawiatura PS2 do ZX48,+
« Odpowiedź #13 dnia: 2017.03.13, 17:16:37 »
Projektow to sa dziesiatki, tylko ktory jest naprawde sprawdzony ? Pomijam juz ghosting na klawiaturach PC PS/2.
Mialem jeden, ktory uniemozliwial wgrywanie programow :-) Ben kiedys robil i tez sie wycofal.

gregoryi

  • ****
  • Wiadomości: 288
  • Miejsce pobytu:
    Opole
Odp: Klawiatura PS2 do ZX48,+
« Odpowiedź #14 dnia: 2017.03.13, 22:12:53 »
Wg mnie dosyć fajny to taki gdzie na potrzeby testów nie potrzeba dużych nakładów.
W instrukcji jest napisane, że potrzebna jest "/RDFE", ze słów autora wynika, że jest do linia ukryta we wnętrzu ULA.
Ja myślałem, że wystarczy przez bramki NAND podłączyć A0, RD, IORQ tylko nie mam pojęcia czy dobrze myślę?
ZX Spectrum 16, ZX Spectrum 48, ZX Spectrum 128 +2 Grey, ZX Spectrum 128 +3, Amstrad 6128, Commodore 64C, Amiga 600, Klony - Harlequin 48 Rev G, Harlequin 128 Rev 2D, Just Speecy 128, ZX Nuvo 128