#include	<ADUC841.H>
	;org		0000h
	sjmp	basla
;basla:
;//****************************************
;//***** Veri Isleme Komutlari***** 

;//***** Lojik Komutlar***** 
	;mov 	a, #76h 	; (A) <- 01110110b
	;mov 	40h, #45h 	; (40h)<-01000101b
	;anl 	40h, a		; (40h)<-01000100b (01110110b and 
	                                       ;;01000101b)
											
	;orl 	40h, a		; (40h)<-01110111b (01110110b orl 
	                                       ;;01000101b)
											
	;xrl 	40h, a		; (40h)<-00110011b

	;mov		r0,#02h         ;  r0 <- 02h
	;mov		02h,#11110000b  ; (02h) <- 11110000b
	;mov		a,#11001100b    ;  (A) <- 11001100b

	;anl		a,@r0           ;         (11001100b and
;;									   11110000b )
							   ;;(A) <- 11000000b
	;orl  a,@r0
    ;xrl  a,@r0
   ;// orl  @r0,a siz deneyin ??	
 
;//***** Lojik komutlarin PSW rs0 ve rs1 bitleri icin uygulamasi
;//PSW deki diger bitlerin degeri degistirilmeden RS0 = 0, RS1 = 0 yapiniz
	;setb	rs0
	;setb	rs1
	;anl 	PSW, #11100111b
;//PSW deki diger bitlerin degeri degistirilmeden RS0 = 1, RS1 = 1 yapiniz.
	;orl 	PSW, #00011000b 
	
;//** temizleme komutu **********
	;mov		a,#0FFh
	;clr		a		//komutu, ACC' nin bütün bit'lerini temizler
	;clr		00h		//komutun islevini inceleyin
	;mov 	20h,#0FFh
	;clr		00h
	
	;clr		c       //carry biti temizlenir yada
	;clr		PSW.7   // carry biti temizlenir
	;clr		rs0     // rs0 biti temizlenir yada
	;clr		PSW.3   // rs0 biti yine temizlendi.
	;;clr		p0      // Port0 = 00000000b ?????
	;clr		p1.2	// Port1.2 pini temizlendi
	
;;	clr		r0      // hata, hangi r0 oldugunu bilemez.
	;;clr		a.4     // akümülatür bit adreslenmez hata
	
;//** tersleme komutu ***************************	
	;mov		a,#11100011b
	;cpl		a		//komutu ise ACC 'nin her bir bit'inin tersini alir
	;cpl		00h
;;	cpl		r0    //hata
;;	cpl		@r0   // siz deneyin
	
;//*****Aritmetik Komutlar *****

;; toplama, a uzerinden olur
;; add veya addc
;; sadece 8 bit topluyorsak problem yok...
;; tasma durumunda carry=1 lenir
;; bu nedenle ilk once carry=0 yapalim

;clr		c
;;x=12h y=23h x+y islemi
;mov		00h,#12h
;mov		a,#23h
;add		a,00h    // a <- a + (00h)
                    ;;a=25h
;// diger bir ornek
;anl 	PSW, #11100111b
;mov		r0,#02h
;mov		02h,#12h
;mov		a,#23h
;add		a,@r0    // a=a+@r0
				 ;// a= 23h + 12h

;//*Toplama uygulamasi
	;; peki 2 bytelik verileri toplarsak
	;; dusuk byte tasabilir bu nedenle c yi
	;; yuksek byte lara eklemek gerecek
	
	;;x=1234h y=12EFh
	;;x+y
	;; c yi sifirla
	;; ilk once dusuk byte normal topla
	;; sonra yuksek byte kismini c ile birlikte topla
	
;//X = 1234h ve Y= 12EFh tamsayilarini bu hafiza hücrelerine yükleyen program parçasi:
	;clr		c    ; toplamaya baslamadan once muhakkak sifirla
	;mov		78h, # 34h ; XL
	;mov		79h, # 12h ; XH
	;mov		7Ah, # 0EFh ; YL
	;mov		7Bh, # 12h ; YH
;//SL = XL + YL toplamini gerçekleyen program kodu:
	;mov 	a, 78h ; A = XL
	;add 	a, 7Ah ; A = XL + YL
	;mov 	78h, a ; SL = A toplamin dusuk byte ini 78h adresine sakladik
	
;//Yapilan islemin bu noktasinda, 78h adresli hücre 23h degerini içermektedir 
;//ve C bayragi l 'lenmistir. 
;//SH = XH + YH + C islemini gerçeklestiren program 
	;mov 	a, 79h ; A = XH
	;addc 	a, 7Bh ; A = XH + YH + C
	;mov		79h, a ; SH = A   sonucun yuksek byte'ini burada sakladim.
	               ;; bu adimdan sonra c'yi de kontrol etmek gereklidir.

;//********Fark alma uygulamasi
	;; FARK ALMA ISLEMI subb komutu ,a uzerinden calisir
	;; c yi otomatik olarak isleme sokar
	;; c yi ilk once sifirla
	;; subbc diye bir komut yoktur.
;//X = 1234h ve Y = 1135h tamsayilarini hafizaya yükleyen program parçasi:
	;clr		c   ; toplama ve cikarma yapmadan once muhakkak sifirla
	;mov 	78h, #34h ; XL
	;mov 	79h, #12h ; XH
	;mov 	7Ah, #35h ; YL
	;mov 	7Bh, #11h ; YH
;//SL = XL - YL çikarma islemini gerçekleyen program parçasi:
	;mov 	a, 78h ; A = XL
	;subb 	a, 7Ah ; A = XL - YL - C
	;mov 	78h, a ; SL = A    ; sonucun dusuk byte'li kismi saklandi
;//Bu noktada 78h adresli hücre FFh degerini içermektedir ve C bayragi l 'lenir. 
;//SH = XH - YH - C islemini gerçeklestiren program parçasi:
	;mov 	a, 79h ; A = XH
	;subb 	a, 7Bh ; A = XH - YH - C
	;mov 	79h, a ; SH = A  sonucun yuksek byte'li kismi burada
	;// bu asama cikarma islemi bitmistir ancak C bitini kontrol etmek gereklidir.
	
;//*****Artirma ve Azaltma Komutlari (INC,DEC)*****
	;inc 	a ; acc'i 1 arttir 
	;inc 	r0 ; r0'i 1 arttir
	;inc 	r1 ; r1'i 1 arttir 
	;inc 	00h ; 00h'i 1 arttir
	;inc 	dptr ; dprt'i 1 arttir
	
	;mov		r0,#02h
	;mov		02h,#12h
	;inc		@r0      ; sonucu bulunuz
	
	;// inc icin yapilan tum ornekler dec icin de gecerlidir.
	;dec 	r0 ; r0'i 1 azalt
	;dec 	r1 ; r1'i 1 azalt
	
	
;//*****Çarpma ve Bölme Komutlari (MUL,DIV)*****

	;; mul	ab
	;; carpimin sonucunun dusuk byte kismi a'da
	;; yuksek byte kismi b'de bulunur
	;; sonuc FF ten buyukse OV bayragi 1 lenir. overflow=OV tasam
	;; carpma yapmadan once Ov'yi temizle
	;; sonuc FFFF'ten buyuk olamaz
	
	;clr		OV
	;mov		a,#0FFh		//AxB sonuç  BAh biciminde saklanir
	;mov		b,#00h
	;mul		ab
	
	;clr		OV
	;mov		a,#0Ah
	;mov		b,#05h
	;mul		ab
	
	;clr		OV
	;mov		a,#129d
	;mov		b,#2d
	;mul		ab
	;;sonuc ov=1
	;;ve b=00000001 ve a=00000010
	
	;CLR		OV
	;mov		a,#0FFh		//sonuç 65025d=FE01h
	;mov		b,#0FFh
	;mul		ab

	;CLR		OV
	;mov		a,#0FFh		//sifira bolme durumu
	;mov		b,#00h
	;div		ab
	
	;CLR		OV
	;mov		a,#59h		//89d/8d=11.125d = 59h/08h= 0b.01h
	;mov		b,#08h
	;div		ab
	;end
	
;//*****Ondalik Ayarlama (Decimal Adjust) Komutu*****
	;; Hex to BCD code
	;; DA KOMUTU ACC uzerinden calisir
	;mov		a,#0bh  ; 0bh bir BCD sayi degil
	;da		a

	;//yukaridaki islemin aynisi
	;mov		a,#0bh
	;add		a,#6h

	;MOV 	A, #12h ; A = 12h (BCD)
	;MOV 	B, #29h ; B = 29h (BCD)
	;ADD 	A, B 	; 12h + 29h = 3Bh, BCD degil!
	;DA 		A 		; ondalik ayarlama, burada sonuca 6 eklenir, 3Bh + 6 = 41h dogru BCD
					;; sonuç (12 + 29) bulunur.
	;MOV 	A, #55h ; A = 55h (BCD)
	;MOV 	B, #66h ; B = 66h (BCD)
	;ADD 	A, B 	; 55h + 66h = BBh, BCD degil!
	;DA 		A 		; ondalik ayarlama, burada sonuca 66h eklenir, BBh + 66h = 121h
					;;; dogru BCD sonuç (55+66) bulunur ACC, 21h (BCD) içermektedir
					;;; ve C bayragi da 1 'lenmistir.


	;MOV 	A, #12h ; A = 12h (BCD)
	;MOV 	B, #29h ; B = 29h (BCD)
	;ADD 	A, B 	; 12h + 29h = 3Bh, BCD degil!
	;inc 	a
	;DA 		A 		; ondalik ayarlama, burada sonuca 6 eklenir, 3Bh + 6 = 41h dogru BCD
					;; sonuç (12 + 29) bulunur.
					
	;MOV 	A, #12h ; A = 12h (BCD)
	;MOV 	B, #29h ; B = 29h (BCD)
	;ADD 	A, B 	; 12h + 29h = 3Bh, BCD degil!
	;MOV 	B, #15h 
	;ADD 	A, B 		
	;DA 		A 		; ondalik ayarlama, burada sonuca 6 eklenir, 3Bh + 6 = 41h dogru BCD
					;; sonuç (12 + 29) bulunur.


	;END
;//*****Döndürme (Rotate) Komutlari*****
	; ACC UZERINDEN CALISIR
	; RR RRC RL RLC
	;CLR		C
	;MOV		A,#01010101B	
	;RL 		A ;ACCyi sola döndür (rotate left, RL)
	;RL 		A ;ACCyi sola döndür (rotate left, RL)

	;CLR		C
	;MOV		A,#01010101B	
	;RLC 	A ;ACCyi elde biti üzerinden sola döndür (rotate left with carry, RLC)
	;RLC 	A ;ACCyi elde biti üzerinden sola döndür (rotate left with carry, RLC)
	
	;CLR		C
	;MOV		A,#0FH	
	;RR 		A ; ACCyi saga döndür (rotate right, RR)
	;RR 		A ; ACCyi saga döndür (rotate right, RR)	
	
	;CLR		C
	;MOV		A,#0FH	
	;RRC		A ; ACCyi elde biti üzerinden saga döndür (rotate right with carry, RRC)
	;RRC		A ; ACCyi elde biti üzerinden saga döndür (rotate right with carry, RRC)
	
	
	
;//*Dondurme komutlarinin 2 ile carpma ve bolme icin kullanilmasi
	;mov 	a,#00100001b ;a=21h = 33d
	;rl 		a ;a= 0100 0010b=66d=42h , 1. öteleme
	;rl 		a ;a= 1000 0100b=132d=84h, 2. öteleme
	;rl 		a ;a= 0000 1001b=9d, 3. öteleme hata!!
	;rr 		a ;a= 1000 0100b=132d, islem geri alindi
	;clr		c
	;rlc		a ;c=1 a= 0000 1000b , c ile birilkte bakildiginde dogru
	
	;mov 	a,#01010010b ;a=82d
	;rr 		a ;a=0010 1001b = 41d (82/2=41) 1.öteleme
	;rr 		a ;a=1001 0100b=148d hatali! 2.öteleme
	;END
;//*****	Karsilikli Degistirme Komutlari*****
	;; SWAP KOMUTU
	;; a uzerinden calisir
	;; dusuk 4lu kismi yuksek 4lu kisimla yer degistirir
	;mov 	a,#0Fh ;a=0Fh
	;swap 	a ;a=F0h
	
	;;XCH KOMUTU
	;; acc ile diger byte i yer degistir.
	;mov 	r0,#25h ;R0a 25h sabit degerini yükle65
	;mov 	25h,#78h ;25h RAM adresine 78h sabit degerini yükle.
	;mov	 	a,#0Fh ;ACCye 0Fh sabit degerini yükle.
	;xch 	a,@R0 ; A=#78h, 25h=#0Fh
	;xch 	a,R0 ; A=#25h, R0=#78h
	;xch 	a,25h ; A=#0fh, 25h=#25h

	;;XCHD	a,@r1 ; a ile ri'nin gostermis oldugu adresteki verinin dusuk kisimlarini yer degistir.
	;mov 	r1, #15h ;R1e 15h sabit degerini yükle.
	;mov 	15h, #79h ;15h RAM adresine,79h sabit degerini yükle.
	;mov 	a, #2Bh ;ACCye 2Bh sabit degerini yükle;
	;xchd 	a, @R1 ;Islem öncesi ACC=#2Bh, 15h=#79h, 
					;;islem sonrasi ACC=#29h, 15h=#7Bh olur
	;END

;//****************************************
;//***** Bit Transfer Komutlari*****

	;mov		20h,#0FFh
	;mov 	c,07h ; bit adreslenebilir RAM bölgesindeki 07h biti cye yüklenir
	;mov 	c,acc.6 ;accnin 6. Biti carry bayagina tasinir.
	;SETB	C
	;mov 	0Fh,c ;c degeri RAMin bit adreslenebilir bölgesinin =Fh bitine tasindi
	
	;clr		c
	;MOV		A,#0fH
	;mov		00h,a
	;mov		00h,c
	
	;mov		01h,#0FFh
	;clr		01h

;//*P3 portunu asagida verilen biçimde düzenleyen assembly programini yaziniz.
	;mov 	20h,#0F0h ;20h = 1 1 1 1 0 0 0 0
	;mov 	c,p1.6
	;mov 	00h,c ;20h = 1 1 1 1 0 0 0 P1.6
	;mov 	c,p1.2
	;mov 	01h,c ;20h = 1 1 1 1 0 0 P1.2 P1.6
	;mov 	c,p1.5
	;mov 	02h,c ;20h = 1 1 1 1 0 P1.5 P1.2 P1.6
	;mov 	c,p1.0
	;mov 	03h,c ;20h = 1 1 1 1 P1.0 P1.5 P1.2 P1.6
	;mov 	p3,20h ;P3 = 1 1 1 1 P1.0 P1.5 P1.2 P1.6

;//*Bit Tabanli Lojik Komutlar
	;anl 	c, 12h ; C ile bit adreslenebilir alanin 12h bitini andlenip sonuç C ye yazilir.
	;orl 	c, P2.0 ; C ile P2 portunun 0.biti orlanip sonuç Cye yazilir.
	;anl 	c,/acc.3 ; C ile Accnin 3.bitinin tersi andlenip sonuç C ye yazilir.

;//*Temizleme  Setleme Komutlari

	;clr 	c ; c = 0
	;clr 	00h ; 00h = 0
	;setb 	c ; c = 1
	;setb 	00h ; (bit) = 1
	;cpl 	c ; c = ?c
	;cpl		00h
	
	;END
	;---------------------
	; iki sayi karsilastiriliyor
	; ilk adimda sonuc negatif cikiyor
	; sonuc negatif cikinca a'ya yuksek bir sayi yaziliyor
	; sonuc pozitif olunca tekrar en basa donup, donguler tekrarlaniyor.
	; bu ornekte ilk once sonuc negatif cikiyor
	; carry=0 yapiliyor ve sonuc pozitif cikmasi icin
	; a'ya yuksek bir sayi ekleniyor.
	; dallanmalari ve karsilastirma ornegi olarak
	; kullanilabilir.
	basla:
		mov		00h,#5h
		mov		a,#4h
	x1:	
		subb	a,00h
		jc		x2
		sjmp 	basla
	x2:
		; carry 0 lamak lazim.
		clr		c
		mov		a,#6h
		sjmp 	x1
		end
	;-----------------------------
	
	;-----------------------------
	; Ayni ornegin bir baska sekli
;basla:
	;mov		00h,#5h
	;mov		a,#4h
;x1:	
	;subb	a,00h
	;jnc		basla      ; c=0 olunca basla ya atla; ilk calistiginda c=1 olunca alttan devam eder.
						   ;; ikinci kez gelince c=1 oldugu icin bir alt koddan devam eder.
						   ;; bu sekilde c=1 olur daha sonra 0 olarak devam edip durur.
	 ;;carry 0 lamak lazim.
	;clr		c
	;mov		a,#6h
	;sjmp 	x1
	;end
;---------------------------------------
 ;P0'dan 05h'den kucuk bir veri  gelmisse port3'e ff yuklee
 ;aksi takdirde 00 yukle
 ;tekrar basa don ornegi
 ;peripheralsdan portlari ac denemeler yap.
	;basla:
		;mov		a,p0
		;subb	a,#05h ; eger a>#05h ise c=0 aksi takdirde c=1
		;jnc		x1     ; c=0 ise x1 e atla
		;mov		p3,#0ffh
		;sjmp	basla
	;x1:	mov		p3,#00h
		;sjmp	basla
		;end
;-----------------------------------------
;-----------------------------------------
; accumulator ile ilgili karsilastirma
; iki sayinin karsilastirilmasi
; p0'dan gelen verinin 0fh olmasi durumunda p3'e ff yaz ve sonsuz dongude bekle
; aksi takdirde 00 yaz.
	;basla:
		;mov		a,p0
		;subb	a,#0fh
		;jz		x1       ;akumulator 0 ise x1'e dallan
		;mov		p3,#00h
		;sjmp	basla
	;x1: mov		p3,#0ffh
	;x2:	sjmp 	x2
		;end
;----------------------------------------
;; Ayni ornegi cjne byte1,byte2,baslik ile yapalim
	;basla:
		;mov		a,p0
		;cjne	a,#0fh,x2    ; a 0fh esit degilse x2 ye dallan esitse bir alt satirdan devam et.
		;mov		p3,#0ffh
	;x1:	sjmp    x1	
	;x2: mov		p3,#00h
		;sjmp	basla
		;end
;;;---------------------------------------

;-----------------------------------------
; bu ornekte jnb veya jb icin ornek veriyoruz
; p0.0 butonuna tiklanis ise ram'i sifirla
; ve p3.1 ledi yak ve p3.2 ledi sondur, 
; aksi takdirde p3.2 ledi yak ve p3.1 ledini sondur
; sonsuz dongude durmadan kontrolleri tekrarla
	;basla:
		;mov		p0,#00h ; p0 temizle
		;mov		p3,#00h ; p3 temizle
	;devam:
		;jb		p0.0,x1 ; butona basilmismi?
		;setb	p3.2    
		;clr		p3.1
		;sjmp	devam
	;x1:
		;mov		r0,#7fh
	;sifirlaveyak:	
		;mov		@r0,#00h
		;djnz	r0,sifirlaveyak
		;setb	p3.1
		;clr		p3.2
		;sjmp	devam
		;end
;-----------------------------------------

;----------------------------------------
; dongu icinde dongu
	;basla:
		;mov		a,#0h
		;mov		r0,#5d
	;x1:	mov		r1,#5d
	;x2: inc 	a
		;// kodlar vs
		;djnz	r1,x2
		;djnz	r0,x1
		;end
	; 5 kez 5 lik dongu 
	; toplamda 25 kez a arttiriliyor
;----------------------------------------
;;-----------------------------------------
;;ayni ornegin baska bir bicimi: for gibi artan mantikta calisiyor
	 ;for i=1 to 10 
		;for j=1 to 5 gigi yapalim
	 ;i=r0 diyelim
	 ;j=r1 diyelim
	;basla:
		;mov		a,#0h
		;mov		r0,#0d ; 1. for'un i=0 dedik
	;x1:	mov		r1,#0d ; 2. for'un j=0 dedik
	;x2:	
		;//kodlar
		;inc		r1
		;inc		a
		;cjne	r1,#5d,x2 ; 2.for'un karsilastirilmasi
		;inc		r0
		;cjne	r0,#10d,x1 ; 1. for'un karsilastirilmasi
	;x3: sjmp 	x3	
		;end
;----------------------------------------------------
;----------------------------------------------------
; 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

		;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...
;----------------------------------------------------

