Bir Mektup Bir Cevap

Bu mektubun cevabı User Port'un yapısına ilişkin başlı başına bir konu. Ancak bu soruya kısmen cevap olabilecek 2 yazı daha önceki sayılarımızda yayınlandı; C-64 ile aydınlanma (Sayı 3) ve 6526 üzerine notlar (Sayı 4). Fakat her iki yazı da, Çernobil'deki nükleer santral kazasını duyunca Everest tepesinde yaşamak için Çince öğrenmeye çalışan teknik editörümüzün gazabına uğramış, kendisine yapılan uyarılara rağmen düzeltilen yazılar yine yanlış basılmış. Burada yanlışlar için sizlerden özür dileyerek yine o iki yazıya değineceğiz. Reference Guide'da da gösterildiği gibi User Port, bir konnektör gerektiriyor. Commodore 64'e arkadan bakılınca üst sıradaki bağlantılar soldan sağa, 1'den 12'ye kadar numaralandırılıyor. Alt sırada ise soldan sağa doğru A'dan N'ye harflendirilmiş (Bkz. Reference Guide, s.397).

Bu bağlantılardan 6526 ile ilgili

REGİSTER MAP

RS3 RS2 RS1 RSO REG NAME 0 0 0 0 0 PRA PERIPHERAL DATA REG A 0 0 0 1 1 PRB PERIPHERAL DATA REG B 0 0 1 0 2 DDRA DATA DIRECTION REG A 0 0 1 1 3 DDRB DATA DIRECTION REG B 0 1 0 0 4 TIMER A LOW REGISTER 0 1 0 1 5 TIMER A HIGH REGISTER 0 1 1 0 6 TBLO TIMER B LOW REGISTER 0 1 1 1 7 TBHI TIMER B HIGH REGISTER 1 0 0 0 8 10THS OF SECONDS REGISTER 1 0 0 1 9 TODSEC SECONDS REGISTER 1 0 1 0 A TODMIN MINUTES REGISTER 1 0 1 1 B TODHR HOURS-AM/PM REGISTER 1 1 0 0 C SDR SERIAL DATA REGISTER 1 1 0 1 D INTERRUPT CONTROL REGISTER 1 1 1 0 E CRA CONTROL REG A 1 1 1 1 F CRB CONTROL REG B ile olanlarının fonksiyonlarına “6526 Üzerine Notlar” yazımızda değinmiştik. Şimdi soruya dönersek; User Port'ta bağlanan 6526 U2 adını taşıyor.

Bu liste Reference Guide'ın 428. sayfasından alındı. Yukarıdaki sicil ya da saklayıcı (register) listesini inceleyelim. 6526'nın içinde 0'dan F(15)'e kadar numaralandırılmış 16 adet saklayıcı olduğunu görüyoruz. Tabloda üst satırda ilk 4 sütun başlığına RS3, RS2, RS1, RSO adları verilmiş. RS kısaltması (Register Select), saklayıcı seçme anlamına geliyor. Commodore 64'te de kullanılan 6500 adresli mikroişlemciler, “memory mapped” giriş-çıkış adreslemesi kullanıyorlar. Yani, tüm giriş-çıkış ana birim entegreleri ve içerisindeki saklayıcılar, mikroişlemciye bellek gözü gibi görünüyorlar. Mikroişlemci bu saklayıcıları herhangi bir bellek gözünden ayırt etmiyor. İş böyle olunca da adres yolunun en alt 4 bit'ini (A3, A2, A1, A0), 6526'nın 4 adet saklayıcı seçme girişine (RS3, RS2, RS1, RSO) bağlamak kalıyor. Şimdi de bu saklayıcıların fonksiyonlarını inceleyelim: DDRA (Data Direction Register A) ve DDRB (Data Direction Register B) ya da veri yönü saklayıcıları. Bu saklayıcılara yazılan sayıya göre saklayıcının ait olduğu portun bazı pinleri giriş, bazı pinleri ise çıkış moduna geçiyor. Şöyle ki; ikili sistemde 8 bit'lik saklayıcının 0 yapılan bit'i ilişkili olduğu port'un karşılık gelen pinini giriş durumuna alıyor. Eğer bu bit 1 yapılırsa, ilgili pin çıkış durumuna geçiyor. Örnek olarak DDRA saklayıcısına; 01011010 yazılırsa (onlu sistem-

İn sakı sane Çıkış mmm 0 sa Giriş PAD Çıkış PAA Çıkış Giriş Çıkış PAN vin Çıkış Öle mt Giriş durumuna geçiyor. Saklayıcıya bu değeri Basic'ten yüklemek istersek, 10'lu sistemdeki karşılığı olan 182'yi bu saklayıcıya POKE etmek gerekiyor. PRA ve PRB ise peripheral data register'in kısaltılmış adıdır. Port pinlerinin yönleri DDRA ve DDRB'ye yapılan müdahalelerle belirlendikten sonra tüm okuma ve yazma işlemleri PRA ve PRB'ye yapılıyor. Bu saklayıcılara yazma yapıldığında sadece çıkış haline getirilen port pinleri yazma işleminden etkilenir, okuma yapıldığı zaman ise hem çıkış tamponlarındaki sayılar, hem de giriş pinlerinde görülen lojik seviyeler okunur. CRA ve CRB olarak belirtilen (Control Register A, Control Register B) kontrol saklayıcıları ise 6526'nın içindeki zamanlayıcı (Timer) ve zaman saatini kontrol etmek için kullanılır. Bizi şimdilik ilgilendiren saklayıcılar DDRA, DDRB, PRA ve PRB. Aşağıdaki tablolar yine Reference Guide'dan alınmıştır ve giriş/çıkış ara birimlerin saklayıcı adreslerini vermektedir.

İlk tabloda altı çizili satırlar 2'nin (U2), 16 adet saklayıcısının $DD00 ve $DDFF Hex ya da 56576-56591 desimal adresleri arasında yer aldığını belirtiyor. Sırasıyla; Adresin Hex değeri Adresin ondalık değeri Saklayıcı DD00 56576 PRA DD01 56577 PRB DD02 56578 DDRA DD03 56579 DDRB DD04 56580 TALO DD05 56581 TAHI DD06 56582 TBLO DD07 56583 TBHI DD08 56584 TOD DD09 56585 TODSEC DD0A 56586 TODMIN DD0B 56587 TODHR DD0C 56588 SDR DD0D 56589 CRA DD0E 56590 DD0F 56591 CRB

User Port çıkışına U2'nin B port'u verilmiş. Dolayısıyla bizi 56579 adresindeki PRB saklayıcısı ilgilendiriyor. Çıkışta PB7'den PB0'a kadar 8 port pini var. Bu bize “aydınlatma” makalesinde önerilen yöntemle 8 değişik röleyi kumanda edebilme imkânı tanıyor. Farzedelim ki 8 değişik röleye kumanda etmek istiyoruz. Bunun için transistörle sürülen 8 röleyi PB7'den PB0'a kadar 8 çıkışa bağladık. (Aman dikkat edin 5 voltluk minyatür rölenin giriş sarımı hemen hemen 100 mA akım çeker ve 8 röle ise 5-6 volt 800 mA'lık bir güç kaynağına sahip olmayı gerektirir. Dolayısıyla 8 röleyi beslemek için ayrı bir güç kaynağına ihtiyacınız olacak.) 8 adet port çıkışını da röleye bağlayacağımız için DDRB'ye;

(11111111) ya da (255) 2 16 10 yazmak gerekir. POKE 56579,255 PB0'dan PB7'ye kadar pinleri çıkış haline getiriyor. POKE 56577,255 komutu 8 çıkış pi-

HEX DECIMAL BITS DESCRIPTION HEX DECIMAL BITS 6-5 Timer B Mode Select: 6 User / RS-232 Clear to 00 — Count System 02 Send Clock Pulses 5 User 01 — Count Positive 4 User / RS-232 Carrier De- CNT Transitions tect 10 — Count Timer A 3 User / RS-232 Ring Indi- Underflow Pulses cator 11 Count Timer A 2 User / RS-232 Data Termi- Underflows While nal Ready CNT Positive 1 User / RS-232 Request to 4-0 Same as CIA Control Reg. Send A—for Timer B (0) User / RS-232 Received DD00—DDFF 56576—56831 MOS 6526 Complex Inter- Data face Adapter (CIA) #2 DD02 56578 Data Direction DD00 56576 Data Port A (Serial Bus, Register — Port A RS-232, VIC Memory DD03 56579 Data Direction Control) Register — Port B Serial Bus Data Input DD04 56580 Timer A: Low-Byte Serial Bus Clock Pulse DD05 56581 Timer A: High-Byte Input DD06 56582 Timer B: Low-Byte Serial Bus Data Output 56583 Timer B: High-Byte Serial Bus Clock Pulse DD08 56584 Time-of-Day Clock: 1/10 Output Seconds Serial Bus ATN Signal DD09 56585 Time-of-Day Clock: Sec- Output onds RS-232 Data Output (User DD0A 56586 Time-of-Day Clock: Min- Port) utes VIC Chip System Memory DD0B 56587 Time-of-Day Clock: Hours Bank Select (Default — 4 AM/PM Flag (Bit 7) nn) DD0C 56588 Synchronous Serial I/O 56577 Data Port B (User Port, Data Buffer RS-232) DD0D 56589 CIA Interrupt Control User / RS-232 Data Set Register (Read NMIs/ Ready Write Mask)

nini de lojik 1 seviyesine çıkartıyor. 8 rölenin hepsi akımı çekiyor ve bağlı oldukları elektronik aletleri çalıştırıyorlar. POKE 56577,0 komutu ise tüm çıkışları lojik 0 veriyor ve rölelerin hepsi birden kesime gidiyor. Bir sonraki aşama ise bu çıkışları bağımsız olarak kontrol edebilmek. Burada işler biraz karışıyor. Bunu bir örnekle açıklayalım: Diğer bit'lere hiç dokunmadan nasıl lojik 1 yaparsınız ve sonra nasıl lojik 0'a çevirirsiniz? Eğer PRB'deki sayıyı desimal 1 ya da 0000 0001 ile “OR”larsanız (veya-larsanız) diğer bitlere hiç dokunmadan 1'e set etmiş olursunuz. POKE 56577, (PEEK (56577) OR 1) komutu bu işi yapar. Bu biti diğerlerine hiç dokunmadan 0 yapmak için yapacağımız iş ise, PRB'yi 254 ya da; Binary 1111 1110 ile “AND'lemek (ve-lemek) olacak.

POKE 56577, (PEEK(56577) AND 254) komutu da bu işi yapar. Özet olarak, POKE 56579,255 komutunu verdikten sonra, PRB'deki değeri;

0000 0001-1 ile OR'lamak PB0'ı 1 yapar. 1111 1110-254 ile AND'lemek PB0'ı 0 yapar. 0000 0010-2 ile OR'lamak PB1'i 1 yapar. 1111 1101-253 ile AND'lemek PB1'i 0 yapar. 0000 0100-4 ile OR'lamak PB2'yi 1 yapar. 1111 1011-251 ile AND'lemek PB2'yi 0 yapar. 0001 0000-16 ile OR'lamak PB4'ü 1 yapar. 1110 1111-239 ile AND'lemek PB4'ü 0 yapar.

0010 0000 - 32 ile OR'lamak PB5'i 1 yapar.

ile AND'lemek

—— en

41404 ile AND'lemek PBS'i O yapar. 0100 0000 - 464 ile OR'lamak PB6'- yı 1 yapar. 10441 144141x127 ile ANDlemek PB7'yi O yapar.

Birkaç örnek verirsek;

POKE 56577.(PEEK(56577)OR16) PB4'ü 1 yapar. POKE AND239) PB4'ü O yapar.

6526 içindeki saati ve alarmını kullanarak sabah radyonuzu açabilir, elektrik fırınınızı zamanlayıp belirli bir süre sonra kapatabilirsiniz.

Bol şanslar sana C.

3. Sayı Yarışma Sorusunun Çözümü

PROGRAM ADI : HECELER 001980 IF FNS<X) THEN 328
PRINT 60200 THEN 27
600620 CLOSE "<HOME><CTRL-N><3DOLN a
BIR TUSA B 00216 IF FNN<X) THEN
ASIN...":POKE 198,B:WAIT 358 <i76>
$ 002280 FNNCX) THEN
60030 EKRAN<S B:GOTO 358 <156>
ERİNTER<4âSPACE BİTİRİN" <184> 90230 FNNCX) THEN
00040 GET AND AND A C:GOTO 350 <186>
THEN 48 <B41> 00248 FNNCX) THEN
00050 IF THEN PRİNT D:GOTO 358 <216>
AS-"2" THEN DV-4 00250 IF FNSCX) THEN
"<3DOWN>CUMLE C:GOTO 350 <aB6>
NIZ? < TEKRAR ICİN İRETURNİ 90260 358 <231>
> 80270 FNNCX) OR FNSX
DEF OR OR C$z X) THEN L-B:GOTO 350
“1* OR C&-"0O" OR C$-"U" OR C$-"A" O 08280 FNNCX) THEN
R C$-z"E" OR C:6G0TO 350
DEF FNS<X)-FNSİCX) OR C$z"O" OR C$- Bö290 IF FNSCX) THEN 358 <a3e>
003080 FNS<X) THEN
980188 DEF FNNCX)-NOT AND C:GOTO 358
"> OR AND 660310 L-0:GOTO 350 <Ba5>
00116 POKE 631,34:POKE 632,34:POKE 633,20 FNNCX) OR
:POKE 198,C: INPUT * <145> — THEN 350
08120 IF A$-" " THEN A$-B$ <215> 80330 FNSCX) THEN
08130 OPEN A:GOTO 358
"; 00340 L-B >
68140 SZ-LENCAS) 60350 FOR TO L-A:PRINTHA,MID$CAS,EYİ,
60150 <asa> NOT <FNNCX)) THEN PRİN
00160 IF MID$CAS,E,D)-"ELEK" OR MIDSCAS,E THA,"-";
THEN 388 <185> B03560 EzE*Lİ İF THEN 398 <B7a>
90165 NOT <FNNCX)) THE 98365 17 E<SZ THEN 168 <asa>
N 198 <B88> 00370 FRINTHA:GOTO 20
001798 E>SZ THEN PRİN 00380 350 <226>
THA:GOTO 28 90390 350 <147>
00180 GOTO 168 00400 GOTO 168

Cümle: Siz de mi bizim Çekoslovakyalılaştırabilemediklerimizden misiniz?

Heceleme: Siz de mi bi-zim Çe-kos-lo-vak-ya-lı-laş-tı-ra-bi-le-me-dik-le-ri-miz-den mi-si-niz?

Cümle: Trabzonlu Troleybüsçü Tramvay Nuri'nin fonksiyonları Heceleme: Trab-zon-lu Tro-ley-büs-çü Tram-vay Nu-ri'nin fonk-si-yon-la-rı Cümle: Bu yoğurdu sarımsaklasak da mı saklasak, Sarımsaklamasak da mı saklasak?

Heceleme: Bu yo-ğur-du sa-rım-sak-la-sak-ta mı sak-la-sak, Sa-rım-sak-la-ma-sak-ta mı sak-la-sak?

Cümle: Olmak ya da olmamak, işte bütün mesele bu...

Heceleme: Ol-mak ya da ol-ma-mak, iş-te bü-tün me-se-le bu...

Cumle: Kartal Kalkar dal sarkar, dal Kartal

Heceleme: Kar-tal Kal-Kar dal sar-kar,

Cumle: Bir varmis, bir

Heceleme: Bir var-mis, e bir va-Kit-te.

Heceleme: Ay-Lik bil-g RE is-tae-yi-niz...

Cümle: Sakla samanı, gelir zamanı, acıkınca yersin...

yokmus.Evvel zaman bir yok-mus.Ev-vel za-man

» icinde,Kalbur saman i-cin-de,Kal-bur sa-man

Kalkar...

dal sar-kar kar-tal kal-kar...

icinde bir vakitte i-cin-d i-sa-yar COM-MO-DO-RE ! Ba-yi-niz-den COM-MO-DÜ-

Heceleme! Sak-la sa-ma-ni, ge-lir za-ma-ni, a-ci-Kin-ca yer-sin...?

İstanbul

Heceleme: İstanbul