ASM hazır kütüphane çalışmaları

Başlatan alikeskinkilic, 27 Ocak 2023, 00:44:06

alikeskinkilic

asm için yavaştan bir kütüphane oluşturmaya çalışıyorum aslında burada bittiğinede paylaşacaktım  ama çok ta vaktim olmuyor belki katkı gelirse herkes bir el atarsa farklı algoritmalara çabucak ulaşılabilir sonuca.
not: kütüphaneler makrolardan oluşuyor dolayısı ile 32 bit çarpma, bölme ,pause komutu, bank değiştirme, movff gibi rutin işler için birde manchester kodu için dönüşümleri yapan bir makro hazırladım.
;****************************************************************
;* MUL        : 16 x 16 = 32 multiply                           *
;*                                                              *
;* Input      : R3 * R1                                         *
;* Output     : R2, W = low word                                *
;*            : R0, R2 + 1 = mid word                           *
;*            : R0 = high word                                  *
;*                                                              *
;* Notes      :                                                 *
;****************************************************************
CARP  MACRO   R3,R3+1,R1,R1+1
 
MUL       
	 
	MOVLW   	.16              ; For 16 shifts
        	MOVWF   	R4
       	CLRF   	R0 + 1
        	CLRF    	R0
mulloop 
	BCF		STATUS, C
	RRF     	R3 + 1, F
       	RRF     	R3, F
        	BTFSS   	STATUS, C		;
        	GOTO    	mull1           	; Skip add
        	MOVF    	R1, W           ; 16-bit add with carry out
        	ADDWF   	R0, F
        	MOVF    	R1 + 1, W
        	BTFSC   	STATUS, C
        	INCFSZ  	R1 + 1, W
        	ADDWF   	R0 + 1, F
mull1 
	RRF    	R0 + 1, F
       	RRF     	R0	,F
        	RRF     	R2 + 1,F
        	RRF     	R2	,F  
        	DECFSZ  	R4	,F
        	GOTO    	mulloop
  DONE   
  	CLRF		R3
  	CLRF		R3+1
  	CLRF		R1
  	CLRF		R1+1
 
           	ENDM

               
;****************************************************************
;* DIV        : 16 x 16 (31 x 15) divide                        *
;*                                                              *
;* Input      : R0 / R1                                         *
;* Output     : R0, R0+1  =     bolüm                           * 
;*            : R2 = remainder            kalan                     *
;*                                                              *
;* Notes      : R2 = R0 MOD R1                                  *
;****************************************************************
BOL MACRO	R0 ,R0+1 ,R1 ,R1+1
	CLRF	R2
	CLRF	R2+1
	BCF	STATUS,C

DIV32DIV 
        movlw   .16
        movwf   R5

divloop 
        rlf     R0 + 1, W
        rlf     R2, F
        rlf     R2 + 1, F
        movf    R1, W
        subwf   R2, F
        movf    R1 + 1, W
        btfss   STATUS, C
        incfsz  R1 + 1, W
        subwf   R2 + 1, F

        btfsc   STATUS, C
        goto    divok
        movf    R1, W
        addwf   R2, F
        movf    R1 + 1, W
        btfsc   STATUS, C
        incfsz  R1 + 1, W
        addwf   R2 + 1, F

        bcf     STATUS, C

divok   
        rlf     R0, F
        rlf     R0 + 1, F

        decfsz  R5, F
        goto    divloop
        movf    R0, W           ; Get low byte to W
    
	ENDM
	
;////////////////////////// MOVFF KOMUTU////////////////////////////////////
     ;     giriş        ram = ram
 

MOVFF MACRO R5,R6
	;R5 =BANK0--------R6 = BANK0
	IF      	(R5) < 0X80 && (R6) < 0X80		 	
		MOVF		R5	,W
		MOVWF	R6	
	ENDIF

	;////////////R5 =BANK0--------R6 = BANK1/////////////////
	IF      	(R5) < 0X80 && (R6) > 0X7F&&(R6)<0X100 
		MOVF		R5	,W
		BSF	STATUS	,RP0
		MOVWF	R6
	ENDIF
	;-------------------R5=BANK0--------R6=BANK2/////////////////
	IF      	(R5) < 0X80 && (R6) > 0XFF&&(R6)<0X180 
		MOVF		R5	,W
		BSF	STATUS	,RP1
		MOVWF	R6
	ENDIF
	;-------------------R5=BANK0--------R6=BANK3/////////////////
	IF      (R5) < 0X80 && (R6) > 0X17F
		MOVF		R5	,W
		BSF	STATUS	,RP1
		BSF	STATUS	,RP0
		MOVWF	R6
	ENDIF		
;	;/////////////R5=BANK1-------R6=BANK0//////////////////
	IF      	(R5) > 0X7F&&(R5)<0X100 &&  (R6) < 0X80 
		MOVF		R5	,W
		BCF	STATUS	,RP0
		MOVWF	R6		
	ENDIF
		;/////////////R5=BANK1-------R6=BANK1//////////////////
	IF      (R5) > 0X7F&&(R5)<0X100 && 	(R6) > 0X7F && (R6) < 0X100 
		MOVF		R5	,W
		MOVWF	R6
	ENDIF	
			;/////////////R5=BANK1-------R6=BANK2//////////////////
	IF     	(R5) > 0X7F&&(R5)<0X100 && (R6) > 0XFF && (R6) < 0X180 
		MOVF		R5	,W
		BCF	STATUS	,RP0
		BSF	STATUS	,RP1
		MOVWF	R6		
	ENDIF
	;/////////////R5=BANK1-------R6=BANK3//////////////////
	IF      	(R5) > 0X7F&&(R5)<0X100 &&  (R6) > 0X17F

		MOVF		R5	,W
		BSF	STATUS	,RP1
		MOVWF	R6
	ENDIF	
			;/////////////R5=BANK2-------R6=BANK0//////////////////
		
	IF      	(R5) > 0XFF && (R5) < 0X180 && (R6) < 0X80
		MOVF		R5	,W
		BCF	STATUS	,RP1
		MOVWF	R6	
	ENDIF	
			;/////////////R5=BANK2-------R6=BANK1//////////////////
		
	IF      	(R5) > 0XFF&& (R5)< 0X180 && (R6) > 0X7F && (R6) < 0X100
		MOVF		R5	,W
		BSF	STATUS	,RP0
		BCF	STATUS	,RP1
		MOVWF	R6	
	ENDIF		
			;/////////////R5=BANK2-------R6=BANK2//////////////////
	IF      (R5) > 0XFF&& (R5)< 0X180 && (R6) > 0XFF && (R6) < 0X180
		MOVF		R5	,W
		MOVWF	R6	
	ENDIF	
;			;/////////////R5=BANK2-------R6=BANK3//////////////////
	IF      (R5) > 0XFF&& (R5)< 0X180 && (R6) > 0X17F
		MOVF		R5	,W
		BSF	STATUS	,RP0
		MOVWF	R6	
	ENDIF	
	;/////////////R5=BANK3-------R6=BANK3//////////////////	
	IF      	(R5) > 0X17F && (R6) > 0X17F
		MOVF		R5	,W
		MOVWF	R6
	ENDIF		
;	;/////////////R5=BANK3-------R6=BANK2//////////////////

	IF      (R5) > 0X17F && (R6) > 0XFF &&  (R6) < 0X180
		MOVF		R5	,W
		BCF	STATUS	,RP0
		MOVWF	R6
	ENDIF		
;	;/////////////R5=BANK3-------R6=BANK1//////////////////
	IF      (R5) > 0X17F && (R6) > 0X7F &&  (R6) < 0X100
		MOVF		R5	,W
		BCF	STATUS	,RP1
		MOVWF	R6		
	ENDIF										
	;/////////////R5=BANK3-------R6=BANK0//////////////////	
	IF      (R5) > 0X17F && (R6) < 0X80
		MOVF		R5	,W
		BCF	STATUS	,RP0
		BCF	STATUS	,RP1
		MOVWF	R6					
	ENDIF	
		ENDM
;//////////////////////MANCHESTER KODU///////////////////////	
;///////// 8 BİT VERİYİ MENCHESTER KODUNA DÖNÜŞTÜRME///////
;///////////////// R2-R2+1 MANCHESTER KODU//////////////////
MNCOD MACRO R3
	MOVLW	0X08
	MOVWF	R1
    	CLRF		R2
    	CLRF		R2+1
LL:
    	
    	BCF		STATUS	,C
    	RRF		R3		,W
    	RRF		R2+1
    	RRF		R2
 ;   	MOVLW	0X80		;G.E. Thomas STANDARDI İÇİN BU AÇILACAK
 ;   	XORWF	R2+1
    	BCF		STATUS	,C
	RRF		R3
    	RRF		R2+1
    	RRF		R2
	MOVLW	0X80		;IEEE 802.3 STANDARDI İÇİN BU AÇILACAK
	XORWF	R2+1
		
	DECFSZ	R1
	GOTO		LL
	ENDM
;/////////////////////////MANCHESTER KODU BİNARY KODA ÇEVİRME///////////
; R3 = BINARY
;
;
MNCOD_IN	MACRO	R2 ,R2+1
	MOVLW	.8
	MOVWF	R1
	CLRF		R3
	CLRF		R3+1
	BCF		STATUS ,C
	RRF  		R2+1
	RRF		R2
	RRF		R3
	BCF		STATUS ,C	
	RRF		R2+1
	RRF 		R2	
	DECFSZ	R1
	GOTO		$-8	
	ENDM
	;//////////////////////PAUSE ///////////////////
	;///////////////////////MS/////////////////////
PAUSE	MACRO R0 
	IFDEF	OSC_8 
	IF	R0 == 1
	 	
            movlw       .151
            movwf       _TMP0
            movlw       .3
            movwf       _TMP1
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            nop
            nop
            ENDIF
         
            IF	R0 == 2     
            movlw       .48
            movwf       _TMP0
            movlw       .6
            movwf       _TMP1
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            nop
            ENDIF
        	
        	 IF	R0==3
        	 movlw       .201
            movwf       _TMP0
            movlw       .8
            movwf       _TMP1
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            nop
            nop
            ENDIF
            
            IF	R0==4
            movlw       .98
            movwf       _TMP0
            movlw       .11
            movwf       _TMP1
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            nop
	ENDIF
	
	IF	R0==5
	 movlw       .251
            movwf       _TMP0
            movlw       .13
            movwf       _TMP1
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            nop
            nop
            ENDIF
            
            IF	R0==10
            movlw       .248
            movwf       _TMP0
            movlw       .26
            movwf       _TMP1
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            nop
            ENDIF
	
	IF	R0==50
	movlw       .220
            movwf       _TMP0
            movlw       .130
            movwf       _TMP1
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            ENDIF
            
            IF	R0==100
            movlw       .186
            movwf       _TMP0
            movlw       .4
            movwf       _TMP1
            movlw       .2
            movwf       _TMP2
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            decfsz      _TMP2,F
            goto        $-5
            ENDIF
            
            IF	R0==150
            movlw       .150
            movwf       _TMP0
            movlw       .134
            movwf       _TMP1
            movlw       .2
            movwf       _TMP2
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            decfsz      _TMP2,F
            goto        $-5          
	ENDIF
	ENDIF
	ENDM
             

tamamen bitmedi bazı kısımlar örneğin pause komutu her süre için yazılmadı çok uzun olacağı için birde movff komutu sadece ilk 4 bank arası veri kaydı için hazır.
birde bölme ve çarpma makroları pic basic pro dan modifiye farklı olarak 32 bit sonuç verebiliyorlar.
Hep meraktan

alikeskinkilic

bu makroları xxxx.inc şeklinde kaydedip ana programa include ederek komutları kullanabilirsiniz
ayrıca meblab ide için if ve ifdef komutlarına basit örnek olabilecek komutlar da var içinde tabi destek atarsanız sevinirim örneğin işaretli sayılar ile işlemler için makro yazabiliriz.
Hep meraktan

alikeskinkilic

Hep meraktan

power20

#3
Video güzel olmuş. Emeğiniz için teşekkür ederiz.

8 bit çarpma makrosunu kopyalayıp yapıtırabileceğimiz şekilde alabilir miyiz?

 Videoya bakıp elle mi yazalım hocam?

alikeskinkilic

#4
;///////////////8X8 = 16 BİT////////////////////
 MUL MACRO    R3,R1
 
mult:
              CLRF      R2                  ;Sonucu temizle
                CLRF      R2+1    
                MOVLW      0x08                ;Bit
counter:
                MOVWF      R4
                MOVF        R3    ,W            ;çarpılanı w ye yaz
loop:
        RRF        R1    ,F            ;çarpanı sağa kaydır 
                SKPNC                                    ;taşmayı kontrol et
                ADDWF      R2+1    ,F              ;sonuc ile topla
                RRF        R2+1    ,F              ;sağa kaydır
                RRF        R2,F
                DECFSZ      R4,F              ;8 kere tekrar
                GOTO        loop 
                ENDM
 
;****************************************************************
;* MUL        : 16 x 16 = 32 multiply                          *
;*                                                              *
;* Input      : R3 * R1                                        *
;* Output    : R2, W = low word                                *
;*            : R0, R2 + 1 = mid word                          *
;*            : R0 = high word                                  *
;*                                                              *
;* Notes      :                                                *
;****************************************************************
CARP  MACRO  R3,R3+1,R1,R1+1
 
MULL      
    
    MOVLW      .16              ; For 16 shifts
            MOVWF      R4
          CLRF      R0 + 1
            CLRF        R0
mulloop 
    BCF        STATUS, C
    RRF        R3 + 1, F
          RRF        R3, F
            BTFSS      STATUS, C        ;
            GOTO        mull1              ; Skip add
            MOVF        R1, W          ; 16-bit add with carry out
            ADDWF      R0, F
            MOVF        R1 + 1, W
            BTFSC      STATUS, C
            INCFSZ      R1 + 1, W
            ADDWF      R0 + 1, F
mull1 
    RRF        R0 + 1, F
          RRF        R0    ,F
            RRF        R2 + 1,F
            RRF        R2    ,F  
            DECFSZ      R4    ,F
            GOTO        mulloop
  DONE  
      CLRF        R3
      CLRF        R3+1
      CLRF        R1
      CLRF        R1+1
 
              ENDM

              
;****************************************************************
;* DIV        : 16 x 16 (31 x 15) divide                        *
;*                                                              *
;* Input      : R0 / R1                                        *
;* Output    : R0, R0+1  =    bolüm                          * 
;*                : R2 = remainder            kalan                    *
;*                                                              *
;* Notes      : R2 = R0 MOD R1                                  *
;****************************************************************
BOL MACRO    R0 ,R0+1 ,R1 ,R1+1
    CLRF    R2
    CLRF    R2+1
    BCF    STATUS,C

DIV32DIV 
        movlw  .16
        movwf  R5

divloop 
        rlf    R0 + 1, W
        rlf    R2, F
        rlf    R2 + 1, F
        movf    R1, W
        subwf  R2, F
        movf    R1 + 1, W
        btfss  STATUS, C
        incfsz  R1 + 1, W
        subwf  R2 + 1, F

        btfsc  STATUS, C
        goto    divok
        movf    R1, W
        addwf  R2, F
        movf    R1 + 1, W
        btfsc  STATUS, C
        incfsz  R1 + 1, W
        addwf  R2 + 1, F

        bcf    STATUS, C

divok  
        rlf    R0, F
        rlf    R0 + 1, F

        decfsz  R5, F
        goto    divloop
        movf    R0, W          ; Get low byte to W
    
    ENDM
    
;////////////////////////// MOVFF KOMUTU////////////////////////////////////
    ;    giriş        ram = ram
 

MOVFF MACRO R5,R6
    ;R5 =BANK0--------R6 = BANK0
    IF          (R5) < 0X80 && (R6) < 0X80            
        MOVF        R5    ,W
        MOVWF    R6    
    ENDIF

    ;////////////R5 =BANK0--------R6 = BANK1/////////////////
    IF          (R5) < 0X80 && (R6) > 0X7F&&(R6)<0X100 
        MOVF        R5    ,W
        BSF    STATUS    ,RP0
        MOVWF    R6
    ENDIF
    ;-------------------R5=BANK0--------R6=BANK2/////////////////
    IF          (R5) < 0X80 && (R6) > 0XFF&&(R6)<0X180 
        MOVF        R5    ,W
        BSF    STATUS    ,RP1
        MOVWF    R6
    ENDIF
    ;-------------------R5=BANK0--------R6=BANK3/////////////////
    IF      (R5) < 0X80 && (R6) > 0X17F
        MOVF        R5    ,W
        BSF    STATUS    ,RP1
        BSF    STATUS    ,RP0
        MOVWF    R6
    ENDIF        
;    ;/////////////R5=BANK1-------R6=BANK0//////////////////
    IF          (R5) > 0X7F&&(R5)<0X100 &&  (R6) < 0X80 
        MOVF        R5    ,W
        BCF    STATUS    ,RP0
        MOVWF    R6        
    ENDIF
        ;/////////////R5=BANK1-------R6=BANK1//////////////////
    IF      (R5) > 0X7F&&(R5)<0X100 &&    (R6) > 0X7F && (R6) < 0X100 
        MOVF        R5    ,W
        MOVWF    R6
    ENDIF    
            ;/////////////R5=BANK1-------R6=BANK2//////////////////
    IF        (R5) > 0X7F&&(R5)<0X100 && (R6) > 0XFF && (R6) < 0X180 
        MOVF        R5    ,W
        BCF    STATUS    ,RP0
        BSF    STATUS    ,RP1
        MOVWF    R6        
    ENDIF
    ;/////////////R5=BANK1-------R6=BANK3//////////////////
    IF          (R5) > 0X7F&&(R5)<0X100 &&  (R6) > 0X17F

        MOVF        R5    ,W
        BSF    STATUS    ,RP1
        MOVWF    R6
    ENDIF    
            ;/////////////R5=BANK2-------R6=BANK0//////////////////
        
    IF          (R5) > 0XFF && (R5) < 0X180 && (R6) < 0X80
        MOVF        R5    ,W
        BCF    STATUS    ,RP1
        MOVWF    R6    
    ENDIF    
            ;/////////////R5=BANK2-------R6=BANK1//////////////////
        
    IF          (R5) > 0XFF&& (R5)< 0X180 && (R6) > 0X7F && (R6) < 0X100
        MOVF        R5    ,W
        BSF    STATUS    ,RP0
        BCF    STATUS    ,RP1
        MOVWF    R6    
    ENDIF        
            ;/////////////R5=BANK2-------R6=BANK2//////////////////
    IF      (R5) > 0XFF&& (R5)< 0X180 && (R6) > 0XFF && (R6) < 0X180
        MOVF        R5    ,W
        MOVWF    R6    
    ENDIF    
;            ;/////////////R5=BANK2-------R6=BANK3//////////////////
    IF      (R5) > 0XFF&& (R5)< 0X180 && (R6) > 0X17F
        MOVF        R5    ,W
        BSF    STATUS    ,RP0
        MOVWF    R6    
    ENDIF    
    ;/////////////R5=BANK3-------R6=BANK3//////////////////    
    IF          (R5) > 0X17F && (R6) > 0X17F
        MOVF        R5    ,W
        MOVWF    R6
    ENDIF        
;    ;/////////////R5=BANK3-------R6=BANK2//////////////////

    IF      (R5) > 0X17F && (R6) > 0XFF &&  (R6) < 0X180
        MOVF        R5    ,W
        BCF    STATUS    ,RP0
        MOVWF    R6
    ENDIF        
;    ;/////////////R5=BANK3-------R6=BANK1//////////////////
    IF      (R5) > 0X17F && (R6) > 0X7F &&  (R6) < 0X100
        MOVF        R5    ,W
        BCF    STATUS    ,RP1
        MOVWF    R6        
    ENDIF                                        
    ;/////////////R5=BANK3-------R6=BANK0//////////////////    
    IF      (R5) > 0X17F && (R6) < 0X80
        MOVF        R5    ,W
        BCF    STATUS    ,RP0
        BCF    STATUS    ,RP1
        MOVWF    R6                    
    ENDIF    
        ENDM
;//////////////////////MANCHESTER KODU///////////////////////    
;///////// 8 BİT VERİYİ MENCHESTER KODUNA DÖNÜŞTÜRME///////
;///////////////// R2-R2+1 MANCHESTER KODU//////////////////
MNCOD MACRO R3
    MOVLW    0X08
    MOVWF    R1
        CLRF        R2
        CLRF        R2+1
LL:
        
        BCF        STATUS    ,C
        RRF        R3        ,W
        RRF        R2+1
        RRF        R2
 ;      MOVLW    0X80        ;G.E. Thomas STANDARDI İÇİN BU AÇILACAK
 ;      XORWF    R2+1
        BCF        STATUS    ,C
    RRF        R3
        RRF        R2+1
        RRF        R2
    MOVLW    0X80        ;IEEE 802.3 STANDARDI İÇİN BU AÇILACAK
    XORWF    R2+1
        
    DECFSZ    R1
    GOTO        LL
    ENDM
;/////////////////////////MANCHESTER KODU BİNARY KODA ÇEVİRME///////////
; R3 = BINARY
;
;
MNCOD_IN    MACRO    R2 ,R2+1
    MOVLW    .8
    MOVWF    R1
    CLRF        R3
    CLRF        R3+1
    BCF        STATUS ,C
    RRF          R2+1
    RRF        R2
    RRF        R3
    BCF        STATUS ,C    
    RRF        R2+1
    RRF        R2    
    DECFSZ    R1
    GOTO        $-8    
    ENDM
    ;//////////////////////PAUSE ///////////////////
    ;///////////////////////MS/////////////////////
PAUSE    MACRO R0 
    IFDEF    OSC_8 
    IF    R0 == 1
        
            movlw      .151
            movwf      _TMP0
            movlw      .3
            movwf      _TMP1
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            nop
            nop
            ENDIF
        
            IF    R0 == 2    
            movlw      .48
            movwf      _TMP0
            movlw      .6
            movwf      _TMP1
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            nop
            ENDIF
            
            IF    R0==3
            movlw      .201
            movwf      _TMP0
            movlw      .8
            movwf      _TMP1
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            nop
            nop
            ENDIF
            
            IF    R0==4
            movlw      .98
            movwf      _TMP0
            movlw      .11
            movwf      _TMP1
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            nop
    ENDIF
    
    IF    R0==5
    movlw      .251
            movwf      _TMP0
            movlw      .13
            movwf      _TMP1
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            nop
            nop
            ENDIF
            
            IF    R0==10
            movlw      .248
            movwf      _TMP0
            movlw      .26
            movwf      _TMP1
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            nop
            ENDIF
    
    IF    R0==50
    movlw      .220
            movwf      _TMP0
            movlw      .130
            movwf      _TMP1
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            ENDIF
            
            IF    R0==100
            movlw      .186
            movwf      _TMP0
            movlw      .4
            movwf      _TMP1
            movlw      .2
            movwf      _TMP2
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            decfsz      _TMP2,F
            goto        $-5
            ENDIF
            
            IF    R0==150
            movlw      .150
            movwf      _TMP0
            movlw      .134
            movwf      _TMP1
            movlw      .2
            movwf      _TMP2
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            decfsz      _TMP2,F
            goto        $-5          
    ENDIF
    ENDIF
    ENDM
             
hazır makroların tamamı
Hep meraktan

power20


alikeskinkilic

32 bit işraretli sayılarla işlemlerin yapıldığı kodları nihayet buldum internetten.işaretsiz kısmını zaten yapmıştık .kodları makro formatına sokup düzenledikten sonra paylaşacağım.belki bir video ile gene çalışma mantığını da anlatmaya çalışırım dilim döndüğünce.böylelikle matematik 4 işlem ile ilgili bütün makrolar tamamlanmış olacak İNŞALLAH. sonrasında duruma göre cos,sin falan gidebildiği yere kadar.
Hep meraktan

yas

Alıntı yapılan: alikeskinkilic - 29 Ocak 2023, 16:08:5632 bit işraretli sayılarla işlemlerin yapıldığı kodları nihayet buldum internetten.işaretsiz kısmını zaten yapmıştık

Bu işlemleri sadece PIC için yapıyorsanız işinizi kolaylaştıracak bir tavsiye vereyim. Proton(positron) derleyici ile istediğiniz işlemi yazıp derledikten sonra ürettiği asm kodu açıp inceleyin. Direkt referans alabileceğiniz kadar düzenli, optimal ve anlaşılır bir asm çıktısı üretiyor. Sanki bir derleyici tarafından değil de insan tarafından üretilmiş hissi veriyor. Deneme sürümünde mcu modeli dışında bir sınırlama yok. İşinizi daha da hızlandırabilir.

alikeskinkilic

#8
güzel fikir disasembly yapılabilir üretilen kod aslında negatif sayıları hallettim neredeyse zor yoldan.belki float sayılarla işlem  destekliyorsa  bir örnek yapıp hex kodunu paylaşabilirseniz bayağı iyi olabilir.sonrasında kurmaya çalışayım bedava bir uygulama bulursam:) tabi C derleyici ile de derlenmiş hex dosyası olabilir aralarındaki işlem farkını da görmüş oluruz .kodun sadeliği bakımından örnek olarak a=10 b=0,2  c=a*b şeklinde bir kodun derlenmesi şeklinde kısa bir kod iyi olur.yerdım ederseniz sevinirim.tabi şöyle bir sorun oluşuyor disasembly kodlarında bazen işlemler koşullara bağlı oluyor örneğin negatif sayılarda işlemler için en değerli bitin durumu değerlendirilmek zorunda ona göre negatif için işlem yada pozitif için işlem yapılıyor disasembly kodlarında bu koşul görünmüyor sadece koşul sonucunda çıkan kod görüldüğü için geri kalan kısmını gene bizim bulmamız gereiyor en mantıklısı .lib uzantılı dosyadan direk kütüphanenin asm kodunu bulmak ama nedense pic basic pro haricinde hiç bir derleyicinin lib dosyasında asm kod bulamadım .
Hep meraktan

yas

#9
PIC18F25K22 için positron da bir derleme yaptım. Kodun içeriğinde 3 adet float değişken kullandım. 2 adet float  değişkenine tam sayı olmayan değerler yükledim. Sonra sırasıyla bu sayıları üçüncü float değişkenine topladım, çıkarttım, çarptım ve böldüm. Programın bütün ön atamaları dahil toplam hafızadan 914 byte ram dan ise 28 byte kullandı. Aynı işlemi değişkenleri byte olarak kullandığımda program hafızadan her şey dahil 104 byte ram dan 9 byte kullandı. Çok başarılı bir sonuç olduğunu düşünüyorum.

Seçili Mcu lar için ücretsiz ve sınırsız versiyonu buradan indirebilirsiniz. Listedeki MCU lar gayet yeterli.

Alıntı Yap"FREE" 14-bit core Devices:
PIC16F84, PIC16F628, PIC16F628A, PIC16F877, PIC16F877A, PIC12F1552, PIC16F1614, and PIC16F1937

"FREE" 18F devices:
PIC18F13K50, PIC18F25K20, PIC18F25K22 PIC18F452, PIC18F45K20, and PIC18F46K20

"FREE" 16-bit devices:
PIC24EP128MC202, PIC24FJ64GA002, PIC24FJ64GA004, and dsPIC33FJ128GP802

Device = 18F25K22
Declare Xtal = 4

Dim Float1 As Float = 3.14
Dim Float2 As Float = 2.15
Dim Float3 As Float

Main:
Float3 = Float1 + Float2    '2 Kayar noktatlı değişkenin toplanması
Float3 = Float1 - Float2    '2 Kayar noktatlı değişkenin çıkartılması
Float3 = Float1 * Float2    '2 Kayar noktatlı değişkenin çarpılması
Float3 = Float1 / Float2    '2 Kayar noktatlı değişkenin bölünmesi
End

Buradan da derlenen dosyaları inceleyebilirsiniz.



İlave Not: disasembly yapmanıza gerek yok zaten kendisi asm dosyası üretiyor. İhtiyaç duyarsanız kod içerisinde bildirim yaparak cof çıktısı üretmesini de sağlayabiliyorsunuz.

alikeskinkilic

#10
hocam 18 serisi ile 16 serisi arasında asm komut farkları var  zahmet olmazssa 16 serisi bir işlemci ile aynı kodu derleyebilirmisiniz. hatta tüm işlemler için ayrı derlerseniz görünüşe göre tüm ram bölgesini dolduruyor böyle olunca çözmesi çok zor teker teker olursa süper olur
Hep meraktan

yas

PIC16F84A için derlendi. Değişkenler hem float hem byte olarak kullanıldığı 2 ayrı dosya mevcut. Float lu olan derleme program hafızadan 529, ram dan 28 byte, Byte kullanılan derleme program hafızadan 76, ram dan 12 byte kullandı.

https://dosya.co/ojlwe62o11sa/4_işlem.zip.html

alikeskinkilic

#12
float IEEE-754 formatında işleniyor formattan hiç birşey anlamadım aşırı gereksiz yer kaplıyor.halbuki 3.14 0.14 kısmını 100 ile çarpsa ve toplamda iki byte de saklasa daha mantıklı değilmi hem okuması hem çözmesi daha kolay olmazmı IEEE-754 mantığı nedir bilen açıklayabilirmi.3.14 için kaydedilen float karşılığı hex olarak 0x4048f5c3 çok saçma
Hep meraktan

yas

Alıntı yapılan: alikeskinkilic - 30 Ocak 2023, 13:20:28float IEEE-754 formatında işleniyor formattan hiç birşey anlamadım aşırı gereksiz yer kaplıyor.halbuki 3.14 0.14 kısmını 100 ile çarpsa ve toplamda iki byte de saklasa daha mantıklı değilmi hem okuması hem çözmesi daha kolay olmazmı IEEE-754 mantığı nedir bilen açıklayabilirmi.3.14 için kaydedilen float karşılığı hex olarak 0x4048f5c3 çok saçma

Hiç öyle şey olur mu  :) . Bu mantıkla 3.14 den 0.14 ü niçin ayırsın. Direkt 3.14*100 yapsın bu mantıkta aynı şey. Fakat noktadan sonra 8-7 hane devam ediyorsa ne olacak o zaman. Çözünürlük kötüleşir. 24 bit ve 32 bit floating yapısını ve mantığını öğrenmenizi tavsiye ederim.

Alıntı YapFormat Exponent Mantissa 0 Mantissa 1 Mantissa 2
 IEEE-754 sxxx xxxx yxxx xxxx xxxx xxxx xxxx xxxx
 Microchip xxxx xxxy sxxx xxxx xxxx xxxx xxxx xxxx

alikeskinkilic

"Fakat noktadan sonra 8-7 hane devam ediyorsa ne olacak o zaman." işte bende onu anlamıyorum hocam diyelim 3.000001 sayısının karşılığı ıeee standardında hata payıyla çıkıyor zaten şöyle bir sayıya denk geliyor ram da tutulan bilgi  "3.00000095367431640625" zaten kendinden hatalı format onun yerine  3.000001 sayısını 1 000 000 sayısı ile çarpınca sonuçta 3000001 sayısı çıkıyor üstelikte hata yok ve 32 bit uzunlukta da değil.herşeyi geçtim gene 32 bit yer kaplasın tamam benim dediğim mantıkla hata almadan kayan nokta alınabilirken ve komut sayısı bakımından da yarı yarıya fark varken.neden avantajını merak ediyorum sadece  dönşümler bu sitede yapılmıştır https://float.exposed/0x40400004
Hep meraktan