home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / JOYGA.ZIP / JOYSTK.ASM < prev    next >
Encoding:
Assembly Source File  |  1988-02-13  |  5.9 KB  |  122 lines

  1. ;   Assembler routines for Turbo Pascal 4.0 unit JoyStk
  2. ;   John Haluska  CIS 74000,1106
  3.  
  4. DATA    SEGMENT    BYTE PUBLIC
  5.         EXTRN      JoyMaxCt : WORD ;Pascal variable for joystick position
  6. DATA    ENDS
  7.  
  8. CODE    SEGMENT    BYTE PUBLIC
  9.         ASSUME     CS : CODE, DS : DATA
  10.         PUBLIC     JoyStkPos, JoyStkBtn, JoyStkPresent, GetClkTicks
  11.  
  12. ;-----------------------------------------------------------------------------
  13. ;procedure JoyStkPos (N : byte; var X,Y : integer);
  14. ;          Return X, Y position of joystick 0 or 1
  15.  
  16. Y       EQU      DWORD PTR [BP+6]  ;position of X, Y pointers
  17. X       EQU      DWORD PTR [BP+10] ;   on stack
  18. N       EQU      BYTE PTR [BP+14]  ;pointer joystick 0 or 1 input
  19.  
  20. JoyStkPos        PROC  FAR
  21.         PUSH     BP                ;save BP
  22.         MOV      BP,SP             ;set up stack frame
  23.         MOV      DX,201h           ;game adapter address in DX
  24.         MOV      CX,JoyMaxCt       ;for LOOP to setup constant frame time
  25.         MOV      AL,N              ;get joystick number (0 or 1)
  26.         XOR      DI,DI             ;zero
  27.         XOR      SI,SI             ;  registers
  28.         CLI                        ;disable interrupts
  29.         TEST     AL,1              ;joystick 0 or 1?
  30.         JNE      JSP1              ;jump if joystick 1
  31.         OUT      DX,AL             ;fire one shots on game adapter port
  32. NEXT0:  IN       AL,DX             ;read data from game adapter port
  33.         TEST     AL,1              ;is joystick 0 X axis bit = 1?
  34.         JE       DONEX             ;jump if bit = 0 (done)
  35.         INC      DI                ;increment X counter
  36. DONEX:  TEST     AL,2              ;is joystick 0 Y axis bit = 1?
  37.         JE       DONEY             ;jump if bit = 0 (done)
  38.         INC      SI                ;increment Y counter
  39. DONEY:  LOOP     NEXT0             ;repeat MaxCount times
  40.         JMP      JSP2              ;done with joystick 0
  41. JSP1:   OUT      DX,AL             ;fire one shots on game adapter port
  42. NEXT1:  IN       AL,DX             ;read data from game adapter port
  43.         TEST     AL,4              ;is joystick 1 X axis bit = 1?
  44.         JE       DONEX1            ;jump if bit = 0 (done)
  45.         INC      DI                ;increment X counter
  46. DONEX1: TEST     AL,8              ;is joystick 1 Y axis bit = 1?
  47.         JE       DONEY1            ;jump if bit = 0 (done)
  48.         INC      SI                ;increment X counter
  49. DONEY1: LOOP     NEXT1             ;repeat MaxCount times
  50. JSP2:   STI                        ;enable interrupts
  51.         CMP      DI,JoyMaxCt       ;X axis = MaxCount?
  52.         JNE      JSP3              ;no
  53.         XOR      DI,DI             ;yes, zero output
  54. JSP3:   CMP      SI,JoyMaxCt       ;Y axis = MaxCount?
  55.         JNE      JSP4              ;no
  56.         XOR      SI,SI             ;yes, zero output
  57. JSP4:   MOV      AX,DI             ;move X result to AX
  58.         LES      DI,X              ;load address
  59.         STOSW                      ;ES:DI points to X
  60.         MOV      AX,SI             ;move Y result to AX
  61.         LES      DI,Y              ;ES:DI points to Y
  62.         STOSW                      ;store data
  63.         MOV      SP,BP
  64.         POP      BP                ;restore base pointer
  65.         RET      10                ;remove parameters and return
  66. JoyStkPos        ENDP
  67. ;-----------------------------------------------------------------------------
  68. ;function JoyStkBtn(Num:byte) : boolean;
  69. ;         Return position (true-button pressed or false-button not pressed) for
  70. ;         button 16, 32, 64 or 128 corresponding to bit positions 4 to 7.  No
  71. ;         contact debounce is provided.
  72.  
  73. Num     EQU      BYTE PTR [BP+6]   ;pointer for button number (16,32,64,128)
  74.  
  75. JoyStkBtn        PROC FAR
  76.         PUSH     BP                ;save BP
  77.         MOV      BP,SP             ;set up stack frame
  78.         XOR      CL,CL             ;set return msg to false (off)
  79.         MOV      BL,Num            ;get button number (16, 32, 64, 128)
  80.         MOV      DX,201h           ;game adapter port address
  81.         IN       AL,DX             ;read data from game adapter port
  82.         TEST     AL,BL             ;is bit for button num off (1) or on (0)
  83.         JNE      JSB1              ;jump if on
  84.         MOV      CL,1              ;set return to true (on)
  85. JSB1:   MOV      AL,CL             ;return must be in AL
  86.         MOV      SP,BP             ;
  87.         POP      BP                ;restore base pointer
  88.         RET      2                 ;remove parameters and return
  89. JoyStkBtn        ENDP
  90. ;-----------------------------------------------------------------------------
  91. ;function JoyStkPresent : boolean;
  92. ;         Returns true if a game adapter interface is present
  93.  
  94. JoyStkPresent    PROC FAR
  95.         XOR      BL,BL             ;set return msg to false (off)
  96.         INT      11h               ;equipment list interrupt
  97.         TEST     AX,1000h          ;test game adapter bit
  98.         JE       PR1               ;jump if 0
  99.         MOV      BL,1              ;set return msg to true (on)
  100. PR1:    MOV      AL,BL             ;return must be in AL
  101.         RET
  102. JoyStkPresent    ENDP
  103. ;-----------------------------------------------------------------------------
  104. ;function GetClkTicks : longint;
  105. ;         Return DOS time in ticks (18.2/sec) in DX,AX.  The ticks/second is
  106. ;         1193180/65535.  The midnight value is 1573040.
  107. ;         Ref: Programmer's Guide To PC, Peter Norton, ISBN 0-914845-46-2, p223
  108.  
  109. GetClkTicks      PROC FAR
  110.         XOR      AX,AX             ;zero register
  111.         MOV      ES,AX
  112.         CLI                        ;disable interrupts
  113.         MOV      AX,ES:[046Ch]     ;low order ticks
  114.         MOV      DX,ES:[046Eh]     ;high order ticks
  115.         STI                        ;enable interrupts
  116.         RET
  117. GetClkTicks      ENDP
  118. ;-----------------------------------------------------------------------------
  119.  
  120. CODE    ENDS
  121.         END
  122.