1d11 ; MIDI keyboard for Soundblaster ; Sends notes out the MIDI interface ; 950506 INCLUDELIB INOUT INCLUDE INOUT.INC INCLUDE DOS.INC DOSSEG .MODEL SMALL .STACK .DATA Org_rutin dd ? mkbrk db 0 old db 0 midinote db ? octave db 5 octave_offs db ? channel db 0 veloc db 100 txt db ' MIDI KEYBOARD',13,10 db 13,10 db 13,10 db 'Channel : F1 Chn Dn F2 Chn Up',13,10 db 'Octave : F3 Oct Dn F4 Oct Up',13,10 db 'Velocity: F5 Vel Dn F6 Vel Up',13,10 db ' F7 Vel -10 F8 Vel +10',13,10 db 13,10 db 13,10 db 'ÄÄÄ¿ ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»',13,10 db ' ³ ÚÄÄÄÄÛÛÛº ÚÂÄÒÄÂÂÂÄÒÄÒÄÂÂÂÄÒÄÂÂÂÄÒÄÒÄÂÂÂÄÒÄÂÂÂÄÒÄÒÄÂÂÄ¿ º',13,10 db ' ÀÄÄÄÙ º ³³ º ³³³ º º ³³³ º ³³³ º º ³³³ º ³³³ º º ³³ ³ º',13,10 db ' º ³ÀÂÐÂÙ³ÀÂÐÂÐÂÙ³ÀÂÐÂÙ³ÀÂÐÂÐÂÙ³ÀÂÐÂÙ³ÀÂÐÂÐÂÙ³ ³ º',13,10 db ' º ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ º',13,10 db ' º ÀÄÁÄÁÄÁÄÁÄÁÄÁÄÁÄÁÄÁÄÁÄÁÄÁÄÁÄÁÄÁÄÁÄÁÄÁÄÁÄÁÄÁÄÙ º',13,10 db ' ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ',13,10 db '$' keyrow db 13,11,13,11,13,13,11,13,11,13,11,13 db 13,11,13,11,13,13,11,13,11,13,11,13 db 13,11,13,11,13,13,11,13,11,13,11,13,13 keycol db 18,19,20,21,22,24,25,26,27,28,29,30 db 32,33,34,35,36,38,39,40,41,42,43,44 db 46,47,48,49,50,52,53,54,55,56,57,58,60 Buff db 10 dup(0) scan2note db 255,255, 18, 20, 22,255, 25, 27,255, 30, 32, 34,255,255,255,255 db 19, 21, 23, 24, 26, 28, 29, 31, 33, 35, 36,255,255,255, 1, 3 db 255, 6, 8, 10,255, 13, 15,255,255,255,255,255, 2, 4, 5, 7 db 9, 11, 12, 14, 16, 17,255,255,255,255,255,255,255,255,255,255 db 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 db 255,255,255,255,255,255, 0,255,255,255,255,255,255,255,255,255 db 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 db 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 setupfname db 'MIDIKBD.CFG',0 handle dw ? changed dw 0 .CODE .STARTUP call reset_dsp call init_mkbrk call read_setup mov al,octave mov dl,12 mul dl mov octave_offs,al call clrscr call hidecur mov ah,9 mov dx,offset txt int 21h call write_channel call write_octave call write_veloc mainlp: mov al,mkbrk cmp al,old jz mainlp mov old,al cmp al,01h ;ESC jz quit cmp al,3bh jb chk_playkeys cmp al,42h ja chk_playkeys mov changed,1 cmp al,3bh ; F1 jz channel_dn cmp al,3ch ; F2 jz channel_up cmp al,3dh ; F3 jz octave_dn cmp al,3eh ; F4 jz octave_up cmp al,3fh ; F5 jz veloc_dn cmp al,40h ; F6 jz veloc_up cmp al,41h ; F7 jz veloc_dn_10 cmp al,42h ; F8 jz veloc_up_10 chk_playkeys: cmp al,80h ;Break codes = make codes + 80h jb make sub al,80h make: xor ah,ah mov di,ax mov al,scan2note[di] cmp al,255 jz mainlp mov di,ax add al,octave_offs mov midinote,al cmp mkbrk,80h jae brk call note_on mov bl,'²' jmp drawkey brk: call note_off mov bl,' ' drawkey: mov dh,keyrow[di] mov dl,keycol[di] mov bh,07h call dirwr jmp mainlp channel_up: cmp channel,15 jz mainlp inc channel jmp chan_cont channel_dn: cmp channel,0 jz mainlp dec channel chan_cont: call write_channel jmp mainlp octave_up: cmp octave,8 jz mainlp inc octave jmp calc_oct_offs octave_dn: cmp octave,0 jz mainlp dec octave calc_oct_offs: mov al,octave mov dl,12 mul dl mov octave_offs,al call write_octave jmp mainlp veloc_up: cmp veloc,127 jz mainlp inc veloc jmp veloc_cont veloc_dn: cmp veloc,0 jz mainlp dec veloc jmp veloc_cont veloc_up_10: cmp veloc,117 ja mainlp add veloc,10 jmp veloc_cont veloc_dn_10: cmp veloc,10 jb mainlp sub veloc,10 veloc_cont: call write_veloc jmp mainlp write_channel PROC mov dh,3 mov dl,10 call setcur xor dx,dx mov dl,channel add dl,1 call writedec mov ah,2 mov dl,' ' int 21h ret write_channel ENDP write_octave PROC mov dh,4 mov dl,10 call setcur xor dx,dx mov dl,octave call writedec mov ah,2 mov dl,' ' int 21h ret write_octave ENDP write_veloc PROC mov dh,5 mov dl,10 call setcur xor dx,dx mov dl,veloc call writedec mov ah,2 mov dl,' ' int 21h ret write_veloc ENDP quit: call exit_mkbrk cmp changed,1 jnz no_save call save_setup no_save: call clrscr call showcur .EXIT read_setup PROC mov dx,offset setupfname @OpenFile dx,0 jc load_abort mov handle,ax mov si,offset channel @Read si,1,handle mov si,offset octave @Read si,1,handle mov si,offset veloc @Read si,1,handle @CloseFile handle load_abort: ret read_setup ENDP save_setup PROC mov dx,offset setupfname @MakeFile dx,0 mov dx,offset setupfname @OpenFile dx,1 mov handle,ax mov si,offset channel @Write si,1,handle mov si,offset octave @Write si,1,handle mov si,offset veloc @Write si,1,handle @CloseFile handle ret save_setup ENDP MKBRK_ISR PROC FAR ASSUME CS:_TEXT,DS:DGROUP push ds push ax push dx mov dx,@data mov ds,dx in al,60h ;fetch byte from keyboard mov byte ptr[mkbrk],al ;processor mov al,20h ;EOI out 20h,al pop dx pop ax pop ds iret MKBRK_ISR ENDP init_mkbrk PROC mov al,09h ;H„mta vektorn till INT 09 mov ah,35h int 21h mov word ptr[Org_Rutin],bx ;Org_Rutinens OFFSET h„mtas mov word ptr[Org_Rutin+2],es ;Segment sparas cli ;Fixa till ISR mov ax,0 mov es,ax mov di,24h mov ax,OFFSET MKBRK_ISR stosw mov ax,cs stosw sti ret init_mkbrk ENDP exit_mkbrk PROC cli mov ax,0 ;Restore INT 9 mov es,ax mov di,24h mov ax,word ptr[Org_Rutin] stosw mov ax,word ptr[Org_Rutin+2] stosw sti ret exit_mkbrk ENDP reset_dsp PROC push si mov dx,226h mov al,1 out dx,al mov cx,0ffh del: loop del mov al,0 out dx,al mov dx,22eh poll: in al,dx ;Check for data available or al,al jns poll mov dx,22ah in al,dx ;Check for ready byte cmp al,0aah jnz poll pop si ret reset_dsp ENDP note_on PROC mov ah,90h add ah,channel call out_midi mov ah,midinote call out_midi mov ah,veloc call out_midi ret note_on ENDP note_off PROC mov ah,90h add ah,channel call out_midi mov ah,midinote call out_midi mov ah,0 call out_midi ret note_off ENDP out_midi PROC mov dx,22ch wd1: in al,dx or al,al js wd1 mov al,38h ;MIDI write command out dx,al wd2: in al,dx or al,al js wd2 mov al,ah out dx,al ;MIDI byte write ret out_midi ENDP END . 0