Linux/boot/setup.S

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:
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值