⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 joy.asm

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;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 + -