Programmazione in assembler - ViaLeopardiCinque

Vai ai contenuti

Menu principale:

Programmazione in assembler

Progetti
M68HC05 DIVISIONE A 32 BIT
      NAM     DIV32
       OPT     P=60            !usando STM6
       OPT     G

       XDEF    DIV32
       XREF    DVD,DVS,COUNT,TDVD,TDVD1,TEMPA


DIV32   IDNT    1,0     M68HC05 DIVISIONE A 32 BIT
       PSCT

       BTEXT
              DIV32
 SCOPO: 32/32bit con risultato a 32 bit
 ENTRATA: dvd:dvd_1:dvd_2:dvd_3=dividendo
          dvs:dvs_1:dvs_2:dvs_3=divisore
 USCITA:  dvd:dvd_1:dvd_2:dvd_3=risultato
 COUNT(1)
 TDVD(1)
 TDVD1(1)
 TEMPA(1)
       ETEXT

DIV32   LDA     #$01
TST DVS
BMI DV1
DV2 INCA
       ASL     DVS+3
       ROL     DVS+2
       ROL     DVS+1
ROL DVS
BMI DV1
CMP #$21
BNE DV2
DV1 STA COUNT         
       LDA     DVD+1
STA TDVD
       LDA     DVD+2
STA TDVD1
LDA DVD
       LDX     DVD+3
CLR DVD
       CLR     DVD+1
       CLR     DVD+2
       CLR     DVD+3
DV3 STA TEMPA
       TXA
       SUB     DVS+3
TAX
LDA TDVD1
       SBC     DVS+2
STA TDVD1
LDA TDVD
       SBC     DVS+1
STA TDVD
LDA TEMPA
SBC DVS
BCC DV4
STA TEMPA
TXA
       ADD     DVS+3
TAX
LDA TDVD1
       ADC     DVS+2
STA TDVD1          
LDA TDVD
       ADC     DVS+1
STA TDVD
LDA TEMPA
ADC DVS
CLC
BRA DV5
DV4 SEC
DV5     ROL     DVD+3
       ROL     DVD+2
       ROL     DVD+1
ROL DVD
LSR DVS
       ROR     DVS+1
       ROR     DVS+2
       ROR     DVS+3
       DEC     COUNT
       BNE     DV3
    RTS

       END


Inizializzazione display LCD alfanumerico

NAM     LCDINIT
       OPT     P=75
       OPT     G

       XDEF    LCDINIT
       XREF    PORTAC,PORTAB,CKBUSY

RS      EQU     0                       !data input/instrucion data input
RW      EQU     1                       !read write
E       EQU     2                       !clock
DSSET   EQU     %00111000               !8 bits
*                                       !2 linee
*                                       !5x7 dots
DSCTR   EQU     %00001100               !display on
*                                       !cursor off
*                                       !cursor not blink
DSETY   EQU     %00000110               !cursor increment
*                                       !display not shift
DSCLR   EQU     %00000001               !clears entire display

LCDINIT IDNT    1,0     M6805 LCD INIT

*       !Inizializza il display a cristalli liquidi

       PSCT

*       !inizializzazione
LCDINIT BCLR    RS,PORTAC               !rs=0
       BCLR    RW,PORTAC               !rw=0
       BCLR    E,PORTAC                !e=0
       BSET    E,PORTAC                !e=1
       LDA     #$38                    !write 38h
       STA     PORTAB
       BCLR    E,PORTAC                !e=0
       LDX     #27
DLY0 DEX                             !delay = 80uS
       BNE     DLY0
       BSET    E,PORTAC                !e=1
       LDA     #$08                    !write 08h
       STA     PORTAB
       BCLR    E,PORTAC                !e=0
       LDX     #27
DLY1 DEX                             !delay = 80uS
       BNE     DLY1
       BSET    E,PORTAC                !e=1
       LDA     #$0E                    !write 0Eh
       STA     PORTAB
       BCLR    E,PORTAC                !e=0
       LDX     #27
DLY2 DEX                             !delay = 80uS
       BNE     DLY2
       BSET    E,PORTAC                !e=1
       LDA     #$02                    !write 02h
       STA     PORTAB
       BCLR    E,PORTAC                !e=0
       JSR     LCDLY                   !delay = 3,855mS
       BSET    E,PORTAC                !e=1
       LDA     #$01                    !write 01h
       STA     PORTAB
       BCLR    E,PORTAC                !e=0
       JSR     LCDLY                   !delay = 3,855mS
       BSET    E,PORTAC                !e=1
       LDA     #$80                    !write 80h
       STA     PORTAB
       BCLR    E,PORTAC                !e=0
       LDX     #27
DLY3 DEX                             !delay = 80uS
BNE     DLY3
       BSET    E,PORTAC                !e=1
       LDA     #$30                    !write 30h
       STA     PORTAB
       BCLR    E,PORTAC                !e=0
       LDX     #27
DLY4 DEX                             !delay = 80uS
       BNE     DLY4

*       !display setting
       JSR     CKBUSY
       BCLR    RS,PORTAC               !rs=0
       BCLR    RW,PORTAC               !rw=0
       BCLR    E,PORTAC                !e=0
       BSET    E,PORTAC                !e=1
       LDA     #DSSET                  !function set
       STA     PORTAB
       BCLR    E,PORTAC                !e=0
       BSET    RW,PORTAC               !rw=1
       JSR     CKBUSY
       BCLR    RS,PORTAC               !rs=0
       BCLR    RW,PORTAC               !rw=0
       BCLR    E,PORTAC                !e=0
       BSET    E,PORTAC                !e=1
       LDA     #DSCTR                  !display on/off control
       STA     PORTAB
       BCLR    E,PORTAC                !e=0
       BSET    RW,PORTAC               !rw=1
       JSR     CKBUSY
       BCLR    RS,PORTAC               !rs=0
       BCLR    RW,PORTAC               !rw=0
       BCLR    E,PORTAC                !e=0
       BSET    E,PORTAC                !e=1
       LDA     #DSCLR                  !display clear
       STA     PORTAB
       BCLR    E,PORTAC                !e=0
       BSET    RW,PORTAC               !rw=1
       JSR     CKBUSY
       BCLR    RS,PORTAC               !rs=0
       BCLR    RW,PORTAC               !rw=0
       BCLR    E,PORTAC                !e=0
       BSET    E,PORTAC                !e=1
       LDA     #DSETY                  !entry mode set
       STA     PORTAB
BCLR    E,PORTAC                !e=0
       BSET    RW,PORTAC               !rw=1
       RTS


*       !delay routine
LCDLY   LDX     #$05                    !delay = 3855uS
DLY10   LDA     #$FF
DLY00   DECA
BNE     DLY00
       DECX
       BNE     DLY10
       RTS

       END


Conversione da BCD a Binario
NAM     BCDBIN
       OPT     P=75
       OPT     G


       XREF    BINDAT,DGT
       XDEF    BCDBIN

       BTEXT
       BCDBIN
               converte un valore da bcd a binario.
               il valore (<=9999) da convertire dovra`
               essere contenuto in:DGT,DGT+1,DGT+2,DGT+3
               mentre il risultato (16bit) sara`memorizzato
               in BINDAT,BINDAT+1
       ETEXT

       PAGE

BCDBIN  IDNT    1,0     M68HC11 BCD TO BIN ROUTINE
       PSCT

BCDBIN  CLR     BINDAT          !CLEAR RESULT
       CLR     BINDAT+1
       LDAB    DGT
       BEQ     CCENT
MMUL    LDAA    BINDAT+1
       ADDA    #$E8            !MOLTIPLICAZIONE PER MILLE
       STAA    BINDAT+1
       LDAA    BINDAT
       ADCA    #$03
       STAA    BINDAT
       DECB
       BNE     MMUL

CCENT   LDAB    DGT+1           !LOAD CENT
BEQ DDEC !IF CENT=0 GO TO DDEC
       LDAA    #$64
BSR BBINS
DDEC    LDAB    DGT+2           !IF DEC=0 GO TO UUN
BEQ UUN
       LDAA    #$0A
BSR BBINS
UUN     LDAB    DGT+3           !IF UN=0 ESCAPE
BEQ EBCB1
       LDAB    #01
       LDAA    DGT+3
BSR BBINS
EBCB1 RTS

* moltiplica il valore del digit corrente per il valore
* relativo alla posizione del medesimo (100,10,1).
BBINS   MUL
       ADDB    BINDAT+1
       STAB    BINDAT+1

       ADCA    BINDAT
       STAA    BINDAT
       RTS

       END


Conversione da Binario a BCD
NAM     BINBCD
       OPT     P=75
       OPT     G

       XDEF    BINBCD
       XREF    TMPR,CON,DGT

       PAGE

BINBCD  IDNT    1,0     M68HC05 BINARIY TO BCD ROUTINE
       PSCT

       BTEXT
       BINBCD
       converte un numero binario (24 bit) in bcd
       INGRESSO: con,con+1,con+2
       USCITA:   dgt,dgt+1,dgt+2,dgt+3,dgt+4
       USATE:    tmpr,tmpr+1,tmpr+2,tmpr+3

       ETEXT

                       
BINBCD  CLR     TMPR
CLR TMPR+1
CLR TMPR+2
       LDA     #$18
STA TMPR+3

B_EG LDA TMPR+2
TAX !X=A
AND #$0F !A=0000XXXX
SUB #$05
BMI AT !SALTA SE A < 5
TXA !A=X
ADD #$03 !SE A >= 5  X=X+3
TAX !X=A
AT TXA !A=X
AND #$F0 !A=XXXX0000
SUB #$50
BMI BT !SALTA SA < 5
TXA !A=X
ADD #$30 !SE A >= 5  X=X+3
TAX !X=A
BT TXA !A=X
STA TMPR+2
LDA TMPR+1
TAX !X=A
AND #$0F !A=0000XXXX
SUB #$05
BMI CT !SALTA SE A < 5
TXA !A=X
ADD #$03 !SE A >=5  X=X+3
TAX !X=A
CT TXA !A=X
AND #$F0 !A=XXXX0000
SUB #$50
BMI DT !SALTA SE A < 5
TXA !A=X
ADD #$30 !SE A >=5  X=X+3
TAX !X=A
DT TXA !A=X
STA TMPR+1
LDA TMPR
TAX !X=A
SUB #$05 !SALTA SE A < 5
BMI ET
TXA !A=X
ADD #$03 !SE A >=5 X=X+3
TAX !X=A
ET TXA !A=X
STA TMPR
       ASL     CON+2
       ROL     CON+1
ROL CON
ROL TMPR+2
ROL TMPR+1
ROL TMPR
DEC TMPR+3
BNE B_EG

       LDA     TMPR
       AND     #%00001111
       STA     DGT
       LDA     TMPR+1
       TAX
       AND     #%00001111
       STA     DGT+2
       TXA
       LSRA
       LSRA
       LSRA
       LSRA
       STA     DGT+1
       LDA     TMPR+2
       TAX
       AND     #%00001111
       STA     DGT+4
       TXA
       LSRA
       LSRA
       LSRA
       LSRA
       STA     DGT+3
       RTS

       END


Scrittura display LCD alfanumerico

NAM     WRLCD
       OPT     P=75
       OPT     G

       XDEF    WRLCD
       XREF    PORTAB,PORTAC,CKBUSY,CURS,WPTR,TWPTR,SEG,WORD0,WORD1,WORD2
       XREF    WORD3,NCAR,TNCAR

RS      EQU     0                       !data input/instrucion data input
RW      EQU     1                       !read write
E       EQU     2                       !clock
DSHOME  EQU     %00000010               !return home code
DDRAM   EQU     %10000000               !base dd ram address


WRLCD   IDNT    1,0     M6805 LCD CONTROLLER

*       !write a string into display data ram
*       !la stringa dowra` essere scritta a partire da word0.
*       !seg (da 0 a 3) = definisce un blocco di memoria a partire da wordx
*       !wptr (da 0 a 255) = puntatore all`interno del blocco selezionato
*       !curs (da 0 a 40) = posizione del cursore sul display
*       !ncar (da 0 a 255) = lunghezza della stringa in caratteri

       PSCT

WRLCD   LDA     NCAR
       STA     TNCAR                   !numero di caratteri della stringa
       JSR     CKBUSY                  !chek if lctc is busyne
       BCLR    RS,PORTAC               !rs=0
       BCLR    RW,PORTAC               !rw=0
       BCLR    E,PORTAC                !e=0
       BSET    E,PORTAC                !e=1
       LDA     #DSHOME                 !return home
       STA     PORTAB
       BCLR    E,PORTAC                !e=0
       BSET    RW,PORTAC               !rw=1

       JSR     CKBUSY                  !chek if lctc is busyne
       BCLR    RS,PORTAC               !rs=0
       BCLR    RW,PORTAC               !rw=0
       BCLR    E,PORTAC                !e=0
       BSET    E,PORTAC                !e=1
       LDA     #DDRAM                  !cursor address
       ORA     CURS
       STA     PORTAB
       BCLR    E,PORTAC                !e=0
       BSET    RW,PORTAC               !rw=1

       LDX     WPTR                    !puntatore alla stringa
       STX     TWPTR
WRSTR   LDA     SEG                     !segmento di memoria che contiene la stringa
       CMP     #$00
       BNE     SG1
*       !segmento 0; a partire da word0 max 256 caratteri
       LDA     WORD0,X                 !carica il carattere puntato
       BRA     WREXE                   !scrivilo sul display
*       !segmento 1; a partire da word1 max 256 caratteri
SG1     CMP     #$01
       BNE     SG2
       LDA     WORD1,X
       BRA     WREXE
*       !segmento 2; a partire da word2 max 256 caratteri
SG2     CMP     #$02
       BNE     SG3
       LDA     WORD2,X
       BRA     WREXE
*       !segmento 3; a partire da word3 max 256 caratteri
SG3     LDA     WORD3,X

WREXE   TAX                             !salva l'accumulatore a
       JSR     CKBUSY                  !chek if lctc is busyne
       TXA
       BSET    RS,PORTAC               !rs=1
       BCLR    RW,PORTAC               !rw=0
       BCLR    E,PORTAC                !e=0
       BSET    E,PORTAC                !e=1
       STA     PORTAB
       BCLR    E,PORTAC                !e=0
       BSET    RW,PORTAC               !rw=1
       DEC     TNCAR                   !aggiorna il contatore dei caratteri scritti
       BEQ     ESCWR                   !se finito esci
       INC     TWPTR                   !incrementa il puntatore al carattere da scrivere
       LDX     TWPTR
       BRA     WRSTR                   !continua fino a tncar=0
ESCWR   RTS

       END
 
Copyright 2021. All rights reserved.
Torna ai contenuti | Torna al menu