18 Ekim 2014 Cumartesi

Tüm registerleri kaydetmek ve tekrar geri yüklemek

Çoğu zaman registerlerin tümünün kaydedilmesi ve tekrar geri çağrılması gereksinimi vardır. Basit bir program kodu ile nasıl yapıldığını kodlayalım. Program çalışma zamanında LMB(Left Mouse Button)'a basılana kadar bekler.

;lmb.asm
start:
        movem.l d0-d7/a0-a6,-(a7) ; tüm registerleri kaydet
dongu:
        btst #$06, $bfe001 ; $bfe001 adresinin 6. bitini LMB için kontrol et
        bne.s loop ; set ise dongu labeline git

        movem.l (a7)+,d0-d7/a0-a6 ; kaydedilmiş registerleri geri çağır
        rts


ASM-Pro'da editor kısmında programı kodladıktan sonra ESC ile çıkıyoruz. W Works:lmb.asm olarak harddiske kaydettim. Sonra ayrı ayrı a ve j komutlarını yazarak entere bastım. Program kodlamada hata yapmadıysanız hatasız çalışır ve LMB'na basmanızı bekler durumdadır. Programı dissamble etmek için @dstart komutu yazın. Ayrıca start labelinin adresini bulmak için ?start komutunu kullanabilirsiniz.

17 Ekim 2014 Cuma

Sistem Durum Flagları ve Dallanma Komutları


Asm-One 1.44 sürümünü kullanmayı uygun gördüm. Aminet'ten aratıp indirebilirsiniz.

flag.asm

;Karsilastirma sonrasi sistem durum flaglarinin durumu ve
;dallanmalarina iliskin ornekler

move.b #$18, d0

cmp.b #$28, d0
beq.b l0001

; d0 #$28 ile karsilastirilirsa 
; esit oldugundan
; z=1 n=0 c=0 flag
; beq ile l0001'e dallanir

bmi.b l0002

bpl.b l0003

; bcc.b l0002

; bcs.b l0003


rts

l0001:
move.b #$99, result
rts
l0002:
move.b #$9a, result
rts
l0003:
move.b #$9b, result
rts

result: dc.b $00


Yukarıdaki örnekten yola çıkarsak;

D0 data registerine değer vermek için

move.b #$28, D0

komutu kullanıldı. Değer ile oynayarak debuggerda ilgili flag değişimleri incelenebilir.

D0 data registerinin değeri #$28 değeri ile karşılaştırıldığındaki flagların durumlarına göre ilgili labele dallanmasını inceleyelim

Eğer D0 data registeri $28'e eşitse Z=1 olur. Z=1 ise BEQ ile başlayan dallanma komutunun gösterdiği labele gider

Eğer D0 data registeri $28'den küçük bir değer ise, N ve C flagları 1 olur. C=1 olduğundan BCS ile başlayan dallanma komutunun gösterdiği labele gider. N=1 olduğundan BMI ile karşılaşsaydı bu komuta ait labele gidecekti.

Eğer D0 data registeri $28'den büyük bir değer ise hiçbir flag set olmaz. BPL veya BCC komutu ile başlayan labele dallanma olur.



68K Assembler Giriş

Bir 68000 işlemci kalmıştı öğrenmedik. Sırf meraktan dolayı daldım içeri çıkabilir miyim dışarı bilmiyorum. 68K için assembler öğretmeye değil kendimce aldığım notları blog sitesine yazmaya karar verdim. Hem derli toplu dursun hem de belki birileri faydalanır mantığı ile. Hadi hayırlısı başladık bir işe; devamı gelir inşallah!