Wykrywanie położenia przełącznika 1/2 - RAM-CART'a 1MB


       Krótkie przypomnienie.
Moduł RAM-CART'a 1MB podobnie jak DRC posiada przełącznik oznaczony 1/2. W pozycji <1> bit2 jako bit2 steruje wejściem adresowym A16 pamięci. W pozycji <2> bit2 jako zanegowany bit2 struje wejściem adresowym A16 pamięci. W ten sposób jest możliwe zbootowanie jednego z dwóch modułów 128KB. To w którym położeniu jest przełącznik jest tajemnicą do momentu uruchomienia modułu. Wtedy wiadomo jaki program został zbootowany i na tej podstawie można wydedukować położenie przełącznika 1/2. Do tej operacji nie jest wymagane wysokie I.Q. W module który zmontowałem dla siebie, (Glonisz też taki ma, i Qcyk), dodałem dodatkową diodę LED w kolorze niebieskim.

       Dioda świeci? Tak. Więc przełącznik jest w położeniu <2>. Ale może być odwrotnie, bo jak mi się coś poprzestawia w czasie lutowania, to efekt wiadomy. Wierzcie mi, to czy świeci przy <1> czy nie, nie ma absolutnie znaczenia. <1> czy <2> to tylko sprawa umowna. Ty będziesz użytkownikiem i to Ty przyzwyczaisz się do obsługi modułu. Ale.... warto móc programowo ustalić położenie przełącznika 1/2. Istnieje taka możliwość. Jednak zaznaczam. Kosztem komplikacji układu i zagmatwania całości.

       Otóż, rejestr $D501 nie używa bitów 3-5. Przy odczycie ich stan to 000 (by lepiej się odczytywało stan tego rejestru). Nic nie stoi na przeszkodzie by jeden z tych bitów niósł sobą informację o położeniu przełącznika 1/2 Ustalmy od razu, że będzie to bit3. Jakikolwiek wpis na pozycję bitu3 rejestru $D501 jest bezcelowy, ale odczyt nie. Przy odczycie, na pozycji bitu3 pojawi się informacja o stanie bitu adresowego A16 sterującego pamięć modułu. Jak wyżej zaznaczyłem, to czy bit A16 jest "0" czy "1" zależy nie tylko od ustawienia bitu2 w rejestrach modułu, ale też od ustawienia przełącznika 1/2. Wystarczy zatem odczytać stan bitu2 rejestru $D500 lub $D501 i porównać go z odczytanym bitem3 rejestru $D501.

       Jeżeli bity są równe, to przełącznik jest w pozycji <1>, jeżeli są różne, to w pozycji <2>.

       Pisząc odpowiednią procedurę należy wpierw ustalić którym rejestrem odbywa się sterowanie bitem2. Jeżeli bity 0 i 1 rejestru $D501 są różne od 11, to sterowanie odbywa się rejestrem $D500. Jeżeli powyższe bity są równe 11, to sterowanie odbywa się rejestrem $D501.

       W pierwszym przypadku należy odczytać stan bitu2 rejestru $D500 i porównać go z bitem3 rejestru $D501 W drugim przypadku, porównać należy bity 2 i 3 rejestru $D501.

Poniższa procedura napisana w konwencji QA robi co trzeba.

Komunikaty informują o pozycji przełącznika 1/2.

       Oczywistym jest, że procedura jest tylko poglądową, odpowiadającą na pytanie: jak się to robi. Jak pogłówkujesz i pomyślisz to zoptymalizujesz ją i może się okazać że będzie o połowę krótszą.

 * Zenon/DIAL  23.05.2002
 * Procedura wykrywa położenie
 * przełącznika 1/2 w module 1MB

   opt 22
   org $0600

 * który rejestr steruje bitem D2 (A16)
 * $D500 czy $D501

   lda $d501
   and #%00000011  kasuj "śmieci"
   cmp #%00000011  czy $d501 steruje?
   bne d500        jeżeli $d500, skok

 * bity 0,1 $d501 = 11
 * wiec porównywane są jego bity 2 i 3

   lda $d501
   and #%00001100  likwiduj "śmieci"
   cmp #%00001100  bity 2 i 3 =1
   beq poz1        tak, położenie [1]
   cmp #%00000000  bity 2 i 3 =0
   beq poz1        tak, położenie [1]

 * wykryto że bity 2,3 są różne
 * przełącznik 1/2 jest w położeniu [2]
 * pisz komunikat:
 * - przełącznik w pozycji [2] -

 kom2 ldx <pol2
      ldy >pol2
      jmp $c642

 * bitem D2 steruje rejestr $d500
 * komórka RAM $00 jako schowek

 d500 lda $d500
      and #%00000100  kasuj "śmieci"
      sta $00         zapamiętaj
      lda $D501       odczyt bitu3
      and #%00001000  kasuj "śmieci"
      lsr @           bit3 na poz.bitu2
      eor $00         porównaj
      beq poz1        bity równe, skok
      jmp kom2        bity różne, skok

 * pisz komunikat:
 * - przełącznik w pozycji [1] -

 poz1 ldx <pol1
      ldy >pol1
      jmp $c642

 * treść komunikatów

 pol1 dta c'Pozycja 1',b($9b)
 pol2 dta c'Pozycja 2',b($9b)

      end

       W magazynie SERIOUS #11 podałem schemat modułu RAM-CART'a 1MB.

       Jeżeli ktoś chce zmodyfikować go by działał w/g opisanej tu zasady, powinien na schemacie nanieść następujące zmiany, (potem lutowanie).

  • przerwać połączenie pinu bitu3 bufora rejestru $D501 z masą
  • na pin bitu3 bufora rejestru $D501 doprowadzić sygnał A16, np. z pinu 7 dekodera 7447.
       Po przeróbce:
       lda #$03
       sta $d501
       lda $d501

powinno dać odczyt $03 gdy przełącznik 1/2 jest w pozycji [1], lub $0B gdy przełącznik 1/2 jest w pozycji [2] lub:
       lda #$00
       sta $d500
       lda $d501

powinno dać odczyt $00 gdy przełącznik 1/2 jest w pozycji [1], lub $08 gdy przełącznik 1/2 jest w pozycji [2].

       Ot, i wszystko. Reszta to efekt pracy koderów. Na pierwszy ogień pewnie pójdzie rozkaz jmp w powyższej procedurze by była relokowalną. Co? ;)

       A dla elektroników.
"Krótki" schemat dotyczący przeróbki jest na końcu tego artykułu. Myślę że będzie pomocny. Jak Sikor w ATARYNCE zamieścił to co mu posłałem, to można też i tam zerknąć.

Zamieścił! Zamieścił! Na rozkładówce!!

       Można pójść za ciosem i jeszcze namieszać w tym wszystkim. Bo... no właśnie. Jedni mogą chcieć, a drudzy nie. Więc jeszcze jeden przełącznik. Po co. W jednej pozycji będzie to "normalny" moduł 1MB, a w drugiej, taki w którym można odczytać położenie przełącznika 1/2.
Proszę popatrzeć na schemat zamieszczony w Atarynce #2 na stronach 18-19.

       Przełącznik zaznaczony jest jako "Z". W położeniu w którym masa (GND) połączona jest z pinem 8 układu 74244 moduł jest "normalnym" modułem. W położeniu przeciwpałożnym, z możliwością odczytu bitu3 rejestru $D501. Polecam ATARYNKĘ Sikora, SERIOUS #11, tam jest schemat.

   tak jest         po przeróbce
 74244; 74245
      ____       ____        do pinów 2
     |    |     |    |          pamięci
     |    |     |    |     *-->   RAM
     |    |--|  |    |-----*
     |    |     |    |     *--|
     |    |--|  |    |--|   Z
     |    |     |    |
     |    |--|  |    |--|
     |____|     |____|

       bufor rejestru     Z-przełącznik
           $D501

Zenon/DIAL