home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 5
/
FREESOFT.BIN
/
fb386
/
fmbed
/
fmbed.bas
next >
Wrap
BASIC Source File
|
1992-08-19
|
59KB
|
1,676 lines
10000 DATA " _________________________________________________________ "
10010 DATA " FMBED Ver1.06 1992/01/26 Copyright(c) TETSU 1992- "
10020 DATA " FileName=「FMBED.BAS」 "
10030 DATA " for FM-TOWNS 要2MbyteRAM "
10040 DATA " F-BASIC386 V1.1L20 以降用 "
10050 DATA " カレントディレクトリに「mtrnsm.rex」が必要 "
10060 DATA " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "
10070 *INIT
10080 SCREEN@ 0: COLOR 7,0,7,0: WIDTH 80,25: CONSOLE 0,24,0: CLS 4
10090 PAL=0: FOR I=0 TO 15: PALETTE I,[PAL,PAL,PAL]: NEXT I
10100 COLOR 7,0,7,1: RESTORE
10110 FOR I=0 TO 6: READ I$: LOCATE 11,7+I: PRINT I$;: NEXT I
10120 COLOR 7,0,7,0
10130 A$="*INIT" :GOSUB *INIT_PR
10140 CLEAR ,,512,400000,1000
10150 DEFLNG A-Z: PAL=0
10160 'FREQCTL= 0: LOADM "freqctl.rex",FREQCTL
10170 MTRNSM =300: LOADM "mtrnsm.rex" ,MTRNSM
10180 WINDOW(0,0)-(1023,511)
10190 VIEW (0,0)-(1023,511)
10200 LINE (0,0)-(639,479),PSET,%7,BF
10210 DEF FNVRAM(X,Y)=INT((INT((X+8)/8)*(Y+1)*4+2-1)/2)
10220 DIM P1$(4),P2$(4,5),V%(23)
10230 P1$(0)="C4E4G4C4,R2R4E4,R2R4G4"
10240 P1$(1)="L16CDEFGAB>C<BAGFEDC"
10250 P1$(2)="C,E,G"
10260 P1$(3)=""
10270 P1$(4)=""
10280 VOL=64: AT=0
10290 PI!=3.14159!/2
10300 LOADWX =160: LOADWY =180: FILE$ =""
10310 SAVEWX =160: SAVEWY =180
10320 ERRWX =220: ERRWY =180
10330 EXITWX =220: EXITWY =180
10340 PLAYWX =110: PLAYWY =180
10350 LFOWX =160: LFOWY =180
10360 KX = 11: KY =425
10370 LFO=4
10380 'CALLM FREQCTL,LFO
10390 FOR I=0 TO 5: PART I,I: NEXT I
10400 BGM 1
10410 '
10420 A$="*BOX" :GOSUB *INIT_PR: GOSUB *BOX
10430 A$="*BAR_GET" :GOSUB *INIT_PR: GOSUB *BAR_GET
10440 A$="*SYMBOL" :GOSUB *INIT_PR: GOSUB *SYMBOL
10450 A$="*ENV_INIT" :GOSUB *INIT_PR: GOSUB *ENV_INIT
10460 A$="*CMP_INIT" :GOSUB *INIT_PR: GOSUB *CMP_INIT
10470 A$="*VOL_INIT" :GOSUB *INIT_PR: GOSUB *VOL_INIT
10480 A$="*PLAY_INIT" :GOSUB *INIT_PR: GOSUB *PLAY_INIT
10490 A$="*V_INIT" :GOSUB *INIT_PR: GOSUB *V_INIT
10500 A$="*KB_INIT" :GOSUB *INIT_PR: GOSUB *KB_INIT
10510 A$="*FSLCT_INIT":GOSUB *INIT_PR: GOSUB *FSLCT_INIT
10520 A$="*BTN_INIT" :GOSUB *INIT_PR: GOSUB *BTN_INIT
10530 A$="*MOUSE_INIT":GOSUB *INIT_PR: GOSUB *MOUSE_INIT
10540 MOUSE 0: MOUSE 1,320,240,1: MOUSE 1,320,240,1
10550 MS=MS_INIT: GOSUB *MOUSE_SET
10560 GOSUB *PAL_INIT: CLS 4
10570 ON ERROR GOTO *ERR
10580 '
10590 *MAIN
10600 MOUSE 4,0,0,639,479
10610 GOSUB *MPLOOP1
10620 '
10630 J=0
10640 FOR I=1 TO 18
10650 IF BTN%(I,0)<=MX AND BTN%(I,1)<=MY AND MX<=BTN%(I,2) AND MY<=BTN%(I,3) AND (BTN%(I,4)=3 OR PUSH=BTN%(I,4)) THEN J=I: I=18
10660 NEXT I
10670 ON J GOSUB *KB ,*ENV_OP ,*CMP_OP ,*VOL_OP ,*PLAYOFF,*EXIT ,*PLAY ,*PLAY_SET,*AT_OP ,*V_SCRN ,*V_READ ,*V_CNT ,*V_SAVE,*V_CLR ,*VNAME ,*LOAD ,*SAVE ,*LFO
10680 GOTO *MAIN
10690 '
10700 *PAL_INIT
10710 RESTORE *PAL_INIT
10720 DIM G(15),R(15),B(15)
10730 FOR I=0 TO 15
10740 READ G,R,B: G(I)=G*16:R(I)=R*16:B(I)=B*16
10750 NEXT I
10760 FOR I!=0 TO 1 STEP .2!
10770 FOR J=0 TO 15
10780 PALETTE J,[PAL+(G(J)-PAL)*I!,PAL+(R(J)-PAL)*I!,PAL+(B(J)-PAL)*I!]
10790 NEXT J
10800 NEXT I!
10810 FOR J=0 TO 15
10820 PALETTE J,[G(J),R(J),B(J)]
10830 NEXT J
10840 ERASE G,R,B
10850 RETURN
10860 DATA 00,00,00 , 00,00,08 , 00,08,00 , 00,08,08
10870 DATA 08,00,00 , 08,00,08 , 08,08,00 , 08,08,08
10880 DATA 04,04,04 , 00,00,15 , 00,15,00 , 00,15,15
10890 DATA 15,00,00 , 15,00,15 , 15,15,00 , 15,15,15
10900 '
10910 *INIT_PR
10920 LOCATE 0,0
10930 PRINT A$;" "
10940 RETURN
10950 '
10960 *BTN_INIT
10970 DIM BTN%(18,4)
10980 RESTORE *BTN_INIT
10990 FOR I=1 TO 18
11000 FOR J=0 TO 4
11010 READ BTN%(I,J)
11020 NEXT J
11030 NEXT I
11040 DATA 11,425,626,475,1'KB
11050 DATA 1, 22,500,309,3'ENV_OP
11060 DATA 190,320,291,420,3'CMP_OP
11070 DATA 310,342,411,356,3'VOL
11080 DATA 420,367,500,419,3'PLAY OFF
11090 DATA 420,311,500,337,1'EXIT
11100 DATA 305,394,414,416,3'PLAY
11110 DATA 347,373,370,388,1'PLAY_SET
11120 DATA 383,373,414,388,1'AT_OP
11130 DATA 509, 77,631,337,1'V_SCRN
11140 DATA 510,370,574,385,1'V_READ
11150 DATA 580,370,612,385,1'V_CNT
11160 DATA 510,395,542,410,1'V_SAVE
11170 DATA 580,395,628,410,1'V_CLR
11180 DATA 544,342,607,357,1'VNAME
11190 DATA 509, 29,631, 49,1'LOAD
11200 DATA 509, 50,631, 70,1'SAVE
11210 DATA 420,339,500,365,1'LFO
11220 RETURN
11230 '
11240 *BOX_PR
11250 LINE(X1,Y1)-(X2,Y2),PSET,%0,BF,%7
11260 CONNECT(X1,Y2)-(X1,Y1)-(X2,Y1),%15
11270 RETURN
11280 '
11290 *BOX
11300 RESTORE *BOX
11310 READ X1,Y1,X2,Y2
11320 WHILE X1<>-1
11330 GOSUB *BOX_PR
11340 READ X1,Y1,X2,Y2
11350 WEND
11360 DATA 001,001,638,020'title
11370 DATA 502, 22,638,419'音色達
11380 DATA 632, 71,508, 28'LOAD SAVE
11390 DATA 509, 29,631, 49'LOAD
11400 DATA 509, 50,631, 70'SAVE
11410 DATA 632, 96,508, 76'FILES
11420 DATA 509, 77,527, 95'<
11430 DATA 613, 77,631, 95'>
11440 DATA 632,118,508, 98'BNK NAME
11450 DATA 611,338,508,124'VOICE_NAMES
11460 DATA 632,360,508,340'VNAME
11470 DATA 632,338,613,124'VOICE_BAR
11480 DATA 614,125,631,143'V_▲
11490 DATA 614,319,631,337'V_▼
11500 DATA 1, 22,125,309'ENV
11510 DATA 123,103, 3, 40'ENV Pattern
11520 DATA 1,310,299,419'ALG
11530 DATA 160,413, 7,316'ALG Pattern
11540 DATA 1,421,638,478'KB
11550 DATA 420,311,500,337'EXIT
11560 DATA 420,339,500,365'LFO
11570 DATA 420,367,500,419'PLAY OFF
11580 DATA 301,311,418,365'VOLUME
11590 DATA 301,367,418,419'mml
11600 DATA 415,417,304,393'mml NUM
11610 DATA 415,391,341,369'mml com
11620 DATA 342,370,376,390'mml set
11630 DATA 377,370,414,390'mml auto
11640 DATA -1, -1, -1, -1
11650 RETURN
11660 '
11670 *SYMBOL
11680 RESTORE *SYMBOL
11690 READ X,Y,A$
11700 WHILE X<>-1
11710 SYMBOL(X,Y),A$,1,1,0
11720 READ X,Y,A$
11730 WEND
11740 DATA 30, 3,FMBED Ver 1.06
11750 DATA 500, 3,(c) TETSU 1992-
11760 DATA 615,127,▲
11770 DATA 615,320,▼
11780 DATA 540, 32,LOAD
11790 DATA 540, 53,SAVE
11800 DATA 510,370,読み込み
11810 DATA 510,395,保存
11820 DATA 580,370,試聴
11830 DATA 580,395,初期化
11840 DATA 430,316,EXIT
11850 DATA 430,345,LFO 設定
11860 DATA 430,375,PLAY
11870 DATA 437,397,OFF
11880 DATA 318,320,VOLUME
11890 DATA 347,373,SET
11900 DATA 309,373,MML
11910 DATA -1, -1,END
11920 RETURN
11930 '
11940 *BAR_PR
11950 LINE(BX,BY)-STEP(23,15),PSET,%7,BF
11960 SYMBOL(BX,BY),RIGHT$(" "+STR$(NUM),3),1,1,7
11970 PUT@A(BX+41,BY)-(BX+88,BY+14),BAR1%
11980 X1=BX+42+42*(NUM-MIN)/(MAX-MIN):Y1=BY:X2=X1+3:Y2=Y1+14
11990 PUT@A(X1,Y1)-(X2,Y2),BAR2%
12000 RETURN
12010 '
12020 *BAR_GET
12030 DIM BAR1%(200),BAR2%(200)
12040 LINE(41,480)-STEP(47,14),PSET,%7,BF
12050 X1=88: Y1=480+8: X2=41: Y2=480+6
12060 GOSUB *BOX_PR
12070 GET@A(41,480)-(41+47,480+14),BAR1%
12080 X1=0:Y1=480:X2=X1+3:Y2=Y1+14
12090 GOSUB *BOX_PR
12100 GET@A(0,480)-(3,480+14),BAR2%
12110 RETURN
12120 '
12130 *BAR_INIT
12140 CONNECT(BX+28,BY+7)-(BX+ 39,BY+2)-(BX+39,BY+12),0,PSET,F
12150 CONNECT(BX+90,BY+2)-(BX+101,BY+7)-(BX+90,BY+12),0,PSET,F
12160 GOSUB *BAR_PR
12170 RETURN
12180 '
12190 *MPLOOP1
12200 PUSH=0
12210 WHILE PUSH=0
12220 IF MOUSE(2,0)=-1 THEN PUSH=1
12230 IF MOUSE(2,1)=-1 THEN PUSH=2
12240 WEND
12250 MX=MOUSE(0):MY=MOUSE(1)
12260 RETURN
12270 '
12280 *MPLOOP2
12290 WHILE MOUSE(2,0)=-1 OR MOUSE(2,1)=-1: WEND
12300 RETURN
12310 '
12320 *KB_INIT
12330 DIM KZ(11,4)
12340 RESTORE *KB_INIT
12350 FOR I=0 TO 11
12360 FOR J=0 TO 4
12370 READ KZ(I,J)
12380 NEXT J
12390 NEXT I
12400 DATA 0, 0,11,50, 0 '0 C
12410 DATA 11, 0,22,50, 2 '1 D
12420 DATA 22, 0,33,50, 4 '2 E
12430 DATA 33, 0,44,50, 5 '3 F
12440 DATA 44, 0,55,50, 7 '4 G
12450 DATA 55, 0,66,50, 9 '5 A
12460 DATA 66, 0,77,50,11 '6 B
12470 DATA 08, 0,14,30, 1 '7 C+
12480 DATA 19, 0,25,30, 3 '8 D+
12490 DATA 41, 0,47,30, 6 '9 F+
12500 DATA 52, 0,58,30, 8 '10 G+
12510 DATA 63, 0,69,30,10 '11 A+
12520 FOR I=0 TO 6
12530 LINE(KX+KZ(I,0),KY)-(KX+KZ(I,2),KY+KZ(I,3)),PSET,%8,BF,%15
12540 NEXT I
12550 FOR I=7 TO 11
12560 LINE(KX+KZ(I,0),KY)-(KX+KZ(I,2),KY+KZ(I,3)),PSET,%8,BF,%8
12570 NEXT I
12580 CIRCLE(KX+5,KY+45),2,%10,,,,F
12590 DIM A%(FNVRAM(77,50))
12600 GET@A(KX,KY)-(KX+77,KY+50),A%
12610 FOR X=KX+77 TO KX+539 STEP 77
12620 PUT@A(X,KY)-(X+77,KY+50),A%
12630 NEXT X
12640 ERASE A%
12650 RETURN
12660 '
12670 *KB
12680 MOUSE 4,KX,KY,KX+615,KY+50
12690 MS=4: GOSUB *MOUSE_SET
12700 KN=-1
12710 GOSUB *PLAYOFF_EXE
12720 PLAY "%C @128 U0"
12730 WHILE MOUSE(2,0)=-1
12740 X=MOUSE(0)-KX: Y=MOUSE(1)-KY
12750 O=X \ 77: X=X MOD 77
12760 FOR I=0 TO 11
12770 IF KZ(I,0)<=X AND X<=KZ(I,2) AND Y<=KZ(I,3) THEN J=12*O+KZ(I,4)
12780 NEXT I
12790 IF J<>KN THEN KN=J: OUTM #255,&H90,KN+24,VOL
12800 WEND
12810 OUTM #255,&H90,KN+24,0
12820 MS=MS_INIT: GOSUB *MOUSE_SET
12830 RETURN
12840 '
12850 *ENV_INIT
12860 RESTORE *ENV_INIT
12870 DIM ENV%(3,10),ENVMIN%(8),ENVMAX%(8),ENV2%(3,10),CLR%(23)
12880 FOR I=0 TO 8
12890 READ A$,ENVMIN%(I),ENVMAX%(I)
12900 SYMBOL(3,110+20*I),A$,1,1,0
12910 BX=19: BY=110+20*I: NUM=0: MIN=ENVMIN%(I): MAX=ENVMAX%(I)
12920 GOSUB *BAR_INIT
12930 NEXT I
12940 SYMBOL(3,290),"AM" ,1,1,0
12950 SYMBOL(35,290),"0" ,1,1,7
12960 SYMBOL(60,290),"off",1,1,0
12970 FOR I=0 TO 3: ENV%(I,10)=1: NEXT I
12980 SYMBOL(98, 24),"on" ,1,1,0
12990 MSKF=1
13000 DATA AR, 0,31
13010 DATA DR, 0,31
13020 DATA SR, 0,31
13030 DATA RR, 0,15
13040 DATA SL, 0,15
13050 DATA TL, 0,127
13060 DATA KS, 0,3
13070 DATA ML, 0,15
13080 DATA DT,-3,3
13090 FOR I=0 TO 23: READ CLR%(I): NEXT I
13100 DATA 0,0,0,0,0,0,32639,32639,0,0,0,0,0,0,3855,3855,0,0,0,0,0,0,0,0
13110 S=0
13120 GOSUB *ENV_PR
13130 DIM A%(FNVRAM(124,287))
13140 GET@A(1,22)-(125,309),A%
13150 FOR I=0 TO 3
13160 PUT@A(1+125*I,22)-(125+125*I,309),A%
13170 SYMBOL(-3+125*I,24),STR$(I+1),1,1,2,,PSET,1
13180 NEXT I
13190 ERASE A%
13200 RETURN
13210 '
13220 *ENV_PR
13230 WINDOW(0,127)-(400,0)
13240 VIEW(4+S*125,41)-(122+S*125,102)
13250 TL=127-ENV%(S,5): AR=ENV%(S,0): DR=ENV%(S,1)
13260 SL=ENV%(S,4): SR=ENV%(S,2): RR=ENV%(S,3)
13270 X1=0: Y1=0: X2=0: Y2=0: X3=0: Y3=0
13280 X4=300: Y4=0: X5=400: Y5=0: X6=500: Y6=0
13290 IF AR=0 OR TL=0 GOTO *ENV_PR_3
13300 X2=(31-AR)*150/31: Y2=TL
13310 IF SL=0 THEN X3=X2: Y3=Y2: GOTO *ENV_PR_1
13320 IF DR=0 THEN X3=X2: Y3=Y2: SR=0: GOTO *ENV_PR_1
13330 Y3=(15-SL)*TL/15: X3=X2+(Y2-Y3)/TAN(PI!*(DR/31*.5!+.5!))
13340 *ENV_PR_1
13350 IF SR=31 THEN X4=X3: Y4=0: GOTO *ENV_PR_2
13360 IF SR=0 THEN X4=300: Y4=Y3: GOTO *ENV_PR_2
13370 X4=300: Y4=Y3-(X4-X3)*TAN(PI!*SR/31)
13380 IF Y4<=0 THEN X4=X3+(X4-X3)*Y3/(Y3-Y4): Y4=0: GOTO *ENV_PR_3
13390 *ENV_PR_2
13400 IF RR=15 THEN X5=X4: Y5=0: GOTO *ENV_PR_3
13410 IF RR=0 THEN X5=400: Y5=Y4: GOTO *ENV_PR_3
13420 X5=400: Y5=Y4-(X5-X4)*TAN(PI!*RR/15)
13430 IF Y5<=0 THEN X5=X4+(X5-X4)*Y4/(Y4-Y5): Y5=0
13440 *ENV_PR_3
13450 LINE(0,0)-(400,127),PSET,%7,BF
13460 LINE(X2,0)-(X2,127),PSET,%1,,&H6666
13470 LINE(X3,0)-(X3,127),PSET,%1,,&H6666
13480 LINE(300,0)-(300,127),PSET,%1,,&H6666
13490 CONNECT(X1,Y1)-(X2,Y2)-(X3,Y3)-(X4,Y4)-(X5,Y5)-(X6,Y6),1
13500 WINDOW(0,0)-(1023,511)
13510 VIEW (0,0)-(1023,511)
13520 RETURN
13530 '
13540 *ENV_OP
13550 S=MX\125: P=(MY-110)\20
13560 IF 22<=MY AND MY<=39 THEN P=10: GOTO *ENV_MSK
13570 IF P<0 RETURN
13580 IF P=9 GOTO *ENV_AM
13590 BX=19+125*S: BY=110+20*P
13600 NUM=ENV%(S,P): MIN=ENVMIN%(P): MAX=ENVMAX%(P)
13610 BC=-1: V=0
13620 MX=MOUSE(0): MY=MOUSE(1)
13630 IF BX+28<=MX AND BY<=MY AND MX<=BX+40 AND MY<=BY+14 THEN BC=0: V=-1: MOUSE 4,BX+28,BY,BX+40,BY+14
13640 IF BX+89<=MX AND BY<=MY AND MX<=BX+101 AND MY<=BY+14 THEN BC=0: V= 1: MOUSE 4,BX+89,BY,BX+101,BY+14
13650 IF BX+41<=MX AND BY<=MY AND MX<=BX+88 AND MY<=BY+14 THEN BC=0: V= 0:MOUSE 4,BX+42,BY,BX+84,BY+14
13660 '
13670 IF BC=-1 RETURN
13680 MOUSE 1,,,0: T=0
13690 IF V=0 GOTO *ENV_BAR
13700 '
13710 WHILE MOUSE(2,0)=-1 OR MOUSE(2,1)=-1
13720 IF 0<T AND T<200 GOTO *ENV_OP_1
13730 IF MOUSE(2,0)=-1 THEN PUSH=1
13740 IF MOUSE(2,1)=-1 THEN PUSH=10
13750 I=NUM+V*PUSH
13760 IF I<MIN THEN I=MIN
13770 IF MAX<I THEN I=MAX
13780 IF I<>NUM THEN NUM=I: ENV%(S,P)=NUM: GOSUB *ENV_PR: GOSUB *BAR_PR: GOSUB *AT ELSE MOUSE 1,MOUSE(0),MOUSE(1),1
13790 *ENV_OP_1
13800 T=T+1
13810 WEND
13820 MOUSE 1,MOUSE(0),MOUSE(1),1
13830 GOSUB *V_SET
13840 RETURN
13850 '
13860 *ENV_BAR
13870 IF PUSH=1 THEN NUM=(MOUSE(0)-42-BX)*(MAX-MIN)/42+MIN: ENV%(S,P)=NUM: GOSUB *ENV_PR: GOSUB *BAR_PR
13880 MOUSE 1,BX+42+42*(NUM-MIN)/(MAX-MIN)
13890 GOSUB *AT
13900 WHILE MOUSE(2,0)=-1 OR MOUSE(2,1)=-1
13910 WHILE MOUSE(9)=0 AND(MOUSE(2,0)=-1 OR MOUSE(2,1)=-1): WEND
13920 NUM=(MOUSE(0)-42-BX)*(MAX-MIN)/42+MIN
13930 IF NUM<>ENV%(S,P) THEN ENV%(S,P)=NUM: GOSUB *ENV_PR: GOSUB *BAR_PR: GOSUB *AT
13940 WEND
13950 MOUSE 1,MOUSE(0),MOUSE(1),1
13960 GOSUB *V_SET
13970 RETURN
13980 '
13990 *ENV_AM
14000 IF ENV%(S,P)=0 THEN ENV%(S,P)=1: A$="on" ELSE ENV%(S,P)=0: A$="off"
14010 LINE(19+125*S,290)-STEP(101,15),PSET,%7,BF
14020 SYMBOL(19+125*S,290),RIGHT$(" "+STR$(ENV%(S,P)),3),1,1,7
14030 SYMBOL(60+125*S,290),A$,1,1,0
14040 GOSUB *AT
14050 GOSUB *MPLOOP2
14060 GOSUB *V_SET
14070 RETURN
14080 '
14090 *ENV_MSK
14100 IF ENV%(S,10)=0 THEN ENV%(S,10)=1: A$="on" :CL=0 ELSE ENV%(S,10)=0: A$="off":CL=7
14110 LINE(98+125*S,24)-STEP(23,15),PSET,%7,BF
14120 SYMBOL(98+125*S,24),A$,1,1,CL
14130 GOSUB *AT
14140 GOSUB *MPLOOP2
14150 GOSUB *V_SET
14160 RETURN
14170 '
14180 *CMP_INIT
14190 RESTORE *CMP_INIT
14200 DATA ALG,0,7
14210 DATA FB ,0,7
14220 DATA PMS,0,7
14230 DATA AMS,0,3
14240 DATA PAN,0,3
14250 DIM CMP%(4),CMPMIN%(4),CMPMAX%(4),CMP2%(4)
14260 FOR I=0 TO 3
14270 READ A$,CMPMIN%(I),CMPMAX%(I)
14280 SYMBOL(166,320+20*I),A$,1,1,0
14290 BX=190: BY=320+20*I: NUM=0: MIN=CMPMIN%(I): MAX=CMPMAX%(I)
14300 GOSUB *BAR_INIT
14310 NEXT I
14320 READ A$,CMPMIN%(4),CMPMAX%(4)
14330 SYMBOL(166,400),A$,1,1,0
14340 SYMBOL(198,400),STR$(0),1,1,7
14350 SYMBOL(225,400),"off",1,1,0
14360 SYMBOL(265,400),"off",1,1,0
14370 '
14380 A$="FMBED Ver1.06"
14390 DIM A%(511)
14400 GET@A(0,511)-(1023,511),A%
14410 P1=PEEK(VARPTR(A$),4): P2=VARPTR(A%(0)): J=1
14420 FOR I=0 TO LEN(A$)-1
14430 IF PEEK(P1+I)<>PEEK(P2+I) THEN J=0
14440 POKE P2+I,PEEK(P1+I)
14450 NEXT I
14460 PUT@A(0,511)-(1023,511),A%
14470 ERASE A%
14480 IF J GOTO *CMP_INIT_2
14490 '
14500 LINE(640,0)-(1023,511),PSET,%7,BF
14510 CONNECT(770,50)-(660,50)-(660,30)-(687,30)-(687,50),0'------------0
14520 CONNECT(760,130)-(675,130)-(675,110)-(702,110)-(702,130),0'-------1
14530 LINE(690,170)-(720,130),PSET,0
14540 LINE(765,220)-(685,220),PSET,0'-----------------------------------2
14550 CONNECT(745,220)-(725,260)-(704,260)-(704,243)-(734,243),0
14560 CONNECT(765,320)-(670,320)-(670,302)-(700,302)-(700,320),0'-------3
14570 LINE(720,360)-(750,320),PSET,0
14580 CONNECT(850,70)-(900,70)-(900,30)-(835,30)-(835,10),0'------------4
14590 CONNECT-(865,10)-(865,30),0
14600 LINE(900,50)-(920,50),PSET,0
14610 CONNECT(915,145)-(825,145)-(825,127)-(853,127)-(853,145),0'-------5
14620 LINE(860,115)-(900,175),PSET,0,B
14630 CONNECT(858,210)-(858,228)-(832,228)-(832,210)-(900,210),0'-------6
14640 CONNECT-(900,270)-(875,270),0
14650 LINE(875,240)-(910,240),PSET,0
14660 CONNECT(890,305)-(890,289)-(860,289)-(860,305)-(905,305),0'-------7
14670 CONNECT-(905,371)-(875,371),0
14680 LINE(875,327)-(905,327),PSET,0
14690 LINE(875,349)-(905,349),PSET,0
14700 LINE(905,338)-(920,338),PSET,0
14710 FOR I=0 TO 7
14720 FOR J=1 TO 4
14730 READ X,Y,CL
14740 IF CL=0 THEN CL1=8:CL2=15 ELSE CL1=15:CL2=0
14750 LINE(X-6,Y-10)-(X+6,Y+10),PSET,0,BF,%CL1
14760 SYMBOL(X-12,Y-7),STR$(J),1,1,%CL2,,PSET,1
14770 NEXT J
14780 NEXT I
14790 *CMP_INIT_2
14800 GOSUB *ALG_PR
14810 DATA 675, 50,1, 700, 50,1, 725, 50,1, 750, 50,0
14820 DATA 690,130,1, 690,160,1, 715,130,1, 740,130,0
14830 DATA 715,260,1, 685,220,1, 715,220,1, 745,220,0
14840 DATA 685,320,1, 715,320,1, 715,360,1, 745,320,0
14850 DATA 850, 30,1, 880, 30,0, 850, 70,1, 880, 70,0
14860 DATA 840,145,1, 880,115,0, 880,145,0, 880,175,0
14870 DATA 845,210,1, 875,210,0, 875,240,0, 875,270,0
14880 DATA 875,305,0, 875,327,0, 875,349,0, 875,371,0
14890 RETURN
14900 '
14910 *CMP_OP
14920 P=(MY-320)\20
14930 IF P=4 GOTO *CMP_PAN
14940 BX=190: BY=320+20*P
14950 NUM=CMP%(P): MIN=CMPMIN%(P): MAX=CMPMAX%(P)
14960 BC=-1: V=0
14970 MX=MOUSE(0): MY=MOUSE(1)
14980 IF BX+28<=MX AND BY<=MY AND MX<=BX+40 AND MY<=BY+14 THEN BC=0: V=-1: MOUSE 4,BX+28,BY,BX+40,BY+14
14990 IF BX+89<=MX AND BY<=MY AND MX<=BX+101 AND MY<=BY+14 THEN BC=0: V= 1: MOUSE 4,BX+89,BY,BX+101,BY+14
15000 IF BX+41<=MX AND BY<=MY AND MX<=BX+88 AND MY<=BY+14 THEN BC=0: V= 0:MOUSE 4,BX+42,BY,BX+84,BY+14
15010 '
15020 IF BC=-1 RETURN
15030 MOUSE 1,,,0: T=0
15040 IF V=0 GOTO *CMP_BAR
15050 '
15060 WHILE MOUSE(2,0)=-1 OR MOUSE(2,1)=-1
15070 IF 0<T AND T<200 GOTO *CMP_OP_1
15080 IF MOUSE(2,0)=-1 THEN PUSH=1
15090 IF MOUSE(2,1)=-1 THEN PUSH=10
15100 I=NUM+V*PUSH
15110 IF I<MIN THEN I=MIN
15120 IF MAX<I THEN I=MAX
15130 IF I<>NUM THEN NUM=I: CMP%(P)=NUM: GOSUB *ALG_PR: GOSUB *BAR_PR: GOSUB *AT ELSE MOUSE 1,MOUSE(0),MOUSE(1),1
15140 *CMP_OP_1
15150 T=T+1
15160 WEND
15170 MOUSE 1,MOUSE(0),MOUSE(1),1
15180 GOSUB *V_SET
15190 RETURN
15200 '
15210 *CMP_BAR
15220 IF PUSH=1 THEN NUM=(MOUSE(0)-42-BX)*(MAX-MIN)/42+MIN: CMP%(P)=NUM: GOSUB *ALG_PR: GOSUB *BAR_PR
15230 MOUSE 1,BX+42+42*(NUM-MIN)/(MAX-MIN)
15240 GOSUB *AT
15250 WHILE MOUSE(2,0)=-1 OR MOUSE(2,1)=-1
15260 WHILE MOUSE(9)=0 AND(MOUSE(2,0)=-1 OR MOUSE(2,1)=-1): WEND
15270 NUM=(MOUSE(0)-42-BX)*(MAX-MIN)/42+MIN
15280 IF NUM<>CMP%(P) THEN CMP%(P)=NUM: GOSUB *ALG_PR: GOSUB *BAR_PR: GOSUB *AT
15290 WEND
15300 MOUSE 1,MOUSE(0),MOUSE(1),1
15310 GOSUB *V_SET
15320 RETURN
15330 '
15340 *CMP_PAN
15350 IF 225<=MX AND 400<=MY AND MX<=248 AND MY<=415 THEN CMP%(4)=CMP%(4) XOR 2
15360 IF 265<=MX AND 400<=MY AND MX<=288 AND MY<=415 THEN CMP%(4)=CMP%(4) XOR 1
15370 LINE(190,400)-(291,415),PSET,%7,BF
15380 SYMBOL(190,400),RIGHT$(" "+STR$(CMP%(4)),3),1,1,7
15390 IF CMP%(4) AND 2 THEN A$="on" ELSE A$="off"
15400 SYMBOL(225,400),A$,1,1,0
15410 IF CMP%(4) AND 1 THEN A$="on" ELSE A$="off"
15420 SYMBOL(265,400),A$,1,1,0
15430 GOSUB *AT
15440 GOSUB *MPLOOP2
15450 GOSUB *V_SET
15460 RETURN
15470 '
15480 *ALG_PR
15490 DIM A%(FNVRAM(152,96))
15500 X=152*(CMP%(0)\4): Y=96*(CMP%(0) MOD 4)
15510 GET@A(640+X,Y)-(791+X,95+Y),A%
15520 PUT@A(8,317)-(159,412),A%
15530 ERASE A%
15540 RETURN
15550 '
15560 *LFO
15570 SYMBOL(430,345),"LFO 設定",1,1,2
15580 WX=LFOWX: WY=LFOWY: WXS=310: WYS=130: WON=9: WF=0
15590 RESTORE *LFO
15600 GOSUB *WIN_INIT
15610 DATA 50, 45, 90, 65'OFF
15620 DATA 95, 45,135, 65'3.98
15630 DATA 140, 45,180, 65'5.56
15640 DATA 185, 45,225, 65'6.02
15650 DATA 230, 45,270, 65'6.37
15660 DATA 95, 70,135, 90'6.88
15670 DATA 140, 70,180, 90'9.63
15680 DATA 185, 70,225, 90'48.1
15690 DATA 230, 70,270, 90'72.2
15700 SYMBOL(WX+20,WY+20),"LFO 設定",1,1,0
15710 GOSUB *LFO_PR
15720 GOSUB *MPLOOP2
15730 WHILE MOUSE(2,1)=0
15740 GOSUB *WIN
15750 MOUSE 4,0,0,639,479
15760 IF 1<=WC AND WC<=9 THEN LFO=WC-1: GOSUB *LFO_PR: GOSUB *MPLOOP2
15770 WEND
15780 LFOWX=WX: LFOWY=WY
15790 GOSUB *WIN_END
15800 SYMBOL(430,345),"LFO 設定",1,1,0
15810 GOSUB *MPLOOP2
15820 RETURN
15830 '
15840 *LFO_PR
15850 'CALLM FREQCTL,LFO
15860 SYMBOL(WX+ 58,WY+48),"OFF", 1,1,-2*(LFO=0)
15870 SYMBOL(WX+ 99,WY+48),"3.98",1,1,-2*(LFO=1)
15880 SYMBOL(WX+144,WY+48),"5.56",1,1,-2*(LFO=2)
15890 SYMBOL(WX+189,WY+48),"6.02",1,1,-2*(LFO=3)
15900 SYMBOL(WX+234,WY+48),"6.37",1,1,-2*(LFO=4)
15910 SYMBOL(WX+ 99,WY+73),"6.88",1,1,-2*(LFO=5)
15920 SYMBOL(WX+144,WY+73),"9.63",1,1,-2*(LFO=6)
15930 SYMBOL(WX+189,WY+73),"48.1",1,1,-2*(LFO=7)
15940 SYMBOL(WX+234,WY+73),"72.2",1,1,-2*(LFO=8)
15950 RETURN
15960 '
15970 *VOL_INIT
15980 BX=310: BY=342: NUM=VOL: MIN=0: MAX=127
15990 GOSUB *BAR_INIT
16000 RETURN
16010 '
16020 *VOL_OP
16030 BX=310: BY=342: NUM=VOL: MIN=0: MAX=127: BC=-1: V=0
16040 MX=MOUSE(0): MY=MOUSE(1)
16050 IF BX+28<=MX AND BY<=MY AND MX<=BX+40 AND MY<=BY+14 THEN BC=0: V=-1: MOUSE 4,BX+28,BY,BX+40,BY+14
16060 IF BX+89<=MX AND BY<=MY AND MX<=BX+101 AND MY<=BY+14 THEN BC=0: V= 1: MOUSE 4,BX+89,BY,BX+101,BY+14
16070 IF BX+41<=MX AND BY<=MY AND MX<=BX+88 AND MY<=BY+14 THEN BC=0: V= 0:MOUSE 4,BX+42,BY,BX+84,BY+14
16080 '
16090 IF BC=-1 RETURN
16100 MOUSE 1,,,0: T=0
16110 IF V=0 GOTO *VOL_BAR
16120 '
16130 WHILE MOUSE(2,0)=-1 OR MOUSE(2,1)=-1
16140 IF 0<T AND T<200 GOTO *VOL_OP_1
16150 IF MOUSE(2,0)=-1 THEN PUSH=1
16160 IF MOUSE(2,1)=-1 THEN PUSH=10
16170 I=NUM+V*PUSH
16180 IF I<MIN THEN I=MIN
16190 IF MAX<I THEN I=MAX
16200 IF I<>NUM THEN NUM=I: VOL=NUM: GOSUB *BAR_PR ELSE MOUSE 1,,,1
16210 *VOL_OP_1
16220 T=T+1
16230 WEND
16240 MOUSE 1,,,1
16250 RETURN
16260 '
16270 *VOL_BAR
16280 IF PUSH=1 THEN NUM=(MOUSE(0)-42-BX)*(MAX-MIN)/42+MIN: VOL=NUM: GOSUB *BAR_PR
16290 MOUSE 1,BX+42+42*(NUM-MIN)/(MAX-MIN)
16300 WHILE MOUSE(2,0)=-1 OR MOUSE(2,1)=-1
16310 WHILE MOUSE(9)=0 AND(MOUSE(2,0)=-1 OR MOUSE(2,1)=-1): WEND
16320 NUM=(MOUSE(0)-42-BX)*(MAX-MIN)/42+MIN
16330 IF NUM<>VOL THEN VOL=NUM: GOSUB *BAR_PR
16340 WEND
16350 MOUSE 1,,,1
16360 RETURN
16370 '
16380 *V_SET
16390 FOR I=0 TO 10
16400 ENV2%(0,I)=ENV%(0,I): ENV2%(1,I)=ENV%(2,I)
16410 ENV2%(2,I)=ENV%(1,I): ENV2%(3,I)=ENV%(3,I)
16420 NEXT I
16430 FOR I=0 TO 4
16440 CMP2%(I)=CMP%(I)
16450 NEXT I
16460 P1=VARPTR(V%(0))
16470 FOR I=0 TO 3
16480 IF ENV2%(I,8)<0 THEN J=4+ABS(ENV2%(I,8)) ELSE J=ENV2%(I,8)
16490 POKE P1+ 8+I,16*J+ENV2%(I,7)' DT ML
16500 IF MSKF=1 AND ENV2%(I,10)=0 THEN POKE P1+12+I,127 ELSE POKE P1+12+I,ENV2%(I,5)'TL
16510 POKE P1+16+I,64*ENV2%(I,6)+ENV2%(I,0)' KS AR
16520 POKE P1+20+I,128*ENV2%(I,9)+ENV2%(I,1)' AM DR
16530 POKE P1+24+I,ENV2%(I,2)' SR
16540 POKE P1+28+I,16*ENV2%(I,4)+ENV2%(I,3)' SL RR
16550 NEXT I
16560 POKE P1+32,8*CMP2%(1)+CMP2%(0)' FB ALG
16570 POKE P1+33,64*CMP2%(4)+16*CMP2%(3)+CMP2%(2)' PAN AMS PMS
16580 VOICE 128,V%,0
16590 RETURN
16600 '
16610 *PLAYOFF
16620 SYMBOL(430,375),"PLAY",1,1,2
16630 SYMBOL(437,397),"OFF",1,1,2
16640 MOUSE 4,420,367,500,419
16650 GOSUB *PLAYOFF_EXE
16660 GOSUB *MPLOOP2
16670 SYMBOL(430,375),"PLAY",1,1,0
16680 SYMBOL(437,397),"OFF",1,1,0
16690 RETURN
16700 '
16710 *PLAYOFF_EXE
16720 PLAY OFF
16730 VOICE 128,CLR%,0
16740 A$="@V0 @128"
16750 PLAY A$,A$,A$,A$,A$,A$
16760 VOICE 128,V%,0
16770 RETURN
16780 '
16790 *EXIT
16800 SYMBOL(430,316),"EXIT",1,1,2
16810 WX=EXITWX: WY=EXITWY: WXS=190: WYS=95: WF=0: WON=2
16820 RESTORE *EXIT
16830 GOSUB *WIN_INIT
16840 DATA 78, 68,128, 88'実行
16850 DATA 133, 68,183, 88'取消
16860 SYMBOL(WX+50,WY+30),"終了します",1,1,0
16870 SYMBOL(WX+87,WY+70),"実行",1,1,0
16880 SYMBOL(WX+142,WY+70),"取消",1,1,0
16890 GOSUB *MPLOOP2
16900 *EXIT_LOOP
16910 GOSUB *WIN
16920 EXITWX=WX: EXITWY=WY: MOUSE 4,0,0,639,479
16930 IF WC=1 THEN GOSUB *EXIT_EXE
16940 IF WC=2 OR MOUSE(2,1)=-1 THEN GOTO *EXIT_RET
16950 GOTO *EXIT_LOOP
16960 *EXIT_RET
16970 GOSUB *WIN_END
16980 SYMBOL(430,316),"EXIT",1,1,0
16990 GOSUB *MPLOOP2
17000 RETURN
17010 '
17020 *EXIT_EXE
17030 CLOSE
17040 GOSUB *PLAYOFF_EXE
17050 GOSUB *WIN_END
17060 FOR I=0 TO 44 STEP 4
17070 POKE VARPTR(V%(0))+I,PEEK(VARPTR(ALLV%(0,127,0))+I,4),4
17080 NEXT I
17090 VOICE 128,V%,0
17100 END
17110 '
17120 *PLAY_INIT
17130 PN=0
17140 FOR I=0 TO 4
17150 X1=305+I*22:Y1=394: X2=X1+21:Y2=Y1+22:GOSUB *BOX_PR
17160 IF I=PN THEN CL=7 ELSE CL=0
17170 SYMBOL(303+I*22,398),STR$(I),1,1,CL,,,1
17180 NEXT I
17190 IF AT THEN CL=7 ELSE CL=0
17200 SYMBOL(381,373),"AUTO",1,1,CL
17210 FOR J=0 TO 4
17220 A$=P1$(J)
17230 FOR I=0 TO 5
17240 K=INSTR(A$,",")
17250 IF K=0 THEN P2$(J,I)=A$: A$="" ELSE P2$(J,I)=LEFT$(A$,K-1): A$=MID$(A$,K+1)
17260 NEXT I
17270 NEXT J
17280 'SYMBOL(309,373),"MML",1,1,0,,,1,1
17290 RETURN
17300 '
17310 *PLAY
17320 SYMBOL(303+PN*22,398),STR$(PN),1,1,0,,,1
17330 PN=(MOUSE(0)-305)\22
17340 SYMBOL(303+PN*22,398),STR$(PN),1,1,2,,,1
17350 GOSUB *PLAYOFF_EXE
17360 A$="T120 %C @128 Q8 L4 O4 U0 @V"+STR$(VOL)
17370 PLAY OFF
17380 PLAY A$,A$,A$,A$,A$,A$
17390 PLAY P2$(PN,0),P2$(PN,1),P2$(PN,2),P2$(PN,3),P2$(PN,4),P2$(PN,5)
17400 GOSUB *MPLOOP2
17410 SYMBOL(303+PN*22,398),STR$(PN),1,1,7,,,1
17420 RETURN
17430 '
17440 *PLAY_SET
17450 RESTORE *PLAY_SET
17460 SYMBOL(347,373),"SET",1,1,2
17470 GOSUB *MPLOOP2
17480 GOSUB *MPLOOP1
17490 IF MX<305 OR MY<394 OR 414<MX OR 416<MY OR PUSH=2 GOTO*PLAY_SET_RET
17500 SYMBOL(303+PN*22,398),STR$(PN),1,1,0,,,1
17510 PN=(MX-305)\22
17520 SYMBOL(303+PN*22,398),STR$(PN),1,1,2,,,1
17530 WX=PLAYWX: WY=PLAYWY: WXS=430: WYS=120: WF=0: WON=1
17540 GOSUB *WIN_INIT
17550 DATA 80,50,410,70
17560 SYMBOL(WX+20,WY+20),"MMLのSET",1,1,0
17570 SYMBOL(WX+30,WY+53),"MML"+STR$(PN),1,1,0,,,1,1
17580 IX=WX+85: IY=WY+53: IM=40: IMM=240: IA$=P1$(PN): ICL=0
17590 GOSUB *INP_INIT
17600 GOSUB *MPLOOP2
17610 WHILE IC<>&H0D AND MOUSE(2,1)=0 AND IC<>&H18
17620 GOSUB *WIN
17630 PLAYWX=WX: PLAYWY=WY: IX=WX+85: IY=WY+53
17640 IF WC=1 THEN MOUSE 4,IX,IY,IX+IM*8,IY+15 ELSE MOUSE 4,0,0,639,479
17650 GOSUB *INP
17660 WEND
17670 P1$(PN)=IA$: A$=IA$
17680 GOSUB *INP_END
17690 FOR I=0 TO 5
17700 J=INSTR(A$,",")
17710 IF J=0 THEN P2$(PN,I)=A$: A$="" ELSE P2$(PN,I)=LEFT$(A$,J-1): A$=MID$(A$,J+1)
17720 NEXT I
17730 GOSUB *WIN_END
17740 SYMBOL(303+PN*22,398),STR$(PN),1,1,7,,,1
17750 *PLAY_SET_RET
17760 SYMBOL(347,373),"SET",1,1,0
17770 GOSUB *MPLOOP2
17780 RETURN
17790 '
17800 *AT
17810 IF AT=0 RETURN
17820 GOSUB *PLAYOFF_EXE
17830 GOSUB *V_SET
17840 A$="T120 %C @128 Q8 L4 O4 U0 @V"+STR$(VOL)
17850 PLAY A$,A$,A$,A$,A$,A$
17860 PLAY P2$(PN,0),P2$(PN,1),P2$(PN,2),P2$(PN,3),P2$(PN,4),P2$(PN,5)
17870 RETURN
17880 '
17890 *AT_OP
17900 IF AT=0 THEN AT=1: CL=7: ELSE AT=0: CL=0
17910 SYMBOL(381,373),"AUTO",1,1,CL
17920 GOSUB *MPLOOP2
17930 RETURN
17940 '
17950 *V_INIT
17960 CONNECT(511,86)-(525,79)-(525,93),0,,F
17970 CONNECT(615,79)-(629,86)-(615,93),0,,F
17980 DIM ALLV%(23,127,9),VN(9),VNS(9),BNK$(9),A%(23)
17990 P1=VARPTR(A%(0)): P2=VARPTR(ALLV%(0,0,0))
18000 FOR I=0 TO 127
18010 VOICE COPY I+1,A%,0
18020 CALLM MTRNSM,P1,P2+48*I,48
18030 NEXT I
18040 ERASE A%
18050 FOR I=0 TO 9: VN(I)=-1: VNS(I)=0: BNK$(I)="": NEXT I
18060 GOSUB *V_BTN1_PR
18070 GOSUB *V_PR
18080 RETURN
18090 '
18100 *V_PR
18110 Q=VARPTR(Q$)
18120 POKE Q+4,8
18130 FOR I=0 TO 12
18140 IF I+VNS(BNK)=VN(BNK) THEN CL=2 ELSE CL=7
18150 POKE Q,VARPTR(ALLV%(0,I+VNS(BNK),BNK)),4
18160 LINE(512,127+I*16)-STEP(96,15),PSET,%7,BF
18170 SYMBOL(512,127+I*16),RIGHT$(" "+STR$(VNS(BNK)+I+1),3)+" "+Q$, 1,1,CL
18180 NEXT I
18190 RETURN
18200 '
18210 *V_SCRN
18220 VC=-1
18230 IF 509<=MX AND 77<=MY AND MX<=527 AND MY<= 95 GOSUB *V_LEFT
18240 IF 613<=MX AND 77<=MY AND MX<=631 AND MY<= 95 GOSUB *V_RIGHT
18250 IF 528<=MX AND 77<=MY AND MX<=612 AND MY<= 95 GOSUB *V_BAR1
18260 IF 614<=MX AND 125<=MY AND MX<=631 AND MY<=143 GOSUB *V_UP
18270 IF 614<=MX AND 319<=MY AND MX<=631 AND MY<=337 GOSUB *V_DOWN
18280 IF 614<=MX AND 144<=MY AND MX<=631 AND MY<=318 GOSUB *V_BAR2
18290 IF 509<=MX AND 125<=MY AND MX<=610 AND MY<=337 GOSUB *V_SLCT
18300 MOUSE 4,0,0,639,479
18310 RETURN
18320 '
18330 *V_LEFT
18340 MOUSE 4,509,77,527,95: MOUSE 1,,,0
18350 WHILE MOUSE(2,0)=-1
18360 I=BNK-1
18370 IF I<0 THEN I=0: MOUSE 1,MOUSE(0),MOUSE(1),1 ELSE BNK=I: GOSUB *V_BTN1_PR: GOSUB *V_PR
18380 WEND
18390 MOUSE 1,MOUSE(0),MOUSE(1),1
18400 RETURN
18410 '
18420 *V_RIGHT
18430 MOUSE 4,613,77,631,95: MOUSE 1,,,0
18440 WHILE MOUSE(2,0)=-1
18450 I=BNK+1
18460 IF 9<I THEN I=9: MOUSE 1,MOUSE(0),MOUSE(1),1 ELSE BNK=I: GOSUB *V_BTN1_PR: GOSUB *V_PR
18470 WEND
18480 MOUSE 1,MOUSE(0),MOUSE(1),1
18490 RETURN
18500 '
18510 *V_BAR1
18520 MOUSE 4,537,77,604,95: MOUSE 1,,,0
18530 WHILE MOUSE(2,0)=-1
18540 I=(MOUSE(0)-537)/67*9
18550 IF I<>BNK THEN BNK=I: GOSUB *V_BTN1_PR: GOSUB *V_PR
18560 WEND
18570 MOUSE 1,MOUSE(0),MOUSE(1),1
18580 RETURN
18590 '
18600 *V_UP
18610 MOUSE 4,614,125,631,143: MOUSE 1,,,0
18620 DIM A%(FNVRAM(96,208))
18630 WHILE MOUSE(2,0)=-1
18640 IF VNS(BNK)<=0 GOTO *V_UP_1
18650 VNS(BNK)=VNS(BNK)-1
18660 GOSUB *V_BTN2_PR
18670 GET@A(512,127)-(608,318),A%
18680 PUT@A(512,143)-(608,334),A%
18690 Q=VARPTR(Q$)
18700 POKE Q+4,8
18710 POKE Q,VARPTR(ALLV%(0,VNS(BNK),BNK)),4
18720 IF VNS(BNK)=VN(BNK) THEN CL=2 ELSE CL=7
18730 LINE(512,127)-STEP(96,15),PSET,%7,BF
18740 SYMBOL(512,127),RIGHT$(" "+STR$(VNS(BNK)+1),3)+" "+Q$,1,1,CL
18750 *V_UP_1
18760 WEND
18770 ERASE A%
18780 MOUSE 1,MOUSE(0),MOUSE(1),1
18790 RETURN
18800 '
18810 *V_DOWN
18820 MOUSE 4,614,319,631,337: MOUSE 1,,,0
18830 DIM A%(FNVRAM(96,208))
18840 WHILE MOUSE(2,0)=-1
18850 IF 115<=VNS(BNK) GOTO *V_DOWN_1
18860 VNS(BNK)=VNS(BNK)+1
18870 GOSUB *V_BTN2_PR
18880 GET@A(512,143)-(608,334),A%
18890 PUT@A(512,127)-(608,318),A%
18900 Q=VARPTR(Q$)
18910 POKE Q+4,8
18920 POKE Q,VARPTR(ALLV%(0,VNS(BNK)+12,BNK)),4
18930 IF VNS(BNK)+12=VN(BNK) THEN CL=2 ELSE CL=7
18940 LINE(512,319)-STEP(96,15),PSET,%7,BF
18950 SYMBOL(512,319),RIGHT$(" "+STR$(VNS(BNK)+13),3)+" "+Q$,1,1,CL
18960 *V_DOWN_1
18970 WEND
18980 ERASE A%
18990 MOUSE 1,MOUSE(0),MOUSE(1),1
19000 RETURN
19010 '
19020 *V_BAR2
19030 MOUSE 4,614,153,631,310: MOUSE 1,,,0
19040 WHILE MOUSE(2,0)=-1
19050 I=(MOUSE(1)-153)/157*115
19060 IF I<>VNS(BNK) THEN VNS(BNK)=I: GOSUB *V_BTN2_PR: GOSUB *V_PR
19070 WEND
19080 MOUSE 1,MOUSE(0),MOUSE(1),1
19090 RETURN
19100 '
19110 *V_BTN1_PR
19120 LINE(512,101)-STEP(96,15),PSET,%7,BF
19130 SYMBOL(512,101),RIGHT$(" "+STR$(BNK),3)+" "+BNK$(BNK),1,1,7
19140 X1=537+BNK*66/9-9: Y1=77: X2=X1+18: Y2=95
19150 LINE(528,77)-(612,95),PSET,%7,BF
19160 GOSUB *BOX_PR
19170 *V_BTN2_PR
19180 X1=614: Y1=153+157*VNS(BNK)/115-9: X2=631: Y2=Y1+17
19190 LINE(614,144)-(631,318),PSET,%7,BF
19200 GOSUB *BOX_PR
19210 RETURN
19220 '
19230 *V_SLCT
19240 MOUSE 4,512,127,608,334
19250 MS=4: GOSUB *MOUSE_SET
19260 I=(MOUSE(1)-127)\16
19270 GOSUB *V_SLCT_PR
19280 *V_SLCT_LOOP
19290 J=(MOUSE(1)-127)\16
19300 IF I<>J GOSUB *V_SLCT_PR: I=J: GOSUB *V_SLCT_PR
19310 IF MOUSE(2,1)=-1 THEN GOSUB *V_SLCT_PR:GOSUB *MPLOOP2:GOTO *V_SLCT2
19320 IF MOUSE(2,0)=-1 GOTO *V_SLCT_LOOP
19330 VC=VNS(BNK)+I
19340 GOSUB *V_SLCT_PR
19350 *V_SLCT2
19360 MS=MS_INIT: GOSUB *MOUSE_SET
19370 RETURN
19380 '
19390 *V_SLCT_PR
19400 LINE(511,126+I*16)-STEP(97,16),XOR,%11,BF,%3
19410 RETURN
19420 '
19430 *ENV_SET
19440 P=VARPTR(ALLV%(0,VC,BNK))
19450 FOR I=0 TO 3
19460 J=PEEK(P+8+I)
19470 IF J AND 64 THEN ENV2%(I,8)=-((J AND 48) \ 16) ELSE ENV2%(I,8)=(J AND 48)\16' DT
19480 ENV2%(I,7)=J AND 15' ML
19490 ENV2%(I,5)=PEEK(P+12+I) AND 127' TL
19500 ENV2%(I,6)=PEEK(P+16+I) \ 64' KS
19510 ENV2%(I,0)=PEEK(P+16+I) AND 31' AR
19520 ENV2%(I,9)=PEEK(P+20+I) \ 128' AM
19530 ENV2%(I,1)=PEEK(P+20+I) AND 31' DR
19540 ENV2%(I,2)=PEEK(P+24+I) AND 31' SR
19550 ENV2%(I,4)=PEEK(P+28+I) \ 16' SL
19560 ENV2%(I,3)=PEEK(P+28+I) AND 15' RR
19570 NEXT I
19580 CMP2%(1)=(PEEK(P+32) AND 56)\ 8' FB
19590 CMP2%(0)=PEEK(P+32) AND 7' ALG
19600 CMP2%(4)=PEEK(P+33) \ 64' PAN
19610 CMP2%(3)=(PEEK(P+33) AND 48)\ 16' AMS
19620 CMP2%(2)=PEEK(P+33) AND 7' PMS
19630 FOR I=0 TO 9: SWAP ENV2%(1,I),ENV2%(2,I): NEXT I
19640 RETURN
19650 '
19660 *V_READ
19670 SYMBOL(510,370),"読み込み",1,1,2
19680 *V_READ_LOOP
19690 GOSUB *MPLOOP2
19700 GOSUB *MPLOOP1
19710 IF MX<509 OR MY<77 OR 631<MX OR 337<MY OR PUSH=2 GOTO *V_READ_RET
19720 GOSUB *V_SCRN
19730 IF VC=-1 GOTO *V_READ_LOOP
19740 MOUSE 1,,,0
19750 VN(BNK)=VC
19760 GOSUB *V_PR
19770 VNAME$="": P=VARPTR(ALLV%(0,VN(BNK),BNK))
19780 FOR I=0 TO 7
19790 J=PEEK(P+I): IF J=0 THEN I=7 ELSE VNAME$=VNAME$+CHR$(J)
19800 NEXT I
19810 LINE(544,342)-STEP(63,15),PSET,%7,BF
19820 SYMBOL(544,342),VNAME$,1,1,7
19830 GOSUB *ENV_SET
19840 FOR S=0 TO 3
19850 FOR I=0 TO 9: ENV%(S,I)=ENV2%(S,I): NEXT I
19860 GOSUB *ENV_PR
19870 FOR I=0 TO 8
19880 BX=19+125*S: BY=110+20*I
19890 NUM=ENV%(S,I): MIN=ENVMIN%(I): MAX=ENVMAX%(I)
19900 GOSUB *BAR_PR
19910 NEXT I
19920 IF ENV%(S,9)=1 THEN A$="on" ELSE A$="off"
19930 LINE(19+125*S,290)-STEP(101,15),PSET,%7,BF
19940 SYMBOL(19+125*S,290),RIGHT$(" "+STR$(ENV%(S,9)),3),1,1,7
19950 SYMBOL(60+125*S,290),A$,1,1,0
19960 NEXT S
19970 MOUSE 1,MOUSE(0),MOUSE(1),1
19980 FOR I=0 TO 4: CMP%(I)=CMP2%(I): NEXT I
19990 GOSUB *ALG_PR
20000 FOR I=0 TO 3
20010 BX=190: BY=320+20*I: NUM=CMP%(I): MIN=CMPMIN%(I): MAX=CMPMAX%(I)
20020 GOSUB *BAR_PR
20030 NEXT I
20040 LINE(190,400)-(291,415),PSET,%7,BF
20050 SYMBOL(190,400),RIGHT$(" "+STR$(CMP%(4)),3),1,1,7
20060 IF CMP%(4) AND 2 THEN A$="on" ELSE A$="off"
20070 SYMBOL(225,400),A$,1,1,0
20080 IF CMP%(4) AND 1 THEN A$="on" ELSE A$="off"
20090 SYMBOL(265,400),A$,1,1,0
20100 GOSUB *V_SET
20110 GOSUB *AT
20120 *V_READ_RET
20130 SYMBOL(510,370),"読み込み",1,1,0
20140 RETURN
20150 '
20160 *V_CNT
20170 SYMBOL(580,370),"試聴",1,1,2
20180 *V_CNT_LOOP
20190 GOSUB *MPLOOP2
20200 GOSUB *MPLOOP1
20210 IF MX<509 OR MY<77 OR 631<MX OR 337<MY OR PUSH=2 GOTO *V_CNT_RET
20220 GOSUB *V_SCRN
20230 IF VC=-1 GOTO *V_CNT_LOOP
20240 DIM A%(23)
20250 P1=VARPTR(ALLV%(0,VC,BNK)): P2=VARPTR(A%(0))
20260 CALLM MTRNSM,P1,P2,48
20270 GOSUB *PLAYOFF_EXE
20280 VOICE 128,A%,0
20290 ERASE A%
20300 A$="T120 %C @128 Q8 L4 O4 U0 @V"+STR$(VOL)
20310 PLAY A$,A$,A$,A$,A$,A$
20320 PLAY P2$(PN,0),P2$(PN,1),P2$(PN,2),P2$(PN,3),P2$(PN,4),P2$(PN,5)
20330 GOSUB *MPLOOP2
20340 GOTO *V_CNT_LOOP
20350 *V_CNT_RET
20360 SYMBOL(580,370),"試聴",1,1,0
20370 RETURN
20380 '
20390 *V_SAVE
20400 SYMBOL(510,395),"保存",1,1,2
20410 *V_SAVE_LOOP
20420 GOSUB *MPLOOP2
20430 GOSUB *MPLOOP1
20440 IF MX<509 OR MY<77 OR 631<MX OR 337<MY OR PUSH=2 GOTO *V_SAVE_RET
20450 GOSUB *V_SCRN
20460 IF VC=-1 GOTO *V_SAVE_LOOP
20470 VN(BNK)=VC
20480 MSKF=0: GOSUB *V_SET
20490 P1=VARPTR(V%(0)): P2=VARPTR(ALLV%(0,VN(BNK),BNK))
20500 FOR I=0 TO 7
20510 A$=MID$(VNAME$,I+1,1)
20520 IF A$="" THEN POKE P1+I,0 ELSE POKE P1+I,ASC(A$)
20530 NEXT I
20540 FOR I=0 TO 44 STEP 4
20550 POKE P2+I,PEEK(P1+I,4),4
20560 NEXT I
20570 GOSUB *V_PR
20580 IF BNK=0 THEN VOICE VC+1,V%,0
20590 MSKF=1: GOSUB *V_SET
20600 *V_SAVE_RET
20610 SYMBOL(510,395),"保存",1,1,0
20620 RETURN
20630 '
20640 *V_CLR
20650 SYMBOL(580,395),"初期化",1,1,2
20660 *V_CLR_LOOP
20670 GOSUB *MPLOOP2
20680 GOSUB *MPLOOP1
20690 IF MX<509 OR MY<77 OR 631<MX OR 337<MY OR PUSH=2 GOTO *V_CLR_RET
20700 GOSUB *V_SCRN
20710 IF VC=-1 GOTO *V_CLR_LOOP
20720 P=VARPTR(ALLV%(0,VC,BNK))
20730 FOR I=0 TO 47
20740 POKE P+I,0
20750 NEXT I
20760 GOSUB *V_PR
20770 IF BNK<>0 GOTO *V_CLR_RET
20780 DIM A%(23)
20790 FOR I=0 TO 23: A%(I)=0: NEXT I
20800 VOICE VC+1,A%,0
20810 ERASE A%
20820 *V_CLR_RET
20830 SYMBOL(580,395),"初期化",1,1,0
20840 RETURN
20850 '
20860 *VNAME
20870 LINE(544,342)-STEP(63,15),PSET,%7,BF
20880 IX=544: IY=342: IA$=VNAME$: IM=8: IMM=8: ICL=15
20890 GOSUB *INP_INIT
20900 *VNAME_LOOP
20910 IF MOUSE(2,1) OR IC=&H0D OR IC=&H18 GOTO *VNAME_RET
20920 MX=MOUSE(0): MY=MOUSE(1)
20930 IF MOUSE(2,0) THEN IF 544<=MX AND 342<=MY AND MX<=607 AND MY<=357 THEN MOUSE 4,544,342,607,357 ELSE GOTO *VNAME_RET ELSE MOUSE 4,0,0,639,479
20940 GOSUB *INP
20950 GOTO *VNAME_LOOP
20960 *VNAME_RET
20970 VNAME$=IA$
20980 GOSUB *INP_END
20990 RETURN
21000 '
21010 *LOAD
21020 SYMBOL(540, 32),"LOAD",1,1,2
21030 WX=LOADWX: WY=LOADWY: WXS=335: WYS=125: WF=0: WON=4
21040 RESTORE *LOAD
21050 GOSUB*WIN_INIT
21060 DATA 130, 45,310, 65'文字入力
21070 DATA 200, 85,250,105'実行
21080 DATA 260, 85,310,105'取消
21090 DATA 260, 13,310, 33'FILES
21100 SYMBOL(WX+15,WY+15),"音色ファイルのLOAD",1,1,0
21110 SYMBOL(WX+266,WY+16),"FILES",1,1,0
21120 SYMBOL(WX+35,WY+47),"ファイル名",1,1,0
21130 SYMBOL(WX+209,WY+87),"実行",1,1,0
21140 SYMBOL(WX+269,WY+87),"取消",1,1,0
21150 *LOAD_2
21160 IX=WX+135: IY=WY+48: IM=21: IMM=84: IA$=FILE$: ICL=0
21170 LINE(IX,IY)-STEP(IM*8,15),PSET,7,BF
21180 GOSUB *INP_INIT
21190 GOSUB *MPLOOP2
21200 *LOAD_LOOP
21210 GOSUB *WIN
21220 LOADWX=WX: LOADWY=WY: IX=WX+135: IY=WY+48
21230 IF WC=1 THEN MOUSE 4,IX,IY,IX+IM*8,IY+15 ELSE MOUSE 4,0,0,639,479
21240 IF WC=2 OR IC=&H0D THEN GOTO *LOAD_CHK
21250 IF WC=3 OR MOUSE(2,1)=-1 OR IC=&H18 THEN GOSUB *INP_END: GOSUB *WIN_END: GOTO *LOAD_RET
21260 IF WC=4 GOSUB *LOAD_FILES
21270 GOSUB *INP
21280 FILE$=IA$
21290 GOTO *LOAD_LOOP
21300 *LOAD_RET
21310 CLOSE
21320 SYMBOL(540, 32),"LOAD",1,1,0
21330 GOSUB *MPLOOP2
21340 RETURN
21350 '
21360 *LOAD_FILES
21370 GOSUB *INP_END
21380 GOSUB *FSLCT
21390 IF FSLCT$<>"" THEN IA$=FSLCT$
21400 LINE(WX+131,WY+46)-(WX+309,WY+64),PSET,7,BF
21410 GOSUB *INP_INIT
21420 RETURN'
21430 '
21440 *LOAD_CHK
21450 GOSUB *INP_END
21460 LINE(WX+40,WY+87)-STEP(140,15),PSET,7,BF
21470 LFN$=FILE$
21480 IF INSTR(LFN$,".")=0 THEN LFN$=LFN$+".FMB"
21490 I=INSTR(LFN$,":")
21500 LFN1$=LEFT$(LFN$,I)
21510 LFN2$=MID$(LFN$,I+1)
21520 '
21530 ON ERROR GOTO *LOAD_ERR
21540 OPEN "I",1,LFN$: CLOSE
21550 ON ERROR GOTO *ERR
21560 '
21570 OPEN "R",1,LFN1$+"(128)"+LFN2$
21580 OPEN "R",2,LFN1$+"(1)" +LFN2$
21590 FIELD 1,128 AS A$
21600 FIELD 2, 1 AS B$
21610 FTL=LOF(2)
21620 IF FTL<6152 THEN CLOSE: A$="Bad File Size": GOTO *LOAD_ERR_RET
21630 '
21640 *LOAD_EXE
21650 DIM A%(4)
21660 FP=0: L=8: P=VARPTR(A%(0))
21670 GOSUB *FLOAD
21680 P=VARPTR(A%(0)): BNK$(BNK)=""
21690 FOR I=0 TO 7
21700 J=PEEK(P): IF J=0 THEN I=7 ELSE BNK$(BNK)=BNK$(BNK)+CHR$(J)
21710 NEXT I
21720 ERASE A%
21730 '
21740 FP=8: L=6144: P=VARPTR(ALLV%(0,0,BNK))
21750 GOSUB *FLOAD
21760 '
21770 IF BNK<>0 GOTO *LOAD_EXE_2
21780 DIM A%(23)
21790 P1=VARPTR(ALLV%(0,0,BNK)): P2=VARPTR(A%(0))
21800 FOR I=0 TO 127
21810 CALLM MTRNSM,P1+48*I,P2,48
21820 VOICE I+1,A%,0
21830 NEXT I
21840 ERASE A%
21850 *LOAD_EXE_2
21860 CLOSE
21870 GOSUB *WIN_END
21880 GOSUB *V_BTN1_PR
21890 GOSUB *V_PR
21900 GOTO *LOAD_RET
21910 '
21920 *LOAD_ERR
21930 ON ERROR GOTO *ERR
21940 IF ERR= 63 THEN A$="File not Find"
21950 IF ERR<>63 THEN A$="File Access Error"
21960 RESUME *LOAD_ERR_RET
21970 '
21980 *LOAD_ERR_RET
21990 BEEP: SYMBOL(WX+40,WY+87),A$,1,1,2
22000 GOTO *LOAD_2
22010 '
22020 *FLOAD 'FP L > P LFN1$,LFN2$
22030 N1=(FP+127)\128: L1=128*N1-FP: N3=(FP+L)\128
22040 L3=FP+L-128*N3: L2=L-L1-L3: N2=N3-N1
22050 IF FP+L<128*N1 THEN L1=L: L2=0: L3=0: N2=0
22060 '
22070 I=0
22080 WHILE I<L1
22090 GET 2,FP+I+1
22100 POKE P,ASC(B$)
22110 I=I+1: P=P+1
22120 WEND
22130 '
22140 I=0: P1=PEEK(VARPTR(A$),4)
22150 WHILE I<N2
22160 GET 1,N1+I+1
22170 CALLM MTRNSM,P1,P,128
22180 I=I+1: P=P+128
22190 WEND
22200 '
22210 I=0
22220 WHILE I<L3
22230 GET 2,128*N3+I+1
22240 POKE P,ASC(B$)
22250 I=I+1: P=P+1
22260 WEND
22270 RETURN
22280 '
22290 *ERR
22300 BEEP: CLOSE: MOUSE 0: MOUSE 1,,,1
22310 GOSUB *INP_END
22320 GOSUB *WIN_END
22330 WX=ERRWX: WY=ERRWY: WXS=190: WYS=95: WON=2: WF=0
22340 RESTORE *ERR
22350 GOSUB *WIN_INIT
22360 DATA 78, 68,128, 88'中断
22370 DATA 133, 68,183, 88'無視
22380 SYMBOL(WX+18,WY+15),"エラーが発生しました",1,1,0
22390 SYMBOL(WX+30,WY+40),"ERROR"+STR$(ERR)+"/"+STR$(ERL)+"行",1,1,0
22400 SYMBOL(WX+87,WY+70),"中断",1,1,0
22410 SYMBOL(WX+142,WY+70),"無視",1,1,0
22420 GOSUB *MPLOOP2
22430 *ERR_LOOP
22440 GOSUB *WIN
22450 ERRWX=WX: ERRWY=WY: MOUSE 4,0,0,639,479
22460 IF WC=1 THEN PLAY OFF: END
22470 IF WC=2 OR MOUSE(2,1)=-1 THEN GOSUB *WIN_END: GOSUB *MPLOOP2: RESUME NEXT
22480 GOTO *ERR_LOOP
22490 '
22500 *ERRKP
22510 ERRC=ERR
22520 RESUME NEXT
22530 '
22540 *SAVE
22550 SYMBOL(540, 53),"SAVE",1,1,2
22560 WX=SAVEWX: WY=SAVEWY: WXS=330: WYS=120: WF=0: WON=4
22570 RESTORE *SAVE
22580 GOSUB*WIN_INIT
22590 DATA 120, 40,300, 60'文字入力
22600 DATA 190, 85,240,105'実行
22610 DATA 250, 85,300,105'取消
22620 DATA 250, 13,300, 33'FILES
22630 SYMBOL(WX+15,WY+15),"音色ファイルのSAVE",1,1,0
22640 SYMBOL(WX+256,WY+16),"FILES",1,1,0
22650 SYMBOL(WX+25,WY+42),"ファイル名",1,1,0
22660 SYMBOL(WX+199,WY+87),"実行",1,1,0
22670 SYMBOL(WX+259,WY+87),"取消",1,1,0
22680 *SAVE_2
22690 IX=WX+125: IY=WY+43: IM=21: IMM=84: IA$=FILE$: ICL=0
22700 LINE(IX,IY)-STEP(IM*8,15),PSET,7,BF
22710 GOSUB *INP_INIT
22720 GOSUB *MPLOOP2
22730 *SAVE_LOOP
22740 GOSUB *WIN
22750 SAVEWX=WX: SAVEWY=WY: IX=WX+125: IY=WY+43
22760 IF WC=1 THEN MOUSE 4,IX,IY,IX+IM*8,IY+15 ELSE MOUSE 4,0,0,639,479
22770 IF WC=2 OR IC=&H0D THEN GOTO *SAVE_CHK
22780 IF WC=3 OR MOUSE(2,1)=-1 OR IC=&H18 THEN GOSUB *INP_END: GOTO *SAVE_RET
22790 IF WC=4 GOSUB *SAVE_FILES
22800 GOSUB *INP
22810 FILE$=IA$
22820 GOTO *SAVE_LOOP
22830 *SAVE_RET
22840 CLOSE
22850 GOSUB *WIN_END
22860 SYMBOL(540, 53),"SAVE",1,1,0
22870 GOSUB *MPLOOP2
22880 RETURN
22890 '
22900 *SAVE_FILES
22910 GOSUB *INP_END
22920 GOSUB *FSLCT
22930 IF FSLCT$<>"" THEN IA$=FSLCT$
22940 LINE(WX+121,WY+41)-(WX+299,WY+59),PSET,7,BF
22950 GOSUB *INP_INIT
22960 RETURN
22970 '
22980 *SAVE_CHK
22990 GOSUB *INP_END
23000 LINE(WX+40,WY+87)-STEP(140,15),PSET,7,BF
23010 SFN$=FILE$
23020 IF INSTR(SFN$,".")=0 THEN SFN$=SFN$+".FMB"
23030 I=INSTR(SFN$,":")
23040 IF I=0 THEN SFN1$="" ELSE SFN1$=LEFT$(SFN$,I)
23050 SFN2$=MID$(SFN$,I+1)
23060 '
23070 ON ERROR GOTO *SAVE_ERR
23080 OPEN "O",1,SFN$: CLOSE
23090 ON ERROR GOTO *ERR
23100 '
23110 *SAVE_EXE
23120 LINE(WX+40,WY+87)-STEP(140,15),PSET,7,BF
23130 OPEN "R",1,SFN1$+"(128)"+SFN2$
23140 FIELD 1,128 AS A$
23150 DIM B%(63)
23160 ERRC=0: M=0: L1=0: L2=0: L3=0: S$=STRING$(128,"*")
23170 ON ERROR GOTO *ERRKP
23180 '
23190 DIM A%(4): P=VARPTR(A%(0)): L=8
23200 FOR I=0 TO 7
23210 I$=MID$(BNK$(BNK),I+1,1)
23220 IF I$="" POKE P+I,0 ELSE POKE P+I,ASC(I$)
23230 NEXT I
23240 GOSUB *SAVE_EXE_SUB
23250 ERASE A%
23260 '
23270 P=VARPTR(ALLV%(0,0,BNK)): L=6144
23280 GOSUB *SAVE_EXE_SUB
23290 '
23300 CLOSE
23310 '
23320 OPEN "R",2,SFN1$+"(1)"+SFN2$
23330 FIELD 2,1 AS B$
23340 P2=VARPTR(B%(0))
23350 I=0
23360 WHILE I<L3 AND ERRC=0
23370 LSET B$=CHR$(PEEK(P2+I))
23380 PUT 2,128*M+I+1
23390 I=I+1
23400 WEND
23410 CLOSE
23420 ON ERROR GOTO *ERR
23430 ERASE B%
23440 IF ERRC<>0 THEN BEEP: CLOSE: KILL SFN$: A$="Scanty Free Area": GOTO *SAVE_ERR_RET
23450 GOTO *SAVE_RET
23460 '
23470 *SAVE_EXE_SUB
23480 P2=VARPTR(B%(0))'------------------------------------------------L1
23490 L1=128-L3
23500 IF L<L1 THEN L1=L
23510 I=0
23520 WHILE I<L1 AND ERRC=0
23530 POKE P2+L3+I,PEEK(P+I)
23540 I=I+1
23550 WEND
23560 IF L3+L1<128 THEN L2=0: N=0: L3=L3+L1: GOTO *SAVE_EXE_SUB_RET
23570 POKE VARPTR(S$),P2,4: POKE VARPTR(S$)+4,128
23580 LSET A$=S$
23590 PUT 1,M+1
23600 M=M+1
23610 '
23620 N=(L-L1)\128: L2=128*N: L3=(L-L1) MOD 128'------------------L2
23630 I=0
23640 WHILE I<N AND ERRC=0
23650 POKE VARPTR(S$),P+L1+128*I,4: POKE VARPTR(S$)+4,128
23660 LSET A$=S$
23670 PUT 1,M+1
23680 M=M+1: I=I+1
23690 WEND
23700 '
23710 I=0'-------------------------------------------------------------L3
23720 WHILE I<L3 AND ERRC=0
23730 POKE P2+I,PEEK(P+L1+L2+I)
23740 I=I+1
23750 WEND
23760 *SAVE_EXE_SUB_RET
23770 '
23780 RETURN
23790 '
23800 *SAVE_ERR
23810 IF ERR=64 THEN RESUME *SAVE_ERR_3
23820 *SAVE_ERR_2
23830 BEEP: ON ERROR GOTO *ERR
23840 A$="File Access Error"
23850 RESUME *SAVE_ERR_RET
23860 '
23870 *SAVE_ERR_3
23880 BEEP: ON ERROR GOTO *ERR
23890 SYMBOL(WX+40,WY+87),"Over Write ?",1,1,2
23900 GOSUB *MPLOOP2
23910 *SAVE_ERR_3_LOOP
23920 GOSUB *WIN
23930 SAVEWX=WX: SAVEWY=WY: MOUSE 4,0,0,639,479
23940 IF WC=1 THEN A$="": GOTO *SAVE_ERR_RET
23950 IF WC=2 OR INKEY$=CHR$(&H0D) THEN ON ERROR GOTO *SAVE_ERR_2: KILL SFN$: ON ERROR GOTO *ERR: GOTO *SAVE_EXE
23960 IF WC=3 OR MOUSE(2,1)=-1 GOTO *SAVE_RET
23970 GOTO *SAVE_ERR_3_LOOP
23980 '
23990 *SAVE_ERR_RET
24000 LINE(WX+40,WY+87)-STEP(140,15),PSET,7,BF
24010 SYMBOL(WX+40,WY+87),A$,1,1,2
24020 GOTO *SAVE_2
24030 '
24040 '
24050 *FSLCT
24060 WIDTH 80,25: CONSOLE 2,23,0: COLOR 0,0,7,4: CLS 4
24070 DIM FSLCT%(46080)
24080 GET@A(0,0)-(380,479),FSLCT%
24090 LINE(0,0)-(380,479),PSET,,BF
24100 LINE(380,0)-(380,479),PSET,0
24110 *FSLCT_1
24120 CL=5
24130 GOSUB *FSLCT_PR
24140 CL=4
24150 ON ERROR GOTO *FSLCT_ERR
24160 CLS 1: LOCATE 0,2:FILES DSK$+PATH$(DSK)+"*.*"
24170 ON ERROR GOTO *ERR
24180 YMAX=CSRLIN
24190 GOSUB *FSLCT_PR
24200 IF CL=4 THEN LOCATE 10,0:PRINT DSK$+PATH$(DSK)+"*.*";
24210 GOSUB *MPLOOP2
24220 *FSLCT_LOOP
24230 GOSUB *MPLOOP1
24240 Y=INT(MY/19)
24250 IF PUSH=2 THEN FSLCT$="": GOTO *FSLCT_RET
24260 IF 0<=MX AND 0<=MY AND MX<=16 AND MY<=16 THEN DSK=DSK-1: CLS 1: CL=5: GOSUB *FSLCT_PR: GOSUB *MPLOOP2
24270 IF 48<=MX AND 0<=MY AND MX<=64 AND MY<=16 THEN DSK=DSK+1: CLS 1: CL=5: GOSUB *FSLCT_PR: GOSUB *MPLOOP2
24280 IF 24<=MX AND 0<=MY AND MX<=40 AND MY<=16 GOTO *FSLCT_1
24290 IF CL=5 GOTO *FSLCT_LOOP
24300 IF 80<=MX AND 0<=MY AND MX<=80+8*LEN(PATH$(DSK))+15 AND MY<=16 THEN GOSUB *FSLCT_PATH2: GOTO *FSLCT_1
24310 IF MX<0 OR 380<MX OR Y<=1 OR YMAX-2<=Y GOTO *FSLCT_LOOP
24320 FL1$="": FL2$="": FL3$=""
24330 I=0
24340 WHILE I<=7 AND SCREEN(I,Y)<>&H20
24350 FL1$=FL1$+CHR$(SCREEN(I,Y)): I=I+1
24360 WEND
24370 I=0
24380 WHILE I<=2 AND SCREEN(9+I,Y)<>0
24390 FL2$=FL2$+CHR$(SCREEN(9+I,Y)): I=I+1
24400 WEND
24410 FOR I=0 TO 8
24420 FL3$=FL3$+CHR$(SCREEN(16+I,Y))
24430 NEXT I
24440 IF INSTR(FL1$,".")<>0 OR INSTR(FL2$,".")<>0 THEN GOSUB *FSLCT_PATH1: GOTO *FSLCT_1
24450 IF INSTR(FL3$,"DIR")<>0 THEN PATH$(DSK)=PATH$(DSK)+FL1$+"\": GOTO *FSLCT_1
24460 FSLCT$=DSK$+PATH$(DSK)+FL1$+"."+FL2$
24470 GOTO *FSLCT_RET
24480 '
24490 *FSLCT_PATH1
24500 I=LEN(PATH$(DSK))-1: PATH$(DSK)=LEFT$(PATH$(DSK),I)
24510 WHILE MID$(PATH$(DSK),I,1)<>"\"
24520 I=I-1: PATH$(DSK)=LEFT$(PATH$(DSK),I)
24530 WEND
24540 RETURN
24550 '
24560 *FSLCT_PATH2
24570 X=INT((MX-96)/8)+1
24580 IF X<=1 THEN PATH$(DSK)="\": RETURN
24590 FOR I=X TO LEN(PATH$(DSK))
24600 IF MID$(PATH$(DSK),I,1)="\" THEN J=I: I=255
24610 NEXT I
24620 PATH$(DSK)=LEFT$(PATH$(DSK),J)
24630 RETURN
24640 '
24650 *FSLCT_RET
24660 CLS 4
24670 PUT@A(0,0)-(380,479),FSLCT%
24680 ERASE FSLCT%
24690 GOSUB *MPLOOP2
24700 RETURN
24710 '
24720 *FSLCT_INIT
24730 DIM PATH$(16)
24740 DSK=0: DSK$=CHR$(&H41+DSK)
24750 FOR I=0 TO 16: PATH$(I)="\": NEXT I
24760 RETURN
24770 '
24780 *FSLCT_PR
24790 DSK=(DSK+17) MOD 17
24800 DSK$=CHR$(&H41+DSK)+":"
24810 CLS 2
24820 LOCATE 0,0: PRINT "< >";
24830 COLOR,,,CL: LOCATE 3,0: PRINT DSK$;: COLOR ,,,4
24840 RETURN
24850 '
24860 *FSLCT_ERR
24870 CL=5: PATH$(DSK)="\"
24880 IF ERR=63 THEN RESUME *FSLCT_1
24890 BEEP
24900 LOCATE 0,2: PRINT "File Access Error";
24910 RESUME NEXT
24920 '
24930 *INP_INIT
24940 IF IPC=1 GOSUB *INP_END
24950 IA2$=IA$: IPC=1: IC=0: IP=0: IP2=IP: IXS=8*IM-1
24960 DIM IA%(FNVRAM(IXS+8,15))
24970 GET@A(IX,IY)-(IX+IXS+8,IY+15),IA%
24980 GOSUB *INP_PR_2
24990 WHILE INKEY$<>"": WEND
25000 RETURN
25010 '
25020 *INP
25030 IC=0
25040 IF MOUSE(2,0)=-1 GOSUB *INP_MOUSE
25050 I$=INKEY$
25060 IF I$="" RETURN
25070 J$=INKEY$
25080 WHILE J$<>"": I$=J$: J$=INKEY$: WEND
25090 IC=ASC(I$)
25100 IF IC=&H1D THEN IP2=IP-1: GOSUB *INP_PR: RETURN '←
25110 IF IC=&H1C THEN IP2=IP+1: GOSUB *INP_PR: RETURN '→
25120 IF IC=&H08 AND 0<IP THEN IA2$=LEFT$(IA$,IP-1)+MID$(IA$,IP+1): IP2=IP-1: GOSUB *INP_PR: RETURN 'BS
25130 IF IC=&H7F THEN IA2$=LEFT$(IA$,IP)+MID$(IA$,IP+2): IP2=IP: GOSUB *INP_PR: RETURN 'DEL
25140 IF IC=&H05 THEN IA2$=LEFT$(IA$,IP): GOSUB *INP_PR: IP2=IP: RETURN 's^DEL
25150 IF IC=&H1B THEN GOSUB *INP_ESC: RETURN 'ESC
25160 IF IC<=&H1F OR IMM<=LEN(IA$) RETURN
25170 IA2$=LEFT$(IA$,IP)+I$+MID$(IA$,IP+1): IP2=IP+LEN(I$)
25180 GOSUB *INP_PR
25190 RETURN
25200 '
25210 *INP_MOUSE
25220 MX=MOUSE(0)-IX: MY=MOUSE(1)-IY
25230 IF MX<0 OR IXS<MX OR MY<0 OR 15<MY RETURN
25240 MOUSE 4,IX,IY,IX+IXS,IY+15
25250 IP2=(IP\IM)*IM+MX\8
25260 IF MX<=0 AND 0<IP2 THEN IP2=(IP\IM-1)*IM: MOUSE 1,IX+IXS-1,,1
25270 IF IXS<=MX AND IP2<IMM-1 AND IP2<LEN(IA2$) THEN IP2=(IP\IM+1)*IM: MOUSE 1,IX+1,,1
25280 GOSUB *INP_PR
25290 RETURN
25300 '
25310 *INP_PR
25320 IF IP2<0 THEN IP2=0
25330 IF LEN(IA2$)<IP2 THEN IP2=LEN(IA2$)
25340 IF IMM<=IP2 THEN IP2=IMM-1
25350 IF IP2=IP AND IA2$=IA$ THEN RETURN
25360 IP=IP2: IA$=IA2$
25370 *INP_PR_2
25380 I=(IP\IM)*IM: J=IP MOD IM
25390 PUT@A(IX,IY)-(IX+IXS+8,IY+15),IA%
25400 SYMBOL(IX,IY),MID$(IA$,I+1,IM),1,1,%ICL
25410 LINE(IX+8*J,IY)-STEP(1,15),PSET,2,B
25420 RETURN
25430 '
25440 *INP_END
25450 IF IPC=0 THEN RETURN
25460 IPC=0
25470 PUT@A(IX,IY)-(IX+IXS+8,IY+15),IA%
25480 SYMBOL(IX,IY),MID$(IA$,1,IM),1,1,%ICL
25490 ERASE IA%
25500 RETURN
25510 '
25520 *INP_ESC
25530 DIM IB%(FNVRAM(639,104))
25540 GET@A(0,375)-(639,479),IB%
25550 LINE(-1,375)-(640,480),PSET,0,BF,7
25560 CONSOLE 20,4,1: COLOR 1,,,4: LOCATE 0,20
25570 LINE INPUT I$
25580 IF I$<>"" THEN IA2$=LEFT$(I$,IMM): IP2=0
25590 CONSOLE 0,23,0: CLS 4
25600 PUT@A(0,375)-(639,479),IB%
25610 ERASE IB%
25620 GOSUB *INP_PR
25630 RETURN
25640 '
25650 *MOUSE_INIT
25660 MS_INIT=0
25670 RESTORE *MOUSE_INIT
25680 DIM MS_A$(20),MS_D$(20),MS_X(20),MS_Y(20)
25690 READ MS
25700 WHILE MS<>-1
25710 READ MS_X(MS),MS_Y(MS),A$,D$
25720 MS_A$(MS)="":MS_D$(MS)=""
25730 FOR J=0 TO 31
25740 MS_A$(MS)=MS_A$(MS)+CHR$(VAL("&h"+MID$(A$,2*J+1,2)))
25750 MS_D$(MS)=MS_D$(MS)+CHR$(VAL("&h"+MID$(D$,2*J+1,2)))
25760 NEXT J
25770 READ MS
25780 WEND
25790 RETURN
25800 DATA 0, 0,0'INIT BASIC標準
25810 DATA 001F001F003F007F00FF007F003F001F080F1C073E03FF01FF80FFC1FFE3FFF7
25820 DATA 00007FC07F807F007E007F007F8077C063E041F000F8007C003E001C00080000
25830 'DATA 3, 0,0'YA4 FMBED標準
25840 'DATA3FFF0FFF83FF80FFC03FC00FE003E000F001F007F807F807FC07FC7FFE7FFEFF
25850 'DATA0000400030001C000F0017C00BF005FC02F0057002B001500100000000000000
25860 DATA 4, 0,0'HAND4 指斜め
25870 DATA BE9F180F00078003C003E003E003C003C003E001F000F800FF01FF83FFC7FFCF
25880 DATA 0000416065B036D81B780DF806F81BF81DF80FFC07FC00F80070002000000000
25890 DATA 7, 9,9'HAND2 押さえ手指
25900 DATA FF7FFC1FF80FF807F803F803F803880300038003E003F003F807FC07F803F803
25910 DATA 0000008002A002A002A802A802A803F873F81BF80FF807F803F001F000000000
25920 DATA -1
25930 '
25940 *MOUSE_SET
25950 MOUSE 2,MS_A$(MS),MS_D$(MS),MS_X(MS),MS_Y(MS)
25960 RETURN
25970 '
25980 *WIN_ON
25990 VIEW (WX+5,WY+5)-(WX+WXS-10,WY+WYS-10)
26000 WINDOW(WX+5,WY+5)-(WX+WXS-10,WY+WYS-10)
26010 RETURN
26020 '
26030 *WIN_OFF
26040 VIEW (0,0)-(1023,511)
26050 WINDOW(0,0)-(1023,511)
26060 RETURN
26070 '
26080 *WIN_INIT
26090 IF WPC=1 GOSUB *WIN_END
26100 IF FRE(3)<(WXS+32)*WYS/2*2+WON*8 THEN ERRF=1: RETURN
26110 WPC=1: WC=-2: WCL=10: I=1
26120 DIM WA%(FNVRAM(WXS,WYS)),WB%(FNVRAM(WXS,WYS)),WOZ(WON,3)
26130 IF 639<WX+WXS THEN WX=639-WXS
26140 IF 479<WY+WYS THEN WY=479-WYS
26150 GET@A(WX,WY)-(WX+WXS,WY+WYS),WA%
26160 LINE(WX,WY)-(WX+WXS,WY+WYS),PSET,%7,BF
26170 LINE(WX+3,WY+3)-(WX+WXS,WY+WYS),PSET,%8,BF
26180 LINE(WX,WY)-(WX+WXS-3,WY+WYS-3),PSET,0,BF,7
26190 WHILE I<=WON AND (WF AND 2)=0
26200 FOR J=0 TO 3: READ WOZ(I,J): NEXT J
26210 LINE(WX+WOZ(I,0),WY+WOZ(I,1))-(WX+WOZ(I,2),WY+WOZ(I,3)),PSET,0,B
26220 I=I+1
26230 WEND
26240 RETURN
26250 '
26260 *WIN
26270 IF MOUSE(2,0)=0 THEN WC=-2: RETURN
26280 MX=MOUSE(0)-WX: MY=MOUSE(1)-WY
26290 IF MX<0 OR MY<0 OR WXS<MX OR WYS<MY THEN WC=0: RETURN
26300 WC=-3: I=1
26310 WHILE I<=WON
26320 IF WOZ(I,0)<=MX AND WOZ(I,1)<=MY AND MX<=WOZ(I,2) AND MY<=WOZ(I,3) THEN WC=I: I=WON
26330 I=I+1
26340 WEND
26350 IF 1<=WC OR (WF AND 1) THEN RETURN
26360 WC=-1
26370 X=MX: Y=MY: MX=WX: MY=WY
26380 MOUSE 4,X,Y,639-WXS+X,479-WYS+Y
26390 MS=7: GOSUB *MOUSE_SET
26400 LINE(MX,MY)-STEP(WXS,WYS),XOR,%WCL,B
26410 WHILE MOUSE(2,0)=-1
26420 WHILE MOUSE(9)=0 AND MOUSE(10)=0 AND MOUSE(2,0)=-1: WEND
26430 LINE(MX,MY)-STEP(WXS,WYS),XOR,%WCL,B
26440 MX=MOUSE(0)-X: MY=MOUSE(1)-Y
26450 LINE(MX,MY)-STEP(WXS,WYS),XOR,%WCL,B
26460 WEND
26470 LINE(MX,MY)-STEP(WXS,WYS),XOR,%WCL,B
26480 GET@A(WX,WY)-(WX+WXS,WY+WYS),WB%
26490 PUT@A(WX,WY)-(WX+WXS,WY+WYS),WA%
26500 GET@A(MX,MY)-(MX+WXS,MY+WYS),WA%
26510 PUT@A(MX,MY)-(MX+WXS,MY+WYS),WB%
26520 MS=MS_INIT: GOSUB *MOUSE_SET
26530 WX=MX: WY=MY
26540 RETURN
26550 '
26560 *WIN_END
26570 IF WPC=0 THEN RETURN
26580 WPC=0
26590 PUT@A(WX,WY)-(WX+WXS,WY+WYS),WA%
26600 ERASE WA%,WB%,WOZ
26610 RETURN
26620 '
26630 '
26640 *FLCNV 'FL$>FL1$,FL2$,FL3$,FL4$
26650 J=INSTR(FL$,":"): K=1: L=INSTR(FL$,".")
26660 FOR I=1 TO LEN(FL$)
26670 IF MID$(FL$,I,1)=":" OR MID$(FL$,I,1)="\" THEN K=I+1
26680 NEXT I
26690 IF L<>0 THEN FL3$=MID$(FL$,K,L-K): FL4$=MID$(FL$,L) ELSE FL3$=MID$(FL$,K): IF MODE=4 THEN FL4$=".SND" ELSE FL4$=".PMB"
26700 FL1$=LEFT$(FL$,J)
26710 FL2$=MID$(FL$,J+1,K-(J+1))
26720 FL$=FL1$+FL2$+FL3$+FL4$
26730 RETURN
26740 '