📄 joy.asm
字号:
;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 pl1contrl,pl2contrl,pl3contrl,pl4contrl,pl5contrlEXTSYM pressed,CalibXmin,CalibYmin,CalibXmax,CalibYmaxEXTSYM CalibXmin209,CalibYmin209,CalibXmax209,CalibYmax209EXTSYM read_gpp,_readSideWinder,_SW1,_SW2,_SW3,_SW4,_SWCountEXTSYM pl1p209,pl2p209,pl3p209,pl4p209,pl5p209,WhichSW,delayEXTSYM 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,pl5RkEXTSYM JoyX,JoyY,JoyX2,JoyY2,JoyMaxX,JoyMaxY,JoyMinX,JoyMinYEXTSYM JoyExists,JoyExists2,GetCoords,GetCoords3SECTION .dataNEWSYM JoyAltrn2, db 2SECTION .bssNEWSYM joy4218, resb 1NEWSYM joy4219, resb 1NEWSYM joy4218j, resb 1NEWSYM joy4219j, resb 1NEWSYM joy421A, resb 1NEWSYM joy421B, resb 1NEWSYM joy421Aj, resb 1NEWSYM joy421Bj, resb 1NEWSYM JoyCenterX, resd 1NEWSYM JoyCenterY, resd 1NEWSYM JoyCenterX2, resd 1NEWSYM JoyCenterY2, resd 1NEWSYM JoyMaxX2, resd 1NEWSYM JoyMaxY2, resd 1NEWSYM JoyMinX2, resd 1NEWSYM JoyMinY2, resd 1NEWSYM JoyAltrn, resb 1NEWSYM JoyCenterX209, resd 1NEWSYM JoyCenterY209, resd 1NEWSYM JoyMaxX209, resd 1NEWSYM JoyMaxY209, resd 1NEWSYM JoyMinX209, resd 1NEWSYM JoyMinY209, resd 1NEWSYM JoyCenterX2209, resd 1NEWSYM JoyCenterY2209, resd 1NEWSYM JoyMaxX2209, resd 1NEWSYM JoyMaxY2209, resd 1NEWSYM JoyMinX2209, resd 1NEWSYM JoyMinY2209, resd 1JoyQuant resb 1JoyBQuant resb 1NumSWs resb 1NumGRiPs resb 1PPad resb 1 ; b0 = pp0, b1 = pp1JoyQuant209 resb 1JoyBQuant209 resb 1NumSWs209 resb 1NumGRiPs209 resb 1Buttons6 resb 1Buttons6209 resb 1SECTION .textNEWSYM DosUpdateDevices mov byte[PPad],0 mov byte[JoyQuant],0 mov byte[JoyBQuant],0 mov byte[NumSWs],0 mov byte[NumGRiPs],0 mov byte[JoyQuant209],0 mov byte[JoyBQuant209],0 mov byte[NumSWs209],0 mov byte[NumGRiPs209],0 mov byte[Buttons6],0 mov byte[Buttons6209],0 ; Check for button #'s, joystick types, etc. mov al,[pl1contrl] mov ah,[pl1p209] call .checkdevice mov al,[pl2contrl] mov ah,[pl2p209] call .checkdevice mov al,[pl3contrl] mov ah,[pl3p209] call .checkdevice mov al,[pl4contrl] mov ah,[pl4p209] call .checkdevice mov al,[pl5contrl] mov ah,[pl5p209] call .checkdevice ; Auto-Calibrate the joysticks cmp byte[JoyQuant],2 jne .no2joyst mov dx,201h mov byte[JoyExists2],1 call GetCoords3 mov ecx,1000 call delay cmp byte[JoyExists2],0 jne .no2joyst mov byte[JoyQuant],1.no2joyst cmp byte[JoyQuant],1 jne .no1joyst mov dx,201h mov byte[JoyExists],1 call GetCoords mov ecx,1000 call delay cmp byte[JoyExists],0 jne .no1joyst mov byte[JoyQuant],0.no1joyst ; set max & mins mov ecx,[JoyX2] mov [JoyCenterX2], ecx mov eax,ecx shr ecx,1 sub eax,ecx mov [JoyMinX2],eax add eax,ecx add eax,ecx mov [JoyMaxX2],eax mov ecx,[JoyY2] mov [JoyCenterY2], ecx mov eax,ecx shr ecx,1 sub eax,ecx mov [JoyMinY2],eax add eax,ecx add eax,ecx mov [JoyMaxY2],eax mov ecx,[JoyX] mov [JoyCenterX], ecx mov eax,ecx shr ecx,1 sub eax,ecx mov [JoyMinX],eax add eax,ecx add eax,ecx mov [JoyMaxX],eax mov ecx,[JoyY] mov [JoyCenterY], ecx mov eax,ecx shr ecx,1 sub eax,ecx mov [JoyMinY],eax add eax,ecx add eax,ecx mov [JoyMaxY],eax ; Port 209 ; Auto-Calibrate the joysticks cmp byte[JoyQuant209],2 jne .no2joyst2 mov dx,209h mov byte[JoyExists2],1 call GetCoords3 mov ecx,1000 call delay cmp byte[JoyExists2],0 jne .no2joyst2 mov byte[JoyQuant209],1.no2joyst2 cmp byte[JoyQuant209],1 jne .no1joyst2 mov dx,209h mov byte[JoyExists],1 call GetCoords mov ecx,1000 call delay cmp byte[JoyExists],0 jne .no1joyst2 mov byte[JoyQuant209],0.no1joyst2 ; set max & mins mov ecx,[JoyX2] mov [JoyCenterX2209], ecx mov eax,ecx shr ecx,1 sub eax,ecx mov [JoyMinX2209],eax add eax,ecx add eax,ecx mov [JoyMaxX2209],eax mov ecx,[JoyY2] mov [JoyCenterY2209], ecx mov eax,ecx shr ecx,1 sub eax,ecx mov [JoyMinY2209],eax add eax,ecx add eax,ecx mov [JoyMaxY2209],eax mov ecx,[JoyX] mov [JoyCenterX209], ecx mov eax,ecx shr ecx,1 sub eax,ecx mov [JoyMinX209],eax add eax,ecx add eax,ecx mov [JoyMaxX209],eax mov ecx,[JoyY] mov [JoyCenterY209], ecx mov eax,ecx shr ecx,1 sub eax,ecx mov [JoyMinY209],eax add eax,ecx add eax,ecx mov [JoyMaxY209],eax cmp dword[CalibXmin],0 je .nocalib mov eax,[CalibXmin] mov [JoyMinX],eax mov eax,[CalibYmin] mov [JoyMinY],eax mov eax,[CalibXmax] mov [JoyMaxX],eax mov eax,[CalibYmax] mov [JoyMaxY],eax.nocalib cmp dword[CalibXmin209],0 je .nocalib209 mov eax,[CalibXmin209] mov [JoyMinX209],eax mov eax,[CalibYmin209] mov [JoyMinY209],eax mov eax,[CalibXmax209] mov [JoyMaxX209],eax mov eax,[CalibYmax209] mov [JoyMaxY209],eax.nocalib209 ret.checkdevice ; 1 = keyboard, 2 = 2b joystick, 3 = 4b joystick, 4 = 6b joystick, 5 = 8b joystick ; 6 = Sidewinder1, 7 = Sidewinder2, 8 = Sidewinder3, 9 = Sidewinder4 ; 10 = Grip0, 11 = Grip1, N/A = Grip2, N/A = Grip3, 12 = Parallel pad0 ; 13 = Parallel pad1, 14 = Parallel pad2, 15 = Parallel pad3, 16 = Parallel pad4 cmp al,1 ja .joyokay ret.joyokay cmp al,12 jne .nopp0 or byte[PPad],1 ret.nopp0 cmp al,13 jne .nopp1 or byte[PPad],2 ret.nopp1 cmp al,14 jne .nopp2 or byte[PPad],4 ret.nopp2 cmp al,15 jne .nopp3 or byte[PPad],8 ret.nopp3 cmp al,16 jne .nopp4 or byte[PPad],16 ret.nopp4 cmp ah,0 jne near .port209 cmp al,2 jne .nojoy2b inc byte[JoyQuant] add byte[JoyBQuant],2 ret.nojoy2b cmp al,3 jne .nojoy4b mov byte[JoyQuant],1 mov byte[JoyBQuant],4 ret.nojoy4b cmp al,4 jne .nojoy6b mov byte[JoyQuant],2 mov byte[JoyBQuant],6 mov byte[Buttons6],1 ret.nojoy6b cmp al,5 jne .nojoy8b mov byte[JoyQuant],2 mov byte[JoyBQuant],8 mov byte[Buttons6],2 ret.nojoy8b cmp al,9 ja .grip sub al,5 cmp byte[NumSWs],al ja .skipswc mov [NumSWs],al.skipswc ret.grip cmp al,11 ja .none sub al,9 cmp byte[NumGRiPs],al ja .skipgripc mov [NumGRiPs],al.skipgripc.none ret.port209 cmp al,2 jne .nojoy2b2 inc byte[JoyQuant209] add byte[JoyBQuant209],2 ret.nojoy2b2 cmp al,3 jne .nojoy4b2.joy4b2 mov byte[JoyQuant209],1 mov byte[JoyBQuant209],4 ret.nojoy4b2 cmp al,4 jne .nojoy6b2 mov byte[JoyQuant209],2 mov byte[JoyBQuant209],6 mov byte[Buttons6209],1 ret.nojoy6b2 cmp al,5 jne .nojoy8b2 mov byte[JoyQuant209],2 mov byte[JoyBQuant209],8 mov byte[Buttons6209],2 ret.nojoy8b2 cmp al,9 ja .grip2 sub al,5 cmp byte[NumSWs209],al ja .skipswc2 mov [NumSWs209],al.skipswc2 ret.grip2 cmp al,11 ja .none2 sub al,9 cmp byte[NumGRiPs209],al ja .skipgripc2 mov [NumGRiPs209],al.skipgripc2.none2 retJoyRead209: cmp byte[JoyAltrn],1 jne near .noanalog ; Clear Joystick buttons and movements mov word[pressed+100h],0 ; B7-8 mov word[pressed+106h],0 ; B5-6 mov dword[pressed+14Ch],0 ; Up,Down,Left,Right, pl1 mov dword[pressed+168h],0 ; Up,Down,Left,Right, pl2 ; Process Joystick(s) cmp byte[JoyQuant209],2 jne near .no2joyst mov dx,209h call GetCoords3 ; Set button 5-6 + 2player Control cmp byte[Buttons6209],0 jne near .6button mov eax,[JoyX2] cmp eax,[JoyMinX2209] jae .noleft2 mov byte[pressed+16Ah],1.noleft2 mov eax,[JoyX2] cmp eax,[JoyMaxX2209] jbe .noright2 mov byte[pressed+16Bh],1.noright2 mov eax,[JoyY2] cmp eax,[JoyMinY2209] jae .noup2 mov byte[pressed+168h],1.noup2 mov eax,[JoyY2] cmp eax,[JoyMaxY2209] jbe .nodown2 mov byte[pressed+169h],1.nodown2 jmp .1pcoord.6button mov eax,[JoyY2] cmp eax,[JoyMinY2209] jae .nob5 mov byte[pressed+106h],1.nob5 mov eax,[JoyX2] cmp eax,[JoyMinX2209] jae .nob6 mov byte[pressed+107h],1.nob6 cmp byte[Buttons6209],2 jne .no8b mov eax,[JoyY2] cmp eax,[JoyMaxY2209] jbe .nob7 mov byte[pressed+100h],1.nob7 mov eax,[JoyX2] cmp eax,[JoyMaxX2209] jbe .nob8 mov byte[pressed+101h],1.nob8.no8b jmp .1pcoord.no2joyst ; Set 1 player control cmp byte[JoyQuant209],1 jne near .no1joyst mov dx,209h call GetCoords.1pcoord mov eax,[JoyX] cmp eax,[JoyMinX209] jae .noleft mov byte[pressed+14Eh],1.noleft mov eax,[JoyX] cmp eax,[JoyMaxX209] jbe .noright mov byte[pressed+14Fh],1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -