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



Üyelik Bilgileri WWW
« : Mayıs 11, 2017, 02:21:30 ÖÖ »

Elinizde data transferinde kullanabildiğiniz 8 bit bir port var. Bu port $80FF adresinde yer alıyor. Bu port aracılığıyla bir mikrokontrolcünün C64'e veri göndermesi söz konusu.
 

Kurallar
1. Transferi asenkron yapmak zorundasınız. Veriyi gönderen taraf ile alan C64'ün saatlerini eşitleyelim senkron transfer yapalım gibi bir imkanımız yok.
2. Veriyi gönderen tarafın veriyi nasıl kodlayacağı konusunda serbestsiniz.
3. Gönderen tarafın porttaki bilgiyi sizin kodunuza senkron bir şekilde değiştirdiği varsayımı ile hareket edebilirsiniz. Gerçekte asenkron olacak, yani her port okumanızda geçerli bir değer okuyabilmeniz için mikrokontrolcünün portu c64'ün okuyacağı kadar aynı değerde tutması gerekirken siz her okuma yaptığınızda mikrokontrolcünün yaptığı bir sonraki gönderimi okuduğunuzu varsayabilirsiniz.
4. Kod 128 byte'tan kısa olmalı.
5. Tüm C64 donanımını kullanabilirsiniz.
6. I/O bölgesindeki RAM'e veri aktarabilmelisiniz.
7. Transfer edeceğiniz verinin başlangıç adresi $0800 ($FB, $FC adreslerinde), Toplam sayfa sayısını ise F0 olarak alabilirsiniz. Yani $0800-F7FF aralığına yükleme yapılacak. $0801'e 256 byte yükleme yapıp run etmeniz yeterli. (Test için 256 byte bir demo kullanacağım)
8. VIC'in cycle çalmadığı ekran/sprite'ların kapatıldığı varsayılacak.
9. Kod başlangıçta rom'da olacak, ancak siz transferin yapılmadığı cassette buffer'a yazıyormuşsunuz varsayabilirsiniz. (Kaset buffer şu adres aralığında : $033C-$03FB)
Yüklenecek programın çalışmasına engel olmayacak şekilde kodu yazmak için istediğiniz adres aralığını kullanabilirsiniz. Başka bir yükleyicinin kodunuzu istediğiniz bellek aralığına attığını varsayabilirsiniz.

10. $80FF adresi rom üstündeki bir adres. $8000-$9FFF aralığını okuduğunuzda rom'u okursunuz. Yazdığınızda altındaki RAM'a yazarsınız.

Tüm datanın transferi için toplamda en az cycle tüketen çözüm kazanır.

Ödül : Kazanan transfer yöntemini kullanan bir adet imzalı IRQHack64 kartuşu.
Son cevap tarihi : 18 mayıs 2017

Ps : 8 bit alır alır yazarım basit çözümü aklınıza gelmesin. Net anlaşılması için örnek yavaş bir çözümü paylaşacağım.

« Son Düzenleme: Mayıs 13, 2017, 00:51:33 ÖÖ 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 #1 : Mayıs 11, 2017, 10:58:14 ÖÖ »

heycanlandık.Yarışmacı arkadaşlara başarılar dilerim.
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 #2 : Mayıs 11, 2017, 11:23:32 ÖÖ »

Veri transferi güzel konu. Şimdiye dek User Porttan Assembly ile led yakıp söndürmus biri olarak yavaş çalışan kodu merak ettim
Logged

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

READY.
SYS(64767): EMARTI
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #3 : Mayıs 11, 2017, 11:39:16 ÖÖ »

Veri transferi güzel konu. Şimdiye dek User Porttan Assembly ile led yakıp söndürmus biri olarak yavaş çalışan kodu merak ettim

Sizin yazacağınıza nispeten yavaş diyelim ona Ölçmedim ama saniyede rahat 20-30KB yapar herhalde yavaş olan da

Yavaş olan her seferinde 4 bit gönderim yapıyor.
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 #4 : Mayıs 11, 2017, 15:01:46 ÖS »

Gelen veri $0800'den başlayarak F7FF'ye kadar kopyalancaksa bizim port altta ($80FF) kalıyor. Masum
Logged

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



Üyelik Bilgileri WWW
« Yanıtla #5 : Mayıs 11, 2017, 15:08:56 ÖS »

Gelen veri $0800'den başlayarak F7FF'ye kadar kopyalancaksa bizim port altta ($80FF) kalıyor. Masum

İki şeyi belirtmeyi unutmuşum. Düzenliyorum.

8. Kod başlangıçta rom'da olacak, ancak siz transferin yapılmadığı cassette buffer'a yazıyormuşsunuz varsayabilirsiniz.
9. $80FF adresi rom üstündeki bir adres. $8000-$9FFF aralığını okuduğunuzda rom'u okursunuz. Yazdığınızda altındaki RAM'a yazarsınız.
Logged

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

twitter | blog
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #6 : Mayıs 11, 2017, 21:53:16 ÖS »

Anlaşılabilir olması için bahsettiğim 4 bitlik transfer rutini aşağıdaki gibi. Bu sadece 256 byte yüklüyor. Port'tan data stabil olsun diye yapılan ikinci okumalarda harcanan zaman sizin çözümler için hesaba katılmayacak. Data transferinden sorumlu olan ana loop'un harcadığı zamandan sorumlusunuz. Geri kalan kısım zaten devede kulak kalacaktır. Transferi senkron yapamamamızın sebebi anlaşılmıştır umarım.

Hız farkını yaratacak olan datayı nasıl sunduğunuz ve nasıl işlediğiniz.

Aşağıdaki örnekte önce low nibble sonra high nibble olmak üzere 4'er bit transferi yapılıyor.

Kod:
; Buradan daha üstte $01 portunun ayarlanması, VIC display'inin 
; ve interrupt'ların kapatılması var. Teferruat kod olduğu için
; çözüme dahil etmek zorunda değilsiniz.

TAPEBUFFER = $033C
CARTPORT = $80FF
TEMPSTORE = $FE
; Load stub
LDX #$00

ASYNCTRANSFER
-
LDA CARTPORT
BMI -

LDA CARTPORT ; Port tam set edilmemişken erişme durumunu bertaraf etmek için bir daha okuyoruz.
STA TEMPSTORE
-
LDA CARTPORT
BPL -

-
LDA CARTPORT ; Port tam set edilmemişken erişme durumunu bertaraf etmek için bir daha okuyoruz.
BMI -

LDA CARTPORT
ASL
ORA TEMPSTORE
STA TAPEBUFFER, X
-
LDA CARTPORT
BPL -

INX
BNE ASYNCTRANSFER

; Jump to the stub
JMP TAPEBUFFER
« Son Düzenleme: Mayıs 11, 2017, 21:54:57 Ö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
Skate
Uzman
*****
Mesaj Sayısı: 1.479


A Sinner Scener


Üyelik Bilgileri WWW
« Yanıtla #7 : Mayıs 11, 2017, 22:25:27 ÖS »

Tek ASL ile nasıl 4 bit kaydırdın ben onu çözmeye çalışıyorum.
Logged
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #8 : Mayıs 11, 2017, 22:28:30 ÖS »

Tek ASL ile nasıl 4 bit kaydırdın ben onu çözmeye çalışıyorum.

Verinin mikro tarafından nasıl sunulduğu size kalmış 4 ASL yapmamak için 0XXXX000 şeklinde gönderiyorum high nibble'ı.
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 #9 : Mayıs 11, 2017, 22:32:14 ÖS »

Mikro tarafı yok. Biz var yalnızca software guru olmak.

Bana sorsan o zaman XXXX0000 olarak gönderirim, hiç ASL kullanmam. Ama olayın hardware tarafı canlanmıyor kafamda. Emülatörü yok bir şeyi yok. Teorik olarak yazacaksam iyice ıncık cıncık anlatacaksın detayları. Yoksa ben mal, ben anlamıor.
Logged
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #10 : Mayıs 11, 2017, 22:41:19 ÖS »

Kabul anlaşılması biraz zor, makul bir şey yazması da.

C64'e veri gönderen meret 1Mhz'den yüksek bir saat frekansında çalışıyor. Sallıyorum 4Mhz olsun, sen portu okuduğunda o değiştiriyor olabilir. Ancak bir kere değiştirdikten sonra senin okuman için sana süre tanıyor. Yani değiştiğini gördükten sonra yaptığın okumalar port'a gönderilmiş doğru değeri veriyor.

Benim kodumda kullandığım porttaki değer negatif olduğu sürece bekle, pozitiften negatife dönene kadar bekle kısmını şablon olarak kullanıp donanım kısmını düşünmeyebilirsin. Bu tamamen aradaki senkronu tutturmak için kurduğum bir yapı.

Ben misal 4'er bit transfer ettim. Sayının negatif olduğunu anlamak için 7. bit yeterli halbuki, 7şer bit transfer etseydim mesela? Yahut 6'şar bit? Herhangi bir gönderilen bit sayısı için gönderimin bit sırasını da değiştirmem mümkün. Gönderen tarafta bit dizilimini değiştirmenin maliyetinin  ihmal edilebilir olduğu kabul edilmeli.

Üstteki C64 kodu için kontrol eden mikrodaki kodum aşağıdaki şekilde

Kod:
void CartInterface::TransmitByteAsync(uint8_t value)  {
  /* Cart software waits for data while page is negative */
  SetPage(0x80);
 
  /* Delay a bit to keep the pace */
  myDelay();
 
  /* Send the lower nibble as [0000XXXX], a positive value */
  SetPage(value & 0x0F);
 
  /* Delay a bit to keep the pace */
  myDelay();
  /* Cart software waits for data while page is negative */
  SetPage(0x80);
 
  /* Delay a bit to keep the pace */
  myDelay();
 
  /* Send the upper nibble as [0XXXX000], a positive value] */ 
  SetPage((value & 0xF0)>>1);
  /* Delay a bit to keep the pace */
  myDelay();
}
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 #11 : Mayıs 11, 2017, 22:48:08 ÖS »

O zaman şöyle yapalım. Ben bu olayı adam gibi simüle edeyim. Elimde Arduino var. Arduino ile kendime simülatör yaratabilirim herhalde. Ne tavsiye edersin?
Logged
Skate
Uzman
*****
Mesaj Sayısı: 1.479


A Sinner Scener


Üyelik Bilgileri WWW
« Yanıtla #12 : Mayıs 11, 2017, 22:55:17 ÖS »

Ben çözümü buldum sanırım. Vice ile daha önce çok oynaşmışlığım var. Vice'a telnet üzerinden memory'e dışarıdan data yazdıran bir script ile simüle ederim bu olayı. Hardware'e bulaşmadan temiz çözerim.
Logged
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #13 : Mayıs 11, 2017, 22:59:49 ÖS »

@Skate : Elinde IRQHack64 hali hazırda varsa elinde tüm imkan var aslında. Sorunun kaynağı da biraz benim kartuş. ESP8266 ile ilk denemeleri yaptığımda NMI interrupt gönderip transfer yapma çalışmayınca böyle bir yöntemi denemek istedim.

Elinde Usb2Ttl kablo varsa VCC hariç kartuşa bağlayıp, diğer tarafta da Arduino IDE'sini kullanabilirsin.

Kartuş üstündeki yazılımın source'ları şurada : http://www.tepetaklak.com/data/IRQHack64TurboSrc.zip

Daha temelden gideyim dersen Arduino uno / pro mini gibi bir 5v destekleyen arduino yeter.

Userport'taki CIA'in B portuna dediğim tarzda gönderim yapabilirsin. Basit olsun diye sürekli 0'dan 255'e artan değerler gönderirsin sallıyorum.

IRQHack64 source'larında Eprom'un A15..A8 bacaklarını kontrol ettiğim yöntemi örnek alabilirsin, hatta aynı bağlantıyı yapabilirsin.

C64'de çalıştıracağın programı da alışık olduğun yöntemlerle yüklersin böylece.
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 #14 : Mayıs 11, 2017, 23:01:21 ÖS »

Vice'a dışarıdan memory injection sanırım en pratiği olacak. Ne dersin?
Logged
Sayfa: [1] 2 3 ... 5   Yukarı git
Yazdır
Gitmek istediğiniz yer: