📄 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 JoyAsmStart
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -