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 + -
显示快捷键?