📄 video.s
字号:
atiok: retidati: .ascii "761295520"ati_md: .byte 0x23, 0x19, 0x84 .byte 0x33, 0x2c, 0x84 .byte 0x22, 0x1e, 0x64 .byte 0x21, 0x19, 0x64 .byte 0x58, 0x21, 0x50 .byte 0x5b, 0x1e, 0x50 .byte 0 .ascii "ATI" .byte 0# AHEADahead_test: movw $0x200f, %ax movw $0x3ce, %dx outw %ax, %dx incw %dx inb %dx, %al cmpb $0x20, %al je isahed cmpb $0x21, %al je isahed xorw %bp, %bpisahed: retahead_md: .byte 0x22, 0x2c, 0x84 .byte 0x23, 0x19, 0x84 .byte 0x24, 0x1c, 0x84 .byte 0x2f, 0x32, 0xa0 .byte 0x32, 0x22, 0x50 .byte 0x34, 0x42, 0x50 .byte 0 .ascii "Ahead" .byte 0# Chips & Tech.chips_test: movw $0x3c3, %dx inb %dx, %al orb $0x10, %al outb %al, %dx movw $0x104, %dx inb %dx, %al movb %al, %bl movw $0x3c3, %dx inb %dx, %al andb $0xef, %al outb %al, %dx cmpb $0xa5, %bl je cantok xorw %bp, %bpcantok: retchips_md: .byte 0x60, 0x19, 0x84 .byte 0x61, 0x32, 0x84 .byte 0 .ascii "Chips & Technologies" .byte 0# Cirrus Logic 5X0cirrus1_test: movw $0x3d4, %dx movb $0x0c, %al outb %al, %dx incw %dx inb %dx, %al movb %al, %bl xorb %al, %al outb %al, %dx decw %dx movb $0x1f, %al outb %al, %dx incw %dx inb %dx, %al movb %al, %bh xorb %ah, %ah shlb $4, %al movw %ax, %cx movb %bh, %al shrb $4, %al addw %ax, %cx shlw $8, %cx addw $6, %cx movw %cx, %ax movw $0x3c4, %dx outw %ax, %dx incw %dx inb %dx, %al andb %al, %al jnz nocirr movb %bh, %al outb %al, %dx inb %dx, %al cmpb $0x01, %al je iscirrnocirr: xorw %bp, %bpiscirr: movw $0x3d4, %dx movb %bl, %al xorb %ah, %ah shlw $8, %ax addw $0x0c, %ax outw %ax, %dx retcirrus1_md: .byte 0x1f, 0x19, 0x84 .byte 0x20, 0x2c, 0x84 .byte 0x22, 0x1e, 0x84 .byte 0x31, 0x25, 0x64 .byte 0 .ascii "Cirrus Logic 5X0" .byte 0# Cirrus Logic 54XXcirrus5_test: movw $0x3c4, %dx movb $6, %al call inidx movb %al, %bl # BL=backup movw $6, %ax call tstidx cmpb $0x0f, %al jne c5fail movw $0x1206, %ax call tstidx cmpb $0x12, %al jne c5fail movb $0x1e, %al call inidx movb %al, %bh movb %bh, %ah andb $0xc0, %ah movb $0x1e, %al call tstidx andb $0x3f, %al jne c5xx movb $0x1e, %al movb %bh, %ah orb $0x3f, %ah call tstidx xorb $0x3f, %al andb $0x3f, %alc5xx: pushf movb $0x1e, %al movb %bh, %ah outw %ax, %dx popf je c5donec5fail: xorw %bp, %bpc5done: movb $6, %al movb %bl, %ah outw %ax, %dx retcirrus5_md: .byte 0x14, 0x19, 0x84 .byte 0x54, 0x2b, 0x84 .byte 0 .ascii "Cirrus Logic 54XX" .byte 0# Cirrus Logic 64XX -- no known extra modes, but must be identified, because# it's misidentified by the Ahead test.cirrus6_test: movw $0x3ce, %dx movb $0x0a, %al call inidx movb %al, %bl # BL=backup movw $0xce0a, %ax call tstidx orb %al, %al jne c2fail movw $0xec0a, %ax call tstidx cmpb $0x01, %al jne c2fail movb $0xaa, %al call inidx # 4X, 5X, 7X and 8X are valid 64XX chip ID's. shrb $4, %al subb $4, %al jz c6done decb %al jz c6done subb $2, %al jz c6done decb %al jz c6done c2fail: xorw %bp, %bpc6done: movb $0x0a, %al movb %bl, %ah outw %ax, %dx retcirrus6_md: .byte 0 .ascii "Cirrus Logic 64XX" .byte 0# Everex / Tridenteverex_test: movw $0x7000, %ax xorw %bx, %bx int $0x10 cmpb $0x70, %al jne noevrx shrw $4, %dx cmpw $0x678, %dx je evtrid cmpw $0x236, %dx jne evrxokevtrid: leaw trident_md, %bpevrxok: retnoevrx: xorw %bp, %bp reteverex_md: .byte 0x03, 0x22, 0x50 .byte 0x04, 0x3c, 0x50 .byte 0x07, 0x2b, 0x64 .byte 0x08, 0x4b, 0x64 .byte 0x0a, 0x19, 0x84 .byte 0x0b, 0x2c, 0x84 .byte 0x16, 0x1e, 0x50 .byte 0x18, 0x1b, 0x64 .byte 0x21, 0x40, 0xa0 .byte 0x40, 0x1e, 0x84 .byte 0 .ascii "Everex/Trident" .byte 0# Genoa.genoa_test: leaw idgenoa, %si # Check Genoa 'clues' xorw %ax, %ax movb %es:(0x37), %al movw %ax, %di movw $0x04, %cx decw %si decw %dil1: incw %si incw %di movb (%si), %al testb %al, %al jz l2 cmpb %es:(%di), %all2: loope l1 orw %cx, %cx je isgen xorw %bp, %bpisgen: retidgenoa: .byte 0x77, 0x00, 0x99, 0x66genoa_md: .byte 0x58, 0x20, 0x50 .byte 0x5a, 0x2a, 0x64 .byte 0x60, 0x19, 0x84 .byte 0x61, 0x1d, 0x84 .byte 0x62, 0x20, 0x84 .byte 0x63, 0x2c, 0x84 .byte 0x64, 0x3c, 0x84 .byte 0x6b, 0x4f, 0x64 .byte 0x72, 0x3c, 0x50 .byte 0x74, 0x42, 0x50 .byte 0x78, 0x4b, 0x64 .byte 0 .ascii "Genoa" .byte 0# OAKoak_test: leaw idoakvga, %si movw $0x08, %di movw $0x08, %cx repe cmpsb je isoak xorw %bp, %bpisoak: retidoakvga: .ascii "OAK VGA "oak_md: .byte 0x4e, 0x3c, 0x50 .byte 0x4f, 0x3c, 0x84 .byte 0x50, 0x19, 0x84 .byte 0x51, 0x2b, 0x84 .byte 0 .ascii "OAK" .byte 0# WD Paradise.paradise_test: leaw idparadise, %si movw $0x7d, %di movw $0x04, %cx repe cmpsb je ispara xorw %bp, %bpispara: retidparadise: .ascii "VGA="paradise_md: .byte 0x41, 0x22, 0x50 .byte 0x47, 0x1c, 0x84 .byte 0x55, 0x19, 0x84 .byte 0x54, 0x2c, 0x84 .byte 0 .ascii "Paradise" .byte 0# Trident.trident_test: movw $0x3c4, %dx movb $0x0e, %al outb %al, %dx incw %dx inb %dx, %al xchgb %al, %ah xorb %al, %al outb %al, %dx inb %dx, %al xchgb %ah, %al movb %al, %bl # Strange thing ... in the book this wasn't andb $0x02, %bl # necessary but it worked on my card which jz setb2 # is a trident. Without it the screen goes # blurred ... andb $0xfd, %al jmp clrb2 setb2: orb $0x02, %al clrb2: outb %al, %dx andb $0x0f, %ah cmpb $0x02, %ah je istrid xorw %bp, %bpistrid: rettrident_md: .byte 0x50, 0x1e, 0x50 .byte 0x51, 0x2b, 0x50 .byte 0x52, 0x3c, 0x50 .byte 0x57, 0x19, 0x84 .byte 0x58, 0x1e, 0x84 .byte 0x59, 0x2b, 0x84 .byte 0x5a, 0x3c, 0x84 .byte 0 .ascii "Trident" .byte 0# Tseng.tseng_test: movw $0x3cd, %dx inb %dx, %al # Could things be this simple ! :-) movb %al, %bl movb $0x55, %al outb %al, %dx inb %dx, %al movb %al, %ah movb %bl, %al outb %al, %dx cmpb $0x55, %ah je istsenisnot: xorw %bp, %bpistsen: rettseng_md: .byte 0x26, 0x3c, 0x50 .byte 0x2a, 0x28, 0x64 .byte 0x23, 0x19, 0x84 .byte 0x24, 0x1c, 0x84 .byte 0x22, 0x2c, 0x84 .byte 0x21, 0x3c, 0x84 .byte 0 .ascii "Tseng" .byte 0# Video7.video7_test: movw $0x3cc, %dx inb %dx, %al movw $0x3b4, %dx andb $0x01, %al jz even7 movw $0x3d4, %dxeven7: movb $0x0c, %al outb %al, %dx incw %dx inb %dx, %al movb %al, %bl movb $0x55, %al outb %al, %dx inb %dx, %al decw %dx movb $0x1f, %al outb %al, %dx incw %dx inb %dx, %al movb %al, %bh decw %dx movb $0x0c, %al outb %al, %dx incw %dx movb %bl, %al outb %al, %dx movb $0x55, %al xorb $0xea, %al cmpb %bh, %al jne isnot movb $VIDEO_FIRST_V7>>8, svga_prefix # Use special mode switching retvideo7_md: .byte 0x40, 0x2b, 0x50 .byte 0x43, 0x3c, 0x50 .byte 0x44, 0x3c, 0x64 .byte 0x41, 0x19, 0x84 .byte 0x42, 0x2c, 0x84 .byte 0x45, 0x1c, 0x84 .byte 0 .ascii "Video 7" .byte 0# Realtek VGArealtek_test: leaw idrtvga, %si movw $0x45, %di movw $0x0b, %cx repe cmpsb je isrt xorw %bp, %bpisrt: retidrtvga: .ascii "REALTEK VGA"realtek_md: .byte 0x1a, 0x3c, 0x50 .byte 0x1b, 0x19, 0x84 .byte 0x1c, 0x1e, 0x84 .byte 0x1d, 0x2b, 0x84 .byte 0x1e, 0x3c, 0x84 .byte 0 .ascii "REALTEK" .byte 0#endif /* CONFIG_VIDEO_SVGA */# User-defined local mode table (VGA only)#ifdef CONFIG_VIDEO_LOCALlocal_modes: leaw local_mode_table, %silocm1: lodsw orw %ax, %ax jz locm2 stosw movsw jmp locm1locm2: ret# This is the table of local video modes which can be supplied manually# by the user. Each entry consists of mode ID (word) and dimensions# (byte for column count and another byte for row count). These modes# are placed before all SVGA and VESA modes and override them if table# compacting is enabled. The table must end with a zero word followed# by NUL-terminated video adapter name.local_mode_table: .word 0x0100 # Example: 40x25 .byte 25,40 .word 0 .ascii "Local" .byte 0#endif /* CONFIG_VIDEO_LOCAL */# Read a key and return the ASCII code in al, scan code in ahgetkey: xorb %ah, %ah int $0x16 ret# Read a key with a timeout of 30 seconds.# The hardware clock is used to get the time.getkt: call gettime addb $30, %al # Wait 30 seconds cmpb $60, %al jl lminute subb $60, %allminute: movb %al, %clagain: movb $0x01, %ah int $0x16 jnz getkey # key pressed, so get it call gettime cmpb %cl, %al jne again movb $0x20, %al # timeout, return `space' ret# Flush the keyboard bufferflush: movb $0x01, %ah int $0x16 jz empty xorb %ah, %ah int $0x16 jmp flushempty: ret# Print hexadecimal number.prthw: pushw %ax movb %ah, %al call prthb popw %axprthb: pushw %ax shrb $4, %al call prthn popw %ax andb $0x0f, %alprthn: cmpb $0x0a, %al jc prth1 addb $0x07, %alprth1: addb $0x30, %al jmp prtchr# Print decimal number in alprtdec: pushw %ax pushw %cx xorb %ah, %ah movb $0x0a, %cl idivb %cl cmpb $0x09, %al jbe lt100 call prtdec jmp skip10lt100: addb $0x30, %al call prtchrskip10: movb %ah, %al addb $0x30, %al call prtchr popw %cx popw %ax retstore_edid: pushw %es # just save all registers pushw %ax pushw %bx pushw %cx pushw %dx pushw %di pushw %fs popw %es movl $0x13131313, %eax # memset block with 0x13 movw $32, %cx movw $0x140, %di cld rep stosl movw $0x4f15, %ax # do VBE/DDC movw $0x01, %bx movw $0x00, %cx movw $0x01, %dx movw $0x140, %di int $0x10 popw %di # restore all registers popw %dx popw %cx popw %bx popw %ax popw %es ret# VIDEO_SELECT-only variablesmt_end: .word 0 # End of video mode table if builtedit_buf: .space 6 # Line editor buffercard_name: .word 0 # Pointer to adapter namescanning: .byte 0 # Performing mode scando_restore: .byte 0 # Screen contents altered during mode changesvga_prefix: .byte VIDEO_FIRST_BIOS>>8 # Default prefix for BIOS modesgraphic_mode: .byte 0 # Graphic mode with a linear frame bufferdac_size: .byte 6 # DAC bit depth# Status messageskeymsg: .ascii "Press <RETURN> to see video modes available, " .ascii "<SPACE> to continue or wait 30 secs" .byte 0x0d, 0x0a, 0listhdr: .byte 0x0d, 0x0a .ascii "Mode: COLSxROWS:"crlft: .byte 0x0d, 0x0a, 0prompt: .byte 0x0d, 0x0a .asciz "Enter mode number or `scan': "unknt: .asciz "Unknown mode ID. Try again."badmdt: .ascii "You passed an undefined mode number." .byte 0x0d, 0x0a, 0vesaer: .ascii "Error: Scanning of VESA modes failed. Please " .ascii "report to <mj@ucw.cz>." .byte 0x0d, 0x0a, 0old_name: .asciz "CGA/MDA/HGA"ega_name: .asciz "EGA"svga_name: .ascii " "vga_name: .asciz "VGA"vesa_name: .asciz "VESA"name_bann: .asciz "Video adapter: "#endif /* CONFIG_VIDEO_SELECT */# Other variables:adapter: .byte 0 # Video adapter: 0=CGA/MDA/HGA,1=EGA,2=VGAvideo_segment: .word 0xb800 # Video memory segmentforce_size: .word 0 # Use this size instead of the one in BIOS vars
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -