Files
ZSNES/zsnes/src/dos/joy.asm
2001-09-08 02:02:27 +00:00

1754 lines
37 KiB
NASM

;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