midiplay: Added code to work with the MPU 401 port bypassing the 20 sysfn

Refactored code and code style

git-svn-id: svn://kolibrios.org@10009 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Doczom 2024-04-08 17:02:39 +00:00
parent 6345e58caa
commit 3c309b14e1

View File

@ -3,198 +3,273 @@
; Do not change the header bits for now. Compile with nasm. ; Do not change the header bits for now. Compile with nasm.
; ;
include 'lang.inc'
include '..\..\..\macros.inc' include '..\..\..\macros.inc'
use32 use32
org 0x0 org 0x0
db 'MENUET01' ; header db 'MENUET01' ; header
dd 0x01 ; header version dd 0x01 ; header version
dd START ; entry point dd START ; entry point
dd I_END ; image size dd I_END ; image size
dd 0x1000 ; required memory dd 0x1000 ; required memory
dd 0x1000 ; esp dd 0x1000 ; esp
dd 0x0 , 0x0 ; I_Param , I_Path dd 0x0 , 0x0 ; I_Param , I_Path
MIDI_PORT = 0x330
midisp: dw MIDI_PORT + 1
mididp: dw MIDI_PORT
START: START:
mov dx, word[midisp]
mov cx, word[mididp]
mcall 46, 0
test eax, eax
jne exit
red: red:
call draw_window call draw_window
still: still:
mov eax,10 ; redraw ? mov eax, 10 ; redraw ?
mcall mcall
cmp eax,1 cmp eax, 1
jz red jz red
cmp eax,3 cmp eax, 3
jz button jnz still
jmp still
button: ;button:
mov eax,17 mov eax, 17
mcall mcall
cmp al,byte 0 cmp al, 0
jnz still jnz still
cmp ah,1 cmp ah, 1
jnz noexit jz exit
mov eax,0xffffffff cmp ah, 2
mcall jz .play_note
noexit: ; reset midi device
call midi_reset
cmp ah,2 cmp eax, 0 ; check error code
jz note1 jz still
mov eax,20 ; reset midi device call printerror
mov ebx,1
mov ecx,0
mcall
cmp eax,0 jmp still
jz noe1
call printerror .play_note:
noe1: mov eax, 50
.nn:
mov ebx, 100
call noteout
pusha
jmp still mov eax, 5
mov ebx, 8
mcall
note1: popa
mov ebx, 0
mov eax,50
nn:
mov ebx,100
call noteout
pusha
mov eax,5
mov ebx,8
mcall
popa
mov ebx,0
; call noteout ; call noteout
add eax,3 add eax, 3
mov ebx,100 mov ebx, 100
call noteout call noteout
pusha pusha
mov eax,5
mov ebx,8 mov eax, 5
mcall mov ebx, 8
popa mcall
mov ebx,0
popa
mov ebx, 0
; call noteout ; call noteout
add eax,4 add eax, 4
inc eax inc eax
cmp eax,90 cmp eax, 90
jbe nn jbe .nn
jmp still jmp still
exit:
mcall -1
draw_window: draw_window:
pusha pusha
mov eax,12 ; tell os about redraw mov eax, 12 ; tell os about redraw
mov ebx,1 mov ebx, 1
mcall mcall
mov eax,0 ; define and draw window mov eax, 0 ; define and draw window
mov ebx,20*65536+250 mov ebx, 20*65536+250
mov ecx,20*65536+120 mov ecx, 20*65536+120
mov edx,0x14ffffff mov edx, 0x14ffffff
mov edi,title mov edi, title
mcall mcall
mov eax,8 mov eax, 8
mov ebx,10*65536+200 ; button start x & size mov ebx, 10*65536+200 ; button start x & size
mov ecx,40 *65536+17 ; button start y & size mov ecx, 40 *65536+17 ; button start y & size
mov edx,2 ; button number mov edx, 2 ; button number
mov esi,0x4060b0 ; button color mov esi, 0x4060b0 ; button color
mcall mcall
mov ecx,60 *65536+17 ; button start y & size mov ecx, 60 *65536+17 ; button start y & size
mov edx,3 ; button number mov edx, 3 ; button number
mcall mcall
mov eax,4 mov eax, 4
mov ebx,25*65536+45 mov ebx, 25*65536+45
mov ecx,dword 0xffffff mov ecx, dword 0xffffff
mov edx,buttont mov edx, buttont
mov esi,buttontlen-buttont mov esi, buttontlen-buttont
mcall mcall
mov ebx,25*65536+65 mov ebx, 25*65536+65
mov edx,buttont2 mov edx, buttont2
mov esi,buttontlen2-buttont2 mov esi, buttontlen2-buttont2
mcall mcall
mov eax,12 ; tell os about redraw end mov eax, 12 ; tell os about redraw end
mov ebx,2 mov ebx, 2
mcall mcall
popa popa
ret ret
noteout: noteout:
pusha
pusha push ebx
push eax
push ebx mov ecx, 0x9f
push eax call midi_output_byte
mov eax,20 pop ecx
mov ebx,2 call midi_output_byte
mov ecx,0x9f
mcall
mov eax,20
mov ebx,2
pop ecx
mcall
mov eax,20
mov ebx,2
pop ecx
mcall
cmp eax,0 pop ecx
jz noe2 call midi_output_byte
call printerror cmp eax, 0
jz @f
noe2: call printerror
popa @@:
ret popa
ret
printerror: printerror:
mov eax,dword 4 mov eax, 4
mov ebx,15*65536+85 mov ebx, 15*65536+85
mov ecx,0x000000 mov ecx, 0x000000
mov edx,error1 mov edx, error1
mov esi,errorlen1-error1 mov esi, errorlen1-error1
mcall mcall
mov eax, 4
mov ebx, 15*65536+95
mov ecx, 0x000000
mov edx, error2
mov esi, errorlen2-error2
mcall
ret
; MPU401 interface
midi_reset:
@@:
; reset device
call is_output
test al, al
jnz @b
mov dx, word [midisp]
mov al, 0xff
out dx, al
@@:
mov dx, word [midisp]
mov al, 0xff
out dx, al
call is_input
test al, al
jnz @b
call get_mpu_in
cmp al, 0xfe
jnz @b
@@:
call is_output
test al, al
jnz @b
mov dx, word [midisp]
mov al, 0x3f
out dx, al
ret
midi_output_byte:
; output byte
@@:
call get_mpu_in
call is_output
test al, al
jnz @b
mov al, cl
call put_mpu_out
ret
is_input:
push edx
mov dx, word [midisp]
in al, dx
and al, 0x80
pop edx
ret
is_output:
push edx
mov dx, word [midisp]
in al, dx
and al, 0x40
pop edx
ret
get_mpu_in:
push edx
mov dx, word [mididp]
in al, dx
pop edx
ret
put_mpu_out:
push edx
mov dx, word [mididp]
out dx, al
pop edx
ret
mov eax,dword 4
mov ebx,15*65536+95
mov ecx,0x000000
mov edx,error2
mov esi,errorlen2-error2
mcall
ret
; DATA AREA ; DATA AREA