Merhaba, Ziyaretçi. Lütfen giriş yapın veya üye olun.

Kullanıcı adınızı, parolanızı ve aktif kalma süresini giriniz

  Gelişmiş Arama
insanın içinde varsa, commodore.gen.tr açığa çıkarır bunu.. bir nevi retro olaylarının dolunayıyız.(Arda)
commodore.gen.trCommodoreCommodore Yazılım6510 ASM: Indirect Indexed (dolaylı dizinlenmiş) adresleme modu
Sayfa: [1] 2   Aşağı git
Yazdır
Gönderen Konu: 6510 ASM: Indirect Indexed (dolaylı dizinlenmiş) adresleme modu  (Okunma Sayısı 13796 defa)
0 Üye ve 1 Ziyaretçi konuyu incelemekte.
wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.792


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« : 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 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
* = $0801                               ; BASIC start address (#2049)
!byte $0d,$08,$dc,$07,$9e,$20,$34,$39   ; BASIC loader to start at $c000...
!byte $31,$35,$32,$00,$00,$00           ; puts BASIC line 2012 SYS 49152

;Program Start
* = $c000
Logged

wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.792


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« Yanıtla #1 : 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ı					
BORDERCOL = $D020  ; VICII Çerçeve rengi yazmacı
BACKGRCOL = $D021  ; VICII Arka ekran rengi yazmacı
DELAY = 101    ; Gecikme değeri
POINTER_L = $02   
POINTER_H = $03

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:
	
sei

begin:
lda #00
sta BORDERCOL
sta BACKGRCOL

lda #160       
- cmp RASTER
bne -           ; 160'ıncı satırı bekle

ldy #$10
- dey             ; biraz daha bekle
bne -
Logged

wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.792


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« Yanıtla #2 : 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:	
lda #01
sta BORDERCOL
sta BACKGRCOL
jsr delay
jmp colorChange

red:
lda #02
sta BORDERCOL
sta BACKGRCOL
jsr delay
jmp colorChange

yellow:
lda #07
sta BORDERCOL
sta BACKGRCOL
jsr delay
jmp colorChange

dblue:
lda #6
sta BORDERCOL
sta BACKGRCOL
jsr delay
jmp colorChange

blue:
lda #14
sta BORDERCOL
sta BACKGRCOL
jsr delay
jmp colorChange


Bu da ekrandaki raster barların kalınlığını veren gecikme rutini.
      
Kod:
	
delay:
ldx DELAY
- inx
bne -
rts
Logged

wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.792


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« Yanıtla #3 : 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:	
!by <white,>white
!by <red,>red
!by <yellow,>yellow
!by <blue,>blue
!by <dblue,>dblue
Logged

i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #4 : 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
Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.792


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« Yanıtla #5 : 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:
nop
nop
nop
nop

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
beq begin

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
sta POINTER_L
iny
lda addressTable,y
sta POINTER_H
iny

jmp (POINTER_L)
         

En sonunda güvenlik önlemi olarak bir jmp * koyuyorum. Her şey düzgün çalışıyorsa program bu satıra hiç gelmeyecek.
            
Kod:
	jmp *
Logged

i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #6 : 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.
Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.792


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« Yanıtla #7 : 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
* = $0801                               ; BASIC start address (#2049)
!byte $0d,$08,$dc,$07,$9e,$20,$34,$39   ; BASIC loader to start at $c000...
!byte $31,$35,$32,$00,$00,$00           ; puts BASIC line 2012 SYS 49152

;Program Start
* = $c000 ;can be executed by writing sys 49152

RASTER = $D012
BORDERCOL = $D020
BACKGRCOL = $D021
DELAY = 101
POINTER_L = $02
POINTER_H = $03

sei

begin:
lda #00
sta BORDERCOL
sta BACKGRCOL

lda #160
- cmp RASTER
bne -

ldy #$10
- dey
bne -

colorChange:
nop
nop
nop
nop


cpy #2*5
beq begin

lda addressTable,y
sta POINTER_L
iny
lda addressTable,y
sta POINTER_H
iny

jmp (POINTER_L)

jmp *

addressTable:
!by <white,>white
!by <red,>red
!by <yellow,>yellow
!by <blue,>blue
!by <dblue,>dblue

white:
lda #01
sta BORDERCOL
sta BACKGRCOL
jsr delay
jmp colorChange

red:
lda #02
sta BORDERCOL
sta BACKGRCOL
jsr delay
jmp colorChange

yellow:
lda #07
sta BORDERCOL
sta BACKGRCOL
jsr delay
jmp colorChange

dblue:
lda #6
sta BORDERCOL
sta BACKGRCOL
jsr delay
jmp colorChange

blue:
lda #14
sta BORDERCOL
sta BACKGRCOL
jsr delay
jmp colorChange


delay:
ldx DELAY
- inx
bne -
rts


* indirect_indexed.png (2.46 KB, 384x272 - Görüntüleme: 1527 kez.)
Logged

wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.792


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« Yanıtla #8 : 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ı.
Logged

Levent (Lvnt)
Uzman
*****
Mesaj Sayısı: 2.398



Üyelik Bilgileri
« Yanıtla #9 : Ocak 14, 2017, 11:35:35 ÖÖ »

pal ve ntsc için ayrı ayrı gecikme sayıları bulacağız yani?

Vic40 ne ola?
Logged

Use the brute force, Luke
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #10 : 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

Şurada detaylı bilgi var, işin içine sprite'lar falan girince hesap değişiyor.
Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
Levent (Lvnt)
Uzman
*****
Mesaj Sayısı: 2.398



Üyelik Bilgileri
« Yanıtla #11 : 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
Logged

Use the brute force, Luke
wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.792


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« Yanıtla #12 : 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.
Logged

Levent (Lvnt)
Uzman
*****
Mesaj Sayısı: 2.398



Üyelik Bilgileri
« Yanıtla #13 : Ocak 14, 2017, 17:22:16 ÖS »

Okumadık ki  Kahkaha

Ş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
Logged

Use the brute force, Luke
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #14 : 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.
Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
Sayfa: [1] 2   Yukarı git
Yazdır
Gitmek istediğiniz yer: