blob: 48f1b81122272a5c92208629c49100b059e3db41 [file] [log] [blame]
wdenk591dda52002-11-18 00:14:45 +00001/*
2 * (C) Copyright 2002
3 * Daniel Engström, Omicron Ceti AB, daniel@omicron.se
wdenk57b2d802003-06-27 21:31:46 +00004 *
wdenk591dda52002-11-18 00:14:45 +00005 * See file CREDITS for list of people who contributed to this
6 * project.
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21 * MA 02111-1307 USA
22 */
23
24/*
25 * Based on msbios.c from rolo 1.6:
26 *----------------------------------------------------------------------
27 * (C) Copyright 2000
28 * Sysgo Real-Time Solutions GmbH
29 * Klein-Winternheim, Germany
30 *----------------------------------------------------------------------
31 */
32
wdenkabda5ca2003-05-31 18:35:21 +000033#include "bios.h"
34
wdenk591dda52002-11-18 00:14:45 +000035/*
36 * During it's initialization phase, before switching to protected
37 * mode, the Linux Kernel makes a few BIOS calls. This won't work
38 * if the board does not have a BIOS.
39 *
40 * This is a very minimalisic BIOS that supplies just enough
41 * functionality to keep the Linux Kernel happy. It is NOT
42 * a general purpose replacement for a real BIOS !!
43 */
44
wdenk591dda52002-11-18 00:14:45 +000045
46.section .bios, "ax"
47.code16
48.org 0
wdenk57b2d802003-06-27 21:31:46 +000049 /* a call to f000:0 should warmboot */
wdenkabda5ca2003-05-31 18:35:21 +000050 jmp realmode_reset
wdenk57b2d802003-06-27 21:31:46 +000051
wdenk591dda52002-11-18 00:14:45 +000052.globl rm_int00
Graeme Russ1aafcc92009-11-24 20:04:19 +110053.hidden rm_int00
54.type rm_int00, @function
wdenk591dda52002-11-18 00:14:45 +000055rm_int00:
56 pushw $0
57 jmp any_interrupt16
58.globl rm_int01
Graeme Russ1aafcc92009-11-24 20:04:19 +110059.hidden rm_int01
60.type rm_int01, @function
wdenk591dda52002-11-18 00:14:45 +000061rm_int01:
62 pushw $1
63 jmp any_interrupt16
64.globl rm_int02
Graeme Russ1aafcc92009-11-24 20:04:19 +110065.hidden rm_int02
66.type rm_int02, @function
wdenk591dda52002-11-18 00:14:45 +000067rm_int02:
68 pushw $2
69 jmp any_interrupt16
70.globl rm_int03
Graeme Russ1aafcc92009-11-24 20:04:19 +110071.hidden rm_int03
72.type rm_int03, @function
wdenk591dda52002-11-18 00:14:45 +000073rm_int03:
74 pushw $3
75 jmp any_interrupt16
76.globl rm_int04
Graeme Russ1aafcc92009-11-24 20:04:19 +110077.hidden rm_int04
78.type rm_int04, @function
wdenk591dda52002-11-18 00:14:45 +000079rm_int04:
80 pushw $4
81 jmp any_interrupt16
82.globl rm_int05
Graeme Russ1aafcc92009-11-24 20:04:19 +110083.hidden rm_int05
84.type rm_int05, @function
wdenk591dda52002-11-18 00:14:45 +000085rm_int05:
86 pushw $5
87 jmp any_interrupt16
88.globl rm_int06
Graeme Russ1aafcc92009-11-24 20:04:19 +110089.hidden rm_int06
90.type rm_int06, @function
wdenk591dda52002-11-18 00:14:45 +000091rm_int06:
92 pushw $6
93 jmp any_interrupt16
94.globl rm_int07
Graeme Russ1aafcc92009-11-24 20:04:19 +110095.hidden rm_int07
96.type rm_int07, @function
wdenk591dda52002-11-18 00:14:45 +000097rm_int07:
98 pushw $7
99 jmp any_interrupt16
100.globl rm_int08
Graeme Russ1aafcc92009-11-24 20:04:19 +1100101.hidden rm_int08
102.type rm_int08, @function
wdenk591dda52002-11-18 00:14:45 +0000103rm_int08:
104 pushw $8
105 jmp any_interrupt16
106.globl rm_int09
Graeme Russ1aafcc92009-11-24 20:04:19 +1100107.hidden rm_int09
108.type rm_int09, @function
wdenk591dda52002-11-18 00:14:45 +0000109rm_int09:
110 pushw $9
111 jmp any_interrupt16
112.globl rm_int0a
Graeme Russ1aafcc92009-11-24 20:04:19 +1100113.hidden rm_int0a
114.type rm_int0a, @function
wdenk591dda52002-11-18 00:14:45 +0000115rm_int0a:
116 pushw $10
117 jmp any_interrupt16
118.globl rm_int0b
Graeme Russ1aafcc92009-11-24 20:04:19 +1100119.hidden rm_int0b
120.type rm_int0b, @function
wdenk591dda52002-11-18 00:14:45 +0000121rm_int0b:
122 pushw $11
123 jmp any_interrupt16
124.globl rm_int0c
Graeme Russ1aafcc92009-11-24 20:04:19 +1100125.hidden rm_int0c
126.type rm_int0c, @function
wdenk591dda52002-11-18 00:14:45 +0000127rm_int0c:
128 pushw $12
129 jmp any_interrupt16
130.globl rm_int0d
Graeme Russ1aafcc92009-11-24 20:04:19 +1100131.hidden rm_int0d
132.type rm_int0d, @function
wdenk591dda52002-11-18 00:14:45 +0000133rm_int0d:
134 pushw $13
135 jmp any_interrupt16
136.globl rm_int0e
Graeme Russ1aafcc92009-11-24 20:04:19 +1100137.hidden rm_int0e
138.type rm_int0e, @function
wdenk591dda52002-11-18 00:14:45 +0000139rm_int0e:
140 pushw $14
141 jmp any_interrupt16
142.globl rm_int0f
Graeme Russ1aafcc92009-11-24 20:04:19 +1100143.hidden rm_int0f
144.type rm_int0f, @function
wdenk591dda52002-11-18 00:14:45 +0000145rm_int0f:
146 pushw $15
147 jmp any_interrupt16
148.globl rm_int10
Graeme Russ1aafcc92009-11-24 20:04:19 +1100149.hidden rm_int10
150.type rm_int10, @function
wdenk591dda52002-11-18 00:14:45 +0000151rm_int10:
152 pushw $16
153 jmp any_interrupt16
154.globl rm_int11
Graeme Russ1aafcc92009-11-24 20:04:19 +1100155.hidden rm_int11
156.type rm_int11, @function
wdenk591dda52002-11-18 00:14:45 +0000157rm_int11:
158 pushw $17
159 jmp any_interrupt16
160.globl rm_int12
Graeme Russ1aafcc92009-11-24 20:04:19 +1100161.hidden rm_int12
162.type rm_int12, @function
wdenk591dda52002-11-18 00:14:45 +0000163rm_int12:
164 pushw $18
165 jmp any_interrupt16
166.globl rm_int13
Graeme Russ1aafcc92009-11-24 20:04:19 +1100167.hidden rm_int13
168.type rm_int13, @function
wdenk591dda52002-11-18 00:14:45 +0000169rm_int13:
170 pushw $19
171 jmp any_interrupt16
172.globl rm_int14
Graeme Russ1aafcc92009-11-24 20:04:19 +1100173.hidden rm_int14
174.type rm_int14, @function
wdenk591dda52002-11-18 00:14:45 +0000175rm_int14:
176 pushw $20
177 jmp any_interrupt16
178.globl rm_int15
Graeme Russ1aafcc92009-11-24 20:04:19 +1100179.hidden rm_int15
180.type rm_int15, @function
wdenk591dda52002-11-18 00:14:45 +0000181rm_int15:
182 pushw $21
183 jmp any_interrupt16
184.globl rm_int16
Graeme Russ1aafcc92009-11-24 20:04:19 +1100185.hidden rm_int16
186.type rm_int16, @function
wdenk591dda52002-11-18 00:14:45 +0000187rm_int16:
188 pushw $22
189 jmp any_interrupt16
190.globl rm_int17
Graeme Russ1aafcc92009-11-24 20:04:19 +1100191.hidden rm_int17
192.type rm_int17, @function
wdenk591dda52002-11-18 00:14:45 +0000193rm_int17:
194 pushw $23
195 jmp any_interrupt16
196.globl rm_int18
Graeme Russ1aafcc92009-11-24 20:04:19 +1100197.hidden rm_int18
198.type rm_int18, @function
wdenk591dda52002-11-18 00:14:45 +0000199rm_int18:
200 pushw $24
201 jmp any_interrupt16
202.globl rm_int19
Graeme Russ1aafcc92009-11-24 20:04:19 +1100203.hidden rm_int19
204.type rm_int19, @function
wdenk591dda52002-11-18 00:14:45 +0000205rm_int19:
206 pushw $25
207 jmp any_interrupt16
208.globl rm_int1a
Graeme Russ1aafcc92009-11-24 20:04:19 +1100209.hidden rm_int1a
210.type rm_int1a, @function
wdenk591dda52002-11-18 00:14:45 +0000211rm_int1a:
212 pushw $26
213 jmp any_interrupt16
214.globl rm_int1b
Graeme Russ1aafcc92009-11-24 20:04:19 +1100215.hidden rm_int1b
216.type rm_int1b, @function
wdenk591dda52002-11-18 00:14:45 +0000217rm_int1b:
218 pushw $27
219 jmp any_interrupt16
220.globl rm_int1c
Graeme Russ1aafcc92009-11-24 20:04:19 +1100221.hidden rm_int1c
222.type rm_int1c, @function
wdenk591dda52002-11-18 00:14:45 +0000223rm_int1c:
224 pushw $28
225 jmp any_interrupt16
226.globl rm_int1d
Graeme Russ1aafcc92009-11-24 20:04:19 +1100227.hidden rm_int1d
228.type rm_int1d, @function
wdenk591dda52002-11-18 00:14:45 +0000229rm_int1d:
230 pushw $29
231 jmp any_interrupt16
232.globl rm_int1e
Graeme Russ1aafcc92009-11-24 20:04:19 +1100233.hidden rm_int1e
234.type rm_int1e, @function
wdenk591dda52002-11-18 00:14:45 +0000235rm_int1e:
236 pushw $30
237 jmp any_interrupt16
238.globl rm_int1f
Graeme Russ1aafcc92009-11-24 20:04:19 +1100239.hidden rm_int1f
240.type rm_int1f, @function
wdenk591dda52002-11-18 00:14:45 +0000241rm_int1f:
242 pushw $31
243 jmp any_interrupt16
244.globl rm_def_int
Graeme Russ1aafcc92009-11-24 20:04:19 +1100245.hidden rm_def_int
246.type rm_def_int, @function
wdenk591dda52002-11-18 00:14:45 +0000247rm_def_int:
248 iret
249
wdenk57b2d802003-06-27 21:31:46 +0000250
wdenk591dda52002-11-18 00:14:45 +0000251 /*
252 * All interrupt jumptable entries jump to here
253 * after pushing the interrupt vector number onto the
254 * stack.
255 */
256any_interrupt16:
wdenk57b2d802003-06-27 21:31:46 +0000257 MAKE_BIOS_STACK
wdenk591dda52002-11-18 00:14:45 +0000258
259gs movw OFFS_VECTOR(%bp), %ax
260 cmpw $0x10, %ax
wdenk57b2d802003-06-27 21:31:46 +0000261 je Lint_10h
wdenk591dda52002-11-18 00:14:45 +0000262 cmpw $0x11, %ax
263 je Lint_11h
wdenkabda5ca2003-05-31 18:35:21 +0000264 cmpw $0x12, %ax
265 je Lint_12h
wdenk591dda52002-11-18 00:14:45 +0000266 cmpw $0x13, %ax
267 je Lint_13h
268 cmpw $0x15, %ax
269 je Lint_15h
270 cmpw $0x16, %ax
271 je Lint_16h
wdenkabda5ca2003-05-31 18:35:21 +0000272 cmpw $0x1a, %ax
273 je Lint_1ah
wdenk591dda52002-11-18 00:14:45 +0000274 movw $0xffff, %ax
275 jmp Lout
276Lint_10h: /* VGA BIOS services */
277 call bios_10h
278 jmp Lout
wdenk57b2d802003-06-27 21:31:46 +0000279Lint_11h:
wdenk591dda52002-11-18 00:14:45 +0000280 call bios_11h
281 jmp Lout
wdenk57b2d802003-06-27 21:31:46 +0000282Lint_12h:
wdenkabda5ca2003-05-31 18:35:21 +0000283 call bios_12h
284 jmp Lout
wdenk591dda52002-11-18 00:14:45 +0000285Lint_13h: /* BIOS disk services */
286 call bios_13h
287 jmp Lout
288Lint_15h: /* Misc. BIOS services */
289 call bios_15h
290 jmp Lout
291Lint_16h: /* keyboard services */
292 call bios_16h
293 jmp Lout
wdenkabda5ca2003-05-31 18:35:21 +0000294Lint_1ah: /* PCI bios */
295 call bios_1ah
296 jmp Lout
wdenk57b2d802003-06-27 21:31:46 +0000297Lout:
wdenk591dda52002-11-18 00:14:45 +0000298 cmpw $0, %ax
299 je Lhandeled
wdenk57b2d802003-06-27 21:31:46 +0000300
wdenk591dda52002-11-18 00:14:45 +0000301 /* Insert code for unhandeled INTs here.
302 *
wdenk57b2d802003-06-27 21:31:46 +0000303 * ROLO prints a message to the console
wdenk591dda52002-11-18 00:14:45 +0000304 * (we could do that but then we're in 16bit mode
305 * so we'll have to get back into 32bit mode
306 * to use the console I/O routines (if we do this
307 * we shuls make int 0x10 and int 0x16 work as well))
308 */
309Lhandeled:
wdenkabda5ca2003-05-31 18:35:21 +0000310 RESTORE_CALLERS_STACK
wdenk591dda52002-11-18 00:14:45 +0000311 addw $2,%sp /* dump vector number */
312 iret /* return from interrupt */
313
314
315/*
316 ************************************************************
Wolfgang Denka1be4762008-05-20 16:00:29 +0200317 * BIOS interrupt 10h -- VGA services
wdenk591dda52002-11-18 00:14:45 +0000318 ************************************************************
319 */
320bios_10h:
321gs movw OFFS_AX(%bp), %ax
322 shrw $8, %ax
323 cmpw $0x3, %ax
324 je Lcur_pos
325 cmpw $0xf, %ax
326 je Lvid_state
327 cmpw $0x12, %ax
328 je Lvid_cfg
329 movw $0xffff, %ax
330 ret
331Lcur_pos: /* Read Cursor Position and Size */
332gs movw $0, OFFS_CX(%bp)
333gs movw $0, OFFS_DX(%bp)
334 xorw %ax, %ax
335 ret
336Lvid_state: /* Get Video State */
337gs movw $(80 << 8|0x03), OFFS_AX(%bp) /* 80 columns, 80x25, 16 colors */
338gs movw $0, OFFS_BX(%bp)
339 xorw %ax, %ax
340 ret
341Lvid_cfg: /* Video Subsystem Configuration (EGA/VGA) */
342gs movw $0x10, OFFS_BX(%bp) /* indicate CGA/MDA/HGA */
343 xorw %ax, %ax
344 ret
345
346
347/*
348 ************************************************************
349 * BIOS interrupt 11h -- Equipment determination
350 ************************************************************
351 */
352
353bios_11h:
wdenkabda5ca2003-05-31 18:35:21 +0000354cs movw bios_equipment, %ax
wdenk57b2d802003-06-27 21:31:46 +0000355gs movw %ax, OFFS_AX(%bp)
wdenk591dda52002-11-18 00:14:45 +0000356 xorw %ax, %ax
357 ret
358
359
360/*
361 ************************************************************
Wolfgang Denka1be4762008-05-20 16:00:29 +0200362 * BIOS interrupt 12h -- Get Memory Size
wdenkabda5ca2003-05-31 18:35:21 +0000363 ************************************************************
364 */
365bios_12h:
366cs movw ram_in_64kb_chunks, %ax
367 cmpw $0xa, %ax
368 ja b12_more_than_640k
369 shlw $6, %ax
370 jmp b12_return
371b12_more_than_640k:
372 movw $0x280, %ax
373b12_return:
374gs movw %ax, OFFS_AX(%bp) /* return number of kilobytes in ax */
375
376gs movw OFFS_FLAGS(%bp), %ax
377 andw $0xfffe, %ax /* clear carry -- function succeeded */
378gs movw %ax, OFFS_FLAGS(%bp)
379
380 xorw %ax, %ax
381 ret
382
383
384/*
385 ************************************************************
wdenk591dda52002-11-18 00:14:45 +0000386 * BIOS interrupt 13h -- Disk services
387 ************************************************************
388 */
389bios_13h:
390gs movw OFFS_AX(%bp), %ax
391 shrw $8, %ax
392 cmpw $0x15, %ax
393 je Lfunc_15h
394 movw $0xffff, %ax
395 ret
wdenk57b2d802003-06-27 21:31:46 +0000396Lfunc_15h:
wdenk591dda52002-11-18 00:14:45 +0000397gs movw OFFS_AX(%bp), %ax
398 andw $0xff, %ax /* return AH=0->drive not present */
399gs movw %ax, OFFS_AX(%bp)
400 xorw %ax, %ax
401 ret
wdenk57b2d802003-06-27 21:31:46 +0000402
wdenk591dda52002-11-18 00:14:45 +0000403
404/*
405 ***********************************************************
406 * BIOS interrupt 15h -- Miscellaneous services
407 ***********************************************************
408 */
409bios_15h:
410gs movw OFFS_AX(%bp), %ax
411 shrw $8, %ax
412 cmpw $0xc0, %ax
413 je Lfunc_c0h
414 cmpw $0xe8, %ax
415 je Lfunc_e8h
416 cmpw $0x88, %ax
417 je Lfunc_88h
418 movw $0xffff, %ax
419 ret
420
Wolfgang Denka1be4762008-05-20 16:00:29 +0200421Lfunc_c0h: /* Return System Configuration Parameters (PS2 only) */
wdenk591dda52002-11-18 00:14:45 +0000422gs movw OFFS_FLAGS(%bp), %ax
423 orw $1, %ax /* return carry -- function not supported */
424gs movw %ax, OFFS_FLAGS(%bp)
425 xorw %ax, %ax
426 ret
wdenk57b2d802003-06-27 21:31:46 +0000427
wdenk591dda52002-11-18 00:14:45 +0000428Lfunc_e8h:
429gs movw OFFS_AX(%bp), %ax
430 andw $0xff, %ax
431 cmpw $1, %ax
432 je Lfunc_e801h
433gs movw OFFS_FLAGS(%bp), %ax
434 orw $1, %ax /* return carry -- function not supported */
435gs movw %ax, OFFS_FLAGS(%bp)
436 xorw %ax, %ax
437 ret
wdenk57b2d802003-06-27 21:31:46 +0000438
wdenk591dda52002-11-18 00:14:45 +0000439Lfunc_e801h: /* Get memory size for >64M Configurations */
wdenkabda5ca2003-05-31 18:35:21 +0000440cs movw ram_in_64kb_chunks, %ax
441 cmpw $0x100, %ax
442 ja e801_more_than_16mb
443 shlw $6, %ax /* multiply by 64 */
444 subw $0x400, %ax /* 1st meg does not count */
wdenk57b2d802003-06-27 21:31:46 +0000445
Wolfgang Denka1be4762008-05-20 16:00:29 +0200446gs movw %ax, OFFS_AX(%bp) /* return memory size between 1M and 16M in 1kb chunks in AX and CX */
wdenk591dda52002-11-18 00:14:45 +0000447gs movw %ax, OFFS_CX(%bp)
wdenkabda5ca2003-05-31 18:35:21 +0000448gs movw $0, OFFS_BX(%bp) /* set BX and DX to 0*/
wdenk57b2d802003-06-27 21:31:46 +0000449gs movw $0, OFFS_DX(%bp)
wdenk591dda52002-11-18 00:14:45 +0000450gs movw OFFS_FLAGS(%bp), %ax
451 andw $0xfffe, %ax /* clear carry -- function succeeded */
452gs movw %ax, OFFS_FLAGS(%bp)
453 xorw %ax, %ax
454 ret
wdenk57b2d802003-06-27 21:31:46 +0000455
wdenkabda5ca2003-05-31 18:35:21 +0000456e801_more_than_16mb:
wdenk57b2d802003-06-27 21:31:46 +0000457 subw $0x100, %ax /* subtract 16MB */
458
wdenkabda5ca2003-05-31 18:35:21 +0000459gs movw $0x3c00, OFFS_AX(%bp) /* return 0x3c00 (16MB-1MB) in AX and CX */
wdenk591dda52002-11-18 00:14:45 +0000460gs movw $0x3c00, OFFS_CX(%bp)
wdenkabda5ca2003-05-31 18:35:21 +0000461gs movw %ax, OFFS_BX(%bp) /* set BX and DX to number of 64kb chunks above 16MB */
wdenk57b2d802003-06-27 21:31:46 +0000462gs movw %ax, OFFS_DX(%bp)
wdenk591dda52002-11-18 00:14:45 +0000463
464gs movw OFFS_FLAGS(%bp), %ax
465 andw $0xfffe, %ax /* clear carry -- function succeeded */
466gs movw %ax, OFFS_FLAGS(%bp)
467 xorw %ax, %ax
468 ret
469
470Lfunc_88h:
wdenkabda5ca2003-05-31 18:35:21 +0000471cs movw ram_in_64kb_chunks, %ax
472 cmpw $0x100, %ax
473 jna b88_not_more_than16
474 movw $0x100, %ax
475b88_not_more_than16:
wdenk591dda52002-11-18 00:14:45 +0000476 shlw $6, %ax
wdenkabda5ca2003-05-31 18:35:21 +0000477 subw $0x400, %ax /* 1st meg does not count */
wdenk57b2d802003-06-27 21:31:46 +0000478
wdenkabda5ca2003-05-31 18:35:21 +0000479gs movw %ax, OFFS_AX(%bp) /* return number of kilobytes between 16MB and 16MB in ax */
wdenk591dda52002-11-18 00:14:45 +0000480
481gs movw OFFS_FLAGS(%bp), %ax
482 andw $0xfffe, %ax /* clear carry -- function succeeded */
483gs movw %ax, OFFS_FLAGS(%bp)
484
485 xorw %ax, %ax
486 ret
487
488
489/*
490 ************************************************************
491 * BIOS interrupt 16h -- keyboard services
492 ************************************************************
493 */
494bios_16h:
495gs movw OFFS_AX(%bp), %ax
496 shrw $8, %ax
497 cmpw $0x03, %ax
498 je Lfunc_03h
499 movw $0xffff, %ax
500 ret
501Lfunc_03h:
502 xorw %ax, %ax /* do nothing -- function not supported */
503 ret
504
wdenkabda5ca2003-05-31 18:35:21 +0000505/*
506 ************************************************************
507 * BIOS interrupt 1ah -- PCI bios
508 ************************************************************
509 */
510bios_1ah:
511gs movw OFFS_AX(%bp), %ax
512 cmpb $0xb1, %ah
513 je Lfunc_b1h
514 movw $0xffff, %ax
515 ret
516Lfunc_b1h:
517 call realmode_pci_bios
518 xorw %ax, %ax /* do nothing -- function not supported */
519 ret
520
wdenk591dda52002-11-18 00:14:45 +0000521
522.globl ram_in_64kb_chunks
Graeme Russ1aafcc92009-11-24 20:04:19 +1100523.hidden ram_in_64kb_chunks
524.type ram_in_64kb_chunks, @function
wdenk591dda52002-11-18 00:14:45 +0000525ram_in_64kb_chunks:
Wolfgang Denka1be4762008-05-20 16:00:29 +0200526 .word 0
wdenk591dda52002-11-18 00:14:45 +0000527
528.globl bios_equipment
Graeme Russ1aafcc92009-11-24 20:04:19 +1100529.hidden bios_equipment
530.type bios_equipment, @function
wdenk591dda52002-11-18 00:14:45 +0000531bios_equipment:
Wolfgang Denka1be4762008-05-20 16:00:29 +0200532 .word 0