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

Subversion Repositories marca

[/] [marca/] [trunk/] [doc/] [factorial.s] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 jeunes2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;; factorial
3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4
;;; compute factorials of 1 to 9 and write results to
5
;;; the PC via UART
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
8
.data
9
 
10
;;; the numbers to be written are placed here
11
iobuf:
12
        data 0x0A
13
        data 0x0D
14
        data 0
15
        data 0
16
        data 0
17
        data 0
18
        data 0
19
        data 0
20
 
21
;;; stack for recursive calls of factorial()
22
stack:
23
 
24
.text
25
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
26
;;; main()
27
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
28
        ldib    r15, 1          ; number to start
29
        ldib    r5, 10          ; number to stop
30
 
31
        ldil    r1, lo(stack)   ; setup for factorial()
32
        ldih    r1, hi(stack)
33
        ldil    r2, lo(factorial)
34
        ldih    r2, hi(factorial)
35
 
36
        ldib    r6, 0x30        ; setup for convert()
37
        ldib    r7, 10
38
        ldil    r8, lo(iobuf)
39
        ldih    r8, hi(iobuf)
40
        ldil    r9, lo(convert)
41
        ldih    r9, hi(convert)
42
 
43
        ldib    r12, -8         ; enable write interrupts
44
        ldib    r11, (1 << 2)
45
        store   r11, r12
46
 
47
        ldil    r12, lo(isr)    ; register isr() to be called upon
48
        ldih    r12, hi(isr)    ; interrupt #3
49
        stvec   r12, 3
50
 
51
        ldib    r12, -6         ; address where to write data
52
                                ; to the UART
53
 
54
loop:
55
        mov     r0, r15         ; r0 is the argument
56
        call    r2, r3          ; call factorial()
57
        call    r9, r3          ; call convert()
58
 
59
wait:   getfl   r13
60
        btest   r13, 4          ; interrupts still enabled?
61
        brnz    wait
62
 
63
        addi    r15, 1          ; loop
64
        cmp     r15, r5
65
        brnz    loop
66
 
67
exit:   br      exit            ; stop here after all
68
 
69
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
70
;;; converting content of r4 to a string
71
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
72
convert:
73
        addi    r8, 2
74
convert_loop:
75
        umod    r4, r7, r10    ; the conversion
76
        add     r10, r6, r10
77
        storel  r10, r8
78
        addi    r8, 1
79
 
80
        udiv    r4, r7, r4     ; next digit
81
 
82
        cmpi    r4, 0
83
        brnz    convert_loop
84
 
85
        sei                    ; trigger write
86
        jmp     r3
87
 
88
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
89
;;; write out content of iobuf
90
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
91
isr:
92
        cmpi    r8, iobuf       ; reached end?
93
        brz     written
94
 
95
        addi    r8, -1          ; write data to UART
96
        loadb   r10, r8
97
        store   r10, r12
98
 
99
        reti
100
 
101
written:
102
        getshfl r10
103
        bclr    r10, 4          ; clear interrupt flag
104
        setshfl r10
105
        reti
106
 
107
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
108
;;; recursively compute factorial
109
;;; argument:           r0
110
;;; return value:       r4
111
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
112
factorial:
113
        cmpi    r0, 1           ; reached end?
114
        brule   fact_leaf
115
 
116
        store   r0, r1          ; push argument and return
117
        addi    r1,  2          ; address onto stack
118
        store   r3, r1
119
        addi    r1,  2
120
 
121
        addi    r0, -1          ; call factorial(r0-1)
122
        call    r2, r3
123
 
124
        addi    r1, -2          ; pop argument and return
125
        load    r3, r1          ; address from stack
126
        addi    r1, -2
127
        load    r0, r1
128
 
129
        mul     r0, r4, r4      ; return r0*factorial(r0-1)
130
        jmp     r3
131
 
132
fact_leaf:                      ; factorial(1) = 1
133
        ldib    r4, 1
134
        jmp     r3

powered by: WebSVN 2.1.0

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