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)
Sayfa: [1]   Aşağı git
Yazdır
Gönderen Konu: Pratik C64 ROM Rutinleri  (Okunma Sayısı 3898 defa)
0 Üye ve 1 Ziyaretçi konuyu incelemekte.
ilkerficicilar
Uzman
*****
Mesaj Sayısı: 1.122


Üyelik Bilgileri WWW
« : Temmuz 28, 2014, 20:22:33 ÖS »

Commodore 64 BASIC ve KERNAL yordamlarından sık kullanılanlar ve kullanımları.

Bunlar, özellikle GOS'un komutlarında da kullanılmış olduğundan GOS komutlarını anlamada pratik bir referans niteliğinde.

Kendi makine dili fonksiyonlarımızda da kullanırken yararlı oluyorlar. Örneğin 16384 adresine bir kod yerleştirdik ve bu kod parametre olarak iki sayı istiyor diyelim. Aşağıdaki referanslara bakarak, kodumuzun başında virgül, sayı, virgül, sayı al rutinlerini çağırdığımızda sys16384,s1,s2 diyerek bu makine dili kodumuza parametre aktarabiliyoruz.

İşte bu pratik kullanıma sahip rutinlerden bir demet şu şekilde:


AEFD: Virgül al.

B79E: 8 bitlik tamsayı al, X'e koy.

B08B: ($7A)'nın gösterdiği değişkeni yaratıp, içinin başlangıç adresini AY'ye koyar.

AD8A: Tip denetimi yapıp, ASCII'yi FAC'a koyar (sayısal tip).

B7F1: AEFD + B79E

B7F7: ASCII sayıyı alıp $14, $15'e koyar.

B1AA: ASCII sayıyı alıp Y,A'ya koyar.

B7EB: B7F7+AEFD+B79E

BBD4: FAC -> (XY)

BC3C: A -> FAC

AD9E: Dizi ya da sayı al.

AD8F: Tip denetimi yap (yazısal tip).

B6A6: Yazısal tip verilerin yerini X,Y ile, uzunluğunu A ile bildirir.

B37D: Free (Garbage collection).

E1D4: Dosya ve disk adı al ve bunları $00B7...'ye koy.

0073: CHRGET: BASIC'te sıradaki byte'ı okur.

0079: CHRGOT: BASIC'te en son okunan byte'ı getirir.

BDCD: INTOUT: X,A'daki işaretsiz tamsayıyı ekrana basar.

BC3C: INTFLOAT1S: A'daki işaretli bir byte sayıyı kesirli olarak FAC'a koyar. (işaretsiz bir sayı EOR#$FF CLC ADC#$01 ile işaretli biçime getirilir. Böyle bir sayı -128 ila +127 arasındadır. $80=-128, $FF=-1, $7F=127'dir).

B3A2: INTFLOAT1: Y'deki işaretsiz bir byte sayıyı kesirli olarak FAC'a koyar.

B395: INTFLOAT2S: Y,A'daki işaretli iki byte sayıyı kesirli biçimde FAC'a koyar (7FFF=+32767,$FFFF=-1, $8000=-32768)

BCF3: ASCFLOAT: $7A,$7B'nin işaret ettiği yerdeki ASCII bir sayıyı FAC'a koyar. Kullanırken önce CHRGOT çağrılır.

BC1B: ROUND: FAC'deki bir sayıyı yuvarlayıp gene FAC'e saklar.

BDDD: FLOATASC: FAC'deki bir sayıyı $0100 ve devaına ASCII olarak yazar ve sonuna $00 ekler.

AB1E: STROUT: A,Y'de yeri belirtilen adresten başlayıp $00 ile biten ve 256 harften küçük yazılar ekrana basar.

FAC: $61-$65 ARG: $69-$6D

FAC ARG Anlamı
----- ----- ---------
$61  $69  Üs
$62  $6A  Mantisa1
$63  $6B  Mantisa2
$64  $6C  Mantisa3
$65  $6D  Mantisa4
$66  $6E  İşaret
$70          Yuvarlama
$6F          İşaret karşılaştırma


Örnek: String okuma:

JSR$AEFD
JSR$AD9E
JSR$BBA3
sonuç: X,Y= yeri, A=uzunluğu

Keywords: Commodore 64, Yazılım, ROM
Logged

http://cbm.ficicilar.name.tr/ - Commodore Hacking
witchdoktor
Uzman
*****
Mesaj Sayısı: 6.238



Üyelik Bilgileri
« Yanıtla #1 : Temmuz 29, 2014, 19:08:13 ÖS »

Güzel bir paylaşım. C64 ve Commodore 8-bit ROM arkeolojisini seviyorum. Muhtemelen hiç kullanmayacak olsam bile okuması keyif veriyor.

Bu tarz (GOS ve LUnix altyapısı, programlamada karşılaşılan güçlükler, kazanılan deneyimler vb ile ilgili) paylaşımları da merakla bekliyoruz.
Logged
ilkerficicilar
Uzman
*****
Mesaj Sayısı: 1.122


Üyelik Bilgileri WWW
« Yanıtla #2 : Temmuz 29, 2014, 22:23:52 ÖS »

Rica ederim. Dijital arkeoloji oldu bu uğraş, evet. Ama zevkli... Bu arada dokümantasyonun bir kısmını buldum, ama ciddi bir miktarı eksik. Bulduklarımsa kodların kağıt üstü ilk halleri (önce kağıt, kitap kenarı, beyaz masa üzerine yazardım da ders sırasında kodları; en büyük güçlük hocanın yüksek sesli konuşması, masanın bitmesi ve kolumun yazıları silmesi olurdu).
Logged

http://cbm.ficicilar.name.tr/ - Commodore Hacking
witchdoktor
Uzman
*****
Mesaj Sayısı: 6.238



Üyelik Bilgileri
« Yanıtla #3 : Temmuz 29, 2014, 23:26:37 ÖS »

Yukarıdaki bellek yerleşimlerinde kayan nokta depolama formatı (1 byte üs, 4 byte mantis, 1 byte işaret) bazılarımızın dikkatini çekmiş olabilir. Commodore BASIC'de kayan nokta değişkenlerin mantis kısmının 4-byte'tan oluşması dönemdaşı birçok BASIC uyarlamasına göre (3 byte mantis) ciddi bir hesaplama hassasiyeti sağlıyor.

Bu arada ilginç bir bilgi aktarayım. Commodore BASIC'de matematiksel işlemler kayan nokta (floating point) türü üzerinden gerçekleştiriliyor. Bu nedenle değişkenleri (tam sayı-integer yerine) doğrudan bu formatta kullandığınızda BASIC programlarınız hızlanıyor (hatta A=0 yerine A=. kullanmak gibi).

Wikipedia'dan alıntılarsak;

"The native number format of Commodore BASIC, like that of its parent MS BASIC, was floating point. Most of the contemporary BASIC implementations used one byte for the characteristic (exponent) and three bytes for the mantissa. This led to problems in business applications since the accuracy of a floating point number using a three-byte mantissa is only about 6.5 decimal digits, and round-off error is common. Commodore, however, used MS BASIC's four-byte mantissa, which made their BASIC much more adapted for business than most other BASICs of the era."

http://en.wikipedia.org/wiki/Commodore_BASIC
Logged
Sayfa: [1]   Yukarı git
Yazdır
Gitmek istediğiniz yer: