Linux/boot/setup.S
1 !
2 ! setup.S Copyright (C) 1991, 1992 Linus Torvalds
3 !
4 ! setup.s is responsible for getting the system data from the BIOS,
5 ! and putting them into the appropriate places in system memory.
6 ! both setup.s and system has been loaded by the bootblock.
7 !
8 ! This code asks the bios for memory/disk/other parameters, and
9 ! puts them in a "safe" place: 0x90000-0x901FF, ie where the
10 ! boot-block used to be. It is then up to the protected mode
11 ! system to read them from there before the area is overwritten
12 ! for buffer-blocks.
13 !
14 ! Move PS/2 aux init code to psaux.c
15 ! (troyer@saifr00.cfsat.Honeywell.COM) 03Oct92
16 !
17 ! some changes and additional features by Christoph Niemann, March 1993
18 ! (niemann@rubdv15.ETDV.Ruhr-Uni-Bochum.De)
19 !
20
21 ! NOTE! These had better be the same as in bootsect.s!
22 #include <linux/config.h>
23 #include <linux/segment.h>
24
25 #ifndef SVGA_MODE
26 #define SVGA_MODE ASK_VGA
27 #endif
28
29 INITSEG = DEF_INITSEG ! we move boot here - out of the way
30 SYSSEG = DEF_SYSSEG ! system loaded at 0x10000 (65536).
31 SETUPSEG = DEF_SETUPSEG ! this is the current segment
32
33 .globl begtext, begdata, begbss, endtext, enddata, endbss
34 .text
35 begtext:
36 .data
37 begdata:
38 .bss
39 begbss:
40 .text
41
42 entry start
43 start:
44
45 ! ok, the read went well so we get current cursor position and save it for
46 ! posterity.
47
48 mov ax,#INITSEG ! this is done in bootsect already, but...
49 mov ds,ax
50
51 ! Get memory size (extended mem, kB)
52
53 mov ah,#0x88
54 int 0x15
55 mov [2],ax
56
57 ! set the keyboard repeat rate to the max
58
59 mov ax,#0x0305
60 xor bx,bx ! clear bx
61 int 0x16
62
63 ! check for EGA/VGA and some config parameters
64
65 mov ah,#0x12
66 mov bl,#0x10
67 int 0x10
68 mov [8],ax
69 mov [10],bx
70 mov [12],cx
71 mov ax,#0x5019
72 cmp bl,#0x10
73 je novga
74 mov ax,#0x1a00 ! Added check for EGA/VGA discrimination
75 int 0x10
76 mov bx,ax
77 mov ax,#0x5019
78 cmp bl,#0x1a ! 1a means VGA, anything else EGA or lower
79 jne novga
80 call chsvga
81 novga: mov [14],ax
82 mov ah,#0x03 ! read cursor pos
83 xor bh,bh ! clear bh
84 int 0x10 ! save it in known place, con_init fetches
85 mov [0],dx ! it from 0x90000.
86
87 ! Get video-card data:
88
89 mov ah,#0x0f
90 int 0x10
91 mov [4],bx ! bh = display page
92 mov [6],ax ! al = video mode, ah = window width
93
94 ! Get hd0 data
95
96 xor ax,ax ! clear ax
97 mov ds,ax
98 lds si,[4*0x41]
99 mov ax,#INITSEG
100
mov es,ax
101
mov di,#0x0080
102
mov cx,#0x10
103
cld
104
rep
105
movsb
106
107
! Get hd1 data
108
109
xor ax,ax ! clear ax
110
mov ds,ax
111
lds si,[4*0x46]
112
mov ax,#INITSEG
113
mov es,ax
114
mov di,#0x0090
115
mov cx,#0x10
116
cld
117
rep
118
movsb
119
120
! Check that there IS a hd1 :-)
121
122
mov ax,#0x01500
123
mov dl,#0x81
124
int 0x13
125
jc no_disk1
126
cmp ah,#3
127
je is_disk1
128
no_disk1:
129
mov ax,#INITSEG
130
mov es,ax
131
mov di,#0x0090
132
mov cx,#0x10
133
xor ax,ax ! clear ax
134
cld
135
rep
136
stosb
137
is_disk1:
138
139
! check for PS/2 pointing device
140
141
mov ax,#INITSEG
142
mov ds,ax
143
mov [0x1ff],#0 ! default is no pointing device
144
int 0x11 ! int 0x11: equipment determination
145
test al,#0x04 ! check if pointing device installed
146
jz no_psmouse
147
mov [0x1ff],#0xaa ! device present
148
no_psmouse:
149
! now we want to move to protected mode ...
150
151
cli ! no interrupts allowed !
152
mov al,#0x80 ! disable NMI for the bootup sequence
153
out #0x70,al
154
155
! first we move the system to its rightful place
156
157
mov ax,#0x100 ! start of destination segment
158
mov bx,#0x1000 ! start of source segment
159
cld ! 'direction'=0, movs moves forward
160
do_move:
161
mov es,ax ! destination segment
162
add ax,#0x100
163
cmp ax,#0x9000
164
jz end_move
165
mov ds,bx ! source segment
166
add bx,#0x100
167
sub di,di
168
sub si,si
169
mov cx,#0x800
170
rep
171
movsw
172
jmp do_move
173
174
! then we load the segment descriptors
175
176
end_move:
177
mov ax,#SETUPSEG ! right, forgot this at first. didn't work :-)
178
mov ds,ax
179
lidt idt_48 ! load idt with 0,0
180
lgdt gdt_48 ! load gdt with whatever appropriate
181
182
! that was painless, now we enable A20
183
184
call empty_8042
185
mov al,#0xD1 ! command write
186
out #0x64,al
187
call empty_8042
188
mov al,#0xDF ! A20 on
189
out #0x60,al
190
call empty_8042
191
192
! make sure any possible coprocessor is properly reset..
193
194
xor ax,ax
195
out #0xf0,al
196
call delay
197
out #0xf1,al
198
call delay
199
200
! well, that went ok, I hope. Now we have to reprogram the interrupts :-(
201
! we put them right after the intel-reserved hardware interrupts, at
202
! int 0x20-0x2F. There they won't mess up anything. Sadly IBM really
203
! messed this up with the original PC, and they haven't been able to
204
! rectify it afterwards. Thus the bios puts interrupts at 0x08-0x0f,
205
! which is used for the internal hardware interrupts as well. We just
206
! have to reprogram the 8259's, and it isn't fun.
207
208
mov al,#0x11 ! initialization sequence
209
out #0x20,al ! send it to 8259A-1
210
call delay
211
out #0xA0,al ! and to 8259A-2
212
call delay
213
mov al,#0x20 ! start of hardware int's (0x20)
214
out #0x21,al
215
call delay
216
mov al,#0x28 ! start of hardware int's 2 (0x28)
217
out #0xA1,al
218
call delay
219
mov al,#0x04 ! 8259-1 is master
220
out #0x21,al
221
call delay
222
mov al,#0x02 ! 8259-2 is slave
223
out #0xA1,al
224
call delay
225
mov al,#0x01 ! 8086 mode for both
226
out #0x21,al
227
call delay
228
out #0xA1,al
229
call delay
230
mov al,#0xFF ! mask off all interrupts for now
231
out #0xA1,al
232
call delay
233
mov al,#0xFB ! mask all irq's but irq2 which
234
out #0x21,al ! is cascaded
235
236
! well, that certainly wasn't fun :-(. Hopefully it works, and we don't
237
! need no steenking BIOS anyway (except for the initial loading :-).
238
! The BIOS-routine wants lots of unnecessary data, and it's less
239
! "interesting" anyway. This is how REAL programmers do it.
240
!
241
! Well, now's the time to actually move into protected mode. To make
242
! things as simple as possible, we do no register set-up or anything,
243
! we let the gnu-compiled 32-bit programs do that. We just jump to
244
! absolute address 0x00000, in 32-bit protected mode.
245
!
246
! Note that the short jump isn't strictly needed, althought there are
247
! reasons why it might be a good idea. It won't hurt in any case.
248
!
249
mov ax,#0x0001 ! protected mode (PE) bit
250
lmsw ax ! This is it!
251
jmp flush_instr
252
flush_instr:
253
jmpi 0x1000,KERNEL_CS ! jmp offset 1000 of segment 0x10 (cs)
254
255
! This routine checks that the keyboard command queue is empty
256
! (after emptying the output buffers)
257
!
258
! No timeout is used - if this hangs there is something wrong with
259
! the machine, and we probably couldn't proceed anyway.
260
empty_8042:
261
call delay
262
in al,#0x64 ! 8042 status port
263
test al,#1 ! output buffer?
264
jz no_output
265
call delay
266
in al,#0x60 ! read it
267
jmp empty_8042
268
no_output:
269
test al,#2 ! is input buffer full?
270
jnz empty_8042 ! yes - loop
271
ret
272
!
273
! Read a key and return the (US-)ascii code in al, scan code in ah
274
!
275
getkey:
276
xor ah,ah
277
int 0x16
278
ret
279
280
!
281
! Read a key with a timeout of 30 seconds. The cmos clock is used to get
282
! the time.
283
!
284
getkt:
285
call gettime
286
add al,#30 ! wait 30 seconds
287
cmp al,#60
288
jl lminute
289
sub al,#60
290
lminute:
291
mov cl,al
292
again: mov ah,#0x01
293
int 0x16
294
jnz getkey ! key pressed, so get it
295
call gettime
296
cmp al,cl
297
jne again
298
mov al,#0x20 ! timeout, return default char `space'
299
ret
300
301
!
302
! Flush the keyboard buffer
303
!
304
flush: mov ah,#0x01
305
int 0x16
306
jz empty
307
xor ah,ah
308
int 0x16
309
jmp flush
310
empty: ret
311
312
!
313
! Read the cmos clock. Return the seconds in al
314
!
315
gettime:
316
push cx
317
mov ah,#0x02
318
int 0x1a
319
mov al,dh ! dh contains the seconds
320
and al,#0x0f
321
mov ah,dh
322
mov cl,#0x04
323
shr ah,cl
324
aad
325
pop cx
326
ret
327
328
!
329
! Delay is needed after doing i/o
330
!
331
delay:
332
.word 0x00eb ! jmp $+2
333
ret
334
335
! Routine trying to recognize type of SVGA-board present (if any)
336
! and if it recognize one gives the choices of resolution it offers.
337
! If one is found the resolution chosen is given by al,ah (rows,cols).
338
339
chsvga: cld
340
push ds
341
push cs
342
mov ax,[0x01fa]
343
pop ds
344
mov modesave,ax
345
mov ax,#0xc000
346
mov es,ax
347
mov ax,modesave
348
cmp ax,#NORMAL_VGA
349
je defvga
350
cmp ax,#EXTENDED_VGA
351
je vga50
352
cmp ax,#ASK_VGA
353
jne svga
354
lea si,msg1
355
call prtstr
356
call flush
357
nokey: call getkt
358
cmp al,#0x0d ! enter ?
359
je svga ! yes - svga selection
360
cmp al,#0x20 ! space ?
361
je defvga ! no - repeat
362
call beep
363
jmp nokey
364
defvga: mov ax,#0x5019
365
pop ds
366
ret
367
/* extended vga mode: 80x50 */
368
vga50:
369
mov ax,#0x1112
370
xor bl,bl
371
int 0x10 ! use 8x8 font set (50 lines on VGA)
372
mov ax,#0x1200
373
mov bl,#0x20
374
int 0x10 ! use alternate print screen
375
mov ax,#0x1201
376
mov bl,#0x34
377
int 0x10 ! turn off cursor emulation
378
mov ah,#0x01
379
mov cx,#0x0607
380
int 0x10 ! turn on cursor (scan lines 6 to 7)
381
pop ds
382
mov ax,#0x5032 ! return 80x50
383
ret
384
/* extended vga mode: 80x28 */
385
vga28:
386
pop ax ! clean the stack
387
mov ax,#0x1111
388
xor bl,bl
389
int 0x10 ! use 9x14 fontset (28 lines on VGA)
390
mov ah, #0x01
391
mov cx,#0x0b0c
392
int 0x10 ! turn on cursor (scan lines 11 to 12)
393
pop ds
394
mov ax,#0x501c ! return 80x28
395
ret
396
/* svga modes */
397
svga: cld
398
lea si,id9GXE ! Check for the #9GXE (jyanowit@orixa.mtholyoke.edu,thanks dlm40629@uxa.cso.uiuc.edu)
399
mov di,#0x49 ! id string is at c000:049
400
mov cx,#0x11 ! length of "Graphics Power By"
401
repe
402
cmpsb
403
jne of1280
404
is9GXE: lea si,dsc9GXE ! table of descriptions of video modes for BIOS
405
lea di,mo9GXE ! table of sizes of video modes for my BIOS
406
br selmod ! go ask for video mode
407
of1280: cld
408
lea si,idf1280 ! Check for Orchid F1280 (dingbat@diku.dk)
409
mov di,#0x10a ! id string is at c000:010a
410
mov cx,#0x21 ! length
411
repe
412
cmpsb
413
jne nf1280
414
isVRAM: lea si,dscf1280
415
lea di,mof1280
416
br selmod
417
nf1280: lea si,idVRAM
418
mov di,#0x10a
419
mov cx,#0x0c
420
repe
421
cmpsb
422
je isVRAM
423
cld
424
lea si,idati ! Check ATI 'clues'
425
mov di,#0x31
426
mov cx,#0x09
427
repe
428
cmpsb
429
jne noati
430
lea si,dscati
431
lea di,moati
432
br selmod
433
noati: mov ax,#0x200f ! Check Ahead 'clues'
434
mov dx,#0x3ce
435
out dx,ax
436
inc dx
437
in al,dx
438
cmp al,#0x20
439
je isahed
440
cmp al,#0x21
441
jne noahed
442
isahed: lea si,dscahead
443
lea di,moahead
444
br selmod
445
noahed: mov dx,#0x3c3 ! Check Chips & Tech. 'clues'
446
in al,dx
447
or al,#0x10
448
out dx,al
449
mov dx,#0x104
450
in al,dx
451
mov bl,al
452
mov dx,#0x3c3
453
in al,dx
454
and al,#0xef
455
out dx,al
456
cmp bl,[idcandt]
457
jne nocant
458
lea si,dsccandt
459
lea di,mocandt
460
br selmod
461
nocant: mov dx,#0x3d4 ! Check Cirrus 'clues'
462
mov al,#0x0c
463
out dx,al
464
inc dx
465
in al,dx
466
mov bl,al
467
xor al,al
468
out dx,al
469
dec dx
470
mov al,#0x1f
471
out dx,al
472
inc dx
473
in al,dx
474
mov bh,al
475
xor ah,ah
476
shl al,#4
477
mov cx,ax
478
mov al,bh
479
shr al,#4
480
add cx,ax
481
shl cx,#8
482
add cx,#6
483
mov ax,cx
484
mov dx,#0x3c4
485
out dx,ax
486
inc dx
487
in al,dx
488
and al,al
489
jnz nocirr
490
mov al,bh
491
out dx,al
492
in al,dx
493
cmp al,#0x01
494
jne nocirr
495
call rst3d4
496
lea si,dsccirrus
497
lea di,mocirrus
498
br selmod
499
rst3d4: mov dx,#0x3d4
500
mov al,bl
501
xor ah,ah
502
shl ax,#8
503
add ax,#0x0c
504
out dx,ax
505
ret
506
nocirr: call rst3d4 ! Check Everex 'clues'
507
mov ax,#0x7000
508
xor bx,bx
509
int 0x10
510
cmp al,#0x70
511
jne noevrx
512
shr dx,#4
513
cmp dx,#0x678
514
je istrid
515
cmp dx,#0x236
516
je istrid
517
lea si,dsceverex
518
lea di,moeverex
519
br selmod
520
istrid: lea cx,ev2tri
521
jmp cx
522
noevrx: lea si,idgenoa ! Check Genoa 'clues'
523
xor ax,ax
524
seg es
525
mov al,[0x37]
526
mov di,ax
527
mov cx,#0x04
528
dec si
529
dec di
530
l1: inc si
531
inc di
532
mov al,(si)
533
test al,al
534
jz l2
535
seg es
536
cmp al,(di)
537
l2: loope l1
538
cmp cx,#0x00
539
jne nogen
540
lea si,dscgenoa
541
lea di,mogenoa
542
br selmod
543
nogen: cld
544
lea si,idoakvga
545
mov di,#0x08
546
mov cx,#0x08
547
repe
548
cmpsb
549
jne nooak
550
lea si,dscoakvga
551
lea di,mooakvga
552
br selmod
553
nooak: cld
554
lea si,idparadise ! Check Paradise 'clues'
555
mov di,#0x7d
556
mov cx,#0x04
557
repe
558
cmpsb
559
jne nopara
560
lea si,dscparadise
561
lea di,moparadise
562
br selmod
563
nopara: mov dx,#0x3c4 ! Check Trident 'clues'
564
mov al,#0x0e
565
out dx,al
566
inc dx
567
in al,dx
568
xchg ah,al
569
xor al,al
570
out dx,al
571
in al,dx
572
xchg al,ah
573
mov bl,al ! Strange thing ... in the book this wasn't
574
and bl,#0x02 ! necessary but it worked on my card which
575
jz setb2 ! is a trident. Without it the screen goes
576
and al,#0xfd ! blurred ...
577
jmp clrb2 !
578
setb2: or al,#0x02 !
579
clrb2: out dx,al
580
and ah,#0x0f
581
cmp ah,#0x02
582
jne notrid
583
ev2tri: lea si,dsctrident
584
lea di,motrident
585
jmp selmod
586
notrid: mov dx,#0x3cd ! Check Tseng 'clues'
587
in al,dx ! Could things be this simple ! :-)
588
mov bl,al
589
mov al,#0x55
590
out dx,al
591
in al,dx
592
mov ah,al
593
mov al,bl
594
out dx,al
595
cmp ah,#0x55
596
jne notsen
597
lea si,dsctseng
598
lea di,motseng
599
jmp selmod
600
notsen: mov dx,#0x3cc ! Check Video7 'clues'
601
in al,dx
602
mov dx,#0x3b4
603
and al,#0x01
604
jz even7
605
mov dx,#0x3d4
606
even7: mov al,#0x0c
607
out dx,al
608
inc dx
609
in al,dx
610
mov bl,al
611
mov al,#0x55
612
out dx,al
613
in al,dx
614
dec dx
615
mov al,#0x1f
616
out dx,al
617
inc dx
618
in al,dx
619
mov bh,al
620
dec dx
621
mov al,#0x0c
622
out dx,al
623
inc dx
624
mov al,bl
625
out dx,al
626
mov al,#0x55
627
xor al,#0xea
628
cmp al,bh
629
jne novid7
630
lea si,dscvideo7
631
lea di,movideo7
632
jmp selmod
633
novid7: lea si,dsunknown
634
lea di,mounknown
635
selmod: xor cx,cx
636
mov cl,(di)
637
mov ax,modesave
638
cmp ax,#ASK_VGA
639
je askmod
640
cmp ax,#NORMAL_VGA
641
je askmod
642
cmp al,cl
643
jl gotmode
644
push si
645
lea si,msg4
646
call prtstr
647
pop si
648
askmod: push si
649
lea si,msg2
650
call prtstr
651
pop si
652
push si
653
push cx
654
tbl: pop bx
655
push bx
656
mov al,bl
657
sub al,cl
658
call modepr
659
lodsw
660
xchg al,ah
661
call dprnt
662
xchg ah,al
663
push ax
664
mov al,#0x78
665
call prnt1
666
pop ax
667
call dprnt
668
push si
669
lea si,crlf ! print CR+LF
670
call prtstr
671
pop si
672
loop tbl
673
pop cx
674
lea si,msg3
675
call prtstr
676
pop si
677
add cl,#0x30
678
jmp nonum
679
nonumb: call beep
680
nonum: call getkey
681
cmp al,#0x30 ! ascii `0'
682
jb nonumb
683
cmp al,#0x3a ! ascii `9'
684
jbe number
685
cmp al,#0x61 ! ascii `a'
686
jb nonumb
687
cmp al,#0x7a ! ascii `z'
688
ja nonumb
689
sub al,#0x27
690
cmp al,cl
691
jae nonumb
692
sub al,#0x30
693
jmp gotmode
694
number: cmp al,cl
695
jae nonumb
696
sub al,#0x30
697
gotmode: xor ah,ah
698
or al,al
699
beq vga50
700
push ax
701
dec ax
702
beq vga28
703
add di,ax
704
mov al,(di)
705
int 0x10
706
pop ax
707
shl ax,#1
708
add si,ax
709
lodsw
710
pop ds
711
ret
712
713
! Routine to print asciiz-string at DS:SI
714
715
prtstr: lodsb
716
and al,al
717
jz fin
718
call prnt1
719
jmp prtstr
720
fin: ret
721
722
! Routine to print a decimal value on screen, the value to be
723
! printed is put in al (i.e 0-255).
724
725
dprnt: push ax
726
push cx
727
xor ah,ah ! Clear ah
728
mov cl,#0x0a
729
idiv cl
730
cmp al,#0x09
731
jbe lt100
732
call dprnt
733
jmp skip10
734
lt100: add al,#0x30
735
call prnt1
736
skip10: mov al,ah
737
add al,#0x30
738
call prnt1
739
pop cx
740
pop ax
741
ret
742
743
!
744
! Routine to print the mode number key on screen. Mode numbers
745
! 0-9 print the ascii values `0' to '9', 10-35 are represented by
746
! the letters `a' to `z'. This routine prints some spaces around the
747
! mode no.
748
!
749
750
modepr: push ax
751
cmp al,#0x0a
752
jb digit ! Here is no check for number > 35
753
add al,#0x27
754
digit: add al,#0x30
755
mov modenr, al
756
push si
757
lea si, modestring
758
call prtstr
759
pop si
760
pop ax
761
ret
762
763
! Part of above routine, this one just prints ascii al
764
765
prnt1: push ax
766
push cx
767
xor bh,bh
768
mov cx,#0x01
769
mov ah,#0x0e
770
int 0x10
771
pop cx
772
pop ax
773
ret
774
775
beep: mov al,#0x07
776
jmp prnt1
777
778
gdt:
779
.word 0,0,0,0 ! dummy
780
781
.word 0,0,0,0 ! unused
782
783
.word 0x07FF ! 8Mb - limit=2047 (2048*4096=8Mb)
784
.word 0x0000 ! base address=0
785
.word 0x9A00 ! code read/exec
786
.word 0x00C0 ! granularity=4096, 386
787
788
.word 0x07FF ! 8Mb - limit=2047 (2048*4096=8Mb)
789
.word 0x0000 ! base address=0
790
.word 0x9200 ! data read/write
791
.word 0x00C0 ! granularity=4096, 386
792
793
idt_48:
794
.word 0 ! idt limit=0
795
.word 0,0 ! idt base=0L
796
797
gdt_48:
798
.word 0x800 ! gdt limit=2048, 256 GDT entries
799
.word 512+gdt,0x9 ! gdt base = 0X9xxxx
800
801
msg1: .ascii "Press <RETURN> to see SVGA-modes available, <SPACE> to continue or wait 30 secs."
802
db 0x0d, 0x0a, 0x0a, 0x00
803
msg2: .ascii "Mode: COLSxROWS:"
804
db 0x0d, 0x0a, 0x0a, 0x00
805
msg3: db 0x0d, 0x0a
806
.ascii "Choose mode by pressing the corresponding number or letter."
807
crlf: db 0x0d, 0x0a, 0x00
808
msg4: .ascii "You passed an undefined mode number to setup. Please choose a new mode."
809
db 0x0d, 0x0a, 0x0a, 0x07, 0x00
810
modestring: .ascii " "
811
modenr: db 0x00 ! mode number
812
.ascii ": "
813
db 0x00
814
815
idati: .ascii "761295520"
816
idcandt: .byte 0xa5
817
idgenoa: .byte 0x77, 0x00, 0x99, 0x66
818
idparadise: .ascii "VGA="
819
idoakvga: .ascii "OAK VGA "
820
idf1280: .ascii "Orchid Technology Fahrenheit 1280"
821
id9GXE: .ascii "Graphics Power By"
822
idVRAM: .ascii "Stealth VRAM"
823
824
! Manufacturer: Numofmodes+2: Mode:
825
! Number of modes is the number of chip-specific svga modes plus the extended
826
! modes available on any vga (currently 2)
827
828
moati: .byte 0x04, 0x23, 0x33
829
moahead: .byte 0x07, 0x22, 0x23, 0x24, 0x2f, 0x34
830
mocandt: .byte 0x04, 0x60, 0x61
831
mocirrus: .byte 0x06, 0x1f, 0x20, 0x22, 0x31
832
moeverex: .byte 0x0c, 0x03, 0x04, 0x07, 0x08, 0x0a, 0x0b, 0x16, 0x18, 0x21, 0x40
833
mogenoa: .byte 0x0c, 0x58, 0x5a, 0x60, 0x61, 0x62, 0x63, 0x64, 0x72, 0x74, 0x78
834
moparadise: .byte 0x04, 0x55, 0x54
835
motrident: .byte 0x09, 0x50, 0x51, 0x52, 0x57, 0x58, 0x59, 0x5a
836
motseng: .byte 0x07, 0x26, 0x2a, 0x23, 0x24, 0x22
837
movideo7: .byte 0x08, 0x40, 0x43, 0x44, 0x41, 0x42, 0x45
838
mooakvga: .byte 0x08, 0x00, 0x07, 0x4e, 0x4f, 0x50, 0x51
839
mo9GXE: .byte 0x04, 0x54, 0x55
840
mof1280: .byte 0x04, 0x54, 0x55
841
mounknown: .byte 0x02
842
843
! msb = Cols lsb = Rows:
844
! The first two modes are standard vga modes available on any vga.
845
! mode 0 is 80x50 and mode 1 is 80x28
846
847
dscati: .word 0x5032, 0x501c, 0x8419, 0x842c
848
dscahead: .word 0x5032, 0x501c, 0x842c, 0x8419, 0x841c, 0xa032, 0x5042
849
dsccandt: .word 0x5032, 0x501c, 0x8419, 0x8432
850
dsccirrus: .word 0x5032, 0x501c, 0x8419, 0x842c, 0x841e, 0x6425
851
dsceverex: .word 0x5032, 0x501c, 0x5022, 0x503c, 0x642b, 0x644b, 0x8419, 0x842c, 0x501e, 0x641b, 0xa040, 0x841e
852
dscgenoa: .word 0x5032, 0x501c, 0x5020, 0x642a, 0x8419, 0x841d, 0x8420, 0x842c, 0x843c, 0x503c, 0x5042, 0x644b
853
dscparadise: .word 0x5032, 0x501c, 0x8419, 0x842b
854
dsctrident: .word 0x5032, 0x501c, 0x501e, 0x502b, 0x503c, 0x8419, 0x841e, 0x842b, 0x843c
855
dsctseng: .word 0x5032, 0x501c, 0x503c, 0x6428, 0x8419, 0x841c, 0x842c
856
dscvideo7: .word 0x5032, 0x501c, 0x502b, 0x503c, 0x643c, 0x8419, 0x842c, 0x841c
857
dscoakvga: .word 0x5032, 0x501c, 0x2819, 0x5019, 0x503c, 0x843c, 0x8419, 0x842b
858
dscf1280: .word 0x5032, 0x501c, 0x842b, 0x8419
859
dsc9GXE: .word 0x5032, 0x501c, 0x842b, 0x8419
860
dsunknown: .word 0x5032, 0x501c
861
modesave: .word SVGA_MODE
862
863
864
.text
865
endtext:
866
.data
867
enddata:
868
.bss
869
endbss: