📄 _joy.asm
字号:
;****************************************************************************;*;* SciTech OS Portability Manager Library;*;* ========================================================================;*;* The contents of this file are subject to the SciTech MGL Public;* License Version 1.0 (the "License"); you may not use this file;* except in compliance with the License. You may obtain a copy of;* the License at http://www.scitechsoft.com/mgl-license.txt;*;* Software distributed under the License is distributed on an;* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or;* implied. See the License for the specific language governing;* rights and limitations under the License.;*;* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.;*;* The Initial Developer of the Original Code is SciTech Software, Inc.;* All Rights Reserved.;*;* ========================================================================;*;* Language: 80386 Assembler;* Environment: Intel x86, any OS;*;* Description: Assembly language support routines for reading analogue;* joysticks.;*;**************************************************************************** idealinclude "scitech.mac" ; Memory model macrosifdef flatmodelheader _joy ; Set up memory modelbegcodeseg _joy ; Start of code segment;----------------------------------------------------------------------------; initTimer;----------------------------------------------------------------------------; Sets up 8253 timer 2 (PC speaker) to start timing, but not produce output.;----------------------------------------------------------------------------cprocstatic initTimer; Start timer 2 counting in al,61h and al,0FDh ; Disable speaker output (just in case) or al,1 out 61h,al; Set the timer 2 count to 0 again to start the timing interval. mov al,10110100b ; set up to load initial (timer 2) out 43h,al ; timer count sub al,al out 42h,al ; load count lsb out 42h,al ; load count msb retcprocend;----------------------------------------------------------------------------; readTimer2;----------------------------------------------------------------------------; Reads the number of ticks from the 8253 timer chip using channel 2 (PC; speaker). This is non-destructive and does not screw up other libraries.;----------------------------------------------------------------------------cprocstatic readTimer xor al,al ; Latch timer 0 command out 43h,al ; Latch timer in al,42h ; least significant byte mov ah,al in al,42h ; most significant byte xchg ah,al and eax,0FFFFh retcprocend;----------------------------------------------------------------------------; exitTimer;----------------------------------------------------------------------------; Stops the 8253 timer 2 (PC speaker) counting;----------------------------------------------------------------------------cprocstatic exitTimer; Stop timer 2 from counting push eax in al,61h and al,0FEh out 61h,al ; Some programs have a problem if we change the control port; better change it; to something they expect (mode 3 - square wave generator)... mov al,0B6h out 43h,al pop eax retcprocend;----------------------------------------------------------------------------; int _EVT_readJoyAxis(int jmask,int *axis);;----------------------------------------------------------------------------; Function to poll the joystick to read the current axis positions.;----------------------------------------------------------------------------cprocstart _EVT_readJoyAxis ARG jmask:UINT, axis:DPTR LOCAL firstTick:UINT, lastTick:UINT, totalTicks:UINT = LocalSize enter_c mov ebx,[jmask] mov edi,[axis] mov ecx,(1193180/100) and ebx,01111b ; Mask out supported axes mov dx,201h ; DX := joystick I/O port call initTimer ; Start timer 2 counting call readTimer ; Returns counter in EAX mov [lastTick],eax@@WaitStable: in al,dx and al,bl ; Wait for the axes in question to be jz @@Stable ; done reading... call readTimer ; Returns counter in EAX xchg eax,[lastTick] cmp eax,[lastTick] jb @@1 sub eax,[lastTick]@@1: add [totalTicks],eax cmp [totalTicks],ecx ; Check for timeout jae @@Stable jmp @@WaitStable@@Stable: mov al,0FFh out dx,al ; Start joystick reading call initTimer ; Start timer 2 counting call readTimer ; Returns counter in EAX mov [firstTick],eax ; Store initial count mov [lastTick],eax mov [DWORD totalTicks],0 cli@@PollLoop: in al,dx ; Read Joystick port not al and al,bl ; Mask off channels we don't want to read jnz @@AxisFlipped ; See if any of the channels flipped call readTimer ; Returns counter in EAX xchg eax,[lastTick] cmp eax,[lastTick] jb @@2 sub eax,[lastTick]@@2: add [totalTicks],eax cmp [totalTicks],ecx ; Check for timeout jae @@TimedOut jmp @@PollLoop@@AxisFlipped: xor esi,esi mov ah,1 test al,ah jnz @@StoreCount ; Joystick 1, X axis flipped add esi,4 mov ah,2 test al,ah jnz @@StoreCount ; Joystick 1, Y axis flipped add esi,4 mov ah,4 test al,ah jnz @@StoreCount ; Joystick 2, X axis flipped add esi,4 ; Joystick 2, Y axis flipped mov ah,8@@StoreCount: or bh,ah ; Indicate this axis is active xor bl,ah ; Unmark the channels that just tripped call readTimer ; Returns counter in EAX xchg eax,[lastTick] cmp eax,[lastTick] jb @@3 sub eax,[lastTick]@@3: add [totalTicks],eax mov eax,[totalTicks] mov [edi+esi],eax ; Record the time this channel flipped cmp bl,0 ; If there are more channels to read, jne @@PollLoop ; keep looping@@TimedOut: sti call exitTimer ; Stop timer 2 counting movzx eax,bh ; Return the mask of working axes leave_c retcprocend;----------------------------------------------------------------------------; int _EVT_readJoyButtons(void);;----------------------------------------------------------------------------; Function to poll the current joystick buttons;----------------------------------------------------------------------------cprocstart _EVT_readJoyButtons mov dx,0201h in al,dx shr al,4 not al and eax,0Fh retcprocendendcodeseg _joyendif END ; End of module
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -