blob: ce8deb5377fc923be0b8eeeb223dcbecb354f712 [file] [log] [blame]
wdenk591dda52002-11-18 00:14:45 +00001/*
2 * (C) Copyright 2002
Albert ARIBAUD60fbc8d2011-08-04 18:45:45 +02003 * 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.section .bios, "ax"
46.code16
47.org 0
wdenk57b2d802003-06-27 21:31:46 +000048 /* a call to f000:0 should warmboot */
wdenkabda5ca2003-05-31 18:35:21 +000049 jmp realmode_reset
wdenk57b2d802003-06-27 21:31:46 +000050
wdenk591dda52002-11-18 00:14:45 +000051.globl rm_int00
Graeme Russ1aafcc92009-11-24 20:04:19 +110052.hidden rm_int00
53.type rm_int00, @function
wdenk591dda52002-11-18 00:14:45 +000054rm_int00:
55 pushw $0
56 jmp any_interrupt16
57.globl rm_int01
Graeme Russ1aafcc92009-11-24 20:04:19 +110058.hidden rm_int01
59.type rm_int01, @function
wdenk591dda52002-11-18 00:14:45 +000060rm_int01:
61 pushw $1
62 jmp any_interrupt16
63.globl rm_int02
Graeme Russ1aafcc92009-11-24 20:04:19 +110064.hidden rm_int02
65.type rm_int02, @function
wdenk591dda52002-11-18 00:14:45 +000066rm_int02:
67 pushw $2
68 jmp any_interrupt16
69.globl rm_int03
Graeme Russ1aafcc92009-11-24 20:04:19 +110070.hidden rm_int03
71.type rm_int03, @function
wdenk591dda52002-11-18 00:14:45 +000072rm_int03:
73 pushw $3
74 jmp any_interrupt16
75.globl rm_int04
Graeme Russ1aafcc92009-11-24 20:04:19 +110076.hidden rm_int04
77.type rm_int04, @function
wdenk591dda52002-11-18 00:14:45 +000078rm_int04:
79 pushw $4
80 jmp any_interrupt16
81.globl rm_int05
Graeme Russ1aafcc92009-11-24 20:04:19 +110082.hidden rm_int05
83.type rm_int05, @function
wdenk591dda52002-11-18 00:14:45 +000084rm_int05:
85 pushw $5
86 jmp any_interrupt16
87.globl rm_int06
Graeme Russ1aafcc92009-11-24 20:04:19 +110088.hidden rm_int06
89.type rm_int06, @function
wdenk591dda52002-11-18 00:14:45 +000090rm_int06:
91 pushw $6
92 jmp any_interrupt16
93.globl rm_int07
Graeme Russ1aafcc92009-11-24 20:04:19 +110094.hidden rm_int07
95.type rm_int07, @function
wdenk591dda52002-11-18 00:14:45 +000096rm_int07:
97 pushw $7
98 jmp any_interrupt16
99.globl rm_int08
Graeme Russ1aafcc92009-11-24 20:04:19 +1100100.hidden rm_int08
101.type rm_int08, @function
wdenk591dda52002-11-18 00:14:45 +0000102rm_int08:
103 pushw $8
104 jmp any_interrupt16
105.globl rm_int09
Graeme Russ1aafcc92009-11-24 20:04:19 +1100106.hidden rm_int09
107.type rm_int09, @function
wdenk591dda52002-11-18 00:14:45 +0000108rm_int09:
109 pushw $9
110 jmp any_interrupt16
111.globl rm_int0a
Graeme Russ1aafcc92009-11-24 20:04:19 +1100112.hidden rm_int0a
113.type rm_int0a, @function
wdenk591dda52002-11-18 00:14:45 +0000114rm_int0a:
115 pushw $10
116 jmp any_interrupt16
117.globl rm_int0b
Graeme Russ1aafcc92009-11-24 20:04:19 +1100118.hidden rm_int0b
119.type rm_int0b, @function
wdenk591dda52002-11-18 00:14:45 +0000120rm_int0b:
121 pushw $11
122 jmp any_interrupt16
123.globl rm_int0c
Graeme Russ1aafcc92009-11-24 20:04:19 +1100124.hidden rm_int0c
125.type rm_int0c, @function
wdenk591dda52002-11-18 00:14:45 +0000126rm_int0c:
127 pushw $12
128 jmp any_interrupt16
129.globl rm_int0d
Graeme Russ1aafcc92009-11-24 20:04:19 +1100130.hidden rm_int0d
131.type rm_int0d, @function
wdenk591dda52002-11-18 00:14:45 +0000132rm_int0d:
133 pushw $13
134 jmp any_interrupt16
135.globl rm_int0e
Graeme Russ1aafcc92009-11-24 20:04:19 +1100136.hidden rm_int0e
137.type rm_int0e, @function
wdenk591dda52002-11-18 00:14:45 +0000138rm_int0e:
139 pushw $14
140 jmp any_interrupt16
141.globl rm_int0f
Graeme Russ1aafcc92009-11-24 20:04:19 +1100142.hidden rm_int0f
143.type rm_int0f, @function
wdenk591dda52002-11-18 00:14:45 +0000144rm_int0f:
145 pushw $15
146 jmp any_interrupt16
147.globl rm_int10
Graeme Russ1aafcc92009-11-24 20:04:19 +1100148.hidden rm_int10
149.type rm_int10, @function
wdenk591dda52002-11-18 00:14:45 +0000150rm_int10:
151 pushw $16
152 jmp any_interrupt16
153.globl rm_int11
Graeme Russ1aafcc92009-11-24 20:04:19 +1100154.hidden rm_int11
155.type rm_int11, @function
wdenk591dda52002-11-18 00:14:45 +0000156rm_int11:
157 pushw $17
158 jmp any_interrupt16
159.globl rm_int12
Graeme Russ1aafcc92009-11-24 20:04:19 +1100160.hidden rm_int12
161.type rm_int12, @function
wdenk591dda52002-11-18 00:14:45 +0000162rm_int12:
163 pushw $18
164 jmp any_interrupt16
165.globl rm_int13
Graeme Russ1aafcc92009-11-24 20:04:19 +1100166.hidden rm_int13
167.type rm_int13, @function
wdenk591dda52002-11-18 00:14:45 +0000168rm_int13:
169 pushw $19
170 jmp any_interrupt16
171.globl rm_int14
Graeme Russ1aafcc92009-11-24 20:04:19 +1100172.hidden rm_int14
173.type rm_int14, @function
wdenk591dda52002-11-18 00:14:45 +0000174rm_int14:
175 pushw $20
176 jmp any_interrupt16
177.globl rm_int15
Graeme Russ1aafcc92009-11-24 20:04:19 +1100178.hidden rm_int15
179.type rm_int15, @function
wdenk591dda52002-11-18 00:14:45 +0000180rm_int15:
181 pushw $21
182 jmp any_interrupt16
183.globl rm_int16
Graeme Russ1aafcc92009-11-24 20:04:19 +1100184.hidden rm_int16
185.type rm_int16, @function
wdenk591dda52002-11-18 00:14:45 +0000186rm_int16:
187 pushw $22
188 jmp any_interrupt16
189.globl rm_int17
Graeme Russ1aafcc92009-11-24 20:04:19 +1100190.hidden rm_int17
191.type rm_int17, @function
wdenk591dda52002-11-18 00:14:45 +0000192rm_int17:
193 pushw $23
194 jmp any_interrupt16
195.globl rm_int18
Graeme Russ1aafcc92009-11-24 20:04:19 +1100196.hidden rm_int18
197.type rm_int18, @function
wdenk591dda52002-11-18 00:14:45 +0000198rm_int18:
199 pushw $24
200 jmp any_interrupt16
201.globl rm_int19
Graeme Russ1aafcc92009-11-24 20:04:19 +1100202.hidden rm_int19
203.type rm_int19, @function
wdenk591dda52002-11-18 00:14:45 +0000204rm_int19:
205 pushw $25
206 jmp any_interrupt16
207.globl rm_int1a
Graeme Russ1aafcc92009-11-24 20:04:19 +1100208.hidden rm_int1a
209.type rm_int1a, @function
wdenk591dda52002-11-18 00:14:45 +0000210rm_int1a:
211 pushw $26
212 jmp any_interrupt16
213.globl rm_int1b
Graeme Russ1aafcc92009-11-24 20:04:19 +1100214.hidden rm_int1b
215.type rm_int1b, @function
wdenk591dda52002-11-18 00:14:45 +0000216rm_int1b:
217 pushw $27
218 jmp any_interrupt16
219.globl rm_int1c
Graeme Russ1aafcc92009-11-24 20:04:19 +1100220.hidden rm_int1c
221.type rm_int1c, @function
wdenk591dda52002-11-18 00:14:45 +0000222rm_int1c:
223 pushw $28
224 jmp any_interrupt16
225.globl rm_int1d
Graeme Russ1aafcc92009-11-24 20:04:19 +1100226.hidden rm_int1d
227.type rm_int1d, @function
wdenk591dda52002-11-18 00:14:45 +0000228rm_int1d:
229 pushw $29
230 jmp any_interrupt16
231.globl rm_int1e
Graeme Russ1aafcc92009-11-24 20:04:19 +1100232.hidden rm_int1e
233.type rm_int1e, @function
wdenk591dda52002-11-18 00:14:45 +0000234rm_int1e:
235 pushw $30
236 jmp any_interrupt16
237.globl rm_int1f
Graeme Russ1aafcc92009-11-24 20:04:19 +1100238.hidden rm_int1f
239.type rm_int1f, @function
wdenk591dda52002-11-18 00:14:45 +0000240rm_int1f:
241 pushw $31
242 jmp any_interrupt16
243.globl rm_def_int
Graeme Russ1aafcc92009-11-24 20:04:19 +1100244.hidden rm_def_int
245.type rm_def_int, @function
wdenk591dda52002-11-18 00:14:45 +0000246rm_def_int:
247 iret
248
wdenk57b2d802003-06-27 21:31:46 +0000249
wdenk591dda52002-11-18 00:14:45 +0000250 /*
251 * All interrupt jumptable entries jump to here
252 * after pushing the interrupt vector number onto the
253 * stack.
254 */
255any_interrupt16:
wdenk57b2d802003-06-27 21:31:46 +0000256 MAKE_BIOS_STACK
wdenk591dda52002-11-18 00:14:45 +0000257
258gs movw OFFS_VECTOR(%bp), %ax
259 cmpw $0x10, %ax
wdenk57b2d802003-06-27 21:31:46 +0000260 je Lint_10h
wdenk591dda52002-11-18 00:14:45 +0000261 cmpw $0x11, %ax
262 je Lint_11h
wdenkabda5ca2003-05-31 18:35:21 +0000263 cmpw $0x12, %ax
264 je Lint_12h
wdenk591dda52002-11-18 00:14:45 +0000265 cmpw $0x13, %ax
266 je Lint_13h
267 cmpw $0x15, %ax
268 je Lint_15h
269 cmpw $0x16, %ax
270 je Lint_16h
wdenkabda5ca2003-05-31 18:35:21 +0000271 cmpw $0x1a, %ax
272 je Lint_1ah
wdenk591dda52002-11-18 00:14:45 +0000273 movw $0xffff, %ax
274 jmp Lout
275Lint_10h: /* VGA BIOS services */
276 call bios_10h
277 jmp Lout
wdenk57b2d802003-06-27 21:31:46 +0000278Lint_11h:
wdenk591dda52002-11-18 00:14:45 +0000279 call bios_11h
280 jmp Lout
wdenk57b2d802003-06-27 21:31:46 +0000281Lint_12h:
wdenkabda5ca2003-05-31 18:35:21 +0000282 call bios_12h
283 jmp Lout
wdenk591dda52002-11-18 00:14:45 +0000284Lint_13h: /* BIOS disk services */
285 call bios_13h
286 jmp Lout
287Lint_15h: /* Misc. BIOS services */
288 call bios_15h
289 jmp Lout
290Lint_16h: /* keyboard services */
291 call bios_16h
292 jmp Lout
wdenkabda5ca2003-05-31 18:35:21 +0000293Lint_1ah: /* PCI bios */
294 call bios_1ah
295 jmp Lout
wdenk57b2d802003-06-27 21:31:46 +0000296Lout:
wdenk591dda52002-11-18 00:14:45 +0000297 cmpw $0, %ax
298 je Lhandeled
wdenk57b2d802003-06-27 21:31:46 +0000299
wdenk591dda52002-11-18 00:14:45 +0000300 /* Insert code for unhandeled INTs here.
301 *
wdenk57b2d802003-06-27 21:31:46 +0000302 * ROLO prints a message to the console
wdenk591dda52002-11-18 00:14:45 +0000303 * (we could do that but then we're in 16bit mode
304 * so we'll have to get back into 32bit mode
305 * to use the console I/O routines (if we do this
306 * we shuls make int 0x10 and int 0x16 work as well))
307 */
308Lhandeled:
wdenkabda5ca2003-05-31 18:35:21 +0000309 RESTORE_CALLERS_STACK
wdenk591dda52002-11-18 00:14:45 +0000310 addw $2,%sp /* dump vector number */
311 iret /* return from interrupt */
312
313
314/*
315 ************************************************************
Wolfgang Denka1be4762008-05-20 16:00:29 +0200316 * BIOS interrupt 10h -- VGA services
wdenk591dda52002-11-18 00:14:45 +0000317 ************************************************************
318 */
319bios_10h:
320gs movw OFFS_AX(%bp), %ax
321 shrw $8, %ax
322 cmpw $0x3, %ax
323 je Lcur_pos
324 cmpw $0xf, %ax
325 je Lvid_state
326 cmpw $0x12, %ax
327 je Lvid_cfg
328 movw $0xffff, %ax
329 ret
330Lcur_pos: /* Read Cursor Position and Size */
331gs movw $0, OFFS_CX(%bp)
332gs movw $0, OFFS_DX(%bp)
333 xorw %ax, %ax
334 ret
335Lvid_state: /* Get Video State */
336gs movw $(80 << 8|0x03), OFFS_AX(%bp) /* 80 columns, 80x25, 16 colors */
337gs movw $0, OFFS_BX(%bp)
338 xorw %ax, %ax
339 ret
340Lvid_cfg: /* Video Subsystem Configuration (EGA/VGA) */
341gs movw $0x10, OFFS_BX(%bp) /* indicate CGA/MDA/HGA */
342 xorw %ax, %ax
343 ret
344
345
346/*
347 ************************************************************
348 * BIOS interrupt 11h -- Equipment determination
349 ************************************************************
350 */
351
352bios_11h:
wdenkabda5ca2003-05-31 18:35:21 +0000353cs movw bios_equipment, %ax
wdenk57b2d802003-06-27 21:31:46 +0000354gs movw %ax, OFFS_AX(%bp)
wdenk591dda52002-11-18 00:14:45 +0000355 xorw %ax, %ax
356 ret
357
358
359/*
360 ************************************************************
Wolfgang Denka1be4762008-05-20 16:00:29 +0200361 * BIOS interrupt 12h -- Get Memory Size
wdenkabda5ca2003-05-31 18:35:21 +0000362 ************************************************************
363 */
364bios_12h:
365cs movw ram_in_64kb_chunks, %ax
366 cmpw $0xa, %ax
367 ja b12_more_than_640k
368 shlw $6, %ax
369 jmp b12_return
370b12_more_than_640k:
371 movw $0x280, %ax
372b12_return:
373gs movw %ax, OFFS_AX(%bp) /* return number of kilobytes in ax */
374
375gs movw OFFS_FLAGS(%bp), %ax
376 andw $0xfffe, %ax /* clear carry -- function succeeded */
377gs movw %ax, OFFS_FLAGS(%bp)
378
379 xorw %ax, %ax
380 ret
381
382
383/*
384 ************************************************************
wdenk591dda52002-11-18 00:14:45 +0000385 * BIOS interrupt 13h -- Disk services
386 ************************************************************
387 */
388bios_13h:
389gs movw OFFS_AX(%bp), %ax
390 shrw $8, %ax
391 cmpw $0x15, %ax
392 je Lfunc_15h
393 movw $0xffff, %ax
394 ret
wdenk57b2d802003-06-27 21:31:46 +0000395Lfunc_15h:
wdenk591dda52002-11-18 00:14:45 +0000396gs movw OFFS_AX(%bp), %ax
397 andw $0xff, %ax /* return AH=0->drive not present */
398gs movw %ax, OFFS_AX(%bp)
399 xorw %ax, %ax
400 ret
wdenk57b2d802003-06-27 21:31:46 +0000401
wdenk591dda52002-11-18 00:14:45 +0000402
403/*
404 ***********************************************************
405 * BIOS interrupt 15h -- Miscellaneous services
406 ***********************************************************
407 */
408bios_15h:
409gs movw OFFS_AX(%bp), %ax
410 shrw $8, %ax
411 cmpw $0xc0, %ax
412 je Lfunc_c0h
413 cmpw $0xe8, %ax
414 je Lfunc_e8h
415 cmpw $0x88, %ax
416 je Lfunc_88h
417 movw $0xffff, %ax
418 ret
419
Wolfgang Denka1be4762008-05-20 16:00:29 +0200420Lfunc_c0h: /* Return System Configuration Parameters (PS2 only) */
wdenk591dda52002-11-18 00:14:45 +0000421gs movw OFFS_FLAGS(%bp), %ax
422 orw $1, %ax /* return carry -- function not supported */
423gs movw %ax, OFFS_FLAGS(%bp)
424 xorw %ax, %ax
425 ret
wdenk57b2d802003-06-27 21:31:46 +0000426
wdenk591dda52002-11-18 00:14:45 +0000427Lfunc_e8h:
428gs movw OFFS_AX(%bp), %ax
429 andw $0xff, %ax
430 cmpw $1, %ax
431 je Lfunc_e801h
432gs movw OFFS_FLAGS(%bp), %ax
433 orw $1, %ax /* return carry -- function not supported */
434gs movw %ax, OFFS_FLAGS(%bp)
435 xorw %ax, %ax
436 ret
wdenk57b2d802003-06-27 21:31:46 +0000437
wdenk591dda52002-11-18 00:14:45 +0000438Lfunc_e801h: /* Get memory size for >64M Configurations */
wdenkabda5ca2003-05-31 18:35:21 +0000439cs movw ram_in_64kb_chunks, %ax
440 cmpw $0x100, %ax
441 ja e801_more_than_16mb
442 shlw $6, %ax /* multiply by 64 */
443 subw $0x400, %ax /* 1st meg does not count */
wdenk57b2d802003-06-27 21:31:46 +0000444
Wolfgang Denka1be4762008-05-20 16:00:29 +0200445gs 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 +0000446gs movw %ax, OFFS_CX(%bp)
wdenkabda5ca2003-05-31 18:35:21 +0000447gs movw $0, OFFS_BX(%bp) /* set BX and DX to 0*/
wdenk57b2d802003-06-27 21:31:46 +0000448gs movw $0, OFFS_DX(%bp)
wdenk591dda52002-11-18 00:14:45 +0000449gs movw OFFS_FLAGS(%bp), %ax
450 andw $0xfffe, %ax /* clear carry -- function succeeded */
451gs movw %ax, OFFS_FLAGS(%bp)
452 xorw %ax, %ax
453 ret
wdenk57b2d802003-06-27 21:31:46 +0000454
wdenkabda5ca2003-05-31 18:35:21 +0000455e801_more_than_16mb:
wdenk57b2d802003-06-27 21:31:46 +0000456 subw $0x100, %ax /* subtract 16MB */
457
wdenkabda5ca2003-05-31 18:35:21 +0000458gs movw $0x3c00, OFFS_AX(%bp) /* return 0x3c00 (16MB-1MB) in AX and CX */
wdenk591dda52002-11-18 00:14:45 +0000459gs movw $0x3c00, OFFS_CX(%bp)
wdenkabda5ca2003-05-31 18:35:21 +0000460gs movw %ax, OFFS_BX(%bp) /* set BX and DX to number of 64kb chunks above 16MB */
wdenk57b2d802003-06-27 21:31:46 +0000461gs movw %ax, OFFS_DX(%bp)
wdenk591dda52002-11-18 00:14:45 +0000462
463gs movw OFFS_FLAGS(%bp), %ax
464 andw $0xfffe, %ax /* clear carry -- function succeeded */
465gs movw %ax, OFFS_FLAGS(%bp)
466 xorw %ax, %ax
467 ret
468
469Lfunc_88h:
wdenkabda5ca2003-05-31 18:35:21 +0000470cs movw ram_in_64kb_chunks, %ax
471 cmpw $0x100, %ax
472 jna b88_not_more_than16
473 movw $0x100, %ax
474b88_not_more_than16:
wdenk591dda52002-11-18 00:14:45 +0000475 shlw $6, %ax
wdenkabda5ca2003-05-31 18:35:21 +0000476 subw $0x400, %ax /* 1st meg does not count */
wdenk57b2d802003-06-27 21:31:46 +0000477
wdenkabda5ca2003-05-31 18:35:21 +0000478gs movw %ax, OFFS_AX(%bp) /* return number of kilobytes between 16MB and 16MB in ax */
wdenk591dda52002-11-18 00:14:45 +0000479
480gs movw OFFS_FLAGS(%bp), %ax
481 andw $0xfffe, %ax /* clear carry -- function succeeded */
482gs movw %ax, OFFS_FLAGS(%bp)
483
484 xorw %ax, %ax
485 ret
486
487
488/*
489 ************************************************************
490 * BIOS interrupt 16h -- keyboard services
491 ************************************************************
492 */
493bios_16h:
494gs movw OFFS_AX(%bp), %ax
495 shrw $8, %ax
496 cmpw $0x03, %ax
497 je Lfunc_03h
498 movw $0xffff, %ax
499 ret
500Lfunc_03h:
501 xorw %ax, %ax /* do nothing -- function not supported */
502 ret
503
wdenkabda5ca2003-05-31 18:35:21 +0000504/*
505 ************************************************************
506 * BIOS interrupt 1ah -- PCI bios
507 ************************************************************
508 */
509bios_1ah:
510gs movw OFFS_AX(%bp), %ax
511 cmpb $0xb1, %ah
512 je Lfunc_b1h
513 movw $0xffff, %ax
514 ret
515Lfunc_b1h:
516 call realmode_pci_bios
517 xorw %ax, %ax /* do nothing -- function not supported */
518 ret
519
wdenk591dda52002-11-18 00:14:45 +0000520
521.globl ram_in_64kb_chunks
Graeme Russ1aafcc92009-11-24 20:04:19 +1100522.hidden ram_in_64kb_chunks
523.type ram_in_64kb_chunks, @function
wdenk591dda52002-11-18 00:14:45 +0000524ram_in_64kb_chunks:
Wolfgang Denka1be4762008-05-20 16:00:29 +0200525 .word 0
wdenk591dda52002-11-18 00:14:45 +0000526
527.globl bios_equipment
Graeme Russ1aafcc92009-11-24 20:04:19 +1100528.hidden bios_equipment
529.type bios_equipment, @function
wdenk591dda52002-11-18 00:14:45 +0000530bios_equipment:
Wolfgang Denka1be4762008-05-20 16:00:29 +0200531 .word 0