;Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com ) ; ;This program is free software; you can redistribute it and/or ;modify it under the terms of the GNU General Public License ;as published by the Free Software Foundation; either ;version 2 of the License, or (at your option) any later ;version. ; ;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 JoyAC,JoyBC,JoyLC,JoyRC,JoySelec,JoyStart,JoyXC,JoyYC,WhichSW,_SW1 EXTSYM _SW2,_readSideWinder,delay,numjoy,pl1Ak,pl1Bk,pl1Lk,pl1Rk,pl1Xk EXTSYM pl1Yk,pl1contrl,pl1downk,pl1leftk,pl1rightk,pl1selk,pl1startk EXTSYM pl1upk,pl2Ak,pl2Bk,pl2Lk,pl2Rk,pl2Xk,pl2Yk,pl2contrl,pl2downk EXTSYM pl2leftk,pl2rightk,pl2selk,pl2startk,pl2upk,_SWCount,_SW3,_SW4 EXTSYM pl3Ak,pl3Bk,pl3Lk,pl3Rk,pl3Xk,pl1p209,pl2p209,pl3p209,pl4p209 EXTSYM pl3Yk,pl3contrl,pl3downk,pl3leftk,pl3rightk,pl3selk,pl3startk EXTSYM pl3upk,pl4Ak,pl4Bk,pl4Lk,pl4Rk,pl4Xk,pl4Yk,pl4contrl,pl4downk EXTSYM pl4leftk,pl4rightk,pl4selk,pl4startk,pl4upk,pressed,read_gpp EXTSYM pl5contrl,pl5p209 EXTSYM CalibXmin, CalibYmin, CalibXmax, CalibYmax, CalibXmin209 EXTSYM CalibYmin209, CalibXmax209, CalibYmax209 NEWSYM JoyAsmStart SECTION .data ;NEWSYM joy4218, db 0 ;NEWSYM joy4219, db 0 ;NEWSYM joy4218j, db 0 ;NEWSYM joy4219j, db 0 ;NEWSYM joy421A, db 0 ;NEWSYM joy421B, db 0 ;NEWSYM joy421Aj, db 0 ;NEWSYM joy421Bj, db 0 ;NEWSYM JoyCenterX, dd 0 ;NEWSYM JoyCenterY, dd 0 ;NEWSYM JoyMaxX, dd 0 ;NEWSYM JoyMaxY, dd 0 ;NEWSYM JoyMinX, dd 0 ;NEWSYM JoyMinY, dd 0 ;NEWSYM JoyExists, db 0 ;NEWSYM JoyX, dd 0 ;NEWSYM JoyY, dd 0 ;NEWSYM JoyCenterX2, dd 0 ;NEWSYM JoyCenterY2, dd 0 ;NEWSYM JoyMaxX2, dd 0 ;NEWSYM JoyMaxY2, dd 0 ;NEWSYM JoyMinX2, dd 0 ;NEWSYM JoyMinY2, dd 0 ;NEWSYM JoyExists2, db 0 ;NEWSYM JoyX2, dd 0 ;NEWSYM JoyY2, dd 0 ;NEWSYM JoyAltrn, db 0 NEWSYM JoyAltrn2, db 2 ;NEWSYM JoyCenterX209, dd 0 ;NEWSYM JoyCenterY209, dd 0 ;NEWSYM JoyMaxX209, dd 0 ;NEWSYM JoyMaxY209, dd 0 ;NEWSYM JoyMinX209, dd 0 ;NEWSYM JoyMinY209, dd 0 ;NEWSYM JoyCenterX2209, dd 0 ;NEWSYM JoyCenterY2209, dd 0 ;NEWSYM JoyMaxX2209, dd 0 ;NEWSYM JoyMaxY2209, dd 0 ;NEWSYM JoyMinX2209, dd 0 ;NEWSYM JoyMinY2209, dd 0 ;JoyQuant db 0 ;JoyBQuant db 0 ;NumSWs db 0 ;NumGRiPs db 0 ;PPad db 0 ; b0 = pp0, b1 = pp1 ;JoyQuant209 db 0 ;JoyBQuant209 db 0 ;NumSWs209 db 0 ;NumGRiPs209 db 0 ;Buttons6 db 0 ;Buttons6209 db 0 SECTION .bss NEWSYM joy4218, resb 1 NEWSYM joy4219, resb 1 NEWSYM joy4218j, resb 1 NEWSYM joy4219j, resb 1 NEWSYM joy421A, resb 1 NEWSYM joy421B, resb 1 NEWSYM joy421Aj, resb 1 NEWSYM joy421Bj, resb 1 NEWSYM JoyCenterX, resd 1 NEWSYM JoyCenterY, resd 1 NEWSYM JoyMaxX, resd 1 NEWSYM JoyMaxY, resd 1 NEWSYM JoyMinX, resd 1 NEWSYM JoyMinY, resd 1 NEWSYM JoyExists, resb 1 NEWSYM JoyX, resd 1 NEWSYM JoyY, resd 1 NEWSYM JoyCenterX2, resd 1 NEWSYM JoyCenterY2, resd 1 NEWSYM JoyMaxX2, resd 1 NEWSYM JoyMaxY2, resd 1 NEWSYM JoyMinX2, resd 1 NEWSYM JoyMinY2, resd 1 NEWSYM JoyExists2, resb 1 NEWSYM JoyX2, resd 1 NEWSYM JoyY2, resd 1 NEWSYM JoyAltrn, resb 1 NEWSYM JoyCenterX209, resd 1 NEWSYM JoyCenterY209, resd 1 NEWSYM JoyMaxX209, resd 1 NEWSYM JoyMaxY209, resd 1 NEWSYM JoyMinX209, resd 1 NEWSYM JoyMinY209, resd 1 NEWSYM JoyCenterX2209, resd 1 NEWSYM JoyCenterY2209, resd 1 NEWSYM JoyMaxX2209, resd 1 NEWSYM JoyMaxY2209, resd 1 NEWSYM JoyMinX2209, resd 1 NEWSYM JoyMinY2209, resd 1 JoyQuant resb 1 JoyBQuant resb 1 NumSWs resb 1 NumGRiPs resb 1 PPad resb 1 ; b0 = pp0, b1 = pp1 JoyQuant209 resb 1 JoyBQuant209 resb 1 NumSWs209 resb 1 NumGRiPs209 resb 1 Buttons6 resb 1 Buttons6209 resb 1 ;NEWSYM pl3selk, dd 0 ; 3SELECT = SHIFT ;NEWSYM pl3startk, dd 0 ; 3START = ENTER ;NEWSYM pl3upk, dd 0 ; 3UP = up ;NEWSYM pl3downk, dd 0 ; 3DOWN = down ;NEWSYM pl3leftk, dd 0 ; 3LEFT = left ;NEWSYM pl3rightk, dd 0 ; 3RIGHT = right ;NEWSYM pl3Yk, dd 0 ; 3X = INS ;NEWSYM pl3Xk, dd 0 ; 3A = HOME ;NEWSYM pl3Lk, dd 0 ; 3L = PAGE UP ;NEWSYM pl3Bk, dd 0 ; 3Y = DELETE ;NEWSYM pl3Ak, dd 0 ; 3B = END ;NEWSYM pl3Rk, dd 0 ; 3R = PAGE DOWN SECTION .text NEWSYM GetCoords mov dword[JoyX],0 mov dword[JoyY],0 cli mov al,0 out dx,al mov ecx,00FFFFh .loopa in al,dx test al,01H jz .YAxis test al,02H jz .XAxis inc dword[JoyX] inc dword[JoyY] dec ecx jnz .loopa mov byte [JoyExists], 0 mov dword[JoyX],0 mov dword[JoyY],0 jmp .End .YAxis in al,dx test al,02h jz .YAxisOk nop nop inc dword[JoyY] nop dec ecx jnz .YAxis mov byte [JoyExists], 0 mov dword[JoyX],0 mov dword[JoyY],0 .YAxisOk jmp .End .XAxis in al,dx test al,01h jz .XAxisOk nop nop inc dword[JoyX] nop dec ecx jnz .XAxis mov byte [JoyExists], 0 mov dword[JoyX],0 mov dword[JoyY],0 .XAxisOk .End sti ret ; Dual Joysticks NEWSYM GetCoords3 mov dword[JoyX],0 mov dword[JoyY],0 mov dword[JoyX2],0 mov dword[JoyY2],0 cli mov al,0 out dx,al mov ecx,01FFFFh .loopa in al,dx test al,01H jz .YAxis inc dword[JoyX] nop .YAxis test al,02H jz .XAxis inc dword[JoyY] nop .XAxis test al,04H jz .YAxis2 inc dword[JoyX2] nop .YAxis2 test al,08H jz .XAxis2 inc dword[JoyY2] nop .XAxis2 test al,0Fh jz .nomore dec ecx jnz .loopa mov byte [JoyExists], 0 mov dword[JoyX],0 mov dword[JoyY],0 mov byte [JoyExists2], 0 mov dword[JoyX2],0 mov dword[JoyY2],0 .nomore sti ret NEWSYM 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 dword[JoyMinX2],eax add eax,ecx add eax,ecx mov dword[JoyMaxX2],eax mov ecx,[JoyY2] mov [JoyCenterY2], ecx mov eax,ecx shr ecx,1 sub eax,ecx mov dword[JoyMinY2],eax add eax,ecx add eax,ecx mov dword[JoyMaxY2],eax mov ecx,[JoyX] mov [JoyCenterX], ecx mov eax,ecx shr ecx,1 sub eax,ecx mov dword[JoyMinX],eax add eax,ecx add eax,ecx mov dword[JoyMaxX],eax mov ecx,[JoyY] mov [JoyCenterY], ecx mov eax,ecx shr ecx,1 sub eax,ecx mov dword[JoyMinY],eax add eax,ecx add eax,ecx mov dword[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 dword[JoyMinX2209],eax add eax,ecx add eax,ecx mov dword[JoyMaxX2209],eax mov ecx,[JoyY2] mov [JoyCenterY2209], ecx mov eax,ecx shr ecx,1 sub eax,ecx mov dword[JoyMinY2209],eax add eax,ecx add eax,ecx mov dword[JoyMaxY2209],eax mov ecx,[JoyX] mov [JoyCenterX209], ecx mov eax,ecx shr ecx,1 sub eax,ecx mov dword[JoyMinX209],eax add eax,ecx add eax,ecx mov dword[JoyMaxX209],eax mov ecx,[JoyY] mov [JoyCenterY209], ecx mov eax,ecx shr ecx,1 sub eax,ecx mov dword[JoyMinY209],eax add eax,ecx add eax,ecx mov dword[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,4 = 4b joystick, 5 = 6b joystick ; 6 = Sidewinder1, 7 = Sidewinder2, 8 = Sidewinder3, 9 = Sidewiner4 ; 10 = Grip0, 11 = Grip1, 12 = Grip2, 13 = Grip3, 14 = Parallel pad0 ; 15 = Parallel pad1, 16 = Parallel pad2, 17 = Parallel pad3 ; 19 = Parallel pad4, 18 = 8b joystick cmp al,1 ja .joyokay ret .joyokay cmp al,14 jne .nopp0 or byte[PPad],1 ret .nopp0 cmp al,15 jne .nopp1 or byte[PPad],2 ret .nopp1 cmp al,16 jne .nopp2 or byte[PPad],4 ret .nopp2 cmp al,17 jne .nopp3 or byte[PPad],8 ret .nopp3 cmp al,19 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 je .joy4b cmp al,4 jne .nojoy4b .joy4b mov byte[JoyQuant],1 mov byte[JoyBQuant],4 ret .nojoy4b cmp al,5 jne .nojoy6b mov byte[JoyQuant],2 mov byte[JoyBQuant],6 mov byte[Buttons6],1 ret .nojoy6b cmp al,18 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 byte[NumSWs],al .skipswc ret .grip cmp al,13 ja .none sub al,9 cmp byte[NumGRiPs],al ja .skipgripc mov byte[NumGRiPs],al .skipgripc .none ret .port209 cmp al,2 jne .nojoy2b2 inc byte[JoyQuant209] add byte[JoyBQuant209],2 ret .nojoy2b2 cmp al,3 je .joy4b2 cmp al,4 jne .nojoy4b2 .joy4b2 mov byte[JoyQuant209],1 mov byte[JoyBQuant209],4 ret .nojoy4b2 cmp al,5 jne .nojoy6b2 mov byte[JoyQuant209],2 mov byte[JoyBQuant209],6 mov byte[Buttons6209],1 ret .nojoy6b2 cmp al,18 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 byte[NumSWs209],al .skipswc2 ret .grip2 cmp al,13 ja .none2 sub al,9 cmp byte[NumGRiPs209],al ja .skipgripc2 mov byte[NumGRiPs209],al .skipgripc2 .none2 ret NEWSYM JoyReadControl, db 0 JoyRead209: 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 .noright mov eax,[JoyY] cmp eax,[JoyMinY209] jae .noup mov byte[pressed+14Ch],1 .noup mov eax,[JoyY] cmp eax,[JoyMaxY209] jbe .nodown mov byte[pressed+14Dh],1 .nodown .no1joyst .noanalog test byte[JoyAltrn],1 jne near .joynotexist mov dword[pressed+102h],0 ; B1-4 cmp byte[JoyQuant209],0 je .joynotexist ; Set buttons 1-4 mov dx, 0209h xor al,al out dx, al in al, dx not al test al,10h jz .nob1 mov byte[pressed+102h],1 .nob1 test al,20h jz .nob2 mov byte[pressed+103h],1 .nob2 cmp byte[JoyBQuant209],2 je .joynotexist test al,40h jz .nob3 mov byte[pressed+104h],1 .nob3 test al,80h jz .nob4 mov byte[pressed+105h],1 .nob4 .joynotexist ret NEWSYM DOSJoyRead push edx push ebx push ecx inc byte[JoyAltrn] and byte[JoyAltrn],3 cmp byte[JoyAltrn],0 jne near .noanalog ; Clear Joystick buttons and movements mov word[pressed+86h],0 ; B5-6 mov word[pressed+80h],0 ; B7-8 mov dword[pressed+0CCh],0 ; Up,Down,Left,Right, pl1 mov dword[pressed+0E8h],0 ; Up,Down,Left,Right, pl2 ; Process Joystick(s) cmp byte[JoyQuant],2 jne near .no2joyst mov dx,201h call GetCoords3 ; Set button 5-6 + 2player Control cmp byte[Buttons6],0 jne near .6button mov eax,[JoyX2] cmp eax,[JoyMinX2] jae .noleft2 mov byte[pressed+0EAh],1 .noleft2 mov eax,[JoyX2] cmp eax,[JoyMaxX2] jbe .noright2 mov byte[pressed+0EBh],1 .noright2 mov eax,[JoyY2] cmp eax,[JoyMinY2] jae .noup2 mov byte[pressed+0E8h],1 .noup2 mov eax,[JoyY2] cmp eax,[JoyMaxY2] jbe .nodown2 mov byte[pressed+0E9h],1 .nodown2 jmp .1pcoord .6button mov eax,[JoyY2] cmp eax,[JoyMinY2] jae .nob5 mov byte[pressed+086h],1 .nob5 mov eax,[JoyX2] cmp eax,[JoyMinX2] jae .nob6 mov byte[pressed+087h],1 .nob6 cmp byte[Buttons6],2 jne .no8b mov eax,[JoyY2] cmp eax,[JoyMaxY2] jbe .nob7 mov byte[pressed+80h],1 .nob7 mov eax,[JoyX2] cmp eax,[JoyMaxX2] jbe .nob8 mov byte[pressed+81h],1 .nob8 .no8b jmp .1pcoord .no2joyst ; Set 1 player control cmp byte[JoyQuant],1 jne near .no1joyst mov dx,201h call GetCoords .1pcoord mov eax,[JoyX] cmp eax,[JoyMinX] jae .noleft mov byte[pressed+0CEh],1 .noleft mov eax,[JoyX] cmp eax,[JoyMaxX] jbe .noright mov byte[pressed+0CFh],1 .noright mov eax,[JoyY] cmp eax,[JoyMinY] jae .noup mov byte[pressed+0CCh],1 .noup mov eax,[JoyY] cmp eax,[JoyMaxY] jbe .nodown mov byte[pressed+0CDh],1 .nodown .no1joyst .noanalog test byte[JoyAltrn],1 jz .joynotexist mov dword[pressed+82h],0 ; B1-4 cmp byte[JoyQuant],0 je .joynotexist ; Set buttons 1-4 mov dx, 0201h xor al,al out dx, al in al, dx not al test al,10h jz .nob1 mov byte[pressed+82h],1 .nob1 test al,20h jz .nob2 mov byte[pressed+83h],1 .nob2 cmp byte[JoyBQuant],2 je .joynotexist test al,40h jz .nob3 mov byte[pressed+84h],1 .nob3 test al,80h jz .nob4 mov byte[pressed+85h],1 .nob4 .joynotexist ; Process Joystick Buttons cmp byte[JoyQuant209],0 je .no209 call JoyRead209 .no209 test byte[JoyAltrn],1 jz near .noport4 cmp byte[NumSWs],0 je .nosw call SideWinder .nosw cmp byte[NumSWs209],0 je .nosw209 call SideWinder209 .nosw209 test byte[JoyAltrn],2 jz .nogrip209 cmp byte[NumGRiPs],0 je .nogrip call GamePadPro .nogrip cmp byte[NumGRiPs209],0 je .nogrip209 call GamePadPro209 .nogrip209 test byte[PPad],1 jz .noport1 call GetParallelPlayer1 .noport1 test byte[PPad],2 jz .noport2 call GetParallelPlayer2 .noport2 test byte[PPad],4 jz .noport3 call GetParallelPlayer3 .noport3 test byte[PPad],8 jz .noport4 call GetParallelPlayer4 .noport4 test byte[PPad],16 jz .noport5 call GetParallelPlayer5 .noport5 cmp byte[JoyAltrn],0 je .nogpp2209 cmp byte[NumGRiPs],2 jne .nogpp2 call GamePadPro2 .nogpp2 cmp byte[NumGRiPs209],2 jne .nogpp2209 call GamePadPro2209 .nogpp2209 pop ecx pop ebx pop edx ret ;bit 1 - left,2 - right,3 - down,4 - up,5 - r1,6 - l1,7 - red,8 - yellow ; 9 - green,10 - l2,11 - blue,12 - r2,13 - start,14 - select %macro GPProHelp 2 test eax,%1 jz %%nope mov byte[pressed+ebx+%2],1 %%nope %endmacro ;A8=buttons, CA=select/start, F0=movement (inc by 4) GamePadPro: mov al,0 mov dx,201h call read_gpp cmp eax,1 je near .error xor ebx,ebx mov byte[pressed+ebx+0F0h],0 mov byte[pressed+ebx+0F1h],0 mov byte[pressed+ebx+0F2h],0 mov byte[pressed+ebx+0F3h],0 mov byte[pressed+ebx+0A8h],0 mov byte[pressed+ebx+0A9h],0 mov byte[pressed+ebx+0AAh],0 mov byte[pressed+ebx+0ABh],0 mov byte[pressed+ebx+0ACh],0 mov byte[pressed+ebx+0ADh],0 mov byte[pressed+ebx+0AEh],0 mov byte[pressed+ebx+0AFh],0 mov byte[pressed+ebx+0CAh],0 mov byte[pressed+ebx+0CBh],0 GPProHelp 0002h,0F2h ; left GPProHelp 0004h,0F3h ; right GPProHelp 0008h,0F1h ; down GPProHelp 0010h,0F0h ; up GPProHelp 0020h,0AEh ; r1 GPProHelp 0040h,0ACh ; l1 GPProHelp 0080h,0A8h ; red GPProHelp 0100h,0AAh ; yellow GPProHelp 0200h,0ABh ; green GPProHelp 0400h,0ADh ; l2 GPProHelp 0800h,0A9h ; blue GPProHelp 1000h,0AFh ; r2 GPProHelp 2000h,0CBh ; start GPProHelp 4000h,0CAh ; select .error ret GamePadPro2: mov al,1 mov dx,201h call read_gpp cmp eax,1 je near .error mov ebx,4 mov byte[pressed+ebx+0F0h],0 mov byte[pressed+ebx+0F1h],0 mov byte[pressed+ebx+0F2h],0 mov byte[pressed+ebx+0F3h],0 mov ebx,8 mov byte[pressed+ebx+0A8h],0 mov byte[pressed+ebx+0A9h],0 mov byte[pressed+ebx+0AAh],0 mov byte[pressed+ebx+0ABh],0 mov byte[pressed+ebx+0ACh],0 mov byte[pressed+ebx+0ADh],0 mov byte[pressed+ebx+0AEh],0 mov byte[pressed+ebx+0AFh],0 mov byte[pressed+ebx+0CAh],0 mov byte[pressed+ebx+0CBh],0 mov ebx,4 GPProHelp 0002h,0F2h ; left GPProHelp 0004h,0F3h ; right GPProHelp 0008h,0F1h ; down GPProHelp 0010h,0F0h ; up mov ebx,8 GPProHelp 0020h,0AEh ; r1 GPProHelp 0040h,0ACh ; l1 GPProHelp 0080h,0A8h ; red GPProHelp 0100h,0AAh ; yellow GPProHelp 0200h,0ABh ; green GPProHelp 0400h,0ADh ; l2 GPProHelp 0800h,0A9h ; blue GPProHelp 1000h,0AFh ; r2 GPProHelp 2000h,0CBh ; start GPProHelp 4000h,0CAh ; select .error ret NEWSYM SideWinder mov al,[NumSWs] mov [_SWCount],al mov dx,201h call _readSideWinder ;bit 0=error 1=up 2=dn 3=rt 4=lt 5=A 6=B 7=C 8=X 9=Y 10=Z 11=L 12=R 13=St 14=M ;k....L=L, R=R, start=start, M=select, X=y, Y=x, B=a, A=b ;sidewinder=snes .loop mov eax,[_SW1] xor ebx,ebx cmp byte[WhichSW],2 jne .noSW2 mov eax,[_SW2] mov ebx,08h .noSW2 cmp byte[WhichSW],3 jne .noSW3 mov eax,[_SW3] mov ebx,10h .noSW3 cmp byte[WhichSW],4 jne .noSW4 mov eax,[_SW4] mov ebx,18h .noSW4 inc byte[WhichSW] mov byte[pressed+ebx+0D4h],0 mov byte[pressed+ebx+0D5h],0 mov byte[pressed+ebx+0D6h],0 mov byte[pressed+ebx+0D7h],0 mov byte[pressed+ebx+088h],0 mov byte[pressed+ebx+089h],0 mov byte[pressed+ebx+08Ah],0 mov byte[pressed+ebx+08Bh],0 mov byte[pressed+ebx+08Ch],0 mov byte[pressed+ebx+08Dh],0 mov byte[pressed+ebx+08Eh],0 mov byte[pressed+ebx+08Fh],0 mov byte[pressed+ebx+0C8h],0 mov byte[pressed+ebx+0C9h],0 test ax,02h ; up jz .noup mov byte[pressed+ebx+0D4h],1 .noup test ax,04h ; down jz .nodown mov byte[pressed+ebx+0D5h],1 .nodown test ax,08h ; right jz .noright mov byte[pressed+ebx+0D7h],1 .noright test ax,10h ; left jz .noleft mov byte[pressed+ebx+0D6h],1 .noleft test ax,20h ; A jz .noa mov byte[pressed+ebx+088h],1 .noa test ax,40h ; B jz .nob mov byte[pressed+ebx+089h],1 .nob test ax,80h ; C jz .noc mov byte[pressed+ebx+08Ah],1 .noc test ax,100h ; X jz .nox mov byte[pressed+ebx+08Bh],1 .nox test ax,200h ; Y jz .noy mov byte[pressed+ebx+08Ch],1 .noy test ax,400h ; Z jz .noz mov byte[pressed+ebx+08Dh],1 .noz test ax,800h ; L jz .nol mov byte[pressed+ebx+08Eh],1 .nol test ax,1000h ; R jz .nor mov byte[pressed+ebx+08Fh],1 .nor test ax,2000h ; start jz .nostart mov byte[pressed+ebx+0C8h],1 .nostart test ax,4000h ; M jz .noselect mov byte[pressed+ebx+0C9h],1 .noselect mov al,[WhichSW] cmp al,[NumSWs] jbe near .loop ret ;return to calling procedure ;A8=buttons, CA=select/start, F0=movement (inc by 4) GamePadPro209: mov al,0 mov dx,209h call read_gpp cmp eax,1 je near .error xor ebx,ebx mov byte[pressed+ebx+170h],0 mov byte[pressed+ebx+171h],0 mov byte[pressed+ebx+172h],0 mov byte[pressed+ebx+173h],0 mov byte[pressed+ebx+128h],0 mov byte[pressed+ebx+129h],0 mov byte[pressed+ebx+12Ah],0 mov byte[pressed+ebx+12Bh],0 mov byte[pressed+ebx+12Ch],0 mov byte[pressed+ebx+12Dh],0 mov byte[pressed+ebx+12Eh],0 mov byte[pressed+ebx+12Fh],0 mov byte[pressed+ebx+14Ah],0 mov byte[pressed+ebx+14Bh],0 GPProHelp 0002h,1F2h ; left GPProHelp 0004h,1F3h ; right GPProHelp 0008h,1F1h ; down GPProHelp 0010h,1F0h ; up GPProHelp 0020h,1AEh ; r1 GPProHelp 0040h,1ACh ; l1 GPProHelp 0080h,1A8h ; red GPProHelp 0100h,1AAh ; yellow GPProHelp 0200h,1ABh ; green GPProHelp 0400h,1ADh ; l2 GPProHelp 0800h,1A9h ; blue GPProHelp 1000h,1AFh ; r2 GPProHelp 2000h,1CBh ; start GPProHelp 4000h,1CAh ; select .error ret GamePadPro2209: mov al,1 mov dx,209h call read_gpp cmp eax,1 je near .error mov ebx,4 mov byte[pressed+ebx+170h],0 mov byte[pressed+ebx+171h],0 mov byte[pressed+ebx+172h],0 mov byte[pressed+ebx+173h],0 mov ebx,8 mov byte[pressed+ebx+128h],0 mov byte[pressed+ebx+129h],0 mov byte[pressed+ebx+12Ah],0 mov byte[pressed+ebx+12Bh],0 mov byte[pressed+ebx+12Ch],0 mov byte[pressed+ebx+12Dh],0 mov byte[pressed+ebx+12Eh],0 mov byte[pressed+ebx+12Fh],0 mov byte[pressed+ebx+14Ah],0 mov byte[pressed+ebx+14Bh],0 mov ebx,4 GPProHelp 0002h,1F2h ; left GPProHelp 0004h,1F3h ; right GPProHelp 0008h,1F1h ; down GPProHelp 0010h,1F0h ; up mov ebx,8 GPProHelp 0020h,1AEh ; r1 GPProHelp 0040h,1ACh ; l1 GPProHelp 0080h,1A8h ; red GPProHelp 0100h,1AAh ; yellow GPProHelp 0200h,1ABh ; green GPProHelp 0400h,1ADh ; l2 GPProHelp 0800h,1A9h ; blue GPProHelp 1000h,1AFh ; r2 GPProHelp 2000h,1CBh ; start GPProHelp 4000h,1CAh ; select .error ret NEWSYM SideWinder209 mov al,[NumSWs209] mov [_SWCount],al mov dx,209h call _readSideWinder ;bit 0=error 1=up 2=dn 3=rt 4=lt 5=A 6=B 7=C 8=X 9=Y 10=Z 11=L 12=R 13=St 14=M ;k....L=L, R=R, start=start, M=select, X=y, Y=x, B=a, A=b ;sidewinder=snes .loop mov eax,[_SW1] xor ebx,ebx cmp byte[WhichSW],2 jne .noSW2 mov eax,[_SW2] mov ebx,08h .noSW2 cmp byte[WhichSW],3 jne .noSW3 mov eax,[_SW3] mov ebx,10h .noSW3 cmp byte[WhichSW],4 jne .noSW4 mov eax,[_SW4] mov ebx,18h .noSW4 inc byte[WhichSW] mov byte[pressed+ebx+154h],0 mov byte[pressed+ebx+155h],0 mov byte[pressed+ebx+156h],0 mov byte[pressed+ebx+157h],0 mov byte[pressed+ebx+108h],0 mov byte[pressed+ebx+109h],0 mov byte[pressed+ebx+10Ah],0 mov byte[pressed+ebx+10Bh],0 mov byte[pressed+ebx+10Ch],0 mov byte[pressed+ebx+10Dh],0 mov byte[pressed+ebx+10Eh],0 mov byte[pressed+ebx+10Fh],0 mov byte[pressed+ebx+148h],0 mov byte[pressed+ebx+149h],0 test ax,02h ; up jz .noup mov byte[pressed+ebx+154h],1 .noup test ax,04h ; down jz .nodown mov byte[pressed+ebx+155h],1 .nodown test ax,08h ; right jz .noright mov byte[pressed+ebx+157h],1 .noright test ax,10h ; left jz .noleft mov byte[pressed+ebx+156h],1 .noleft test ax,20h ; A jz .noa mov byte[pressed+ebx+108h],1 .noa test ax,40h ; B jz .nob mov byte[pressed+ebx+109h],1 .nob test ax,80h ; C jz .noc mov byte[pressed+ebx+10Ah],1 .noc test ax,100h ; X jz .nox mov byte[pressed+ebx+10Bh],1 .nox test ax,200h ; Y jz .noy mov byte[pressed+ebx+10Ch],1 .noy test ax,400h ; Z jz .noz mov byte[pressed+ebx+10Dh],1 .noz test ax,800h ; L jz .nol mov byte[pressed+ebx+10Eh],1 .nol test ax,1000h ; R jz .nor mov byte[pressed+ebx+10Fh],1 .nor test ax,2000h ; start jz .nostart mov byte[pressed+ebx+148h],1 .nostart test ax,4000h ; M jz .noselect mov byte[pressed+ebx+149h],1 .noselect mov al,[WhichSW] cmp al,[NumSWs209] jbe near .loop ret ;return to calling procedure ; Parallel SNES pad reader routines by Karl Stenerud ; Original design by Benji York: ; %macro PPortHelp 3 mov al, %1 out dx, al mov al, 0F8h out dx, al inc dx in al, dx dec dx and ax, %2 jnz %%nobutton mov byte[pressed+%3], 1 %%nobutton %endmacro %macro PPortHelpInv 3 ;needed for the pad 5 mov al, %1 out dx, al mov al, 0F8h out dx, al inc dx in al, dx dec dx and ax, %2 jz %%nobutton ;pad 5 is on pin 11, which is hardware inverted... mov byte[pressed+%3], 1 %%nobutton %endmacro NEWSYM GetParallelPlayer1 mov dx, 0378h mov byte[pressed+180h],0 mov byte[pressed+181h],0 mov byte[pressed+182h],0 mov byte[pressed+183h],0 mov byte[pressed+184h],0 mov byte[pressed+185h],0 mov byte[pressed+186h],0 mov byte[pressed+187h],0 mov byte[pressed+188h],0 mov byte[pressed+189h],0 mov byte[pressed+18Ah],0 mov byte[pressed+18Bh],0 PPortHelp 0FAh, 40h, 180h ;Mask 40h (pin 10 of lpt : data for pad 1) PPortHelp 0F9h, 40h, 181h PPortHelp 0F9h, 40h, 182h PPortHelp 0F9h, 40h, 183h PPortHelp 0F9h, 40h, 184h PPortHelp 0F9h, 40h, 185h PPortHelp 0F9h, 40h, 186h PPortHelp 0F9h, 40h, 187h PPortHelp 0F9h, 40h, 188h PPortHelp 0F9h, 40h, 189h PPortHelp 0F9h, 40h, 18Ah PPortHelp 0F9h, 40h, 18Bh ret NEWSYM GetParallelPlayer2 mov dx, 0378h mov byte[pressed+190h],0 mov byte[pressed+191h],0 mov byte[pressed+192h],0 mov byte[pressed+193h],0 mov byte[pressed+194h],0 mov byte[pressed+195h],0 mov byte[pressed+196h],0 mov byte[pressed+197h],0 mov byte[pressed+198h],0 mov byte[pressed+199h],0 mov byte[pressed+19Ah],0 mov byte[pressed+19Bh],0 PPortHelp 0FAh, 20h, 190h ;Mask 20h (pin 12 of lpt : data for pad 2) PPortHelp 0F9h, 20h, 191h PPortHelp 0F9h, 20h, 192h PPortHelp 0F9h, 20h, 193h PPortHelp 0F9h, 20h, 194h PPortHelp 0F9h, 20h, 195h PPortHelp 0F9h, 20h, 196h PPortHelp 0F9h, 20h, 197h PPortHelp 0F9h, 20h, 198h PPortHelp 0F9h, 20h, 199h PPortHelp 0F9h, 20h, 19Ah PPortHelp 0F9h, 20h, 19Bh ret NEWSYM GetParallelPlayer3 mov dx, 0378h mov byte[pressed+1A0h],0 mov byte[pressed+1A1h],0 mov byte[pressed+1A2h],0 mov byte[pressed+1A3h],0 mov byte[pressed+1A4h],0 mov byte[pressed+1A5h],0 mov byte[pressed+1A6h],0 mov byte[pressed+1A7h],0 mov byte[pressed+1A8h],0 mov byte[pressed+1A9h],0 mov byte[pressed+1AAh],0 mov byte[pressed+1ABh],0 PPortHelp 0FAh, 10h, 1A0h ;Mask 10h (pin 13 of lpt : data for pad 3) PPortHelp 0F9h, 10h, 1A1h PPortHelp 0F9h, 10h, 1A2h PPortHelp 0F9h, 10h, 1A3h PPortHelp 0F9h, 10h, 1A4h PPortHelp 0F9h, 10h, 1A5h PPortHelp 0F9h, 10h, 1A6h PPortHelp 0F9h, 10h, 1A7h PPortHelp 0F9h, 10h, 1A8h PPortHelp 0F9h, 10h, 1A9h PPortHelp 0F9h, 10h, 1AAh PPortHelp 0F9h, 10h, 1ABh ret NEWSYM GetParallelPlayer4 mov dx, 0378h mov byte[pressed+1B0h],0 mov byte[pressed+1B1h],0 mov byte[pressed+1B2h],0 mov byte[pressed+1B3h],0 mov byte[pressed+1B4h],0 mov byte[pressed+1B5h],0 mov byte[pressed+1B6h],0 mov byte[pressed+1B7h],0 mov byte[pressed+1B8h],0 mov byte[pressed+1B9h],0 mov byte[pressed+1BAh],0 mov byte[pressed+1BBh],0 PPortHelp 0FAh, 08h, 1B0h PPortHelp 0F9h, 08h, 1B1h ;Mask 08h (pin 15 of lpt : data for pad 4) PPortHelp 0F9h, 08h, 1B2h PPortHelp 0F9h, 08h, 1B3h PPortHelp 0F9h, 08h, 1B4h PPortHelp 0F9h, 08h, 1B5h PPortHelp 0F9h, 08h, 1B6h PPortHelp 0F9h, 08h, 1B7h PPortHelp 0F9h, 08h, 1B8h PPortHelp 0F9h, 08h, 1B9h PPortHelp 0F9h, 08h, 1BAh PPortHelp 0F9h, 08h, 1BBh ret NEWSYM GetParallelPlayer5 mov dx, 0378h mov byte[pressed+1c0h],0 mov byte[pressed+1c1h],0 mov byte[pressed+1c2h],0 mov byte[pressed+1c3h],0 mov byte[pressed+1c4h],0 mov byte[pressed+1c5h],0 mov byte[pressed+1c6h],0 mov byte[pressed+1c7h],0 mov byte[pressed+1c8h],0 mov byte[pressed+1c9h],0 mov byte[pressed+1cAh],0 mov byte[pressed+1cBh],0 PPortHelpInv 0FAh, 80h, 1c0h PPortHelpInv 0F9h, 80h, 1c1h ;Mask 80h (pin 11 of lpt : data for pad 5) PPortHelpInv 0F9h, 80h, 1c2h PPortHelpInv 0F9h, 80h, 1c3h PPortHelpInv 0F9h, 80h, 1c4h PPortHelpInv 0F9h, 80h, 1c5h PPortHelpInv 0F9h, 80h, 1c6h PPortHelpInv 0F9h, 80h, 1c7h PPortHelpInv 0F9h, 80h, 1c8h PPortHelpInv 0F9h, 80h, 1c9h PPortHelpInv 0F9h, 80h, 1cAh PPortHelpInv 0F9h, 80h, 1cBh ret NEWSYM SetInputDevice209 ; eax = pointer to devices, bl = device #, bh = player # (0-3) ; Sets keys according to input device selected cmp bl,0 jne near .nozero mov dword[eax],0 mov dword[eax+4],0 mov dword[eax+8],0 mov dword[eax+12],0 mov dword[eax+16],0 mov dword[eax+20],0 mov dword[eax+24],0 mov dword[eax+28],0 mov dword[eax+32],0 mov dword[eax+36],0 mov dword[eax+40],0 mov dword[eax+44],0 ret .nozero cmp bl,1 jne near .nokeyb cmp bh,1 ja near .exit cmp bh,1 je near .input2 mov dword[eax],54 mov dword[eax+4],28 mov dword[eax+8],72 mov dword[eax+12],80 mov dword[eax+16],75 mov dword[eax+20],77 mov dword[eax+24],82 mov dword[eax+28],71 mov dword[eax+32],73 mov dword[eax+36],83 mov dword[eax+40],79 mov dword[eax+44],81 ret .input2 mov dword[eax],56 mov dword[eax+4],29 mov dword[eax+8],37 mov dword[eax+12],50 mov dword[eax+16],49 mov dword[eax+20],51 mov dword[eax+24],31 mov dword[eax+28],32 mov dword[eax+32],33 mov dword[eax+36],44 mov dword[eax+40],45 mov dword[eax+44],46 ret .nokeyb cmp bl,2 jne near .no2buttons xor bl,bl cmp byte[pl1contrl],2 jne .nopl2a inc bl .nopl2a cmp byte[pl2contrl],2 jne .nopl2b inc bl .nopl2b cmp byte[pl3contrl],2 jne .nopl2c inc bl .nopl2c cmp byte[pl4contrl],2 jne .nopl2d inc bl .nopl2d cmp byte[pl5contrl],2 jne .nopl2e inc bl .nopl2e cmp bl,2 jae .2ndjoyst mov dword[eax+40],103h mov dword[eax+36],102h mov dword[eax+8],14Ch mov dword[eax+12],14Dh mov dword[eax+16],14Eh mov dword[eax+20],14Fh ret .2ndjoyst mov dword[eax+40],105h mov dword[eax+36],104h mov dword[eax+8],168h mov dword[eax+12],169h mov dword[eax+16],16Ah mov dword[eax+20],16Bh ret .no2buttons cmp bl,3 je .4buttons cmp bl,4 jne near .no4buttons .4buttons mov dword[eax+40],103h mov dword[eax+36],102h mov dword[eax+28],105h mov dword[eax+24],104h mov dword[eax+8],14Ch mov dword[eax+12],14Dh mov dword[eax+16],14Eh mov dword[eax+20],14Fh ret .no4buttons cmp bl,18 je .6buttons cmp bl,5 jne near .no6buttons .6buttons mov dword[eax+40],103h mov dword[eax+36],102h mov dword[eax+28],105h mov dword[eax+24],104h mov dword[eax+32],106h mov dword[eax+44],107h mov dword[eax+8],14Ch mov dword[eax+12],14Dh mov dword[eax+16],14Eh mov dword[eax+20],14Fh cmp bl,5 je .skip8b mov dword[eax+4],100h mov dword[eax],101h mov dword[eax+44],106h mov dword[eax+32],107h .skip8b ret .no6buttons cmp bl,6 jne near .nosw1 mov dword[eax+0],149h mov dword[eax+4],148h mov dword[eax+8],154h mov dword[eax+12],155h mov dword[eax+16],156h mov dword[eax+20],157h mov dword[eax+24],10Ch mov dword[eax+28],109h mov dword[eax+32],10Eh mov dword[eax+36],10Bh mov dword[eax+40],108h mov dword[eax+44],10Fh ret .nosw1 cmp bl,7 jne near .nosw2 mov dword[eax+0],149h+8 mov dword[eax+4],148h+8 mov dword[eax+8],154h+8 mov dword[eax+12],155h+8 mov dword[eax+16],156h+8 mov dword[eax+20],157h+8 mov dword[eax+24],10Ch+8 mov dword[eax+28],109h+8 mov dword[eax+32],10Eh+8 mov dword[eax+36],10Bh+8 mov dword[eax+40],108h+8 mov dword[eax+44],10Fh+8 ret .nosw2 cmp bl,8 jne near .nosw3 mov dword[eax+0],149h+8*2 mov dword[eax+4],148h+8*2 mov dword[eax+8],154h+8*2 mov dword[eax+12],155h+8*2 mov dword[eax+16],156h+8*2 mov dword[eax+20],157h+8*2 mov dword[eax+24],10Ch+8*2 mov dword[eax+28],109h+8*2 mov dword[eax+32],10Eh+8*2 mov dword[eax+36],10Bh+8*2 mov dword[eax+40],108h+8*2 mov dword[eax+44],10Fh+8*2 ret .nosw3 cmp bl,9 jne near .nosw4 mov dword[eax+0],149h+8*3 mov dword[eax+4],148h+8*3 mov dword[eax+8],154h+8*3 mov dword[eax+12],155h+8*3 mov dword[eax+16],156h+8*3 mov dword[eax+20],157h+8*3 mov dword[eax+24],10Ch+8*3 mov dword[eax+28],109h+8*3 mov dword[eax+32],10Eh+8*3 mov dword[eax+36],10Bh+8*3 mov dword[eax+40],108h+8*3 mov dword[eax+44],10Fh+8*3 ret .nosw4 cmp bl,10 jne near .nogrip0 mov dword[eax+0],14Ah mov dword[eax+4],14Bh mov dword[eax+8],170h mov dword[eax+12],171h mov dword[eax+16],172h mov dword[eax+20],173h mov dword[eax+24],129h mov dword[eax+28],12Bh mov dword[eax+32],12Ch mov dword[eax+36],128h mov dword[eax+40],12Ah mov dword[eax+44],12Eh ret .nogrip0 cmp bl,11 jne near .nogrip1 mov dword[eax+0],14Ah+8 mov dword[eax+4],14Bh+8 mov dword[eax+8],170h+4 mov dword[eax+12],171h+4 mov dword[eax+16],172h+4 mov dword[eax+20],173h+4 mov dword[eax+24],129h+8 mov dword[eax+28],12Bh+8 mov dword[eax+32],12Ch+8 mov dword[eax+36],128h+8 mov dword[eax+40],12Ah+8 mov dword[eax+44],12Eh+8 ret .nogrip1 cmp bl,14 jne near .nopp1 mov dword[eax+40],180h mov dword[eax+36],181h mov dword[eax+0],182h mov dword[eax+4],183h mov dword[eax+8],184h mov dword[eax+12],185h mov dword[eax+16],186h mov dword[eax+20],187h mov dword[eax+28],188h mov dword[eax+24],189h mov dword[eax+32],18Ah mov dword[eax+44],18Bh ret .nopp1 cmp bl,15 jne near .nopp2 mov dword[eax+40],190h mov dword[eax+36],191h mov dword[eax+0],192h mov dword[eax+4],193h mov dword[eax+8],194h mov dword[eax+12],195h mov dword[eax+16],196h mov dword[eax+20],197h mov dword[eax+28],198h mov dword[eax+24],199h mov dword[eax+32],19Ah mov dword[eax+44],19Bh ret .nopp2 cmp bl,16 jne near .nopp3 mov dword[eax+40],1A0h mov dword[eax+36],1A1h mov dword[eax+0],1A2h mov dword[eax+4],1A3h mov dword[eax+8],1A4h mov dword[eax+12],1A5h mov dword[eax+16],1A6h mov dword[eax+20],1A7h mov dword[eax+28],1A8h mov dword[eax+24],1A9h mov dword[eax+32],1AAh mov dword[eax+44],1ABh ret .nopp3 cmp bl,17 jne near .nopp4 mov dword[eax+40],1B0h mov dword[eax+36],1B1h mov dword[eax+0],1B2h mov dword[eax+4],1B3h mov dword[eax+8],1B4h mov dword[eax+12],1B5h mov dword[eax+16],1B6h mov dword[eax+20],1B7h mov dword[eax+28],1B8h mov dword[eax+24],1B9h mov dword[eax+32],1BAh mov dword[eax+44],1BBh ret .nopp4 cmp bl,19 jne near .nopp5 mov dword[eax+40],1c0h mov dword[eax+36],1c1h mov dword[eax+0],1c2h mov dword[eax+4],1c3h mov dword[eax+8],1c4h mov dword[eax+12],1c5h mov dword[eax+16],1c6h mov dword[eax+20],1c7h mov dword[eax+28],1c8h mov dword[eax+24],1c9h mov dword[eax+32],1cAh mov dword[eax+44],1cBh ret .nopp5 .exit ret NEWSYM JoyAsmEnd