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.
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
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.htmlhttp://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.