home *** CD-ROM | disk | FTP | other *** search
/ C++ Games Programming / CPPGAMES.ISO / mt / mio401.asm < prev    next >
Assembly Source File  |  1990-03-06  |  4KB  |  129 lines

  1. ; MIO401.ASM  c calls for mpu-401 input/output. Medium memory model version.
  2.  
  3. DATAPORT  EQU   330H    ;MPU401 DATA PORT
  4. STATPORT  EQU   331H    ;MPU401 STATUS PORT
  5. DRR     EQU     040H
  6. MPUACK  EQU     0FEH    ;MPU401 CODES: ACKNOWLEGE
  7.  
  8. TRIES   EQU     0FFFH   ;MAXIMUM TRIES ON GETTING RESPONSE FROM 401
  9. ;----------------------------------------------------------------
  10. PUBLIC  _getdata, _putdata, _putcmd
  11. ;----------------------------------------------------------------
  12.  
  13. SAVSTK  MACRO           ;MACRO TO SAVE REGS FOR C FUNCTION
  14.         PUSH    BP
  15.         MOV     BP,SP
  16.         PUSH    DI
  17.         PUSH    SI
  18.         ENDM
  19.         
  20. RCLSTK  MACRO           ;MACRO TO RECALL SAVED REGS FOR C
  21.         POP     SI
  22.         POP     DI
  23.         MOV     SP,BP
  24.         POP     BP
  25.         ENDM
  26.  
  27. ;----------------------------------------------------------------
  28.  
  29. DOSSEG
  30. .MODEL medium
  31.  
  32. .DATA
  33. ; no near data
  34.  
  35. .FARDATA
  36. ; no far data
  37.  
  38. .CODE
  39. ;----------------------------------------------------------------
  40. ;       putcmd(n)
  41. ;       output a byte of data to MPU401, check for acknowledge
  42.  
  43. _putcmd PROC far
  44.         SAVSTK
  45.         MOV     DX,STATPORT
  46.         MOV     CX,TRIES        ;RETRY COUNTER IN CL
  47. LBL1:   IN      AL,DX           ;READ STATUS
  48.         TEST    AL,DRR          ;FIND IF BIT 6 = 1
  49.         JZ      LBL2            ;OK SO CONTINUE
  50.         DEC     CX
  51.         CMP     CX,1            ;USED UP ALL TRIES?
  52.         JGE     LBL1            ;RETRY
  53.         MOV     AX,-1
  54.         JMP     LBL5            ;QUIT RETURNING -1
  55.  
  56. LBL2:
  57.         MOV     AX,[BP+6]       ;PUT CHAR (AS INT) IN AX (AL)
  58.         OUT     DX,AL           ;OUTPUT CHAR
  59.  
  60.         MOV     CX,TRIES
  61. LBL3:   IN      AL,DX           ;READ STATUS
  62.         ROL     AL,1            ;PUT BIT 7 TO CARRY
  63.         JNB     LBL4            ;IF CARRY <> 1, NOT READY
  64.         DEC     CX
  65.         CMP     CX,1            ;USED UP ALL TRIES?
  66.         JGE     LBL3            ;RETRY
  67.         MOV     AX,-1
  68.         JMP     LBL5            ;QUIT RETURNING -1
  69.  
  70. LBL4:   MOV     DX,DATAPORT     ;ELSE READ DATA
  71.         IN      AL,DX
  72.         CMP     AL,MPUACK
  73.         JZ      LBL5            ;GOT ACK SO RETURN
  74.         MOV     AX,-1           ;IF NOT, RETURN -1
  75. LBL5:
  76.         RCLSTK
  77.         RET
  78. _putcmd ENDP
  79.  
  80. ;----------------------------------------------------------------
  81. ;       getdata()
  82. ;       get a byte of data from MPU401
  83.  
  84. _getdata PROC far
  85.         SAVSTK
  86.         MOV     DX,STATPORT
  87.         MOV     CX,TRIES        ;RETRY COUNTER IN CL
  88. LBL6:   IN      AL,DX           ;READ STATUS
  89.         ROL     AL,1            ;PUT BIT 7 TO CARRY
  90.         JNB     LBL7            ;IF CARRY <> 1, NOT READY
  91.         DEC     CX
  92.         CMP     CX,1            ;USED UP ALL TRIES?
  93.         JGE     LBL6            ;RETRY
  94.         MOV     AX,-1
  95.         JMP     GEND            ;QUIT RETURNING -1
  96.  
  97. LBL7:   MOV     DX,DATAPORT     ;ELSE READ DATA
  98.         MOV     AH,0            ;CLEAR AH FOR C RETURN
  99.         IN      AL,DX
  100. GEND:   RCLSTK
  101.         RET
  102. _getdata ENDP
  103.  
  104. ;----------------------------------------------------------------
  105. ;       putdata()
  106. ;       send a byte of data to MPU401
  107.  
  108. _putdata PROC far
  109.         SAVSTK
  110.         MOV     DX,STATPORT
  111.         MOV     CX,TRIES        ;RETRY COUNTER IN CL
  112. LBL8:   IN      AL,DX           ;READ STATUS
  113.         TEST    AL,DRR          ;TEST BIT 6
  114.         JZ      LBL9            ;OK SO CONTINUE
  115.         DEC     CX
  116.         CMP     CX,1            ;USED UP ALL TRIES?
  117.         JGE     LBL8            ;RETRY
  118.         MOV     AX,-1
  119.         JMP     LBL10           ;QUIT RETURNING -1
  120.  
  121. LBL9:   MOV     DX,DATAPORT
  122.         MOV     AX,[BP+6]       ;PUT DATA IN AX (AL)
  123.         OUT     DX,AL
  124. LBL10:  RCLSTK
  125.         RET
  126. _putdata ENDP
  127.  
  128.         END
  129.