tr-demoscene
the scene => coding => c64 => Konuyu başlatan: skate - 31.12.2007 16:05:29
-
Commodore 64 Assembler'ında kodun başlangıç adresi değiştiği zaman basic kodunun da buna göre değişmesi gerekir. Bu yüzden başlangıç adresi değiştiğinde kodda en az iki yeri değiştirmek gerekir. Bu problemi halleden ufak bir örnek yaptım. Büyük birşey değil. Belki birilerinin işine yarar.
BASIC_START = $0801
CODE_START = $080d
!to "dummy.prg",cbm
* = BASIC_START
!byte 12,8,0,0,158
!if CODE_START >= 10000 {!byte 48+((CODE_START/10000)%10)}
!if CODE_START >= 1000 {!byte 48+((CODE_START/1000)%10)}
!if CODE_START >= 100 {!byte 48+((CODE_START/100)%10)}
!if CODE_START >= 10 {!byte 48+((CODE_START/10)%10)}
!byte 48+(CODE_START % 10),0,0,0
* = CODE_START
[COLOR=blue] lda $d012
lsr
lsr
sta $d020
sta $d021
jmp CODE_START[/COLOR]
CODE_START sabitini değiştirdiğinizde hem basic autorun kodu buna göre üretilecek, hem de kod hafızada o adrese yerleşecektir.
Not: Mavi renk ile işaretlenmiş bölge örnek bir kod parçasıdır. Siz kendi kodunuzu bu bölümü silerek yazabilir ya da kendinize template oluşturabilirsiniz.
-
cok acayipmi$ demek sys'in parametresi word olarak degil hafizada ascii duruyor ha? c64 basic zaten genel olarak primitif bi$eydi ama bu acidan da baya verimsizmi$.
gerci biraz da bu sayede herkes assembly ogrenip co$tu galiba :)
ssg
-
ayrica herkese super 2008'ler dilerim :)
-
Nayıııır yeni yılın ilk mesajını atma şansını kaçırdım!!!!!
Nice senelere!!111one :P
-
bende hala 2007 ragnor merak etme :)
-
evet ssg, basic'de sys gibi komutların parametreleri string olarak duruyor. ancak bunun sebebi oldukça basit. basic'de satır numarası kullanılarak bir satır kod yazılıp enterlandığı zaman herhangi bir error check olmuyor. yalnızca ufak bir string search ile tanınan basic keywordleri işaretleniyor o kadar. mesela "?" yazdıysan onu o anda "print" olarak algılayıp $99 byte'ı konuluyor hafızaya. ama print'den sonra gelen parametrede bir hata varsa bununla ilgili birşey yapılmıyor. sys'de de bu aynı şekilde işliyor elbette ki. daha sonra program run edildiği zaman parametreler gerekli convertion filtrelerinden geçiriliyorlar. bu sırada bir problem görüldüğü taktirde program hata veriyor.
örnek olarak "0 sys 70000" yazıp enterladığımızda bir hata almayız ve "70000" string olarak hafızada durur. ne zamanki "run" deriz, bu durumda 70000'in maksimum 16 bit olması gereken parametre için uygun bir değer olmadığı ortaya çıkar ve;
?ILLEGAL QUANTITY ERROR IN 0
hatasını alırız. aslında düşününce o kadar da mantıksız değil. yanlış hatırlamıyorsam Atari 800XL'in basic'inde bu böyle değildi. başında satır numarası olsa da, bir kod parçası yazılıp enter'a basıldığında bu tür hatalar anında denetleniyordu ve run edildiğinde bu tür hatalar verebilecek kodların yazılmasına baştan izin verilmiyordu. tabii basic kodlarının hafızada daha az yer kaplaması açısından bu oldukça mantıklı bir yöntem. commodore basic'i bu yüzden eleştirilebilir.
-
locomotive basic'te (cpc'lerin basic'i) bu konu "parse edemedigini string olarak tut, aksi halde native halinde tut" $eklindeydi yanli$ hatirlamiyorsam. "parse ettim/edemedim"i tokenize etmek zor olmasa gerek. bunlari hep string tutmak interpreter hizini da baya du$uruyordur, programlarin cok yer kaplamasi bir yana. her integer icin 4 tane carpma 5 tane toplama i$lemi cok pahali.
ama dedigim gibi bu verimsizlikler hep hayirlara vesile olmu$. cpc'nin basic'i o kadar iyiydi ki demo kasetinde gelen yazilimlarin cogu basic tabanliydi. o yuzden dergiler assembly uzerinde pek durmazdi, poke'la peek'le z80 assembly ogrenmeye cali$tik :)
ssg