136 lines
2.0 KiB
NASM
136 lines
2.0 KiB
NASM
|
.386
|
||
|
.MODEL small
|
||
|
|
||
|
.DATA
|
||
|
|
||
|
|
||
|
|
||
|
.CODE
|
||
|
|
||
|
IF 0
|
||
|
#define PEL_WRITE_ADR 0x3c8
|
||
|
#define PEL_READ_ADR 0x3c7
|
||
|
#define PEL_DATA 0x3c9
|
||
|
ENDIF
|
||
|
|
||
|
;================
|
||
|
;
|
||
|
; I_DivException
|
||
|
;
|
||
|
;================
|
||
|
|
||
|
PROC I_DivException_
|
||
|
PUBLIC I_DivException_
|
||
|
mov edx,03c9h
|
||
|
mov al,63
|
||
|
out dx,al
|
||
|
|
||
|
mov ebx,0ffffffh
|
||
|
mov eax,[ebx]
|
||
|
retf
|
||
|
ENDP
|
||
|
|
||
|
;================
|
||
|
;
|
||
|
; I_SetDivException
|
||
|
;
|
||
|
;================
|
||
|
|
||
|
PROC I_SetDivException_
|
||
|
PUBLIC I_SetDivException_
|
||
|
pusha
|
||
|
|
||
|
mov eax,0212h
|
||
|
mov ebx,0
|
||
|
mov ecx,cs
|
||
|
mov edx,OFFSET I_DivException_
|
||
|
int 31h
|
||
|
jnc good
|
||
|
|
||
|
popa
|
||
|
mov eax,0
|
||
|
ret
|
||
|
|
||
|
good:
|
||
|
popa
|
||
|
mov eax,1
|
||
|
ret
|
||
|
|
||
|
ENDP
|
||
|
|
||
|
|
||
|
;================
|
||
|
;
|
||
|
; I_ReadJoystick
|
||
|
;
|
||
|
; Read the absolute joystick values
|
||
|
; returns false if not connected
|
||
|
;================
|
||
|
|
||
|
.data
|
||
|
|
||
|
_joystickx dd 0
|
||
|
_joysticky dd 0
|
||
|
PUBLIC _joystickx, _joysticky
|
||
|
|
||
|
.code
|
||
|
|
||
|
PROC I_ReadJoystick_
|
||
|
PUBLIC I_ReadJoystick_
|
||
|
pusha
|
||
|
pushf ; state of interrupt flag
|
||
|
cli
|
||
|
|
||
|
mov dx,0201h
|
||
|
in al,dx
|
||
|
out dx,al ; Clear the resistors
|
||
|
|
||
|
mov ah,1 ; Get masks into registers
|
||
|
mov ch,2
|
||
|
|
||
|
xor esi,esi ; Clear count registers
|
||
|
xor edi,edi
|
||
|
xor ebx,ebx ; Clear high byte of bx for later
|
||
|
|
||
|
mov ebp,10000 ; joystick is disconnected if value is this big
|
||
|
|
||
|
jloop:
|
||
|
in al,dx ; Get bits indicating whether all are finished
|
||
|
|
||
|
dec ebp ; Check bounding register
|
||
|
jz bad ; We have a silly value - abort
|
||
|
|
||
|
mov bl,al ; Duplicate the bits
|
||
|
and bl,ah ; Mask off useless bits (in [xb])
|
||
|
add esi,ebx ; Possibly increment count register
|
||
|
mov cl,bl ; Save for testing later
|
||
|
|
||
|
mov bl,al
|
||
|
and bl,ch ; [yb]
|
||
|
add edi,ebx
|
||
|
|
||
|
add cl,bl
|
||
|
jnz jloop ; If both bits were 0, drop out
|
||
|
|
||
|
done:
|
||
|
mov [_joystickx],esi
|
||
|
shr edi,1 ; because 2s were added
|
||
|
mov [_joysticky],edi
|
||
|
|
||
|
popf ; restore interrupt flag
|
||
|
popa
|
||
|
mov eax,1 ; read was ok
|
||
|
ret
|
||
|
|
||
|
bad:
|
||
|
popf ; restore interrupt flag
|
||
|
popa
|
||
|
xor eax, eax ; read was bad
|
||
|
ret
|
||
|
|
||
|
ENDP
|
||
|
|
||
|
|
||
|
END
|
||
|
|