Gönderen Konu: 6502 optimizasyon sorusu  (Okunma sayısı 6904 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

i_r_on

  • Ziyaretçi
Ynt: 6502 optimizasyon sorusu
« Yanıtla #15 : 15 Mayıs 2015, 23:18:18 »
Benim rutinin optimize edilmemiş hali ekte. Aşağı yukarı 60 cycle gibi bir zamanda bir bit transfer ediyor. Senkron transfere göre avantajı XMicro transfer arasında çay kahve demleyebiliyor :) NMI yaparak 0 bitini, IRQ yaparak 1 bitini transfer ediyor mevcut transfer edilecek datanın. SO'dan gelen overflow bilgisini de önyüzdeki program state'ler arası geçişi işaretlemek için kullanıyor. Hızını kaybettiren kısım olarak state işini de interrupt handler'ların yapıyor olmasını gördüm. State işini interrupt handler'ın dışına alınca aslında bu yöntemde interrupt handler'lar içinde yapılabilecek daha fazla bir optimizasyon yok gibi. Ön taraftaki programdan bir miktar daha kısılabilir belki.

Kod: [Seç]
Ana döngüde her byte öncesi initialization
-------
LDA #$00
SEC

IRQ (0 bitlerin transferi için)
----
ASL
SEC
RTI

7(NMI) + 2(ASL) + 6(RTI) cycle = 15 cycle + 3 cycle buffer mevcutta çalışan
instruction'a denk gelip geç tetiklenme durumu için. Toplam 18 cycle


NMI (1 bitlerin transferi için)
----
ROL
SEC
RTI

7(NMI) + 2(ROL) + 6(RTI) cycle = 15 cycle + 3 cycle buffer mevcutta çalışan
instruction'a denk gelip geç tetiklenme durumu için. Toplam 18 cycle

Başlangıçta Her byte transferi sonrası SO pin'i tetiklenerek Akümülatördeki değeri saklamadan önce
Kod: [Seç]
LOOP BVC LOOP
CLV

Başlangıçta Meta data transfer edilir (başlangıç adresi vesaire). İlk edinilen byte'lar sırayla ZP adreslere transfer edilir. Esas blok transferler de bu ZP adresler kullanılarak yapılır. Yazmadım ancak payload'un her byte'ı için 30 cycle'lık bir işlemle yapılabilir gibi. Interrupt handler'ların kullandığı 18'i de 20'ye tamamlayalım.

1 byte için = 20 * 8 + 30 = 190 micro sec.
1K için = 190 * 1024 =~ 205 ms.

Benim durumumda yaklaşık 2 misli bir optimizasyon oldu bu.

Bu arada bahsettiğim pratikte uygulanmış senkron örneğe de aşağıdaki linklerden ikincisinden bakabilirsiniz, ilki elemanın projesinin ana sayfası
http://www.ele.uva.es/~jesus/6502copy/proto.html
http://www.ele.uva.es/~jesus/6502copy/nrom2/bootload.s

ps: Başlangıçta aklıma binary tree kullanmak geldi ama sonradan farkettim ki zaten binary tree'nin gideceğimiz node'unun adresini irq/nmi çağrıları ile oluşturabiliyoruz ve bu da transfer edilen byte'a denk geliyor.