OpenCores
URL https://opencores.org/ocsvn/RISCMCU/RISCMCU/trunk

Subversion Repositories RISCMCU

[/] [RISCMCU/] [trunk/] [asm/] [simple_calculator.asm] - Diff between revs 9 and 28

Only display areas with differences | Details | Blame | View Log

Rev 9 Rev 28
.include "riscmcu.inc"
.include "riscmcu.inc"
.def    key = r16
.def    key = r16
.def    temp = r17
.def    temp = r17
.def    B = r18
.def    B = r18
.def    C = r19
.def    C = r19
.def    addsub = r24
.def    addsub = r24
.def    counter = r25
.def    counter = r25
.def    tcount = r26
.def    tcount = r26
.def    led = r27
.def    led = r27
.cseg
.cseg
        rjmp    reset
        rjmp    reset
        rjmp    extint
        rjmp    extint
        rjmp    timer
        rjmp    timer
extint:
extint:
        clr     B
        clr     B
        clr     C
        clr     C
        clr     addsub
        clr     addsub
        out     portb,c
        out     portb,c
        reti
        reti
timer:
timer:
        in      temp,sreg
        in      temp,sreg
        inc     tcount
        inc     tcount
        cpi     tcount,24
        cpi     tcount,24
        brne    tback
        brne    tback
        clr     tcount
        clr     tcount
        cpi     led,0b10000
        cpi     led,0b10000
        brne    t4
        brne    t4
        ldi     led,0b0001
        ldi     led,0b0001
t4:     com     led
t4:     com     led
        out     portc,led
        out     portc,led
        com     led
        com     led
        lsl     led
        lsl     led
        out     sreg,temp
        out     sreg,temp
tback:  reti
tback:  reti
reset:
reset:
        clr     B
        clr     B
        clr     C
        clr     C
        clr     addsub
        clr     addsub
        ldi     counter,3
        ldi     counter,3
        ldi     led,0b0001
        ldi     led,0b0001
        ldi     temp,0b11110000
        ldi     temp,0b11110000
        out     ddrd,temp
        out     ddrd,temp
        ser     temp
        ser     temp
        out     ddrb,temp       ; PORT B as output
        out     ddrb,temp       ; PORT B as output
        out     ddrc,temp       ; PORT C as output
        out     ddrc,temp       ; PORT C as output
        out     portc,temp      ; PORT C leds OFF
        out     portc,temp      ; PORT C leds OFF
        out     portd,temp      ; PORT D output HI
        out     portd,temp      ; PORT D output HI
        out     gimsk,temp      ; Enable external interrupt
        out     gimsk,temp      ; Enable external interrupt
        out     timsk,temp      ; Enable Timer interrupt
        out     timsk,temp      ; Enable Timer interrupt
        ldi     temp,5
        ldi     temp,5
        out     tccr0,temp      ; timer clock source = divide by 1024
        out     tccr0,temp      ; timer clock source = divide by 1024
        rcall   ldtable
        rcall   ldtable
        sei
        sei
;*************************************************
;*************************************************
; Detect Keys
; Detect Keys
rescan: rcall   sdelay
rescan: rcall   sdelay
        sbi     portd,6
        sbi     portd,6
        cbi     portd,4
        cbi     portd,4
        ldi     zp,table
        ldi     zp,table
        in      key,pind
        in      key,pind
        cbr     key,$F0
        cbr     key,$F0
        cpi     key,$0F
        cpi     key,$0F
        brne    press
        brne    press
        sbi     portd,4
        sbi     portd,4
        cbi     portd,5
        cbi     portd,5
        ldi     zp,table+1
        ldi     zp,table+1
        in      key,pind
        in      key,pind
        cbr     key,$F0
        cbr     key,$F0
        cpi     key,$0F
        cpi     key,$0F
        brne    press
        brne    press
        sbi     portd,5
        sbi     portd,5
        cbi     portd,6
        cbi     portd,6
        ldi     zp,table+2
        ldi     zp,table+2
        in      key,pind
        in      key,pind
        cbr     key,$F0
        cbr     key,$F0
        cpi     key,$0F
        cpi     key,$0F
        brne    press
        brne    press
        rjmp    rescan
        rjmp    rescan
press:
press:
        rcall   sdelay
        rcall   sdelay
        in      temp,pind
        in      temp,pind
        cbr     temp,$F0
        cbr     temp,$F0
        cpse    key,temp
        cpse    key,temp
        rjmp    rescan
        rjmp    rescan
        sbrs    key,1
        sbrs    key,1
        subi    zp,-3
        subi    zp,-3
        sbrs    key,2
        sbrs    key,2
        subi    zp,-6
        subi    zp,-6
        sbrs    key,3
        sbrs    key,3
        subi    zp,-9
        subi    zp,-9
        ld      key,Z
        ld      key,Z
;*************************************************
;*************************************************
; Operation
; Operation
        cpi     key,$A
        cpi     key,$A
        breq    addkey
        breq    addkey
        cpi     key,$B
        cpi     key,$B
        breq    subkey
        breq    subkey
        swap    B
        swap    B
        cbr     B,$0f
        cbr     B,$0f
        add     B,key
        add     B,key
        out     portb,B
        out     portb,B
        rjmp    holding
        rjmp    holding
addkey:
addkey:
        cbr     addsub,$01
        cbr     addsub,$01
        rjmp    arith
        rjmp    arith
subkey:
subkey:
        sbr     addsub,$01
        sbr     addsub,$01
arith:
arith:
        swap    addsub
        swap    addsub
        sbrc    addsub,0
        sbrc    addsub,0
        rjmp    subf
        rjmp    subf
        rcall   BCDadd
        rcall   BCDadd
        out     portb,C
        out     portb,C
        rcall   overflow
        rcall   overflow
        clr     B
        clr     B
        rjmp    holding
        rjmp    holding
subf:
subf:
        rcall   BCDsub
        rcall   BCDsub
        out     portb,C
        out     portb,C
        rcall   overflow
        rcall   overflow
        clr     B
        clr     B
        rjmp    holding
        rjmp    holding
;*************************************************
;*************************************************
; Key press released ?
; Key press released ?
holding:
holding:
        rcall   sdelay
        rcall   sdelay
        in      key,pind
        in      key,pind
        cbr     key,$F0
        cbr     key,$F0
        ldi     temp,$0F
        ldi     temp,$0F
        cpse    key,temp
        cpse    key,temp
        rjmp    holding
        rjmp    holding
        rjmp    rescan
        rjmp    rescan
;*************************************************
;*************************************************
; overflow ?
; overflow ?
overflow:
overflow:
        sbrs    b,0
        sbrs    b,0
        ret
        ret
        cli
        cli
        sbi     ddrd,7
        sbi     ddrd,7
        cbi     portd,7
        cbi     portd,7
        rcall   delay
        rcall   delay
        sbi     portd,7
        sbi     portd,7
        cbi     ddrd,7
        cbi     ddrd,7
        sei
        sei
        ret
        ret
;*************************************************
;*************************************************
; Short Delay
; Short Delay
sdelay:
sdelay:
        clr     temp
        clr     temp
s10:    dec     temp
s10:    dec     temp
        brne    s10
        brne    s10
        ret
        ret
;*************************************************
;*************************************************
; Load Table
; Load Table
ldtable:
ldtable:
        ldi     ZP,table
        ldi     ZP,table
        ldi     temp,1
        ldi     temp,1
        st      Z+,temp
        st      Z+,temp
        ldi     temp,2
        ldi     temp,2
        st      Z+,temp
        st      Z+,temp
        ldi     temp,3
        ldi     temp,3
        st      Z+,temp
        st      Z+,temp
        ldi     temp,4
        ldi     temp,4
        st      Z+,temp
        st      Z+,temp
        ldi     temp,5
        ldi     temp,5
        st      Z+,temp
        st      Z+,temp
        ldi     temp,6
        ldi     temp,6
        st      Z+,temp
        st      Z+,temp
        ldi     temp,7
        ldi     temp,7
        st      Z+,temp
        st      Z+,temp
        ldi     temp,8
        ldi     temp,8
        st      Z+,temp
        st      Z+,temp
        ldi     temp,9
        ldi     temp,9
        st      Z+,temp
        st      Z+,temp
        ldi     temp,$B
        ldi     temp,$B
        st      Z+,temp
        st      Z+,temp
        ldi     temp,0
        ldi     temp,0
        st      Z+,temp
        st      Z+,temp
        ldi     temp,$A
        ldi     temp,$A
        st      Z+,temp
        st      Z+,temp
        ret
        ret
;*******************************************
;*******************************************
delay:
delay:
del:    ldi     ZP,count
del:    ldi     ZP,count
        ld      temp,Z
        ld      temp,Z
        dec     temp
        dec     temp
        st      Z,temp
        st      Z,temp
        brne    del
        brne    del
        ldi     ZP,count+1
        ldi     ZP,count+1
        ld      temp,Z
        ld      temp,Z
        dec     temp
        dec     temp
        st      Z,temp
        st      Z,temp
        brne    del
        brne    del
        dec     counter
        dec     counter
        brne    del
        brne    del
        ldi     counter,3
        ldi     counter,3
        ret
        ret
;***** Subroutine Register Variables
;***** Subroutine Register Variables
.def    BCD1    =r19            ;BCD input value #1
.def    BCD1    =r19            ;BCD input value #1
.def    BCD2    =r18            ;BCD input value #2
.def    BCD2    =r18            ;BCD input value #2
.def    tmpadd  =r16            ;temporary register
.def    tmpadd  =r16            ;temporary register
;***** Code
;***** Code
BCDadd:
BCDadd:
        ldi     tmpadd,6        ;value to be added later
        ldi     tmpadd,6        ;value to be added later
        add     BCD1,BCD2       ;add the numbers binary
        add     BCD1,BCD2       ;add the numbers binary
        clr     BCD2            ;clear BCD carry
        clr     BCD2            ;clear BCD carry
        brcc    add_0           ;if carry not clear
        brcc    add_0           ;if carry not clear
        ldi     BCD2,1          ;    set BCD carry
        ldi     BCD2,1          ;    set BCD carry
add_0:  brhs    add_1           ;if half carry not set
add_0:  brhs    add_1           ;if half carry not set
        add     BCD1,tmpadd     ;    add 6 to LSD
        add     BCD1,tmpadd     ;    add 6 to LSD
        brhs    add_2           ;    if half carry not set (LSD <= 9)
        brhs    add_2           ;    if half carry not set (LSD <= 9)
        subi    BCD1,6          ;        restore value
        subi    BCD1,6          ;        restore value
        rjmp    add_2           ;else
        rjmp    add_2           ;else
add_1:  add     BCD1,tmpadd     ;    add 6 to LSD
add_1:  add     BCD1,tmpadd     ;    add 6 to LSD
add_2:  swap    tmpadd
add_2:  swap    tmpadd
        add     BCD1,tmpadd     ;add 6 to MSD
        add     BCD1,tmpadd     ;add 6 to MSD
        brcs    add_4           ;if carry not set (MSD <= 9)
        brcs    add_4           ;if carry not set (MSD <= 9)
        sbrs    BCD2,0          ;    if previous carry not set
        sbrs    BCD2,0          ;    if previous carry not set
        subi    BCD1,$60        ;       restore value
        subi    BCD1,$60        ;       restore value
add_3:  ret                     ;else
add_3:  ret                     ;else
add_4:  ldi     BCD2,1          ;    set BCD carry
add_4:  ldi     BCD2,1          ;    set BCD carry
        ret
        ret
;***** Subroutine Register Variables
;***** Subroutine Register Variables
.def    BCDa    =r19            ;BCD input value #1
.def    BCDa    =r19            ;BCD input value #1
.def    BCDb    =r18            ;BCD input value #2
.def    BCDb    =r18            ;BCD input value #2
;***** Code
;***** Code
BCDsub:
BCDsub:
        sub     BCDa,BCDb       ;subtract the numbers binary
        sub     BCDa,BCDb       ;subtract the numbers binary
        clr     BCDb
        clr     BCDb
        brcc    sub_0           ;if carry not clear
        brcc    sub_0           ;if carry not clear
        ldi     BCDb,1          ;    store carry in BCDB1, bit 0
        ldi     BCDb,1          ;    store carry in BCDB1, bit 0
sub_0:  brhc    sub_1           ;if half carry not clear
sub_0:  brhc    sub_1           ;if half carry not clear
        subi    BCDa,$06        ;    LSD = LSD - 6
        subi    BCDa,$06        ;    LSD = LSD - 6
sub_1:  sbrs    BCDb,0          ;if previous carry not set
sub_1:  sbrs    BCDb,0          ;if previous carry not set
        ret                     ;    return
        ret                     ;    return
        subi    BCDa,$60        ;subtract 6 from MSD
        subi    BCDa,$60        ;subtract 6 from MSD
        ldi     BCDb,1          ;set underflow carry
        ldi     BCDb,1          ;set underflow carry
        brcc    sub_2           ;if carry not clear
        brcc    sub_2           ;if carry not clear
        ldi     BCDb,1          ;    clear underflow carry
        ldi     BCDb,1          ;    clear underflow carry
sub_2:  ret
sub_2:  ret
.dseg
.dseg
table:  .byte   12
table:  .byte   12
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.