Subversion Repositories Kolibri OS

Rev

Rev 551 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
31 halyavin 1
;
2
;    Ok, this is the sceleton that MENUET 0.01 understands.
3
;    Do not change the header bits for now. Compile with nasm.
4
;
5
 
485 heavyiron 6
include '..\..\..\macros.inc'
31 halyavin 7
 
8
use32
10009 Doczom 9
 org    0x0
10
 db     'MENUET01'    ; header
11
 dd     0x01          ; header version
12
 dd     START         ; entry point
13
 dd     I_END         ; image size
14
 dd     0x1000        ; required memory
15
 dd     0x1000        ; esp
16
 dd     0x0 , 0x0     ; I_Param , I_Path
31 halyavin 17
 
18
 
10009 Doczom 19
MIDI_PORT = 0x330
20
 
21
midisp: dw      MIDI_PORT + 1
22
mididp: dw      MIDI_PORT
23
 
24
 
31 halyavin 25
START:
10009 Doczom 26
        mov     dx, word[midisp]
27
        mov     cx, word[mididp]
28
        mcall   46, 0
31 halyavin 29
 
10009 Doczom 30
        test    eax, eax
31
        jne     exit
32
 
33
 
485 heavyiron 34
  red:
31 halyavin 35
    call  draw_window
36
 
37
still:
38
 
10009 Doczom 39
        mov     eax, 10          ; redraw ?
40
        mcall
31 halyavin 41
 
10009 Doczom 42
        cmp     eax, 1
43
        jz      red
44
        cmp     eax, 3
45
        jnz     still
31 halyavin 46
 
10009 Doczom 47
        ;button:
48
        mov     eax, 17
49
        mcall
31 halyavin 50
 
10009 Doczom 51
        cmp     al, 0
52
        jnz  still
31 halyavin 53
 
10009 Doczom 54
        cmp     ah, 1
55
        jz      exit
31 halyavin 56
 
10009 Doczom 57
        cmp     ah, 2
58
        jz      .play_note
31 halyavin 59
 
10009 Doczom 60
        ; reset midi device
61
        call    midi_reset
31 halyavin 62
 
10009 Doczom 63
        cmp     eax, 0    ; check error code
64
        jz      still
31 halyavin 65
 
10009 Doczom 66
        call    printerror
31 halyavin 67
 
10009 Doczom 68
        jmp     still
31 halyavin 69
 
10009 Doczom 70
.play_note:
31 halyavin 71
 
10009 Doczom 72
        mov     eax, 50
73
.nn:
74
        mov     ebx, 100
75
        call    noteout
76
        pusha
31 halyavin 77
 
10009 Doczom 78
        mov     eax, 5
79
        mov     ebx, 8
80
        mcall
31 halyavin 81
 
10009 Doczom 82
        popa
83
        mov     ebx, 0
84
;    call noteout
31 halyavin 85
 
10009 Doczom 86
        add     eax, 3
31 halyavin 87
 
10009 Doczom 88
        mov     ebx, 100
89
        call    noteout
90
        pusha
31 halyavin 91
 
10009 Doczom 92
        mov     eax, 5
93
        mov     ebx, 8
94
        mcall
95
 
96
        popa
97
        mov     ebx, 0
31 halyavin 98
;    call noteout
99
 
10009 Doczom 100
        add     eax, 4
31 halyavin 101
 
10009 Doczom 102
        inc     eax
103
        cmp     eax, 90
104
        jbe     .nn
31 halyavin 105
 
10009 Doczom 106
        jmp     still
31 halyavin 107
 
10009 Doczom 108
exit:
109
        mcall   -1
31 halyavin 110
 
111
 
112
draw_window:
113
 
10009 Doczom 114
        pusha
31 halyavin 115
 
10009 Doczom 116
        mov     eax, 12                    ; tell os about redraw
117
        mov     ebx, 1
118
        mcall
31 halyavin 119
 
10009 Doczom 120
        mov     eax, 0                     ; define and draw window
121
        mov     ebx, 20*65536+250
122
        mov     ecx, 20*65536+120
123
        mov     edx, 0x14ffffff
124
        mov     edi, title
125
        mcall
31 halyavin 126
 
10009 Doczom 127
        mov     eax, 8
128
        mov     ebx, 10*65536+200          ; button start x & size
129
        mov     ecx, 40 *65536+17          ; button start y & size
130
        mov     edx, 2                     ; button number
131
        mov     esi, 0x4060b0              ; button color
132
        mcall
31 halyavin 133
 
10009 Doczom 134
        mov     ecx, 60 *65536+17          ; button start y & size
135
        mov     edx, 3                     ; button number
136
        mcall
31 halyavin 137
 
10009 Doczom 138
        mov     eax, 4
139
        mov     ebx, 25*65536+45
140
        mov     ecx, dword 0xffffff
141
        mov     edx, buttont
142
        mov     esi, buttontlen-buttont
143
        mcall
31 halyavin 144
 
10009 Doczom 145
        mov     ebx, 25*65536+65
146
        mov     edx, buttont2
147
        mov     esi, buttontlen2-buttont2
148
        mcall
31 halyavin 149
 
10009 Doczom 150
        mov     eax, 12                    ; tell os about redraw end
151
        mov     ebx, 2
152
        mcall
31 halyavin 153
 
10009 Doczom 154
        popa
155
        ret
31 halyavin 156
 
157
 
158
noteout:
10009 Doczom 159
        pusha
31 halyavin 160
 
10009 Doczom 161
        push    ebx
162
        push    eax
31 halyavin 163
 
10009 Doczom 164
        mov     ecx, 0x9f
165
        call    midi_output_byte
31 halyavin 166
 
10009 Doczom 167
        pop     ecx
168
        call    midi_output_byte
31 halyavin 169
 
10009 Doczom 170
        pop     ecx
171
        call    midi_output_byte
31 halyavin 172
 
10009 Doczom 173
        cmp     eax, 0
174
        jz      @f
31 halyavin 175
 
10009 Doczom 176
        call    printerror
31 halyavin 177
 
10009 Doczom 178
@@:
179
        popa
180
        ret
31 halyavin 181
 
182
printerror:
183
 
10009 Doczom 184
        mov     eax, 4
185
        mov     ebx, 15*65536+85
186
        mov     ecx, 0x000000
187
        mov     edx, error1
188
        mov     esi, errorlen1-error1
189
        mcall
31 halyavin 190
 
10009 Doczom 191
        mov     eax, 4
192
        mov     ebx, 15*65536+95
193
        mov     ecx, 0x000000
194
        mov     edx, error2
195
        mov     esi, errorlen2-error2
196
        mcall
31 halyavin 197
 
10009 Doczom 198
        ret
31 halyavin 199
 
10009 Doczom 200
; MPU401 interface
31 halyavin 201
 
10009 Doczom 202
midi_reset:
203
@@:
204
        ; reset device
205
        call    is_output
206
        test    al, al
207
        jnz     @b
208
        mov     dx, word [midisp]
209
        mov     al, 0xff
210
        out     dx, al
211
@@:
212
        mov     dx, word [midisp]
213
        mov     al, 0xff
214
        out     dx, al
215
        call    is_input
216
        test    al, al
217
        jnz     @b
218
        call    get_mpu_in
219
        cmp     al, 0xfe
220
        jnz     @b
221
@@:
222
        call    is_output
223
        test    al, al
224
        jnz     @b
225
        mov     dx, word [midisp]
226
        mov     al, 0x3f
227
        out     dx, al
228
        ret
229
 
230
midi_output_byte:
231
        ; output byte
232
@@:
233
        call    get_mpu_in
234
        call    is_output
235
        test    al, al
236
        jnz     @b
237
        mov     al, cl
238
        call    put_mpu_out
239
        ret
240
 
241
is_input:
242
        push    edx
243
        mov     dx, word [midisp]
244
        in      al, dx
245
        and     al, 0x80
246
        pop     edx
247
        ret
248
 
249
is_output:
250
        push    edx
251
        mov     dx, word [midisp]
252
        in      al, dx
253
        and     al, 0x40
254
        pop     edx
255
        ret
256
 
257
get_mpu_in:
258
        push    edx
259
        mov     dx, word [mididp]
260
        in      al, dx
261
        pop     edx
262
        ret
263
 
264
put_mpu_out:
265
        push    edx
266
        mov     dx, word [mididp]
267
        out     dx, al
268
        pop     edx
269
        ret
270
 
271
 
272
 
273
 
274
 
31 halyavin 275
; DATA AREA
276
 
277
 
485 heavyiron 278
title    db   'MIDI TEST',0
31 halyavin 279
 
280
buttont:
281
    db   'PLAY A FEW NOTES'
282
buttontlen:
283
buttont2:
284
    db   'RESET MIDI DEVICE'
285
buttontlen2:
286
 
287
error1:
288
    db   'NO BASE DEFINED FOR MPU-401'
289
errorlen1:
290
 
291
error2:
292
    db   'USE SETUP AND RESET MIDI DEVICE.'
293
errorlen2:
294
 
295
base db 0x0
296
 
297
I_END:
298