1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  linux_logo in ARM assembly language
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#    based on the code from ll_asm-0.41
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  By Vince Weaver <vince _at_ deater.net>
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# Modified to remove non-deterministic system calls
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# And to avoid reading from /proc
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.include "../logo.include"
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# offsets into the results returned by the uname syscall
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ U_SYSNAME,0
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ U_NODENAME,65
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ U_RELEASE,65*2
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ U_VERSION,(65*3)
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ U_MACHINE,(65*4)
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ U_DOMAINNAME,65*5
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# offset into the results returned by the sysinfo syscall
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ S_TOTALRAM,16
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# Sycscalls
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ SYSCALL_EXIT,	1
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ SYSCALL_WRITE,	4
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ STDIN,0
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ STDOUT,1
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ STDERR,2
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	.globl _start
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown_start:
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldr	r11,data_addr
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldr	r12,bss_addr
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#=========================
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# PRINT LOGO
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#=========================
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# LZSS decompression algorithm implementation
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# by Stephan Walter 2002, based on LZSS.C by Haruhiko Okumura 1989
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# optimized some more by Vince Weaver
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldr	r1,out_addr		@ buffer we are printing to
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov     r2,#(N-F)		@ R
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r3,r11,#(logo-data_begin)
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					@ r3 points to logo data
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldr	r8,logo_end_addr
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					@ r8 points to logo end
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldr	r9,text_addr		@ r9 points to text buf
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndecompression_loop:
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r4,[r3],#+1		@ load a byte, increment pointer
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r5,#0xff		@ load top as a hackish 8-bit counter
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	orr 	r5,r4,r5,LSL #8		@ shift 0xff left by 8 and or in the byte we loaded
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_flags:
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmp	r3,r8		@ have we reached the end?
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bge	done_logo  	@ if so, exit
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	lsrs 	r5,#1		@ shift bottom bit into carry flag
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bcs	discrete_char	@ if set, we jump to discrete char
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownoffset_length:
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r0,[r3],#+1	@ load a byte, increment pointer
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r4,[r3],#+1	@ load a byte, increment pointer
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown				@ we can't load halfword as no unaligned loads on arm
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	orr	r4,r0,r4,LSL #8	@ merge back into 16 bits
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown				@ this has match_length and match_position
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r7,r4		@ copy r4 to r7
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown				@ no need to mask r7, as we do it
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown				@ by default in output_loop
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r0,#(THRESHOLD+1)
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r6,r0,r4,LSR #(P_BITS)
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown				@ r6 = (r4 >> P_BITS) + THRESHOLD + 1
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown				@                       (=match_length)
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownoutput_loop:
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldr	r0,pos_mask		@ urgh, can't handle simple constants
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	and	r7,r7,r0		@ mask it
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb 	r4,[r9,r7]		@ load byte from text_buf[]
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r7,r7,#1		@ advance pointer in text_buf
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstore_byte:
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r4,[r1],#+1		@ store a byte, increment pointer
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r4,[r9,r2]		@ store a byte to text_buf[r]
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add 	r2,r2,#1		@ r++
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r0,#(N)
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	r0,r0,#1		@ grrr no way to get this easier
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	and 	r2,r2,r0		@ mask r
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subs	r6,r6,#1		@ decement count
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bne 	output_loop		@ repeat until k>j
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	tst	r5,#0xff00		@ are the top bits 0?
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bne	test_flags		@ if not, re-load flags
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	b	decompression_loop
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndiscrete_char:
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r4,[r3],#+1		@ load a byte, increment pointer
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r6,#1			@ we set r6 to one so byte
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					@ will be output once
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	b	store_byte		@ and store it
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# end of LZSS code
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndone_logo:
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldr	r1,out_addr		@ buffer we are printing to
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	write_stdout		@ print the logo
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#==========================
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# PRINT VERSION
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#==========================
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownfirst_line:
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r0,#0
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r1,r11,#(uname_info-data_begin)
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown						@ os-name from uname "Linux"
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldr	r10,out_addr			@ point r10 to out_buffer
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	strcat				@ call strcat
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r1,r11,#(ver_string-data_begin) @ source is " Version "
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl 	strcat			        @ call strcat
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r1,r11,#((uname_info-data_begin)+U_RELEASE)
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown						@ version from uname, ie "2.6.20"
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	strcat				@ call strcat
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r1,r11,#(compiled_string-data_begin)
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown						@ source is ", Compiled "
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	strcat				@  call strcat
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r1,r11,#((uname_info-data_begin)+U_VERSION)
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown						@ compiled date
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	strcat				@ call strcat
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r3,#0xa
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r3,[r10],#+1		@ store a linefeed, increment pointer
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r0,[r10],#+1		@ NUL terminate, increment pointer
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	center_and_print	@ center and print
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@===============================
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@ Middle-Line
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@===============================
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmiddle_line:
161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@=========
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@ Load /proc/cpuinfo into buffer
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@=========
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldr	r10,out_addr		@ point r10 to out_buffer
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@=============
168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@ Number of CPUs
169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@=============
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownnumber_of_cpus:
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r1,r11,#(one-data_begin)
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# cheat.  Who has an SMP arm?
174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	strcat
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@=========
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@ MHz
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@=========
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownprint_mhz:
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@ the arm system I have does not report MHz
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@=========
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@ Chip Name
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@=========
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownchip_name:
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r0,#'s'
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r1,#'o'
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r2,#'r'
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r3,#' '
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	find_string
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					@ find 'sor\t: ' and grab up to ' '
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r1,r11,#(processor-data_begin)
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					@ print " Processor, "
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	strcat
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@========
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@ RAM
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@========
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldr	r3,[r11,#((sysinfo_buff-data_begin)+S_TOTALRAM)]
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					@ size in bytes of RAM
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	movs	r3,r3,lsr #20		@ divide by 1024*1024 to get M
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	adc	r3,r3,#0		@ round
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r0,#1
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl num_to_ascii
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r1,r11,#(ram_comma-data_begin)
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					@ print 'M RAM, '
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	strcat			@ call strcat
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@========
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@ Bogomips
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@========
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r0,#'I'
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r1,#'P'
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r2,#'S'
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r3,#'\n'
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	find_string
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r1,r11,#(bogo_total-data_begin)
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	strcat			@ print bogomips total
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	center_and_print	@ center and print
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#=================================
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# Print Host Name
233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#=================================
234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownlast_line:
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldr	r10,out_addr		@ point r10 to out_buffer
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r1,r11,#((uname_info-data_begin)+U_NODENAME)
238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					@ host name from uname()
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	strcat			@ call strcat
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	center_and_print	@ center and print
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r1,r11,#(default_colors-data_begin)
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					@ restore colors, print a few linefeeds
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	write_stdout
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@================================
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@ Exit
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@================================
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownexit:
252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r0,#0				@ result is zero
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r7,#SYSCALL_EXIT
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	swi	0x0				@ and exit
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@=================================
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@ FIND_STRING
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@=================================
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@ r0,r1,r2 = string to find
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@ r3 = char to end at
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@ r5 trashed
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownfind_string:
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldr	r7,disk_addr		@ look in cpuinfo buffer
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownfind_loop:
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r5,[r7],#+1		@ load a byte, increment pointer
267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmp	r5,r0			@ compare against first byte
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r5,[r7]			@ load next byte
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpeq	r5,r1			@ if first byte matched, comp this one
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r5,[r7,#+1]		@ load next byte
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpeq	r5,r2			@ if first two matched, comp this one
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	beq	find_colon		@ if all 3 matched, we are found
273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmp	r5,#0			@ are we at EOF?
275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	beq	done			@ if so, done
276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	b	find_loop
278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownfind_colon:
280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r5,[r7],#+1		@ load a byte, increment pointer
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmp	r5,#':'
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bne	find_colon		@ repeat till we find colon
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r7,r7,#1		@ skip the space
285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstore_loop:
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r5,[r7],#+1		@ load a byte, increment pointer
288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r5,[r10],#+1		@ store a byte, increment pointer
289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmp	r5,r3
290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bne	store_loop
291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownalmost_done:
293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r0,#0
294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r0,[r10],#-1		@ replace last value with NUL
295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndone:
297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bx	r14			@ return
298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#================================
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# strcat
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#================================
302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# value to cat in r1
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# output buffer in r10
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# r3 trashed
305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstrcat:
306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r3,[r1],#+1		@ load a byte, increment pointer
307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r3,[r10],#+1		@ store a byte, increment pointer
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmp	r3,#0			@ is it zero?
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bne	strcat			@ if not loop
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	r10,r10,#1		@ point to one less than null
311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bx	r14			@ return
312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#==============================
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# center_and_print
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#==============================
317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# string to center in at output_buffer
318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncenter_and_print:
320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	stmfd	SP!,{LR}		@ store return address on stack
322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r1,r11,#(escape-data_begin)
324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					@ we want to output ^[[
325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	write_stdout
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstr_loop2:
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldr	r2,out_addr		@ point r2 to out_buffer
329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	r2,r10,r2		@ get length by subtracting
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	rsb	r2,r2,#81		@ reverse subtract!  r2=81-r2
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					@ we use 81 to not count ending \n
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bne	done_center		@ if result negative, don't center
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	lsrs	r3,r2,#1		@ divide by 2
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	adc	r3,r3,#0		@ round?
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r0,#0			@ print to stdout
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	num_to_ascii		@ print number of spaces
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r1,r11,#(C-data_begin)
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					@ we want to output C
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	write_stdout
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndone_center:
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldr	r1,out_addr		@ point r1 to out_buffer
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldmfd	SP!,{LR}		@ restore return address from stack
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#================================
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# WRITE_STDOUT
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#================================
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# r1 has string
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# r0,r2,r3 trashed
355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownwrite_stdout:
356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r2,#0				@ clear count
357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstr_loop1:
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r2,r2,#1
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldrb	r3,[r1,r2]
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmp	r3,#0
362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bne	str_loop1			@ repeat till zero
363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownwrite_stdout_we_know_size:
365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r0,#STDOUT			@ print to stdout
366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r7,#SYSCALL_WRITE
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	swi	0x0		 		@ run the syscall
368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bx	r14				@ return
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@#############################
372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@ num_to_ascii
373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@#############################
374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@ r3 = value to print
375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@ r0 = 0=stdout, 1=strcat
376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownnum_to_ascii:
378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	stmfd	SP!,{r10,LR}		@ store return address on stack
379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r10,r12,#((ascii_buffer-bss_begin))
380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r10,r10,#10
381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					@ point to end of our buffer
382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r4,#10		@ we'll be dividing by 10
384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndiv_by_10:
385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	divide		@ Q=r7,$0, R=r8,$1
386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r8,r8,#0x30	@ convert to ascii
387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strb	r8,[r10],#-1	@ store a byte, decrement pointer
388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	adds	r3,r7,#0	@ move Q in for next divide, update flags
389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bne	div_by_10	@ if Q not zero, loop
390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownwrite_out:
392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r1,r10,#1	@ adjust pointer
393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldmfd	SP!,{r10,LR}	@ restore return address from stack
394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmp	r0,#0
396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bne	strcat		@ if 1, strcat
397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	b write_stdout		@ else, fallthrough to stdout
399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@===================================================
402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@ Divide - because ARM has no hardware int divide
403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@ yes this is an awful algorithm, but simple
404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@  and uses few registers
405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@==================================================
406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@ r3=numerator   r4=denominator
407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@ r7=quotient    r8=remainder
408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	@ r5=trashed
409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndivide:
410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mov	r7,#0		@ zero out quotient
412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndivide_loop:
413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mul	r5,r7,r4	@ multiply Q by denominator
414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	r7,r7,#1	@ increment quotient
415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmp	r5,r3		@ is it greater than numerator?
416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ble	divide_loop	@ if not, loop
417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	r7,r7,#2	@ otherwise went too far, decrement
418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown				@ and done
419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mul	r5,r7,r4	@ calculate remainder
421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sub	r8,r3,r5	@ R=N-(Q*D)
422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bx	r14		@ return
423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownbss_addr:	.word bss_begin
426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndata_addr:	.word data_begin
427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownout_addr:	.word out_buffer
428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndisk_addr:	.word disk_buffer
429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownlogo_end_addr:	.word logo_end
430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpos_mask:	.word ((POSITION_MASK<<8)+0xff)
431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntext_addr:	.word text_buf
432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#===========================================================================
434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	section .data
435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#===========================================================================
436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.data
437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndata_begin:
438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownver_string:	.ascii	" Version \0"
439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncompiled_string:	.ascii	", Compiled \0"
440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownprocessor:	.ascii	" Processor, \0"
441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownram_comma:	.ascii	"M RAM, \0"
442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownbogo_total:	.ascii	" Bogomips Total\n\0"
443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndefault_colors:	.ascii "\033[0m\n\n\0"
445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownescape:		.ascii "\033[\0"
446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownC:		.ascii "C\0"
447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownone:	.ascii	"One \0"
449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownuname_info:
451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "Linux\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "lindt\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "2.6.32\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "#1 Wed May 13 15:51:54 UTC 2009\0"
458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndisk_buffer:
466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "Processor   : Feroceon 88FR131 rev 1 (v5l)\n"
467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "BogoMIPS    : 1192.75\n"
468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "Features    : swp half thumb fastmult edsp \n"
469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "CPU implementer	  : 0x56\n"
470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "CPU architecture: 5TE\n"
471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "CPU variant	  : 0x2\n"
472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "CPU part	  : 0x131\n"
473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "CPU revision	  : 1\n"
474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "\n"
475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "Hardware	  : Marvell SheevaPlug Reference Board\n"
476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "Revision	  : 0000\n"
477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "Serial		    : 0000000000000000\n\0"
478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownsysinfo_buff:
481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.long 0,0,0,0,512*1024*1024,0,0,0
482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.include	"../logo.lzss_new"
484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#============================================================================
487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	section .bss
488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#============================================================================
489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.bss
490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownbss_begin:
491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.lcomm ascii_buffer,10
492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.lcomm  text_buf, (N+F-1)
493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.lcomm	out_buffer,16384
494