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