commodore.gen.tr

Commodore => Commodore Yazılım => Konuyu başlatan: ilkerficicilar üzerinde Temmuz 28, 2014, 20:22:33 ÖS



Konu Başlığı: Pratik C64 ROM Rutinleri
Gönderen: ilkerficicilar üzerinde 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


Konu Başlığı: Ynt: Pratik C64 ROM Rutinleri
Gönderen: witchdoktor üzerinde 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.


Konu Başlığı: Ynt: Pratik C64 ROM Rutinleri
Gönderen: ilkerficicilar üzerinde 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).


Konu Başlığı: Ynt: Pratik C64 ROM Rutinleri
Gönderen: witchdoktor üzerinde 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 (http://en.wikipedia.org/wiki/Commodore_BASIC)