|
Konu Başlığı: 6510 ASM: Indirect Indexed (dolaylı dizinlenmiş) adresleme modu Gönderen: wizofwor üzerinde Ocak 13, 2017, 23:13:05 ÖS Selam arkadaşlar. Bu akşam size Indirect Indexed adresleme modu üzerine basit bir örnek yazacağım.
Bu aralar basit kod denemelerini RelaunchIDE üzerinde yapıyorum. Assembler olarak ACME kullanıyorum. Bu araçların kurulumu için Relaunch64 IDE kurulumu (http://www.commodore.gen.tr/forum/index.php?topic=9318.0) başlığına bakabilirsiniz. Programı $c000 adresinden başlatacağım. İşe her zamanki gibi otomatik başlatma kodumu BASIC program belleğine $801'den itibaren yerleştirerek başlıyorum. Kod: ;Basic Start Konu Başlığı: Ynt: 6510 ASM: Indirect Indexed (dolaylı dizinlenmiş) adresleme modu Gönderen: wizofwor üzerinde Ocak 13, 2017, 23:25:15 ÖS Okunabilirliği arttırmak için sihirli numara kullanmaktan fayda var. Bu yüzden kullanacağım bellek adreslerini öndeden tanımlıyorum.
Adet olduğu üzere raster'lar üzerine bir efekt yapacağım. Bununla ilgili adresleri tanımladım. Delay ve pointer'ların ne olduğuna sonra değineceğim. Kod: RASTER = $D012 ; VICII Raster yazmacı Sei ile interruptları kapattıktan sonra (zamanlamamı bozmasınlar) sürekli dönecek olan koda başlıyorum. Döngü ekranı siyaha boyayarak başlayacak. Raster satırı 160'a gelene kadar bekleyecek. Sonra biraz daha bekleyecek. Bu biraz daha bekleme süresini ekrandaki titremeler en aza inecek şekilde deneme yanılmayla buluyoruz. Kod:
Konu Başlığı: Ynt: 6510 ASM: Indirect Indexed (dolaylı dizinlenmiş) adresleme modu Gönderen: wizofwor üzerinde Ocak 13, 2017, 23:31:46 ÖS Şimdi dosyanın sonuna gidip subrutinlerimi yazabilirim.
white, red, yellow, dblue ve blue subrutinleri ekranı isimleriye müstesna renklerle boyuyacak ve henüz yazmadığım colorChange rutinine geri dönecekler. Kod: white: Bu da ekrandaki raster barların kalınlığını veren gecikme rutini. Kod:
Konu Başlığı: Ynt: 6510 ASM: Indirect Indexed (dolaylı dizinlenmiş) adresleme modu Gönderen: wizofwor üzerinde Ocak 13, 2017, 23:38:11 ÖS Konumuz Indirect Indexed Adressing olduğuna göre programın dallanacağı adresleri bir tabloya yerleştirmek lazım.
Adresler 16 bit olduğu için doğrudan belleğe yerleştiremiyoruz. İkiye bölerek LO,HI formatında peş peşe dizmek gerekiyor. Bunun için '<' ve '>' işaretlerinden faydalanıyorum. Kod: addressTable: Konu Başlığı: Ynt: 6510 ASM: Indirect Indexed (dolaylı dizinlenmiş) adresleme modu Gönderen: i_r_on üzerinde Ocak 13, 2017, 23:49:28 ÖS Güzel :),
indirect indexed ve indexed indirect insanı general purpose computing'e yaklaştıran adresleme metodlarıdır, kuşkusuz ki kullanım alanları vardır :) https://eksisozluk.com/entry/1602938 https://eksisozluk.com/entry/1602925 https://eksisozluk.com/entry/16069867 Konu Başlığı: Ynt: 6510 ASM: Indirect Indexed (dolaylı dizinlenmiş) adresleme modu Gönderen: wizofwor üzerinde Ocak 13, 2017, 23:51:32 ÖS Şimdi gelelim esas işi yapacak olan koda.
ilk olarak 4 tane nop komutum var. Bunları satır sonları ekranın ortasına gelmesin diye sonradan koydum. Bu sayıyı bulurken tabiki her zamanki favorim deneme yamulma yönteminden faydalandım. Kod: colorChange: Index olarak Y'yi kullanacağım. Toplam 5 tane renk barım olacağı için döngünün başında Y'nin değerini kontrol ediyorum. 5'nci bardan sonra 'begin' adresine yani ana döngünün başına dallanıyorum. Kod: cpy #2*5 Adres tablosunda sıradaki rutinin başlangıç adreslerini alıp ZP'deki POINTER_L ve POINTER_H adreslerine yazıyorum ve dallanıyorum. Indirect modu kullanırken sadece Low byte'ın adresini yazdığımı fark ettiniz mi? 6510 High byte için her zaman bir sonraki adrese bakacaktır. Yani POINTER_H = POINTER_L+1 olmak zorunda. Kod: lda addressTable,y En sonunda güvenlik önlemi olarak bir jmp * koyuyorum. Her şey düzgün çalışıyorsa program bu satıra hiç gelmeyecek. Kod: jmp * Konu Başlığı: Ynt: 6510 ASM: Indirect Indexed (dolaylı dizinlenmiş) adresleme modu Gönderen: i_r_on üzerinde Ocak 14, 2017, 00:00:57 ÖÖ bu arada deneme yanılma metodu güzel ama border dışında kalan ve 8'e bölünebilen satırlar badline ve buralarda VIC 40 ile 43 cycle arası çalıyor. diğer satırlarda ise PAL için 63 cycle'ın var.
Konu Başlığı: Ynt: 6510 ASM: Indirect Indexed (dolaylı dizinlenmiş) adresleme modu Gönderen: wizofwor üzerinde Ocak 14, 2017, 00:11:10 ÖÖ Derlenmeye hazır kodun tamamı burada. Bu örnekte Indirect modu kullanmış olduk. Tabiki bu iş çok daha pratik şekillerde yapılabilir ama amaç adresleme modunu göstermekti.
Kod: ;Basic Start Konu Başlığı: Ynt: 6510 ASM: Indirect Indexed (dolaylı dizinlenmiş) adresleme modu Gönderen: wizofwor üzerinde Ocak 14, 2017, 00:14:48 ÖÖ bu arada deneme yanılma metodu güzel ama border dışında kalan ve 8'e bölünebilen satırlar badline ve buralarda VIC 40 ile 43 cycle arası çalıyor. diğer satırlarda ise PAL için 63 cycle'ın var. İşin doğrusu cycle saymak ve gecikme tablosu kullanmak ancak bu örnekte amaç başka olduğu için oralara girmedim. Zaten kodu derleyenler görecek. Sonuç hiç de stable olmadı. Konu Başlığı: Ynt: 6510 ASM: Indirect Indexed (dolaylı dizinlenmiş) adresleme modu Gönderen: Levent (Lvnt) üzerinde Ocak 14, 2017, 11:35:35 ÖÖ pal ve ntsc için ayrı ayrı gecikme sayıları bulacağız yani?
Vic40 ne ola? Konu Başlığı: Ynt: 6510 ASM: Indirect Indexed (dolaylı dizinlenmiş) adresleme modu Gönderen: i_r_on üzerinde Ocak 14, 2017, 11:55:03 ÖÖ VIC derken c64'deki VIC 2'yi kastettim. 40 da bu çipin ekstra bellek erişimi için belli satırlarda ihtiyaç duyduğu minimum cycle sayısı. (Bunun maksimumu da 43)
http://www.antimon.org/dl/c64/code/missing.txt (http://www.antimon.org/dl/c64/code/missing.txt) Şurada detaylı bilgi var, işin içine sprite'lar falan girince hesap değişiyor. Konu Başlığı: Ynt: 6510 ASM: Indirect Indexed (dolaylı dizinlenmiş) adresleme modu Gönderen: Levent (Lvnt) üzerinde Ocak 14, 2017, 12:05:27 ÖS i_r_on: bende vic20 var da vic40 nereden çıktı şimdi ram falan mi ilave ettiler vb gibi garip düşüncelere kapılmıştım :)
Link iyiymiş, kaydettim, teşekkürler Konu Başlığı: Ynt: 6510 ASM: Indirect Indexed (dolaylı dizinlenmiş) adresleme modu Gönderen: wizofwor üzerinde Ocak 14, 2017, 16:45:21 ÖS Bu örneği Indirect adresleme modunu olayı fazla dallandırmadan anlatabilmek için hazırladım. Renkli raster barları çok daha basit şekilde yapılabilir.
Cycle hesabını NTSC ve PAL cihazlar için ayrı yapmak gerekiyor. Ayrıca 8 satırda bir gerçekleşen 'Bad Line' denen bir olay var. Bu bad line'lar için ayrı hesap yapmak gerekiyor. Bir de Iron'un son olarak bahsettiği Sprite gösterilen satırlarda VIC'in sprite datasını okuma durumu var. Bu da bir diğer mevzu. Hiç itiraz gelmedi ama başta örneği hatalı kurguladığım için Indirect Indexed değil sadece Indirect adreslemyi kullabildim. Indirect Indexed için yakında bir örnek daha gelecek. Konu Başlığı: Ynt: 6510 ASM: Indirect Indexed (dolaylı dizinlenmiş) adresleme modu Gönderen: Levent (Lvnt) üzerinde Ocak 14, 2017, 17:22:16 ÖS Okumadık ki :D
Şaka bir tarafa her adı geçtiğinde ben indirect indexed ile indexed indirect farkı neydi diye bir an düşünüp, sonra time-out olup başka bir konuya geçiyorum. Bilinçli olarak değil, ya da bir memnuniyetsizlik eleştiri vb yok yanlış anlama olmasın. Bu yüzden itiraz gelmemiş olabilir Konu Başlığı: Ynt: 6510 ASM: Indirect Indexed (dolaylı dizinlenmiş) adresleme modu Gönderen: i_r_on üzerinde Ocak 14, 2017, 18:53:25 ÖS @wizofwor : Sana mesaj attıktan sonra kodu inceledim. Baktım sadece jmp'ta kullanılan dolaylı (indirect) adresleme var. Sonra video oynatıcıda ben ne yapmışım diye baktım ben de jmp için kullanmışım. Aklıma da başka örnek gelmedi.
Tek avantajlı kullanım şekli şu aşağıdaki gibi https://wiki.nesdev.com/w/index.php/RTS_Trick Misal bir virtual machine falan yazılacaksa ve çalışacak komutların vektörleri zero page'e konduysa. Sırasıyla dallanılacak vektörlerin listesi de uzun uzadıya bir bellek bölgesindeyse o zaman fark yaratıyor bu adresleme şekli. Hele vektörler gibi ana loop kodunu da zero page'e koyarsan kodun darasını epey bir almış oluyorsun. Maniac mansion ve Zak McCracken'deki interpreter bu şekilde çalışıyor diye okumuştum. Konu Başlığı: Ynt: 6510 ASM: Indirect Indexed (dolaylı dizinlenmiş) adresleme modu Gönderen: ilkerficicilar üzerinde Ocak 14, 2017, 23:02:49 ÖS Indirect deyince 65c02'deki JMP($falan,X) geldi aklıma nedense... Commodore LCD'nin içinde, PHY PHX vb. ile birlikte bolca kullanmışlar.
Konu Başlığı: Ynt: 6510 ASM: Indirect Indexed (dolaylı dizinlenmiş) adresleme modu Gönderen: i_r_on üzerinde Ocak 14, 2017, 23:42:34 ÖS Indirect deyince 65c02'deki JMP($falan,X) geldi aklıma nedense... Commodore LCD'nin içinde, PHY PHX vb. ile birlikte bolca kullanmışlar. Nispet yapmışlar diyosun yani :) Bu arada yeni farkettim. Benim kafa hep X register'ı ile kullanılan Indexed Indirect'e gitmiş, başlıkta Indirect Indexed yazıyormuş. Bu arada bunların terminolojik olarak karışmaması için ilk kelimeye bakmak lazım. İlk kelime adreslemenin temel işlevini, ikincisi ise yan fonksiyonu söylüyor. Indirect Indexed : Bunun indeksli olması yan özelliği. Önemli olan Indirect olması, yani operand olarak verilen adres doğrudan kullanılmıyor. O adres ve O adresten sonraki adres 16 bit bir adres oluşturmak için kullanılıyor. Indeksli olması dediğim gibi yan özellik. Oluşan adrese Y register'ının değeri eklenip işlem yapılacak adresin son değeri bulunuyor. Indexed Indirect : Bunun da ilk ve temel özelliği operand olarak verilen zero page adresinin X register'ı ile indekslenebilmesi. Indirect niteliği ikinci aşamada 16 bit adresin kullanılması aşaması. Yani ilk kelimede Indirect görünce aklınıza Y, Indexed görünce de X getirirseniz karışmıyor. Zaten çoğu programcı sadece indeksleme ihtiyacı varsa çoğu zaman doğrudan indeksleme için X register'ını kullanır. Hatta 6502'nin ortagonal olmayan garip bir özelliği zero page'de doğrudan indisleme için sadece X register'ını kullanabilmesi. Instruction set epey garip. Kod: LDA (LoaD Accumulator) Konu Başlığı: Ynt: 6510 ASM: Indirect Indexed (dolaylı dizinlenmiş) adresleme modu Gönderen: wizofwor üzerinde Ocak 15, 2017, 10:42:43 ÖÖ Indirect Indexed ve Indexed Indirect arasında farkı oradaki parantez çok güzel açıklıyor. Parantezin içini pointer, parantezin dışını vektör olarak okuduğumuzda X pointer adresine, Y vektör değerine ekleniyor.
Yani:
Aşağıda ekran renklerini türlü şekil değiştiren rutinler var. Kod: BORDER = $d020 Bu sefer de Absolute Indexed'e örnek veremedim. Çünkü sadece JMP komutuyla çalışıyor. Ancak Y nin sıfır olduğu yerde Indirect Indexed = Absoulte Indirect olarak düşünebilirsiniz. |