-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathMPU401.INC
146 lines (119 loc) · 5.29 KB
/
MPU401.INC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
;ÛÛ ÛÛ
;ÛÛ MPU401.INC ÛÛ
;ÛÛ ÛÛ
;ÛÛ IBM Audio Interface Library -- Roland MPU-401 I/O routines ÛÛ
;ÛÛ ÛÛ
;ÛÛ Version 1.00 of 27-Sep-91: Initial version for AIL V2.0 release ÛÛ
;ÛÛ ÛÛ
;ÛÛ 8086 ASM source compatible with Turbo Assembler v2.0 or later ÛÛ
;ÛÛ Author: John Miles ÛÛ
;ÛÛ ÛÛ
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
;ÛÛ ÛÛ
;ÛÛ Copyright (C) 1991, 1992 Miles Design, Inc. ÛÛ
;ÛÛ ÛÛ
;ÛÛ Miles Design, Inc. ÛÛ
;ÛÛ 10926 Jollyville #308 ÛÛ
;ÛÛ Austin, TX 78759 ÛÛ
;ÛÛ (512) 345-2642 / FAX (512) 338-9630 / BBS (512) 454-9990 ÛÛ
;ÛÛ ÛÛ
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
DATA_IO dw ? ;IO_addr
STAT_COM dw ? ;IO_addr+1
;****************************************************************************
set_IO_parms PROC IO_ADDR,IRQ,DMA,DRQ
USES ds,si,di
mov ax,[IO_ADDR]
mov DATA_IO,ax
inc ax
mov STAT_COM,ax
ret
ENDP
;****************************************************************************
detect_device PROC H,IO_ADDR,IRQ,DMA,DRQ ;Attempt to detect MPU-401 card
USES ds,si,di
pushf
cli
push DATA_IO ;preserve current I/O address
push STAT_COM
call set_IO_parms C,[IO_ADDR],[IRQ],[DMA],[DRQ]
call reset_interface ;attempt to reset card
pop STAT_COM
pop DATA_IO
POP_F ;return AX=0 if not found
ret
ENDP
;****************************************************************************
send_byte PROC DataByte:BYTE
mov dx,STAT_COM
__wait_cts: in al,dx
test al,40h
je __write_it
test al,80h
jne __wait_cts
sti ;if MIDI byte incoming, give receiving
jmp $+2 ;process a chance to catch it ...
jmp $+2 ;prevents lost data and/or hangups
jmp $+2 ;during Cakewalk and MIDIECHO
mov dx,DATA_IO
in al,dx
mov dx,STAT_COM
jmp __wait_cts
__write_it: mov dx,DATA_IO
mov al,[DataByte]
out dx,al
ret
ENDP
;****************************************************************************
send_cmd PROC CmdByte:BYTE
pushf
cli
mov dx,STAT_COM
mov cx,-1
__wait_cts_1: in al,dx
test al,40h
jz __cts_1
loop __wait_cts_1
jmp __exit_bad
__cts_1: mov al,[CmdByte]
out dx,al
mov cx,-1
__wait_ack: mov dx,STAT_COM
in al,dx
test al,80h
jnz __next_loop
mov dx,DATA_IO
in al,dx
cmp al,0feh
je __exit_OK
__next_loop: loop __wait_ack
__exit_bad: mov ax,0
jmp __exit
__exit_OK: mov ax,1
__exit: POP_F
ret
ENDP
;****************************************************************************
reset_interface PROC ;Returns 1 if MPU interface available
USES ds,si,di
pushf ;don't allow interruption
cli
call send_cmd C,0ffh ;reset MPU-401 interface
or ax,ax
jne __exit_reset ;(worked the first time)
call send_cmd C,0ffh ;try again in case UART mode active
__exit_reset: POP_F
ret
ENDP
;****************************************************************************
init_interface PROC ;Init MPU-401-compatible interface
USES ds,si,di
pushf ;don't allow interruption
cli
call send_cmd C,03fh ;assert UART mode
POP_F
ret
;****************************************************************************
ENDP