Pic Micro, Arduino, Atmel, Microchip, Freescale, Texas Instrument, ecc. Strumenti di sviluppo, firmware e progetti.
da mars
#43
E' comodo avere già pronte le istruzioni necessarie per effettuare comparazioni in Assembly, sopratutto sui PIC Baseline che non dispongono degli opcodes sublw e addlw.
Le comparazioni ><= sono realizzate solamente con addwf e subwf e con il complemento a 1 (o a 2) delle costanti (literal). Le eguaglianze o diseguaglianze sono realizzate con xorwf.
Le macro sono in forma di pseudo mnemonici vagamente simili a quelli di 8051.
Sono divise in tre gruppi:
- compare and skip next line
- compare and jump to address
- branch e skip su WREG
Il file si associa alla compilazione con un #include all' inizio del sorgente. Le macro non utilizzano locazioni di RAM dati.

Codice: Seleziona tutto;********************************************************************
; compmacro.asm
;--------------------------------------------------------------------
;
;    Titolo        : Macro per comparazioni a 8 bit.
;                    Set istruzioni del core 12-bit.
;                    Eseguibili su  tutti i PIC a 8 bit.
;    PIC           : Baseline, Mid, 18F
;    Supporto      : MPASM
;    Versione      : V.1.0
;    Data          : 01-05-2013
;    Ref. hardware :
;    Autore        :  afg
;
;--------------------------------------------------------------------

  NOLIST            ; blocca lista per non appesantire il file .lst

;--------------------------------------------------------------------
; ******************** Lista delle Macro ****************************
; Compara e vai a indirizzo
;
; CFLJA    Compare File to Literal and Jump if Above
;          CFLJA file,literal,addr     file > literal goto addr
;
; CFFJA    Compare File to File and Jump if Above
;          CFFJA file1,file2,addr      file1 > file2 goto addr
;
; CFLJAE   Compare File to Literal and Jump if Above or Equal
;          CFLJAE file,literal,addr    file >= literal goto addr
;
; CFFJAE   Compare File to File and Jump if Above or Equal
;          CFFJAE file1,file2,addr     file1 >= file2 goto addr
;
; CFLJB    Compare File to Literal and Jump if Below
;          CFLJB file,literal,addr     file < literal goto addr
;
; CFFJB    Compare File to File and Jump if Below
;          CFFJB file1,file2,addr      file1 < file2 goto addr
;
; CFLJBE   Compare File to Literal and Jump if Below or Equal
;          CFLJBE file,literal,addr    file <= literal goto addr
;
; CFFJBE   Compare File to File and Jump if Below or Equal
;          CFFJBE file1,file2,addr     file1 <= file2 goto addr
;
; CFLJE    Compare File to Literal and Jump if Equal
;          CFLJE file,literal,addr     file = literal goto addr
;
; CFFJE    Compare File to File and Jump if Equal
;          CFFJE file1,file2,addr      file1 = file2 goto addr
;
; CFLJNE   Compare File to Literal and Jump if Not Equal
;          CFLJNE file,literal,addr    file <> literal goto addr
;
; CFFJNE   Compare File to File and Jump if Not Equal
;          CFFJNE file1,file2,addr     file1 <> file2 goto addr
;
; Compara e salta riga successiva
;
; CFLSA    Compare File to Literal and Skip if Above
;          CFLSA file,literal,addr     file > literal goto addr
;
; CFFSA    Compare File to File and Skip if Above
;          CFFSA file1,file2,addr      file1 > file2 goto addr
;
; CFLSAE   Compare File to Literal and Skip if Above or Equal
;          CFLSAE file,literal,addr    file >= literal goto addr
;
; CFFSAE   Compare File to File and Skip if Above or Equal
;          CFFSAE file1,file2,addr     file1 >= file2 goto addr
;
; CFLSB    Compare File to Literal and Skip if Below
;          CFLSB file,literal,addr     file < literal goto addr
;
; CFFSB    Compare File to File and Skip if Below
;          CFFSB file1,file2,addr      file1 < file2 goto addr
;
; CFLSBE   Compare File to Literal and Skip if Below or Equal
;          CFLSBE file,literal,addr    file <= literal goto addr
;
; CFFSBE   Compare File to File and Skip if Below or Equal
;          CFFSBE file1,file2,addr     file1 <= file2 goto addr
;
; CFLSE    Compare File to Literal and Skip if Equal
;          CFLSE file,literal,addr     file = literal goto addr
;
; CFFSE    Compare File to File and Skip if Equal
;          CFFSE file1,file2,addr      file1 = file2 goto addr
;
; CFLSNE   Compare File to Literal and Skip if Not Equal
;          CFLSNE file,literal,addr    file <> literal goto addr
;
; CFFSNE   Compare File to File and Skip if Not Equal
;          CFFSNE file1,file2,addr     file1 <> file2 goto addr
;
;
; RANGECHK Verifica valore di un regsitro se compreso tra min e max
;          RANGECHK file,min,max       min<file1<max  C=1
;
; Branch sul valore di W
;
; BW       Branch destination if W !=0
;          BW  dest
; BNW      Branch destination if W=0
;          BWNZ  dest
; SKPW     Skip next line if W !=0
;          SKPW dest
; SKPNW    Skip next line if W =0
;          SKPNW dest
;
;--------------------------------------------------------------------
; per tutte le comparazioni:  Words:4  Cicli:4 (5 se jump)
;                             Status: C, DC, Z
;--------------------------------------------------------------------

;####################################################################
;--------------------------------------------------------------------
;                       JUMP TO ADDRESS IF...
;--------------------------------------------------------------------
; per tutte : Words: 3  Cicli: 3 (4 se jump) Status: C, DC, Z
;
;********************************************************************
; CFLJA Compare File to Literal and Jump if Above
; Compara il contenuto di un registro con un numero e va a indirizzo
; se file > literal

CFLJA  MACRO   file,lit,addr
       movlw    (255-lit)   ; W = ~lit
       addwf    file,W      ; W = f + W = f + ~lit
       skpnc                ; C=0 se f<=lit, salta prossima riga
        goto    addr        ; C=1 se f>lit, vai a indirizzo
       ENDM

;********************************************************************
; CFFJA Compare File to File and Jump if Above
; Compara il contenuto di un registro con quello di un altro
; e va a indirizzo se file1>file2

CFFJA  MACRO  file1,file2,addr
       movf     file1,W  ; W = f1
       subwf    file2,W  ; W = f2 - W = f2 - f1
       skpc              ; C=1 se f2>=f1, salta prossima riga
        goto    addr     ; C=0 se f2<f1 (f1>f2), vai a indirizzo
       ENDM

;********************************************************************
; CFLJAE Compare File to Literal and Jump if Above or Equal
; Compara il contenuto di un registro con un numero e va a indirizzo
; se file>=literal

CFLJAE MACRO   file,lit,addr
       movlw    lit          ; W = lit
       subwf    file,w       ; W = f - W = f - lit
       skpnc                 ; C=0 se f<lit, salta prossima riga
        goto    addr         ; C=1 se f>=lit, vai a indirizzo
       ENDM


;********************************************************************
; CFFJAE Compare File to File and Jump if Above or Equal
; Compara il contenuto di un registro con quello di un altro
; e va a indirizzo se file1 >= file2

CFFJAE MACRO file,lit,addr
       movf     file2,W  ; W = f2
       subwf    file1,W  ; W = f1 - W = f1 - f2
       skpnc             ; C=0 se f1<f2, salta prossima riga
        goto     addr    ; C=1 se f1>=f2, vai a indirizzo
       ENDM

;********************************************************************
; CFLJB Compare File to Literal and Jump if Below
; Compara il contenuto di un registro con un numero e va a indirizzo
; se file<literal

CFLJB  MACRO file,lit,addr
       movlw    lit         ; W = lit
       subwf    file,W      ; W = f - W = f -lit
       skpc                 ; C=1 se f>=lit, salta prossima riga
        goto    addr        ; C=0 se f<lit, vai a indirizzo
       ENDM

;********************************************************************
; CFFJB Compare File to File and Jump if Below
; Compara il contenuto di un registro con con quello di un altro
; e va a indirizzo se file1<file2

CFFJB  MACRO file1,file2,addr
       movf     file2,W  ; W = f2
       subwf    file1,W  ; W = f1 - W = f1 - f2
       skpc              ; C=1 se f1>=f2, salta prossima riga
        goto    addr     ; C=0 se f1<f2, vai a indirizzo
       ENDM

;********************************************************************
; CFLJBE Compare File to Literal and Jump if Below or Equal
; Compara il contenuto di un registro con un numero e va a indirizzo
; se file<=literal

CFLJBE MACRO file,lit,addr
       movlw    (255-lit)  ; W = ~lit
       addwf    file,W     ; W = f + W = f + ~lit
       skpc                ; C=1 se f>lit, salta prossima riga
        goto    addr       ; C=0 se f<=lit, vai a indirizzo
       ENDM

;********************************************************************
; CFFJBE Compare File to File and Jump if Below or Equal
; Compara il contenuto di un registro con con quello di un altro
; e va a indirizzo se file1<=file2

CFFJBE MACRO file1,file2,addr
       movf     file1,W  ; W = f1
       subwf    file2,W  ; W = f2 - W = f2 - f1
       skpnc             ; C=0 se f2<f1, salta prossima riga
        goto    addr     ; C=1 se f2>=f1 (f1<=f2), vai a indirizzo
       ENDM

;********************************************************************
; CFLJE Compare File to Literal and Jump if Equal
; Compara il contenuto di un registro con un numero e va a indirizzo
; se file = literal

CFLJE  MACRO file,lit,addr
       movlw    lit      ; W = lit
       xorwf    file,W   ; W = f - W = f - lit
       skpnz             ; Z=1 se f<>lit, salta prossima riga
        goto    addr     ; Z=0 se f=lit, vai a indirizzo
       ENDM

;********************************************************************
; CFFJE Compare File to File and Jump if Equal
; Compara il contenuto di un registro con con quello di un altro
; e va a indirizzo se file1 = file2

CFFJE  MACRO file1,file2,addr
       movf     file2,W  ; W = f2
       xorwf    file1,W  ; W = f1 - W = f1 - f2
       skpnz             ; Z=1 se f1<>f2, salta prossima riga
        goto     addr    ; Z=0 se f1=f2, vai a indirizzo
       ENDM

;********************************************************************
; CFLJNE Compare File to Literal and Jump if Not Equal
; Compara il contenuto di un registro con un numero e va a indirizzo
; se file <> literal

CFLJNE MACRO file,lit,addr
       movlw    lit      ; W = lit
       xorwf    file,W   ; W = f - W = f - lit
       skpz              ; Z=1 se f=lit, salta prossima riga
        goto    addr     ; Z=0 se f<>lit, vai a indirizzo
       ENDM

;********************************************************************
; CFFJE Compare File to File and Jump if Not Equal
; Compara il contenuto di un registro con con quello di un altro
; e va a indirizzo se file1 <> file2

CFFJNE MACRO file1,file2,addr
       movf     file2,W  ; W = f2
       xorwf    file1,W  ; W = f1 - W = f1 - f2
       skpz              ; Z=1 se f1=f2, salta prossima riga
        goto    addr     ; Z=0 se f1<>f2, vai a indirizzo
       ENDM

;####################################################################
;--------------------------------------------------------------------
;                       SKIP NEXT LINE IF....
;--------------------------------------------------------------------
; per tutte : ; Words: 3  Cicli: 3 (4 se jump) Status: C, DC, Z
;
;********************************************************************
; CFLSA Compare File to Literal and Skip if Above
; Compara il contenuto di un registro con un numero e salta
; se file>literal

CFLSA  MACRO   file,lit
       movlw   ~lit       ; W = ~lit
       addwf   file,W     ; W = f + W = f - lit
       skpc               ; C=1 se f>lit, salta prossima riga
       ENDM               ; C=0 se f<=lit, esegui prossima riga

;********************************************************************
; CFFSA Compare File to File and Skip if Above
; Compara il contenuto di un registro con quello di un altro
; e salta se file1>file2

CFFSA  MACRO  file1,file2
       movf     file1,W  ; W = f1
       subwf    file2,W  ; W = f2 - W = f2 - f1
       skpnc             ; C=0 se f2<f1 (f1>f2), salta prossima riga
       ENDM              ; C=1 se f1<=f2, esegui prossima riga

;********************************************************************
; CFLSAE Compare File to Literal and Skip if Above or Equal
; Compara il contenuto di un registro con un numero e salta
; se file >= literal

CFLSAE MACRO file,lit
       movlw    lit          ; W = lit
       subwf    file,w       ; W = f - W = f -lit)
       skpc                  ; C=1 se f>=lit, salta prossima riga
       ENDM                  ; C=0 se f<lit, esegui prossima riga

;********************************************************************
; CFFSAE Compare File to File and Skip if Above or Equal
; Compara il contenuto di un registro con quello di un altro
; e salta se file1>=file2

CFFSAE MACRO file1, file2
       movf     file2,W  ; W = f2
       subwf    file1,W  ; W = f1 - W = f1 - f2
       skpc              ; C=1 se f1>=f2, salta prossima riga
       ENDM              ; C=0 se f1<f2, esegui prossima riga

;********************************************************************
; CFLSB Compare File to Literal and Skip if Below
; Compara il contenuto di un registro con un numero e salta
; se file<literal

CFLSB  MACRO file,lit
       movlw    lit         ; W = lit
       subwf    file,W      ; W = f - W = f - lit
       skpnc                ; C=0 se f<lit, skip prossima riga
       ENDM                 ; C=1 se f>=lit, esegui prossima riga

;********************************************************************
; CFFSB Compare File to File and Skip if Below
; Compara il contenuto di un registro con con quello di un altro
; e salta se file1<file2

CFFSB  MACRO file1,file2
       movf     file2,W  ; W = f2
       subwf    file1,W  ; W = f1 - W = f1 - f2
       skpnc             ; C=0 se f1<f2, skip prossima riga
       ENDM              ; C=1 se f1>=f2, esegui prossima riga

;********************************************************************
; CFLSBE Compare File to Literal and Skip if Below or Equal
; Compara il contenuto di un registro con un numero e salta
; se file <= literal

CFLSBE MACRO file,lit
       movlw    (255-lit)  ; W = ~lit
       addwf    file,W     ; W = f + W = f + ~lit
       skpnc               ; C=0 se f<=lit, skip prossima riga
       ENDM                ; C=1 se f>lit, esegui prossima riga

;********************************************************************
; CFFSBE Compare File to File and Skip if Below or Equal
; Compara il contenuto di un registro con con quello di un altro
; e salta se file1 <= file2

CFFSBE MACRO file1,file2
       movf     file1,W  ; W = f1
       subwf    file2,W  ; W = f2 - W = f2 - f1
       skpc              ; C=1 se f2>=f1 (f1<=f2), skip prossima riga
       ENDM              ; C=0 se f1<f2, esegui prossima riga

;********************************************************************
; CFLSE Compare File to Literal and Skip if Equal
; Compara il contenuto di un registro con un numero e salta
; se file = literal

CFLSE  MACRO file,lit
       movlw    lit      ; W = literal
       xorwf    file,W   ; W = file - W = file - literal
       skpz              ; Z=1 se  file=lit, skip prossima riga
       ENDM              ; Z=0 se file1<>lit, esegui prossima riga

;********************************************************************
; CFFSE Compare File to File and Skip if Equal
; Compara il contenuto di un registro con con quello di un altro
; e salta se file1 = file2

CFFSE  MACRO file1,file2
       movf     file2,W  ; W = file2
       xorwf    file1,W  ; W = file1 - W = file1 - file2
       skpz              ; Z=1 se file1=file2, skip prossima riga
       ENDM              ; Z=0 se file1<>file2, esegui prossima riga

;********************************************************************
; CFLSNE Compare File to Literal and Skip if Not Equal
; Compara il contenuto di un registro con un numero e salta
; se file <> literal

CFLSNE MACRO file,lit
       movlw    lit      ; W = lit
       xorwf    file,W   ; W = file - W = file - lit
       skpnz             ; Z=0 se file <> lit, skip prossima riga
       ENDM              ; Z=1 se file1=lit, esegui prossima riga

;********************************************************************
; CFFSE Compare File to File and Skip if Not Equal
; Compara il contenuto di un registro con con quello di un altro
; e salta se file1 <> file2

CFFSNE MACRO file1,file2
       movf     file2,W  ; W = file2
       xorwf    file1,W  ; W = file1 - W = file1 - file2
       skpnz             ; Z=0 se file1<>file2, skip prossima riga
       ENDM              ; Z=1 se file1=file2, esegui prossima riga


;####################################################################
;--------------------------------------------------------------------
;********************************************************************
;                          TEST SU W
;--------------------------------------------------------------------
; BNW Branch on W=0
BNW    MACRO dest
      iorlw 0           ; OR con 0, W resta inalterato
      skpnz             ; se Z=0, W !=0, salta prossima riga
       goto dest        ; se Z=1, W=0 , vai a dest
       ENDM

; BW Branch on W != 0
BW     MACRO dest
      iorlw 0           ; OR con 0, W resta inalterato
      skpz              ; se Z=1, W =0 , salta prossima riga
       goto dest        ; se Z=0, W !=0 , vai a dest
       ENDM

; SKPNW Skip on W = 0
SKPNW  MACRO dest
      iorlw 0           ; OR con 0, W resta inalterato
      skpz              ; se Z=1, W =0 , salta prossima riga
                        ; se Z=0, W !=0 , esegui prossima riga
       ENDM

; SKPW Skip on W != 0
SKPW    MACRO dest
      iorlw 0           ; OR con 0, W resta inalterato
      skpnz             ; se Z=0, W !=0 , salta prossima riga
                        ; se Z=1, W =0 , esegui prossima riga
        ENDM


       subwf    max,w   ; W = file - W = file - max
exit                    ; esce con C=1 se nei limiti
         ENDM

 LIST                   ; ripristina stampa della lista
Vendo

OWON HDS2202S nuovo imballo originale 190.00 eur[…]

Sono comuni interruttori a levetta DPDT. Se le due[…]

Visita il nostro canale telegram