Bu sayfadaki yazılar
Sayfanın metni
Sayfa 20
İşte her birine birer örnek: C000 LDX #$E4 C002 DEX RTS
Co00 LDY # $ 09 Co02 DEY Cco03 RTS
ZERO PAGE Şimdi bir sonraki komuta geçiyoruz, DEC hafızayı eksilt (decrement memory) anlamına gelir. LDA #$45 STA $FB C004 DEC $FB RTS Bu program çalıştırıldığında (execute), FB bölgesine 45 yükler ve sonra azaltarak 44'e indirir.
ZERO PAGE INDEXED Bu komut için X registeri bir index gibi kullanılır. Sanırım BASIC ROM bazı değerleri Zero Page yöntemi ile saklar. Bu nedenle Zero Page kullanırken hangi bölgeyi değiştirdiğine dikkat etmelisin. Commodore 64 Reference Guide kitabı bu konuda faydalı bilgiler vermektedir.
Şimdi Zero Page Indexed INC için bir örnek: C000 LDA #$FF C002 STA $CC C004 LDX #$0C C006 INC $C0,X C008 RTS Bu programı çalıştırdıktan (execute) sonra cursor'un yanıp sönmesi lazım. CC bölgesini değiştirdik, ki bu bölgede cursor enable depolanmıştır.
ABSOLUTE ADDRESSING Aşağıdaki programda olduğu gibi, bu şekilde hafızanın herhangi bir bölgesini azaltabilirsin: C000 DEC $0286 C003 Programı her çalıştırışında (execute) cursor rengi değişecektir. Çünkü 0286 bölgesi cursor rengini ihtiva eder.
ABSOLUTE INDEXED ADDRESSING Bu şekilde X registeri bir index gibi kullanılır: LDA #$00 C002 STA $03FD LDX #$1D DEC $03E0,X C00A RTS
Bu programı RUN ettiğin zaman ana menüdeki 4.cü seçeneği kullanarak 03FD bölgesindeki değeri kontrol et. FF olması lazım. Çünkü 00 değerinden 01 çıkardık. Buradan anlaşıldığı gibi 00 değerinden 01 çıkarıldığı zaman FF kalır.
64'ler Bu, bu kısımdaki en son komut idi, şimdi test zamanı! Şimdiye kadar gördüğünüz gibi A registeri, ne ilave ne de çıkarma komutuna sahip. Problem: A registerini 55 ile yükle ve çıkartarak 54 elde et. (KOPYA! Transfer). Bunun için iki iyi cevap var. Çalıştırmadan önce incele. C000 LDA #$55 TAY DEY C004 TYA RTS
“ VEYA
Co00 LDA # $ 55 C002 TAX DEX TXA Ccoo5 RTS Bu programı yapabildiysen bir sonraki bölüme geçebilirsin. Yoksa bu bölümü tekrar etmeni tavsiye ederim.
(Atlama) Bunu okumadan önce BASIC'teki GOTO ve GOSUB komutlarına aşina olman gerekiyor. Bunları User Guide kitabından bulabilirsin.
JMP Bu komut GOTO komutuna çok benzer. Eğer yeni bir adrese atlamak istiyorsan bu komutu kullanabilirsin. Örnek olarak B000 adresine atlamak istiyorsan JMP $B000 komutu yazmalısın. İşte örnek program: C000 JMP $C006 LDA #$00 RTS C006 LDA #$FF RTS
C000: C006 bölgesine atla C003: A registerini 00 ile yükle, hiçbir zaman çalıştırılamaz (execute), çünkü atladık. C005: Bu kompüteri BASIC'e döndürecekti fakat o da atlandı. C006: Burası kompüteri atladığı yer. Bu A registerini FF ile yükler. C008: BASIC'e dönülür.
INDIRECT ADDRESSING JMP komutu indirect (dolaylı) adreslemeyi destekler. JMP ($XXXX) şeklinde yazılır, XXXX 4 haneli hex sayıdır.
SYS Bu komut ile daha önce karşılaşmışsınızdır. Assembly dili komutu değil BASIC komutudur. Bu komut makina koduna gidecek ve RTS komutu ile karşılaşınca BASIC'e dönecektir. Örnek olarak hex sayısı desimaldeki 49152 ile aynıdır. Şimdiye kadar yazdığımız bütün programları RUN etmek için 49152 yazabilirsiniz. SYS komutu Assembly dili rutinini yazdıktan sonra kullanılır ve artık Assembler'e ihtiyaç kalmaz.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 21
JSR VE STACK (YIĞIN) Her assembly dili programını çalşıtırdığınız (execute) zaman, assambler size registerlerin değerini yazdı, SP reğisteri dahil. Şimdi SP registerinin ne olduğunu öğreneceğiz. SP yığın göstergecinin (Stack Pointer) baş harflerinden oluşur. Stack dönüş adresinin konduğu yerdir. Kompüter dallanmaya (GOSUB) gittiğinde, RETURN'den sonra dönmesi gereken yer Stack üzerinde depolanır. İşte dikkat edilecek ana noktalar: — Kompüter Stack üzerine adres saklar (depolar) — Kompüter dönüş (Return) komutuyla karşılaşır. — Kompüter Stack'tan adresi geri alır. — Kompüter o adrese döner.
Assembly dilinde GOSUB'un eşdeğeri JSR dir, Jump to Sub-Routine nin kısaltılmasından oluşur. RETURN nün eş değeri RTS dir, Return to Subroutine'nin kısaltılmasından oluşmuştur. Stack, GOSUB ve REFURN de olduğu gibi JSR ve RTS ye de aynı şekilde hareket eder.
Gerçek stack hafızanın (memory) 255 byte'tıdır ve 0100 den O1FF e kadar uzanır. Stack Pointer (SP), stack'taki bir sonraki boş byte'ı gösterir. Stack pointer FF ile başlar ki 01FF bölgesini gösterir, BASIC birkaç byte kullanır ve Stack pointer (SP) O1EF bölgesini gösterir.
Her defasında JSR veya SYS komutu kullandığınızda kompüter, dönüş adrısinin LOW byte'ını Stack'ta saklar ve Stack Pointer'i (SP) Oi eksiltir. HI byte da Stack'ta depolandıktan sonra Stack Pointer (SP) bir kere da eksilir.
RTS komutunu kullandığınızda, kompüter Stack'taki HI byte'i alır ve Stack pointer'i arttırır. Sonra Stack'taki LOW byte'ı alır ve Stack Pointer'i tekrar arttırır. Bundan sonra kompüter LOW ve HI byte'ları yanyana koyarak dönüş (return) adresini oluşturur. Adres oluştuktan sonra kompüter bu adrese döner.
BASIC'in kullandığı dallanmalara atlıyarak (jumping to subroutine) karakter print etme, cursor'u hareket ettirme gibi işlemler yaptırabiliriz. Karakter print etmek için A registerini, karakterin ASCII kodu ile yükleriz ve JSR $ FFD2: Co00 LDA #$ 41 C0O02 JSR $ FFD2 Ccoo5 RTS
Bu program A karakterini print eder, çünki A registeri A'nın ASCII değeri ile rutin çağrılmadan yüklenmiştir. Diğer karakterleri print etmek için
User's Manual daki 135-137 sayfalardaki ASCII karakterlerine bak.
Bundan sonraki rutin cursor'un X ve Y koordinatlarını hazırlar. Önce X registeri X koordinatıyla, sonra Y registeri Y koordinatıyla yüklenir. Şimdi CLC (bu komut bir sonraki bölüm de anlatılacaktır), sonra JSR $ FFFO: Cco00 LDX # $ 00 C002 LDY #$ 05
CO04 CLC CO0O5 JSR $ FFFO
Cco08 RTS
Açıkça görüldüğü gibi cursor ekranın sol üst köşesine ayarlandı. Bir önceki rutinle beraber birleştirerek ekranın herhangi bir yerine istediğin karakteri yazabilirsin.
Bu bölümün sonu, işte çözülmek üzere başka bir program: Ekranı silip cursor'u 01, 01 e ayarlıyabilirmisin? Co00 LDA # $ 93 C002 JSR $ FFD2 LDX # $ Oi COO7 LDY #$ 01 Cco09 CLC COOA JSR $ FFFO CoOOD RTS
Üstteki program clear home print eder (ASCII 93 “hex. veya 147 dec.) ve cursor'u Oi, O1 e ayarlar.
Programınızı çalışmadıysa veya yukarıdakileri anlamadıysanız üzülmeyiniz. Bu bölümü tekrar okumanızı tavsiye ederim.
PROCESSOR'UN STATUS REGİSTERİ Processor'ün status (durum) reegisteri'i (P register) bize kompüterin durumunu (state) belirtir. Bir sonraki bölümde status'un nasıl test edileceğini araştıracağız. Bu bölümde P registerinin ne olduğunu göstereceğim.
Bildiğiniz gibi bir byte içinde 8 tane bit var ve bunlar 0 veya 1 olabilir. P registeri her biti flag (bayrak) olarak kullanır. Her bit kompüterin status'una göre "set" veya "reset" olarak ifade edilir. Her bit'in ne işlem yaptığına bakalım: Bit 7: Bu negatif flag olarak adlandırılır. İşlemin sonucu 80 ile FF arasında ise 1 (set) dir. Örnek olarak, LDA #$C7 bu bit'i set (1) durumuna getirir. İşlem sonucu 00 ile 7F arasında ise bu bit reset (0) dır. Bit 6: Buna taşma flag'ı (overflow) adı verilir. Artış 7F'nin üzerine çıkarsa veya azalma 80'in altına inerse set (1), diğer durumlarda reset (0) dır. Bit 5: Bu bit hiçbir şey değildir, kullanılmaz. Bit 4: BRK (force break) dır ve sonra bahsedilecek.