/*************************************
	T-BIOS MIDI LIB
		for GNU ASM
		by Ray&Rulue/ShinKEN 1994.5
*************************************/

	.data
	.text

/*
	MIDIマネージャのオープン
	TMM_openMidiMan(MIDIMANCTRL *midimanctrl);
*/
	.align 4
	.globl _TMM_openMidiMan
_TMM_openMidiMan:
	pushl %esi
	movl  8(%esp),%esi
	movb  $0x00,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	pop   %esi
	ret


/*
	MIDIマネージャのクローズ
	TMM_closeMidiMan();
*/
	.align 4
	.globl _TMM_closeMidiMan
_TMM_closeMidiMan:
	movb  $0x01,%ah
	push  $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	ret


/*
	MIDIMANCTRL情報の取得
	TMM_getMidiManCtrl(MIDIMANCTRL *midimanctrl);
*/
	.align 4
	.globl _TMM_getMidiManCtrl
_TMM_getMidiManCtrl:
	pushl %esi
	movl  8(%esp),%esi
	movb  $0x02,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	pop   %esi
	ret


/*
	RS-MIDIルーチンの登録
	TMM_initRsMidi(RSCTRL *rsctrl);
*/
	.align 4
	.globl _TMM_initRsMidi
_TMM_initRsMidi:
	pushl %ebx
	movl  8(%esp),%ebx
	movb  $0x03,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	pop   %ebx
	ret


/*
	RS-MIDIルーチンの解除
	TMM_termRsMidi();
*/
	.align 4
	.globl _TMM_termRsMidi
_TMM_termRsMidi:
	movb  $0x04,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	ret


/*
	ユーザーコールバックルーチンの登録
	TMM_setUserFunc(FUNCCTRL *func_ctrl, int *handle);
*/
	.align 4
	.globl _TMM_setUserFunc
_TMM_setUserFunc:
	pushl %ebx
	movl  8(%esp),%ebx
	movb  $0x07,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	movl  12(%esp),%ebx
	movl  %edx,(%ebx)
	pop   %ebx
	ret


/*
	ユーザーコールバックルーチンの取得
	TMM_getUserFunc(int handle, FUNCCTRL *func_ctrl);
*/
	.align 4
	.globl _TMM_getUserFunc
_TMM_getUserFunc:
	pushl %ebx
	movl  8(%esp),%edx
	movl  12(%esp),%ebx
	movb  $0x08,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	pop   %ebx
	ret


/*
	ユーザーコールバックルーチンの解除
	TMM_resetUserFunc(int handle);
*/
	.align 4
	.globl _TMM_resetUserFunc
_TMM_resetUserFunc:
	movl  4(%esp),%edx
	movb  $0x09,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	ret


/*
	MIDIデータ出力
	TMM_outputMidiEvent(PORT port, char *event);
*/
	.align 4
	.globl _TMM_outputMidiEvent
_TMM_outputMidiEvent:
	pushl %esi
	movb  8(%esp),%bl
	movl  12(%esp),%esi
	movb  $0x0a,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	pop   %esi
	ret


/*
	演奏の開始
	TMM_playStart(
		char format, FLAG rec_flag, char *playbuffer, int size, PLACE *place);
*/
	.align 4
	.globl _TMM_playStart
_TMM_playStart:
	pushl %esi
	pushl %ebx
	movb  12(%esp),%dl
	movb  16(%esp),%dh
	movl  20(%esp),%esi
	movl  24(%esp),%ecx
	movl  28(%esp),%ebx
	movb  $0x10,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	pop   %ebx
	pop   %esi
	ret


/*
	演奏の終了
	TMM_playStop();
*/
	.align 4
	.globl _TMM_playStop
_TMM_playStop:
	movb  $0x11,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	ret


/*
	演奏の一時中断
	TMM_playPause();
*/
	.align 4
	.globl _TMM_playPause
_TMM_playPause:
	movb  $0x12,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	ret


/*
	演奏の再開
	TMM_playRestart();
*/
	.align 4
	.globl _TMM_playRestart
_TMM_playRestart:
	movb  $0x13,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	ret


/*
	演奏モードの設定
	TMM_playMode(char mode);
*/
	.align 4
	.globl _TMM_playMode
_TMM_playMode:
	movb  4(%esp),%dl
	movb  $0x14,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	ret


/*
	演奏位置の取得(?????)
	TMM_getPlayPlace(FLAG flag, unsigned char **ptr, PLACE *place);
*/
	.align 4
	.globl _TMM_getPlayPlace
_TMM_getPlayPlace:
	pushl  %ebx
	pushl  %edi
	movl   20(%esp),%edi
	movb   $0x16,%ah
	pushl  $0x0110
	pop    %fs
	lcall  %fs:(0xC0)
	movb   %dl,12(%esp)
	movb   %ebx,16(%esp)
	movsbl %dl,%eax
	pop    %edi
	pop    %ebx
	ret


/*
	テンポの設定
	TMM_setTempo(char type, int tempo);
*/
	.align 4
	.globl _TMM_setTempo
_TMM_setTempo:
	pushl %ebx
	movb  8(%esp),%dl
	movl  12(%esp),%ebx
	movb  $0x17,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	pop   %ebx
	ret


/*
	テンポの取得
	TMM_getTempo(char type, int *tempo);
*/
	.align 4
	.globl _TMM_getTempo
_TMM_getTempo:
	pushl %ebx
	pushl %edi
	movb  12(%esp),%dl
	movb  $0x18,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	movl  16(%esp),%edi
	movl  %ebx,(%edi)
	pop   %edi
	pop   %ebx
	ret


/*
	相対テンポの設定
	TMM_setRelativeTempo(int relative_tempo);
*/
	.align 4
	.globl _TMM_setRelativeTempo
_TMM_setRelativeTempo:
	push  %ebx
	movl  8(%esp),%ebx
	movb  $0x19,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	pop   %ebx
	ret


/*
	相対テンポの取得
	TMM_getRelativeTempo(int *relative_tempo);
*/
	.align 4
	.globl _TMM_getRelativeTempo
_TMM_getRelativeTempo:
	pushl %ebx
	pushl %edi
	movb  $0x1a,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	movl  12(%esp),%edi
	movl  %ebx,(%edi)
	pop   %edi
	pop   %ebx
	ret


/*
	EUPデータ相対テンポの設定
	TMM_setEupTempoOffset(int tempo_offset);
*/
	.align 4
	.globl _TMM_setEupTempoOffset
_TMM_setEupTempoOffset:
	pushl %ebx
	movl  8(%esp),%ebx
	movb  $0x1b,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	pop   %ebx
	ret


/*
	EUPデータ相対テンポの取得
	TMM_getEupTempoOffset(int *tempo_offset);
*/
	.align 4
	.globl _TMM_getEupTempoOffset
_TMM_getEupTempoOffset:
	pushl %ebx
	pushl %edi
	movb  $0x1c,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	movl  12(%esp),%edi
	movl  %ebx,(%edi)
	pop   %edi
	pop   %ebx
	ret


/*
	ステップモードの進行
	TMM_stepModeEntry(int stap_clock);
*/
	.align 4
	.globl _TMM_stepModeEntry
_TMM_stepModeEntry:
	movl  4(%esp),%edx
	movb  $0x1d,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	ret


/*
	同期モードの設定
	TMM_setSyncln(char moed, PORT port, char master, int type, int level);
*/
	.align 4
	.globl _TMM_setSyncln
_TMM_setSyncln:
	pushl %ebx
	movb  8(%esp),%dl
	movb  12(%esp),%bl
	movb  16(%esp),%dh
	movb  20(%esp),%cl
	movb  24(%esp),%ch
	movb  $0x20,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	pop   %ebx
	ret


/*
	SMPTE開始位置の設定
	TMM_setSmpteOffset(REALTIME *time);
*/
	.align 4
	.globl _TMM_setSmpteOffset
_TMM_setSmpteOffset:
	pushl %edi
	movl  8(%esp),%edi
	movb  $0x21,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	pop   %edi
	ret


/*
	SMPTE同期精度の設定
	TMM_setSmpteLag(int lag, int correction);
*/
	.align 4
	.globl _TMM_setSmpteLag
_TMM_setSmpteLag:
	movl  4(%esp),%edx
	movl  8(%esp),%ecx
	movb  $0x22,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	ret


/*
	S-MPU内部時間の設定
	TMM_setSmpuTime(REALTIME *time);
*/
	.align 4
	.globl _TMM_setSmpuTime
_TMM_setSmpuTime:
	pushl %esi
	movl  8(%esp),%esi
	movb  $0x23,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	pop   %esi
	ret


/*
	実時間からSMPTE時間への変換
	TMM_realtimeToSmpte(REALTIME *time, SMPTE *smpte);
*/
	.align 4
	.globl _TMM_realtimeToSmpte
_TMM_realtimeToSmpte:
	pushl %esi
	pushl %edi
	movl  12(%esp),%esi
	movl  16(%esp),%edi
	movb  $0x24,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	pop   %edi
	pop   %esi
	ret


/*
	SMPTE時間から実時間への変換
	TMM_smpteToRealtime(SMPTE *smpte, REALTIME *realtime);
*/
	.align 4
	.globl _TMM_smpteToRealtime
_TMM_smpteToRealtime:
	pushl %esi
	pushl %edi
	movl  12(%esp),%edi
	movl  16(%esp),%esi
	movb  $0x25,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	pop   %edi
	pop   %esi
	ret


/*
	リモートモードの設定
	TMM_setRemoteMode(char mode)
*/
	.align 4
	.globl _TMM_setRemoteMode
_TMM_setRemoteMode:
	movb  4(%esp),%dl
	movb  $0x26,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	ret


/*
	同期信号出力の設定
	TMM_setSyncOut(char mode, PORT port)
*/
	.align 4
	.globl _TMM_setSyncOut
_TMM_setSyncOut:
	pushl %ebx
	movb  8(%esp),%dl
	movb  12(%esp),%bl
	movb  $0x27,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	pop   %ebx
	ret


/*
	メトロノームの設定
	TMM_setMetronome(METRONOME *motronome);
*/
	.align 4
	.globl _TMM_setMetronome
_TMM_setMetronome:
	pushl %esi
	movl  8(%esp),%esi
	movb  $0x28,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	pop   %esi
	ret


/*
	アサインマップの設定
	TMM_setAssignMap(PORT port, char map_number);
*/
	.align 4
	.globl _TMM_setAssignMap
_TMM_setAssignMap:
	pushl %ebx
	movb  8(%esp),%bl
	movb  12(%esp),%dl
	movb  $0x30,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	pop   %ebx
	ret


/*
	アサインマップの取得
	TMM_getAssignMap(PORT port, char *map_number);
*/
	.align 4
	.globl _TMM_getAssignMap
_TMM_getAssignMap:
	pushl %ebx
	movb  8(%esp),%bl
	movb  $0x31,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	movl  12(%esp),%ebx
	movl  %dl,(%ebx)
	pop   %ebx
	ret


/*
	アサインフィルタの設定
	TMM_setAssignFilter(char map_number, ASSIGNFILTER *filter);
*/
	.align 4
	.globl _TMM_setAssignFilter
_TMM_setAssignFilter:
	pushl %esi
	movb  8(%esp),%dl
	movb  12(%esp),%esi
	movb  $0x32,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	pop   %esi
	ret


/*
	アサインフィルタの取得
	TMM_getAssignFilter(char map_number, ASSIGNFILTER *filter);
*/
	.align 4
	.globl _TMM_getAssignFilter
_TMM_getAssignFilter:
	pushl %esi
	movb  8(%esp),%dl
	movb  12(%esp),%esi
	movb  $0x33,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	pop   %esi
	ret


/*
	出力ポートマップの設定
	TMM_setOutputPortMap(PORT logical_port, PORT physical_port);
*/
	.align 4
	.globl _TMM_setOutputPortMap
_TMM_setOutputPortMap:
	pushl %ebx
	movb  8(%esp),%bl
	movb  12(%esp),%dl
	movb  $0x34,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	pop   %ebx
	ret


/*
	出力ポートマップの取得
	TMM_getOutputPortMap(PORT logical_port, PORT *physical_port);
*/
	.align 4
	.globl _TMM_getOutputPortMap
_TMM_getOutputPortMap:
	pushl %ebx
	movb  8(%esp),%bl
	movb  $0x35,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	movl  12(%esp),%ebx
	movb  %dl,(%ebx)
	pop   %ebx
	ret


/*
	出力ポートマップの設定
	TMM_setInputPortMap(PORT logical_port, PORT physical_port);
*/
	.align 4
	.globl _TMM_setInputPortMap
_TMM_setInputPortMap:
	pushl %ebx
	movb  8(%esp),%dl
	movb  12(%esp),%bl
	movb  $0x36,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	pop   %ebx
	ret


/*
	入力ポートマップの取得
	TMM_getInputPortMap(PORT logical_port, PORT *physical_port);
*/
	.align 4
	.globl _TMM_getInputPortMap
_TMM_getInputPortMap:
	pushl %ebx
	pushl %edi
	movb  12(%esp),%bl
	movb  $0x37,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	movl  16(%esp),%edi
	movb  %bl,(%edi)
	pop   %edi
	pop   %ebx
	ret


/*
	内蔵音源の初期化
	TMM_initInternalVoice();
*/
	.align 4
	.globl _TMM_initInternalVoice
_TMM_initInternalVoice:
	movb  $0x40,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	ret


/*
	内蔵音源のMIDIデータ出力
	TMM_sendInternalVoice();
*/
	.align 4
	.globl _TMM_sendInternalVoice
_TMM_sendInternalVoice:
	movb  4(%esp),%dl
	movb  $0x41,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	ret


/*
	内蔵音源のMIDIチャンネルの設定
	TMM_setInternalChannel(unsigned char vioce_ch, MIDICH midi_ch);
*/
	.align 4
	.globl _TMM_setInternalChannel
_TMM_setInternalChannel:
	pushl %ebx
	movb  8(%esp),%bl
	movb  12(%esp),%dl
	movb  $0x42,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	pop   %ebx
	ret


/*
	内蔵音源のMIDIチャンネルの取得
	TMM_getInternalChannel(unsigned char vioce_ch, MIDICH *midi_ch);
*/
	.align 4
	.globl _TMM_getInternalChannel
_TMM_getInternalChannel:
	pushl %ebx
	movb  8(%esp),%bl
	movb  $0x43,%ah
	pushl $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	movl  12(%esp),%ebx
	movb  %dl,(%ebx)
	pop   %ebx
	ret


/*
	内蔵音源のマスタボリュームの設定
	TMM_setInternalVolume(char volume);
*/
	.align 4
	.globl _TMM_setInternalVolume
_TMM_setInternalVolume:
	movb  4(%esp),%dl
	movb  $0x44,%ah
	push  $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	ret


/*
	内蔵音源のマスタボリュームの取得
	TMM_getInternalVolume(char volume);
*/
	.align 4
	.globl _TMM_getInternalVolume
_TMM_getInternalVolume:
	pushl %edi
	movb  $0x45,%ah
	push  $0x0110
	pop   %fs
	lcall %fs:(0xC0)
	movl  8(%esp),%edi
	movb  %dl,(%edi)
	pop   %edi
	ret



