ReC98/libs/master.lib/js_sense.asm

113 lines
2.1 KiB
NASM

; master library - PC-9801
;
; Description:
; ジョイスティック(キーボード)リアルタイム入力(js_sense)
;;
; Function/Procedures:
; int js_sense( void ) ;
;
; Parameters:
; none
;
; Returns:
; Current state of joystick 1 if it's connected, garbage otherwise
;
; Binding Target:
; Microsoft-C / Turbo-C / Turbo Pascal
;
; Running Target:
; PC-9801
;
; Requiring Resources:
; CPU: 8086
;
; Notes:
; 先に js_start()によってジョイスティックを使用するように初期設定されて
; いないと、ジョイスティックを無視します。
;
; Assembly Language Note:
;
;
; Compiler/Assembler:
; TASM 3.0
; OPTASM 1.6
;
; Author:
; 恋塚昭彦
; ZUN
;
; Revision History:
; 93/ 5/ 2 Initial:jssense.asm/master.lib 0.16
; 93/ 5/10 SAJ-98に対応したのかなあ?
; 94/ 2/28 [M0.23] js_2player, js_shift, js_keyassign対応…
; 94/ 7/ 3 [M0.23] ESCキー状態を1P4の上(1P5?)に乗せた
; TH03 ZUN removes:
; • SENSE_KEY (internal keyboard → joystick mapping, would have
; allowed the caller to support both by just using the js_* API)
; • SAJ-98 support
; • the reliablility of js_sense()'s return value (AX remains
; unchanged if no joystick is connected)
; • Support for two joysticks in general
; • js_sense2() (fills js_stat[] with just the keyboard input)
; TH04 ZUN further reduces js_sense() to the bare minimum of
; instructions, even moving the joystick existence check to the
; call site.
SOUND_JOY proc near
mov BH,0fh
call SOUND_O
mov DX,188h
mov AL,0eh
out DX,AL
inc DX
inc DX
in AL,DX
not AL
ret
SOUND_JOY endp
func JS_SENSE ; {
if GAME eq 3
push BP
push SI ; joy stick 1
push DI ; joy stick 2
xor BP,BP
cmp js_bexist,0
je short NO_STICK
endif
pushf
CLI
; ジョイスティックからの読み取り
mov BL,080h ; JOYSTICK1
call SOUND_JOY
and AX,003fh ; b,a,right,left,forward,back
if GAME eq 3
mov SI,AX
popf
NO_STICK:
or js_stat,SI
pop DI
pop SI
pop BP
else
popf
endif
ret
endfunc ; }
SAJOUT proc near
xchg DX,BX
out DX,AL
xchg DX,BX
in AL,DX
not AL
ret
SAJOUT endp