123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- .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_
- pushad
- 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
- popad
- mov eax,1 ; read was ok
- ret
- bad:
- popf ; restore interrupt flag
- popad
- xor eax, eax ; read was bad
- ret
- ENDP
- END
|