📄 setup.s
字号:
inc dx in al,dx cmp al,#0x20 je isahed cmp al,#0x21 jne noahedisahed: lea si,dscahead lea di,moahead br selmodnoahed: mov dx,#0x3c3 ! Check Chips & Tech. 'clues' in al,dx or al,#0x10 out dx,al mov dx,#0x104 in al,dx mov bl,al mov dx,#0x3c3 in al,dx and al,#0xef out dx,al cmp bl,[idcandt] jne nocant lea si,dsccandt lea di,mocandt br selmodnocant: mov dx,#0x3d4 ! Check Cirrus 'clues' mov al,#0x0c out dx,al inc dx in al,dx mov bl,al xor al,al out dx,al dec dx mov al,#0x1f out dx,al inc dx in al,dx mov bh,al xor ah,ah shl al,#4 mov cx,ax mov al,bh shr al,#4 add cx,ax shl cx,#8 add cx,#6 mov ax,cx mov dx,#0x3c4 out dx,ax inc dx in al,dx and al,al jnz nocirr mov al,bh out dx,al in al,dx cmp al,#0x01 jne nocirr call rst3d4 lea si,dsccirrus lea di,mocirrus br selmodrst3d4: mov dx,#0x3d4 mov al,bl xor ah,ah shl ax,#8 add ax,#0x0c out dx,ax ret nocirr: call rst3d4 ! Check Everex 'clues' mov ax,#0x7000 xor bx,bx int 0x10 cmp al,#0x70 jne noevrx shr dx,#4 cmp dx,#0x678 je istrid cmp dx,#0x236 je istrid lea si,dsceverex lea di,moeverex br selmodistrid: lea cx,ev2tri jmp cxnoevrx: lea si,idgenoa ! Check Genoa 'clues' xor ax,ax seg es mov al,[0x37] mov di,ax mov cx,#0x04 dec si dec dil1: inc si inc di mov al,(si) test al,al jz l2 seg es cmp al,(di)l2: loope l1 cmp cx,#0x00 jne nogen lea si,dscgenoa lea di,mogenoa br selmodnogen: cld lea si,idoakvga mov di,#0x08 mov cx,#0x08 repe cmpsb jne nooak lea si,dscoakvga lea di,mooakvga br selmodnooak: cld lea si,idparadise ! Check Paradise 'clues' mov di,#0x7d mov cx,#0x04 repe cmpsb jne nopara lea si,dscparadise lea di,moparadise br selmodnopara: mov dx,#0x3c4 ! Check Trident 'clues' mov al,#0x0e out dx,al inc dx in al,dx xchg ah,al xor al,al out dx,al in al,dx xchg al,ah mov bl,al ! Strange thing ... in the book this wasn't and bl,#0x02 ! necessary but it worked on my card which jz setb2 ! is a trident. Without it the screen goes and al,#0xfd ! blurred ... jmp clrb2 !setb2: or al,#0x02 !clrb2: out dx,al and ah,#0x0f cmp ah,#0x02 jne notridev2tri: lea si,dsctrident lea di,motrident jmp selmodnotrid: mov dx,#0x3cd ! Check Tseng 'clues' in al,dx ! Could things be this simple ! :-) mov bl,al mov al,#0x55 out dx,al in al,dx mov ah,al mov al,bl out dx,al cmp ah,#0x55 jne notsen lea si,dsctseng lea di,motseng jmp selmodnotsen: mov dx,#0x3cc ! Check Video7 'clues' in al,dx mov dx,#0x3b4 and al,#0x01 jz even7 mov dx,#0x3d4even7: mov al,#0x0c out dx,al inc dx in al,dx mov bl,al mov al,#0x55 out dx,al in al,dx dec dx mov al,#0x1f out dx,al inc dx in al,dx mov bh,al dec dx mov al,#0x0c out dx,al inc dx mov al,bl out dx,al mov al,#0x55 xor al,#0xea cmp al,bh jne novid7 lea si,dscvideo7 lea di,movideo7 jmp selmodnovid7: lea si,dsunknown lea di,mounknownselmod: xor cx,cx mov cl,(di) mov ax,modesave cmp ax,#ASK_VGA je askmod cmp ax,#NORMAL_VGA je askmod cmp al,cl jl gotmode push si lea si,msg4 call prtstr pop siaskmod: push si lea si,msg2 call prtstr pop si push si push cxtbl: pop bx push bx mov al,bl sub al,cl call modepr lodsw xchg al,ah call dprnt xchg ah,al push ax mov al,#0x78 call prnt1 pop ax call dprnt push si lea si,crlf ! print CR+LF call prtstr pop si loop tbl pop cx lea si,msg3 call prtstr pop si add cl,#0x30 jmp nonumnonumb: call beepnonum: call getkey cmp al,#0x30 ! ascii `0' jb nonumb cmp al,#0x3a ! ascii `9' jbe number cmp al,#0x61 ! ascii `a' jb nonumb cmp al,#0x7a ! ascii `z' ja nonumb sub al,#0x27 cmp al,cl jae nonumb sub al,#0x30 jmp gotmodenumber: cmp al,cl jae nonumb sub al,#0x30gotmode: xor ah,ah or al,al beq vga50 push ax dec ax beq vga28 add di,ax mov al,(di) int 0x10 pop ax shl ax,#1 add si,ax lodsw pop ds ret! Routine to print asciiz-string at DS:SIprtstr: lodsb and al,al jz fin call prnt1 jmp prtstrfin: ret! Routine to print a decimal value on screen, the value to be! printed is put in al (i.e 0-255). dprnt: push ax push cx xor ah,ah ! Clear ah mov cl,#0x0a idiv cl cmp al,#0x09 jbe lt100 call dprnt jmp skip10lt100: add al,#0x30 call prnt1skip10: mov al,ah add al,#0x30 call prnt1 pop cx pop ax ret!! Routine to print the mode number key on screen. Mode numbers! 0-9 print the ascii values `0' to '9', 10-35 are represented by! the letters `a' to `z'. This routine prints some spaces around the! mode no.!modepr: push ax cmp al,#0x0a jb digit ! Here is no check for number > 35 add al,#0x27digit: add al,#0x30 mov modenr, al push si lea si, modestring call prtstr pop si pop ax ret! Part of above routine, this one just prints ascii alprnt1: push ax push cx xor bh,bh mov cx,#0x01 mov ah,#0x0e int 0x10 pop cx pop ax retbeep: mov al,#0x07 jmp prnt1 gdt: .word 0,0,0,0 ! dummy .word 0,0,0,0 ! unused .word 0x07FF ! 8Mb - limit=2047 (2048*4096=8Mb) .word 0x0000 ! base address=0 .word 0x9A00 ! code read/exec .word 0x00C0 ! granularity=4096, 386 .word 0x07FF ! 8Mb - limit=2047 (2048*4096=8Mb) .word 0x0000 ! base address=0 .word 0x9200 ! data read/write .word 0x00C0 ! granularity=4096, 386idt_48: .word 0 ! idt limit=0 .word 0,0 ! idt base=0Lgdt_48: .word 0x800 ! gdt limit=2048, 256 GDT entries .word 512+gdt,0x9 ! gdt base = 0X9xxxxmsg1: .ascii "Press <RETURN> to see SVGA-modes available, <SPACE> to continue or wait 30 secs." db 0x0d, 0x0a, 0x0a, 0x00msg2: .ascii "Mode: COLSxROWS:" db 0x0d, 0x0a, 0x0a, 0x00msg3: db 0x0d, 0x0a .ascii "Choose mode by pressing the corresponding number or letter."crlf: db 0x0d, 0x0a, 0x00msg4: .ascii "You passed an undefined mode number to setup. Please choose a new mode." db 0x0d, 0x0a, 0x0a, 0x07, 0x00modestring: .ascii " "modenr: db 0x00 ! mode number .ascii ": " db 0x00 idati: .ascii "761295520"idcandt: .byte 0xa5idgenoa: .byte 0x77, 0x00, 0x99, 0x66idparadise: .ascii "VGA="idoakvga: .ascii "OAK VGA "idf1280: .ascii "Orchid Technology Fahrenheit 1280"id9GXE: .ascii "Graphics Power By"idVRAM: .ascii "Stealth VRAM"! Manufacturer: Numofmodes+2: Mode:! Number of modes is the number of chip-specific svga modes plus the extended! modes available on any vga (currently 2)moati: .byte 0x04, 0x23, 0x33 moahead: .byte 0x07, 0x22, 0x23, 0x24, 0x2f, 0x34mocandt: .byte 0x04, 0x60, 0x61mocirrus: .byte 0x06, 0x1f, 0x20, 0x22, 0x31moeverex: .byte 0x0c, 0x03, 0x04, 0x07, 0x08, 0x0a, 0x0b, 0x16, 0x18, 0x21, 0x40mogenoa: .byte 0x0c, 0x58, 0x5a, 0x60, 0x61, 0x62, 0x63, 0x64, 0x72, 0x74, 0x78moparadise: .byte 0x04, 0x55, 0x54motrident: .byte 0x09, 0x50, 0x51, 0x52, 0x57, 0x58, 0x59, 0x5amotseng: .byte 0x07, 0x26, 0x2a, 0x23, 0x24, 0x22movideo7: .byte 0x08, 0x40, 0x43, 0x44, 0x41, 0x42, 0x45mooakvga: .byte 0x08, 0x00, 0x07, 0x4e, 0x4f, 0x50, 0x51mo9GXE: .byte 0x04, 0x54, 0x55mof1280: .byte 0x04, 0x54, 0x55mounknown: .byte 0x02! msb = Cols lsb = Rows:! The first two modes are standard vga modes available on any vga.! mode 0 is 80x50 and mode 1 is 80x28dscati: .word 0x5032, 0x501c, 0x8419, 0x842cdscahead: .word 0x5032, 0x501c, 0x842c, 0x8419, 0x841c, 0xa032, 0x5042dsccandt: .word 0x5032, 0x501c, 0x8419, 0x8432dsccirrus: .word 0x5032, 0x501c, 0x8419, 0x842c, 0x841e, 0x6425dsceverex: .word 0x5032, 0x501c, 0x5022, 0x503c, 0x642b, 0x644b, 0x8419, 0x842c, 0x501e, 0x641b, 0xa040, 0x841edscgenoa: .word 0x5032, 0x501c, 0x5020, 0x642a, 0x8419, 0x841d, 0x8420, 0x842c, 0x843c, 0x503c, 0x5042, 0x644bdscparadise: .word 0x5032, 0x501c, 0x8419, 0x842bdsctrident: .word 0x5032, 0x501c, 0x501e, 0x502b, 0x503c, 0x8419, 0x841e, 0x842b, 0x843cdsctseng: .word 0x5032, 0x501c, 0x503c, 0x6428, 0x8419, 0x841c, 0x842cdscvideo7: .word 0x5032, 0x501c, 0x502b, 0x503c, 0x643c, 0x8419, 0x842c, 0x841cdscoakvga: .word 0x5032, 0x501c, 0x2819, 0x5019, 0x503c, 0x843c, 0x8419, 0x842bdscf1280: .word 0x5032, 0x501c, 0x842b, 0x8419dsc9GXE: .word 0x5032, 0x501c, 0x842b, 0x8419dsunknown: .word 0x5032, 0x501cmodesave: .word SVGA_MODE .textendtext:.dataenddata:.bssendbss:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -