⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vesa2.asm

📁 linux下的任天堂模拟器代码。供大家参考。
💻 ASM
📖 第 1 页 / 共 2 页
字号:
    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 + -