#include	<ADUC841.H>
	org		0000h
	ljmp	basla
;----------------------------------------------------
; ornek 0
;----------------------------------------------------
; Alt program mantigi
; Basit bir olay: a=1'den 3 kadar artarken,  her artimdan sonra
; p0.1'ini 2 kez yakip sondurelim.
	;basla:
		;mov		a,#00d
		;inc		a
		;setb	p0.1
		;nop     ; bir makina cevrimlik kod. bir gorevi yok. sadece 1 makina cevrimlik bekleme gibi calisir.
		;clr		p0.1
		;nop
		;setb	p0.1
		;nop
		;clr		p0.1
		;nop
		
		;inc		a
		;setb	p0.1
		;nop
		;clr		p0.1
		;nop
		;setb	p0.1
		;nop
		;clr		p0.1
		;nop
		
		;inc		a
		;setb	p0.1
		;nop     ; bir makina cevrimlik kod. bir gorevi yok. sadece 1 makina cevrimlik bekleme gibi calisir.
		;clr		p0.1
		;nop
		;setb	p0.1
		;nop
		;clr		p0.1
		;nop
		;AJMP	BASLA
		;end
; ornekten anlasilacagi uzere benzer bazi satirlari 3 kez tekrar etmek zorunda kaldik
; bu nedenle programimizda bir cok kez tekrarlayan yada kafa karistirici bazi kod bolgelerini 
; alt program yapmak mantikli ve anlasilir olur.
; alt program sekli asagida verilmistir.

	;basla:
		;mov		a,#00d
		;inc		a
		;acall	yaksonaltprg
		;inc		a
		;acall	yaksonaltprg
		;inc		a
		;acall	yaksonaltprg
		;sjmp	basla
	;yaksonaltprg:
		;setb	p0.1
		;nop     ; bir makina cevrimlik kod. bir gorevi yok. sadece 1 makina cevrimlik bekleme gibi calisir.
		;clr		p0.1
		;nop
		;setb	p0.1
		;nop
		;clr		p0.1
		;nop
		;ret
		
		;end
; yukaridaki kod bir ustekine nazaran hem daha kisa hem de daha anlasilir...
;----------------------------------------------------

;----------------------------------------------------
; ornek 1
;----------------------------------------------------
; bu örnekte yakilmak istenilen ledler a'ya yukleniyor.
; alt programda ledler yakiliyor..
;basla:
	;nop
	;nop
	;//kodlar
	;nop
	;mov		a,#01h
	;acall	led_yak     ; 08h:pc_low ve 09h:pc_high
	;mov		a,#04h
	;acall	led_yak
	;mov		a,#0ffh
	;acall	led_yak
	;sjmp	basla     
;; burada sjmp basla olmazsa ne olur bunu da inceleyelim

;; yakilmak istenilen ledler a ya yuklenip buraya geleek
;; parametrik fonksiyon
;led_yak:
	;nop
	;mov		p0,a
	;ret
;end

;----------------------------------------------------
; ornek 2
;----------------------------------------------------
; bu örnekte yakilmak istenilen ledler a'ya yukleniyor.
; alt programda ledler yakiliyor..
; ornek 1'de yapilan islemlerin aynisi
; fark uygulamanin lcall kullanilarak olusuturulmasi
; program belleg ve suresindeki degisikler incelenmeli

;basla:
	;nop
	;nop
	;//kodlar
	;nop
	;nop
	;nop
	;nop
	;nop
	;mov		a,#01h
	;lcall	led_yak     ; 08h:pc_low ve 09h:pc_high
	;mov		a,#04h
	;lcall	led_yak
	;mov		a,#0ffh
	;lcall	led_yak
	;sjmp	basla     
;;; burada sjmp basla olmazsa ne olur bunu da inceleyelim

;;; yakilmak istenilen ledler a ya yuklenip buraya geleek
;;; parametrik fonksiyon
;led_yak:
	;nop
	;mov		p0,a
	;ret
;end
	
;----------------------------------------------------
; ornek 3
;----------------------------------------------------
;ornek 1 de bir degisiklik yapalim
;basla:
	;nop
	;nop
	;//kodlar
	;nop
	;mov		a,#01h
	;acall	led_yak   
	;mov		a,#04h
	;acall	led_yak
	;mov		a,#0ffh
	;acall	led_yak
	;sjmp	basla     
;; burada sjmp basla olmazsa ne olur bunu da inceleyelim

;; yakilmak istenilen ledler a ya yuklenip buraya geleek
;; parametrik fonksiyon
;led_yak:
	;nop
	;mov		p0,a
	;mov		08h,#0ah ; sp gosterdigi adresleri degistirdim: hata
	;;mov		08h,#2ah ; sp gosterdigi adresleri degistirdim: hata

	;ret
;end


;----------------------------------------------------
; ornek 4
;----------------------------------------------------
;ornek 3 deki gibi bir degisiklikte
;asagida duzenleme yapilirsa programin sorunsuz calismasi saglanir
;basla:
	;nop
	;nop
	;//kodlar
	;nop
	;;mov 	sp,#7Ah	;eklenen satir, sp'nin RAM'in 7Ah adresinden itibaren 
					;;donulecek adresin kaydedilecegi yeri isaret etmesi saglandi
	;mov		a,#01h
	;acall	led_yak   
	;mov		a,#04h
	;acall	led_yak
	;mov		a,#0ffh
	;acall	led_yak
	;sjmp	basla     
 ;;;burada sjmp basla olmazsa ne olur bunu da inceleyelim

 ;;;yakilmak istenilen ledler a ya yuklenip buraya geleek
 ;;;parametrik fonksiyon
;led_yak:
	;nop
	;mov		p0,a
	;mov		08h,#0ah ; sp gosterdigi adresleri degistirdim: hata
	;;mov		08h,#2ah ; sp gosterdigi adresleri degistirdim: hata

	;ret
;end



;----------------------------------------------------
; ornek 5
;----------------------------------------------------
;; alt program icinde alt program cagiran kod sp ve ilgili ram adreslerini incele.
;basla:
	;nop
	;nop
	;// degiskik kodlar burada olabilir
	;nop
	;mov		a,#01h
	;acall	led_yak
	;mov		a,#04h
	;acall	led_yak
	;mov		a,#0ffh
	;acall	led_yak
	;sjmp	basla  	

;led_yak:
	;nop
	;mov		p0,a
	;acall	ikicarp_yak
	;nop
	;nop
	;ret

;ikicarp_yak:
	;nop
	;mov		b,#02h
	;mul		ab
	;mov		p1,a
	;ret
;end

;----------------------------------------------------
; ornek 6
;----------------------------------------------------
;ornek 1 de bir ram sifirlama alt programi olusturalim
; ve bunu da uygun olmayan bir yere koyalim
; sp durumunu inceleyelim
;basla:
	;nop
	;nop
	;// degiskik kodlar burada olabilir
	;acall	ramsifirla
	;nop
	;mov		a,#01h
	;acall	led_yak
	;mov		a,#04h
	;acall	led_yak
	;mov		a,#0ffh
	;acall	led_yak
	;sjmp	basla  	

;;alt programlar
;led_yak:
	;nop
	;mov		p0,a
	;acall	ramsifirla   ; burada kullanilirsa sonuca bakalim
	;ret
	
;ramsifirla:
	;mov		r0,#7fh
	;x: 
	;mov		@r0,#00h
	;djnz	r0,x
	;ret
;end

;----------------------------------------------------
; ornek 7
;----------------------------------------------------
; push ve pop
; hizlica veri saklamak icin push kullanilir
; sp ile islem yapildigindan kullanimina dikkkat etmek gerekir
; hizlica geri kaydedilen veriyi almak icin pop kullanilir.
; last in first out kurali gecerlidir

; port durumlarini hizlica saklayalim ve baska adrelere geri alalim

;basla:
	;nop
	;push	p0  ; sp++ olur ve p0=@sp
	;push 	p1  ; sp++ olur ve p0=@sp
	;push	p2  ; sp++ olur ve p0=@sp
	;push	p3  ; sp++ olur ve p0=@sp
	;pop		03h ; 03h=@sp olur ve sp--
	;pop		02h ; 02h=@sp olur ve sp--
	;pop		01h ; 01h=@sp olur ve sp--
	;pop		00h ; 00h=@sp olur ve sp--
	;nop
	;sjmp	basla
;end

;----------------------------------------------------
; ornek 8
;----------------------------------------------------
;ornek 5 te uygun olmayan bir degisiklik yapalim

basla:
	nop
	push	p0  ; sp++ olur ve p0=@sp
	push 	p1  ; sp++ olur ve p0=@sp
	acall	led_yak
	pop		03h ; 03h=@sp olur ve sp--
	pop		02h ; 02h=@sp olur ve sp--
	pop		01h ; 01h=@sp olur ve sp--
	pop		00h ; 00h=@sp olur ve sp--
	nop
	sjmp	basla
;alt programlar
led_yak:
	nop
	mov		p1,#0ffh
	push	p2  ; sp++ olur ve p0=@sp
	;push	p3  ; sp++ olur ve p0=@sp
	;yukaridaki iki satir kaldirilarak uygun olmayan durum ortadan kaldirilir

	ret     ; donus adresi degisti
	
end
	
