Elektroda.pl
Elektroda.pl
X
BotlandBotland
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Mikrokomputer COBRA 1

coberr 29 Maj 2020 22:40 159345 678
  • #661
    sq2bvn
    Poziom 11  
    zdzis_ek napisał:
    Super obudowa :D

    Zrobiłem krótką animację pokazującą w jaki sposób przenoszone są programy z pamięci ROM do pamięci RAM z wykorzystaniem przełącznika banków pamięci.



    Wobec tego jak umieścić w ROM np. taki kod.

    Code:

    ;  Program deasemblera Z80
    ;  Dane interpretowane przez program deasemblera

    PFTAB DEFB
    E0,0A,0E,0F,96,AF,B4,B9,BE,BD,C5,09,4C,C4,04,C5,2C,85,00,08,0C
    25,2A,55,5C,69,6B,O9,52,45,D4,A4,2F,09,50,4F,D0,94,9A,52,45,D4
    45,58,D8,4A,50,20,28,4B,A9,4C,44,20,53,50,2C,CB,O9,4A,D0,24,C1
    D7,BA,4A,50,20,D7,A0,4F,55,54,20,28,56,29,2C,C1,49,4E,20,41,2C
    28,56,A9,45,58,20,28,53,50,29,2C,CB,45,58,20,44,45,2C,48,CC,44
    C9,45,C9,09,43,41,4C,CC,24,C1,D7,37,09,50,55,53,C8,94,81,43,41
    4C,4C,20,D7,2C,81,D6,09,52,53,D4,BA,30,B0,30,B8,31,B0,31,B8,32
    B0,32,B8,33,B0,33,B8,3A,52,4C,C3,52,52,C3,52,CC,52,D2,53,4C,C1
    53,52,C1,53,4C,C9,53,52,CC,01,A0,85,09,42,49,D4,1C,C5,09,52,45
    D3,1C,C5,09,53,45,D4,1C,C5,00,B4,BB,C3,D1,DE,E1,E9,F0,1B,4C,C4
    43,D0,49,CE,4F,D4,06,9A,C9,C4,49,D2,44,D2,00,08,25,32,61,6B,6F
    73,78,36,09,4A,D2,24,C1,D6,9A,4E,4F,D0,45,58,20,41,46,2C,41,46
    A7,44,4A,4E,5A,20,D6,4A,52,20,D6,37,09,4C,C4,0C,C1,D7,01,41,44
    44,20,CB,CC,09,4C,C4,BA,28,42,43,29,2C,C1,41,2C,28,42,43,A9,28
    44,45,29,2C,C1,41,2C,28,44,45,A9,28,57,29,2C,CB,4B,2C,28,57,A9
    28,57,29,2C,C1,41,2C,28,57,A9,2F,09,49,4E,C3,8C,09,44,45,C3,8C
    09,49,4E,C3,84,09,44,45,C3,84,09,4C,C4,04,C1,D6,BA,52,4C,43,C1
    52,52,43,C1,52,4C,C1,52,52,C1,44,41,C1,43,50,CC,53,43,C6,43,43
    C6,09,49,CE,04,C1,28,43,A9,01,4F,55,54,20,28,43,A9,C4,3F,01,53
    42,43,20,CB,CC,01,41,44,43,20,CB,CC,09,4C,C4,2F,01,28,57,A9,CC
    0C,C1,28,57,A9,81,4E,45,C7,01,52,45,D4,17,81,CE,81,C9,09,49,CD
    9A,B0,AD,B1,B2,3E,8A,52,52,C4,52,4C,C4,09,4C,C4,9A,49,2C,C1,52
    2C,C1,41,2C,C9,41,2C,D2

    ; Następuje tablica SELTAB rozpoczynająca się od
    ; przełącznika. Dla dokumentacji została wypisana w mnemonice
    ; asemblera, jednak również z pewną poprawką redakcyjną,
    ; mianowicie podkreślone znaki oznaczają odpowiedni kod ASCII
    ; plus 128.

    SELTAB DEFB SELO-$
           DEFB SEL1-$
           DEFB SEL2-$
           DEFB SEL3-$
           DEFB SEL4-$
           DEFB SEL5-$
    SELO   DEFM "BCDEHL(Q)A."
    SEL1   DEFM "BCDEKSE"
    SEL2   DEFM "BC:DEKAE"
    SEL3   DEFM "01234567"
    SEL4   DEFM "NZZNCCPOPEPM"
    SEL5   DEFM "ATSD •A,ADC A,SUB_SBC A,AND_X-OR_OR_CP_"

    HLTX DEFM "HALT"
    REGTAB DEFM "HLIXIY"

    ADINST DEFW 0         ;zawiera adres dekodowanego rozkazu
                          ;adres ten zostanie przekazany do BC'.

           DEFB " "       ;spacja

    DISPL  DEFS 32        ;zawiera zdekodowany adres, kolejne
                          ;jego bajty i mnemonikę. Adres DISPL zostanie przekazany do
                          ;IX. Adres DISPL 18 do HL'.

    ;Początek programu interpretera

    INIT
           EXX            ;alternatywny bank rejestrów
           LD HL, DISPL-1 ;adres spacji
           LD DE, DISPL
           LD BC, 32      ;długośc DISPL
           LDIR           ;wypełnienie spacjami
           LD BC,(ADINST)
           LD IX, DISPL
           LD HL, DISPL+18
           CALL HEX2      ;wydruk adresu
           EXX            ;główny bank rejestrów
           INC IX         ;wydruk spacji po adresie
           LD DE,0000     ;inicjacja zmiennych INDEX i PREFIX
    ;D=O dla instrukcji uiywajacej HL
    ;  1 dla IX
    ;  2 dla IY
    ;E = O dla zwykłych kodów
    ;  1 dla prefiksowanych CB
    ;  2 dla prefiksowanych ED
           JR START

    ; Procedura konwersji szesnastkowej
    HEX2   LD A,B          ;dwa bajty w BC
           CALL HEX1       ;konwersja lewego
           LD A,C          ;... i prawego
    HEX1   PUSH AF         ;jeden bajt w A
           RRCA            ; obrót w prawo o 4 bity; najpierw
           RRCA            ;konwersja bardziej znaczącej
           RRCA            ;tetrady.
           RRCA            ;lewa połowa bajtu
           CALL TETRAD
           POP AF          ;teraz prawa tetrada
    TETRAD AND #0F         ;1 cyfra
           ADD A,#30       ;—> ASCII
           CP #3A          ;czy > „9"?
           JR C,DIGIT
           ADD A,#07       ;litera
    DIGIT  LD (IX),A       ;przesłanie do DISPL
           INC IX
           RET

    ; pobranie jednego bajtu i jego konwersja
    FETCH  EXX              ;alternatywny bank rejestrów
           LD A,(BC)        ;pobranie znaku
           CALL HEX1        ;zapisanie w DISPL
           LD A,(BC)        ;odtworzenie wartości A
           INC BC
           LD (ADINST),BC
           EXX              ;powrót do głównego banku rejestrów
           RET

    IND2   INC D            ;inkrementacja zmiennej INDEX
    IND1   INC D
    START                   ;początek dekodowania
           CALL FETCH
           CP #76
           JR Z,IHALT       ;dekodowanie rozkazu HALT
           CP #DD
           JR Z,IND1        ;INDEX := 1
           CP #FD
           JR Z,IND2        ;INDEX := 2
    ; Rozkazy wykorzystujące rejestry indeksowe powtarzają
    ; pobieranie dekodowanego bajtu
           CP #CB          ;sprawdzenie prefiksów
           JR Z,PREF1      ;wtedy PREFIX := 1
           CP #ED
           JR NZ,START1
           INC E           ;tu PREFIX := 2
    PREF1  INC E
           XOR A
           OR D            ;sprawdzenie czy nie jest to rozkaz DDCB/FDCB
           CALL NZ,FETCH   ;jeśli tak, pobrać przesunięcie
           CALL FETCH      ;pobranie właściwego bajtu kodu

    START1                 ;akumulator zawiera dekodowany bajt
           LD (SAVA),A     ;przechowanie akumulatora
           RLA
           RL E
           RLA
           RL E
           LD A,E
    ;teraz A zawiera 4 * PREFIX wartość pola K
           LD HL,PFTAB     ;tablica zawierająca pocz.bloków
    ;sterujących (czyli interpretowany program)

           CALL SWIT1      ;przełącznik
    ;teraz w HL: adres odpowiedniego bloku sterującego

    ;Początek głównej pętli interpretera
    MASTER
           LD A,(HL)       ;pobranie bajtu interpretowanego rozkazu
           INC HL
           LD BC,MRETURN
           PUSH BC         ;w BC: adres powrotu z procedur interpretera
           PUSH HL         ;adres następnego rozkazu
           PUSH AF         ;chwilowe zapamiętanie A
           LD HL,PROCTB    ;Tablica adresów (względnych) procedur interpretera
           CALL SWITCH     ;przełącznik
           POP AF
           RRCA
           RRCA
           RRCA
    ;A zawiera teraz parametry procedury
          LD E,A           ;przekazane do E
          EX (SP),HL
    ;teraz na stosie adres procedury
    ;w HL: adres następnego rozkazu w bloku sterującym
    ;w A - dekodowany bajt
    ;w E - parametry
          LD A,(SAVA)
          RET              ;przekazanie sterowania

    MRETURN
           BIT 4,E         ;czy koniec bloku sterującego?
           JR Z,MASTER     ;jeśli nie: nowy rozkaz
           RET             ;koniec dekodowania.

    ; Dekodowanie rozkazu HALT
    IHALT
           LD HL,HLTX      ;adres tekstu
           JR LITC         ;wewnątrz LITERAL

    ; Tablica procedur interpretera
    PROCTB DEFB SWITCH-$
           DEFB LITERAL-$
           DEFB LISTM-$
           DEFB LISTN-$
           DEFB SELM-$
           DEFB SELN-$
           DEFB SKIPM-$
           DEFB SK1PQ-$

    SWITCH                 ;obliczenie adresu z przesunięcia
           AND #07         ;numer procedury zajmuje 3 bity
    SWIT1  LD C,A
           LD B,00         ;BC zawiera przesunięcie
           ADD HL,BC       ;pozycja w tablicy
           LD C,(HL)       ;pobranie bajtu
           ADD HL,BC       ;i obliczenie adresu
           RET

    LITERAL
           CALL LITC
           BIT 0,E         ;czy będzie drukowana spacja?
           RET Z
           EXX
           INC HL          ;przesunięcie o 1 pozycję w DISPL
           EXX
           RET

    LITC
           BIT 3,E         ;czy wydrukować przecinek?
           RES 3,E
           LDA,","
           CALL NZ,INSCHAR ;drukowanie jednego znaku z A
    LITC1  LD A,(HL)       ;kolejny bajt literału
           BIT 7,A         ;czy końcowy?
           RES 7,A
           PUSH AF         ;zapamiętanie A i przeniesienia!
           CALL NC,INSERT  ;kolejny znak do DISPL
    ;bit przeniesienia w LITERAL jest równy zeru. Jeśli LITC
    ;jest wywoływane np. z SELM, trzeba opuścić część tablicy
           INC HL          ;adres następnego znaku w bloku
           POP AF
           JR Z,LITC1      ;czy ostatni
           RET

    LISTM
           RRA             ;operacja równoważna N := M
           RRA
           RRA
    LISTN  AND #07         ;selekcja segmentu N
           LD C,A
           LD A,E
           AND #07         ;parametr
           LD B,A          ;liczba elementów listy
           INC B           ; ÷ 1
    LHO    XOR A
           CP C            ;wybranie C-tego; (przeniesienie!)
           CALL LITC       ;wydruk ciągu znaków
           DEC C
           DJNZ LHO
           RET

    SELM
           RRA             ;równoważne N := M
           RRA
           RRA
    SELN
           PUSH HL         ;zapamiętanie
           LD HL,SELTAB
           PUSH AF         ;chwilowe zapamiętanie
           LD A,E
           CALL SWITCH     ;wybór listy
           POP AF          ;odtworzenie A
           AND #07         ;tylko N
           LD C,A
           CALL LHO-2

           POP FIL         ;odtworzenie adresu w bloku
           RET

    SKIPQ
            RRCA
            XOR #04
            BIT 2,A         ;wartość segmentu Q
            JR SKIPM1

    SKIPM
            BIT 5,A
    SKIPM1  RES 5,A
            LD (SAVA),A
    ; zmiana dekodowanego bajtu: M := M — 4 jeśli M > 3
            RET NZ          ;nic nie robić jeśli M było < 4
            LD A,E          ;pobranie parametru
            AND #07
            LD C,A
            LD B,0          ;do BC
            ADD HL,BC       ;i przeskok
            RET
    INSERT                  ;wprowadzanie znaku do DISPL (HL')
            CP "K"
            JR Z,REGIST     ;jest to HL, IX lub IY
            CP "Q"
            JR Z,INDIR      ;jest to (HL), (IX÷d) lub (IY.-d)
            CP "V"
            JR Z,LBYTE      ;jednobajtowa stała
            CP "W"
            JR Z,LWORD      ;dwubajtowa stała
    INSCHAR                 ;wpisanie znaku
            EXX
            LD (HL),A
            INC HL
            EXX
            RET
    LBYTE
            CALL FETCH      ;pobranie nowego bajtu
            LD A,(IX-2)     ;przepisanie 2 znaków z DISPL
            CALL INSCHAR
            LD A,(IX-1)
            JR INSCHAR

    LWORD
            CALL FETCH      ;mniej znaczący bajt
            CALL LBYTE      ;bardziej znaczący

    LWORD1
            LD A,(IX-4)     ;przepisanie 4 znaków tekstu
            CALL INSCHAR    ;w odpowiedniej kolejności
            LD A,(IX-3)
            JR INSCHAR

    REGIST
            PUSH HL         ;chwilowe zapamiętanie
            PUSH BC
            LD HL,REGTAB    ;REGTAB symuluje blok sterujacy
            LD C,D          ;który rejestr: zależnie od INDEX
            LD B,#03        ;są trzy moffiwosci
            CALL LHO
            POP BC
            POP HL
            RET

    INDIR
            CALL LREG       ;na początku nazwa rejestru
            LD A,D
            OR A
            RET Z           ;powrót jeśli INDEX = O
            LD A,"+"
            CALL INSCHAR
            LD A,(DISPL+11)
            CP " "
            JR Z,LBYTE      ;skok jeśli to nie DDCB/FDCB
            JR LWORD1       ;przesunięcie już jest

    SAVA DEFB
            END


    To jest deasempbler Z80, którym oniegdyś się bawiłem. Deasembluje jedną linię i umieszcza ją w buforze tekstowym. Dokładny opis jest w książce o Z80.
  • BotlandBotland
  • BotlandBotland
  • #663
    sq2bvn
    Poziom 11  
    Sugerowałbym dodać deasembler do wsadu kolegi. Jest tam asembler, to pod spodem mógłby być deasembler. Np. wejście do deasemblera, czarny ekran i oczekiwanie na wpis adresu początkowego i ilości deasemblowanych linii. Enter i wydruk na ekran. Kiedyś miałem to uruchomione na CA80, gdzie deasembacja była do drukarki podłączonej po RS-232 w standardzie TTL (drukarka Commodore MPS-1230).

    Załączam skan oryginału.
    Nie wiem czym to skompilować, kiedyś kompilowałem te źródło manualnie na kartce w kratkę. To był duży sukces zobaczyć programy robione w zeszycie pięknie wydrukowane oraz sprawdzić, czy wszystko się zgadza :)
    Nie mam już wydruków, ani taśmy z nagraniem - książka się została.

    Myślę, że programy dla radioamatorów zrobiłoby się w cartridge, obok sprzętu sprzęgającego COBRA1 z radiostacją. Przydałaby się jakaś opcja na głównym ekranie "uruchom program z cartridge".


    Mikrokomputer COBRA 1 Mikrokomputer COBRA 1 Mikrokomputer COBRA 1 Mikrokomputer COBRA 1 Mikrokomputer COBRA 1 Mikrokomputer COBRA 1 Mikrokomputer COBRA 1 Mikrokomputer COBRA 1 Mikrokomputer COBRA 1 Mikrokomputer COBRA 1 Mikrokomputer COBRA 1 Mikrokomputer COBRA 1
  • #667
    sq2bvn
    Poziom 11  
    Wygląda super. Czy tam jest już ten kod, co przedstawiłem?
  • #669
    zdzis_ek
    Poziom 14  
    Ja trochę z innej flanki

    Powstał nowy projekt PCB Cobry1 "COBRA1 - DIP v6.0".
    Na tej płytce chciałem umieścić wszystko co do tej pory było zawarte w różnych wersjach.
    Mikrokomputer COBRA 1[/url]
    Pomijam v4.0 i v5.0, są to eksperymenty, może kiedyś ujrzą światło dzienne.
    Zasadnicze różnice v6.0 w stosunku do v3.0.

    W zasadzie schemat logiczny jest ten sam, różnice są następujące:

    Mikrokomputer COBRA 1[/url]
    - zmiana oznaczeń układów scalonych, rezystorów, kondensatorów itd.,
    Wykaz elementów elektronicznych:

    Mikrokomputer COBRA 1

    - rozmiary płytki PCB 155mm x 254 mm (czyli nieco większa od v3.0),

    ale za to mamy:
    - na pokładzie układ AY-8912 z możliwością przełączenia (adresami) sterowania tego układu,
    - gniazdo jack 3,5 mm stereo wyjściowe po wzmacniaczach LM386,
    - linija świetlna na układzie LM3914 z gniazdem do podłączenia, tylko samych diod LED,
    - podstawkę PLCC44, co stwarza możliwość umieszczenia w podstawce procesora Z80CPU z zegarem powyżej 6, 5 Mhz,
    - możliwość przełączania zegara pracy procesora Z80CPU (PLCC44) z 3,25 Mhz na 6,50 Mhz,
    - na płycie umieszczone jest gniazdo SUB9 do podpięcia dżojisticka sterowanego przez układ Atmega88,
    - na płycie jest umieszczone gniazdo SUB15 do podłączenia klawiatury swojej konstrukcji,
    na tej płycie PCB istnieje możliwość po zamontowaniu R64 i R94 korzystania z rozszerzonej klawiatury (w tej chwili D0-D4 x A8xA15)
    a może być (D0-D6 x A0xA15),
    - przekaźnik sterowany impulsowo z możliwością jego wykorzystania do włączenia zasilania tego mikrokomputera, lub przełączenia generatora taktowania procesora.
    i coś tam jeszcze.
    Mikrokomputer COBRA 1
    Mikrokomputer COBRA 1 Mikrokomputer COBRA 1
  • #670
    sq2bvn
    Poziom 11  
    Fajna płytka i na dodatek z lepszym dźwiękiem :)

    Odnośnie spostrzeżeń do mojej wersji:
    1. Zamiast generatora na filtrze ceramicznym: generator 13 MHz obudowa DIL8 oraz dzielnik przez 2 na 74LS74. Wcześniej opisywałem to. Drugi przerzutnik można zrobić jako dodatkowe dzielenie przez 2 jeśli ktoś doda generator 26 MHz;
    2. Otwór w lewym górnym rogu (blisko gniazda 5V) podłączony do masy - by zmniejszyć emisyjność i zwiększyć odporność na zakłócenia;
    3. Rozstaw otworów montażowych przy cartridge jak dla złącza AWP-50P z TME (symbol producenta CONNFLY DS1011-50SBSIB7). Wówczas można wkrętami przez tulejki płytkę podeprzeć. Obecnie są otwory ale trochę rozstaw inny.
    4. Odwrócony tranzystor T1;
    5. Zamiast rezystorów podciągających przy klawiaturze drabinka rezystorów;
    6. Gniazdo zasilania - otwór na końcówkę +5V większy, musiałem nogę szlifować.

    I to chyba wszystko by było jak na razie :)


    Dodatkowo wymyśliłem sposób zlikwidowania kresek w czasie przewijania ekranu.
  • #671
    zdzis_ek
    Poziom 14  
    Dzięki za celne uwagi.
    W tej wersji zmieniłem polaryzację tranzystora T1 oraz powiększyłem otwór +5V w gnieździe zasilającym.
    Drabinka rezystorów też jest dobrym rozwiązaniem.
    Interesuje mnie jak rozwiązałeś problem zakłóceń przy przewijaniu obrazów na ekranie.
    Generator na rezonatorze kwarcowym jest lepszy od filtra ceramicznego.
    Ja w założeniach zawsze kieruję się zasadą aby w jak najmniejszym stopniu ingerować w oryginalny projekt.
    Chociaż zmian trochę jest wprowadzonych, ale nie zmieniają one (duszy tego komputerka) :D
  • #672
    sq2bvn
    Poziom 11  
    Sugeruję dać ten generator 13 MHz. FCM6.5 to średni pomysł. Mi wzbudził się na 7,2MHz co spowodowało problemy z synchronizacją obrazu. Ten FCM to był taki substytut rezonatora kwarcowego 6,5MHz. W tamtych czasach jedynie wybrańcy mieli dostęp do rezonatorów kwarcowych - z tego powodu się kombinowało. Do częstościomierza wzorzec 1MHz robiło się z filtra 465kHz z toru pośredniej odbiorników AM. O tyle było łatwiej iż, były one w obudowie z tworzywa i można było łatwo wyjąć dysk piezoceramiczny i go szlifować. Następnie okładzinę odtwarzało się nanosząc warstwę grafitu lub napylić warstwę cyny - trudniejsze do zrobienia.

    Zakłócenia przy przewijaniu powstają wówczas kiedy na wejściu generatora znaków zamiast wartości kodu znaku do wyświetlenia znajduje się wartość zapisywana do pamięci RAM 6116. To jest problem. Dodatkowo mamy tu do czynienia ze zdarzeniami asynchronicznymi. Rozwiązaniem tutaj jest zbuforowanie wartości właściwej do wyświetlenia, po czym kiedy na wejściu generatora znaków jest stabilna wartość do wyświetlania robić operacje na RAM. To wszystko: można problem załatwić prostym sposobem. Czyli dodatkowy zatrzask oraz przerzutnik monostabilny, który zatrzaśnie wartość dla generatora znaków przy zboczu narastającym oraz podłączy do wejścia 6116 wartość do zapisu. Oczywiście czas impulsu najkrótszy możliwy, by opóźnienie sygnału zapisu do RAM 6116 nie było dłuższe niż stabilna wartość do zapisu do RAM 6116. To wszystko - myślę, że to będzie działać. Najlepiej by to przetestować na jakimś VHDLu by nie ryć płytki w złym celu. A może zrobić COBRA 1.1?
  • #673
    zdzis_ek
    Poziom 14  
    Widać nieszczęśliwie trafiłeś z tymi filtrami FCM.
    Wiadomo, że filtry FCM były w znikomej części porównywalne z filtrami SFE, jeżeli chodzi o precyzję filtrowanej częstotliwości.
    Powstała później analogowa telewizja satelitarna, która wymogła wykonanie filtrów jeszcze bardziej dokładnych i o innym oznaczeniu.
    To co montujesz, to Twój wybór a wybór elementów elektronicznych to też tylko Twoja wola.
    Ja idę w uparte za filtrami, Ty wybrałeś inną drogę :D
  • #674
    andrzejlisek
    Poziom 28  
    zdzis_ek napisał:
    To co montujesz, to Twój wybór a wybór elementów elektronicznych to też tylko Twoja wola.
    Ja idę w uparte za filtrami, Ty wybrałeś inną drogę :D

    100% racji, również w temacie tego, czy buduje się replikę komputera Cobra1, czy wynalazek cobra-podobny. Nie zmienia to faktu, że warto na forum rozważać zalety i wady różnych dostępnych rozwiązań.
  • #675
    zdzis_ek
    Poziom 14  
    Zgadzam się również w 100% z przypomnieniem kol.andrzejlisek "że warto na forum rozważać zalety i wady różnych dostępnych rozwiązań", ale są pewne różnice między rozbudową, modernizacją, czy też przerabianiem.

    W moim rozumowaniu wielką uciechę może stanowić fakt, że samemu się zbudowało (zmontowało) mikrokomputer z możliwością jego oprogramowania.
  • #676
    PAMPKIN
    Poziom 12  
    Troszkę z dawnych dziejów. Czy któryś kolegów zbudował oryginalną klawiaturę z projektu Cobry z AudiVideo. Zdaje się, że są tam jakieś błędy, Zastanawiam się, czy robić na bazie oryginału i później krosować błędy, czy od razu poprawić?
  • #678
    PAMPKIN
    Poziom 12  
    Dzięki @zdzis_ek za info, ale czy ta Twoja to na kontraktronach, bo taka płaska jest?