Category : Pascal Source Code
Archive   : JOYGA.ZIP
Filename : JOYSTK.ASM

 
Output of file : JOYSTK.ASM contained in archive : JOYGA.ZIP
; Assembler routines for Turbo Pascal 4.0 unit JoyStk
; John Haluska CIS 74000,1106

DATA SEGMENT BYTE PUBLIC
EXTRN JoyMaxCt : WORD ;Pascal variable for joystick position
DATA ENDS

CODE SEGMENT BYTE PUBLIC
ASSUME CS : CODE, DS : DATA
PUBLIC JoyStkPos, JoyStkBtn, JoyStkPresent, GetClkTicks

;-----------------------------------------------------------------------------
;procedure JoyStkPos (N : byte; var X,Y : integer);
; Return X, Y position of joystick 0 or 1

Y EQU DWORD PTR [BP+6] ;position of X, Y pointers
X EQU DWORD PTR [BP+10] ; on stack
N EQU BYTE PTR [BP+14] ;pointer joystick 0 or 1 input

JoyStkPos PROC FAR
PUSH BP ;save BP
MOV BP,SP ;set up stack frame
MOV DX,201h ;game adapter address in DX
MOV CX,JoyMaxCt ;for LOOP to setup constant frame time
MOV AL,N ;get joystick number (0 or 1)
XOR DI,DI ;zero
XOR SI,SI ; registers
CLI ;disable interrupts
TEST AL,1 ;joystick 0 or 1?
JNE JSP1 ;jump if joystick 1
OUT DX,AL ;fire one shots on game adapter port
NEXT0: IN AL,DX ;read data from game adapter port
TEST AL,1 ;is joystick 0 X axis bit = 1?
JE DONEX ;jump if bit = 0 (done)
INC DI ;increment X counter
DONEX: TEST AL,2 ;is joystick 0 Y axis bit = 1?
JE DONEY ;jump if bit = 0 (done)
INC SI ;increment Y counter
DONEY: LOOP NEXT0 ;repeat MaxCount times
JMP JSP2 ;done with joystick 0
JSP1: OUT DX,AL ;fire one shots on game adapter port
NEXT1: IN AL,DX ;read data from game adapter port
TEST AL,4 ;is joystick 1 X axis bit = 1?
JE DONEX1 ;jump if bit = 0 (done)
INC DI ;increment X counter
DONEX1: TEST AL,8 ;is joystick 1 Y axis bit = 1?
JE DONEY1 ;jump if bit = 0 (done)
INC SI ;increment X counter
DONEY1: LOOP NEXT1 ;repeat MaxCount times
JSP2: STI ;enable interrupts
CMP DI,JoyMaxCt ;X axis = MaxCount?
JNE JSP3 ;no
XOR DI,DI ;yes, zero output
JSP3: CMP SI,JoyMaxCt ;Y axis = MaxCount?
JNE JSP4 ;no
XOR SI,SI ;yes, zero output
JSP4: MOV AX,DI ;move X result to AX
LES DI,X ;load address
STOSW ;ES:DI points to X
MOV AX,SI ;move Y result to AX
LES DI,Y ;ES:DI points to Y
STOSW ;store data
MOV SP,BP
POP BP ;restore base pointer
RET 10 ;remove parameters and return
JoyStkPos ENDP
;-----------------------------------------------------------------------------
;function JoyStkBtn(Num:byte) : boolean;
; Return position (true-button pressed or false-button not pressed) for
; button 16, 32, 64 or 128 corresponding to bit positions 4 to 7. No
; contact debounce is provided.

Num EQU BYTE PTR [BP+6] ;pointer for button number (16,32,64,128)

JoyStkBtn PROC FAR
PUSH BP ;save BP
MOV BP,SP ;set up stack frame
XOR CL,CL ;set return msg to false (off)
MOV BL,Num ;get button number (16, 32, 64, 128)
MOV DX,201h ;game adapter port address
IN AL,DX ;read data from game adapter port
TEST AL,BL ;is bit for button num off (1) or on (0)
JNE JSB1 ;jump if on
MOV CL,1 ;set return to true (on)
JSB1: MOV AL,CL ;return must be in AL
MOV SP,BP ;
POP BP ;restore base pointer
RET 2 ;remove parameters and return
JoyStkBtn ENDP
;-----------------------------------------------------------------------------
;function JoyStkPresent : boolean;
; Returns true if a game adapter interface is present

JoyStkPresent PROC FAR
XOR BL,BL ;set return msg to false (off)
INT 11h ;equipment list interrupt
TEST AX,1000h ;test game adapter bit
JE PR1 ;jump if 0
MOV BL,1 ;set return msg to true (on)
PR1: MOV AL,BL ;return must be in AL
RET
JoyStkPresent ENDP
;-----------------------------------------------------------------------------
;function GetClkTicks : longint;
; Return DOS time in ticks (18.2/sec) in DX,AX. The ticks/second is
; 1193180/65535. The midnight value is 1573040.
; Ref: Programmer's Guide To PC, Peter Norton, ISBN 0-914845-46-2, p223

GetClkTicks PROC FAR
XOR AX,AX ;zero register
MOV ES,AX
CLI ;disable interrupts
MOV AX,ES:[046Ch] ;low order ticks
MOV DX,ES:[046Eh] ;high order ticks
STI ;enable interrupts
RET
GetClkTicks ENDP
;-----------------------------------------------------------------------------

CODE ENDS
END


  3 Responses to “Category : Pascal Source Code
Archive   : JOYGA.ZIP
Filename : JOYSTK.ASM

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/