📄 vesa2.asm
字号:
cmp bh,ah jb .scheck1b mov bh,ah.scheck1b cmp bh,bl jb .scheck2b mov bh,bl.scheck2b mov [fs:21h],bh mov al,16 sub al,[fs:24h] mov ah,[fs:20h] sub ah,[fs:24h] mov bl,[fs:22h] sub bl,[fs:24h] mov bh,al cmp bh,ah jb .scheck1c mov bh,ah.scheck1c cmp bh,bl jb .scheck2c mov bh,bl.scheck2c mov [fs:23h],bh mov word[vesa2_clbit],0 cmp byte[fs:20h],10 jne .nottopbit mov word[vesa2_usbit],8000h.nottopbit ; Process Red Stuff mov al,[fs:20h] ; bit sizes = [fs:19h,21h,23h] mov cl,al mov bx,1 shl bx,cl cmp byte[fs:19h],6 jne .no6bit mov [vesa2_usbit],bx inc al.no6bit or [vesa2_clbit],bx mov [vesa2_rpos],al dec al mov cl,al mov bx,001Fh cmp cl,0FFh je .shrr shl bx,cl jmp .shlr.shrr shr bx,1.shlr mov [vesa2_rfull],bx add al,5 mov bx,1 mov cl,al shl bx,cl mov [vesa2_rtrcl],bx xor bx,0FFFFh mov [vesa2_rtrcla],bx; mov ax,03h; int 10h; mov ax,[vesa2_rfull]; call printhex; jmp DosExit ; Process Green Stuff mov al,[fs:22h] mov cl,al mov bx,1 shl bx,cl cmp byte[fs:21h],6 jne .no6bitb mov [vesa2_usbit],bx inc al.no6bitb or [vesa2_clbit],bx mov [vesa2_gpos],al dec al mov cl,al mov bx,001Fh cmp cl,0FFh je .shrg shl bx,cl jmp .shlg.shrg shr bx,1.shlg mov [vesa2_gfull],bx add al,5 mov bx,1 mov cl,al shl bx,cl mov [vesa2_gtrcl],bx xor bx,0FFFFh mov [vesa2_gtrcla],bx ; Process Blue Stuff mov al,[fs:24h] mov cl,al mov bx,1 shl bx,cl cmp byte[fs:23h],6 jne .no6bitc mov [vesa2_usbit],bx inc al.no6bitc or [vesa2_clbit],bx mov [vesa2_bpos],al dec al mov cl,al mov bx,001Fh cmp cl,0FFh je .shrb shl bx,cl jmp .shlb.shrb shr bx,1.shlb mov [vesa2_bfull],bx add al,5 mov bx,1 mov cl,al shl bx,cl mov [vesa2_btrcl],bx xor bx,0FFFFh mov [vesa2_btrcla],bx xor word[vesa2_clbit],0FFFFh call genfulladdtab test word[fs:0h],10000000b ; Check if linear available jnz .linearavailable mov edx,.nolframebuffer jmp VESA2EXITTODOS ; None available ;---------------------------------------------; ; OK - now set the vesa 2 mode based on the ; ; information gleaned... ; ;---------------------------------------------; .linearavailable or word[vesamode],4000h ; Convert mode to its LFB equivalent mov ebx,[fs:28h] ; Read in physical base ptr mov cx,bx shr ebx,16 mov si,[noblocks] xor edi,edi ; Since noblocks = number of 64k blocks, ; these lines leave si:di holding byte size mov eax,800h int 31h jnc .mappedphysicalarea mov edx,.unablemap jmp VESA2EXITTODOS ; Failure!!!.mappedphysicalarea shl ebx,16 mov bx,cx mov [LFBpointer],ebx mov eax,ebx sub eax,[ZSNESBase] mov [VESAAddr],eax xor ecx,ecx xor edx,edx mov eax,4f02h movzx ebx,word[vesamode] int 10h ; Set the vesa mode cmp ax,004fh jz .modesetok mov edx,.unableset jmp VESA2EXITTODOS ; Failure!!!.modesetok;******************************* EXTRA BIT ****************************; cmp byte[.whichwin],1 ; Check if Write is at Window B; jne .nowinB;; mov ax,4F05h; mov bx,1; mov dx,0; int 10h;;.nowinB ; Check logical scanline length mov eax,4f06h mov ebx,1 int 10h cmp cx,[vesa2_x] je .correctwidth mov eax,4f06h ; VBE Set/Get logical scan line length mov ebx,0 ; Set scan line length in pixels mov ecx, [vesa2_x] ; Desired screen width int 10h cmp ax,04fh jz .correctwidth mov edx, .unablescan jmp VESA2EXITTODOS ; Failure!!!.correctwidth;*************************** END OF EXTRA BIT ************************* xor eax,eax mov ecx,1 int 31h ; Allocate a descriptor mov bx,ax ; Move our selector into bx mov ecx,[LFBpointer] mov dx,cx shr ecx,16 mov eax,7 int 31h ; Set our selector to LFB jnc .selectornowset mov edx,.unablelfb jmp VESA2EXITTODOS ; Failure!!!.selectornowset movzx ecx,word[noblocks] shl ecx,16 ; Multiply by 65536 dec ecx ; Necessary!!! mov dx,cx shr ecx,16 ; CX:DX size of screen mov eax,8 int 31h ; Set size of selector jnc .ok mov edx,.unablesets jmp VESA2EXITTODOS ; Failure!!!.ok lar ecx,ebx shr ecx,8 and cl,60h or cl,93h and ch,0c0h ; Keep granularity bit mov ax,9 int 31h ; Set selector access rights jnc .accessrightsset mov edx,.unablesetar jmp VESA2EXITTODOS.accessrightsset mov [vesa2selec],bx cmp byte[vesa2red10],1 je .red10 mov eax,565 jmp .red11.red10 mov eax,555.red11 push eax call Init_2xSaIMMX pop eax retSECTION .data.nomemmessage db 'Unable to locate DOS memory.',0.noint1message db 'Simulated real mode interrupt failed.',0.novbemessage db 'VBE not detected!!',0.novesamessage db 'VESA not detected!',0.novesa2message db 'VESA 2.0 or greater required!',0.oopsnoselector db 'Failed to allocate vesa display selector!',0.outofmodelistspacemessage db 'Out of VESA2 mode list space!',0.endoflist db 'This VESA2 mode does not work on your video card / driver.',0.whichwin db 0.modecheckfail db 'Real mode interrupt failure while checking vesa mode',0.nolframebuffer db 'Linear Frame Buffer not Detected.',0.unablemap db 'Unable to map physical area.',0.unableset db 'Unable to initialize video mode.',0.unablescan db 'Unable to set scan line length.',0.unablelfb db 'Unable to set selector to LFB.',0.unablesets db 'Unable to set size of selector.',0.unablesetar db 'Unable to set selector access rights.',0NEWSYM LFBpointer dd 0NEWSYM noblocks dw 0NEWSYM bytesperscanline dw 0NEWSYM vesamode dw 0;----------------------------------------------------------------------;NEWSYM VESAmodelist; times 512 dw 0;----------------------------------------------------------------------SECTION .bssNEWSYM VESAmodelist, times 512 resw 1NEWSYM RMREGS.edi resd 1.esi resd 1.ebp resd 1.esp resd 1.ebx resd 1.edx resd 1.ecx resd 1.eax resd 1.flags resw 1.es resw 1.ds resw 1.fs resw 1.gs resw 1.ip resw 1.cs resw 1.sp resw 1.ss resw 1.spare times 20 resd 1;----------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -