1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#  linux_logo in ppc assembly language
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#    based on the code from ll_asm-0.36
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
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# offsets into the results returned by the uname syscall
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ U_SYSNAME,0
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ U_NODENAME,65
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ U_RELEASE,65*2
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ U_VERSION,(65*3)
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ U_MACHINE,(65*4)
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ U_DOMAINNAME,65*5
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# offset into the SYSCALL_SYSINFO buffer
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ S_TOTALRAM,16
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# Sycscalls
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ SYSCALL_EXIT,     1
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#.equ SYSCALL_READ,     3
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ SYSCALL_WRITE,    4
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#.equ SYSCALL_OPEN,     5
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#.equ SYSCALL_CLOSE,    6
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#.equ SYSCALL_SYSINFO,116
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#.equ SYSCALL_UNAME,  122
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ STDIN, 0
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ STDOUT,1
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ STDERR,2
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ BSS_BEGIN,25
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ DATA_BEGIN,26
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
39eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov.include "logo.include"
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	.globl _start
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown_start:
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        #========================
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# Initialization
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#========================
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	eieio				# coolest opcode of all time ;)
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# not needed, but I had to put it here
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  	# the hack loading BSS_BEGIN and DATA_BEGIN
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# saves one instruction on any future load from memory
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# as we can just do an addi rather than an lis;addi
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	lis	25,bss_begin@ha
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	25,25,bss_begin@l
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	lis	26,data_begin@ha
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	26,26,data_begin@l
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	14,BSS_BEGIN,(out_buffer-bss_begin)
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# the output buffer
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	21,BSS_BEGIN,(text_buf-bss_begin)
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mr	17,14		    	# store out-buffer for later
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        #=========================
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# PRINT LOGO
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#=========================
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# LZSS decompression algorithm implementation
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# by Stephan Walter 2002, based on LZSS.C by Haruhiko Okumura 1989
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# optimized some more by Vince Weaver
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	li	8,(N-F)			# grab "R"
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	9,DATA_BEGIN,(logo-data_begin)-1
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# logo_pointer
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	12,DATA_BEGIN,(logo_end-data_begin)-1
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# end of the logo
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mr      16,17
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndecompression_loop:
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	lbzu 	10,1(9)			# load in a byte
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# auto-update
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mr	11,10			# copy to 11
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ori	11,11,0xff00		# re-load top as a hackish
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# 8-bit counter
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_flags:
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpw	0,12,9			# have we reached the end?
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ble	done_logo		# ! if so exit
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	andi.	13,11,0x1
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	srawi   11,11,1
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bne	0,discrete_char
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownoffset_length:
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	lbzu  	10,1(9)
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	lbzu	24,1(9)
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	slwi	24,24,8
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	or	24,24,10
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mr	10,24
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	srawi  15,10,P_BITS
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi   15,15,THRESHOLD+1 # cl = ax >> (P_BITS)+THRESH+1
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	       			 # = match length
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownoutput_loop:
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	andi.  24,24,(POSITION_MASK<<8+0xff)	# mask it
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	lbzx   10,21,24
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi   24,24,1
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstore_byte:
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	stbu   10,1(16)
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	stbx    10,21,8
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	8,8,1
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	andi.	8,8,(N-1)
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addic.	15,15,-1
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bne	0,output_loop
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	andi.	13,11,0xff00
133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bne	test_flags
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	b	decompression_loop
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndiscrete_char:
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	lbzu    10,1(9)
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	li	15,1
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	b       store_byte
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndone_logo:
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	4,17,1		# restore (plus one because r17 is decremented)
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	write_stdout	# and print the logo
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        #==========================
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# First Line
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#==========================
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#==========================
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# PRINT VERSION
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#==========================
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	li	0,SYSCALL_UNAME		# uname syscall
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	addi	3,BSS_BEGIN,(uname_info-bss_begin)
161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# uname struct
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	sc				# do syscall
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	16,DATA_BEGIN,(uname_info-data_begin)+U_SYSNAME@l-1
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# os-name from uname "Linux"
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	strcat
168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	16,DATA_BEGIN,(ver_string-data_begin)-1
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# source is " Version "
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl 	strcat
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	16,DATA_BEGIN,(uname_info-data_begin)+U_RELEASE@l-1
174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# version from uname "2.4.1"
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl 	strcat
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	16,DATA_BEGIN,(compiled_string-data_begin)-1
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# source is ", Compiled "
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl 	strcat
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	16,DATA_BEGIN,(uname_info-data_begin)+U_VERSION-1
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      					# compiled date
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl 	strcat
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	center_and_print	# write it to screen
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#===============================
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# Middle-Line
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#===============================
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#=========
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# Load /proc/cpuinfo into buffer
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#=========
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	li	0,SYSCALL_OPEN		# open()
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	addi	3,DATA_BEGIN,(cpuinfo-data_begin)
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# '/proc/cpuinfo'
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	li	4,0			# O_RDONLY <bits/fcntl.h>
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	sc				# syscall.  fd in r0.
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# we should check that r0>=0
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	mr	13,3			# save fd in r13
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	li	0,SYSCALL_READ		# read
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	addi	4,BSS_BEGIN,(disk_buffer-bss_begin)
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	li	5,4096		 	# 4096 is maximum size of proc file ;)
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	sc
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	mr	3,13			# restore fd
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	li	0,6			# close
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	sc
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#=============
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# Number of CPUs
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#=============
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mr	14,17 			# point output to out_buf
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# Assume 1 CPU for now
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# my iBook's /proc/cpuinfo does not have a "processor" line ???
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	16,DATA_BEGIN,(one-data_begin)-1
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	strcat
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#=========
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# MHz
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#=========
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    	lis	20,('l'<<8)+'o'		# find 'lock ' and grab up to M
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	20,20,('c'<<8)+'k'
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	li	23,'M'
233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   	bl	find_string
234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	16,DATA_BEGIN,(megahertz-data_begin)-1
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# print 'MHz '
237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	strcat
238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#=========
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# Chip Name
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#=========
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   	lis     20,('c'<<8)+'p'     	# find 'cpu\t: ' and grab up to \n
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	20,20,('u'<<8)+'\t'
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	li	23,'\n'
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	find_string
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	16,DATA_BEGIN,(comma-data_begin)-1
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# print ', '
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	strcat
252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#========
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# RAM
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#========
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	li	0,SYSCALL_SYSINFO	# sysinfo() syscall
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	addi	3,BSS_BEGIN,(sysinfo_buff-bss_begin)
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# sysinfo_buffer
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#	sc
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	lwz	4,(sysinfo_buff+S_TOTALRAM-data_begin)(DATA_BEGIN)
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# load bytes of RAM into r4
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	srawi	4,4,20		# divide by 2^20 to get MB
267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	li	5,0
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	num_to_ascii
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	16,DATA_BEGIN,(ram_comma-data_begin)-1
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# print 'M RAM, '
273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	strcat
275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#========
277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# Bogomips
278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#========
279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	lis	20,('m'<<8)+'i'		# find 'mips' and grab up to \n
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	20,20,('p'<<8)+'s'
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	li	23,'\n'
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	find_string
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	16,DATA_BEGIN,(bogo_total-data_begin)-1
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# print "Bogomips Total"
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	strcat
288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	center_and_print	# center it
290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#=================================
293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# Print Host Name
294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#=================================
295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mr	14,17			# restore out buffer
297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	16,DATA_BEGIN,((uname_info-data_begin)+U_NODENAME)-1
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# hostname
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	strcat
302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	center_and_print
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#================================
306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# Exit
307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#================================
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownexit:
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      3,0		# 0 exit value
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	li      0,SYSCALL_EXIT  # put the exit syscall number in eax
311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sc	             	# and exit
312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#=================================
317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# FIND_STRING
318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#=================================
319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#   r23 is char to end at
320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#   r20 is the 4-char ascii string to look for
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#   r14 points at output buffer
322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#   r16,r21
323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownfind_string:
325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	16,DATA_BEGIN,(disk_buffer-data_begin)-1
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# look in cpuinfo buffer
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# -1 so we can use lbzu
329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownfind_loop:
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	lwzu	13,1(16)		# load in 32 bits, incrementing 8bits
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpwi	13,0			# ! if null, we are done
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	beq	done
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpw	13,20			# compare with out 4 char string
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bne	find_loop		# ! if no match, keep looping
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# ! if we get this far, we matched
339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	li	21,':'
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownfind_colon:
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	lbzu	13,1(16)		# repeat till we find colon
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpwi	13,0
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	beq	done
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpw	13,21
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bne	find_colon
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	16,16,1			# skip a char [should be space]
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstore_loop:
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 lbzu	13,1(16)
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 cmpwi	13,0
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 beq	done
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    	 cmpw	13,23			# is it end string?
355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 beq 	almost_done		# ! if so, finish
356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 stbu	13,1(14)		# ! if not store and continue
357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 b	store_loop
358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownalmost_done:
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	li	13,0			# replace last value with null
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	stb	13,1(14)
362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndone:
364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	blr
365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#================================
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# strcat
368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#================================
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# r13 = "temp"
370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# r16 = "source"
371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       	# r14 = "destination"
372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstrcat:
373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	lbzu	13,1(16)		# load a byte from [r16]
374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	stbu	13,1(14)		# store a byte to [r14]
375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpwi	13,0			# is it zero?
376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bne	strcat			# ! if not loop
377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subi	14,14,1			# point to one less than null
378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	blr				# return
379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#==============================
381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# center_and_print
382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#==============================
383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# r14 is end of buffer
384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# r17 is start of buffer
385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# r29 = saved link register
386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# r4-r10, r19-r22, r30 trashed
387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncenter_and_print:
389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mflr 	29			# back up return address
391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subf	5,17,14			# see how long the output
393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# buffer is
394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpwi	5,80			# see if we are >80
396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        bgt	done_center		# ! if so, bail
397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	li	4,80			# 80 column screen
399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subf	4,5,4			# subtract strlen
400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	srawi	23,4,1			# divide by two
401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	lis	4,escape@ha
403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	4,4,escape@l
404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	write_stdout
405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mr	4,23
407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	li	5,1			# print to stdout
408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	num_to_ascii		# print number
409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	lis	4,c@ha
411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	4,4,c@l
412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	write_stdout
413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndone_center:
416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	4,17,1			# move string to output+1
418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	write_stdout		# call write stdout
419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	lis	4,linefeed@ha
421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	4,4,linefeed@l
422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mtlr	29	      		# restore link register
424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# and let write_stdout
425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# return for us
426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#================================
430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# WRITE_STDOUT
431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	#================================
432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# r4 has string
433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# r0,r3,r4,r5,r6 trashed
434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownwrite_stdout:
436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	li	0,SYSCALL_WRITE		# write syscall
437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	li	3,STDOUT		# stdout
438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	li	5,0			# string length counter
440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstrlen_loop:
441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	lbzx 	6,4,5			# get byte from (r4+r5)
442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       	addi	5,5,1			# increment counter
443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpi	0,6,0			# is it zero?
444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bne	strlen_loop		# ! if not keep counting
445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	5,5,-1
446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sc				# syscall
447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	blr				# return
449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	##############################
452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# Num to Ascii
453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	##############################
454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# num is in r4
455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# r5 =0 then strcat, otherwise stdout
456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	# r5-r10,r19,r20,r21,r22,r30 trashed
457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownnum_to_ascii:
459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mflr    30			# save the link register
461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	16,BSS_BEGIN,(num_to_ascii_end-bss_begin)
463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# the end of a backwards growing
464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					# 10 byte long buffer.
465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	li	20,10			# we will divide by 10
467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mr	19,4			# load in the value passed
468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndiv_by_10:
470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	divw	21,19,20		# divide r19 by r20 put into r21
471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mullw	22,21,20		# find remainder.  1st q*dividend
473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subf	22,22,19		# then subtract from original = R
474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	22,22,0x30		# convert remainder to ascii
475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	stbu	22,-1(16)		# Store to backwards buffer
477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mr	19,21			# move Quotient as new dividend
479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpwi	19,0			# was quotient zero?
480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bne    	div_by_10		# ! if not keep dividing
481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownwrite_out:
483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpwi	5,0			# ! if r5 is 0 then skip ahead
484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bne 	stdout_num
485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	16,16,-1		# point to the beginning
487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	bl	strcat			# and strcat it
488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mtlr	30			# restore link register
490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	blr				# return
492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstdout_num:
494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        mr	4,16			# point to our buffer
495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mtlr	30			# restore link register
496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	b	write_stdout		# stdout will return for us
497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#===========================================================================
500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.data
501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#===========================================================================
502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndata_begin:
505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
506eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov.include "logo.lzss_new"
507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownver_string:	.ascii	" Version \0"
509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncompiled_string:	.ascii	", Compiled \0"
510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmegahertz:	.ascii	"MHz PPC \0"
511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ space, ram_comma+6
512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ comma, ram_comma+5
513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownlinefeed:   	.ascii  "\n\0"
514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownescape:		.ascii	"\033[\0"
515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownc:		.ascii  "C\0"
516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownram_comma:	.ascii	"M RAM, \0"
517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownbogo_total:	.ascii	" Bogomips Total\0"
519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndefault_colors:	.ascii	"\033[0m\n\n\0"
521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncpuinfo:	.ascii	"/proc/cpuinfo\0"
523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownone:	.ascii	"One \0"
525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndisk_buffer:
527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "processor	: 0\n"
528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "cpu		: 745/755\n"
529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "temperature 	: 22-24 C (uncalibrated)\n"
530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "clock		: 600.000000MHz\n"
531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "revision	: 51.17 (pvr 0008 3311)\n"
532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "bogomips	: 49.79\n"
533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "timebase	: 24960000\n"
534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "platform	: PowerMac\n"
535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "model		: PowerBook4,1\n"
536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "machine		: PowerBook4,1\n"
537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "motherboard	: PowerBook4,1 MacRISC2 MacRISC Power Macintosh\n"
538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "detected as	: 257 (iBook 2)\n"
539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "pmac flags	: 0000001b\n"
540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "L2 cache	: 256K unified\n"
541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "pmac-generation	: NewWorld\n\0"
542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownuname_info:
544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff 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"
545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff 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"
546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "henparma\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff 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"
548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "2.6.29\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"
549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff 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"
550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "#1 Wed May 13 15:51:54 UTC 2009\0"
551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff 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"
552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff 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"
553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff 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"
554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff 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"
555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff 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"
556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownsysinfo_buff:
559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.long 0,0,0,0,512*1024*1024,0,0,0
560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#============================================================================
562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#.bss
563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#============================================================================
564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.lcomm bss_begin,0
566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.lcomm	num_to_ascii_buff,10
567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.lcomm num_to_ascii_end,1
568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.lcomm  text_buf, (N+F-1)	# These buffers must follow each other
569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.lcomm	out_buffer,16384
570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
580