first commit: hello world
[sgisys_test1] / test.S
1 #include "regdefs.h"
2
3         .set noreorder
4         .text
5
6         .equ SPB_FWVEC_ADDR, 0x80001020
7
8         .equ FW_HALT_OFFS, 0x0c
9         .equ FW_RST_INTERACT_OFFS, 0x1c
10         .equ FW_WRITE_OFFS, 0x6c
11
12         .globl _start
13 _start:
14         jal print_pc
15         nop
16
17         li a0, 0xbaadf00d
18         jal print_hex
19         nop
20         la t0, buffer
21         li t1, '\n'
22         sb t1, 0(t0)
23         sb zero, 1(t0)
24         la a0, buffer
25         jal printstr
26         nop
27
28
29         la a0, hellostr
30         jal printstr
31         nop
32         la a0, foobar
33         jal printstr
34         nop
35 0:      b 0b
36         nop
37
38 print_pc:
39         addiu sp, sp, -20
40         sw ra, 16(sp)
41
42         la a0, buffer
43         li t1, 'P'
44         sb t1, 0(a0)
45         li t1, 'C'
46         sb t1, 1(a0)
47         li t1, ':'
48         sb t1, 2(a0)
49         sb zero, 3(a0)
50         jal printstr
51         nop
52
53         lw a0, 16(sp)
54         jal print_hex
55         addiu a0, a0, -8        # bd: address of the jal instruction to arg0
56
57         la t0, buffer
58         li t1, '\n'
59         sb t1, 0(t0)
60         sb zero, 1(t0)
61         la a0, buffer
62         jal printstr
63         nop
64
65         lw ra, 16(sp)
66         jr ra
67         addiu sp, sp, 20        # bd
68
69
70 print_hex:
71         addiu sp, sp, -20
72         sw ra, 16(sp)
73
74         la t0, buffer
75         li t3, 8                # 8 nibbles to format
76 .Ltop:  
77         addiu t3, t3, -1
78         sll t1, t3, 2
79         srl t1, a0, t1          # shift to low nibble
80         andi t1, t1, 0xf        # and mask off everything above
81         li t2, 9
82         bgt t1, t2, .Lover9
83         nop
84         b .Lstore
85         addiu t1, t1, '0'       # bd
86 .Lover9:
87         addiu t1, t1, 'A'-10
88
89 .Lstore:
90         sb t1, (t0)
91         bne t3, zero, .Ltop
92         addiu t0, t0, 1         # bd
93
94         sb zero, (t0)   # zero-terminate
95         la a0, buffer
96         jal printstr
97         nop
98
99         lw ra, 16(sp)
100         jr ra
101         addiu sp, sp, 20        # bd
102
103 buffer: .space 64
104
105 printstr:
106         addiu sp, sp, -20
107         sw ra, 16(sp)
108
109         # compute string length -> a2
110         move t0, a0
111 0:      lb t1, (t0)
112         bne t1, zero, 0b
113         addiu t0, t0, 1
114         addiu t0, t0, -1
115         subu a2, t0, a0
116
117         move a1, a0     # buffer pointer
118         li a0, 1        # fd
119         move a3, sp     # count pointer
120
121         lw t0, SPB_FWVEC_ADDR
122         addiu t0, t0, FW_WRITE_OFFS
123         lw t0, (t0)     # grab the write entry point in t0
124         jal t0
125         nop
126         
127         lw ra, 16(sp)
128         jr ra
129         addiu sp, sp, 20        # bd
130
131 halt:
132         addiu sp, sp, -20
133         sw ra, 16(sp)
134
135         lw t0, SPB_FWVEC_ADDR
136         addiu t0, t0, FW_HALT_OFFS
137         lw t0, (t0)
138         jal t0
139         nop
140
141         lw ra, 16(sp)
142         jr ra
143         addiu sp, sp, 20
144
145         .data
146 hellostr: .asciiz "Hello SGI!\n"
147 foobar: .asciiz "This is a test!\n"