sdlintrf.asm

来自「linux下的任天堂模拟器代码。供大家参考。」· 汇编 代码 · 共 807 行 · 第 1/2 页

ASM
807
字号
;Copyright (C) 1997-2007 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach );;http://www.zsnes.com;http://sourceforge.net/projects/zsnes;https://zsnes.bountysource.com;;This program is free software; you can redistribute it and/or;modify it under the terms of the GNU General Public License;version 2 as published by the Free Software Foundation.;;This program is distributed in the hope that it will be useful,;but WITHOUT ANY WARRANTY; without even the implied warranty of;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the;GNU General Public License for more details.;;You should have received a copy of the GNU General Public License;along with this program; if not, write to the Free Software;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.%include "macros.mac"EXTSYM getchar,PrevFSMode,sem_sleep,SBHDMA,putchar,Start60HZEXTSYM pressed,AdjustFrequency,vidbufferofsb,vidbuffer,clearwinEXTSYM Stop60HZ,initwinvideo,vesa2_rpos,vesa2_gpos,vesa2_bpos,vesa2_rposngEXTSYM vesa2_gposng,vesa2_bposng,vesa2_usbit,vesa2_clbit,vesa2_clbitngEXTSYM vesa2_clbitng2,vesa2_clbitng3,vesa2red10,res640,res480,cbitmode,cvidmodeEXTSYM vesa2_bits,vesa2_x,vesa2_y,genfulladdtab,GUICPC,drawscreenwinEXTSYM ConvertToAFormat,HalfTrans,UnusedBit,UnusedBitXorEXTSYM ngrposng,nggposng,ngbposng,HalfTransB,HalfTransC,UpdateVFrame,GetMouseXEXTSYM GetMouseY,GetMouseMoveX,GetMouseMoveY,GetMouseButton,T36HZEnabledEXTSYM MouseButton,Start36HZ,Stop36HZ,CheckTimers,vesa2_rfull,vesa2_rtrclEXTSYM vesa2_rtrcla,vesa2_gfull,vesa2_gtrcl,vesa2_gtrcla,vesa2_bfull,vesa2_btrclEXTSYM vesa2_btrcla,Init_2xSaIMMXW,V8Mode,GrayscaleMode,PrevWinModeEXTSYM pl1upk,pl1downk,pl1leftk,pl1rightk,pl1startk,pl1selkEXTSYM pl1Ak,pl1Bk,pl1Xk,pl1Yk,pl1Lk,pl1RkEXTSYM pl2upk,pl2downk,pl2leftk,pl2rightk,pl2startk,pl2selkEXTSYM pl2Ak,pl2Bk,pl2Xk,pl2Yk,pl2Lk,pl2RkEXTSYM pl3upk,pl3downk,pl3leftk,pl3rightk,pl3startk,pl3selkEXTSYM pl3Ak,pl3Bk,pl3Xk,pl3Yk,pl3Lk,pl3RkEXTSYM pl4upk,pl4downk,pl4leftk,pl4rightk,pl4startk,pl4selkEXTSYM pl4Ak,pl4Bk,pl4Xk,pl4Yk,pl4Lk,pl4RkEXTSYM pl5upk,pl5downk,pl5leftk,pl5rightk,pl5startk,pl5selkEXTSYM pl5Ak,pl5Bk,pl5Xk,pl5Yk,pl5Lk,pl5Rk%ifdef __OPENGL__EXTSYM Clear2xSaIBuffer%endif; NOTE: For timing, Game60hzcall should be called at 50hz or 60hz (depending;   on romispal) after a call to InitPreGame and before DeInitPostGame are;   made.  GUI36hzcall should be called at 36hz after a call GUIInit and;   before GUIDeInit.SECTION .textNEWSYM StartUp    ret; SystemInit - Initialize all Joystick stuff, load in all configuration data,;   parse commandline data, obtain current directory (One time initialization)NEWSYM SystemInit    ; Be sure to set SBHDMA to a value other than 0 if 16bit sound exists    mov byte[SBHDMA],1    retNEWSYM PrintStr          ; Print ASCIIZ string    pushad.next    mov al,[edx]    or al,al    jz .finish    push edx    mov dl,al    push edx    call putchar    pop edx    pop edx    inc edx    jmp .next.finish    popad    retSECTION .dataNEWSYM wfkey, db 0SECTION .textNEWSYM WaitForKey       ; Wait for a key to be pressed    pushad    call getchar    mov [wfkey],al    popad    mov al,[wfkey]    ; return key in al    retSECTION .dataNEWSYM CurKeyPos, dd 0NEWSYM CurKeyReadPos, dd 0NEWSYM KeyBuffer, times 16 dd 0SECTION .textNEWSYM Check_Key    mov al,[CurKeyPos]    cmp al,[CurKeyReadPos]    jne .yeskey    xor al,al    ret.yeskey    mov al,0FFh    retNEWSYM Get_Key    ; wait if there are no keys in buffer, then return key in al    ; for extended keys, return a 0, then the extended key afterwards    xor eax,eax.nokey;    call JoyRead    mov al,[CurKeyReadPos]    cmp al,[CurKeyPos]    je .nokey    test word[KeyBuffer+eax*4],100h    jnz .upper    mov al,[KeyBuffer+eax*4]    inc dword[CurKeyReadPos]    and dword[CurKeyReadPos],0Fh    ret.upper    sub word[KeyBuffer+eax*4],100h    xor al,al    retNEWSYM Get_Memfree    mov eax,02000000h    retNEWSYM Output_Text       ; Output character (ah=02h) or string (ah=09h)    pushad    ; This function usually displays an error message on-screen    cmp ah,02h    je .char    cmp ah,09h    je .string    ret.char    push edx    call putchar    pop edx    popad    ret.string    pushad    call PrintStr       ; print edx    popad    popad    retNEWSYM InitPreGame   ; Executes before starting/continuing a game    mov byte[pressed+1],2    pushad    call Start60HZ%ifdef __OPENGL__    call drawscreenwin%endif    call initwinvideo    popad    mov al,[GrayscaleMode]    cmp al,[V8Mode]    je .nochangemode    xor byte[V8Mode],1    xor al,al.nochangemode    pushad    call AdjustFrequency    popad    pushad    xor eax,eax    mov edi,[vidbufferofsb]    mov ecx,288*128    rep stosd    popad    pushad    call clearwin    popad    retNEWSYM SetupPreGame   ; Executes after pre-game init, can execute multiple                      ; times after a single InitPreGame    mov byte[pressed+1],2    retNEWSYM DeInitPostGame           ; Called after game is ended    pushad    call Stop60HZ    popad    ret; ****************************; Video Stuff; ****************************; ** init video mode functions **SECTION .dataNEWSYM firstvideo, dd 1SECTION .textNEWSYM initvideo  ; Returns 1 in videotroub if trouble occurs   mov byte[res640],1   mov byte[res480],1   mov byte[cbitmode],1   mov word[vesa2_x],512   mov word[vesa2_y],480   mov byte[vesa2_bits],16   mov dword[vesa2_bits],16   mov dword[vesa2_rpos],11   mov dword[vesa2_gpos],5   mov dword[vesa2_bpos],0   mov byte[vesa2red10],0   mov byte[vesa2_rposng],11   mov byte[vesa2_gposng],5   mov byte[vesa2_bposng],0   mov dword[vesa2_clbitng],1111011111011110b   mov dword[vesa2_clbitng2],11110111110111101111011111011110b   mov dword[vesa2_clbitng2+4],11110111110111101111011111011110b   mov dword[vesa2_clbitng3],0111101111101111b   pushad   call initwinvideo   popad   movzx eax,byte[cvidmode]   cmp byte[GUIWFVID+eax],0   je .prevwinmode   mov [PrevFSMode],al   jmp .doneprevmode.prevwinmode   mov [PrevWinMode],al.doneprevmode   cmp dword[firstvideo],1   je .skipinitgfx   pushad   call InitializeGfxStuff   popad.skipinitgfx   mov dword[firstvideo],0   pushad   call InitializeGfxStuff   popad   retNEWSYM deinitvideo    ret; ** copy video mode functions **SECTION .dataNEWSYM converta, dd 0%ifdef __OPENGL__NEWSYM blinit, db 1%endifSECTION .textNEWSYM DrawScreen               ; In-game screen render w/ triple buffer check    cmp dword[converta],1    jne near .skipconv    pushad        mov dword[UnusedBit],     10000000000000001000000000000000b        mov dword[HalfTrans],     01111011110111100111101111011110b        mov dword[UnusedBitXor],  01111111111111110111111111111111b        mov dword[UnusedBit+4],   10000000000000001000000000000000b        mov dword[HalfTrans+4],   01111011110111100111101111011110b        mov dword[UnusedBitXor+4],01111111111111110111111111111111b        mov dword[HalfTransB],    00000100001000010000010000100001b        mov dword[HalfTransB+4],  00000100001000010000010000100001b        mov dword[HalfTransC],    01111011110111100111101111011110b        mov dword[HalfTransC+4],  01111011110111100111101111011110b        mov dword[ngrposng],10        mov dword[nggposng],5        mov dword[ngbposng],0    call ConvertToAFormat    popad.skipconv    pushad    call drawscreenwin%ifdef __OPENGL__    cmp byte[blinit],1    jne .noreinit    call initwinvideo    call Clear2xSaIBuffer    mov byte[blinit],0.noreinit%endif    popad    retNEWSYM vidpastecopyscr       ; GUI screen render   pushad   mov eax,[vidbuffer]   mov ecx,224*288   mov edx,ecx   sub ecx,288   dec edx.loop   movzx ebx,byte[eax+edx]   mov bx,[GUICPC+ebx*2]   mov [eax+edx*2],bx   dec edx   dec ecx   jnz .loop   popad   jmp DrawScreen; ** Video Mode Variables **SECTION .data; Total Number of Video Modes%ifdef __OPENGL__NEWSYM NumVideoModes, dd 23%elseNEWSYM NumVideoModes, dd 5%endif; GUI Video Mode Names - Make sure that all names are of the same length; and end with a NULL terminatorNEWSYM GUIVideoModeNamesdb '256x224       R W',0  ;0db '256x224       R F',0  ;1db '512x448      DR W',0  ;2db '512x448      DR F',0  ;3db '640x480      DR F',0  ;4%ifdef __OPENGL__db '256x224     O R W',0  ;5db '512x448     ODR W',0  ;6db '640x480     ODS F',0  ;7db '640x480     ODS W',0  ;8db '640x560     ODR W',0  ;9db '768x672     ODR W',0  ;10db '800x600     ODS F',0  ;11db '800x600     ODS W',0  ;12db '896x784     ODR W',0  ;13db '1024x768    ODS F',0  ;14db '1024x768    ODS W',0  ;15db '1024x896    ODR W',0  ;16db '1280x960    ODS F',0  ;17db '1280x1024   ODS F',0  ;18db '1600x1200   ODS F',0  ;19db 'VARIABLE    ODR W',0  ;20db 'VARIABLE    ODS W',0  ;21db 'CUSTOM      OD  F',0  ;22%endif; Video Mode Feature Availability (1 = Available, 0 = Not Available); Left side starts with Video Mode 0; vid mode column =  0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2NEWSYM GUII2VID,  db 0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; InterpolationNEWSYM GUIWFVID,  db 0,1,0,1,1,0,0,1,0,0,0,1,0,0,1,0,0,1,1,1,0,0,1 ; FullscreenNEWSYM GUIDSIZE,  db 0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; D ModesNEWSYM GUIKEEP43, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1 ; Keep 4:3 RatioNEWSYM GUIM7VID,  db 0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; Hires Mode 7NEWSYM GUIHQ2X,   db 0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; Hq2x FilterNEWSYM GUIHQ3X,   db 0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; (Hq3x Filter)NEWSYM GUIHQ4X,   db 0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; (Hq4x Filter)NEWSYM GUINTVID,  db 0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; NTSC FilterNEWSYM GUIRESIZE, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0 ; SDL Resizable%ifdef __OPENGL__NEWSYM GUIBIFIL,  db 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; SDL Bilinear Filter%endifSECTION .text; ****************************; Input Device Stuff; ****************************; Variables related to Input Device Routines:;   pl1selk,pl1startk,pl1upk,pl1downk,pl1leftk,pl1rightk,pl1Xk,;   pl1Ak,pl1Lk,pl1Yk,pl1Bk,pl1Rk;     (Change 1 to 2,3,4 for other players);     Each of these variables contains the corresponding key pressed value;       for the key data;   pressed[];     - This is an array of pressed/released data (bytes) where the;       corresponding key pressed value is used as the index.  The value;       for each entry is 0 for released and 1 for pressed.  Also, when;       writing keyboard data to this array, be sure to first check if;       the value of the array entry is 2 or not.  If it is 2, do not write 1;       to that array entry. (however, you can write 0 to it)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?