www.pudn.com > zsnes117b-src.zip > joy.asm


;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 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 
 
;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 
 
 
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] 
  loop .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 
  loop .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 
  loop .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 = PPad LPT2, 17 = PPad2 LPT2, 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 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 
   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 
 
NEWSYM GetParallelPlayer1 
    mov dx, 0378h		; may want to make this configurable 
    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 
    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		; may want to make this configurable 
    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 
    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, 0278h               ; may want to make this configurable 
    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, 40h, 1A0h 
    PPortHelp 0F9h, 40h, 1A1h 
    PPortHelp 0F9h, 40h, 1A2h 
    PPortHelp 0F9h, 40h, 1A3h 
    PPortHelp 0F9h, 40h, 1A4h 
    PPortHelp 0F9h, 40h, 1A5h 
    PPortHelp 0F9h, 40h, 1A6h 
    PPortHelp 0F9h, 40h, 1A7h 
    PPortHelp 0F9h, 40h, 1A8h 
    PPortHelp 0F9h, 40h, 1A9h 
    PPortHelp 0F9h, 40h, 1AAh 
    PPortHelp 0F9h, 40h, 1ABh 
    ret 
 
NEWSYM GetParallelPlayer4 
    mov dx, 0278h               ; may want to make this configurable 
    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, 20h, 1B0h 
    PPortHelp 0F9h, 20h, 1B1h 
    PPortHelp 0F9h, 20h, 1B2h 
    PPortHelp 0F9h, 20h, 1B3h 
    PPortHelp 0F9h, 20h, 1B4h 
    PPortHelp 0F9h, 20h, 1B5h 
    PPortHelp 0F9h, 20h, 1B6h 
    PPortHelp 0F9h, 20h, 1B7h 
    PPortHelp 0F9h, 20h, 1B8h 
    PPortHelp 0F9h, 20h, 1B9h 
    PPortHelp 0F9h, 20h, 1BAh 
    PPortHelp 0F9h, 20h, 1BBh 
    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 
.exit 
    ret