├── 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 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
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 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
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 | | |  |  |  |  |
21 |
22 |
23 | | WS | 4 | 5 | 6 | 7 |
24 | | -- | ---------------------- | ---------------------- | ---------------------- | ---------------------- |
25 | | |  |  |  |  |
26 |
27 | ## CNT 2OP
28 |
29 | | CNT | 0 | 1 |
30 | | --- | ------------------------- | ------------------------- |
31 | | |  |  |
32 |
33 | ## CNT 4OP
34 |
35 | | CNT | |
36 | | --- | -------------------------------- |
37 | | 00 |  |
38 | | 01 |  |
39 | | 10 |  |
40 | | 11 |  |
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 |
123 |
--------------------------------------------------------------------------------
/doc/img/ws/ws1.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
128 |
--------------------------------------------------------------------------------
/doc/img/ws/ws6.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
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 |
139 |
--------------------------------------------------------------------------------
/doc/img/ws/ws2.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
139 |
--------------------------------------------------------------------------------
/doc/img/ws/ws0.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
140 |
--------------------------------------------------------------------------------
/doc/img/ws/ws5.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
139 |
--------------------------------------------------------------------------------
/doc/img/ws/ws4.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
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 |
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 |
--------------------------------------------------------------------------------