├── src ├── pcmtool │ ├── cmp.bat │ ├── cmp.sh │ ├── Makefile │ ├── wavread.c │ └── pcmtool.c ├── pcmload │ ├── cmp.bat │ └── pcmload.asm ├── .DS_Store ├── pcmpack │ ├── cmp.bat │ └── pcmpack.c ├── tone_src │ ├── list.c │ ├── tone.c │ └── map.h └── mmckc │ ├── version.c │ ├── Makefile │ ├── strings.c │ ├── mckc.c │ ├── file.c │ └── mckc.h ├── moon_hoot ├── asm.bat ├── LOADER ├── LOADER.ASM ├── README.txt ├── hoot_compose │ ├── copy_to_hoot │ │ ├── hootwait.exe │ │ ├── playhoot.bat │ │ └── hoot.xml │ └── mumml │ │ ├── prog │ │ └── moondriver │ │ │ └── install_prog.txt │ │ └── cfg │ │ └── MoonDriver [MDR] (mmckc).ini ├── LOADER.SYM └── hoot.xml ├── mdrv.com ├── moon.bin ├── bin ├── mmckc.exe ├── pceas.exe ├── tone.exe ├── mmckc_j.exe ├── pcmpack.exe └── pcmtool.exe ├── moon_hoot.bin ├── doc ├── pcmtool.md ├── pcmtool.txt ├── moondriver.md ├── moondriver.txt ├── img │ ├── cnt │ │ ├── cnt0.png │ │ ├── cnt1.png │ │ ├── cnt_4op_00.png │ │ ├── cnt_4op_01.png │ │ ├── cnt_4op_10.png │ │ ├── cnt_4op_11.png │ │ └── cnt0.svg │ └── ws │ │ ├── ws7.svg │ │ ├── ws1.svg │ │ ├── ws6.svg │ │ ├── ws3.svg │ │ ├── ws2.svg │ │ ├── ws0.svg │ │ ├── ws5.svg │ │ └── ws4.svg ├── techdoc.txt ├── history.txt ├── spec.md └── opl4.md ├── songs ├── test.MDR ├── make_mdr.bat ├── testpcm.MDR ├── testpcm.pcm ├── o4c_11k_saw.wav ├── o4c_11k_sine.wav ├── o4c_11k_sqr.wav ├── make_mdr_pcmpack.bat ├── make_mdr_debug.bat ├── testpcm.txt ├── mkpcm.bat ├── make_mdr.sh ├── testpcm.mml ├── test.mml ├── opl3_4op.mml ├── opl3_4op_tl.mml ├── opl3_2op.mml └── mdrvhdr.asm ├── data └── pcmload.com ├── moon_driver_hoot.asm ├── asm.sh ├── asm.bat ├── xcode └── mmckc │ └── mmckc.xcodeproj │ ├── project.xcworkspace │ └── contents.xcworkspacedata │ ├── xcshareddata │ └── xcschemes │ │ └── mmckc.xcscheme │ └── project.pbxproj ├── README.md ├── Makefile ├── .gitignore ├── .vscode ├── tasks.json └── c_cpp_properties.json ├── mdrv.sym ├── moon.sym ├── moon_hoot.sym ├── ftbl600.inc └── moon_loader.asm /src/pcmtool/cmp.bat: -------------------------------------------------------------------------------- 1 | gcc pcmtool.c -o pcmtool 2 | -------------------------------------------------------------------------------- /src/pcmtool/cmp.sh: -------------------------------------------------------------------------------- 1 | gcc pcmtool.c -o pcmtool 2 | 3 | -------------------------------------------------------------------------------- /moon_hoot/asm.bat: -------------------------------------------------------------------------------- 1 | pasmo LOADER.ASM LOADER LOADER.SYM 2 | -------------------------------------------------------------------------------- /src/pcmload/cmp.bat: -------------------------------------------------------------------------------- 1 | pasmo pcmload.asm pcmload.com 2 | -------------------------------------------------------------------------------- /mdrv.com: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/mdrv.com -------------------------------------------------------------------------------- /moon.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/moon.bin -------------------------------------------------------------------------------- /bin/mmckc.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/bin/mmckc.exe -------------------------------------------------------------------------------- /bin/pceas.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/bin/pceas.exe -------------------------------------------------------------------------------- /bin/tone.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/bin/tone.exe -------------------------------------------------------------------------------- /moon_hoot.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/moon_hoot.bin -------------------------------------------------------------------------------- /src/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/src/.DS_Store -------------------------------------------------------------------------------- /bin/mmckc_j.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/bin/mmckc_j.exe -------------------------------------------------------------------------------- /bin/pcmpack.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/bin/pcmpack.exe -------------------------------------------------------------------------------- /bin/pcmtool.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/bin/pcmtool.exe -------------------------------------------------------------------------------- /doc/pcmtool.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/doc/pcmtool.md -------------------------------------------------------------------------------- /doc/pcmtool.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/doc/pcmtool.txt -------------------------------------------------------------------------------- /songs/test.MDR: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/songs/test.MDR -------------------------------------------------------------------------------- /data/pcmload.com: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/data/pcmload.com -------------------------------------------------------------------------------- /doc/moondriver.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/doc/moondriver.md -------------------------------------------------------------------------------- /doc/moondriver.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/doc/moondriver.txt -------------------------------------------------------------------------------- /moon_hoot/LOADER: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/moon_hoot/LOADER -------------------------------------------------------------------------------- /songs/make_mdr.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/songs/make_mdr.bat -------------------------------------------------------------------------------- /songs/testpcm.MDR: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/songs/testpcm.MDR -------------------------------------------------------------------------------- /songs/testpcm.pcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/songs/testpcm.pcm -------------------------------------------------------------------------------- /doc/img/cnt/cnt0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/doc/img/cnt/cnt0.png -------------------------------------------------------------------------------- /doc/img/cnt/cnt1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/doc/img/cnt/cnt1.png -------------------------------------------------------------------------------- /moon_hoot/LOADER.ASM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/moon_hoot/LOADER.ASM -------------------------------------------------------------------------------- /moon_hoot/README.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/moon_hoot/README.txt -------------------------------------------------------------------------------- /moon_driver_hoot.asm: -------------------------------------------------------------------------------- 1 | 2 | MOON_HOOT: equ $0001 3 | 4 | include "moon_driver.asm" 5 | 6 | 7 | -------------------------------------------------------------------------------- /songs/o4c_11k_saw.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/songs/o4c_11k_saw.wav -------------------------------------------------------------------------------- /songs/o4c_11k_sine.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/songs/o4c_11k_sine.wav -------------------------------------------------------------------------------- /songs/o4c_11k_sqr.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/songs/o4c_11k_sqr.wav -------------------------------------------------------------------------------- /asm.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | pasmo moon_driver.asm moon.bin moon.sym 3 | pasmo moon_loader.asm mdrv.com mdrv.sym 4 | -------------------------------------------------------------------------------- /doc/img/cnt/cnt_4op_00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/doc/img/cnt/cnt_4op_00.png -------------------------------------------------------------------------------- /doc/img/cnt/cnt_4op_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/doc/img/cnt/cnt_4op_01.png -------------------------------------------------------------------------------- /doc/img/cnt/cnt_4op_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/doc/img/cnt/cnt_4op_10.png -------------------------------------------------------------------------------- /doc/img/cnt/cnt_4op_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/doc/img/cnt/cnt_4op_11.png -------------------------------------------------------------------------------- /songs/make_mdr_pcmpack.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/songs/make_mdr_pcmpack.bat -------------------------------------------------------------------------------- /src/pcmpack/cmp.bat: -------------------------------------------------------------------------------- 1 | SETLOCAL 2 | 3 | SET BINDIR=..\..\bin 4 | gcc -O2 -s pcmpack.c -o %BINDIR%\pcmpack 5 | -------------------------------------------------------------------------------- /moon_hoot/hoot_compose/copy_to_hoot/hootwait.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BouKiCHi/moondrv/HEAD/moon_hoot/hoot_compose/copy_to_hoot/hootwait.exe -------------------------------------------------------------------------------- /asm.bat: -------------------------------------------------------------------------------- 1 | pasmo moon_driver_hoot.asm moon_hoot.bin moon_hoot.sym 2 | pasmo moon_driver.asm moon.bin moon.sym 3 | pasmo moon_loader.asm mdrv.com mdrv.sym 4 | -------------------------------------------------------------------------------- /songs/make_mdr_debug.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | rem 4 | rem make_mdr_debug.bat 5 | rem 6 | 7 | 8 | SETLOCAL 9 | SET MODE=DEBUG 10 | call make_mdr.bat %1 11 | -------------------------------------------------------------------------------- /songs/testpcm.txt: -------------------------------------------------------------------------------- 1 | o4c_11k_sine.wav 1 -1 -1 2 | 0 0 0 0 0 0 0 0 0 3 | 4 | o4c_11k_sqr.wav 1 -1 -1 5 | 0 0 0 0 0 0 0 0 0 6 | 7 | o4c_11k_saw.wav 1 -1 -1 8 | 0 0 0 0 0 0 0 0 0 9 | -------------------------------------------------------------------------------- /xcode/mmckc/mmckc.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /songs/mkpcm.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | SETLOCAL 4 | 5 | REM ルート設定 6 | SET MOONDIR=%~dp0\..\ 7 | 8 | SET BINDIR=%MOONDIR%\bin 9 | 10 | REM BASENAME = ディレクトリ名とファイル名(拡張子含まず) 11 | set BASENAME=%~p1%~n1 12 | 13 | %BINDIR%\pcmtool %1 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MoonDriver 2 | 3 | OPL4楽曲作成環境&演奏ドライバです。 4 | 5 | 演奏させるには、エミュレータか、 6 | MoonsoundカートリッジとMSX turboR相当のハードウェアが必要になります。 7 | 8 | ## 各ドキュメント 9 | 10 | + [本体テキスト](doc/moondriver.md) 11 | + [PCMTOOL](doc/pcmtool.md) 12 | + [履歴](doc/history.txt) 13 | -------------------------------------------------------------------------------- /src/tone_src/list.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main(int argc,char *argv[]) 4 | { 5 | int i; 6 | for(i=0; i < 0x80; i++) 7 | printf( 8 | "{sizeof(regions_%02x)/sizeof(opl4_region_t) , regions_%02x} ,\n",i,i); 9 | 10 | return 0; 11 | } 12 | 13 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | 2 | DATE = $(shell date +"%y%m%d") 3 | ZIPNAME = moondrv$(DATE).zip 4 | 5 | all: help 6 | 7 | help: 8 | @echo "make " 9 | 10 | compiler: 11 | cd src/mmckc/ ; make WIN32=1 clean all install 12 | cd src/mmckc/ ; make WIN32=1 clean 13 | 14 | clean: 15 | rm -f $(ZIPNAME) 16 | 17 | zip: 18 | zip -r $(ZIPNAME) . -x '.git*' .DS_Store 19 | 20 | -------------------------------------------------------------------------------- /moon_hoot/hoot_compose/copy_to_hoot/playhoot.bat: -------------------------------------------------------------------------------- 1 | %~d0 2 | cd %~p0 3 | 4 | if exist msx goto del_pack 5 | 6 | mkdir msx 7 | goto pack 8 | 9 | :del_pack 10 | if not exist msx\moondrv.zip goto pack 11 | del msx\moondrv.zip 12 | 13 | :pack 14 | copy %1 SONG.MDR 15 | 16 | 7za a msx\moondrv.zip ..\moon_hoot\LOADER ..\moon_hoot.bin SONG.MDR 17 | 18 | hootwait --reload 19 | hootwait --play 0 hoot.exe 20 | -------------------------------------------------------------------------------- /src/mmckc/version.c: -------------------------------------------------------------------------------- 1 | char *patchstr = "patches FDS enable patch([OK]), 4-46, 4-356, 5-17, 5-95, 5-313, 5-658\n"; 2 | char *hogereleasestr = ("ppmck release 9 by h7\n"); 3 | 4 | char *moon_verstr = "Extended for MoonDriver ver 0.4 \n"; 5 | 6 | #ifdef ENGLISH 7 | #define LANGUAGE 1 // 0だとデフォルトで日本語 1だと英語 8 | #else 9 | #define LANGUAGE 0 10 | #endif 11 | 12 | int message_flag = LANGUAGE; // 表示メッセージの出力設定( 0:Jp 1:En ) 13 | 14 | -------------------------------------------------------------------------------- /moon_hoot/LOADER.SYM: -------------------------------------------------------------------------------- 1 | DRV_INIT: equ 04000H 2 | DRV_INTR: equ 04003H 3 | DRV_LDPCM: equ 04013H 4 | DRV_STOP: equ 04006H 5 | ENTRY: equ 00100H 6 | FLAG_PLAY: equ 00156H 7 | HOOK: equ 0014AH 8 | HTIMI: equ 0FD9FH 9 | I_JP: equ 000C3H 10 | I_NOP: equ 00000H 11 | I_RET: equ 000C9H 12 | LOAD_SONG: equ 00113H 13 | LOOP: equ 0010AH 14 | SKIP_STOP: equ 0011DH 15 | STACK: equ 00400H 16 | STOP: equ 00137H 17 | USRINT: equ 00157H 18 | -------------------------------------------------------------------------------- /moon_hoot/hoot_compose/mumml/prog/moondriver/install_prog.txt: -------------------------------------------------------------------------------- 1 | installation guide 2 | ------------------------------------------------------------------------------ 3 | 4 | [prog] 5 | +---[moondriver] 6 | + all files 7 | + 8 | + 9 | +---[hoot] 10 | + all files 11 | + hootwait.exe 12 | + (7za.exe : here or into PATH) 13 | 14 | ------------------------------------------------------------------------------ 15 | -------------------------------------------------------------------------------- /src/pcmtool/Makefile: -------------------------------------------------------------------------------- 1 | # 2 | # Makefile 3 | # 4 | 5 | CC = gcc 6 | STRIP = strip 7 | SFX = .exe 8 | RM = rm 9 | CP = cp 10 | 11 | TARGET = pcmtool$(SFX) 12 | OBJS = pcmtool.o 13 | CFLAGS = -O2 14 | 15 | all : $(TARGET) 16 | 17 | clean: 18 | $(RM) -f $(OBJS) 19 | $(RM) -f $(TARGET) 20 | 21 | install: $(TARGET) 22 | $(CP) $(TARGET) ../../bin 23 | 24 | $(TARGET) : $(OBJS) 25 | $(CC) -o $@ $^ 26 | $(STRIP) $@ 27 | 28 | %.o : %.c 29 | $(CC) -c $(CFLAGS) -o $@ $< 30 | 31 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # MoonDriver gitignore 2 | 3 | songs/*.h 4 | 5 | # Xcode 6 | 7 | ## Build generated 8 | build/ 9 | DerivedData 10 | 11 | ## Various settings 12 | *.pbxuser 13 | !default.pbxuser 14 | *.mode1v3 15 | !default.mode1v3 16 | *.mode2v3 17 | !default.mode2v3 18 | *.perspectivev3 19 | !default.perspectivev3 20 | xcuserdata 21 | 22 | ## Other 23 | *.xccheckout 24 | *.moved-aside 25 | *.xcuserstate 26 | *.xcscmblueprint 27 | 28 | src/mmckc/objs_w32 29 | src/mmckc/*.exe 30 | src/pcmtool/*.o 31 | src/pcmtool/pcmtool.exe 32 | -------------------------------------------------------------------------------- /songs/make_mdr.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | BINDIR=../bin 4 | 5 | if [ $# -lt 1 ] 6 | then 7 | echo "Usage: $0 [DEBUG]" 8 | exit 1 9 | fi 10 | 11 | NAME=${1%.*} 12 | MML=$1 13 | 14 | # $MMLで指定されたファイル名が存在しない 15 | if [ ! -e $MML ] 16 | then 17 | MML=${NAME}.mml 18 | fi 19 | 20 | # コンパイル 21 | ${BINDIR}/mmckc -i $MML 22 | 23 | # アセンブルを行う 24 | ${BINDIR}/pceas -raw mdrvhdr.asm 25 | 26 | if [ ! -e mdrvhdr.pce ] 27 | then 28 | exit 1 29 | fi 30 | 31 | mv mdrvhdr.pce ${NAME}.MDR 32 | 33 | if [ "x${2}" != "xDEBUG" ] 34 | then 35 | rm ${NAME}.h 36 | rm define.inc 37 | rm effect.h 38 | fi 39 | -------------------------------------------------------------------------------- /songs/testpcm.mml: -------------------------------------------------------------------------------- 1 | ; 2 | ; mknsf.bat testpcm.txt 3 | ; make_mdr_pcmpack testpcm.mml 4 | ; 5 | 6 | #EX-OPL3 7 | 8 | #TITLE PCM Test Song 9 | 10 | #PCMFILE testpcm.pcm 11 | 12 | @TONE00 = { $00, $7F, $0180, 3000, $00, 13 | $F0, $00, $0F, $00 } 14 | 15 | @TONE01 = { $00, $7F, $0181, 3000, $00, 16 | $F0, $00, $0F, $00 } 17 | 18 | @TONE02 = { $00, $7F, $0182, 3000, $00, 19 | $F0, $00, $0F, $00 } 20 | 21 | A l4 o4 22 | A W0 v127 23 | A cdefgab>c1 r cc1 r cc1 r c $temp$.log 14 | Line7= 15 | Line8=if not exist $temp$.mdr goto error01 16 | Line9=move $temp$.mdr $filepath$$filename2$.mdr 17 | Line10=:fin 18 | Line11=move $temp$.log $filepath$$filename2$.log 19 | Line12=del $temp$.mdr 20 | Line13=exit 21 | Line14=:error01 22 | Line15=echo failed to compile >> $temp$.log 23 | Line16=goto fin 24 | 25 | [Option] 26 | UseCUI=1 27 | ForceShortName=0 28 | DetectError=1 29 | StepMode=0 30 | CUIWindowState=2 31 | UseGUI=1 32 | UseAssociated=0 33 | GUIWindowState=1 34 | 35 | [Required] 36 | ItemCount=2 37 | Item1=..\moon.bin 38 | Item2=..\hoot\hootwait.exe 39 | -------------------------------------------------------------------------------- /songs/test.mml: -------------------------------------------------------------------------------- 1 | #OPL4-NOUSE 2 | #EX-OPL3 3 | 4 | #TITLE Test Song 5 | #COMPOSER BouKiCHi 6 | #MAKER BouKiCHi 7 | 8 | @OPL0 = { 9 | ;FB ST T V P 10 | 0 ,0 ,0 ,0 ,0 11 | 12 | ;TR VI SU KSR MUL KSL OL AR DR SL RR WF 13 | 0 ,0 ,0 ,0 ,2 ,0 ,$8 ,$f ,0 ,0 ,4 ,1, 14 | 0 ,0 ,0 ,0 ,0 ,0 ,$8 ,$f ,0 ,0 ,4 ,1, 15 | 0 ,0 ,0 ,0 ,0 ,0 ,0 ,5 ,5 ,5 ,5 ,0, 16 | 0 ,0 ,0 ,0 ,0 ,0 ,0 ,5 ,5 ,5 ,5 ,0 17 | } 18 | 19 | 20 | @OPL1 = { 21 | ;FB ST T V P 22 | 0 ,1 ,0 ,0 ,0 23 | 24 | ;TR VI SU KSR MUL KSL OL AR DR SL RR WF 25 | 0 ,0 ,0 ,0 ,2 ,0 ,$8 ,$f ,0 ,0 ,4 ,1, 26 | 0 ,0 ,0 ,0 ,0 ,0 ,$8 ,$f ,0 ,0 ,4 ,1 27 | } 28 | 29 | 30 | @OPF2 = { 31 | ;FB ST T V P 32 | 0 ,1 ,0 ,0 ,0 33 | 34 | ;TR VI SU KSR MUL KSL OL AR DR SL RR WF 35 | 0 ,0 ,0 ,0 ,2 ,0 ,$8 ,$f ,0 ,0 ,4 ,1, 36 | 0 ,0 ,0 ,0 ,0 ,0 ,$8 ,$f ,0 ,0 ,4 ,1, 37 | 0 ,0 ,0 ,0 ,0 ,0 ,0 ,5 ,5 ,5 ,5 ,0, 38 | 0 ,0 ,0 ,0 ,0 ,0 ,0 ,5 ,5 ,5 ,5 ,0 39 | } 40 | 41 | 42 | 43 | @OPL3 = { 44 | ;FB ST T V P 45 | 0 ,1 ,0 ,0 ,0 46 | 47 | ;TR VI SU KSR MUL KSL OL AR DR SL RR WF 48 | 0 ,0 ,0 ,0 ,2 ,0 ,$8 ,$f ,0 ,0 ,4 ,1, 49 | 0 ,0 ,0 ,0 ,0 ,0 ,$8 ,$f ,0 ,0 ,4 ,1 50 | } 51 | 52 | 53 | 54 | A v63 t120 o4 55 | 56 | A WX0 57 | ; A c d e f g 58 | A c & v-5 g 59 | -------------------------------------------------------------------------------- /songs/opl3_4op.mml: -------------------------------------------------------------------------------- 1 | #EX-OPL3 2 | #OPL4-NOUSE 3 | 4 | #TITLE OPL3 4OP Test 5 | 6 | @OPF0 = { 7 | ;FB ST T V P 8 | 1 ,1 ,0 ,0 ,0 9 | 10 | ;TR VI SU KSR MUL KSL OL AR DR SL RR WF 11 | 0 ,0 ,0 ,0 ,2 ,0 ,$8 ,$f ,0 ,0 ,4 ,1, 12 | 0 ,0 ,0 ,0 ,0 ,0 ,$8 ,$f ,0 ,0 ,4 ,1, 13 | 0 ,0 ,0 ,0 ,0 ,0 ,0 ,5 ,5 ,5 ,5 ,0, 14 | 0 ,0 ,0 ,0 ,0 ,0 ,0 ,5 ,5 ,5 ,5 ,0 15 | } 16 | 17 | @OPF1 = { 18 | ;FB ST T V P 19 | 2 ,2 ,0 ,0 ,0 20 | 21 | ;TR VI SU KSR MUL KSL OL AR DR SL RR WF 22 | 0 ,0 ,0 ,0 ,2 ,0 ,$8 ,$f ,0 ,0 ,4 ,1, 23 | 0 ,0 ,0 ,0 ,0 ,0 ,$8 ,$f ,0 ,0 ,4 ,1, 24 | 0 ,0 ,0 ,0 ,0 ,0 ,0 ,5 ,5 ,5 ,5 ,0, 25 | 0 ,0 ,0 ,0 ,0 ,0 ,0 ,5 ,5 ,5 ,5 ,0 26 | } 27 | 28 | @OPF2 = { 29 | ;FB ST T V P 30 | 2 ,3 ,0 ,0 ,0 31 | 32 | ;TR VI SU KSR MUL KSL OL AR DR SL RR WF 33 | 0 ,0 ,0 ,0 ,2 ,0 ,$8 ,$f ,0 ,0 ,4 ,1, 34 | 0 ,0 ,0 ,0 ,0 ,0 ,$8 ,$f ,0 ,0 ,4 ,1, 35 | 0 ,0 ,0 ,0 ,0 ,0 ,0 ,5 ,5 ,5 ,5 ,0, 36 | 0 ,0 ,0 ,0 ,0 ,0 ,0 ,5 ,5 ,5 ,5 ,0 37 | } 38 | 39 | ; OPMの並び LKJCBA 40 | A OPM%111111 41 | ABCJKL t120 l4 o4 42 | A W0 v127 43 | B W1 v127 44 | C W2 v127 45 | 46 | J W0 v127 47 | K W1 v127 48 | L W2 v127 49 | 50 | A c1 51 | BCJKL r1 52 | 53 | B c1 54 | ACJKL r1 55 | 56 | C c1 57 | ABJKL r1 58 | 59 | J c1 60 | ABCKL r1 61 | 62 | K c1 63 | ABCJL r1 64 | 65 | L c1 66 | ABCJK r1 67 | -------------------------------------------------------------------------------- /src/tone_src/tone.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include "yrw801.c" 4 | 5 | typedef struct 6 | { 7 | const int len; 8 | const opl4_region_t *region; 9 | } opl4_regmap_t; 10 | 11 | const opl4_regmap_t tonemap[]= 12 | { 13 | #include "map.h" 14 | {sizeof(regions_drums)/sizeof(opl4_region_t) , regions_drums} 15 | }; 16 | 17 | 18 | 19 | int main(int argc,char *argv[]) 20 | { 21 | int i; 22 | int tone; 23 | 24 | if (argc < 2) 25 | { 26 | printf("Usage : tone \n"); 27 | printf("Max tone number = %d\n",(sizeof(tonemap)/sizeof(opl4_regmap_t))-1); 28 | printf("128 is drum kit\n"); 29 | return 0; 30 | } 31 | 32 | sscanf(argv[1],"%d",&tone); 33 | if (tone >= sizeof(tonemap)/sizeof(opl4_regmap_t)) 34 | { 35 | printf("Error : too big tone number\n"); 36 | } 37 | 38 | 39 | printf("; tone=%d\n",tone); 40 | 41 | printf("; len = %d\n",tonemap[tone].len); 42 | 43 | 44 | for(i=0; i < tonemap[tone].len; i++) 45 | { 46 | printf(" $%02x,$%02x,$%04x,%d, $%02x,$%02x,$%02x,$%02x,$%02x \n", 47 | tonemap[tone].region[i].key_min, 48 | tonemap[tone].region[i].key_max, 49 | tonemap[tone].region[i].sound.tone, 50 | tonemap[tone].region[i].sound.pitch_offset, 51 | 52 | tonemap[tone].region[i].sound.reg_lfo_vibrato, 53 | tonemap[tone].region[i].sound.reg_attack_decay1, 54 | tonemap[tone].region[i].sound.reg_level_decay2, 55 | tonemap[tone].region[i].sound.reg_release_correction, 56 | tonemap[tone].region[i].sound.reg_tremolo 57 | ); 58 | } 59 | 60 | return 0; 61 | } 62 | -------------------------------------------------------------------------------- /doc/history.txt: -------------------------------------------------------------------------------- 1 | 2 | ◇リリースノート 3 | ver 180507 4 |  PCM関連ツールの改善。 5 | 6 | ver 180410 7 |  曲データにタグを追加するようにした。 8 | 9 | ver 160310 10 |  スラーコマンド時の処理の変更。(音符以外が使用可能になった) 11 | 12 | ver 160309 13 |  OPF定義使用時にOPL定義の処理が変わる問題を修正。 14 | 15 | ver 160305 16 |  R800搭載高速機種への対応の為、BUSYフラグの確認機能を戻した。 17 | 18 | ver 160303 19 |  PCM -> OPL4 SRAM転送時のバンクサイズを修正した。 20 | 21 | ver 160229 22 |  ドキュメントを整理した。 23 | (at)OPF定義の追加した。(4OP用) 24 | 演奏停止時にSLとRRを設定するようにした。 25 | 26 | ver 160209 27 |  hoot用ローダーと統合した。 28 | 29 | 30 | ver 160208 31 |  SRAMチェックを行うようにした。 32 |  デバッグ用にhoot用のドライバを生成するようにした。 33 | 34 | 35 | ver 160205 36 |  リリースノートを分離した。 37 |  MDRファイルをPCMパック可能にした。 38 |  MDRV.COMで拡張子指定を不要にした。 39 | 40 | 41 | ver 160201 42 | ワークメモリの初期化を改善した。 43 | 44 | 45 | ver 150402 46 | #PITCH_CORRECTION使用時にデチューンと 47 | ピッチエンベロープのデータを反転させるようにした。 48 | @OPLにVOPの設定を追加した。 49 | 50 | 51 | ver 150324 52 | OPL3音色定義のSTパラメータの定義を修正した。 53 | 54 | 55 | ver 150318 56 | コンパイラ上のスラー処理を修正した。 57 | 58 | 59 | ver 150311 60 | yoコマンドにアドレス変換機能の追加を行った。 61 | 62 | 63 | ver 150303 64 | PCMFILE定義の追加。 65 | yoコマンドの追加。 66 | ドキュメントを更新。 67 | 68 | 69 | ver 150301 70 | OPL3のFnumテーブルの更新。 71 | ドラムのFnumデフォルト値を変更した。 72 | コマンド解説を追記した。 73 | MDRV.COMからMOON.BINを読み出すようにした。 74 | 75 | 76 | ver 150227 77 | yコマンドの実装。 78 | ドラムノートコマンドの実装。 79 | ドラムセットコマンドのバグを修正、Fnum設定を行うようにした。 80 | 81 | 82 | ver 150224 ドキュメント上のTVPコマンドの誤字を修正。 83 | ジャンプコマンドを修正した。 84 | パンの設定を周波数計算時ではなくPANコマンドもしくは音色設定時に行うようにした。 85 | 初期化を見直して、必要最低限にした。 86 | レジスタ書き込み時のウェイトを削除した。 87 | ドラムセット機能を追加した。 88 | 89 | 90 | ver 150223 ジャンプ機能の追加。TVPの音色での設定を廃止した。 91 | ver 150202 ドライバを分離できるようにした。 92 | ver 070701 実機に対応するよう調節。 93 | ver 070528 OPL3を追加 94 | ver 070513 DA,RVコマンド追加。リピートの修正。 95 | ver 070505 初期版配布 96 | -------------------------------------------------------------------------------- /src/mmckc/Makefile: -------------------------------------------------------------------------------- 1 | # 2 | # makefile for mmckc MinGW and POSIX 3 | # 4 | # if you'd like to make DEBUG executable, 5 | # make DEBUG=1 6 | # 7 | 8 | # DEBUG = 1 9 | 10 | ifeq ($(OS),Windows_NT) 11 | WIN32=1 12 | endif 13 | 14 | CFLAGS = 15 | 16 | ifdef WIN32 17 | CFLAGS += -finput-charset=utf-8 -fexec-charset=cp932 18 | PFX=i686-w64-mingw32- 19 | EXESFX = .exe 20 | OBJDIR = objs_w32 21 | 22 | else 23 | 24 | PFX= 25 | OBJDIR = objs 26 | CFLAGS += -DUNIX 27 | EXESFX = 28 | 29 | endif 30 | 31 | CC = $(PFX)gcc 32 | 33 | MAKODIR = $(OBJDIR)/ 34 | CMDODIR = $(OBJDIR)/ 35 | 36 | MKDIR = mkdir -p 37 | CP = cp 38 | RM = rm -rf 39 | INSTDIR = ../../bin 40 | 41 | 42 | ifdef DEBUG 43 | 44 | CFLAGS += -g 45 | CFLAGS += -Wall# -mno-cygwin 46 | 47 | else 48 | 49 | CFLAGS += -O2 50 | EXT_TARGET = strip 51 | 52 | endif 53 | 54 | CDEFS = 55 | LDFLAGS= # -mno-cygwin 56 | 57 | OBJS = datamake.o file.o mckc.o strings.o 58 | 59 | .PHONY: all clean strip objdir install 60 | PRGNAME = mmckc 61 | 62 | TARGET_E = $(PRGNAME)$(EXESFX) 63 | TARGET = $(PRGNAME)_j$(EXESFX) 64 | 65 | all: objdir $(TARGET_E) $(TARGET) $(EXT_TARGET) 66 | 67 | objdir : 68 | $(MKDIR) $(CMDODIR) 69 | 70 | $(TARGET_E): $(addprefix $(MAKODIR),$(OBJS) version_e.o) 71 | $(CC) $(LDFLAGS) -o $@ $^ 72 | 73 | $(TARGET): $(addprefix $(MAKODIR),$(OBJS) version.o) 74 | $(CC) $(LDFLAGS) -o $@ $^ 75 | 76 | strip : $(TARGET_E) $(TARGET) 77 | strip $^ 78 | 79 | $(MAKODIR)version_e.o: version.c 80 | $(CC) $(CFLAGS) $(CDEFS) -DENGLISH -o $@ -c $^ 81 | 82 | $(MAKODIR)%.o : %.c 83 | $(CC) $(CFLAGS) $(CDEFS) -c $< -o $@ 84 | 85 | $(MAKODIR)mckc.o: mckc.h 86 | $(MAKODIR)datamake.o: mckc.h 87 | 88 | install: all 89 | $(CP) $(TARGET_E) $(INSTDIR) 90 | $(CP) $(TARGET) $(INSTDIR) 91 | 92 | clean: 93 | $(RM) $(OBJDIR) 94 | $(RM) $(TARGET_E) $(TARGET) 95 | 96 | -------------------------------------------------------------------------------- /mdrv.sym: -------------------------------------------------------------------------------- 1 | BDOS EQU 00005H 2 | FCB EQU 0005CH 3 | H_TIMI EQU 0FD9FH 4 | MDRV_ALLOFF EQU 04006H 5 | MDRV_INIT EQU 04000H 6 | MDRV_INT EQU 04003H 7 | MDRV_LOADPCM EQU 04013H 8 | MDRV_VERSTR EQU 04011H 9 | MDR_BANKS EQU 08032H 10 | MDR_DSTPCM EQU 08030H 11 | MDR_ID EQU 08000H 12 | MDR_LASTS EQU 08033H 13 | MDR_PACKED EQU 0802AH 14 | MDR_STPCM EQU 08031H 15 | MOON_BASE EQU 000C4H 16 | PG2RAM EQU 0F342H 17 | RAM_PAGE3 EQU 000FEH 18 | change_page3 EQU 0028CH 19 | check_file EQU 001B4H 20 | check_file_lp EQU 001C0H 21 | check_moon EQU 002D2H 22 | check_ng EQU 0015DH 23 | disp_hex EQU 002ADH 24 | dos_dta EQU 0042FH 25 | driver_fcb EQU 00338H 26 | file_error EQU 0013DH 27 | found_moon EQU 00118H 28 | intr_cnt EQU 0032EH 29 | intr_inc_cnt EQU 00330H 30 | load_driver EQU 00240H 31 | load_driver_eof EQU 0027BH 32 | load_driver_lp01 EQU 0025DH 33 | load_file EQU 001C9H 34 | load_file_eof EQU 0022FH 35 | load_file_lp01 EQU 001FEH 36 | load_file_start EQU 001EFH 37 | load_pcm EQU 00163H 38 | loaded_bank EQU 0032FH 39 | main_check_file EQU 00145H 40 | out_ch EQU 00298H 41 | out_lf EQU 002A3H 42 | out_str EQU 00293H 43 | restore_timi EQU 002FBH 44 | save_hook EQU 00309H 45 | set_timi EQU 002D7H 46 | skip_verstr EQU 00135H 47 | start_play EQU 0017EH 48 | start_play_fin EQU 001AEH 49 | start_play_lp1 EQU 00192H 50 | start_play_lp2 EQU 001A0H 51 | str_check EQU 003DDH 52 | str_file_error EQU 003F7H 53 | str_file_id EQU 0042BH 54 | str_format_error EQU 00404H 55 | str_hextbl EQU 00418H 56 | str_lf EQU 003D4H 57 | str_loading_driver EQU 003B3H 58 | str_loading_pcm EQU 003C5H 59 | str_loading_song EQU 003A3H 60 | str_mdrext EQU 00428H 61 | str_moon_fnd EQU 00375H 62 | str_moon_not EQU 0038AH 63 | str_ng EQU 003DAH 64 | str_ok EQU 003D7H 65 | str_play EQU 003E4H 66 | str_prog_title EQU 0035DH 67 | str_ram_error EQU 003EBH 68 | userint EQU 0030EH 69 | usrint_end EQU 0031FH 70 | x86_trap EQU 00103H 71 | -------------------------------------------------------------------------------- /songs/opl3_4op_tl.mml: -------------------------------------------------------------------------------- 1 | #EX-OPL3 2 | #OPL4-NOUSE 3 | 4 | #TITLE OPL3 4OP TL Test 5 | 6 | @OPF0 = { 7 | ;FB ST T V P 8 | 1 ,0 ,0 ,0 ,0 9 | 10 | ;TR VI SU KSR MUL KSL OL AR DR SL RR WF 11 | 0 ,0 ,0 ,0 ,2 ,0 ,$8 ,$f ,0 ,0 ,4 ,1, 12 | 0 ,0 ,0 ,0 ,0 ,0 ,$8 ,$f ,0 ,0 ,4 ,1, 13 | 0 ,0 ,0 ,0 ,0 ,0 ,$0 ,5 ,5 ,5 ,5 ,0, 14 | 0 ,0 ,0 ,0 ,0 ,0 ,$0 ,5 ,5 ,5 ,5 ,0 15 | } 16 | 17 | @OPF1 = { 18 | ;FB ST T V P 19 | 1 ,1 ,0 ,0 ,0 20 | 21 | ;TR VI SU KSR MUL KSL OL AR DR SL RR WF 22 | 0 ,0 ,0 ,0 ,2 ,0 ,$8 ,$f ,0 ,0 ,4 ,1, 23 | 0 ,0 ,0 ,0 ,0 ,0 ,$8 ,$f ,0 ,0 ,4 ,1, 24 | 0 ,0 ,0 ,0 ,0 ,0 ,0 ,5 ,5 ,5 ,5 ,0, 25 | 0 ,0 ,0 ,0 ,0 ,0 ,0 ,5 ,5 ,5 ,5 ,0 26 | } 27 | 28 | @OPF2 = { 29 | ;FB ST T V P 30 | 1 ,2 ,0 ,0 ,0 31 | 32 | ;TR VI SU KSR MUL KSL OL AR DR SL RR WF 33 | 0 ,0 ,0 ,0 ,2 ,0 ,$8 ,$f ,0 ,0 ,4 ,1, 34 | 0 ,0 ,0 ,0 ,0 ,0 ,$8 ,$f ,0 ,0 ,4 ,1, 35 | 0 ,0 ,0 ,0 ,0 ,0 ,0 ,5 ,5 ,5 ,5 ,0, 36 | 0 ,0 ,0 ,0 ,0 ,0 ,0 ,5 ,5 ,5 ,5 ,0 37 | } 38 | 39 | @OPF3 = { 40 | ;FB ST T V P 41 | 1 ,3 ,0 ,0 ,0 42 | 43 | ;TR VI SU KSR MUL KSL OL AR DR SL RR WF 44 | 0 ,0 ,0 ,0 ,2 ,0 ,$8 ,$f ,0 ,0 ,4 ,1, 45 | 0 ,0 ,0 ,0 ,0 ,0 ,$8 ,$f ,0 ,0 ,4 ,1, 46 | 0 ,0 ,0 ,0 ,0 ,0 ,0 ,5 ,5 ,5 ,5 ,0, 47 | 0 ,0 ,0 ,0 ,0 ,0 ,0 ,5 ,5 ,5 ,5 ,0 48 | } 49 | 50 | 51 | ; OPMの並び LKJCBA 52 | A OPM%111111 53 | A t120 l4 o4 54 | 55 | ; ST=0 56 | ; CON=0 57 | A W0 VOP%1000 58 | A v63 c2 v32 d2 v16 e2 v0 f2 59 | 60 | A W0 VOP%0111 61 | A v63 c2 v32 d2 v16 e2 v0 f2 62 | 63 | 64 | ; ST=1 65 | ; CON=01 66 | A W1 VOP%1010 67 | A v63 c2 v32 d2 v16 e2 v0 f2 68 | 69 | A W1 VOP%0101 70 | A v63 c2 v32 d2 v16 e2 v0 f2 71 | 72 | 73 | ; ST=2 74 | ; CON=10 75 | A W2 VOP%1001 76 | A v63 c2 v32 d2 v16 e2 v0 f2 77 | 78 | A W2 VOP%0110 79 | A v63 c2 v32 d2 v16 e2 v0 f2 80 | 81 | ; ST=3 82 | ; CON=11 83 | A W3 VOP%1101 84 | A v63 c2 v32 d2 v16 e2 v0 f2 85 | 86 | A W3 VOP%0010 87 | A v63 c2 v32 d2 v16 e2 v0 f2 88 | -------------------------------------------------------------------------------- /moon_hoot/hoot_compose/copy_to_hoot/hoot.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 22 | 23 | 24 | 27 | 28 | 29 | 31 | ]> 32 | 33 | 34 | [MSX] MoonDriver songs 35 | msx 36 | 37 | 45 | 46 | LOADER 47 | moon_hoot.bin 48 | SONG.MDR 49 | 50 | 51 | SONG.MDR 52 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /songs/opl3_2op.mml: -------------------------------------------------------------------------------- 1 | #EX-OPL3 2 | #OPL4-NOUSE 3 | 4 | #TITLE OPL3 2OP Test 5 | 6 | @OPF0 = { 7 | ;FB ST T V P 8 | 1 ,1 ,0 ,0 ,0 9 | 10 | ;TR VI SU KSR MUL KSL OL AR DR SL RR WF 11 | 0 ,0 ,0 ,0 ,2 ,0 ,$8 ,$f ,0 ,0 ,4 ,1, 12 | 0 ,0 ,0 ,0 ,0 ,0 ,$8 ,$f ,0 ,0 ,4 ,1, 13 | 0 ,0 ,0 ,0 ,0 ,0 ,0 ,5 ,5 ,5 ,5 ,0, 14 | 0 ,0 ,0 ,0 ,0 ,0 ,0 ,5 ,5 ,5 ,5 ,0 15 | } 16 | 17 | @OPF1 = { 18 | ;FB ST T V P 19 | 2 ,1 ,0 ,0 ,0 20 | 21 | ;TR VI SU KSR MUL KSL OL AR DR SL RR WF 22 | 0 ,0 ,0 ,0 ,2 ,0 ,$8 ,$f ,0 ,0 ,4 ,3, 23 | 0 ,0 ,0 ,0 ,0 ,0 ,$8 ,$f ,0 ,0 ,4 ,1, 24 | 0 ,0 ,0 ,0 ,0 ,0 ,0 ,5 ,5 ,5 ,5 ,0, 25 | 0 ,0 ,0 ,0 ,0 ,0 ,0 ,5 ,5 ,5 ,5 ,0 26 | } 27 | 28 | @OPF2 = { 29 | ;FB ST T V P 30 | 3 ,0 ,0 ,0 ,0 31 | 32 | ;TR VI SU KSR MUL KSL OL AR DR SL RR WF 33 | 0 ,0 ,0 ,0 ,2 ,0 ,4 ,$f ,0 ,0 ,4 ,2, 34 | 0 ,0 ,0 ,0 ,0 ,0 ,$8 ,$f ,0 ,0 ,4 ,1, 35 | 0 ,0 ,0 ,0 ,0 ,0 ,0 ,5 ,5 ,5 ,5 ,0, 36 | 0 ,0 ,0 ,0 ,0 ,0 ,0 ,5 ,5 ,5 ,5 ,0 37 | } 38 | 39 | ABCDEFGHI t120 l4 o4 40 | JKLMNOPQR t120 l4 o4 41 | 42 | ADG WX0 v127 43 | JMP WX0 v127 44 | 45 | BEH WX1 v127 46 | KNQ WX1 v127 47 | 48 | CFI WX2 v127 49 | LOR WX2 v127 50 | 51 | 52 | 53 | A c1 54 | BCDEFGHI r1 55 | JKLMNOPQR r1 56 | 57 | B c1 58 | ACDEFGHI r1 59 | JKLMNOPQR r1 60 | 61 | C c1 62 | ABDEFGHI r1 63 | JKLMNOPQR r1 64 | D c1 65 | ABCEFGHI r1 66 | JKLMNOPQR r1 67 | E c1 68 | ABCDFGHI r1 69 | JKLMNOPQR r1 70 | 71 | F c1 72 | ABCDEGHI r1 73 | JKLMNOPQR r1 74 | 75 | G c1 76 | ABCDEFHI r1 77 | JKLMNOPQR r1 78 | 79 | H c1 80 | ABCDEFGI r1 81 | JKLMNOPQR r1 82 | 83 | I c1 84 | ABCDEFGH r1 85 | JKLMNOPQR r1 86 | 87 | J c1 88 | ABCDEFGHI r1 89 | KLMNOPQR r1 90 | 91 | K c1 92 | ABCDEFGHI r1 93 | JLMNOPQR r1 94 | 95 | L c1 96 | ABCDEFGHI r1 97 | JKMNOPQR r1 98 | 99 | M c1 100 | ABCDEFGHI r1 101 | JKLNOPQR r1 102 | 103 | N c1 104 | ABCDEFGHI r1 105 | JKLMOPQR r1 106 | 107 | O c1 108 | ABCDEFGHI r1 109 | JKLMNPQR r1 110 | 111 | P c1 112 | ABCDEFGHI r1 113 | JKLMNOQR r1 114 | 115 | Q c1 116 | ABCDEFGHI r1 117 | JKLMNOPR r1 118 | 119 | R c1 120 | ABCDEFGHI r1 121 | JKLMNOPQ r1 122 | 123 | -------------------------------------------------------------------------------- /.vscode/c_cpp_properties.json: -------------------------------------------------------------------------------- 1 | { 2 | "configurations": [ 3 | { 4 | "name": "Mac", 5 | "includePath": [ 6 | "/usr/include", 7 | "/usr/local/include", 8 | "${workspaceFolder}" 9 | ], 10 | "defines": [], 11 | "intelliSenseMode": "clang-x64", 12 | "browse": { 13 | "path": [ 14 | "/usr/include", 15 | "/usr/local/include", 16 | "${workspaceFolder}" 17 | ], 18 | "limitSymbolsToIncludedHeaders": true, 19 | "databaseFilename": "" 20 | }, 21 | "macFrameworkPath": [ 22 | "/System/Library/Frameworks", 23 | "/Library/Frameworks" 24 | ], 25 | "compilerPath": "C:\\msys64\\mingw32\\bin\\gcc.exe", 26 | "cStandard": "c11", 27 | "cppStandard": "c++17" 28 | }, 29 | { 30 | "name": "Linux", 31 | "includePath": [ 32 | "/usr/include", 33 | "/usr/local/include", 34 | "${workspaceFolder}" 35 | ], 36 | "defines": [], 37 | "intelliSenseMode": "clang-x64", 38 | "browse": { 39 | "path": [ 40 | "/usr/include", 41 | "/usr/local/include", 42 | "${workspaceFolder}" 43 | ], 44 | "limitSymbolsToIncludedHeaders": true, 45 | "databaseFilename": "" 46 | }, 47 | "compilerPath": "C:\\msys64\\mingw32\\bin\\gcc.exe", 48 | "cStandard": "c11", 49 | "cppStandard": "c++17" 50 | }, 51 | { 52 | "name": "Win32", 53 | "includePath": [ 54 | "${workspaceFolder}", 55 | "C:\\msys64\\mingw32\\i686-w64-mingw32\\include" 56 | ], 57 | "defines": [ 58 | "_DEBUG", 59 | "UNICODE", 60 | "_UNICODE" 61 | ], 62 | "intelliSenseMode": "msvc-x64", 63 | "browse": { 64 | "path": [ 65 | "${workspaceFolder}" 66 | ], 67 | "limitSymbolsToIncludedHeaders": true, 68 | "databaseFilename": "" 69 | }, 70 | "cStandard": "c11", 71 | "cppStandard": "c++17", 72 | "compilerPath": "C:\\msys64\\mingw32\\bin\\gcc.exe" 73 | } 74 | ], 75 | "version": 4 76 | } -------------------------------------------------------------------------------- /moon_hoot/hoot.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 22 | 23 | 24 | 27 | 28 | 29 | 31 | ]> 32 | 33 | 34 | [MSX] MoonDriver songs 35 | msx 36 | 37 | 45 | 46 | LOADER 47 | moon_hoot.bin 48 | O3D001.MDR 49 | O3D002.MDR 50 | O3D003.MDR 51 | O3D004.MDR 52 | ENCOUNT.MDR 53 | TIMESUP.MDR 54 | 55 | 56 | MoonDriver for OPL3 DEMO 001 / naruto 57 | MoonDriver for OPL3 DEMO 002 / naruto 58 | MoonDriver for OPL3 DEMO 003 / naruto 59 | MoonDriver for OPL3 DEMO 004 / naruto 60 | encounter the unknown environment / naruto 61 | TIME'S UP! / naruto 62 | 63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /doc/spec.md: -------------------------------------------------------------------------------- 1 | # MoonDriver仕様 2 | 3 | 資料がコードのみのため、コードの解析結果を記載しています。 4 | 5 | ## コマンド表 6 | 7 | | ラベル | コマンド番号 | 内容 | 8 | | -------------- | ------------ | ----------------------------- | 9 | | seq_drumnote | $e0 | Set drum note | 10 | | seq_drumbit | $e1 | Set drum bits | 11 | | seq_jump | $e2 | | 12 | | seq_fbs | $e3 | Set FBS | 13 | | seq_tvp | $e4 | Set TVP | 14 | | seq_ld2ops | $e5 | Load 2OP Instrument | 15 | | seq_setop | $e6 | Set opbase | 16 | | seq_nop | $e7 | Pitch shift | 17 | | seq_nop | $e8 | | 18 | | seq_slar | $e9 | Slar switch | 19 | | seq_revbsw | $ea | Reverb switch / VolumeOP | 20 | | seq_damp | $eb | Damp switch / OPMODE | 21 | | seq_nop | $ec | LFO freq | 22 | | seq_nop | $ed | LFO mode | 23 | | seq_bank | $ee | Bank change | 24 | | seq_lfosw | $ef | Mode change | 25 | | seq_pan | $f0 | Set Pan | 26 | | seq_inst | $f1 | Load Instrument (4OP or OPL4) | 27 | | seq_drum | $f2 | Set Drum | 28 | | seq_nop | $f3 | | 29 | | seq_wait | $f4 | Wait | 30 | | seq_data_write | $f5 | Data Write | 31 | | seq_nop | $f6 | | 32 | | seq_nenv | $f7 | Note envelope | 33 | | seq_penv | $f8 | Pitch envelope | 34 | | seq_skip_1 | $f9 | | 35 | | seq_detune | $fa | Detune | 36 | | seq_nop | $fb | LFO | 37 | | seq_rest | $fc | Rest | 38 | | seq_volume | $fd | Volume | 39 | | seq_skip_1 | $fe | Not used | 40 | | seq_loop | $ff | Loop | 41 | 42 | ## コマンド 43 | 44 | ### seq_data_write($f5) 45 | 46 | 入力 : low, high, data 47 | 48 | | high | 内容 | 49 | | ---- | ----------------- | 50 | | 0 | write_data_cur_fm | 51 | | 1 | moon_fm1_out | 52 | | 2 | moon_fm2_out | 53 | | 3 | moon_wave_out | 54 | 55 | 56 | -------------------------------------------------------------------------------- /songs/mdrvhdr.asm: -------------------------------------------------------------------------------- 1 | ; MDRV file header ver 180410 by BKC 2 | ; 2007/04/21 first version 3 | ; 2007/05/15 second version 4 | ; 2007/05/22 third version 5 | ; 2015/03/02 Added PCMFILE definition. 6 | ; 2016/02/04 Improved packed PCM definition. 7 | ; 2018/04/10 8 | 9 | .include "define.inc" 10 | 11 | DATA_BANK .equ 0 12 | 13 | .bank 0 14 | .org $8000 15 | .code 16 | 17 | ds $80 ; fill the header with zero 18 | 19 | .org $8000 20 | 21 | db "MDRV" 22 | dw $0004 ; version 23 | db $00 ; num of used channels ( 0 = auto ) 24 | 25 | db SOUND_GENERATOR ; device flags 26 | 27 | dw $0000 ; adr title string ( terminated with zero ) 28 | dw $0000 ; adr artist string ( terminated with zero ) 29 | dw $0000 ; adr comment string ( terminated with zero ) 30 | db SOUND_USERPCM ; User PCM flag 31 | db $00 ; reserved 32 | 33 | dw sound_data_table ; adr track table 34 | dw sound_data_bank ; adr track bank table 35 | 36 | dw loop_point_table ; adr loop table 37 | dw loop_point_bank ; adr loop bank table 38 | 39 | dw softenve_table ; adr venv table 40 | dw softenve_lp_table ; adr venv lp table 41 | 42 | dw pitchenve_table ; adr penv table 43 | dw pitchenve_lp_table ; adr penv lp table 44 | 45 | dw arpeggio_table ; adr nenv table 46 | dw arpeggio_lp_table ; adr nenv lp table 47 | 48 | dw $0000 ; adr lfo table 49 | dw ttbl_data_table ; adr inst table 50 | 51 | dw opl3tbl_data_table ; adr opl3 table 52 | 53 | pcm_flags: 54 | ; pos: 0x2a PCM Flag 55 | 56 | ; 0 = no use PCM 57 | ; 1 = PCM is packed into the MDR file. 58 | db $00 59 | db $00 60 | 61 | ; pos: 0x2c PCM string address (if not zero) 62 | 63 | .if (SOUND_USERPCM = 1) 64 | dw userpcm_string 65 | .else 66 | dw $0000 67 | .endif 68 | 69 | ; pos: 0x2e tag string(if not zero) 70 | dw tag_string 71 | 72 | ; pos: 0x30 73 | db $00 ; start address of OPL4 SRAM(x * 0x10000) 74 | db $00 ; start bank of PCM 75 | db $00 ; size of PCM banks 76 | db $00 ; size of last bank(x * 0x100) 77 | db $00 ; large count of PCM banks 78 | 79 | ; pos: 0x40 (PCM filename; the format should be 8.3) 80 | .org $8040 81 | 82 | .if (SOUND_USERPCM = 1) 83 | userpcm_string: 84 | PCMFILE 85 | .endif 86 | 87 | .org $8080 88 | 89 | tag_string: 90 | TITLE_TEXT ; Track name (en) 91 | db $00 ; Track name(jp) 92 | MAKER_TEXT ; Game name(en) 93 | db $00 ; Game name(jp) 94 | db $00 ; System name(en) 95 | db $00 ; System name(jp) 96 | COMPOSER_TEXT ; Track author(en) 97 | db $00 ; Track author(jp) 98 | db $00 ; Release date 99 | db $00 ; Programmer 100 | db $00 ; Notes 101 | 102 | .include "effect.h" 103 | -------------------------------------------------------------------------------- /doc/opl4.md: -------------------------------------------------------------------------------- 1 | 2 | # OPL4 FM part 3 | 4 | ## Slot No in 4OP 5 | 6 | | チャンネル | OP1 | OP2 | OP3 | OP4 | 7 | | ---------- | --- | --- | --- | --- | 8 | | 1 | 1 | 4 | 7 | 10 | 9 | | 2 | 2 | 5 | 8 | 11 | 10 | | 3 | 3 | 6 | 9 | 12 | 11 | | 4 | 19 | 22 | 25 | 28 | 12 | | 5 | 20 | 23 | 26 | 29 | 13 | | 6 | 21 | 24 | 27 | 30 | 14 | 15 | 16 | ## WS 17 | 18 | | WS | 0 | 1 | 2 | 3 | 19 | | -- | ---------------------- | ---------------------- | ---------------------- | ---------------------- | 20 | | | ![ws0](img/ws/ws0.svg) | ![ws1](img/ws/ws1.svg) | ![ws2](img/ws/ws2.svg) | ![ws3](img/ws/ws3.svg) | 21 | 22 | 23 | | WS | 4 | 5 | 6 | 7 | 24 | | -- | ---------------------- | ---------------------- | ---------------------- | ---------------------- | 25 | | | ![ws4](img/ws/ws4.svg) | ![ws5](img/ws/ws5.svg) | ![ws6](img/ws/ws6.svg) | ![ws7](img/ws/ws7.svg) | 26 | 27 | ## CNT 2OP 28 | 29 | | CNT | 0 | 1 | 30 | | --- | ------------------------- | ------------------------- | 31 | | | ![cnt0](img/cnt/cnt0.png) | ![cnt1](img/cnt/cnt1.png) | 32 | 33 | ## CNT 4OP 34 | 35 | | CNT | | 36 | | --- | -------------------------------- | 37 | | 00 | ![cnt00](img/cnt/cnt_4op_00.png) | 38 | | 01 | ![cnt01](img/cnt/cnt_4op_01.png) | 39 | | 10 | ![cnt10](img/cnt/cnt_4op_10.png) | 40 | | 11 | ![cnt11](img/cnt/cnt_4op_11.png) | 41 | 42 | ## キャリア 4OP 43 | 44 | CNT = CNT(C0)<<1 + CNT(C3) 45 | 46 | | CNT | キャリア | 47 | | --- | ----------- | 48 | | 00 | OP4 | 49 | | 01 | OP2 OP4 | 50 | | 10 | OP1 OP4 | 51 | | 11 | OP1 OP3 OP4 | 52 | 53 | # OPL4 WaveTable Part 54 | 55 | ## PAN 56 | 57 | | PAN | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 58 | | --- | - | -- | -- | -- | --- | --- | --- | -- | 59 | | L | 0 | -3 | -6 | -9 | -12 | -15 | -18 | -∞ | 60 | | R | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 61 | 62 | 63 | | PAN | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 64 | | --- | -- | -- | --- | --- | --- | -- | -- | -- | 65 | | L | -∞ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 66 | | R | -∞ | -∞ | -18 | -15 | -12 | -9 | -6 | -3 | 67 | 68 | ## TL 69 | 70 | | bit | D7 | D6 | D5 | D4 | D3 | D2 | D1 | - | 71 | | --- | --- | --- | -- | -- | ---- | ----- | ------ | - | 72 | | db | -24 | -12 | -6 | -3 | -1.5 | -0.75 | -0.375 | | 73 | 74 | Total Level(db) = (-24xD7) + (-12xD6) + (-6xD5) + (-3xD4) + (-1.5xD3) + (-0.75xD2) + (-0.375xD1) 75 | 76 | ## DL 77 | 78 | | bit | D7 | D6 | D5 | D4 | - | - | - | - | 79 | | --- | --- | --- | -- | -- | - | - | - | - | 80 | | db | -24 | -12 | -6 | -3 | | | | | 81 | 82 | Decay Level(db) = (-24xD7) + (12xD6) + (-6xD5) + (-3xD4) 83 | 84 | 補足: すべてが1の場合は-93db 85 | 86 | 87 | ## MIX 88 | 89 | | Value | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 90 | | ---------- | - | -- | -- | -- | --- | --- | --- | -- | 91 | | MIX LV(db) | 0 | -3 | -6 | -9 | -12 | -15 | -18 | -∞ | 92 | 93 | -------------------------------------------------------------------------------- /xcode/mmckc/mmckc.xcodeproj/xcshareddata/xcschemes/mmckc.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 68 | 69 | 72 | 73 | 74 | 75 | 76 | 77 | 83 | 85 | 91 | 92 | 93 | 94 | 96 | 97 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /src/pcmtool/wavread.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | typedef struct 5 | { 6 | FILE *fp; 7 | unsigned long pcmsize; 8 | unsigned int freq; 9 | unsigned int bit; 10 | unsigned int ch; 11 | } wavfmt_t; 12 | 13 | unsigned long dword_le(unsigned char *ptr) 14 | { 15 | return ((unsigned long)ptr[0]) | 16 | ((unsigned long)ptr[1]) << 8 | 17 | ((unsigned long)ptr[2]) << 16 | 18 | ((unsigned long)ptr[3]) << 24; 19 | } 20 | 21 | unsigned short word_le(unsigned char *ptr) 22 | { 23 | return ((unsigned long)ptr[0]) | 24 | ((unsigned long)ptr[1]) << 8; 25 | } 26 | 27 | int wavGetFormat(wavfmt_t *lf) 28 | { 29 | FILE *fp; 30 | unsigned char buf[10]; 31 | 32 | fp = lf->fp; 33 | 34 | if (!fp) return -1; 35 | 36 | fread(buf,4,1,fp); 37 | if (memcmp(buf,"RIFF",4) !=0) return -1; // not RIFF 38 | 39 | fread(buf,4,1,fp); // size of RIFF 40 | fread(buf,8,1,fp); 41 | 42 | if (memcmp(buf,"WAVE",4) !=0) return -1; // not WAVE 43 | 44 | fread(buf,4,1,fp); // chunk size 45 | 46 | fread(buf,2,1,fp); 47 | 48 | if (word_le(buf) != 1) return -1; // not PCM 49 | 50 | fread(buf,2,1,fp); // Channel 51 | lf->ch = word_le(buf); 52 | 53 | fread(buf,4,1,fp); // Frequency 54 | lf->freq = dword_le(buf); 55 | 56 | fread(buf,4,1,fp); // byte_per_sec 57 | fread(buf,2,1,fp); // sample size 58 | 59 | fread(buf,2,1,fp); // bit size 60 | lf->bit = word_le(buf); 61 | 62 | // lf->freq=44100; 63 | return 0; 64 | } 65 | 66 | int wavSeekDataChunk(wavfmt_t *lf) { 67 | unsigned char buf[10]; 68 | long lslen; 69 | FILE *fp = lf->fp; 70 | 71 | do { 72 | fread(buf,4,1,fp); 73 | if (memcmp(buf,"data",4) == 0) { 74 | fread(buf,4,1,fp); 75 | lf->pcmsize = dword_le(buf); 76 | return 0; 77 | } else { 78 | fread(buf,4,1,fp); 79 | lslen = dword_le(buf); 80 | fseek(fp,lslen,SEEK_CUR); 81 | } 82 | }while(!feof(fp)); 83 | return -1; 84 | } 85 | 86 | long wavConvBit(unsigned data,int inBit,int outBit) { 87 | if (inBit==outBit) return data; 88 | 89 | if (inBit < outBit) data <<= ( outBit - inBit ); 90 | else data >>= ( inBit - outBit); 91 | return data; 92 | } 93 | 94 | // EOF確認 95 | int wavIsEof(wavfmt_t *lf) { 96 | return (feof(lf->fp) ? 1 : 0); 97 | } 98 | 99 | // サンプルを得る 100 | int wavGetSample(wavfmt_t *lf,int outBit) { 101 | if (feof(lf->fp)) return 0; 102 | 103 | unsigned char buf[8]; 104 | 105 | long mixch = 0; 106 | if (lf->bit == 8) memset(buf,0x80,sizeof(buf)); // 8bit is unsigned 107 | else memset(buf,0,sizeof(buf)); 108 | 109 | if (lf->ch == 2) { 110 | // stereo 111 | if (lf->bit == 16) { 112 | // 16bit 113 | fread(buf,4,1,lf->fp); 114 | mixch = (short)word_le(buf); 115 | mixch += (short)word_le(buf+2); 116 | mixch /= 2; 117 | } else { 118 | // probably 8bit 119 | fread(buf,2,1,lf->fp); 120 | mixch = buf[0] - 0x80; 121 | mixch += ((long)buf[1] - 0x80); 122 | mixch /= 2; 123 | } 124 | } else { 125 | // mono 126 | if (lf->bit == 16) { 127 | // 16bit 128 | fread(buf,2,1,lf->fp); 129 | mixch = (short)word_le(buf); 130 | } else { 131 | // probably 8bit 132 | fread(buf,1,1,lf->fp); 133 | mixch = buf[0] - 0x80; 134 | } 135 | } 136 | 137 | mixch = wavConvBit(mixch,lf->bit,outBit); 138 | return mixch; 139 | } 140 | 141 | // wavを閉じる 142 | void wavClose(wavfmt_t *wfmt) { 143 | fclose(wfmt->fp); 144 | wfmt->fp = NULL; 145 | } 146 | 147 | // wavを開く 148 | int wavOpen(char *file,wavfmt_t *wfmt) { 149 | memset(wfmt,0,sizeof(wavfmt_t)); 150 | 151 | wfmt->fp = fopen(file,"rb"); 152 | if (!wfmt->fp) { 153 | printf("Error : File open error(%s)\n",file); 154 | return -1; 155 | } 156 | 157 | wfmt->freq = 11025; 158 | if (wavGetFormat(wfmt)) { 159 | printf("Error : Unsupported format file\n"); 160 | return -1; 161 | } 162 | 163 | printf("freq = %d,bit = %d,ch = %d\n", wfmt->freq,wfmt->bit,wfmt->ch); 164 | 165 | if (wavSeekDataChunk(wfmt)) { 166 | printf("Error : data chank not found\n"); 167 | wavClose(wfmt); 168 | return -1; 169 | } 170 | 171 | return 0; 172 | } 173 | 174 | #ifndef USE_AS_LIB 175 | 176 | int main(int argc,char *argv[]) 177 | { 178 | int i; 179 | wavfmt_t wav; 180 | 181 | printf("wavreader test\n"); 182 | if (argc < 2) 183 | { 184 | printf("Usage wavtest \n"); 185 | return 1; 186 | } 187 | 188 | if (wavOpen(argv[1],&wav) < 0) 189 | return 1; 190 | 191 | for(i=0; i < 20; i++) 192 | { 193 | printf(" %d \n",wavGetSample(&wav,16)); 194 | } 195 | wavClose(&wav); 196 | 197 | return 0; 198 | } 199 | 200 | #endif 201 | -------------------------------------------------------------------------------- /doc/img/ws/ws7.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 21 | 42 | 49 | 56 | 63 | 64 | 66 | 67 | 69 | image/svg+xml 70 | 72 | 73 | 74 | 75 | 76 | 80 | 86 | 92 | 98 | 104 | 110 | 115 | 121 | 122 | 123 | -------------------------------------------------------------------------------- /doc/img/ws/ws1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 21 | 42 | 49 | 56 | 63 | 64 | 66 | 67 | 69 | image/svg+xml 70 | 72 | 73 | 74 | 75 | 76 | 80 | 86 | 92 | 98 | 104 | 110 | 115 | 126 | 127 | 128 | -------------------------------------------------------------------------------- /doc/img/ws/ws6.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 21 | 42 | 49 | 56 | 63 | 64 | 66 | 67 | 69 | image/svg+xml 70 | 72 | 73 | 74 | 75 | 76 | 80 | 86 | 92 | 98 | 104 | 110 | 115 | 122 | 129 | 130 | 131 | -------------------------------------------------------------------------------- /src/mmckc/strings.c: -------------------------------------------------------------------------------- 1 | /************************************************************/ 2 | /* */ 3 | /************************************************************/ 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | 11 | /*-------------------------------------------------------------- 12 | スペース/タブのスキップ 13 | Input: 14 | char *ptr :データ格納ポインタ 15 | Output: 16 | char *ptr ;スキップ後のポインタ 17 | --------------------------------------------------------------*/ 18 | char *skipSpaceOld( char *ptr ) 19 | { 20 | while( *ptr != '\0' ) { 21 | if( *ptr != ' ' && *ptr != '\t' ) { 22 | break; 23 | } 24 | ptr++; 25 | } 26 | return ptr; 27 | } 28 | 29 | 30 | /*-------------------------------------------------------------- 31 | 文字列のスキップ 32 | --------------------------------------------------------------*/ 33 | 34 | char *skipQuote( char *ptr ) 35 | { 36 | if (*ptr && 37 | *ptr == '\"') 38 | { 39 | ptr++; // skip start charactor 40 | while( *ptr ) 41 | { 42 | if ( *ptr == '\"') // end of the quote 43 | { 44 | ptr++; break; 45 | } 46 | 47 | if ( *ptr == '\\' && *( ptr+1 ) ) // skip Escape 48 | ptr++; 49 | ptr++; 50 | } 51 | } 52 | return ptr; 53 | } 54 | 55 | /*-------------------------------------------------------------- 56 | コメント文字のチェック 57 | --------------------------------------------------------------*/ 58 | int isComment( char *ptr ) 59 | { 60 | if (*ptr && 61 | (*ptr == ';' || 62 | // (*ptr == '/' && *(ptr+1) == '/') 63 | *ptr == '/' )) 64 | return 1; 65 | 66 | return 0; 67 | } 68 | 69 | /*-------------------------------------------------------------- 70 | コメントのスキップ 71 | --------------------------------------------------------------*/ 72 | char *skipComment( char *ptr ) 73 | { 74 | if (isComment(ptr)) 75 | { 76 | while(1) 77 | { 78 | // '\0' = EOL or EOF , '\n' = EOL 79 | if (*ptr == '\0' || *ptr == '\n') 80 | break; 81 | ptr++; 82 | } 83 | } 84 | return ptr; 85 | } 86 | 87 | 88 | /*-------------------------------------------------------------- 89 | スペース/タブのスキップ(行コメントも飛ばす) 90 | --------------------------------------------------------------*/ 91 | char *skipSpace( char *ptr ) 92 | { 93 | while (1) { 94 | if (*ptr == '\0') break; //EOL or EOF 95 | if (*ptr == ' ' || *ptr == '\t') { 96 | //Skip Space 97 | ptr++; 98 | continue; 99 | } else if ( isComment(ptr) ) { 100 | //Skip Comment(return EOL) 101 | ptr = skipComment( ptr ); 102 | } else { 103 | //Normal Chars 104 | break; 105 | } 106 | } 107 | return ptr; 108 | } 109 | 110 | 111 | 112 | 113 | 114 | 115 | /*---------------------------------------------------------- 116 | 文字が漢字かどうかのチェック 117 | Input: 118 | char c : 文字 119 | Return: 120 | 0:漢字以外 1: 漢字コード 121 | ----------------------------------------------------------*/ 122 | int checkKanji( unsigned char c ) 123 | { 124 | if( 0x81 <= c && c <= 0x9f ) return 1; 125 | if( 0xe0 <= c && c <= 0xef ) return 1; 126 | return 0; 127 | } 128 | 129 | 130 | 131 | /*---------------------------------------------------------- 132 | 文字列を大文字にする(漢字対応版) 133 | Input: 134 | char *ptr : 文字列へのポインタ 135 | Output: 136 | none 137 | ----------------------------------------------------------*/ 138 | void strupper( char *ptr ) 139 | { 140 | while( *ptr != '\0' ) { 141 | if( checkKanji( (unsigned char)*ptr ) == 0 ) { 142 | *ptr = toupper( (int)*ptr ); 143 | ptr++; 144 | } else { 145 | /* 漢字の時の処理 */ 146 | ptr += 2; 147 | } 148 | } 149 | } 150 | 151 | 152 | 153 | 154 | /*-------------------------------------------------------------- 155 | 文字列を数値に変換 156 | Input: 157 | 158 | Output: 159 | 160 | --------------------------------------------------------------*/ 161 | int Asc2Int( char *ptr, int *cnt ) 162 | { 163 | int num; 164 | char c; 165 | int minus_flag = 0; 166 | 167 | num = 0; 168 | *cnt = 0; 169 | 170 | if( *ptr == '-' ) { 171 | minus_flag = 1; 172 | ptr++; 173 | (*cnt)++; 174 | } 175 | switch( *ptr ) { 176 | /* 16進数 */ 177 | case 'x': 178 | case '$': 179 | ptr++; 180 | (*cnt)++; 181 | while( 1 ) { 182 | c = toupper( *ptr ); 183 | if( '0' <= c && c <= '9' ) { 184 | num = num * 16 + (c-'0'); 185 | } else if( 'A' <= c && c <= 'F' ) { 186 | num = num * 16 + (c-'A'+10); 187 | } else { 188 | break; 189 | } 190 | (*cnt)++; 191 | ptr++; 192 | } 193 | break; 194 | /* 2進数 */ 195 | case '%': 196 | ptr++; 197 | (*cnt)++; 198 | while( 1 ) { 199 | if( '0' <= *ptr && *ptr <= '1' ) { 200 | num = num * 2 + (*ptr-'0'); 201 | } else { 202 | break; 203 | } 204 | (*cnt)++; 205 | ptr++; 206 | } 207 | /* 10進数 */ 208 | default: 209 | while( 1 ) { 210 | if( '0' <= *ptr && *ptr <= '9' ) { 211 | num = num * 10 + (*ptr-'0'); 212 | } else { 213 | break; 214 | } 215 | (*cnt)++; 216 | ptr++; 217 | } 218 | } 219 | if( minus_flag != 0 ) { 220 | num = -num; 221 | } 222 | return num; 223 | } 224 | -------------------------------------------------------------------------------- /src/pcmload/pcmload.asm: -------------------------------------------------------------------------------- 1 | ;******************************************** 2 | ; PCMLOAD for OPL4 by BKC 3 | ; 2007/05/09 first 4 | ; 5 | ; 2007/05/10 changed program name to display 6 | ; 7 | ;******************************************** 8 | BDOS: equ $0005 9 | FCB: equ $005C 10 | 11 | MOON_BASE: equ $00C4 12 | MOON_REG1: equ MOON_BASE 13 | MOON_DAT1: equ MOON_BASE+1 14 | MOON_REG2: equ MOON_BASE+2 15 | MOON_DAT2: equ MOON_BASE+3 16 | MOON_STAT: equ MOON_BASE 17 | 18 | MOON_WREG: equ $007E 19 | MOON_WDAT: equ MOON_WREG+1 20 | 21 | 22 | ;******************************************** 23 | ; Entry point 24 | 25 | org $100 26 | 27 | ; A trap for x86 28 | jp x86_trap 29 | x86_trap: 30 | 31 | ; Output an welcome message 32 | ld de,str_prgname 33 | ld c,$09 34 | call BDOS 35 | 36 | call moon_init 37 | ret nz 38 | 39 | ; "Loading..." 40 | ld de,str_loadmsg 41 | ld c,$09 42 | call BDOS 43 | 44 | ; Load PCM file 45 | call load_pcmfile 46 | or a 47 | jr nz,file_error 48 | 49 | ; Terminate 50 | ret 51 | 52 | ;******************************************** 53 | ; Output "file error" and exit 54 | file_error: 55 | ld de,str_file_error 56 | ld c,$09 57 | call BDOS 58 | ld c,$00 59 | jp BDOS 60 | 61 | 62 | ;******************************************** 63 | ; load_pcmfile 64 | ; Load PCM file from disk 65 | ; in : FCB ( a parameter from DOS ) 66 | ; dest : DE 67 | 68 | load_pcmfile: 69 | ld de,FCB 70 | ld c,$0f 71 | call BDOS 72 | or a 73 | ret nz 74 | 75 | ld de,dos_dta 76 | ld c,$1a ; set DTA 77 | call BDOS 78 | 79 | ld de,$0211 ; memory write mode 80 | call moon_wave_out 81 | 82 | 83 | ld de,$0320 84 | call moon_wave_out 85 | 86 | ld de,$0400 87 | call moon_wave_out 88 | 89 | ld de,$0500 90 | call moon_wave_out 91 | 92 | load_pcmfile_lp01: 93 | 94 | push hl 95 | ld de,FCB 96 | ld c,$14 ; sequencial read 97 | call BDOS 98 | pop hl 99 | 100 | push af 101 | ld hl,dos_dta 102 | ld bc,$0080 103 | write_pcm_lp: 104 | ld a,(hl) 105 | ld e,a 106 | ld d,$06 107 | inc hl 108 | 109 | call moon_wave_out 110 | dec bc 111 | ld a,b 112 | or c 113 | jr nz,write_pcm_lp 114 | pop af 115 | 116 | or a 117 | jr nz,load_pcmfile_eof 118 | jr load_pcmfile_lp01 119 | 120 | load_pcmfile_eof: 121 | 122 | ld de,$0210 ; normal mode 123 | call moon_wave_out 124 | 125 | 126 | ld de,FCB 127 | ld c,$10 ; close 128 | jp BDOS 129 | 130 | 131 | ;******************************************** 132 | ; Strings 133 | str_prgname: 134 | db "PCMLOAD(OPL4) VER 070510",$0d,$0a,'$' 135 | 136 | str_file_error: 137 | db "FILE ERROR",$0d,$0a,'$' 138 | 139 | str_moon_fnd: 140 | db "MOONSOUND DETECTED",$0d,$0a,'$' 141 | 142 | str_moon_not: 143 | db "MOONSOUND IS NOT FOUND",$0d,$0a,'$' 144 | 145 | 146 | str_loadmsg: 147 | db "LOADING...",$0d,$0a,'$' 148 | 149 | 150 | ;////////////////////////////////////// 151 | ; MoonSound routines 152 | ;////////////////////////////////////// 153 | 154 | ;******************************************** 155 | ; Initializes MoonSound 156 | ; out : NZ if not found 157 | ; 158 | moon_init: 159 | in a,(MOON_BASE) 160 | cp $ff 161 | jr nz,moon_init_01 162 | 163 | 164 | ; moonsound is not found 165 | 166 | ld de,str_moon_not 167 | ld c,$09 168 | call BDOS 169 | ld a,$ff 170 | 171 | and a 172 | ret 173 | 174 | moon_init_01: 175 | 176 | ; moonsound is found 177 | 178 | ld de,str_moon_fnd 179 | ld c,$09 180 | call BDOS 181 | 182 | ld de,$0120 183 | call moon_fm1_out 184 | 185 | ; set D0 and D1 in FM reg5 186 | ld de,$0503 187 | call moon_fm1_out 188 | 189 | ld de,$0400 190 | call moon_fm2_out 191 | 192 | ld de,$bd00 193 | call moon_fm1_out 194 | 195 | ld de,$0210 196 | call moon_wave_out 197 | 198 | xor a 199 | ret 200 | 201 | 202 | ;******************************************** 203 | ; check moonsound 204 | ; out : Z = not found 205 | 206 | moon_check: 207 | in a,(MOON_BASE) 208 | cp $ff 209 | ret 210 | 211 | dos_dta: 212 | ds $80 213 | 214 | 215 | ;******************************************** 216 | ; wait while BUSY 217 | ; dest : AF 218 | 219 | moon_wait: 220 | in a,(MOON_STAT) 221 | and $01 222 | jr nz,moon_wait 223 | ret 224 | 225 | ;******************************************** 226 | ; write moonsound fm1 register 227 | ; in : D = an address of register , E = data 228 | ; dest : AF 229 | 230 | moon_fm1_out: 231 | ld a,d 232 | out (MOON_REG1),a 233 | call moon_wait 234 | ld a,e 235 | out (MOON_DAT1),a 236 | call moon_wait 237 | ret 238 | 239 | ;******************************************** 240 | ; write moonsound fm2 register 241 | ; in : D = an address of register , E = data 242 | ; dest : AF 243 | 244 | moon_fm2_out: 245 | ld a,d 246 | out (MOON_REG2),a 247 | call moon_wait 248 | ld a,e 249 | out (MOON_DAT2),a 250 | call moon_wait 251 | ret 252 | 253 | 254 | ;******************************************** 255 | ; write moonsound wave register 256 | ; in : D = an address of register , E = data 257 | ; dest : AF 258 | 259 | moon_wave_out: 260 | ld a,d 261 | out (MOON_WREG),a 262 | call moon_wait 263 | ld a,e 264 | out (MOON_WDAT),a 265 | call moon_wait 266 | ret 267 | 268 | -------------------------------------------------------------------------------- /doc/img/ws/ws3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 21 | 42 | 49 | 56 | 63 | 64 | 66 | 67 | 69 | image/svg+xml 70 | 72 | 73 | 74 | 75 | 76 | 80 | 86 | 92 | 98 | 104 | 110 | 115 | 126 | 137 | 138 | 139 | -------------------------------------------------------------------------------- /doc/img/ws/ws2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 21 | 42 | 49 | 56 | 63 | 64 | 66 | 67 | 69 | image/svg+xml 70 | 72 | 73 | 74 | 75 | 76 | 80 | 86 | 92 | 98 | 104 | 110 | 115 | 126 | 137 | 138 | 139 | -------------------------------------------------------------------------------- /doc/img/ws/ws0.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 21 | 42 | 49 | 56 | 63 | 64 | 66 | 67 | 69 | image/svg+xml 70 | 72 | 73 | 74 | 75 | 76 | 80 | 86 | 92 | 98 | 104 | 110 | 115 | 126 | 138 | 139 | 140 | -------------------------------------------------------------------------------- /doc/img/ws/ws5.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 21 | 42 | 49 | 56 | 63 | 64 | 66 | 67 | 69 | image/svg+xml 70 | 72 | 73 | 74 | 75 | 76 | 80 | 86 | 92 | 98 | 104 | 110 | 115 | 126 | 137 | 138 | 139 | -------------------------------------------------------------------------------- /doc/img/ws/ws4.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 21 | 42 | 49 | 56 | 63 | 64 | 66 | 67 | 69 | image/svg+xml 70 | 72 | 73 | 74 | 75 | 76 | 80 | 86 | 92 | 98 | 104 | 110 | 115 | 126 | 138 | 139 | 140 | -------------------------------------------------------------------------------- /src/pcmpack/pcmpack.c: -------------------------------------------------------------------------------- 1 | 2 | #include 3 | #include 4 | 5 | typedef unsigned char byte; 6 | 7 | #define PATH_MAX 1024 8 | 9 | #define PRG_NAME "PCMPACK" 10 | #define PRG_VER "Ver 0.1" 11 | #define PRG_AUTHOR "BouKiCHi" 12 | 13 | #ifdef _WIN32 14 | #define PATH_DELIM '\\' 15 | #else 16 | #define PATH_DELIM '/' 17 | #endif 18 | 19 | // MDRファイル定義 20 | typedef struct { 21 | FILE *fp; 22 | long size; 23 | byte header[0x80]; 24 | 25 | char pcmname[PATH_MAX]; // pos:0x40 pcmname 26 | 27 | int pcm_packed; // pos: 0x2a 1:pcm is packed 28 | 29 | int pcm_startadrs; // pos:0x30 start address of PCM RAM(* 0x10000) 30 | int pcm_startbank; // pos:0x31 start bank (* 8192) 31 | int pcm_banks; // pos:0x32 number of PCM banks (* 8192) 32 | int pcm_lastsize; // pos:0x32 size of last bank (* 0x100) 33 | 34 | // actual size = (pcm_banks * 0x2000) + (pcm_lastsize * 0x100) 35 | } _mdr; 36 | 37 | 38 | // ファイルサイズを得る 39 | long getFileSize(const char *file) { 40 | 41 | FILE *fp = fopen(file,"rb"); 42 | if (!fp) return -1; 43 | fseek(fp, 0, SEEK_END); 44 | long size = ftell(fp); 45 | fclose(fp); 46 | return size; 47 | } 48 | 49 | // MDRファイルのあるディレクトリを取得 50 | void setDirNameFromPath(char *dest, const char *path) { 51 | strcpy(dest, path); 52 | char *p = strrchr(dest, PATH_DELIM); 53 | // ディレクトリ名が存在しない 54 | if (!p) { dest[0] = 0x00; return; } 55 | 56 | *(p + 1) = 0; 57 | } 58 | 59 | // ファイル名作成 60 | void makeFileName(char *dest, const char *path, const char *ext) { 61 | strcpy(dest, path); 62 | char *p = strrchr(dest, PATH_DELIM); 63 | 64 | if (p) { p = strchr(p + 1, '.'); } 65 | else { p = strchr(dest, '.'); } 66 | 67 | if (p) { strcpy(p, ext); } 68 | else { strcat(dest, ext); } 69 | } 70 | 71 | // ファイル位置を設定 72 | long seekFile(FILE *fp, long pos) { 73 | fseek(fp, pos, SEEK_SET); 74 | } 75 | 76 | // バイト値を得る 77 | int getByte(byte *mem, int pos) { 78 | return mem[pos]; 79 | } 80 | 81 | // ワード値を得る(LE) 82 | int getWord(byte *mem, int pos) { 83 | return (int)mem[pos] | (int)mem[pos+1] << 8; 84 | } 85 | 86 | // バイト値を設定する 87 | void setByte(byte *mem, int pos, int value) { 88 | mem[pos] = (byte)value; 89 | } 90 | 91 | // ワード値を設定する(LE) 92 | void setWord(byte *mem, int pos, int value) { 93 | mem[pos] = (byte)(value & 0xff); 94 | mem[pos + 1] = (byte)((value>>8) & 0xff); 95 | } 96 | 97 | // MDRファイルを開く 98 | int openMDRFile(const char *file, const char *mode, _mdr *m) { 99 | m->fp = fopen(file, mode); 100 | if (!m->fp) { 101 | printf("File open error!:%s\n", file); 102 | return -1; 103 | } 104 | } 105 | 106 | // MDRファイルを閉じる 107 | void closeMDRFile(_mdr *m) { 108 | if (m->fp) fclose(m->fp); 109 | m->fp = NULL; 110 | } 111 | 112 | // MDRファイル読み出し 113 | int readMDRHeader(const char *file, _mdr *m) { 114 | if (openMDRFile(file, "rb", m) < 0) return -1; 115 | 116 | fseek(m->fp, 0, SEEK_END); 117 | m->size = ftell(m->fp); 118 | rewind(m->fp); 119 | 120 | seekFile(m->fp, 0x00); 121 | fread(m->header, 0x80, 1, m->fp); 122 | 123 | // PCM文字列位置 124 | m->pcmname[0] = 0; 125 | int pcmpos = getWord(m->header, 0x2c); 126 | 127 | // PCM位置 128 | if (pcmpos == 0x8040) { 129 | strncpy(m->pcmname, &m->header[0x40], 0x40); 130 | m->pcmname[0x40] = 0; 131 | } 132 | 133 | // PCM設定値 134 | m->pcm_packed = getByte(m->header, 0x2a); 135 | 136 | m->pcm_startadrs = getByte(m->header, 0x30); 137 | m->pcm_startbank = getByte(m->header, 0x31); 138 | m->pcm_banks = getByte(m->header, 0x32); 139 | m->pcm_lastsize = getByte(m->header, 0x33); 140 | 141 | closeMDRFile(m); 142 | } 143 | 144 | // MDRヘッダ再構築 145 | void writeMDRHeader(_mdr *m) { 146 | // PCM設定値 147 | setByte(m->header, 0x2a, m->pcm_packed); 148 | 149 | setByte(m->header, 0x30, m->pcm_startadrs); 150 | setByte(m->header, 0x31, m->pcm_startbank); 151 | setByte(m->header, 0x32, m->pcm_banks); 152 | setByte(m->header, 0x33, m->pcm_lastsize); 153 | 154 | seekFile(m->fp, 0); 155 | fwrite(m->header, 0x80, 1, m->fp); 156 | } 157 | 158 | #define BANK_SIZE 0x2000 159 | 160 | // MDRファイル読み出し 161 | int packPCMintoMDR(const char *file, const char *pcm, _mdr *m) { 162 | byte bank[BANK_SIZE]; 163 | printf("packing...\n"); 164 | 165 | if (openMDRFile(file, "rb+", m) < 0) return -1; 166 | 167 | long start_pos = m->size; 168 | 169 | // パックされている場合はPCM先頭バングから計算する 170 | if (m->pcm_packed) { 171 | start_pos = m->pcm_startbank * BANK_SIZE; 172 | } 173 | 174 | FILE *pcmfp = fopen(pcm, "rb"); 175 | 176 | if (!pcmfp) { 177 | printf("File open error!:%s\n", pcm); 178 | goto err; 179 | } 180 | 181 | // PCMデータ出力位置 182 | printf("PCM Start:%08Xh\n", start_pos); 183 | seekFile(m->fp, start_pos); 184 | 185 | int block_len = 0; 186 | int pcm_blocks = 0; 187 | do { 188 | block_len = fread(bank, 1, BANK_SIZE, pcmfp); 189 | fwrite(bank, 1, block_len, m->fp); 190 | pcm_blocks++; 191 | }while(!feof(pcmfp) && block_len == BANK_SIZE); 192 | 193 | m->pcm_packed = 1; 194 | m->pcm_startadrs = 0x20; // SRAM開始アドレス 195 | m->pcm_startbank = start_pos / BANK_SIZE; // 開始バンク 196 | m->pcm_banks = pcm_blocks - 1; // ブロック数 197 | m->pcm_lastsize = (block_len + 0xff) / 0x100; // 最後のブロックサイズ 198 | 199 | printf("PCM StartAdrs:%02xh\n", m->pcm_startadrs); 200 | printf("PCM StartBank:%02xh\n", m->pcm_startbank); 201 | printf("PCM Banks:%02xh\n", m->pcm_banks); 202 | printf("PCM LastSize:%02xh\n", m->pcm_lastsize); 203 | 204 | writeMDRHeader(m); 205 | closeMDRFile(m); 206 | 207 | printf("ok!\n"); 208 | return 0; 209 | 210 | err: 211 | closeMDRFile(m); 212 | return -1; 213 | } 214 | 215 | int main(int argc, char *argv[]) { 216 | char pcmbody[PATH_MAX]; 217 | char *pcmfile = NULL; 218 | char *mdrfile = NULL; 219 | 220 | // タイトル 221 | printf("%s %s by %s\n", PRG_NAME, PRG_VER, PRG_AUTHOR); 222 | 223 | if (argc < 2) { 224 | printf("Usage %s <.mdr file> [PCM file]\n"); 225 | return 1; 226 | } 227 | 228 | mdrfile = argv[1]; 229 | 230 | printf("File:%s\n", mdrfile); 231 | 232 | if (argc > 2) { pcmfile = argv[2]; } 233 | 234 | _mdr m; 235 | readMDRHeader(mdrfile, &m); 236 | 237 | printf("Size:%d\n", m.size); 238 | 239 | if (!pcmfile) { 240 | pcmfile = pcmbody; 241 | pcmbody[0] = 0; 242 | 243 | if (m.pcmname[0]) { 244 | setDirNameFromPath(pcmfile, mdrfile); 245 | strcat(pcmfile, m.pcmname); 246 | } 247 | } 248 | 249 | if (!pcmfile[0]) { 250 | printf("PCM filename is not defined!\n"); 251 | return 1; 252 | } 253 | printf("PCM File:%s\n", pcmfile); 254 | 255 | // PCMを詰め込む 256 | packPCMintoMDR(mdrfile, pcmfile, &m); 257 | return 0; 258 | } 259 | -------------------------------------------------------------------------------- /src/mmckc/mckc.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | #include "mckc.h" 8 | 9 | extern void splitPath( const char *ptr, char *path, char *name, char *ext ); 10 | extern void makePath( char *ptr, const char *path, const char *name, const char *ext ); 11 | extern char *skipSpace( char *ptr ); 12 | extern char *patchstr; 13 | extern char *hogereleasestr; 14 | 15 | extern char *moon_verstr; 16 | 17 | char *mml_names[MML_MAX]; 18 | char *mml_short_names[MML_MAX]; 19 | int debug_flag = 0; 20 | char ef_name[256] = "effect.h"; 21 | char inc_name[256] = "define.inc"; 22 | char out_name[256]; 23 | int warning_flag = 1; 24 | int include_flag = 0; 25 | int mml_num = 0; 26 | extern int data_make( void ); 27 | extern int message_flag; // 表示メッセージの出力設定( 0:Jp 1:En ) 28 | 29 | /*-------------------------------------------------------------- 30 | ヘルプ表示 31 | Input: 32 | 33 | Output: 34 | 35 | --------------------------------------------------------------*/ 36 | void dispHelpMessage( void ) 37 | { 38 | if( message_flag == 0 ) { 39 | 40 | puts( 41 | "使用方法:mmckc [switch] InputFile.mml [OutputFile.h]\n" 42 | "もしくは:mmckc [switch] -u InputFile1.mml InputFile2.mml ... \n" 43 | "\t[switch]\n" 44 | "\t-h -? : ヘルプを表示\n" 45 | "\t-i : 音色/エンベロープファイルに曲データを追加する\n" 46 | "\t-m : エラー/ワーニング表示の選択(0:Jpn 1:Eng)\n" 47 | "\t-o : 音色/エンベロープファイルのファイル名をにする\n" 48 | "\t-w : Warningメッセージを表示しません\n" 49 | "\t-u : 複数曲登録NSF作成\n" 50 | ); 51 | 52 | } else { 53 | puts( 54 | "Usage:mmckc [switch] InputFile.mml [OutputFile.h]\n" 55 | " or :mmckc [switch] -u InputFile1.mml InputFile2.mml ... \n" 56 | "\t[switch]\n" 57 | "\t-h -? : Display this help message\n" 58 | "\t-i : Including song data in tone/envelope file\n" 59 | "\t-m : Select message language(0:Jpn 1:Eng)\n" 60 | "\t-o : Output tone/envelope file name is \n" 61 | "\t-w : Don't display warning message\n" 62 | "\t-u : Multiple song NSF creation\n" 63 | ); 64 | } 65 | exit( 1 ); 66 | } 67 | 68 | 69 | 70 | /*-------------------------------------------------------------- 71 | メインルーチン 72 | Input: 73 | int argc : コマンドライン引数の個数 74 | char *argv[] : コマンドライン引数のポインタ 75 | Output: 76 | 0:正常終了 0:以外以上終了 77 | --------------------------------------------------------------*/ 78 | int main( int argc , char *argv[] ) 79 | { 80 | int i,in,out; 81 | char path[256],name[256],ext[256]; 82 | int multiple_song_nsf = 0; 83 | 84 | in = out = 0; 85 | 86 | // タイトル表示 87 | printf("MML to MCK Data Converter Ver %d.%02d by Manbow-J\n", 88 | (VersionNo / 100), (VersionNo % 100) ); 89 | 90 | // サブタイトル表示 91 | printf("%s", moon_verstr); 92 | //printf("patches by [OK] and 2ch mck thread people\n"); 93 | printf("DATE: %s\n", __DATE__); 94 | printf("%s", patchstr); 95 | printf("%s", hogereleasestr); 96 | // コマンドライン解析 97 | if( argc == 1 ) { 98 | dispHelpMessage(); 99 | return -1; 100 | } 101 | 102 | for ( i = 1; i < argc; i++ ) { 103 | // スイッチ? 104 | if ( argv[i][0] == '-' ) { 105 | switch( toupper( argv[i][1] ) ) { 106 | case 'H': 107 | case '?': 108 | dispHelpMessage(); 109 | return 1; 110 | case 'X': 111 | debug_flag = 1; 112 | break; 113 | case 'I': 114 | include_flag = 1; 115 | break; 116 | case 'M': 117 | message_flag = atoi( &(argv[i][2]) ); 118 | if( message_flag > 1 ) { 119 | dispHelpMessage(); 120 | return 1; 121 | } 122 | break; 123 | case 'N': 124 | //obsolete 125 | break; 126 | case 'O': 127 | strcpy( ef_name, skipSpace( &(argv[i][2]) ) ); 128 | break; 129 | case 'W': 130 | warning_flag = 0; 131 | break; 132 | case 'U': 133 | multiple_song_nsf = 1; 134 | break; 135 | default: 136 | if( message_flag == 0 ) { 137 | puts( "スイッチの指定が違います\n" ); 138 | } else { 139 | puts( "Invalid switch!\n" ); 140 | } 141 | dispHelpMessage(); 142 | return -1; 143 | } 144 | // 入力/出力ファイルの格納 145 | } else { 146 | if ( in < MML_MAX ) { 147 | mml_names[in] = argv[i]; 148 | mml_short_names[in] = malloc(MML_MAX_NAME); 149 | 150 | char *p = strrchr(argv[i],'/'); 151 | if (!p) 152 | p = strrchr(argv[i], '\\'); 153 | 154 | if (p) 155 | p++; 156 | else 157 | p = argv[i]; 158 | 159 | strcpy(mml_short_names[in], p); 160 | 161 | in++; 162 | } else { 163 | if( message_flag == 0 ) { 164 | puts( "パラメータが多すぎます\n" ); 165 | } else { 166 | puts( "Too many parameters!\n" ); 167 | } 168 | dispHelpMessage(); 169 | return -1; 170 | } 171 | } 172 | } 173 | 174 | if (in == 0) { 175 | dispHelpMessage(); 176 | return -1; 177 | } 178 | if (multiple_song_nsf) { 179 | splitPath( mml_names[0], path, name, ext ); 180 | makePath( out_name, path, name, ".h" ); 181 | } else { 182 | if (in == 1) { 183 | splitPath( mml_names[0], path, name, ext ); 184 | makePath( out_name, path, name, ".h" ); 185 | } else if (in == 2) { 186 | strcpy(out_name, mml_names[1]); 187 | in--; 188 | } else { 189 | if( message_flag == 0 ) { 190 | puts( "パラメータが多すぎます\n" ); 191 | } else { 192 | puts( "Too many parameters!\n" ); 193 | } 194 | dispHelpMessage(); 195 | return -1; 196 | } 197 | } 198 | 199 | mml_num = in; 200 | for (i = 0; i < in - 1; i++) { 201 | printf("%s + ", mml_names[i]); 202 | } 203 | printf( "%s -> %s\n" ,mml_names[i], out_name ); 204 | // コンバート 205 | int ret = data_make(); 206 | // 終了 207 | 208 | for (i = 0; i < in; i++) 209 | free(mml_short_names[i]); 210 | 211 | if (ret == 0) { 212 | if( message_flag == 0 ) { 213 | puts( "\n終了しました\n" ); 214 | } else { 215 | puts( "\nCompleated!\n" ); 216 | } 217 | return EXIT_SUCCESS; 218 | } else { 219 | if( message_flag == 0 ) { 220 | puts( "\nコンパイルに失敗しました\n" ); 221 | } else { 222 | puts( "\nCompilation failed!\n" ); 223 | } 224 | return EXIT_FAILURE; 225 | } 226 | } 227 | -------------------------------------------------------------------------------- /src/mmckc/file.c: -------------------------------------------------------------------------------- 1 | /************************************************************/ 2 | /* */ 3 | /************************************************************/ 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | extern int message_flag; 11 | 12 | /* ------------------------------------------------------------- 13 | * 文字がパスデリミタかどうか判断 14 | * 漢字ファイル名未対応? 15 | * -------------------------------------------------------------*/ 16 | int is_pathdelimiter(char c) 17 | { 18 | #if defined(UNIX) || defined(LINUX) 19 | return (c == '/'); 20 | #else 21 | return (c == '\\' || c == '/'); 22 | #endif 23 | } 24 | 25 | 26 | 27 | /*-------------------------------------------------------------- 28 | 文字列ptrをパス/ファイルネーム/拡張子に分割(path,name,extにコピー) 29 | Input: 30 | 31 | Output: 32 | none 33 | --------------------------------------------------------------*/ 34 | void splitPath( const char *ptr, char *path, char *name, char *ext ) 35 | { 36 | const char *temp, *eopath, *eoname; 37 | 38 | if( *ptr == (char)'\0' ) { /* エラーチェック */ 39 | *path = '\0'; 40 | *name = '\0'; 41 | *ext = '\0'; 42 | return; 43 | } 44 | 45 | temp = ptr; 46 | while( *temp != '\0' ) ++temp; /* 一度最後まで進む */ 47 | eoname = temp; 48 | while( --temp != ptr ) { 49 | if( is_pathdelimiter(*temp) ) { 50 | temp++; 51 | break; 52 | } 53 | } 54 | eopath = temp; 55 | while( *temp != '\0' ) { 56 | if ( *temp == '.' ) { 57 | eoname = temp; 58 | } 59 | ++temp; 60 | } 61 | strncpy( path, ptr, eopath-ptr ); 62 | *(path+(eopath-ptr)) = '\0'; 63 | strncpy( name, eopath, eoname-eopath ); 64 | *(name+(eoname-eopath)) = '\0'; 65 | strcpy( ext, eoname ); 66 | } 67 | 68 | 69 | 70 | /*-------------------------------------------------------------- 71 | path + name + ext を ptr にコピー 72 | Input: 73 | 74 | Output: 75 | none 76 | --------------------------------------------------------------*/ 77 | void makePath( char *ptr, const char *path, const char *name, const char *ext ) 78 | { 79 | strcpy( ptr, path ); 80 | strcat( ptr, name ); 81 | strcat( ptr, ext ); 82 | } 83 | 84 | 85 | 86 | /*-------------------------------------------------------------- 87 | ファイルサイズを求める 88 | Input: 89 | char fname :FILE NAME 90 | Return: 91 | ファイルサイズ(0の場合はエラー) 92 | --------------------------------------------------------------*/ 93 | int getFileSize( char *ptr ) 94 | { 95 | FILE *fp; 96 | int size; 97 | 98 | fp = fopen( ptr, "rb" ); 99 | if( fp == NULL ) return 0; 100 | 101 | fseek( fp, 0L, SEEK_END ); 102 | size = (int)ftell( fp ); 103 | fseek( fp, 0L, SEEK_SET ); 104 | fclose( fp ); 105 | 106 | return size; 107 | } 108 | 109 | 110 | 111 | /*-------------------------------------------------------------- 112 | 改行コードを変更しながらファイルを読み込む 113 | Input: 114 | char fname :FILE NAME 115 | Return: 116 | ポインタ(NULLの場合はエラー) 117 | --------------------------------------------------------------*/ 118 | char *readTextFile( char *filename ) 119 | { 120 | 121 | FILE *fp; 122 | int size, sizeb, line_idx; 123 | char *top, *p; 124 | int c, c2; 125 | /* ファイルオープン */ 126 | fp = fopen(filename, "rb"); 127 | if (!fp) { 128 | if (message_flag == 0) { 129 | printf( "%s : ファイルが開けません\n", filename ); 130 | } else { 131 | printf( "%s : Can't open file\n", filename ); 132 | } 133 | return NULL; 134 | } 135 | /* サイズを取得 */ 136 | fseek(fp, 0L, SEEK_END); 137 | sizeb = (int)ftell(fp); 138 | fseek(fp, 0L, SEEK_SET); 139 | /* 140 | if (sizeb == 0) { 141 | fclose(fp); 142 | if (message_flag == 0) { 143 | printf( "%s : ファイルサイズが0です\n", filename ); 144 | } else { 145 | printf( "%s : File is empty\n", filename ); 146 | } 147 | return NULL; 148 | } 149 | */ 150 | /* バッファを作成 */ 151 | top = malloc((sizeb + 1) * sizeof(c)); /* 末尾にナル文字を付加するので1バイト多く */ 152 | if (top == NULL) { 153 | fclose(fp); 154 | if (message_flag == 0) { 155 | printf( "%s : メモリが確保出来ませんでした\n", filename ); 156 | } else { 157 | printf( "%s : Out of memory\n", filename ); 158 | } 159 | return NULL; 160 | } 161 | 162 | /* 163 | size = fread(str, 1, sizeb, fp); 164 | */ 165 | line_idx = 1; 166 | p = top; 167 | while (1) { 168 | c = fgetc(fp); 169 | if (c == EOF) { 170 | /* file end */ 171 | *p++ = '\0'; 172 | break; 173 | } else if (c == '\x0d') { 174 | /* CRLF or CR ? */ 175 | c2 = fgetc(fp); 176 | if (c2 == '\x0a'){ 177 | /* CRLF */; 178 | *p++ = '\n'; 179 | line_idx++; 180 | } else if (c2 == EOF){ 181 | /* CR */; 182 | /* file end */ 183 | *p++ = '\n'; 184 | *p++ = '\0'; 185 | line_idx++; 186 | break; 187 | } else { 188 | /* CR */; 189 | *p++ = '\n'; 190 | line_idx++; 191 | c2 = ungetc(c2, fp); 192 | if (c2 == EOF) { 193 | /* ungetc fail */ 194 | fclose(fp); 195 | free(top); 196 | printf("%s : ungetc failed\n", filename); 197 | return NULL; 198 | 199 | } 200 | } 201 | } else if (c == '\x0a'){ 202 | /* LF */ 203 | *p++ = '\n'; 204 | line_idx++; 205 | } else if (c == '\0') { 206 | /* may be binary file */ 207 | fclose(fp); 208 | free(top); 209 | if (message_flag == 0) { 210 | printf("%s : 不適切な文字'\\0'が見つかりました(おそらくバイナリファイルを開いた)\n", filename); 211 | } else { 212 | printf("%s : Illegal charcter '\\0' found (file may be a binary file)\n", filename); 213 | } 214 | return NULL; 215 | } else { 216 | /* other char */ 217 | *p++ = c; 218 | } 219 | } 220 | fclose(fp); 221 | size = (int)((p - top) / sizeof(c)); 222 | /* 223 | printf("read %d byte -> store %d byte (¥\0 を含む) \n", sizeb, size); 224 | printf("read %d line\n", line_idx); 225 | */ 226 | if (size > sizeb + 1) { 227 | free(top); 228 | if (message_flag == 0) { 229 | printf("%s : 確保したメモリ以上にファイルを読み込みました\n", filename); 230 | } else { 231 | printf("%s : File was read exceeding allocated memory\n", filename); 232 | } 233 | return NULL; 234 | } 235 | return top; 236 | } 237 | 238 | 239 | 240 | 241 | 242 | /*-------------------------------------------------------------- 243 | 244 | --------------------------------------------------------------*/ 245 | static int dmcpath_inited = 0; 246 | static char dmcpath[10][512]; 247 | 248 | static void initDmcPath(void) 249 | { 250 | char *p,*pl; 251 | int i, l; 252 | dmcpath_inited = 1; 253 | p = getenv("DMC_INCLUDE"); 254 | if (p == NULL) 255 | return; 256 | 257 | for (i = 0; i < 10; i++) { 258 | pl = strchr(p, ';'); 259 | 260 | if (pl == NULL) 261 | l = (int)strlen(p); 262 | else 263 | l = (int)(pl-p); 264 | 265 | if (l == 0) { 266 | dmcpath[i][0] = '\0'; 267 | } else { 268 | strncpy(dmcpath[i],p,l); 269 | p += l; 270 | while (*p == ';') p++; 271 | } 272 | 273 | if (!is_pathdelimiter(dmcpath[i][strlen(dmcpath[i])])) { 274 | strcat(dmcpath[i], "/"); 275 | } 276 | } 277 | } 278 | 279 | 280 | 281 | FILE *openDmc(char *name) 282 | { 283 | FILE *fileptr; 284 | char testname[512]; 285 | int i; 286 | 287 | if (!dmcpath_inited) { 288 | initDmcPath(); 289 | } 290 | 291 | fileptr = fopen(name, "rb"); 292 | if (fileptr != NULL) return(fileptr); 293 | 294 | for (i = 0; i < 10; i++) { 295 | if (strlen(dmcpath[i])) { 296 | strcpy(testname, dmcpath[i]); 297 | strcat(testname, name); 298 | 299 | fileptr = fopen(testname, "rb"); 300 | if (fileptr != NULL) break; 301 | } 302 | } 303 | 304 | return (fileptr); 305 | } 306 | -------------------------------------------------------------------------------- /src/tone_src/map.h: -------------------------------------------------------------------------------- 1 | {sizeof(regions_00)/sizeof(opl4_region_t) , regions_00} , 2 | {sizeof(regions_01)/sizeof(opl4_region_t) , regions_01} , 3 | {sizeof(regions_02)/sizeof(opl4_region_t) , regions_02} , 4 | {sizeof(regions_03)/sizeof(opl4_region_t) , regions_03} , 5 | {sizeof(regions_04)/sizeof(opl4_region_t) , regions_04} , 6 | {sizeof(regions_05)/sizeof(opl4_region_t) , regions_05} , 7 | {sizeof(regions_06)/sizeof(opl4_region_t) , regions_06} , 8 | {sizeof(regions_07)/sizeof(opl4_region_t) , regions_07} , 9 | {sizeof(regions_08)/sizeof(opl4_region_t) , regions_08} , 10 | {sizeof(regions_09)/sizeof(opl4_region_t) , regions_09} , 11 | {sizeof(regions_0a)/sizeof(opl4_region_t) , regions_0a} , 12 | {sizeof(regions_0b)/sizeof(opl4_region_t) , regions_0b} , 13 | {sizeof(regions_0c)/sizeof(opl4_region_t) , regions_0c} , 14 | {sizeof(regions_0d)/sizeof(opl4_region_t) , regions_0d} , 15 | {sizeof(regions_0e)/sizeof(opl4_region_t) , regions_0e} , 16 | {sizeof(regions_0f)/sizeof(opl4_region_t) , regions_0f} , 17 | {sizeof(regions_10)/sizeof(opl4_region_t) , regions_10} , 18 | {sizeof(regions_11)/sizeof(opl4_region_t) , regions_11} , 19 | {sizeof(regions_12)/sizeof(opl4_region_t) , regions_12} , 20 | {sizeof(regions_13)/sizeof(opl4_region_t) , regions_13} , 21 | {sizeof(regions_14)/sizeof(opl4_region_t) , regions_14} , 22 | {sizeof(regions_15)/sizeof(opl4_region_t) , regions_15} , 23 | {sizeof(regions_16)/sizeof(opl4_region_t) , regions_16} , 24 | {sizeof(regions_17)/sizeof(opl4_region_t) , regions_17} , 25 | {sizeof(regions_18)/sizeof(opl4_region_t) , regions_18} , 26 | {sizeof(regions_19)/sizeof(opl4_region_t) , regions_19} , 27 | {sizeof(regions_1a)/sizeof(opl4_region_t) , regions_1a} , 28 | {sizeof(regions_1b)/sizeof(opl4_region_t) , regions_1b} , 29 | {sizeof(regions_1c)/sizeof(opl4_region_t) , regions_1c} , 30 | {sizeof(regions_1d)/sizeof(opl4_region_t) , regions_1d} , 31 | {sizeof(regions_1e)/sizeof(opl4_region_t) , regions_1e} , 32 | {sizeof(regions_1f)/sizeof(opl4_region_t) , regions_1f} , 33 | {sizeof(regions_20)/sizeof(opl4_region_t) , regions_20} , 34 | {sizeof(regions_21)/sizeof(opl4_region_t) , regions_21} , 35 | {sizeof(regions_22)/sizeof(opl4_region_t) , regions_22} , 36 | {sizeof(regions_23)/sizeof(opl4_region_t) , regions_23} , 37 | {sizeof(regions_24)/sizeof(opl4_region_t) , regions_24} , 38 | {sizeof(regions_25)/sizeof(opl4_region_t) , regions_25} , 39 | {sizeof(regions_26)/sizeof(opl4_region_t) , regions_26} , 40 | {sizeof(regions_27)/sizeof(opl4_region_t) , regions_27} , 41 | {sizeof(regions_28)/sizeof(opl4_region_t) , regions_28} , 42 | {sizeof(regions_29)/sizeof(opl4_region_t) , regions_29} , 43 | {sizeof(regions_2a)/sizeof(opl4_region_t) , regions_2a} , 44 | {sizeof(regions_2b)/sizeof(opl4_region_t) , regions_2b} , 45 | {sizeof(regions_2c)/sizeof(opl4_region_t) , regions_2c} , 46 | {sizeof(regions_2d)/sizeof(opl4_region_t) , regions_2d} , 47 | {sizeof(regions_2e)/sizeof(opl4_region_t) , regions_2e} , 48 | {sizeof(regions_2f)/sizeof(opl4_region_t) , regions_2f} , 49 | {sizeof(regions_30)/sizeof(opl4_region_t) , regions_30} , 50 | {sizeof(regions_31)/sizeof(opl4_region_t) , regions_31} , 51 | {sizeof(regions_32)/sizeof(opl4_region_t) , regions_32} , 52 | {sizeof(regions_33)/sizeof(opl4_region_t) , regions_33} , 53 | {sizeof(regions_34)/sizeof(opl4_region_t) , regions_34} , 54 | {sizeof(regions_35)/sizeof(opl4_region_t) , regions_35} , 55 | {sizeof(regions_36)/sizeof(opl4_region_t) , regions_36} , 56 | {sizeof(regions_37)/sizeof(opl4_region_t) , regions_37} , 57 | {sizeof(regions_38)/sizeof(opl4_region_t) , regions_38} , 58 | {sizeof(regions_39)/sizeof(opl4_region_t) , regions_39} , 59 | {sizeof(regions_3a)/sizeof(opl4_region_t) , regions_3a} , 60 | {sizeof(regions_3b)/sizeof(opl4_region_t) , regions_3b} , 61 | {sizeof(regions_3c)/sizeof(opl4_region_t) , regions_3c} , 62 | {sizeof(regions_3d)/sizeof(opl4_region_t) , regions_3d} , 63 | {sizeof(regions_3e)/sizeof(opl4_region_t) , regions_3e} , 64 | {sizeof(regions_3f)/sizeof(opl4_region_t) , regions_3f} , 65 | {sizeof(regions_40)/sizeof(opl4_region_t) , regions_40} , 66 | {sizeof(regions_41)/sizeof(opl4_region_t) , regions_41} , 67 | {sizeof(regions_42)/sizeof(opl4_region_t) , regions_42} , 68 | {sizeof(regions_43)/sizeof(opl4_region_t) , regions_43} , 69 | {sizeof(regions_44)/sizeof(opl4_region_t) , regions_44} , 70 | {sizeof(regions_45)/sizeof(opl4_region_t) , regions_45} , 71 | {sizeof(regions_46)/sizeof(opl4_region_t) , regions_46} , 72 | {sizeof(regions_47)/sizeof(opl4_region_t) , regions_47} , 73 | {sizeof(regions_48)/sizeof(opl4_region_t) , regions_48} , 74 | {sizeof(regions_49)/sizeof(opl4_region_t) , regions_49} , 75 | {sizeof(regions_4a)/sizeof(opl4_region_t) , regions_4a} , 76 | {sizeof(regions_4b)/sizeof(opl4_region_t) , regions_4b} , 77 | {sizeof(regions_4c)/sizeof(opl4_region_t) , regions_4c} , 78 | {sizeof(regions_4d)/sizeof(opl4_region_t) , regions_4d} , 79 | {sizeof(regions_4e)/sizeof(opl4_region_t) , regions_4e} , 80 | {sizeof(regions_4f)/sizeof(opl4_region_t) , regions_4f} , 81 | {sizeof(regions_50)/sizeof(opl4_region_t) , regions_50} , 82 | {sizeof(regions_51)/sizeof(opl4_region_t) , regions_51} , 83 | {sizeof(regions_52)/sizeof(opl4_region_t) , regions_52} , 84 | {sizeof(regions_53)/sizeof(opl4_region_t) , regions_53} , 85 | {sizeof(regions_54)/sizeof(opl4_region_t) , regions_54} , 86 | {sizeof(regions_55)/sizeof(opl4_region_t) , regions_55} , 87 | {sizeof(regions_56)/sizeof(opl4_region_t) , regions_56} , 88 | {sizeof(regions_57)/sizeof(opl4_region_t) , regions_57} , 89 | {sizeof(regions_58)/sizeof(opl4_region_t) , regions_58} , 90 | {sizeof(regions_59)/sizeof(opl4_region_t) , regions_59} , 91 | {sizeof(regions_5a)/sizeof(opl4_region_t) , regions_5a} , 92 | {sizeof(regions_5b)/sizeof(opl4_region_t) , regions_5b} , 93 | {sizeof(regions_5c)/sizeof(opl4_region_t) , regions_5c} , 94 | {sizeof(regions_5d)/sizeof(opl4_region_t) , regions_5d} , 95 | {sizeof(regions_5e)/sizeof(opl4_region_t) , regions_5e} , 96 | {sizeof(regions_5f)/sizeof(opl4_region_t) , regions_5f} , 97 | {sizeof(regions_60)/sizeof(opl4_region_t) , regions_60} , 98 | {sizeof(regions_61)/sizeof(opl4_region_t) , regions_61} , 99 | {sizeof(regions_62)/sizeof(opl4_region_t) , regions_62} , 100 | {sizeof(regions_63)/sizeof(opl4_region_t) , regions_63} , 101 | {sizeof(regions_64)/sizeof(opl4_region_t) , regions_64} , 102 | {sizeof(regions_65)/sizeof(opl4_region_t) , regions_65} , 103 | {sizeof(regions_66)/sizeof(opl4_region_t) , regions_66} , 104 | {sizeof(regions_67)/sizeof(opl4_region_t) , regions_67} , 105 | {sizeof(regions_68)/sizeof(opl4_region_t) , regions_68} , 106 | {sizeof(regions_69)/sizeof(opl4_region_t) , regions_69} , 107 | {sizeof(regions_6a)/sizeof(opl4_region_t) , regions_6a} , 108 | {sizeof(regions_6b)/sizeof(opl4_region_t) , regions_6b} , 109 | {sizeof(regions_6c)/sizeof(opl4_region_t) , regions_6c} , 110 | {sizeof(regions_6d)/sizeof(opl4_region_t) , regions_6d} , 111 | {sizeof(regions_6e)/sizeof(opl4_region_t) , regions_6e} , 112 | {sizeof(regions_6f)/sizeof(opl4_region_t) , regions_6f} , 113 | {sizeof(regions_70)/sizeof(opl4_region_t) , regions_70} , 114 | {sizeof(regions_71)/sizeof(opl4_region_t) , regions_71} , 115 | {sizeof(regions_72)/sizeof(opl4_region_t) , regions_72} , 116 | {sizeof(regions_73)/sizeof(opl4_region_t) , regions_73} , 117 | {sizeof(regions_74)/sizeof(opl4_region_t) , regions_74} , 118 | {sizeof(regions_75)/sizeof(opl4_region_t) , regions_75} , 119 | {sizeof(regions_76)/sizeof(opl4_region_t) , regions_76} , 120 | {sizeof(regions_77)/sizeof(opl4_region_t) , regions_77} , 121 | {sizeof(regions_78)/sizeof(opl4_region_t) , regions_78} , 122 | {sizeof(regions_79)/sizeof(opl4_region_t) , regions_79} , 123 | {sizeof(regions_7a)/sizeof(opl4_region_t) , regions_7a} , 124 | {sizeof(regions_7b)/sizeof(opl4_region_t) , regions_7b} , 125 | {sizeof(regions_7c)/sizeof(opl4_region_t) , regions_7c} , 126 | {sizeof(regions_7d)/sizeof(opl4_region_t) , regions_7d} , 127 | {sizeof(regions_7e)/sizeof(opl4_region_t) , regions_7e} , 128 | {sizeof(regions_7f)/sizeof(opl4_region_t) , regions_7f} , 129 | -------------------------------------------------------------------------------- /src/mmckc/mckc.h: -------------------------------------------------------------------------------- 1 | /*-------------------------------------------------------------- 2 | mml2mck mml to mck assembler data converter 3 | --------------------------------------------------------------*/ 4 | 5 | #define VersionNo 27 6 | 7 | #define MML_MAX 128 8 | #define MML_MAX_NAME 512 9 | 10 | 11 | /* テンポベース -> フレームベースへの変換パラメータ */ 12 | #define _BASE 192.0 13 | #define _BASETEMPO 75 14 | 15 | typedef struct { 16 | double cnt; 17 | int frm; 18 | } LEN; 19 | 20 | typedef struct { 21 | int rate; 22 | int adjust; 23 | // gate length = delta * rate/gate_denom + adjust 24 | } GATE_Q; 25 | 26 | /* */ 27 | typedef struct { 28 | char *str; 29 | int status; 30 | } HEAD; 31 | 32 | /* ラインステータス */ 33 | typedef struct st_line { 34 | char *filename; /* ファイル名 */ 35 | char *shortname; /* 短縮ファイル名 */ 36 | int line; /* 行番号 */ 37 | int status; /* 行ステータス(下記define参照) */ 38 | int param; /* パラメータ(音色/トラック番号etc.) */ 39 | char *str; /* 行文字列 */ 40 | struct st_line *inc_ptr; /* インクルードファイルのデータポインタ */ 41 | } LINE; 42 | 43 | #define _HEADER 1 44 | #define _TITLE 2 45 | #define _COMPOSER 3 46 | #define _MAKER 4 47 | #define _PROGRAMER 5 48 | #define _OCTAVE_REV 6 49 | #define _EX_DISKFM 7 50 | #define _EX_NAMCO106 8 51 | #define _INCLUDE 9 52 | #define _BANK_CHANGE 10 53 | #define _EFFECT_INCLUDE 11 54 | #define _SET_SBANK 12 55 | #define _EX_VRC7 13 56 | #define _EX_VRC6 14 57 | #define _EX_FME7 15 58 | #define _EX_MMC5 16 59 | #define _NO_BANKSWITCH 17 60 | #define _DPCM_RESTSTOP 18 61 | #define _GATE_DENOM 19 62 | #define _AUTO_BANKSWITCH 20 63 | #define _PITCH_CORRECTION 21 64 | 65 | #define _SET_EFFECT 0x20 66 | #define _SET_TONE 0x21 67 | #define _SET_ENVELOPE 0x22 68 | #define _SET_PITCH_MOD 0x23 69 | #define _SET_PITCH_ENV 0x24 70 | #define _SET_ARPEGGIO 0x25 71 | #define _SET_DPCM_DATA 0x26 72 | #define _SET_FM_TONE 0x27 73 | #define _SET_N106_TONE 0x28 74 | #define _SET_VRC7_TONE 0x29 75 | #define _SET_HARD_EFFECT 0x2A 76 | #define _SET_EFFECT_WAVE 0x2B 77 | 78 | // HuSIC 79 | #define _SET_XPCM_DATA 0x2C 80 | #define _SET_WTB_TONE 0x2D 81 | 82 | // MoonDriver 83 | #define _SET_TONETBL 0x2E 84 | #define _SET_FMOP 0x2F 85 | #define _SET_FMOP_FOUR 0x30 86 | #define _EX_OPL3 0x31 87 | #define _OPL4_NOUSE 0x32 88 | #define _PCM_FILE 0x33 89 | 90 | 91 | #define _TRACK 0x40 92 | #define _SAME_LINE 0x80000000 93 | 94 | //internal dpcm FDS VRC7 VRC6 namco106 FME7 MMC5 95 | // #define _TRACK_MAX ( 4 +1 +1 +6 +3 +8 +3 +2) 96 | // #define _TRACK_STR "ABCDEFGHIJKLMNOPQRSTUVWXYZab\0" 97 | 98 | #define _TRACK_MAX (24 + 18) 99 | // 012345678901234567890123012345678901234567 100 | #define _TRACK_STR "ABCDEFGHIJKLMNOPQRSTUVWXabcdefghijklmnopqr" 101 | 102 | 103 | #define BTRACK(a) (a) 104 | #define BNOISETRACK BTRACK(3) 105 | #define BDPCMTRACK BTRACK(4) 106 | #define BFMTRACK BTRACK(5) 107 | #define BVRC7TRACK BTRACK(6) 108 | #define BVRC6TRACK BTRACK(12) 109 | #define BVRC6SAWTRACK BTRACK(14) 110 | #define BN106TRACK BTRACK(15) 111 | #define BFME7TRACK BTRACK(23) 112 | #define BMMC5TRACK BTRACK(26) 113 | 114 | #define TRACK(a) (1<<(a)) 115 | 116 | #define NOISETRACK TRACK(BNOISETRACK) 117 | #define DPCMTRACK TRACK(BDPCMTRACK) 118 | #define FMTRACK TRACK(BFMTRACK) 119 | #define VRC7TRACK (TRACK(BVRC7TRACK+5)|TRACK(BVRC7TRACK+4)|TRACK(BVRC7TRACK+3)|TRACK(BVRC7TRACK+2)|TRACK(BVRC7TRACK+1)|TRACK(BVRC7TRACK)) 120 | #define VRC6TRACK (TRACK(BVRC6TRACK+2)|TRACK(BVRC6TRACK+1)|TRACK(BVRC6TRACK)) 121 | #define VRC6PLSTRACK (TRACK(BVRC6TRACK+1)|TRACK(BVRC6TRACK)) 122 | #define VRC6SAWTRACK (TRACK(BVRC6TRACK+2)) 123 | #define N106TRACK (TRACK(BN106TRACK+7)|TRACK(BN106TRACK+6)|TRACK(BN106TRACK+5)|TRACK(BN106TRACK+4)|TRACK(BN106TRACK+3)|TRACK(BN106TRACK+2)|TRACK(BN106TRACK+1)|TRACK(BN106TRACK)) 124 | #define FME7TRACK (TRACK(BFME7TRACK+2)|TRACK(BFME7TRACK+1)|TRACK(BFME7TRACK)) 125 | #define MMC5TRACK (TRACK(BMMC5TRACK+1)|TRACK(BMMC5TRACK)) 126 | #define MMC5PLSTRACK (TRACK(BMMC5TRACK+1)|TRACK(BMMC5TRACK)) 127 | 128 | #define ALLTRACK 0xffffffff 129 | 130 | #define _PITCH_MOD_MAX 64 131 | #define _PITCH_ENV_MAX 128 132 | #define _ENVELOPE_MAX 128 133 | #define _TONE_MAX 128 134 | #define _DPCM_MAX 64 135 | #define _ARPEGGIO_MAX 128 136 | #define _FM_TONE_MAX 128 137 | #define _N106_TONE_MAX 128 138 | #define _VRC7_TONE_MAX 64 139 | #define _HARD_EFFECT_MAX 16 140 | #define _EFFECT_WAVE_MAX 8 141 | 142 | // MoonSound 143 | #define _TONETBL_MAX 256 144 | #define _OPL3TBL_MAX 256 145 | 146 | 147 | // HuSIC 148 | #define _WTB_TONE_MAX 128 149 | 150 | /* コマンドステータス */ 151 | #define PARAM_MAX 8 152 | typedef struct { 153 | char *filename; 154 | int line; 155 | double cnt; //トラック開始時点を0として、そこからの経過したカウント数 156 | int frm; //↑をフレーム単位にしたもの 157 | double lcnt; //トラックのループ点(Lコマンド)を0として、そこからの経過したカウント数(ただしLより前は0) 158 | int lfrm; //↑をフレーム単位にしたもの 159 | int cmd; 160 | double len; //単位:count 161 | int param[PARAM_MAX]; 162 | } CMD; 163 | 164 | #define PARAM_OMITTED 0x80000000 165 | 166 | #define _NOTE_C 0 167 | #define _NOTE_D 2 168 | #define _NOTE_E 4 169 | #define _NOTE_F 5 170 | #define _NOTE_G 7 171 | #define _NOTE_A 9 172 | #define _NOTE_B 11 173 | 174 | #define MIN_NOTE -3 175 | #define MAX_NOTE 0x8f 176 | 177 | enum { 178 | _TEMPO = (MAX_NOTE+1), 179 | _OCTAVE, 180 | _OCT_UP, 181 | _OCT_DW, 182 | _LENGTH, 183 | _ENVELOPE, 184 | _REL_ENV, 185 | _VOLUME, 186 | _VOL_PLUS, // 0x98 187 | _VOL_MINUS, 188 | _HARD_ENVELOPE, 189 | _TONE, 190 | _ORG_TONE, 191 | _REL_ORG_TONE, 192 | _SWEEP, 193 | _SLAR, 194 | _SONG_LOOP, // 0xa0 195 | _REPEAT_ST, 196 | _REPEAT_END, 197 | _REPEAT_ESC, 198 | _CONT_NOTE, 199 | _CONT_END, 200 | _QUONTIZE, 201 | _QUONTIZE2, 202 | 203 | _TIE, // 0xa8 204 | _DETUNE, 205 | _LFO_ON, 206 | _LFO_OFF, 207 | _EP_ON, 208 | _EP_OFF, 209 | _EN_ON, 210 | _EN_OFF, 211 | _NOTE, // 0xb0 212 | _KEY, 213 | _WAIT, 214 | _DATA_BREAK, 215 | _DATA_WRITE, 216 | _DATA_THRUE, 217 | 218 | _NEW_BANK, 219 | 220 | _REPEAT_ST2, 221 | _REPEAT_END2, // 0xb8 222 | _REPEAT_ESC2, 223 | 224 | _TEMPO2, 225 | _TRANSPOSE, 226 | _MH_ON, 227 | _MH_OFF, 228 | 229 | _SHUFFLE_QUONTIZE, 230 | _SHUFFLE_QUONTIZE_RESET, 231 | _SHUFFLE_QUONTIZE_OFF, // 0xc0 232 | 233 | /*_ARTICULATION_ADJUST,*/ 234 | _KEY_OFF, 235 | _SELF_DELAY_OFF, 236 | _SELF_DELAY_ON, 237 | _SELF_DELAY_QUEUE_RESET, 238 | _XX_COMMAND, 239 | _VRC7_TONE, 240 | _SUN5B_HARD_SPEED, 241 | _SUN5B_HARD_ENV, // 0xc8 242 | _SUN5B_NOISE_FREQ, 243 | _SHIFT_AMOUNT, 244 | 245 | // HuSIC 246 | 247 | _NOISE_SW, 248 | _PAN, 249 | _L_PAN, 250 | _R_PAN, 251 | _C_PAN, 252 | _WAVE_CHG, // 0xd0 253 | _MODE_CHG, 254 | _FMLFO_SET, 255 | _FMLFO_OFF, 256 | _FMLFO_FRQ, 257 | 258 | // MoonDriver 259 | _REVERB_SET, 260 | _DAMP_SET, 261 | 262 | _SET_OPBASE, 263 | _LOAD_OP2, // 0xd8 264 | _SET_TVP, 265 | _DRUM_SW, 266 | _SET_FBS, 267 | _SET_OPM, 268 | 269 | _JUMP_FLAG, 270 | 271 | _DRUM_BIT, 272 | _DRUM_NOTE, 273 | 274 | _DATA_WRITE_OFS, 275 | 276 | 277 | _REST = 0xfc, 278 | _NOP = 0xfe, 279 | _TRACK_END = 0xff 280 | }; 281 | 282 | #define SELF_DELAY_MAX 8 283 | 284 | /* DPCM用バッファ */ 285 | typedef struct { 286 | int flag; // 音色使用/未使用フラグ 287 | int index; // 実際にファイルに書き込まれるインデックス番号 288 | // ココが-1以外の時はfilenameは無視されてindex番号のDPCMを使用する(ソート時) 289 | char *fname; 290 | int freq; 291 | int start_adr; 292 | int size; 293 | int delta_init; 294 | int bank_ofs; //16KB(0x4000) 295 | } DPCMTBL; 296 | 297 | #define _DPCM_TOTAL_SIZE 0x4000 298 | 299 | #define BVRC6 0x01 300 | #define BVRC7 0x02 301 | #define BDISKFM 0x04 302 | #define BMMC5 0x08 303 | #define BNAMCO106 0x10 304 | #define BFME7 0x20 305 | 306 | // for MoonDriver 307 | #define BOPL4FLAG 0x01 308 | #define BOPL3FLAG 0x02 309 | 310 | 311 | // defination for HuSIC 312 | #define HULFO_TRK TRACK(1) 313 | #define HUNOISE_TRK (TRACK(3)|TRACK(4)|TRACK(5)) 314 | 315 | #define HUS_ALLTRK (ALLTRACK) 316 | 317 | #define NUM_OF_TRACKS (23+18) 318 | 319 | #define OPL4_MAX (24) 320 | #define OPL3_MAX (18) 321 | 322 | #define BOPL3TRACK BTRACK(24) 323 | 324 | #define MAX_VOLUME 127 325 | 326 | #define HUSIC_EXT 1 327 | 328 | enum { 329 | EFTBL_END = 0xffff, 330 | EFTBL_LOOP = 0xfffe 331 | }; 332 | 333 | 334 | enum { 335 | MCK_REPEAT_END = 0xa0, 336 | MCK_REPEAT_ESC = 0xa1, 337 | 338 | MDR_OPBASE = 0xe6, 339 | MDR_LDOP2 = 0xe5, 340 | MDR_TVP = 0xe4, 341 | MDR_DRUM = 0xf2, 342 | MDR_FBS = 0xe3, 343 | MDR_OPMODE = 0xeb, 344 | 345 | MCK_SLAR = 0xe9, 346 | 347 | MDR_REVERB = 0xea, 348 | MDR_DAMP = 0xeb, 349 | 350 | MDR_JUMP = 0xe2, 351 | MDR_DRUM_BIT = 0xe1, 352 | MDR_DRUM_NOTE = 0xe0, 353 | 354 | 355 | MCK_GOTO = 0xee, 356 | MCK_SET_SHIFT_AMOUNT = 0xef, 357 | MCK_SET_FDS_HWENV = 0xf0, 358 | MCK_SET_SUN5B_NOISE_FREQ = 0xf1, 359 | MCK_SET_SUN5B_HARD_SPEED = 0xf2, 360 | MCK_SET_FDS_HWEFFECT = 0xf3, 361 | MCK_WAIT = 0xf4, 362 | MCK_DATA_WRITE = 0xf5, 363 | MCK_DIRECT_FREQ = 0xf6, 364 | MCK_SET_NOTEENV = 0xf7, 365 | MCK_SET_PITCHENV = 0xf8, 366 | MCK_SET_HWSWEEP = 0xf9, 367 | MCK_SET_DETUNE = 0xfa, 368 | MCK_SET_LFO = 0xfb, 369 | MCK_REST = 0xfc, 370 | MCK_SET_VOL = 0xfd, MCK_SUN5B_HARD_ENV = 0xfd, 371 | MCK_SET_TONE = 0xfe, 372 | MCK_DATA_END = 0xff 373 | }; 374 | 375 | 376 | 377 | 378 | 379 | -------------------------------------------------------------------------------- /src/pcmtool/pcmtool.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | #define PCM_START_RAM 0x200000 6 | 7 | #define PCM_ENTRY_SIZE 0x0c 8 | #define PCM_MAX_ENTRY 0x180 9 | 10 | 11 | 12 | typedef struct { 13 | int use; 14 | char file[512]; 15 | 16 | int bit; 17 | unsigned start; 18 | int loop; 19 | int end; 20 | 21 | int lfo,vib; 22 | int ar,d1r; 23 | int dl,d2r; 24 | int rc,rr; 25 | int am; 26 | } userpcm_t; 27 | 28 | userpcm_t pcmlist[PCM_MAX_ENTRY]; 29 | 30 | 31 | #define USE_AS_LIB 32 | #include "wavread.c" 33 | 34 | 35 | /************************************/ 36 | typedef struct { 37 | char *filename; 38 | FILE *fp; 39 | int line; 40 | int quote; 41 | 42 | char lastchr; 43 | } strmfile_t; 44 | 45 | // 文字列から整数 46 | int strmStr2Int(char *ptr) { 47 | int temp = 0; 48 | 49 | if (strncmp(ptr,"0x",2) == 0) { 50 | sscanf(ptr+2,"%x",&temp); 51 | return temp; 52 | } 53 | if (*ptr == '$') { 54 | sscanf(ptr+1,"%x",&temp); 55 | return temp; 56 | } 57 | 58 | sscanf(ptr,"%d",&temp); 59 | return temp; 60 | } 61 | 62 | int strmOpen(strmfile_t *sfp) { 63 | sfp->fp = fopen(sfp->filename,"r"); 64 | if (sfp->fp == NULL) return -1; 65 | 66 | sfp->quote = 0; 67 | sfp->line = 0; 68 | sfp->lastchr = 0; 69 | return 0; 70 | } 71 | 72 | int strmIsEOF(strmfile_t *sfp) { 73 | return feof(sfp->fp); 74 | } 75 | 76 | int strmIsHex(int chr) { 77 | if (chr >= '0' && chr <= '9') return 1; 78 | if (chr >= 'a' && chr <= 'f') return 1; 79 | if (chr >= 'A' && chr <= 'F') return 1; 80 | return 0; 81 | } 82 | 83 | int strmHex2Int(int chr) { 84 | if (chr >= '0' && chr <= '9') return chr-'0'; 85 | if (chr >= 'a' && chr <= 'f') return chr-'a'; 86 | if (chr >= 'A' && chr <= 'F') return chr-'A'; 87 | return 0; 88 | } 89 | 90 | int strmEsc(strmfile_t *sfp) { 91 | int chr; 92 | int num; 93 | 94 | num = 0; 95 | chr = fgetc(sfp->fp); 96 | 97 | switch(chr) { 98 | case '\"': 99 | return chr; 100 | case 'r': 101 | return '\r'; 102 | case 'n': 103 | return '\n'; 104 | case 'x': 105 | while(1) { 106 | chr = fgetc(sfp->fp); 107 | if (chr == EOF) break; 108 | if (strmIsHex(chr)) num = (num * 16) + strmHex2Int(chr); 109 | else { break; } 110 | } 111 | return num; 112 | } 113 | return chr; 114 | } 115 | 116 | 117 | int strmGetStringWithFlags(char *buf,int len,strmfile_t *sfp,int skipSpace,int getLine) { 118 | int chr; 119 | int i; 120 | const int CHR_CR = 0x0d; 121 | const int CHR_LF = 0x0a; 122 | 123 | i = 0; 124 | chr = fgetc(sfp->fp); 125 | 126 | while(i < len && !feof(sfp->fp)) { 127 | if (chr == EOF) break; 128 | 129 | // 次の行へ 130 | if (chr == CHR_CR) { 131 | sfp->line++; 132 | if (i > 0) break; 133 | goto getNextChr; 134 | } 135 | if (chr == CHR_LF) { 136 | if (sfp->lastchr != CHR_CR) 137 | sfp->line++; 138 | 139 | if (i > 0) break; 140 | goto getNextChr; 141 | } 142 | if (skipSpace && !sfp->quote && isspace(chr)) { 143 | if (!getLine && i > 0) break; 144 | goto getNextChr; 145 | } 146 | if (chr == '\"') { 147 | sfp->quote = !sfp->quote; 148 | goto getNextChr; 149 | } 150 | 151 | // 1行コメント 152 | if (chr == ';') { 153 | while(chr != EOF && chr != CHR_CR && chr != CHR_LF) { 154 | sfp->lastchr = chr; 155 | chr = fgetc(sfp->fp); 156 | } 157 | continue; 158 | } 159 | // エスケープ文字 160 | if (chr == '\\') chr = strmEsc(sfp); 161 | 162 | buf[i++] = chr; 163 | 164 | getNextChr: 165 | sfp->lastchr = chr; 166 | chr = fgetc(sfp->fp); 167 | } 168 | 169 | buf[i++] = 0; 170 | return i; 171 | } 172 | 173 | // 文字列 174 | int strmGetString(char *buf,int len,strmfile_t *sfp) { 175 | return strmGetStringWithFlags(buf,len,sfp,1,0); 176 | } 177 | 178 | // 行 179 | int strmGetLine(char *buf,int len,strmfile_t *sfp) { 180 | return strmGetStringWithFlags(buf,len,sfp,0,1); 181 | } 182 | 183 | // 文字列から整数 184 | int strmGetInt(strmfile_t *sfp) { 185 | char buf[512]; 186 | strmGetStringWithFlags(buf,512,sfp,1,0); 187 | return strmStr2Int(buf); 188 | } 189 | 190 | void strmClose(strmfile_t *sfp) { 191 | if (sfp->fp) { 192 | fclose(sfp->fp); 193 | sfp->fp = NULL; 194 | } 195 | } 196 | /******************************************/ 197 | 198 | void printPCMinfo(userpcm_t *upcm) { 199 | printf("File : %s\n",upcm->file); 200 | printf("Bit : %02x\n",upcm->bit); 201 | printf("Start : %08x\n",upcm->start); 202 | printf("Loop : %04x\n",upcm->loop); 203 | printf("End : %04x\n",upcm->end); 204 | 205 | printf("LFO : %02x VIB : %02x\n",upcm->lfo,upcm->vib); 206 | printf("AR : %02x D1R : %02x\n",upcm->ar,upcm->d1r); 207 | printf("DL : %02x D2R : %02x\n",upcm->dl,upcm->d2r); 208 | printf("RC : %02x RR : %02x\n",upcm->rc,upcm->rr); 209 | printf("AM : %02x\n",upcm->am); 210 | 211 | } 212 | 213 | void checkPCMinfo(userpcm_t *upcm) { 214 | if (upcm->bit > 2) { 215 | printf("Warning : bit > 2 is prohibited , forced bit = 2\n"); 216 | upcm->bit = 2; 217 | } 218 | if (upcm->loop > 0xffff) { 219 | printf("Warning : too big loop address(addr > 0xffff)\n"); 220 | upcm->loop = 0xffff; 221 | } 222 | if (upcm->end > 0xffff) { 223 | printf("Warning : too big end address(addr > 0xffff)\n"); 224 | upcm->end = 0xffff; 225 | } 226 | } 227 | 228 | // PCM開始アドレスの計算 229 | int calcPCMlength(userpcm_t *upcm) { 230 | if (upcm->end < 0) return 0; 231 | switch(upcm->bit) { 232 | case 0: 233 | return upcm->end+1; 234 | break; 235 | case 1: 236 | return ((upcm->end+1)/2)*3; 237 | break; 238 | case 2: 239 | return (upcm->end+1)*2; 240 | break; 241 | } 242 | return 0; 243 | } 244 | 245 | // ヘッダの出力 246 | void writePCMheader(FILE *fp) { 247 | unsigned char temp[0x10]; 248 | 249 | for(int i=0; i < PCM_MAX_ENTRY; i++) { 250 | memset(temp,0,0x10); 251 | if (!pcmlist[i].use) { 252 | fwrite(temp,0x0c,1,fp); 253 | continue; 254 | } 255 | unsigned start = pcmlist[i].start; 256 | 257 | temp[0] = ((pcmlist[i].bit & 0x03)<<6) | ((start>>16)&0x3f); 258 | temp[1] = ((start>>8)&0xff); 259 | temp[2] = ((start)&0xff); 260 | 261 | int loop = pcmlist[i].loop < 0 ? 0 : pcmlist[i].loop; 262 | int end = pcmlist[i].end < 0 ? 0 : pcmlist[i].end; 263 | 264 | temp[3] = ((loop>>8)&0xff); 265 | temp[4] = ((loop)&0xff); 266 | 267 | temp[5] = ((end>>8)&0xff)^0xff; 268 | temp[6] = ((end)&0xff)^0xff; 269 | 270 | temp[7] = ((pcmlist[i].lfo & 0x07)<<3) | ((pcmlist[i].vib & 0x07)); 271 | temp[8] = ((pcmlist[i].ar & 0x0f)<<4) | ((pcmlist[i].d1r & 0x0f)); 272 | temp[9] = ((pcmlist[i].dl & 0x0f)<<4) | ((pcmlist[i].d2r & 0x0f)); 273 | temp[10] = ((pcmlist[i].rc & 0x0f)<<4) | ((pcmlist[i].rr & 0x0f)); 274 | temp[11] = ((pcmlist[i].am & 0x07)); 275 | 276 | fwrite(temp,0x0c,1,fp); 277 | } 278 | } 279 | 280 | int makePCMfile(char *file) { 281 | FILE *fp; 282 | 283 | int i,j; 284 | int dat1,dat2; 285 | 286 | unsigned char temp[0x10]; 287 | 288 | fp = fopen(file,"wb"); 289 | if (!fp) return -1; 290 | 291 | writePCMheader(fp); 292 | 293 | int addr = PCM_START_RAM + PCM_ENTRY_SIZE * PCM_MAX_ENTRY; 294 | 295 | for(i=0; i < PCM_MAX_ENTRY; i++) { 296 | // printf("curpos : %08x \n",ftell(fp)); 297 | if (!pcmlist[i].use) continue; 298 | 299 | wavfmt_t wav; 300 | if (wavOpen(pcmlist[i].file,&wav) < 0) break; 301 | 302 | pcmlist[i].start = addr; 303 | 304 | int pc = 0; 305 | int pcm_end = pcmlist[i].end < 0 ? 0xFFFF : pcmlist[i].end; 306 | for(; pc <= pcm_end && !wavIsEof(&wav); pc++) { 307 | switch(pcmlist[i].bit) { 308 | case 0: 309 | dat1 = wavGetSample(&wav,8); 310 | temp[0] = dat1; 311 | fwrite(temp,1,1,fp); 312 | addr += 1; 313 | break; 314 | case 1: 315 | // 2サンプル進める 316 | dat1 = wavGetSample(&wav,12); 317 | if (!wavIsEof(&wav)) { 318 | dat2 = wavGetSample(&wav,12); 319 | pc++; 320 | } else { 321 | dat1 = dat2; 322 | } 323 | 324 | temp[0] = dat1>>4; 325 | temp[1] = (dat1 & 0xf) | ((dat2 & 0x0f)<<4); 326 | temp[2] = dat2>>4; 327 | 328 | fwrite(temp,3,1,fp); 329 | addr += 3; 330 | break; 331 | case 2: 332 | dat1 = wavGetSample(&wav,16); 333 | temp[0] = dat1>>8; 334 | temp[1] = dat1&0xff; 335 | 336 | fwrite(temp,2,1,fp); 337 | addr += 2; 338 | break; 339 | } 340 | } 341 | wavClose(&wav); 342 | 343 | if (pcmlist[i].loop < 0) pcmlist[i].loop = pc; 344 | if (pcmlist[i].end < 0) pcmlist[i].end = pc; 345 | printPCMinfo(&pcmlist[i]); 346 | } 347 | 348 | // PCMヘッダ更新 349 | fseek(fp,0,SEEK_SET); 350 | writePCMheader(fp); 351 | 352 | fclose(fp); 353 | } 354 | 355 | // PCM定義を読む 356 | int readPCMdefine(char *file) { 357 | int i; 358 | char buf[512]; 359 | strmfile_t sf; 360 | 361 | for(i=0; i < PCM_MAX_ENTRY; i++) memset(&pcmlist[i],0,sizeof(userpcm_t)); 362 | 363 | i = 0; 364 | int addr = PCM_START_RAM + PCM_ENTRY_SIZE * PCM_MAX_ENTRY; 365 | 366 | sf.filename = file; 367 | 368 | if (strmOpen(&sf) < 0) return -1; 369 | 370 | while(i < PCM_MAX_ENTRY && !strmIsEOF(&sf)) { 371 | strmGetString(buf,512,&sf); 372 | 373 | if (strmIsEOF(&sf)) break; 374 | 375 | pcmlist[i].use = 1; 376 | strcpy(pcmlist[i].file,buf); 377 | 378 | pcmlist[i].bit = strmGetInt(&sf); 379 | pcmlist[i].loop = strmGetInt(&sf); 380 | pcmlist[i].end = strmGetInt(&sf); 381 | 382 | 383 | pcmlist[i].lfo = strmGetInt(&sf); 384 | pcmlist[i].vib = strmGetInt(&sf); 385 | pcmlist[i].ar = strmGetInt(&sf); 386 | pcmlist[i].d1r = strmGetInt(&sf); 387 | pcmlist[i].dl = strmGetInt(&sf); 388 | pcmlist[i].d2r = strmGetInt(&sf); 389 | pcmlist[i].rc = strmGetInt(&sf); 390 | pcmlist[i].rr = strmGetInt(&sf); 391 | pcmlist[i].am = strmGetInt(&sf); 392 | 393 | checkPCMinfo(&pcmlist[i]); 394 | 395 | pcmlist[i].start = addr; 396 | addr += (calcPCMlength(&pcmlist[i])); 397 | 398 | i++; 399 | } 400 | strmClose(&sf); 401 | return 0; 402 | } 403 | 404 | int main(int argc,char *argv[]) { 405 | printf("PCMTOOL for OPL4 ver 0.4 by BouKiCHi\n"); 406 | 407 | if (argc < 2) { 408 | printf("Usage pcmtool file [file.pcm]\n"); 409 | return 1; 410 | } 411 | 412 | char outfn[512]; 413 | char *ptr; 414 | 415 | if (strlen(argv[1]) >= 512) { 416 | strcpy(outfn,"pcm.bin"); 417 | } else { 418 | strcpy(outfn,argv[1]); 419 | ptr = strrchr(outfn,'.'); 420 | if (!ptr) ptr = outfn; 421 | strcpy(ptr,".pcm"); 422 | } 423 | 424 | if (readPCMdefine(argv[1]) < 0) { 425 | printf("Error : cound't read PCM definition file\n"); 426 | return 1; 427 | } 428 | 429 | printf("%s -> %s\n",argv[1],outfn); 430 | makePCMfile(outfn); 431 | return 0; 432 | 433 | } 434 | 435 | 436 | -------------------------------------------------------------------------------- /moon.sym: -------------------------------------------------------------------------------- 1 | FM_BASECH EQU 00018H 2 | IDX_ADDR EQU 00007H 3 | IDX_AM EQU 00014H 4 | IDX_AR_D1R EQU 00011H 5 | IDX_BANK EQU 00006H 6 | IDX_CNT EQU 00004H 7 | IDX_DAMP EQU 0000EH 8 | IDX_DETUNE EQU 00020H 9 | IDX_DL_D2R EQU 00012H 10 | IDX_DSEL EQU 00000H 11 | IDX_EFX1 EQU 00003H 12 | IDX_FNUM EQU 0001BH 13 | IDX_KEY EQU 0000DH 14 | IDX_LFO EQU 0000FH 15 | IDX_LFO_VIB EQU 00010H 16 | IDX_LOOP EQU 00005H 17 | IDX_NENV EQU 00022H 18 | IDX_NENV_ADR EQU 00024H 19 | IDX_NOTE EQU 00015H 20 | IDX_OCT EQU 0001AH 21 | IDX_OLDAT1 EQU 00011H 22 | IDX_OPSEL EQU 00001H 23 | IDX_PAN EQU 0001FH 24 | IDX_PENV EQU 00023H 25 | IDX_PENV_ADR EQU 00026H 26 | IDX_PITCH EQU 00016H 27 | IDX_P_OFS EQU 00018H 28 | IDX_RC_RR EQU 00013H 29 | IDX_REVERB EQU 0001DH 30 | IDX_SYNTH EQU 00002H 31 | IDX_TADR EQU 00009H 32 | IDX_TONE EQU 0000BH 33 | IDX_VENV EQU 00021H 34 | IDX_VENV_ADR EQU 00028H 35 | IDX_VOL EQU 0001EH 36 | IDX_VOLOP EQU 0001DH 37 | MDB_ADRHI EQU 04039H 38 | MDB_ADRLO EQU 0403BH 39 | MDB_ADRMI EQU 0403AH 40 | MDB_BASE EQU 04038H 41 | MDB_LDFLAG EQU 04038H 42 | MDB_RESULT EQU 0403CH 43 | MDB_ROM EQU 0403DH 44 | MDR_DSTPCM EQU 08030H 45 | MDR_ID EQU 08000H 46 | MDR_LASTS EQU 08033H 47 | MDR_PACKED EQU 0802AH 48 | MDR_PCMBANKS EQU 08032H 49 | MDR_STPCM EQU 08031H 50 | MOON_BASE EQU 000C4H 51 | MOON_DAT1 EQU 000C5H 52 | MOON_DAT2 EQU 000C7H 53 | MOON_REG1 EQU 000C4H 54 | MOON_REG2 EQU 000C6H 55 | MOON_STAT EQU 000C4H 56 | MOON_VERNUM EQU 00002H 57 | MOON_WDAT EQU 0007FH 58 | MOON_WREG EQU 0007EH 59 | RAM_PAGE3 EQU 000FEH 60 | SEQ_WORKSIZE EQU 0002AH 61 | S_DEVICE_FLAGS EQU 08007H 62 | S_INST_TABLE EQU 08026H 63 | S_LFO_TABLE EQU 08024H 64 | S_LOOP_BANK EQU 08016H 65 | S_LOOP_TABLE EQU 08014H 66 | S_NENV_LOOP EQU 08022H 67 | S_NENV_TABLE EQU 08020H 68 | S_OPL3_TABLE EQU 08028H 69 | S_PENV_LOOP EQU 0801EH 70 | S_PENV_TABLE EQU 0801CH 71 | S_TRACK_BANK EQU 08012H 72 | S_TRACK_TABLE EQU 08010H 73 | S_VENV_LOOP EQU 0801AH 74 | S_VENV_TABLE EQU 08018H 75 | USE_CH EQU 0002AH 76 | add_freq_de EQU 05088H 77 | add_freq_nega EQU 0507EH 78 | add_freq_offset EQU 05072H 79 | add_hl_fin EQU 050EFH 80 | change_page3 EQU 04850H 81 | check_sram_start EQU 05478H 82 | comp_hl_de EQU 04B6FH 83 | conv_data_to_midi EQU 04EF8H 84 | conv_midi_lp EQU 04F05H 85 | drumbit_fnum_lp EQU 04CFCH 86 | drumbit_fnum_next EQU 04D06H 87 | drumbit_set_fnum EQU 04D2EH 88 | drumbit_skip_keyon EQU 04D23H 89 | drumbit_with_length EQU 04D2AH 90 | drumnote_fnum EQU 04D7EH 91 | drumnote_lp EQU 04D6EH 92 | drumnote_next EQU 04D78H 93 | fm_drum_fnum EQU 04837H 94 | fm_drum_fnum_map EQU 04841H 95 | fm_drum_oct EQU 04846H 96 | fm_fnumtbl EQU 047E2H 97 | fm_load_fnumtbl EQU 050B5H 98 | fm_op2reg_tbl EQU 04813H 99 | fm_opbtbl EQU 04825H 100 | fm_testtone EQU 047FCH 101 | fmtone_set_tvp EQU 04F7DH 102 | fmtone_skip_set_fbs2 EQU 04F74H 103 | freq_table EQU 054ECH 104 | get_a_table EQU 0486DH 105 | get_hl_table EQU 0485CH 106 | get_table EQU 04857H 107 | get_table_hl_2de EQU 04862H 108 | init_fmtone EQU 048D9H 109 | init_op4tone EQU 048FBH 110 | init_tone_fin EQU 04908H 111 | make_fnum EQU 04F1BH 112 | make_fnum_lp EQU 04F1EH 113 | moon_add_reg_ch EQU 0515AH 114 | moon_calc_current_fmvol EQU 051F6H 115 | moon_calc_midinote EQU 05041H 116 | moon_calc_opl3note EQU 050ACH 117 | moon_calc_opl4freq EQU 0502CH 118 | moon_check_rom EQU 053D8H 119 | moon_check_rom_lp EQU 053ECH 120 | moon_check_sram EQU 05405H 121 | moon_fm1_out EQU 05127H 122 | moon_fm2_out EQU 05134H 123 | moon_inc_sram_adrs EQU 053A5H 124 | moon_init EQU 04053H 125 | moon_init_all EQU 04040H 126 | moon_key_data EQU 05249H 127 | moon_key_data_damp_off EQU 0525FH 128 | moon_key_data_lfo_on EQU 05257H 129 | moon_key_fmfreq EQU 0537DH 130 | moon_key_fmoff EQU 05266H 131 | moon_key_fmon EQU 052CCH 132 | moon_key_off EQU 05260H 133 | moon_key_on EQU 052C6H 134 | moon_key_opl4off EQU 0527FH 135 | moon_key_opl4on EQU 052F5H 136 | moon_key_write_fmfreq EQU 0534DH 137 | moon_key_write_fmfreq_base EQU 05362H 138 | moon_load_fmvol EQU 04F96H 139 | moon_load_fmvol_lp EQU 04F9EH 140 | moon_load_pcm EQU 05455H 141 | moon_opl4_set_keyreg EQU 0532FH 142 | moon_pcm_bank EQU 054E9H 143 | moon_pcm_bank_count EQU 054E8H 144 | moon_pcm_lastsize EQU 054EBH 145 | moon_pcm_numbanks EQU 054EAH 146 | moon_proc_tracks EQU 0498AH 147 | moon_reset_sram_adrs EQU 05395H 148 | moon_seq_all_keyoff EQU 04944H 149 | moon_seq_all_release_fm EQU 04968H 150 | moon_seq_init EQU 0487AH 151 | moon_set_adsr EQU 05212H 152 | moon_set_fmnote EQU 05099H 153 | moon_set_fmop EQU 04FADH 154 | moon_set_fmtone EQU 04F37H 155 | moon_set_fmtone2 EQU 04F30H 156 | moon_set_fmtone_lp1 EQU 04F81H 157 | moon_set_fmtone_start_lp EQU 04F3CH 158 | moon_set_fmvol_ch EQU 051BCH 159 | moon_set_fmvol_lp EQU 051D7H 160 | moon_set_freq_ch EQU 05160H 161 | moon_set_freq_ch_skip_reverb EQU 05187H 162 | moon_set_midinote EQU 0508CH 163 | moon_set_rr_ch_lp EQU 04970H 164 | moon_set_rr_op_lp EQU 04977H 165 | moon_set_sram_adrs EQU 053BDH 166 | moon_set_vol_ch EQU 051A5H 167 | moon_tonesel EQU 04FD6H 168 | moon_wait EQU 05120H 169 | moon_wave_in EQU 0514EH 170 | moon_wave_out EQU 05141H 171 | moon_wavechg_lp EQU 05320H 172 | moon_work_end EQU 04760H 173 | moon_work_start EQU 04070H 174 | moon_write_fm1 EQU 0511BH 175 | moon_write_fm_ch EQU 05110H 176 | moon_write_fmop EQU 050DDH 177 | moon_write_fmop_1 EQU 050FDH 178 | moon_write_fmpan EQU 05296H 179 | moon_write_fmpan_4op_fin EQU 052C5H 180 | moon_write_fmreg EQU 05100H 181 | moon_write_fmreg_nch EQU 05105H 182 | oct_div EQU 04F12H 183 | oct_div_lp EQU 04F15H 184 | pause_venv EQU 04E8BH 185 | pcm_chk_last EQU 054BFH 186 | pcm_copy_bank EQU 054A8H 187 | pcm_copy_end EQU 054E2H 188 | pcm_copy_lp EQU 054C9H 189 | penv_fm_dec_oct EQU 04B54H 190 | penv_fm_inc_oct EQU 04B5FH 191 | penv_fm_inc_oct_lp EQU 04B62H 192 | penv_fm_set_fnum EQU 04B4BH 193 | piano_tone EQU 04769H 194 | proc_freq_reg EQU 04C28H 195 | proc_freq_to_moon EQU 04C37H 196 | proc_nenv EQU 04B80H 197 | proc_nenv_fm EQU 04BC1H 198 | proc_nenv_fm_add EQU 04BD1H 199 | proc_nenv_fm_lp1 EQU 04BC8H 200 | proc_nenv_fm_nega EQU 04BF8H 201 | proc_nenv_fm_nega_lp1 EQU 04BFAH 202 | proc_nenv_fm_sub EQU 04C03H 203 | proc_nenv_nega_opl4 EQU 04BB5H 204 | proc_nenv_opl4 EQU 04BA4H 205 | proc_nenv_opl4_setnote EQU 04BAFH 206 | proc_nenv_start EQU 04B86H 207 | proc_penv EQU 04AF1H 208 | proc_penv_end EQU 04B25H 209 | proc_penv_fm EQU 04B28H 210 | proc_penv_opl4 EQU 04B12H 211 | proc_penv_start EQU 04AF7H 212 | proc_tracks_end EQU 049BDH 213 | proc_tracks_lp EQU 04996H 214 | proc_venv EQU 04AB9H 215 | proc_venv_end EQU 04ADAH 216 | proc_venv_reg EQU 04ADDH 217 | proc_venv_start EQU 04ABFH 218 | read_cmd_length EQU 04A66H 219 | read_effect_table EQU 04E93H 220 | read_effect_value EQU 04EEDH 221 | seq_all_keyoff_end EQU 04967H 222 | seq_all_keyoff_lp EQU 0494FH 223 | seq_bank EQU 04DF6H 224 | seq_ch1_addr EQU 04083H 225 | seq_ch1_am EQU 04090H 226 | seq_ch1_ar_d1r EQU 0408DH 227 | seq_ch1_bank EQU 04082H 228 | seq_ch1_cnt EQU 04080H 229 | seq_ch1_damp EQU 0408AH 230 | seq_ch1_detune EQU 0409CH 231 | seq_ch1_dl_d2r EQU 0408EH 232 | seq_ch1_dsel EQU 0407CH 233 | seq_ch1_efx1 EQU 0407FH 234 | seq_ch1_fnum EQU 04097H 235 | seq_ch1_key EQU 04089H 236 | seq_ch1_lfo EQU 0408BH 237 | seq_ch1_lfo_vib EQU 0408CH 238 | seq_ch1_loop EQU 04081H 239 | seq_ch1_nenv EQU 0409EH 240 | seq_ch1_nenv_adr EQU 040A0H 241 | seq_ch1_note EQU 04091H 242 | seq_ch1_oct EQU 04096H 243 | seq_ch1_opsel EQU 0407DH 244 | seq_ch1_p_ofs EQU 04094H 245 | seq_ch1_pan EQU 0409BH 246 | seq_ch1_penv EQU 0409FH 247 | seq_ch1_penv_adr EQU 040A2H 248 | seq_ch1_pitch EQU 04092H 249 | seq_ch1_rc_rr EQU 0408FH 250 | seq_ch1_reverb EQU 04099H 251 | seq_ch1_synth EQU 0407EH 252 | seq_ch1_tadr EQU 04085H 253 | seq_ch1_tone EQU 04087H 254 | seq_ch1_venv EQU 0409DH 255 | seq_ch1_venv_adr EQU 040A4H 256 | seq_ch1_vol EQU 0409AH 257 | seq_cnt_zero EQU 049CFH 258 | seq_command EQU 049E1H 259 | seq_cur_bank EQU 04073H 260 | seq_cur_ch EQU 04070H 261 | seq_damp EQU 04E06H 262 | seq_damp_fin EQU 04E1CH 263 | seq_damp_opl4 EQU 04E18H 264 | seq_data_write EQU 04C9CH 265 | seq_detune EQU 04C7DH 266 | seq_drum EQU 04CC7H 267 | seq_drumbit EQU 04CDDH 268 | seq_drumnote EQU 04D5AH 269 | seq_fbs EQU 04E72H 270 | seq_init_chan EQU 048ABH 271 | seq_init_chan_lp EQU 048BCH 272 | seq_init_fmbase EQU 0492EH 273 | seq_init_fmbase_lp1 EQU 04937H 274 | seq_inst EQU 04D9FH 275 | seq_inst_fin EQU 04DCDH 276 | seq_inst_opl4 EQU 04DBFH 277 | seq_jmptable EQU 04A6EH 278 | seq_jump EQU 04E84H 279 | seq_jump_flag EQU 04076H 280 | seq_ld2ops EQU 04E32H 281 | seq_ld2ops_fm EQU 04E3BH 282 | seq_lfosw EQU 04DEFH 283 | seq_loop EQU 04C3FH 284 | seq_nenv EQU 04C90H 285 | seq_next EQU 049F6H 286 | seq_nop EQU 04C3AH 287 | seq_note EQU 04A39H 288 | seq_note_fm EQU 04A45H 289 | seq_note_opl4 EQU 04A4EH 290 | seq_opsel EQU 04074H 291 | seq_pan EQU 04DD3H 292 | seq_pan_fin EQU 04DEDH 293 | seq_pan_fm EQU 04DDAH 294 | seq_pan_opl4 EQU 04DE9H 295 | seq_penv EQU 04C84H 296 | seq_reg_bd EQU 04075H 297 | seq_rep_jmp EQU 04A2BH 298 | seq_repeat_end EQU 04A07H 299 | seq_repeat_esc EQU 04A14H 300 | seq_repeat_or_note EQU 049FFH 301 | seq_rest EQU 04C76H 302 | seq_revbsw EQU 04E1EH 303 | seq_setop EQU 04E2BH 304 | seq_skip_1 EQU 04C3CH 305 | seq_skip_rep_jmp EQU 04A21H 306 | seq_skip_set_repcnt_end EQU 04A12H 307 | seq_skip_set_repcnt_esc EQU 04A1FH 308 | seq_slar EQU 04E25H 309 | seq_start_fm EQU 04072H 310 | seq_tmp_ch EQU 04078H 311 | seq_tmp_fnum EQU 0407AH 312 | seq_tmp_note EQU 04077H 313 | seq_tmp_oct EQU 04079H 314 | seq_track EQU 049C4H 315 | seq_track_lp EQU 049D5H 316 | seq_tvp EQU 04E59H 317 | seq_use_ch EQU 04071H 318 | seq_venv EQU 04C71H 319 | seq_volume EQU 04C59H 320 | seq_wait EQU 04CC3H 321 | seq_work EQU 0407CH 322 | seq_work_end EQU 040A6H 323 | set_fmvol_ks EQU 0520BH 324 | set_fmvol_min EQU 05209H 325 | set_freq_ch_opl4 EQU 05165H 326 | set_nenv_head EQU 04EDEH 327 | set_nenv_hl EQU 04EE2H 328 | set_nenv_loop EQU 04ED8H 329 | set_note_fin EQU 04A58H 330 | set_page3_ch EQU 0484BH 331 | set_penv_head EQU 04EC9H 332 | set_penv_hl EQU 04ECDH 333 | set_penv_loop EQU 04EC3H 334 | set_venv_head EQU 04EB2H 335 | set_venv_hl EQU 04EB6H 336 | set_venv_loop EQU 04EACH 337 | skip_conv_midi_lp EQU 04F0AH 338 | skip_def_device EQU 0488CH 339 | skip_detune EQU 05063H 340 | skip_nenv_dec_oct EQU 04C11H 341 | skip_nenv_inc_oct EQU 04BE1H 342 | skip_set_fmvol EQU 051E4H 343 | skip_set_nega EQU 05052H 344 | skip_set_pitch EQU 0506BH 345 | skip_set_start_fm EQU 048B5H 346 | skip_sub_a EQU 050E7H 347 | slar_fm_on EQU 052DEH 348 | slar_opl4_on EQU 05346H 349 | sram_found EQU 05486H 350 | start_nenv EQU 04B75H 351 | start_penv EQU 04AE6H 352 | start_venv EQU 04AAEH 353 | str_moondrv EQU 04020H 354 | str_romchk EQU 053FCH 355 | tonesel_fin EQU 04FF0H 356 | tonesel_loadtone EQU 04FFCH 357 | tonesel_lp01 EQU 04FDCH 358 | tonesel_skip01 EQU 04FF3H 359 | tonesel_skip02 EQU 04FF4H 360 | write_data_cur_fm EQU 04CB3H 361 | -------------------------------------------------------------------------------- /moon_hoot.sym: -------------------------------------------------------------------------------- 1 | FM_BASECH EQU 00018H 2 | IDX_ADDR EQU 00007H 3 | IDX_AM EQU 00014H 4 | IDX_AR_D1R EQU 00011H 5 | IDX_BANK EQU 00006H 6 | IDX_CNT EQU 00004H 7 | IDX_DAMP EQU 0000EH 8 | IDX_DETUNE EQU 00020H 9 | IDX_DL_D2R EQU 00012H 10 | IDX_DSEL EQU 00000H 11 | IDX_EFX1 EQU 00003H 12 | IDX_FNUM EQU 0001BH 13 | IDX_KEY EQU 0000DH 14 | IDX_LFO EQU 0000FH 15 | IDX_LFO_VIB EQU 00010H 16 | IDX_LOOP EQU 00005H 17 | IDX_NENV EQU 00022H 18 | IDX_NENV_ADR EQU 00024H 19 | IDX_NOTE EQU 00015H 20 | IDX_OCT EQU 0001AH 21 | IDX_OLDAT1 EQU 00011H 22 | IDX_OPSEL EQU 00001H 23 | IDX_PAN EQU 0001FH 24 | IDX_PENV EQU 00023H 25 | IDX_PENV_ADR EQU 00026H 26 | IDX_PITCH EQU 00016H 27 | IDX_P_OFS EQU 00018H 28 | IDX_RC_RR EQU 00013H 29 | IDX_REVERB EQU 0001DH 30 | IDX_SYNTH EQU 00002H 31 | IDX_TADR EQU 00009H 32 | IDX_TONE EQU 0000BH 33 | IDX_VENV EQU 00021H 34 | IDX_VENV_ADR EQU 00028H 35 | IDX_VOL EQU 0001EH 36 | IDX_VOLOP EQU 0001DH 37 | MDB_ADRHI EQU 002F1H 38 | MDB_ADRLO EQU 002F3H 39 | MDB_ADRMI EQU 002F2H 40 | MDB_BASE EQU 002F0H 41 | MDB_LDFLAG EQU 002F0H 42 | MDB_RESULT EQU 002F4H 43 | MDB_ROM EQU 002F5H 44 | MDR_DSTPCM EQU 08030H 45 | MDR_ID EQU 08000H 46 | MDR_LASTS EQU 08033H 47 | MDR_PACKED EQU 0802AH 48 | MDR_PCMBANKS EQU 08032H 49 | MDR_STPCM EQU 08031H 50 | MOON_BASE EQU 000C4H 51 | MOON_DAT1 EQU 000C5H 52 | MOON_DAT2 EQU 000C7H 53 | MOON_HOOT EQU 00001H 54 | MOON_REG1 EQU 000C4H 55 | MOON_REG2 EQU 000C6H 56 | MOON_STAT EQU 000C4H 57 | MOON_VERNUM EQU 00002H 58 | MOON_WDAT EQU 0007FH 59 | MOON_WREG EQU 0007EH 60 | RAM_PAGE3 EQU 000FEH 61 | SEQ_WORKSIZE EQU 0002AH 62 | S_DEVICE_FLAGS EQU 08007H 63 | S_INST_TABLE EQU 08026H 64 | S_LFO_TABLE EQU 08024H 65 | S_LOOP_BANK EQU 08016H 66 | S_LOOP_TABLE EQU 08014H 67 | S_NENV_LOOP EQU 08022H 68 | S_NENV_TABLE EQU 08020H 69 | S_OPL3_TABLE EQU 08028H 70 | S_PENV_LOOP EQU 0801EH 71 | S_PENV_TABLE EQU 0801CH 72 | S_TRACK_BANK EQU 08012H 73 | S_TRACK_TABLE EQU 08010H 74 | S_VENV_LOOP EQU 0801AH 75 | S_VENV_TABLE EQU 08018H 76 | USE_CH EQU 0002AH 77 | add_freq_de EQU 05080H 78 | add_freq_nega EQU 05076H 79 | add_freq_offset EQU 0506AH 80 | add_hl_fin EQU 050E7H 81 | change_page3 EQU 04848H 82 | check_sram_start EQU 05470H 83 | comp_hl_de EQU 04B67H 84 | conv_data_to_midi EQU 04EF0H 85 | conv_midi_lp EQU 04EFDH 86 | drumbit_fnum_lp EQU 04CF4H 87 | drumbit_fnum_next EQU 04CFEH 88 | drumbit_set_fnum EQU 04D26H 89 | drumbit_skip_keyon EQU 04D1BH 90 | drumbit_with_length EQU 04D22H 91 | drumnote_fnum EQU 04D76H 92 | drumnote_lp EQU 04D66H 93 | drumnote_next EQU 04D70H 94 | fm_drum_fnum EQU 0482FH 95 | fm_drum_fnum_map EQU 04839H 96 | fm_drum_oct EQU 0483EH 97 | fm_fnumtbl EQU 047DAH 98 | fm_load_fnumtbl EQU 050ADH 99 | fm_op2reg_tbl EQU 0480BH 100 | fm_opbtbl EQU 0481DH 101 | fm_testtone EQU 047F4H 102 | fmtone_set_tvp EQU 04F75H 103 | fmtone_skip_set_fbs2 EQU 04F6CH 104 | freq_table EQU 054E4H 105 | get_a_table EQU 04865H 106 | get_hl_table EQU 04854H 107 | get_table EQU 0484FH 108 | get_table_hl_2de EQU 0485AH 109 | init_fmtone EQU 048D1H 110 | init_op4tone EQU 048F3H 111 | init_tone_fin EQU 04900H 112 | make_fnum EQU 04F13H 113 | make_fnum_lp EQU 04F16H 114 | moon_add_reg_ch EQU 05152H 115 | moon_calc_current_fmvol EQU 051EEH 116 | moon_calc_midinote EQU 05039H 117 | moon_calc_opl3note EQU 050A4H 118 | moon_calc_opl4freq EQU 05024H 119 | moon_check_rom EQU 053D0H 120 | moon_check_rom_lp EQU 053E4H 121 | moon_check_sram EQU 053FDH 122 | moon_fm1_out EQU 0511FH 123 | moon_fm2_out EQU 0512CH 124 | moon_inc_sram_adrs EQU 0539DH 125 | moon_init EQU 0404BH 126 | moon_init_all EQU 04038H 127 | moon_key_data EQU 05241H 128 | moon_key_data_damp_off EQU 05257H 129 | moon_key_data_lfo_on EQU 0524FH 130 | moon_key_fmfreq EQU 05375H 131 | moon_key_fmoff EQU 0525EH 132 | moon_key_fmon EQU 052C4H 133 | moon_key_off EQU 05258H 134 | moon_key_on EQU 052BEH 135 | moon_key_opl4off EQU 05277H 136 | moon_key_opl4on EQU 052EDH 137 | moon_key_write_fmfreq EQU 05345H 138 | moon_key_write_fmfreq_base EQU 0535AH 139 | moon_load_fmvol EQU 04F8EH 140 | moon_load_fmvol_lp EQU 04F96H 141 | moon_load_pcm EQU 0544DH 142 | moon_opl4_set_keyreg EQU 05327H 143 | moon_pcm_bank EQU 054E1H 144 | moon_pcm_bank_count EQU 054E0H 145 | moon_pcm_lastsize EQU 054E3H 146 | moon_pcm_numbanks EQU 054E2H 147 | moon_proc_tracks EQU 04982H 148 | moon_reset_sram_adrs EQU 0538DH 149 | moon_seq_all_keyoff EQU 0493CH 150 | moon_seq_all_release_fm EQU 04960H 151 | moon_seq_init EQU 04872H 152 | moon_set_adsr EQU 0520AH 153 | moon_set_fmnote EQU 05091H 154 | moon_set_fmop EQU 04FA5H 155 | moon_set_fmtone EQU 04F2FH 156 | moon_set_fmtone2 EQU 04F28H 157 | moon_set_fmtone_lp1 EQU 04F79H 158 | moon_set_fmtone_start_lp EQU 04F34H 159 | moon_set_fmvol_ch EQU 051B4H 160 | moon_set_fmvol_lp EQU 051CFH 161 | moon_set_freq_ch EQU 05158H 162 | moon_set_freq_ch_skip_reverb EQU 0517FH 163 | moon_set_midinote EQU 05084H 164 | moon_set_rr_ch_lp EQU 04968H 165 | moon_set_rr_op_lp EQU 0496FH 166 | moon_set_sram_adrs EQU 053B5H 167 | moon_set_vol_ch EQU 0519DH 168 | moon_tonesel EQU 04FCEH 169 | moon_wait EQU 05118H 170 | moon_wave_in EQU 05146H 171 | moon_wave_out EQU 05139H 172 | moon_wavechg_lp EQU 05318H 173 | moon_work_end EQU 04758H 174 | moon_work_start EQU 04068H 175 | moon_write_fm1 EQU 05113H 176 | moon_write_fm_ch EQU 05108H 177 | moon_write_fmop EQU 050D5H 178 | moon_write_fmop_1 EQU 050F5H 179 | moon_write_fmpan EQU 0528EH 180 | moon_write_fmpan_4op_fin EQU 052BDH 181 | moon_write_fmreg EQU 050F8H 182 | moon_write_fmreg_nch EQU 050FDH 183 | oct_div EQU 04F0AH 184 | oct_div_lp EQU 04F0DH 185 | pause_venv EQU 04E83H 186 | pcm_chk_last EQU 054B7H 187 | pcm_copy_bank EQU 054A0H 188 | pcm_copy_end EQU 054DAH 189 | pcm_copy_lp EQU 054C1H 190 | penv_fm_dec_oct EQU 04B4CH 191 | penv_fm_inc_oct EQU 04B57H 192 | penv_fm_inc_oct_lp EQU 04B5AH 193 | penv_fm_set_fnum EQU 04B43H 194 | piano_tone EQU 04761H 195 | proc_freq_reg EQU 04C20H 196 | proc_freq_to_moon EQU 04C2FH 197 | proc_nenv EQU 04B78H 198 | proc_nenv_fm EQU 04BB9H 199 | proc_nenv_fm_add EQU 04BC9H 200 | proc_nenv_fm_lp1 EQU 04BC0H 201 | proc_nenv_fm_nega EQU 04BF0H 202 | proc_nenv_fm_nega_lp1 EQU 04BF2H 203 | proc_nenv_fm_sub EQU 04BFBH 204 | proc_nenv_nega_opl4 EQU 04BADH 205 | proc_nenv_opl4 EQU 04B9CH 206 | proc_nenv_opl4_setnote EQU 04BA7H 207 | proc_nenv_start EQU 04B7EH 208 | proc_penv EQU 04AE9H 209 | proc_penv_end EQU 04B1DH 210 | proc_penv_fm EQU 04B20H 211 | proc_penv_opl4 EQU 04B0AH 212 | proc_penv_start EQU 04AEFH 213 | proc_tracks_end EQU 049B5H 214 | proc_tracks_lp EQU 0498EH 215 | proc_venv EQU 04AB1H 216 | proc_venv_end EQU 04AD2H 217 | proc_venv_reg EQU 04AD5H 218 | proc_venv_start EQU 04AB7H 219 | read_cmd_length EQU 04A5EH 220 | read_effect_table EQU 04E8BH 221 | read_effect_value EQU 04EE5H 222 | seq_all_keyoff_end EQU 0495FH 223 | seq_all_keyoff_lp EQU 04947H 224 | seq_bank EQU 04DEEH 225 | seq_ch1_addr EQU 0407BH 226 | seq_ch1_am EQU 04088H 227 | seq_ch1_ar_d1r EQU 04085H 228 | seq_ch1_bank EQU 0407AH 229 | seq_ch1_cnt EQU 04078H 230 | seq_ch1_damp EQU 04082H 231 | seq_ch1_detune EQU 04094H 232 | seq_ch1_dl_d2r EQU 04086H 233 | seq_ch1_dsel EQU 04074H 234 | seq_ch1_efx1 EQU 04077H 235 | seq_ch1_fnum EQU 0408FH 236 | seq_ch1_key EQU 04081H 237 | seq_ch1_lfo EQU 04083H 238 | seq_ch1_lfo_vib EQU 04084H 239 | seq_ch1_loop EQU 04079H 240 | seq_ch1_nenv EQU 04096H 241 | seq_ch1_nenv_adr EQU 04098H 242 | seq_ch1_note EQU 04089H 243 | seq_ch1_oct EQU 0408EH 244 | seq_ch1_opsel EQU 04075H 245 | seq_ch1_p_ofs EQU 0408CH 246 | seq_ch1_pan EQU 04093H 247 | seq_ch1_penv EQU 04097H 248 | seq_ch1_penv_adr EQU 0409AH 249 | seq_ch1_pitch EQU 0408AH 250 | seq_ch1_rc_rr EQU 04087H 251 | seq_ch1_reverb EQU 04091H 252 | seq_ch1_synth EQU 04076H 253 | seq_ch1_tadr EQU 0407DH 254 | seq_ch1_tone EQU 0407FH 255 | seq_ch1_venv EQU 04095H 256 | seq_ch1_venv_adr EQU 0409CH 257 | seq_ch1_vol EQU 04092H 258 | seq_cnt_zero EQU 049C7H 259 | seq_command EQU 049D9H 260 | seq_cur_bank EQU 0406BH 261 | seq_cur_ch EQU 04068H 262 | seq_damp EQU 04DFEH 263 | seq_damp_fin EQU 04E14H 264 | seq_damp_opl4 EQU 04E10H 265 | seq_data_write EQU 04C94H 266 | seq_detune EQU 04C75H 267 | seq_drum EQU 04CBFH 268 | seq_drumbit EQU 04CD5H 269 | seq_drumnote EQU 04D52H 270 | seq_fbs EQU 04E6AH 271 | seq_init_chan EQU 048A3H 272 | seq_init_chan_lp EQU 048B4H 273 | seq_init_fmbase EQU 04926H 274 | seq_init_fmbase_lp1 EQU 0492FH 275 | seq_inst EQU 04D97H 276 | seq_inst_fin EQU 04DC5H 277 | seq_inst_opl4 EQU 04DB7H 278 | seq_jmptable EQU 04A66H 279 | seq_jump EQU 04E7CH 280 | seq_jump_flag EQU 0406EH 281 | seq_ld2ops EQU 04E2AH 282 | seq_ld2ops_fm EQU 04E33H 283 | seq_lfosw EQU 04DE7H 284 | seq_loop EQU 04C37H 285 | seq_nenv EQU 04C88H 286 | seq_next EQU 049EEH 287 | seq_nop EQU 04C32H 288 | seq_note EQU 04A31H 289 | seq_note_fm EQU 04A3DH 290 | seq_note_opl4 EQU 04A46H 291 | seq_opsel EQU 0406CH 292 | seq_pan EQU 04DCBH 293 | seq_pan_fin EQU 04DE5H 294 | seq_pan_fm EQU 04DD2H 295 | seq_pan_opl4 EQU 04DE1H 296 | seq_penv EQU 04C7CH 297 | seq_reg_bd EQU 0406DH 298 | seq_rep_jmp EQU 04A23H 299 | seq_repeat_end EQU 049FFH 300 | seq_repeat_esc EQU 04A0CH 301 | seq_repeat_or_note EQU 049F7H 302 | seq_rest EQU 04C6EH 303 | seq_revbsw EQU 04E16H 304 | seq_setop EQU 04E23H 305 | seq_skip_1 EQU 04C34H 306 | seq_skip_rep_jmp EQU 04A19H 307 | seq_skip_set_repcnt_end EQU 04A0AH 308 | seq_skip_set_repcnt_esc EQU 04A17H 309 | seq_slar EQU 04E1DH 310 | seq_start_fm EQU 0406AH 311 | seq_tmp_ch EQU 04070H 312 | seq_tmp_fnum EQU 04072H 313 | seq_tmp_note EQU 0406FH 314 | seq_tmp_oct EQU 04071H 315 | seq_track EQU 049BCH 316 | seq_track_lp EQU 049CDH 317 | seq_tvp EQU 04E51H 318 | seq_use_ch EQU 04069H 319 | seq_venv EQU 04C69H 320 | seq_volume EQU 04C51H 321 | seq_wait EQU 04CBBH 322 | seq_work EQU 04074H 323 | seq_work_end EQU 0409EH 324 | set_fmvol_ks EQU 05203H 325 | set_fmvol_min EQU 05201H 326 | set_freq_ch_opl4 EQU 0515DH 327 | set_nenv_head EQU 04ED6H 328 | set_nenv_hl EQU 04EDAH 329 | set_nenv_loop EQU 04ED0H 330 | set_note_fin EQU 04A50H 331 | set_page3_ch EQU 04843H 332 | set_penv_head EQU 04EC1H 333 | set_penv_hl EQU 04EC5H 334 | set_penv_loop EQU 04EBBH 335 | set_venv_head EQU 04EAAH 336 | set_venv_hl EQU 04EAEH 337 | set_venv_loop EQU 04EA4H 338 | skip_conv_midi_lp EQU 04F02H 339 | skip_def_device EQU 04884H 340 | skip_detune EQU 0505BH 341 | skip_nenv_dec_oct EQU 04C09H 342 | skip_nenv_inc_oct EQU 04BD9H 343 | skip_set_fmvol EQU 051DCH 344 | skip_set_nega EQU 0504AH 345 | skip_set_pitch EQU 05063H 346 | skip_set_start_fm EQU 048ADH 347 | skip_sub_a EQU 050DFH 348 | slar_fm_on EQU 052D6H 349 | slar_opl4_on EQU 0533EH 350 | sram_found EQU 0547EH 351 | start_nenv EQU 04B6DH 352 | start_penv EQU 04ADEH 353 | start_venv EQU 04AA6H 354 | str_moondrv EQU 04020H 355 | str_romchk EQU 053F4H 356 | tonesel_fin EQU 04FE8H 357 | tonesel_loadtone EQU 04FF4H 358 | tonesel_lp01 EQU 04FD4H 359 | tonesel_skip01 EQU 04FEBH 360 | tonesel_skip02 EQU 04FECH 361 | write_data_cur_fm EQU 04CABH 362 | -------------------------------------------------------------------------------- /xcode/mmckc/mmckc.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 73185AE41C90F511008C2D7E /* datamake.c in Sources */ = {isa = PBXBuildFile; fileRef = 73185ADF1C90F511008C2D7E /* datamake.c */; }; 11 | 73185AE51C90F511008C2D7E /* file.c in Sources */ = {isa = PBXBuildFile; fileRef = 73185AE01C90F511008C2D7E /* file.c */; }; 12 | 73185AE61C90F511008C2D7E /* mckc.c in Sources */ = {isa = PBXBuildFile; fileRef = 73185AE11C90F511008C2D7E /* mckc.c */; }; 13 | 73185AE71C90F511008C2D7E /* strings.c in Sources */ = {isa = PBXBuildFile; fileRef = 73185AE21C90F511008C2D7E /* strings.c */; }; 14 | 73185AE81C90F511008C2D7E /* version.c in Sources */ = {isa = PBXBuildFile; fileRef = 73185AE31C90F511008C2D7E /* version.c */; }; 15 | /* End PBXBuildFile section */ 16 | 17 | /* Begin PBXCopyFilesBuildPhase section */ 18 | 73185AD31C90F4B8008C2D7E /* CopyFiles */ = { 19 | isa = PBXCopyFilesBuildPhase; 20 | buildActionMask = 2147483647; 21 | dstPath = /usr/share/man/man1/; 22 | dstSubfolderSpec = 0; 23 | files = ( 24 | ); 25 | runOnlyForDeploymentPostprocessing = 1; 26 | }; 27 | /* End PBXCopyFilesBuildPhase section */ 28 | 29 | /* Begin PBXFileReference section */ 30 | 73185AD51C90F4B8008C2D7E /* mmckc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = mmckc; sourceTree = BUILT_PRODUCTS_DIR; }; 31 | 73185ADF1C90F511008C2D7E /* datamake.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = datamake.c; sourceTree = ""; }; 32 | 73185AE01C90F511008C2D7E /* file.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = file.c; sourceTree = ""; }; 33 | 73185AE11C90F511008C2D7E /* mckc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mckc.c; sourceTree = ""; }; 34 | 73185AE21C90F511008C2D7E /* strings.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = strings.c; sourceTree = ""; }; 35 | 73185AE31C90F511008C2D7E /* version.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = version.c; sourceTree = ""; }; 36 | 73185AEB1C90F756008C2D7E /* test.mml */ = {isa = PBXFileReference; lastKnownFileType = text; path = test.mml; sourceTree = ""; }; 37 | 73185AEC1C90FD71008C2D7E /* test.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = test.h; sourceTree = ""; }; 38 | 73185AED1C90FE10008C2D7E /* mckc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mckc.h; sourceTree = ""; }; 39 | /* End PBXFileReference section */ 40 | 41 | /* Begin PBXFrameworksBuildPhase section */ 42 | 73185AD21C90F4B8008C2D7E /* Frameworks */ = { 43 | isa = PBXFrameworksBuildPhase; 44 | buildActionMask = 2147483647; 45 | files = ( 46 | ); 47 | runOnlyForDeploymentPostprocessing = 0; 48 | }; 49 | /* End PBXFrameworksBuildPhase section */ 50 | 51 | /* Begin PBXGroup section */ 52 | 73185ACC1C90F4B7008C2D7E = { 53 | isa = PBXGroup; 54 | children = ( 55 | 73185AE91C90F65D008C2D7E /* songs */, 56 | 73185AD71C90F4B8008C2D7E /* mmckc */, 57 | 73185AD61C90F4B8008C2D7E /* Products */, 58 | ); 59 | sourceTree = ""; 60 | }; 61 | 73185AD61C90F4B8008C2D7E /* Products */ = { 62 | isa = PBXGroup; 63 | children = ( 64 | 73185AD51C90F4B8008C2D7E /* mmckc */, 65 | ); 66 | name = Products; 67 | sourceTree = ""; 68 | }; 69 | 73185AD71C90F4B8008C2D7E /* mmckc */ = { 70 | isa = PBXGroup; 71 | children = ( 72 | 73185AED1C90FE10008C2D7E /* mckc.h */, 73 | 73185ADF1C90F511008C2D7E /* datamake.c */, 74 | 73185AE01C90F511008C2D7E /* file.c */, 75 | 73185AE11C90F511008C2D7E /* mckc.c */, 76 | 73185AE21C90F511008C2D7E /* strings.c */, 77 | 73185AE31C90F511008C2D7E /* version.c */, 78 | ); 79 | name = mmckc; 80 | path = ../../src/mmckc; 81 | sourceTree = ""; 82 | }; 83 | 73185AE91C90F65D008C2D7E /* songs */ = { 84 | isa = PBXGroup; 85 | children = ( 86 | 73185AEB1C90F756008C2D7E /* test.mml */, 87 | 73185AEC1C90FD71008C2D7E /* test.h */, 88 | ); 89 | name = songs; 90 | path = ../../songs; 91 | sourceTree = SOURCE_ROOT; 92 | }; 93 | /* End PBXGroup section */ 94 | 95 | /* Begin PBXNativeTarget section */ 96 | 73185AD41C90F4B8008C2D7E /* mmckc */ = { 97 | isa = PBXNativeTarget; 98 | buildConfigurationList = 73185ADC1C90F4B8008C2D7E /* Build configuration list for PBXNativeTarget "mmckc" */; 99 | buildPhases = ( 100 | 73185AD11C90F4B8008C2D7E /* Sources */, 101 | 73185AD21C90F4B8008C2D7E /* Frameworks */, 102 | 73185AD31C90F4B8008C2D7E /* CopyFiles */, 103 | ); 104 | buildRules = ( 105 | ); 106 | dependencies = ( 107 | ); 108 | name = mmckc; 109 | productName = mmckc; 110 | productReference = 73185AD51C90F4B8008C2D7E /* mmckc */; 111 | productType = "com.apple.product-type.tool"; 112 | }; 113 | /* End PBXNativeTarget section */ 114 | 115 | /* Begin PBXProject section */ 116 | 73185ACD1C90F4B8008C2D7E /* Project object */ = { 117 | isa = PBXProject; 118 | attributes = { 119 | LastUpgradeCheck = 0720; 120 | ORGANIZATIONNAME = bkc; 121 | TargetAttributes = { 122 | 73185AD41C90F4B8008C2D7E = { 123 | CreatedOnToolsVersion = 7.2.1; 124 | }; 125 | }; 126 | }; 127 | buildConfigurationList = 73185AD01C90F4B8008C2D7E /* Build configuration list for PBXProject "mmckc" */; 128 | compatibilityVersion = "Xcode 3.2"; 129 | developmentRegion = English; 130 | hasScannedForEncodings = 0; 131 | knownRegions = ( 132 | en, 133 | ); 134 | mainGroup = 73185ACC1C90F4B7008C2D7E; 135 | productRefGroup = 73185AD61C90F4B8008C2D7E /* Products */; 136 | projectDirPath = ""; 137 | projectRoot = ""; 138 | targets = ( 139 | 73185AD41C90F4B8008C2D7E /* mmckc */, 140 | ); 141 | }; 142 | /* End PBXProject section */ 143 | 144 | /* Begin PBXSourcesBuildPhase section */ 145 | 73185AD11C90F4B8008C2D7E /* Sources */ = { 146 | isa = PBXSourcesBuildPhase; 147 | buildActionMask = 2147483647; 148 | files = ( 149 | 73185AE81C90F511008C2D7E /* version.c in Sources */, 150 | 73185AE71C90F511008C2D7E /* strings.c in Sources */, 151 | 73185AE41C90F511008C2D7E /* datamake.c in Sources */, 152 | 73185AE61C90F511008C2D7E /* mckc.c in Sources */, 153 | 73185AE51C90F511008C2D7E /* file.c in Sources */, 154 | ); 155 | runOnlyForDeploymentPostprocessing = 0; 156 | }; 157 | /* End PBXSourcesBuildPhase section */ 158 | 159 | /* Begin XCBuildConfiguration section */ 160 | 73185ADA1C90F4B8008C2D7E /* Debug */ = { 161 | isa = XCBuildConfiguration; 162 | buildSettings = { 163 | ALWAYS_SEARCH_USER_PATHS = NO; 164 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 165 | CLANG_CXX_LIBRARY = "libc++"; 166 | CLANG_ENABLE_MODULES = YES; 167 | CLANG_ENABLE_OBJC_ARC = YES; 168 | CLANG_WARN_BOOL_CONVERSION = YES; 169 | CLANG_WARN_CONSTANT_CONVERSION = YES; 170 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 171 | CLANG_WARN_EMPTY_BODY = YES; 172 | CLANG_WARN_ENUM_CONVERSION = YES; 173 | CLANG_WARN_INT_CONVERSION = YES; 174 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 175 | CLANG_WARN_UNREACHABLE_CODE = YES; 176 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 177 | CODE_SIGN_IDENTITY = "-"; 178 | COPY_PHASE_STRIP = NO; 179 | DEBUG_INFORMATION_FORMAT = dwarf; 180 | ENABLE_STRICT_OBJC_MSGSEND = YES; 181 | ENABLE_TESTABILITY = YES; 182 | GCC_C_LANGUAGE_STANDARD = gnu99; 183 | GCC_DYNAMIC_NO_PIC = NO; 184 | GCC_NO_COMMON_BLOCKS = YES; 185 | GCC_OPTIMIZATION_LEVEL = 0; 186 | GCC_PREPROCESSOR_DEFINITIONS = ( 187 | "DEBUG=1", 188 | "$(inherited)", 189 | ); 190 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 191 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 192 | GCC_WARN_UNDECLARED_SELECTOR = YES; 193 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 194 | GCC_WARN_UNUSED_FUNCTION = YES; 195 | GCC_WARN_UNUSED_VARIABLE = YES; 196 | MACOSX_DEPLOYMENT_TARGET = 10.11; 197 | MTL_ENABLE_DEBUG_INFO = YES; 198 | ONLY_ACTIVE_ARCH = YES; 199 | SDKROOT = macosx; 200 | }; 201 | name = Debug; 202 | }; 203 | 73185ADB1C90F4B8008C2D7E /* Release */ = { 204 | isa = XCBuildConfiguration; 205 | buildSettings = { 206 | ALWAYS_SEARCH_USER_PATHS = NO; 207 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 208 | CLANG_CXX_LIBRARY = "libc++"; 209 | CLANG_ENABLE_MODULES = YES; 210 | CLANG_ENABLE_OBJC_ARC = YES; 211 | CLANG_WARN_BOOL_CONVERSION = YES; 212 | CLANG_WARN_CONSTANT_CONVERSION = YES; 213 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 214 | CLANG_WARN_EMPTY_BODY = YES; 215 | CLANG_WARN_ENUM_CONVERSION = YES; 216 | CLANG_WARN_INT_CONVERSION = YES; 217 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 218 | CLANG_WARN_UNREACHABLE_CODE = YES; 219 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 220 | CODE_SIGN_IDENTITY = "-"; 221 | COPY_PHASE_STRIP = NO; 222 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 223 | ENABLE_NS_ASSERTIONS = NO; 224 | ENABLE_STRICT_OBJC_MSGSEND = YES; 225 | GCC_C_LANGUAGE_STANDARD = gnu99; 226 | GCC_NO_COMMON_BLOCKS = YES; 227 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 228 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 229 | GCC_WARN_UNDECLARED_SELECTOR = YES; 230 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 231 | GCC_WARN_UNUSED_FUNCTION = YES; 232 | GCC_WARN_UNUSED_VARIABLE = YES; 233 | MACOSX_DEPLOYMENT_TARGET = 10.11; 234 | MTL_ENABLE_DEBUG_INFO = NO; 235 | SDKROOT = macosx; 236 | }; 237 | name = Release; 238 | }; 239 | 73185ADD1C90F4B8008C2D7E /* Debug */ = { 240 | isa = XCBuildConfiguration; 241 | buildSettings = { 242 | PRODUCT_NAME = "$(TARGET_NAME)"; 243 | }; 244 | name = Debug; 245 | }; 246 | 73185ADE1C90F4B8008C2D7E /* Release */ = { 247 | isa = XCBuildConfiguration; 248 | buildSettings = { 249 | PRODUCT_NAME = "$(TARGET_NAME)"; 250 | }; 251 | name = Release; 252 | }; 253 | /* End XCBuildConfiguration section */ 254 | 255 | /* Begin XCConfigurationList section */ 256 | 73185AD01C90F4B8008C2D7E /* Build configuration list for PBXProject "mmckc" */ = { 257 | isa = XCConfigurationList; 258 | buildConfigurations = ( 259 | 73185ADA1C90F4B8008C2D7E /* Debug */, 260 | 73185ADB1C90F4B8008C2D7E /* Release */, 261 | ); 262 | defaultConfigurationIsVisible = 0; 263 | defaultConfigurationName = Release; 264 | }; 265 | 73185ADC1C90F4B8008C2D7E /* Build configuration list for PBXNativeTarget "mmckc" */ = { 266 | isa = XCConfigurationList; 267 | buildConfigurations = ( 268 | 73185ADD1C90F4B8008C2D7E /* Debug */, 269 | 73185ADE1C90F4B8008C2D7E /* Release */, 270 | ); 271 | defaultConfigurationIsVisible = 0; 272 | }; 273 | /* End XCConfigurationList section */ 274 | }; 275 | rootObject = 73185ACD1C90F4B8008C2D7E /* Project object */; 276 | } 277 | -------------------------------------------------------------------------------- /ftbl600.inc: -------------------------------------------------------------------------------- 1 | dw $0000,$0000,$0000,$0001,$0001,$0002,$0002,$0003 ; $00 2 | dw $0003,$0004,$0004,$0005,$0005,$0006,$0006,$0006 ; $08 3 | dw $0007,$0007,$0008,$0008,$0009,$0009,$000A,$000A ; $10 4 | dw $000B,$000B,$000C,$000C,$000D,$000D,$000D,$000E ; $18 5 | dw $000E,$000F,$000F,$0010,$0010,$0011,$0011,$0012 ; $20 6 | dw $0012,$0013,$0013,$0014,$0014,$0015,$0015,$0015 ; $28 7 | dw $0016,$0016,$0017,$0017,$0018,$0018,$0019,$0019 ; $30 8 | dw $001A,$001A,$001B,$001B,$001C,$001C,$001D,$001D ; $38 9 | dw $001E,$001E,$001E,$001F,$001F,$0020,$0020,$0021 ; $40 10 | dw $0021,$0022,$0022,$0023,$0023,$0024,$0024,$0025 ; $48 11 | dw $0025,$0026,$0026,$0027,$0027,$0028,$0028,$0029 ; $50 12 | dw $0029,$0029,$002A,$002A,$002B,$002B,$002C,$002C ; $58 13 | dw $002D,$002D,$002E,$002E,$002F,$002F,$0030,$0030 ; $60 14 | dw $0031,$0031,$0032,$0032,$0033,$0033,$0034,$0034 ; $68 15 | dw $0035,$0035,$0036,$0036,$0037,$0037,$0038,$0038 ; $70 16 | dw $0038,$0039,$0039,$003A,$003A,$003B,$003B,$003C ; $78 17 | dw $003C,$003D,$003D,$003E,$003E,$003F,$003F,$0040 ; $80 18 | dw $0040,$0041,$0041,$0042,$0042,$0043,$0043,$0044 ; $88 19 | dw $0044,$0045,$0045,$0046,$0046,$0047,$0047,$0048 ; $90 20 | dw $0048,$0049,$0049,$004A,$004A,$004B,$004B,$004C ; $98 21 | dw $004C,$004D,$004D,$004E,$004E,$004F,$004F,$0050 ; $a0 22 | dw $0050,$0051,$0051,$0052,$0052,$0053,$0053,$0054 ; $a8 23 | dw $0054,$0055,$0055,$0056,$0056,$0057,$0057,$0058 ; $b0 24 | dw $0058,$0059,$0059,$005A,$005A,$005B,$005B,$005C ; $b8 25 | dw $005C,$005D,$005D,$005E,$005E,$005F,$005F,$0060 ; $c0 26 | dw $0060,$0061,$0061,$0062,$0062,$0063,$0063,$0064 ; $c8 27 | dw $0064,$0065,$0065,$0066,$0066,$0067,$0067,$0068 ; $d0 28 | dw $0068,$0069,$0069,$006A,$006A,$006B,$006B,$006C ; $d8 29 | dw $006C,$006D,$006D,$006E,$006E,$006F,$006F,$0070 ; $e0 30 | dw $0071,$0071,$0072,$0072,$0073,$0073,$0074,$0074 ; $e8 31 | dw $0075,$0075,$0076,$0076,$0077,$0077,$0078,$0078 ; $f0 32 | dw $0079,$0079,$007A,$007A,$007B,$007B,$007C,$007C ; $f8 33 | dw $007D,$007D,$007E,$007E,$007F,$007F,$0080,$0081 ; $100 34 | dw $0081,$0082,$0082,$0083,$0083,$0084,$0084,$0085 ; $108 35 | dw $0085,$0086,$0086,$0087,$0087,$0088,$0088,$0089 ; $110 36 | dw $0089,$008A,$008A,$008B,$008C,$008C,$008D,$008D ; $118 37 | dw $008E,$008E,$008F,$008F,$0090,$0090,$0091,$0091 ; $120 38 | dw $0092,$0092,$0093,$0093,$0094,$0094,$0095,$0096 ; $128 39 | dw $0096,$0097,$0097,$0098,$0098,$0099,$0099,$009A ; $130 40 | dw $009A,$009B,$009B,$009C,$009C,$009D,$009E,$009E ; $138 41 | dw $009F,$009F,$00A0,$00A0,$00A1,$00A1,$00A2,$00A2 ; $140 42 | dw $00A3,$00A3,$00A4,$00A4,$00A5,$00A6,$00A6,$00A7 ; $148 43 | dw $00A7,$00A8,$00A8,$00A9,$00A9,$00AA,$00AA,$00AB ; $150 44 | dw $00AB,$00AC,$00AD,$00AD,$00AE,$00AE,$00AF,$00AF ; $158 45 | dw $00B0,$00B0,$00B1,$00B1,$00B2,$00B3,$00B3,$00B4 ; $160 46 | dw $00B4,$00B5,$00B5,$00B6,$00B6,$00B7,$00B7,$00B8 ; $168 47 | dw $00B8,$00B9,$00BA,$00BA,$00BB,$00BB,$00BC,$00BC ; $170 48 | dw $00BD,$00BD,$00BE,$00BF,$00BF,$00C0,$00C0,$00C1 ; $178 49 | dw $00C1,$00C2,$00C2,$00C3,$00C3,$00C4,$00C5,$00C5 ; $180 50 | dw $00C6,$00C6,$00C7,$00C7,$00C8,$00C8,$00C9,$00CA ; $188 51 | dw $00CA,$00CB,$00CB,$00CC,$00CC,$00CD,$00CD,$00CE ; $190 52 | dw $00CF,$00CF,$00D0,$00D0,$00D1,$00D1,$00D2,$00D2 ; $198 53 | dw $00D3,$00D4,$00D4,$00D5,$00D5,$00D6,$00D6,$00D7 ; $1a0 54 | dw $00D7,$00D8,$00D9,$00D9,$00DA,$00DA,$00DB,$00DB ; $1a8 55 | dw $00DC,$00DC,$00DD,$00DE,$00DE,$00DF,$00DF,$00E0 ; $1b0 56 | dw $00E0,$00E1,$00E2,$00E2,$00E3,$00E3,$00E4,$00E4 ; $1b8 57 | dw $00E5,$00E5,$00E6,$00E7,$00E7,$00E8,$00E8,$00E9 ; $1c0 58 | dw $00E9,$00EA,$00EB,$00EB,$00EC,$00EC,$00ED,$00ED ; $1c8 59 | dw $00EE,$00EF,$00EF,$00F0,$00F0,$00F1,$00F1,$00F2 ; $1d0 60 | dw $00F3,$00F3,$00F4,$00F4,$00F5,$00F5,$00F6,$00F7 ; $1d8 61 | dw $00F7,$00F8,$00F8,$00F9,$00F9,$00FA,$00FB,$00FB ; $1e0 62 | dw $00FC,$00FC,$00FD,$00FD,$00FE,$00FF,$00FF,$0100 ; $1e8 63 | dw $0100,$0101,$0102,$0102,$0103,$0103,$0104,$0104 ; $1f0 64 | dw $0105,$0106,$0106,$0107,$0107,$0108,$0108,$0109 ; $1f8 65 | dw $010A,$010A,$010B,$010B,$010C,$010D,$010D,$010E ; $200 66 | dw $010E,$010F,$010F,$0110,$0111,$0111,$0112,$0112 ; $208 67 | dw $0113,$0114,$0114,$0115,$0115,$0116,$0117,$0117 ; $210 68 | dw $0118,$0118,$0119,$0119,$011A,$011B,$011B,$011C ; $218 69 | dw $011C,$011D,$011E,$011E,$011F,$011F,$0120,$0121 ; $220 70 | dw $0121,$0122,$0122,$0123,$0124,$0124,$0125,$0125 ; $228 71 | dw $0126,$0127,$0127,$0128,$0128,$0129,$0129,$012A ; $230 72 | dw $012B,$012B,$012C,$012C,$012D,$012E,$012E,$012F ; $238 73 | dw $012F,$0130,$0131,$0131,$0132,$0132,$0133,$0134 ; $240 74 | dw $0134,$0135,$0135,$0136,$0137,$0137,$0138,$0138 ; $248 75 | dw $0139,$013A,$013A,$013B,$013C,$013C,$013D,$013D ; $250 76 | dw $013E,$013F,$013F,$0140,$0140,$0141,$0142,$0142 ; $258 77 | dw $0143,$0143,$0144,$0145,$0145,$0146,$0146,$0147 ; $260 78 | dw $0148,$0148,$0149,$0149,$014A,$014B,$014B,$014C ; $268 79 | dw $014D,$014D,$014E,$014E,$014F,$0150,$0150,$0151 ; $270 80 | dw $0151,$0152,$0153,$0153,$0154,$0155,$0155,$0156 ; $278 81 | dw $0156,$0157,$0158,$0158,$0159,$0159,$015A,$015B ; $280 82 | dw $015B,$015C,$015D,$015D,$015E,$015E,$015F,$0160 ; $288 83 | dw $0160,$0161,$0162,$0162,$0163,$0163,$0164,$0165 ; $290 84 | dw $0165,$0166,$0167,$0167,$0168,$0168,$0169,$016A ; $298 85 | dw $016A,$016B,$016C,$016C,$016D,$016D,$016E,$016F ; $2a0 86 | dw $016F,$0170,$0171,$0171,$0172,$0172,$0173,$0174 ; $2a8 87 | dw $0174,$0175,$0176,$0176,$0177,$0177,$0178,$0179 ; $2b0 88 | dw $0179,$017A,$017B,$017B,$017C,$017D,$017D,$017E ; $2b8 89 | dw $017E,$017F,$0180,$0180,$0181,$0182,$0182,$0183 ; $2c0 90 | dw $0184,$0184,$0185,$0185,$0186,$0187,$0187,$0188 ; $2c8 91 | dw $0189,$0189,$018A,$018B,$018B,$018C,$018C,$018D ; $2d0 92 | dw $018E,$018E,$018F,$0190,$0190,$0191,$0192,$0192 ; $2d8 93 | dw $0193,$0194,$0194,$0195,$0195,$0196,$0197,$0197 ; $2e0 94 | dw $0198,$0199,$0199,$019A,$019B,$019B,$019C,$019D ; $2e8 95 | dw $019D,$019E,$019F,$019F,$01A0,$01A0,$01A1,$01A2 ; $2f0 96 | dw $01A2,$01A3,$01A4,$01A4,$01A5,$01A6,$01A6,$01A7 ; $2f8 97 | dw $01A8,$01A8,$01A9,$01AA,$01AA,$01AB,$01AC,$01AC ; $300 98 | dw $01AD,$01AE,$01AE,$01AF,$01B0,$01B0,$01B1,$01B1 ; $308 99 | dw $01B2,$01B3,$01B3,$01B4,$01B5,$01B5,$01B6,$01B7 ; $310 100 | dw $01B7,$01B8,$01B9,$01B9,$01BA,$01BB,$01BB,$01BC ; $318 101 | dw $01BD,$01BD,$01BE,$01BF,$01BF,$01C0,$01C1,$01C1 ; $320 102 | dw $01C2,$01C3,$01C3,$01C4,$01C5,$01C5,$01C6,$01C7 ; $328 103 | dw $01C7,$01C8,$01C9,$01C9,$01CA,$01CB,$01CB,$01CC ; $330 104 | dw $01CD,$01CD,$01CE,$01CF,$01CF,$01D0,$01D1,$01D1 ; $338 105 | dw $01D2,$01D3,$01D3,$01D4,$01D5,$01D5,$01D6,$01D7 ; $340 106 | dw $01D7,$01D8,$01D9,$01DA,$01DA,$01DB,$01DC,$01DC ; $348 107 | dw $01DD,$01DE,$01DE,$01DF,$01E0,$01E0,$01E1,$01E2 ; $350 108 | dw $01E2,$01E3,$01E4,$01E4,$01E5,$01E6,$01E6,$01E7 ; $358 109 | dw $01E8,$01E8,$01E9,$01EA,$01EB,$01EB,$01EC,$01ED ; $360 110 | dw $01ED,$01EE,$01EF,$01EF,$01F0,$01F1,$01F1,$01F2 ; $368 111 | dw $01F3,$01F3,$01F4,$01F5,$01F5,$01F6,$01F7,$01F8 ; $370 112 | dw $01F8,$01F9,$01FA,$01FA,$01FB,$01FC,$01FC,$01FD ; $378 113 | dw $01FE,$01FE,$01FF,$0200,$0201,$0201,$0202,$0203 ; $380 114 | dw $0203,$0204,$0205,$0205,$0206,$0207,$0207,$0208 ; $388 115 | dw $0209,$020A,$020A,$020B,$020C,$020C,$020D,$020E ; $390 116 | dw $020E,$020F,$0210,$0211,$0211,$0212,$0213,$0213 ; $398 117 | dw $0214,$0215,$0215,$0216,$0217,$0218,$0218,$0219 ; $3a0 118 | dw $021A,$021A,$021B,$021C,$021D,$021D,$021E,$021F ; $3a8 119 | dw $021F,$0220,$0221,$0221,$0222,$0223,$0224,$0224 ; $3b0 120 | dw $0225,$0226,$0226,$0227,$0228,$0229,$0229,$022A ; $3b8 121 | dw $022B,$022B,$022C,$022D,$022E,$022E,$022F,$0230 ; $3c0 122 | dw $0230,$0231,$0232,$0233,$0233,$0234,$0235,$0235 ; $3c8 123 | dw $0236,$0237,$0238,$0238,$0239,$023A,$023A,$023B ; $3d0 124 | dw $023C,$023D,$023D,$023E,$023F,$0240,$0240,$0241 ; $3d8 125 | dw $0242,$0242,$0243,$0244,$0245,$0245,$0246,$0247 ; $3e0 126 | dw $0247,$0248,$0249,$024A,$024A,$024B,$024C,$024D ; $3e8 127 | dw $024D,$024E,$024F,$024F,$0250,$0251,$0252,$0252 ; $3f0 128 | dw $0253,$0254,$0255,$0255,$0256,$0257,$0258,$0258 ; $3f8 129 | dw $0259,$025A,$025A,$025B,$025C,$025D,$025D,$025E ; $400 130 | dw $025F,$0260,$0260,$0261,$0262,$0263,$0263,$0264 ; $408 131 | dw $0265,$0266,$0266,$0267,$0268,$0268,$0269,$026A ; $410 132 | dw $026B,$026B,$026C,$026D,$026E,$026E,$026F,$0270 ; $418 133 | dw $0271,$0271,$0272,$0273,$0274,$0274,$0275,$0276 ; $420 134 | dw $0277,$0277,$0278,$0279,$027A,$027A,$027B,$027C ; $428 135 | dw $027D,$027D,$027E,$027F,$0280,$0280,$0281,$0282 ; $430 136 | dw $0283,$0283,$0284,$0285,$0286,$0286,$0287,$0288 ; $438 137 | dw $0289,$0289,$028A,$028B,$028C,$028C,$028D,$028E ; $440 138 | dw $028F,$028F,$0290,$0291,$0292,$0292,$0293,$0294 ; $448 139 | dw $0295,$0296,$0296,$0297,$0298,$0299,$0299,$029A ; $450 140 | dw $029B,$029C,$029C,$029D,$029E,$029F,$029F,$02A0 ; $458 141 | dw $02A1,$02A2,$02A2,$02A3,$02A4,$02A5,$02A6,$02A6 ; $460 142 | dw $02A7,$02A8,$02A9,$02A9,$02AA,$02AB,$02AC,$02AC ; $468 143 | dw $02AD,$02AE,$02AF,$02B0,$02B0,$02B1,$02B2,$02B3 ; $470 144 | dw $02B3,$02B4,$02B5,$02B6,$02B7,$02B7,$02B8,$02B9 ; $478 145 | dw $02BA,$02BA,$02BB,$02BC,$02BD,$02BE,$02BE,$02BF ; $480 146 | dw $02C0,$02C1,$02C1,$02C2,$02C3,$02C4,$02C5,$02C5 ; $488 147 | dw $02C6,$02C7,$02C8,$02C8,$02C9,$02CA,$02CB,$02CC ; $490 148 | dw $02CC,$02CD,$02CE,$02CF,$02D0,$02D0,$02D1,$02D2 ; $498 149 | dw $02D3,$02D3,$02D4,$02D5,$02D6,$02D7,$02D7,$02D8 ; $4a0 150 | dw $02D9,$02DA,$02DB,$02DB,$02DC,$02DD,$02DE,$02DF ; $4a8 151 | dw $02DF,$02E0,$02E1,$02E2,$02E3,$02E3,$02E4,$02E5 ; $4b0 152 | dw $02E6,$02E7,$02E7,$02E8,$02E9,$02EA,$02EB,$02EB ; $4b8 153 | dw $02EC,$02ED,$02EE,$02EF,$02EF,$02F0,$02F1,$02F2 ; $4c0 154 | dw $02F3,$02F3,$02F4,$02F5,$02F6,$02F7,$02F7,$02F8 ; $4c8 155 | dw $02F9,$02FA,$02FB,$02FB,$02FC,$02FD,$02FE,$02FF ; $4d0 156 | dw $02FF,$0300,$0301,$0302,$0303,$0303,$0304,$0305 ; $4d8 157 | dw $0306,$0307,$0308,$0308,$0309,$030A,$030B,$030C ; $4e0 158 | dw $030C,$030D,$030E,$030F,$0310,$0310,$0311,$0312 ; $4e8 159 | dw $0313,$0314,$0315,$0315,$0316,$0317,$0318,$0319 ; $4f0 160 | dw $0319,$031A,$031B,$031C,$031D,$031E,$031E,$031F ; $4f8 161 | dw $0320,$0321,$0322,$0323,$0323,$0324,$0325,$0326 ; $500 162 | dw $0327,$0327,$0328,$0329,$032A,$032B,$032C,$032C ; $508 163 | dw $032D,$032E,$032F,$0330,$0331,$0331,$0332,$0333 ; $510 164 | dw $0334,$0335,$0336,$0336,$0337,$0338,$0339,$033A ; $518 165 | dw $033B,$033B,$033C,$033D,$033E,$033F,$0340,$0340 ; $520 166 | dw $0341,$0342,$0343,$0344,$0345,$0345,$0346,$0347 ; $528 167 | dw $0348,$0349,$034A,$034B,$034B,$034C,$034D,$034E ; $530 168 | dw $034F,$0350,$0350,$0351,$0352,$0353,$0354,$0355 ; $538 169 | dw $0356,$0356,$0357,$0358,$0359,$035A,$035B,$035B ; $540 170 | dw $035C,$035D,$035E,$035F,$0360,$0361,$0361,$0362 ; $548 171 | dw $0363,$0364,$0365,$0366,$0367,$0367,$0368,$0369 ; $550 172 | dw $036A,$036B,$036C,$036D,$036D,$036E,$036F,$0370 ; $558 173 | dw $0371,$0372,$0373,$0373,$0374,$0375,$0376,$0377 ; $560 174 | dw $0378,$0379,$0379,$037A,$037B,$037C,$037D,$037E ; $568 175 | dw $037F,$0380,$0380,$0381,$0382,$0383,$0384,$0385 ; $570 176 | dw $0386,$0386,$0387,$0388,$0389,$038A,$038B,$038C ; $578 177 | dw $038D,$038D,$038E,$038F,$0390,$0391,$0392,$0393 ; $580 178 | dw $0394,$0394,$0395,$0396,$0397,$0398,$0399,$039A ; $588 179 | dw $039B,$039B,$039C,$039D,$039E,$039F,$03A0,$03A1 ; $590 180 | dw $03A2,$03A2,$03A3,$03A4,$03A5,$03A6,$03A7,$03A8 ; $598 181 | dw $03A9,$03AA,$03AA,$03AB,$03AC,$03AD,$03AE,$03AF ; $5a0 182 | dw $03B0,$03B1,$03B2,$03B2,$03B3,$03B4,$03B5,$03B6 ; $5a8 183 | dw $03B7,$03B8,$03B9,$03BA,$03BA,$03BB,$03BC,$03BD ; $5b0 184 | dw $03BE,$03BF,$03C0,$03C1,$03C2,$03C3,$03C3,$03C4 ; $5b8 185 | dw $03C5,$03C6,$03C7,$03C8,$03C9,$03CA,$03CB,$03CB ; $5c0 186 | dw $03CC,$03CD,$03CE,$03CF,$03D0,$03D1,$03D2,$03D3 ; $5c8 187 | dw $03D4,$03D5,$03D5,$03D6,$03D7,$03D8,$03D9,$03DA ; $5d0 188 | dw $03DB,$03DC,$03DD,$03DE,$03DE,$03DF,$03E0,$03E1 ; $5d8 189 | dw $03E2,$03E3,$03E4,$03E5,$03E6,$03E7,$03E8,$03E9 ; $5e0 190 | dw $03E9,$03EA,$03EB,$03EC,$03ED,$03EE,$03EF,$03F0 ; $5e8 191 | dw $03F1,$03F2,$03F3,$03F4,$03F4,$03F5,$03F6,$03F7 ; $5f0 192 | dw $03F8,$03F9,$03FA,$03FB,$03FC,$03FD,$03FE,$03FF ; $5f8 193 | -------------------------------------------------------------------------------- /doc/img/cnt/cnt0.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 32 | 37 | 38 | 46 | 51 | 52 | 60 | 65 | 66 | 74 | 79 | 80 | 88 | 93 | 94 | 102 | 107 | 108 | 116 | 121 | 122 | 130 | 135 | 136 | 144 | 149 | 150 | 158 | 163 | 164 | 165 | 186 | 191 | 192 | 194 | 195 | 197 | image/svg+xml 198 | 200 | 201 | 202 | 203 | 204 | 208 | 210 | 217 | OP1 228 | 229 | 236 | OP2 247 | P1 258 | P2 269 | 275 | 281 | 286 | 291 | 297 | OUT 308 | 309 | 310 | -------------------------------------------------------------------------------- /moon_loader.asm: -------------------------------------------------------------------------------- 1 | ;********************************************* 2 | ; MoonDriver for MoonSound / Programmed by BKC 3 | ;********************************************* 4 | ; 5 | ; 2007/04/17 6 | ; 7 | ; * Started 8 | ; 9 | ; 2007/04/23 10 | ; 11 | ; * First version 12 | ; 13 | ; 2007/04/24 14 | ; 15 | ; * Fixed volume after used envelope 16 | ; * Fixed tone length 17 | ; 18 | ; 2007/04/28 19 | ; 20 | ; * Fixed a part to read value of instrument command 21 | ; * Removed a part to store volume reg for env processes 22 | ; * Fixed set note routine to use envelope's value at start if needed 23 | ; * Improved to use ADSR registers 24 | ; * Added to use LFO 25 | ; 26 | ; 2007/04/30 27 | ; 28 | ; * Fixed effect on when detune is zero 29 | ; * Added damp (command $eb) 30 | ; * Don't Key-Off if not Key-On 31 | ; * Fixed an assign of PCM-MIX bit for key 32 | ; 33 | ; 2007/05/01 34 | ; 35 | ; * Fixed repeat command to work 36 | ; * Added pseudo reverb (cmd $ea) 37 | ; 38 | ; 2007/05/05 39 | ; 40 | ; * First release 41 | ; 42 | ; 2007/05/12 43 | ; 44 | ; * Added repeat_end command 45 | ; 46 | ; 2007/05/14 47 | ; 48 | ; * Added FM stuff temporarily 49 | ; 50 | ; 2007/05/16 51 | ; 52 | ; * Added a part to initialize opbase for OPL3 53 | ; * Added FBS and TVP values to tone define 54 | ; * Added Pitch Envelope and detune to OPL3 part 55 | ; 56 | ; 2007/05/18 57 | ; 58 | ; * Added FBS2 to OPL3 tone 59 | ; * Changed FBS to FB 60 | ; * Added Volume to OPL3 61 | ; 62 | ; 2007/05/19 63 | ; 64 | ; * Changed FM volume to subtract from register's value 65 | ; 66 | ; 2007/05/20 67 | ; 68 | ; * Changed calculation for FM volume. 69 | ; * Improved Key-On problem in pitch envelope on FM 70 | ; * Changed first charactor in the history. 71 | ; * Changed 4OP stuff 72 | 73 | ; 2007/05/24 74 | ; 75 | ; * Added device selector for initialize 76 | ; 77 | ; 2007/05/26 78 | ; 79 | ; * Rewritten a part of the source cleaner 80 | ; * Added Note Envelope to OPL3 81 | ; * Fixed minor bug 82 | ; * Improved Pitch Envelope for OPL3 to be over an octave 83 | ; * Added slar 84 | ; 85 | ; 2007/05/27 86 | ; 87 | ; * Changed slar effect on OPL4 88 | ; 89 | ; 2007/05/28 90 | ; 91 | ; * Changed Pitch Envelope effect on OPL3 92 | ; 93 | ; 2007/05/31 94 | ; 95 | ; * Fixed OPL4 Pitch correction when slar is used 96 | ; * Added a routine to check the file valid 97 | ; * Changed the way to handle timing 98 | ; * Fixed the way to wait a loading tone in OPL4 99 | ; * Changed handling of EXPANSION REGISTER 100 | ; * Optimized some routines 101 | ; 102 | ; 2007/06/01 103 | ; 104 | ; * Changed some way to make a value for register 105 | ; 106 | ; 2007/07/01 107 | ; 108 | ; * Changed version number for release 109 | ; 110 | ; 2015/01/30 111 | ; 112 | ; * Separates driver from loader. 113 | ; 114 | ; 2015/02/02 115 | ; 116 | ; * Improved usability of driver code. 117 | ; 118 | ; 2015/03/01 119 | ; 120 | ; * Changed to load MOON.BIN from disk 121 | ; * Improved strings for infomation 122 | ; 123 | ; 2016/02/05 124 | ; 125 | ; * try to load song file without extension. 126 | ; 127 | ; 128 | ;******************************************** 129 | ; Memory usage 130 | ; Page 0 ( $0000 - $3FFF ) : Utility 131 | ; Page 1 ( $4000 - $7FFF ) : Driver 132 | ; Page 2 ( $8000 - $BFFF ) : Data 133 | ; 134 | ; Note for developers 135 | ; 136 | ; * Please don't forget to remount the folder if the program has been updated 137 | ; * DOS gets back mapper RAM when called via BDOS 138 | ; 139 | ; Note on the OPL4 140 | ; You can change F-num and octave after key-on 141 | ; 142 | ;******************************************** 143 | 144 | BDOS: equ $0005 145 | FCB: equ $005C 146 | 147 | MOON_BASE: equ $00C4 148 | 149 | MDRV_INIT: equ $4000 150 | MDRV_INT: equ $4003 151 | MDRV_ALLOFF: equ $4006 152 | MDRV_VERSTR: equ $4011 153 | MDRV_LOADPCM: equ $4013 154 | 155 | RAM_PAGE3: equ $FE 156 | 157 | MDR_ID: equ $8000 158 | MDR_PACKED: equ $802A ; 1 if packed 159 | 160 | MDR_DSTPCM: equ $8030 ; destination address of PCM 161 | MDR_STPCM: equ $8031 ; PCM start bank 162 | MDR_BANKS: equ $8032 ; PCM banks 163 | MDR_LASTS: equ $8033 ; PCM size of lastbank 164 | 165 | ;******************************************** 166 | ; Entry point 167 | 168 | org $100 169 | jp x86_trap ; a trap for x86 170 | 171 | x86_trap: 172 | 173 | ; displays program title. 174 | ld de, str_prog_title 175 | ld c, $09 176 | call BDOS 177 | 178 | ; check MoonSound and initalize it 179 | 180 | call check_moon 181 | jr nz, found_moon 182 | 183 | ; MoonSound is not found 184 | 185 | ld de, str_moon_not 186 | ld c,$09 187 | jp BDOS 188 | 189 | found_moon: 190 | 191 | ; MoonSound is found 192 | 193 | ld de, str_moon_fnd 194 | ld c, $09 195 | call BDOS 196 | 197 | ; Load driver 198 | call load_driver 199 | or a 200 | jr nz, file_error 201 | 202 | ld hl, MDRV_VERSTR 203 | ld e, (hl) 204 | inc hl 205 | ld d, (hl) 206 | 207 | ; skip if DE = 0x0000 208 | ld a, e 209 | or d 210 | jr z, skip_verstr 211 | 212 | ld c, $09 213 | call BDOS 214 | 215 | skip_verstr: 216 | 217 | ; load song 218 | call load_file 219 | or a 220 | jr nz, file_error 221 | 222 | jr main_check_file 223 | 224 | ; failed 225 | file_error: 226 | ld de, str_file_error 227 | ld c, $09 228 | jp BDOS 229 | 230 | main_check_file: 231 | 232 | ld de, str_check 233 | call out_str 234 | 235 | call check_file 236 | jp nz, check_ng 237 | 238 | ; ok 239 | ld de, str_ok 240 | call out_str 241 | call out_lf 242 | jp start_play 243 | 244 | check_ng: 245 | ld de, str_format_error 246 | jp out_str 247 | 248 | 249 | ;******************************************** 250 | ; load_pcm 251 | ; Load user pcm 252 | ; 253 | load_pcm: 254 | xor a 255 | call change_page3 256 | ld a, (MDR_PACKED) 257 | or a 258 | ret z 259 | ld de, str_loading_pcm 260 | call out_str 261 | 262 | ; load pcm 263 | call MDRV_LOADPCM 264 | 265 | ld de, str_ok 266 | call out_str 267 | jp out_lf 268 | 269 | ;******************************************** 270 | ;start_play 271 | ;Initialize workarea 272 | ; 273 | start_play: 274 | call load_pcm 275 | 276 | call MDRV_INIT 277 | 278 | xor a 279 | ld (intr_cnt), a 280 | call set_timi ; set timer 281 | 282 | ld de, str_play 283 | call out_str 284 | 285 | ; enable interrupt 286 | ei 287 | 288 | start_play_lp1: 289 | ; check key 290 | 291 | ld c,$0b 292 | call BDOS 293 | or a 294 | jr nz,start_play_fin ; if key was pressed then quit 295 | 296 | ld a, (intr_cnt) 297 | or a 298 | jr z,start_play_lp1 299 | 300 | start_play_lp2: 301 | call MDRV_INT 302 | ld a, (intr_cnt) 303 | dec a 304 | ld (intr_cnt), a 305 | jr z, start_play_lp1 306 | jr start_play_lp2 307 | 308 | start_play_fin: 309 | call restore_timi ; restore timer 310 | jp MDRV_ALLOFF 311 | 312 | ;******************************************** 313 | ;check_file 314 | ; check the file format is valid 315 | check_file: 316 | ld hl, $8000 317 | ld de, str_file_id 318 | ld c, $4 319 | xor a 320 | call change_page3 321 | 322 | check_file_lp: 323 | ld a,(de) 324 | cp (hl) 325 | ret nz 326 | inc hl 327 | inc de 328 | dec c 329 | jr nz,check_file_lp 330 | ret 331 | 332 | 333 | 334 | ;******************************************** 335 | ; load_file 336 | ; Load sequence file from disk 337 | ; in : FCB ( a parameter from DOS ) 338 | ; out : Z = success 339 | ; dest : DE 340 | 341 | load_file: 342 | ld de, str_loading_song 343 | call out_str 344 | 345 | ; try with fullname 346 | ld de, FCB 347 | ld c, $0f ; file open 348 | call BDOS 349 | or a 350 | jr z, load_file_start 351 | 352 | ; with .MDR extension 353 | ld hl, str_mdrext 354 | ld de, FCB + 9 355 | ld bc, $0003 356 | ldir 357 | 358 | ; open.. 359 | ld de, FCB 360 | ld c, $0f ; file open 361 | call BDOS 362 | or a 363 | ; failed if nz 364 | ret nz 365 | 366 | load_file_start: 367 | ld de, dos_dta 368 | ld c, $1a ; set DTA 369 | call BDOS 370 | 371 | ; song start address 372 | ld hl, $8000 373 | xor a 374 | ld (loaded_bank), a 375 | load_file_lp01: 376 | 377 | push hl 378 | ld de, FCB 379 | ld c, $14 ; sequencial read 380 | call BDOS 381 | pop hl 382 | 383 | push af 384 | ld a, (loaded_bank) 385 | call change_page3 386 | ex de, hl 387 | ld hl, dos_dta 388 | ld bc, $0080 389 | ldir 390 | ex de, hl 391 | pop af 392 | 393 | or a 394 | jr nz, load_file_eof 395 | ld a, h 396 | cp $c0 397 | jr c, load_file_lp01 ; hl >= $c000 398 | 399 | 400 | ld hl, $8000 401 | ld a, (loaded_bank) 402 | add a, $02 403 | ld (loaded_bank), a 404 | 405 | jr load_file_lp01 406 | 407 | load_file_eof: 408 | ld de, str_ok 409 | call out_str 410 | call out_lf 411 | 412 | ld de, FCB 413 | ld c, $10 ; close 414 | jp BDOS 415 | 416 | 417 | ;******************************************** 418 | ; load_driver 419 | ; dest : DE 420 | ; out : Z = success 421 | 422 | load_driver: 423 | ld de, str_loading_driver 424 | ld c, $09 ; output string 425 | call BDOS 426 | 427 | ld de, driver_fcb 428 | ld c, $0f ; file open 429 | call BDOS 430 | or a 431 | ret nz 432 | 433 | ld de, dos_dta 434 | ld c, $1a ; set DTA 435 | call BDOS 436 | 437 | ; song start address 438 | ld hl, $4000 439 | load_driver_lp01: 440 | push hl 441 | ld de, driver_fcb 442 | ld c, $14 ; sequencial read 443 | call BDOS 444 | pop hl 445 | 446 | push af 447 | ex de, hl 448 | ld hl, dos_dta 449 | ld bc, $0080 450 | ldir 451 | ex de, hl 452 | pop af 453 | 454 | or a 455 | jr nz, load_driver_eof 456 | ld a, h 457 | cp $80 458 | jr c, load_driver_lp01 ; hl >= $8000 459 | 460 | load_driver_eof: 461 | ld de, str_ok 462 | call out_str 463 | call out_lf 464 | 465 | ld de, driver_fcb 466 | ld c, $10 ; close 467 | jp BDOS 468 | 469 | 470 | ;******************************************** 471 | ; changes page3 472 | ; in : A = bank number(0 = start of song file) 473 | ; dest : AF 474 | change_page3: 475 | 476 | srl a 477 | add a, $04 ; The system uses 4pages for initial work area 478 | out (RAM_PAGE3), a 479 | ret 480 | 481 | ;////////////////////////////////////// 482 | ; routines for debugging 483 | ;////////////////////////////////////// 484 | 485 | ;******************************************** 486 | ; out_str 487 | ; output string 488 | ; in : DE = string 489 | ; dest: all 490 | out_str: 491 | ld c, $09 ; output string 492 | jp BDOS 493 | 494 | ;******************************************** 495 | ; out_ch 496 | ; output a charactor 497 | ; in : A = char 498 | ; 499 | out_ch: 500 | push de 501 | push bc 502 | ld e,a 503 | ld c,2 504 | call BDOS 505 | pop bc 506 | pop de 507 | ret 508 | 509 | ;******************************************** 510 | ; output LF control 511 | ; 512 | out_lf: 513 | ld a, $0d 514 | call out_ch 515 | ld a, $0a 516 | jp out_ch 517 | 518 | ;******************************************** 519 | ; display a hex 520 | ; in : A = num 521 | ; dest : AF 522 | 523 | disp_hex: 524 | push hl 525 | push de 526 | push af 527 | rra 528 | rra 529 | rra 530 | rra 531 | and $0f 532 | 533 | ld d,$00 534 | ld e,a 535 | ld hl,str_hextbl 536 | add hl,de 537 | 538 | ld a,(hl) 539 | call out_ch 540 | 541 | pop af 542 | and $0f 543 | ld d,$00 544 | ld e,a 545 | ld hl,str_hextbl 546 | add hl,de 547 | ld a,(hl) 548 | call out_ch 549 | 550 | pop de 551 | pop hl 552 | ret 553 | 554 | 555 | ;******************************************** 556 | ; check MoonSound and initialize it 557 | ; out : NZ if MoonSound is found 558 | ; 559 | check_moon: 560 | in a, (MOON_BASE) 561 | cp $ff 562 | ret 563 | 564 | PG2RAM: equ $F342 565 | H_TIMI: equ $FD9F 566 | 567 | 568 | ;******************************************** 569 | ; set_timi 570 | ; hook to use an user interrupt routine 571 | ; 572 | set_timi: 573 | ld bc, $05 574 | ld hl, H_TIMI 575 | ld de, save_hook 576 | ldir 577 | 578 | di 579 | ld a, $f7 ; rst30 580 | ld (H_TIMI), a 581 | 582 | ld a, (PG2RAM) 583 | ld (H_TIMI + 1), a ; slot on RAM in page2 584 | ; use my interrupt routine 585 | ld hl, userint 586 | ld a, l 587 | ld (H_TIMI + 2), a 588 | ld a, h 589 | ld (H_TIMI + 3), a 590 | ei 591 | ret 592 | 593 | ;******************************************** 594 | ; restore_timi 595 | ; restore interrupt 596 | ; dest : AF, BC, DE, HL 597 | restore_timi: 598 | di 599 | ld bc, $05 600 | ld de, H_TIMI 601 | ld hl, save_hook 602 | ldir 603 | ei 604 | ret 605 | 606 | save_hook: 607 | ds $05 608 | 609 | 610 | ;******************************************** 611 | ; userint 612 | ; User interrupt routine for H_TIMI. 613 | 614 | userint: 615 | push hl 616 | push de 617 | push bc 618 | push af 619 | exx 620 | ex af,af' 621 | push hl 622 | push de 623 | push bc 624 | push af 625 | push iy 626 | push ix 627 | 628 | 629 | call intr_inc_cnt 630 | 631 | usrint_end: 632 | pop ix 633 | pop iy 634 | pop af 635 | pop bc 636 | pop de 637 | pop hl 638 | ex af,af' 639 | exx 640 | pop af 641 | pop bc 642 | pop de 643 | pop hl 644 | ret 645 | 646 | ;******************************************** 647 | intr_cnt: 648 | db $00 649 | 650 | loaded_bank: 651 | db $00 652 | 653 | 654 | intr_inc_cnt: 655 | ld a, (intr_cnt) 656 | inc a 657 | ld (intr_cnt), a 658 | ret 659 | 660 | 661 | ;******** 662 | ; FCB to load "MOON.BIN" 663 | driver_fcb: 664 | db $00 ; drive 665 | db "MOON " ; file 666 | db "BIN" ; ext 667 | ds $19 668 | 669 | 670 | 671 | 672 | ;******************************************** 673 | ; Strings 674 | str_prog_title: 675 | db "MOONLOADER " 676 | db "VER 160305" 677 | db $0d,$0a,'$' 678 | 679 | str_moon_fnd: 680 | db "MOONSOUND DETECTED",$0d,$0a,'$' 681 | 682 | str_moon_not: 683 | db "MOONSOUND IS NOT FOUND",$0d,$0a,'$' 684 | 685 | str_loading_song: 686 | db "LOADING SONG...",'$' 687 | 688 | str_loading_driver: 689 | db "LOADING DRIVER...",'$' 690 | 691 | str_loading_pcm: 692 | db "LOADING PCM...",'$' 693 | 694 | str_lf: 695 | db $0d,$0a,'$' 696 | 697 | str_ok: 698 | db "OK",'$' 699 | 700 | str_ng: 701 | db "NG",'$' 702 | 703 | str_check: 704 | db "CHECK ",'$' 705 | 706 | 707 | str_play: 708 | db "PLAY",$0d,$0a,'$' 709 | str_ram_error: 710 | db "RAM ERROR",$0d,$0a,'$' 711 | str_file_error: 712 | db "FILE ERROR",$0d,$0a,'$' 713 | str_format_error: 714 | db "FILE FORMAT ERROR",$0d,$0a,'$' 715 | 716 | str_hextbl: 717 | db "0123456789ABCDEF" 718 | 719 | str_mdrext: 720 | db "MDR" 721 | 722 | str_file_id: 723 | db "MDRV" 724 | 725 | 726 | dos_dta: 727 | ds $80 728 | --------------------------------------------------------------------------------