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ımC64 Assembly kod yarışması - Ödüllü
Sayfa: 1 [2] 3 4 5   Aşağı git
Yazdır
Gönderen Konu: C64 Assembly kod yarışması - Ödüllü  (Okunma Sayısı 36675 defa)
0 Üye ve 1 Ziyaretçi konuyu incelemekte.
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #15 : Mayıs 11, 2017, 23:02:11 ÖS »

Vice'a dışarıdan memory injection sanırım en pratiği olacak. Ne dersin?

Böyle bir imkan varsa kesinlikle daha kolay olur evet
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.785


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« Yanıtla #16 : Mayıs 11, 2017, 23:19:54 ÖS »

Soruyu doğru anlamış olduğumu umut ederek derme çatma kodumu aşağıya kopyalıyorum.

Kod:
.const port 		= $80FF
.const startAddr = $0800
.const endAddr = $F7FF
.const tapeBuffer = $033C


/*
transfer rutinini kaset tamponuna kopyala
ve oraya atla
*/
selfCopy: {
!: ldx transferEnd-transfer
lda transfer,x
sta tapeBuffer,x
bne !-
jmp tapeBuffer
}

/*
transfer rutini
*/
transfer: {
// başlamak için porttaki değerin değişmesini bekle
firstByte:
lda port // 4
cmp port // 4
beq firstByte // 2 = 10 Cycle
bit $02 // 3
bit $02 // 3
bit $02 // 3
bit $02 // 3
bit $02 // 3
nop // 2
    jmp loop // 6 = 33 Cycle


wait:
bit $02 // 3
bit $02 // 3
bit $02 // 3
bit $02 // 3
nop // 2
nop // 2 = 16 Cycle

loop:
lda port // 4
sta tAddr:#startAddr // 4 = 8 Cycle

// adresi arttır
inc tAddr // 6
bne wait // 2(+1) = 8(9) Cycle
inc tAddr+1 // 6
lda >endAddr+1 // 4
cmp tAddr+1 // 4
bne loop // 2(+1) = 24(25) Cycle

// hedef addresi sıfırla
reset:
lda #>startAddr
sta tAddr
lda #<startAddr
sta tAddr+1
rts
}
transferEnd:
Logged

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



Üyelik Bilgileri WWW
« Yanıtla #17 : Mayıs 11, 2017, 23:31:09 ÖS »

@wizofwor : $02 adresinde hangi değer var?
Logged

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

twitter | blog
emarti
Uzman
*****
Mesaj Sayısı: 2.590


Only Amiga Makes It Possible █


Üyelik Bilgileri WWW
« Yanıtla #18 : Mayıs 11, 2017, 23:37:29 ÖS »

@wizofwor : $02 adresinde hangi değer var?
Ben de onu çözmeye çalışıyordum
Logged

https://github.com/emartisoft My GitHUB | http://csdb.dk/scener/?id=26786 My CSDB | https://c64kernal.com Genesis

READY.
SYS(64767): EMARTI
wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.785


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« Yanıtla #19 : Mayıs 11, 2017, 23:37:45 ÖS »

BIT komutlarını sadece 3 cycle harcamak için kullandım. $02 adresindeki değerin önemi yok.
Logged

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



Üyelik Bilgileri WWW
« Yanıtla #20 : Mayıs 11, 2017, 23:47:23 ÖS »

BIT komutlarını sadece 3 cycle harcamak için kullandım. $02 adresindeki değerin önemi yok.

Cycle'lar bize lazım, niye harcadın?

Cevapla beraber gönderilecek bilginin sunumu ile ilgili de bilgi verirseniz süper olur. Mesela senin kodda değişimi algılıyorsun. Ya hiç değişmeyen bir veri akışı gelirse?

Şunu dersen ok, ben micro'dan her bir byte gönderimi için ekstra ondan farklı bir byte göndereceğim, bu sayede gerçek datayı ayıklayacağım.

Mantık bu herhalde senin koddaki değil mi?

ps:Busy waiting kısımları hesaplamanın dışına alabiliriz.
« Son Düzenleme: Mayıs 11, 2017, 23:53:00 ÖS Gönderen: i_r_on » Logged

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

twitter | blog
blackturk
Uzman
*****
Mesaj Sayısı: 1.283



Üyelik Bilgileri
« Yanıtla #21 : Mayıs 11, 2017, 23:57:26 ÖS »

Bende kod yazmadım.ama pseudo olarak kodladım.

1 port değeri $ff mi hayır tekrarla
2 evet ise veri çekmeye başla
3 port değeri pozitif mi ?
4 okunan değerin 7 biti data buffer memory sakla
5 portu değerini oku pozitif ise tekrar 5 . Adım
6 evet negatif ise 7 bit data buffer memory sakla
7 buffer doldu mu ? Hayır 2. Adıma git
8 buffer datalarını 8 bit duruma getir.
9 programı bitir
Logged

A1200 | APOLLO 1240 32 MB | CNET PCMCIA | SYSINFO SPEED TEST 30 MIPS
SM1,SEGA MEGA CD,SM2,SMS II,Sega Saturn Mod ve AR 4MB,PSX Mod ve Mpeg ,PSX2 ,SNES ,ATARI 800XL,SPECTRUM 128K +2,YAMAHA CX5M MSX,ATARI 520 STFM,1040 STF,C64,C128,1541 II,1571,RAM 1764 ,A500,A500+,A600,A590,IDE68k,2X1084S,1084P
emarti
Uzman
*****
Mesaj Sayısı: 2.590


Only Amiga Makes It Possible █


Üyelik Bilgileri WWW
« Yanıtla #22 : Mayıs 12, 2017, 00:06:24 ÖÖ »

$FB $FC gibi zero page kullanarak indirect indexed adresleme kullanarak verileri ilgili yere yerleştirerek @wizofwor 'un kodunu optimize etsek çok mu cycle harcar?
Logged

https://github.com/emartisoft My GitHUB | http://csdb.dk/scener/?id=26786 My CSDB | https://c64kernal.com Genesis

READY.
SYS(64767): EMARTI
wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.785


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« Yanıtla #23 : Mayıs 12, 2017, 00:07:25 ÖÖ »

kurmaya çalıştığım mantık şuydu:

- transfer kodunu kaset tamponuna at
- port adresindeki değer değişene kadar bekle
- değer değiştiği andan itibaren sabit hızaı kopyala
- kopyalama bitince hedef adresi resetle

Değer değişmesini sadece İlk başta senkronize olabilmek için bekliyor. Hatta o ilk değeri kopyalamıyor. Sonrasında her  33 cycle'da bir byte gelmesi lazım.
Logged

Skate
Uzman
*****
Mesaj Sayısı: 1.479


A Sinner Scener


Üyelik Bilgileri WWW
« Yanıtla #24 : Mayıs 12, 2017, 00:13:17 ÖÖ »

Vice'ın telnet interface'i çok buglı. Daha önce de başıma gelmişti benzer problemler. İlk komut düzgün gidiyor, sonrakilerde patlamaya başlıyor falan. Çözebilirsem düzgün bir simülasyonla test etmek istiyorum. Şimdilik unstable bir durum söz konusu.

Edit: İlk komutu remote monitör ile gönderiyorum, çalışıyor. Sonrakiler "ERROR -- Wrong syntax:" hatası veriyor. Sanırım Enter tuşuyla arası hoş değil arkadaşın.
« Son Düzenleme: Mayıs 12, 2017, 00:14:58 ÖÖ Gönderen: Skate » Logged
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #25 : Mayıs 12, 2017, 00:13:29 ÖÖ »

kurmaya çalıştığım mantık şuydu:

- transfer kodunu kaset tamponuna at
- port adresindeki değer değişene kadar bekle
- değer değiştiği andan itibaren sabit hızaı kopyala
- kopyalama bitince hedef adresi resetle

Değer değişmesini sadece İlk başta senkronize olabilmek için bekliyor. Hatta o ilk değeri kopyalamıyor. Sonrasında her  33 cycle'da bir byte gelmesi lazım.


Senkron yapı kuramıyoruz. Çünkü, bu 33 cycle'a tam senkron olamıyor karşı taraf.

@emarti : self modifying kod büyük transferlerde indirect indexed'den hızlı. biri. sırf saklama için bile biri 6 cycle yerken diğeri 5 cycle yiyor.
Logged

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

twitter | blog
Skate
Uzman
*****
Mesaj Sayısı: 1.479


A Sinner Scener


Üyelik Bilgileri WWW
« Yanıtla #26 : Mayıs 12, 2017, 00:53:52 ÖÖ »

Vice'ın telnet interface'ini kullandığımda komutlar arasında 20 milisaniye geçmesini bekliyor. Bu durumda saniyede en fazla 50 byte transfer edebilirim. Bu şekilde olmadı kısacası. Aslında monitör'e remote olarak erişebildiğim için tek komutla çötenk diye tüm hafızayı doldurabilirim. Ama amaç byte byte transfer simüle etmek olduğu için bu yöntem işe yaramadı.
Logged
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #27 : Mayıs 12, 2017, 00:55:46 ÖÖ »

@Skate :  Şöyle de simüle edebilirsin, gönderimi yapan c64'de ön tarafta çalışan kod olsun. Bellekte belli bir adrese yazsın. Hatta yazarken yarım yarım yazsın.

Transfer rutini de interrupt rutini olarak çalışsın.

Ps: önemli olan loop'ta kaç cycle harcadığın. 500 byte transfer etsen de ölçüm için yeter.
Logged

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

twitter | blog
Skate
Uzman
*****
Mesaj Sayısı: 1.479


A Sinner Scener


Üyelik Bilgileri WWW
« Yanıtla #28 : Mayıs 12, 2017, 01:05:24 ÖÖ »

Interrupt ile tam simülasyon yapamazsın. Yarım yarım bile yazsan interrupt rutini içinde çalışan kod interrupt dışından bölünemeyeceği için o şekilde işe yaramaz. Ancak CIA kullanıp sürekli yeni interruptlar üreterek belki benzer bir simülasyon yapılabilir. Yani interrupt içinde loop olmayacak da her bir byte yazdıktan sonra yeni bir interrupt tetiklenecek ve arada belli bir delay bırakılacak. Bana çok hoş bir yöntem olarak gözükmedi.
Logged
eins
Uzman
*****
Mesaj Sayısı: 1.816


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #29 : Mayıs 12, 2017, 01:24:41 ÖÖ »

@i_r_on, mikroişlemci tarafındaki kodu tek byte gönderiyor şeklinde düşünmek sorunda mıyız? Yoksa örneğin 128 yada 256 byte gönderecek şekilde kurgulayabilir miyiz?
Logged

Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
Sayfa: 1 [2] 3 4 5   Yukarı git
Yazdır
Gitmek istediğiniz yer: