Gönderen Konu: ipucLarI  (Okunma sayısı 22319 defa)

ipucLarI

« : 14.02.2007 14:42:30 »
Hızlı düğmeleri aç

stranger

İleti: 241

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
Kucuk ama yararLI ipuclarini bir konu altinda toplasak nasIL olur? ArtIK yava$ yava$ bir haltlar karI$tIrmaya ba$LayInca detayLarada onem kazanIyor :)
 
Ornegin:
Autorun 'in mantigi nedir? $0801 vs. den ba$layan prg lar icin standart yaziyor geciyoruz fakat ornegin $1000 yada baska bir adresten ba$latmak istersek bunu nasIL hesapLayIp koyuyoruz?
 
AyrIca Hades ve NightLord'un daha once verdigi 2 ipucunuda bu konunun altina ekliyorum...
-----------------------------------------------------------
(NightLord)
EOR icin kucuk bir ipucu
A EOR B = C
ise
A EOR C = B
yani B yi (ortadakini) bulmak icin usttekini ve alttakini direk eor islemine de sokabiliriz
------------------------------------------------------------
(Hades)
Bu arada küçük bir bilgi vereyim. JSR $E544 rutininden geri dönüşte X registerinde 1 değeri bulunur. senin örneğine uyarlarsak
JSR $E544
STX $D021
haline gelir ve 2 byte tasarruf etmiş oluruz.
« Son Düzenleme: 14.02.2007 15:00:13 Gönderen: stranger »

ipucLarI

« Yanıtla #1 : 14.02.2007 16:38:25 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
Autorun her zaman $0801'den olur. Bu basic'in varsayılan başlangıç adresidir. Elbette ki $0801 değiştirilebilir, istenirse basic başlangıç adresi $1000 gibi adreslere alınabilir ancak bilgisayar açıldığı gibi bir program yükletilip çalıştırılıyorsa, bu her zaman $0801'den olur. $0801 öncesi bazı yükleme adresleri kullanılarak istisnai trickler yapılabiliyor ancak bunun şu an için bir önemi yok.
 
Olay şu ki yüklenen bir program çalıştırılırken "run" yazmak yerine "sys X" şeklinde çalıştırıldığında yükleme adresinin hiçbir önemi kalmıyor. Ancak X sabit olmadığı için kolaylık olarak biz basic'den
 
0 sys X
 
gibi bir basic satırı yazıyor ve programı böyle kaydediyoruz. Sonuç olarak da program "run" denildiğinde o sys satırı sayesinde doğrudan çalışıyor.
 
şimdi vice açalım ve
 
0 sys2061
 
yazıp enter'a basalım ve monitöre girip
 
m 0801
 
yazalım. sonuç şu şekilde olacaktır.
 
Kod: [Seç]
>C:0801  0b 08 00 00  9e 32 30 36  31 00 00 00   .....2061...
Burdaki "0b 08" basic satırının bitiş adresi, devamındaki "00 00" 16 bitlik satır numarasıdır (burada 0 kullandık). Ardından gelen "9e" sys komutu devamındaki "32 30 36 31" ise 2061'in rakamlarının ekran kodlarıdır. Basic'in bitiminde 3 adet sıfır olması gerekmektedir. Bu durumda
 
0b 08 00 00 9e 32 30 36 31 00 00 00 = 0 sys 2061 oluyor.
 
Autostart olayı bundan ibaret. ASM kodlarının içine basic gömmek kolay olmadığı için biz de byteları ekliyoruz kodun başına. Hades'in yaptığı gibi "32 30 36 31" olduğu alana !text "2061" de yazabilirsiniz. Bu da pratik bir kullanım.
 
şimdi gelelim asıl ipucuna. Sonda 3 adet 0 byteı olmak zorunda dedik ya. Aslında 3 bytedan yalnızca ilk ve son byte 0 olmak zorunda, ortadaki byte değişebiliyor. Bu durumda ordataki byte'a örneğin $a9 değeri verir ve sys'yi de iki byte geriye yönlendirirsek kodun ilk satırını lda #$00 şeklinde kullanmış oluruz. Benzer şekilde $a0 ve $a2 ile ldx#$00 ve ldy#$00 şeklinde kullanmamız mümkün.
 
0b 08 00 00 9e 32 30 35 39 00 a9 00 = 0 sys 2059
 
Bu kod bold olan byte'a jmplar ki o da 2061'e geldiğimizde accumulator'ü sıfırlamış olur.
« Son Düzenleme: 14.02.2007 16:45:50 Gönderen: skate »

ipucLarI

« Yanıtla #2 : 14.02.2007 16:49:31 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
şu basic'deki ilk iki byte'ı düzgün anlatabilmek için birkaç kere editlemem gerekti. En son ayrı bir açıklayıcı post atiim dedim :)
 
$0801 ve $0802'de yer alan ilk iki byte her satırın başında mevcut ve bir sonraki satırın başlangıç adresini gösteriyor. Eğer bu adreslerde sıfırları görürse basic satırlarının sona erdiğini algılıyor.

ipucLarI

« Yanıtla #3 : 14.02.2007 18:16:24 »
Hızlı düğmeleri aç

stranger

İleti: 241

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
Ben autostart derken yanLI$ telafuz etmi$im oLayI. $1000 den ba$Layan asm code'u run ile caLI$tIrma diyecektim ornek oLarak. Ama yine o kadar acIKca anLatmI$sIn ki bu konu hakkIndaki tum merak ettiklerimi ogrendim.
:) Hemen uygulamayI da a$agIda gorelim... Te$ekkurler .....
 
!to"startdeneme.prg",cbm
*=$0801
!byte $0b,$08,$00,$00,$9e,$34,$30,$39,$36,$00,$00,$00
*=$1000
jsr$e544
ldx#$01
stx$0400
rts
« Son Düzenleme: 14.02.2007 18:50:41 Gönderen: stranger »

ipucLarI

« Yanıtla #4 : 14.02.2007 18:41:23 »
Hızlı düğmeleri aç

GnoStiC


  • Ziyaretçi
ama burda 0801'de;

00 01 00 olmuyo.. (eger 01 in bir instruction karsiligi yok ise tabi)
oraya bir instruction koyup yanindaki 00 degerini yukletmis oluyorsun. ornegin skate'in verdigi ornekteki gibi
00 a9 00  = lda 00

(en azindan ben oyle anladim)

Alıntı yapılan: stranger
Hatta: :)
 
!to"startdeneme.prg",cbm
*=$0801
!byte $0b,$08,$00,$00,$9e,$34,$30,$39,$36,$00,$01,$00
*=$1000
jsr$e544
;-----ldx#$01
stx$0400
rts

ipucLarI

« Yanıtla #5 : 14.02.2007 18:46:53 »
Hızlı düğmeleri aç

stranger

İleti: 241

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
Evet hakLIsIn. AtLamI$Im 2. bolumu sildim. Bu arada caktIrmadan bir c64 coding e yonelme durumun var mI karde$im? :)
« Son Düzenleme: 14.02.2007 18:51:21 Gönderen: stranger »

ipucLarI

« Yanıtla #6 : 14.02.2007 19:28:44 »
Hızlı düğmeleri aç

spaztica

İleti: 1.493

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
ben de skate'in kaldığı yerden ufak bi teknik vereyim...

EOR demişti... EOR'un kullanım alanlarından biri de delta-bitplane -yani 2 bitplane arasında fark dosyası- yaratmakta kullanabilirsiniz. şöyle ki, 2 bitplane birbirine çok yakınsa bunları EOR'ladığınızda bu iki bitplane arasındaki fark eden bitlerin 1 olduğu bol 0'lı ek bir bitplane elde edersiniz. bol 0'lı bir bitplane, hafızada çok daha az yer tutar. ilk frame'i olduğu gibi kaydettikten sonra, her eklenen frame'i bir öncekine göre delta'sını hafızada çıkartıp bunları geri oluşturabilirsiniz.

bu teknik, amiga'da bol frame'li pre-rendered grafikleri göstermek için kullanılmıştı bazı demolarda...

tabii pc'lerde imaj olayı bitplane değil, renk datası şeklinde olduğu için bunun kullanımı pratik olmayabilir. amiga'da (normalde max 5) her bitplane'in kombinasyonu, renk kodlarını oluştururdu...
« Son Düzenleme: 14.02.2007 19:35:21 Gönderen: spaztica »

ipucLarI

« Yanıtla #7 : 15.02.2007 00:12:22 »
Hızlı düğmeleri aç

GnoStiC


  • Ziyaretçi
olur oyle bazen :)
c64 coding olayim yok, sadece yazilanlari okumayi seviyom ;)

bu arada bu gidisle izmirde degilde istanbulda buluscaz seninle :D

Alıntı yapılan: stranger
Evet hakLIsIn. AtLamI$Im 2. bolumu sildim. Bu arada caktIrmadan bir c64 coding e yonelme durumun var mI karde$im? :)

ipucLarI

« Yanıtla #8 : 15.02.2007 09:35:41 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
Alıntı yapılan: spaztica
ben de skate'in kaldığı yerden ufak bi teknik vereyim...

EOR demişti... EOR'un kullanım alanlarından biri de delta-bitplane -yani 2 bitplane arasında fark dosyası- yaratmakta kullanabilirsiniz. şöyle ki, 2 bitplane birbirine çok yakınsa bunları EOR'ladığınızda bu iki bitplane arasındaki fark eden bitlerin 1 olduğu bol 0'lı ek bir bitplane elde edersiniz. bol 0'lı bir bitplane, hafızada çok daha az yer tutar. ilk frame'i olduğu gibi kaydettikten sonra, her eklenen frame'i bir öncekine göre delta'sını hafızada çıkartıp bunları geri oluşturabilirsiniz.

bu teknik, amiga'da bol frame'li pre-rendered grafikleri göstermek için kullanılmıştı bazı demolarda...

tabii pc'lerde imaj olayı bitplane değil, renk datası şeklinde olduğu için bunun kullanımı pratik olmayabilir. amiga'da (normalde max 5) her bitplane'in kombinasyonu, renk kodlarını oluştururdu...
Vaays, güzel teknikmiş. Commodore 64'de pek bu tür şeyler kullanılmadığı için (belki de kullanılıyordu da ben bilmiyordum) ve PC'de de genellikle bu kadar low level takılınmadığı için (?fersah fersah memory error) bu tekniği duymamıştım bile. Amiga kesinlikle atlanmaması gereken bir aletmiş. Neyse ki sonunda giriyorum ucundan bucağından Amiga codinge. Spaztica, Gnostic, Vigo, Endo ve diğer Amiga coderlarının hepsini arkamda hissediyorum bu konuda. Çok gay bir his gerçi :p
 
P.S: Herhangi bir commodore demosunda precalc frame sıkıştırma için spaztica'nın bahsettiği tekniği kullanmış demo biliyor musunuz?

ipucLarI

« Yanıtla #9 : 15.02.2007 14:00:36 »
Hızlı düğmeleri aç

vigo


  • Ziyaretçi
evet... delta-compression.... trsi - animatron (#3 @ bp06)

ipucLarI

« Yanıtla #10 : 15.02.2007 14:10:08 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
hmmm. emin misin aynı şey olduğundan vigo kardeş? çünkü animatron gayet multicolor ve 64'de bitplaneler de yok. tek tek tüm renk kanallarını orlamaya falan da zaman yetmez gibi geliyor bana. sanki animatronda biraz daha mpegvari bir sıkıştırma kullanılmış gibi geldi bana.

ipucLarI

« Yanıtla #11 : 15.02.2007 16:52:36 »
Hızlı düğmeleri aç

vigo


  • Ziyaretçi
:) eminim... benson/trsi yazdı delta-com algortimasını... hatta streettuff a da sorabilirsin... neticede bende onlardan duyduumu sölüyorum... code'u inceleyerek sölemiş diilim...

ipucLarI

« Yanıtla #12 : 15.02.2007 17:37:38 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
tamam delta compression olabilir de acaba eor mu kullanıyor deltayı bulmak için? bir ara rastlaşırsam nette sorarım amcamlara :)

ipucLarI

« Yanıtla #13 : 20.02.2007 20:55:17 »
Hızlı düğmeleri aç

stranger

İleti: 241

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
irq olu$tururken
 
jmp$ea81 'den baska, basic'le de oyna$mak icin $ea31 kuLLanIyoruz.
 
Bunlarin yaninda skate'de $ea7e kuLLanmakta. Hangisini kuLLanmamIz caizdir?  :)
« Son Düzenleme: 20.02.2007 21:07:04 Gönderen: stranger »

ipucLarI

« Yanıtla #14 : 20.02.2007 22:57:25 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
hepsi de caizdir. $ea7e'nin $ea81'den tek farkı fazladan bir "lda $dc0d" komutu çalıştırmasıdır. CIA timerına acknowledge atmak gibi fazladan bir işlem yapıyorsun. Zamanlamaların daha iyi olduğunu gözlemlediğim için $ea7e kullanıyorum, yoksa teknik detayına çok girmedim.
 
$ea7e ve $ea81 bundan ibaret
 
$ea7e
lda $dc0d
$ea81
PLA
TAY
PLA
TAX
PLA
RTI
 
aslında hiç JMP kullanmadan doğrudan
 
PLA
TAY
PLA
TAX
PLA
RTI
 
yazarsanız jmp $ea81 demiş olursunuz. bunun başına bir de LDA $dc0d eklerseniz jmp $ea7e demiş olursunuz. ıkisi de hemen hemen aynı kapıya çıkıyor.