各種言語によるプログラミング例
1995 長嶋洋一
10 'save "fract",a
20 DEFINT A-N:DEFDBL P-Z:KEY OFF:SCREEN 1
30 INPUT "Input Center (X) = ",P1:INPUT "Input Center (Y) = ",P2:INPUT "Expand Scale = ",P3:INPUT "Plot Step = ",JX
40 CLS:LINE (0,29)-(1023,767),1,B
50 LOCATE 1,8,0:PRINT "Center = (";P1;",";P2;") Scale =";P3;" Step =";JX;
60 X0=P1-P3:Y0=P2+P3:X1=P3/512#
70 FOR IX=1 TO 1023 STEP JX:X2=X0+CDBL(IX)*X1
80 FOR IY=143 TO 881 STEP JX:Y2=Y0-CDBL(IY)*X1
90 GOSUB 120:IF F1=1 THEN PSET (IX,IY-114)
100 NEXT IY:LOCATE 1,73,0:PRINT IX;:NEXT IX:LOCATE 1,73,0:PRINT " ";
110 A$=INKEY$:IF A$<>" " THEN 110 ELSE SCREEN 0:KEY ON:LOCATE 1,1,1:END
120 F1=0:Z1=0#:Z2=0#:FOR K1=1 TO 100:ZZ=Z1*Z1-Z2*Z2+X2:Z2=2#*Z1*Z2+Y2:Z1=ZZ
130 IF Z1*Z1+Z2*Z2>4# THEN RETURN
140 NEXT K1:F1=1:RETURN
10 'SAVE "lesson.bas",A 20 MAXX=9:DIM BUFF$(100) 30 KEY OFF:CLS 40 LOCATE 1,5:COLOR 0:INPUT "SELECT LESSON NO.(1-9) = ",C$ 50 LEVEL=VAL(C$):IF LEVEL>MAXX OR LEVEL<1 OR LEVEL<>INT(LEVEL) THEN 30 60 CLS:RESTORE 270:CTR=1 70 READ DUM$:IF LEFT$(DUM$,2)<>"**" THEN 70 80 IF VAL(RIGHT$(DUM$,LEN(DUM$)-2))<>LEVEL THEN 70 90 READ BUFF$(CTR):IF LEFT$(BUFF$(CTR),2)<>"**" THEN CTR=CTR+1:GOTO 90 100 FOR LOOP=1 TO CTR-1 110 A$=BUFF$(LOOP):COUNT=LEN(A$) 120 IF MAXX>6 THEN A$=A$+STRING$(70-LEN(A$)," "):GOTO 150 130 A$=A$+" "+A$:IF LEN(A$)<70 THEN 130 ELSE A$=LEFT$(A$,70) 140 IF RIGHT$(A$,1)=" " THEN COUNT=69 ELSE COUNT=70 150 LOCATE 17,5:COLOR 0:PRINT A$:LOCATE 19,5:COLOR 0:PRINT STRING$(60," ") 160 FOR I=1 TO COUNT:'### MAIN LOOP ### 170 LOCATE 17,4+I:COLOR 1:PRINT MID$(A$,I,1) 180 LOCATE 19,4+I:COLOR 0 190 C$=INKEY$:IF C$="" THEN 190 ELSE PRINT C$ 200 IF C$=CHR$(7) THEN 30 210 IF C$=CHR$(14) THEN 260 220 IF C$=CHR$(2) AND LOOP>1 THEN LOOP=LOOP-1:GOTO 110 230 IF C$=MID$(A$,I,1) THEN 250 240 IF INKEY$=CHR$(8) THEN 180 ELSE 240 250 LOCATE 17,4+I:COLOR 0:PRINT MID$(A$,I,1):NEXT I 260 NEXT LOOP:BEEP:GOTO 30 270 DATA "**1" 280 DATA "asdf;lkj" 290 DATA "ask","lad","all","fall","lass","asks","lads","falls" 300 DATA "alas","add","flask","salad" 310 DATA "**2" 320 DATA "asdfgf ;lkjhj" 330 DATA "had","ash","has","gall","hash","jags","hags" 340 DATA "glass","gala","lag","jag","gas","lash","flag","sash","half" 350 DATA "slash","flags","gash","hall","lags","glad","slag","dash" 360 DATA "shall","flash","halls" 370 DATA "**3" 380 DATA "aqaswsdedfrf ;p;lolkikjuj" 390 DATA "sails","liked","jokes","forks","lakes","parks","larks","fills" 400 DATA "sales","dirks","fails","skill","apples","fields","squads" 410 DATA "floors","killed","raised","depress","workers","refusal" 420 DATA "dollars","awkward","defiles" 430 DATA "**4" 440 DATA "tfrf yjuj" 450 DATA "tall","sorry","yours","trial","shout","yield","others" 460 DATA "gladly","though","takes","yeast","trout","forest","joyful" 470 DATA "faults","artful","styles","lastly","truly","shifts","spirit" 480 DATA "eighty","firstly","laughed","faithful","yourself","spiteful" 490 DATA "hit the key","type this well","read this paper" 500 DATA "he will tell you","write with this","there is a pupil" 510 DATA "type these words","there are houses","he wrote a letter" 520 DATA "she is a good typist","here is a typewriter" 530 DATA "there are pretty dolls" 540 DATA "**5" 550 DATA "aszsdxdfcfvf ;l,lkmkjnjbj" 560 DATA "lacks","calls","formal","zeal","next","black","summer","cabled" 570 DATA "arrival","local","native","cancel","visits","manual","several" 580 DATA "object","drizzle","examined","nations","meaning","anxious" 590 DATA "because","numbers","activity","subject","examples","umbrella" 600 DATA "**6" 610 DATA "James","Frank","India","England","London","Spain","Paris" 620 DATA "America","Tokyo" 630 DATA "I am now ready to begin typing." 640 DATA "We are happy to have you in the typing class." 650 DATA "It is good for all of us to know how to type." 660 DATA "He likes to sing all the songs that he hears." 670 DATA "Keep your arms, elbows, and wrists still while typing." 680 DATA "It is very easy to type these short words." 690 DATA "The first thing for me to do is to type with ease." 700 DATA "I can do this work well if I just think that I can." 710 DATA "Curve your fingers; hold them lightly on the guide keys." 720 DATA "You do not get much done by starting tomorrow." 730 DATA "If you do your best, you will develop your typing skill." 740 DATA "Speed will look after itself if you play your part well." 750 DATA "Do not be afraid to make errors while you are practising." 760 DATA "Be alert while typing and hit the keys firmly and evenly." 770 DATA "**7" 780 DATA "If he is in, tell him that I want to see him in an hour" 790 DATA " or so." 800 DATA "If you do your best work each day, you will soon be a" 810 DATA " good typist." 820 DATA "You must know what you are to do; then do it as nicely" 830 DATA " as you can." 840 DATA "I can read very fast. He can write very well. She can" 850 DATA " type quickly." 860 DATA "If it is fine, I shall go with you. I hope we can enjoy" 870 DATA " it very much." 880 DATA "Hit one key at a time. Do not pause after you hit the" 890 DATA " key." 900 DATA "If I do my lesson well, my typing skill will grow in due" 910 DATA " course." 920 DATA "We must have faith that we can do well anything we want" 930 DATA " to learn." 940 DATA "Typing is a new kind of work for me and a new way for me" 950 DATA " to learn it." 960 DATA "Do more than you say you will do. This is a good plan to" 970 DATA " follow all the time." 980 DATA "It is not easy at first to think the word and type the" 990 DATA " word." 1000 DATA "Faith that we can do well is needed by all of us to do" 1010 DATA " things well." 1020 DATA "Try to hit the key with a sharp blow; then lift the" 1030 DATA " finger at once." 1040 DATA "You will find that there are a good many fields in which" 1050 DATA " you can use your typing skill." 1060 DATA "Hold the hands and arms quiet; hold them low so that your" 1070 DATA " fingers can flick the keys and get away quickly." 1080 DATA "**8" 1090 DATA "abcde fghij klmno pqrst uvwxyz abcdefghijklmnopqrstuvwxyz" 1100 DATA "Dick asserted that the quick brown fox jumped over the" 1110 DATA " lazy dog." 1120 DATA "A very hot, quick blaze can be made from just pine twigs" 1130 DATA " and boxes." 1140 DATA "Fred Carver requests we keep the dozen large boxes of" 1150 DATA " juicy lemons." 1160 DATA "A zinc plate, six inches square, would make a very good" 1170 DATA " job for you." 1180 DATA "The public was amazed to view the quick and dexterous" 1190 DATA " work of James on the foggy day." 1200 DATA "The bright cat quickly jumped off a box and seized seven" 1210 DATA " wee mice." 1220 DATA "Jim goes forward expectantly but very quickly realizes" 1230 DATA " his mistake." 1240 DATA "A fat lazy boy, named Jack Davis, slept quietly on a big" 1250 DATA " haedware box." 1260 DATA "Six dozen of heavy blankets were added to the equipment" 1270 DATA " for George and Jack." 1280 DATA "A large number of our citizens have signed a petition" 1290 DATA " which makes request for a more just system of taxation." 1300 DATA "Both of the young girls from Japan were vexed at his" 1310 DATA " quizzical look." 1320 DATA "Jim Faraday may achieve success by exercise of superior" 1330 DATA " judgment, zeal, and quick work." 1340 DATA "When the big black fox jumped over the fence, the little" 1350 DATA " squirrel gazed very curiously." 1360 DATA "You will probably have to explain if you did not use zeal" 1370 DATA " and judgment and work as quietly as you could." 1380 DATA "Just one hour of quiet, steady, exact work, is of far" 1390 DATA " greater value than a dozen hours of spasmodic bustling." 1400 DATA "**9" 1410 DATA "It cannot be too often repeated that it is not helps but" 1420 DATA " obstacles, not facilities but difficulties, that make men." 1430 DATA "The main purpose of the study of chemistry in school is to" 1440 DATA " teach the scientific method; that is, the appeal to experiment." 1450 DATA "Re Paper Release Lever: By means of the paper release lever" 1460 DATA " the paper in the machine is adjusted when it is fed twisted." 1470 DATA "Opportunity is coy. The careless, the slow, the lazy, the" 1480 DATA " unobservant, fail to see it, or clutch at it when it has gone." 1490 DATA "Poverty is a great evil in any station of life; but poverty" 1500 DATA " is never felt so severely as by those who have seen better days." 1510 DATA "Enclosed is a statement for your September account. This" 1520 DATA " is due on the 11th October, but has evidently escaped your notice." 1530 DATA "**END" 1540 IF FLG<>0 THEN FLG=0:GOTO 1600 ELSE FLG=1 1550 LOCATE 5,4:COLOR 7:PRINT "1 2 3 4 5 6 7 8 9 0 -" 1560 LOCATE 5,6:COLOR 7:PRINT " Q W E R T Y U I O P " 1570 LOCATE 5,8:COLOR 7:PRINT " A S D F G H J K L ; :" 1580 LOCATE 5,10:COLOR 7:PRINT " Z X C V B N M , . / " 1590 RETURN 1600 LOCATE 5,4:COLOR 7:PRINT "!" 1610 LOCATE 9,4:COLOR 7:PRINT CHR$(34) 1620 LOCATE 13,4:COLOR 7:PRINT "# $ % & ' ( ) =" 1630 LOCATE 5,6:COLOR 7:PRINT " Q W E R T Y U I O P " 1640 LOCATE 5,8:COLOR 7:PRINT " A S D F G H J K L + *" 1650 LOCATE 5,10:COLOR 7:PRINT " Z X C V B N M < > ? " 1660 RETURN
1000 'save "e:card1.bas",a 1010 DEFINT A-N:A=&H40:DIM B(2048):CLS 1020 OUT (&H37),&HD:OUT (&H46),&H82:OUT (&H46),&HF:OUT (&H37),&HC 1030 OUT (A),&H80:GOTO 1170 ' << Initialize >> 1040 '### Data Write : Data=[DT],Add(L)=[AL],Add(H)=[AH] ### 1050 DD=128+(DT MOD 16):OUT (A),DD:OUT (A),DD-128:OUT (A),DD ' D0-D3 1060 DD=144+INT(DT/16): OUT (A),DD:OUT (A),DD-128:OUT (A),DD ' D4-D7 1070 DD=160+(AL MOD 16):OUT (A),DD:OUT (A),DD-128:OUT (A),DD ' A0-A3 1080 DD=176+INT(AL/16): OUT (A),DD:OUT (A),DD-128:OUT (A),DD ' A4-A7 1090 DD=192+(AH MOD 16):OUT (A),DD:OUT (A),DD-128:OUT (A),DD ' A8-A11 1100 OUT (&H46),&HE:OUT (&H46),&HF:RETURN ' Strobe 1110 '### Data Read : Add(L)=[AL],Add(H)=[AH] -> Data=[DX] ### 1120 DD=160+(AL MOD 16):OUT (A),DD:OUT (A),DD-128:OUT (A),DD ' A0-A3 1130 DD=176+INT(AL/16): OUT (A),DD:OUT (A),DD-128:OUT (A),DD ' A4-A7 1140 DD=192+(AH MOD 16):OUT (A),DD:OUT (A),DD-128:OUT (A),DD ' A8-A11 1150 DX=0:FOR I=0 TO 7:OUT (A),128+16*I:J=(INP(&H42) AND &H4)/4 1160 DX=DX+J*2^I:NEXT I:RETURN 1170 '### Main Routine ### 1180 INPUT "Data Display : Input High Address ( 0 - 7 )";AH 1190 FOR AL=0 TO 255 1200 GOSUB 1110:PRINT HEX$(DX)+" "; 1210 NEXT AL
10 'save "coresim",a 20 KEY OFF:SCREEN 2:LOCATE ,,0:DIM MT(256) 30 ISX=3:ISY=2:IXMIN=150:IXMAX=IXMIN+255*ISX:IYMIN=170:IYMAX=IYMIN+255*ISY 40 CT=1:GOSUB 90 50 Z$=INKEY$:IF Z$="" THEN 50 60 IF Z$=" " THEN CT=CT+1:GOSUB 90 70 IF Z$<>CHR$(&H1B) THEN GOTO 50 80 SCREEN 0,0,0:LOCATE 1,1,1:KEY ON:END 90 ON CT GOSUB 100,200,300,400,500,600,700,800,80:RETURN 100 '***** Normal Power-Mantissa ***** 110 CLS:LINE (IXMIN-ISX,IYMIN-ISY)-(IXMAX+ISX,IYMAX+ISY),1,B 120 LOCATE 3,25:PRINT "<< 1:Normal Power-Mantissa >>" 130 FOR I=0 TO 255 140 MANTISSA=I MOD 16 150 POWER=INT(I/16) 160 MT(I)=INT(256*(2^(-POWER))*(MANTISSA/16)) 170 CIRCLE (IXMIN+I*ISX,IYMAX-MT(I)*ISY),2 180 PAINT (IXMIN+I*ISX,IYMAX-MT(I)*ISY) 190 NEXT I:RETURN 200 '***** Mantissa:Bit Swap ***** 210 CLS:LINE (IXMIN-ISX,IYMIN-ISY)-(IXMAX+ISX,IYMAX+ISY),1,B 220 LOCATE 3,25:PRINT "<< 2:Mantissa-Bit Swap >>" 230 FOR I=0 TO 255 240 MANTISSA=I MOD 16 250 POWER=INT(I/16) 260 MT(I)=INT(256*(2^(-POWER))*((15-MANTISSA)/16)) 270 CIRCLE (IXMIN+I*ISX,IYMAX-MT(I)*ISY),2 280 PAINT (IXMIN+I*ISX,IYMAX-MT(I)*ISY) 290 NEXT I:RETURN 300 '***** ***** 310 CLS:LINE (IXMIN-ISX,IYMIN-ISY)-(IXMAX+ISX,IYMAX+ISY),1,B 320 LOCATE 3,25:PRINT "<< 3:Power-Swap >>" 330 FOR I=0 TO 255 340 MANTISSA=I MOD 16 350 POWER=INT(I/16) 360 MT(I)=INT(256*(2^(-(15-POWER)))*(MANTISSA/16)) 370 CIRCLE (IXMIN+I*ISX,IYMAX-MT(I)*ISY),2 380 PAINT (IXMIN+I*ISX,IYMAX-MT(I)*ISY) 390 NEXT I:RETURN 400 '***** ***** 410 CLS:LINE (IXMIN-ISX,IYMIN-ISY)-(IXMAX+ISX,IYMAX+ISY),1,B 420 LOCATE 3,25:PRINT "<< 4: >>" 430 FOR I=0 TO 255 440 MANTISSA=I MOD 16 450 POWER=INT(I/16) 460 MT(I)=INT(256*(2^(-POWER))*(MANTISSA/16)) 470 CIRCLE (IXMIN+I*ISX,IYMAX-MT(I)*ISY),2 480 PAINT (IXMIN+I*ISX,IYMAX-MT(I)*ISY) 490 NEXT I:RETURN 500 '***** ***** 510 CLS:LINE (IXMIN-ISX,IYMIN-ISY)-(IXMAX+ISX,IYMAX+ISY),1,B 520 LOCATE 3,25:PRINT "<< 5: >>" 530 FOR I=0 TO 255 540 MANTISSA=I MOD 16 550 POWER=INT(I/16) 560 MT(I)=INT(256*(2^(-POWER))*(MANTISSA/16)) 570 CIRCLE (IXMIN+I*ISX,IYMAX-MT(I)*ISY),2 580 PAINT (IXMIN+I*ISX,IYMAX-MT(I)*ISY) 590 NEXT I:RETURN 600 '***** ***** 610 CLS:LINE (IXMIN-ISX,IYMIN-ISY)-(IXMAX+ISX,IYMAX+ISY),1,B 620 LOCATE 3,25:PRINT "<< 6: >>" 630 FOR I=0 TO 255 640 MANTISSA=I MOD 16 650 POWER=INT(I/16) 660 MT(I)=INT(256*(2^(-POWER))*(MANTISSA/16)) 670 CIRCLE (IXMIN+I*ISX,IYMAX-MT(I)*ISY),2 680 PAINT (IXMIN+I*ISX,IYMAX-MT(I)*ISY) 690 NEXT I:RETURN 700 '***** ***** 710 CLS:LINE (IXMIN-ISX,IYMIN-ISY)-(IXMAX+ISX,IYMAX+ISY),1,B 720 LOCATE 3,25:PRINT "<< 7: >>" 730 FOR I=0 TO 255 740 MANTISSA=I MOD 16 750 POWER=INT(I/16) 760 MT(I)=INT(256*(2^(-POWER))*(MANTISSA/16)) 770 CIRCLE (IXMIN+I*ISX,IYMAX-MT(I)*ISY),2 780 PAINT (IXMIN+I*ISX,IYMAX-MT(I)*ISY) 790 NEXT I:RETURN 800 '***** ***** 810 CLS:LINE (IXMIN-ISX,IYMIN-ISY)-(IXMAX+ISX,IYMAX+ISY),1,B 820 LOCATE 3,25:PRINT "<< 8: >>" 830 FOR I=0 TO 255 840 MANTISSA=I MOD 16 850 POWER=INT(I/16) 860 MT(I)=INT(256*(2^(-POWER))*(MANTISSA/16)) 870 CIRCLE (IXMIN+I*ISX,IYMAX-MT(I)*ISY),2 880 PAINT (IXMIN+I*ISX,IYMAX-MT(I)*ISY) 890 NEXT I:RETURN
10 'save "dirmap.bas",a 20 DIM X$(200),Y(200):CT=1 30 OPEN "dirlist.mes" FOR INPUT AS #1 40 INPUT #1,A$:IF LEN(A$)=0 THEN 170 50 J=1:K=LEN(A$) 60 IF J>=K THEN 170 ELSE B=ASC(MID$(A$,J,1)) 70 IF (128<B AND B<160) OR (223<B AND B<253) THEN J=J+2:GOTO 60 80 B$=RIGHT$(A$,1+K-J) 90 C=LEN(B$):D$="" 100 FOR L=1 TO C 110 C$=MID$(B$,L,1) 120 IF C$=" " THEN 140 130 D$=D$+C$ 140 NEXT L 150 X$(CT)=D$:IF LEFT$(D$,1)="\" THEN Y(CT)=0 ELSE Y(CT)=1 160 CT=CT+1 170 IF EOF(1)=0 THEN 40 ELSE CLOSE #1:CT=CT-1 180 CLS:PRINT "********** Directory Tree Map **********" 190 FOR I=1 TO CT 200 IF Y(I)=1 THEN PRINT " ";X$(I);:GOTO 280 210 J=0:PT=1:E$="" 220 FOR K=2 TO LEN(X$(I)) 230 F$=MID$(X$(I),K,1) 240 IF F$="\" THEN J=J+1:E$=E$+"-" ELSE E$=E$+F$ 250 NEXT K:PRINT 260 FOR M=0 TO J:PRINT " ";:NEXT M 270 PRINT E$; 280 NEXT I:PRINT 290 IF INKEY$="" THEN 290 300 END
1000 'save "divide.bas",a 1010 S#=(15#+30#)*100#/2# 1020 PRINT" Total =";S# 1030 PRINT:PRINT"##### 2-Divide #####" 1040 FOR Q=58.11385 TO 58.11392 STEP .00001 1050 P#=CDBL(Q) 1060 Y#=15#*P#/100# 1070 T#=15#*P#+Y#*P#/2# 1080 PRINT" Point =";Q;" , S =";T#;" , Diff.=";S#/2#-T# 1090 NEXT Q 1100 PRINT:PRINT"##### 3-Divide (1) #####" 1110 FOR Q=41.42132 TO 41.42139 STEP .00001 1120 P#=CDBL(Q) 1130 Y#=15#*P#/100# 1140 T#=15#*P#+Y#*P#/2# 1150 PRINT" Point =";Q;" , S =";T#;" , Diff.=";S#/3#-T# 1160 NEXT Q 1170 PRINT:PRINT"##### 3-Divide (2) #####" 1180 FOR Q=73.20506 TO 73.2051 STEP .00001 1190 P#=CDBL(Q) 1200 Y#=15#*P#/100# 1210 T#=15#*P#+Y#*P#/2# 1220 PRINT" Point =";Q;" , S =";T#;" , Diff.=";2#*S#/3#-T# 1230 NEXT Q 1240 PRINT
10 'save "ffttest.bas",a 20 CLS:GOSUB 100 25 FOR I=0 TO 255 30 XR(I)=INT(128*SIN(I*3.1415926535#/128) ) 35 XI(I)=0 40 NEXT I 50 GOSUB 200 60 'FOR I=0 TO 255:PRINT (XR(I)^2+XI(I)^2)^(1/2);:NEXT I 65 FOR I=0 TO 255:PRINT XR(I);:NEXT I 95 END 100 DEFINT G-Q:I=0:J=0:K=0:P=0:L=0:H=0:G=0:Q=0:A=0 110 N=256:M=LOG(N)/LOG(2):DIM XR(N),XI(N),S(N/2),C(N/2):B=3.1415956535#/N 130 FOR I=0 TO N/2:S(I)=SIN(A):C(I)=COS(I):A=A+B:NEXT I:RETURN 200 L=N:H=1 210 FOR G=1 TO M:L=L/2:K=0 220 FOR Q=1 TO H:P=0 230 FOR I=K TO L+K-1:J=I+L 240 A=XR(I)-XR(J):B=XI(I)-XI(J) 250 XR(I)=XR(I)+XR(J):XI(I)=XI(I)+XI(J) 260 IF P=0 THEN XR(J)=A:XI(J)=B:GOTO 280 270 XR(J)=A*C(P)+B*S(P):XI(J)=B*C(P)-A*S(P) 280 P=P+H:NEXT I 290 K=K+L+L:NEXT Q 300 H=H+H:NEXT G 320 J=N/2:FOR I=1 TO N-1:K=N 340 IF J<I THEN SWAP XR(I),XR(J):SWAP XI(I),XI(J) 350 K=K/2:IF J>=K THEN J=J-K:GOTO 350 360 J=J+K:NEXT I:RETURN
1000 'save "file-cut2",a 1010 OPEN "f:z.z" FOR INPUT AS #1 1020 CLS:PRINT "<";TIME$;"> Start !" 1040 NO=0 1050 '### Loop ### 1060 NO=NO+1 1070 A$=HEX$(NO):PRINT "<";TIME$;"> FILE NAME = [ zz-";A$;".z ]" 1080 OPEN "c:zz-"+A$+".z" FOR OUTPUT AS #2 1090 I=0 1100 IF EOF(1) THEN CLOSE #1:CLOSE #2:END 1101 INPUT #1,E$ 1102 PRINT #2,E$ 1110 I=I+1:IF I<500 THEN 1100 1150 CLOSE #2 1200 GOTO 1050
10 'save "fno.bas",a
20 CLS:DIM X$(12):FOR I=0 TO 11:X$(I)=" db ":NEXT I
30 DIM Y$(12):FOR I=0 TO 11:Y$(I)=" db ":NEXT I
40 DIM Z$(12):FOR I=0 TO 11:Z$(I)=" db ":NEXT I
50 G#=3520#*(2#^(6.5#/12#)):H#=(2#^(1#/12#/32#)):A#=(2#^(1#/12#)):FOR I=0 TO 11
60 RESTORE 160:FOR K=1 TO (12-I):READ A$:NEXT K:PRINT "===== [ ";A$;" ] ====="
70 B#=1#/A#:FOR N=0 TO I:B#=B#*A#:NEXT N
80 FOR L=0 TO 31:PRINT " Offset (";:E$=HEX$(L):IF LEN(E$)=1 THEN E$="0"+E$
90 PRINT E$;") :";:P#=1#/H#:FOR N=0 TO L:P#=P#*H#:NEXT N:U$=HEX$(L):IF LEN(U$)=1 THEN U$="0"+U$
100 O#=G#*P#*B#:PRINT " f =";:PRINT USING "#####.######";O#;:PRINT "Hz";
110 Q#=2#^24#*O#/62500#:C$=HEX$(INT(Q#)/256):PRINT " Data = ";C$;
120 D$=HEX$(INT(Q#)-256*INT(Q#/256)):IF LEN(D$)=1 THEN D$="0"+D$
130 PRINT D$;:PRINT:X$(I)=X$(I)+"0"+LEFT$(C$,2)+"h,"
140 Y$(I)=Y$(I)+"0"+RIGHT$(C$,2)+"h,":Z$(I)=Z$(I)+"0"+D$+"h,"
150 NEXT L:PRINT :NEXT I
160 DATA "Eb-9","D -9","C#-9","C -9","B -8","Bb-8","A -8","Ab-8","G -8","F#-8","F -8","E -8"
170 OPEN "fnodata.s14" FOR OUTPUT AS #1
180 FOR I=0 TO 11:PRINT #1,X$(I):NEXT I:PRINT #1," "
190 FOR I=0 TO 11:PRINT #1,Y$(I):NEXT I:PRINT #1," "
200 FOR I=0 TO 11:PRINT #1,Z$(I):NEXT I:PRINT #1," "
210 CLOSE #1:END
10 'save "fileconv.bas",a
20 DEFINT A-Z
30 DATA 1,2,3,4,99,99,6,99,99,99,99,99,99,99,7,8
40 G$="demo":QT=4
50 PHASE=0:'First=0 !!!
60 IF PHASE=9 THEN 1520:'!!!!! Debug Only !!!!!
70 GOSUB 960:GOSUB 440:GOSUB 100
80 SHELL "copy f:dummy.dum a:"+G$+".kmy"
90 END
100 '***** TESTER File *****************************************
110 OPEN "f:dummy.dum" FOR OUTPUT AS #2
120 FOR I=1 TO 32:PRINT #2,CHR$(0);:NEXT I
130 FF=0:F1=0:F2=0:GOSUB 420
140 OPEN "f:tr1.buf" FOR INPUT AS #1
150 FD=LOF(1)-1:GOSUB 420:CLOSE #1
160 OPEN "f:tr2.buf" FOR INPUT AS #1
170 FD=LOF(1)-1:GOSUB 420:CLOSE #1
180 OPEN "f:tr3.buf" FOR INPUT AS #1
190 FD=LOF(1)-1:GOSUB 420:CLOSE #1
200 OPEN "f:tr4.buf" FOR INPUT AS #1
210 FD=LOF(1)-1:GOSUB 420:CLOSE #1
220 OPEN "f:tr5.buf" FOR INPUT AS #1
230 FD=LOF(1)-1:GOSUB 420:CLOSE #1
240 OPEN "f:tr6.buf" FOR INPUT AS #1
250 FD=LOF(1)-1:GOSUB 420:CLOSE #1
260 OPEN "f:tr7.buf" FOR INPUT AS #1
270 FD=LOF(1)-1:GOSUB 420:CLOSE #1
280 FOR I=1 TO 16:PRINT #2,CHR$(0);:NEXT I
290 OPEN "f:tr1.buf" FOR INPUT AS #1:GOSUB 380
300 OPEN "f:tr2.buf" FOR INPUT AS #1:GOSUB 380
310 OPEN "f:tr3.buf" FOR INPUT AS #1:GOSUB 380
320 OPEN "f:tr4.buf" FOR INPUT AS #1:GOSUB 380
330 OPEN "f:tr5.buf" FOR INPUT AS #1:GOSUB 380
340 OPEN "f:tr6.buf" FOR INPUT AS #1:GOSUB 380
350 OPEN "f:tr7.buf" FOR INPUT AS #1:GOSUB 380
360 OPEN "f:tr8.buf" FOR INPUT AS #1:GOSUB 380
370 CLOSE #2:RETURN
380 FOR I=1 TO ((LOF(1)-1)/2)
390 E1$=INPUT$(1,#1):E2$=INPUT$(1,#1)
400 PRINT #2,CHR$(VAL("&H"+E1$+E2$));:PRINT E1$+E2$+" ";:NEXT I
410 CLOSE #1:RETURN
420 FF=FF+FD/2:F2=FF MOD 256:F1=INT(FF/256)
430 PRINT #2,CHR$(F2);:PRINT #2,CHR$(F1);:PRINT "#";:RETURN
440 '***** TESTER Format *****************************************
450 DIM D(5000,4)
460 IF PHASE>2 THEN RETURN
470 OPEN "f:tr1.trk" FOR INPUT AS #1
480 OPEN "f:tr1.buf" FOR OUTPUT AS #2
490 GOSUB 720
500 OPEN "f:tr2.trk" FOR INPUT AS #1
510 OPEN "f:tr2.buf" FOR OUTPUT AS #2
520 GOSUB 720
530 OPEN "f:tr3.trk" FOR INPUT AS #1
540 OPEN "f:tr3.buf" FOR OUTPUT AS #2
550 GOSUB 720
560 OPEN "f:tr4.trk" FOR INPUT AS #1
570 OPEN "f:tr4.buf" FOR OUTPUT AS #2
580 GOSUB 720
590 OPEN "f:tr5.trk" FOR INPUT AS #1
600 OPEN "f:tr5.buf" FOR OUTPUT AS #2
610 GOSUB 720
620 OPEN "f:tr6.trk" FOR INPUT AS #1
630 OPEN "f:tr6.buf" FOR OUTPUT AS #2
640 GOSUB 720
650 OPEN "f:tr7.trk" FOR INPUT AS #1
660 OPEN "f:tr7.buf" FOR OUTPUT AS #2
670 GOSUB 720
680 OPEN "f:tr8.trk" FOR INPUT AS #1
690 OPEN "f:tr8.buf" FOR OUTPUT AS #2
700 GOSUB 720
710 RETURN
720 I=1:MK=0
730 IF EOF(1) THEN 800 ELSE INPUT #1,TM,ST,KN,VL
740 PRINT HEX$(TM),HEX$(ST),HEX$(KN),HEX$(VL):MK=1:TB=0
750 IF ST>&HBF THEN TB=TM:D(I,2)=&HC0:D(I,3)=KN:I=I+1:GOTO 730
760 IF VL>0 THEN D(I,1)=TM+TB:D(I,2)=KN:D(I,4)=VL:I=I+1:GOTO 730
770 FOR J=I-1 TO 1 STEP -1
780 IF D(J,2)=KN THEN D(J,3)=TM+TB:GOTO 730
790 NEXT J:PRINT "Error !!!":END
800 IF MK=0 THEN 880
810 FOR J=1 TO I-2
820 IF D(J,2)=&HC0 THEN 840
830 D1=D(J,2):D2=D(J+1,1)-D(J,1):D3=D(J,3)-D(J,1):D4=D(J,4):GOTO 860
840 D1=&HC0:D2=D(J,3):D3=0:D4=0:GOSUB 890
850 D1=&H80:D2=D(J+1,1)-D(J,1):D3=0:D4=0
860 PRINT "*";:GOSUB 890:NEXT J
870 D1=D(J,2):D2=D(J,3)-D(J,1):D3=D(J,3)-D(J,1):D4=D(J,4):GOSUB 890
880 D1=&HD0:D2=0:D3=0:D4=0:GOSUB 890:CLOSE:RETURN
890 IF D2>255 THEN DN=D2-255:DM=D1:D1=&H80:D2=&HFF:D3=0:D4=0:GOSUB 910:D1=DM:D2=DN:GOTO 890
900 IF D3>255 THEN D3=D3 AND 255:PRINT " $$$ ";
910 IF D1<16 THEN PRINT #2,"0"+HEX$(D1); ELSE PRINT #2,HEX$(D1);
920 IF D2<16 THEN PRINT #2,"0"+HEX$(D2); ELSE PRINT #2,HEX$(D2);
930 IF D3<16 THEN PRINT #2,"0"+HEX$(D3); ELSE PRINT #2,HEX$(D3);
940 IF D4<16 THEN PRINT #2,"0"+HEX$(D4); ELSE PRINT #2,HEX$(D4);
950 RETURN
960 '***** Init File Read *****************************************
970 IF PHASE>0 THEN 1020
980 'CHDIR "a:\data"
990 'SHELL "copy a:"+G$+".dat f:"+G$+".dat"
1000 'SHELL "hdcut f:"+G$+".dat f:"+G$+".cut"
1010 SHELL "bin2asc f:"+G$+".cut f:"+G$+".asc":CLS
1020 IF PHASE>1 THEN 1510
1030 DIM AS(16):RESTORE 30
1040 FOR I=1 TO 16:READ AS(I):NEXT I
1050 OPEN "f:"+G$+".asc" FOR INPUT AS #10
1060 OPEN "f:tr1.trk" FOR OUTPUT AS #1
1070 OPEN "f:tr2.trk" FOR OUTPUT AS #2
1080 OPEN "f:tr3.trk" FOR OUTPUT AS #3
1090 OPEN "f:tr4.trk" FOR OUTPUT AS #4
1100 OPEN "f:tr5.trk" FOR OUTPUT AS #5
1110 OPEN "f:tr6.trk" FOR OUTPUT AS #6
1120 OPEN "f:tr7.trk" FOR OUTPUT AS #7
1130 OPEN "f:tr8.trk" FOR OUTPUT AS #8
1140 ZM=0
1150 IF EOF(10) THEN 1510 ELSE IP1$=INPUT$(1,#10):IP2$=INPUT$(1,#10)
1160 DT1=16*VAL("&H"+IP1$)+VAL("&H"+IP2$):ZM=ZM+DT1
1170 IF DT1=&HF8 THEN 1510
1180 IP1$=INPUT$(1,#10):IP2$=INPUT$(1,#10)
1190 GOSUB 1220
1200 PRINT ZM,HEX$(DT1),HEX$(DT2),HEX$(DT3),HEX$(DT4)
1210 GOTO 1150
1220 DT2=16*VAL("&H"+IP1$)+VAL("&H"+IP2$)
1230 IF DT2<&H80 AND ST>&HBF AND ST<&HD0 THEN 1360
1240 IF DT2<&H80 AND ST>&H8F AND ST<&HA0 THEN 1380
1250 IF DT2>&HBF AND DT2<&HD0 THEN 1330
1260 IF DT2>&H8F AND DT2<&HA0 THEN 1280
1270 PRINT "Error":END
1280 ST=DT2:IP1$=INPUT$(1,#10):IP2$=INPUT$(1,#10)
1290 DT3=16*VAL("&H"+IP1$)+VAL("&H"+IP2$)
1300 IP1$=INPUT$(1,#10):IP2$=INPUT$(1,#10)
1310 DT4=16*VAL("&H"+IP1$)+VAL("&H"+IP2$)
1320 GOSUB 1410:RETURN
1330 ST=DT2:IP1$=INPUT$(1,#10):IP2$=INPUT$(1,#10)
1340 DT3=16*VAL("&H"+IP1$)+VAL("&H"+IP2$):DT4=0
1350 GOSUB 1410:RETURN
1360 DT3=DT2:DT2=ST:DT4=0
1370 GOSUB 1410:RETURN
1380 DT3=DT2:DT2=ST:IP1$=INPUT$(1,#10):IP2$=INPUT$(1,#10)
1390 DT4=16*VAL("&H"+IP1$)+VAL("&H"+IP2$)
1400 GOSUB 1410:RETURN
1410 CH=DT2 AND &HF:IF AS(CH+1)>16 THEN RETURN
1420 ON AS(CH+1) GOTO 1430,1440,1450,1460,1470,1480,1490,1500
1430 PRINT #1,ZM/QT,DT2,DT3,DT4:RETURN
1440 PRINT #2,ZM/QT,DT2,DT3,DT4:RETURN
1450 PRINT #3,ZM/QT,DT2,DT3,DT4:RETURN
1460 PRINT #4,ZM/QT,DT2,DT3,DT4:RETURN
1470 PRINT #5,ZM/QT,DT2,DT3,DT4:RETURN
1480 PRINT #6,ZM/QT,DT2,DT3,DT4:RETURN
1490 PRINT #7,ZM/QT,DT2,DT3,DT4:RETURN
1500 PRINT #8,ZM/QT,DT2,DT3,DT4:RETURN
1510 CLOSE:RETURN
1520 '***** Debug Only *****************************************
1530 OPEN "f:tr6.trk" FOR INPUT AS #1
1540 IF EOF(1) THEN END
1550 INPUT #1,A,B,C,D
1560 PRINT HEX$(A),HEX$(B),HEX$(C),HEX$(D)
1570 GOTO 1540
10 'save "dsp-fno.bas",a
20 KEY OFF
30 CLS:DIM X$(12):FOR I=0 TO 11:X$(I)=" db ":NEXT I
40 DIM Y$(12):FOR I=0 TO 11:Y$(I)=" db ":NEXT I
50 DIM Z$(12):FOR I=0 TO 11:Z$(I)=" db ":NEXT I
60 G#=3520#*(2#^(10.5#/12#)):H#=(2#^(1#/12#/32#)):A#=(2#^(1#/12#)):FOR I=0 TO 11
70 PRINT :PRINT :PRINT :PRINT :PRINT
80 RESTORE 210:FOR K=1 TO (12-I):READ A$:NEXT K:PRINT "===== [ ";A$;" ] ====="
90 B#=1#/A#:FOR N=0 TO I:B#=B#*A#:NEXT N
100 FOR L=0 TO 31:PRINT " Offset (";:E$=HEX$(L):IF LEN(E$)=1 THEN E$="0"+E$
110 PRINT E$;") :";:P#=1#/H#:FOR N=0 TO L:P#=P#*H#:NEXT N:U$=HEX$(L):IF LEN(U$)=1 THEN U$="0"+U$
120 O#=G#*P#*B#:PRINT " f =";:PRINT USING "#####.######";O#;:PRINT "Hz";
130 Q#=2#^24#*O#/62500#:C$=HEX$(INT(Q#)/256):PRINT " Data = ";C$;
140 D$=HEX$(INT(Q#)-256*INT(Q#/256)):IF LEN(D$)=1 THEN D$="0"+D$
150 PRINT D$;:PRINT:X$(I)=X$(I)+"0"+LEFT$(C$,2)+"h,"
160 Y$(I)=Y$(I)+"0"+RIGHT$(C$,2)+"h,":Z$(I)=Z$(I)+"0"+D$+"h,"
170 IF L MOD 16<>15 THEN 190
180 IF INKEY$="" THEN 180 ELSE CLS
190 NEXT L:PRINT
200 NEXT I
210 DATA "G -9","F#-9","F -9","E -9"
220 DATA "Eb-9","D -9","C#-9","C -9","B -8","Bb-8","A -8","Ab-8"
10 'save "dspedit.bas",a
20 DATA 2,0,1,1,1,3,3,3,3,3,3,3,3,3,3,3
30 CLS:DIM F$(64):GOSUB 2460:GOSUB 2280:GOSUB 2590:'<--- File Access
40 '''A$="c:dsdemo2.dat":'********* D U M M Y ************
50 PRINT:PRINT :GOSUB 1370:CLS:GOTO 740
60 VIEW PRINT 1 TO 23:LOCATE 15,5:PRINT "<< PHASE #7 : Head Block Set >>"
70 DIM HEAD(64):FOR I=1 TO 16:HEAD(I-1)=ASC(MID$(NSM$,I,1)):NEXT I
80 VIEW PRINT 17 TO 22:FOR I=0 TO 15:PRINT HEAD(I);:NEXT I
90 FOR I=16 TO 33:HEAD(I)=0:NEXT I:HEAD(&H14)=4:HEAD(&H15)=120
100 IF TIMMAX=576 THEN HEAD(&H13)=3 ELSE HEAD(&H13)=4
110 HEAD(&H22)=(4*EVECTB+12) MOD 256
120 HEAD(&H23)=INT((4*EVECTB+12)/256)
130 HEAD(&H24)=((4*(EVECTB+EVECTC)+24) MOD 256)
140 HEAD(&H25)=INT((4*(EVECTB+EVECTC)+24)/256)
150 FOR I=0 TO 12
160 HEAD(&H26+2*I)=((4*(EVECTB+EVECTC+EVECTR)+36+4*I) MOD 256)
170 HEAD(&H27+2*I)=INT((4*(EVECTB+EVECTC+EVECTR)+36+4*I)/256)
180 NEXT I
190 PRINT:FOR I=16 TO 63:PRINT HEAD(I);:NEXT I
200 DIM ENDMK(4):ENDMK(1)=&HFC:ENDMK(2)=0:ENDMK(3)=0:ENDMK(4)=0
210 DIM LOPMK(4):LOPMK(1)=&HE1:LOPMK(2)=0:LOPMK(3)=0:LOPMK(4)=0
220 OPEN NKM$ FOR OUTPUT AS #3
230 FOR I=0 TO 63:PRINT #3,CHR$(HEAD(I));:NEXT I
240 FOR I=1 TO EVECTB:FOR K=1 TO 4:PRINT #3,CHR$(CH1(K,I));:NEXT K:NEXT I
250 TSUM=0:FOR I=1 TO EVECTB:TSUM=TSUM+CH1(2,I):NEXT I
260 PRINT #3,CHR$(&HF8);
270 PRINT #3,CHR$(INT(TIMMAX/IQ)-TSUM);
280 PRINT #3,CHR$(0);:PRINT #3,CHR$(0);
290 FOR K=1 TO 4:PRINT #3,CHR$(LOPMK(K));:NEXT K
300 FOR K=1 TO 4:PRINT #3,CHR$(ENDMK(K));:NEXT K
310 FOR I=1 TO EVECTC:FOR K=1 TO 4:PRINT #3,CHR$(CH2(K,I));:NEXT K:NEXT I
320 TSUM=0:FOR I=1 TO EVECTC:TSUM=TSUM+CH2(2,I):NEXT I
330 PRINT #3,CHR$(&HF8);
340 PRINT #3,CHR$(INT(TIMMAX/IQ)-TSUM);
350 PRINT #3,CHR$(0);:PRINT #3,CHR$(0);
360 FOR K=1 TO 4:PRINT #3,CHR$(LOPMK(K));:NEXT K
370 FOR K=1 TO 4:PRINT #3,CHR$(ENDMK(K));:NEXT K
380 FOR I=1 TO EVECTR:FOR K=1 TO 4:PRINT #3,CHR$(CH3(K,I));:NEXT K:NEXT I
390 TSUM=0:FOR I=1 TO EVECTR:TSUM=TSUM+CH3(2,I):NEXT I
400 PRINT #3,CHR$(&HF8);
410 PRINT #3,CHR$(INT(TIMMAX/IQ)-TSUM);
420 PRINT #3,CHR$(0);:PRINT #3,CHR$(0);
430 FOR K=1 TO 4:PRINT #3,CHR$(LOPMK(K));:NEXT K
440 FOR I=1 TO 14:FOR K=1 TO 4:PRINT #3,CHR$(ENDMK(K));:NEXT K:NEXT I
450 CLOSE #3
460 FOR I=1 TO 8:PRINT:NEXT I
470 VIEW PRINT 1 TO 23:LOCATE 15,5:PRINT " "
480 LOCATE 12,15:PRINT "***** <File Conversion> is completely finished."
490 PRINT
500 END:''' VIEW PRINT 1 TO 23:KEY ON:END:'***************
510 VIEW PRINT 1 TO 23:LOCATE 15,5:PRINT "<< PHASE #6 : 24's Normalize >>"
520 VIEW PRINT 17 TO 22:PRINT "Max Time Count =";TIMMAX
530 IF PRM6=1 THEN LPRINT:LPRINT "***** Quantize Normalise *****"
540 IF PRM6=1 THEN LPRINT:LPRINT "<BASS>"
550 FOR I=1 TO EVECTB:CH1(2,I)=INT(CH1(2,I)/IQ):CH1(3,I)=INT(CH1(3,I)/IQ):NEXT I
560 FOR J=1 TO EVECTB:IF PRM6=0 THEN 580
570 LPRINT HEX$(CH1(1,J));" ";CH1(2,J);CH1(3,J);" ";HEX$(CH1(4,J))
580 PRINT HEX$(CH1(1,J));" ";CH1(2,J);CH1(3,J);" ";HEX$(CH1(4,J))
590 NEXT J
600 IF PRM6=1 THEN LPRINT:LPRINT "<CHORD>"
610 FOR I=1 TO EVECTC:CH2(2,I)=INT(CH2(2,I)/IQ):CH2(3,I)=INT(CH2(3,I)/IQ):NEXT I
620 FOR J=1 TO EVECTC:IF PRM6=0 THEN 640
630 LPRINT HEX$(CH2(1,J));" ";CH2(2,J);CH2(3,J);" ";HEX$(CH2(4,J))
640 PRINT HEX$(CH2(1,J));" ";CH2(2,J);CH2(3,J);" ";HEX$(CH2(4,J))
650 NEXT J
660 IF PRM6=1 THEN LPRINT:LPRINT "<RHYTHM>"
670 FOR I=1 TO EVECTR:CH3(2,I)=INT(CH3(2,I)/IQ):CH3(3,I)=INT(CH3(3,I)/IQ):NEXT I
680 FOR J=1 TO EVECTR:IF PRM6=0 THEN 700
690 LPRINT HEX$(CH3(1,J));" ";CH3(2,J);CH3(3,J);" ";HEX$(CH3(4,J))
700 PRINT HEX$(CH3(1,J));" ";CH3(2,J);CH3(3,J);" ";HEX$(CH3(4,J))
710 NEXT J
720 FOR I=1 TO 6:PRINT :NEXT I
730 GOTO 60
740 OPEN A$ FOR INPUT AS #1:LL=LOF(1):LOCATE 1,10:PRINT "File Name = ";A$;
750 PRINT " ( Data Length =";LL;"Bytes )":DIM D(LL)
760 IF PRM6+PRM5+PRM4+PRM3+PRM2+PRM1<>0 THEN LPRINT "File Name = ";A$:LPRINT
770 LOCATE 3,10:PRINT"Ch.Assign : Bass < 1st Track > = ";
780 FOR I=0 TO 15:IF AS(I)=O THEN PRINT HEX$(I+1);" ";
790 NEXT I:LOCATE 4,10:PRINT" Chord < 2nd Track > = ";
800 FOR I=0 TO 15:IF AS(I)=1 THEN PRINT HEX$(I+1);" ";
810 NEXT I:LOCATE 5,10:PRINT" Rhythm < 3rd Track > = ";
820 FOR I=0 TO 15:IF AS(I)=2 THEN PRINT HEX$(I+1);" ";
830 NEXT I
840 GOTO 1460:'-----------------------------------------------------
850 IF PRM4=0 THEN 880
860 LPRINT " <Over-Check> Source = [";EVC(0);EVC(1);EVC(2);"]"
870 LPRINT " <Over-Check> Result = [";MAXB;MAXC;MAXR;"]"
880 VIEW PRINT 1 TO 23:LOCATE 7,10:PRINT "Double Event Check : (";
890 PRINT EVC(0);EVC(1);EVC(2);") --> (";MAXB;MAXC;MAXR;")"
900 LOCATE 13,5:PRINT " "
910 LOCATE 15,5:PRINT "<< PHASE #5 : KAMIYA Convert >>"
920 LOCATE 9,10:PRINT "Making File = ";NKM$;" ( Song Name = [";NSM$;"] )"
930 DIM CH1(4,MAXB),CH2(4,MAXC),CH3(4,MAXR):VIEW PRINT 17 TO 22
940 CNTB=2:CNTC=2:CNTR=2
950 CH1(1,1)=BASS(2,1):CH1(2,1)=0:CH1(3,1)=0:CH1(4,1)=BASS(3,1)
960 CH2(1,1)=CHORD(2,1):CH2(2,1)=0:CH2(3,1)=0:CH2(4,1)=CHORD(3,1)
970 CH3(1,1)=RHYTHM(2,1):CH3(2,1)=0:CH3(3,1)=0:CH3(4,1)=RHYTHM(3,1)
980 FOR I=2 TO MAXB:IF BASS(3,I)=0 THEN 1030
990 CH1(1,CNTB)=BASS(2,I):CH1(2,CNTB)=BASS(1,I)
1000 CH1(3,CNTB)=BASS(1,I):CH1(4,CNTB)=BASS(3,I)
1010 CH1(2,CNTB-1)=BASS(1,I)-CH1(2,CNTB-1)
1020 JJ=CNTB:CNTB=CNTB+1:GOTO 1050
1030 FOR J=CNTB-1 TO -1 STEP -1:IF BASS(2,I)=CH1(1,J) THEN 1040 ELSE NEXT J
1040 CH1(3,J)=BASS(1,I)-CH1(3,J)
1050 NEXT I:CH1(2,JJ)=BASS(1,I-1)-CH1(2,JJ):EVECTB=JJ
1060 FOR J=1 TO JJ:IF PRM5=0 THEN 1080
1070 LPRINT HEX$(CH1(1,J));" ";CH1(2,J);CH1(3,J);" ";HEX$(CH1(4,J))
1080 PRINT HEX$(CH1(1,J));" ";CH1(2,J);CH1(3,J);" ";HEX$(CH1(4,J))
1090 NEXT J
1100 FOR I=2 TO MAXC:IF CHORD(3,I)=0 THEN 1150
1110 CH2(1,CNTC)=CHORD(2,I):CH2(2,CNTC)=CHORD(1,I)
1120 CH2(3,CNTC)=CHORD(1,I):CH2(4,CNTC)=CHORD(3,I)
1130 CH2(2,CNTC-1)=CHORD(1,I)-CH2(2,CNTC-1)
1140 JJ=CNTC:CNTC=CNTC+1:GOTO 1170
1150 FOR J=CNTC-1 TO -1 STEP -1:IF CHORD(2,I)=CH2(1,J) THEN 1160 ELSE NEXT J
1160 CH2(3,J)=CHORD(1,I)-CH2(3,J)
1170 NEXT I:CH2(2,JJ)=CHORD(1,I-1)-CH2(2,JJ):EVECTC=JJ
1180 FOR J=1 TO JJ:IF PRM5=0 THEN 1200
1190 LPRINT HEX$(CH2(1,J));" ";CH2(2,J);CH2(3,J);" ";HEX$(CH2(4,J))
1200 PRINT HEX$(CH2(1,J));" ";CH2(2,J);CH2(3,J);" ";HEX$(CH2(4,J))
1210 NEXT J
1220 FOR I=2 TO MAXR:IF RHYTHM(3,I)=0 THEN 1270
1230 CH3(1,CNTR)=RHYTHM(2,I):CH3(2,CNTR)=RHYTHM(1,I)
1240 CH3(3,CNTR)=RHYTHM(1,I):CH3(4,CNTR)=RHYTHM(3,I)
1250 CH3(2,CNTR-1)=RHYTHM(1,I)-CH3(2,CNTR-1)
1260 JJ=CNTR:CNTR=CNTR+1:GOTO 1290
1270 FOR J=CNTR-1 TO -1 STEP -1:IF RHYTHM(2,I)=CH3(1,J) THEN 1280 ELSE NEXT J
1280 CH3(3,J)=RHYTHM(1,I)-CH3(3,J)
1290 NEXT I:CH3(2,JJ)=RHYTHM(1,I-1)-CH3(2,JJ):EVECTR=JJ
1300 FOR J=1 TO JJ:IF PRM5=0 THEN 1320
1310 LPRINT HEX$(CH3(1,J));" ";CH3(2,J);CH3(3,J);" ";HEX$(CH3(4,J))
1320 PRINT HEX$(CH3(1,J));" ";CH3(2,J);CH3(3,J);" ";HEX$(CH3(4,J))
1330 NEXT J
1340 FOR I=1 TO 6:PRINT :NEXT I
1350 GOTO 510
1360 ' -------------------------------------------
1370 PRINT "Selected Data File Name = ";A$:PRINT
1380 PRINT " Output [TESTER] File Name = ";LEFT$(A$,2);
1390 INPUT "",NKM$:IF NKM$<>"" THEN NKM$=LEFT$(A$,2)+NKM$+".KMY":PRINT:GOTO 1430
1400 FOR I=1 TO 10:PP$=MID$(A$,I,1):IF PP$="." THEN 1420
1410 NKM$=NKM$+PP$:NEXT I
1420 NKM$=NKM$+".KMY":PRINT
1430 INPUT " Song Name = ",NSM$:IF LEN(NSM$)>16 THEN NSM$=LEFT$(NSM$,16)
1440 IF LEN(NSM$)<16 THEN NSM$=NSM$+STRING$(16-LEN(NSM$)," ")
1450 PRINT :RETURN
1460 LOCATE 13,5:PRINT "<< PHASE #1 : Data File Read >>":VIEW PRINT 15 TO 22
1470 FOR I=1 TO LL:B$=INPUT$(1,#1):C=ASC(B$):D$="":IF C<16 THEN D$="0"
1480 D(I)=C:PRINT D$+HEX$(C);" ";:IF I MOD 25=0 THEN PRINT
1490 IF PRM1=1 THEN LPRINT D$+HEX$(C);" ";:IF I MOD 25=0 THEN LPRINT
1500 NEXT I:CLOSE #1:FOR I=1 TO 8:PRINT :NEXT I
1510 VIEW PRINT 1 TO 23:LOCATE 13,5:PRINT "<< PHASE #2 : Format Convert >>"
1520 VIEW PRINT 15 TO 22:DIM FM(INT(LL/3),4):TIM=0:EVE=1:LOP=0
1530 GOSUB 2430:TIM=TIM+TB:GOSUB 2350:FM(EVE,1)=TIM:FM(EVE,2)=ST
1540 FM(EVE,3)=D(LOP):IF ST>&HBF AND ST<&HD0 THEN FM(EVE,4)=0:GOTO 1560
1550 LOP=LOP+1:FM(EVE,4)=D(LOP)
1560 IF PRM2=0 THEN 1600 ELSE IF EVE=1 THEN LPRINT
1570 LPRINT " Event NO. =";EVE;" --- Time =";FM(EVE,1);" --- Data = [ ";
1580 FOR K=2 TO 4:PD=FM(EVE,K):DM$="":IF PD<16 THEN DM$="0"
1590 LPRINT DM$+HEX$(PD)+" ";:NEXT K:LPRINT "]"
1600 PRINT " Event NO. =";EVE;" --- Time =";FM(EVE,1);" --- Data = [ ";
1610 FOR K=2 TO 4:PD=FM(EVE,K):DM$="":IF PD<16 THEN DM$="0"
1620 PRINT DM$+HEX$(PD)+" ";:NEXT K:PRINT "]"
1630 EVE=EVE+1:GOTO 1530
1640 TIMMAX=TIM:FOR I=1 TO 8:PRINT :NEXT I:VIEW PRINT 1 TO 23
1650 LOCATE 13,5:PRINT "<< PHASE #3 : Channel Assign >>":VIEW PRINT 15 TO 22
1660 DIM RD(3,4,EVE),EVC(3):TOF=0:FOR I=0 TO 3:EVC(I)=0:NEXT I
1670 DIM NM$(3):NM$(0)="Bass ":NM$(1)="Chord ":NM$(2)="Rhythm"
1680 FOR I=1 TO EVE-1:IF FM(I,2)>&H9F THEN TOF=TOF+FM(I,1):GOTO 1790
1690 CY=AS(FM(I,2) MOD 16):IF CY>2 THEN TOF=TOF+FM(I,1):GOTO 1790
1700 EVC(CY)=EVC(CY)+1:FOR K=1 TO 4:RD(CY,K,EVC(CY))=FM(I,K):NEXT K
1710 IF (FM(I,4)<>0 AND &H8F<FM(I,2)) THEN 1730
1720 RD(CY,2,EVC(CY))=0:RD(CY,4,EVC(CY))=0
1730 PRINT " [ "+NM$(CY);" ] --- Time =";RD(CY,1,EVC(CY));" ";
1740 PRINT "Note = ";HEX$(RD(CY,3,EVC(CY)));" ";
1750 PRINT "Velocity = ";HEX$(RD(CY,4,EVC(CY))):IF PRM3=0 THEN 1790
1760 LPRINT " [ "+NM$(CY);" ] --- Time =";RD(CY,1,EVC(CY));" ";
1770 LPRINT "Note = ";HEX$(RD(CY,3,EVC(CY)));" ";
1780 LPRINT "Velocity = ";HEX$(RD(CY,4,EVC(CY)))
1790 NEXT I:FOR I=1 TO 8:PRINT :NEXT I:VIEW PRINT 1 TO 23
1800 LOCATE 13,5:PRINT "<< PHASE #4 : Override Check >>":VIEW PRINT 15 TO 22
1810 DIM BASS(3,EVC(0)):CTT=0:FOR I=1 TO EVC(0):IF RD(0,4,I)=0 THEN 1860
1820 FOR J=I-1 TO 1 STEP -1
1830 IF RD(0,3,J)=RD(0,3,I) AND RD(0,4,J)=0 THEN 1900
1840 IF RD(0,3,J)=RD(0,3,I) AND RD(0,4,J)<>0 THEN 1950
1850 NEXT J:GOTO 1900
1860 FOR J=I-1 TO 1 STEP -1
1870 IF RD(0,3,J)=RD(0,3,I) AND RD(0,4,J)<>0 THEN 1900
1880 IF RD(0,3,J)=RD(0,3,I) AND RD(0,4,J)=0 THEN 1950
1890 NEXT J
1900 CTT=CTT+1
1910 BASS(1,CTT)=RD(0,1,I):BASS(2,CTT)=RD(0,3,I):BASS(3,CTT)=RD(0,4,I)
1920 FOR K=1 TO 3:PRINT HEX$(BASS(K,CTT));" ";:NEXT K
1930 IF PRM4=0 THEN 1950
1940 FOR K=1 TO 3:LPRINT HEX$(BASS(K,CTT));" ";:NEXT K:LPRINT "/ ";
1950 NEXT I:MAXB=CTT
1960 DIM CHORD(3,EVC(1)):CTT=0:FOR I=1 TO EVC(1):IF RD(1,4,I)=0 THEN 2010
1970 FOR J=I-1 TO 1 STEP -1
1980 IF RD(1,3,J)=RD(1,3,I) AND RD(1,4,J)=0 THEN 2050
1990 IF RD(1,3,J)=RD(1,3,I) AND RD(1,4,J)<>0 THEN 2100
2000 NEXT J:GOTO 2050
2010 FOR J=I-1 TO 1 STEP -1
2020 IF RD(1,3,J)=RD(1,3,I) AND RD(1,4,J)<>0 THEN 2050
2030 IF RD(1,3,J)=RD(1,3,I) AND RD(1,4,J)=0 THEN 2100
2040 NEXT J
2050 CTT=CTT+1
2060 CHORD(1,CTT)=RD(1,1,I):CHORD(2,CTT)=RD(1,3,I):CHORD(3,CTT)=RD(1,4,I)
2070 FOR K=1 TO 3:PRINT HEX$(CHORD(K,CTT));" ";:NEXT K
2080 IF PRM4=0 THEN 2100
2090 FOR K=1 TO 3:LPRINT HEX$(CHORD(K,CTT));" ";:NEXT K:LPRINT "/ ";
2100 NEXT I:MAXC=CTT
2110 DIM RHYTHM(3,EVC(2)):CTT=0:FOR I=1 TO EVC(2):IF RD(2,4,I)=0 THEN 2160
2120 FOR J=I-1 TO 1 STEP -1
2130 IF RD(2,3,J)=RD(2,3,I) AND RD(2,4,J)=0 THEN 2200
2140 IF RD(2,3,J)=RD(2,3,I) AND RD(2,4,J)<>0 THEN 2250
2150 NEXT J:GOTO 2200
2160 FOR J=I-1 TO 1 STEP -1
2170 IF RD(2,3,J)=RD(2,3,I) AND RD(2,4,J)<>0 THEN 2200
2180 IF RD(2,3,J)=RD(2,3,I) AND RD(2,4,J)=0 THEN 2250
2190 NEXT J
2200 CTT=CTT+1
2210 RHYTHM(1,CTT)=RD(2,1,I):RHYTHM(2,CTT)=RD(2,3,I):RHYTHM(3,CTT)=RD(2,4,I)
2220 FOR K=1 TO 3:PRINT HEX$(RHYTHM(K,CTT));" ";:NEXT K
2230 IF PRM4=0 THEN 2250
2240 FOR K=1 TO 3:LPRINT HEX$(RHYTHM(K,CTT));" ";:NEXT K:LPRINT "/ ";
2250 NEXT I:MAXR=CTT
2260 FOR I=1 TO 8:PRINT :NEXT I:GOTO 850
2270 '--------------------------------------------------------------
2280 DIM AS(16):PRINT "MIDI Channel Assign ( Default=Below ) :":PRINT
2290 RESTORE 20:FOR I=0 TO 15:READ AS(I):NEXT I
2300 PRINT " [0] = Bass , [1] = Chord , [2] = Rhythm":PRINT
2310 FOR I=0 TO 15:PRINT " Ch(";HEX$(I);") =";AS(I);:NEXT I:PRINT
2320 PRINT:INPUT " Ok (Y/N) ? ",A$:IF A$<>"n" THEN PRINT:RETURN
2330 PRINT:FOR I=0 TO 15:PRINT " Channel [";HEX$(I);:INPUT "] ---> ",AS(I)
2340 NEXT I:PRINT:PRINT "New Assigned Channel :":PRINT :GOTO 2300
2350 LOP=LOP+1:ST=D(LOP):IF 127<ST AND ST<255 THEN RST=ST:LOP=LOP+1:RETURN
2360 IF ST<128 THEN ST=RST:RETURN
2370 LOP=LOP+1:ME=D(LOP):LOP=LOP+1:MD=D(LOP):IF ME=&H2F AND MD=0 THEN RETURN 1640
2380 LOP=LOP+1:MA=D(LOP):LOP=LOP+1:MB=D(LOP)
2390 IF ME=8 AND MD=2 THEN BTB=256*MA+MB:RETURN 1530
2400 IF ME=&H50 AND MD=2 THEN STP=256*MA+MB:RETURN 1530
2410 IF ME=&H58 AND MD=2 THEN TSG=256*MA+MB:RETURN 1530
2420 BEEP:PRINT "Data Format Error !!!":END
2430 LOP=LOP+1:TB=D(LOP):IF TB<128 THEN RETURN
2440 LOP=LOP+1:TB1=D(LOP):IF TB1<128 THEN TB=128*(TB-128)+TB1:RETURN
2450 BEEP:PRINT "Delta Time Overflow !!!":END
2460 KEY OFF:PRM1=0:INPUT "[Original] Print Out (Y/N)? ",A$
2470 IF A$="q" THEN 2580 ELSE IF A$="y" THEN PRM1=1
2480 PRINT :PRM2=0:INPUT "[Source] Print Out (Y/N)? ",A$:IF A$="y" THEN PRM2=1
2490 PRINT :PRM3=0:INPUT "[Merged] Print Out (Y/N)? ",A$:IF A$="y" THEN PRM3=1
2500 PRINT :PRM4=0:INPUT "[Override] Print Out (Y/N)? ",A$:IF A$="y" THEN PRM4=1
2510 PRINT :PRM5=0:INPUT "[ST-GT] Print Out (Y/N)? ",A$:IF A$="y" THEN PRM5=1
2520 PRINT :PRM6=0:INPUT "[Normalize] Print Out (Y/N)? ",A$:IF A$="y" THEN PRM6=1
2530 PRINT :PRINT :IQ=4:PRINT "Input Quantize Rate : (1) 96 "
2540 PRINT " (2) 48 "
2550 PRINT " (3) 24 "
2560 PRINT " (4) 12 "
2570 PRINT :INPUT " Select --- ",IQS:IF IQS=1 THEN IQ=1 ELSE IF IQS=2 THEN IQ=2 ELSE IF IQS=4 THEN IQ=8
2580 PRINT :RETURN
2590 REM ##### Disk Access Subroutine #####
2600 INPUT "Select Disk DRIVE [a:/c:] --- ",DR$:IF DR$="" THEN DR$="C":J=1
2610 SHELL "dir "+DR$+":*.DAT > dirlist.mes":OPEN "dirlist.mes" FOR INPUT AS #2
2620 INPUT #2,F$(J):IF F$(J)="" THEN 2620 ELSE AA=ASC(F$(J))
2630 IF AA>64 AND AA<91 THEN F$(J)=LEFT$(F$(J),8):J=J+1
2640 IF AA>57 OR AA<48 THEN 2620 ELSE CLOSE #2:J=J-1
2650 CLS:PRINT "Select File :":K=J
2660 FOR I=1 TO J:LOCATE 3+INT((I-1)/5),8+14*((I-1) MOD 5):PRINT F$(I):NEXT I
2670 LOCATE 3+INT((J-1)/5),6+14*((J-1) MOD 5):PRINT "<";
2680 LOCATE 3+INT((J-1)/5),17+14*((J-1) MOD 5):PRINT ">";
2690 LOCATE 3+INT((J-1)/5),5+14*((J-1) MOD 5)
2700 B$=INKEY$:IF B$="" THEN 2700 ELSE IF B$=CHR$(13) THEN 2760
2710 IF LEN(B$)=1 THEN 2700
2720 IF ASC(RIGHT$(B$,1))=80 AND J=<K-5 THEN GOSUB 2770:J=J+5:GOTO 2670
2730 IF ASC(RIGHT$(B$,1))=77 AND J MOD 5<>0 AND J<K THEN GOSUB 2770:J=J+1:GOTO 2670
2740 IF ASC(RIGHT$(B$,1))=75 AND J MOD 5<>1 THEN GOSUB 2770:J=J-1:GOTO 2670
2750 IF ASC(RIGHT$(B$,1))=72 AND J>5 THEN GOSUB 2770:J=J-5:GOTO 2670 ELSE GOTO 2700
2760 A$=DR$+":"+F$(J)+".DAT":RETURN
2770 LOCATE 3+INT((J-1)/5),6+14*((J-1) MOD 5):PRINT " ";
2780 LOCATE 3+INT((J-1)/5),17+14*((J-1) MOD 5):PRINT " ";:RETURN
10 'save "macconv.bas",a 20 CHDIR "a:\data":DIM F$(150):J=1 30 SHELL "dir a:*.dat > c:dirlist.mes" 40 OPEN "c:dirlist.mes" FOR INPUT AS #1 50 IF EOF(1) THEN 80 60 INPUT #1,F$(J) 70 F$(J)=LEFT$(F$(J),8):J=J+1:GOTO 50 80 CLOSE #1 90 FOR I=5 TO J-3:PRINT F$(I);" ";:NEXT I 100 IF INKEY$="" THEN 100:'******************* 110 FOR I=5 TO J-3 120 G$="":FOR K=1 TO 8 130 H$=MID$(F$(I),K,1):IF H$<>" " THEN G$=G$+H$ 140 NEXT K 150 SHELL "trauto a:"+G$+".dat a:"+G$+".cut" 160 SHELL "bin2asc a:"+G$+".cut a:"+G$+".asc" 170 NEXT I
10 'save "miditest.bas",a 20 OPEN "com1:9600,n,8,1" AS #1 30 START$=":90":CLEAN$=":B07B00" 40 PRINT #1,START$; 50 FOR I=100 TO 30 STEP -1 60 PRINT #1,HEX$(I)+"7F"; 70 FOR J=1 TO 50:NEXT J 80 NEXT I 90 PRINT #1,CLEAN$;
10 'SAVE "nonline",A 20 KEY OFF:SCREEN 1:DIM A(256),B(256),X(4),Y(4) 30 X(1)=50:Y(1)=186:X(2)=400:Y(2)=360:X(3)=750:Y(3)=215:X(4)=750:Y(4)=564 40 FOR I=1 TO 4:LINE (X(I),Y(I)-128)-(X(I)+257,Y(I)+129),1,B:NEXT I 50 FOR I=1 TO 4:LINE (X(I),Y(I))-(X(I)+257,Y(I)),1,,&HCCCC:NEXT I 60 FOR I=1 TO 2:LINE (X(I)+257,Y(I))-(X(I+1),Y(I+1)),1,,&HFCFC:NEXT I 70 LINE (X(2)+257,Y(2))-(X(4),Y(4)),1,,&HFCFC 80 LOCATE 2,9,0:PRINT "Source Wave"; 90 LOCATE 3,63:PRINT "Result Wave"; 100 LOCATE 8,36:PRINT "Trans Wave"; 110 LOCATE 15,63:PRINT "Reverse Wave"; 120 FOR I=1 TO 256:GOSUB 170:PSET (X(1)+I,Y(1)+128-A(I)):NEXT I 130 FOR I=1 TO 256:GOSUB 180:PSET (X(2)+I,Y(2)+128-B(I)):NEXT I 140 FOR I=1 TO 256:PSET (X(3)+I,Y(3)+128-B(A(I))):NEXT I 150 FOR I=1 TO 256:PSET (X(4)+I,Y(4)+128-A(B(I))):NEXT I 160 A$=INKEY$:IF A$<>" " THEN 160 ELSE SCREEN 0:KEY ON:LOCATE 1,1,1:END 170 A(I)=INT(127.999*SIN(I*3.1415926535#/128)+128):RETURN 180 B(I)=I:RETURN
10 'save "outconv.bas",a 20 CHDIR "a:\data":DIM F$(150):J=1 30 SHELL "dir a:*.kmy > c:dirlist.mes" 40 OPEN "c:dirlist.mes" FOR INPUT AS #1 50 IF EOF(1) THEN 80 60 INPUT #1,F$(J) 70 F$(J)=LEFT$(F$(J),8):J=J+1:GOTO 50 80 CLOSE #1 90 FOR I=5 TO J-3:PRINT F$(I);" ";:NEXT I 100 IF INKEY$="" THEN 100:'******************* 110 CHDIR "a:\" 120 FOR I=5 TO J-3 130 G$="":FOR K=1 TO 8 140 H$=MID$(F$(I),K,1):IF H$<>" " THEN G$=G$+H$ 150 NEXT K 160 SHELL "bin2asc a:\data\"+G$+".kmy a:\"+G$+".asc /w" 170 NEXT I 10 'save "pccont1.bas",a 20 'save "a:control3.bas",a 30 GOSUB *PARAINIT:GOSUB *DISPINIT:GOSUB *PORTINIT 40 *MAIN:A$=INKEY$:IF A$="" THEN *MAIN 50 IF A$=CHR$(&H1B) THEN *FINISH 60 IF A$=CHR$(30) THEN GOSUB *UPMOVE 70 IF A$=" " OR A$=CHR$(31) THEN GOSUB *DOWNMOVE 80 IF A$=CHR$(253) OR A$=CHR$(13) THEN ON MASKOLD GOSUB *CABLE,*DUMMY,*DUMMY,*DUMMY,*DUMMY,*DUMMY,*DUMMY,*DUMMY,*DUMMY,*DUMMY,*DUMMY,*DUMMY 90 Z$=A$:GOSUB *DATADISP 100 GOTO *MAIN 110 *FINISH:CLS 2:CONSOLE 0,25,1,0,1:LOCATE ,,1:LIST 20-*FINISH:END 120 *INIT 130 RETURN 140 *DUMMY:RETURN 150 *CABLE:GOSUB *CLRSCRN:RESTORE *DATA2:READ NEX$:FOR I=1 TO 7:READ DD$:PRINT DD$:NEXT I:PRINT NEX$; 160 *CABLE1:DDIN$=INKEY$:IF DDIN$="" THEN *CABLE1 ELSE PRINT:FOR I=1 TO 7:READ DD$:PRINT DD$:NEXT I:PRINT NEX$; 170 *CABLE2:DDIN$=INKEY$:IF DDIN$="" THEN *CABLE2 ELSE GOSUB *CLRSCRN:RETURN 180 *DATADISP:PRINT HEX$(ASC(Z$));" ";:RETURN 190 *UPMOVE 200 MASKNEW=MASKNEW-1:IF MASKNEW=0 THEN MASKNEW=KINDS 210 GOSUB *CURSORWRITE:RETURN 220 *DOWNMOVE 230 MASKNEW=MASKNEW+1:IF MASKNEW>KINDS THEN MASKNEW=1 240 GOSUB *CURSORWRITE:RETURN 250 *CURSORWRITE 260 COLOR@ (12,MASKOLD+2)-(LEN(B$(MASKOLD))+13,MASKOLD+2),0 270 COLOR@ (12,MASKNEW+2)-(LEN(B$(MASKNEW))+13,MASKNEW+2),4 280 MASKOLD=MASKNEW:RETURN 290 *DISPINIT:WIDTH 80,25:CONSOLE ,,0,0,1 300 LOCATE 12,1:PRINT "C O N T R O L P A N E L" 310 LOCATE 50,1:PRINT "produced by Y.Nagashima" 320 COLOR@ (2,1)-(77,1),4 330 LOCATE 5,3:PRINT "[MENU]" 340 FOR I=1 TO KINDS 350 LOCATE 13,I+2:PRINT B$(I) 360 NEXT I 370 MASKOLD=1:MASKNEW=1:GOSUB *CURSORWRITE 380 LOCATE 0,16:PRINT "-----< Data Area >"+STRING$(62,"-") 390 CONSOLE 17,8:LOCATE 0,17,0:RETURN 400 *CLRSCRN:PRINT:PRINT:PRINT:PRINT:PRINT:PRINT:PRINT:PRINT:PRINT:LOCATE 0,17:RETURN 410 *PORTINIT:OPEN "com1:n81nn" AS#1:RETURN 420 *PARAINIT:KINDS=12:DIM B$(KINDS) 430 RESTORE *DATA1:FOR I=1 TO KINDS:READ B$(I):NEXT I:RETURN 440 *DATA1 450 DATA "MIDI Cable Connection List" 460 DATA "Initial System Setting","Parameter List Display" 470 DATA "Keyboard Parameter Change","MIDI SW Matrix Change" 480 DATA "The <BOX> Parameter Set","K-1m Exclusive Set" 490 DATA "Multi Track Sequencer","Program Change Control" 500 DATA "Dummy" 510 DATA "Load Parameter File","Save Current Parameter/Setting" 520 *DATA2 530 DATA " --------- ( Hit Any Key ! )" 540 DATA " (1) [LT] RS232C -----> [BOX] RS232C Port : DSUB" 550 DATA " (2) [Keyboard] Power Out -----> [BOX] Poewr In : MIDI-5" 560 DATA " (3) [BOX] MIDI Out -----> [Keyboard] MIDI In (1) : MIDI" 570 DATA " (4) [Keyboard] MIDI Out (1) -----> [BOX] MIDI In : MIDI" 575 DATA " (5) [BOX] Line Out (R/L) -----> Mixer / Amp : LINE" 580 DATA " (6) [Ext.KBD] MIDI Out -----> [Keyboard] MIDI In (2) : MIDI" 590 DATA " (7) [Keyboard] MIDI Out (2) -----> [Ext.KBD] MIDI In : MIDI" 610 DATA " (8) [Ext.KBD] Line Out (R/L) -----> Mixer / Amp : LINE" 620 DATA " (9) [K-1m] MIDI Out -----> [Keyboard] MIDI In (2) : MIDI" 630 DATA " (10) [Keyboard] MIDI Out (2) -----> [K-1m] MIDI In : MIDI" 640 DATA " (11) [K-1m] Line Out (R/L) -----> Mixer / Amp : LINE" 650 DATA " (12)" 660 DATA " (13)" 670 DATA " (14)" 10 'save "phase.bas",a 20 WEI=1.5:LIM=0:GOSUB 60 30 LIM=LIM+1:IF LIM>256*50 THEN 150 40 AAA=A(LIM MOD 256)+WEI*A((LIM+PH*INT(LIM/256)) MOD 256) 50 PSET (LIM MOD 2560,256+384*INT(LIM/2560)-INT(AAA/(1+WEI))):GOTO 30 60 CLS:INPUT "Input Phase Speed [0-255] --- ",PH 70 KEY OFF:SCREEN 1:DIM A(256) 80 WINDOW SCREEN (-9,-180)-(256*10+9,256*5+128*4+9):FOR I=0 TO 255 90 A(I)=INT(128+127.999*SIN(I*3.1415926535#/128)):NEXT I 100 FOR J=0 TO 4:FOR I=0 TO 256*9 STEP 256 110 LINE (I,J*384)-(I+256,J*384+256),1,B,&H1111:NEXT I 120 LINE (0,J*384)-(2560,J*384+256),1,B 130 LINE (0,J*384+128)-(2560,J*384+128),1,B,&H3333:NEXT J 140 LOCATE 1,40,0:PRINT "Phase = [";PH;"]";:RETURN 150 A$=INKEY$:IF A$<>" " THEN 150 ELSE SCREEN 0:KEY ON:LOCATE 1,1,1:END 10 'save "rain.bas",a 20 CT=20:KEY OFF:SCREEN 1:LOCATE 1,1,0 30 DIM R(3,20):FOR I=1 TO CT:R(1,I)=0:NEXT I 40 DIM RR(20):FOR I=1 TO 20:RR(I)=10*I:NEXT I 50 RANDOMIZE TIMER 60 FOR I=1 TO CT:IF R(1,I)=0 THEN 120 70 R(1,I)=R(1,I)+1:IF R(1,I)>20 THEN R(1,I)=0:GOTO 120 80 IF R(1,I)<6 THEN CIRCLE (R(2,I),R(3,I)),RR(R(1,I)),1:GOTO 120 90 IF R(1,I)>15 THEN CIRCLE (R(2,I),R(3,I)),RR(R(1,I)-5),0:GOTO 120 100 CIRCLE (R(2,I),R(3,I)),RR(R(1,I)),1 110 CIRCLE (R(2,I),R(3,I)),RR(R(1,I)-5),0 120 NEXT I 130 RND1=INT((CT-.01)*RND(1))+1:IF R(1,RND1)<>0 THEN 160 140 RND2=INT(1023.99*RND(2))+1:RND3=INT(767.99*RND(3))+1 150 R(1,RND1)=1:R(2,RND1)=RND2:R(3,RND1)=RND3:CIRCLE (RND2,RND3),10,1 160 IF INKEY$<>" " THEN 50 ELSE SCREEN 0:END 1000 'save "rnd",a 1010 DIM A(55,2) 1020 RANDOMIZE (33) 1030 FOR I=1 TO 55 : A(I,2)=0 : NEXT I 1040 OPEN "f:z.z" FOR OUTPUT AS #1 1050 FOR I=1 TO 55 1060 NO=INT(55*RND(1))+1 1070 IF A(NO,2)=1 THEN 1060 1080 A(NO,2)=1 1090 A$=HEX$(NO) 1100 PRINT A$;" "; 1110 PRINT #1,",0x"+A$ 1120 NEXT I 1130 CLOSE #1 1000 'save "rnd2",a 1010 DIM A(256,2) 1020 RANDOMIZE (33) 1030 FOR I=0 TO 255 : A(I,2)=0 : NEXT I 1040 OPEN "f:z.z" FOR OUTPUT AS #1 1050 FOR I=0 TO 25 1060 NO=INT(255.99*RND(1)) 1070 IF A(NO,2)=1 THEN 1060 1080 IF NO=26 THEN 1060 1090 A(NO,2)=1 1100 A$=HEX$(NO) 1110 PRINT A$;" "; 1120 PRINT #1,",0x"+A$ 1130 NEXT I 1140 NO=26 1150 A(NO,2)=1 1160 A$=HEX$(NO) 1170 PRINT A$;" "; 1180 PRINT #1,",0x"+A$ 1190 FOR I=27 TO 255 1200 NO=INT(255.99*RND(1)) 1210 IF A(NO,2)=1 THEN 1200 1220 A(NO,2)=1 1230 A$=HEX$(NO) 1240 PRINT A$;" "; 1250 PRINT #1,",0x"+A$ 1260 NEXT I 1270 CLOSE #1 10 'save "sine.bas",a 20 CLS:DIM X$(256):FOR I=0 TO 255:X$(I)=",":NEXT I 30 FOR I=0 TO 127 40 X=INT(127.999*SIN(I*3.141592*360/256/180)) 45 X$(I)=STR$(X) 50 PRINT X$(I);" "; 60 NEXT I 130 FOR I=0 TO 127 140 X=128+INT(127.999*SIN(I*3.141592*360/256/180)) 145 X$(I+128)=STR$(X) 150 PRINT X$(I+128);" "; 160 NEXT I 170 'OPEN "f:sine.dat" FOR OUTPUT AS #1 180 'FOR I=0 TO 255:PRINT #1,X$(I):NEXT I 210 'CLOSE #1:END
10 'save "tinycad",a
20 CLEAR ,&HC000:DEFINT I-N:DIM IC(33),DP(16)
30 LIM=200:IST=10:GR$="LINE":JX=330:JY=230:IUM=0:UM$="LIST File"
40 ISC=0:IDM=1:IGR=0
50 GOSUB 1580:GOSUB 1600
60 '### Main Menu ###
70 GOSUB 1530:GOSUB 1160:GOSUB 350
80 GOSUB 940:IPH=0
90 Z$=INKEY$:IF Z$="" THEN 90 ELSE IF LEN(Z$)=2 THEN Z$=RIGHT$(Z$,1)
100 IF Z$=CHR$(72) THEN GOSUB 300:GOTO 90
110 IF Z$=CHR$(80) THEN GOSUB 310:GOTO 90
120 IF Z$=CHR$(77) THEN GOSUB 320:GOTO 90
130 IF Z$=CHR$(75) THEN GOSUB 330:GOTO 90
140 IF Z$=CHR$(13) AND IPH=0 THEN GOSUB 1000:IPH=1:GOTO 90
150 IF Z$=CHR$(13) AND IPH=1 THEN ITI=1:GOSUB 1010:IPH=0:GOTO 90
160 IF Z$=" " AND ISC=0 THEN ISC=1:GOTO 80
170 IF Z$=" " AND ISC=1 THEN ISC=0:GOTO 80
180 IF Z$="R" OR Z$="r" THEN 70
190 IF Z$="P" OR Z$="p" THEN GOSUB 1500:GOTO 80
200 IF Z$="L" OR Z$="l" THEN GOSUB 1440:GOTO 80
210 IF Z$="S" OR Z$="s" THEN GOSUB 1320:GOTO 80
220 IF Z$="F" OR Z$="f" THEN GOSUB 1300:GOTO 80
230 IF Z$="M" OR Z$="m" THEN GOSUB 690:GOTO 70
240 IF Z$="U" OR Z$="u" THEN 550
250 IF (Z$="D" OR Z$="d") AND IDM=0 THEN IDM=1:GOTO 70
260 IF (Z$="D" OR Z$="d") AND IDM=1 THEN IDM=0:GOTO 70
270 IF Z$="E" OR Z$="e" THEN GOSUB 360:GOTO 70
280 IF Z$="C" OR Z$="c" THEN 1400
290 IF Z$=CHR$(27) THEN 1570 ELSE 90
300 IF JY<20+IST THEN RETURN ELSE PUT (JX,JY),IC:JY=JY-IST:GOTO 340
310 IF JY>490-IST THEN RETURN ELSE PUT (JX,JY),IC:JY=JY+IST:GOTO 340
320 IF JX>699-IST THEN RETURN ELSE PUT (JX,JY),IC:JX=JX+IST:GOTO 340
330 IF JX<10+IST THEN RETURN ELSE PUT (JX,JY),IC:JX=JX-IST:GOTO 340
340 GOSUB 350:LOCATE 1,70:PRINT JX;JY:RETURN
350 PUT (JX,JY),IC:RETURN
360 LOCATE 1,1:PRINT SPACE$(80);:LOCATE 1,1:PRINT "<< ERASE >>";
370 KER=LIM:PRINT " [N]ext , [E]rase , [Q]uit "
380 IF KER=0 THEN RETURN ELSE LINE (11,21)-(698,489),0,BF
390 ADD=&HC000+16*(KER-1):KDT=PEEK(ADD):IF KDT<>2 THEN 420
400 LX=PEEK(ADD+1):LY=PEEK(ADD+2):LMX=PEEK(ADD+3):MD$="":FOR LM=1 TO LMX
410 MD$=MD$+CHR$(PEEK(ADD+3+LM)):NEXT LM:LOCATE LY,LX:PRINT MD$;:GOTO 510
420 IF KDT<>1 THEN KER=KER-1:IF KER=0 THEN RETURN ELSE GOTO 390
430 IGR=PEEK(ADD+1):FOR IK=1 TO 8:DP(IK)=PEEK(ADD+IK+1):NEXT IK
440 IX1=256*DP(1)+DP(2):IY1=256*DP(3)+DP(4)
450 MX=256*DP(5)+DP(6):MY=256*DP(7)+DP(8):IR=256*DP(5)+DP(6)
460 IF IGR=0 THEN LINE (IX1,IY1)-(MX,MY),1:GOTO 510
470 IF IGR=1 THEN LINE (IX1,IY1)-(MX,MY),1,B:GOTO 510
480 IF IGR=2 THEN LINE (IX1,IY1)-(MX,MY),1,BF:GOTO 510
490 IF IGR=3 THEN CIRCLE (IX1,IY1),IR,1:GOTO 510
500 IF IGR=4 THEN LINE (MX-1,MY-1)-(MX+1,MY+1),1,BF:CIRCLE (MX,MY),2,1
510 B$=INKEY$:IF B$="" THEN 510
520 IF B$=" " OR B$="N" OR B$="n" THEN KER=KER-1:GOTO 380
530 IF B$=CHR$(27) OR B$="E" OR B$="e" THEN POKE ADD,0:KER=KER-1:GOTO 380
540 IF B$=CHR$(13) OR B$="Q" OR B$="q" THEN RETURN ELSE GOTO 510
550 LOCATE 1,1:PRINT SPACE$(80);:LOCATE 1,1:PRINT "<< Utilities >>";
560 LOCATE 1,20:PRINT "Select Mode = ";UM$;" ";
570 B$=INKEY$:IF B$="" THEN 570
580 IF B$=CHR$(27) THEN 70
590 IF B$=CHR$(13) THEN 630 ELSE IUM=(IUM+1) MOD 4
600 IF IUM=0 THEN UM$="LIST File" ELSE IF IUM=1 THEN UM$="LOAD File"
610 IF IUM=2 THEN UM$="SAVE File" ELSE IF IUM=3 THEN UM$="KILL File"
620 GOTO 560
630 IF IUM=0 THEN 670 ELSE INPUT " Name = ";UN$
640 IF IUM=2 THEN BSAVE UN$+".cad",&HC000,&H4000:GOTO 80
650 IF IUM=1 THEN BLOAD UN$+".cad",&HC000:GOTO 70
660 KILL UN$+".cad":GOTO 80
670 LINE (0,0)-(719,511),0,BF:LOCATE 4,1:FILES
680 B$=INKEY$:IF B$="" THEN 680 ELSE GOTO 70
690 GOSUB 350:LOCATE 1,1:PRINT SPACE$(80);:LOCATE 1,1
700 LOCATE 1,1,0:PRINT " [ Message Print ] --- "
710 LOCATE 1,26:PRINT "Point Setting !!"
720 LX=INT((JX+4)/9):LY=INT((JY+10)/20):IF LX<3 THEN LX=3
730 IF LX>77 THEN LX=77 ELSE IF LY<3 THEN LY=3 ELSE IF LY>24 THEN LY=24
740 GOSUB 860
750 Y$=INKEY$:IF Y$="" THEN 750 ELSE IF LEN(Y$)=2 THEN Y$=RIGHT$(Y$,1)
760 IF Y$=CHR$(72) THEN GOSUB 810:GOTO 750
770 IF Y$=CHR$(80) THEN GOSUB 820:GOTO 750
780 IF Y$=CHR$(77) THEN GOSUB 830:GOTO 750
790 IF Y$=CHR$(75) THEN GOSUB 840:GOTO 750
800 IF Y$=CHR$(13) THEN 870
810 IF LY=3 THEN RETURN ELSE GOSUB 860:LY=LY-1:GOSUB 860:RETURN
820 IF LY=24 THEN RETURN ELSE GOSUB 860:LY=LY+1:GOSUB 860:RETURN
830 IF LX=77 THEN RETURN ELSE GOSUB 860:LX=LX+1:GOSUB 860:RETURN
840 IF LX=3 THEN RETURN ELSE GOSUB 860:LX=LX-1:GOSUB 860:RETURN
850 IF Y$=CHR$(27) THEN RETURN ELSE 750
860 PUT (9*LX-4,20*LY-10),IC:RETURN
870 LOCATE 1,26:PRINT "Input Data = "
880 LOCATE 1,40:INPUT MD$:IF LEN(MD$)>12 THEN BEEP:GOTO 870 ELSE ITI=1
890 ADD=&HC000+16*(ITI-1):KDT=PEEK(ADD):IF KDT=0 THEN 910
900 ITI=ITI+1:IF ITI>LIM THEN BEEP:RETURN ELSE 890
910 POKE ADD+1,LX:POKE ADD+2,LY:POKE ADD+3,LEN(MD$):FOR LM=1 TO LEN(MD$)
920 ME$=MID$(MD$,LM,1):AM=ASC(ME$):IF AM>255 THEN BEEP:GOTO 870
930 POKE ADD+3+LM,AM:NEXT LM:POKE ADD,2:RETURN
940 LOCATE 1,1:PRINT SPACE$(80);:IF ISC=1 THEN 970
950 LOCATE 1,1,0:PRINT "[R]edraw [S]elect ";
960 PRINT "[M]essage [E]rase [P]arameter";:GOTO 990
970 LOCATE 1,1,0:PRINT "[U]tility [F]reeze [D]otMesh [L]imit ";
980 PRINT "[C]lear"
990 LOCATE 1,70:PRINT JX;JY:RETURN
1000 IX1=JX:IY1=JY:RETURN
1010 ADD=&HC000+16*(ITI-1):KDT=PEEK(ADD):IF KDT=0 THEN 1030
1020 ITI=ITI+1:IF ITI>LIM THEN BEEP:RETURN ELSE 1010
1030 POKE ADD,1:POKE ADD+1,IGR:ON IGR+1 GOSUB 1040,1090,1100,1110,1150:RETURN
1040 LINE (IX1,IY1)-(JX,JY),1
1050 POKE ADD+2,INT(IX1/256):POKE ADD+3,(IX1 MOD 256)
1060 POKE ADD+4,INT(IY1/256):POKE ADD+5,(IY1 MOD 256)
1070 POKE ADD+6,INT(JX/256):POKE ADD+7,(JX MOD 256)
1080 POKE ADD+8,INT(JY/256):POKE ADD+9,(JY MOD 256):RETURN
1090 LINE (IX1,IY1)-(JX,JY),1,B:GOTO 1050
1100 LINE (IX1,IY1)-(JX,JY),1,BF:GOTO 1050
1110 IR=INT(SQR((IX1-JX)*(IX1-JX)+(IY1-JY)*(IY1-JY))):CIRCLE (IX1,IY1),IR,1
1120 POKE ADD+2,INT(IX1/256):POKE ADD+3,(IX1 MOD 256)
1130 POKE ADD+4,INT(IY1/256):POKE ADD+5,(IY1 MOD 256)
1140 POKE ADD+6,INT(IR/256):POKE ADD+7,(IR MOD 256):RETURN
1150 LINE (JX-1,JY-1)-(JX+1,JY+1),1,BF:CIRCLE (JX,JY),2,1:GOTO 1070
1160 FOR ITI=1 TO LIM:ADD=&HC000+16*(ITI-1):KDT=PEEK(ADD):IF KDT<>2 THEN 1190
1170 LX=PEEK(ADD+1):LY=PEEK(ADD+2):LMX=PEEK(ADD+3):MD$="":FOR LM=1 TO LMX
1180 MD$=MD$+CHR$(PEEK(ADD+3+LM)):NEXT LM:LOCATE LY,LX:PRINT MD$;
1190 NEXT ITI
1200 FOR ITI=1 TO LIM:ADD=&HC000+16*(ITI-1):KDT=PEEK(ADD):IF KDT<>1 THEN 1290
1210 IGR=PEEK(ADD+1):FOR IK=1 TO 8:DP(IK)=PEEK(ADD+IK+1):NEXT IK
1220 IX1=256*DP(1)+DP(2):IY1=256*DP(3)+DP(4)
1230 JX=256*DP(5)+DP(6):JY=256*DP(7)+DP(8):IR=256*DP(5)+DP(6)
1240 IF IGR=0 THEN LINE (IX1,IY1)-(JX,JY),1:GOTO 1290
1250 IF IGR=1 THEN LINE (IX1,IY1)-(JX,JY),1,B:GOTO 1290
1260 IF IGR=2 THEN LINE (IX1,IY1)-(JX,JY),1,BF:GOTO 1290
1270 IF IGR=3 THEN CIRCLE (IX1,IY1),IR,1:JX=IX1:JY=IY1:GOTO 1290
1280 IF IGR=4 THEN LINE (JX-1,JY-1)-(JX+1,JY+1),1,BF:CIRCLE (JX,JY),2,1
1290 NEXT ITI:IGR=0:GR$="LINE":RETURN
1300 LOCATE 1,1:PRINT SPACE$(80);:PUT (JX,JY),IC
1310 B$=INKEY$:IF B$="" THEN 1310 ELSE PUT (JX,JY),IC:RETURN
1320 LOCATE 1,1:PRINT SPACE$(80);:LOCATE 1,1:PRINT "<< Graph Select >>";
1330 LOCATE 1,26:PRINT "Select Graph = ";GR$;" ";
1340 B$=INKEY$:IF B$="" THEN 1340
1350 IF B$=CHR$(13) THEN RETURN ELSE IGR=(IGR+1) MOD 5
1360 IF IGR=0 THEN GR$="LINE" ELSE IF IGR=1 THEN GR$="SQUARE"
1370 IF IGR=2 THEN GR$="BLOCK" ELSE IF IGR=3 THEN GR$="CIRCLE"
1380 IF IGR=4 THEN GR$="DOT"
1390 GOTO 1330
1400 LOCATE 1,1:PRINT SPACE$(80);:LOCATE 1,1:PRINT "### All Data Clear ###";
1410 LOCATE 1,30:PRINT "CAUTION !!! ALL DATA DELETE OK? (Y/N)"
1420 B$=INKEY$:IF B$="" THEN 1420
1430 IF B$="Y" OR B$="y" THEN GOSUB 1590:GOTO 70 ELSE GOTO 80
1440 LOCATE 1,1:PRINT SPACE$(80);:LOCATE 1,1:PRINT "<< Data Count Limit >>";
1450 KEF=0:FOR ITI=1 TO LIM:ADD=&HC000+16*(ITI-1)
1460 IF PEEK(ADD)<>0 THEN KEF=KEF+1
1470 NEXT ITI:US=INT(100*KEF/LIM)
1480 LOCATE 1,30:PRINT "Using =";KEF;" (";US;"% ) , Limit =";LIM;:INPUT B$
1490 IF B$="" THEN RETURN ELSE LIM=VAL(B$):GOTO 1440
1500 LOCATE 1,1:PRINT SPACE$(80);:LOCATE 1,1:PRINT "<< Parameter Define >>";
1510 LOCATE 1,30:PRINT "ICON Step Speed =";IST;:INPUT B$
1520 IF B$="" THEN RETURN ELSE IST=VAL(B$):RETURN
1530 LINE (0,0)-(719,511),0,BF:LINE (10,20)-(699,490),1,B,&HCCCC
1540 IF IDM=0 THEN RETURN
1550 FOR IDX=20 TO 680 STEP 20:FOR IDY=40 TO 480 STEP 20
1560 PSET (IDX,IDY):NEXT IDY:NEXT IDX:RETURN
1570 COLOR 0,0,0:SCREEN 0,0,0:LOCATE 1,1,1:KEY ON:END:'####< END >####
1580 KEY OFF:SCREEN 2:LINE (0,480)-(100,511),0,BF:LOCATE ,,0
1590 FOR XI=&HC000 TO &HFFFF STEP 16:POKE XI,0:NEXT XI:RETURN
1600 RESTORE 1670:DEF SEG=&HA000:FOR LIN=0 TO 20
1610 ADD=(LIN MOD 2)*&H8000+128*INT(LIN/2):IDAT=0:FOR IBIT=0 TO 7:READ IDOT
1620 IDAT=IDAT+IDOT*2^(7-IBIT):NEXT IBIT:POKE ADD,IDAT:ADD=ADD+1:IDAT=0
1630 FOR IBIT=0 TO 7:READ IDOT:IDAT=IDAT+IDOT*2^(7-IBIT):NEXT IBIT
1640 POKE ADD,IDAT:ADD=ADD+1:IDAT=0:FOR IBIT=0 TO 4:READ IDOT
1650 IDAT=IDAT+IDOT*2^(7-IBIT):NEXT IBIT:POKE ADD,IDAT:NEXT LIN :DEF SEG
1660 GET (0,0)-(20,20),IC:LINE (0,0)-(20,20),0,BF:RETURN
1670 DATA 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0:'<1>
1680 DATA 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0:'<2>
1690 DATA 0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0:'<3>
1700 DATA 0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0:'<4>
1710 DATA 0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0:'<5>
1720 DATA 0,1,0,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0:'<6>
1730 DATA 0,1,0,0,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0:'<7>
1740 DATA 0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0:'<8>
1750 DATA 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0:'<9>
1760 DATA 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0:'<10>
1770 DATA 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0:'<11>
1780 DATA 0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0:'<12>
1790 DATA 0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0:'<13>
1800 DATA 0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0:'<14>
1810 DATA 0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0:'<15>
1820 DATA 0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,1,1,0,0,0:'<16>
1830 DATA 0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,1,1,0,0:'<17>
1840 DATA 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,1,1,0:'<18>
1850 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1:'<19>
1860 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0:'<20>
1870 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0:'<21>
10 'save "transim",a 20 DEFINT A-Z:DIM MT(256),MX(256):GOSUB 470:GOSUB 1090:GOSUB 930 30 '***** Main Loop ***** 40 GOSUB 100:GOSUB 180:Z$=INKEY$:IF Z$="" THEN 30 50 IF Z$="f" OR Z$="F" THEN GOSUB 880 60 IF Z$="s" OR Z$="S" THEN GOSUB 810 70 IF Z$="l" OR Z$="L" THEN GOSUB 740 80 IF Z$="t" OR Z$="T" THEN GOSUB 530 90 IF Z$<>CHR$(&H1B) THEN 30 ELSE SCREEN 0,0,0:LOCATE 1,1,1:KEY ON:END 100 '***** Mouse Point Check ***** 110 AX%=3:GOSUB 1210:JJX=CX%:JJY=DX%:IF JJX=JX AND JJY=JY THEN RETURN 120 JX=JJX:JY=JJY 130 II=(JX-IXMIN)/ISX:JJ=(IYMAX-JY)/ISY 140 XX$=HEX$(II):IF LEN(XX$)=1 THEN XX$="0"+XX$ 150 YY$=HEX$(JJ):IF LEN(YY$)=1 THEN YY$="0"+YY$ 160 LOCATE 3,45:PRINT "Address = [";XX$;"] , Data = [";YY$;"] " 170 RETURN 180 '***** Plot Point Check ***** 190 AX%=5:BX%=0:GOSUB 1210:IF BX%>0 THEN 210 200 AX%=5:BX%=1:GOSUB 1210:IF BX%=0 THEN RETURN 210 JX=CX%:JY=DX% 220 II=(JX-IXMIN)/ISX:JJ=(IYMAX-JY)/ISY 230 IF II=0 OR II=255 THEN MT(II)=JJ:GOTO 930 240 AX%=2:GOSUB 1210 'HIDE POINT CURSOR 250 KX=IXMIN+II*ISX:KY=IYMAX-JJ*ISY 260 FOR I=II+1 TO 254 270 IF MT(I)<256 THEN 290 280 NEXT I 290 RX=IXMIN+I*ISX:RY=IYMAX-MT(I)*ISY 300 FOR I=II-1 TO 1 STEP -1 310 IF MT(I)<256 THEN 330 320 NEXT I 330 LX=IXMIN+I*ISX:LY=IYMAX-MT(I)*ISY 340 IF MT(II)<256 THEN 410 ELSE MT(II)=JJ 350 LINE (LX,LY)-(RX,RY),0 360 CIRCLE (KX,KY),2 370 PAINT (KX,KY) 380 LINE (LX,LY)-(KX,KY) 390 LINE (KX,KY)-(RX,RY) 400 GOTO 460 410 NY=IYMAX-MT(II)*ISY:MT(II)=999 420 LINE (LX,LY)-(KX,NY),0 430 LINE (KX,NY)-(RX,RY),0 440 LINE (KX-2,NY-2)-(KX+2,NY+2),0,BF 450 LINE (LX,LY)-(RX,RY) 460 AX%=1:GOSUB 1210:RETURN 'SHOW POINT CURSOR 470 '***** Initialize Subroutine ***** 480 KEY OFF:SCREEN 2:LOCATE ,,0 490 MT(0)=0:FOR I=1 TO 254:MT(I)=999:NEXT I:MT(255)=255 500 ISX=3:ISY=2:IXMIN=130:IXMAX=IXMIN+255*ISX:IYMIN=130:IYMAX=IYMIN+255*ISY 510 JX=IXMIN:JY=IYMAX 520 RETURN 530 '***** Transfer Subroutine ***** 540 CLS:LOCATE 10,20:PRINT "W A I T A M O M E N T ! ! !" 550 OPEN "trnsdmy.tns" FOR OUTPUT AS #1 560 FOR I=0 TO 255:PRINT #1,MT(I):NEXT I:CLOSE #1 570 KZ=1:III=0 580 IF MT(KZ)>255 THEN 620 590 FOR J=III TO KZ-1 600 MX(J)=INT(MT(III)+(J-III)*((MT(KZ)-MT(III))/(KZ-III))) 610 NEXT J:III=KZ 620 KZ=KZ+1:IF KZ<256 THEN 580 ELSE MX(255)=MT(255) 630 OPEN "trnsdmy.asc" FOR OUTPUT AS #2 640 FOR I=0 TO 255 650 O1$=HEX$(I):IF LEN(O1$)=1 THEN O1$="0"+O1$ 660 O2$=HEX$(MX(I)):IF LEN(O2$)=1 THEN O2$="0"+O2$ 670 PRINT #2,"TNS"+CHR$(&HD)+":"+O1$+":"+O2$+":"; 680 NEXT I:CLOSE #2 690 SHELL "slowcopy.exe trnsdmy.asc" 700 KEY OFF:SCREEN 2:LOCATE ,,0 710 OPEN "trnsdmy.tns" FOR INPUT AS #1 720 FOR I=0 TO 255:INPUT #1,MT(I):NEXT I:CLOSE #1 730 CLS:GOSUB 930:RETURN 740 '***** Load Subroutine ***** 750 CLS:PRINT :PRINT " <<< Data File List Up >>>":PRINT :FILES "*.tns" 760 PRINT :INPUT " Input Load File NO. (TRNS***) --- ",YD$ 770 IF LEN(YD$)>3 THEN YD$=LEFT$(YD$,3) 780 OPEN "trns"+YD$+".tns" FOR INPUT AS #1 790 FOR I=0 TO 255:INPUT #1,MT(I):NEXT I:CLOSE #1 800 CLS:GOSUB 930:RETURN 810 '***** Save Subroutine ***** 820 CLS:PRINT :PRINT " <<< Data File List Up >>>":PRINT :FILES "*.tns" 830 PRINT :INPUT " Input Save File NO. (TRNS***) --- ",YD$ 840 IF LEN(YD$)>3 THEN YD$=LEFT$(YD$,3) 850 OPEN "trns"+YD$+".tns" FOR OUTPUT AS #1 860 FOR I=0 TO 255:PRINT #1,MT(I):NEXT I:CLOSE #1 870 CLS:GOSUB 930:RETURN 880 '***** Files Subroutine ***** 890 CLS:PRINT :PRINT " <<< Data File List Up >>>":PRINT :FILES "*.tns" 900 PRINT :PRINT " (Hit Any Key !)"; 910 IF INKEY$="" THEN 910 920 CLS:GOSUB 930:RETURN 930 '***** Screen Redraw ***** 940 AX%=2:GOSUB 1210 'HIDE POINT CURSOR 950 LINE (IXMIN-ISX,IYMIN-ISY)-(IXMAX+ISX+16,IYMAX+ISY+16),0,BF 960 LOCATE 1,3:PRINT "***** TG Wave Conversion Simulate System *****" 970 LOCATE 24,30:PRINT "[F]iles [L]oad [S]ave [T]ransfer"; 980 LINE (IXMIN-ISX,IYMIN-ISY)-(IXMAX+ISX,IYMAX+ISY),1,B 990 FOR I=0 TO 255:IF MT(I)>255 THEN 1020 1000 CIRCLE (IXMIN+I*ISX,IYMAX-MT(I)*ISY),2 1010 PAINT (IXMIN+I*ISX,IYMAX-MT(I)*ISY) 1020 NEXT I:KX=IXMIN:KY=IYMAX-MT(0)*ISY:KZ=1 1030 IF MT(KZ)>255 THEN 1060 1040 LX=IXMIN+KZ*ISX:LY=IYMAX-MT(KZ)*ISY 1050 LINE (KX,KY)-(LX,LY):KX=LX:KY=LY 1060 KZ=KZ+1:IF KZ<256 THEN 1030 1070 AX%=1:GOSUB 1210 'SHOW POINT CURSOR 1080 RETURN 1090 '***** Mouse Initialize ***** 1100 DEF SEG=0 1110 MSEG=256*PEEK(51*4+3)+PEEK(51*4+2) 'GET INT33H VECTOR (SEG) 1120 MOUSE=256*PEEK(51*4+1)+PEEK(51*4)+2 'GET INT33H VECTOR (OFFSET) 1130 DEF SEG=MSEG 1140 AX%=30:BX%=3:GOSUB 1210 'MOUSE MODE SET 1150 AX%=0:GOSUB 1210 'RESET MOUSE 1160 AX%=15:CX%=8:DX%=8:GOSUB 1210 'SET MOUSE MOTION RATIO 1170 AX%=4:CX%=JX:DX%=JY:GOSUB 1210 'SET MOUSE CURSOR POSITION 1180 AX%=7:CX%=IXMIN:DX%=IXMAX:GOSUB 1210 1190 AX%=8:CX%=IYMIN:DX%=IYMAX:GOSUB 1210 1200 RETURN 1210 CALL MOUSE(AX%,BX%,CX%,DX%):RETURN
1000 'save "jmacs-1.bas",a
1010 GOTO 1080
1020 DATA 2.2,2.2,2.5,2.4,2.1,2.6,3.4,2.4,5.3,5.0,2.1,11,5.8,5.3,6.3
1030 DATA 6.2,5.2,7.5,6.3,5.0,8.0,6.4,5.4,7.2,6.7,5.2,8.0,7.8,6.5,10
1040 DATA 9.5,8.0,10.8,0.40,0.38,0.44,2.4,0.65,5.2,2.8,1.0,5.7,2.8,2.4,3.3
1050 DATA 3.4,2.8,3.8,4.3,3.25,5.25,6.5,6.4,7.0,6.6,4.2,9.2,2.1,1.9,2.2
1060 DATA 2.5,2.1,2.7,2.9,2.8,3.0,3.2,2.4,5.2,4.3,3.0,5.3,8.1,3,12
1070 DATA 10,9,11,20,16,22,20,15,25,22,17,25
1080 KEY OFF:SCREEN 1,0:LOCATE 1,20,0:PRINT "MIDI Instruments Delay Data"
1090 LOCATE 3,1:PRINT "NO.1":LOCATE 6,1:PRINT " 5"
1100 LOCATE 9,1:PRINT " 10":LOCATE 12,1:PRINT " 15"
1110 LOCATE 15,1:PRINT " 20":LOCATE 18,1:PRINT " 25"
1120 LOCATE 21,1:PRINT " 29":LOCATE 23,7
1130 FOR I=0 TO 5:LOCATE 23,5+13*I:PRINT I*5:NEXT I
1140 LOCATE 23,73:PRINT "(msec)";
1150 RESTORE 1020
1160 FOR I=1 TO 29:READ A,B,C
1170 CIRCLE (70+A*855/25,50+I*19),9,,,,6
1180 CIRCLE (70+A*855/25,50+I*19),7,,,,7
1190 CIRCLE (70+B*855/25,50+I*19),9,,,,5
1200 CIRCLE (70+C*855/25,50+I*19),9,,,,5
1210 LINE (70+B*855/25,50+I*19)-(70+C*855/25,50+I*19)
1220 NEXT I
1230 LINE (70,40)-(1023,625),,B
1240 IF INKEY$="" THEN 1240 ELSE SCREEN 0,0:LOCATE 1,1,1
1000 'save "jmacs-2.bas",a
1010 '===== Delay None , Amplitude Changes =====
1020 DATA 100,100,100,0,0,0,100,90,100,0,0,0,100,80,100,0,0,0
1030 DATA 100,70,100,0,0,0,100,60,100,0,0,0,100,100,90,0,0,0
1040 DATA 100,100,80,0,0,0,100,100,70,0,0,0,100,100,60,0,0,0
1050 DATA 100,90,80,0,0,0,100,80,60,0,0,0,100,70,50,0,0,0
1060 DATA 80,90,100,0,0,0,80,100,90,0,0,0,70,100,80,0,0,0
1070 '===== 3rd Delay Only Change =====
1080 DATA 100,100,100,0,1,0,100,100,100,0,2,0,100,100,100,0,3,0
1090 DATA 100,100,100,0,5,0,100,100,100,0,10,0,100,100,100,0,20,0
1100 DATA 100,90,80,0,1,0,100,90,80,0,2,0,100,90,80,0,3,0
1110 DATA 100,90,80,0,5,0,100,90,80,0,10,0,100,90,80,0,20,0
1120 DATA 100,80,60,0,1,0,100,80,60,0,2,0,100,80,60,0,3,0
1130 DATA 100,80,60,0,5,0,100,80,60,0,10,0,100,80,60,0,20,0
1140 '===== 5th Delay Only Change =====
1150 DATA 100,100,100,0,0,1,100,100,100,0,0,2,100,100,100,0,0,3
1160 DATA 100,100,100,0,0,5,100,100,100,0,0,10,100,100,100,0,0,20
1170 DATA 100,90,80,0,0,1,100,90,80,0,0,2,100,90,80,0,0,3
1180 DATA 100,90,80,0,0,5,100,90,80,0,0,10,100,90,80,0,0,20
1190 DATA 100,80,60,0,0,1,100,80,60,0,0,2,100,80,60,0,0,3
1200 DATA 100,80,60,0,0,5,100,80,60,0,0,10,100,80,60,0,0,20
1210 '===== 3rd/5th Delay Same Change =====
1220 DATA 100,100,100,0,1,1,100,100,100,0,2,2,100,100,100,0,3,3
1230 DATA 100,100,100,0,5,5,100,100,100,0,10,10,100,100,100,0,20,20
1240 DATA 100,90,80,0,1,1,100,90,80,0,2,2,100,90,80,0,3,3
1250 DATA 100,90,80,0,5,5,100,90,80,0,10,10,100,90,80,0,20,20
1260 DATA 100,80,60,0,1,1,100,80,60,0,2,2,100,80,60,0,3,3
1270 DATA 100,80,60,0,5,5,100,80,60,0,10,10,100,80,60,0,20,20
1280 '===== 3rd/5th Delay Different Change =====
1290 DATA 100,90,80,0,1,2,100,90,80,0,1,3,100,90,80,0,1,5
1300 DATA 100,90,80,0,1,10,100,90,80,0,1,15,100,90,80,0,1,20
1310 DATA 100,90,80,0,2,1,100,90,80,0,2,3,100,90,80,0,2,5
1320 DATA 100,90,80,0,2,10,100,90,80,0,2,15,100,90,80,0,2,20
1330 DATA 100,90,80,0,3,1,100,90,80,0,3,2,100,90,80,0,3,5
1340 DATA 100,90,80,0,3,10,100,90,80,0,3,15,100,90,80,0,3,20
1350 DATA 100,90,80,0,5,1,100,90,80,0,5,2,100,90,80,0,5,3
1360 DATA 100,90,80,0,5,10,100,90,80,0,5,15,100,90,80,0,5,20
1370 DATA 100,90,80,0,10,1,100,90,80,0,10,2,100,90,80,0,10,3
1380 DATA 100,90,80,0,10,5,100,90,80,0,10,15,100,90,80,0,10,20
1390 DATA 100,90,80,0,15,1,100,90,80,0,15,2,100,90,80,0,15,3
1400 DATA 100,90,80,0,15,5,100,90,80,0,15,10,100,90,80,0,15,20
1410 DATA 100,90,80,0,20,1,100,90,80,0,20,2,100,90,80,0,20,3
1420 DATA 100,90,80,0,20,5,100,90,80,0,20,10,100,90,80,0,20,15
1430 KEY OFF:SCREEN 1,0:LOCATE 1,1,0:DIM M(6,3):RESTORE 1020
1440 FOR LOOP=1 TO 37
1450 CLS:FOR J=1 TO 3: FOR I=1 TO 6:READ M(I,J):NEXT I:NEXT J
1460 FOR I=0 TO 2
1470 A=M(1,I+1):B=M(2,I+1):C=M(3,I+1):D=M(4,I+1):E=M(5,I+1):F=M(6,I+1)
1480 A$=RIGHT$(STR$(A),LEN(STR$(A))-1)
1490 B$=RIGHT$(STR$(B),LEN(STR$(B))-1)
1500 C$=RIGHT$(STR$(C),LEN(STR$(C))-1)
1510 LOCATE 8*I+1,5
1520 PRINT "1st(";A$;"%) =";D;"msec , ";
1530 PRINT "3rd(";B$;"%) =";E;"msec , ";
1540 PRINT "5th(";C$;"%) =";F;"msec";
1550 LINE (0,30+I*232)-(1023,210+I*232),,B
1560 LINE (0,120+I*232)-(1023,120+I*232),,,&H3333
1570 G=(A+B+C)/3:A=A*100/G:B=B*100/G:C=C*100/G
1580 XOLD=0:YOLD=120+I*232:ZPT=YOLD
1590 FOR J=0 TO 1022 STEP 2
1600 T=.05*J:X=J
1610 IF D<T THEN Y1=SIN((20*D+J)*3.1416*2/76.4526) ELSE Y1=0
1620 IF E<T THEN Y2=SIN((20*E+J)*3.1416*2/76.4526*5/4) ELSE Y2=0
1630 IF F<T THEN Y3=SIN((20*F+J)*3.1416*2/76.4526*3/2) ELSE Y3=0
1640 Y=ZPT-(A*Y1+B*Y2+C*Y3)/3.5
1650 LINE (XOLD,YOLD)-(X,Y):XOLD=X:YOLD=Y
1660 NEXT J
1670 NEXT I
1680 IF INKEY$="" THEN 1680
1690 NEXT LOOP:SCREEN 0,0:LOCATE 1,1,1
1000 'save "jmacs-3.bas",a
1010 OPEN "psg.dat" FOR OUTPUT AS #1
1020 CLS:X$="<< PSG [AY-3-8910]/[AY-3-8912] : 12Bit Program Counter >>"
1030 Y$=" ( Master Clock = 1.78977 MHz , P/S = 4Bit )"
1040 PRINT X$:PRINT:PRINT Y$:PRINT:A$="A BbB C C#D EbE F F#G G#"
1050 H#=(2#^(1#/12#)):C#=1200#/LOG(2#)
1060 FOR I=1 TO 88
1070 J=(I-1) MOD 12
1080 K=INT((I+8)/12)
1090 B$=MID$(A$,2*J+1,2)
1100 IF I<10 THEN C$="Key " ELSE C$="Key"
1110 P#=CDBL(27.5*2^(INT((I-1)/12)))*H#^(CDBL(J))
1120 Q#=1789770#/16#/P#:L=INT(Q#):H=L+1:R#=CDBL(L):S#=CDBL(H)
1130 T#=1789770#/16#/R#:U#=1789770#/16#/S#
1140 D$=" ":IF L<1000 THEN D$=D$+" "
1150 IF L<100 THEN D$=D$+" "
1160 V#=C#*LOG(T#/P#):W#=C#*LOG(U#/P#)
1170 PRINT " "+C$;I;" [ "+B$;K;"] ";P#;"Hz"
1180 PRINT D$+"Data";L;"-->";T#;"Hz",
1190 PRINT USING "+##.##############";V#;:PRINT " Cent"
1200 PRINT D$+"Data";H;"-->";U#;"Hz",
1210 PRINT USING "+##.##############";W#;:PRINT " Cent"
1220 PRINT #1,V#,W#
1230 NEXT I:CLOSE #1
1000 'save "jmacs-4.bas",a
1010 OPEN "pt200.dat" FOR OUTPUT AS #1
1020 CLS:X$="<< Intel [8254] Type : 16Bit Program Counter >>"
1030 Y$=" ( Master Clock = 1.8000 MHz )"
1040 PRINT X$:PRINT:PRINT Y$:PRINT:A$="A BbB C C#D EbE F F#G G#"
1050 H#=(2#^(1#/12#)):C#=1200#/LOG(2#)
1060 FOR I=1 TO 88
1070 J=(I-1) MOD 12
1080 K=INT((I+8)/12)
1090 B$=MID$(A$,2*J+1,2)
1100 IF I<10 THEN C$="Key " ELSE C$="Key"
1110 P#=CDBL(27.5*2^(INT((I-1)/12)))*H#^(CDBL(J))
1120 Q#=1800000#/P#:L=INT(Q#):H=L+1:R#=CDBL(L):S#=CDBL(H)
1130 T#=1800000#/R#:U#=1800000#/S#
1140 D$=" ":IF L<1000 THEN D$=D$+" "
1150 IF L<100 THEN D$=D$+" "
1160 V#=C#*LOG(T#/P#):W#=C#*LOG(U#/P#)
1170 PRINT " "+C$;I;" [ "+B$;K;"] ";P#;"Hz"
1180 PRINT D$+"Data";L;"-->";T#;"Hz",
1190 PRINT USING "+##.##############";V#;:PRINT " Cent"
1200 PRINT D$+"Data";H;"-->";U#;"Hz",
1210 PRINT USING "+##.##############";W#;:PRINT " Cent"
1220 PRINT #1,V#,W#
1230 NEXT I:CLOSE #1
1000 'save "jmacs-5.bas",a
1010 OPEN "fm.dat" FOR OUTPUT AS #1
1020 CLS:X$="<< FM [YM3812] Type : 10Bit F-Number + 3Bit Octave >>"
1030 Y$=" ( Sampling Clock = 12.5kHz , 256 Word/Wave )"
1040 PRINT X$:PRINT:PRINT Y$:PRINT:A$="A BbB C C#D EbE F F#G G#"
1050 H#=(2#^(1#/12#)):C#=1200#/LOG(2#)
1060 FOR I=1 TO 88
1070 J=(I-1) MOD 12
1080 K=INT((I+8)/12)
1090 M=INT((I+7)/12)
1100 B$=MID$(A$,2*J+1,2)
1110 IF I<10 THEN C$="Key " ELSE C$="Key"
1120 P#=CDBL(27.5*2^(INT((I-1)/12)))*H#^(CDBL(J))
1130 Q#=P#*256#/12.5#/1000#*1024#/2#^CDBL(M)
1140 L=INT(Q#):H=L+1:R#=CDBL(L):S#=CDBL(H)
1150 T#=R#/256#*12.5#*1000#/1024#*2#^CDBL(M)
1160 U#=S#/256#*12.5#*1000#/1024#*2#^CDBL(M)
1170 D$=" "
1180 V#=C#*LOG(T#/P#):W#=C#*LOG(U#/P#)
1190 PRINT " "+C$;I;" [ "+B$;K;"] ";P#;"Hz",:IF J=0 THEN PRINT "",
1200 PRINT " ( Block =";M;")"
1210 PRINT D$+"Data";L;"-->";T#;"Hz",
1220 PRINT USING "+##.##############";V#;:PRINT " Cent"
1230 PRINT D$+"Data";H;"-->";U#;"Hz",
1240 PRINT USING "+##.##############";W#;:PRINT " Cent"
1250 PRINT #1,V#,W#
1260 NEXT I:CLOSE #1
1000 'save "jmacs-6.bas",a
1010 OPEN "skb.dat" FOR OUTPUT AS #1
1020 CLS:X$="<< PCM [KTG101] Type : 24Bit F-Number Accumulator >>"
1030 Y$=" ( Sampling Clock = 62.5kHz , 256 Word/Wave )"
1040 PRINT X$:PRINT:PRINT Y$:PRINT:A$="A BbB C C#D EbE F F#G G#"
1050 H#=(2#^(1#/12#)):C#=1200#/LOG(2#)
1060 FOR I=1 TO 88
1070 J=(I-1) MOD 12
1080 K=INT((I+8)/12)
1090 B$=MID$(A$,2*J+1,2)
1100 IF I<10 THEN C$="Key " ELSE C$="Key"
1110 P#=CDBL(27.5*2^(INT((I-1)/12)))*H#^(CDBL(J))
1120 Q#=P#*256#*16#/1000000#*65536#:L=INT(Q#):H=L+1:R#=CDBL(L):S#=CDBL(H)
1130 T#=R#/256#/16#*1000000#/65536#
1140 U#=S#/256#/16#*1000000#/65536#
1150 D$=" ":IF L<1000000! THEN D$=D$+" "
1160 IF L<100000! THEN D$=D$+" "
1170 IF L<10000 THEN D$=D$+" "
1180 V#=C#*LOG(T#/P#):W#=C#*LOG(U#/P#)
1190 PRINT " "+C$;I;" [ "+B$;K;"] ";P#;"Hz"
1200 PRINT D$+"Data";L;"-->";T#;"Hz",
1210 PRINT USING "+##.##############";V#;:PRINT " Cent"
1220 PRINT D$+"Data";H;"-->";U#;"Hz",
1230 PRINT USING "+##.##############";W#;:PRINT " Cent"
1240 PRINT #1,V#,W#
1250 NEXT I:CLOSE #1
1000 'save "jmacs-7.bas",a
1010 A$="Pitch Error : <1> PSG [AY-3-8910]/[AY-3-8912] 12Bit Counter"
1020 OPEN "psg.dat" FOR INPUT AS #1
1030 KEY OFF:SCREEN 1,0:LOCATE 1,10,0:PRINT A$
1040 LOCATE 2,1:PRINT "(Cent)":LOCATE 3,1:PRINT " +60"
1050 LOCATE 6,1:PRINT " +40":LOCATE 9,1:PRINT " +20"
1060 LOCATE 12,1:PRINT " 0":LOCATE 15,1:PRINT " -20"
1070 LOCATE 18,1:PRINT " -40":LOCATE 21,1:PRINT " -60"
1080 LOCATE 23,1:PRINT "Key : 1 10";
1090 LOCATE 23,21:PRINT "20";:LOCATE 23,29:PRINT "30";
1100 LOCATE 23,37:PRINT "40";:LOCATE 23,45:PRINT "50";
1110 LOCATE 23,53:PRINT "60";:LOCATE 23,61:PRINT "70";
1120 LOCATE 23,69:PRINT "80";:LOCATE 23,76:PRINT "88";
1130 FOR I=1 TO 88:INPUT #1,X#,Y#
1140 X1=73+I*920/88
1150 Y1=333-X#*293/65
1160 Y2=333-Y#*293/65
1170 CIRCLE (X1,Y1),3,,,,.5
1180 CIRCLE (X1,Y2),3,,,,.5
1190 LINE (X1,Y1)-(X1,Y2)
1200 NEXT I
1210 LINE (75,333)-(1000,333),,,&H3333
1220 LINE (75,40)-(1000,625),,B
1230 IF INKEY$="" THEN 1230 ELSE SCREEN 0,0:LOCATE 1,1,1
1000 'save "jmacs-8.bas",a
1010 A$="Pitch Error : <2> Intel [8254] Type 16Bit Program Counter"
1020 OPEN "pt200.dat" FOR INPUT AS #1
1030 KEY OFF:SCREEN 1,0:LOCATE 1,10,0:PRINT A$
1040 LOCATE 2,1:PRINT "(Cent)":LOCATE 3,1:PRINT " +4.5"
1050 LOCATE 6,1:PRINT " +3.0":LOCATE 9,1:PRINT " +1.5"
1060 LOCATE 12,1:PRINT " 0":LOCATE 15,1:PRINT " -1.5"
1070 LOCATE 18,1:PRINT " -3.0":LOCATE 21,1:PRINT " -4.5"
1080 LOCATE 23,1:PRINT "Key : 1 10";
1090 LOCATE 23,21:PRINT "20";:LOCATE 23,29:PRINT "30";
1100 LOCATE 23,37:PRINT "40";:LOCATE 23,45:PRINT "50";
1110 LOCATE 23,53:PRINT "60";:LOCATE 23,61:PRINT "70";
1120 LOCATE 23,69:PRINT "80";:LOCATE 23,76:PRINT "88";
1130 FOR I=1 TO 88:INPUT #1,X#,Y#
1140 X1=73+I*920/88
1150 Y1=333-X#*293/4.7
1160 Y2=333-Y#*293/4.7
1170 CIRCLE (X1,Y1),3,,,,.5
1180 CIRCLE (X1,Y2),3,,,,.5
1190 LINE (X1,Y1)-(X1,Y2)
1200 NEXT I
1210 LINE (75,333)-(1000,333),,,&H3333
1220 LINE (75,40)-(1000,625),,B
1230 IF INKEY$="" THEN 1230 ELSE SCREEN 0,0:LOCATE 1,1,1
1000 'save "jmacs-9.bas",a
1010 A$="Pitch Error : <3> FM [YM3812] Type 10Bit F-Number + 3Bit Octave"
1020 OPEN "fm.dat" FOR INPUT AS #1
1030 KEY OFF:SCREEN 1,0:LOCATE 1,10,0:PRINT A$
1040 LOCATE 2,1:PRINT "(Cent)":LOCATE 3,1:PRINT " +4.5"
1050 LOCATE 6,1:PRINT " +3.0":LOCATE 9,1:PRINT " +1.5"
1060 LOCATE 12,1:PRINT " 0":LOCATE 15,1:PRINT " -1.5"
1070 LOCATE 18,1:PRINT " -3.0":LOCATE 21,1:PRINT " -4.5"
1080 LOCATE 23,1:PRINT "Key : 1 10";
1090 LOCATE 23,21:PRINT "20";:LOCATE 23,29:PRINT "30";
1100 LOCATE 23,37:PRINT "40";:LOCATE 23,45:PRINT "50";
1110 LOCATE 23,53:PRINT "60";:LOCATE 23,61:PRINT "70";
1120 LOCATE 23,69:PRINT "80";:LOCATE 23,76:PRINT "88";
1130 FOR I=1 TO 88:INPUT #1,X#,Y#
1140 X1=73+I*920/88
1150 Y1=333-X#*293/4.7
1160 Y2=333-Y#*293/4.7
1170 CIRCLE (X1,Y1),3,,,,.5
1180 CIRCLE (X1,Y2),3,,,,.5
1190 LINE (X1,Y1)-(X1,Y2)
1200 NEXT I
1210 LINE (75,333)-(1000,333),,,&H3333
1220 LINE (75,40)-(1000,625),,B
1230 IF INKEY$="" THEN 1230 ELSE SCREEN 0,0:LOCATE 1,1,1
1000 'save "jmacs-10.bas",a
1010 A$="Pitch Error : <4> PCM [KTG***] Type 24Bit F-Number "
1020 OPEN "skb.dat" FOR INPUT AS #1
1030 KEY OFF:SCREEN 1,0:LOCATE 1,10,0:PRINT A$
1040 LOCATE 2,1:PRINT "(Cent)":LOCATE 3,1:PRINT " +0.3"
1050 LOCATE 6,1:PRINT " +0.2":LOCATE 9,1:PRINT " +0.1"
1060 LOCATE 12,1:PRINT " 0":LOCATE 15,1:PRINT " -0.1"
1070 LOCATE 18,1:PRINT " -0.2":LOCATE 21,1:PRINT " -0.3"
1080 LOCATE 23,1:PRINT "Key : 1 10";
1090 LOCATE 23,21:PRINT "20";:LOCATE 23,29:PRINT "30";
1100 LOCATE 23,37:PRINT "40";:LOCATE 23,45:PRINT "50";
1110 LOCATE 23,53:PRINT "60";:LOCATE 23,61:PRINT "70";
1120 LOCATE 23,69:PRINT "80";:LOCATE 23,76:PRINT "88";
1130 FOR I=1 TO 88:INPUT #1,X#,Y#
1140 X1=73+I*920/88
1150 Y1=333-X#*293/.33
1160 Y2=333-Y#*293/.33
1170 CIRCLE (X1,Y1),3,,,,.5
1180 CIRCLE (X1,Y2),3,,,,.5
1190 LINE (X1,Y1)-(X1,Y2)
1200 NEXT I
1210 LINE (75,333)-(1000,333),,,&H3333
1220 LINE (75,40)-(1000,625),,B
1230 IF INKEY$="" THEN 1230 ELSE SCREEN 0,0:LOCATE 1,1,1
1000 'save "jmacs-11.bas",a
1010 DIM D#(12):D#(0)=0#:M#=1200#/LOG(2#)
1020 FLG=0
1030 N#=M#*LOG(CDBL(3^4/5/2^4))
1040 W#=M#*LOG(CDBL(3^12/2^19))
1050 CLS:A$="C C#D EbE F F#G AbA BbB "
1060 IF FLG=2 THEN OPEN "temp.dat" FOR OUTPUT AS #1
1070 GOTO 1190
1080 '***** Subroutine *****
1090 PRINT:PRINT:PRINT "<<< "+N$+" >>>":PRINT
1100 IF FLG=2 THEN PRINT #1,N$
1110 IF FLG=1 THEN LPRINT:LPRINT:LPRINT "<<< "+N$+" >>>":LPRINT
1120 FOR I=0 TO 11
1130 PRINT " ["+MID$(A$,2*I+1,2)+"] ";
1140 IF FLG=1 THEN LPRINT " ["+MID$(A$,2*I+1,2)+"] ";
1150 PRINT USING "####.##########";D#(I);:PRINT " cent"
1160 IF FLG=2 THEN PRINT #1,D#(I)
1170 IF FLG=1 THEN LPRINT USING "####.##########";D#(I);:LPRINT " cent"
1180 NEXT I:RETURN
1190 N$="[NO.1] 12 Equal Temperament"
1200 FOR I=1 TO 11
1210 D#(I)=CDBL(I)*100
1220 NEXT I
1230 GOSUB 1080
1240 N$="[NO.2] Pythagorean Scale ( 3#/2b )"
1250 D#(1)=M#*LOG(CDBL(3^7/2^11))
1260 D#(2)=M#*LOG(CDBL(3^2/2^3))
1270 D#(3)=M#*LOG(CDBL(2^5/3^3))
1280 D#(4)=M#*LOG(CDBL(3^4/2^6))
1290 D#(5)=M#*LOG(CDBL(2^2/3))
1300 D#(6)=M#*LOG(CDBL(3^6/2^9))
1310 D#(7)=M#*LOG(CDBL(3/2))
1320 D#(8)=M#*LOG(CDBL(3^8/2^12))
1330 D#(9)=M#*LOG(CDBL(3^3/2^4))
1340 D#(10)=M#*LOG(CDBL(2^4/3^2))
1350 D#(11)=M#*LOG(CDBL(3^5/2^7))
1360 GOSUB 1080
1370 N$="[NO.3] Pythagorean Scale ( 2#/3b )"
1380 D#(1)=M#*LOG(CDBL(3^7/2^11))
1390 D#(2)=M#*LOG(CDBL(3^2/2^3))
1400 D#(3)=M#*LOG(CDBL(2^5/3^3))
1410 D#(4)=M#*LOG(CDBL(3^4/2^6))
1420 D#(5)=M#*LOG(CDBL(2^2/3))
1430 D#(6)=M#*LOG(CDBL(3^6/2^9))
1440 D#(7)=M#*LOG(CDBL(3/2))
1450 D#(8)=M#*LOG(CDBL(2^7/3^4))
1460 D#(9)=M#*LOG(CDBL(3^3/2^4))
1470 D#(10)=M#*LOG(CDBL(2^4/3^2))
1480 D#(11)=M#*LOG(CDBL(3^5/2^7))
1490 GOSUB 1080
1500 N$="[NO.4] Pythagorean Scale ( 1#/4b )"
1510 D#(1)=M#*LOG(CDBL(2^8/3^5))
1520 D#(2)=M#*LOG(CDBL(3^2/2^3))
1530 D#(3)=M#*LOG(CDBL(2^5/3^3))
1540 D#(4)=M#*LOG(CDBL(3^4/2^6))
1550 D#(5)=M#*LOG(CDBL(2^2/3))
1560 D#(6)=M#*LOG(CDBL(3^6/2^9))
1570 D#(7)=M#*LOG(CDBL(3/2))
1580 D#(8)=M#*LOG(CDBL(2^7/3^4))
1590 D#(9)=M#*LOG(CDBL(3^3/2^4))
1600 D#(10)=M#*LOG(CDBL(2^4/3^2))
1610 D#(11)=M#*LOG(CDBL(3^5/2^7))
1620 GOSUB 1080
1630 N$="[NO.5] Pythagorean Scale ( 5b )"
1640 D#(1)=M#*LOG(CDBL(2^8/3^5))
1650 D#(2)=M#*LOG(CDBL(3^2/2^3))
1660 D#(3)=M#*LOG(CDBL(2^5/3^3))
1670 D#(4)=M#*LOG(CDBL(3^4/2^6))
1680 D#(5)=M#*LOG(CDBL(2^2/3))
1690 D#(6)=M#*LOG(CDBL(2^10/3^6))
1700 D#(7)=M#*LOG(CDBL(3/2))
1710 D#(8)=M#*LOG(CDBL(2^7/3^4))
1720 D#(9)=M#*LOG(CDBL(3^3/2^4))
1730 D#(10)=M#*LOG(CDBL(2^4/3^2))
1740 D#(11)=M#*LOG(CDBL(3^5/2^7))
1750 GOSUB 1080
1760 N$="[NO.6] Pythagorean Scale ( 4#/1b )"
1770 D#(1)=M#*LOG(CDBL(3^7/2^11))
1780 D#(2)=M#*LOG(CDBL(3^2/2^3))
1790 D#(3)=M#*LOG(CDBL(3^9/2^14))
1800 D#(4)=M#*LOG(CDBL(3^4/2^6))
1810 D#(5)=M#*LOG(CDBL(2^2/3))
1820 D#(6)=M#*LOG(CDBL(3^6/2^9))
1830 D#(7)=M#*LOG(CDBL(3/2))
1840 D#(8)=M#*LOG(CDBL(3^8/2^12))
1850 D#(9)=M#*LOG(CDBL(3^3/2^4))
1860 D#(10)=M#*LOG(CDBL(2^4/3^2))
1870 D#(11)=M#*LOG(CDBL(3^5/2^7))
1880 GOSUB 1080
1890 N$="[NO.7] Pythagorean Scale ( 5# )"
1900 D#(1)=M#*LOG(CDBL(3^7/2^11))
1910 D#(2)=M#*LOG(CDBL(3^2/2^3))
1920 D#(3)=M#*LOG(CDBL(3^9/2^14))
1930 D#(4)=M#*LOG(CDBL(3^4/2^6))
1940 D#(5)=M#*LOG(CDBL(2^2/3))
1950 D#(6)=M#*LOG(CDBL(3^6/2^9))
1960 D#(7)=M#*LOG(CDBL(3/2))
1970 D#(8)=M#*LOG(CDBL(3^8/2^12))
1980 D#(9)=M#*LOG(CDBL(3^3/2^4))
1990 D#(10)=M#*LOG(CDBL(3^10/2^15))
2000 D#(11)=M#*LOG(CDBL(3^5/2^7))
2010 GOSUB 1080
2020 N$="[NO.8] Meantone ( 3#/2b )"
2030 D#(1)=M#*LOG(CDBL(3^7/2^11))-N#*CDBL(7/4)
2040 D#(2)=M#*LOG(CDBL(3^2/2^3))-N#*CDBL(1/2)
2050 D#(3)=M#*LOG(CDBL(2^5/3^3))+N#*CDBL(3/4)
2060 D#(4)=M#*LOG(CDBL(3^4/2^6))-N#*CDBL(1)
2070 D#(5)=M#*LOG(CDBL(2^2/3))+N#*CDBL(1/4)
2080 D#(6)=M#*LOG(CDBL(3^6/2^9))-N#*CDBL(3/2)
2090 D#(7)=M#*LOG(CDBL(3/2))-N#*CDBL(1/4)
2100 D#(8)=M#*LOG(CDBL(3^8/2^12))-N#*CDBL(2)
2110 D#(9)=M#*LOG(CDBL(3^3/2^4))-N#*CDBL(3/4)
2120 D#(10)=M#*LOG(CDBL(2^4/3^2))+N#*CDBL(1/2)
2130 D#(11)=M#*LOG(CDBL(3^5/2^7))-N#*CDBL(5/4)
2140 GOSUB 1080
2150 N$="[NO.9] Meantone ( 2#/3b )"
2160 D#(1)=M#*LOG(CDBL(3^7/2^11))-N#*CDBL(7/4)
2170 D#(2)=M#*LOG(CDBL(3^2/2^3))-N#*CDBL(1/2)
2180 D#(3)=M#*LOG(CDBL(2^5/3^3))+N#*CDBL(3/4)
2190 D#(4)=M#*LOG(CDBL(3^4/2^6))-N#*CDBL(1)
2200 D#(5)=M#*LOG(CDBL(2^2/3))+N#*CDBL(1/4)
2210 D#(6)=M#*LOG(CDBL(3^6/2^9))-N#*CDBL(3/2)
2220 D#(7)=M#*LOG(CDBL(3/2))-N#*CDBL(1/4)
2230 D#(8)=M#*LOG(CDBL(2^7/3^4))+N#*CDBL(1)
2240 D#(9)=M#*LOG(CDBL(3^3/2^4))-N#*CDBL(3/4)
2250 D#(10)=M#*LOG(CDBL(2^4/3^2))+N#*CDBL(1/2)
2260 D#(11)=M#*LOG(CDBL(3^5/2^7))-N#*CDBL(5/4)
2270 GOSUB 1080
2280 N$="[NO.10] Meantone ( 1#/4b )"
2290 D#(1)=M#*LOG(CDBL(2^8/3^5))+N#*CDBL(5/4)
2300 D#(2)=M#*LOG(CDBL(3^2/2^3))-N#*CDBL(1/2)
2310 D#(3)=M#*LOG(CDBL(2^5/3^3))+N#*CDBL(3/4)
2320 D#(4)=M#*LOG(CDBL(3^4/2^6))-N#*CDBL(1)
2330 D#(5)=M#*LOG(CDBL(2^2/3))+N#*CDBL(1/4)
2340 D#(6)=M#*LOG(CDBL(3^6/2^9))-N#*CDBL(3/2)
2350 D#(7)=M#*LOG(CDBL(3/2))-N#*CDBL(1/4)
2360 D#(8)=M#*LOG(CDBL(2^7/3^4))+N#*CDBL(1)
2370 D#(9)=M#*LOG(CDBL(3^3/2^4))-N#*CDBL(3/4)
2380 D#(10)=M#*LOG(CDBL(2^4/3^2))+N#*CDBL(1/2)
2390 D#(11)=M#*LOG(CDBL(3^5/2^7))-N#*CDBL(5/4)
2400 GOSUB 1080
2410 N$="[NO.11] Meantone ( 5b )"
2420 D#(1)=M#*LOG(CDBL(2^8/3^5))+N#*CDBL(5/4)
2430 D#(2)=M#*LOG(CDBL(3^2/2^3))-N#*CDBL(1/2)
2440 D#(3)=M#*LOG(CDBL(2^5/3^3))+N#*CDBL(3/4)
2450 D#(4)=M#*LOG(CDBL(3^4/2^6))-N#*CDBL(1)
2460 D#(5)=M#*LOG(CDBL(2^2/3))+N#*CDBL(1/4)
2470 D#(6)=M#*LOG(CDBL(2^10/3^6))+N#*CDBL(3/2)
2480 D#(7)=M#*LOG(CDBL(3/2))-N#*CDBL(1/4)
2490 D#(8)=M#*LOG(CDBL(2^7/3^4))+N#*CDBL(1)
2500 D#(9)=M#*LOG(CDBL(3^3/2^4))-N#*CDBL(3/4)
2510 D#(10)=M#*LOG(CDBL(2^4/3^2))+N#*CDBL(1/2)
2520 D#(11)=M#*LOG(CDBL(3^5/2^7))-N#*CDBL(5/4)
2530 GOSUB 1080
2540 N$="[NO.12] Meantone ( 4#/1b )"
2550 D#(1)=M#*LOG(CDBL(3^7/2^11))-N#*CDBL(7/4)
2560 D#(2)=M#*LOG(CDBL(3^2/2^3))-N#*CDBL(1/2)
2570 D#(3)=M#*LOG(CDBL(3^9/2^14))-N#*CDBL(9/4)
2580 D#(4)=M#*LOG(CDBL(3^4/2^6))-N#*CDBL(1)
2590 D#(5)=M#*LOG(CDBL(2^2/3))+N#*CDBL(1/4)
2600 D#(6)=M#*LOG(CDBL(3^6/2^9))-N#*CDBL(3/2)
2610 D#(7)=M#*LOG(CDBL(3/2))-N#*CDBL(1/4)
2620 D#(8)=M#*LOG(CDBL(3^8/2^12))-N#*CDBL(2)
2630 D#(9)=M#*LOG(CDBL(3^3/2^4))-N#*CDBL(3/4)
2640 D#(10)=M#*LOG(CDBL(2^4/3^2))+N#*CDBL(1/2)
2650 D#(11)=M#*LOG(CDBL(3^5/2^7))-N#*CDBL(5/4)
2660 GOSUB 1080
2670 N$="[NO.13] Meantone ( 5# )"
2680 D#(1)=M#*LOG(CDBL(3^7/2^11))-N#*CDBL(7/4)
2690 D#(2)=M#*LOG(CDBL(3^2/2^3))-N#*CDBL(1/2)
2700 D#(3)=M#*LOG(CDBL(3^9/2^14))-N#*CDBL(9/4)
2710 D#(4)=M#*LOG(CDBL(3^4/2^6))-N#*CDBL(1)
2720 D#(5)=M#*LOG(CDBL(2^2/3))+N#*CDBL(1/4)
2730 D#(6)=M#*LOG(CDBL(3^6/2^9))-N#*CDBL(3/2)
2740 D#(7)=M#*LOG(CDBL(3/2))-N#*CDBL(1/4)
2750 D#(8)=M#*LOG(CDBL(3^8/2^12))-N#*CDBL(2)
2760 D#(9)=M#*LOG(CDBL(3^3/2^4))-N#*CDBL(3/4)
2770 D#(10)=M#*LOG(CDBL(3^10/2^15))-N#*CDBL(5/2)
2780 D#(11)=M#*LOG(CDBL(3^5/2^7))-N#*CDBL(5/4)
2790 GOSUB 1080
2800 N$="[NO.14] Salinas ( 1/3 Syntonic Comma )"
2810 D#(1)=M#*LOG(CDBL(3^7/2^11))-N#*CDBL(7/3)
2820 D#(2)=M#*LOG(CDBL(3^2/2^3))-N#*CDBL(2/3)
2830 D#(3)=M#*LOG(CDBL(2^5/3^3))+N#*CDBL(1)
2840 D#(4)=M#*LOG(CDBL(3^4/2^6))-N#*CDBL(4/3)
2850 D#(5)=M#*LOG(CDBL(2^2/3))+N#*CDBL(1/3)
2860 D#(6)=M#*LOG(CDBL(3^6/2^9))-N#*CDBL(2)
2870 D#(7)=M#*LOG(CDBL(3/2))-N#*CDBL(1/3)
2880 D#(8)=M#*LOG(CDBL(3^8/2^12))-N#*CDBL(8/3)
2890 D#(9)=M#*LOG(CDBL(3^3/2^4))-N#*CDBL(1)
2900 D#(10)=M#*LOG(CDBL(2^4/3^2))+N#*CDBL(2/3)
2910 D#(11)=M#*LOG(CDBL(3^5/2^7))-N#*CDBL(5/3)
2920 GOSUB 1080
2930 N$="[NO.15] Verheijen-Rossi ( 1/5 Syntonic Comma )"
2940 D#(1)=M#*LOG(CDBL(3^7/2^11))-N#*CDBL(7/5)
2950 D#(2)=M#*LOG(CDBL(3^2/2^3))-N#*CDBL(2/5)
2960 D#(3)=M#*LOG(CDBL(2^5/3^3))+N#*CDBL(3/5)
2970 D#(4)=M#*LOG(CDBL(3^4/2^6))-N#*CDBL(4/5)
2980 D#(5)=M#*LOG(CDBL(2^2/3))+N#*CDBL(1/5)
2990 D#(6)=M#*LOG(CDBL(3^6/2^9))-N#*CDBL(6/5)
3000 D#(7)=M#*LOG(CDBL(3/2))-N#*CDBL(1/5)
3010 D#(8)=M#*LOG(CDBL(3^8/2^12))-N#*CDBL(8/5)
3020 D#(9)=M#*LOG(CDBL(3^3/2^4))-N#*CDBL(3/5)
3030 D#(10)=M#*LOG(CDBL(2^4/3^2))+N#*CDBL(2/5)
3040 D#(11)=M#*LOG(CDBL(3^5/2^7))-N#*CDBL(1)
3050 GOSUB 1080
3060 N$="[NO.16] Praetorius Meantone"
3070 D#(1)=M#*LOG(CDBL(3^7/2^11))-N#*CDBL(7/4)
3080 D#(2)=M#*LOG(CDBL(3^2/2^3))-N#*CDBL(1/2)
3090 D#(3)=M#*LOG(CDBL(2^5/3^3))+N#*CDBL(1/2)
3100 D#(4)=M#*LOG(CDBL(3^4/2^6))-N#*CDBL(1)
3110 D#(5)=M#*LOG(CDBL(2^2/3))+N#*CDBL(1/4)
3120 D#(6)=M#*LOG(CDBL(3^6/2^9))-N#*CDBL(3/2)
3130 D#(7)=M#*LOG(CDBL(3/2))-N#*CDBL(1/4)
3140 D#(8)=M#*LOG(CDBL(3^8/2^12))-N#*CDBL(7/4)
3150 D#(9)=M#*LOG(CDBL(3^3/2^4))-N#*CDBL(3/4)
3160 D#(10)=M#*LOG(CDBL(2^4/3^2))+N#*CDBL(1/2)
3170 D#(11)=M#*LOG(CDBL(3^5/2^7))-N#*CDBL(5/4)
3180 GOSUB 1080
3190 N$="[NO.17] Schnitger Meantone"
3200 D#(1)=M#*LOG(CDBL(3^7/2^11))-N#*CDBL(3/2)
3210 D#(2)=M#*LOG(CDBL(3^2/2^3))-N#*CDBL(1/2)
3220 D#(3)=M#*LOG(CDBL(2^5/3^3))+N#*CDBL(1/4)
3230 D#(4)=M#*LOG(CDBL(3^4/2^6))-N#*CDBL(1)
3240 D#(5)=M#*LOG(CDBL(2^2/3))+N#*CDBL(1/4)
3250 D#(6)=M#*LOG(CDBL(3^6/2^9))-N#*CDBL(3/2)
3260 D#(7)=M#*LOG(CDBL(3/2))-N#*CDBL(1/4)
3270 D#(8)=M#*LOG(CDBL(3^8/2^12))-N#*CDBL(3/2)
3280 D#(9)=M#*LOG(CDBL(3^3/2^4))-N#*CDBL(3/4)
3290 D#(10)=M#*LOG(CDBL(2^4/3^2))+N#*CDBL(1/4)
3300 D#(11)=M#*LOG(CDBL(3^5/2^7))-N#*CDBL(5/4)
3310 GOSUB 1080
3320 N$="[NO.18] Kirnberger <1>"
3330 D#(1)=M#*LOG(CDBL(2^8/3^5))
3340 D#(2)=M#*LOG(CDBL(3^2/2^3))
3350 D#(3)=M#*LOG(CDBL(2^5/3^3))
3360 D#(4)=M#*LOG(CDBL(3^4/2^6))-N#*CDBL(1)
3370 D#(5)=M#*LOG(CDBL(2^2/3))
3380 D#(6)=M#*LOG(CDBL(3^6/2^9))-N#*CDBL(1)
3390 D#(7)=M#*LOG(CDBL(3/2))
3400 D#(8)=M#*LOG(CDBL(2^7/3^4))
3410 D#(9)=M#*LOG(CDBL(3^3/2^4))-N#*CDBL(1)
3420 D#(10)=M#*LOG(CDBL(2^4/3^2))
3430 D#(11)=M#*LOG(CDBL(3^5/2^7))-N#*CDBL(1)
3440 GOSUB 1080
3450 N$="[NO.19] Kirnberger <2>"
3460 D#(1)=M#*LOG(CDBL(2^8/3^5))
3470 D#(2)=M#*LOG(CDBL(3^2/2^3))
3480 D#(3)=M#*LOG(CDBL(2^5/3^3))
3490 D#(4)=M#*LOG(CDBL(3^4/2^6))-N#*CDBL(1)
3500 D#(5)=M#*LOG(CDBL(2^2/3))
3510 D#(6)=M#*LOG(CDBL(3^6/2^9))-N#*CDBL(1)
3520 D#(7)=M#*LOG(CDBL(3/2))
3530 D#(8)=M#*LOG(CDBL(2^7/3^4))
3540 D#(9)=M#*LOG(CDBL(3^3/2^4))-N#*CDBL(1/2)
3550 D#(10)=M#*LOG(CDBL(2^4/3^2))
3560 D#(11)=M#*LOG(CDBL(3^5/2^7))-N#*CDBL(1)
3570 GOSUB 1080
3580 N$="[NO.20] Kirnberger <3>"
3590 D#(1)=M#*LOG(CDBL(2^8/3^5))
3600 D#(2)=M#*LOG(CDBL(3^2/2^3))-N#*CDBL(1/2)
3610 D#(3)=M#*LOG(CDBL(2^5/3^3))
3620 D#(4)=M#*LOG(CDBL(3^4/2^6))-N#*CDBL(1)
3630 D#(5)=M#*LOG(CDBL(2^2/3))
3640 D#(6)=M#*LOG(CDBL(3^6/2^9))-N#*CDBL(1)
3650 D#(7)=M#*LOG(CDBL(3/2))-N#*CDBL(1/4)
3660 D#(8)=M#*LOG(CDBL(2^7/3^4))
3670 D#(9)=M#*LOG(CDBL(3^3/2^4))-N#*CDBL(3/4)
3680 D#(10)=M#*LOG(CDBL(2^4/3^2))
3690 D#(11)=M#*LOG(CDBL(3^5/2^7))-N#*CDBL(1)
3700 GOSUB 1080
3710 N$="[NO.21] Werckmeister <1>"
3720 D#(1)=M#*LOG(CDBL(2^8/3^5))
3730 D#(2)=M#*LOG(CDBL(3^2/2^3))-W#*CDBL(1/2)
3740 D#(3)=M#*LOG(CDBL(2^5/3^3))
3750 D#(4)=M#*LOG(CDBL(3^4/2^6))-W#*CDBL(3/4)
3760 D#(5)=M#*LOG(CDBL(2^2/3))
3770 D#(6)=M#*LOG(CDBL(2^10/3^6))
3780 D#(7)=M#*LOG(CDBL(3/2))-W#*CDBL(1/4)
3790 D#(8)=M#*LOG(CDBL(2^7/3^4))
3800 D#(9)=M#*LOG(CDBL(3^3/2^4))-W#*CDBL(3/4)
3810 D#(10)=M#*LOG(CDBL(2^4/3^2))
3820 D#(11)=M#*LOG(CDBL(3^5/2^7))-W#*CDBL(3/4)
3830 GOSUB 1080
3840 N$="[NO.22] Werckmeister <2>"
3850 D#(1)=M#*LOG(CDBL(3^7/2^11))-W#*CDBL(4/3)
3860 D#(2)=M#*LOG(CDBL(3^2/2^3))-W#*CDBL(1/3)
3870 D#(3)=M#*LOG(CDBL(2^5/3^3))
3880 D#(4)=M#*LOG(CDBL(3^4/2^6))-W#*CDBL(2/3)
3890 D#(5)=M#*LOG(CDBL(2^2/3))
3900 D#(6)=M#*LOG(CDBL(3^6/2^9))-W#*CDBL(1)
3910 D#(7)=M#*LOG(CDBL(3/2))-W#*CDBL(1/3)
3920 D#(8)=M#*LOG(CDBL(3^8/2^12))-W#*CDBL(4/3)
3930 D#(9)=M#*LOG(CDBL(3^3/2^4))-W#*CDBL(2/3)
3940 D#(10)=M#*LOG(CDBL(2^4/3^2))+W#*CDBL(1/3)
3950 D#(11)=M#*LOG(CDBL(3^5/2^7))-W#*CDBL(1)
3960 GOSUB 1080
3970 N$="[NO.23] Werckmeister <3>"
3980 D#(1)=M#*LOG(CDBL(3^7/2^11))-W#*CDBL(3/4)
3990 D#(2)=M#*LOG(CDBL(3^2/2^3))
4000 D#(3)=M#*LOG(CDBL(2^5/3^3))+W#*CDBL(1/4)
4010 D#(4)=M#*LOG(CDBL(3^4/2^6))-W#*CDBL(1/2)
4020 D#(5)=M#*LOG(CDBL(2^2/3))+W#*CDBL(1/4)
4030 D#(6)=M#*LOG(CDBL(3^6/2^9))-W#*CDBL(1/2)
4040 D#(7)=M#*LOG(CDBL(3/2))
4050 D#(8)=M#*LOG(CDBL(3^8/2^12))-W#*CDBL(1)
4060 D#(9)=M#*LOG(CDBL(3^3/2^4))-W#*CDBL(1/4)
4070 D#(10)=M#*LOG(CDBL(2^4/3^2))+W#*CDBL(1/4)
4080 D#(11)=M#*LOG(CDBL(3^5/2^7))-W#*CDBL(1/2)
4090 GOSUB 1080
4100 N$="[NO.24] Kirnberger - Werckmeistar"
4110 D#(1)=M#*LOG(CDBL(2^8/3^5))
4120 D#(2)=M#*LOG(CDBL(3^2/2^3))-N#*CDBL(1/2)
4130 D#(3)=M#*LOG(CDBL(2^5/3^3))
4140 D#(4)=M#*LOG(CDBL(3^4/2^6))-N#*CDBL(3/4)
4150 D#(5)=M#*LOG(CDBL(2^2/3))
4160 D#(6)=M#*LOG(CDBL(3^6/2^9))-N#*CDBL(1)
4170 D#(7)=M#*LOG(CDBL(3/2))-N#*CDBL(1/4)
4180 D#(8)=M#*LOG(CDBL(2^7/3^4))
4190 D#(9)=M#*LOG(CDBL(3^3/2^4))-N#*CDBL(3/4)
4200 D#(10)=M#*LOG(CDBL(2^4/3^2))
4210 D#(11)=M#*LOG(CDBL(3^5/2^7))-N#*CDBL(3/4)
4220 GOSUB 1080
4230 N$="[NO.25] Rameau-Legros Meantone"
4240 D#(1)=M#*LOG(CDBL(3^7/2^11))-N#*CDBL(5/4)
4250 D#(2)=M#*LOG(CDBL(3^2/2^3))-N#*CDBL(1/2)
4260 D#(4)=M#*LOG(CDBL(3^4/2^6))-N#*CDBL(1)
4270 D#(5)=M#*LOG(CDBL(2^2/3))+N#*CDBL(1/4)
4280 D#(6)=M#*LOG(CDBL(3^6/2^9))-N#*CDBL(5/4)
4290 D#(7)=M#*LOG(CDBL(3/2))-N#*CDBL(1/4)
4300 D#(8)=M#*LOG(CDBL(3^8/2^12))-N#*CDBL(5/4)
4310 D#(9)=M#*LOG(CDBL(3^3/2^4))-N#*CDBL(3/4)
4320 D#(10)=M#*LOG(CDBL(2^4/3^2))+N#*CDBL(1/2)
4330 D#(11)=M#*LOG(CDBL(3^5/2^7))-N#*CDBL(5/4)
4340 D#(3)=(D#(10)+D#(8)-1200#)/2#
4350 GOSUB 1080
4360 N$="[NO.26] Vogel-III Meantone"
4370 D#(1)=M#*LOG(CDBL(3^7/2^11))-N#*CDBL(3/2)
4380 D#(2)=M#*LOG(CDBL(3^2/2^3))-N#*CDBL(1/2)
4390 D#(4)=M#*LOG(CDBL(3^4/2^6))-N#*CDBL(1)
4400 D#(5)=M#*LOG(CDBL(2^2/3))
4410 D#(6)=M#*LOG(CDBL(3^6/2^9))-N#*CDBL(3/2)
4420 D#(7)=M#*LOG(CDBL(3/2))-N#*CDBL(1/4)
4430 D#(8)=M#*LOG(CDBL(3^8/2^12))-N#*CDBL(3/2)
4440 D#(9)=M#*LOG(CDBL(3^3/2^4))-N#*CDBL(3/4)
4450 D#(10)=M#*LOG(CDBL(2^4/3^2))
4460 D#(11)=M#*LOG(CDBL(3^5/2^7))-N#*CDBL(5/4)
4470 D#(3)=(D#(10)+D#(8)-1200#)/2#
4480 GOSUB 1080
4490 N$="[NO.27] Bruder Well-Tempered"
4500 D#(7)=M#*LOG(CDBL(3/2))-N#*CDBL(1/4)
4510 D#(2)=M#*LOG(CDBL(3^2/2^3))-N#*CDBL(1/2)
4520 D#(9)=M#*LOG(CDBL(3^3/2^4))-N#*CDBL(3/4)
4530 D#(4)=M#*LOG(CDBL(3^4/2^6))-N#*CDBL(1)
4540 D#(5)=(M#*LOG(CDBL(2*5)))/8#
4550 D#(10)=D#(5)*2#
4560 D#(3)=D#(5)*3#-CDBL(1200*1)
4570 D#(8)=D#(5)*4#-CDBL(1200*1)
4580 D#(1)=D#(5)*5#-CDBL(1200*2)
4590 D#(6)=D#(5)*6#-CDBL(1200*2)
4600 D#(11)=D#(5)*7#-CDBL(1200*2)
4610 GOSUB 1080
4620 N$="[NO.28] Bruder - Werckmeister"
4630 D#(7)=M#*LOG(CDBL(3/2))-N#*CDBL(1/4)
4640 D#(2)=M#*LOG(CDBL(3^2/2^3))-N#*CDBL(1/2)
4650 D#(9)=M#*LOG(CDBL(3^3/2^4))-N#*CDBL(3/4)
4660 D#(5)=(M#*LOG(CDBL(2*5)))/8#
4670 D#(10)=D#(5)*2#
4680 D#(3)=D#(5)*3#-CDBL(1200*1)
4690 D#(8)=D#(5)*4#-CDBL(1200*1)
4700 D#(1)=D#(5)*5#-CDBL(1200*2)
4710 D#(6)=D#(5)*6#-CDBL(1200*2)
4720 D#(11)=D#(6)-D#(7)+1200#
4730 D#(4)=D#(9)-D#(5)
4740 GOSUB 1080
4750 N$="[NO.29] Gottfried ( 1/6 Syntonic Comma )"
4760 D#(1)=M#*LOG(CDBL(3^7/2^11))-N#*CDBL(7/6)
4770 D#(2)=M#*LOG(CDBL(3^2/2^3))-N#*CDBL(1/3)
4780 D#(3)=M#*LOG(CDBL(2^5/3^3))+N#*CDBL(1/2)
4790 D#(4)=M#*LOG(CDBL(3^4/2^6))-N#*CDBL(2/3)
4800 D#(5)=M#*LOG(CDBL(2^2/3))+N#*CDBL(1/6)
4810 D#(6)=M#*LOG(CDBL(3^6/2^9))-N#*CDBL(1)
4820 D#(7)=M#*LOG(CDBL(3/2))-N#*CDBL(1/6)
4830 D#(8)=M#*LOG(CDBL(3^8/2^12))-N#*CDBL(4/3)
4840 D#(9)=M#*LOG(CDBL(3^3/2^4))-N#*CDBL(1/2)
4850 D#(10)=M#*LOG(CDBL(2^4/3^2))+N#*CDBL(1/3)
4860 D#(11)=M#*LOG(CDBL(3^5/2^7))-N#*CDBL(5/6)
4870 GOSUB 1080
4880 N$="[NO.30] Gottfried ( 1/6 Pythagorean Comma )"
4890 D#(1)=M#*LOG(CDBL(3^7/2^11))-W#*CDBL(7/6)
4900 D#(2)=M#*LOG(CDBL(3^2/2^3))-W#*CDBL(1/3)
4910 D#(3)=M#*LOG(CDBL(2^5/3^3))+W#*CDBL(1/2)
4920 D#(4)=M#*LOG(CDBL(3^4/2^6))-W#*CDBL(2/3)
4930 D#(5)=M#*LOG(CDBL(2^2/3))+W#*CDBL(1/6)
4940 D#(6)=M#*LOG(CDBL(3^6/2^9))-W#*CDBL(1)
4950 D#(7)=M#*LOG(CDBL(3/2))-W#*CDBL(1/6)
4960 D#(8)=M#*LOG(CDBL(3^8/2^12))-W#*CDBL(4/3)
4970 D#(9)=M#*LOG(CDBL(3^3/2^4))-W#*CDBL(1/2)
4980 D#(10)=M#*LOG(CDBL(2^4/3^2))+W#*CDBL(1/3)
4990 D#(11)=M#*LOG(CDBL(3^5/2^7))-W#*CDBL(5/6)
5000 GOSUB 1080
5010 N$="[NO.31] Marin Mersenne : Pure Temperament"
5020 D#(1)=M#*LOG(CDBL(25/24))
5030 D#(2)=M#*LOG(CDBL(9/8))
5040 D#(3)=M#*LOG(CDBL(75/64))
5050 D#(4)=M#*LOG(CDBL(5/4))
5060 D#(5)=M#*LOG(CDBL(4/3))
5070 D#(6)=M#*LOG(CDBL(25/18))
5080 D#(7)=M#*LOG(CDBL(3/2))
5090 D#(8)=M#*LOG(CDBL(25/16))
5100 D#(9)=M#*LOG(CDBL(5/3))
5110 D#(10)=M#*LOG(CDBL(16/9))
5120 D#(11)=M#*LOG(CDBL(15/8))
5130 GOSUB 1080
5140 N$="[NO.32] Pure <D:-1> Temperament (Q-39)"
5150 D#(1)=M#*LOG(CDBL(5/4*5/4*2/3))
5160 D#(2)=M#*LOG(CDBL(5/4*2/3*2/3*2))
5170 D#(3)=M#*LOG(CDBL(2/3*2/3*2/3*4))
5180 D#(4)=M#*LOG(CDBL(5/4))
5190 D#(5)=M#*LOG(CDBL(2/3*2))
5200 D#(6)=M#*LOG(CDBL(5/4*5/4*2/3*2/3*2))
5210 D#(7)=M#*LOG(CDBL(5/4*2/3*2/3*2/3*4))
5220 D#(8)=M#*LOG(CDBL(5/4*5/4))
5230 D#(9)=M#*LOG(CDBL(5/4*2/3*2))
5240 D#(10)=M#*LOG(CDBL(2/3*2/3*4))
5250 D#(11)=M#*LOG(CDBL(5/4*5/4*2/3*2/3*2/3*4))
5260 GOSUB 1080
5270 N$="[NO.33] Pure <A:-1> Temperament (Q-40)"
5280 D#(1)=M#*LOG(CDBL(5/4*5/4*2/3))
5290 D#(2)=M#*LOG(CDBL(5/4*2/3*2/3*2))
5300 D#(3)=M#*LOG(CDBL(3/2*5/4*5/4/2))
5310 D#(4)=M#*LOG(CDBL(5/4))
5320 D#(5)=M#*LOG(CDBL(2/3*2))
5330 D#(6)=M#*LOG(CDBL(5/4*5/4*2/3*2/3*2))
5340 D#(7)=M#*LOG(CDBL(3/2))
5350 D#(8)=M#*LOG(CDBL(5/4*5/4))
5360 D#(9)=M#*LOG(CDBL(5/4*2/3*2))
5370 D#(10)=M#*LOG(CDBL(2/3*2/3*4))
5380 D#(11)=M#*LOG(CDBL(3/2*5/4))
5390 GOSUB 1080
5400 N$="[NO.34] Pure <E:-1> Temperament (Q-41)"
5410 D#(1)=M#*LOG(CDBL(5/4*5/4*2/3))
5420 D#(2)=M#*LOG(CDBL(3/2*3/2/2))
5430 D#(3)=M#*LOG(CDBL(3/2*5/4*5/4/2))
5440 D#(4)=M#*LOG(CDBL(5/4))
5450 D#(5)=M#*LOG(CDBL(2/3*2))
5460 D#(6)=M#*LOG(CDBL(3/2*3/2*5/4/2))
5470 D#(7)=M#*LOG(CDBL(3/2))
5480 D#(8)=M#*LOG(CDBL(5/4*5/4))
5490 D#(9)=M#*LOG(CDBL(5/4*2/3*2))
5500 D#(10)=M#*LOG(CDBL(3/2*3/2*5/4*5/4/2))
5510 D#(11)=M#*LOG(CDBL(3/2*5/4))
5520 GOSUB 1080
5530 N$="[NO.35] Pure <B:-1> Temperament (Q-42)"
5540 D#(1)=M#*LOG(CDBL(3/2*3/2*3/2*5/4/4))
5550 D#(2)=M#*LOG(CDBL(3/2*3/2/2))
5560 D#(3)=M#*LOG(CDBL(3/2*5/4*5/4/2))
5570 D#(4)=M#*LOG(CDBL(5/4))
5580 D#(5)=M#*LOG(CDBL(3/2*3/2*3/2*5/4*5/4/4))
5590 D#(6)=M#*LOG(CDBL(3/2*3/2*5/4/2))
5600 D#(7)=M#*LOG(CDBL(3/2))
5610 D#(8)=M#*LOG(CDBL(5/4*5/4))
5620 D#(9)=M#*LOG(CDBL(3/2*3/2*3/2/2))
5630 D#(10)=M#*LOG(CDBL(3/2*3/2*5/4*5/4/2))
5640 D#(11)=M#*LOG(CDBL(3/2*5/4))
5650 GOSUB 1080
5660 N$="[NO.36] Pure <Bb:0> Temperament (Q-48)"
5670 D#(1)=M#*LOG(CDBL(4/5*2/3*2))
5680 D#(2)=M#*LOG(CDBL(5/4*2/3*2/3*2))
5690 D#(3)=M#*LOG(CDBL(2/3*2/3*2/3*4))
5700 D#(4)=M#*LOG(CDBL(5/4))
5710 D#(5)=M#*LOG(CDBL(2/3*2))
5720 D#(6)=M#*LOG(CDBL(4/5*2/3*2/3*4))
5730 D#(7)=M#*LOG(CDBL(5/4*2/3*2/3*2/3*4))
5740 D#(8)=M#*LOG(CDBL(4/5*2))
5750 D#(9)=M#*LOG(CDBL(5/4*2/3*2))
5760 D#(10)=M#*LOG(CDBL(2/3*2/3*4))
5770 D#(11)=M#*LOG(CDBL(4/5*2/3*2/3*2/3*8))
5780 GOSUB 1080
5790 N$="[NO.37] Pure <F:0> Temperament (Q-49)"
5800 D#(1)=M#*LOG(CDBL(4/5*2/3*2))
5810 D#(2)=M#*LOG(CDBL(5/4*2/3*2/3*2))
5820 D#(3)=M#*LOG(CDBL(3/2*4/5))
5830 D#(4)=M#*LOG(CDBL(5/4))
5840 D#(5)=M#*LOG(CDBL(2/3*2))
5850 D#(6)=M#*LOG(CDBL(4/5*2/3*2/3*4))
5860 D#(7)=M#*LOG(CDBL(3/2))
5870 D#(8)=M#*LOG(CDBL(4/5*2))
5880 D#(9)=M#*LOG(CDBL(5/4*2/3*2))
5890 D#(10)=M#*LOG(CDBL(2/3*2/3*4))
5900 D#(11)=M#*LOG(CDBL(3/2*5/4))
5910 GOSUB 1080
5920 N$="[NO.38] Pure <C:0> Temperament (Q-50)"
5930 D#(1)=M#*LOG(CDBL(4/5*2/3*2))
5940 D#(2)=M#*LOG(CDBL(3/2*3/2/2))
5950 D#(3)=M#*LOG(CDBL(3/2*4/5))
5960 D#(4)=M#*LOG(CDBL(5/4))
5970 D#(5)=M#*LOG(CDBL(2/3*2))
5980 D#(6)=M#*LOG(CDBL(3/2*3/2*5/4/2))
5990 D#(7)=M#*LOG(CDBL(3/2))
6000 D#(8)=M#*LOG(CDBL(4/5*2))
6010 D#(9)=M#*LOG(CDBL(5/4*2/3*2))
6020 D#(10)=M#*LOG(CDBL(3/2*3/2*4/5))
6030 D#(11)=M#*LOG(CDBL(3/2*5/4))
6040 GOSUB 1080
6050 N$="[NO.39] Pure <G:0> Temperament (Q-51)"
6060 D#(1)=M#*LOG(CDBL(3/2*3/2*3/2*5/4/4))
6070 D#(2)=M#*LOG(CDBL(3/2*3/2/2))
6080 D#(3)=M#*LOG(CDBL(3/2*4/5))
6090 D#(4)=M#*LOG(CDBL(5/4))
6100 D#(5)=M#*LOG(CDBL(3/2*3/2*3/2*4/5/2))
6110 D#(6)=M#*LOG(CDBL(3/2*3/2*5/4/2))
6120 D#(7)=M#*LOG(CDBL(3/2))
6130 D#(8)=M#*LOG(CDBL(4/5*2))
6140 D#(9)=M#*LOG(CDBL(3/2*3/2*3/2/2))
6150 D#(10)=M#*LOG(CDBL(3/2*3/2*4/5))
6160 D#(11)=M#*LOG(CDBL(3/2*5/4))
6170 GOSUB 1080
6180 N$="[NO.40] Pure <Gb:+1> Temperament (Q-57)"
6190 D#(1)=M#*LOG(CDBL(4/5*2/3*2))
6200 D#(2)=M#*LOG(CDBL(4/5*4/5*2/3*2/3*4))
6210 D#(3)=M#*LOG(CDBL(2/3*2/3*2/3*4))
6220 D#(4)=M#*LOG(CDBL(4/5*4/5*2))
6230 D#(5)=M#*LOG(CDBL(2/3*2))
6240 D#(6)=M#*LOG(CDBL(4/5*2/3*2/3*4))
6250 D#(7)=M#*LOG(CDBL(4/5*4/5*2/3*2/3*2/3*8))
6260 D#(8)=M#*LOG(CDBL(4/5*2))
6270 D#(9)=M#*LOG(CDBL(4/5*4/5*2/3*4))
6280 D#(10)=M#*LOG(CDBL(2/3*2/3*4))
6290 D#(11)=M#*LOG(CDBL(4/5*2/3*2/3*2/3*8))
6300 GOSUB 1080
6310 N$="[NO.41] Pure <Db:+1> Temperament (Q-58)"
6320 D#(1)=M#*LOG(CDBL(4/5*2/3*2))
6330 D#(2)=M#*LOG(CDBL(4/5*4/5*2/3*2/3*4))
6340 D#(3)=M#*LOG(CDBL(3/2*4/5))
6350 D#(4)=M#*LOG(CDBL(4/5*4/5*2))
6360 D#(5)=M#*LOG(CDBL(2/3*2))
6370 D#(6)=M#*LOG(CDBL(4/5*2/3*2/3*4))
6380 D#(7)=M#*LOG(CDBL(3/2))
6390 D#(8)=M#*LOG(CDBL(4/5*2))
6400 D#(9)=M#*LOG(CDBL(4/5*4/5*2/3*4))
6410 D#(10)=M#*LOG(CDBL(2/3*2/3*4))
6420 D#(11)=M#*LOG(CDBL(3/2*4/5*4/5*2))
6430 GOSUB 1080
6440 N$="[NO.42] Pure <Ab:+1> Temperament (Q-59)"
6450 D#(1)=M#*LOG(CDBL(4/5*2/3*2))
6460 D#(2)=M#*LOG(CDBL(3/2*3/2/2))
6470 D#(3)=M#*LOG(CDBL(3/2*4/5))
6480 D#(4)=M#*LOG(CDBL(4/5*4/5*2))
6490 D#(5)=M#*LOG(CDBL(2/3*2))
6500 D#(6)=M#*LOG(CDBL(3/2*3/2*4/5*4/5))
6510 D#(7)=M#*LOG(CDBL(3/2))
6520 D#(8)=M#*LOG(CDBL(4/5*2))
6530 D#(9)=M#*LOG(CDBL(4/5*4/5*2/3*4))
6540 D#(10)=M#*LOG(CDBL(3/2*3/2*4/5))
6550 D#(11)=M#*LOG(CDBL(3/2*4/5*4/5*2))
6560 GOSUB 1080
6570 N$="[NO.43] Pure <Eb:+1> Temperament (Q-60)"
6580 D#(1)=M#*LOG(CDBL(3/2*3/2*3/2*4/5*4/5/2))
6590 D#(2)=M#*LOG(CDBL(3/2*3/2/2))
6600 D#(3)=M#*LOG(CDBL(3/2*4/5))
6610 D#(4)=M#*LOG(CDBL(4/5*4/5*2))
6620 D#(5)=M#*LOG(CDBL(3/2*3/2*3/2*4/5/2))
6630 D#(6)=M#*LOG(CDBL(3/2*3/2*4/5*4/5))
6640 D#(7)=M#*LOG(CDBL(3/2))
6650 D#(8)=M#*LOG(CDBL(4/5*2))
6660 D#(9)=M#*LOG(CDBL(3/2*3/2*3/2/2))
6670 D#(10)=M#*LOG(CDBL(3/2*3/2*4/5))
6680 D#(11)=M#*LOG(CDBL(3/2*4/5*4/5*2))
6690 GOSUB 1080
6700 N$="[NO.44] Pure <D:-1> Temperament (T-39)"
6710 D#(1)=M#*LOG(CDBL(5/3*5/3*5/3*2/3*2/3/2))
6720 D#(2)=M#*LOG(CDBL(5/3*2/3))
6730 D#(3)=M#*LOG(CDBL(5/3*5/3*5/3/4))
6740 D#(4)=M#*LOG(CDBL(5/3*5/3*2/3*2/3))
6750 D#(5)=M#*LOG(CDBL(2/3*2))
6760 D#(6)=M#*LOG(CDBL(5/3*5/3/2))
6770 D#(7)=M#*LOG(CDBL(5/3*2/3*2/3*2))
6780 D#(8)=M#*LOG(CDBL(5/3*5/3*5/3*2/3/2))
6790 D#(9)=M#*LOG(CDBL(5/3))
6800 D#(10)=M#*LOG(CDBL(2/3*2/3*4))
6810 D#(11)=M#*LOG(CDBL(5/3*5/3*2/3*2/2))
6820 GOSUB 1080
6830 N$="[NO.45] Pure <A:-1> Temperament (T-40)"
6840 D#(1)=M#*LOG(CDBL(3/2*5/3*5/3/4))
6850 D#(2)=M#*LOG(CDBL(5/3*2/3))
6860 D#(3)=M#*LOG(CDBL(5/3*5/3*5/3/4))
6870 D#(4)=M#*LOG(CDBL(3/2*5/3/2))
6880 D#(5)=M#*LOG(CDBL(2/3*2))
6890 D#(6)=M#*LOG(CDBL(5/3*5/3/2))
6900 D#(7)=M#*LOG(CDBL(3/2))
6910 D#(8)=M#*LOG(CDBL(5/3*5/3*5/3*2/3/2))
6920 D#(9)=M#*LOG(CDBL(5/3))
6930 D#(10)=M#*LOG(CDBL(3/2*5/3*5/3*5/3/4))
6940 D#(11)=M#*LOG(CDBL(5/3*5/3*2/3*2/2))
6950 GOSUB 1080
6960 N$="[NO.46] Pure <E:-1> Temperament (T-41)"
6970 D#(1)=M#*LOG(CDBL(3/2*5/3*5/3/4))
6980 D#(2)=M#*LOG(CDBL(3/2*3/2/2))
6990 D#(3)=M#*LOG(CDBL(5/3*5/3*5/3/4))
7000 D#(4)=M#*LOG(CDBL(3/2*5/3/2))
7010 D#(5)=M#*LOG(CDBL(3/2*3/2*5/3*5/3*5/3/8))
7020 D#(6)=M#*LOG(CDBL(5/3*5/3/2))
7030 D#(7)=M#*LOG(CDBL(3/2))
7040 D#(8)=M#*LOG(CDBL(3/2*3/2*5/3*5/3/4))
7050 D#(9)=M#*LOG(CDBL(5/3))
7060 D#(10)=M#*LOG(CDBL(3/2*5/3*5/3*5/3/4))
7070 D#(11)=M#*LOG(CDBL(3/2*3/2*5/3/2))
7080 GOSUB 1080
7090 N$="[NO.47] Pure <F:0> Temperament (T-49)"
7100 D#(1)=M#*LOG(CDBL(3/5*2/3*2/3*4))
7110 D#(2)=M#*LOG(CDBL(5/3*2/3))
7120 D#(3)=M#*LOG(CDBL(3/5*2))
7130 D#(4)=M#*LOG(CDBL(5/3*5/3*2/3*2/3))
7140 D#(5)=M#*LOG(CDBL(2/3*2))
7150 D#(6)=M#*LOG(CDBL(5/3*5/3/2))
7160 D#(7)=M#*LOG(CDBL(5/3*2/3*2/3*2))
7170 D#(8)=M#*LOG(CDBL(3/5*2/3*4))
7180 D#(9)=M#*LOG(CDBL(5/3))
7190 D#(10)=M#*LOG(CDBL(2/3*2/3*4))
7200 D#(11)=M#*LOG(CDBL(5/3*5/3*2/3*2/2))
7210 GOSUB 1080
7220 N$="[NO.48] Pure <C:0> Temperament (T-50)"
7230 D#(1)=M#*LOG(CDBL(3/2*5/3*5/3/4))
7240 D#(2)=M#*LOG(CDBL(5/3*2/3))
7250 D#(3)=M#*LOG(CDBL(3/5*2))
7260 D#(4)=M#*LOG(CDBL(3/2*5/3/2))
7270 D#(5)=M#*LOG(CDBL(2/3*2))
7280 D#(6)=M#*LOG(CDBL(5/3*5/3/2))
7290 D#(7)=M#*LOG(CDBL(3/2))
7300 D#(8)=M#*LOG(CDBL(3/5*2/3*4))
7310 D#(9)=M#*LOG(CDBL(5/3))
7320 D#(10)=M#*LOG(CDBL(3/2*3/5*2))
7330 D#(11)=M#*LOG(CDBL(5/3*5/3*2/3*2/2))
7340 GOSUB 1080
7350 N$="[NO.49] Pure <G:0> Temperament (T-51)"
7360 D#(1)=M#*LOG(CDBL(3/2*5/3*5/3/4))
7370 D#(2)=M#*LOG(CDBL(3/2*3/2/2))
7380 D#(3)=M#*LOG(CDBL(3/5*2))
7390 D#(4)=M#*LOG(CDBL(3/2*5/3/2))
7400 D#(5)=M#*LOG(CDBL(3/2*3/2*3/5))
7410 D#(6)=M#*LOG(CDBL(5/3*5/3/2))
7420 D#(7)=M#*LOG(CDBL(3/2))
7430 D#(8)=M#*LOG(CDBL(3/2*3/2*5/3*5/3/4))
7440 D#(9)=M#*LOG(CDBL(5/3))
7450 D#(10)=M#*LOG(CDBL(3/2*3/5*2))
7460 D#(11)=M#*LOG(CDBL(3/2*3/2*5/3/2))
7470 GOSUB 1080
7480 N$="[NO.50] Pure <Ab:+1> Temperament (T-59)"
7490 D#(1)=M#*LOG(CDBL(3/5*2/3*2/3*4))
7500 D#(2)=M#*LOG(CDBL(5/3*2/3))
7510 D#(3)=M#*LOG(CDBL(3/5*2))
7520 D#(4)=M#*LOG(CDBL(3/5*3/5*2/3*2/3*8))
7530 D#(5)=M#*LOG(CDBL(2/3*2))
7540 D#(6)=M#*LOG(CDBL(3/5*3/5*4))
7550 D#(7)=M#*LOG(CDBL(5/3*2/3*2/3*2))
7560 D#(8)=M#*LOG(CDBL(3/5*2/3*4))
7570 D#(9)=M#*LOG(CDBL(5/3))
7580 D#(10)=M#*LOG(CDBL(2/3*2/3*4))
7590 D#(11)=M#*LOG(CDBL(3/5*3/5*2/3*8))
7600 GOSUB 1080
7610 N$="[NO.51] Pure <Eb:+1> Temperament (T-60)"
7620 D#(1)=M#*LOG(CDBL(3/2*3/5*3/5*2))
7630 D#(2)=M#*LOG(CDBL(5/3*2/3))
7640 D#(3)=M#*LOG(CDBL(3/5*2))
7650 D#(4)=M#*LOG(CDBL(3/2*5/3/2))
7660 D#(5)=M#*LOG(CDBL(2/3*2))
7670 D#(6)=M#*LOG(CDBL(3/5*3/5*4))
7680 D#(7)=M#*LOG(CDBL(3/2))
7690 D#(8)=M#*LOG(CDBL(3/5*2/3*4))
7700 D#(9)=M#*LOG(CDBL(5/3))
7710 D#(10)=M#*LOG(CDBL(3/2*3/5*2))
7720 D#(11)=M#*LOG(CDBL(3/5*3/5*2/3*8))
7730 GOSUB 1080
7740 N$="[NO.52] Pure <Bb:+1> Temperament (T-61)"
7750 D#(1)=M#*LOG(CDBL(3/2*3/5*3/5*2))
7760 D#(2)=M#*LOG(CDBL(3/2*3/2/2))
7770 D#(3)=M#*LOG(CDBL(3/5*2))
7780 D#(4)=M#*LOG(CDBL(3/2*5/3/2))
7790 D#(5)=M#*LOG(CDBL(3/2*3/2*3/5))
7800 D#(6)=M#*LOG(CDBL(3/5*3/5*4))
7810 D#(7)=M#*LOG(CDBL(3/2))
7820 D#(8)=M#*LOG(CDBL(3/2*3/2*3/5*3/5*2))
7830 D#(9)=M#*LOG(CDBL(5/3))
7840 D#(10)=M#*LOG(CDBL(3/2*3/5*2))
7850 D#(11)=M#*LOG(CDBL(3/2*3/2*5/3/2))
7860 GOSUB 1080
7870 N$="[NO.53] Pure <Cb:+2> Temperament (T-69)"
7880 D#(1)=M#*LOG(CDBL(3/5*2/3*2/3*4))
7890 D#(2)=M#*LOG(CDBL(3/5*3/5*3/5*2/3*8))
7900 D#(3)=M#*LOG(CDBL(3/5*2))
7910 D#(4)=M#*LOG(CDBL(3/5*3/5*2/3*2/3*8))
7920 D#(5)=M#*LOG(CDBL(2/3*2))
7930 D#(6)=M#*LOG(CDBL(3/5*3/5*4))
7940 D#(7)=M#*LOG(CDBL(3/5*3/5*3/5*2/3*2/3*16))
7950 D#(8)=M#*LOG(CDBL(3/5*2/3*4))
7960 D#(9)=M#*LOG(CDBL(3/5*3/5*3/5*8))
7970 D#(10)=M#*LOG(CDBL(2/3*2/3*4))
7980 D#(11)=M#*LOG(CDBL(3/5*3/5*2/3*8))
7990 GOSUB 1080
8000 N$="[NO.54] Pure <Gb:+2> Temperament (T-70)"
8010 D#(1)=M#*LOG(CDBL(3/2*3/5*3/5*2))
8020 D#(2)=M#*LOG(CDBL(3/5*3/5*3/5*2/3*8))
8030 D#(3)=M#*LOG(CDBL(3/5*2))
8040 D#(4)=M#*LOG(CDBL(3/2*3/5*3/5*3/5*4))
8050 D#(5)=M#*LOG(CDBL(2/3*2))
8060 D#(6)=M#*LOG(CDBL(3/5*3/5*4))
8070 D#(7)=M#*LOG(CDBL(3/2))
8080 D#(8)=M#*LOG(CDBL(3/5*2/3*4))
8090 D#(9)=M#*LOG(CDBL(3/5*3/5*3/5*8))
8100 D#(10)=M#*LOG(CDBL(3/2*3/5*2))
8110 D#(11)=M#*LOG(CDBL(3/5*3/5*2/3*8))
8120 GOSUB 1080
8130 N$="[NO.55] Pure <Db:+2> Temperament (T-71)"
8140 D#(1)=M#*LOG(CDBL(3/2*3/5*3/5*2))
8150 D#(2)=M#*LOG(CDBL(3/2*3/2/2))
8160 D#(3)=M#*LOG(CDBL(3/5*2))
8170 D#(4)=M#*LOG(CDBL(3/2*3/5*3/5*3/5*4))
8180 D#(5)=M#*LOG(CDBL(3/2*3/2*3/5))
8190 D#(6)=M#*LOG(CDBL(3/5*3/5*4))
8200 D#(7)=M#*LOG(CDBL(3/2))
8210 D#(8)=M#*LOG(CDBL(3/2*3/2*3/5*3/5*2))
8220 D#(9)=M#*LOG(CDBL(3/5*3/5*3/5*8))
8230 D#(10)=M#*LOG(CDBL(3/2*3/5*2))
8240 D#(11)=M#*LOG(CDBL(3/2*3/2*3/5*3/5*3/5*4))
8250 GOSUB 1080
8260 IF FLG=2 THEN CLOSE #1
1000 'save "jmacs-12.bas",a
1010 DIM D#(12):M#=1200#/LOG(2#):OPEN "temp.dat" FOR INPUT AS #1
1020 XX=0
1030 A$="Pitch Differences of Temperaments : Note = [ C ]"
1040 KEY OFF:SCREEN 1,0:LOCATE 1,10,0:PRINT A$
1050 LOCATE 2,1:PRINT "(Cent)":LOCATE 3,1:PRINT " +45"
1060 LOCATE 6,1:PRINT " +30":LOCATE 9,1:PRINT " +15"
1070 LOCATE 12,1:PRINT " 0":LOCATE 15,1:PRINT " -15"
1080 LOCATE 18,1:PRINT " -30":LOCATE 21,1:PRINT " -45"
1090 LOCATE 23,1:PRINT "Temp : 1 10 20 30";
1100 PRINT " 40 50 55";
1110 FOR I=1 TO 55:INPUT #1,A$:FOR J=0 TO 11:INPUT #1,D#(J):NEXT J
1120 X#=D#(XX)-CDBL(100*XX)
1130 X=75+I*900/55
1140 Y=333-X#*293/52
1150 CIRCLE (X,Y),3,,,,.5
1160 LINE (X,Y)-(X,333)
1170 NEXT I
1180 LINE (75,333)-(1000,333),,,&H3333:LINE (75,40)-(1000,625),,B
1190 IF INKEY$="" THEN 1190 ELSE SCREEN 0,0:LOCATE 1,1,1
1000 'save "jmacs-13.bas",a
1010 KEY OFF:SCREEN 1,0:LOCATE 1,1,0
1020 WW=15:A=100:B=80:C=60
1030 I=0'**********************
1040 LINE (0,30+I*232)-(1023,210+I*232),,B
1050 LINE (0,120+I*232)-(1023,120+I*232),,,&H3333
1060 XOLD=0:YOLD=120+I*232:ZPT=YOLD
1070 LOCATE 8*I+1,5:PRINT "[ Pure Temperament ]";
1080 PRINT " 1st : 3rd = 4 : 5 / 1st : 5th = 2 : 3";
1090 FOR J=0 TO 1022
1100 Y1=SIN(J*3.1416*2/WW)
1110 Y2=SIN(J*3.1416*2/WW*5/4)
1120 Y3=SIN(J*3.1416*2/WW*3/2)
1130 Y=ZPT-(A*Y1+B*Y2+C*Y3)/3.5
1140 LINE (XOLD,YOLD)-(J,Y):XOLD=J:YOLD=Y
1150 NEXT J
1160 I=1'**********************
1170 LINE (0,30+I*232)-(1023,210+I*232),,B
1180 LINE (0,120+I*232)-(1023,120+I*232),,,&H3333
1190 XOLD=0:YOLD=120+I*232:ZPT=YOLD
1200 LOCATE 8*I+1,5:PRINT "[ 12 Equal Temperament ]";
1210 PRINT " 3rd = 400 Cent / 5th = 700 Cent"
1220 FOR J=0 TO 1022
1230 Y1=SIN(J*3.1416*2/WW)
1240 Y2=SIN(J*3.1416*2/WW*2^(4/12))
1250 Y3=SIN(J*3.1416*2/WW*2^(7/12))
1260 Y=ZPT-(A*Y1+B*Y2+C*Y3)/3.5
1270 LINE (XOLD,YOLD)-(J,Y):XOLD=J:YOLD=Y
1280 NEXT J
1290 IF INKEY$="" THEN 1290
1300 SCREEN 0,0:LOCATE 1,1,1
1000 'save "jmacs-14.bas",a
1010 KEY OFF:SCREEN 1,0:M#=1200#/LOG(2#)
1020 DIM D#(12):DIM X5(12),Y5(12),X3(12),Y3(12),F(12)
1030 DATA 3,8,1,6,11,4,9,2,7,0,5,10
1040 RESTORE 1030:FOR I=0 TO 11:READ F(I):NEXT I
1050 B$="C C#D EbE F F#G G#A BbB "
1060 OPEN "temp.dat" FOR INPUT AS #1
1070 FOR LOOP=1 TO 55
1080 CLS:INPUT #1,A$
1090 FOR I=0 TO 11:INPUT #1,D#(I):NEXT I
1100 FOR I=0 TO 11:X=644+350*COS(3.1416/6*I):Y=392-350*SIN(3.1416/6*I)
1110 LINE (644,392)-(X,Y),,,&H1111:NEXT I
1120 LOCATE 8,50:PRINT "C":LOCATE 9,43:PRINT "F":LOCATE 9,56:PRINT "G"
1130 LOCATE 11,38:PRINT "Bb":LOCATE 11,61:PRINT "D"
1140 LOCATE 14,36:PRINT "Eb":LOCATE 14,63:PRINT "A"
1150 LOCATE 17,38:PRINT "G#":LOCATE 17,61:PRINT "E"
1160 LOCATE 20,50:PRINT "F#":LOCATE 19,43:PRINT "C#":LOCATE 19,56:PRINT "B"
1170 FOR I=0 TO 11:J=(I+7) MOD 12:K=(I+4) MOD 12
1180 P=D#(I):Q=D#(J):R=Q-P:IF R<0 THEN R=R+1200
1190 S=D#(I):T=D#(K):U=T-S:IF U<0 THEN U=U+1200
1200 X5(I)=644+(20+7*ABS(R-701.955))*COS(3.1416/6*F(I))
1210 Y5(I)=392-(20+7*ABS(R-701.955))*SIN(3.1416/6*F(I))
1220 X3(I)=644+(20+7*ABS(U-386.314))*COS(3.1416/6*F(I))
1230 Y3(I)=392-(20+7*ABS(U-386.314))*SIN(3.1416/6*F(I))
1240 NEXT I
1250 FOR I=0 TO 11:J=(I+7) MOD 12
1260 LINE (X5(I),Y5(I))-(X5(J),Y5(J))
1270 LINE (X3(I),Y3(I))-(X3(J),Y3(J)),,,&H6666
1280 NEXT I
1290 LOCATE 2,3,0:PRINT A$
1300 FOR I=0 TO 11
1310 LOCATE 5+I,6:PRINT "["+MID$(B$,2*I+1,2)+"] =";
1320 PRINT USING " ####.####";D#(I):NEXT I
1330 LINE (0,0)-(1023,767),,B
1340 IF INKEY$="" THEN 1340 ELSE NEXT LOOP
1350 CLOSE #1:SCREEN 0,0:LOCATE 1,1,1
1000 'save "jmacs-15.bas",a
1010 '===== Data Area =====
1020 DATA 100,100,100,0,0,0,100,80,60,0,0,0,100,80,90,0,0,0
1030 DATA 100,80,90,0,1,0,100,80,90,0,2,0,100,80,90,0,3,0
1040 DATA 100,80,90,0,5,0,100,80,90,0,10,0,100,80,90,0,20,0
1050 DATA 100,80,90,0,0,1,100,80,90,0,0,2,100,80,90,0,0,3
1060 DATA 100,80,90,0,0,5,100,80,90,0,0,10,100,80,90,0,0,20
1070 DATA 100,80,90,0,2,5,100,80,90,0,10,3,100,80,90,0,10,20
1080 KEY OFF:SCREEN 1,0:LOCATE 1,1,0:DIM M(6,3):RESTORE 1010
1090 FOR LOOP=1 TO 6
1100 CLS:FOR J=1 TO 3: FOR I=1 TO 6:READ M(I,J):NEXT I:NEXT J
1110 FOR I=0 TO 2
1120 A=M(1,I+1):B=M(2,I+1):C=M(3,I+1):D=M(4,I+1):E=M(5,I+1):F=M(6,I+1)
1130 A$=RIGHT$(STR$(A),LEN(STR$(A))-1)
1140 B$=RIGHT$(STR$(B),LEN(STR$(B))-1)
1150 C$=RIGHT$(STR$(C),LEN(STR$(C))-1)
1160 LOCATE 8*I+1,3
1170 PRINT "[Pure Temp.] 1st(";A$;"%)=";D;"ms , ";
1180 PRINT "3rd(";B$;"%)=";E;"ms , ";
1190 PRINT "5th(";C$;"%)=";F;"ms";
1200 LINE (0,30+I*232)-(1023,210+I*232),,B
1210 LINE (0,120+I*232)-(1023,120+I*232),,,&H3333
1220 G=(A+B+C)/3:A=A*100/G:B=B*100/G:C=C*100/G
1230 XOLD=0:YOLD=120+I*232:ZPT=YOLD
1240 FOR J=0 TO 1022 STEP 1
1250 T=.2*J:X=J
1260 IF D<T THEN Y1=SIN((5*D+J)*3.1416*8/76.4526) ELSE Y1=0
1270 IF E<T THEN Y2=SIN((5*E+J)*3.1416*8/76.4526*5/4) ELSE Y2=0
1280 IF F<T THEN Y3=SIN((5*F+J)*3.1416*8/76.4526*3/2) ELSE Y3=0
1290 Y=ZPT-(A*Y1+B*Y2+C*Y3)/3.5
1300 LINE (XOLD,YOLD)-(X,Y):XOLD=X:YOLD=Y
1310 NEXT J
1320 NEXT I
1330 IF INKEY$="" THEN 1330
1340 NEXT LOOP:SCREEN 0,0:LOCATE 1,1,1
1000 'save "jmacs-16.bas",a
1010 '===== Data Area =====
1020 DATA 100,100,100,0,0,0,100,80,60,0,0,0,100,80,90,0,0,0
1030 DATA 100,80,90,0,1,0,100,80,90,0,2,0,100,80,90,0,3,0
1040 DATA 100,80,90,0,5,0,100,80,90,0,10,0,100,80,90,0,20,0
1050 DATA 100,80,90,0,0,1,100,80,90,0,0,2,100,80,90,0,0,3
1060 DATA 100,80,90,0,0,5,100,80,90,0,0,10,100,80,90,0,0,20
1070 DATA 100,80,90,0,2,5,100,80,90,0,10,3,100,80,90,0,10,20
1080 KEY OFF:SCREEN 1,0:LOCATE 1,1,0:DIM M(6,3):RESTORE 1010
1090 FOR LOOP=1 TO 6
1100 CLS:FOR J=1 TO 3: FOR I=1 TO 6:READ M(I,J):NEXT I:NEXT J
1110 FOR I=0 TO 2
1120 A=M(1,I+1):B=M(2,I+1):C=M(3,I+1):D=M(4,I+1):E=M(5,I+1):F=M(6,I+1)
1130 A$=RIGHT$(STR$(A),LEN(STR$(A))-1)
1140 B$=RIGHT$(STR$(B),LEN(STR$(B))-1)
1150 C$=RIGHT$(STR$(C),LEN(STR$(C))-1)
1160 LOCATE 8*I+1,3
1170 PRINT "[12-Equal Temp.] 1st(";A$;"%)=";D;"ms , ";
1180 PRINT "3rd(";B$;"%)=";E;"ms , ";
1190 PRINT "5th(";C$;"%)=";F;"ms";
1200 LINE (0,30+I*232)-(1023,210+I*232),,B
1210 LINE (0,120+I*232)-(1023,120+I*232),,,&H3333
1220 G=(A+B+C)/3:A=A*100/G:B=B*100/G:C=C*100/G
1230 XOLD=0:YOLD=120+I*232:ZPT=YOLD
1240 FOR J=0 TO 1022 STEP 1
1250 T=.2*J:X=J
1260 IF D<T THEN Y1=SIN((5*D+J)*3.1416*8/76.4526) ELSE Y1=0
1270 IF E<T THEN Y2=SIN((5*E+J)*3.1416*8/76.4526*1.2599) ELSE Y2=0
1280 IF F<T THEN Y3=SIN((5*F+J)*3.1416*8/76.4526*1.4983) ELSE Y3=0
1290 Y=ZPT-(A*Y1+B*Y2+C*Y3)/3.5
1300 LINE (XOLD,YOLD)-(X,Y):XOLD=X:YOLD=Y
1310 NEXT J
1320 NEXT I
1330 IF INKEY$="" THEN 1330
1340 NEXT LOOP:SCREEN 0,0:LOCATE 1,1,1
1000 'save "jmacs-17.bas",a
1010 KEY OFF:SCREEN 1,0:M#=1200#/LOG(2#)
1020 TT=1:XP=600:YP=384
1030 DATA 1,1,1,2,1,3,1,4,1,5,1,6,1,7,1,8,1,9,1,10
1040 DATA 2,1,3,1,4,1,5,1,6,1,7,1,8,1,9,1,10,1
1050 DATA 2,3,2,5,2,7,2,9
1060 DATA 3,2,5,2,7,2,9,2
1070 DATA 3,4,3,5,3,7,3,8,3,10
1080 DATA 4,3,5,3,7,3,8,3,10,3
1090 DATA 4,5,4,7,4,9
1100 DATA 5,4,7,4,9,4
1110 DATA 5,6,5,7,5,8,5,9
1120 DATA 6,5,7,5,8,5,9,5
1130 DATA 6,7
1140 DATA 7,6
1150 DATA 7,8,7,9,7,10
1160 DATA 8,7,9,7,10,7
1170 DATA 8,9
1180 DATA 9,8
1190 DATA 9,10
1200 DATA 10,9,999,999
1210 RESTORE 1030
1220 '#### LOOP ####
1230 READ IX,IY:IF IX>100 OR IY>100 THEN 1340
1240 CLS:LOCATE 11,4,0:PRINT "X =";IX
1250 LOCATE 14,4:PRINT "Y =";IY
1260 FOR I=1 TO 360 STEP TT
1270 X=XP+300*COS(I*3.1415926535#/180*IX)
1280 Y=YP-300*SIN(I*3.1415926535#/180*IY)
1290 CIRCLE (X,Y),1
1300 NEXT I
1310 LINE (0,0)-(1023,767),,B
1320 IF INKEY$="" THEN 1320
1330 GOTO 1220
1340 SCREEN 0,0:LOCATE 1,1,1
1000 'save "jmacs-18.bas",a
1010 KEY OFF:SCREEN 1,0:M#=1200#/LOG(2#)
1020 TT=.1:XP=600:YP=384
1030 DATA 1,"1度",1,1
1040 DATA 1,"完全5度",3,2
1050 DATA 1,"完全4度",4,3
1060 DATA 1,"長3度",5,4
1070 DATA 1,"短3度",6,5
1080 DATA 1,"大全音",9,8
1090 DATA 1,"小全音",10,9
1100 DATA 1,"全音階的半音",16,15
1110 DATA 1,"半音階的小半音",25,24
1120 DATA 1,"大リンマ",27,25
1130 DATA 1,"半音階的大半音",135,128
1140 DATA 1,"ピタゴラス・リンマ",256,243
1150 DATA 999," ",1,1
1160 RESTORE 1030
1170 '#### LOOP ####
1180 READ FLG,A$,IX,IY:IF FLG=0 THEN 1180 ELSE IF FLG=999 THEN 1310
1190 CLS:LOCATE 7,2,0:PRINT "[Name]":LOCATE 9,4:PRINT A$
1200 LOCATE 13,2:PRINT "[Ratio]":LOCATE 15,4:PRINT IX;":";IY
1210 X=XP+300:Y=YP
1220 FOR I=0 TO 360 STEP TT
1230 XX=XP+300*COS(I*3.1415926535#/180*IX)
1240 YY=YP-300*SIN(I*3.1415926535#/180*IY)
1250 LINE (X,Y)-(XX,YY)
1260 X=XX:Y=YY
1270 NEXT I
1280 LINE (0,0)-(1023,767),,B
1290 IF INKEY$="" THEN 1290
1300 GOTO 1170
1310 SCREEN 0,0:LOCATE 1,1,1:LIST 1000-1170
1000 'save "jmacs-19.bas",a
1010 KEY OFF:SCREEN 1,0:M#=1200#/LOG(2#)
1020 LP=32:TT=.5:XP#=600#:YP#=384#
1030 A$="平均律完全5度"
1040 PP#=1.498307077#
1050 CLS:LOCATE 5,2,0:PRINT "[Name]":LOCATE 7,4:PRINT A$
1060 LOCATE 11,2:PRINT "[Ratio]":LOCATE 13,4:PRINT PP#
1070 LOCATE 17,2:PRINT "[Count]":LOCATE 19,4:PRINT LP;"Loop"
1080 X=XP#+300:Y=YP#
1090 FOR I=0 TO 360*LP STEP TT
1100 J#=CDBL(I)
1110 XX=XP#+300#*COS(J#*3.1415926535#/180#*PP#*2#)
1120 YY=YP#-300#*SIN(J#*3.1415926535#/180#*2#)
1130 LINE (X,Y)-(XX,YY)
1140 X=XX:Y=YY
1150 NEXT I
1160 LINE (0,0)-(1023,767),,B
1170 IF INKEY$="" THEN 1170
1180 SCREEN 0,0:LOCATE 1,1,1
1000 'save "jmacs-20.bas",a
1010 KEY OFF:SCREEN 1,0:M#=1200#/LOG(2#)
1020 LP=8:TT=.5:XP#=600#:YP#=384#
1030 A$="平均律長3度"
1040 PP#=1.25992105#
1050 CLS:LOCATE 5,2,0:PRINT "[Name]":LOCATE 7,4:PRINT A$
1060 LOCATE 11,2:PRINT "[Ratio]":LOCATE 13,4:PRINT PP#
1070 LOCATE 17,2:PRINT "[Count]":LOCATE 19,4:PRINT LP;"Loop"
1080 X=XP#+300:Y=YP#
1090 FOR I=0 TO 360*LP STEP TT
1100 J#=CDBL(I)
1110 XX=XP#+300#*COS(J#*3.1415926535#/180#*PP#*2#)
1120 YY=YP#-300#*SIN(J#*3.1415926535#/180#*2#)
1130 LINE (X,Y)-(XX,YY)
1140 X=XX:Y=YY
1150 NEXT I
1160 LINE (0,0)-(1023,767),,B
1170 IF INKEY$="" THEN 1170
1180 SCREEN 0,0:LOCATE 1,1,1
1000 'save "jmacs-21.bas",a
1010 KEY OFF:SCREEN 1,0:M#=1200#/LOG(2#)
1020 LP=1:TT=.5:XP#=600#:YP#=384#
1030 A$="ピタゴラス音律長3度"
1040 PP#=1.265625#
1050 CLS:LOCATE 5,2,0:PRINT "[Name]":LOCATE 7,4:PRINT A$
1060 LOCATE 11,2:PRINT "[Ratio]":LOCATE 13,4:PRINT PP#
1070 LOCATE 17,2:PRINT "[Count]":LOCATE 19,4:PRINT LP;"Loop"
1080 X=XP#+300:Y=YP#
1090 FOR I=0 TO 360*LP STEP TT
1100 J#=CDBL(I)
1110 XX=XP#+300#*COS(J#*3.1415926535#/180#*PP#*4#)
1120 YY=YP#-300#*SIN(J#*3.1415926535#/180#*4#)
1130 LINE (X,Y)-(XX,YY)
1140 X=XX:Y=YY
1150 NEXT I
1160 LINE (0,0)-(1023,767),,B
1170 IF INKEY$="" THEN 1170
1180 SCREEN 0,0:LOCATE 1,1,1
1000 'save "jmacs-22.bas",a
1010 KEY OFF:SCREEN 1,0:M#=1200#/LOG(2#)
1020 LP=8:TT=.5:XP#=600#:YP#=384#
1030 A$="ミーントーン5度"
1040 PP#=1.495348781#
1050 CLS:LOCATE 5,2,0:PRINT "[Name]":LOCATE 7,4:PRINT A$
1060 LOCATE 11,2:PRINT "[Ratio]":LOCATE 13,4:PRINT PP#
1070 LOCATE 17,2:PRINT "[Count]":LOCATE 19,4:PRINT LP;"Loop"
1080 X=XP#+300:Y=YP#
1090 FOR I=0 TO 360*LP STEP TT
1100 J#=CDBL(I)
1110 XX=XP#+300#*COS(J#*3.1415926535#/180#*PP#*2#)
1120 YY=YP#-300#*SIN(J#*3.1415926535#/180#*2#)
1130 LINE (X,Y)-(XX,YY)
1140 X=XX:Y=YY
1150 NEXT I
1160 LINE (0,0)-(1023,767),,B
1170 IF INKEY$="" THEN 1170
1180 SCREEN 0,0:LOCATE 1,1,1
10 'save "b:editor.bas",a
20 DATA "<<<<<< DSP-PTB SYSTEM DEBUG/EDIT PROGRAM by Y.Nagashima >>>>>>"
30 ' DEBUG=1:' <-- Not [REM] = Only Development Mode !!
40 '======= Menu Screen Setting =======
50 DIM GD$(100,2),INDT$(128),DF$(100),DFT(100)
60 DIM A$(4,18),A(1,72),B(72):' A=Tone Data,B=Flag
70 DIM Y(5,256),PF(14):'Y=Wave Data
80 DIM HC(128):'Harmony Coefficients
90 MAIT=200:OUTPT=&HE0D0:INPT=&HE0D8:OUT OUTPT,0
100 TEST=1:' <-- Timer Escape Mode ON !!
110 SCREEN 3:CONSOLE 0,25,0,1:WIDTH 80,25:COLOR 7:CLS 3
120 VIEW(0,0)-(639,399),,7
130 '======= Mode Select =======
140 CLS 3
150 LOCATE 5,9:COLOR 5
160 PRINT "If you have missed operation, and if you want to return to ";
170 PRINT "EDITOR,"
180 LOCATE 5,12:COLOR 5
190 PRINT "Please Input the word <SORRY> !!!"
200 A$=INKEY$:IF A$="" THEN 200
210 IF A$<>"s" AND A$<>"S" THEN 350
220 LOCATE 20,18:COLOR 4:PRINT A$;
230 A$=INKEY$:IF A$="" THEN 230
240 IF A$<>"o" AND A$<>"O" THEN 350
250 LOCATE 23,18:COLOR 4:PRINT A$;
260 A$=INKEY$:IF A$="" THEN 260
270 IF A$<>"r" AND A$<>"R" THEN 350
280 LOCATE 26,18:COLOR 4:PRINT A$;
290 A$=INKEY$:IF A$="" THEN 290
300 IF A$<>"r" AND A$<>"R" THEN 350
310 LOCATE 29,18:COLOR 4:PRINT A$;
320 A$=INKEY$:IF A$="" THEN 320
330 IF A$<>"y" AND A$<>"Y" THEN 350
340 GOTO 870:' Jump to Command Control Mode
350 '======= OS Mode =======
360 CLS 3
370 LOCATE 20,0:COLOR 5:PRINT "*** ";:COLOR 6
380 PRINT "OS MODE";:COLOR 5:PRINT " ***"
390 LOCATE 18,6:COLOR 6:PRINT "<<<OS-MODE>>>"
400 LOCATE 20,8:COLOR 7:PRINT "0:SYSTEM RESET"
410 LOCATE 20,10:COLOR 7:PRINT "1:System Boot"
420 LOCATE 20,12:COLOR 7:PRINT "2:Execute"
430 LOCATE 20,14:COLOR 7:PRINT "Input Number=";
440 K=VAL(INPUT$(1))
450 PRINT K
460 IF K>2 THEN BEEP :GOTO 110
470 ON K GOTO 110,510
480 LOCATE 20,8:COLOR 3:PRINT "0:SYSTEM RESET"
490 OD=&H0:GOSUB 2590:RD=&HF0:GOSUB 2710
500 GOTO 110
510 LOCATE 20,12:COLOR 3:PRINT "2:Execute"
520 LOCATE 20,15:COLOR 7:PRINT "(RETURN to Tester mode)"
530 LOCATE 20,14:COLOR 7:INPUT "Input jump address:&H",K$
540 IF K$="" THEN K$="E000"
550 K$=RIGHT$("000"+K$,4)
560 OD=&H2:GOSUB 2590:OD=VAL("&H"+LEFT$(K$,2)):GOSUB 2590
570 OD=VAL("&H"+RIGHT$(K$,2)):GOSUB 2590:RD=&HF2:GOSUB 2710
580 IF VAL("&H"+K$)<>&HE000 THEN PRINT "Not availavle":END
590 '======= Tester Mode =======
600 COLOR 7:CLS 3
610 LOCATE 20,0:COLOR 5:PRINT "*** OS MODE-->";
620 COLOR 6:PRINT "Tester MODE ";:COLOR 5:PRINT "***"
630 LOCATE 18,6:COLOR 5:PRINT "<<<OS-MODE>>>"
640 LOCATE 20,7:COLOR 6:PRINT "<<<TEST-MODE>>>"
650 LOCATE 22,9:COLOR 7:PRINT "0:Return to OS mode"
660 LOCATE 22,11:COLOR 7:PRINT "1:Command control mode"
670 LOCATE 22,13:COLOR 7:PRINT "2:Realtime mode"
680 LOCATE 22,15:COLOR 7:PRINT "Input Number=";
690 K=VAL(INPUT$(1))
700 PRINT K
710 IF K>2 THEN BEEP :GOTO 390
720 ON K GOTO 860,750
730 OD=&H0:GOSUB 2590:RD=&HF1:GOSUB 2710
740 GOTO 110
750 CLS 3
760 LOCATE 20,0:COLOR 5:PRINT "***OS MODE-->Tester MODE-->";
770 COLOR 6:PRINT "Realtime MODE";:COLOR 5:PRINT "***"
780 LOCATE 18,6:COLOR 5:PRINT "<<<OS-MODE>>>"
790 LOCATE 20,7:COLOR 5:PRINT "<<<TEST-MODE>>>"
800 LOCATE 22,8:COLOR 6:PRINT "<<<REALTIME-MODE>>>"
810 LOCATE 24,11:COLOR 7:PRINT "(RETURN to Tester mode)"
820 LOCATE 24,10:COLOR 7:INPUT"INPUT Register Number";K$
830 IF K$="" THEN GOTO 600
840 LOCATE 24,12:COLOR 7:INPUT"INPUT Register DATA";K
850 GOTO 760
860 OD=&H1:GOSUB 2590:RD=&HF3:GOSUB 2710
870 '======= Command Control Mode =======
880 CLS 3
890 LOCATE 10,0:COLOR 5:PRINT "***OS MODE-->Tester MODE-->";
900 COLOR 6:PRINT "Command MODE";:COLOR 5:PRINT "***"
910 COLOR 7
920 XD=1:YD=1:OX=1:OY=1
930 LOCATE 25,7:PRINT "Wait for moments !!!"
940 LOCATE 1,13:PRINT STRING$(72,"*")
950 RESTORE 3220:BN=0
960 FOR J=1 TO 18
970 FOR I=1 TO 4
980 READ G$:A$(I,J)=G$:BN=BN+1
990 A(0,BN)=VAL("&h"+RIGHT$(A$(I,J),1))
1000 A(1,BN)=VAL("&h"+MID$(A$(I,J),15,1))
1010 LOCATE 72-(J-1)*4-(I-1),13:PRINT " ";
1020 NEXT I
1030 NEXT J
1040 RESTORE 3650:FOR I=1 TO 72:READ B(I):NEXT I
1050 '======== Print Main Menu =======
1060 CLS 3
1070 COLOR 6:LOCATE 5,1:RESTORE 20:READ G$:PRINT G$
1080 GOSUB 3130:' <--- flame / Mode Writing
1090 FOR I=1 TO 18
1100 FOR J=1 TO 4
1110 LOCATE (J-1)*19+4,(I-1)+6:PRINT A$(J,I)
1120 NEXT J
1130 NEXT I
1140 LINE (30,11*16)-(18*8*3+33+8,11*16)
1150 LINE (18*8*3+34+8,10*16)-(18*8*4+33+8,12*16),,B
1160 LINE (30,12*16)-(18*8*4+33+8,12*16)
1170 LINE (18*8*2+27+8,12*16)-(18*8*2+27+8,16*16),,B
1180 LINE (29,9*16)-(18*8*4+33+8,16*16),,B
1190 '======== Edit Main Menu =======
1200 GOSUB 3170:GOSUB 3180:GOSUB 3190
1210 ' KKK$=CHR$(28)+CHR$(29)+CHR$(31)+CHR$(30)+"Q"+"q"+CHR$(127)+CHR$(18)
1220 LC=4:GOSUB 1440
1230 D$=INKEY$:IF D$="" THEN 1230
1240 ' ON INSTR(KKK$,D$) GOSUB 3070,3080,3100,3090,1530,1530,1290,1250
1241 IF D$=CHR$(28) THEN GOSUB 3070
1242 IF D$=CHR$(29) THEN GOSUB 3080
1243 IF D$=CHR$(31) THEN GOSUB 3100
1244 IF D$=CHR$(30) THEN GOSUB 3090
1245 IF D$="Q" THEN GOSUB 1530
1246 IF D$="q" THEN GOSUB 1530
1247 IF D$=CHR$(127) THEN GOSUB 1290
1248 IF D$=CHR$(18) THEN GOSUB 1250
1250 COLOR 7
1260 LOCATE (OX-1)*19+4,(OY-1)+6:PRINT A$(OX,OY)
1270 OX=XD:OY=YD
1280 GOTO 1220
1290 RETURN 1300
1300 GOSUB 3160:GOSUB 3180:GOSUB 3200
1310 NB=(YD-1)*4+XD:GOSUB 1420
1320 LC=6:GOSUB 1440
1330 IF B(NB)<>0 THEN GOSUB 1790:GOTO 1200
1340 A$(XD,YD)=LEFT$(A$(XD,YD),14)+HEX$(A(1,NB))+HEX$(A(0,NB))
1350 LOCATE XD*19-1,YD+5:COLOR CH:PRINT HEX$(A(1,NB));
1360 LOCATE XD*19,YD+5:COLOR CL:PRINT HEX$(A(0,NB));
1370 D$=INKEY$:IF D$="" THEN 1370
1380 ' ON INSTR(KKK$,D$) GOSUB 1420,1430,1490,1510,1530,1530,1400,1410
1381 IF D$=CHR$(28) THEN GOSUB 1420
1382 IF D$=CHR$(29) THEN GOSUB 1430
1383 IF D$=CHR$(31) THEN GOSUB 1490
1384 IF D$=CHR$(30) THEN GOSUB 1510
1385 IF D$="Q" THEN GOSUB 1530
1386 IF D$="q" THEN GOSUB 1530
1387 IF D$=CHR$(127) THEN GOSUB 1400
1388 IF D$=CHR$(18) THEN GOSUB 1410
1390 GOTO 1340
1400 GOSUB 1550
1410 RETURN 1200
1420 HL=0:CH=6:CL=5:RETURN
1430 HL=1:CH=5:CL=6:RETURN
1440 COLOR LC
1450 LOCATE (XD-1)*19+4,(YD-1)+6:PRINT A$(XD,YD)
1460 LOCATE 0,0:'DUMY
1470 RETURN
1480 '======= Key Scan Routine =======
1490 IF A(HL,NB)=0 THEN A(HL,NB)=15 ELSE A(HL,NB)=A(HL,NB)-1
1500 RETURN
1510 IF A(HL,NB)=15 THEN A(HL,NB)=0 ELSE A(HL,NB)=A(HL,NB)+1
1520 RETURN
1530 '======= Program Stop Routine =======
1540 COLOR 7:CLS:OUT OUTPT,0:END
1550 '======= Tone Data Block Transfer routine =======
1560 GOSUB 3160:GOSUB 3170:GOSUB 3210
1570 LC=2:GOSUB 1440
1580 IF NB>40 THEN RETURN
1590 IF NB>12 THEN 1680
1600 IF NB=6 THEN 1620
1610 RETURN
1620 OD=&H50:GOSUB 2590
1630 OD=A(0,2):GOSUB 2590
1640 RD=&H0:GOSUB 2710:RETURN:' Song NO. Transfer
1650 '======= Tone Data Send =======
1660 DATA 21,22,23,25,27,29,30,33,34,31,32,35,36,20,24,13,14
1670 DATA 26,28,15,16,17,18,19,37,38,39,40
1680 XX=A(1,1)*16+A(0,1):IF XX>31 THEN BEEP:GOTO 1610
1690 OD=&H30:GOSUB 2590
1700 OD=XX:GOSUB 2590
1710 RESTORE 1660
1720 SUM=XX
1730 FOR J=1 TO 28
1740 READ K:XX=A(1,K)*16+A(0,K):SUM=(SUM+XX) MOD 256
1750 OD=XX:GOSUB 2590
1760 NEXT J
1770 FOR J=29 TO 48:OD=0:GOSUB 2590:NEXT J
1780 OD=SUM:GOSUB 2590:RD=&H0:GOSUB 2710:RETURN
1790 '======= Command Transfer Routine =======
1800 GOSUB 3160:GOSUB 3170:GOSUB 3210
1810 LC=2:GOSUB 1440
1820 IF B(NB)=0 THEN RETURN:' Not Command !
1830 IF B(NB)=1 THEN RETURN:' Not Defined ! (Reserved)
1840 IF B(NB)=2 THEN GOSUB 3710:' Song Data Transfer
1850 IF B(NB)=3 THEN GOSUB 2050:' Play Start
1860 IF B(NB)=4 THEN GOSUB 2070:' Play Stop
1870 IF B(NB)=5 THEN GOSUB 2090:' Play Continue
1880 IF B(NB)=6 THEN GOSUB 8240:' Wave Drawing Editor
1890 IF B(NB)=7 THEN GOSUB 6600:' Harmonics Editor
1900 IF B(NB)=8 THEN GOSUB 6330:' Data File Send
1910 IF B(NB)=9 THEN GOSUB 7050:' File Killer
1920 IF B(NB)=10 THEN GOSUB 2120:' Tone Data Load
1930 IF B(NB)=11 THEN GOSUB 2290:' Tone Data Save
1940 IF B(NB)=12 THEN GOSUB 4160:' Old Wave Editor
1950 IF B(NB)=13 THEN GOSUB 2570:' Return to TEST Mode
1960 IF B(NB)=14 THEN GOSUB 9340:' File Name List Up
1970 IF B(NB)=15 THEN GOSUB 11350:' PCM Data Plotter
1980 IF B(NB)=16 THEN GOSUB 10990:' Full PCM Data Converter
1990 IF B(NB)=17 THEN GOSUB 9410:' Sweep PCM Data Maker
2000 IF B(NB)=18 THEN GOSUB 2040:'
2010 IF B(NB)=19 THEN GOSUB 11540:' Files Define
2020 IF B(NB)=20 THEN GOSUB 12240:' Files Preset
2030 IF B(NB)=21 THEN GOSUB 2040
2040 RETURN
2050 OD=&H90:GOSUB 2590:OD=16*A(1,4)+A(0,4)
2060 GOSUB 2590:RD=&H0:GOSUB 2710:RETURN:' Play Start
2070 OD=&HB0:GOSUB 2590:OD=16*A(1,4)+A(0,4)
2080 GOSUB 2590:RD=&H0:GOSUB 2710:RETURN:' Play Stop
2090 OD=&HA0:GOSUB 2590:OD=16*A(1,4)+A(0,4)
2100 GOSUB 2590:RD=&H0:GOSUB 2710:RETURN:' Play Continue
2110 '======= Tone Data File Load =======
2120 COLOR 7:CLS 3
2130 LOCATE 25,0:COLOR 6:PRINT "LOAD TONE DATA"
2140 LOCATE 0,3:COLOR 7:PRINT "FILE NAME LIST":SY=CSRLIN+1
2150 FILES "b:\data\*.DAT":MY=CSRLIN-1
2160 GOSUB 2380
2170 IF F$=" " THEN BEEP :GOTO 2270
2180 OPEN "b:\data\"+F$+".DAT" FOR INPUT AS #1
2190 FOR K=13 TO 40
2200 INPUT #1,XX
2210 A(1,K)=INT(XX/16)
2220 A(0,K)=XX MOD 16
2230 A$=HEX$(A(1,K))+HEX$(A(0,K))
2240 TX=(K MOD 4):TY=INT(K/4)+1
2250 A$(TX,TY)=LEFT$(A$(TX,TY),14)+A$
2260 NEXT K
2270 CLOSE #1:RETURN 1050
2280 '======= Tone Data File Save =======
2290 COLOR 7:CLS 3
2300 LOCATE 25,0:COLOR 6:PRINT "SAVE TONE DATA"
2310 LOCATE 0,3:COLOR 7:PRINT "FILE NAME LIST":FILES "b:\data\*.DAT"
2320 INPUT "Save File Name=";F$
2330 IF F$="" THEN BEEP :GOTO 2370
2340 OPEN "b:\data\"+F$+".DAT" FOR OUTPUT AS #1
2350 FOR K=13 TO 40:PRINT #1,A(1,K)*16+A(0,K):NEXT K
2360 FOR K=1 TO 20:PRINT #1,0:NEXT K
2370 CLOSE #1:RETURN 1050
2380 '======= File Name Edit =======
2390 CX=0:CY=SY:DEF SEG=&HA000
2400 K$="":FOR I=CX*2+CY*160 TO CX*2+CY*160+79 STEP 2:K$=K$+CHR$(PEEK(I))
2410 NEXT I
2420 LOCATE CX,CY:COLOR 4:PRINT K$:LOCATE 0,0
2430 D$=INPUT$(1)
2440 COLOR 7:LOCATE CX,CY:PRINT K$
2450 ON INSTR(KKK$,D$) GOSUB 2470,2470,2480,2500,2490,2490,2520,2520
2460 GOTO 2400
2470 CX=(CX+40)MOD 80:RETURN
2480 IF CY=MY THEN CY=SY ELSE CY=CY+1
2490 RETURN
2500 IF CY=SY THEN CY=MY ELSE CY=CY-1
2510 RETURN
2520 COLOR 6:LOCATE CX,CY
2530 F$=LEFT$(K$,8)
2540 RETURN 2550
2550 RETURN
2560 '======= Return to Tester mode =======
2570 FD=1000:OD=&H0:GOSUB 2590:RD=&HF2:GOSUB 2710
2580 RETURN 590
2590 '======= 1 Data Send Only =======
2600 IF DEBUG=1 THEN RETURN
2610 ODD=OD AND &HF:OD=INT(OD/16)
2620 OUT OUTPT,(&H10 OR (&HF AND (NOT OD))):CTR=0
2630 ID=INP(INPT) AND &H20:RR=1:GOSUB 3010:IF ID<>0 THEN 2630
2640 OUT OUTPT,0:CTR=0
2650 ID=INP(INPT) AND &H20:RR=1:GOSUB 3010:IF ID=0 THEN 2650
2660 OUT OUTPT,(&H10 OR (&HF AND (NOT ODD))):CTR=0
2670 ID=INP(INPT) AND &H20:RR=2:GOSUB 3010:IF ID<>0 THEN 2670
2680 OUT OUTPT,0:CTR=0
2690 ID=INP(INPT) AND &H20:RR=2:GOSUB 3010:IF ID=0 THEN 2690
2700 RETURN
2710 '======= Message Receive only =======
2720 IF DEBUG=1 THEN RETURN
2730 OUT OUTPT,&H10:CTR=0
2740 ID=INP(INPT) AND &H2F:RR=3:GOSUB 3010:IF ID<>0 THEN 2740:'<0>
2750 OUT OUTPT,0:CTR=0
2760 ID=INP(INPT) AND &H2F:RR=3:GOSUB 3010:IF ID<>&H2F THEN 2760:'<F>
2770 OUT OUTPT,&H10:CTR=0
2780 ID=INP(INPT) AND &H2F:RR=4:GOSUB 3010:IF ID<>&HF THEN 2780
2790 OUT OUTPT,0:CTR=0
2800 ID=INP(INPT) AND &H20:RR=4:GOSUB 3010:IF ID=0 THEN 2800
2810 OUT OUTPT,&H10:CTR=0
2820 ID=INP(INPT) AND &H2F:RR=5:GOSUB 3010:IF (ID AND &H20)<>0 THEN 2820:'H
2830 GD=16*(ID AND &HF):OUT OUTPT,0:CTR=0
2840 ID=INP(INPT) AND &H2F:RR=5:GOSUB 3010:IF (ID AND &H20)=0 THEN 2840:'<L>
2850 GD=GD OR (ID AND &HF):OUT OUTPT,&H10:CTR=0
2860 ID=INP(INPT) AND &H2F:RR=6:GOSUB 3010:IF ID<>&HF THEN 2860
2870 OUT OUTPT,0:CTR=0
2880 ID=INP(INPT) AND &H20:RR=6:GOSUB 3010:IF ID=0 THEN 2880
2890 IF RD=GD THEN RETURN ELSE RR=0:GOTO 3030
2900 '======= 8 Bit Data Receive only =======
2910 IF DEBUG=1 THEN RETURN
2920 OUT OUTPT,&H10:CTR=0
2930 ID=INP(INPT) AND &H2F:RR=7:GOSUB 3010:IF (ID AND &H20)<>0 THEN 2930:'H
2940 GD=16*(ID AND &HF):OUT OUTPT,0:CTR=0
2950 ID=INP(INPT) AND &H2F:RR=7:GOSUB 3010:IF (ID AND &H20)=0 THEN 2950:'<L>
2960 GD=GD OR (ID AND &HF):OUT OUTPT,&H10:CTR=0
2970 ID=INP(INPT) AND &H2F:RR=8:GOSUB 3010:IF ID<>&HF THEN 2970
2980 OUT OUTPT,0:CTR=0
2990 ID=INP(INPT) AND &H20:RR=8:GOSUB 3010:IF ID=0 THEN 2990
3000 RETURN
3010 '======= Communication Error Check =======
3020 CTR=CTR+1:IF TEST=0 OR CTR<MAIT THEN RETURN
3030 COLOR 7,0:LOCATE 10,10:CLS 3:OUT OUTPT,0
3040 BEEP:PRINT "Error !!! NO. =";FD+RR;" Sum =";SUM;
3050 IF RR<>0 THEN END ELSE PRINT ",Mess.=";HEX$(GD):END
3060 '======= Key Scan Routine (A) =======
3070 XD=XD+1:XD=((XD+3) MOD 4)+1:YD=((YD+17) MOD 18)+1:RETURN
3080 XD=XD-1:XD=((XD+3) MOD 4)+1:YD=((YD+17) MOD 18)+1:RETURN
3090 YD=YD-1:XD=((XD+3) MOD 4)+1:YD=((YD+17) MOD 18)+1:RETURN
3100 YD=YD+1:XD=((XD+3) MOD 4)+1:YD=((YD+17) MOD 18)+1:RETURN
3110 HI=HI+1:IF HI>15 THEN HI=15
3120 RETURN
3130 '======= Flame Writing =======
3140 LOCATE 5,4:COLOR 7:PRINT "< Command Control Mode >"
3150 GOSUB 3160:GOSUB 3170:GOSUB 3180:RETURN
3160 LOCATE 32,4:COLOR 7:PRINT " DATA SELECT ":RETURN
3170 LOCATE 47,4:COLOR 7:PRINT " DATA CHANGE ":RETURN
3180 LOCATE 62,4:COLOR 7:PRINT " DATA TRANSFER ":RETURN
3190 LOCATE 32,4:COLOR 3:PRINT " DATA SELECT ":RETURN
3200 LOCATE 47,4:COLOR 3:PRINT " DATA CHANGE ":RETURN
3210 LOCATE 62,4:COLOR 3:PRINT " DATA TRANSFER ":RETURN
3220 '======= Menu Data Area =======
3230 DATA "Edit Tone NO= 01"
3240 DATA "Play Song NO= 00","Send Song NO= 00"
3250 DATA "Play Channel= FF"
3260 DATA "Song Data Trans."
3270 DATA " Play Start !! "," Play Stop !! "
3280 DATA " Play Continue !"
3290 DATA " ・・・・・・・・ "," ・・・・・・・・ "," ・・・・・・・・ "
3300 DATA " ・・・・・・・・ "
3310 DATA "Random (A) = 00"
3320 DATA "Random (B) = 00"
3330 DATA "Random Clk = 02"
3340 DATA "Random Sel. = 47"
3350 DATA "Rnd.F-No(L) = FF","Rnd.F-No(M) = FF","Rnd.F-No(H) = 01"
3360 DATA "Sweep Range = 07"
3370 DATA "F-No.(low) = 00","F-No.(mid) = 00","F-No.(high) = 00"
3380 DATA "Sweep Speed = 05"
3390 DATA "Bank NO.(A) = 60","Control SGA = 00"
3400 DATA "Bank NO.(B) = 64","Control SGB = 10"
3410 DATA "Att.Lev.(A) = F6","Dec.Lev.(A) = 00"
3420 DATA "Att.Lev.(B) = FF","Dec.Lev.(B) = 00"
3430 DATA "Att.Spd (A) = 45"
3440 DATA "Dec.Spd (A) = C6"
3450 DATA "Att.Spd (B) = 45"
3460 DATA "Dec.Spd (B) = C6"
3470 DATA "Rel.Lev.(A) = 00","Rel.Spd (A) = 95"
3480 DATA "Rel.Lev.(B) = 00","Rel.Spd (B) = 95"
3490 DATA " ・・・・・・・・ "," ・・・・・・・・ "," ・・・・・・・・ "
3500 DATA " ・・・・・・・・ "
3510 DATA "Harmonics Drawer"," Files Define "," Files Preset "
3520 DATA " //////// "
3530 DATA " ・・・・・・・・ "," ・・・・・・・・ "," ・・・・・・・・ "
3540 DATA " ・・・・・・・・ "
3550 DATA "Wave Draw Editor","Harmonics Editor","Data File Trans."
3560 DATA "Data File Killer"
3570 DATA " ・・・・・・・・ "," ・・・・・・・・ "," ・・・・・・・・ "
3580 DATA " ・・・・・・・・ "
3590 DATA "File Name ListUp","PCM Data Plotter","Full PCM Convert"
3600 DATA "Sweep PCM Data !"
3610 DATA " ・・・・・・・・ "," ・・・・・・・・ "," ・・・・・・・・ "
3620 DATA " ・・・・・・・・ "
3630 DATA " Tone Data Load "
3640 DATA " Tone Data Save ","Old Wave Editor ","Return to Start "
3650 DATA 0,0,0,0,2,3,4,5,1,1,1,1
3660 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0:'Tone Data
3670 DATA 1,1,1,1,18,19,20,21
3680 DATA 1,1,1,1,6,7,8,9
3690 DATA 1,1,1,1,14,15,16,17
3700 DATA 1,1,1,1,10,11,12,13
3710 '======= Song Data Transfer =======
3720 XX=A(1,3)*16+A(0,3):IF XX>15 THEN BEEP:RETURN
3730 TEST=0:GOSUB 5580:IF TEST=1 THEN RETURN
3740 RETURN:' ### FORMAT IS DELETED !!!
3750 '======= 128 Wave Mode =======
3760 LINE (0,0)-(350,399),0,BF
3770 LINE(9,17)-(282,274),5,B
3780 FOR I=1 TO 128
3790 HC(I)=0
3800 NEXT I
3810 CLS:GOSUB 5330:'Title
3820 COLOR 7
3830 LOCATE 2,18:PRINT "1st ------ Harmonics ------ 128st"
3840 LOCATE 2,20:INPUT "Harmonics(1-128) or End(Return)";BNO
3850 IF BNO=0 THEN 3940
3860 IF BNO>129 THEN BEEP :GOTO 3810
3870 LOCATE 2,21:INPUT "POWER(0-128)";PW$
3880 IF PW$="" THEN 3900 ELSE PW=VAL(PW$)
3890 IF PW>128 OR PW<0 THEN BEEP :GOTO 3810
3900 HC(BNO)=PW
3910 LINE (BNO*2+15,274-128*2)-(BNO*2+17,274),0,BF
3920 LINE (BNO*2+15,274-PW*2)-(BNO*2+17,274),7,BF
3930 GOTO 3810
3940 LOCATE 2,21:INPUT "WAVE BOX No.(1<->6)";BNK
3950 IF BNK<1 OR BNK>6 THEN BEEP:GOTO 4140
3960 BNK=BNK-1
3970 LOCATE 2,23:COLOR 3:PRINT " Now Computing !!!"
3980 MAXY=0
3990 FOR X=1 TO 256
4000 Y(BNK,X)=0
4010 FOR I=1 TO 128
4020 IF HC(I)=0 THEN 4040
4030 Y(BNK,X)=HC(I)*SIN(6.283*X/256*I)+Y(BNK,X)
4040 NEXT I
4050 IF MAXY<ABS(Y(BNK,X)) THEN MAXY=ABS(Y(BNK,X))
4060 NEXT X
4070 FOR X=1 TO 256
4080 Y(BNK,X)=INT(Y(BNK,X)/MAXY*127)
4090 NEXT X
4100 LOCATE 2,23:COLOR 7:PRINT " "
4110 GOSUB 4940:GOSUB 4850
4120 LOCATE 0,21:COLOR 7:INPUT "Other Wave(Y/N)";K$
4130 IF K$="Y" OR K$="y" THEN 3760
4140 LINE (0,0)-(350,399),0,BF
4150 RETURN
4160 '======= Wave Editor =======
4170 CLS 3:GOSUB 5330
4180 GOSUB 4720
4190 COLOR 7
4200 CLS:GOSUB 5330
4210 LOCATE 0,2:COLOR 7:PRINT
4220 PRINT "1.DATA MAKE"
4230 PRINT "2.DATA LOAD"
4240 PRINT "3.DATA SAVE"
4250 PRINT "4.DATA TRANSFER"
4260 PRINT "5.SPECIAL SYNTHESIZER"
4270 PRINT "6.RETURN"
4280 PRINT:PRINT "INPUT NO.";:N=VAL(INPUT$(1)):PRINT N
4290 IF N>5 THEN RETURN 1050
4300 ON N GOSUB 4330,5190,5070,5370,3750
4310 GOTO 4190
4320 '======= 14 Wave Make =======
4330 LINE (0,0)-(350,399),0,BF
4340 LINE(9,17)-(350,274),5,B
4350 PF(1)=256/2
4360 FOR I=2 TO 14
4370 PF(I)=0
4380 NEXT I
4390 LINE (24-5,18)-(24+2,274),7,BF
4400 CLS:GOSUB 5330
4410 COLOR 7
4420 LOCATE 2,18:PRINT "01 02 03 04 05 06 07 08 09 10 11 12 13 14"
4430 LOCATE 2,19:INPUT "F-No.(1<->14) or NEXT(RETURN)";BNO
4440 IF BNO=0 THEN 4520
4450 IF BNO>14 THEN BEEP :GOTO 4400
4460 LOCATE 2,20:INPUT "POWER(0<->128)";PW
4470 IF PW>128 OR PW<0 THEN BEEP :GOTO 4400
4480 PF(BNO)=PW
4490 LINE (BNO*24-5,274-128*2)-(BNO*24+2,274),0,BF
4500 LINE (BNO*24-5,274-PW*2)-(BNO*24+2,274),7,BF
4510 GOTO 4400
4520 LOCATE 2,20:INPUT "WAVE BOX No.(1<->6)";BNK
4530 IF BNK<1 OR BNK>6 THEN BEEP:GOTO 4700
4540 BNK=BNK-1
4550 MAXY=0
4560 FOR X=1 TO 256
4570 Y(BNK,X)=0
4580 FOR I=1 TO 14
4590 IF PF(I)=0 THEN 4610
4600 Y(BNK,X)=PF(I)*SIN(6.283*X/256*I)+Y(BNK,X)
4610 NEXT I
4620 IF MAXY<ABS(Y(BNK,X)) THEN MAXY=ABS(Y(BNK,X))
4630 NEXT X
4640 FOR X=1 TO 256
4650 Y(BNK,X)=INT(Y(BNK,X)/MAXY*127)
4660 NEXT X
4670 GOSUB 4940:GOSUB 4850
4680 LOCATE 0,21:COLOR 7:INPUT "Other Wave(Y/N)";K$
4690 IF K$="Y" THEN 4320
4700 LINE (0,0)-(350,399),0,BF
4710 RETURN
4720 '======= 6 Wave =======
4730 LINE(351,0)-(639,399),0,BF
4740 FOR J=0 TO 1
4750 XX=360+145*J
4760 FOR I=0 TO 2
4770 YY=135*I
4780 LINE(XX,YY)-(XX+129,YY+129),7,B
4790 FOR X=1 TO 256
4800 PSET(XX+X/2,YY+64+Y(I+3*J,X)/2),4
4810 NEXT X
4820 NEXT I
4830 NEXT J
4840 RETURN
4850 '======= 1 Wave =======
4860 I=BNK MOD 3:J=INT(BNK/3)
4870 XX=360+145*J
4880 YY=135*I
4890 LINE(XX+1,YY+1)-(XX+128,YY+128),0,BF
4900 FOR X=1 TO 256
4910 PSET(XX+X/2,YY+64+Y(I+3*J,X)/2),4
4920 NEXT X
4930 RETURN
4940 '======= Big 1 Wave =======
4950 COLOR 7
4960 CLS:GOSUB 5330
4970 WM=200
4980 LINE (0,0)-(350,399),0,BF
4990 LINE (10,WM)-(266,WM),7
5000 LINE (10-1,WM-128)-(10+256,WM+128),4,B
5010 FOR C=1 TO 1
5020 FOR X=1 TO 256
5030 PSET (X+10,Y(BNK,X)+WM)
5040 NEXT X
5050 NEXT C
5060 RETURN
5070 '======= Wave File Save =======
5080 PRINT:PRINT "FILE NAME LIST":FILES "B:\data\*.WAV"
5090 INPUT "WAVE BOX No.(1<->6)";BNK:BNK=BNK-1
5100 IF BNK>5 OR BNK<0 THEN BEEP:RETURN
5110 INPUT "Save File Name";F$
5120 IF F$="" THEN BEEP:GOTO 5170
5130 OPEN "B:\data\"+F$+".WAV" FOR OUTPUT AS #1
5140 FOR X=1 TO 256
5150 PRINT #1,CHR$(Y(BNK,X)+128);
5160 NEXT X
5170 CLOSE #1
5180 RETURN
5190 '======= Wave File Load =======
5200 PRINT:PRINT "FILE NAME LIST":SY=CSRLIN+1
5210 FILES "B:\data\*.WAV":MY=CSRLIN-1
5220 INPUT "WAVE BOX No.(1<->6)";BNK:BNK=BNK-1
5230 IF BNK>5 OR BNK<0 THEN BEEP:RETURN
5240 GOSUB 2380
5250 IF F$=" " THEN BEEP:GOTO 5300
5260 OPEN "B:\data\"+F$+".WAV" FOR INPUT AS #1
5270 FOR X=1 TO 256
5280 Y(BNK,X)=ASC(INPUT$(1,#1))-128
5290 NEXT X
5300 CLOSE #1
5310 GOSUB 4850
5320 RETURN
5330 '======= Wave Editor Title =======
5340 LOCATE 25,0:COLOR 6
5350 PRINT "WAVE EDITOR V1.0"
5360 RETURN
5370 '======= Wave Data Transfer =======
5380 PRINT
5390 INPUT"WAVE BOX NO.(1<->6)=";BNK
5400 BNK=BNK-1
5410 IF BNK<0 OR BNK>5 THEN BEEP:RETURN
5420 INPUT"BANK NO.=(0<->255)";BANK
5430 IF BANK<0 OR BANK>255 THEN BEEP:RETURN
5440 COLOR 2
5450 PRINT "WAVE BOX NO.";:COLOR 5:PRINT BNK+1;:COLOR 2
5460 PRINT"-->BANK NO.";:COLOR 5:PRINT BANK
5470 COLOR 7
5480 OD=&H31:GOSUB 2590
5490 OD=BANK:GOSUB 2590
5500 SUM=BANK
5510 FOR I=1 TO 256
5520 IF Y(BNK,I)<0 THEN OD=128-Y(BNK,I) ELSE OD=Y(BNK,I):'NOT EXIST 128
5530 SUM=(SUM+OD) MOD 256:GOSUB 2590
5540 NEXT I
5550 OD=SUM:GOSUB 2590
5560 RD=&H0:GOSUB 2710
5570 RETURN
5580 '======= Tester Song Data Send Routine =======
5590 FOR I=0 TO 4:LOCATE 0,I:COLOR 7:PRINT STRING$(79," "):NEXT I
5600 LOCATE 5,0:COLOR 6:PRINT "Select Songs :"
5610 LOCATE 30,0:COLOR 5:PRINT "(1) TEST Songs"
5620 LOCATE 30,1:COLOR 5:PRINT "(2) Songs"
5630 LOCATE 20,3:COLOR 3:PRINT "Select ---";
5640 SEL$=INKEY$:IF SEL$="" THEN 5640
5650 IF SEL$="1" THEN 5710
5660 FOR I=0 TO 4:LOCATE 0,I:COLOR 7:PRINT STRING$(79," "):NEXT I
5670 LOCATE 20,0:COLOR 5:PRINT "***OS MODE-->Tester MODE-->";
5680 COLOR 6:PRINT "Comand MODE";:COLOR 5:PRINT "***"
5690 COLOR 7,0:LOCATE 5,1:RESTORE 20:READ G$:PRINT G$
5700 RETURN
5710 TEST=1
5720 FOR I=0 TO 4:LOCATE 0,I:COLOR 7:PRINT STRING$(79," "):NEXT I
5730 LOCATE 5,0:COLOR 3:PRINT "Select Display Mode :"
5740 LOCATE 30,0:COLOR 4:PRINT "(1) Display Monitor ON"
5750 LOCATE 30,1:COLOR 4:PRINT "(2) Silent (High Speed)"
5760 LOCATE 20,3:COLOR 6:PRINT "Select ---";
5770 SEL$=INKEY$:IF SEL$="" THEN 5770
5780 IF SEL$<>"1" THEN 6130 ELSE 5910
5790 FOR I=0 TO 4:LOCATE 0,I:COLOR 7:PRINT STRING$(79," "):NEXT I
5800 LOCATE 0,0:COLOR 5:FILES "b:\data\*.nkk"
5810 LOCATE 0,0:COLOR 7:PRINT STRING$(79," "):LOCATE 20,4:COLOR 3
5820 INPUT "Input File Name (*****.DSP) ";FIL$
5830 FOR I=0 TO 4:LOCATE 0,I:COLOR 7:PRINT STRING$(79," "):NEXT I
5840 OPEN "b:\data\"+FIL$+".nkk" AS #1
5850 FIELD #1,128 AS DUM1$,128 AS DUM2$:GET #1
5860 LL=256*ASC(MID$(DUM1$,2,1))+ASC(LEFT$(DUM1$,1)):MM=INT(LL/256)+1
5870 GD$(1,1)=RIGHT$(DUM1$,128-16):GD$(1,2)=DUM2$
5880 FOR I=2 TO MM:GET #1:GD$(I,1)=DUM1$:GD$(I,2)=DUM2$:NEXT I
5890 NN=LL MOD 256:IF NN>127 THEN NN=NN-128:JJ=2 ELSE JJ=1:GD$(MM,2)=""
5900 GD$(MM,JJ)=LEFT$(GD$(MM,JJ),NN):CLOSE #1:RETURN
5910 GOSUB 5790
5920 OD=&H40:GOSUB 2590:SUM=XX
5930 OD=XX:GOSUB 2590
5940 LL=LL-16:COLOR 6
5950 OD=INT(LL/256):SUM=(SUM+OD) MOD 256:GOSUB 2590
5960 OD=INT(LL MOD 256):SUM=(SUM+OD) MOD 256:GOSUB 2590
5970 LOCATE 0,0:LINENO=0:FOR JJJ=1 TO MM
5980 FOR III=1 TO LEN(GD$(JJJ,1))
5990 AA$=HEX$(ASC(MID$(GD$(JJJ,1),III,1))):IF LEN(AA$)=1 THEN AA$="0"+AA$
6000 OD=VAL("&h"+AA$):SUM=(SUM+OD) MOD 256:GOSUB 2590
6010 PRINT AA$;" ";:LINENO=LINENO+1:IF LINENO MOD 25=0 THEN PRINT
6020 IF LINENO MOD 125=0 THEN LOCATE 0,0
6030 NEXT III
6040 FOR III=1 TO LEN(GD$(JJJ,2))
6050 AA$=HEX$(ASC(MID$(GD$(JJJ,2),III,1))):IF LEN(AA$)=1 THEN AA$="0"+AA$
6060 OD=VAL("&h"+AA$):SUM=(SUM+OD) MOD 256:GOSUB 2590
6070 PRINT AA$;" ";:LINENO=LINENO+1:IF LINENO MOD 25=0 THEN PRINT
6080 IF LINENO MOD 125=0 THEN LOCATE 0,0
6090 NEXT III
6100 NEXT JJJ
6110 OD=SUM:GOSUB 2590:RD=&H0:GOSUB 2710
6120 BEEP:GOTO 5660
6130 GOSUB 5790
6140 OD=&H40:GOSUB 2590:SUM=XX
6150 OD=XX:GOSUB 2590
6160 LL=LL-16:COLOR 6
6170 OD=INT(LL/256):SUM=(SUM+OD) MOD 256:GOSUB 2590
6180 OD=INT(LL MOD 256):SUM=(SUM+OD) MOD 256:GOSUB 2590
6190 LOCATE 10,2:COLOR 6:PRINT "Block Size =";MM
6200 FOR JJJ=1 TO MM
6210 FOR III=1 TO LEN(GD$(JJJ,1))
6220 AA$=HEX$(ASC(MID$(GD$(JJJ,1),III,1)))
6230 OD=VAL("&h"+AA$):SUM=(SUM+OD) MOD 256:GOSUB 2590
6240 NEXT III
6250 FOR III=1 TO LEN(GD$(JJJ,2))
6260 AA$=HEX$(ASC(MID$(GD$(JJJ,2),III,1)))
6270 OD=VAL("&h"+AA$):SUM=(SUM+OD) MOD 256:GOSUB 2590
6280 NEXT III
6290 LOCATE 35,2:COLOR 5:PRINT "Remain =";:COLOR 3:PRINT MM-JJJ
6300 NEXT JJJ
6310 OD=SUM:GOSUB 2590:RD=&H0:GOSUB 2710
6320 BEEP:GOTO 5660
6330 '======= Data File Transfer Routine =======
6340 COLOR 7:CLS 3
6350 LOCATE 25,0:INPUT "Send Tone NO ( 0 - 1F ) = ";ZZ$:XX=VAL("&h"+ZZ$)
6360 IF XX<>INT(XX) OR XX>31 THEN BEEP:GOTO 6350
6370 LOCATE 0,3:COLOR 7:PRINT "Select File : ":SY=CSRLIN+1
6380 FILES "b:\data\*.DAT":MY=CSRLIN-1
6390 GOSUB 2380
6400 IF F$="BASIC " OR F$="" THEN 6590
6410 OPEN "b:\data\"+F$+".DAT" FOR INPUT AS #1
6420 FOR K=13 TO 40
6430 INPUT #1,WW
6440 A(1,K)=INT(WW/16)
6450 A(0,K)=WW MOD 16
6460 NEXT K
6470 CLOSE #1
6480 OD=&H30:GOSUB 2590
6490 OD=XX:GOSUB 2590
6500 RESTORE 1660
6510 SUM=XX
6520 FOR J=1 TO 28
6530 READ K:XX=A(1,K)*16+A(0,K):SUM=(SUM+XX) MOD 256
6540 OD=XX:GOSUB 2590
6550 NEXT J
6560 FOR J=29 TO 48:OD=0:GOSUB 2590:NEXT J
6570 OD=SUM:GOSUB 2590:RD=&H0:GOSUB 2710
6580 GOTO 6340
6590 RETURN 1050
6600 '======= Harmonics Data File Routine =======
6610 FOR K=1 TO 128:HC(K)=0:NEXT K
6620 CLS 3:COLOR 7:GOSUB 7250
6630 CLS
6640 LOCATE 2,0:COLOR 4:PRINT "<< Harmonics Data File Editor >>"
6650 LOCATE 10,2:COLOR 7
6660 PRINT "1.Data File Load"
6670 LOCATE 10,3:COLOR 7
6680 PRINT "2.Data File Save "
6690 LOCATE 10,4:COLOR 7
6700 PRINT "3.Data Caluclate/Save/Transfer"
6710 LOCATE 10,5:COLOR 7
6720 PRINT "4.Data Edit"
6730 LOCATE 10,6:COLOR 7
6740 PRINT "5.Rerurn"
6750 LOCATE 50,5:COLOR 6:PRINT "Input NO. ?";
6760 ANS$=INKEY$:N=VAL(ANS$):IF N>0 AND N<6 THEN 6770 ELSE 6760
6770 IF N=1 THEN GOSUB 6820:CLS:GOSUB 7250:GOTO 6640
6780 IF N=2 THEN GOSUB 6940:CLS:GOSUB 7250:GOTO 6640
6790 IF N=3 THEN GOSUB 7680:CLS:GOSUB 7250:GOTO 6640
6800 IF N=4 THEN GOSUB 7320:GOTO 6630
6810 RETURN 1050
6820 '======= Harmonics Data File Load =======
6830 COLOR 7:CLS 3
6840 LOCATE 25,0:COLOR 3:PRINT "Load Harmonics Data"
6850 LOCATE 0,3:COLOR 7:PRINT "File Name List":SY=CSRLIN+1
6860 FILES "b:\data\*.hcc":MY=CSRLIN-1
6870 GOSUB 2380
6880 IF F$="end " THEN 6930
6890 OPEN "b:\data\"+F$+".hcc" FOR INPUT AS #1
6900 FOR K=1 TO 128
6910 INPUT #1,HC(K)
6920 NEXT K
6930 CLOSE #1:RETURN
6940 '======= Harmonics Data File Save =======
6950 COLOR 7:CLS 3
6960 LOCATE 25,0:COLOR 3:PRINT "Save Harmonics Data"
6970 LOCATE 0,3:COLOR 7:PRINT "File Name List":FILES "b:\data\*.hcc"
6980 INPUT "Save File Name=";F$
6990 IF F$="" THEN BEEP :GOTO 7040
7000 OPEN "b:\data\"+F$+".hcc" FOR OUTPUT AS #1
7010 FOR K=1 TO 128
7020 PRINT #1,HC(K)
7030 NEXT K
7040 CLOSE #1:RETURN
7050 '======= File Erase =======
7060 COLOR 7:CLS 3
7070 LOCATE 25,0:COLOR 6:PRINT "Erase File"
7080 LOCATE 0,3:COLOR 5:PRINT "Select : [ WAV / DAT / HCC / PCM";
7090 INPUT " / SRC / BIN ]";SF$
7100 IF SF$="wav" OR SF$="WAV" THEN 7170
7110 IF SF$="dat" OR SF$="DAT" THEN 7170
7120 IF SF$="hcc" OR SF$="HCC" THEN 7170
7130 IF SF$="pcm" OR SF$="PCM" THEN 7170
7140 IF SF$="src" OR SF$="SRC" THEN 7170
7150 IF SF$="bin" OR SF$="BIN" THEN 7170
7160 BEEP:GOTO 7240
7170 LOCATE 0,5:COLOR 7:PRINT "File Name List":SY=CSRLIN+1
7180 FILES "b:\data\*."+SF$:MY=CSRLIN-1
7190 GOSUB 2380
7200 IF F$=" " THEN 7240
7210 LOCATE 25,0:COLOR 2:BEEP:INPUT " OK ? (y/n) ";ANS$
7220 IF ANS$<>"Y" AND ANS$<>"y" THEN 7240
7230 KILL "b:\data\"+F$+"."+SF$
7240 RETURN 1050
7250 '======= Harmonics Data Draw =======
7260 LINE(54,141)-(586,399),0,BF
7270 LINE(54,141)-(586,399),5,B
7280 FOR K=1 TO 128
7290 LINE (K*4+60,398-HC(K)*2)-(K*4+62,398),7,BF
7300 NEXT K
7310 RETURN
7320 '======= Harmonics Data Edit =======
7330 CLS:K=1
7340 LOCATE 20,1:COLOR 6:PRINT "Harmonic NO. ="
7350 LOCATE 20,3:COLOR 6:PRINT "Harmonic Level ="
7360 GOSUB 7440:GOSUB 7530
7370 ED$=INKEY$
7380 IF ED$=CHR$(28) THEN GOSUB 7580:GOTO 7370:' Right
7390 IF ED$=CHR$(29) THEN GOSUB 7600:GOTO 7370:' Left
7400 IF ED$=CHR$(30) THEN GOSUB 7620:GOTO 7370:' Up
7410 IF ED$=CHR$(31) THEN GOSUB 7640:GOTO 7370:' Down
7420 IF ED$=CHR$(13) THEN 7660:' Return
7430 GOTO 7370
7440 LINE(54,115)-(586,135),0,BF
7450 LINE (K*4+55,115)-(K*4+67,125),4,BF
7460 LINE (K*4+58,116)-(K*4+64,130),3,BF
7470 LINE (K*4+60,118)-(K*4+62,135),6,BF
7480 LOCATE 35,1:COLOR 5:PRINT " ";
7490 LOCATE 35,1:COLOR 5:PRINT K;
7500 LOCATE 37,3:COLOR 5:PRINT " ";
7510 LOCATE 37,3:COLOR 5:PRINT HC(K);
7520 RETURN
7530 LINE (K*4+60,398-128*2)-(K*4+62,398),0,BF
7540 LINE (K*4+60,398-HC(K)*2)-(K*4+62,398),7,BF
7550 LOCATE 37,3:COLOR 5:PRINT " ";
7560 LOCATE 37,3:COLOR 5:PRINT HC(K);
7570 RETURN
7580 IF K=128 THEN RETURN
7590 K=K+1:GOSUB 7440:RETURN
7600 IF K=1 THEN RETURN
7610 K=K-1:GOSUB 7440:RETURN
7620 IF HC(K)=128 THEN RETURN
7630 HC(K)=HC(K)+1:GOSUB 7530:RETURN
7640 IF HC(K)=0 THEN RETURN
7650 HC(K)=HC(K)-1:GOSUB 7530:RETURN
7660 LINE(54,115)-(586,135),0,BF
7670 RETURN
7680 '======= Wave Compute/Save/Transfer =======
7690 BNK=0:CLS
7700 LOCATE 25,2:COLOR 3:PRINT "!!! Now Computing !!!"
7710 MAXY=0
7720 FOR X=1 TO 256
7730 LINE (X*2+60,130)-(X*2+61,135),6,BF
7740 Y(BNK,X)=0
7750 FOR I=1 TO 128
7760 IF HC(I)=0 THEN 7780
7770 Y(BNK,X)=HC(I)*SIN(6.283*X/256*I)+Y(BNK,X)
7780 NEXT I
7790 IF MAXY<ABS(Y(BNK,X)) THEN MAXY=ABS(Y(BNK,X))
7800 NEXT X
7810 FOR X=1 TO 256
7820 LINE (X*2+60,130)-(X*2+61,135),0,BF
7830 Y(BNK,X)=INT(Y(BNK,X)/MAXY*127)
7840 NEXT X
7850 CLS 3
7860 WM=200:OFST=330
7870 LINE (OFST+10,WM)-(OFST+266,WM),7
7880 LINE (OFST+10-1,WM-128)-(OFST+10+256,WM+128),4,B
7890 FOR C=1 TO 1
7900 FOR X=1 TO 256
7910 PSET (OFST+X+10,WM-Y(BNK,X))
7920 NEXT X
7930 NEXT C
7940 LOCATE 0,2:COLOR 5:PRINT "Transfer to DSP ? (Y/N)"
7950 ANS$=INKEY$:IF ANS$="" THEN 7950
7960 IF ANS$<>"y" AND ANS$<>"Y" THEN 8110
7970 COLOR 7:LOCATE 5,4
7980 INPUT"BANK NO.=(0<->255)";BANK
7990 IF BANK<0 OR BANK>255 THEN BEEP:GOTO 7970
8000 LOCATE 2,7:COLOR 4:PRINT "Now Transfer Start !!"
8010 OD=&H31:GOSUB 2590
8020 OD=BANK:GOSUB 2590
8030 SUM=BANK
8040 FOR I=1 TO 256
8050 IF Y(BNK,I)<0 THEN OD=128-Y(BNK,I) ELSE OD=Y(BNK,I):'NOT EXIST 128
8060 IF OD=256 THEN OD=255
8070 SUM=(SUM+OD) MOD 256:GOSUB 2590
8080 NEXT I
8090 OD=SUM:GOSUB 2590
8100 RD=&H0:GOSUB 2710
8110 CLS
8120 LOCATE 0,2:COLOR 5:PRINT "Wave Data File Save ? (Y/N)"
8130 ANS$=INKEY$:IF ANS$="" THEN 8130
8140 IF ANS$<>"y" AND ANS$<>"Y" THEN CLS 3:RETURN
8150 CLS 3:COLOR 7:PRINT:PRINT "File Name List":FILES "B:\data\*.WAV"
8160 PRINT:INPUT "Save File Name";F$
8170 IF F$="" THEN RETURN
8180 OPEN "B:\data\"+F$+".WAV" FOR OUTPUT AS #1
8190 FOR X=1 TO 256
8200 PRINT #1,CHR$(Y(BNK,X)+128);
8210 NEXT X
8220 CLOSE #1
8230 RETURN
8240 '======= Wave Drawing Editor =======
8250 BNK=0:FOR X=1 TO 256:Y(BNK,X)=0:NEXT X
8260 CLS 3:COLOR 7:GOSUB 8680
8270 LOCATE 2,0:COLOR 4:PRINT "<< Wave Data Drawing Editor >>"
8280 LOCATE 10,2:COLOR 7
8290 PRINT "1.Data File Load"
8300 LOCATE 10,3:COLOR 7
8310 PRINT "2.Data File Save "
8320 LOCATE 10,4:COLOR 7
8330 PRINT "3.Data Transfer"
8340 LOCATE 10,5:COLOR 7
8350 PRINT "4.Data Drawing Edit"
8360 LOCATE 10,6:COLOR 7
8370 PRINT "5.Rerurn"
8380 LOCATE 50,5:COLOR 3:PRINT "Input NO. ?";
8390 ANS$=INKEY$:N=VAL(ANS$):IF N>0 AND N<6 THEN 8400 ELSE 8390
8400 IF N=1 THEN GOSUB 8450:GOSUB 8680:GOTO 8270
8410 IF N=2 THEN GOSUB 8570:GOSUB 8680:GOTO 8270
8420 IF N=3 THEN GOSUB 9180:CLS:GOTO 8270
8430 IF N=4 THEN GOSUB 8760:GOSUB 8680:GOTO 8270
8440 RETURN 1050
8450 '======= Wave Data File Load =======
8460 COLOR 7:CLS 3
8470 LOCATE 25,0:COLOR 3:PRINT "Load Wave Data"
8480 LOCATE 0,3:COLOR 7:PRINT "File Name List":SY=CSRLIN+1
8490 FILES "b:\data\*.wav":MY=CSRLIN-1
8500 GOSUB 2380
8510 IF F$="end " OR F$="" THEN RETURN
8520 OPEN "b:\data\"+F$+".wav" FOR INPUT AS #1
8530 FOR X=1 TO 256
8540 Y(BNK,X)=ASC(INPUT$(1,#1))-128
8550 NEXT X
8560 CLOSE #1:RETURN
8570 '======= Wave Data File Save =======
8580 COLOR 7:CLS 3
8590 LOCATE 25,0:COLOR 3:PRINT "Save Wave Data"
8600 LOCATE 0,3:COLOR 7:PRINT "File Name List":FILES "b:\data\*.wav"
8610 INPUT "Save File Name=";F$
8620 IF F$="" THEN RETURN
8630 OPEN "b:\data\"+F$+".wav" FOR OUTPUT AS #1
8640 FOR K=1 TO 256
8650 PRINT #1,CHR$(Y(BNK,K)+128);
8660 NEXT K
8670 CLOSE #1:RETURN
8680 '======= Wave Data Draw =======
8690 CLS
8700 LINE(54,270-129)-(586,270+129),0,BF
8710 LINE(54,270-129)-(586,270+129),5,B
8720 FOR K=1 TO 256
8730 CIRCLE (K*2+60,270-Y(BNK,K)),1,6
8740 NEXT K
8750 RETURN
8760 '======= Wave Draw Editing =======
8770 CLS:K=1
8780 LOCATE 20,1:COLOR 7:PRINT "Point Address ="
8790 LOCATE 20,3:COLOR 7:PRINT "Point Level ="
8800 GOSUB 8880:GOSUB 9010
8810 ED$=INKEY$
8820 IF ED$=CHR$(28) THEN GOSUB 9080:GOTO 8810:' Right
8830 IF ED$=CHR$(29) THEN GOSUB 9100:GOTO 8810:' Left
8840 IF ED$=CHR$(30) THEN GOSUB 9120:GOTO 8810:' Up
8850 IF ED$=CHR$(31) THEN GOSUB 9140:GOTO 8810:' Down
8860 IF ED$=CHR$(13) THEN 9160:' Return
8870 GOTO 8810
8880 LINE(54,115)-(586,135),0,BF
8890 LINE (K*2+55,115)-(K*2+67,125),4,BF
8900 LINE (K*2+58,116)-(K*2+64,130),3,BF
8910 LINE (K*2+60,118)-(K*2+62,135),6,BF
8920 CIRCLE (OLDX,OLDY),2,0
8930 CIRCLE (K*2+60,270-Y(BNK,K)),1,6
8940 CIRCLE (K*2+60,270-Y(BNK,K)),2,4
8950 OLDX=K*2+60:OLDY=270-Y(BNK,K)
8960 LOCATE 35,1:COLOR 5:PRINT " ";
8970 LOCATE 35,1:COLOR 5:PRINT K;
8980 LOCATE 33,3:COLOR 5:PRINT " ";
8990 LOCATE 33,3:COLOR 5:PRINT Y(BNK,K)+128
9000 RETURN
9010 CIRCLE (OLDX,OLDY),2,0
9020 CIRCLE (K*2+60,270-Y(BNK,K)),1,6
9030 CIRCLE (K*2+60,270-Y(BNK,K)),2,4
9040 OLDX=K*2+60:OLDY=270-Y(BNK,K)
9050 LOCATE 33,3:COLOR 5:PRINT " ";
9060 LOCATE 33,3:COLOR 5:PRINT Y(BNK,K)+128
9070 RETURN
9080 IF K=256 THEN RETURN
9090 K=K+1:GOSUB 8880:RETURN
9100 IF K=1 THEN RETURN
9110 K=K-1:GOSUB 8880:RETURN
9120 IF Y(BNK,K)=127 THEN RETURN
9130 Y(BNK,K)=Y(BNK,K)+1:GOSUB 9010:RETURN
9140 IF Y(BNK,K)=<-127 THEN RETURN
9150 Y(BNK,K)=Y(BNK,K)-1:GOSUB 9010:RETURN
9160 LINE(54,115)-(586,135),0,BF
9170 RETURN
9180 '======= Drawn Wave Transfer =======
9190 CLS:COLOR 7:LOCATE 2,0
9200 INPUT"BANK NO.=(0<->255)";BANK
9210 IF BANK<0 OR BANK>255 THEN BEEP:GOTO 9190
9220 LOCATE 20,2:COLOR 4:PRINT "Now Transfer Start !!"
9230 OD=&H31:GOSUB 2590
9240 OD=BANK:GOSUB 2590
9250 SUM=BANK
9260 FOR I=1 TO 256
9270 IF Y(BNK,I)<0 THEN OD=128-Y(BNK,I) ELSE OD=Y(BNK,I):'NOT EXIST 128
9280 IF OD=256 THEN OD=255
9290 SUM=(SUM+OD) MOD 256:GOSUB 2590
9300 NEXT I
9310 OD=SUM:GOSUB 2590
9320 RD=&H0:GOSUB 2710
9330 RETURN
9340 '======= File Name List Up =======
9350 COLOR 7:CLS 3
9360 INPUT "List Up File Name Suffix =";F$
9370 IF F$="" THEN F$="*"
9380 LOCATE 0,2:COLOR 7:FILES "b:\data\*."+F$
9390 IF INKEY$="" THEN 9390
9400 RETURN 1050
9410 '======= Sweep PCM Data Make Routine =======
9420 FOR K=1 TO 128:HC(K)=0:NEXT K
9430 CLS 3:COLOR 7:GOSUB 7250
9440 CLS
9450 LOCATE 2,0:COLOR 4:PRINT "<< Sweep PCM Data File Maker >>"
9460 LOCATE 10,2:COLOR 7
9470 PRINT "1. <HCC> Data File Load"
9480 LOCATE 10,3:COLOR 7
9490 PRINT "2. <HCC> Data File Save "
9500 LOCATE 10,4:COLOR 7
9510 PRINT "3. <HCC> Data Caluclate to <PCM>"
9520 LOCATE 10,5:COLOR 7
9530 PRINT "4. <PCM> Data Transfer to DSP"
9540 LOCATE 10,6:COLOR 7
9550 PRINT "5. Source PCM Data File Converter to <PCM>"
9560 LOCATE 10,7:COLOR 7
9570 PRINT "6. Rerurn"
9580 LOCATE 55,7:COLOR 6:PRINT "Input NO. ?";
9590 ANS$=INKEY$:N=VAL(ANS$):IF N>0 AND N<7 THEN 9600 ELSE 9590
9600 IF N=1 THEN GOSUB 6820:CLS:GOSUB 7250:GOTO 9450
9610 IF N=2 THEN GOSUB 6940:CLS:GOSUB 7250:GOTO 9450
9620 IF N=3 THEN GOSUB 9670:CLS:GOSUB 7250:GOTO 9450
9630 IF N=4 THEN GOSUB 10130:CLS:GOSUB 7250:GOTO 9450
9640 IF N=5 THEN GOSUB 10450:CLS 3:GOTO 9450
9650 RETURN 1050
9660 RETURN : 'DUMMY
9670 '======= Sweep PCM Data Compute/Save =======
9680 BNK=0:CLS
9690 LOCATE 25,2:COLOR 3:PRINT "!!! Now Computing !!!"
9700 MAXY=0
9710 FOR X=1 TO 256
9720 LINE (X*2+60,130)-(X*2+61,135),6,BF
9730 Y(BNK,X)=0
9740 FOR I=1 TO 128
9750 IF HC(I)=0 THEN 9770
9760 Y(BNK,X)=HC(I)*SIN(6.283*X/256*I)+Y(BNK,X)
9770 NEXT I
9780 IF MAXY<ABS(Y(BNK,X)) THEN MAXY=ABS(Y(BNK,X))
9790 NEXT X
9800 FOR X=1 TO 256
9810 LINE (X*2+60,130)-(X*2+61,135),0,BF
9820 Y(BNK,X)=INT(Y(BNK,X)/MAXY*127)
9830 NEXT X
9840 CLS 3
9850 WM=200:OFST=330
9860 LINE (OFST+10,WM)-(OFST+266,WM),7
9870 LINE (OFST+10-1,WM-128)-(OFST+10+256,WM+128),4,B
9880 FOR C=1 TO 1
9890 FOR X=1 TO 256
9900 PSET (OFST+X+10,WM-Y(BNK,X))
9910 NEXT X
9920 NEXT C
9930 CLS
9940 LOCATE 0,2:COLOR 5:PRINT "<PCM> Data File Save ? (Y/N)"
9950 ANS$=INKEY$:IF ANS$="" THEN 9950
9960 IF ANS$<>"y" AND ANS$<>"Y" THEN CLS 3:RETURN
9970 CLS 3:COLOR 7:PRINT:PRINT "File Name List":FILES "B:\data\*.PCM"
9980 PRINT:INPUT "Save File Name";F$
9990 IF F$="" OR LEN(F$)>5 THEN BEEP:GOTO 9930
10000 COLOR 7:PRINT:INPUT "PCM Page NO (0-255)";FGH
10010 IF FGH>255 THEN BEEP:GOTO 9930
10020 PRINT:COLOR 5:PRINT "Save OK ? (Y/N)"
10030 ANS$=INKEY$:IF ANS$="" THEN 10030
10040 IF ANS$<>"y" AND ANS$<>"Y" THEN CLS 3:RETURN
10050 FG$=HEX$(FGH):IF LEN(FG$)=1 THEN FG$="0"+FG$
10060 OPEN "B:\data\"+F$+FG$+".PCM" FOR OUTPUT AS #1
10070 PRINT #1,FG$
10080 FOR X=1 TO 256
10090 PRINT #1,CHR$(Y(BNK,X)+128);
10100 NEXT X
10110 CLOSE #1
10120 GOTO 10000
10130 '======= Sweep PCM Data Transfer to DSP =======
10140 COLOR 7:CLS 3:BNK=0
10150 INPUT "List Up <PCM> File Name =";F$
10160 IF F$="" THEN F$="*"
10170 LOCATE 0,2:COLOR 7:FILES "b:\data\"+F$+"*.PCM"
10180 PRINT:INPUT "Transfer <PCM> File Name =";F$
10190 INPUT "Max Bank NO (1,2,4,8,16,32,64,128,256) =";BKMAX
10200 PRINT:COLOR 3:PRINT "Transfer to DSP OK ? (Y/N)"
10210 ANS$=INKEY$:IF ANS$="" THEN 10210
10220 IF ANS$="y" OR ANS$="Y" THEN 10230 ELSE RETURN
10230 CLS:LOCATE 2,4:COLOR 4:PRINT "Now Transfer Start !!"
10240 LOCATE 0,9:COLOR 6
10250 FOR JKJ=0 TO BKMAX-1
10260 FG$=HEX$(JKJ):IF LEN(FG$)=1 THEN FG$="0"+FG$
10270 OPEN "b:\data\"+F$+FG$+".PCM" FOR INPUT AS #1
10280 INPUT #1,DUM$:PRINT DUM$;" , ";
10290 FOR X=1 TO 256
10300 Y(BNK,X)=ASC(INPUT$(1,#1))-128
10310 NEXT X
10320 CLOSE #1
10330 OD=&H31:GOSUB 2590
10340 OD=JKJ:GOSUB 2590
10350 SUM=JKJ
10360 FOR I=1 TO 256
10370 IF Y(BNK,I)<0 THEN OD=128-Y(BNK,I) ELSE OD=Y(BNK,I):'NOT EX. 128
10380 IF OD=256 THEN OD=255
10390 SUM=(SUM+OD) MOD 256:GOSUB 2590
10400 NEXT I
10410 OD=SUM:GOSUB 2590
10420 RD=&H0:GOSUB 2710
10430 NEXT JKJ
10440 RETURN
10450 '======= Source PCM Data Covert to <PCM> File =======
10460 COLOR 7:CLS 3:BNK=0
10470 LOCATE 0,2:FILES "b:\data\*.PCM"
10480 PRINT:INPUT "Output <PCM> File Name =";FA$
10490 CLS:LOCATE 0,2:FILES "b:*.SRC"
10500 PRINT:INPUT "Input <SRC> File Name =";FB$
10510 PRINT:INPUT "Start Bank NO (1-256) =";BKMIN
10520 PRINT:INPUT "Max Bank NO (1,2,4,8,32,64,128,256) =";BKMAX
10530 PRINT:PRINT:COLOR 3:PRINT "File Make OK ? (Y/N)"
10540 ANS$=INKEY$:IF ANS$="" THEN 10540
10550 IF ANS$="y" OR ANS$="Y" THEN 10560 ELSE RETURN
10560 FOR JKJ=BKMIN-1 TO BKMAX-1
10570 CLS 3:LOCATE 2,2:COLOR 3:PRINT "Now Compute Bank =";JKJ+1
10580 FG$=STR$(JKJ+1):FG$=RIGHT$(FG$,LEN(FG$)-1)
10590 OPEN "b:\data\"+FB$+FG$+".SRC" FOR INPUT AS #1
10600 INPUT #1,INDT$(1):IF LEFT$(INDT$(1),2)="/*" THEN 10600
10610 FOR X=2 TO 127:INPUT #1,INDT$(X):NEXT X
10620 CLOSE #1:PRINT:PRINT:COLOR 5
10630 FOR X=1 TO 128
10640 HC(X)=VAL(RIGHT$(INDT$(X),10))
10650 PRINT HC(X);
10660 NEXT X
10670 MAXY=0
10680 FOR X=1 TO 256
10690 LINE (X*2+60,330)-(X*2+61,435),6,BF
10700 Y(BNK,X)=0
10710 FOR I=1 TO 128
10720 IF HC(I)=0 THEN 10740
10730 Y(BNK,X)=HC(I)*SIN(6.283*X/256*I)+Y(BNK,X)
10740 NEXT I
10750 IF MAXY<ABS(Y(BNK,X)) THEN MAXY=ABS(Y(BNK,X))
10760 NEXT X
10770 FOR X=1 TO 256
10780 LINE (X*2+60,330)-(X*2+61,435),0,BF
10790 Y(BNK,X)=INT(Y(BNK,X)/MAXY*127)
10800 NEXT X
10810 CLS 3
10820 WM=200:OFST=330
10830 LINE (OFST+10,WM)-(OFST+266,WM),7
10840 LINE (OFST+10-1,WM-128)-(OFST+10+256,WM+128),4,B
10850 FOR C=1 TO 1
10860 FOR X=1 TO 256
10870 PSET (OFST+X+10,WM-Y(BNK,X))
10880 NEXT X
10890 NEXT C
10900 FG$=HEX$(JKJ):IF LEN(FG$)=1 THEN FG$="0"+FG$
10910 OPEN "B:\data\"+FA$+FG$+".PCM" FOR OUTPUT AS #1
10920 PRINT #1,FG$
10930 FOR X=1 TO 256
10940 PRINT #1,CHR$(Y(BNK,X)+128);
10950 NEXT X
10960 CLOSE #1
10970 NEXT JKJ
10980 RETURN
10990 '======= Full PCM Data Converter =======
11000 COLOR 7:CLS 3:BNK=0
11010 CLS:LOCATE 0,2:FILES "b:\data\*.BIN"
11020 PRINT:INPUT "Input <BIN> File Name =";FB$
11030 PRINT:INPUT "Input File Size (Byte) =";DTSIZE
11040 IF INT(DTSIZE/256)<>DTSIZE/256 THEN BEEP:GOTO 11010
11050 CLS:LOCATE 0,2:FILES "b:\data\*.PCM"
11060 PRINT:INPUT "Output <PCM> File Name =";FA$
11070 PRINT "Max Bank NO =";DTSIZE/256
11080 PRINT:PRINT:COLOR 3:PRINT "File Make OK ? (Y/N)"
11090 ANS$=INKEY$:IF ANS$="" THEN 11090
11100 IF ANS$<>"y" AND ANS$<>"Y" THEN RETURN 1050
11110 CLS 3:OPEN "b:\data\"+FB$+".BIN" FOR INPUT AS #1
11120 FOR JKJ=0 TO DTSIZE/256-1
11130 LOCATE 2,2:COLOR 3:PRINT "Now Compute Bank =";JKJ+1
11140 FOR X=1 TO 256
11150 DUMINP=ASC(INPUT$(1,#1))-128
11160 IF DUMINP<0 THEN Y(BNK,X)=DUMINP+127 ELSE Y(BNK,X)=-DUMINP
11170 NEXT X
11180 WM=200:OFST=330
11190 LINE (OFST+10-1,WM-128)-(OFST+10+256,WM+128),0,BF
11200 LINE (OFST+10,WM)-(OFST+266,WM),7
11210 LINE (OFST+10-1,WM-128)-(OFST+10+256,WM+128),4,B
11220 FOR X=1 TO 256
11230 PSET (OFST+X+10,WM-Y(BNK,X))
11240 NEXT X
11250 FG$=HEX$(JKJ):IF LEN(FG$)=1 THEN FG$="0"+FG$
11260 OPEN "B:\data\"+FA$+FG$+".PCM" FOR OUTPUT AS #2
11270 PRINT #2,FG$
11280 FOR X=1 TO 256
11290 PRINT #2,CHR$(Y(BNK,X)+128);
11300 NEXT X
11310 CLOSE #2
11320 NEXT JKJ
11330 CLOSE #1
11340 RETURN 1050
11350 '======= PCM Data Plotter =======
11360 COLOR 7:CLS 3:WM=250
11370 LOCATE 0,2:FILES "b:\data\*.BIN"
11380 PRINT:INPUT "Plot <BIN> File Name =";FB$
11390 IF FB$="" THEN RETURN 1050
11400 PRINT:INPUT "File Size (Byte) =";DTSIZE
11410 CLS 3
11420 LOCATE 18,1:COLOR 5:PRINT"File Name = < ";FB$;".BIN >"
11430 LOCATE 18,3:PRINT"Data Size = ";DTSIZE;" bytes"
11440 LINE (0,WM)-(639,WM),7
11450 LINE (0,WM-128)-(639,WM+128),4,B
11460 OPEN "b:\data\"+FB$+".BIN" FOR INPUT AS #1
11470 FOR JKJ=0 TO DTSIZE-1
11480 DUMINP=ASC(INPUT$(1,#1))-128
11490 IF DUMINP<0 THEN PLOTY=DUMINP+127 ELSE PLOTY=-DUMINP
11500 PSET (INT(640*(JKJ+1)/DTSIZE),WM-PLOTY),6
11510 NEXT JKJ
11520 CLOSE #1
11530 IF INKEY$="" THEN 11530 ELSE 11360
11540 '======= Files Define =======
11550 OPEN "B:\data\files.def" FOR INPUT AS #1
11560 INPUT #1,DFCOUNT
11570 FOR I=1 TO DFCOUNT
11580 INPUT #1,DFT(I)
11590 INPUT #1,DF$(I)
11600 NEXT I
11610 CLOSE #1
11620 CLS 3
11630 COLOR 7:PRINT
11640 FOR I=1 TO DFCOUNT
11650 PRINT " (";I;") ";
11660 COLOR 5:PRINT DF$(I);:COLOR 7:NF$=DF$(I)
11670 IF RIGHT$(NF$,4)=".dat" THEN PRINT " , Tone NO. = ";DFT(I);
11680 IF RIGHT$(NF$,4)=".DAT" THEN PRINT " , Tone NO. = ";DFT(I);
11690 IF RIGHT$(NF$,4)=".wav" THEN PRINT " , Bank NO. = ";DFT(I);
11700 IF RIGHT$(NF$,4)=".WAV" THEN PRINT " , Bank NO. = ";DFT(I);
11710 PRINT
11720 NEXT I
11730 COLOR 3:PRINT:PRINT "Select : ";
11740 COLOR 6:PRINT "(1) New File / (2) Delete File / (3) Escape"
11750 A$=INKEY$:IF A$="" THEN 11750
11760 IF A$="3" THEN 12060
11770 IF A$="1" THEN 11790
11780 IF A$="2" THEN 11940 ELSE 11750
11790 COLOR 4:PRINT:PRINT " << New File Define >>"
11800 COLOR 7:INPUT " New File Name = ";NF$
11810 IF RIGHT$(NF$,4)=".dat" THEN 11850
11820 IF RIGHT$(NF$,4)=".DAT" THEN 11850
11830 IF RIGHT$(NF$,4)=".wav" THEN 11870
11840 IF RIGHT$(NF$,4)=".WAV" THEN 11870 ELSE BEEP:GOTO 11800
11850 COLOR 6:INPUT " Tone NO. = ";DFT(DFCOUNT+1)
11860 IF DFT(DFCOUNT+1)>31 THEN BEEP:GOTO 11850 ELSE GOTO 11890
11870 COLOR 6:INPUT " Bank NO. = ";DFT(DFCOUNT+1)
11880 IF DFT(DFCOUNT+1)>255 THEN BEEP:GOTO 11870
11890 FOR I=1 TO DFCOUNT
11900 IF NF$=DF$(I) THEN BEEP:GOTO 11800
11910 NEXT I
11920 DFCOUNT=DFCOUNT+1:DF$(DFCOUNT)=NF$
11930 GOTO 11630
11940 COLOR 4:PRINT:PRINT " << File Delete >>"
11950 COLOR 7:INPUT " Delete File NO. = ";KF
11960 IF KF>DFCOUNT OR KF<>INT(KF) THEN BEEP:GOTO 11950
11970 COLOR 2:BEEP:PRINT:PRINT " !!! Delete OK ? (Y/N) !!!"
11980 A$=INKEY$:IF A$="" THEN 11980
11990 IF A$<>"y" AND A$<>"Y" THEN 11630
12000 IF KF=DFCOUNT THEN DFCOUNT=DFCOUNT-1:GOTO 11630
12010 FOR I=KF TO DFCOUNT-1
12020 DF$(I)=DF$(I+1)
12030 DFT(I)=DFT(I+1)
12040 NEXT I
12050 DFCOUNT=DFCOUNT-1:GOTO 11630
12060 COLOR 4:BEEP:PRINT:PRINT:PRINT " Define File Save ? (Y/N)"
12070 A$=INKEY$:IF A$="" THEN 12070
12080 IF A$<>"y" AND A$<>"Y" THEN 12160
12090 OPEN "B:\data\files.def" FOR OUTPUT AS #1
12100 PRINT #1,DFCOUNT
12110 FOR I=1 TO DFCOUNT
12120 PRINT #1,DFT(I)
12130 PRINT #1,DF$(I)
12140 NEXT I
12150 CLOSE #1
12160 RETURN 1050
12170 OPEN "B:\data\files.def" FOR OUTPUT AS #1
12180 PRINT #1,5
12190 FOR I=1 TO 5
12200 PRINT #1,1
12210 PRINT #1,"dummy.dat"
12220 NEXT I
12230 CLOSE #1
12240 '======= Files Preset =======
12250 CLS 3:COLOR 7
12260 PRINT " <<< Preset File Read >>>":PRINT:COLOR 6
12270 OPEN "B:\data\files.def" FOR INPUT AS #1
12280 INPUT #1,DFCOUNT
12290 FOR I=1 TO DFCOUNT
12300 INPUT #1,DFT(I)
12310 INPUT #1,DF$(I)
12320 PRINT " File #";I;" = ";DF$(I)
12330 NEXT I
12340 CLOSE #1:PRINT:PRINT
12350 FOR PRS=1 TO DFCOUNT
12360 IF RIGHT$(DF$(PRS),3)="dat" THEN 12410
12370 IF RIGHT$(DF$(PRS),3)="DAT" THEN 12410
12380 IF RIGHT$(DF$(PRS),3)="wav" THEN 12620
12390 IF RIGHT$(DF$(PRS),3)="WAV" THEN 12620
12400 GOTO 12790
12410 XX=DFT(PRS)
12420 COLOR 4:PRINT
12430 PRINT " < ";DF$(PRS);" > is Read , Transfer to DSP : Tone NO =";XX
12440 OPEN "b:\data\"+DF$(PRS) FOR INPUT AS #1
12450 FOR K=13 TO 40
12460 INPUT #1,WW
12470 A(1,K)=INT(WW/16)
12480 A(0,K)=WW MOD 16
12490 NEXT K
12500 CLOSE #1
12510 OD=&H30:GOSUB 2590
12520 OD=XX:GOSUB 2590
12530 RESTORE 1660
12540 SUM=XX
12550 FOR J=1 TO 28
12560 READ K:XX=A(1,K)*16+A(0,K):SUM=(SUM+XX) MOD 256
12570 OD=XX:GOSUB 2590
12580 NEXT J
12590 FOR J=29 TO 48:OD=0:GOSUB 2590:NEXT J
12600 OD=SUM:GOSUB 2590:RD=&H0:GOSUB 2710
12610 GOTO 12790
12620 BANK=DFT(PRS)
12630 COLOR 3:PRINT
12640 PRINT " < ";DF$(PRS);" > is Read , Transfer to DSP : Bank NO =";BANK
12650 OPEN "b:\data\"+DF$(PRS) FOR INPUT AS #1
12660 FOR X=1 TO 256
12670 Y(BNK,X)=ASC(INPUT$(1,#1))-128
12680 NEXT X
12685 CLOSE #1
12690 OD=&H31:GOSUB 2590
12700 OD=BANK:GOSUB 2590
12710 SUM=BANK
12720 FOR I=1 TO 256
12730 IF Y(BNK,I)<0 THEN OD=128-Y(BNK,I) ELSE OD=Y(BNK,I):'NOT EXIST 128
12740 IF OD=256 THEN OD=255
12750 SUM=(SUM+OD) MOD 256:GOSUB 2590
12760 NEXT I
12770 OD=SUM:GOSUB 2590
12780 RD=&H0:GOSUB 2710
12790 NEXT PRS
12800 RETURN 1050
;-----------------------------------------------------------------------
; LCD System Message Box : Feb.1993
;-----------------------------------------------------------------------
;##### RAM Map #####
dseg
org 0000h
rx_fifo ds 16384
rx_top ds 2
rx_end ds 2
rsb ds 1
dcb ds 1
channel ds 1
keyno ds 1
disp_main ds 1
disp_sub ds 1
sw_status ds 2
mon_write ds 1
mon_erase ds 1
ddd ds 5
disp_data ds 1
;##### I/O Map, Defines #####
cseg
s_gen equ 0017h
sio_a equ 0018h
sio_b equ 001ah
pio_a equ 001ch
pio_b equ 001eh
lcd equ 0080h
tail equ 0000h
;##### MACRO #####
clear macro @1
xor a
ld (@1),a
endm
move macro @1,@2
ld a,@2
ld (@1),a
endm
inc_a macro @1
ld a,(@1)
inc a
ld (@1),a
endm
inc_chk macro @1,@2
inc_a @1
cp @2
jp c,99$
clear @1
99$:
endm
brc macro @1,@2
cp @1
jp c,@2
endm
brz macro @1,@2
cp @1
jp z,@2
endm
io_set macro @1,@2
ld a,@2
out (@1+1),a
endm
io_put macro @1,@2
ld a,@2
out (@1+0),a
endm
lcd_set macro @1
ld a,@1
out (lcd+1),a
endm
lcd_out macro @1
out (lcd),a
endm
lcd_put macro @1
ld a,@1
lcd_out
endm
lcd_mes macro @1,@2,@3
ld hl,@1*40+@2-41
ld de,@3
call lcd_disp_mess
endm
lcd_add macro
lcd_set 46h ; Address Set
lcd_put l
lcd_put h
lcd_set 42h ; Data Set
endm
add_set macro @1
ld a,(@1)
add a,a
ld e,a
ld d,0
ld hl,monitor_add
add hl,de
ld e,(hl)
inc hl
ld d,(hl)
ex de,hl
endm
;##### RESET #####
org 0000h
ld sp,0ffffh
di
jp main
;##### INT / NMI #####
org 0020h
dw _midi_
_midi_:
ex af,af'
exx
ld de,(rx_top)
ld a,10000000b
or d
ld h,a
ld l,e
in a,(sio_a)
ld (hl),a
inc de
res 6,d
ld (rx_top),de
exx
ex af,af'
ei
reti
org 0066h
retn
;##### Initialize --> Main Loop #####
main:
ld hl,08000h
ld a,0f0h
_ram_clear_loop:
ld (hl),0
inc hl
cp h
jp nc,_ram_clear_loop
call lcd_initial_set
; <PIO Initial >
io_set pio_a,0cfh ; Mode 3
io_set pio_a,00000000b ; 0:Out / 1:In
io_set pio_a,007h ; Interrupt Disable
io_set pio_b,0cfh ; Mode 3
io_set pio_b,00000011b ; 0:Out / 1:In
io_set pio_b,007h ; Interrupt Disable
io_put pio_b,0
io_put pio_a,0ffh ; LED All Off
io_put pio_b,80h
io_put pio_b,0
; <SIO Initial>
io_put s_gen,00000000b ; Clock Generator
io_put 0f0h,003h ; WDT Disable
io_put 0f0h,0b1h ; WDT Disable
io_put 0f4h,001h ; Daisy Chain
io_put 010h,0 ; CTC #1 Int. Disable
io_put 011h,0 ; CTC #2 Int. Disable
io_put 012h,0 ; CTC #3 Int. Disable
io_put 013h,0 ; CTC #4 Int. Disable
io_set sio_b,00011000b ; Channel Reset B
io_set sio_b,1 ; Resister Point = 1B
io_set sio_b,0 ; Interrupt Mode
io_set sio_b,2 ; Resister Point = 2B
io_set sio_b,20h ; Reset Address
xor a
ld i,a ; High Address
io_set sio_a,00011000b ; Channel Reset A
io_set sio_a,4 ; Resister Point = 4
io_set sio_a,10000100b ; Mode
io_set sio_a,1 ; Resister Point = 1
io_set sio_a,00011000b ; Interrupt Mode
io_set sio_a,3 ; Resister Point = 3
io_set sio_a,11000001b ; Receive Start
im 2
call init_menu
ei
loop:
call sw_scan
call midi_check
jp loop
;##### MIDI #####
midi_check:
ld de,(rx_end)
ld hl,(rx_top)
and a ; CY <-- 0
sbc hl,de
ret z
ld a,10000000b
or d
ld h,a
ld l,e
ld b,(hl) ; [B] = Rx Data
inc de
res 6,d
ld (rx_end),de
ld a,b ; **********
call led_display ; **********
ld a,(disp_main)
cp 1
jp nz,_non_momitor
ld a,b
cp 0f0h
ret nc
add_set mon_erase
lcd_add
ld a,' '
lcd_out
lcd_out
inc_chk mon_erase,104
add_set mon_write
lcd_add
ld a,b
srl a
srl a
srl a
srl a
ld l,a
ld h,0
ld de,hex_table
add hl,de
ld a,(hl)
lcd_out
ld a,b
and 00001111b
ld l,a
ld h,0
ld de,hex_table
add hl,de
ld a,(hl)
lcd_out
inc_chk mon_write,104
ret
hex_table:
db '0123456789ABCDEF'
monitor_add:
dw 1,4,7,10,13,16,19,22,25,28,31,34,37
dw 41,44,47,50,53,56,59,62,65,68,71,74,77
dw 81,84,87,90,93,96,99,102,105,108,111,114,117
dw 121,124,127,130,133,136,139,142,145,148,151,154,157
dw 161,164,167,170,173,176,179,182,185,188,191,194,197
dw 201,204,207,210,213,216,219,222,225,228,231,234,237
dw 241,244,247,250,253,256,259,262,265,268,271,274,277
dw 281,284,287,290,293,296,299,302,305,308,311,314,317
_non_momitor:
bit 7,b
jp z,_m_50 ; running
ld a,b
cp 0f8h
ret nc
brc 0f0h,_m_10
clear rsb
ret
_m_10:
ld a,b
and 00001111b
ld (channel),a
ld a,b
and 11110000b
ld (rsb),a
clear dcb
ret
_m_50:
ld a,(rsb)
cp 0
ret z
cp 0c0h
ret z
cp 0d0h
ret z
ld a,(dcb)
cp 0
jp nz,_m_90
inc a
ld (dcb),a
ld a,b
ld (keyno),a
ret
_m_90:
clear dcb
ld a,(disp_main)
cp 2
ret nz
ld a,(rsb)
cp 0a0h
ret nz
ld a,(channel)
cp 00fh
ret nz
ld a,(keyno)
cp 95
ret nz
ld a,b
ld (disp_data),a
brc 200,_d_22
sub 200
ld (disp_data),a
move ddd+4,2
jp _d_2
_d_22:
brc 100,_d_1
sub 100
ld (disp_data),a
move ddd+4,1
jp _d_2
_d_1:
move ddd+4,0
ld a,(disp_data)
cp 10
jp nc,_d_2
move ddd+3,0
jp _d_15
_d_2:
ld a,(disp_data)
brc 90,_d_3
sub 90
ld (disp_data),a
move ddd+3,9
jp _d_15
_d_3:
brc 80,_d_4
sub 80
ld (disp_data),a
move ddd+3,8
jp _d_15
_d_4:
brc 70,_d_5
sub 70
ld (disp_data),a
move ddd+3,7
jp _d_15
_d_5:
brc 60,_d_6
sub 60
ld (disp_data),a
move ddd+3,6
jp _d_15
_d_6:
brc 50,_d_7
sub 50
ld (disp_data),a
move ddd+3,5
jp _d_15
_d_7:
brc 40,_d_8
sub 40
ld (disp_data),a
move ddd+3,4
jp _d_15
_d_8:
brc 30,_d_9
sub 30
ld (disp_data),a
move ddd+3,3
jp _d_15
_d_9:
brc 20,_d_10
sub 20
ld (disp_data),a
move ddd+3,2
jp _d_15
_d_10:
brc 10,_d_11
sub 10
ld (disp_data),a
move ddd+3,1
jp _d_15
_d_11:
move ddd+3,0
_d_15:
ld a,(disp_data)
ld (ddd+2),a
move ddd+0,28 ; Start Point (X)
ld a,(ddd+2)
call bar_char_sub
move ddd+0,15 ; Start Point (X)
ld a,(ddd+3)
call bar_char_sub
move ddd+0,2 ; Start Point (X)
ld a,(ddd+4)
call bar_char_sub
ret
bar_char_sub:
add a,a
ld l,a
ld h,0
ld de,bar_select
add hl,de
ld e,(hl)
inc hl
ld d,(hl) ; [DE] = Dot Data
clear ddd+1 ; Start Point (Y)
_d_20:
ld a,(ddd+1)
add a,a
ld l,a
ld h,0
ld bc,bar_y_sel
add hl,bc
ld c,(hl)
inc hl
ld b,(hl)
ld a,(ddd+0)
ld l,a
ld h,0
add hl,bc ; [HL] = Draw Point
lcd_add
ld b,10
_d_30:
ld a,(de)
brz 0,_d_32
ld a,0ffh
jp _d_35
_d_32:
ld a,' '
_d_35:
lcd_out
inc de
dec b
jp nz,_d_30
inc_a ddd+1
cp 8
jp nz,_d_20
ret
bar_select:
dw bar_char_0,bar_char_1,bar_char_2,bar_char_3,bar_char_4
dw bar_char_5,bar_char_6,bar_char_7,bar_char_8,bar_char_9
bar_y_sel:
dw 0,40,80,120,160,200,240,280
bar_char_0:
db 0,1,1,1,1,1,1,1,1,0
db 1,1,1,0,0,0,0,1,1,1
db 1,1,1,0,0,0,0,1,1,1
db 1,1,1,0,0,0,0,1,1,1
db 1,1,1,0,0,0,0,1,1,1
db 1,1,1,0,0,0,0,1,1,1
db 1,1,1,0,0,0,0,1,1,1
db 0,1,1,1,1,1,1,1,1,0
bar_char_1:
db 0,0,0,1,1,1,1,0,0,0
db 0,0,1,1,1,1,1,0,0,0
db 0,0,0,0,1,1,1,0,0,0
db 0,0,0,0,1,1,1,0,0,0
db 0,0,0,0,1,1,1,0,0,0
db 0,0,0,0,1,1,1,0,0,0
db 0,0,0,0,1,1,1,0,0,0
db 0,1,1,1,1,1,1,1,1,0
bar_char_2:
db 1,1,1,1,1,1,1,1,1,1
db 1,1,1,0,0,0,0,1,1,1
db 1,1,1,0,0,0,0,1,1,1
db 0,0,0,0,0,0,0,1,1,1
db 1,1,1,1,1,1,1,1,1,1
db 1,1,1,0,0,0,0,0,0,0
db 1,1,1,0,0,0,0,1,1,1
db 1,1,1,1,1,1,1,1,1,1
bar_char_3:
db 1,1,1,1,1,1,1,1,1,1
db 1,1,1,0,0,0,0,1,1,1
db 0,0,0,0,0,0,0,1,1,1
db 0,0,0,0,1,1,1,1,1,1
db 0,0,0,0,0,0,0,1,1,1
db 0,0,0,0,0,0,0,1,1,1
db 1,1,1,0,0,0,0,1,1,1
db 1,1,1,1,1,1,1,1,1,1
bar_char_4:
db 0,0,0,0,0,1,1,1,0,0
db 0,0,0,0,0,1,1,1,0,0
db 1,1,1,0,0,1,1,1,0,0
db 1,1,1,0,0,1,1,1,0,0
db 1,1,1,0,0,1,1,1,0,0
db 1,1,1,1,1,1,1,1,1,1
db 0,0,0,0,0,1,1,1,0,0
db 0,0,0,0,0,1,1,1,0,0
bar_char_5:
db 1,1,1,1,1,1,1,1,1,1
db 1,1,1,0,0,0,0,0,0,0
db 1,1,1,0,0,0,0,0,0,0
db 1,1,1,1,1,1,1,1,1,1
db 0,0,0,0,0,0,0,1,1,1
db 0,0,0,0,0,0,0,1,1,1
db 1,1,1,0,0,0,0,1,1,1
db 1,1,1,1,1,1,1,1,1,1
bar_char_6:
db 1,1,1,1,1,1,1,1,1,1
db 1,1,1,0,0,0,0,1,1,1
db 1,1,1,0,0,0,0,0,0,0
db 1,1,1,0,0,0,0,0,0,0
db 1,1,1,1,1,1,1,1,1,1
db 1,1,1,0,0,0,0,1,1,1
db 1,1,1,0,0,0,0,1,1,1
db 1,1,1,1,1,1,1,1,1,1
bar_char_7:
db 1,1,1,1,1,1,1,1,1,1
db 1,1,1,0,0,0,0,1,1,1
db 1,1,1,0,0,0,0,1,1,1
db 0,0,0,0,0,0,0,1,1,1
db 0,0,0,0,0,0,0,1,1,1
db 0,0,0,0,0,0,0,1,1,1
db 0,0,0,0,0,0,0,1,1,1
db 0,0,0,0,0,0,0,1,1,1
bar_char_8:
db 1,1,1,1,1,1,1,1,1,1
db 1,1,1,0,0,0,0,1,1,1
db 1,1,1,0,0,0,0,1,1,1
db 0,1,1,1,1,1,1,1,1,0
db 1,1,1,1,1,1,1,1,1,1
db 1,1,1,0,0,0,0,1,1,1
db 1,1,1,0,0,0,0,1,1,1
db 1,1,1,1,1,1,1,1,1,1
bar_char_9:
db 1,1,1,1,1,1,1,1,1,1
db 1,1,1,0,0,0,0,1,1,1
db 1,1,1,0,0,0,0,1,1,1
db 1,1,1,1,1,1,1,1,1,1
db 0,0,0,0,0,0,0,1,1,1
db 0,0,0,0,0,0,0,1,1,1
db 1,1,1,0,0,0,0,1,1,1
db 1,1,1,1,1,1,1,1,1,1
;##### LCD Screens #####
lcd_initial_set:
; <LCD System Set>
lcd_set 40h ; System Set
lcd_put 30h ; Screen
lcd_put 85h ; Field(X)
lcd_put 7 ; Field(Y)
lcd_put 39 ; C/R
lcd_put 48 ; TC/R
lcd_put 3fh ; L/F
lcd_put 40 ; APL
lcd_put 0 ; APH
; <Scroll>
lcd_set 44h ; Scroll
lcd_put 0 ; Start Address #1(L)
lcd_put 0 ; (H)
lcd_put 40h ; Line #1
lcd_put 0 ; Start Address #2(L)
lcd_put 10h ; (H)
lcd_put 40h ; Line #2
; <HDot Scroll>
lcd_set 5ah ; HDot Scroll
lcd_put 0 ; Scroll=0
; <Ovlay>
lcd_set 5bh ; Overlay
lcd_put 01h ; Character + Graphic
; <Disp ON/OFF>
lcd_set 58h ; Display OFF
lcd_put 14h ; Parameter
; <Csr Form>
lcd_set 5dh ; Cursor Form
lcd_put 04h ; X=5
lcd_put 86h ; Y=7
lcd_set 4ch ; Right
lcd_set 46h ; Address Set
lcd_put 0
lcd_put 0
; <Erase>
lcd_set 52h ; Erase
call wait_long
call wait_long
call wait_long
lcd_set 59h ; Display ON
lcd_put 14h ; Cursor OFF
ret
init_menu:
;;;; call lcd_initial_set
clear disp_main
clear disp_sub
clear rx_top
clear rx_end
clear rsb
clear dcb
lcd_mes 1,1,init_mess_1
lcd_mes 2,1,init_mess_2
lcd_mes 3,1,init_mess_3
lcd_mes 4,1,init_mess_4
lcd_mes 5,1,init_mess_5
lcd_mes 6,1,init_mess_6
lcd_mes 7,1,init_mess_7
lcd_mes 8,1,init_mess_8
call disp_cursor
ret
init_mess_1: db '=== (^_^) MIDI DISPLAY by Y.N (^_^) ===',tail
init_mess_2: db '| |',tail
init_mess_3: db '| [A] Universal MIDI Stream Monitor |',tail
init_mess_4: db '| [B] "Chaotic Grains" Bar Counter |',tail
init_mess_5: db '| [C] (reserved) |',tail
init_mess_6: db '| [D] (reserved) |',tail
init_mess_7: db '| [E] (reserved) |',tail
init_mess_8: db '|______________________________________|',tail
clear_screen:
lcd_mes 1,1,init_mess_0
lcd_mes 2,1,init_mess_0
lcd_mes 3,1,init_mess_0
lcd_mes 4,1,init_mess_0
lcd_mes 5,1,init_mess_0
lcd_mes 6,1,init_mess_0
lcd_mes 7,1,init_mess_0
lcd_mes 8,1,init_mess_0
ret
init_mess_0: db ' ',tail
disp_momitor:
call clear_screen
move mon_write,0
move mon_erase,16
move disp_main,1
ret
disp_bar:
call clear_screen
move disp_main,2
ret
;##### Subroutines #####
wait_long:
ld b,0ffh
1$:
call wait_sub
dec b
jr nz,1$
ret
wait_sub:
ld a,0ffh
1$:
nop
dec a
jr nz,1$
ret
led_display:
xor 0ffh
out (pio_a+0),a
io_put pio_b,80h
io_put pio_b,0
ret
lcd_disp_mess:
lcd_add
1$:
ld a,(de)
cp tail
ret z
out (lcd),a
inc de
jp 1$
sw_scan:
inc_a sw_status+0
cp 50
ret c
clear sw_status+0
ld a,(sw_status+1) ; Old Status = [B]
ld b,a
in a,(pio_b)
and 00000011b
ld (sw_status+1),a ; Newest Status = [C]
ld c,a
xor b
ret z ; Non Event
ld a,c
brz 00000011b,init_menu ; Both ON
cp 0
ret z ; Both OFF
ld a,b
cp 0
ret nz ; Off Event
ld a,c
brz 00000010b,_20$ ; SW(1) ON
brz 00000001b,_30$ ; SW(2) ON
ret
_20$:
inc_chk disp_sub,5
call disp_cursor
ret
_30$:
ld a,(disp_main)
cp 1
ret z
cp 2
ret z
brz 0,_disp_menu
ret
_disp_menu:
ld a,(disp_sub)
brz 0,disp_momitor
brz 1,disp_bar
ret
disp_cursor:
ld a,(disp_main)
brz 0,_disp_main
ret
_disp_main:
ld a,(disp_sub)
brz 0,10$_
brz 1,20$_
brz 2,30$_
brz 3,40$_
brz 4,50$_
ret
10$_:
lcd_mes 3,3,_21_
lcd_mes 4,3,_12_
lcd_mes 5,3,_13_
lcd_mes 6,3,_14_
lcd_mes 7,3,_15_
ret
20$_:
lcd_mes 3,3,_11_
lcd_mes 4,3,_22_
lcd_mes 5,3,_13_
lcd_mes 6,3,_14_
lcd_mes 7,3,_15_
ret
30$_:
lcd_mes 3,3,_11_
lcd_mes 4,3,_12_
lcd_mes 5,3,_23_
lcd_mes 6,3,_14_
lcd_mes 7,3,_15_
ret
40$_:
lcd_mes 3,3,_11_
lcd_mes 4,3,_12_
lcd_mes 5,3,_13_
lcd_mes 6,3,_24_
lcd_mes 7,3,_15_
ret
50$_:
lcd_mes 3,3,_11_
lcd_mes 4,3,_12_
lcd_mes 5,3,_13_
lcd_mes 6,3,_14_
lcd_mes 7,3,_25_
ret
_11_: db ' [A] ',tail
_12_: db ' [B] ',tail
_13_: db ' [C] ',tail
_14_: db ' [D] ',tail
_15_: db ' [E] ',tail
_21_: db 0ffh,'[A]',0ffh,tail
_22_: db 0ffh,'[B]',0ffh,tail
_23_: db 0ffh,'[C]',0ffh,tail
_24_: db 0ffh,'[D]',0ffh,tail
_25_: db 0ffh,'[E]',0ffh,tail
end
;----------------------------------------------------------------------- ; Power Glove Interface : April.1993 ;----------------------------------------------------------------------- ;##### RAM Map ##### dseg org 0000h tx_fifo ds 256 tx_top ds 1 tx_end ds 1 timer_flag ds 4 glove_status ds 1 x_value ds 2 y_value ds 2 counts ds 4 channel ds 1 ;##### I/O Map ##### cseg ctc_0 equ 0010h s_gen equ 0017h sio_a equ 0018h sio_b equ 001ah pio_a equ 001ch pio_b equ 001eh led_up equ 0080h led_down equ 0081h led_left equ 0082h led_right equ 0083h ;##### MACRO ##### io_set macro @1,@2 ld a,@2 out (@1+1),a endm io_put macro @1,@2 ld a,@2 out (@1+0),a endm ;##### RESET ##### org 0000h ld sp,0ffffh di jp main ;##### INT / NMI ##### org 0020h dw _timer_ _timer_: ex af,af' ld a,1 ld (timer_flag+0),a ex af,af' ei reti org 0066h retn ;##### Data Table ##### org 0100h display_table_1: db 10h,10h,10h,10h,10h,10h,10h,10h ; 1 - 8 db 18h,18h,18h,18h,18h,18h,18h,18h ; 9 - 16 db 08h,08h,08h,08h,0ch,0ch,0ch,0ch ; 17 - 24 db 0ch,0ch,0ch,0ch,04h,04h,04h,04h ; 25 - 32 db 06h,06h,06h,06h,06h,06h,06h,06h ; 33 - 40 db 02h,02h,02h,02h,03h,03h,03h,03h ; 41 - 48 db 03h,03h,03h,03h,01h,01h,01h,01h ; 49 - 56 db 01h,01h,01h,01h,01h,01h,01h,01h ; 57 - 64 db 01h,01h,01h,01h,01h,01h,01h,01h ; 65 - 72 db 00h,00h,00h,00h,00h,00h,00h,00h ; 73 - 80 db 00h,00h,00h,00h,00h,00h,00h,00h ; 81 - 88 db 00h,00h,00h,00h,00h,00h,00h,00h ; 89 - 96 db 00h,00h,00h,00h,00h,00h,00h,00h ; 97 - 104 db 00h,00h,00h,00h,00h,00h,00h,00h ; 105 - 112 db 00h,00h,00h,00h,00h,00h,00h,00h ; 113 - 120 db 00h,00h,00h,00h,00h,00h,00h,00h ; 121 - 128 org 0200h display_table_2: db 10h,10h,10h,10h,10h,10h,10h,10h ; 1 - 8 db 10h,10h,10h,10h,08h,08h,08h,08h ; 9 - 16 db 08h,08h,08h,08h,08h,08h,08h,08h ; 17 - 24 db 04h,04h,04h,04h,04h,04h,04h,04h ; 25 - 32 db 04h,04h,04h,04h,02h,02h,02h,02h ; 33 - 40 db 02h,02h,02h,02h,02h,02h,02h,02h ; 41 - 48 db 01h,01h,01h,01h,01h,01h,01h,01h ; 49 - 56 db 01h,01h,01h,01h,01h,01h,01h,01h ; 57 - 64 db 01h,01h,01h,01h,00h,00h,00h,00h ; 65 - 72 db 00h,00h,00h,00h,00h,00h,00h,00h ; 73 - 80 db 00h,00h,00h,00h,00h,00h,00h,00h ; 81 - 88 db 00h,00h,00h,00h,00h,00h,00h,00h ; 89 - 96 db 00h,00h,00h,00h,00h,00h,00h,00h ; 97 - 104 db 00h,00h,00h,00h,00h,00h,00h,00h ; 105 - 112 db 00h,00h,00h,00h,00h,00h,00h,00h ; 113 - 120 db 00h,00h,00h,00h,00h,00h,00h,00h ; 121 - 128 org 0300h display_table_3: db 00h,00h,00h,00h,00h,00h,00h,00h ; 1 - 8 db 00h,00h,00h,00h,00h,00h,00h,00h ; 9 - 16 db 00h,00h,00h,00h,00h,00h,00h,00h ; 17 - 24 db 00h,00h,00h,00h,00h,00h,00h,00h ; 25 - 32 db 00h,00h,00h,00h,00h,00h,00h,00h ; 33 - 40 db 00h,00h,00h,00h,00h,00h,00h,00h ; 41 - 48 db 00h,00h,00h,00h,00h,00h,00h,00h ; 49 - 56 db 01h,01h,01h,01h,01h,01h,01h,01h ; 57 - 64 db 01h,01h,01h,01h,01h,01h,01h,01h ; 65 - 72 db 01h,01h,01h,01h,03h,03h,03h,03h ; 73 - 80 db 03h,03h,03h,03h,02h,02h,02h,02h ; 81 - 88 db 06h,06h,06h,06h,06h,06h,06h,06h ; 89 - 96 db 04h,04h,04h,04h,0ch,0ch,0ch,0ch ; 97 - 104 db 0ch,0ch,0ch,0ch,08h,08h,08h,08h ; 105 - 112 db 18h,18h,18h,18h,18h,18h,18h,18h ; 113 - 120 db 10h,10h,10h,10h,10h,10h,10h,10h ; 121 - 128 org 0400h display_table_4: db 00h,00h,00h,00h,00h,00h,00h,00h ; 1 - 8 db 00h,00h,00h,00h,00h,00h,00h,00h ; 9 - 16 db 00h,00h,00h,00h,00h,00h,00h,00h ; 17 - 24 db 00h,00h,00h,00h,00h,00h,00h,00h ; 25 - 32 db 00h,00h,00h,00h,00h,00h,00h,00h ; 33 - 40 db 00h,00h,00h,00h,00h,00h,00h,00h ; 41 - 48 db 00h,00h,00h,00h,00h,00h,00h,00h ; 49 - 56 db 00h,00h,00h,00h,01h,01h,01h,01h ; 57 - 64 db 01h,01h,01h,01h,01h,01h,01h,01h ; 65 - 72 db 01h,01h,01h,01h,01h,01h,01h,01h ; 73 - 80 db 02h,02h,02h,02h,02h,02h,02h,02h ; 81 - 88 db 02h,02h,02h,02h,04h,04h,04h,04h ; 89 - 96 db 04h,04h,04h,04h,04h,04h,04h,04h ; 97 - 104 db 08h,08h,08h,08h,08h,08h,08h,08h ; 105 - 112 db 08h,08h,08h,08h,10h,10h,10h,10h ; 113 - 120 db 10h,10h,10h,10h,10h,10h,10h,10h ; 121 - 128 ;##### Main ##### main: ld hl,08000h ld a,090h _ram_clear_loop: ld (hl),0 inc hl cp h jr nc,_ram_clear_loop io_put led_up,0ffh io_put led_down,0ffh io_put led_right,0ffh io_put led_left,0ffh io_set pio_a,0cfh ; Mode 3 io_set pio_a,00001111b ; 0:Out / 1:In io_set pio_a,007h ; Interrupt Disable io_set pio_b,0cfh ; Mode 3 io_set pio_b,00000000b ; 0:Out / 1:In io_set pio_b,007h ; Interrupt Disable io_put pio_a,10000000b io_put pio_b,0ffh io_put s_gen,00000000b ; Clock Generator io_set sio_a,00011000b ; Channel Reset A io_set sio_a,00000100b ; Resister Point = 4 io_set sio_a,10000100b ; Mode io_set sio_a,00000001b ; Resister Point = 1 io_set sio_a,00000000b ; Interrupt Mode io_set sio_a,00000101b ; Resister Point = 5 io_set sio_a,01101000b ; Transmit Start io_put ctc_0,20h ; Int. Address io_put ctc_0,10100101b io_put ctc_0,80 ; about 5msec ld a,0eh ld (channel),a call centering im 2 ei loop: call glove_scan call display_timer call tx_data_check jr loop ;##### Subroutines ##### x_value_set: ld a,(x_value+1) ld b,a ld a,(x_value) cp b ret z ld (x_value+1),a ld a,(channel) or 0b0h ld b,a call tx_data_set ld b,10 call tx_data_set ld a,(x_value) ld b,a call tx_data_set call x_value_disp ret y_value_set: ld a,(y_value+1) ld b,a ld a,(y_value) cp b ret z ld (y_value+1),a ld a,(channel) or 0b0h ld b,a call tx_data_set ld b,7 call tx_data_set ld a,(y_value) ld b,a call tx_data_set call y_value_disp ret tx_data_check: ld a,(tx_end) ld b,a ld a,(tx_top) cp b ret z io_set sio_a,00000000b ; Resister Point = 0 in a,(sio_a+1) bit 2,a ret z ld hl,tx_fifo ld l,b ld a,(hl) out (sio_a),a ld a,b inc a ld (tx_end),a ret tx_data_set: ld hl,tx_fifo ld a,(tx_top) ld l,a inc a ld (tx_top),a ld (hl),b ret centering: ld a,040h ld (x_value),a ld (y_value),a call x_value_set call y_value_set ret ;##### Panel LED Display ##### display_timer: ld a,(timer_flag+1) cp 50 ; about 250msec ret c xor a ld (timer_flag+1),a ld a,(timer_flag+2) inc a ld (timer_flag+2),a call x_value_disp call y_value_disp xor a ld (counts+0),a ld (counts+1),a ld (counts+2),a ld (counts+3),a ret x_value_disp: ld a,(timer_flag+2) bit 0,a jr nz,_x_disp_off ld hl,display_table_3 ld de,display_table_1 jr _x_disp_mix _x_disp_off: ld hl,display_table_4 ld de,display_table_2 _x_disp_mix: ld a,(x_value) ld l,a ld a,(hl) xor 0ffh out (led_right),a ld h,d ld a,(hl) xor 0ffh out (led_left),a ret y_value_disp: ld a,(timer_flag+2) bit 0,a jr z,_y_disp_off ld hl,display_table_3 ld de,display_table_1 jr _y_disp_mix _y_disp_off: ld hl,display_table_4 ld de,display_table_2 _y_disp_mix: ld a,(y_value) ld l,a ld a,(hl) xor 0ffh out (led_up),a ld h,d ld a,(hl) xor 0ffh out (led_down),a ret ;##### Power Glove Event Check ##### ;------------------------------------------------------------------------* ; Bit : 7 6 5 4 3 2 1 0 | ; right left down up start select first(B) thumb(A) | ;------------------------------------------------------------------------* glove_check: ld a,(glove_status) and 00001100b jr z,_glove_cont call centering ret _glove_cont: ld a,(glove_status) bit 1,a jp z,_glove_2 ld c,3 ; Fast Skip ld a,(glove_status) bit 4,a ; Up ? jr z,_glove_1 ld a,(counts+0) add a,c ld (counts+0),a bit 3,a jr z,_glove_1 ld a,(y_value) cp 7fh jr z,_glove_1 inc a ld (y_value),a call y_value_set xor a ld (counts+0),a ld (counts+1),a _glove_1: ld a,(glove_status) bit 5,a ; Down ? jr z,_glove_2 ld a,(counts+1) add a,c ld (counts+1),a bit 3,a jr z,_glove_2 ld a,(y_value) cp 0 jr z,_glove_2 dec a ld (y_value),a call y_value_set xor a ld (counts+0),a ld (counts+1),a _glove_2: ld a,(glove_status) bit 0,a ret z ld c,2 ; Slow Skip ld a,(glove_status) bit 6,a ; Left ? jr z,_glove_3 ld a,(counts+2) add a,c ld (counts+2),a bit 3,a jr z,_glove_3 ld a,(x_value) cp 0 jr z,_glove_3 dec a ld (x_value),a call x_value_set xor a ld (counts+2),a ld (counts+3),a _glove_3: ld a,(glove_status) bit 7,a ; Right ? ret z ld a,(counts+3) add a,c ld (counts+3),a bit 3,a ret z ld a,(x_value) cp 7fh ret z inc a ld (x_value),a call x_value_set xor a ld (counts+2),a ld (counts+3),a ret ;##### Power Glove Status Scan ##### glove_scan: ld a,(timer_flag+0) cp 0 ret z xor a ld (timer_flag+0),a ld a,(timer_flag+1) inc a ld (timer_flag+1),a ld b,0 call p_s_pulse in a,(pio_a) bit 0,a jr z,1$ set 0,b 1$: call clock_shift in a,(pio_a) bit 0,a jr z,2$ set 1,b 2$: call clock_shift in a,(pio_a) bit 0,a jr z,3$ set 2,b 3$: call clock_shift in a,(pio_a) bit 0,a jr z,4$ set 3,b 4$: call clock_shift in a,(pio_a) bit 0,a jr z,5$ set 4,b 5$: call clock_shift in a,(pio_a) bit 0,a jr z,6$ set 5,b 6$: call clock_shift in a,(pio_a) bit 0,a jr z,7$ set 6,b 7$: call clock_shift in a,(pio_a) bit 0,a jr z,8$ set 7,b 8$: call clock_shift ld a,b out (pio_b),a xor 0ffh ld (glove_status),a ; New Status call glove_check ret p_s_pulse: io_put pio_a,11000000b nop nop io_put pio_a,10000000b ret clock_shift: io_put pio_a,00000000b nop nop io_put pio_a,10000000b ret end
;----------------------------------------------------------------------- ; [PEGASUS-5] MIDI Merge / Video Control Box : December.1993 ;----------------------------------------------------------------------- ;##### RAM Map ##### dseg org 0000h rx_fifo_0 ds 4096 rx_fifo_1 ds 4096 rx_fifo_2 ds 4096 rx_fifo_3 ds 4096 tx_fifo_0 ds 4096 tx_fifo_1 ds 4096 tx_fifo_2 ds 4096 rx_top_0 ds 2 rx_end_0 ds 2 rx_top_1 ds 2 rx_end_1 ds 2 rx_top_2 ds 2 rx_end_2 ds 2 rx_top_3 ds 2 rx_end_3 ds 2 tx_top_0 ds 2 tx_end_0 ds 2 tx_top_1 ds 2 tx_end_1 ds 2 tx_top_2 ds 2 tx_end_2 ds 2 rx_data ds 4 rsb ds 4 dcb ds 4 channel ds 4 keyno ds 4 cg_note ds 1 cg_velocity ds 1 power_timer ds 2 led_timer ds 8 led_mode ds 1 led_data ds 1 glove_tim ds 1 glove_old ds 1 ;##### I/O Map ##### cseg sio_a equ 0018h ; for Glove Rx sio_b equ 001ah ; for Glove Rx pio_a equ 001ch pio_b equ 001eh uart_0 equ 0080h uart_1 equ 0084h uart_2 equ 0088h uart_3 equ 008ch ;##### MACRO ##### all_out macro @1 ld a,@1 out (uart_0+1),a out (uart_1+1),a out (uart_2+1),a out (uart_3+1),a endm pio_set macro @1,@2 ld a,@2 out (@1+1),a endm io_set macro @1,@2 ld a,@2 out (@1+1),a endm io_put macro @1,@2 ld a,@2 out (@1+0),a endm led_res macro @1 ld a,(led_timer+@1) cp 0 ret z dec a ld (led_timer+@1),a ret nz ld a,(led_data) res @1,a ld (led_data),a call led_disp ret endm led_set macro @1 ld a,20 ld (led_timer+@1),a ld a,(led_data) set @1,a ld (led_data),a call led_disp endm rx_set macro @1,@2,@3 ld de,(@3) ld a,@1 or d ld h,a ld l,e in a,(@2+0) ld (hl),a inc de res 4,d ld (@3),de ret endm tx_set macro @1,@3 ld de,(@3) ld a,@1 or d ld h,a ld l,e ld (hl),b inc de res 4,d ld (@3),de ret endm tx_chk macro @1,@2,@3,@4 in a,(@4+1) bit 0,a ret z ld de,(@2) ld hl,(@1) and a ; CY <-- 0 sbc hl,de ret z ld a,@3 or d ld h,a ld l,e ld a,(hl) out (@4),a inc de res 4,d ld (@2),de ret endm rx_chk macro @1,@2,@3,@4 ld de,(@2) ld hl,(@1) and a ; CY <-- 0 sbc hl,de ret z ld a,@3 or d ld h,a ld l,e ld b,(hl) ; [B] = Rx Data inc de res 4,d ld (@2),de bit 7,b jr z,50$ ; running ld a,b cp 0f8h ret nc cp 0f0h jr c,20$ xor a ld (rsb+@4),a ret 20$: led_set @4+4 ld a,b and 11110000b ld (rsb+@4),a xor a ld (dcb+@4),a ret 50$: led_set @4+4 ld a,(rsb+@4) cp 0 ret z cp 0c0h jr z,70$ cp 0d0h jr z,70$ ld a,(dcb+@4) cp 0 jr nz,90$ inc a ld (dcb+@4),a ld a,b ld (keyno+@4),a ret 70$: ld c,b ld a,(rsb+@4) or 0fh ld b,a call tx_fifo_set_0 ld b,c call tx_fifo_set_0 led_set 7 ret 90$: xor a ld (dcb+@4),a ld c,b ld a,(rsb+@4) or 0fh ld b,a call tx_fifo_set_0 ld a,(keyno+@4) ld b,a call tx_fifo_set_0 ld b,c call tx_fifo_set_0 led_set 7 ret endm ;##### RESET ##### org 0000h ld sp,0ffffh di im 1 call initialize ei jp loop ;##### INT / NMI ##### org 0038h ex af,af' exx call int_sequence exx ex af,af' ei reti org 0066h ei retn int_sequence: in a,(uart_3+1) bit 1,a jr z,_next_1 rx_set 10110000b,uart_3,rx_top_3 _next_1: in a,(uart_1+1) bit 1,a jr z,_next_2 rx_set 10010000b,uart_1,rx_top_1 _next_2: in a,(uart_2+1) bit 1,a jr z,_next_3 rx_set 10100000b,uart_2,rx_top_2 _next_3: in a,(uart_0+1) bit 1,a ret z rx_set 10000000b,uart_0,rx_top_0 ;##### MIDI Transmit Data Set : Input=[B] ##### tx_fifo_set_0: tx_set 11000000b,tx_top_0 tx_fifo_set_1: tx_set 11010000b,tx_top_1 tx_fifo_set_2: tx_set 11100000b,tx_top_2 ;##### MIDI Transmit Check ##### tx_check_0: tx_chk tx_top_0,tx_end_0,11000000b,uart_0 tx_check_1: tx_chk tx_top_1,tx_end_1,11010000b,uart_1 tx_check: tx_chk tx_top_2,tx_end_2,11100000b,uart_2 ;##### MIDI Receive Check ##### rx_fifo_0_check: rx_chk rx_top_0,rx_end_0,10000000b,0 rx_fifo_1_check: rx_chk rx_top_1,rx_end_1,10010000b,1 rx_fifo_2_check: rx_chk rx_top_2,rx_end_2,10100000b,2 rx_fifo_3_check: ld de,(rx_end_3) ld hl,(rx_top_3) and a ; CY <-- 0 sbc hl,de ret z ld a,10110000b or d ld h,a ld l,e ld b,(hl) ; [B] = Rx Data inc de res 4,d ld (rx_end_3),de bit 7,b jr z,50$ ; running ld a,b cp 0f8h ret nc cp 0f0h jr c,20$ 11$: xor a ld (rsb+3),a ret 20$: ld a,b and 00001111b cp 0fh ; !! [F] Channel Only !! jr nz,11$ ; !!!!!!!!!!!!!!!!!!!!!! ld (channel+3),a ld a,b and 11110000b ld (rsb+3),a xor a ld (dcb+3),a led_set 1 ret 50$: ld a,(rsb+3) cp 0 ret z cp 0c0h jr z,70$ cp 0d0h jr z,70$ ld a,(dcb+3) cp 0 jr nz,90$ inc a ld (dcb+3),a ld a,b ld (keyno+3),a ret 70$: led_set 1 ld c,b ld a,(rsb+3) ld d,a ld a,(channel+3) or d ld b,a call tx_fifo_set_0 ld b,c call tx_fifo_set_0 led_set 7 ret 90$: led_set 1 xor a ld (dcb+3),a ld c,b ld a,(rsb+3) ld d,a ld a,(channel+3) or d ld b,a call tx_fifo_set_0 ld a,(keyno+3) ld b,a call tx_fifo_set_0 ld b,c call tx_fifo_set_0 led_set 7 ld a,(rsb+3) cp 0a0h ret nz ld a,(keyno+3) cp 96 jp z,hit_96 cp 97 jp z,hit_97 cp 98 jp z,hit_98 cp 99 jp z,hit_99 cp 100 jp z,hit_100 cp 101 jp z,hit_101 cp 102 jp z,hit_102 ret hit_96: ld a,c sla a ; !!!!! bit[0] = 71051 RESET !!!!! out (pio_a+0),a ; 000000000 - 11111110 ret hit_97: ld b,09ch call tx_fifo_set_1 ld b,c call tx_fifo_set_1 ld b,040h call tx_fifo_set_1 led_set 2 ret hit_98: ld a,c ld (cg_note),a _hit_98_99: ld b,09dh call tx_fifo_set_2 ld a,(cg_note) ld b,a call tx_fifo_set_2 ld a,(cg_velocity) ld b,a call tx_fifo_set_2 led_set 3 ret hit_99: ld a,c ld (cg_velocity),a jr _hit_98_99 hit_100: ld b,0bdh call tx_fifo_set_2 ld b,1 call tx_fifo_set_2 ld b,c call tx_fifo_set_2 led_set 3 ret hit_101: ld b,0edh call tx_fifo_set_2 ld b,0 call tx_fifo_set_2 ld b,c call tx_fifo_set_2 led_set 3 ret hit_102: ret ;##### Main Program ##### loop: call rx_fifo_0_check call tx_check_0 call rx_fifo_1_check call tx_check_1 call rx_fifo_2_check call tx_check_2 call rx_fifo_3_check call led_display call glove_check jr loop ;##### INITIALIZE ##### initialize: ld hl,0f000h ld a,0f8h _ram_clear_loop: ld (hl),0 inc hl cp h jr nc,_ram_clear_loop pio_set pio_a,0cfh ; Mode 3 pio_set pio_a,00000000b ; 0:Out / 1:In pio_set pio_a,007h ; Interrupt Disable ld a,00000001b out (pio_a+0),a call wait_long ld a,0 out (pio_a+0),a pio_set pio_b,0cfh ; Mode 3 pio_set pio_b,00000000b ; 0:Out / 1:In pio_set pio_b,007h ; Interrupt Disable ld a,00000001b ld (led_data),a call led_disp call wait_long io_set sio_a,00011000b ; Channel Reset A io_set sio_a,00000100b ; Resister Point = 4 io_set sio_a,00000000b ; Mode io_set sio_b,00011000b ; Channel Reset B io_set sio_b,00000100b ; Resister Point = 4 io_set sio_b,00000000b ; Mode io_set sio_a,00010000b ; clear io_set sio_b,00010000b ; clear all_out 0 all_out 0 all_out 0 call wait_long all_out 01000000b all_out 01001110b all_out 00000101b ld a,0fch out (uart_0+0),a out (uart_1+0),a out (uart_2+0),a ld a,04ch ld (cg_velocity),a ret wait_long: ld c,15 _wait_long_loop: call wait_mid dec c jr nz,_wait_long_loop ret wait_mid: ld a,15 _wait_mid_loop: call wait_short dec a jr nz,_wait_mid_loop ret wait_short: db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ret ;##### LED Display Routine ##### led_disp: ld a,(led_data) xor 0ffh out (pio_b+0),a ret led_display: call power_timer_chk ld a,(led_mode) inc a and 00000111b ld (led_mode),a cp 1 jp z,led_1 cp 2 jp z,led_2 cp 3 jp z,led_3 cp 4 jp z,led_4 cp 5 jp z,led_5 cp 6 jp z,led_6 cp 7 jp z,led_7 ret led_1: led_res 1 led_2: led_res 2 led_3: led_res 3 led_4: led_res 4 led_5: led_res 5 led_6: led_res 6 led_7: led_res 7 power_timer_chk: ld a,(power_timer+0) dec a ld (power_timer+0),a ret nz ld a,100 ld (power_timer+0),a ld a,(power_timer+1) dec a ld (power_timer+1),a ret nz ld a,50 ld (power_timer+1),a ld a,(led_data) xor 00000001b ld (led_data),a call led_disp ret ;##### Wireless Power Glove Check Routine ##### glove_check: ld a,(glove_tim) dec a ld (glove_tim),a ret nz ld a,20 ld (glove_tim),a ld e,0 in a,(sio_a+1) bit 3,a jr nz,_gl_1 set 0,e _gl_1: bit 5,a jr nz,_gl_2 set 1,e _gl_2: in a,(sio_b+1) bit 3,a jr nz,_gl_3 set 2,e _gl_3: bit 5,a jr nz,_gl_4 set 3,e _gl_4: ld a,(glove_old) cp e ret z ld a,e ld (glove_old),a ld b,0afh call tx_fifo_set_0 ld b,127 call tx_fifo_set_0 ld a,(glove_old) ld b,a call tx_fifo_set_0 io_set sio_a,00010000b ; clear io_set sio_b,00010000b ; clear ret end
;----------------------------------------------------------------------- ; [PEGASUS-7] Sensor Box for "Strange Attractor" : October.1994 ;----------------------------------------------------------------------- ;##### RAM Map ##### dseg org 0000h rx_fifo ds 8192 tx_fifo ds 8192 rx_top ds 2 rx_end ds 2 tx_top ds 2 tx_end ds 2 rsb ds 1 dcb ds 1 channel ds 1 keyno ds 1 timer ds 1 led ds 1 ch_ctr ds 1 ch_status ds 8 bit_mask ds 1 sw ds 1 para ds 3 ;##### I/O Map ##### cseg sio_a equ 0018h sio_b equ 001ah pio_a equ 001ch pio_b equ 001eh ;##### MACRO ##### io_set macro @1,@2 ld a,@2 out (@1+1),a endm io_put macro @1,@2 ld a,@2 out (@1+0),a endm ;##### RESET ##### org 0000h ld sp,0ffffh di jp main ;##### INT / NMI ##### org 0020h dw _midi_ _midi_: ex af,af' exx ld de,(rx_top) ld a,10000000b or d ld h,a ld l,e in a,(sio_a+0) ld (hl),a inc de res 5,d ld (rx_top),de exx ex af,af' ei reti org 0066h retn ;##### Main ##### main: ld hl,08000h ld a,0f0h _ram_clear_loop: ld (hl),0 inc hl cp h jr nc,_ram_clear_loop io_set pio_a,0cfh ; Mode 3 io_set pio_a,00000000b ; 0:Out / 1:In io_set pio_a,007h ; Interrupt Disable io_put pio_a,11111111b ; io_set pio_b,0cfh ; Mode 3 io_set pio_b,11111111b ; 0:Out / 1:In io_set pio_b,007h ; Interrupt Disable io_set sio_b,00011000b ; Channel Reset B io_set sio_b,00000100b ; Resister Point = 4 io_set sio_b,11000100b ; Mode io_set sio_b,00000001b ; Resister Point = 1 io_set sio_b,00000000b ; Interrupt Mode io_set sio_b,00000010b ; Resister Point = 2 io_set sio_b,20h ; Vector Address io_set sio_a,00011000b ; Channel Reset A io_set sio_a,00000100b ; Resister Point = 4 io_set sio_a,11000100b ; Mode io_set sio_a,00000001b ; Resister Point = 1 io_set sio_a,00010000b ; Interrupt Mode io_set sio_a,00000101b ; Resister Point = 5 io_set sio_a,01101000b ; Transmit Start io_set sio_a,00000011b ; Resister Point = 3 io_set sio_a,11000001b ; Receive Start im 2 ei ld a,10 ld (timer),a ld a,10 ld (para+0),a ld a,20 ld (para+1),a ld a,25 ld (para+2),a in a,(sio_a+0) ; dummy read loop: call rx_data_check call tx_data_check call timer_check jr loop ;##### Subroutines ##### led_display: ld c,0 ld a,(led) bit 0,a jr z,1$ set 7,c 1$: bit 1,a jr z,2$ set 6,c 2$: bit 2,a jr z,3$ set 5,c 3$: bit 3,a jr z,4$ set 4,c 4$: bit 4,a jr z,5$ set 3,c 5$: bit 5,a jr z,6$ set 2,c 6$: bit 6,a jr z,7$ set 1,c 7$: bit 7,a jr z,8$ set 0,c 8$: ld a,c xor 0ffh out (pio_a+0),a ret get_mask: ld c,0 ld a,(ch_ctr) cp 0 jr nz,11$ set 0,c jr 18$ 11$: cp 1 jr nz,12$ set 1,c jr 18$ 12$: cp 2 jr nz,13$ set 2,c jr 18$ 13$: cp 3 jr nz,14$ set 3,c jr 18$ 14$: cp 4 jr nz,15$ set 4,c jr 18$ 15$: cp 5 jr nz,16$ set 5,c jr 18$ 16$: cp 6 jr nz,17$ set 6,c jr 18$ 17$: cp 7 jr nz,18$ set 7,c 18$: ld a,c ret tx_data_check: ld de,(tx_end) ld hl,(tx_top) and a ; CY <-- 0 sbc hl,de ret z io_set sio_a,00000000b ; Resister Point = 0 in a,(sio_a+1) bit 2,a ret z ld a,10100000b or d ld h,a ld l,e ld a,(hl) out (sio_a),a inc de res 5,d ld (tx_end),de ret tx_fifo_set: push hl push de ld de,(tx_top) ld a,10100000b or d ld h,a ld l,e ld (hl),b inc de res 5,d ld (tx_top),de pop de pop hl ret rx_data_check: ld de,(rx_end) ld hl,(rx_top) and a ; CY <-- 0 sbc hl,de ret z ld a,10000000b or d ld h,a ld l,e ld b,(hl) inc de res 5,d ld (rx_end),de bit 7,b jr z,50$ ; running ld a,b cp 0f8h ret nc cp 0f0h jr c,10$ xor a ld (rsb),a ret 10$: ld a,b and 00001111b ld (channel),a ld a,b and 11110000b ld (rsb),a xor a ld (dcb),a ret 50$: ld a,(rsb) cp 0 ret z cp 0c0h jr z,70$ cp 0d0h jr z,70$ ld a,(dcb) cp 0 jr nz,90$ inc a ld (dcb),a ld a,b ld (keyno),a ret 70$: ld c,b ld a,(rsb) ld d,a ld a,(channel) or d ld b,a call tx_fifo_set ld b,c call tx_fifo_set ret 90$: xor a ld (dcb),a ld c,b ld a,(rsb) ld d,a ld a,(channel) or d ld b,a call tx_fifo_set ld a,(keyno) ld b,a call tx_fifo_set ld b,c call tx_fifo_set ld a,(rsb) cp 0a0h ret nz ld a,(channel) cp 00eh ret nz ld a,(keyno) cp 0 jr z,_00 cp 1 jr z,_01 cp 2 jr z,_02 ret _00: ld a,c ld (para+0),a ret _01: ld a,c ld (para+1),a ret _02: ld a,c ld (para+2),a ret timer_check: ld a,(timer) dec a ld (timer),a cp 0 ret nz ld a,(para+0) ; Init = 10 ld (timer),a ld a,(ch_ctr) inc a and 00000111b ld (ch_ctr),a ld e,a ld d,0 ld hl,ch_status add hl,de ; (hl) = address ld a,(hl) ; Get Channel Status cp 0 jr z,_sw_check dec a ld (hl),a cp 0 jr nz,_tim_1 call get_mask xor 0ffh ld b,a ld a,(led) and b ld (led),a call led_display ret _tim_1: ld b,a ld a,(para+1) ; Init = 20 cp b ret nz ld b,09fh call tx_fifo_set ld a,(ch_ctr) ld b,a call tx_fifo_set ld b,0 call tx_fifo_set ret _sw_check: call get_mask ld e,a ; Mask in a,(pio_b) xor 0ffh and e ld c,a ; New Status ld a,(sw) and e ld d,a ; Old Status cp c ret z ; not event ld a,e xor 0ffh ld b,a ld a,(sw) and b or c ld (sw),a ld a,c cp 0 ret z ; off event ld b,09fh call tx_fifo_set ld a,(ch_ctr) ld b,a call tx_fifo_set ld b,1 call tx_fifo_set ld a,(para+2) ; Init = 25 ld (hl),a ld a,(led) or e ld (led),a call led_display ret end
;----------------------------------------------------------------------- ; [PEGASUS-9] Relay Box for Video Effect Switcher : Nov. 1994 ;----------------------------------------------------------------------- ;##### RAM Map ##### dseg org 0000h rx_fifo ds 8192 rx_top ds 2 rx_end ds 2 rsb ds 1 dcb ds 1 channel ds 1 keyno ds 1 relay ds 2 led ds 2 mode ds 1 timer ds 3 pointer ds 1 ;##### I/O Map ##### cseg sio_a equ 0018h sio_b equ 001ah pio_a equ 001ch pio_b equ 001eh ;##### MACRO ##### io_set macro @1,@2 ld a,@2 out (@1+1),a endm io_put macro @1,@2 ld a,@2 out (@1+0),a endm ;##### RESET ##### org 0000h ld sp,0ffffh di jp main ;##### INT / NMI ##### org 0020h dw _midi_ _midi_: ex af,af' exx ld de,(rx_top) ld a,10000000b or d ld h,a ld l,e in a,(sio_a+0) ld (hl),a inc de res 5,d ld (rx_top),de exx ex af,af' ei reti org 0066h retn ;##### Main ##### main: ld hl,08000h ld a,0f0h _ram_clear_loop: ld (hl),0 inc hl cp h jr nc,_ram_clear_loop io_set pio_a,0cfh ; Mode 3 io_set pio_a,00000000b ; 0:Out / 1:In io_set pio_a,007h ; Interrupt Disable io_set pio_b,0cfh ; Mode 3 io_set pio_b,00000000b ; 0:Out / 1:In io_set pio_b,007h ; Interrupt Disable io_set sio_b,00011000b ; Channel Reset B io_set sio_b,00000100b ; Resister Point = 4 io_set sio_b,11000100b ; Mode io_set sio_b,00000001b ; Resister Point = 1 io_set sio_b,00000000b ; Interrupt Mode io_set sio_b,00000010b ; Resister Point = 2 io_set sio_b,20h ; Vector Address io_set sio_a,00011000b ; Channel Reset A io_set sio_a,00000100b ; Resister Point = 4 io_set sio_a,11000100b ; Mode io_set sio_a,00000001b ; Resister Point = 1 io_set sio_a,00010000b ; Interrupt Mode io_set sio_a,00000011b ; Resister Point = 3 io_set sio_a,11000001b ; Receive Start im 2 ei in a,(sio_a+0) ; dummy read call relay_output call led_output loop: call not_busy call rx_data_check jr loop ;##### Subroutines ##### out_1_8: xor 11111111b out (c),a ret out_9_10: ld b,a ld a,00000101b ; Resister Point = 5 out (c),a ld a,00001000b bit 0,b ; No. 9 check jr z,_9_10_1 set 7,a ; DTR ON _9_10_1: out (c),a ret relay_output: ld a,(relay+0) xor 11111111b ld c,pio_a call out_1_8 ld a,(relay+1) xor 11111111b ld c,sio_a+1 call out_9_10 ret led_output: ld a,(led+0) ld c,pio_b call out_1_8 ld a,(led+1) ld c,sio_b+1 call out_9_10 ret rx_data_check: ld de,(rx_end) ld hl,(rx_top) and a ; CY <-- 0 sbc hl,de ret z ld a,10000000b or d ld h,a ld l,e ld b,(hl) inc de res 5,d ld (rx_end),de bit 7,b jr z,50$ ; running ld a,b cp 0f8h ret nc cp 0f0h jr c,10$ xor a ld (rsb),a ret 10$: ld a,b and 00001111b ld (channel),a ld a,b and 11110000b ld (rsb),a xor a ld (dcb),a ret 50$: ld a,(rsb) cp 0 ret z cp 0c0h ret z cp 0d0h ret z ld a,(dcb) cp 0 jr nz,90$ inc a ld (dcb),a ld a,b ld (keyno),a ret 90$: xor a ld (dcb),a ld a,(rsb) cp 0a0h ret nz ld a,(channel) cp 00eh ret nz ld a,(keyno) cp 11 ret c cp 20 ret nc ld a,1 ld (mode),a ld a,(relay+0) ld d,a ld a,(keyno) cp 11 jp z,_11 cp 12 jp z,_12 cp 13 jp z,_13 cp 14 jp z,_14 cp 15 jp z,_15 cp 16 jp z,_16 cp 17 jp z,_17 cp 18 jp z,_18 cp 19 ret nz ld a,(relay+1) res 0,a bit 6,b jr z,_19_mix set 0,a _19_mix: ld (relay+1),a ld (led+1),a call relay_output call led_output ret _11: res 0,d bit 6,b jp z,_all_mix set 0,d jp _all_mix _12: res 1,d bit 6,b jp z,_all_mix set 1,d jp _all_mix _13: res 2,d bit 6,b jp z,_all_mix set 2,d jp _all_mix _14: res 3,d bit 6,b jp z,_all_mix set 3,d jp _all_mix _15: res 4,d bit 6,b jp z,_all_mix set 4,d jp _all_mix _16: res 5,d bit 6,b jp z,_all_mix set 5,d jp _all_mix _17: res 6,d bit 6,b jp z,_all_mix set 6,d jp _all_mix _18: res 7,d bit 6,b jp z,_all_mix set 7,d jp _all_mix _all_mix: ld a,d ld (relay+0),a ld (led+0),a call relay_output call led_output ret ;##### Hobby(^_^;) ##### not_busy: ld a,(mode) cp 0 ret nz ld a,(timer+0) dec a ld (timer+0),a cp 0 ret nz ld a,(timer+1) dec a ld (timer+1),a cp 0 ret nz ld a,15 ld (timer+1),a ld a,(pointer) ld c,a ld b,0 ld hl,table add hl,bc ld a,(hl) ld (led+0),a call led_output ld a,(pointer) inc a ld (pointer),a cp 66 ret nz ld a,0 ld (pointer),a ret table: db 00000001b,00000100b,00010000b,01000000b ; 0-3 db 00010000b,00000100b,00000001b ; 4-6 db 00000010b,00001000b,00100000b,10000000b ; 7-10 db 00100000b,00001000b,00000010b ; 11-13 db 00000001b,00000010b,00000100b,00001000b ; 14-17 db 00010000b,00100000b,01000000b,10000000b ; 18-21 db 01000000b,00100000b,00010000b,00001000b ; 22-25 db 00000100b,00000010b,00000001b ; 26-28 db 00000010b,00001000b,00100000b ; 48-50 db 10000000b,01100000b,00011000b,00000110b ; 29-32 db 00000001b,00000110b,00011000b,01100000b ; 33-36 db 10000000b,11100000b,01111000b,00011110b ; 37-40 db 00000111b,00000001b,00000111b,00011110b ; 41-44 db 01111000b,11100000b,10000000b ; 45-47 db 11000000b,11010000b,11010100b,11010101b ; 51-54 db 11010111b,11011111b,11111111b ; 55-57 db 11111101b,11110101b,11010101b,01010101b ; 58-61 db 00010101b,00000101b,00000001b,00000000b ; 62-65 end
;----------------------------------------------------------------------- ; [PEGASUS-10] : [Indy Box] CPU (2) Indy Filter : May 1995 ;----------------------------------------------------------------------- ; [AE] [nn] [para] : Polyphonic Key Pressure ; nn = 5 : 100 * n LED Display ; 6 : 10 * n LED Display ; 7 : 1 * n LED Display ; 8 : (off) LED OFF ; 21 : Channel Filter bitmap : CH1-CH4 [1=on] ; 22 : Channel Filter bitmap : CH5-CH8 [1=on] ; 23 : Channel Filter bitmap : CH9-CH12 [1=on] ; 24 : Channel Filter bitmap : CH13-CH16 [1=on] ; (Default : CH16 only ON) ; 25 : Status Filter bitmap : [1=on] ; bit6 5 4 3 2 1 0 ; 8n 9n An Bn Cn Dn En ; (Default : <Bn> ON) ; 26 : Setting Default Paratemers (only <BF> ON) ;----------------------------------------------------------------------- ;##### RAM Map ##### dseg org 0000h rx_fifo ds 8192 tx_fifo ds 8192 rx_top ds 2 rx_end ds 2 rsb ds 1 dcb ds 1 channel ds 1 keyno ds 1 rxdata ds 1 tx_top ds 2 tx_end ds 2 timer ds 3 pass_map ds 256 mode ds 1 map_0_3 ds 1 map_4_7 ds 1 map_8_B ds 1 map_C_F ds 1 map_status ds 1 ;##### I/O Map ##### cseg sio_b equ 001ah pio_a equ 001ch pio_b equ 001eh ;##### MACRO ##### io_set macro @1,@2 ld a,@2 out (@1+1),a endm io_put macro @1,@2 ld a,@2 out (@1+0),a endm ;##### RESET ##### org 0000h ld sp,0ffffh di jp main ;##### INT / NMI ##### org 0020h dw _midi_ _midi_: ex af,af' exx ld de,(rx_top) ld a,10000000b or d ld h,a ld l,e in a,(sio_b+0) ld (hl),a inc de res 5,d ld (rx_top),de exx ex af,af' ei reti org 0066h retn ;##### Main ##### main: ld hl,08000h ld c,0e0h _ram_check_loop: ld b,11111111b ld (hl),b ld a,(hl) cp b jr nz,_ram_check_loop ld b,00000000b ld (hl),b ld a,(hl) cp b jr nz,_ram_check_loop inc hl ld a,c cp h jr nc,_ram_check_loop io_set pio_a,0cfh ; Mode 3 io_set pio_a,00000000b ; 0:Out / 1:In io_set pio_a,007h ; Interrupt Disable io_put pio_a,11111111b ; io_set pio_b,0cfh ; Mode 3 io_set pio_b,00000000b ; 0:Out / 1:In io_set pio_b,007h ; Interrupt Disable io_put pio_b,11111111b ; io_put pio_a,11111000b ; io_put pio_a,11111111b ; io_set sio_b,00011000b ; Channel Reset B io_set sio_b,00000100b ; Resister Point = 4 io_set sio_b,01000100b ; Mode io_set sio_b,00000001b ; Resister Point = 1 io_set sio_b,00011000b ; Interrupt Mode io_set sio_b,00000010b ; Resister Point = 2 io_set sio_b,020h ; Vector Address xor a ld i,a ; High Address io_set sio_b,00000101b ; Resister Point = 5 io_set sio_b,01101000b ; Transmit Start io_set sio_b,00000011b ; Resister Point = 3 io_set sio_b,11000001b ; Receive Start call default_set im 2 ei in a,(sio_b+0) ; dummy read loop: call rx_data_check call tx_fifo_check call timer_check jr loop tx_fifo_set: push hl push de ld de,(tx_top) ld a,10100000b or d ld h,a ld l,e ld (hl),b inc de res 5,d ld (tx_top),de pop de pop hl ret tx_fifo_check: ld de,(tx_end) ld hl,(tx_top) and a ; CY <-- 0 sbc hl,de ret z io_set sio_b,00000000b ; Resister Point = 0 in a,(sio_b+1) bit 2,a ret z ld a,10100000b or d ld h,a ld l,e ld a,(hl) out (sio_b+0),a inc de res 5,d ld (tx_end),de ret timer_check: ld a,(mode) cp 0 ret nz ld a,(timer+0) inc a ld (timer+0),a ret nz ld a,(timer+1) inc a ld (timer+1),a and 00001111b ret nz ld a,(timer+2) inc a cp 13 jr nz,_demo xor a _demo: ld (timer+2),a call led_display ld a,11111011b out (pio_a+0),a ld a,11111111b out (pio_a+0),a ld a,(timer+2) dec a call led_display ld a,11111101b out (pio_a+0),a ld a,11111111b out (pio_a+0),a ld a,(timer+2) dec a dec a call led_display ld a,11111110b out (pio_a+0),a ld a,11111111b out (pio_a+0),a ret rx_data_check: ld de,(rx_end) ld hl,(rx_top) and a ; CY <-- 0 sbc hl,de ret z ld a,10000000b or d ld h,a ld l,e ld b,(hl) inc de res 5,d ld (rx_end),de bit 7,b jr z,50$ ; running ld a,b cp 0f8h ret nc cp 0f0h jr c,10$ xor a ld (rsb),a ret 10$: ld a,b and 00001111b ld (channel),a ld a,b and 11110000b ld (rsb),a xor a ld (dcb),a ret 50$: ld a,(rsb) cp 0 ret z cp 0c0h jr z,70$ cp 0d0h jr z,70$ ld a,(dcb) cp 0 jr nz,90$ inc a ld (dcb),a ld a,b ld (keyno),a ret 70$: ld c,b ld a,(rsb) ld d,a ld a,(channel) or d ld e,a ld d,0 ld hl,pass_map add hl,de ld a,(hl) cp 0 ret z ld b,e call tx_fifo_set ld b,c call tx_fifo_set call st_disp ret 90$: ld a,b ld (rxdata),a xor a ld (dcb),a ld c,b ld a,(rsb) ld d,a ld a,(channel) or d ld e,a ld d,0 ld hl,pass_map add hl,de ld a,(hl) cp 0 jr z,_passed ld b,e call tx_fifo_set ld a,(keyno) ld b,a call tx_fifo_set ld b,c call tx_fifo_set call st_disp _passed: ld a,(rsb) cp 0a0h ret nz ld a,(channel) cp 00eh ret nz ld a,(keyno) cp 5 jr z,__100 cp 6 jr z,__10 cp 7 jr z,__1 cp 8 jr z,__0 cp 21 jp z,__21 cp 22 jp z,__22 cp 23 jp z,__23 cp 24 jp z,__24 cp 25 jp z,__25 cp 26 jp z,__26 ret __100: ld a,c call led_display ld a,11111110b out (pio_a+0),a ld a,11111111b out (pio_a+0),a ld a,2 ld (mode),a ret __10: ld a,c call led_display ld a,11111101b out (pio_a+0),a ld a,11111111b out (pio_a+0),a ld a,2 ld (mode),a ret __1: ld a,c call led_display ld a,11111011b out (pio_a+0),a ld a,11111111b out (pio_a+0),a ld a,2 ld (mode),a ret __0: ld a,0fh call led_display ld a,11111000b out (pio_a+0),a ld a,11111111b out (pio_a+0),a ld a,2 ld (mode),a ret led_display: and 00001111b ld l,a ld h,0 ld bc,data_table add hl,bc ld a,(hl) out (pio_b+0),a ret data_table: db 10010000b,11011011b,10100010b,10001010b ; 0-3 db 11001001b,10001100b,10000100b,11011000b ; 4-7 db 10000000b,11001000b,11111111b,11111111b ; 8-B db 11111111b,11111111b,11111111b,11111111b ; C-F default_set: ld hl,pass_map ld a,0 _df_1: ld (hl),0 inc hl dec a jr nz,_df_1 ld a,1 ld (pass_map+0bfh),a ld a,0 ld (map_0_3),a ld (map_4_7),a ld (map_8_B),a ld a,00001000b ld (map_C_F),a ld (map_status),a ret st_disp: ld a,(mode) cp 2 ret z ld a,1 ld (mode),a res 7,e ld d,0 ld hl,table_100 add hl,de ld a,(hl) call led_display ld a,11111110b out (pio_a+0),a ld a,11111111b out (pio_a+0),a ld hl,table_10 add hl,de ld a,(hl) call led_display ld a,11111101b out (pio_a+0),a ld a,11111111b out (pio_a+0),a ld hl,table_1 add hl,de ld a,(hl) call led_display ld a,11111011b out (pio_a+0),a ld a,11111111b out (pio_a+0),a ret table_1: db 8,9 ; 128-129 db 0,1,2,3,4,5,6,7,8,9 ; 130-139 db 0,1,2,3,4,5,6,7,8,9 ; 140-149 db 0,1,2,3,4,5,6,7,8,9 ; 150-159 db 0,1,2,3,4,5,6,7,8,9 ; 160-169 db 0,1,2,3,4,5,6,7,8,9 ; 170-179 db 0,1,2,3,4,5,6,7,8,9 ; 180-189 db 0,1,2,3,4,5,6,7,8,9 ; 190-199 db 0,1,2,3,4,5,6,7,8,9 ; 200-209 db 0,1,2,3,4,5,6,7,8,9 ; 210-219 db 0,1,2,3,4,5,6,7,8,9 ; 220-229 db 0,1,2,3,4,5,6,7,8,9 ; 230-239 db 0,1,2,3,4,5,6,7,8,9 ; 240-249 db 0,1,2,3,4,5 ; 250-255 table_10: db 2,2 ; 128-129 db 3,3,3,3,3,3,3,3,3,3 ; 130-139 db 4,4,4,4,4,4,4,4,4,4 ; 140-149 db 5,5,5,5,5,5,5,5,5,5 ; 150-159 db 6,6,6,6,6,6,6,6,6,6 ; 160-169 db 7,7,7,7,7,7,7,7,7,7 ; 170-179 db 8,8,8,8,8,8,8,8,8,8 ; 180-189 db 9,9,9,9,9,9,9,9,9,9 ; 190-199 db 0,0,0,0,0,0,0,0,0,0 ; 200-209 db 1,1,1,1,1,1,1,1,1,1 ; 210-219 db 2,2,2,2,2,2,2,2,2,2 ; 220-229 db 3,3,3,3,3,3,3,3,3,3 ; 230-239 db 4,4,4,4,4,4,4,4,4,4 ; 240-249 db 5,5,5,5,5,5 ; 250-255 table_100: db 1,1 ; 128-129 db 1,1,1,1,1,1,1,1,1,1 ; 130-139 db 1,1,1,1,1,1,1,1,1,1 ; 140-149 db 1,1,1,1,1,1,1,1,1,1 ; 150-159 db 1,1,1,1,1,1,1,1,1,1 ; 160-169 db 1,1,1,1,1,1,1,1,1,1 ; 170-179 db 1,1,1,1,1,1,1,1,1,1 ; 180-189 db 1,1,1,1,1,1,1,1,1,1 ; 190-199 db 2,2,2,2,2,2,2,2,2,2 ; 200-209 db 2,2,2,2,2,2,2,2,2,2 ; 210-219 db 2,2,2,2,2,2,2,2,2,2 ; 220-229 db 2,2,2,2,2,2,2,2,2,2 ; 230-239 db 2,2,2,2,2,2,2,2,2,2 ; 240-249 db 2,2,2,2,2,2 ; 250-255 __26: call default_set ld a,0fh call led_display ld a,11111000b out (pio_a+0),a ld a,11111111b out (pio_a+0),a ld a,1 ld (mode),a ret __21: ld a,(rxdata) and 00001111b ld (map_0_3),a call map_setting ret __22: ld a,(rxdata) and 00001111b ld (map_4_7),a call map_setting ret __23: ld a,(rxdata) and 00001111b ld (map_8_B),a call map_setting ret __24: ld a,(rxdata) and 00001111b ld (map_C_F),a call map_setting ret __25: ld a,(rxdata) and 01111111b ld (map_status),a call map_setting ret map_setting: ld hl,pass_map+128 ld a,128 _mps_loop: ld (hl),0 inc hl dec a jr nz,_mps_loop ld e,0 ; Channel ld a,(map_0_3) bit 0,a jr z,_mps_0 call and_status _mps_0: ld e,1 ; Channel ld a,(map_0_3) bit 1,a jr z,_mps_1 call and_status _mps_1: ld e,2 ; Channel ld a,(map_0_3) bit 2,a jr z,_mps_2 call and_status _mps_2: ld e,3 ; Channel ld a,(map_0_3) bit 3,a jr z,_mps_3 call and_status _mps_3: ld e,4 ; Channel ld a,(map_4_7) bit 0,a jr z,_mps_4 call and_status _mps_4: ld e,5 ; Channel ld a,(map_4_7) bit 1,a jr z,_mps_5 call and_status _mps_5: ld e,6 ; Channel ld a,(map_4_7) bit 2,a jr z,_mps_6 call and_status _mps_6: ld e,7 ; Channel ld a,(map_4_7) bit 3,a jr z,_mps_7 call and_status _mps_7: ld e,8 ; Channel ld a,(map_8_B) bit 0,a jr z,_mps_8 call and_status _mps_8: ld e,9 ; Channel ld a,(map_8_B) bit 1,a jr z,_mps_9 call and_status _mps_9: ld e,10 ; Channel ld a,(map_8_B) bit 2,a jr z,_mps_10 call and_status _mps_10: ld e,11 ; Channel ld a,(map_8_B) bit 3,a jr z,_mps_11 call and_status _mps_11: ld e,12 ; Channel ld a,(map_C_F) bit 0,a jr z,_mps_12 call and_status _mps_12: ld e,13 ; Channel ld a,(map_C_F) bit 1,a jr z,_mps_13 call and_status _mps_13: ld e,14 ; Channel ld a,(map_C_F) bit 2,a jr z,_mps_14 call and_status _mps_14: ld e,15 ; Channel ld a,(map_C_F) bit 3,a jr z,_mps_15 call and_status _mps_15: ret and_status: ld bc,pass_map ld a,(map_status) bit 6,a jr z,_ans_6 ld a,e or 080h ld l,a ld h,0 add hl,bc ld a,1 ld (hl),a _ans_6: ld a,(map_status) bit 5,a jr z,_ans_5 ld a,e or 090h ld l,a ld h,0 add hl,bc ld a,1 ld (hl),a _ans_5: ld a,(map_status) bit 4,a jr z,_ans_4 ld a,e or 0a0h ld l,a ld h,0 add hl,bc ld a,1 ld (hl),a _ans_4: ld a,(map_status) bit 3,a jr z,_ans_3 ld a,e or 0b0h ld l,a ld h,0 add hl,bc ld a,1 ld (hl),a _ans_3: ld a,(map_status) bit 2,a jr z,_ans_2 ld a,e or 0c0h ld l,a ld h,0 add hl,bc ld a,1 ld (hl),a _ans_2: ld a,(map_status) bit 1,a jr z,_ans_1 ld a,e or 0d0h ld l,a ld h,0 add hl,bc ld a,1 ld (hl),a _ans_1: ld a,(map_status) bit 0,a jr z,_ans_0 ld a,e or 0e0h ld l,a ld h,0 add hl,bc ld a,1 ld (hl),a _ans_0: ret end
;-----------------------------------------------------------------------
; DSP-01 Debugger Software
; Produced by Y.Nagashima
;-----------------------------------------------------------------------
name main
p65c02
;##### Zero Page Registers #####
zpage
; <MIDI-Common>
midi_r_top ds 1 ; MIDI Receive FIFO Top
midi_r_end ds 1 ; MIDI Receive FIFO End
midi_t_top ds 1 ; MIDI Transmit FIFO Top
midi_t_end ds 1 ; MIDI Transmit FIFO Top
midi_rsb ds 1 ; Running Status Buffer
midi_dcb ds 1 ; Data Count Buffer
rxdata ds 1 ; MIDI Received Data
rxkeyno ds 1 ; MIDI Received Key Number
rxspeed ds 1 ; MIDI Received Velocity
rxchannel ds 1 ; MIDI Received Channel
; <COMMON>
work ds 16 ; Work Area
led_demo ds 2 ; LED Demonstration Work
add_s_h_1 ds 1 ; 16bit Adder/Sub Source (H) #1
add_s_l_1 ds 1 ; 16bit Adder/Sub Source (L) #1
add_s_h_2 ds 1 ; 16bit Adder/Sub Source (H) #2
add_s_l_2 ds 1 ; 16bit Adder/Sub Source (L) #2
add_d_h ds 1 ; 16bit Adder/Sub Destination (H)
add_d_l ds 1 ; 16bit Adder/Sub Destination (L)
bank_h ds 1 ; Memory Bank Buffer(H)
bank_l ds 1 ; Memory Bank Buffer(L)
bank_buff_l ds 1 ; Memory Bank Stack Buffer(L)
bank_buff_h ds 1 ; Memory Bank Stack Buffer(H)
screen_mode ds 1 ; Main Menu Mode
; <MOUSE>
comp_level ds 1 ; Mouse Sleshold Level
msx_timer ds 1 ; MSX Mouse Scan Timer
msx_sw_buf ds 1 ; Bit5=Left,Bit4=Right : Buffer
msx_x_data ds 1 ; MSX Mouse Move Data (X)
msx_y_data ds 1 ; MSX Mouse Move Data (Y)
mouse_sw ds 1 ; Bit5=Left,Bit4=Right : ON Event="1"
up_count ds 1 ; Mouse Up Address
down_count ds 1 ; Mouse Down Address
right_count ds 1 ; Mouse Right Address
left_count ds 1 ; Mouse Left Address
mouse_timer ds 1 ; Mouse Check Routine Timer
main_point ds 1 ; Main Menu Mode Pointer
; <LCD>
moni_point ds 1 ; MIDI Monitor Mode Address
erase_point ds 1 ; MIDI Monitor Erase Address
lcd_era_h ds 1 ; LCD Hex Erase Address (H)
lcd_add_h ds 1 ; LCD Hex Display Address (H)
lcd_add_l ds 1 ; LCD Hex Display Address (L)
lcd_hex_data ds 1 ; LCD Hex Display Data
mask_buffer ds 2 ; seloff buffer
; <PCM Module>
pcm_point ds 1 ; PCM Module Mode Point
pcm_plane ds 1 ; PCM Module Mode Display Plane NO.(0-F)
; <DEBUG Module>
dbg_point ds 1 ; DEBUG Mode Point
dbg_plane ds 1 ; DEBUG Mode Display Plane NO.(0-F)
dbg_bk ds 16
dbg_st ds 16
dbg_lt ds 16
dbg_le ds 16
dbg_fnoh ds 16
dbg_fnom ds 16
dbg_fnol ds 16
; <DSP-01>
wave_s_add ds 2 ;
wave_d_bk ds 1 ;
wave_d_add ds 1 ;
random_buff ds 1 ;
basic_ch ds 1 ; Receive Basic Channel (00-0F)
basic_note ds 16 ; Receive Note Number (00-7F)
basic_tone ds 16 ; Preset Tone Number (00-FF)
basic_pan ds 16 ; Panpot Data (00-FF)
dsp_channel ds 1 ;
tone_access ds 2 ;
dsp_event ds 1 ;
; <ZP Area End Mark>
zp_end ds 3 ; Dummy=<*>
;##### RAM MAP #####
org 0200h
midi_r_fifo ds 256 ; MIDI
midi_t_fifo ds 256
;##### I/O,ROM Mapping #####
dsp-01 equ 01c00h ; PAL #3 Out=F7=
bankh equ 01e00h ; PAL #3 Out=F6=
bankl equ 01e04h ; PAL #3 Out=F5=
adsp equ 01e10h ; PAL #3 Out=F0-F4=
uart1 equ 01e20h ; PAL #2 Out=F0=
uart2 equ 01e24h ; PAL #2 Out=F1=
uart3 equ 01e28h ; PAL #2 Out=F2=
timer equ 01e2ch ; PAL #2 Out=F3=
pia equ 01e30h ; PAL #2 Out=F4=
lcd2 equ 01e34h ; PAL #2 Out=F5= **
lcd equ 01e38h ; PAL #2 Out=F6=
mpu equ 01e3ch ; PAL #2 Out=F7=
prgarea equ 0c000h
debug equ 0ff00h
vector equ 0fffah
;##### Constants Defines #####
tail equ 0ffh
up equ 00000001b
down equ 00000010b
right equ 00000100b
left equ 00001000b
sw_r equ 00010000b
sw_l equ 00100000b
wave_ram_bank equ 80h
;##### Macro Call Defines #####
; <COMMON>
macro &startup
sei
ldx #0
txs
cld
endmac
macro &movi
lda #\0
sta \1
endmac
macro &move
lda \0
sta \1
endmac
macro &equal_return
bne *+3
rts
endmac
macro ¬_equal_return
beq *+3
rts
endmac
macro &bank
&movi \0,bankl
sta bank_l
&movi \1,bankh
sta bank_h
endmac
macro &bank_system
&bank 08h,09h
endmac
macro &bank_wave_l
&bank 0ah,0bh
endmac
macro &bank_wave_h
&bank 0ch,0dh
endmac
macro &bank_card_1_l
&bank 00h,01h
endmac
macro &bank_card_1_h
&bank 02h,03h
endmac
macro &bank_card_2_l
&bank 04h,05h
endmac
macro &bank_card_2_h
&bank 06h,07h
endmac
macro &push_bank
&move bank_l,bank_buff_l
&move bank_h,bank_buff_h
endmac
macro &pop_bank
&move bank_buff_l,bank_l
sta bankl
&move bank_buff_h,bank_h
sta bankh
endmac
; <MIDI>
macro &comtx
ldx midi_t_top
lda #\0
sta midi_t_fifo,x
inc midi_t_top
endmac
macro &memtx
ldx midi_t_top
lda \0
sta midi_t_fifo,x
inc midi_t_top
endmac
; <LCD>
macro &write
&movi .low.\0,work+2
&movi .high.\0,work+3
jsr lcd_write_message
endmac
macro &selon
&movi .low.\0,work+2
sta mask_buffer
&movi .high.\0,work+3
sta mask_buffer+1
stz work+4
jsr lcd_select_mask
endmac
macro &seloff
&move mask_buffer,work+2
&move mask_buffer+1,work+3
&movi 0ffh,work+4
jsr lcd_select_mask
endmac
macro &inidraw
&movi .low.\0,work
&movi .high.\0,work+1
jsr lcd_draw_initial_sub
inc work+7
endmac
macro &hex_disp_with_point
&movi .low.\0,lcd_add_l
&movi .high.\0,lcd_add_h
&move \1,lcd_hex_data
jsr lcd_display_hex_data_with_address
endmac
org prgarea
;##### Program Start #####
start:
&startup
jsr io_initial
loop:
jsr dsp_event_check
jsr rx_midi_sequence
jsr tx_midi_sequence
jsr mouse_point_check
jsr msx_mouse_check
bra loop
;##### System I/O Initialize #####
io_initial:
&movi 0,uart1+1
&movi 0,uart1+1
&movi 0,uart1+1
&movi 01000000b,uart1+1 ; Software Reset
; <Zero Page Memory Area Clear>
ldx #0
lda #0
io_initial_loop_1:
sta 0,x ; ZP
inx
bne io_initial_loop_1
ldx #0
io_initial_loop_2:
txa
sta basic_tone,x ; Preset Tone NO.
clc
adc #36
sta basic_note,x ; Receive Note : C2 - Eb3
lda #1
sta dbg_fnoh,x
lda #0
sta dbg_fnom,x
sta dbg_fnol,x
lda #0c0h
sta dbg_bk,x
lda #000h
sta dbg_st,x
sta dbg_lt,x
sta dbg_le,x
lda #40h
sta basic_pan,x ; Panpot
inx
cpx #10h
bne io_initial_loop_2
; <DSP-01 System Parameter Set>
jsr dsp_initial_setting
; <71051(1) UART Initialize>
&movi 0,uart1+1
&movi 0,uart1+1
&movi 0,uart1+1
&movi 01000000b,uart1+1 ; Software Reset
&movi 01001110b,uart1+1 ; Mode Set
&movi 000-0101b,uart1+1 ; Command Set
; <71051(2) UART Initialize>
&movi 0,uart2+1
&movi 0,uart2+1
&movi 0,uart2+1
&movi 01000000b,uart2+1 ; Software Reset
&movi 01001110b,uart2+1 ; Mode Set
&movi 001-0111b,uart2+1 ; Command Set
; <71051(3) UART Initialize>
&movi 0,uart3+1
&movi 0,uart3+1
&movi 0,uart3+1
&movi 01000000b,uart3+1 ; Software Reset
&movi 0100-010b,uart3+1 ; Mode Set
&movi 000-0111b,uart3+1 ; Command Set
; <71054 Timer Initialize>
&movi 001-0110b,timer+3 ; UART #2 = 9600 bps
&movi 32,timer
&movi 0,timer
&movi 011-0110b,timer+3 ; UART #3 = 1200 bps
&movi 0,timer+1
&movi 1,timer+1
&movi -01-0110b,timer+3 ; Timer Interrupt
&movi 43h,timer+2
&movi 90h,timer+2
; <71055 PIA Initialize>
&movi 10010010b,pia+3 ; Port<2>=Out,<0>=<1>=In
&movi 0ffh,pia+2
; <LCD System Set>
&movi 40h,lcd+1 ; System Set
&movi 30h,lcd ; Screen
&movi 85h,lcd ; Field(X)
&movi 7,lcd ; Field(Y)
&movi 39,lcd ; C/R
&movi 48,lcd ; TC/R
&movi 3fh,lcd ; L/F
&movi 40,lcd ; APL
&movi 0,lcd ; APH
; <Scroll>
&movi 44h,lcd+1 ; Scroll
&movi 0,lcd ; Start Address #1(L)
&movi 0,lcd ; (H)
&movi 40h,lcd ; Line #1
&movi 0,lcd ; Start Address #2(L)
&movi 10h,lcd ; (H)
&movi 40h,lcd ; Line #2
; <HDot Scroll>
&movi 5ah,lcd+1 ; HDot Scroll
&movi 0,lcd ; Scroll=0
; <Ovlay>
&movi 5bh,lcd+1 ; Overlay
&movi 01h,lcd ; Character + Graphic
; <Disp ON/OFF>
&movi 58h,lcd+1 ; Display OFF
&movi 14h,lcd ; Parameter
; <Csr Form>
&movi 5dh,lcd+1 ; Cursor Form
&movi 04h,lcd ; X=5
&movi 86h,lcd ; Y=7
; <Cswr>
&movi 46h,lcd+1 ; Cursor Write
&movi 0,lcd ; Home
&movi 0,lcd ; Position
; <Erase>
&movi 52h,lcd+1 ; Erase
jsr wait_long
jsr wait_long
jsr wait_long
; <Parameters>
&movi 1fh,comp_level ; Mouse
&movi 00h,basic_ch ; Receive Channel ********
&movi '*',zp_end ; Dummy
&movi '*',zp_end+1 ; //
&movi '*',zp_end+2 ; //
; <Bank:System>
&bank_system
; <LCD ON ---> Initial Screen Draw>
jsr lcd_draw_initial
&movi 59h,lcd+1 ; Display ON
; <Interrupt Enable>
cli
rts
;##### DSP-01 ON Event --- OFF Write Phase #####
dsp_on_event:
lda rxchannel
cmp basic_ch
¬_equal_return
ldx #0
dsp_on_event_keyno_check_loop:
lda basic_note,x
cmp rxkeyno
beq dsp_on_event_keyno_check_just
inx
cpx #10h
bne dsp_on_event_keyno_check_loop
rts
dsp_on_event_keyno_check_just:
stx dsp_channel
lda screen_mode
cmp #3
bne dsp_pcm_mode
jmp dsp_debug_mode_on_event
dsp_pcm_mode:
lda #0
sta dsp-01+0c0h,x
lda #07h
sta dsp-01+0d0h,x
lda #0 ; KEY OFF
sta dsp-01+090h,x
&movi 1,dsp_event
rts
;##### DSP ON Event --- ON Write Phase #####
dsp_event_check:
lda dsp_event
&equal_return
stz dsp_event
ldx dsp_channel
&movi .high.tone_data_base,tone_access+1
lda basic_tone,x
asl a
asl a
asl a
sta tone_access
bcc dsp_on_event_low_basic_tone
inc tone_access+1
dsp_on_event_low_basic_tone:
clc
lda #.low.tone_data_base
adc tone_access
sta tone_access
bcc dsp_on_event_low_basic_tone_add
inc tone_access+1
dsp_on_event_low_basic_tone_add:
ldy #4
lda (tone_access),y ; F-No Type
and #00000111b
tay
lda fno_type_table_l,y
ldx dsp_channel
sta dsp-01+00h,x
lda fno_type_table_m,y
sta dsp-01+10h,x
lda fno_type_table_h,y
sta dsp-01+20h,x
ldy #1
lda (tone_access),y ; Start Point
sta dsp-01+30h,x
iny
lda (tone_access),y ; Loop Top
sta dsp-01+40h,x
iny
lda (tone_access),y ; Loop End
sta dsp-01+50h,x
ldy #0
lda (tone_access),y ; Bank
sta dsp-01+60h,x
lda basic_pan,x
sta dsp-01+70h,x
ldy #5
lda (tone_access),y ; Attack Level
sta dsp-01+0a0h,x
iny
lda (tone_access),y ; Attack Speed
sta dsp-01+0b0h,x
lda #0 ; Decay Level
sta dsp-01+0c0h,x
iny
lda (tone_access),y ; Decay Speed
sta dsp-01+0d0h,x
lda #00000011b ; KEY ON
sta dsp-01+090h,x
rts
fno_type_table_l:
db 000h,000h,000h,000h,000h,000h,000h,000h
fno_type_table_m:
db 080h,000h,080h,000h,080h,000h,080h,000h
fno_type_table_h:
db 000h,001h,001h,002h,002h,003h,003h,004h
;##### DSP-01 OFF Event #####
dsp_off_event:
lda screen_mode
cmp #3
¬_equal_return
lda rxchannel
cmp basic_ch
¬_equal_return
ldx #0
dsp_off_event_keyno_check_loop:
lda basic_note,x
cmp rxkeyno
beq dsp_off_event_keyno_check_just
inx
cpx #10h
bne dsp_off_event_keyno_check_loop
rts
dsp_off_event_keyno_check_just:
stx dsp_channel
jmp dsp_debug_mode_off_event
rts
;##### DSP-01 Initial Setting #####
dsp_initial_setting:
&movi 0,dsp-01+0f5h ; Memory Bus Close
&movi 0,dsp-01+090h
ldx #0
lda #0
dsp_initial_setting_loop_001:
sta dsp-01+090h,x ; Control Word
inx
cpx #10h
bne dsp_initial_setting_loop_001
&movi 0,random_buff
lda random_buff
and #11-01111b
sta dsp-01+0f1h ; Random Parameter:Clear
&movi 00-01111b,dsp-01+0f2h ; Output Parameter
&movi 11111111b,dsp-01+0f0h ; Random Bit Pattern
ldx #0
dsp_initial_setting_loop_002:
lda #0
sta dsp-01+000h,x ; F-No.(L)
sta dsp-01+010h,x ; F-No.(L)
sta dsp-01+020h,x ; F-No.(L)
sta dsp-01+030h,x ; Start Point
sta dsp-01+040h,x ; Loop Top
sta dsp-01+050h,x ; Loop End
lda #wave_ram_bank
sta dsp-01+060h,x ; Bank
lda #0
sta dsp-01+070h,x ; Panpot
sta dsp-01+0a0h,x ; Attack Level
lda #0fh
sta dsp-01+0b0h,x ; Attack Speed
lda #0
sta dsp-01+0c0h,x ; Decay Level
lda #0fh
sta dsp-01+0d0h,x ; Decay Speed
inx
cpx #10h
bne dsp_initial_setting_loop_002
lda random_buff
ora #00010000b
sta dsp-01+0f1h ; Random Parameter:Setting
&movi 1,dsp-01+0f5h ; Memory Bus Recover
rts
tone_data_base:
; Format : Bank,Start-Point,Loop-Top,Loop-End,F-No-Type
; Attack-Level,Attack-Speed,Decay-Speed
db 0c0h,000h,000h,07fh,0,00fh,007h,099h ; #00
db 0c0h,080h,080h,0bfh,0,00eh,007h,08ah ; #01
db 0c0h,0c0h,0c0h,0cfh,0,00ah,007h,067h ; #02
db 0c0h,0d0h,0d0h,0dfh,0,00bh,007h,067h ; #03
db 0c1h,000h,000h,00fh,0,00fh,007h,067h ; #04
db 0c1h,010h,010h,01fh,0,00fh,007h,067h ; #05
db 0c1h,020h,020h,03fh,0,00fh,007h,077h ; #06
db 0c1h,040h,040h,04fh,0,00fh,007h,067h ; #07
db 0c1h,050h,050h,06fh,0,00fh,007h,077h ; #08
db 0c1h,070h,070h,07fh,0,00fh,007h,067h ; #09
db 0c1h,080h,080h,09fh,0,00fh,007h,077h ; #0a
db 0c1h,000h,000h,09fh,0,00fh,007h,0b7h ; #0b
db 0c1h,000h,000h,07fh,0,00fh,007h,0b7h ; #0c
db 0c1h,000h,000h,06fh,0,00fh,007h,0b7h ; #0d
db 0c1h,000h,000h,04fh,0,00fh,007h,0b7h ; #0e
db 0c1h,000h,000h,03fh,0,00fh,007h,0b7h ; #0f
;##### DSP-01 Debug Mode ON Event #####
dsp_debug_mode_on_event:
ldx dsp_channel
txa ; ******
and #00000001b ; * AM-Reset
¬_equal_return ; ******
lda dbg_fnol,x
sta dsp-01+00h,x
lda dbg_fnom,x
sta dsp-01+10h,x
lda dbg_fnoh,x
sta dsp-01+20h,x
lda dbg_st,x
sta dsp-01+30h,x
lda dbg_lt,x
sta dsp-01+40h,x
lda dbg_le,x
sta dsp-01+50h,x
lda dbg_bk,x
sta dsp-01+60h,x
lda basic_pan,x
sta dsp-01+70h,x
lda #08h
sta dsp-01+0a0h,x
lda #87h
sta dsp-01+0b0h,x
lda #08h
sta dsp-01+0c0h,x
lda #87h
sta dsp-01+0d0h,x
lda #0001-011b ; KEY ON *** AM ***
sta dsp-01+090h,x
inx
lda dbg_fnol,x
sta dsp-01+00h,x
lda dbg_fnom,x
sta dsp-01+10h,x
lda dbg_fnoh,x
sta dsp-01+20h,x
lda dbg_st,x
sta dsp-01+30h,x
lda dbg_lt,x
sta dsp-01+40h,x
lda dbg_le,x
sta dsp-01+50h,x
lda dbg_bk,x
sta dsp-01+60h,x
lda basic_pan,x
sta dsp-01+70h,x
lda #0ch
sta dsp-01+0a0h,x
lda #27h
sta dsp-01+0b0h,x
lda #08h
sta dsp-01+0c0h,x
lda #87h
sta dsp-01+0d0h,x
lda #0001-011b ; KEY ON *** AM ***
sta dsp-01+090h,x
rts
;##### DSP-01 Debug Mode OFF Event #####
dsp_debug_mode_off_event:
ldx dsp_channel
txa ; ******
and #00000001b ; * AM
¬_equal_return ; ******
lda #0
sta dsp-01+0c0h,x
lda #0a7h
sta dsp-01+0d0h,x
lda #00011000b ; KEY OFF *** AM ***
sta dsp-01+090h,x
inx
lda #0
sta dsp-01+0c0h,x
lda #0a7h
sta dsp-01+0d0h,x
lda #00011000b ; KEY OFF *** AM ***
sta dsp-01+090h,x
rts
;##### Mouse Event Routine #####
; Input : [mouse_sw]
; Bit = 7 6 5 4 3 2 1 0
; --- --- SW(L) SW(R) Move(L) Move(R) Move(Down) Move(Up)
msx_mouse_sw_event:
lda screen_mode
asl a
tax
jmp (mouse_sw_jump),x
mouse_sw_jump:
dw mouse_event_init_screen ; 00
dw mouse_event_main_menu ; 01
dw mouse_event_midi_monitor ; 02
dw mouse_event_dsp_debug ; 03
dw mouse_event_pcm_module ; 04
dw mouse_event_midi_control ; 05
dw mouse_event_midi_mtr ; 06
mouse_event_dsp_debug:
lda mouse_sw
and #up
beq mouse_event_dbg_not_up
ldx dbg_point
lda dbg_table_01,x
sta dbg_point
jmp mouse_event_dbg_screen_redraw
mouse_event_dbg_not_up:
lda mouse_sw
and #down
beq mouse_event_dbg_not_down
ldx dbg_point
lda dbg_table_02,x
sta dbg_point
jmp mouse_event_dbg_screen_redraw
mouse_event_dbg_not_down:
lda mouse_sw
and #right
beq mouse_event_dbg_not_right
ldx dbg_point
lda dbg_table_03,x
sta dbg_point
jmp mouse_event_dbg_screen_redraw
mouse_event_dbg_not_right:
lda mouse_sw
and #left
beq mouse_event_dbg_not_left
ldx dbg_point
lda dbg_table_04,x
sta dbg_point
jmp mouse_event_dbg_screen_redraw
mouse_event_dbg_not_left:
lda mouse_sw
and #00110000b
beq mouse_event_dbg_pass
lda dbg_point
asl a
tax
jmp (dbg_mode_jump),x
mouse_event_dbg_pass:
jmp mouse_event_return
dbg_mode_jump:
dw dbg_mode_channel
dw dbg_mode_note
dw dbg_mode_bank
dw dbg_mode_panpot
dw dbg_mode_st
dw dbg_mode_lt
dw dbg_mode_le
dw dbg_mode_fnoh
dw dbg_mode_fnom
dw dbg_mode_fnol
dw mouse_event_return_back_to_main_menu
dw dbg_mode_next
dbg_mode_st:
ldx dbg_plane
lda dbg_st,x
jsr mouse_sw_inc_dec_check
sta dbg_st,x
sta work+13
&hex_disp_with_point 172,work+13
jmp mouse_event_return
dbg_mode_lt:
ldx dbg_plane
lda dbg_lt,x
jsr mouse_sw_inc_dec_check
sta dbg_lt,x
sta work+13
&hex_disp_with_point 184,work+13
jmp mouse_event_return
dbg_mode_le:
ldx dbg_plane
lda dbg_le,x
jsr mouse_sw_inc_dec_check
sta dbg_le,x
sta work+13
&hex_disp_with_point 196,work+13
jmp mouse_event_return
dbg_mode_fnoh:
ldx dbg_plane
lda dbg_fnoh,x
jsr mouse_sw_inc_dec_check
sta dbg_fnoh,x
sta work+13
&hex_disp_with_point 212,work+13
jmp mouse_event_return
dbg_mode_fnom:
ldx dbg_plane
lda dbg_fnom,x
jsr mouse_sw_inc_dec_check
sta dbg_fnom,x
sta work+13
&hex_disp_with_point 224,work+13
jmp mouse_event_return
dbg_mode_fnol:
ldx dbg_plane
lda dbg_fnol,x
jsr mouse_sw_inc_dec_check
sta dbg_fnol,x
sta work+13
&hex_disp_with_point 236,work+13
jmp mouse_event_return
dbg_mode_channel:
lda basic_ch
jsr mouse_sw_inc_dec_check
and #00001111b
sta basic_ch
&hex_disp_with_point 94,basic_ch
jmp mouse_event_return
dbg_mode_note:
ldx dbg_plane
lda basic_note,x
jsr mouse_sw_inc_dec_check
and #01111111b
sta basic_note,x
sta work+13
&hex_disp_with_point 111,work+13
jmp mouse_event_return
dbg_mode_bank:
ldx dbg_plane
lda dbg_bk,x
jsr mouse_sw_inc_dec_check
sta dbg_bk,x
sta work+13
&hex_disp_with_point 131,work+13
jmp mouse_event_return
dbg_mode_panpot:
ldx dbg_plane
lda basic_pan,x
jsr mouse_sw_inc_dec_check
sta basic_pan,x
sta work+13
&hex_disp_with_point 146,work+13
jmp mouse_event_return
dbg_mode_next:
lda dbg_plane
inc a
and #00001111b
sta dbg_plane
jsr lcd_draw_dsp_debug
jmp mouse_event_return
mouse_event_dbg_screen_redraw:
&seloff
jsr lcd_draw_dbg_module_redraw
jmp mouse_event_return
dbg_table_01:
db 11,11,0,1,2,3,3,4,5,6,10,8
dbg_table_02:
db 2,3,4,5,7,8,9,11,11,11,10,1
dbg_table_03:
db 1,1,3,3,5,6,6,8,9,9,11,11
dbg_table_04:
db 0,0,2,2,4,4,5,7,7,8,10,10
;##### DSP1001 Debug Tester Screen #####
lcd_draw_dsp_debug:
&movi 11,dbg_point
jsr lcd_draw_menu_back_screen
lcd_draw_dbg_module_redraw:
&write lcd_draw_dbg_module_data_menu_01
&hex_disp_with_point 71,dbg_plane
&write lcd_draw_dbg_module_data_menu_02
&write lcd_draw_dbg_module_data_menu_03
&hex_disp_with_point 94,basic_ch
&write lcd_draw_dbg_module_data_menu_05
&write lcd_draw_dbg_module_data_menu_06
ldx dbg_plane
lda basic_note,x
sta work+13
&hex_disp_with_point 111,work+13
&write lcd_draw_dbg_module_data_menu_07
&write lcd_draw_dbg_module_data_menu_08
ldx dbg_plane
lda dbg_bk,x
sta work+13
&hex_disp_with_point 131,work+13
&write lcd_draw_dbg_module_data_menu_09
&write lcd_draw_dbg_module_data_menu_10
ldx dbg_plane
lda basic_pan,x
sta work+13
&hex_disp_with_point 146,work+13
&write lcd_draw_dbg_module_data_menu_11
&write lcd_draw_dbg_module_data_menu_12
ldx dbg_plane
lda dbg_st,x
sta work+13
&hex_disp_with_point 172,work+13
&write lcd_draw_dbg_module_data_menu_13
&write lcd_draw_dbg_module_data_menu_14
ldx dbg_plane
lda dbg_lt,x
sta work+13
&hex_disp_with_point 184,work+13
&write lcd_draw_dbg_module_data_menu_15
&write lcd_draw_dbg_module_data_menu_16
ldx dbg_plane
lda dbg_le,x
sta work+13
&hex_disp_with_point 196,work+13
&write lcd_draw_dbg_module_data_menu_17
&write lcd_draw_dbg_module_data_menu_18
ldx dbg_plane
lda dbg_fnoh,x
sta work+13
&hex_disp_with_point 212,work+13
&write lcd_draw_dbg_module_data_menu_19
&write lcd_draw_dbg_module_data_menu_20
ldx dbg_plane
lda dbg_fnom,x
sta work+13
&hex_disp_with_point 224,work+13
&write lcd_draw_dbg_module_data_menu_21
&write lcd_draw_dbg_module_data_menu_22
ldx dbg_plane
lda dbg_fnol,x
sta work+13
&hex_disp_with_point 236,work+13
&write lcd_draw_dbg_module_data_menu_23
&write lcd_draw_dbg_module_data_menu_24
lda dbg_point
bne lcd_draw_dbg_module_point_not_0
&selon lcd_draw_dbg_module_data_menu_03
rts
lcd_draw_dbg_module_point_not_0:
cmp #1
bne lcd_draw_dbg_module_point_not_1
&selon lcd_draw_dbg_module_data_menu_06
rts
lcd_draw_dbg_module_point_not_1:
cmp #2
bne lcd_draw_dbg_module_point_not_2
&selon lcd_draw_dbg_module_data_menu_08
rts
lcd_draw_dbg_module_point_not_2:
cmp #3
bne lcd_draw_dbg_module_point_not_3
&selon lcd_draw_dbg_module_data_menu_10
rts
lcd_draw_dbg_module_point_not_3:
cmp #4
bne lcd_draw_dbg_module_point_not_4
&selon lcd_draw_dbg_module_data_menu_12
rts
lcd_draw_dbg_module_point_not_4:
cmp #5
bne lcd_draw_dbg_module_point_not_5
&selon lcd_draw_dbg_module_data_menu_14
rts
lcd_draw_dbg_module_point_not_5:
cmp #6
bne lcd_draw_dbg_module_point_not_6
&selon lcd_draw_dbg_module_data_menu_16
rts
lcd_draw_dbg_module_point_not_6:
cmp #7
bne lcd_draw_dbg_module_point_not_7
&selon lcd_draw_dbg_module_data_menu_18
rts
lcd_draw_dbg_module_point_not_7:
cmp #8
bne lcd_draw_dbg_module_point_not_8
&selon lcd_draw_dbg_module_data_menu_20
rts
lcd_draw_dbg_module_point_not_8:
cmp #9
bne lcd_draw_dbg_module_point_not_9
&selon lcd_draw_dbg_module_data_menu_22
rts
lcd_draw_dbg_module_point_not_9:
cmp #10
bne lcd_draw_dbg_module_point_not_10
&selon lcd_draw_dbg_module_data_menu_23
rts
lcd_draw_dbg_module_point_not_10:
&selon lcd_draw_dbg_module_data_menu_24
rts
lcd_draw_dbg_module_data_menu_01:
db 2,3,'### DSP-01 Debug Mode : Ch.=[**] ###',tail
lcd_draw_dbg_module_data_menu_02:
db 3,4,'MIDI CH = ',tail
lcd_draw_dbg_module_data_menu_03:
db 3,14,'[**]',tail
lcd_draw_dbg_module_data_menu_05:
db 3,21,'Note NO.= ',tail
lcd_draw_dbg_module_data_menu_06:
db 3,31,'[**]',tail
lcd_draw_dbg_module_data_menu_07:
db 4,4,'Bank = ',tail
lcd_draw_dbg_module_data_menu_08:
db 4,11,'[**]',tail
lcd_draw_dbg_module_data_menu_09:
db 4,17,'Panpot = ',tail
lcd_draw_dbg_module_data_menu_10:
db 4,26,'[**]',tail
lcd_draw_dbg_module_data_menu_11:
db 5,4,'Start = ',tail
lcd_draw_dbg_module_data_menu_12:
db 5,12,'[**]',tail
lcd_draw_dbg_module_data_menu_13:
db 5,18,'Top = ',tail
lcd_draw_dbg_module_data_menu_14:
db 5,24,'[**]',tail
lcd_draw_dbg_module_data_menu_15:
db 5,30,'End = ',tail
lcd_draw_dbg_module_data_menu_16:
db 5,36,'[**]',tail
lcd_draw_dbg_module_data_menu_17:
db 6,4,'Fn(H) = ',tail
lcd_draw_dbg_module_data_menu_18:
db 6,12,'[**]',tail
lcd_draw_dbg_module_data_menu_19:
db 6,18,'(M) = ',tail
lcd_draw_dbg_module_data_menu_20:
db 6,24,'[**]',tail
lcd_draw_dbg_module_data_menu_21:
db 6,30,'(L) = ',tail
lcd_draw_dbg_module_data_menu_22:
db 6,36,'[**]',tail
lcd_draw_dbg_module_data_menu_23:
db 7,7,'<Return to Menu>',tail
lcd_draw_dbg_module_data_menu_24:
db 7,25,'<Next Channel>',tail
rts
;##### PCM Mode #####
mouse_event_pcm_module:
lda mouse_sw
and #up
beq mouse_event_pcm_not_up
ldx pcm_point
lda pcm_table_01,x
sta pcm_point
jmp mouse_event_pcm_screen_redraw
mouse_event_pcm_not_up:
lda mouse_sw
and #down
beq mouse_event_pcm_not_down
ldx pcm_point
lda pcm_table_02,x
sta pcm_point
jmp mouse_event_pcm_screen_redraw
mouse_event_pcm_not_down:
lda mouse_sw
and #right
beq mouse_event_pcm_not_right
lda pcm_point
cmp #4
bne mouse_event_pcm_pass
inc pcm_point
jmp mouse_event_pcm_screen_redraw
mouse_event_pcm_pass:
jmp mouse_event_return
mouse_event_pcm_not_right:
lda mouse_sw
and #left
beq mouse_event_pcm_not_left
lda pcm_point
cmp #5
bne mouse_event_pcm_pass
dec pcm_point
jmp mouse_event_pcm_screen_redraw
mouse_event_pcm_not_left:
lda mouse_sw
and #00110000b
beq mouse_event_pcm_pass
lda pcm_point
asl a
tax
jmp (pcm_mode_jump),x
pcm_mode_jump:
dw pcm_mode_channel
dw pcm_mode_note
dw pcm_mode_tone
dw pcm_mode_panpot
dw mouse_event_return_back_to_main_menu
dw pcm_mode_next
mouse_sw_inc_dec_check:
sta work+12
lda mouse_sw
and #sw_r
bne mouse_sw_inc
lda work+12
dec a
rts
mouse_sw_inc:
lda work+12
inc a
rts
pcm_mode_channel:
lda basic_ch
jsr mouse_sw_inc_dec_check
and #00001111b
sta basic_ch
&hex_disp_with_point 108,basic_ch
jmp mouse_event_return
pcm_mode_note:
ldx pcm_plane
lda basic_note,x
jsr mouse_sw_inc_dec_check
and #01111111b
sta basic_note,x
sta work+13
&hex_disp_with_point 146,work+13
jmp mouse_event_return
pcm_mode_tone:
ldx pcm_plane
lda basic_tone,x
jsr mouse_sw_inc_dec_check
and #00111111b
sta basic_tone,x
sta work+13
&hex_disp_with_point 186,work+13
jmp mouse_event_return
pcm_mode_panpot:
ldx pcm_plane
lda basic_pan,x
jsr mouse_sw_inc_dec_check
sta basic_pan,x
sta work+13
&hex_disp_with_point 226,work+13
jmp mouse_event_return
pcm_mode_next:
lda pcm_plane
inc a
and #00001111b
sta pcm_plane
jsr lcd_draw_pcm_module
jmp mouse_event_return
mouse_event_pcm_screen_redraw:
&seloff
jsr lcd_draw_pcm_module_redraw
jmp mouse_event_return
pcm_table_02:
db 1,2,3,5,4,0
pcm_table_01:
db 5,0,1,2,4,3
;##### PCM Module Mode Screen #####
lcd_draw_pcm_module:
&movi 5,pcm_point
jsr lcd_draw_menu_back_screen
lcd_draw_pcm_module_redraw:
&write lcd_draw_pcm_module_data_menu_01
&hex_disp_with_point 71,pcm_plane
&write lcd_draw_pcm_module_data_menu_02
&write lcd_draw_pcm_module_data_menu_03
&hex_disp_with_point 108,basic_ch
&write lcd_draw_pcm_module_data_menu_05
&write lcd_draw_pcm_module_data_menu_06
ldx pcm_plane
lda basic_note,x
sta work+13
&hex_disp_with_point 146,work+13
&write lcd_draw_pcm_module_data_menu_07
&write lcd_draw_pcm_module_data_menu_08
ldx pcm_plane
lda basic_tone,x
sta work+13
&hex_disp_with_point 186,work+13
&write lcd_draw_pcm_module_data_menu_09
&write lcd_draw_pcm_module_data_menu_10
ldx pcm_plane
lda basic_pan,x
sta work+13
&hex_disp_with_point 226,work+13
&write lcd_draw_pcm_module_data_menu_11
&write lcd_draw_pcm_module_data_menu_12
lda pcm_point
bne lcd_draw_pcm_module_point_not_0
&selon lcd_draw_pcm_module_data_menu_03
rts
lcd_draw_pcm_module_point_not_0:
cmp #1
bne lcd_draw_pcm_module_point_not_1
&selon lcd_draw_pcm_module_data_menu_06
rts
lcd_draw_pcm_module_point_not_1:
cmp #2
bne lcd_draw_pcm_module_point_not_2
&selon lcd_draw_pcm_module_data_menu_08
rts
lcd_draw_pcm_module_point_not_2:
cmp #3
bne lcd_draw_pcm_module_point_not_3
&selon lcd_draw_pcm_module_data_menu_10
rts
lcd_draw_pcm_module_point_not_3:
cmp #4
bne lcd_draw_pcm_module_point_not_4
&selon lcd_draw_pcm_module_data_menu_11
rts
lcd_draw_pcm_module_point_not_4:
&selon lcd_draw_pcm_module_data_menu_12
rts
lcd_draw_pcm_module_data_menu_01:
db 2,3,'### DSP-01 PCM Module : Ch.=[**] ###',tail
lcd_draw_pcm_module_data_menu_02:
db 3,5,'MIDI Receive Channel = ',tail
lcd_draw_pcm_module_data_menu_03:
db 3,28,'[**]',tail
lcd_draw_pcm_module_data_menu_05:
db 4,5,'Accept Note Number = ',tail
lcd_draw_pcm_module_data_menu_06:
db 4,26,'[**]',tail
lcd_draw_pcm_module_data_menu_07:
db 5,5,'Preset TONE Number = ',tail
lcd_draw_pcm_module_data_menu_08:
db 5,26,'[**]',tail
lcd_draw_pcm_module_data_menu_09:
db 6,5,'Stereo PANPOT Data = ',tail
lcd_draw_pcm_module_data_menu_10:
db 6,26,'[**]',tail
lcd_draw_pcm_module_data_menu_11:
db 7,7,'<Return to Menu>',tail
lcd_draw_pcm_module_data_menu_12:
db 7,25,'<Next Channel>',tail
;##### Mouse Remains #####
mouse_event_init_screen:
lda mouse_sw
and #00110000b
bne mouse_event_init_screen_to_main
jmp mouse_event_return
mouse_event_init_screen_to_main:
&movi 2,main_point
jmp mouse_event_return_back_to_main_menu
mouse_event_midi_control:
mouse_event_midi_mtr:
lda mouse_sw
and #sw_l
bne mouse_event_midi_control_return
jmp mouse_event_return
mouse_event_midi_control_return:
jmp mouse_event_return_back_to_main_menu
mouse_event_midi_monitor:
lda mouse_sw
and #sw_l
bne mouse_event_return_back_to_main_menu
jmp mouse_event_return
mouse_event_return_back_to_main_menu:
&movi 1,screen_mode
jsr lcd_draw_main_menu
jmp mouse_event_return
mouse_event_main_menu:
lda mouse_sw
and #sw_r
bne mouse_event_00_sw_seq
jmp mouse_event_00_up_move
mouse_event_00_sw_seq:
lda main_point
asl a
tax
jmp (mouse_event_00_sw_jump),x
mouse_event_00_sw_jump:
dw mouse_event_return ; (Dummy)
dw mouse_event_return ; (Dummy)
dw mouse_event_to_midi_monitor ; 2
dw mouse_event_to_dsp_debug ; 3
dw mouse_event_to_pcm_module ; 4
dw mouse_event_to_midi_control ; 5
dw mouse_event_to_midi_mtr ; 6
mouse_event_to_midi_monitor:
&movi 2,screen_mode
jsr lcd_draw_midi_monitor
jmp mouse_event_return
mouse_event_to_dsp_debug:
&movi 3,screen_mode
jsr lcd_draw_dsp_debug
ldx #0
lda #0
mouse_event_dsp_initial:
sta dsp-01+090h,x ; Control Word
inx
cpx #10h
bne mouse_event_dsp_initial
jmp mouse_event_return
mouse_event_to_pcm_module:
&movi 4,screen_mode
jsr lcd_draw_pcm_module
jmp mouse_event_return
mouse_event_to_midi_control:
&movi 5,screen_mode
jsr lcd_draw_midi_control
jmp mouse_event_return
mouse_event_to_midi_mtr:
&movi 6,screen_mode
jsr lcd_draw_midi_mtr
jmp mouse_event_return
mouse_event_00_up_move:
lda mouse_sw
and #up
bne mouse_event_00_up_move_seq
jmp mouse_event_00_down_move
mouse_event_00_up_move_seq:
&seloff
lda main_point
cmp #2
bne mouse_event_00_up_move_001
&movi 6,main_point
&selon lcd_draw_main_message_6
jmp mouse_event_return
mouse_event_00_up_move_001:
cmp #3
bne mouse_event_00_up_move_002
&movi 2,main_point
&selon lcd_draw_main_message_2
jmp mouse_event_return
mouse_event_00_up_move_002:
cmp #4
bne mouse_event_00_up_move_003
&movi 3,main_point
&selon lcd_draw_main_message_3
jmp mouse_event_return
mouse_event_00_up_move_003:
cmp #5
bne mouse_event_00_up_move_004
&movi 4,main_point
&selon lcd_draw_main_message_4
jmp mouse_event_return
mouse_event_00_up_move_004:
&movi 5,main_point
&selon lcd_draw_main_message_5
jmp mouse_event_return
mouse_event_00_down_move:
lda mouse_sw
and #down
&equal_return
&seloff
lda main_point
cmp #2
bne mouse_event_00_down_move_001
&movi 3,main_point
&selon lcd_draw_main_message_3
jmp mouse_event_return
mouse_event_00_down_move_001:
cmp #3
bne mouse_event_00_down_move_002
&movi 4,main_point
&selon lcd_draw_main_message_4
jmp mouse_event_return
mouse_event_00_down_move_002:
cmp #4
bne mouse_event_00_down_move_003
&movi 5,main_point
&selon lcd_draw_main_message_5
jmp mouse_event_return
mouse_event_00_down_move_003:
cmp #5
bne mouse_event_00_down_move_004
&movi 6,main_point
&selon lcd_draw_main_message_6
jmp mouse_event_return
mouse_event_00_down_move_004:
&movi 2,main_point
&selon lcd_draw_main_message_2
jmp mouse_event_return
mouse_event_return:
stz mouse_sw
rts
;##### MIDI 8-Track MTR Mode Screen #####
lcd_draw_midi_mtr:
jsr lcd_draw_menu_back_screen
&write lcd_draw_mada_mada
rts
lcd_draw_mada_mada:
db 4,5,'・・・ スンマヘンナア。 マダ デキテ オランノドスエ。',tail
;##### MIDI System Controller Screen #####
lcd_draw_midi_control:
jsr lcd_draw_menu_back_screen
&write lcd_draw_mada_mada
rts
;##### MIDI Monitor Screen #####
lcd_draw_midi_monitor:
jsr lcd_draw_menu_back_screen
&write lcd_draw_midi_monitor_data
&movi 5,erase_point
stz lcd_era_h
stz moni_point
&movi 81,lcd_add_l
stz lcd_add_h
&movi 46h,lcd+1
&move lcd_add_l,lcd
&move lcd_add_h,lcd
&movi 59h,lcd+1 ; Cousor ON
&movi 17h,lcd
rts
lcd_draw_midi_monitor_data:
db 2,3,'=== MIDI Signal Stream Monitor ===',tail
;##### MIDI Stream Monitor #####
lcd_midi_monitor_display:
lda rxdata
cmp #0feh
&equal_return
sta lcd_hex_data
jsr lcd_display_hex_data
inc moni_point
lda moni_point
cmp #57
bne lcd_midi_monitor_001
&movi 1,lcd_add_h
bra lcd_midi_monitor_002
lcd_midi_monitor_001:
cmp #65
bne lcd_midi_monitor_002
stz moni_point
stz lcd_add_h
lcd_midi_monitor_002:
ldx erase_point
lda lcd_midi_display_address_table,x
sta lcd_add_l
jsr lcd_display_erase
inc erase_point
lda erase_point
cmp #57
bne lcd_midi_monitor_003
&movi 1,lcd_era_h
rts
lcd_midi_monitor_003:
cmp #65
¬_equal_return
stz erase_point
stz lcd_era_h
rts
lcd_midi_display_address_table:
db 81,84,87,90,93,96,99,102,105,108,111,114,117
db 121,124,127,130,133,136,139,142,145,148,151,154,157
db 161,164,167,170,173,176,179,182,185,188,191,194,197
db 201,204,207,210,213,216,219,222,225,228,231,234,237
db 241,244,247,250,253,0,3,6,9,12,15,18,21
;##### LCD Erase Display #####
; Input : lcd_era_h,lcd_add_l
lcd_display_erase:
&movi 46h,lcd+1
&move lcd_add_l,lcd
&move lcd_era_h,lcd
&movi 42h,lcd+1
lda #20h
sta lcd
sta lcd
ldx moni_point
lda lcd_midi_display_address_table,x
sta lcd_add_l
&movi 46h,lcd+1
&move lcd_add_l,lcd
&move lcd_add_h,lcd
&movi 42h,lcd+1
&movi '*',lcd
&movi 46h,lcd+1
&move lcd_add_l,lcd
&move lcd_add_h,lcd
rts
;##### LCD HEX Data Dislay #####
; Input : (lcd_add_h,lcd_add_l),lcd_hex_data
lcd_display_hex_data_with_address:
&movi 4ch,lcd+1 ; Right
&movi 46h,lcd+1
&move lcd_add_l,lcd
&move lcd_add_h,lcd
lcd_display_hex_data:
&movi 42h,lcd+1
lda lcd_hex_data
lsr a
lsr a
lsr a
lsr a
tax
lda hex_table,x
sta lcd
lda lcd_hex_data
and #0fh
tax
lda hex_table,x
sta lcd
rts
;##### LCD Main Menu Draw #####
lcd_draw_main_menu:
&movi 59h,lcd+1 ; Cousor OFF
&movi 14h,lcd
jsr lcd_draw_menu_back_screen
&write lcd_draw_main_message_1
&write lcd_draw_main_message_2
&write lcd_draw_main_message_3
&write lcd_draw_main_message_4
&write lcd_draw_main_message_5
&write lcd_draw_main_message_6
lda main_point
cmp #2
bne lcd_draw_main_next_03
&selon lcd_draw_main_message_2
rts
lcd_draw_main_next_03:
cmp #3
bne lcd_draw_main_next_04
&selon lcd_draw_main_message_3
rts
lcd_draw_main_next_04:
cmp #4
bne lcd_draw_main_next_05
&selon lcd_draw_main_message_4
rts
lcd_draw_main_next_05:
cmp #5
bne lcd_draw_main_next_06
&selon lcd_draw_main_message_5
rts
lcd_draw_main_next_06:
&selon lcd_draw_main_message_6
rts
lcd_draw_main_message_1:
db 2,3,'**** MAIN MENU **** by Y.Nagashima',tail
lcd_draw_main_message_2:
db 3,7,'[1] MIDI Signal Monitor',tail
lcd_draw_main_message_3:
db 4,7,'[2] ==DSP-01== Debug Tester',tail
lcd_draw_main_message_4:
db 5,7,'[3] PCM Percussion Tone Unit',tail
lcd_draw_main_message_5:
db 6,7,'[4] Japanese Word Processor',tail
lcd_draw_main_message_6:
db 7,7,'[5] MODEM Communication Control',tail
;##### Menu Back Screen #####
lcd_draw_menu_back_screen:
&movi 4ch,lcd+1 ; Right
&movi 46h,lcd+1
stz lcd
stz lcd
&movi 42h,lcd+1
lda #20h
ldy #0
lcd_char_clear_loop_1:
ldx #0
lcd_char_clear_loop_2:
sta lcd
inx
cpx #40
bne lcd_char_clear_loop_2
iny
cpy #8
bne lcd_char_clear_loop_1
lcd_draw_back_plane_black:
&movi 4ch,lcd+1 ; Right
&movi 46h,lcd+1
stz lcd
&movi 10h,lcd
&movi 42h,lcd+1
jsr lcd_draw_main_draw_sub_1
jsr lcd_draw_main_draw_sub_2
jsr lcd_draw_main_draw_sub_3
jsr lcd_draw_main_draw_sub_2
jsr lcd_draw_main_draw_sub_1
rts
lcd_draw_main_draw_sub_1:
ldx #0
lda #0ffh
lcd_draw_main_loop_1:
sta lcd
inx
cpx #40
bne lcd_draw_main_loop_1
rts
lcd_draw_main_draw_sub_2:
&movi 10000000b,lcd
ldx #0
lda #0
lcd_draw_main_loop_2:
sta lcd
inx
cpx #38
bne lcd_draw_main_loop_2
&movi 00000111b,lcd
rts
lcd_draw_main_draw_sub_3:
ldy #0
lcd_draw_main_loop_3:
&movi -0111111b,lcd
ldx #0
lda #0ffh
lcd_draw_main_loop_4:
sta lcd
inx
cpx #38
bne lcd_draw_main_loop_4
&movi 111-0111b,lcd
iny
cpy #60
bne lcd_draw_main_loop_3
rts
;##### LCD Message Mask Cursor ON/OFF Routine #####
lcd_select_mask:
ldy #0
lda (work+2),y
sta work
iny
lda (work+2),y
sta work+1
ldx #0
lcd_select_mask_loop_1:
inx
iny
lda (work+2),y
cmp #tail
bne lcd_select_mask_loop_1
stx work+5
dec work+5
&movi 4fh,lcd+1 ; Down
dec work
asl work
asl work
asl work
dec work
&move work,adsp
&movi 40,adsp+4
&move adsp+8,add_s_l_1
&move adsp+12,add_s_h_1
dec work+1
dec work+1
&move work+1,add_s_l_2
stz add_s_h_2
jsr adder_16
&move add_d_l,work+8
lda add_d_h
ora #00010000b
sta work+9
&movi 46h,lcd+1
&move work+8,lcd
&move work+9,lcd
&movi 42h,lcd+1
&movi 0ffh,work+6
lda work+4
bne lcd_select_mask_loop_2
&movi 11111000b,work+6
lcd_select_mask_loop_2:
ldx #0
lcd_select_mask_loop_3:
&move work+6,lcd
inx
cpx #9
bne lcd_select_mask_loop_3
ldy #0
lcd_select_mask_loop_4:
inc work+8
&movi 46h,lcd+1
&move work+8,lcd
&move work+9,lcd
&movi 42h,lcd+1
ldx #0
lcd_select_mask_loop_5:
&move work+4,lcd
inx
cpx #9
bne lcd_select_mask_loop_5
iny
cpy work+5
bne lcd_select_mask_loop_4
inc work+8
&movi 46h,lcd+1
&move work+8,lcd
&move work+9,lcd
&movi 42h,lcd+1
&movi 0ffh,work+6
lda work+4
bne lcd_select_mask_loop_6
&movi 01111111b,work+6
lcd_select_mask_loop_6:
ldx #0
lcd_select_mask_loop_7:
&move work+6,lcd
inx
cpx #9
bne lcd_select_mask_loop_7
rts
;##### LCD Message Write Subroutine : Called from [&write] #####
lcd_write_message:
ldy #0
lda (work+2),y
sta work
iny
lda (work+2),y
sta work+1
jsr lcd_write_address_set
&movi 42h,lcd+1
lcd_write_message_loop:
iny
lda (work+2),y
cmp #tail
&equal_return
sta lcd
bra lcd_write_message_loop
lcd_write_address_set:
&movi 4ch,lcd+1 ; Right
&movi 46h,lcd+1
dec work
dec work+1
&move work,adsp
&movi 40,adsp+4
&move adsp+8,add_s_l_1
&move adsp+12,add_s_h_1
&move work+1,add_s_l_2
stz add_s_h_2
jsr adder_16
&move add_d_l,lcd
&move add_d_h,lcd
rts
;##### LCD Window Initial Screen Draw #####
lcd_draw_initial:
stz work+7
&movi 4fh,lcd+1 ; Down
lcd_draw_initial_loop_1:
&movi 46h,lcd+1
&move work+7,lcd
&movi 10h,lcd
&movi 42h,lcd+1
ldx #0
lcd_draw_initial_loop_2:
&movi 55h,lcd
&movi 0aah,lcd
inx
cpx #32
bne lcd_draw_initial_loop_2
inc work+7
lda work+7
cmp #40
bne lcd_draw_initial_loop_1
&movi 0cah,work+7
lcd_draw_initial_loop_3:
&movi 46h,lcd+1
&move work+7,lcd
&movi 13h,lcd
&movi 42h,lcd+1
ldx #0
lcd_draw_initial_loop_4:
stz lcd
inx
cpx #16
bne lcd_draw_initial_loop_4
inc work+7
lda work+7
cmp #0dch
bne lcd_draw_initial_loop_3
&movi 095h,work+7
&inidraw lcd_draw_initial_data_1
&inidraw lcd_draw_initial_data_2
&inidraw lcd_draw_initial_data_3
&inidraw lcd_draw_initial_data_4
&inidraw lcd_draw_initial_data_5
&inidraw lcd_draw_initial_data_6
&inidraw lcd_draw_initial_data_5
&inidraw lcd_draw_initial_data_6
&inidraw lcd_draw_initial_data_7
&inidraw lcd_draw_initial_data_8
&inidraw lcd_draw_initial_data_9
&inidraw lcd_draw_initial_data_10
stz screen_mode
rts
lcd_draw_initial_sub:
&movi 46h,lcd+1
&move work+7,lcd
&movi 14h,lcd
&movi 42h,lcd+1
ldy #0
lcd_draw_initial_loop_5:
lda (work),y
sta lcd
iny
cpy #7
bne lcd_draw_initial_loop_5
rts
lcd_draw_initial_data_1:
db 11100000b
db 11100000b
db 11100000b
db 11111100b
db 11100000b
db 11100000b
db 11100000b
lcd_draw_initial_data_2:
db 01110000b
db 01110000b
db 01110000b
db 11110000b
db 01110000b
db 01110000b
db 01110000b
lcd_draw_initial_data_3:
db 11111100b
db 11100000b
db 11100000b
db 11111100b
db 11100000b
db 11100000b
db 11111100b
lcd_draw_initial_data_4:
db 11110000b
db 00000000b
db 00000000b
db 11000000b
db 00000000b
db 00000000b
db 11110000b
lcd_draw_initial_data_5:
db 11100000b
db 11100000b
db 11100000b
db 11100000b
db 11100000b
db 11100000b
db 11111100b
lcd_draw_initial_data_6:
db 00000000b
db 00000000b
db 00000000b
db 00000000b
db 00000000b
db 01110000b
db 11110000b
lcd_draw_initial_data_7:
db 01111100b
db 11100000b
db 11100000b
db 11100000b
db 11100000b
db 11100000b
db 01111100b
lcd_draw_initial_data_8:
db 11100000b
db 01110000b
db 01110000b
db 01110000b
db 01110000b
db 01110000b
db 11100000b
lcd_draw_initial_data_9:
db 01110000b
db 01110000b
db 01110000b
db 01110000b
db 01110000b
db 00000000b
db 01110000b
lcd_draw_initial_data_10:
db 11100000b
db 11100000b
db 11100000b
db 11100000b
db 11100000b
db 00000000b
db 11100000b
;##### Mouse Address Check #####
mouse_point_check:
inc mouse_timer
lda mouse_timer
cmp #3fh
¬_equal_return
stz mouse_timer
lda right_count
cmp comp_level
bmi mouse_check_next_left
stz right_count
stz left_count
lda #00000100b
sta mouse_sw
bra mouse_check_next_up
mouse_check_next_left:
lda left_count
cmp comp_level
bmi mouse_check_next_up
stz right_count
stz left_count
lda #00001000b
sta mouse_sw
mouse_check_next_up:
lda up_count
cmp comp_level
bmi mouse_check_next_down
stz up_count
stz down_count
lda mouse_sw
ora #00000001b
sta mouse_sw
mouse_check_next_down:
lda down_count
cmp comp_level
bmi mouse_check_next_result
stz up_count
stz down_count
lda mouse_sw
ora #00000010b
sta mouse_sw
mouse_check_next_result:
lda mouse_sw
&equal_return
jsr msx_mouse_sw_event
rts
;##### MSX Mouse Event Scan Routine #####
msx_mouse_check:
inc msx_timer
lda msx_timer
beq msx_mouse_check_fourth
cmp #7
beq msx_mouse_check_third
cmp #6
beq msx_mouse_check_second
cmp #5
beq msx_mouse_check_first
rts
msx_mouse_check_fourth:
&movi 000-0101b,uart3+1 ; MSX Strobe to High
rts
msx_mouse_check_third:
lda pia+1
and #00001111b
ora msx_y_data
sta msx_y_data
lda msx_x_data
cmp #0ffh
beq msx_point_change_next
lda msx_x_data
bmi msx_point_change_minus_x
clc
adc left_count
sta left_count
bra msx_point_change_next
msx_point_change_minus_x:
eor #0ffh
and #01111111b
clc
adc right_count
sta right_count
msx_point_change_next:
lda msx_y_data
cmp #0ffh
&equal_return
lda msx_y_data
bmi msx_point_change_minus_y
clc
adc up_count
sta up_count
rts
msx_point_change_minus_y:
eor #0ffh
and #01111111b
clc
adc down_count
sta down_count
rts
msx_mouse_check_second:
lda pia+1
tax
&movi 000-0111b,uart3+1 ; MSX Strobe to Low
txa
asl a
asl a
asl a
asl a
sta msx_y_data
rts
msx_mouse_check_first:
lda pia+1
tax
&movi 000-0111b,uart3+1 ; MSX Strobe to Low
txa
asl a
asl a
asl a
asl a
sta msx_x_data
&move msx_sw_buf,work+11
lda pia+1
lsr a
eor #0ffh
and #00010000b
sta work+12
lda pia+1
asl a
eor #0ffh
and #00100000b
ora work+12
sta work+12
and #00110000b
sta msx_sw_buf ; ** This Position !!
beq msx_mouse_scan_next
eor work+11
beq msx_mouse_scan_next
sta work+13
lda work+12
and work+13
beq msx_mouse_scan_next
sta mouse_sw
msx_mouse_scan_next:
jsr led_display ; DEMO / Wait
lda pia+1
and #00001111b
ora msx_x_data
sta msx_x_data
&movi 000-0101b,uart3+1 ; MSX Strobe to High
lda mouse_sw
&equal_return
jsr msx_mouse_sw_event
rts
;##### MIDI Rx Sequence #####
rx_midi_sequence:
ldx midi_r_end
cpx midi_r_top
&equal_return
inc midi_r_end
lda midi_r_fifo,x
sta rxdata
lda screen_mode
cmp #2
bne rx_midi_not_monitor_mode
jmp lcd_midi_monitor_display
rx_midi_not_monitor_mode:
lda rxdata
bpl rxseq_running
and #0f0h
cmp #090h
beq rxseq_status_event
cmp #080h
beq rxseq_status_event
lda rxdata
and #11111000b
cmp #11111000b
&equal_return
stz midi_rsb
rts
rxseq_status_event:
&move rxdata,midi_rsb
stz midi_dcb
rts
rxseq_running:
lda midi_rsb
&equal_return
and #0f0h
cmp #90h
bne rxseq_not_note_on
lda midi_dcb
bne rxseq_on_velocity
inc midi_dcb
&move rxdata,rxkeyno
rts
rxseq_on_velocity:
stz midi_dcb
lda midi_rsb
and #0fh
sta rxchannel
lda rxdata
beq rxseq_on_velo_zero
sta rxspeed
jsr dsp_on_event
rts
rxseq_on_velo_zero:
jsr dsp_off_event
rts
rxseq_not_note_on:
cmp #80h
bne rxseq_not_note_off
lda midi_dcb
bne rxseq_off_velocity
inc midi_dcb
&move rxdata,rxkeyno
rts
rxseq_off_velocity:
stz midi_dcb
lda midi_rsb
and #0fh
sta rxchannel
jsr dsp_off_event
rts
rxseq_not_note_off:
stz midi_rsb
rts
;##### MIDI Data Transfer Routine #####
tx_midi_sequence:
ldx midi_t_end
cpx midi_t_top
&equal_return
lda uart1+1
and #00000001b
&equal_return
inc midi_t_end
lda midi_t_fifo,x
sta uart1
rts
;##### Interrupt -- TIMER #####
int_timer:
jmp int_seq_ret
;##### Interrupt -- MPU401 #####
int_mpu:
jmp int_seq_ret
;##### Interrupt -- SIO #####
int_sio:
lda uart3
jmp int_seq_ret
;##### Interrupt -- RS232C #####
int_rs232c:
lda uart2
jmp int_seq_ret
;##### IRQ Sequence #####
int:
pha
phx
phy
lda pia
eor #0ffh
and #0fh
asl a
tax
jmp (int_table),x
int_seq_ret:
ply
plx
pla
rti
int_table:
dw int_seq_ret
dw int_mpu
dw int_sio,int_sio
dw int_timer,int_timer
dw int_timer,int_timer
dw int_rs232c,int_rs232c,int_rs232c,int_rs232c
dw int_rs232c,int_rs232c,int_rs232c,int_rs232c
;##### NMI Sequence #####
nmi:
pha
phx
lda uart1
cmp #0feh
beq nmiret
cmp #0f8h
beq nmiret
ldx midi_r_top
sta midi_r_fifo,x
inc midi_r_top
nmiret:
plx
pla
rti
;##### LED Display Demonstration Routine #####
led_display:
inc led_demo
lda led_demo
cmp #3
bne led_display_seq_1
stz led_demo
inc led_demo+1
led_display_seq_1:
lda led_demo+1
and #01111111b
tax
lda led_display_data,x
eor #0ffh
sta pia+2
rts
led_display_data:
db 00000001b,00000010b,00000100b,00001000b,00010000b,00100000b,01000000b,10000000b
db 11000000b,11100000b,11110000b,11111000b,11111100b,11111110b,01111111b,00111111b
db 00011111b,00001111b,00000111b,00000011b,00000001b,00000000b,00010000b,00000000b
db 00001000b,00000000b,00011000b,00100100b,01000010b,10000001b,01000010b,00100100b
db 00011000b,00000000b,00011000b,00111100b,01111110b,11111111b,01111110b,00111100b
db 00011000b,00000000b,00000001b,00000011b,00000101b,00001010b,00010100b,00101000b
db 01010000b,10100000b,01000000b,10000000b,00000010b,00001000b,00100000b,10000000b
db 00000001b,00000010b,00000101b,00001010b,00010101b,00101010b,01010101b,10101010b
db 01010100b,10101000b,01010000b,10100000b,01000000b,10000000b,11000000b,01100000b
db 10110000b,11011000b,01101100b,10110110b,11011011b,01101101b,00110110b,00011011b
db 00001101b,00000110b,00000011b,00000001b,00000000b,10000001b,01000010b,00100100b
db 00011000b,00100100b,01000010b,10000001b,11000011b,11100111b,11111111b,11100111b
db 11000011b,10000001b,00000000b,10000000b,00000001b,01000000b,00000010b,00100000b
db 00000100b,00010000b,00001000b,00010000b,00000100b,00100000b,00000010b,01000000b
db 00000001b,10000000b,00000000b,10000000b,11000000b,01100000b,00110000b,00011000b
db 00001100b,00000110b,00000011b,00000001b,10000000b,00100000b,00001000b,00000010b
;##### 16 Bit Adder #####
adder_16:
clc
lda add_s_l_1
adc add_s_l_2
sta add_d_l
lda add_s_h_1
adc add_s_h_2
sta add_d_h
rts
;##### 16 Bit Substract #####
sub_16:
sec
lda add_s_l_1
sbc add_s_l_2
sta add_d_l
lda add_s_h_1
sbc add_s_h_2
sta add_d_h
rts
;##### Waiting Timer #####
wait_long:
ldx #0
wait_loop_1:
jsr wait_short
inx
bne wait_loop_1
rts
wait_short:
ldy #0
wait_loop_2:
nop
iny
bne wait_loop_2
rts
;##### HEX Data Table #####
hex_table:
db '0123456789ABCDEF'
;##### Debug Use : Debug Address Table Area #####
org debug
dw tone_data_base
;##### Interrupt/Reset Vector Table #####
org vector
dw nmi
dw start
dw int
end
;-----------------------------------------------------------------------
; MIDI SW Matrix Module Program [Z-80]
;-----------------------------------------------------------------------
name x80main
p65c02
;##### Memory・I/O MAP #####
program_area equ 00000h
int_area equ 00038h
work equ 04000h
ram_area equ 04100h
stack_pointer equ 5fffh
uart0 equ 08000h
uart1 equ 08001h
pia0 equ 09000h
pia1 equ 09001h
pia2 equ 09002h
pia3 equ 09003h
dipsw equ 0a000h
ext1 equ 0b000h
ext2 equ 0c000h
;##### RAM Map #####
org work
work0 ds 1
work1 ds 1
work2 ds 1
work3 ds 1
rxtop ds 1
rxend ds 1
rxdata ds 1
rsb ds 1
exclusive_flag ds 1
ex_id ds 1
ex_chno ds 1
ex_function ds 1
ex_group ds 1
ex_machine ds 1
ex_data ds 1
ex_eox ds 1
matrix_data ds 1
matrix_address ds 1
org ram_area
rxfifo ds 256
;##### Macro Defines #####
macro &push
db 0f5h ; push af
endmac
macro &pop
db 0f1h ; pop af
endmac
macro &ex
db 008h ; ex af,af'
db 0d9h ; exx
endmac
macro &stack
db 031h ; ld sp,nn
db .low.\0
db .high.\0
endmac
macro &lda
db 03ah ; ld a,(nn)
db .low.\0
db .high.\0
endmac
macro &sta
db 032h ; ld (nn),a
db .low.\0
db .high.\0
endmac
macro &movi
db 03eh ; ld a,n
db \0
db 032h ; ld (nn),a
db .low.\1
db .high.\1
endmac
macro &move
db 03ah ; ld a,(nn)
db .low.\0
db .high.\0
db 032h ; ld (nn),a
db .low.\1
db .high.\1
endmac
macro &movex
db 03ah ; ld a,(nn)
db .low.\0
db .high.\0
db 0eeh,0ffh ; xor a,0ffh
db 032h ; ld (nn),a
db .low.\1
db .high.\1
endmac
macro &jsr
db 0cdh ; call xx,nn
db .low.\0
db .high.\0
endmac
macro &jsrnz
db 0c4h ; call nz,nn
db .low.\0
db .high.\0
endmac
macro &jmp
db 0c3h ; jp xx,nn
db .low.\0
db .high.\0
endmac
macro &beq
db 0cah ; jp z,nn
db .low.\0
db .high.\0
endmac
macro &bne
db 0c2h ; jp nz,nn
db .low.\0
db .high.\0
endmac
macro &rts
db 0c9h ; ret xx
endmac
macro &equal_return
db 0c8h ; ret z
endmac
macro ¬_equal_return
db 0c0h ; ret nz
endmac
macro &and
db 0e6h ; and a,n
db \0
endmac
macro &eor
db 0eeh ; xor a,n
db \0
endmac
macro &ora
db 0f6h ; or a,n
db \0
endmac
macro &cmp
db 0feh ; cp a,n
db \0
endmac
macro &inc
db 03ch ; inc a
endmac
macro &dec
db 03dh ; dec a
endmac
macro &seth
db 026h ; ld h,n
db .high.\0
endmac
macro &setl
db 03ah ; ld a,(nn)
db .low.\0
db .high.\0
db 06fh ; ld l,a
endmac
macro &gethl
db 07eh ; ld a,(hl)
endmac
macro &puthl
db 077h ; ld (hl),a
endmac
macro &nop
db 000h ;
endmac
;##### Program Start ( <-- Power ON Reset ) #####
org program_area
&stack stack_pointer
db 0f3h ; <DI>
db 0edh,56h ; <IM 1>
&jmp main_routine
;##### MIDI INT Sequence #####
org int_area
&ex
&setl rxtop
&lda uart0
&puthl
db 2ch ; <inc l>
db 7dh ; <ld a,l>
&sta rxtop
&ex
db 0fbh ; <EI>
db 0edh,4dh ; <RETI>
;##### Main Program Area #####
main_routine:
&jsr waiting
&jsr io_initial
loop:
&jsr midi_rx_check
&jmp loop
;##### Matrix Data Write Routine #####
matrix_write:
&movi 1,pia0 ; CS
&move matrix_address,pia1 ; Address
&move matrix_data,pia2 ; Data
&nop
&movi 0,pia0 ; CS
&nop
&movi 1,pia0 ; CS
&rts
;##### MIDI Receive Data Check Sequence #####
midi_rx_check:
&lda rxend
db 47h ; <ld b,a>
&lda rxtop
db 0b8h ; <cp b>
&equal_return
db 78h ; <ld a,b>
&inc
&sta rxend
db 68h ; <ld l,b>
&seth rxfifo
&gethl
&sta rxdata
&cmp 0f0h
&bne midi_rx_not_exclusive_start_mark
&movi 1,exclusive_flag
&movi 0,rsb
&rts
midi_rx_not_exclusive_start_mark:
&lda exclusive_flag
&cmp 0
&bne midi_rx_exclusive
&rts ;********************* Exclusive Only !!!
midi_rx_exclusive:
&lda exclusive_flag
&cmp 1
&bne midi_exclusive_not_1st
&movi 2,exclusive_flag
&move rxdata,ex_id
&rts
midi_exclusive_not_1st:
&cmp 2
&bne midi_exclusive_not_2nd
&movi 3,exclusive_flag
&move rxdata,ex_chno
&rts
midi_exclusive_not_2nd:
&cmp 3
&bne midi_exclusive_not_3rd
&movi 4,exclusive_flag
&move rxdata,ex_function
&rts
midi_exclusive_not_3rd:
&cmp 4
&bne midi_exclusive_not_4th
&movi 5,exclusive_flag
&move rxdata,ex_group
&rts
midi_exclusive_not_4th:
&cmp 5
&bne midi_exclusive_not_5th
&movi 6,exclusive_flag
&move rxdata,ex_machine
&rts
midi_exclusive_not_5th:
&cmp 6
&bne midi_exclusive_not_6th
&movi 7,exclusive_flag
&move rxdata,ex_data
&rts
midi_exclusive_not_6th:
&move rxdata,ex_eox
&lda ex_id
&cmp 40h
&bne midi_rx_exclusive_format_error
&lda ex_chno
&cmp 0fh
&bne midi_rx_exclusive_format_error
&lda ex_function
&and 11110000b
&cmp 70h
&bne midi_rx_exclusive_format_error
&lda ex_group
&cmp 7fh
&bne midi_rx_exclusive_format_error
&lda ex_eox
&cmp 0f7h
&bne midi_rx_exclusive_format_error
&lda ex_machine
&cmp 1 ; MACHINE ID = <1> **********
&bne midi_rx_exclusive_format_error
&move ex_data,matrix_data
&lda ex_function
&cmp 70h
&beq midi_rx_exclusive_70
&cmp 71h
&beq midi_rx_exclusive_71
&cmp 72h
&beq midi_rx_exclusive_72
&cmp 73h
&beq midi_rx_exclusive_73
&cmp 74h
&beq midi_rx_exclusive_74
&cmp 75h
&beq midi_rx_exclusive_75
&cmp 76h
&beq midi_rx_exclusive_76
&cmp 77h
&beq midi_rx_exclusive_77
&rts
midi_rx_exclusive_70:
&movi 0,matrix_address
&jsr matrix_write
&rts
midi_rx_exclusive_71:
&movi 1,matrix_address
&jsr matrix_write
&rts
midi_rx_exclusive_72:
&movi 2,matrix_address
&jsr matrix_write
&rts
midi_rx_exclusive_73:
&movi 3,matrix_address
&jsr matrix_write
&rts
midi_rx_exclusive_74:
&movi 4,matrix_address
&jsr matrix_write
&rts
midi_rx_exclusive_75:
&movi 5,matrix_address
&jsr matrix_write
&rts
midi_rx_exclusive_76:
&movi 6,matrix_address
&jsr matrix_write
&rts
midi_rx_exclusive_77:
&movi 7,matrix_address
&jsr matrix_write
&rts
midi_rx_exclusive_format_error:
&movi 0,exclusive_flag
&rts
;##### System I/O Initialize #####
io_initial:
; <INT Address Set>
&ex
&seth rxfifo
&ex
; <RAM Clear>
&movi 0,work0
&seth work
ram_clear_work:
&setl work0
db 3eh,00h ; ld a,#0
&puthl
&lda work0
&inc
&sta work0
&cmp 0
&bne ram_clear_work
&seth rxfifo
ram_clear_rxfifo:
&setl work0
db 3eh,00h ; ld a,#0
&puthl
&lda work0
&inc
&sta work0
&cmp 0
&bne ram_clear_rxfifo
; <71055 PIA Initialize>
&movi 10000000b,pia3 ; Port<2>=<1>=<0>=Out
&movi 1,pia0 ; CS
&movi 0,pia1 ; Address
&movi 0,pia2 ; Data
; <71051 UART Initialize>
&movi 0,uart1
&movi 0,uart1
&movi 0,uart1
&movi 01000000b,uart1 ; Software Reset
&movi 01001110b,uart1 ; Mode Set
&movi 00010100b,uart1 ; Command Set
; <Parameters>
&movi 0,matrix_address
&movi 0,matrix_data
&jsr matrix_write
&movi 1,matrix_address
&movi 1,matrix_data
&jsr matrix_write
&movi 2,matrix_address
&movi 2,matrix_data
&jsr matrix_write
&movi 3,matrix_address
&movi 3,matrix_data
&jsr matrix_write
&movi 4,matrix_address
&movi 4,matrix_data
&jsr matrix_write
&movi 5,matrix_address
&movi 5,matrix_data
&jsr matrix_write
&movi 6,matrix_address
&movi 6,matrix_data
&jsr matrix_write
&movi 7,matrix_address
&movi 7,matrix_data
&jsr matrix_write
; <Enable Interrupt>
db 0fbh ; <EI>
&rts
;##### Waiting Timer #####
waiting:
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
&rts
end
;-----------------------------------------------------------------------
; RS232C ---> MIDI Out Module Program [Z-80]
;-----------------------------------------------------------------------
name y80main
p65c02
;##### Memory・I/O MAP #####
program_area equ 00000h
int_area equ 00038h
work_area equ 04000h
ram_area equ 04100h
stack_pointer equ 5fffh
uart0 equ 08000h
uart1 equ 08001h
rs232c equ 0b000h
;##### RAM Map #####
org work_area
work ds 1
hlflag ds 1
hlbuf ds 1
databuf ds 1
rxtop ds 1
rxend ds 1
rxdata ds 1
txtop ds 1
txend ds 1
txdata ds 1
org ram_area
rxfifo ds 256
txfifo ds 256
;##### Macro Defines #####
macro &push
db 0f5h ; push af
endmac
macro &pop
db 0f1h ; pop af
endmac
macro &ex
db 008h ; ex af,af'
db 0d9h ; exx
endmac
macro &stack
db 031h ; ld sp,nn
db .low.\0
db .high.\0
endmac
macro &lda
db 03ah ; ld a,(nn)
db .low.\0
db .high.\0
endmac
macro &sta
db 032h ; ld (nn),a
db .low.\0
db .high.\0
endmac
macro &movi
db 03eh ; ld a,n
db \0
db 032h ; ld (nn),a
db .low.\1
db .high.\1
endmac
macro &move
db 03ah ; ld a,(nn)
db .low.\0
db .high.\0
db 032h ; ld (nn),a
db .low.\1
db .high.\1
endmac
macro &movex
db 03ah ; ld a,(nn)
db .low.\0
db .high.\0
db 0eeh,0ffh ; xor a,0ffh
db 032h ; ld (nn),a
db .low.\1
db .high.\1
endmac
macro &jsr
db 0cdh ; call xx,nn
db .low.\0
db .high.\0
endmac
macro &jsrnz
db 0c4h ; call nz,nn
db .low.\0
db .high.\0
endmac
macro &jmp
db 0c3h ; jp xx,nn
db .low.\0
db .high.\0
endmac
macro &beq
db 0cah ; jp z,nn
db .low.\0
db .high.\0
endmac
macro &bne
db 0c2h ; jp nz,nn
db .low.\0
db .high.\0
endmac
macro &rts
db 0c9h ; ret xx
endmac
macro &and
db 0e6h ; and a,n
db \0
endmac
macro &eor
db 0eeh ; xor a,n
db \0
endmac
macro &ora
db 0f6h ; or a,n
db \0
endmac
macro &cmp
db 0feh ; cp a,n
db \0
endmac
macro &inc
db 03ch ; inc a
endmac
macro &dec
db 03dh ; dec a
endmac
macro &seth
db 026h ; ld h,n
db .high.\0
endmac
macro &setl
db 03ah ; ld a,(nn)
db .low.\0
db .high.\0
db 06fh ; ld l,a
endmac
macro &gethl
db 07eh ; ld a,(hl)
endmac
macro &puthl
db 077h ; ld (hl),a
endmac
macro &nop
db 000h ;
endmac
;##### Program Start ( <-- Power ON Reset ) #####
org program_area
&stack stack_pointer
db 0f3h ; <DI>
db 0edh,56h ; <IM 1>
&jmp main_routine
;##### RS232C INT Sequence #####
org int_area
&ex
&setl rxtop
&lda rs232c
&puthl
db 2ch ; <inc l>
db 7dh ; <ld a,l>
&sta rxtop
&ex
db 0fbh ; <EI>
db 0edh,4dh ; <RETI>
;##### Main Program Area #####
main_routine:
&jsr io_initial
loop:
&jsr rs232c_rx_check
&jsr midi_tx_sequence
&jmp loop
;##### RS232C Receive Data Check Sequence #####
rs232c_rx_check:
&lda rxend
db 47h ; <ld b,a>
&lda rxtop
db 0b8h ; <cp b>
&bne rs232c_rx_data_found
&rts
rs232c_rx_data_found:
db 78h ; <ld a,b>
&inc
&sta rxend
db 68h ; <ld l,b>
&seth rxfifo
&gethl
&sta rxdata
&cmp 03ah
&bne rs232c_rx_check_not_colon
&movi 0,hlflag
&rts
rs232c_rx_check_not_colon:
&cmp 030h
&bne rs232c_rx_check_not_0
&movi 0,hlbuf
&jmp rs232c_hl_check
rs232c_rx_check_not_0:
&cmp 031h
&bne rs232c_rx_check_not_1
&movi 1,hlbuf
&jmp rs232c_hl_check
rs232c_rx_check_not_1:
&cmp 032h
&bne rs232c_rx_check_not_2
&movi 2,hlbuf
&jmp rs232c_hl_check
rs232c_rx_check_not_2:
&cmp 033h
&bne rs232c_rx_check_not_3
&movi 3,hlbuf
&jmp rs232c_hl_check
rs232c_rx_check_not_3:
&cmp 034h
&bne rs232c_rx_check_not_4
&movi 4,hlbuf
&jmp rs232c_hl_check
rs232c_rx_check_not_4:
&cmp 035h
&bne rs232c_rx_check_not_5
&movi 5,hlbuf
&jmp rs232c_hl_check
rs232c_rx_check_not_5:
&cmp 036h
&bne rs232c_rx_check_not_6
&movi 6,hlbuf
&jmp rs232c_hl_check
rs232c_rx_check_not_6:
&cmp 037h
&bne rs232c_rx_check_not_7
&movi 7,hlbuf
&jmp rs232c_hl_check
rs232c_rx_check_not_7:
&cmp 038h
&bne rs232c_rx_check_not_8
&movi 8,hlbuf
&jmp rs232c_hl_check
rs232c_rx_check_not_8:
&cmp 039h
&bne rs232c_rx_check_not_9
&movi 9,hlbuf
&jmp rs232c_hl_check
rs232c_rx_check_not_9:
&cmp 041h
&bne rs232c_rx_check_not_10
&movi 10,hlbuf
&jmp rs232c_hl_check
rs232c_rx_check_not_10:
&cmp 042h
&bne rs232c_rx_check_not_11
&movi 11,hlbuf
&jmp rs232c_hl_check
rs232c_rx_check_not_11:
&cmp 043h
&bne rs232c_rx_check_not_12
&movi 12,hlbuf
&jmp rs232c_hl_check
rs232c_rx_check_not_12:
&cmp 044h
&bne rs232c_rx_check_not_13
&movi 13,hlbuf
&jmp rs232c_hl_check
rs232c_rx_check_not_13:
&cmp 045h
&bne rs232c_rx_check_not_14
&movi 14,hlbuf
&jmp rs232c_hl_check
rs232c_rx_check_not_14:
&cmp 046h
&bne rs232c_rx_check_not_15
&movi 15,hlbuf
&jmp rs232c_hl_check
rs232c_rx_check_not_15:
&rts
rs232c_hl_check:
&lda hlflag
&cmp 0
&bne rs232c_rx_low_data
&movi 1,hlflag
&lda hlbuf
db 0cbh ; <sla a>
db 027h ;
db 0cbh ; <sla a>
db 027h ;
db 0cbh ; <sla a>
db 027h ;
db 0cbh ; <sla a>
db 027h ;
&sta databuf
&rts
rs232c_rx_low_data:
&movi 0,hlflag
&lda hlbuf
db 47h ; <ld b,a>
&lda databuf
db 0b0h ; <or b>
&sta databuf
&seth txfifo
&setl txtop
&lda databuf
&puthl
db 2ch ; <inc l>
db 7dh ; <ld a,l>
&sta txtop
&rts
;##### MIDI Transmit Data Check Sequence #####
midi_tx_sequence:
&lda txend
db 47h ; <ld b,a>
&lda txtop
db 0b8h ; <cp b>
&bne midi_tx_data_found
&rts
midi_tx_data_found:
&lda uart1
&and 00000001b
&cmp 0
&bne midi_tx_uart_ok
&rts
midi_tx_uart_ok:
db 78h ; <ld a,b>
&inc
&sta txend
db 68h ; <ld l,b>
&seth txfifo
&gethl
&sta uart0
&rts
;##### System I/O Initialize #####
io_initial:
; <71051 MIDI UART Initialize>
&movi 0,uart1
&movi 0,uart1
&movi 0,uart1
&movi 01000000b,uart1 ; Software Reset
&movi 01001110b,uart1 ; Mode Set
&movi 00010001b,uart1 ; Command Set
; <71051 RS232C UART Initialize>
&movi 0,rs232c+1
&movi 0,rs232c+1
&movi 0,rs232c+1
&movi 01000000b,rs232c+1 ; Software Reset
&movi 01001110b,rs232c+1 ; Mode Set
&movi 00010100b,rs232c+1 ; Command Set
; <INT Address Set>
&ex
&seth rxfifo
&ex
; <RAM Clear>
&movi 0,work
&seth work_area
ram_clear_work:
&setl work
db 3eh,00h ; ld a,#0
&puthl
&lda work
&inc
&sta work
&cmp 0
&bne ram_clear_work
; <Enable Interrupt>
db 0fbh ; <EI>
&rts
end
;-----------------------------------------------------------------------
; KEBOARD Module Program [Z-80]
;-----------------------------------------------------------------------
name z80main
p65c02
;##### Memory・I/O MAP #####
program_area equ 00000h
int_area equ 00038h
work equ 04000h
ram_area equ 04100h
stack_pointer equ 5fffh
uart0 equ 08000h
uart1 equ 08001h
pia0 equ 09000h
pia1 equ 09001h
pia2 equ 09002h
pia3 equ 09003h
dipsw equ 0a000h
ext1 equ 0b000h
ext2 equ 0c000h
;##### RAM Map #####
org work
work0 ds 1
work1 ds 1
work2 ds 1
work3 ds 1
rxtop ds 1
rxend ds 1
rxdata ds 1
exclusive_flag ds 1
ex_id ds 1
ex_chno ds 1
ex_function ds 1
ex_group ds 1
ex_machine ds 1
ex_data ds 1
ex_eox ds 1
txtop ds 1
txend ds 1
txdata ds 1
channel ds 1
velocity ds 1
offset ds 1
sw_scan_phase ds 1
group_offset ds 1
group_event_bit ds 1
group_status ds 1
rsb ds 1
dcb ds 1
note_buffer ds 1
all_off_timer ds 1
all_off_flag ds 1
pedal_new ds 1
pedal_old ds 1
pedal_timer ds 1
group_low_offset ds 1
sw_group_1_phase_0 ds 1
sw_group_2_phase_0 ds 1
sw_group_3_phase_0 ds 1
sw_group_4_phase_0 ds 1
sw_group_5_phase_0 ds 1
sw_group_6_phase_0 ds 1
sw_group_7_phase_0 ds 1
sw_group_8_phase_0 ds 1
sw_group_1_phase_2 ds 1
sw_group_2_phase_2 ds 1
sw_group_3_phase_2 ds 1
sw_group_4_phase_2 ds 1
sw_group_5_phase_2 ds 1
sw_group_6_phase_2 ds 1
sw_group_7_phase_2 ds 1
sw_group_8_phase_2 ds 1
org ram_area
rxfifo ds 256
txfifo ds 256
;##### Macro Defines #####
macro &push
db 0f5h ; push af
endmac
macro &pop
db 0f1h ; pop af
endmac
macro &ex
db 008h ; ex af,af'
db 0d9h ; exx
endmac
macro &stack
db 031h ; ld sp,nn
db .low.\0
db .high.\0
endmac
macro &lda
db 03ah ; ld a,(nn)
db .low.\0
db .high.\0
endmac
macro &sta
db 032h ; ld (nn),a
db .low.\0
db .high.\0
endmac
macro &movi
db 03eh ; ld a,n
db \0
db 032h ; ld (nn),a
db .low.\1
db .high.\1
endmac
macro &move
db 03ah ; ld a,(nn)
db .low.\0
db .high.\0
db 032h ; ld (nn),a
db .low.\1
db .high.\1
endmac
macro &movex
db 03ah ; ld a,(nn)
db .low.\0
db .high.\0
db 0eeh,0ffh ; xor a,0ffh
db 032h ; ld (nn),a
db .low.\1
db .high.\1
endmac
macro &jsr
db 0cdh ; call xx,nn
db .low.\0
db .high.\0
endmac
macro &jsrnz
db 0c4h ; call nz,nn
db .low.\0
db .high.\0
endmac
macro &jmp
db 0c3h ; jp xx,nn
db .low.\0
db .high.\0
endmac
macro &beq
db 0cah ; jp z,nn
db .low.\0
db .high.\0
endmac
macro &bne
db 0c2h ; jp nz,nn
db .low.\0
db .high.\0
endmac
macro &rts
db 0c9h ; ret xx
endmac
macro &equal_return
db 0c8h ; ret z
endmac
macro ¬_equal_return
db 0c0h ; ret nz
endmac
macro &and
db 0e6h ; and a,n
db \0
endmac
macro &eor
db 0eeh ; xor a,n
db \0
endmac
macro &ora
db 0f6h ; or a,n
db \0
endmac
macro &cmp
db 0feh ; cp a,n
db \0
endmac
macro &inc
db 03ch ; inc a
endmac
macro &dec
db 03dh ; dec a
endmac
macro &seth
db 026h ; ld h,n
db .high.\0
endmac
macro &setl
db 03ah ; ld a,(nn)
db .low.\0
db .high.\0
db 06fh ; ld l,a
endmac
macro &gethl
db 07eh ; ld a,(hl)
endmac
macro &puthl
db 077h ; ld (hl),a
endmac
macro &nop
db 000h ;
endmac
;##### Program Start ( <-- Power ON Reset ) #####
org program_area
&stack stack_pointer
db 0f3h ; <DI>
db 0edh,56h ; <IM 1>
&jmp main_routine
;##### MIDI INT Sequence #####
org int_area
&ex
&setl rxtop
&lda uart0
&puthl
db 2ch ; <inc l>
db 7dh ; <ld a,l>
&sta rxtop
&ex
db 0fbh ; <EI>
db 0edh,4dh ; <RETI>
;##### Main Program Area #####
main_routine:
&jsr waiting
&jsr io_initial
loop:
&jsr sw_scan
&jsr pedal_scan
&jsr all_note_off_check
&jsr midi_rx_check
&jsr midi_tx_sequence
&jmp loop
;##### Pedal Check Routine #####
pedal_scan:
&lda pedal_timer
&inc
&sta pedal_timer
&cmp 10
¬_equal_return
&movi 0,pedal_timer
&lda dipsw
&and 00000001b
&sta pedal_new
db 47h ; <ld b,a>
&lda pedal_old
db 0a8h ; <xor b>
&equal_return
&seth txfifo
&setl txtop
&lda channel
&and 00001111b
&ora 10110000b
&puthl
db 2ch ; <inc l>
db 3eh,40h ; ld a,#40h
&puthl
db 2ch ; <inc l>
&lda pedal_new
&cmp 0
&beq pedal_off
db 3eh,7fh ; ld a,#7fh
&jmp pedal_final
pedal_off:
db 0afh ; <xor a>
pedal_final:
&puthl
db 2ch ; <inc l>
db 7dh ; <ld a,l>
&sta txtop
&move pedal_new,pedal_old
&rts
;##### All Note Off Check Routine #####
all_note_off_check:
&lda all_off_timer
&inc
&sta all_off_timer
&cmp 50
¬_equal_return
&movi 0,all_off_timer
&lda all_off_flag
&cmp 0
&equal_return
&lda sw_group_1_phase_0
&cmp 0
¬_equal_return
&lda sw_group_2_phase_0
&cmp 0
¬_equal_return
&lda sw_group_3_phase_0
&cmp 0
¬_equal_return
&lda sw_group_4_phase_0
&cmp 0
¬_equal_return
&lda sw_group_5_phase_0
&cmp 0
¬_equal_return
&lda sw_group_6_phase_0
&cmp 0
¬_equal_return
&lda sw_group_7_phase_0
&cmp 0
¬_equal_return
&lda sw_group_8_phase_0
&cmp 0
¬_equal_return
&seth txfifo
&setl txtop
&lda channel
&and 00001111b
&ora 10110000b
&puthl
db 2ch ; <inc l>
db 3eh,7bh ; ld a,#7bh
&puthl
db 2ch ; <inc l>
db 3eh,00h ; ld a,#0
&puthl
db 2ch ; <inc l>
db 7dh ; <ld a,l>
&sta txtop
&movi 0,all_off_flag
&rts
;##### SW Event Check Routine #####
sw_scan_event_check:
&lda group_event_bit
&and 00000001b
&cmp 0
&jsrnz sw_scan_001
&lda group_event_bit
&and 00000010b
&cmp 0
&jsrnz sw_scan_002
&lda group_event_bit
&and 00000100b
&cmp 0
&jsrnz sw_scan_003
&lda group_event_bit
&and 00001000b
&cmp 0
&jsrnz sw_scan_004
&lda group_event_bit
&and 00010000b
&cmp 0
&jsrnz sw_scan_005
&lda group_event_bit
&and 00100000b
&cmp 0
&jsrnz sw_scan_006
&lda group_event_bit
&and 01000000b
&cmp 0
&jsrnz sw_scan_007
&rts
sw_scan_001:
&movi 0,group_low_offset
&jmp sw_scan_010
sw_scan_002:
&movi 1,group_low_offset
&jmp sw_scan_010
sw_scan_003:
&movi 2,group_low_offset
&jmp sw_scan_010
sw_scan_004:
&movi 3,group_low_offset
&jmp sw_scan_010
sw_scan_005:
&movi 4,group_low_offset
&jmp sw_scan_010
sw_scan_006:
&movi 5,group_low_offset
&jmp sw_scan_010
sw_scan_007:
&movi 6,group_low_offset
&jmp sw_scan_010
sw_scan_010:
&seth txfifo
&setl txtop
&lda channel
&and 00001111b
&ora 10010000b
&puthl
db 2ch ; <inc l>
&lda group_offset
db 47h ; <ld b,a>
&lda group_low_offset
db 80h ; <add a,b>
db 47h ; <ld b,a>
&lda offset
db 80h ; <add a,b>
db 47h ; <ld b,a>
&lda group_offset
&cmp 0
&beq sw_scan_adjust
db 05h ; <dec b>
sw_scan_adjust:
db 78h ; <ld a,b>
&and 01111111b
&puthl
db 2ch ; <inc l>
&lda group_event_bit
db 47h ; <ld b,a>
&lda group_status
db 0a0h ; <and b>
&cmp 0
&beq sw_scan_key_off
&movi 1,all_off_flag
&lda velocity
&jmp sw_scan_final
sw_scan_key_off:
db 0afh ; <xor a>
sw_scan_final:
&puthl
db 2ch ; <inc l>
db 7dh ; <ld a,l>
&sta txtop
&rts
;##### SW Scan Routine #####
sw_scan:
&lda sw_scan_phase
db 47h ; <ld b,a>
&inc
&sta sw_scan_phase
db 78h ; <ld a,b>
&cmp 1
&beq sw_scan_seq_1
&cmp 2
&beq sw_scan_seq_2
&cmp 3
&beq sw_scan_seq_3
&cmp 4
&beq sw_scan_seq_4
&cmp 5
&beq sw_scan_seq_5
&cmp 6
&beq sw_scan_seq_6
&cmp 7
&beq sw_scan_seq_7
&cmp 8
&beq sw_scan_seq_8
&movi 1,sw_scan_phase
&rts
sw_scan_seq_1:
&movex pia0,sw_group_1_phase_2
&movi 11111101b,pia1
&lda sw_group_1_phase_2
db 47h ; <ld b,a>
&lda sw_group_1_phase_0
db 0a8h ; <xor b>
&equal_return
&sta group_event_bit
db 78h ; <ld a,b>
&sta sw_group_1_phase_0
&sta group_status
&movi 0,group_offset
&jsr sw_scan_event_check
&rts
sw_scan_seq_2:
&movex pia0,sw_group_2_phase_2
&movi 11111011b,pia1
&lda sw_group_2_phase_2
db 47h ; <ld b,a>
&lda sw_group_2_phase_0
db 0a8h ; <xor b>
&equal_return
&sta group_event_bit
db 78h ; <ld a,b>
&sta sw_group_2_phase_0
&sta group_status
&movi 7,group_offset
&jsr sw_scan_event_check
&rts
sw_scan_seq_3:
&movex pia0,sw_group_3_phase_2
&movi 11110111b,pia1
&lda sw_group_3_phase_2
db 47h ; <ld b,a>
&lda sw_group_3_phase_0
db 0a8h ; <xor b>
&equal_return
&sta group_event_bit
db 78h ; <ld a,b>
&sta sw_group_3_phase_0
&movi 13,group_offset
&jsr sw_scan_event_check
&rts
sw_scan_seq_4:
&movex pia0,sw_group_4_phase_2
&movi 11101111b,pia1
&lda sw_group_4_phase_2
db 47h ; <ld b,a>
&lda sw_group_4_phase_0
db 0a8h ; <xor b>
&equal_return
&sta group_event_bit
db 78h ; <ld a,b>
&sta sw_group_4_phase_0
&movi 19,group_offset
&jsr sw_scan_event_check
&rts
sw_scan_seq_5:
&movex pia0,sw_group_5_phase_2
&movi 11011111b,pia1
&lda sw_group_5_phase_2
db 47h ; <ld b,a>
&lda sw_group_5_phase_0
db 0a8h ; <xor b>
&equal_return
&sta group_event_bit
db 78h ; <ld a,b>
&sta sw_group_5_phase_0
&movi 25,group_offset
&jsr sw_scan_event_check
&rts
sw_scan_seq_6:
&movex pia0,sw_group_6_phase_2
&movi 10111111b,pia1
&lda sw_group_6_phase_2
db 47h ; <ld b,a>
&lda sw_group_6_phase_0
db 0a8h ; <xor b>
&equal_return
&sta group_event_bit
db 78h ; <ld a,b>
&sta sw_group_6_phase_0
&movi 31,group_offset
&jsr sw_scan_event_check
&rts
sw_scan_seq_7:
&movex pia0,sw_group_7_phase_2
&movi 01111111b,pia1
&lda sw_group_7_phase_2
db 47h ; <ld b,a>
&lda sw_group_7_phase_0
db 0a8h ; <xor b>
&equal_return
&sta group_event_bit
db 78h ; <ld a,b>
&sta sw_group_7_phase_0
&movi 37,group_offset
&jsr sw_scan_event_check
&rts
sw_scan_seq_8:
&movex pia0,sw_group_8_phase_2
&movi 11111111b,pia1
&lda sw_group_8_phase_2
db 47h ; <ld b,a>
&lda sw_group_8_phase_0
db 0a8h ; <xor b>
&equal_return
db 78h ; <ld a,b>
&sta sw_group_8_phase_0
&movi 43,group_offset
&jsr sw_scan_event_check
&movi 11111110b,pia1
&movi 1,sw_scan_phase
&rts
;##### MIDI Receive Data Check Sequence #####
midi_rx_check:
&lda rxend
db 47h ; <ld b,a>
&lda rxtop
db 0b8h ; <cp b>
&equal_return
db 78h ; <ld a,b>
&inc
&sta rxend
db 68h ; <ld l,b>
&seth rxfifo
&gethl
&sta rxdata
&cmp 0f0h
&bne midi_rx_not_exclusive_start_mark
&movi 1,exclusive_flag
&movi 0,rsb
&rts
midi_rx_not_exclusive_start_mark:
&lda exclusive_flag
&cmp 0
&bne midi_rx_exclusive
&rts ;********************* Exclusive Only !!!
&lda rxdata
&and 10000000b
&cmp 0
&beq midi_rx_running
&lda rxdata
&and 11110000b
&cmp 0f0h
&bne midi_rx_not_real_time
&rts
midi_rx_not_real_time:
&cmp 90h
&beq midi_rx_note_on_status
midi_rx_inhibit_status:
&movi 0,rsb
&rts
midi_rx_note_on_status:
&lda rxdata
&and 00001111b
db 47h ; <ld b,a>
&lda channel
db 0b8h ; <cp b>
&beq midi_rx_inhibit_status
&move rxdata,rsb
&movi 0,dcb
&rts
midi_rx_running:
&lda rsb
&cmp 0
&bne midi_rx_true_running
&rts
midi_rx_true_running:
&lda dcb
&cmp 0
&bne midi_rx_3rd_data
&movi 1,dcb
&move rxdata,note_buffer
&rts
midi_rx_3rd_data:
&movi 0,dcb
&seth txfifo
&setl txtop
&lda rsb
&puthl
db 2ch ; <inc l>
&lda note_buffer
&puthl
db 2ch ; <inc l>
&lda rxdata
&puthl
db 2ch ; <inc l>
db 7dh ; <ld a,l>
&sta txtop
&rts
midi_rx_exclusive:
&lda exclusive_flag
&cmp 1
&bne midi_exclusive_not_1st
&movi 2,exclusive_flag
&move rxdata,ex_id
&rts
midi_exclusive_not_1st:
&cmp 2
&bne midi_exclusive_not_2nd
&movi 3,exclusive_flag
&move rxdata,ex_chno
&rts
midi_exclusive_not_2nd:
&cmp 3
&bne midi_exclusive_not_3rd
&movi 4,exclusive_flag
&move rxdata,ex_function
&rts
midi_exclusive_not_3rd:
&cmp 4
&bne midi_exclusive_not_4th
&movi 5,exclusive_flag
&move rxdata,ex_group
&rts
midi_exclusive_not_4th:
&cmp 5
&bne midi_exclusive_not_5th
&movi 6,exclusive_flag
&move rxdata,ex_machine
&rts
midi_exclusive_not_5th:
&cmp 6
&bne midi_exclusive_not_6th
&movi 7,exclusive_flag
&move rxdata,ex_data
&rts
midi_exclusive_not_6th:
&move rxdata,ex_eox
&lda ex_id
&cmp 40h
&bne midi_rx_exclusive_format_error
&lda ex_chno
&cmp 0fh
&bne midi_rx_exclusive_format_error
&lda ex_function
&and 11110000b
&cmp 70h
&bne midi_rx_exclusive_format_error
&lda ex_group
&cmp 7fh
&bne midi_rx_exclusive_format_error
&lda ex_eox
&cmp 0f7h
&bne midi_rx_exclusive_format_error
&lda ex_machine
&cmp 0 ; MACHINE ID = <0> **********
&bne midi_rx_exclusive_format_error
&lda ex_function
&cmp 70h
&beq midi_rx_exclusive_70_channel_set
&cmp 71h
&beq midi_rx_exclusive_71_velocity_set
&cmp 72h
&beq midi_rx_exclusive_72_offset_set
&rts
midi_rx_exclusive_70_channel_set:
&move ex_data,channel
&rts
midi_rx_exclusive_71_velocity_set:
&move ex_data,velocity
&rts
midi_rx_exclusive_72_offset_set:
&move ex_data,offset
&rts
midi_rx_exclusive_format_error:
&movi 0,exclusive_flag
&rts
;##### MIDI Transmit Data Check Sequence #####
midi_tx_sequence:
&lda txend
db 47h ; <ld b,a>
&lda txtop
db 0b8h ; <cp b>
&bne midi_tx_data_found
&rts
midi_tx_data_found:
&lda uart1
&and 00000001b
&cmp 0
&bne midi_tx_uart_ok
&rts
midi_tx_uart_ok:
db 78h ; <ld a,b>
&inc
&sta txend
db 68h ; <ld l,b>
&seth txfifo
&gethl
&sta uart0
&rts
;##### System I/O Initialize #####
io_initial:
; <INT Address Set>
&ex
&seth rxfifo
&ex
; <RAM Clear>
&movi 0,work0
&seth work
ram_clear_work:
&setl work0
db 3eh,00h ; ld a,#0
&puthl
&lda work0
&inc
&sta work0
&cmp 0
&bne ram_clear_work
&seth rxfifo
ram_clear_rxfifo:
&setl work0
db 3eh,00h ; ld a,#0
&puthl
&lda work0
&inc
&sta work0
&cmp 0
&bne ram_clear_rxfifo
; <71055 PIA Initialize>
&movi 10010000b,pia3 ; Port<2>=<1>=Out,<0>=In
&movi 11111110b,pia1
&movi 0ffh,pia2
; <71051 UART Initialize>
&movi 0,uart1
&movi 0,uart1
&movi 0,uart1
&movi 01000000b,uart1 ; Software Reset
&movi 01001110b,uart1 ; Mode Set
&movi 00010101b,uart1 ; Command Set
; <Parameters>
&movi 1,all_off_flag
&movi 36,offset
&movi 14,channel
&movi 7fh,velocity
; <Enable Interrupt>
db 0fbh ; <EI>
&rts
;##### Waiting Timer #####
waiting:
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
&rts
end
;----------------------------------------------------------------:
; |
; N A K A M U R A S P E C I A L M O D U L E |
; |
; for NO.1 : MIDI Performance Trigger System |
; |
;----------------------------------------------------------------:
;========== Data Area =====================================
dseg abs d_area(04000h)
para_area: ds 128 ; (dummy)
rx_fifo: ds 256 ; Internal UART : MIDI(1) RX
tx_fifo: ds 256*16 ; TX
mode_fifo: ds 256*8 ; Echo Mode
time_fifo: ds 256*8 ; Echo Time Value
iseg abs i_area(0ff00h)
int_flg: ds 1 ; Interrupt Check Flags
rx_top: ds 1 ; MIDI Receive FIFO Top Pointer
rx_end: ds 1 ; MIDI Receive FIFO End Pointer
rx_data: ds 1 ; MIDI Received 1 Byte Data Buffer
status: ds 1 ; MIDI Status Buffer
channel: ds 1 ; MIDI Channel Buffer
rsb: ds 1 ; Running Status Buffer
dcb: ds 1 ; Data Count Buffer
data_1st: ds 1 ; ( Key Number Buffer )
data_2nd: ds 1 ; ( Velocity Buffer )
tx_top: ds 2 ; MIDI Transmit FIFO Top Pointer
tx_end: ds 2 ; MIDI Transmit FIFO End Pointer
echo_mode: ds 1 ; Echo Mode Selector
echo_counter: ds 1 ; Echo Check Counter
echo_top: ds 8 ; Echo FIFO Top Pointer
echo_end: ds 8 ; Echo FIFO End Pointer
timer_1msec: ds 1 ; 1msec Timer
ad_buffer: ds 2 ; A/D Data Buffer
note_status: ds 2 ; Note Event Status
note_ctr: ds 2 ; Note Event Counter
select_ctr: ds 2 ; Phrase Select Number Counter
select_buf: ds 2 ; Phrase Select Buffer
selected: ds 1 ; Phrase Select Number
point_buff: ds 4 ; Pointer [HL] Buffer
event_mode: ds 1 ; MSB : [0]=ON / [1]=OFF
free_timer: ds 1 ; Semi-Random Counter
end_mark: ds 3 ; Use for Debug !
;========== Bit Map Defines Area ==========================
int_bit_midi equ 0 ; Int_Flg ; MIDI
int_bit_tim_1 equ 1 ; 1msec
;========== RAM / Port Area ===============================
user_area equ 04000h ; Universal RAM Area Top Address
dsp-01 equ 0fa00h ; Tone Generator [DSP-01] : FA00-FBFF
internal_ram equ 0fdc0h ; Internal RAM Top Address
port_p01cr equ 0ffc2h ; Port 0/1 Control
port_p2cr equ 0ffc5h ; Port-2 Control
port_iop3 equ 0ffc6h ; Port-3
port_p3cr equ 0ffc7h ; Port-3 Control
port_p4cr equ 0ffc9h ; Port-4 Control
port_iop5 equ 0ffcah ; Port-5
port_smmod equ 0ffcbh ; Stepping Motor Mode
port_iop6 equ 0ffcch ; Port-6
port_iop7 equ 0ffcdh ; Port-7
port_p67cr equ 0ffceh ; Port-6/7 Control
port_iop8 equ 0ffd0h ; Port-8
port_p8cr equ 0ffd1h ; Port-8 Control
port_wdmod equ 0ffd2h ; Watch Dog Timer Mode
port_wdcr equ 0ffd3h ; Watch Dog Timer Control
port_treg0 equ 0ffd4h ; 16bit Timer <0/1>
port_treg2 equ 0ffd6h ; 8bit Timer <2>
port_treg3 equ 0ffd7h ; 8bit Timer <3>
port_tclk equ 0ffd8h ; Timer Source Control
port_tmod equ 0ffdah ; Timer Mode
port_trun equ 0ffdbh ; Timer/Serial Baud Rate
port_treg5 equ 0ffe2h ; 16bit Timer <5> [low]
port_t4mod equ 0ffe4h ; 16bit Timer Mode
port_t4ffcr equ 0ffe5h ; 16bit Timer Control
port_intel equ 0ffe6h ; Interrupt Enable Mask [low]
port_inteh equ 0ffe7h ; Interrupt Enable Mask [high]
port_dmaeh equ 0ffe8h ; Micro DMA Enable Mask [high]
port_scmod equ 0ffe9h ; Serial Channel Mode
port_sccr equ 0ffeah ; Serial Channel Control
port_scbuf equ 0ffebh ; Serial Channel Buffer
port_bx equ 0ffech ; Bank Register x
port_by equ 0ffedh ; Bank Register y
port_option_x equ 0fff0h ; DSR Bit : [Read] --> Active [Low]
port_option_y equ 0fff1h ; DRR Bit : [Read] --> Active [Low]
port_option_z equ 0fff2h ; CLR DRR : [Read] --> Clear INT0
port_option_d equ 0fff3h ; CLR DSR : Initial=[Read]
port_rs232c equ 0fff8h ; External UART(1) --> INT1
port_ex_midi equ 0fffah ; External UART(2) --> INT2
port_data equ 0fffch ; MPU Data Get Port (RD) : INT0
port_command equ 0fffdh ; MPU Command Get Port (RD) : INT0
port_send equ 0fffeh ; MPU Data Send Port (WR)
port_system equ 0ffffh ; System Port (WR) 6bit
;========== MACRO Defines =================================
%define(midi_put)
local ex(
push hl
ld hl,(tx_top)
ld de,tx_fifo
add hl,de
ld (hl),b
incw (tx_top)
bit 4,(tx_top+1)
jr z,%ex
ldw (tx_top),0
%ex:
pop hl
)
%define(midi_set(memory))(
ld b,(%memory)
%midi_put
)
%define(echo_machine(ch))
local pass off echo note back loop(
cp (echo_mode),%ch
jp nz,%pass
ld a,(echo_end+%ch)
cp a,(echo_top+%ch)
jp z,_int_1msec_next ; None Event !
ld (echo_counter),a
%loop:
ld hl,time_fifo+256*%ch
dec (hl+a)
jr z,%echo
%back:
inc (echo_counter)
ld a,(echo_counter)
cp a,(echo_top+%ch)
jp z,_int_1msec_next
jr %loop
%echo:
inc (echo_end+%ch)
ld hl,mode_fifo+256*%ch
ld l,(hl+a) ; Phrase Number
ld e,l
ld (event_mode),l
and l,01111111b
mul hl,45
ld bc,percus_bank+5*(%ch+1)
add hl,bc
%if(%ch ne 7)then(
push hl
ld a,2+5
ld b,(hl+a)
ld a,(echo_top+%ch+1)
ld hl,time_fifo+256*(%ch+1)
ld (hl+a),b ; Next Time Set !
ld hl,mode_fifo+256*(%ch+1)
ld (hl+a),e ; Next Mode Set !
inc (echo_top+%ch+1)
pop hl
)fi
ld a,3
bit 7,(hl+a)
jr z,%note
bit 7,(event_mode)
jp nz,%back
ld b,(hl)
dec b
and b,00001111b
or b,0c0h
%midi_put
ld a,1
ld b,(hl+a)
%midi_put
jp %back
%note:
ld a,4
cp (hl+a),0
jp z,%back
ld b,(hl)
dec b
and b,00001111b
or b,090h
%midi_put
ld a,3
ld b,(hl+a)
%midi_put
bit 7,(event_mode)
jr nz,%off
ld a,4
ld b,(hl+a)
%midi_put
jp %back
%off:
ld b,0
%midi_put
jp %back
%pass:
)
%define(get_ad_port)(
ld a,(port_iop5)
)
;========== Head Program Area =============================
cseg abs c_area(0)
cold_start:
di
ld sp,0ffc0h
call system_initial ; System Initialize
jp main_loop
;========== Interrupt Vector/Sequence =====================
org 10h ; Software Interrupt : SWI
reti
org 18h ; Non Mascable Interrupt : NMI
reti
org 20h ; Watch Dog Timer : INTWD
reti
org 28h ; External Interrupt #0 : INT0
ld a,(port_option_z)
reti
org 30h ; Timer Interrupt #0 : INTT0
reti
org 38h ; Timer Interrupt #1 : INTT1
reti
org 40h ; Timer Interrupt #2 : INTT2
reti
org 48h ; Timer Interrupt #3 : INTT3
set int_bit_tim_1,(int_flg)
reti
org 50h ; Timer Interrupt #4 : INTT4
reti
org 58h ; External Interrupt #1 : INT1
reti
org 60h ; Timer Interrupt #5 : INTT5
reti
org 68h ; External Interrupt #2 : INT2
reti
org 70h ; UART Receive Interrupt : INTRX
push bc
push hl
ld b,(port_scbuf)
jr _int_midi_rx
org 78h ; UART Transmit Interrupt : INTTX
set int_bit_midi,(int_flg)
reti
_int_midi_rx:
cp b,0f8h
jr z,_int_rx_pass
ld hl,rx_fifo
ld a,(rx_top)
ld (hl+a),b ; MIDI Receive FIFO Set !
inc (rx_top)
_int_rx_pass:
pop hl
pop bc
reti
;========== System Initialize Routine =====================
system_initial:
ld a,(port_option_x) ; DSR Clear
ld a,(port_option_y) ; DRR Clear
ld a,(port_option_z) ; INT Clear
ld a,(port_option_d) ; DSR F/F Clear
ld (port_option_z),00000000b ;
ld (port_option_y),00000000b ;
ld (port_option_x),00001000b ; MIDI Gate ON
ld (port_wdmod),01110000b ; Watch Dog OFF
ld (port_wdcr),0b1h ; Watch Dog OFF
ld (port_intel),01011111b ; Interrupt Enable
ld (port_inteh),00000101b ; Interrupt Enable
ld (port_dmaeh),00000000b ; Micro DMA Disable
ld (port_p01cr),00000110b ; Port 0/1 = Data/Address Bus
ld (port_p2cr),11111111b ; Port 2 = Address Bus
ld (port_p3cr),10101001b ; Port 3 = UART
ld (port_sccr),00000000b ; Port 3 = Constant
ld (port_p4cr),00001111b ; Port 4 = Bank Address
ld (port_smmod),00000000b ; Port 6/7 = Port
ld (port_p67cr),11111111b ; Port 6/7 = Output
ld (port_p8cr),00001000b ; Port 8 = Output/Buzzer
ld (port_scmod),00101000b ; UART Control
ld (port_trun),10101111b ; Baud Rate
ld (port_tmod),00000100b ; 8bit Timer Mode
ld (port_tclk),10010001b ; Timer Assign
ld (port_t4mod),00000110b ; 16bit Timer Mode
ld (port_t4ffcr),00001011b ; 16bit Timer Control
ldw (port_treg0),0ffffh ; (dummy) Tempo
zzz:
ld (port_treg2),2 ; MIDI Divide Rate : 12MHz=[3]
ld (port_treg3),187 ; 1msec Interval Constant(1)
ldw (port_treg5),017h ; Start Buzzer Pitch
ld (port_bx),00h ; ROM/RAM Area
ld (port_by),08h ; Debug Bank : Address = 80000-8FFFF
ld (port_iop6),0ffh ; LED Off
ld (port_iop7),0ffh ;
ld (port_iop3),11111011b ; DSP-01 Reset !
call wait_timer ; (wait)
ld (port_iop3),11111111b ; DSP-01 Start !
call wait_timer ; (wait)
ld (dsp-01+0f5h),0 ; Memory Bus Close
nop
ld (dsp-01+0f3h),0 ; Memory Bus Close
ld hl,04000h
ld bc,08000h ; 4000-BFFF Clear
_ps_ram_clear:
ld (hl),0
inc hl
djnz bc,_ps_ram_clear
ld hl,internal_ram ; Internal RAM Area
ld bc,512-16
_int_ram_clear:
ld (hl),0
inc hl
djnz bc,_int_ram_clear
ld (select_ctr+0),0
ld (select_ctr+1),32
ld (end_mark),'*'
ld (end_mark+1),'*'
ld (end_mark+2),'*'
%get_ad_port
ld b,a
and a,00000001b
ld (ad_buffer+0),a
ld a,b
and a,00000010b
ld (ad_buffer+1),a
ld (port_option_z),00000000b
ld (port_option_y),00000000b
ld (port_option_x),00001000b
ld a,(port_option_z)
ld a,(port_scbuf) ; Dummy Rx
ld (port_scbuf),0fch ; Dummy Tx
ld a,(port_option_y)
ei
ret
wait_timer:
ld bc,0ffffh
_wait_loop:
nop
djnz bc,_wait_loop
ret
;========== Main Program ==================================
main_loop:
call rx_midi_check
call tx_midi_check
call ad_port_check
call int_timer_check
jr main_loop
rx_midi_check:;--------------------------------------------
ld a,(rx_end)
cp a,(rx_top)
ret z
ld hl,rx_fifo
ld b,(hl+a)
ld (rx_data),b
inc (rx_end)
bit 7,b
jr z,midi_running
cp b,0f0h
ret nc
ld a,b
ld (status),a
and b,11110000b
ld (rsb),b
and a,00001111b
ld (channel),a
ld (dcb),0
ret
midi_running:
ld a,(rsb)
cp a,0
ret z
cp (dcb),0
jr nz,_midi_run_2nd
ld (data_1st),b
cp a,0c0h
jr z,midi_prog_change
ld (dcb),1
ret
midi_prog_change:
%midi_set(status)
%midi_set(data_1st)
ret
_midi_run_2nd:
ld (data_2nd),b
ld (dcb),0
cp a,080h
jr z,midi_note_off
cp a,090h
jr z,midi_note_on
cp a,0e0h
jr z,midi_pitch_bend
cp a,0b0h
jp z,_midi_run_2nd_ct
ld (rsb),0
ret
midi_note_off:
ld a,(status)
add a,10h
ld (status),a
ld (data_2nd),0
midi_note_on:
%midi_set(status)
%midi_set(data_1st)
%midi_set(data_2nd)
ret
midi_pitch_bend:
%midi_set(status)
%midi_set(data_1st)
%midi_set(data_2nd)
ret
_midi_run_2nd_ct:
cp (data_1st),121
jr c,midi_cont_change
ret
midi_cont_change:
%midi_set(status)
%midi_set(data_1st)
%midi_set(data_2nd)
ret
tx_midi_check:;--------------------------------------------
ld hl,(tx_end)
cp hl,(tx_top) ; FIFO Event ?
ret z
bit int_bit_midi,(int_flg) ; TX OK ?
ret z
ld de,tx_fifo
add hl,de
ld a,(hl)
ld (port_scbuf),a
res int_bit_midi,(int_flg)
incw (tx_end)
bit 4,(tx_end+1)
ret z
ldw (tx_end),0
ret
ad_port_check:;--------------------------------------------
inc (free_timer)
%get_ad_port
ld b,a
and a,00000001b
cp a,(ad_buffer+0)
jr nz,_ad_event_0
ld a,b
and a,00000010b
cp a,(ad_buffer+1)
jr nz,_ad_event_1
ret
_ad_event_0:
ld (ad_buffer+0),a
cp (note_status+0),0
jr nz,_ad_eve_off_0
cp (ad_buffer+0),0
ret z
ld (note_status+0),1 ; Note ON !!
call perc_eve_1_on
_ad_eve_off_0:
ld (note_ctr+0),0
ret
_ad_event_1:
ld (ad_buffer+1),a
cp (note_status+1),0
jr nz,_ad_eve_off_1
cp (ad_buffer+1),0
ret z
ld (note_status+1),1 ; Note ON !!
call perc_eve_2_on
_ad_eve_off_1:
ld (note_ctr+1),0
ret
int_timer_check:;------------------------------------------
bit int_bit_tim_1,(int_flg)
ret z
res int_bit_tim_1,(int_flg)
bit 0,(timer_1msec) ; Odd/Even ?
jr z,_int_1msec_even
ld (port_treg3),125 ; Constant(1) : 12MHz=[187]
jr _int_1msec_cont
_int_1msec_even:
ld (port_treg3),125 ; Constant(2) : 12MHz=[188]
_int_1msec_cont:
inc (timer_1msec)
dec (echo_mode)
and (echo_mode),00000111b
%echo_machine(0)
%echo_machine(1)
%echo_machine(2)
%echo_machine(3)
%echo_machine(4)
%echo_machine(5)
%echo_machine(6)
%echo_machine(7)
_int_1msec_next:
cp (note_status+0),0
jr z,_int_eve_off_1
inc (note_ctr+0)
cp (note_ctr+0),20 ; Gate Time
ret nz
ld (note_status+0),0 ; Note OFF !!
ld a,(select_buf+0)
or a,10000000b
ld (selected),a
ld hl,(point_buff+0)
call perc_event_off
ret
_int_eve_off_1:
cp (note_status+1),0
ret z
inc (note_ctr+1)
cp (note_ctr+1),20 ; Gate Time
ret nz
ld (note_status+1),0 ; Note OFF !!
ld a,(select_buf+1)
or a,10000000b
ld (selected),a
ld hl,(point_buff+2)
call perc_event_off
ret
perc_eve_1_on:;--------------------------------------------
ld a,(select_ctr+0) ; Phrase Number
inc (select_ctr+0)
and (select_ctr+0),00011111b ; Max = 32
ld (select_buf+0),a
ld (selected),a
ld l,45
mul hl,a
ld bc,percus_bank
add hl,bc
ld (point_buff+0),hl
jr _perc_eve
perc_eve_2_on:
ld a,(free_timer)
and a,00011111b ; Max = 32
add a,32
cp a,(select_ctr+1)
jr nz,_perc_2_ok
add a,19
and a,00011111b
add a,32
_perc_2_ok:
ld (select_ctr+1),a ; Phrase Number
ld (select_buf+1),a
ld (selected),a
ld l,45
mul hl,a
ld bc,percus_bank
add hl,bc
ld (point_buff+2),hl
_perc_eve:
ld a,3
bit 7,(hl+a)
jr z,_eve_note
ld b,(hl)
or b,0c0h
%midi_put
ld a,1
ld b,(hl+a)
%midi_put
jp _eve_joint
_eve_note:
ld a,4
cp (hl+a),0
jp z,_eve_joint
ld b,(hl)
dec b
and b,00001111b
or b,090h
%midi_put
ld a,3
ld b,(hl+a)
%midi_put
ld a,4
ld b,(hl+a)
%midi_put
jr _eve_joint
perc_event_off:
ld a,3
bit 7,(hl+a)
jr nz,_eve_joint
ld a,4
cp (hl+a),0
jr z,_eve_joint
ld b,(hl)
dec b
and b,00001111b
or b,090h
%midi_put
ld a,3
ld b,(hl+a)
%midi_put
ld b,0
%midi_put
_eve_joint:
ld a,2+5
ld b,(hl+a)
ld a,(echo_top)
ld hl,time_fifo
ld (hl+a),b
ld b,(selected)
ld hl,mode_fifo
ld (hl+a),b
inc (echo_top)
ret
;========== Data Base Area ================================
; Format : Channel / Prog / Time / KeyNo / Speed
; Master 1-16 0-127 0 0-127 0-127
; Echo 1 1-16 0-127 1-127 0-127 0-127
; | | | | | |
; Echo 8 1-16 0-127 1-127 0-127 0-127
; --- If KeyNo < 128 , then Prog.Change is ignored.
percus_bank:
;---------------------------------------------------------------
; CH Prog Time Note Vel
;---------------------------------------------------------------
db 4 , 20 , 0 , 60 , 64 ; Master NO.0
db 8 , 21 , 48 , 67 , 64 ; Echo #1
db 2 , 0 , 11 , 0 , 0 ; #2
db 3 , 0 , 11 , 0 , 0 ; #3
db 5 , 0 , 11 , 0 , 0 ; #4
db 6 , 0 , 11 , 0 , 0 ; #5
db 7 , 0 , 11 , 0 , 0 ; #6
db 8 , 0 , 11 , 0 , 0 ; #7
db 9 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 2 , 4 , 0 , 58 , 64 ; Master NO.1
db 5 , 28 , 28 , 60 , 64 ; Echo #1
db 9 , 29 , 36 , 67 , 48 ; #2
db 8 , 30 , 11 , 222 , 0 ; #3
db 3 , 0 , 11 , 0 , 0 ; #4
db 4 , 0 , 11 , 0 , 0 ; #5
db 6 , 0 , 11 , 0 , 0 ; #6
db 7 , 0 , 11 , 0 , 0 ; #7
db 7 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 3 , 12 , 0 , 60 , 64 ; Master NO.2
db 8 , 30 , 56 , 67 , 48 ; Echo #1
db 5 , 28 , 40 , 65 , 72 ; #2
db 2 , 4 , 24 , 60 , 64 ; #3
db 4 , 14 , 11 , 222 , 0 ; #4
db 6 , 0 , 11 , 0 , 0 ; #5
db 7 , 0 , 11 , 0 , 0 ; #6
db 9 , 0 , 11 , 0 , 0 ; #7
db 9 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 2 , 4 , 0 , 60 , 64 ; Master NO.3
db 6 , 5 , 32 , 67 , 48 ; Echo #1
db 3 , 6 , 11 , 222 , 0 ; #2
db 4 , 0 , 11 , 0 , 0 ; #3
db 5 , 0 , 11 , 0 , 0 ; #4
db 7 , 0 , 11 , 0 , 0 ; #5
db 8 , 0 , 11 , 0 , 0 ; #6
db 9 , 0 , 11 , 0 , 0 ; #7
db 9 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 4 , 14 , 0 , 67 , 64 ; Master NO.4
db 7 , 13 , 44 , 60 , 56 ; Echo #1
db 3 , 6 , 20 , 65 , 64 ; #2
db 2 , 22 , 11 , 222 , 0 ; #3
db 6 , 15 , 11 , 222 , 0 ; #4
db 5 , 0 , 11 , 0 , 0 ; #5
db 8 , 0 , 11 , 0 , 0 ; #6
db 9 , 0 , 11 , 0 , 0 ; #7
db 9 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 2 , 22 , 0 , 67 , 48 ; Maste NO.5
db 8 , 30 , 56 , 60 , 72 ; Echo #1
db 3 , 6 , 40 , 67 , 64 ; #2
db 6 , 15 , 32 , 65 , 48 ; #3
db 4 , 14 , 48 , 67 , 72 ; #4
db 9 , 7 , 11 , 222 , 0 ; #5
db 5 , 0 , 11 , 0 , 0 ; #6
db 7 , 0 , 11 , 0 , 0 ; #7
db 7 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 3 , 16 , 0 , 67 , 64 ; Master NO.6
db 6 , 15 , 24 , 60 , 48 ; Echo #1
db 9 , 7 , 48 , 68 , 56 ; #2
db 4 , 14 , 64 , 65 , 72 ; #3
db 5 , 23 , 11 , 222 , 0 ; #4
db 2 , 0 , 11 , 0 , 0 ; #5
db 7 , 0 , 11 , 0 , 0 ; #6
db 8 , 0 , 11 , 0 , 0 ; #7
db 8 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 4 , 14 , 0 , 58 , 64 ; Master NO.7
db 9 , 7 , 48 , 60 , 48 ; Echo #1
db 5 , 23 , 11 , 65 , 56 ; #2
db 7 , 13 , 11 , 60 , 64 ; #3
db 3 , 6 , 11 , 67 , 72 ; #4
db 2 , 0 , 11 , 0 , 0 ; #5
db 7 , 0 , 11 , 0 , 0 ; #6
db 8 , 0 , 11 , 0 , 0 ; #7
db 8 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 6 , 15 , 0 , 60 , 64 ; Master NO.8
db 9 , 7 , 56 , 66 , 64 ; Echo #1
db 5 , 13 , 12 , 73 , 72 ; #2
db 7 , 31 , 11 , 222 , 0 ; #3
db 3 , 4 , 11 , 222 , 0 ; #4
db 2 , 0 , 11 , 0 , 0 ; #5
db 4 , 0 , 11 , 0 , 0 ; #6
db 8 , 0 , 11 , 0 , 0 ; #7
db 8 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 8 , 30 , 0 , 73 , 64 ; Master NO.9
db 3 , 4 , 40 , 66 , 48 ; Echo #1
db 7 , 31 , 80 , 67 , 72 ; #2
db 2 , 0 , 11 , 0 , 0 ; #3
db 4 , 0 , 11 , 0 , 0 ; #4
db 5 , 0 , 11 , 0 , 0 ; #5
db 6 , 0 , 11 , 0 , 0 ; #6
db 9 , 0 , 11 , 0 , 0 ; #7
db 9 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 7 , 31 , 0 , 60 , 64 ; Master NO.10
db 3 , 4 , 48 , 60 , 56 ; Echo #1
db 4 , 5 , 11 , 222 , 0 ; #2
db 2 , 0 , 11 , 0 , 0 ; #3
db 5 , 0 , 11 , 0 , 0 ; #4
db 6 , 0 , 11 , 0 , 0 ; #5
db 8 , 0 , 11 , 0 , 0 ; #6
db 9 , 0 , 11 , 0 , 0 ; #7
db 9 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 4 , 5 , 0 , 60 , 64 ; Master NO.11
db 6 , 15 , 32 , 67 , 56 ; Echo #1
db 3 , 4 , 12 , 65 , 72 ; #2
db 7 , 31 , 80 , 58 , 48 ; #3
db 9 , 7 , 48 , 66 , 64 ; #4
db 5 , 23 , 16 , 73 , 72 ; #5
db 2 , 12 , 11 , 222 , 0 ; #6
db 8 , 0 , 11 , 0 , 0 ; #7
db 8 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 4 , 15 , 0 , 68 , 64 ; Master NO.12
db 7 , 31 , 72 , 67 , 56 ; Echo #1
db 2 , 12 , 40 , 60 , 72 ; #2
db 5 , 23 , 16 , 65 , 48 ; #3
db 8 , 13 , 11 , 222 , 0 ; #4
db 3 , 0 , 11 , 0 , 0 ; #5
db 6 , 0 , 11 , 0 , 0 ; #6
db 9 , 0 , 11 , 0 , 0 ; #7
db 9 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 3 , 4 , 0 , 67 , 64 ; Master NO.13
db 9 , 7 , 16 , 60 , 72 ; Echo #1
db 5 , 23 , 72 , 67 , 48 ; #2
db 7 , 31 , 40 , 73 , 56 ; #3
db 2 , 12 , 8 , 66 , 64 ; #4
db 8 , 13 , 56 , 62 , 48 ; #5
db 6 , 20 , 11 , 222 , 0 ; #6
db 4 , 0 , 11 , 0 , 0 ; #7
db 4 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 5 , 4 , 0 , 60 , 64 ; Master NO.14
db 2 , 12 , 72 , 58 , 56 ; Echo #1
db 8 , 13 , 40 , 67 , 64 ; #2
db 3 , 4 , 56 , 73 , 72 ; #3
db 6 , 20 , 8 , 66 , 48 ; #4
db 7 , 28 , 11 , 222 , 0 ; #5
db 4 , 0 , 11 , 0 , 0 ; #6
db 9 , 0 , 11 , 0 , 0 ; #7
db 9 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 2 , 12 , 0 , 60 , 64 ; Master NO.15
db 7 , 28 , 72 , 62 , 72 ; Echo #1
db 3 , 4 , 48 , 69 , 48 ; #2
db 9 , 21 , 11 , 222 , 0 ; #3
db 4 , 0 , 11 , 0 , 0 ; #4
db 5 , 0 , 11 , 0 , 0 ; #5
db 6 , 0 , 11 , 0 , 0 ; #6
db 8 , 0 , 11 , 0 , 0 ; #7
db 8 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 6 , 20 , 0 , 66 , 64 ; Master NO.16
db 9 , 21 , 32 , 73 , 48 ; Echo #1
db 4 , 5 , 12 , 67 , 72 ; #2
db 7 , 28 , 88 , 60 , 56 ; #3
db 5 , 6 , 11 , 222 , 0 ; #4
db 3 , 14 , 11 , 222 , 0 ; #5
db 2 , 0 , 11 , 0 , 0 ; #6
db 8 , 0 , 11 , 0 , 0 ; #7
db 8 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 5 , 6 , 0 , 62 , 64 ; Master NO.17
db 8 , 13 , 56 , 60 , 72 ; Echo #1
db 3 , 14 , 80 , 67 , 48 ; #2
db 6 , 20 , 20 , 69 , 56 ; #3
db 4 , 29 , 11 , 222 , 0 ; #4
db 2 , 0 , 11 , 0 , 0 ; #5
db 7 , 0 , 11 , 0 , 0 ; #6
db 9 , 0 , 11 , 0 , 0 ; #7
db 9 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 3 , 14 , 0 , 67 , 64 ; Master NO.18
db 8 , 13 , 24 , 68 , 48 ; Echo #1
db 4 , 29 , 40 , 75 , 64 ; #2
db 2 , 7 , 11 , 222 , 0 ; #3
db 5 , 0 , 11 , 0 , 0 ; #4
db 6 , 0 , 11 , 0 , 0 ; #5
db 7 , 0 , 11 , 0 , 0 ; #6
db 9 , 0 , 11 , 0 , 0 ; #7
db 9 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 6 , 20 , 0 , 73 , 64 ; Master NO.19
db 2 , 7 , 48 , 73 , 64 ; Echo #1
db 8 , 13 , 24 , 66 , 72 ; #2
db 5 , 6 , 40 , 69 , 48 ; #3
db 3 , 14 , 88 , 62 , 56 ; #4
db 7 , 15 , 11 , 222 , 0 ; #5
db 9 , 31 , 11 , 222 , 0 ; #6
db 4 , 0 , 11 , 0 , 0 ; #7
db 4 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 7 , 15 , 0 , 75 , 64 ; Master NO.20
db 2 , 7 , 56 , 68 , 56 ; Echo #1
db 5 , 6 , 36 , 66 , 48 ; #2
db 8 , 13 , 32 , 73 , 72 ; #3
db 6 , 22 , 11 , 222 , 0 ; #4
db 3 , 0 , 11 , 0 , 0 ; #5
db 4 , 0 , 11 , 0 , 0 ; #6
db 9 , 0 , 11 , 0 , 0 ; #7
db 9 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 8 , 12 , 0 , 75 , 64 ; Master NO.21
db 6 , 22 , 24 , 68 , 64 ; Echo #1
db 9 , 31 , 64 , 75 , 64 ; #2
db 5 , 6 , 40 , 62 , 64 ; #3
db 3 , 14 , 32 , 69 , 64 ; #4
db 2 , 0 , 11 , 0 , 0 ; #5
db 4 , 0 , 11 , 0 , 0 ; #6
db 7 , 0 , 11 , 0 , 0 ; #7
db 7 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 5 , 6 , 0 , 69 , 64 ; Master NO.22
db 7 , 15 , 52 , 62 , 64 ; Echo #1
db 4 , 29 , 24 , 68 , 64 ; #2
db 8 , 13 , 64 , 75 , 64 ; #3
db 2 , 7 , 8 , 71 , 64 ; #4
db 6 , 22 , 40 , 64 , 64 ; #5
db 3 , 0 , 11 , 0 , 0 ; #6
db 9 , 0 , 11 , 0 , 0 ; #7
db 9 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 5 , 6 , 0 , 58 , 64 ; Master NO.23
db 2 , 7 , 48 , 60 , 64 ; Echo #1
db 6 , 22 , 16 , 65 , 56 ; #2
db 8 , 4 , 11 , 222 , 0 ; #3
db 3 , 0 , 11 , 0 , 0 ; #4
db 4 , 0 , 11 , 0 , 0 ; #5
db 2 , 0 , 11 , 0 , 0 ; #6
db 9 , 0 , 11 , 0 , 0 ; #7
db 9 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 9 , 31 , 0 , 67 , 64 ; Maste NO.24
db 5 , 6 , 56 , 60 , 72 ; Echo #1
db 2 , 0 , 11 , 0 , 0 ; #2
db 3 , 0 , 11 , 0 , 0 ; #3
db 4 , 0 , 11 , 0 , 0 ; #4
db 6 , 0 , 11 , 0 , 0 ; #5
db 7 , 0 , 11 , 0 , 0 ; #6
db 8 , 0 , 11 , 0 , 0 ; #7
db 8 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 8 , 4 , 0 , 62 , 64 ; Master NO.25
db 3 , 14 , 40 , 69 , 48 ; Echo #1
db 6 , 22 , 56 , 68 , 72 ; #2
db 9 , 31 , 36 , 75 , 56 ; #3
db 2 , 0 , 11 , 0 , 0 ; #4
db 4 , 0 , 11 , 0 , 0 ; #5
db 5 , 0 , 11 , 0 , 0 ; #6
db 7 , 0 , 11 , 0 , 0 ; #7
db 7 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 7 , 15 , 0 , 58 , 64 ; Master NO.26
db 4 , 29 , 32 , 65 , 72 ; Echo #1
db 8 , 4 , 88 , 67 , 64 ; #2
db 2 , 30 , 11 , 222 , 0 ; #3
db 3 , 0 , 11 , 0 , 0 ; #4
db 5 , 0 , 11 , 0 , 0 ; #5
db 6 , 0 , 11 , 0 , 0 ; #6
db 9 , 0 , 11 , 0 , 0 ; #7
db 9 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 9 , 31 , 0 , 71 , 64 ; Master NO.27
db 4 , 29 , 44 , 64 , 64 ; Echo #1
db 7 , 15 , 52 , 67 , 64 ; #2
db 2 , 30 , 56 , 60 , 64 ; #3
db 6 , 13 , 11 , 222 , 0 ; #4
db 3 , 0 , 11 , 0 , 0 ; #5
db 5 , 0 , 11 , 0 , 0 ; #6
db 8 , 0 , 11 , 0 , 0 ; #7
db 8 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 9 , 31 , 0 , 60 , 64 ; Master NO.28
db 6 , 13 , 64 , 64 , 64 ; Echo #1
db 2 , 30 , 56 , 71 , 64 ; #2
db 5 , 23 , 11 , 222 , 0 ; #3
db 3 , 0 , 11 , 0 , 0 ; #4
db 4 , 0 , 11 , 0 , 0 ; #5
db 7 , 0 , 11 , 0 , 0 ; #6
db 8 , 0 , 11 , 0 , 0 ; #7
db 8 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 9 , 31 , 0 , 62 , 72 ; Master NO.29
db 4 , 29 , 72 , 60 , 48 ; Echo #1
db 6 , 13 , 16 , 67 , 64 ; #2
db 2 , 30 , 48 , 69 , 72 ; #3
db 7 , 15 , 56 , 62 , 48 ; #4
db 3 , 0 , 11 , 222 , 0 ; #5
db 5 , 0 , 11 , 0 , 0 ; #6
db 8 , 0 , 11 , 0 , 0 ; #7
db 8 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 2 , 30 , 0 , 60 , 64 ; Master NO.30
db 5 , 23 , 32 , 67 , 72 ; Echo #1
db 8 , 4 , 12 , 67 , 48 ; #2
db 3 , 20 , 80 , 60 , 64 ; #3
db 4 , 0 , 11 , 0 , 0 ; #4
db 6 , 0 , 11 , 0 , 0 ; #5
db 7 , 0 , 11 , 0 , 0 ; #6
db 9 , 0 , 11 , 0 , 0 ; #7
db 9 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 7 , 15 , 0 , 71 , 64 ; Master NO.31
db 9 , 31 , 56 , 64 , 72 ; Echo #1
db 5 , 23 , 96 , 67 , 68 ; #2
db 2 , 30 , 32 , 60 , 56 ; #3
db 6 , 13 , 16 , 60 , 64 ; #4
db 3 , 0 , 11 , 0 , 0 ; #5
db 4 , 0 , 11 , 0 , 0 ; #6
db 8 , 0 , 11 , 0 , 0 ; #7
db 8 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 2 , 0 , 0 , 67 , 96 ; Master NO.32
db 7 , 0 , 12 , 74 , 80 ; Echo #1
db 5 , 0 , 24 , 76 , 112 ; #2
db 9 , 0 , 16 , 69 , 96 ; #3
db 3 , 0 , 20 , 68 , 64 ; #4
db 8 , 0 , 8 , 61 , 80 ; #5
db 6 , 0 , 12 , 65 , 96 ; #6
db 4 , 0 , 16 , 72 , 112 ; #7
db 2 , 0 , 24 , 67 , 96 ; #8
;---------------------------------------------------------------
db 3 , 0 , 0 , 67 , 96 ; Master NO.33
db 8 , 0 , 16 , 67 , 112 ; Echo #1
db 4 , 0 , 12 , 74 , 80 ; #2
db 7 , 0 , 24 , 67 , 64 ; #3
db 5 , 0 , 16 , 68 , 96 ; #4
db 2 , 0 , 8 , 61 , 80 ; #5
db 6 , 0 , 20 , 65 , 112 ; #6
db 9 , 0 , 12 , 72 , 96 ; #7
db 3 , 0 , 8 , 74 , 96 ; #8
;---------------------------------------------------------------
db 4 , 0 , 0 , 63 , 96 ; Master NO.34
db 2 , 0 , 12 , 70 , 96 ; Echo #1
db 5 , 0 , 8 , 74 , 80 ; #2
db 9 , 0 , 16 , 76 , 112 ; #3
db 6 , 0 , 20 , 67 , 96 ; #4
db 8 , 0 , 24 , 66 , 64 ; #5
db 3 , 0 , 8 , 69 , 112 ; #6
db 7 , 0 , 16 , 59 , 80 ; #7
db 4 , 0 , 12 , 65 , 96 ; #8
;---------------------------------------------------------------
db 5 , 0 , 0 , 72 , 96 ; Master NO.35
db 9 , 0 , 8 , 66 , 64 ; Echo #1
db 6 , 0 , 24 , 59 , 96 ; #2
db 4 , 0 , 20 , 65 , 112 ; #3
db 8 , 0 , 16 , 67 , 80 ; #4
db 2 , 0 , 20 , 74 , 96 ; #5
db 7 , 0 , 8 , 63 , 112 ; #6
db 3 , 0 , 12 , 70 , 80 ; #7
db 5 , 0 , 16 , 76 , 96 ; #8
;---------------------------------------------------------------
db 6 , 0 , 0 , 76 , 96 ; Master NO.36
db 8 , 0 , 16 , 69 , 112 ; Echo #1
db 2 , 0 , 16 , 67 , 112 ; #2
db 5 , 0 , 8 , 74 , 80 ; #3
db 3 , 0 , 20 , 68 , 64 ; #4
db 7 , 0 , 12 , 61 , 96 ; #5
db 9 , 0 , 16 , 63 , 96 ; #6
db 4 , 0 , 24 , 70 , 80 ; #7
db 6 , 0 , 8 , 76 , 96 ; #8
;---------------------------------------------------------------
db 7 , 0 , 0 , 74 , 96 ; Master NO.37
db 2 , 0 , 8 , 67 , 96 ; Echo #1
db 5 , 0 , 20 , 61 , 112 ; #2
db 8 , 0 , 12 , 68 , 64 ; #3
db 6 , 0 , 8 , 70 , 112 ; #4
db 3 , 0 , 16 , 63 , 80 ; #5
db 9 , 0 , 8 , 65 , 96 ; #6
db 4 , 0 , 12 , 72 , 80 ; #7
db 7 , 0 , 8 , 67 , 96 ; #8
;---------------------------------------------------------------
db 8 , 0 , 0 , 76 , 96 ; Master NO.38
db 4 , 0 , 12 , 76 , 64 ; Echo #1
db 9 , 0 , 8 , 69 , 80 ; #2
db 5 , 0 , 16 , 67 , 96 ; #3
db 3 , 0 , 8 , 74 , 112 ; #4
db 7 , 0 , 8 , 70 , 112 ; #5
db 2 , 0 , 20 , 63 , 96 ; #6
db 6 , 0 , 12 , 59 , 96 ; #7
db 8 , 0 , 16 , 66 , 80 ; #8
;---------------------------------------------------------------
db 9 , 0 , 0 , 67 , 96 ; Master NO.39
db 7 , 0 , 8 , 74 , 80 ; Echo #1
db 3 , 0 , 12 , 69 , 112 ; #2
db 6 , 0 , 8 , 76 , 96 ; #3
db 2 , 0 , 16 , 68 , 64 ; #4
db 5 , 0 , 8 , 61 , 96 ; #5
db 8 , 0 , 8 , 72 , 96 ; #6
db 4 , 0 , 12 , 65 , 80 ; #7
db 9 , 0 , 16 , 67 , 112 ; #8
;---------------------------------------------------------------
db 2 , 0 , 0 , 69 , 96 ; Master NO.40
db 7 , 0 , 12 , 76 , 80 ; Echo #1
db 5 , 0 , 24 , 67 , 112 ; #2
db 9 , 0 , 16 , 74 , 96 ; #3
db 3 , 0 , 20 , 68 , 64 ; #4
db 8 , 0 , 8 , 61 , 80 ; #5
db 6 , 0 , 12 , 72 , 96 ; #6
db 4 , 0 , 16 , 65 , 112 ; #7
db 2 , 40 , 11 , 222 , 0 ; #8
;---------------------------------------------------------------
db 3 , 0 , 0 , 76 , 96 ; Master NO.41
db 8 , 0 , 16 , 69 , 112 ; Echo #1
db 4 , 0 , 12 , 66 , 80 ; #2
db 7 , 0 , 24 , 59 , 64 ; #3
db 5 , 0 , 16 , 63 , 96 ; #4
db 2 , 0 , 8 , 70 , 80 ; #5
db 6 , 0 , 20 , 72 , 112 ; #6
db 9 , 0 , 12 , 65 , 96 ; #7
db 3 , 41 , 11 , 222 , 0 ; #8
;---------------------------------------------------------------
db 4 , 0 , 0 , 74 , 96 ; Master NO.42
db 2 , 0 , 12 , 67 , 96 ; Echo #1
db 5 , 0 , 8 , 68 , 80 ; #2
db 9 , 0 , 16 , 61 , 112 ; #3
db 6 , 0 , 20 , 67 , 96 ; #4
db 8 , 0 , 24 , 74 , 64 ; #5
db 3 , 0 , 8 , 74 , 112 ; #6
db 7 , 0 , 16 , 67 , 80 ; #7
db 4 , 42 , 11 , 222 , 0 ; #8
;---------------------------------------------------------------
db 5 , 0 , 0 , 67 , 96 ; Master NO.43
db 9 , 0 , 8 , 74 , 64 ; Echo #1
db 6 , 0 , 24 , 68 , 96 ; #2
db 4 , 0 , 20 , 61 , 112 ; #3
db 8 , 0 , 16 , 69 , 80 ; #4
db 2 , 0 , 20 , 76 , 96 ; #5
db 7 , 0 , 8 , 74 , 112 ; #6
db 3 , 0 , 12 , 67 , 80 ; #7
db 5 , 43 , 11 , 222 , 0 ; #8
;---------------------------------------------------------------
db 6 , 0 , 0 , 72 , 96 ; Master NO.44
db 8 , 0 , 16 , 65 , 112 ; Echo #1
db 2 , 0 , 16 , 66 , 112 ; #2
db 5 , 0 , 8 , 59 , 80 ; #3
db 3 , 0 , 20 , 63 , 64 ; #4
db 7 , 0 , 12 , 70 , 96 ; #5
db 9 , 0 , 16 , 74 , 96 ; #6
db 4 , 0 , 24 , 74 , 80 ; #7
db 6 , 44 , 11 , 222 , 0 ; #8
;---------------------------------------------------------------
db 7 , 0 , 0 , 67 , 96 ; Master NO.45
db 2 , 0 , 8 , 69 , 96 ; Echo #1
db 5 , 0 , 20 , 76 , 112 ; #2
db 8 , 0 , 12 , 69 , 64 ; #3
db 6 , 0 , 8 , 74 , 112 ; #4
db 3 , 0 , 16 , 67 , 80 ; #5
db 9 , 0 , 8 , 68 , 96 ; #6
db 4 , 0 , 12 , 61 , 80 ; #7
db 7 , 45 , 11 , 222 , 0 ; #8
;---------------------------------------------------------------
db 8 , 0 , 0 , 76 , 96 ; Master NO.46
db 4 , 0 , 12 , 74 , 64 ; Echo #1
db 9 , 0 , 8 , 67 , 80 ; #2
db 5 , 0 , 16 , 74 , 96 ; #3
db 3 , 0 , 8 , 74 , 112 ; #4
db 7 , 0 , 8 , 67 , 112 ; #5
db 2 , 0 , 20 , 74 , 96 ; #6
db 6 , 0 , 12 , 74 , 96 ; #7
db 8 , 46 , 11 , 222 , 0 ; #8
;---------------------------------------------------------------
db 9 , 0 , 0 , 67 , 96 ; Master NO.47
db 7 , 0 , 8 , 74 , 80 ; Echo #1
db 3 , 0 , 12 , 69 , 112 ; #2
db 6 , 0 , 8 , 76 , 96 ; #3
db 2 , 0 , 16 , 69 , 64 ; #4
db 5 , 0 , 8 , 68 , 96 ; #5
db 8 , 0 , 8 , 61 , 96 ; #6
db 4 , 0 , 12 , 68 , 80 ; #7
db 9 , 47 , 11 , 222 , 0 ; #8
;---------------------------------------------------------------
db 2 , 0 , 0 , 67 , 96 ; Master NO.48
db 7 , 0 , 12 , 69 , 80 ; Echo #1
db 5 , 0 , 24 , 76 , 112 ; #2
db 9 , 0 , 16 , 74 , 96 ; #3
db 3 , 0 , 20 , 74 , 64 ; #4
db 8 , 0 , 8 , 68 , 80 ; #5
db 6 , 0 , 12 , 61 , 96 ; #6
db 4 , 20 , 11 , 222 , 0 ; #7
db 2 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 3 , 0 , 0 , 67 , 96 ; Master NO.49
db 8 , 0 , 16 , 74 , 112 ; Echo #1
db 4 , 0 , 12 , 68 , 80 ; #2
db 7 , 0 , 24 , 61 , 64 ; #3
db 5 , 0 , 16 , 72 , 96 ; #4
db 2 , 0 , 8 , 65 , 80 ; #5
db 6 , 0 , 20 , 65 , 112 ; #6
db 9 , 21 , 11 , 222 , 0 ; #7
db 3 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 4 , 0 , 0 , 72 , 96 ; Master NO.50
db 2 , 0 , 12 , 65 , 96 ; Echo #1
db 5 , 0 , 8 , 66 , 80 ; #2
db 9 , 0 , 16 , 66 , 112 ; #3
db 6 , 0 , 20 , 59 , 96 ; #4
db 8 , 0 , 24 , 67 , 64 ; #5
db 3 , 0 , 8 , 74 , 112 ; #6
db 7 , 22 , 11 , 222 , 0 ; #7
db 4 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 5 , 0 , 0 , 76 , 96 ; Master NO.51
db 9 , 0 , 8 , 76 , 64 ; Echo #1
db 6 , 0 , 24 , 74 , 96 ; #2
db 4 , 0 , 20 , 67 , 112 ; #3
db 8 , 0 , 16 , 74 , 80 ; #4
db 2 , 0 , 20 , 67 , 96 ; #5
db 7 , 0 , 8 , 69 , 112 ; #6
db 3 , 23 , 11 , 222 , 0 ; #7
db 5 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 6 , 0 , 0 , 67 , 96 ; Master NO.52
db 8 , 0 , 16 , 74 , 112 ; Echo #1
db 2 , 0 , 16 , 74 , 112 ; #2
db 5 , 0 , 8 , 66 , 80 ; #3
db 3 , 0 , 20 , 59 , 64 ; #4
db 7 , 0 , 12 , 70 , 96 ; #5
db 9 , 0 , 16 , 63 , 96 ; #6
db 6 , 28 , 11 , 222 , 0 ; #7
db 4 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 7 , 0 , 0 , 74 , 96 ; Master NO.53
db 2 , 0 , 8 , 67 , 96 ; Echo #1
db 5 , 0 , 20 , 74 , 112 ; #2
db 9 , 0 , 12 , 76 , 64 ; #3
db 3 , 0 , 8 , 69 , 112 ; #4
db 6 , 0 , 16 , 67 , 80 ; #5
db 4 , 0 , 8 , 67 , 96 ; #6
db 8 , 29 , 11 , 222 , 0 ; #7
db 7 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 8 , 0 , 0 , 74 , 96 ; Master NO.54
db 4 , 0 , 12 , 67 , 64 ; Echo #1
db 9 , 0 , 8 , 74 , 80 ; #2
db 6 , 0 , 16 , 76 , 96 ; #3
db 3 , 0 , 8 , 69 , 112 ; #4
db 7 , 0 , 8 , 63 , 112 ; #5
db 2 , 0 , 20 , 70 , 96 ; #6
db 5 , 30 , 11 , 222 , 0 ; #7
db 8 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 9 , 0 , 0 , 67 , 96 ; Master NO.55
db 7 , 0 , 8 , 74 , 80 ; Echo #1
db 3 , 0 , 12 , 69 , 112 ; #2
db 6 , 0 , 8 , 76 , 96 ; #3
db 4 , 0 , 16 , 68 , 64 ; #4
db 5 , 0 , 8 , 61 , 96 ; #5
db 8 , 0 , 8 , 68 , 96 ; #6
db 2 , 31 , 11 , 222 , 0 ; #7
db 9 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 2 , 0 , 0 , 67 , 96 ; Master NO.56
db 7 , 0 , 12 , 69 , 80 ; Echo #1
db 5 , 0 , 24 , 76 , 112 ; #2
db 9 , 0 , 16 , 74 , 96 ; #3
db 3 , 0 , 20 , 68 , 64 ; #4
db 8 , 0 , 8 , 61 , 80 ; #5
db 6 , 40 , 11 , 222 , 0 ; #6
db 4 , 31 , 11 , 222 , 0 ; #7
db 2 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 3 , 0 , 0 , 76 , 96 ; Master NO.57
db 8 , 0 , 16 , 74 , 112 ; Echo #1
db 4 , 0 , 12 , 67 , 80 ; #2
db 7 , 0 , 24 , 74 , 64 ; #3
db 5 , 0 , 16 , 67 , 96 ; #4
db 2 , 0 , 8 , 69 , 80 ; #5
db 6 , 30 , 11 , 222 , 0 ; #6
db 9 , 41 , 11 , 222 , 0 ; #7
db 3 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 4 , 0 , 0 , 74 , 96 ; Master NO.58
db 2 , 0 , 12 , 67 , 96 ; Echo #1
db 5 , 0 , 8 , 67 , 80 ; #2
db 9 , 0 , 16 , 74 , 112 ; #3
db 6 , 0 , 20 , 74 , 96 ; #4
db 8 , 0 , 24 , 67 , 64 ; #5
db 3 , 42 , 11 , 222 , 0 ; #6
db 7 , 29 , 11 , 222 , 0 ; #7
db 4 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 5 , 0 , 0 , 67 , 96 ; Master NO.59
db 9 , 0 , 8 , 74 , 64 ; Echo #1
db 6 , 0 , 24 , 76 , 96 ; #2
db 4 , 0 , 20 , 69 , 112 ; #3
db 8 , 0 , 16 , 63 , 80 ; #4
db 2 , 0 , 20 , 70 , 96 ; #5
db 7 , 43 , 11 , 222 , 0 ; #6
db 3 , 28 , 11 , 222 , 0 ; #7
db 5 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 6 , 0 , 0 , 67 , 96 ; Master NO.60
db 8 , 0 , 16 , 74 , 112 ; Echo #1
db 2 , 0 , 16 , 66 , 112 ; #2
db 5 , 0 , 8 , 59 , 80 ; #3
db 3 , 0 , 20 , 70 , 64 ; #4
db 7 , 0 , 12 , 63 , 96 ; #5
db 9 , 23 , 11 , 222 , 0 ; #6
db 4 , 44 , 11 , 222 , 0 ; #7
db 6 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 7 , 0 , 0 , 72 , 96 ; Master NO.61
db 4 , 0 , 8 , 65 , 96 ; Echo #1
db 5 , 0 , 20 , 66 , 112 ; #2
db 9 , 0 , 12 , 59 , 64 ; #3
db 6 , 0 , 8 , 67 , 112 ; #4
db 3 , 0 , 16 , 74 , 80 ; #5
db 8 , 45 , 11 , 222 , 0 ; #6
db 2 , 22 , 11 , 222 , 0 ; #7
db 7 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 8 , 0 , 0 , 67 , 96 ; Master NO.62
db 4 , 0 , 12 , 74 , 64 ; Echo #1
db 9 , 0 , 8 , 68 , 80 ; #2
db 6 , 0 , 16 , 61 , 96 ; #3
db 3 , 0 , 8 , 72 , 112 ; #4
db 7 , 0 , 8 , 65 , 112 ; #5
db 2 , 46 , 11 , 222 , 0 ; #6
db 5 , 21 , 11 , 222 , 0 ; #7
db 8 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
db 9 , 0 , 0 , 74 , 96 ; Master NO.63
db 7 , 0 , 8 , 74 , 80 ; Echo #1
db 3 , 0 , 12 , 67 , 112 ; #2
db 6 , 0 , 8 , 68 , 96 ; #3
db 2 , 0 , 16 , 61 , 64 ; #4
db 4 , 0 , 8 , 68 , 96 ; #5
db 8 , 20 , 11 , 222 , 0 ; #6
db 5 , 47 , 11 , 222 , 0 ; #7
db 9 , 0 , 11 , 0 , 0 ; #8
;---------------------------------------------------------------
end
;----------------------------------------------------------------:
; |
; N A K A M U R A S P E C I A L M O D U L E |
; |
; Sound Toy [Prelude-1] Board |
; |
;----------------------------------------------------------------:
;========== Data Area =====================================
dseg abs d_area(04000h)
tone_data_bank: ds 128*10 ; Tone Data Parameter
dseg abs b_area(08000h)
tx_fifo: ds 256*16 ; MIDI TX FIFO (8000-8FFF)
fnum_1_l: ds 256*16 ; F-Number (L) #1 (9000-9FFF)
fnum_1_m: ds 256*16 ; F-Number (M) #1 (A000-AFFF)
fnum_1_h: ds 256*16 ; F-Number (H) #1 (B000-BFFF)
dseg abs r_area(0fdc0h)
bank_buff: ds 16 ; offset = DSP-01
dsp_vib_ctr: ds 16 ; offset = DSP-01
dsp_vib_spd: ds 16 ; offset = DSP-01
dsp_vib_add: ds 16 ; offset = DSP-01
dsp_vib_dat: ds 16 ; offset = DSP-01
dsp_vib_flg: ds 16 ; offset = DSP-01
bender: ds 16 ; offset = MIDI : Default = [40]
volume: ds 16 ; offset = MIDI : Volume Buffer
work: ds 10 ; Universal Work Area
calc: ds 12 ; Calculator Area
loop_counter: ds 1 ; Job [E] Buffer
play_data_1: ds 4 ; Play Data Buffer (1)
play_data_2: ds 4 ; Play Data Buffer (2)
play_data_3: ds 4 ; Play Data Buffer (3)
play_buffer: ds 4 ; Play Mode Status Buffer
play_trk: ds 1 ; Play Check Track NO.
play_bit: ds 1 ; Play Check Track Bit Map
pedals: ds 16 ; Danper=[0] Soft=[1]
iseg abs i_area(0ff00h)
assign_ctr: ds 16 ; offset = DSP-01 : [0]=Newest ,[10h]=Empty
assign_note: ds 16 ; offset = DSP-01
assign_ch: ds 16 ; offset = DSP-01 : Output = MIDI CH
assign_pc: ds 16 ; offset = MIDI
tempo: ds 1 ; ** Tempo : 8-254
relative_tempo: ds 1 ; ** Relative Tempo , 40h = [1:1]
time_base_para: ds 1 ; 2=TB:48,3=TB:72,...,8=TB:192
temp: ds 4 ; Tempo Caluclate Buffer
mode_flags: ds 1 ; 0 = [Default Status]
int_flg: ds 1 ; Interrupt Check Flags
run_mode: ds 1 ; Record/Play/ME Status Mode Flag
time_number: ds 3 ; Time Base Count Number Data
time_counter: ds 3 ; Current Count Data
play_counter: ds 4 ; Play Counter
active_status: ds 1 ; Active Track Status Buffer
tx_top: ds 2 ;
dsp_tx_end: ds 2 ; DSP-01 Tone Generator TX FIFO End
dsp_channel: ds 1 ; MIDI Channel Buffer
dsp_rsb: ds 1 ; Running Status Buffer
dsp_dcb: ds 1 ; Data Count Buffer
dsp_data_1st: ds 1 ; DSP-01 Received 1 Byte Data Buffer
dsp_data_2nd: ds 1 ; DSP-01 Received 1 Byte Data Buffer
on_pointer: ds 1 ; Assign ON Pointer
ch_buff: ds 1 ; Bend Channel Buffer
vib_timer: ds 1 ; Vibrate Speed Timer
stack_hl: ds 2 ; HL Buffer
led_timer: ds 4 ; LED Display Timer
pointer_1: ds 2 ;
pointer_2: ds 2 ;
pointer_3: ds 2 ;
pointer_4: ds 2 ;
ad_sum: ds 2 ;
ad_flg: ds 1 ;
;========== Port Defines Area =============================
dsp-01 equ 0fa00h ; Tone Generator [DSP-01] : FA00-FBFF
internal_ram equ 0fdc0h ; Internal RAM Top Address
port_p01cr equ 0ffc2h ; Port 0/1 Control
port_p2cr equ 0ffc5h ; Port-2 Control
port_iop3 equ 0ffc6h ; Port-3
port_p3cr equ 0ffc7h ; Port-3 Control
port_p4cr equ 0ffc9h ; Port-4 Control
port_iop5 equ 0ffcah ; Port-5
port_smmod equ 0ffcbh ; Stepping Motor Mode
port_iop6 equ 0ffcch ; Port-6
port_iop7 equ 0ffcdh ; Port-7
port_p67cr equ 0ffceh ; Port-6/7 Control
port_iop8 equ 0ffd0h ; Port-8
port_p8cr equ 0ffd1h ; Port-8 Control
port_wdmod equ 0ffd2h ; Watch Dog Timer Mode
port_wdcr equ 0ffd3h ; Watch Dog Timer Control
port_treg0 equ 0ffd4h ; 16bit Timer <0/1>
port_treg2 equ 0ffd6h ; 8bit Timer <2>
port_treg3 equ 0ffd7h ; 8bit Timer <3>
port_tclk equ 0ffd8h ; Timer Source Control
port_tmod equ 0ffdah ; Timer Mode
port_trun equ 0ffdbh ; Timer/Serial Baud Rate
port_treg5 equ 0ffe2h ; 16bit Timer <5> [low]
port_t4mod equ 0ffe4h ; 16bit Timer Mode
port_t4ffcr equ 0ffe5h ; 16bit Timer Control
port_intel equ 0ffe6h ; Interrupt Enable Mask [low]
port_inteh equ 0ffe7h ; Interrupt Enable Mask [high]
port_dmaeh equ 0ffe8h ; Micro DMA Enable Mask [high]
port_scmod equ 0ffe9h ; Serial Channel Mode
port_sccr equ 0ffeah ; Serial Channel Control
port_scbuf equ 0ffebh ; Serial Channel Buffer
port_bx equ 0ffech ; Bank Register x
port_by equ 0ffedh ; Bank Register y
port_adreg equ 0ffeeh ; A/D Converter Data Buffer
port_admod equ 0ffefh ; A/D Converter Control
;========== Bit Map Defines Area ==========================
int_bit_timer equ 1 ; Time Base
int_bit_tim_1 equ 2 ; 1msec
tempo_bit equ 1 ; Port_TRUN ; Tempo Count ON/OFF
real_play equ 4 ; 0 = NOP , 1 = Play
pedal_damper equ 0 ; pedals ; 0 = Off , 1 = On
pedal_soft equ 1 ; 0 = Off , 1 = On
;========== MACRO Defines =================================
%define(dsp-01_system(offset,data))(
ld (dsp-01+%offset),%data
nop
ld (dsp-01+0f3h),%data
)
%define(dsp-01_16ch(offset,data))
local loop(
ldw (work+1),dsp-01+%offset
ld (work+0),%data
call @_setting_16
)
%define(move_3byte(dst,src))(
ld a,(%src+0)
ld (%dst+0),a
ld a,(%src+1)
ld (%dst+1),a
ld a,(%src+2)
ld (%dst+2),a
)
%define(shift(d1,d2,d3))(
ldw (work+0),%d1
ldw (work+2),%d2
ldw (work+4),%d3
call _shift_sub
)
%define(range(d1,d2))(
ld hl,%d1
ld de,%d2
ld bc,00e80h
lddr
)
%define(data_set_16(address,data))
local loop(
ldw (work+1),%address
ld (work+0),%data
call @_setting_16
)
;========== Head Program Area =============================
cseg abs c_area(0)
di
ld sp,0ffc0h
call system_setup ; System Initialize --> Main Loop
jp main_start
;========== Interrupt Vector/Sequence =====================
org 10h ; Software Interrupt : SWI
reti
org 18h ; Non Mascable Interrupt : NMI
reti
org 20h ; Watch Dog Timer : INTWD
reti
org 28h ; External Interrupt #0 : INT0
reti
org 30h ; Timer Interrupt #0 : INTT0
reti
org 38h ; Timer Interrupt #1 : INTT1
push hl
ld hl,(time_counter)
add hl,(time_number)
jr _int_time_base
org 40h ; Timer Interrupt #2 : INTT2
reti
org 48h ; Timer Interrupt #3 : INTT3
set int_bit_tim_1,(int_flg)
reti
org 50h ; Timer Interrupt #4 : INTT4
reti
org 58h ; External Interrupt #1 : INT1
reti
org 60h ; Timer Interrupt #5 : INTT5
reti
org 68h ; External Interrupt #2 : INT2
reti
org 70h ; UART Receive Interrupt : INTRX
reti
org 78h ; UART Transmit Interrupt : INTTX
reti
_int_time_base:
ld (time_counter),hl
ld a,(time_counter+2)
adc a,(time_number+2)
ld (time_counter+2),a
jr nc,_int_tb_ret
set int_bit_timer,(int_flg) ; Time Counter Event !
_int_tb_ret:
pop hl
reti
;========== System Initialize Routine =====================
system_setup:
;<< DSP-01 Initialize >>
ld (port_iop3),11111011b ; DSP-01 Reset !
call @_wait_timer ; (wait)
ld (port_iop3),11111111b ; DSP-01 Start !
call @_wait_timer ; (wait)
%dsp-01_system(0f5h,0) ; Memory Bus Close
;<< CPU : TMP91C640 Initialize >>
ld (port_wdmod),01110000b ; Watch Dog OFF
ld (port_wdcr),0b1h ; Watch Dog OFF
ld (port_intel),01000000b ; Interrupt Enable
ld (port_inteh),00000001b ; Interrupt Enable
ld (port_dmaeh),00000000b ; Micro DMA Disable
ld (port_p01cr),00000110b ; Port 0/1 = Data/Address Bus
ld (port_p2cr),11111111b ; Port 2 = Address Bus
ld (port_p3cr),10101001b ; Port 3 = UART
ld (port_sccr),00000000b ; Port 3 = Constant
ld (port_p4cr),00001111b ; Port 4 = Bank Address
ld (port_smmod),00000000b ; Port 6/7 = Port
ld (port_p67cr),11111111b ; Port 6/7 = Output
ld (port_p8cr),00001000b ; Port 8 = Output/Buzzer
ld (port_scmod),00101000b ; UART Control
ld (port_trun),10101111b ; Baud Rate
ld (port_tmod),00000100b ; 8bit Timer Mode
ld (port_tclk),10010001b ; Timer Assign
ld (port_t4mod),00000110b ; 16bit Timer Mode
ld (port_t4ffcr),00001011b ; 16bit Timer Control
ldw (port_treg0),0ffffh ; (dummy) Tempo
ld (port_treg2),3 ; MIDI Divide Rate : 12MHz
ld (port_treg3),187 ; 1msec Interval Constant(1)
ld (port_admod),0f0h ; A/D Wait
ld (port_bx),00h ; ROM/RAM Area
ld (port_by),00h ;
ld (port_iop6),0ffh ; LED Off
ld (port_iop7),0ffh ;
;<< DSP-01 Initialize >>
%dsp-01_system(0f0h,0) ; Random Bit Pattern
%dsp-01_16ch(000h,0) ; F-NO.(L)
%dsp-01_16ch(010h,0) ; F-NO.(M)
%dsp-01_16ch(020h,0) ; F-NO.(H)
%dsp-01_16ch(030h,0) ; Start Point
%dsp-01_16ch(040h,0) ; Loop Top
%dsp-01_16ch(050h,0) ; Loop End
%dsp-01_16ch(060h,0) ; Bank
%dsp-01_16ch(070h,0) ; Panpot
%dsp-01_16ch(0a0h,0f0h) ; Attack Level
%dsp-01_16ch(0b0h,00fh) ; Attack Speed
call @_dsp-01_all_off ; All Note Off
%dsp-01_system(0f2h,00101111b) ; Output Parameter
%dsp-01_system(0f5h,1) ; Memory Bus Open
;<< RAM Area Initialize >>
ld hl,internal_ram ; Internal RAM Area
ld bc,512-16
_int_ram_clear:
ld (hl),0
inc hl
djnz bc,_int_ram_clear
call init_tone_set ; TONE Module
call @_dsp-01_all_off ; Tone Generator All Note Off
ld (time_base_para),2 ; Time Base = 48
ld (relative_tempo),40h ; Relative Tempo = 1:1
ld a,(sequence_tempo)
ld (tempo),a
call @_tempo_setting ; BIOS
call @_rel_tempo_set ; BIOS
%data_set_16(volume,190) ; MIDI Volume
%data_set_16(bender,40h) ; MIDI Bender
%data_set_16(dsp_vib_dat,8) ; Vibrate Default Offset
ld (port_admod),11111000b ; A/D Start !
ei
ret
;========== Main Loop =====================================
main_start:
nop
main_loop:
call @_dsp-01_rx_chk ; TGEN
call @_dsp-01_vibrate ; TGEN
call @_int_1msec_seq ; BIOS
bit int_bit_timer,(int_flg)
call nz,@_play_check ; BIOS
jr main_loop
@_play_check:
res int_bit_timer,(int_flg)
bit real_play,(run_mode) ; Playing ?
ret z
cp (active_status),0
ret z
ld (play_trk),3 ; Track NO.
ld (play_bit),00001000b ; Track Bit
_play_chk_loop:
ld a,(active_status)
and a,(play_bit) ; Active Track ?
jr z,_play_chk_next
ld hl,play_counter
ld a,(play_trk)
cp (hl+a),2 ; Play_Counter End ?
jr c,_play_chk_hit
dec (hl+a) ; NO --> Decrement Only
jr _play_chk_next
_play_chk_hit:
ld hl,play_data_1
ld b,(hl+a)
bit 7,b ; 1st Event ?
jr z,_play_chk_pass
ld a,b
and a,11110000b
cp a,11110000b
jr nz,_play_chk_midi
cp b,0fch ; Track End ?
jr z,_play_chk_end
jr _play_chk_recov ; F8 or F9
_play_chk_midi:
ld c,b ; Status
ld a,(play_trk)
slaa
slaa
or a,b
ld b,a
call @_tx_midi_set ; MIDI Status Tx. Set
ld hl,play_data_2
ld a,(play_trk)
ld b,(hl+a)
call @_tx_midi_set ; MIDI Key-Num. Tx. Set
and c,11100000b
cp c,11000000b ; Status = [Cn]/[Dn] ?
jr z,_play_chk_pass
ld hl,play_data_3
ld a,(play_trk)
ld b,(hl+a)
call @_tx_midi_set ; MIDI Velocity Tx. Set
_play_chk_pass:
call @_play_request ; MPU Next Data Request Sequence
ld hl,play_counter
ld a,(play_trk)
cp (hl+a),0 ; Soon Get Next Data ?
jr z,_play_chk_hit
_play_chk_next:
dec (play_trk)
srl (play_bit)
jr nc,_play_chk_loop
ret
_play_chk_recov:
ld hl,play_buffer
ld a,(play_trk)
ld b,(hl+a)
ld hl,play_data_1
ld (hl+a),b
jr _play_chk_pass
_play_chk_end:
ld a,(play_bit)
cpl a
and a,(active_status)
ld (active_status),a
jr nz,_play_chk_next
res real_play,(run_mode)
ret
;<< NO.[ 11 ] Play Data Request >>
@_play_request:
ld b,(play_trk)
call @_receive_wait ; Wait Check
ld hl,play_counter
ld a,(play_trk)
ld (hl+a),b
cp b,0f8h ; Timing Overflow ?
jr nc,_play_hit_f8
call @_receive_wait ; Wait Check
ld c,b
and c,0f0h
cp c,0f0h
jr nz,_play_wait_cont
ld hl,play_data_1
ld a,(play_trk)
ld c,(hl+a)
ld (hl+a),b
ld hl,play_buffer
ld (hl+a),c
ret
_play_hit_f8:
ld (hl+a),240
ld hl,play_data_1
ld c,(hl+a)
ld (hl+a),0f8h
ld hl,play_buffer
ld (hl+a),c
ret
_play_wait_cont:
bit 7,b
jr z,_play_running
ld hl,play_data_1
ld a,(play_trk)
ld (hl+a),b
call @_receive_wait ; Wait Check
_play_running:
ld hl,play_data_2
ld a,(play_trk)
ld (hl+a),b
ld hl,play_data_1
ld c,(hl+a)
and c,11100000b
cp c,11000000b ; Status = [Cn]/[Dn] ?
ret z
call @_receive_wait ; Wait Check
ld hl,play_data_3
ld a,(play_trk)
ld (hl+a),b
ret
;<< NO.[ 16 ] Play Sequence Data Get Waiting Check : Return = [B] >>
@_receive_wait:
cp (play_trk),0
jr z,_wait_0
cp (play_trk),1
jr z,_wait_1
cp (play_trk),2
jr z,_wait_2
cp (play_trk),3
jr z,_wait_3
_wait_0:
ld hl,(pointer_1)
ld b,(hl)
inc hl
ld (pointer_1),hl
ret
_wait_1:
ld hl,(pointer_2)
ld b,(hl)
inc hl
ld (pointer_2),hl
ret
_wait_2:
ld hl,(pointer_3)
ld b,(hl)
inc hl
ld (pointer_3),hl
ret
_wait_3:
ld hl,(pointer_4)
ld b,(hl)
inc hl
ld (pointer_4),hl
ret
;<< NO.[ 17 ] Relative Tempo Setting >>
@_rel_tempo_set:
ld hl,0100h
div hl,(relative_tempo)
mul hl,40h
res tempo_bit,(port_trun)
ld (port_treg0),hl ; Timer [A] = Time Base
set tempo_bit,(port_trun)
ret
;<< NO.[ 19 ] 16 Byte Data Setting : [work+0] --> [work+1/2] >>
@_setting_16:
ld a,(work)
ld hl,(work+1)
ld b,16
_set_16:
ld (hl),a
inc hl
djnz _set_16
ret
;<< NO.[ 20 ] Tempo Setting : Input Data = (tempo) >>
@_tempo_setting:
ld l,(time_base_para)
mul hl,07dh
ld (temp+0),hl
ld a,(time_base_para)
slaa
slaa
add a,(temp+1)
ld (temp+2),a
ld l,(tempo)
mul hl,(temp+0)
ld (temp+1),h
ld (time_number+0),l
ld l,(tempo)
mul hl,(temp+2)
ld (temp+2),hl
ld a,(temp+1)
add a,(temp+2)
ld (time_number+1),a
ld a,(temp+3)
adc a,0
ld (time_number+2),a
ret
;<< NO.[ 24 ] MIDI Transmit Data Set : Input = [ B ] >>
@_tx_midi_set:
push de
ld hl,(tx_top)
ld de,tx_fifo
add hl,de
ld (hl),b
incw (tx_top)
bit 4,(tx_top+1)
jr z,_tx_midi_ex
ldw (tx_top),0
_tx_midi_ex:
pop de
ret
;<< NO.[ 25 ] Waiting Timer >>
@_wait_timer:
ld bc,07fffh
_wait_loop:
nop
djnz bc,_wait_loop
ret
;<< NO.[ 29 ] 24*24-->48 Multiply : [calc+0/2]*[calc+3/5] --> [calc+6/11] >>
@_24_24_to_48:
ld l,(calc+0)
mul hl,(calc+3)
ld (calc+6),l ; LSB 8bit
ld c,h
ld b,0
ld l,(calc+1)
mul hl,(calc+3)
ld e,l
ld d,0
ld (calc+8),h
ld l,(calc+0)
mul hl,(calc+4)
ld (calc+9),h
ld h,0
add hl,bc
add hl,de
ld (calc+7),l ; 2nd LSB 8bit
ld c,(calc+8)
ld b,0
ld e,(calc+9)
ld d,0
ld l,h
ld h,0
add hl,bc
add hl,de
ld ix,hl
ld l,(calc+2)
mul hl,(calc+3)
ld c,l
ld b,0
ld (calc+9),h
ld l,(calc+1)
mul hl,(calc+4)
ld e,l
ld d,0
ld (calc+10),h
ld l,(calc+0)
mul hl,(calc+5)
ld (calc+11),h
ld h,0
add hl,ix
add hl,bc
add hl,de
ld (calc+8),l ; 3rd LSB 8bit
ld c,(calc+9)
ld b,0
ld ix,bc
ld c,(calc+10)
ld b,0
ld e,(calc+11)
ld d,0
ld l,h
ld h,0
add hl,ix
add hl,bc
add hl,de
ld bc,hl
ld l,(calc+2)
mul hl,(calc+4)
ld e,l
ld d,0
ld (calc+10),h
ld l,(calc+1)
mul hl,(calc+5)
ld (calc+11),h
ld h,0
add hl,bc
add hl,de
ld (calc+9),l ; 3rd MSB 8bit
ld c,(calc+10)
ld b,0
ld e,(calc+11)
ld d,0
ld l,h
ld h,0
add hl,bc
add hl,de
ld bc,hl
ld l,(calc+2)
mul hl,(calc+5)
add hl,bc
ld (calc+10),l ; 2nd MSB 8bit
ld (calc+11),h ; MSB 8bit
ret
;<< NO.[ 30 ] 48Bit --> 24Bit Cutting : [calc+6/11] --> [calc+0/2] >>
@_48_cut_to_24:
sla (calc+8)
ld a,0
adc a,(calc+9)
ld (calc+0),a
ld a,0
adc a,(calc+10)
ld (calc+1),a
ld a,0
adc a,(calc+11)
ld (calc+2),a
ret
;<< NO.[ 31 ] 48Bit-->24Bit Cut + 1Bit Shift : [calc+6/11] --> [calc+0/2] >>
@_48_shift_24:
rl (calc+8)
ld a,(calc+9)
rla
ld (calc+0),a
ld a,(calc+10)
rla
ld (calc+1),a
ld a,(calc+11)
rla
ld (calc+2),a
ret
;========== Tone ON Event Routine ========
@_dsp_on_send:
ld b,0fah ; DSP-01 = [FA**]
ld c,e
or c,0c0h
ld (bc),0f0h
ld c,e
or c,0d0h
ld (bc),00fh
ld c,e
or c,090h
ld (bc),0 ; OFF
ld a,(dsp_channel)
ld (ch_buff),a
ld hl,assign_note
ld a,e
ld b,(dsp_data_1st)
ld (hl+a),b
call @_dsp_on_pitch ; ### Common Subroutine ###
ld hl,(stack_hl)
inc hl
inc hl ; 2
ld a,(hl)
ld c,e
or c,040h
ld (bc),a
inc hl ; 3
ld a,(hl)
ld c,e
or c,050h
ld (bc),a
inc hl ; 4
ld d,(hl)
push hl
ld hl,bank_buff
ld a,e
ld (hl+a),d
ld c,e
or c,060h
ld (bc),d
ld c,e
or c,070h
ld (bc),127
pop hl
inc hl ; 5
ld c,(hl)
push hl
ld hl,volume
ld a,(dsp_channel)
ld l,(hl+a)
mul hl,c
ld a,h
ld l,(dsp_data_2nd)
mul hl,a
ld a,h
ld hl,_speed_table
ld d,(hl+a)
ld c,e
or c,0a0h
ld (bc),d
pop hl
inc hl ; 6
ld a,(hl)
ld c,e
or c,0b0h
ld (bc),a
inc hl ; 7
ld c,(hl)
cp c,0
jr z,_on_decay_0
push hl
ld hl,volume
ld a,(dsp_channel)
ld l,(hl+a)
mul hl,c
ld a,h
ld l,(dsp_data_2nd)
mul hl,a
ld a,h
ld hl,_speed_table
ld a,(hl+a)
pop hl
jr _on_decay_set
_on_decay_0:
ld a,0f0h
_on_decay_set:
ld c,e
or c,0c0h
ld (bc),a
inc hl ; 8
ld a,(hl)
ld c,e
or c,0d0h
ld (bc),a
ld c,e
or c,090h
ld (bc),3 ; ON !
ret
_speed_table:
db 0f0h,08fh,07fh,06ch,06fh,05ch,05fh,04ch
db 04fh,038h,039h,03ah,03bh,03ch,03dh,03eh
db 03fh,028h,029h,02ah,02bh,02ch,02dh,02eh
db 02fh,02fh,018h,018h,019h,019h,01ah,01ah
db 01bh,01bh,01ch,01ch,01dh,01dh,01eh,01eh
db 01fh,01fh,008h,008h,009h,009h,009h,00ah
db 00ah,00ah,00bh,00bh,00bh,00ch,00ch,00ch
db 00eh,00eh,00eh,00eh,00fh,00fh,00fh,00fh
;========== OFF Event Routine ========
@_dsp_off_send:
ld a,(dsp_channel)
ld hl,assign_pc
ld l,(hl+a)
mul hl,10 ; Parameter Counts
add hl,tone_data_bank+9 ; Release
ld b,0fah ; DSP-01 = [FA**]
ld c,e
or c,0c0h
ld (bc),0f0h
ld a,(hl)
ld c,e
or c,0d0h
ld (bc),a
ld c,e
or c,090h
ld (bc),0 ; OFF !
ret
@_dsp_off_rhythm:
ld b,0fah ; DSP-01 = [FA**]
ld c,e
or c,090h
ld (bc),0 ; OFF
ret
;========== Common Pitch Write Routine ========
@_dsp_on_pitch:
ld hl,assign_pc
ld a,(ch_buff)
ld l,(hl+a)
mul hl,10 ; Parameter Counts
add hl,tone_data_bank ; Top
ld (stack_hl),hl
bit 0,(hl)
jr z,_on_shift_next
sub b,12
_on_shift_next:
bit 1,(hl)
jr z,_on_shift_end
sub b,24
_on_shift_end:
and b,7fh
ld a,(ch_buff)
ld hl,bender
ld c,(hl+a)
ld hl,dsp_vib_dat
ld a,(hl+a)
add a,c
ld c,a
sub b,2
ld l,32
mul hl,b
ld b,0
add hl,bc
ld c,08h
add hl,bc
or h,10010000b
ld b,0fah ; DSP-01 = [FA**]
ld a,(hl)
ld c,e
ld (bc),a
and h,00001111b
or h,10100000b
ld a,(hl)
or c,010h
ld (bc),a
or h,00010000b
ld a,(hl)
ld c,e
or c,020h
ld (bc),a
ld hl,(stack_hl)
inc hl ; 1
ld a,(hl)
ld c,e
or c,030h
ld (bc),a
ret
;========== < MIDI Receive > Check ========
@_dsp-01_rx_chk:
ld hl,(dsp_tx_end)
cp hl,(tx_top) ; FIFO Event ?
ret z
ld de,tx_fifo
add hl,de
ld b,(hl)
incw (dsp_tx_end)
bit 4,(dsp_tx_end+1)
jr z,_tx_dsp_nx
ldw (dsp_tx_end),0
_tx_dsp_nx:
bit 7,b
jr z,dsp_running
cp b,0f8h
ret nc ; Realtime = Pass !
cp b,0f0h
jr c,dsp_status
ld (dsp_rsb),0 ; [F0]-[F7] = Pass !
ret
dsp_status:
ld a,b
and b,11110000b
ld (dsp_rsb),b
and a,00001111b
ld (dsp_channel),a
ld (dsp_dcb),0
ret
dsp_running:
ld a,(dsp_rsb)
cp a,0
ret z
cp (dsp_dcb),0
jr nz,_dsp_run_2nd
ld (dsp_data_1st),b
cp a,0c0h
jp z,dsp_prog_change
cp a,0d0h
ret z
ld (dsp_dcb),1
ret
_dsp_run_2nd:
ld (dsp_data_2nd),b
ld (dsp_dcb),0
ld a,(dsp_rsb)
cp a,080h
jp z,dsp_note_off
cp a,090h
jp z,dsp_note_on
cp a,0b0h
jp z,dsp_cont_change
cp a,0e0h
jp z,dsp_pitch_bend
ret
dsp_note_off:
ld e,0 ; Assign Channel
_assign_off_1:
ld hl,assign_ctr
ld a,e
cp (hl+a),10h
jr z,_assign_off_2
ld hl,assign_ch
ld a,(hl+a)
cp a,(dsp_channel)
jr nz,_assign_off_2
ld hl,assign_note
ld a,e
ld a,(hl+a)
cp a,(dsp_data_1st)
jr z,_assign_off_3
_assign_off_2:
inc e
cp e,10h
jr nz,_assign_off_1
ret
_assign_off_3:
ld hl,assign_ctr
ld a,e
ld b,(hl+a)
ld d,0
_assign_off_4:
ld a,d
cp (hl+a),10h
jr z,_assign_off_6
ld a,(hl+a)
cp a,b
jr z,_assign_off_5
jr c,_assign_off_6
ld a,d
dec (hl+a)
jr _assign_off_6
_assign_off_5:
ld a,e
ld (hl+a),10h
_assign_off_6:
inc d
cp d,10h
jr nz,_assign_off_4
ld hl,pedals
ld a,(dsp_channel)
bit pedal_damper,(hl+a)
ret nz
jp @_dsp_off_send ; DSP-01 Trigger
dsp_note_on:
cp (dsp_data_2nd),0
jp z,dsp_note_off
ld hl,pedals
ld a,(dsp_channel)
bit pedal_soft,(hl+a)
jr z,_not_soft_on
srl (dsp_data_2nd)
_not_soft_on:
ld e,0 ; Assign Channel
_assign_on_1:
ld hl,assign_ctr
ld a,e
cp (hl+a),10h
jr z,_assign_on_2
ld hl,assign_ch
ld a,(hl+a)
cp a,(dsp_channel)
jr nz,_assign_on_2
ld hl,assign_note
ld a,e
ld a,(hl+a)
cp a,(dsp_data_1st)
jr z,_assign_on_3
_assign_on_2:
inc e
cp e,10h
jr z,_assign_on_next
jr _assign_on_1
_assign_on_3:
call @_dsp_off_rhythm ; DSP-01 Trigger
ld hl,assign_ctr
ld a,e
ld b,(hl+a)
ld d,0
_assign_on_4:
ld a,d
ld a,(hl+a)
cp a,b
jr z,_assign_on_5
jr nc,_assign_on_6
ld a,d
inc (hl+a)
jr _assign_on_6
_assign_on_5:
ld a,e
ld (hl+a),0
_assign_on_6:
inc d
cp d,10h
jr nz,_assign_on_4
jp @_dsp_on_send ; DSP-01 Trigger
_assign_on_next:
ld e,(on_pointer) ; Assign Channel
ld b,e
inc (on_pointer)
and (on_pointer),00001111b
ld hl,assign_ctr
_assign_on_7:
ld a,e
cp (hl+a),10h
jr z,_assign_on_8
inc e
and e,00001111b
ld a,e
cp a,b
jr nz,_assign_on_7
jr _assign_on_kill
_assign_on_8:
ld a,0
_assign_on_9:
cp (hl+a),10h
jr z,_assign_on_10
inc (hl+a)
_assign_on_10:
inc a
cp a,10h
jr nz,_assign_on_9
_assign_set_ok:
ld a,e
ld (hl+a),0
ld hl,assign_ch
ld b,(dsp_channel)
ld (hl+a),b
ld hl,assign_note
ld b,(dsp_data_1st)
ld (hl+a),b
jp @_dsp_on_send ; DSP-01 Trigger
_assign_on_kill:
ld e,0 ; Assign Channel
ld hl,assign_ctr
_assign_on_11:
ld a,e
cp (hl+a),0fh
jr z,_assign_on_12
inc e
cp e,10h
jr nz,_assign_on_11
ret
_assign_on_12:
call @_dsp_off_rhythm ; DSP-01 Trigger
ld hl,assign_ctr
ld a,0
_assign_on_13:
inc (hl+a)
inc a
cp a,10h
jr nz,_assign_on_13
jr _assign_set_ok
dsp_cont_change:
cp (dsp_data_1st),7
jr z,_dsp_cont_vol
cp (dsp_data_1st),64
jr z,_dsp_cont_damp
cp (dsp_data_1st),67
jr z,_dsp_cont_soft
ret
_dsp_cont_soft:
ld hl,pedals
ld a,(dsp_channel)
bit 6,(dsp_data_2nd)
jr z,_soft_off
set pedal_soft,(hl+a)
ret
_soft_off:
res pedal_soft,(hl+a)
ret
_dsp_cont_vol:
ld hl,volume
ld a,(dsp_channel)
ld b,(dsp_data_2nd)
scf
rl b
ld (hl+a),b
ret
_dsp_cont_damp:
ld hl,pedals
ld a,(dsp_channel)
bit 6,(dsp_data_2nd)
jr z,_damper_off
set pedal_damper,(hl+a)
ret
_damper_off:
res pedal_damper,(hl+a)
ld e,0 ; Assign Channel
_damper_off_1:
ld hl,assign_ctr
ld a,e
cp (hl+a),10h
jr nz,_damper_off_2
ld hl,assign_ch
ld a,(hl+a)
cp a,(dsp_channel)
jr nz,_damper_off_2
ld hl,assign_note
ld a,e
ld a,(hl+a)
ld (dsp_data_1st),a
ld (dsp_data_2nd),0
call @_dsp_off_send ; DSP-01 Trigger
_damper_off_2:
inc e
cp e,10h
jr nz,_damper_off_1
ret
dsp_prog_change:
ld hl,assign_pc
ld a,(dsp_channel)
ld (hl+a),b
ld l,b
mul hl,10 ; Parameter Counts
add hl,tone_data_bank
ld a,(hl)
ld b,a
and a,00001100b
srla
srla
add a,2
ld c,a
ld a,b
and a,00110000b
slla
slla
or a,c
ld c,a
ld hl,dsp_vib_spd
ld a,(dsp_channel)
ld (hl+a),c
ret
dsp_pitch_bend:
ld hl,bender
ld a,(dsp_channel)
ld (hl+a),b
ld e,0
_bend_chk:
ld hl,assign_ch
ld a,e
ld a,(hl+a)
cp a,(dsp_channel)
jr nz,_bend_next
ld (ch_buff),a
ld hl,assign_note
ld a,e
ld b,(hl+a)
call @_dsp_on_pitch ; ### Common Subroutine ###
_bend_next:
inc e
cp e,10h
jr nz,_bend_chk
ret
;========== All Note Off ========
@_dsp-01_all_off:
%dsp-01_16ch(0c0h,0f0h) ; Decay Level
%dsp-01_16ch(0d0h,007h) ; Decay Speed
%dsp-01_16ch(090h,0) ; Control Word
ld a,0
ld hl,assign_ctr
_all_off_loop:
ld (hl+a),10h
inc a
cp a,10h
jr nz,_all_off_loop
ret
;========== Vibrate Routine ========
@_dsp-01_vibrate:
inc (vib_timer)
cp (vib_timer),3 ; Speed Parameter
ret nz
ld (vib_timer),0
ld (loop_counter),0
_dsp_vib_loop:
ld e,(loop_counter) ; [E] = MIDI Channel
ld a,e
ld hl,dsp_vib_flg
ld (hl+a),0
ld hl,dsp_vib_spd
ld c,(hl+a)
ld b,c
and b,00111111b
ld hl,dsp_vib_ctr
inc (hl+a)
ld a,(hl+a)
cp a,b
jr c,_dsp_vib_next
ld a,e
ld (hl+a),0
ld hl,dsp_vib_add
inc (hl+a)
ld a,(hl+a)
and a,00011111b
ld hl,_dsp_vib_table
and c,11000000b
srl c
ld b,0
add hl,bc
ld c,(hl+a)
ld a,e
ld hl,dsp_vib_dat
ld (hl+a),c
ld hl,dsp_vib_flg
inc (hl+a)
_dsp_vib_next:
inc (loop_counter)
cp (loop_counter),10h
jr nz,_dsp_vib_loop
ld (loop_counter),0
_vib_chk:
ld e,(loop_counter) ; [E] = DSP-01 Channel
ld hl,assign_ch
ld a,e
ld a,(hl+a)
ld hl,dsp_vib_flg
cp (hl+a),0
jr z,_vib_next
ld (ch_buff),a
ld hl,assign_note
ld a,e
ld b,(hl+a)
call @_dsp_on_pitch ; ### Common Subroutine ###
_vib_next:
inc (loop_counter)
cp (loop_counter),10h
jr nz,_vib_chk
ret
_dsp_vib_table:
db 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
db 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 ; Depth = [00]
db 8,8,8,9,9,9,9,9,10,9,9,9,9,9,8,8
db 8,8,8,7,7,7,7,7,6,7,7,7,7,7,8,8 ; Depth = [01]
db 8,9,10,10,11,11,11,12,12,12,11,11,11,10,10,9
db 8,7,6,6,5,5,5,4,4,4,5,5,5,6,6,7 ; Depth = [10]
db 8,9,10,11,12,13,13,14,14,14,13,13,12,11,10,9
db 8,7,6,5,4,3,3,2,2,2,3,3,4,5,6,7 ; Depth = [11]
;========== Pitch Setting Subroutines ======================
shift_set:
ldw (work+6),0b000h
%shift(0be80h,0ae80h,09e80h)
%shift(0bd00h,0ad00h,09d00h)
%shift(0bb80h,0ab80h,09b80h)
%shift(0ba00h,0aa00h,09a00h)
%shift(0b880h,0a880h,09880h)
%shift(0b700h,0a700h,09700h)
%shift(0b580h,0a580h,09580h)
%shift(0b400h,0a400h,09400h)
%shift(0b280h,0a280h,09280h)
%shift(0b100h,0a100h,09100h)
ret
_shift_sub:
ld hl,(work+0)
ld de,(work+2)
ld bc,(work+4)
_shift_loop:
dec hl
dec de
dec bc
srl (hl)
rr (de)
rr (bc)
cp hl,(work+6)
jr nz,_shift_loop
ret
all_range:
%range(0bfffh,0be7fh)
%range(0afffh,0ae7fh)
%range(09fffh,09e7fh)
ret
bend_compute:
ld (work+0),0
_bend_set_loop:
ld (work+1),090h
ld (work+2),0a0h
ld (work+3),0b0h
call _bend_sub ; Each Bend Set
inc (work+0)
cp (work+0),12
jr nz,_bend_set_loop
ret
_bend_sub:
ld a,(work+0)
ld hl,_low_offset_2
ld c,(hl+a)
ld hl,_high_offset_1
ld b,(hl+a)
ld a,(work+1)
or a,b
ld b,a
ld a,(bc)
ld (work+5),a
ld a,(work+0)
ld hl,_low_offset_2
ld c,(hl+a)
ld hl,_high_offset_1
ld b,(hl+a)
ld a,(work+2)
or a,b
ld b,a
ld a,(bc)
ld (work+6),a
ld a,(work+0)
ld hl,_low_offset_2
ld c,(hl+a)
ld hl,_high_offset_1
ld b,(hl+a)
ld a,(work+3)
or a,b
ld b,a
ld a,(bc)
ld (work+7),a ; Normal Pitch Data Get !
ld (work+4),0 ; Bend Depth : 0-31
_bend_sub_loop:
call _bend_sub_sub
inc (work+4)
cp (work+4),32
jr nz,_bend_sub_loop
ret
_bend_sub_sub:
%move_3byte(calc+0,work+5)
ld l,(work+4) ; Bend Depth
mul hl,3
ld bc,_bend_table
add hl,bc
ld a,(hl)
ld (calc+5),a
inc hl
ld a,(hl)
ld (calc+4),a
inc hl
ld a,(hl)
ld (calc+3),a ; Bend Multi. Data Set !
call @_24_24_to_48 ; BIOS
call @_48_shift_24 ; BIOS
ld a,(work+0)
ld hl,_low_offset_3
ld c,(hl+a)
ld hl,_high_offset_1
ld b,(hl+a)
ld a,(work+1)
or a,b
ld b,a
ld l,(work+4) ; Bend Depth
ld h,0
add hl,bc
ld a,(calc+0)
ld (hl),a
ld a,(work+0)
ld hl,_low_offset_3
ld c,(hl+a)
ld hl,_high_offset_1
ld b,(hl+a)
ld a,(work+2)
or a,b
ld b,a
ld l,(work+4) ; Bend Depth
ld h,0
add hl,bc
ld a,(calc+1)
ld (hl),a
ld a,(work+0)
ld hl,_low_offset_3
ld c,(hl+a)
ld hl,_high_offset_1
ld b,(hl+a)
ld a,(work+3)
or a,b
ld b,a
ld l,(work+4) ; Bend Depth
ld h,0
add hl,bc
ld a,(calc+2)
ld (hl),a ; Pitch Data Set !
ret
temp_compute:
ld (work+0),0 ; Check Note [C-B]
ld (work+4),0 ; Temp. Offset Bias
ld (work+5),0 ; Temp Select NO.
call _temp_select
_temp_set_loop:
ld (work+1),090h
ld (work+2),0a0h
ld (work+3),0b0h
call _temp_sub ; Each Temp. Set
inc (work+0)
cp (work+0),12
jr nz,_temp_set_loop
ret
_temp_select:
ld hl,_temp_sel_tb
ld a,(work+5)
ld c,(hl+a)
bit 7,c
jr nz,_temp_sel_cont
ld (work+5),c
ret
_temp_sel_cont:
ld b,c
and b,11110000b ; 80=Pytha/C0=Mean/E0=Q*/F0=T*
and c,00001111b ; Shift Data
cp b,80h
jr z,_temp_sel_80
cp b,0c0h
jr z,_temp_sel_c0
cp b,0e0h
jr z,_temp_sel_e0
ld (work+5),22 ; Pure [T-*] Temp.
jr _temp_sel_next
_temp_sel_80:
ld (work+5),1 ; Pythagorean Temp.
jr _temp_sel_next
_temp_sel_c0:
ld (work+5),2 ; Meantone Temp.
jr _temp_sel_next
_temp_sel_e0:
ld (work+5),21 ; Pure [Q-*] Temp.
_temp_sel_next:
ld a,(work+4) ; Temp Bias
add a,c
cp a,12
jr c,_temp_sel_exit
sub a,12
_temp_sel_exit:
ld (work+4),a
ret
_temp_sub:
ld a,(work+0)
ld hl,_low_offset_2
ld c,(hl+a)
ld hl,_high_offset_1
ld b,(hl+a)
ld a,(work+1)
or a,b
ld b,a
ld a,(bc)
ld (calc+0),a
ld a,(work+0)
ld hl,_low_offset_2
ld c,(hl+a)
ld hl,_high_offset_1
ld b,(hl+a)
ld a,(work+2)
or a,b
ld b,a
ld a,(bc)
ld (calc+1),a
ld a,(work+0)
ld hl,_low_offset_2
ld c,(hl+a)
ld hl,_high_offset_1
ld b,(hl+a)
ld a,(work+3)
or a,b
ld b,a
ld a,(bc)
ld (calc+2),a ; Current Pitch Data Get !
ld hl,_temp_offset
ld a,(work+0) ; My Note
ld c,(hl+a)
ld b,0
add hl,bc
ld a,(work+4) ; Temp Offset Bias
ld c,(hl+a)
ld l,3
mul hl,c
ld bc,hl ; Temp Data Note Offset
ld l,(work+5) ; Temp Select NO.
mul hl,36
ld de,hl ; Temp Select Offset
ld hl,_temp_table
add hl,bc
add hl,de
ld a,(hl)
ld (calc+5),a
inc hl
ld a,(hl)
ld (calc+4),a
inc hl
ld a,(hl)
ld (calc+3),a ; Temp Multi. Data Set !
call @_24_24_to_48 ; BIOS
call @_48_cut_to_24 ; BIOS
ld a,(work+0)
ld hl,_low_offset_2
ld c,(hl+a)
ld hl,_high_offset_1
ld b,(hl+a)
ld a,(work+1)
or a,b
ld b,a
ld a,(calc+0)
ld (bc),a
ld a,(work+0)
ld hl,_low_offset_2
ld c,(hl+a)
ld hl,_high_offset_1
ld b,(hl+a)
ld a,(work+2)
or a,b
ld b,a
ld a,(calc+1)
ld (bc),a
ld a,(work+0)
ld hl,_low_offset_2
ld c,(hl+a)
ld hl,_high_offset_1
ld b,(hl+a)
ld a,(work+3)
or a,b
ld b,a
ld a,(calc+2)
ld (bc),a ; Pitch Data Set !
ret
note_devide:
ld (work+0),1
_note_dev_loop:
ld (work+1),090h
ld (work+2),0a0h
ld (work+3),0b0h
call _note_sub ; Each Notes Set
inc (work+0)
cp (work+0),12
jr nz,_note_dev_loop
ret
_note_sub:
ld hl,_low_offset_1
ld c,(hl)
ld hl,_high_offset_1
ld b,(hl)
ld a,(work+1)
or a,b
ld b,a
ld a,(bc)
ld (calc+0),a
ld hl,_low_offset_1
ld c,(hl)
ld hl,_high_offset_1
ld b,(hl)
ld a,(work+2)
or a,b
ld b,a
ld a,(bc)
ld (calc+1),a
ld hl,_low_offset_1
ld c,(hl)
ld hl,_high_offset_1
ld b,(hl)
ld a,(work+3)
or a,b
ld b,a
ld a,(bc)
ld (calc+2),a ; Standard Pitch Data Get !
%move_3byte(calc+3,_dev_data)
ld (work+4),0
_note_sub_loop:
call @_24_24_to_48 ; BIOS
call @_48_cut_to_24 ; BIOS
inc (work+4)
ld a,(work+4)
cp a,(work+0)
jr nz,_note_sub_loop
ld a,(work+0)
ld hl,_low_offset_1
ld c,(hl+a)
ld hl,_high_offset_1
ld b,(hl+a)
ld a,(work+1)
or a,b
ld b,a
ld a,(calc+0)
ld (bc),a
ld a,(work+0)
ld hl,_low_offset_1
ld c,(hl+a)
ld hl,_high_offset_1
ld b,(hl+a)
ld a,(work+2)
or a,b
ld b,a
ld a,(calc+1)
ld (bc),a
ld a,(work+0)
ld hl,_low_offset_1
ld c,(hl+a)
ld hl,_high_offset_1
ld b,(hl+a)
ld a,(work+3)
or a,b
ld b,a
ld a,(calc+2)
ld (bc),a ; Pitch Data Set !
ret
pitch_shift:
ld (work+0),020h
ld (work+1),090h
ld (work+2),0a0h
ld (work+3),0b0h
call _pitch_sub ; [G 9] Set
ret
_pitch_sub:
ld a,(work+0)
and a,00111111b
ld l,3
mul hl,a
ld bc,_hz_set_table
add hl,bc
ld a,(hl)
ld (calc+2),a
inc hl
ld a,(hl)
ld (calc+1),a
inc hl
ld a,(hl)
ld (calc+0),a
%move_3byte(calc+3,_g9_data)
call @_24_24_to_48 ; BIOS
call @_48_cut_to_24 ; BIOS
ld hl,_low_offset_1
ld c,(hl)
ld hl,_high_offset_1
ld b,(hl)
ld a,(work+1)
or a,b
ld b,a
ld a,(calc+0)
ld (bc),a
ld hl,_low_offset_1
ld c,(hl)
ld hl,_high_offset_1
ld b,(hl)
ld a,(work+2)
or a,b
ld b,a
ld a,(calc+1)
ld (bc),a
ld hl,_low_offset_1
ld c,(hl)
ld hl,_high_offset_1
ld b,(hl)
ld a,(work+3)
or a,b
ld b,a
ld a,(calc+2)
ld (bc),a ; [G9] Pitch Data Set !
ret
_low_offset_3:
db 00h,20h,40h,60h,80h,0a0h,0c0h,0e0h,80h,0a0h,0c0h,0e0h
_low_offset_2:
db 10h,30h,50h,70h,90h,0b0h,0d0h,0f0h,90h,0b0h,0d0h,0f0h
_high_offset_1:
db 0fh,0fh,0fh,0fh,0fh,0fh,0fh,0fh,0eh,0eh,0eh,0eh
_low_offset_1:
db 0f0h,0d0h,0b0h,90h,70h,50h,30h,10h,0f0h,0d0h,0b0h,90h
_temp_sel_tb:
db 0,0
_temp_offset:
db 11,10,9,8,7,6,5,4,3,2,1,0,11,10,9,8,7,6,5,4,3,2,1
_g9_data:
db 0bch,084h,0cdh
_dev_data:
db 0bfh,0a1h,0f1h
_hz_set_table:
db 076h,0B0h,0DFh,076h,0FBh,058h,077h,045h,0D1h,077h,090h,04Ah ; 408-411(Hz)
db 077h,0DAh,0C3h,078h,025h,03Ch,078h,06Fh,0B5h,078h,0BAh,02Eh ; 412-415
db 079h,004h,0A7h,079h,04Fh,020h,079h,099h,099h,079h,0E4h,012h ; 416-419
db 07Ah,02Eh,08Bh,07Ah,079h,004h,07Ah,0C3h,07Dh,07Bh,00Dh,0F6h ; 420-423
db 07Bh,058h,06Fh,07Bh,0A2h,0E8h,07Bh,0EDh,061h,07Ch,037h,0DAh ; 424-427
db 07Ch,082h,053h,07Ch,0CCh,0CCh,07Dh,017h,045h,07Dh,061h,0BEh ; 428-431
db 07Dh,0ACh,037h,07Dh,0F6h,0B0h,07Eh,041h,029h,07Eh,08Bh,0A2h ; 432-435
db 07Eh,0D6h,01Bh,07Fh,020h,094h,07Fh,06Bh,00Dh,07Fh,0B5h,086h ; 436-439
db 080h,000h,000h,080h,04Ah,079h,080h,094h,0F2h,080h,0DFh,06Bh ; 440-443
db 081h,029h,0E4h,081h,074h,05Dh,081h,0BEh,0D6h,082h,009h,04Fh ; 444-447
db 082h,053h,0C8h,082h,09Eh,041h,082h,0E8h,0BAh,083h,033h,033h ; 448-451
db 083h,07Dh,0ACh,083h,0C8h,025h,084h,012h,09Eh,084h,05Dh,017h ; 452-455
db 084h,0A7h,090h,084h,0F2h,009h,085h,03Ch,082h,085h,086h,0FBh ; 456-459
db 085h,0D1h,074h,086h,01Bh,0EDh,086h,066h,066h,086h,0B0h,0DFh ; 460-463
db 086h,0FBh,058h,087h,045h,0D1h,087h,090h,04Ah,087h,0DAh,0C3h ; 464-467
db 088h,025h,03Ch,088h,06Fh,0B5h,088h,0BAh,02Eh,089h,004h,0A7h ; 468-471
_bend_table:
db 07Ch,05Bh,028h,07Ch,094h,0ACh,07Ch,0CEh,04Bh,07Dh,008h,005h ; -16/-13
db 07Dh,041h,0D9h,07Dh,07Bh,0C8h,07Dh,0B5h,0D2h,07Dh,0EFh,0F6h ; -12/-9
db 07Eh,02Ah,036h,07Eh,064h,090h,07Eh,09Fh,006h,07Eh,0D9h,096h ; -8/-5
db 07Fh,014h,042h,07Fh,04Fh,008h,07Fh,089h,0EAh,07Fh,0C4h,0E7h ; -4/-1
db 080h,000h,000h,080h,03Bh,033h,080h,076h,082h,080h,0B1h,0EDh ; 0/+3
db 080h,0EDh,073h,081h,029h,014h,081h,064h,0D1h,081h,0A0h,0AAh ; +4/+7
db 081h,0DCh,09Fh,082h,018h,0AFh,082h,054h,0DBh,082h,091h,022h ; +8/+11
db 082h,0CDh,086h,083h,00Ah,006h,083h,046h,0A1h,083h,083h,059h ; +12/+15
_temp_table:
;*** Temp [0] 12-Equal
db 080h,000h,000h,080h,000h,000h,080h,000h,000h,080h,000h,000h
db 080h,000h,000h,080h,000h,000h,080h,000h,000h,080h,000h,000h
db 080h,000h,000h,080h,000h,000h,080h,000h,000h,080h,000h,000h
;========== Initial Settings =============================
;<< Initial Tone Data Setting >>
init_tone_set:
call pitch_shift ; [G9] 408Hz-471Hz Standard Pitch
call note_devide ; Other 11-Notes Devide
call temp_compute ; Temperaments Computing
call bend_compute ; Bend [-16/+15] Computing
call all_range ; All Range Data Only Copy
call shift_set ; Each Range Data Shift
ld ix,0
ld iy,0
ld bc,128*10
ld hl,default_tone
ld de,tone_data_bank
ldir
ld (work),0
_tone_loop_1:
ld hl,init_tone_table
ld a,(work)
ld b,(hl+a)
ld hl,assign_pc
ld (hl+a),b
ld (dsp_channel),a
call dsp_prog_change
inc (work)
cp (work),16
jr nz,_tone_loop_1
ret
init_tone_table:
db 0,68,48,95,78,41,3,110,122,0 ; 0-8
db 70,34,7,11,62,89 ; 10-15
;========== Defaule Tone Data Area ========================
default_tone:
db 001h,000h,047h,047h,0C0h,06Fh,00Fh,000h,0C8h,099h
db 001h,048h,08Fh,08Fh,0C0h,07Fh,00Fh,000h,0BBh,099h
db 001h,0B0h,0EFh,0EFh,0C2h,07Fh,00Fh,000h,0A8h,098h
db 001h,090h,0AFh,0AFh,0C0h,064h,02Fh,000h,0C9h,098h
db 001h,0AFh,0AFh,0AFh,0C0h,07Fh,018h,000h,0C8h,098h
db 001h,0B0h,0CFh,0CFh,0C0h,064h,00Fh,000h,0CAh,098h
db 009h,0CFh,0CFh,0CFh,0C0h,07Fh,018h,000h,0CAh,098h
db 001h,0E8h,0FEh,0FEh,0C0h,073h,00Fh,000h,0CFh,088h
db 001h,000h,000h,000h,0C5h,052h,03Fh,000h,0FFh,04Fh
db 001h,001h,001h,001h,0C5h,052h,03Fh,000h,0FFh,04Fh
db 001h,002h,002h,002h,0C5h,064h,03Fh,000h,0FFh,04Fh
db 001h,003h,003h,003h,0C5h,064h,03Fh,000h,0FFh,04Fh
db 001h,004h,004h,004h,0C5h,038h,068h,038h,08Ah,098h
db 001h,005h,005h,005h,0C5h,04Fh,07Ah,04Fh,08Ah,098h
db 001h,006h,006h,006h,0C5h,04Fh,07Ah,048h,08Ah,098h
db 015h,028h,03Fh,03Fh,0C1h,054h,06Fh,05Ah,0AAh,065h
db 001h,000h,01Fh,01Fh,0C2h,07Fh,00Fh,000h,0CFh,088h
db 00Dh,01Fh,01Fh,01Fh,0C2h,07Fh,00Fh,000h,0B8h,088h
db 000h,01Dh,01Dh,01Dh,0C5h,07Fh,00Fh,000h,0B8h,088h
db 000h,01Fh,01Fh,01Fh,0C5h,07Fh,00Fh,000h,0BFh,068h
db 000h,018h,018h,018h,0C5h,07Fh,00Fh,000h,0BFh,06Bh
db 004h,01Bh,01Bh,01Bh,0C5h,07Fh,00Fh,000h,0A8h,066h
db 000h,02Dh,02Dh,02Dh,0C5h,055h,00Fh,000h,0A8h,098h
db 01Ch,02Eh,02Eh,02Eh,0C5h,055h,00Fh,000h,0A8h,098h
db 01Ch,030h,03Fh,03Fh,0C3h,05Fh,04Fh,03Fh,0AAh,088h
db 01Dh,0A8h,0BFh,0BFh,0C4h,048h,00Fh,05Ah,088h,088h
db 01Dh,0C0h,0C0h,0D7h,0C3h,06Fh,03Fh,000h,0F8h,088h
db 01Dh,088h,088h,0A7h,0C3h,055h,04Fh,000h,0F8h,088h
db 002h,090h,09Fh,09Fh,0C5h,07Fh,018h,038h,0CFh,088h
db 001h,03Fh,03Fh,03Fh,0C3h,06Fh,008h,000h,0DAh,078h
db 001h,09Fh,09Fh,09Fh,0C5h,07Fh,00Fh,000h,0C8h,078h
db 000h,01Ah,01Ah,01Ah,0C5h,064h,01Fh,000h,0C8h,08Fh
db 01Ah,040h,057h,057h,0C1h,07Fh,068h,048h,0A9h,098h
db 01Dh,058h,06Fh,06Fh,0C1h,064h,088h,03Fh,0EEh,098h
db 01Eh,070h,070h,09Fh,0C4h,078h,06Fh,048h,0ADh,098h
db 07Dh,060h,067h,067h,0C3h,058h,06Fh,000h,0DDh,0A8h
db 0B9h,070h,070h,0AFh,0C2h,04Fh,06Fh,048h,0DFh,0AFh
db 01Ch,025h,025h,025h,0C5h,05Fh,03Fh,000h,0B8h,0A8h
db 018h,015h,015h,015h,0C5h,06Fh,018h,000h,0B8h,0A8h
db 018h,007h,007h,007h,0C5h,064h,058h,03Eh,0ADh,09Fh
db 0DDh,008h,008h,008h,0C5h,06Fh,02Fh,000h,0BFh,0BFh
db 07Ch,009h,009h,009h,0C5h,064h,018h,000h,0C8h,0A8h
db 05Ch,00Ah,00Ah,00Ah,0C5h,048h,048h,038h,0DDh,08Ch
db 054h,00Bh,00Bh,00Bh,0C5h,04Fh,048h,048h,0A8h,0A8h
db 01Dh,0A8h,0BFh,0BFh,0C4h,04Fh,05Fh,058h,0A8h,09Fh
db 019h,000h,000h,000h,0C5h,028h,018h,04Fh,088h,08Dh
db 085h,014h,014h,014h,0C5h,07Fh,02Fh,000h,0A9h,0A9h
db 01Ch,00Ch,00Ch,00Ch,0C5h,044h,018h,038h,0C8h,078h
db 001h,070h,070h,0AFh,0C2h,048h,018h,04Fh,0BFh,0AFh
db 01Dh,0B0h,0CFh,0CFh,0C1h,06Fh,048h,000h,0CFh,0AFh
db 01Dh,0CFh,0CFh,0CFh,0C1h,064h,078h,038h,0CFh,0AFh
db 000h,040h,04Fh,04Fh,0C3h,05Fh,02Fh,000h,088h,088h
db 019h,010h,01Fh,01Fh,0C4h,05Fh,058h,048h,0B8h,088h
db 01Ch,021h,021h,021h,0C5h,058h,078h,048h,0B8h,088h
db 01Dh,0A0h,0A7h,0A7h,0C4h,07Fh,078h,038h,099h,088h
db 018h,022h,022h,022h,0C5h,064h,09Fh,048h,099h,088h
db 001h,040h,04Fh,04Fh,0C3h,054h,048h,000h,0DFh,088h
db 018h,025h,025h,025h,0C5h,058h,018h,000h,0B8h,0AAh
db 000h,025h,025h,025h,0C5h,06Fh,02Eh,000h,0ACh,0ACh
db 008h,00Dh,00Dh,00Dh,0C5h,064h,01Fh,000h,0B8h,088h
db 008h,00Eh,00Eh,00Eh,0C5h,05Fh,00Fh,000h,0B8h,088h
db 001h,0D0h,0E7h,0E7h,0C0h,06Fh,018h,000h,0DFh,088h
db 008h,019h,019h,019h,0C5h,06Fh,01Fh,000h,0D8h,088h
db 055h,078h,08Fh,08Fh,0C5h,06Fh,04Fh,000h,0C8h,098h
db 001h,000h,00Fh,00Fh,0C3h,06Fh,00Fh,000h,0C8h,088h
db 001h,00Fh,00Fh,00Fh,0C3h,074h,01Fh,000h,0C8h,088h
db 001h,010h,01Fh,01Fh,0C3h,06Fh,00Fh,000h,0D8h,088h
db 059h,010h,01Fh,01Fh,0C3h,07Fh,03Eh,000h,098h,088h
db 001h,020h,02Fh,02Fh,0C3h,074h,01Fh,000h,0C8h,088h
db 01Dh,024h,02Fh,02Fh,0C3h,07Fh,00Fh,000h,0BCh,078h
db 01Ch,028h,028h,028h,0C5h,074h,04Fh,000h,0DCh,068h
db 01Ch,029h,029h,029h,0C5h,074h,04Fh,000h,0DCh,068h
db 019h,0D8h,0E7h,0E7h,0C3h,04Fh,044h,058h,0A8h,088h
db 01Ch,02Ch,02Ch,02Ch,0C5h,064h,07Fh,048h,088h,088h
db 019h,0D8h,0E7h,0E7h,0C3h,064h,048h,038h,02Fh,08Fh
db 01Dh,0E7h,0E7h,0E7h,0C3h,064h,038h,028h,098h,078h
db 008h,00Fh,00Fh,00Fh,0C5h,054h,07Fh,03Fh,099h,078h
db 01Dh,068h,087h,087h,0C3h,072h,07Fh,04Fh,0E8h,088h
db 01Dh,080h,097h,097h,0C1h,07Fh,038h,058h,0C8h,088h
db 00Dh,097h,097h,097h,0C1h,07Fh,048h,048h,0A8h,078h
db 00Dh,098h,0AFh,0AFh,0C1h,07Fh,018h,048h,0BFh,088h
db 019h,0ACh,0ACh,0ACh,0C1h,07Fh,03Fh,048h,0A8h,08Ch
db 018h,010h,010h,010h,0C5h,064h,08Fh,02Eh,0AAh,088h
db 018h,00Ch,00Ch,00Ch,0C5h,048h,088h,02Eh,0A8h,09Fh
db 01Ch,00Ah,00Ah,00Ah,0C5h,07Fh,068h,04Fh,098h,08Fh
db 01Dh,0A8h,0BFh,0BFh,0C3h,064h,00Fh,028h,0CCh,088h
db 019h,00Ah,00Ah,00Ah,0C5h,07Fh,07Fh,048h,058h,078h
db 019h,01Ah,01Ah,01Ah,0C5h,064h,06Fh,03Eh,0ADh,078h
db 019h,0E8h,0FEh,0FEh,0C3h,064h,00Fh,048h,0AFh,088h
db 01Ch,023h,023h,023h,0C5h,04Fh,038h,048h,0AFh,088h
db 005h,020h,02Fh,02Fh,0C4h,064h,038h,04Fh,09Fh,08Dh
db 01Ch,024h,024h,024h,0C5h,06Fh,068h,048h,078h,08Fh
db 001h,030h,047h,047h,0C5h,064h,00Fh,04Fh,098h,088h
db 01Dh,047h,047h,047h,0C5h,064h,078h,038h,0BCh,09Fh
db 009h,030h,03Fh,03Fh,0C4h,06Fh,028h,000h,0D8h,088h
db 00Dh,040h,057h,057h,0C4h,064h,00Fh,000h,0E8h,088h
db 01Dh,058h,06Fh,06Fh,0C4h,064h,06Fh,000h,0D8h,088h
db 000h,012h,012h,012h,0C5h,06Fh,01Eh,000h,0A8h,0A8h
db 014h,013h,013h,013h,0C5h,05Fh,00Fh,000h,0A5h,099h
db 001h,048h,05Fh,05Fh,0C5h,07Fh,00Fh,000h,09Fh,09Fh
db 000h,014h,014h,014h,0C5h,07Fh,01Fh,000h,0AAh,0AAh
db 048h,026h,026h,026h,0C5h,06Fh,01Ah,000h,0AFh,0AFh
db 040h,015h,015h,015h,0C5h,064h,038h,000h,0BEh,0BEh
db 011h,018h,027h,027h,0C1h,064h,01Fh,000h,0ADh,098h
db 001h,000h,017h,017h,0C1h,05Fh,00Fh,000h,0BDh,098h
db 005h,0E0h,0EFh,0EFh,0C4h,07Fh,00Fh,000h,098h,098h
db 05Ah,0F0h,0FEh,0FEh,0C4h,07Fh,00Fh,000h,0AFh,0AFh
db 009h,0C4h,0DFh,0DFh,0C4h,064h,038h,05Ah,09Ah,088h
db 018h,02Ah,02Ah,02Ah,0C5h,04Fh,07Fh,038h,08Fh,09Ch
db 058h,010h,010h,010h,0C5h,02Fh,08Fh,038h,098h,09Ch
db 019h,050h,067h,067h,0C3h,064h,00Fh,048h,078h,088h
db 016h,060h,077h,077h,0C5h,064h,07Fh,000h,0A8h,088h
db 001h,0C0h,0E7h,0E7h,0C5h,07Fh,00Fh,000h,0B8h,098h
db 001h,0E8h,0F7h,0F7h,0C5h,07Fh,00Fh,000h,088h,088h
db 001h,0A0h,0BFh,0BFh,0C5h,07Fh,00Fh,000h,0BBh,0BBh
db 002h,050h,05Fh,05Fh,0C2h,07Fh,00Fh,000h,0CFh,098h
db 001h,060h,06Fh,06Fh,0C2h,07Fh,00Fh,000h,0C8h,098h
db 042h,070h,07Fh,07Fh,0C1h,07Fh,00Fh,000h,0C8h,0A8h
db 002h,000h,00Fh,00Fh,0C4h,07Fh,00Fh,000h,0DDh,0DDh
db 002h,090h,0AAh,0BAh,0C6h,07Fh,00Fh,000h,0DDh,0A8h
db 002h,048h,04Fh,04Fh,0C2h,07Fh,00Fh,000h,0B8h,0A9h
db 041h,020h,047h,047h,0C2h,07Fh,03Fh,05Fh,0A8h,099h
db 002h,0D0h,0FEh,0FEh,0C1h,07Fh,00Fh,000h,0CFh,0A8h
db 029h,052h,058h,058h,080h,064h,00Fh,000h,0D8h,088h
db 029h,042h,04Ch,04Ch,080h,064h,00Fh,000h,0D8h,088h
db 019h,000h,000h,000h,080h,058h,038h,000h,0D8h,088h
db 01Dh,052h,05Fh,05Fh,080h,064h,00Fh,000h,0B8h,088h
db 0D9h,050h,057h,057h,080h,064h,018h,000h,0D8h,088h
;<< NO.[ 6 ] 1msec Timer Interrupt Sequence >>
@_int_1msec_seq:
bit int_bit_tim_1,(int_flg)
ret z
res int_bit_tim_1,(int_flg)
bit 0,(led_timer+0) ; Odd/Even ?
jr z,_int_1msec_even
ld (port_treg3),187 ; 1msec Interval Constant(1)
jr _int_1msec_cont
_int_1msec_even:
ld (port_treg3),188 ; 1msec Interval Constant(2)
_int_1msec_cont:
inc (led_timer+0)
cp (led_timer+0),5 ; 5msec Interval ?
ret c
ld (led_timer+0),0
ld c,(port_adreg)
ld b,0
ld hl,(ad_sum)
add hl,bc
ld (ad_sum),hl
ld (port_admod),11111000b ; A/D Start !
inc (led_timer+1)
cp (led_timer+1),20 ; 20 Times ?
ret c
ld (led_timer+1),0
ld hl,(ad_sum)
ldw (ad_sum),0
div hl,20
zzz:
cp l,0a0h ; Trigger Level !
jr c,_ad_eve
ld (ad_flg),0
ret
_ad_eve:
cp (ad_flg),0
ret nz
ld (ad_flg),1
bit 0,(active_status)
jr z,_on_0
bit 1,(active_status)
jr z,_on_1
bit 2,(active_status)
jr z,_on_2
bit 3,(active_status)
jr z,_on_3
ret
_on_0:
set real_play,(run_mode)
set 0,(active_status)
ld (play_data_1+0),0
ld (play_counter+0),0
ldw (pointer_1),sequence_data
ret
_on_1:
set real_play,(run_mode)
set 1,(active_status)
ld (play_data_1+1),0
ld (play_counter+1),0
ldw (pointer_2),sequence_data
ret
_on_2:
set real_play,(run_mode)
set 2,(active_status)
ld (play_data_1+2),0
ld (play_counter+2),0
ldw (pointer_3),sequence_data
ret
_on_3:
set real_play,(run_mode)
set 3,(active_status)
ld (play_data_1+3),0
ld (play_counter+3),0
ldw (pointer_4),sequence_data
ret
%include(pre-1.hex) ; <--- Song Data !!!
end
;*-------------------------------------------------------------*
;* Master --> Child Copy Program *
;*-------------------------------------------------------------*
cgroup group code
gdata segment
dta db 10000 dup (0aah)
gdata ends
code segment public 'code'
assume cs:code,ds:gdata,es:extra,ss:stack
main:;========== Main Routine ==========
mov ax,stack
mov ss,ax
mov ax,offset ss:ss_top
mov sp,ax
mov ax,extra
mov es,ax
call gds_set
mov ah,0
mov dl,01000000b
int 13h ; Disk <A> System Reset
mov ah,0
mov dl,01000000b
int 13h ; Disk <B> System Reset
call gds_set
mov ax,ds
mov es,ax
mov bx,offset dta
mov cx,0001h
mov dx,0040h
mov ax,0201h
int 13h ; Boot Load from <A>
call changer
mov dx,0041h
mov ax,0301h
int 13h ; Boot Save to <B>
mov si,offset bank1
call disc_para_set
mov cx,0201h
mov dx,0040h
mov ax,0208h
int 13h ; 1st Load from <A>
mov dx,0041h
mov ax,0308h
int 13h ; 1st Save to <B>
mov cx,0401h
mov dx,0040h
mov ax,0208h
int 13h ; 2nd Load from <A>
mov dx,0041h
mov ax,0308h
int 13h ; 2nd Save to <B>
mov ch,15h
loop_001:
mov si,offset bank2
call disc_para_set
mov cl,06h
mov dx,0140h
mov ax,0203h
int 13h ; 3rd Load from <A>
mov si,offset bank1
call disc_para_set
mov cl,03h
mov dx,0141h
mov ax,0306h
int 13h ; 3rd Save to <B>
sub ch,2
jns loop_001
mov cx,1301h
loop_002:
mov si,offset bank3
call disc_para_set
mov dx,0140h
mov ax,0205h
int 13h ; 4th Load from <A>
mov si,offset bank1
call disc_para_set
mov dx,0041h
mov ax,0305h
int 13h ; 4th Save to <B>
sub ch,2
jns loop_002
mov ah,4ch
int 21h ; DOS Return
bank1:
db 0efh,003h,025h,002h,009h,02ah,0ffh
bank2:
db 0efh,003h,025h,003h,009h,02ah,0ffh
bank3:
db 0efh,003h,025h,001h,009h,02ah,0ffh
changer:;========== Data Chane Routine ==========
call gds_set
push bx
mov bx,97h
mov dta[bx],0c3h ; Return
mov bx,54h
mov dta[bx],03h ; Sector No. = 3
mov bx,5ah
mov dta[bx],06h ; Sector Count = 6
mov bx,7ah
mov dta[bx],0 ; Head = 0
pop bx
ret
disc_para_set:;========== Disc Parameter ==========
push es
mov ax,0
mov es,ax
mov di,0078h
mov es:[di],si
mov di,007ah
mov es:[di],cs
pop es
ret
gds_set:;========== Data Segment Set ==========
push ax
mov ax,gdata
mov ds,ax
pop ax
ret
code ends
extra segment
es_area db 1024 dup (?)
extra ends
stack segment stack
ss_area db 2048 dup (?)
ss_top label word
stack ends
end main
;*-------------------------------------------------------------*
;* Child --> Child Copy Program *
;*-------------------------------------------------------------*
cgroup group code
gdata segment
dta db 10000 dup (0aah)
gdata ends
code segment public 'code'
assume cs:code,ds:gdata,es:extra,ss:stack
child:;========== Main Routine ==========
mov ax,stack
mov ss,ax
mov ax,offset ss:ss_top
mov sp,ax
mov ax,extra
mov es,ax
call gds_set
mov ah,0
mov dl,01000000b
int 13h ; Disk <A> System Reset
mov ah,0
mov dl,01000000b
int 13h ; Disk <B> System Reset
call gds_set
mov ax,ds
mov es,ax
mov bx,offset dta
mov cx,0001h
mov dx,0040h
mov ax,0201h
int 13h ; Boot Load from <A>
mov dx,0041h
mov ax,0301h
int 13h ; Boot Save to <B>
mov cx,0201h
mov dx,0040h
mov ax,0208h
int 13h ; 1st Load from <A>
mov dx,0041h
mov ax,0308h
int 13h ; 1st Save to <B>
mov cx,0401h
mov dx,0040h
mov ax,0208h
int 13h ; 2nd Load from <A>
mov dx,0041h
mov ax,0308h
int 13h ; 2nd Save to <B>
mov cx,1503h
loop_001:
mov dx,0140h
mov ax,0206h
int 13h ; 3rd Load from <A>
mov dx,0141h
mov ax,0306h
int 13h ; 3rd Save to <B>
sub ch,2
jns loop_001
mov cx,1301h
loop_002:
mov dx,0040h
mov ax,0205h
int 13h ; 4th Load from <A>
mov dx,0041h
mov ax,0305h
int 13h ; 4th Save to <B>
sub ch,2
jns loop_002
mov ah,4ch
int 21h ; DOS Return
gds_set:;========== Data Segment Set ==========
push ax
mov ax,gdata
mov ds,ax
pop ax
ret
code ends
extra segment
es_area db 1024 dup (?)
extra ends
stack segment stack
ss_area db 2048 dup (?)
ss_top label word
stack ends
end child
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#include <graph.h>
#include <dos.h>
#include <math.h>
#define ERROR -1
#define STATPT 0xe0d2
#define DATAPT 0xe0d0
#define DRR 0x0040
#define DSR 0x0080
#define PUT 8888
#define GET 9999
#define entry_table 0x0080
#define vector_offset_user_com 10
FILE *fds,*fdo;
static union REGS inregs,outregs;
static struct SREGS segregs;
int msb_mode,para[16][8],moux,mouy,right,left,sts[16],debug,xpt,ypt,stp;
int xx,xxx,yy,yyy,high,old_l,old_r,old_x,old_y,disp,old_disp,solo,win;
int mbuff_x,mbuff_y,w_x,w_y,back,front,b_ctr;
char buff[16];
double myu,chaos,_1st,_2nd,_3rd,beep,b_myu;
unsigned get_entry(x) int x; { unsigned ent,z; z=(unsigned)x;
ent=msb_data_get(entry_table)+msb_data_get(entry_table+1)*256;
return(msb_data_get(ent+2*z)+msb_data_get(ent+2*z+1)*256); }
msb_data_put(add,data) unsigned add; int data; {
set_command(0xe3); put_data(add/256); set_command(0xe5);
put_data(add%256); set_command(0xeb); put_data(data); }
msb_data_get(add) unsigned add; {
set_command(0xe3); put_data(add/256); set_command(0xe5);
put_data(add%256); set_command(0xae); return(get_data()); }
put_command(x) int x; { while((inp(STATPT)&DRR)!=0){} outp(STATPT,x); }
put_data(x) int x; { while((inp(STATPT)&DRR)!=0){} outp(DATAPT,x); }
get_data(){ while((inp(STATPT)&DSR)!=0){} return(inp(DATAPT)); }
set_command(x) int x; { put_command(x); while(get_data()!=0xfe){} }
mouseini(){ inregs.x.ax=0; int86(51,&inregs,&outregs);
if(outregs.x.ax==0){ printf("mouse.sys missing\n"); exit(0); } }
mouse(flag) int flag; {
if(flag==0){inregs.x.ax=2;} else if(flag==1){inregs.x.ax=1;}
int86(51,&inregs,&outregs); }
getmouse(right,left,x,y) int *right,*left,*x,*y; {
inregs.x.ax=3; int86(51,&inregs,&outregs); *right=outregs.x.bx;
*left=outregs.x.ax; *x=outregs.x.cx; *y=outregs.x.dx; }
setmouse(x,y) int x,y; { inregs.x.ax=4; inregs.x.cx=x; inregs.x.dx=y;
int86(51,&inregs,&outregs); }
m_style(x,y,buf) int x,y; char *buf; { inregs.x.ax=9; inregs.x.bx=x;
inregs.x.cx=y; segread(&segregs); segregs.es=segregs.ds;
inregs.x.dx=(int)buf; int86x(51,&inregs,&outregs,&segregs); }
m_view(xmin,ymin,xmax,ymax) int xmin,ymin,xmax,ymax; {
inregs.x.ax=16; inregs.x.cx=xmin; inregs.x.dx=xmax;
int86(51,&inregs,&outregs); inregs.x.ax=17; inregs.x.cx=ymin;
inregs.x.dx=ymax; int86(51,&inregs,&outregs); }
m_color(color) int color; {
inregs.x.ax=18; inregs.x.bx=color; int86(51,&inregs,&outregs); }
symbol(x,y,color,str,skip) int x,y,color,skip; unsigned char str[80]; {
int i=0; _setcolor(color);
while(str[i]!=0){ _gputchar(x,y,str[i++],_GXOR); x += skip; } }
unsigned char patch[1009] = {
0x1C,0x66,0x29,0xEB,0xE1,0xFE,0x37,0x00,0xEB,0xE3,0xFE,0x37,
0x00,0xEB,0xE2,0xFE,0x37,0x00,0xEB,0xE4,0xFE,0x37,0x00,0xEB,
0xEF,0xFE,0x37,0x00,0xEB,0xE0,0xFE,0x37,0x55,0x33,0x00,0x23,
0x3A,0x60,0x6F,0xF7,0x37,0x00,0x3A,0x00,0x6F,0xF7,0x37,0x00,
0x1C,0x37,0x44,0x83,0xFB,0x6F,0x10,0xCE,0xEA,0x33,0x00,0x30,
0xFA,0xFB,0x31,0xF9,0x6E,0x90,0xE8,0x37,0x00,0x83,0xFB,0x6F,
0x10,0xCE,0xF2,0x1C,0xDB,0x41,0x1C,0x57,0x41,0x1C,0x3D,0x43,
0xC8,0xF5,0x47,0x7F,0x77,0x7D,0xFE,0xD6,0x39,0x00,0x70,0xF9,
0x70,0xE2,0x28,0xEF,0x76,0x20,0x97,0x7F,0xAC,0x80,0xC6,0x04,
0x3F,0x7F,0x00,0x00,0xF8,0xAF,0xC6,0x1F,0xF8,0x6F,0xF0,0xC7,
0x0B,0xF8,0x6F,0xF8,0xFE,0xD6,0xFE,0xDF,0x37,0x78,0x00,0x1E,
0x20,0xF8,0x6C,0xF0,0xEF,0x78,0x20,0x6C,0x0F,0x2F,0x77,0x37,
0x7A,0x00,0x1E,0x27,0x78,0x6F,0x00,0xFE,0xD6,0xEF,0x7A,0x6F,
0x00,0xCE,0x0C,0x6F,0xC0,0xC6,0x0F,0x6F,0xD0,0xC6,0x1F,0x37,
0x7A,0x01,0x1E,0x37,0x7A,0x00,0x37,0x78,0x00,0x1E,0xEF,0x77,
0x6F,0x0F,0xFE,0xDE,0x3A,0x00,0x68,0xE3,0xE1,0xFE,0x2E,0xF7,
0x20,0xE3,0xE1,0xFE,0x87,0x1E,0xEF,0x77,0x6F,0x0F,0xFE,0xDE,
0x3A,0x00,0x6A,0xE3,0xE3,0xFE,0x2E,0xF7,0x20,0xE3,0xE3,0xFE,
0x87,0x1E,0xA8,0x62,0xCE,0x08,0xA9,0x62,0xFE,0xD6,0xB1,0x62,
0xC8,0x08,0xB0,0x62,0x1C,0x46,0x04,0x1C,0xF2,0x41,0x27,0xF1,
0x1E,0x27,0x5F,0x6C,0xF0,0xA7,0xA7,0xA7,0x3A,0x00,0x42,0xF3,
0x4A,0xEA,0xC8,0x58,0x11,0x58,0x11,0x58,0x11,0x41,0x12,0xE9,
0x12,0xE9,0x12,0xE9,0x12,0xE9,0x12,0x7F,0x13,0xDC,0x13,0x20,
0x42,0x8C,0x14,0xF2,0x14,0x3F,0x15,0x1C,0x16,0xC3,0x16,0x27,
0x5F,0xFE,0xAB,0xEB,0x19,0x14,0xC6,0x6C,0x07,0xA6,0x3A,0x32,
0x42,0xF3,0x4A,0xEA,0xC8,0x56,0x11,0x88,0x42,0x42,0x42,0x2A,
0x14,0x33,0x14,0x41,0x14,0x4F,0x14,0x84,0x14,0xE3,0xE2,0xFE,
0x2E,0xE3,0xE1,0xFE,0x67,0xCE,0x10,0xE3,0xE4,0xFE,0x2E,0xE3,
0xE3,0xFE,0x67,0xCE,0x1C,0x30,0xFF,0x1C,0x48,0x04,0x1E,0x30,
0xCF,0x1C,0x48,0x04,0x3A,0x00,0x68,0xE3,0xE2,0xFE,0x2E,0xF3,
0x28,0xE3,0xE2,0xFE,0x87,0x1C,0x48,0x04,0x1E,0x30,0xDF,0x1C,
0x48,0x04,0x3A,0x00,0x6A,0xE3,0xE4,0xFE,0x2E,0xF3,0x28,0xE3,
0xE4,0xFE,0x87,0x1C,0x48,0x04,0x1E,0xEB,0xE0,0xFE,0x6F,0x55,
0xFE,0xDE,0xEB,0x50,0xFE,0x37,0x00,0x3A,0xE5,0xFE,0x27,0xF1,
0xA9,0x62,0xC6,0xFC,0xB1,0x62,0xE7,0x60,0x28,0xE3,0x50,0xFE,
0x2E,0xF7,0x20,0xE3,0x50,0xFE,0x87,0xEB,0x50,0xFE,0x6F,0x08,
0xCE,0xE4,0xE3,0xE5,0xFE,0x2E,0x6C,0x0F,0xEB,0xE6,0xFE,0x6F,
0x00,0xC6,0x1A,0xEB,0xE6,0xFE,0x6F,0x01,0xC6,0x0D,0x3A,0x60,
0x6F,0xF7,0x37,0x00,0x3A,0x00,0x6F,0xF7,0x37,0x00,0x1E,0x3A,
0x60,0x6F,0xF7,0x37,0x80,0x3A,0x00,0x6F,0xE3,0xE9,0xFE,0x28,
0xF7,0x20,0x3A,0x10,0x6F,0xE3,0xEA,0xFE,0x28,0xF7,0x20,0x3A,
0x20,0x6F,0xE3,0xEB,0xFE,0x28,0xF7,0x20,0x3A,0x40,0x6F,0xE3,
0xE7,0xFE,0x28,0xF8,0x6D,0xFF,0xF7,0x20,0x3A,0x50,0x6F,0xE3,
0xE8,0xFE,0x28,0xF7,0x20,0x29,0xE3,0xEC,0xFE,0x2E,0x6C,0x1F,
0x3A,0x1D,0x43,0xF3,0x28,0x3A,0x90,0x6F,0x21,0xF7,0x20,0x1E,
0x5C,0x5F,0x4C,0x4F,0x3A,0x3C,0x3D,0x3F,0x28,0x29,0x2A,0x2B,
0x2C,0x2D,0x2E,0x2F,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0xE3,0xEF,0xFE,0x87,
0xEB,0xEF,0xFE,0x6F,0x10,0xCE,0x05,0xEB,0xEF,0xFE,0x37,0x00,
0xE3,0xEF,0xFE,0x2E,0x3A,0x30,0x6F,0xF3,0x8F,0xFE,0xDE,0x3A,
0x40,0x6F,0xF3,0x28,0x3A,0x30,0x6F,0xF7,0x20,0x3A,0x60,0x6F,
0xF3,0x28,0xEB,0x5C,0xFE,0x20,0x3A,0x70,0x6F,0xF3,0x28,0xEB,
0x5B,0xFE,0x20,0x3A,0x80,0x6F,0xF3,0x28,0xEB,0x5A,0xFE,0x20,
0x36,0xFF,0xE3,0x5A,0xFE,0x62,0xEB,0x5D,0xFE,0x26,0x36,0xFF,
0xE3,0x5B,0xFE,0x62,0xEB,0x5E,0xFE,0x26,0x36,0xFF,0xE3,0x5C,
0xFE,0x62,0xEB,0x5F,0xFE,0x26,0x1C,0x35,0x05,0xE3,0xEF,0xFE,
0x2E,0x3A,0x00,0x6F,0xF3,0x28,0xEB,0x5C,0xFE,0x20,0x3A,0x10,
0x6F,0xF3,0x28,0xEB,0x5B,0xFE,0x20,0x3A,0x20,0x6F,0xF3,0x28,
0xEB,0x5A,0xFE,0x20,0xE3,0x62,0xFE,0x28,0xE3,0x63,0xFE,0x29,
0xE3,0x64,0xFE,0x2A,0xE3,0x65,0xFE,0x2B,0xF8,0xA2,0xF9,0xA2,
0xFA,0xA2,0xFB,0xA2,0xF8,0xA2,0xF9,0xA2,0xFA,0xA2,0xFB,0xA2,
0xEB,0x5D,0xFE,0x21,0xEB,0x5E,0xFE,0x22,0xEB,0x5F,0xFE,0x23,
0x1C,0x35,0x05,0xE3,0x63,0xFE,0x29,0xE3,0x64,0xFE,0x2A,0xE3,
0x65,0xFE,0x2B,0xE3,0xEF,0xFE,0x2E,0x3A,0x60,0x6F,0xF7,0x23,
0x3A,0x70,0x6F,0xF7,0x22,0x3A,0x80,0x6F,0xF7,0x21,0x3A,0x50,
0x6F,0xF3,0x2E,0x6F,0x0C,0xC7,0x02,0x36,0x0B,0x6F,0x00,0xC6,
0x09,0xFB,0xA7,0xFA,0xA3,0xF9,0xA3,0x8E,0xC8,0xF3,0xEB,0x63,
0xFE,0x21,0xEB,0x64,0xFE,0x22,0xEB,0x65,0xFE,0x23,0xE3,0xEF,
0xFE,0x2B,0x1C,0xB4,0x44,0x1E,0x30,0xFA,0xFB,0x31,0xE8,0x37,
0x00,0xFB,0x31,0xF9,0x6E,0x10,0xE8,0x37,0x00,0xFB,0x31,0xF9,
0x6E,0x20,0xE8,0x37,0x00,0xFB,0x31,0xF9,0x6E,0x30,0xE8,0x37,
0x00,0xFB,0x31,0xF9,0x6E,0x40,0xE8,0x37,0x00,0xFB,0x31,0xF9,
0x6E,0x50,0xE8,0x37,0x00,0xFB,0x31,0xF9,0x6E,0x60,0xE8,0x37,
0x80,0x3A,0xA4,0x44,0x23,0xF3,0x2E,0xFB,0x31,0xF9,0x6E,0x70,
0xE8,0x26,0xFB,0x31,0xF9,0x6E,0xA0,0xE8,0x37,0x1F,0xFB,0x31,
0xF9,0x6E,0xB0,0xE8,0x37,0x1F,0xFB,0x31,0xF9,0x6E,0xC0,0xE8,
0x37,0x1F,0xFB,0x31,0xF9,0x6E,0xD0,0xE8,0x37,0xF1,0xFB,0x31,
0xF9,0x6E,0x90,0xE8,0x37,0x03,0x1E,0x00,0x7F,0xFF,0x3F,0xAF,
0x5F,0xCF,0x00,0xEF,0x2F,0xBF,0x4F,0xDF,0x1F,0x9F,0x6F,0x30,
0xFA,0xE3,0x63,0xFE,0x2E,0xFB,0x31,0xE8,0x26,0xE3,0x64,0xFE,
0x2E,0xFB,0x31,0xF9,0x6E,0x10,0xE8,0x26,0xE3,0x65,0xFE,0x2E,
0xFB,0x31,0xF9,0x6E,0x20,0xE8,0x26,0xFB,0x31,0xF9,0x6E,0x30,
0xE8,0x37,0x00,0x3A,0x90,0x6F,0x23,0xF3,0x2A,0xFB,0x31,0xF9,
0x6E,0xC0,0xE8,0x22,0xFB,0x31,0xF9,0x6E,0xD0,0xE8,0x37,0x1F,
0x1E };
static int style[]={
0,0,0,0,0,0,0,0,0x0070,0x0e88,0x1184,0x2142,0x2221,0x9210,
0xe107,0x1108,0x1108,0xe107,0x1108,0x1108,0xe107,0x4108,
0x4208,0xfc07,0,0,0,0,0,0,0,0 };
msb98_check(){ int i,j; for(i=0;i<100;i++) inp(DATAPT);
j=0; for(i=0;i<10000;i++){ if((inp(STATPT)&DRR)==0) j=1; }
if(j==0) return(ERROR);
outp(STATPT,0xff);
j=0; for(i=0;i<32000;i++){ if((inp(STATPT)&DSR)==0) j=1; }
if(j==0) return(ERROR);
if(inp(DATAPT)!=0xfe) return(ERROR);
set_command(0xff); set_command(0xac); i=get_data();
if(i!=0x15) return(ERROR);
set_command(0xf0); set_command(0xac); i=get_data();
if(i!=0x28) return(ERROR);
set_command(0xff); return(0); }
diaplay_setting(x) int x; {
if(x==0){ _setvideomode(_98RESS16COLOR); _displaycursor(_GCURSOROFF);
_clearscreen(_GCLEARTEXT); _clearscreen(_GCLEARSCREEN); }
else if(x==1){
_clearscreen(_GCLEARSCREEN); _displaycursor(_GCURSORON);
mouse(0); if(msb_mode==1) set_command(0xfe);
outp(0x37,7); _setvideomode (_DEFAULTMODE); } }
parameter_file_write(){ int i,j; if(debug!=0) return(0);
fds=fopen("chaos_dt.msb","wb");
for(i=0;i<16;i++){ for(j=0;j<8;j++) fputc(para[i][j],fds); }
fputc(moux/256,fds); fputc(moux%256,fds);
fputc(mouy/256,fds); fputc(mouy%256,fds);
fputc(stp,fds); fclose(fds); }
parameter_init(){ int i; mbuff_x=320; mbuff_y=200; stp=3;
for(i=0;i<16;i++){
para[i][0]=i; /* Channel : 0 - 15 */
para[i][1]=0; /* [0]Off [1]Mute [2]On [3]Solo */
para[i][2]=230-10*i; /* Step : 0 - 250 */
para[i][3]=6; /* Range : 0 - 11 */
para[i][4]=254-i; /* High */
para[i][5]=255; /* Middle */
para[i][6]=255; /* Low */
para[i][7]=20; /* Volume : 0 - 31 */ } }
parameter_file_read(){ int i,j;
if((fds=fopen("chaos_dt.msb","rb"))!=NULL){
for(i=0;i<16;i++){ for(j=0;j<8;j++) para[i][j]=fgetc(fds); }
mbuff_x=256*fgetc(fds); mbuff_x=mbuff_x+fgetc(fds);
mbuff_y=256*fgetc(fds); mbuff_y=mbuff_y+fgetc(fds);
stp=fgetc(fds); fclose(fds); }
else parameter_init();
if(debug!=0){ mbuff_x=20; mbuff_y=110; }
for(i=0;i<16;i++) { sts[i]=0; if(para[i][1]==3) solo=1; } }
volume_hit(i) int i; { old_l=left; old_x=moux; old_y=mouy;
while(1){ getmouse(&right,&left,&moux,&mouy);
if(left==0) break;
else if(old_y!=mouy){
old_y=mouy; _setcolor(back);
if(mouy<309) para[i][7]=31;
else if(mouy>367) para[i][7]=1;
else para[i][7]=(370-mouy)/2;
_rectangle(_GFILLINTERIOR,xx+8,yy+4,xx+28,yy-64);
_setcolor(front); yyy=yy-2*para[i][7]+2;
_rectangle(_GBORDER,xx+9,yyy+3,xx+27,yyy-3);
_rectangle(_GBORDER,xx+10,yyy+2,xx+26,yyy-2);
_moveto(xx+12,yyy); _lineto(xx+24,yyy);
parameter_display(i,7); send_para(i); } } }
send_para(x) int x; { int i;
if(msb_mode==0){
if(para[x][1]>1){ outp(0x37,6); return(0); }
else{ outp(0x37,7); return(0); } }
set_command(0xa9); put_data(x);
if((para[x][1]==2)&&(sts[x]==0)){ put_data(1); sts[x]=1; }
else if((para[x][1]==2)&&(sts[x]==1)){ put_data(0); sts[x]=1; }
else if((para[x][1]==3)&&(sts[x]==0)){ put_data(1); sts[x]=1; }
else if((para[x][1]==3)&&(sts[x]==1)){ put_data(0); sts[x]=1; }
else{ put_data(2); sts[x]=0; }
for(i=2;i<8;i++) put_data(para[x][i]); }
parameter_display(i,j) int i,j; { int d,e,sk=4,yt,y_pt;
if(j==50){
_setcolor(back);
for(d=0;d<8;d++){
_rectangle(_GFILLINTERIOR,419,23+8*d,425,27+8*d);
}
_setcolor(front);
_rectangle(_GBORDER,419,23+8*(stp-2),425,27+8*(stp-2));
_rectangle(_GBORDER,420,24+8*(stp-2),424,26+8*(stp-2));
}
else if(j==3){
for(e=0;e<12;e++){
yt=245+e*3; _setcolor(back);
if(para[i][j]==e) _setcolor(front);
_moveto(xx+2*e+4,yt+1); _lineto(xx+2*e+10,yt+1);
_moveto(xx+2*e+4,yt+2); _lineto(xx+2*e+10,yt+2);
}
_setcolor(front); return(0);
}
else if(j==999){
if(msb_mode==0) beep_chaos(1);
myu=(double)para[disp][4]*_1st;
myu=myu+(double)para[disp][5]*_2nd;
myu=myu+(double)para[disp][6]*_3rd;
chaos=myu; ypt=94-(int)(80.9*chaos); return(0);
}
else if(j==100){
_setcolor(front);
if(xpt>339) d=(xpt-340)/10;
else d=(xpt-10)/10+8;
if(d==0) _rectangle(_GFILLINTERIOR,13,13,20,94);
else if(d==40) _rectangle(_GFILLINTERIOR,410,13,415,94);
else _rectangle(_GFILLINTERIOR,10+10*d,13,20+10*d,94);
if(xpt>win-3-stp){
xpt=14; _rectangle(_GFILLINTERIOR,90,13,100,94);
}
chaos=4.0*myu*chaos*(1.0-chaos); y_pt=94-(int)(80.9*chaos);
_setcolor(back); _moveto(xpt,ypt); _lineto(xpt+stp,y_pt);
ypt=y_pt; xpt=xpt+stp; return(0);
}
sprintf(buff,"%d",para[i][j]);
if(para[i][j]>99) d=0;
else if(para[i][j]>9) d=1;
else d=2;
if((j==4)||(j==5)||(j==6)){
yt=(j-4)*32+150;
_setcolor(front);
_rectangle(_GFILLINTERIOR,xx+4,yt-1,xx+32,yt+17);
if(disp!=i){
_setcolor(back);
_rectangle(_GFILLINTERIOR,xx+5,yt,xx+31,yt+16);
}
symbol(xx+6+d*sk,yt,7,buff,sk*2);
_setcolor(front);
}
else if(j==7){
_setcolor(back);
_rectangle(_GFILLINTERIOR,xx+6,289,xx+30,303);
sk=5; symbol(xx+4+d*sk,288,7,buff,sk*2);
_setcolor(front);
}
else if(j==2){
if(para[i][1]==3) _setcolor(front);
else _setcolor(back);
_rectangle(_GFILLINTERIOR,xx+3,high+5,xx+33,high+35);
_setcolor(front);
if(para[i][1]==2){
_rectangle(_GBORDER,xx+3,high+5,xx+33,high+35);
_rectangle(_GBORDER,xx+4,high+6,xx+32,high+34);
}
else if(para[i][1]==1){
_setlinestyle(0x5555);
_rectangle(_GBORDER,xx+4,high+6,xx+32,high+34);
_setlinestyle(0xffff);
}
symbol(xx+6+d*sk,high+12,7,buff,sk*2);
_setcolor(front);
}
}
screen_display(m)
int m;
{
int i,j,yt;
mouse(0); _setcolor(back); _setlinestyle(0xffff);
_rectangle(_GFILLINTERIOR,0,0,639,399); _setcolor(front);
_moveto(629,0); _lineto(639,10); _lineto(639,399); _lineto(10,399);
_lineto(0,389); _lineto(629,389); _lineto(629,0); _lineto(0,0);
_lineto(0,389); _moveto(629,389); _lineto(639,399);
if(front==0){
_moveto(630,0); _lineto(639,0); _moveto(631,1); _lineto(639,1);
_moveto(632,2); _lineto(639,2); _moveto(633,3); _lineto(639,3);
_moveto(634,4); _lineto(639,4); _moveto(635,5); _lineto(639,5);
_moveto(636,6); _lineto(639,6); _moveto(637,7); _lineto(639,7);
_moveto(638,8); _lineto(639,8); _moveto(639,9); _lineto(639,9);
_moveto(0,390); _lineto(0,390); _moveto(0,391); _lineto(1,391);
_moveto(0,392); _lineto(2,392); _moveto(0,393); _lineto(3,393);
_moveto(0,394); _lineto(4,394); _moveto(0,395); _lineto(5,395);
_moveto(0,396); _lineto(6,396); _moveto(0,397); _lineto(7,397);
_moveto(0,398); _lineto(8,398); _moveto(0,399); _lineto(9,399);
}
for(i=1;i<389;i=i+3){ _moveto(629,i); _lineto(639,10+i); }
for(i=1;i<629;i=i+3){ _moveto(i,389); _lineto(10+i,399); }
_rectangle(_GBORDER,1,1,628,388); _rectangle(_GBORDER,2,2,627,387);
_rectangle(_GBORDER,5,5,623,383); _rectangle(_GBORDER,6,6,622,382);
_rectangle(_GBORDER,11,11,win,96);
_rectangle(_GFILLINTERIOR,13,13,win-2,94);
_rectangle(_GBORDER,win,11,win+10,21);
_moveto(win+1,21); _lineto(win+5,12); _lineto(win+9,21);
for(i=0;i<8;i++){
_rectangle(_GBORDER,win,21+8*i,win+10,29+8*i);
}
_rectangle(_GBORDER,win,85,win+10,96);
_moveto(win+1,85); _lineto(win+5,95); _lineto(win+9,85);
parameter_display(stp,50); _rectangle(_GBORDER,430,11,617,96);
_rectangle(_GBORDER,432,13,615,51); _rectangle(_GBORDER,433,14,614,50);
if(back!=0) printf("\x1b[30m");
else printf("\x1b[37m");
_settextposition(1,56); printf("カオス・シンセサイザ");
if(debug==0){ _settextposition(2,57); printf("([MSB-98] Version)"); }
else{ _settextposition(2,60); printf("(解説デモ版)"); }
_setcolor(front); _moveto(430,53); _lineto(617,53);
symbol(434,59,7,"KAWA",8); symbol(465,59,7,"I",8);
symbol(474,59,7,"Computer",7); symbol(532,59,7,"Music",7);
symbol(570,59,7,"System",7);
_setcolor(front); _moveto(430,80); _lineto(617,80);
_rectangle(_GFILLINTERIOR,558,80,616,95); symbol(569,80,7,"init",10);
for(i=0;i<m;i++){
xx=11+38*i; yy=370;
_setcolor(front); _rectangle(_GBORDER,xx,high,xx+36,yy+7);
parameter_display(i,2);
for(j=4;j<7;j++){
parameter_display(i,j);
yt=(j-4)*32+150;
_rectangle(_GBORDER,xx+4,yt+17,xx+15,yt+25);
_rectangle(_GBORDER,xx+5,yt+17,xx+14,yt+24);
_rectangle(_GBORDER,xx+21,yt-9,xx+32,yt-1);
_rectangle(_GBORDER,xx+22,yt-8,xx+31,yt-1);
_moveto(xx+25,yt-4); _lineto(xx+28,yt-4);
_moveto(xx+25,yt-5); _lineto(xx+28,yt-5);
_moveto(xx+26,yt-3); _lineto(xx+26,yt-6);
_moveto(xx+27,yt-3); _lineto(xx+27,yt-6);
_moveto(xx+8,yt+20); _lineto(xx+11,yt+20);
_moveto(xx+8,yt+21); _lineto(xx+11,yt+21);
}
for(j=0;j<12;j++){
yyy=245+j*3;
_rectangle(_GBORDER,xx+2*j+3,yyy,xx+2*j+11,yyy+3);
}
_rectangle(_GBORDER,xx+24,243,xx+32,255);
_rectangle(_GBORDER,xx+4,271,xx+12,283);
_moveto(xx+25,255); _lineto(xx+28,243); _lineto(xx+31,255);
_moveto(xx+5,271); _lineto(xx+8,283); _lineto(xx+11,271);
parameter_display(i,3);
parameter_display(i,7);
_moveto(xx+4,yy); _lineto(xx+4,yy-60);
_moveto(xx+32,yy); _lineto(xx+32,yy-60);
for(j=0;j<16;j++){
_moveto(xx+4,yy-4*j); _lineto(xx+7,yy-4*j);
_moveto(xx+32,yy-4*j); _lineto(xx+29,yy-4*j);
}
yyy=yy-2*para[i][7]+2;
_rectangle(_GBORDER,xx+9,yyy+3,xx+27,yyy-3);
_rectangle(_GBORDER,xx+10,yyy+2,xx+26,yyy-2);
_moveto(xx+12,yyy); _lineto(xx+24,yyy);
}
if(debug!=0){
xx=11+38*1; yy=370;
_rectangle(_GBORDER,xx,high,617,yy+7);
if(back!=0) printf("\x1b[30m");
else printf("\x1b[37m");
_settextposition(7,10);
printf("[カオス・シンセサイザ体験版]");
_settextposition(7,43);
printf("Copyright(C) 1992 Y.Nagashima");
_setlinestyle(0xaaaa); _moveto(56,137); _lineto(70,168);
_setlinestyle(0xffff); _settextposition(10,8);
printf(" --- カオス生成の時間ステップ。数字の右上をクリック");
printf("すると速くなり"); _settextposition(11,13);
printf("右下をクリックすると遅くなります。");
printf("左上はON・OFFスイッチ。");
_settextposition(13,8);
printf("<--- カオス・データを設定します。データは上から順に");
printf("上位・中位・下位"); _settextposition(14,13);
printf("に対応した24ビット精度で、");
printf("次のカオス漸化式のパラメータ[Z]です。");
_settextposition(15,25);
printf("X(n)=4*Z*X(n-1)*(1−X(n-1))");
_settextposition(17,8);
printf("<--- 発音音域を上下させます。上昇マーク・下降マーク");
printf("をクリックする"); _settextposition(18,13);
printf("たびに、カオス発生の音域が上下します。");
_settextposition(20,8);
printf("<--- ボリューム調整。スライダ上で左クリックしたまま");
printf("上下させます。"); _settextposition(21,13);
printf("データはスライダの上に掲示(1-31)されます。");
}
getmouse(&old_r,&old_l,&old_x,&old_y); mouse(1);
}
/*==================== Main Program ====================*/
main(argc,argv)
int argc; char *argv[];
{
int i,j,k,l,m=16,d=1009,demo_limit=618;
unsigned add=0x4101;
xpt=14; ypt=54; win=417; w_x=74; w_y=124; back=0; front=7;
high=101; old_disp=255; disp=255; solo=0; debug=0;
_1st=1.0/256.0; _2nd=_1st/256.0; _3rd=_2nd/256.0; chaos=128.0*_1st;
if((argc==2)&&(argv[1][0]=='-')&&(argv[1][1]=='d')) debug=1;
inregs.x.ax=0; int86(51,&inregs,&outregs);
if(outregs.x.ax==0){printf("\nPlease install mouse.sys !\n");exit(0);}
m_style(0,8,style); m_color(1); m_view(0,0,639,399);
if(msb98_check()==ERROR){
printf("\n\n\n\n\n\t\t\t[MSB-98] is not found !\n\n");
printf("\n\n\t\t\t<Chaos> Graphic / Beep Only...\n\n");
while(1){ if(kbhit()!=0) break; }
getch(); msb_mode=0; debug=1; _clearscreen(_GCLEARSCREEN);
}
else{
for(i=0;i<d;i++) msb_data_put(add+(unsigned)i,(int)patch[i]);
msb_data_put(add-1,0); msb_mode=1;
for(i=15;i>-1;i--){
set_command(0xa9); put_data(i); put_data(1);
for(j=2;j<8;j++) put_data(para[i][j]);
set_command(0xa9); put_data(i); put_data(0);
for(j=2;j<8;j++) put_data(para[i][j]);
send_para(i);
}
}
if(debug!=0){ demo_limit=49; m=1; }
parameter_file_read(); diaplay_setting(0);
setmouse(mbuff_x,mbuff_y);
screen_display(m);
if(msb_mode==0) beep_chaos(1);
while(1){
if((kbhit()!=0)&&(getch()==0x1b)) break;
if(msb_mode==0) beep_chaos(0);
getmouse(&right,&left,&moux,&mouy); disp=255;
mouse(0); parameter_display(0,100); mouse(1);
if(back!=0) printf("\x1b[30m");
else printf("\x1b[37m");
_settextposition(5,55);
printf("St=%d (%03d,%03d)",stp-1,moux,mouy);
if(((moux+26)%38<35)&&(mouy>high)&&(mouy<377)){
if((moux>10)&&(moux<demo_limit)) disp=(moux+28)/38-1;
}
if(disp!=old_disp){
mouse(0);
if(old_disp!=255){
xx=11+38*old_disp;
parameter_display(old_disp,4);
parameter_display(old_disp,5);
parameter_display(old_disp,6);
}
if(disp!=255){
xx=11+38*disp;
parameter_display(disp,4);
parameter_display(disp,5);
parameter_display(disp,6);
parameter_display(0,999);
}
mouse(1); old_disp=disp;
}
if((old_l==0)&&(left!=0)&&(moux>10)&&(moux<demo_limit)){
if((moux-1)%38>18){
j=(moux-1)/38; yyy=370-2*para[j][7]+2;
if((mouy>yyy-4)&&(mouy<yyy+4)){
xx=11+38*j; yy=370;
mouse(0); volume_hit(j); mouse(1);
}
}
if(((moux+3)%38<9)&&(mouy>242)&&(mouy<256)){
j=(moux+3)/38-1; xx=11+38*j;
if(para[j][3]!=0) para[j][3]--;
mouse(0); parameter_display(j,3);
send_para(j); mouse(1);
}
if(((moux+23)%38<9)&&(mouy>270)&&(mouy<284)){
j=(moux+23)/38-1; xx=11+38*j;
if(para[j][3]!=11){
para[j][3]++;
mouse(0); parameter_display(j,3);
send_para(j); mouse(1);
}
}
if(((moux+23)%38<12)&&((mouy+24)%32<8)&&(mouy<240)){
j=(moux+23)/38-1; xx=11+38*j;
k=(mouy+24)/32-2;
if(((para[j][k]!=65)||(k!=4))&&(mouy>140)){
para[j][k]=0xff&(para[j][k]-1);
mouse(0); parameter_display(j,k);
parameter_display(disp,999);
send_para(j); mouse(1);
}
}
if(((moux+6)%38<12)&&((mouy+19)%32<8)&&(mouy<240)){
j=(moux+6)/38-1; xx=11+38*j;
k=(mouy+19)/32-1;
if(((para[j][k]!=255)||(k!=4))&&(mouy>140)){
para[j][k]=0xff&(para[j][k]+1);
mouse(0); parameter_display(j,k);
parameter_display(disp,999);
send_para(j); mouse(1);
}
}
if((mouy<high+20)&&(mouy>high+4)){
if((moux-14)%38<15){
j=(moux-14)/38; xx=11+38*j; k=0;
mouse(0);
if(para[j][1]==0){
if(solo==0) para[j][1]=2;
else para[j][1]=1;
}
else if(para[j][1]==1){
para[j][1]=0;
}
else if(para[j][1]==2){
para[j][1]=0;
}
else if(para[j][1]==3){
para[j][1]=0; solo=0; k=1;
}
parameter_display(j,2); send_para(j);
if(k==1){
for(l=0;l<16;l++){
if(l==j){}
else if(para[l][1]==1){
para[l][1]=2;
xx=11+38*l;
parameter_display(l,2);
send_para(l);
}
}
}
mouse(1);
}
if((moux+8)%38<15){
j=(moux+8)/38-1; xx=11+38*j;
if(para[j][2]<250){
para[j][2]++; mouse(0);
parameter_display(j,2);
send_para(j); mouse(1);
}
}
}
if((mouy>high+20)&&(mouy<high+36)){
if((moux-14)%38<15){
j=(moux-14)/38; xx=11+38*j;
para[j][1]=3; solo=1; mouse(0);
parameter_display(j,2); send_para(j);
for(l=0;l<16;l++){
xx=11+38*l;
if(l==j){}
else if(para[l][1]==2){
para[l][1]=1;
parameter_display(l,2);
send_para(l);
}
else if(para[l][1]==3){
para[l][1]=1;
parameter_display(l,2);
send_para(l);
}
}
mouse(1);
}
if((moux+8)%38<15){
j=(moux+8)/38-1; xx=11+38*j;
if(para[j][2]>1){
para[j][2]--; mouse(0);
parameter_display(j,2);
send_para(j); mouse(1);
}
}
}
}
if((old_l==0)&&(left!=0)&&(mouy<99)){
if((moux>417)&&(moux<427)&&(mouy>11)&&(mouy<21)){
if(stp>2){
stp--; mouse(0);
parameter_display(0,50); mouse(1);
}
}
if((moux>417)&&(moux<427)&&(mouy>85)&&(mouy<96)){
if(stp<9){
stp++; mouse(0);
parameter_display(0,50); mouse(1);
}
}
if((moux>558)&&(moux<617)&&(mouy>80)&&(mouy<96)){
parameter_init(); break;
}
if((moux>431)&&(moux<557)&&(mouy>81)&&(mouy<95)){
if(back==0){ back=7; front=0; }
else{ back=0; front=7; }
screen_display(m);
}
}
old_l=left; old_x=moux; old_y=mouy;
}
if(debug==0) parameter_file_write();
diaplay_setting(1);
}
beep_chaos(x)
int x;
{
unsigned int bbx;
int sh,itb;
if(x==1){
b_myu=(double)para[0][4]*_1st;
b_myu=b_myu+(double)para[0][5]*_2nd;
b_myu=b_myu+(double)para[0][6]*_3rd;
beep=b_myu;
}
else{
itb=1+(250-para[0][2])/8;
if((b_ctr++)<itb) return(0);
sh=para[0][3];
b_ctr=0;
beep=4.0*b_myu*beep*(1.0-beep);
bbx=(int)(65535.99*(1-beep)/pow(2.0,(double)(11-sh)));
outp(0x3fdb,bbx%256);
outp(0x3fdb,bbx/256);
}
}
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <math.h>
#include <fcntl.h>
#include <graph.h>
#define ERROR -1
#define STATPT 0xe0d2
#define DATAPT 0xe0d0
#define DRR 0x0040
#define DSR 0x0080
#define PUT 8888
#define GET 9999
#define entry_table 0x0080
#define vector_offset_wave 1
#define vector_offset_w_block 2
#define vector_offset_user_com 10
#define vector_offset_w_bank 16
FILE *fds,*fdo;
double wc[512];
char dum[50],name[16];
int num,ww,wk,kn[16],le[16],vol[16],pt;
unsigned char wb[512],wd[512];
unsigned char patch[594] = {
0x1C,0x66,0x29,0xEB,0xE1,0xFE,0x37,0x00,0xEB,0xE3,0xFE,0x37,
0x00,0xEB,0xE2,0xFE,0x37,0x00,0xEB,0xE4,0xFE,0x37,0x00,0x1C,
0xA4,0x41,0x1C,0x20,0x41,0xC8,0xF8,0x47,0x7F,0x77,0x7D,0xFE,
0xD6,0x39,0x00,0x70,0xF9,0x70,0xE2,0x28,0xEF,0x76,0x20,0x97,
0x7F,0xAC,0x80,0xC6,0x04,0x3F,0x7F,0x00,0x00,0xF8,0xAF,0xC6,
0x1F,0xF8,0x6F,0xF0,0xC7,0x0B,0xF8,0x6F,0xF8,0xFE,0xD6,0xFE,
0xDF,0x37,0x78,0x00,0x1E,0x20,0xF8,0x6C,0xF0,0xEF,0x78,0x20,
0x6C,0x0F,0x2F,0x77,0x37,0x7A,0x00,0x1E,0x27,0x78,0x6F,0x00,
0xFE,0xD6,0xEF,0x7A,0x6F,0x00,0xCE,0x0C,0x6F,0xC0,0xC6,0x0F,
0x6F,0xD0,0xC6,0x1F,0x37,0x7A,0x01,0x1E,0x37,0x7A,0x00,0x37,
0x78,0x00,0x1E,0xEF,0x77,0x6F,0x0F,0xFE,0xDE,0x3A,0x00,0x68,
0xE3,0xE1,0xFE,0x2E,0xF7,0x20,0xE3,0xE1,0xFE,0x87,0x1E,0xEF,
0x77,0x6F,0x0F,0xFE,0xDE,0x3A,0x00,0x6A,0xE3,0xE3,0xFE,0x2E,
0xF7,0x20,0xE3,0xE3,0xFE,0x87,0x1E,0xA8,0x62,0xCE,0x08,0xA9,
0x62,0xFE,0xD6,0xB1,0x62,0xC8,0x08,0xB0,0x62,0x1C,0x46,0x04,
0x1C,0xBB,0x41,0x27,0xF1,0x1E,0x27,0x5F,0x6C,0xF0,0xA7,0xA7,
0xA7,0x3A,0xC9,0x41,0xF3,0x4A,0xEA,0xC8,0x58,0x11,0x58,0x11,
0x58,0x11,0x41,0x12,0xE9,0x12,0xE9,0x12,0xE9,0x12,0xE9,0x12,
0x7F,0x13,0xDC,0x13,0xE9,0x41,0x8C,0x14,0xF2,0x14,0x3F,0x15,
0x1C,0x16,0xC3,0x16,0x27,0x5F,0xFE,0xAB,0xEB,0x19,0x14,0xC6,
0x6C,0x07,0xA6,0x3A,0xFB,0x41,0xF3,0x4A,0xEA,0xC8,0x2D,0x43,
0x51,0x42,0x0B,0x42,0x2A,0x14,0x33,0x14,0x41,0x14,0x4F,0x14,
0x84,0x14,0xE3,0xE2,0xFE,0x2E,0xE3,0xE1,0xFE,0x67,0xCE,0x10,
0xE3,0xE4,0xFE,0x2E,0xE3,0xE3,0xFE,0x67,0xCE,0x1C,0x30,0xFF,
0x1C,0x48,0x04,0x1E,0x30,0xCF,0x1C,0x48,0x04,0x3A,0x00,0x68,
0xE3,0xE2,0xFE,0x2E,0xF3,0x28,0xE3,0xE2,0xFE,0x87,0x1C,0x48,
0x04,0x1E,0x30,0xDF,0x1C,0x48,0x04,0x3A,0x00,0x6A,0xE3,0xE4,
0xFE,0x2E,0xF3,0x28,0xE3,0xE4,0xFE,0x87,0x1C,0x48,0x04,0x1E,
0x27,0xF1,0xA9,0x62,0xC6,0xFC,0xB1,0x62,0x27,0x60,0xEB,0xE5,
0xFE,0x26,0x27,0xF1,0xA9,0x62,0xC6,0xFC,0xB1,0x62,0x27,0x60,
0xEB,0xE6,0xFE,0x26,0x27,0xF1,0xA9,0x62,0xC6,0xFC,0xB1,0x62,
0x27,0x60,0xEB,0xE7,0xFE,0x26,0x33,0x00,0x1C,0x87,0x42,0x83,
0xFB,0x6F,0x10,0xCE,0xF7,0x1E,0x30,0xFA,0xFB,0x31,0xF9,0x6E,
0xC0,0xE8,0x37,0xF0,0xFB,0x31,0xF9,0x6E,0xD0,0xE8,0x37,0x0F,
0xE3,0xE6,0xFE,0x28,0x31,0x48,0xF8,0x6A,0x02,0x35,0x20,0xF8,
0x12,0x30,0x00,0xF8,0x70,0x31,0x08,0xF8,0x70,0xFC,0x6E,0x90,
0x30,0xFA,0xE2,0x2E,0xFB,0x31,0xE8,0x26,0xFC,0x6C,0x0F,0xFC,
0x6E,0xA0,0xE2,0x2E,0xFB,0x31,0xF9,0x6E,0x10,0xE8,0x26,0xFC,
0x6E,0x10,0xE2,0x2E,0xFB,0x31,0xF9,0x6E,0x20,0xE8,0x26,0xFB,
0x31,0xF9,0x6E,0x30,0xE8,0x37,0x00,0xFB,0x31,0xF9,0x6E,0x40,
0xE8,0x37,0x00,0xE3,0xE5,0xFE,0x2E,0xFB,0x60,0xFB,0x31,0xF9,
0x6E,0x50,0xE8,0x26,0xFB,0x31,0xF9,0x6E,0x60,0xE8,0x37,0x80,
0xFB,0x31,0xF9,0x6E,0x70,0xE8,0x37,0x00,0xFB,0x31,0xF9,0x6E,
0xA0,0xE8,0x37,0x0F,0xFB,0x31,0xF9,0x6E,0xB0,0xE8,0x37,0x0F,
0xFB,0x31,0xF9,0x6E,0xC0,0xE3,0xE7,0xFE,0x2E,0xE8,0x26,0xFB,
0x31,0xF9,0x6E,0xD0,0xE8,0x37,0x0F,0xFB,0x31,0xF9,0x6E,0x90,
0xE8,0x37,0x03,0x1E,0x33,0x00,0x1C,0x38,0x43,0x83,0xFB,0x6F,
0x10,0xCE,0xF7,0x30,0xFA,0xFB,0x31,0xF9,0x6E,0xC0,0xE8,0x37,
0xF0,0xFB,0x31,0xF9,0x6E,0xD0,0xE8,0x37,0x0F,0xFB,0x31,0xF9,
0x6E,0x90,0xE8,0x37,0x00,0x1E };
unsigned char speed_get_7[66] = {
0x27,0xF1,0xA9,0x62,0xC6,0xFC,0xB1,0x62,0xE7,0x60,0x28,0x27,0xF1,0xA9,
0x62,0xC6,0xFC,0xB1,0x62,0xE7,0x60,0x29,0x27,0xF1,0xA9,0x62,0xC6,0xFC,
0xB1,0x62,0xE7,0x60,0x2C,0x27,0xF1,0xA9,0x62,0xC6,0xFC,0xB1,0x62,0xE7,
0x60,0x2D,0x7F,0x00,0x00,0xFE,0xD6,0xAC,0xC6,0xC6,0xFC,0xE0,0x2E,0x2F,
0xFE,0x27,0xF0,0x90,0x7A,0x01,0x00,0xCE,0xF0,0x1E };
unsigned char speed_put_8[68] = {
0x27,0xF1,0xA9,0x62,0xC6,0xFC,0xB1,0x62,0xE7,0x60,0x28,0x27,0xF1,0xA9,
0x62,0xC6,0xFC,0xB1,0x62,0xE7,0x60,0x29,0x27,0xF1,0xA9,0x62,0xC6,0xFC,
0xB1,0x62,0xE7,0x60,0x2C,0x27,0xF1,0xA9,0x62,0xC6,0xFC,0xB1,0x62,0xE7,
0x60,0x2D,0x7F,0x00,0x00,0xFE,0xD6,0x27,0xF1,0xA9,0x62,0xC6,0xFC,0xB1,
0x62,0x27,0x60,0xE8,0x26,0x90,0x7A,0x01,0x00,0xCE,0xEE,0x1E };
unsigned char volume[32] = {
0x7a,0x6a,0x5a,0x5e,0x48,0x4a,0x4c,0x4e,
0x38,0x3a,0x2c,0x3e,0x28,0x2a,0x2c,0x2e,
0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f };
unsigned get_entry(x) int x; { unsigned ent,z; z=(unsigned)x;
ent=msb_data_get(entry_table)+msb_data_get(entry_table+1)*256;
return(msb_data_get(ent+2*z)+msb_data_get(ent+2*z+1)*256); }
msb_data_put(add,data) unsigned add; int data; {
set_command(0xe3); put_data(add/256); set_command(0xe5);
put_data(add%256); set_command(0xeb); put_data(data); }
msb_data_get(add) unsigned add; {
set_command(0xe3); put_data(add/256); set_command(0xe5);
put_data(add%256); set_command(0xae); return(get_data()); }
msb_hot_reset(){ inp(DATAPT); inp(DATAPT); inp(DATAPT); set_command(0xff); }
put_command(x) int x; { while((inp(STATPT)&DRR)!=0){} outp(STATPT,x); }
put_data(x) int x; { while((inp(STATPT)&DRR)!=0){} outp(DATAPT,x); }
get_data(){ while((inp(STATPT)&DSR)!=0){} return(inp(DATAPT)); }
set_command(x) int x; { put_command(x); while(get_data()!=0xfe){} }
turbo_command_set(x,add,count) int x; unsigned add,count; {
if(x==PUT) set_command(0xcd);
else if(x==GET) set_command(0xcc);
put_data(add/256); put_data(add%256);
put_data(count/256); put_data(count%256); }
wave_draw(z,mode)
int z,mode;
{
unsigned add;
int i,j,xx,yy,xxx,yyy,tx,ty,dt,yyyy,d;
xx=24+336*(z/8); xxx=xx+285; yy=9+48*(z%8); yyy=yy+43;
_setcolor(0); _rectangle(_GFILLINTERIOR,xx,yy,xxx,yyy); _setcolor(7);
if(mode==0) _setlinestyle(0x9999);
else if(mode==1) _setlinestyle(0xffff);
xx=25+336*(z/8); xxx=xx+128; yy=10+48*(z%8); yyy=yy+42;
_rectangle(_GBORDER,xx,yy,xxx,yyy);
xx=157+336*(z/8); xxx=xx+145; yy=34+48*(z%8); yyy=yy+18;
_rectangle(_GBORDER,xx,yy,xxx,yyy);
ty=2+3*(z%8); tx=42*(z/8); _settextposition(ty,tx); printf("[%X]",z);
_settextposition(ty-1,tx+20); printf(" KN=%02x LE=%02x",kn[z],le[z]);
xx=26+336*(z/8); xxx=xx+kn[z]; yy=14+48*(z%8); yyy=yy+4;
_setlinestyle(0x5555); _rectangle(_GFILLINTERIOR,xx,yy,xxx,yyy);
xx=26+336*(z/8); xxx=2+xx+4*vol[z]; yy=44+48*(z%8); yyy=yy+4;
_setlinestyle(0x5555); _rectangle(_GFILLINTERIOR,xx,yy,xxx,yyy);
xx=158+336*(z/8); xxx=xx+143*le[z]/127; yy=35+48*(z%8); yyy=yy+16;
_setlinestyle(0x5555); _rectangle(_GFILLINTERIOR,xx,yy,xxx,yyy);
xx=25+336*(z/8); xxx=xx+128; yy=10+48*(z%8); yyy=yy+42;
_setlinestyle(0xffff);
for(i=0;i<512;i=i+4){
if(i==0) _moveto(xx,yyy-14);
else{
if(wb[i]<128) dt=wb[i]+128;
else dt=128-(wb[i]&0x7f);
yyyy=yyy-56*dt/256+14;
if(yyyy>yyy) yyyy=yyy;
_lineto(xx+i/4,yyyy);
}
if (i==508) _lineto(xx+127,yyy-14);
}
if(mode==1){
d=le[z];
if(d>127-16) d=127-16;
set_command(0xa9);
put_data(d);
put_data(kn[z]);
put_data(volume[vol[z]]);
}
}
wave_calc(ww,wk)
int ww,wk;
{
int i,wl,a,b;
double p=3.1415926535,q,r,u,v=0;
if(ww<16) wl=512-24*(16-ww);
else wl=512-24*(ww-16);
for(i=0;i<512;i++){
if(i<wl){
q=(double)i/(double)wl;
r=((double)wk-16)/11; /* sin(2t) */
wc[i]=1+sin(p*(2*q-0.5))+r*(1+sin(p*(4*q-0.5)));
}
else wc[i]=0;
if(v<wc[i]) v=wc[i];
}
for(i=0;i<512;i++){
u=127.9*wc[i]/v; if(u>=0) wd[i]=(char)u;
else wd[i]=(char)(128-u);
}
if(ww<16){
a=(512-wl)/2; b=a+wl; for(i=0;i<a;i++) wb[i]=0;
for(i=0;i<wl;i++) wb[i+a]=wd[i];
for(i=0;i<a;i++) wb[i+b]=0;
}
else if(ww>16){
a=wl/2; b=a+(512-wl); for(i=0;i<a;i++) wb[i]=wd[i];
for(i=0;i<512-wl;i++) wb[i+a]=wd[a];
for(i=0;i<a;i++) wb[i+b]=wd[i+a];
}
else{ for(i=0;i<512;i++) wb[i]=wd[i]; }
}
wave_set(){
unsigned add;
int i;
set_command(0x01); set_command(0xf0);
add=get_entry(vector_offset_w_block); msb_data_put(add,0);
add=get_entry(vector_offset_wave); turbo_command_set(PUT,add,256);
for(i=0;i<256;i++) put_data(wb[i]);
set_command(0xc0);
add=get_entry(vector_offset_w_block); msb_data_put(add,1);
add=get_entry(vector_offset_wave); turbo_command_set(PUT,add,256);
for(i=256;i<512;i++) put_data(wb[i]);
set_command(0xc0); set_command(0xf1);
}
wave_initialize_firmware_load(){
unsigned add;
int i;
printf("\n\n\n\n\n\t\tplease wait a moment...");
add=get_entry(vector_offset_user_com)+0x100*6;
for(i=0;i<66;i++) msb_data_put(add+(unsigned)i,(int)speed_get_7[i]);
add=get_entry(vector_offset_user_com)+0x100*7;
for(i=0;i<68;i++) msb_data_put(add+(unsigned)i,(int)speed_put_8[i]);
set_command(0xf0);
add=get_entry(vector_offset_wave); turbo_command_set(PUT,add,256);
for(i=0;i<256;i++) put_data(0);
set_command(0xf1); add=get_entry(vector_offset_w_block);
for(i=0;i<128;i++){ msb_data_put(add,i); set_command(0xc0); }
add=0x4101;
for(i=0;i<594;i++) msb_data_put(add+(unsigned)i,(int)patch[i]);
msb_data_put(0x4100,0);
}
parameter_file_write(){
int i;
strcpy(name,"granular"); strcat(name,".dat");
fds=fopen(name,"wb");
for(i=0;i<16;i++){ fputc(kn[i],fds); fputc(le[i],fds); }
for(i=0;i<16;i++){ fputc(vol[i],fds); }
fputc(ww,fds); fputc(wk,fds); fputc(pt,fds);
fclose(fds);
}
parameter_file_read(){
int i;
strcpy(name,"granular"); strcat(name,".dat");
if((fds=fopen(name,"rb"))==NULL){
for(i=0;i<16;i++){ kn[15-i]=32+i*4; le[15-i]=4+i*8; }
for(i=0;i<16;i++){ vol[15-i]=31; }
ww=16; wk=16; pt=0;
}
else{
for(i=0;i<16;i++){ kn[i]=fgetc(fds); le[i]=fgetc(fds); }
for(i=0;i<16;i++){ vol[i]=fgetc(fds); }
ww=fgetc(fds); wk=fgetc(fds); pt=fgetc(fds);
fclose(fds);
}
}
main(argc,argv)
int argc; char *argv[];
{
int i,d;
msb_hot_reset();
wave_initialize_firmware_load();
parameter_file_read();
granulation_para();
set_command(0xfe);
exit(0);
}
granulation_para(){
int i,c,flg=0,j,d,px,py;
_setvideomode(_98RESS16COLOR); _setcolor(7);
_displaycursor(_GCURSOROFF); _clearscreen(_GCLEARSCREEN);
_loop_loop:
wave_calc(ww,wk); wave_set();
_settextposition(0,26); printf("[[ WW=%d WK=%d ]] ",ww,wk);
for(i=0;i<16;i++) wave_draw(i,0);
wave_draw(pt,1);
while(1){
while(!kbhit()){
set_command(0xaa); d=get_data();
if(d==0xcf){
px=get_data();
if(px<0x60){
le[pt]=px; wave_draw(pt,1);
}
else{
vol[pt]=px-0x60; wave_draw(pt,1);
}
}
else if(d==0xdf){
kn[pt]=get_data();
wave_draw(pt,1);
}
}
c=getch();
if(c==0x1b){ /* Escape */
break;
}
else if(c==0x0b){ /* Up */
wave_draw(pt,0); if(pt==0) pt=15;
else if(pt==8) pt=7;
else pt=pt-1;
wave_draw(pt,1);
}
else if(c==0x0a){ /* Down */
wave_draw(pt,0); if(pt==7) pt=8;
else if(pt==15) pt=0;
else pt=pt+1;
wave_draw(pt,1);
}
else if(c==0x0c){ /* Right */
wave_draw(pt,0); if(pt<8) pt=pt+8;
else pt=pt-8;
wave_draw(pt,1);
}
else if(c==0x08){ /* Left */
wave_draw(pt,0); if(pt<8) pt=pt+8;
else pt=pt-8;
wave_draw(pt,1);
}
else if(c=='8'){ /* Key Number Up */
if(kn[pt]!=127){ kn[pt]++; wave_draw(pt,1); }
}
else if(c=='2'){ /* Key Number Down */
if(kn[pt]!=0){ kn[pt]--; wave_draw(pt,1); }
}
else if(c=='6'){ /* Loop End to Right */
if(le[pt]!=127){ le[pt]++; wave_draw(pt,1); }
}
else if(c=='4'){ /* Loop End to Left */
if(le[pt]!=0){ le[pt]--; wave_draw(pt,1); }
}
else if(c=='>'){ /* Wave Width +1 */
if(ww!=31){ flg=1; ww++; break; }
}
else if(c=='<'){ /* Wave Width -1 */
if(ww!=0){ flg=1; ww--; break; }
}
else if(c=='+'){ /* Wave Type +1 */
if(wk!=31){ flg=1; wk++; break; }
}
else if(c=='-'){ /* Wave Type -1 */
if(wk!=0){ flg=1; wk--; break; }
}
else if((c=='d')||(c=='D')){ /* Volume Down */
if(vol[pt]!=0){ vol[pt]--; wave_draw(pt,1); }
}
else if((c=='u')||(c=='U')){ /* Volume Up */
if(vol[pt]!=31){ vol[pt]++; wave_draw(pt,1); }
}
}
if(flg!=0){ flg=0; goto _loop_loop; }
parameter_file_write();
_clearscreen(_GCLEARSCREEN); _displaycursor(_GCURSORON);
set_command(0xa8);
}
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <malloc.h>
#include <conio.h>
#include <graph.h>
#include <fcntl.h>
#include <dos.h>
#include <math.h>
#pragma check_stack(off)
#pragma intrinsic(_disable,_enable)
#pragma function(inp,outp)
#define _GB 2
#define _GF 3
void interrupt far new_0a(void);
void (interrupt far *old_0a)(void);
union REGS inregs,outregs;
struct SREGS segregs;
int moux,mouy,right,left,old_l,old_r,old_x,old_y;
FILE *fds,*fdo;
char far wind[14000];
long vsync_counter;
double myu[8],chaos[8];
int volume[8],filter[8][12],midich[8],shift[8],range[2][8],tim[2][8];
int down[8],program[8],panpot[8],para1[8],para2[8],ch_trig;
int section,edit_ch,note[8],velocity[8],phase[8],counter[8],sum[8];
int data_buffer[30][8][9],fifo_pointer,read_pointer;
unsigned char ref_table[8][3200],midi_fifo[4][10000];
mouse(flag) int flag; {
if(flag==0){inregs.x.ax=2;} else if(flag==1){inregs.x.ax=1;}
int86(51,&inregs,&outregs); }
getmouse(right,left,x,y) int *right,*left,*x,*y; { inregs.x.ax=3;
int86(51,&inregs,&outregs); *right=outregs.x.bx;
*left=outregs.x.ax; *x=outregs.x.cx; *y=outregs.x.dx; }
setmouse(x,y) int x,y; { inregs.x.ax=4; inregs.x.cx=x; inregs.x.dx=y;
int86(51,&inregs,&outregs); }
m_style(x,y,buf) int x,y; char *buf; { inregs.x.ax=9; inregs.x.bx=x;
inregs.x.cx=y; segread(&segregs); segregs.es=segregs.ds;
inregs.x.dx=(int)buf; int86x(51,&inregs,&outregs,&segregs); }
m_view(xmin,ymin,xmax,ymax) int xmin,ymin,xmax,ymax; { inregs.x.ax=16;
inregs.x.cx=xmin; inregs.x.dx=xmax; int86(51,&inregs,&outregs);
inregs.x.ax=17; inregs.x.cx=ymin; inregs.x.dx=ymax;
int86(51,&inregs,&outregs); }
m_color(color) int color; {
inregs.x.ax=18; inregs.x.bx=color; int86(51,&inregs,&outregs); }
symbol(x,y,color,str,skip) int x,y,color,skip; unsigned char str[80]; {
int i=0; _setcolor(color);
while(str[i]!=0){ _gputchar(x,y,str[i++],_GXOR); x += skip; } }
int style[]={ 0,0,0,0,0,0,0,0,0x0070,0x0e88,0x1184,0x2142,0x2221,0x9210,
0xe107,0x1108,0x1108,0xe107,0x1108,0x1108,0xe107,0x4108,0x4208,
0xfc07,0,0,0,0,0,0,0,0 };
put_command(x) int x; { while((inp(0xe0d2)&0x40)!=0){} outp(0xe0d2,x); }
put_data(x) int x; { while((inp(0xe0d2)&0x40)!=0){} outp(0xe0d0,x); }
get_data(){ while((inp(0xe0d2)&0x80)!=0){} return(inp(0xe0d0)); }
set_command(x) int x; { put_command(x); while(get_data()!=0xfe){} }
msb_hot_reset(){ inp(0xe0d0); inp(0xe0d0); inp(0xe0d0); set_command(0xff); }
vsync_int_start(){ if(old_0a!=NULL) return;
old_0a=_dos_getvect(0x0a); _dos_setvect(0x0a,new_0a);
outp(0x64,0); _disable(); outp(0x02,inp(0x02)&0xfb); _enable();
signal(SIGINT,SIG_IGN); }
vsync_int_stop(){ if(old_0a==NULL) return;
_disable(); outp(0x02,inp(0x02)|0x04); _enable();
_dos_setvect(0x0a,old_0a); old_0a=NULL; signal(SIGINT,SIG_DFL); }
void interrupt far new_0a(){ outp(0x64,0);
vsync_counter++; _disable(); _chain_intr(old_0a); }
main(){
int i,j,d,ch,m_ctr,rsb,dcb,keyno,m_m,m_stat=0;
int job_fg[8],job_ct=0,run_flag=0,pause_pass=0,bar_disp=0;
inregs.x.ax=0; int86(51,&inregs,&outregs);
if(outregs.x.ax==0){printf("\nPlease install mouse.sys !\n");exit(0);}
m_style(0,8,style); m_color(1); m_view(0,0,639,399); setmouse(320,200);
msb_hot_reset();
set_command(0xf0); set_command(0xfd); set_command(0x3f);
for(i=0;i<4096;i++){ for(j=0;j<200;j++){} inp(0xe0d0); }
for(d=0;d<8;d++){
midich[d]=d; velocity[d]=0;
phase[d]=0; counter[d]=0; chaos[d]=0.5; job_fg[d]=0;
}
_setvideomode(_98RESS16COLOR); _displaycursor(_GCURSOROFF);
_clearscreen(_GCLEARSCREEN);
parameter_file_read();
section=1; screen_display(); edit_ch=0;
fifo_pointer=0; read_pointer=0;
mouse(1); getmouse(&old_r,&old_l,&old_x,&old_y);
vsync_counter=0; vsync_int_start();
while(1){
if(vsync_counter!=0){
vsync_counter=0;
if(run_flag!=2) put_data(0xf8);
for(ch=0;ch<8;ch++) job_fg[ch]=1;
}
if((inp(0xe0d2)&0x80)==0){
d=inp(0xe0d0);
if(d>0xef){}
else if(d>0x7f){ rsb=d; dcb=0; }
else if(rsb==0xcf){
if((run_flag==1)&&((d==0x7f)||(d==0))){
put_data(0xfa);
run_flag=0;
window_draw(0);
}
else if((run_flag==2)&&((d==0x7f)||(d==0))){
run_flag=0;
window_draw(0);
}
else if((run_flag==3)&&((d==0x7f)||(d==0))){
d=ch_trig;
if(++ch_trig>4) ch_trig=1;
phase[d]=3;
if(volume[d]!=0){
velocity[d]=0x7f;
}
}
}
else if(rsb==0xdf){
if((run_flag==1)&&((d==0x7f)||(d==0))){
put_data(0xfa);
run_flag=0;
window_draw(0);
}
else if((run_flag==2)&&((d==0x7f)||(d==0))){
run_flag=0;
window_draw(0);
}
else if((run_flag==3)&&((d==0x7f)||(d==0))){
d=ch_trig;
if(++ch_trig>4) ch_trig=1;
phase[d]=3;
if(volume[d]!=0){
velocity[d]=0x7f;
}
}
}
else if(rsb==0xaf){
if(dcb==0){ keyno=d; dcb=1; }
else{
dcb=0;
midi_display(1,rsb,keyno,d,0);
if(keyno==60){
if((d>0)&&(d<10)){
if(run_flag==1){
run_flag=0;
window_draw(0);
pause_pass=1;
}
for(i=0;i<8;i++){
chaos[d]=0.5;
velocity[i]=0;
}
section=d;
screen_display();
}
}
else if(keyno==61){
if((d>0)&&(d<9)){
phase[d-1]=1;
if(volume[d-1]!=0){
velocity[d-1]=0x7f;
}
}
}
else if(keyno==62) edit_ch=d;
else if((keyno>62)&&(keyno<93)){
edit_midi_rx(keyno,d);
}
else if((keyno==93)&&(pause_pass==0)){
run_flag=2;
window_draw(1);
}
else if(keyno==94){
if(d==0) run_flag=0;
else run_flag=3;
ch_trig=1;
}
else if(keyno==95){
if(d==0) bar_disp=0;
else{
bar_disp=d;
bar_display(d);
}
}
}
}
else if((rsb>0xbf)&&(rsb<0xcf)){
midi_display(3,rsb,d,0,0);
}
else if((rsb>0x8f)&&(rsb<0xa0)){
if(dcb==0){ keyno=d; dcb=1; }
else{
dcb=0;
if(d!=0) midi_display(0,rsb,keyno,d,0);
}
}
else if((rsb>0xaf)&&(rsb<0xc0)){
if(dcb==0){ keyno=d; dcb=1; }
else{
dcb=0;
midi_display(2,rsb,keyno,d,0);
if((rsb==0xbf)&&(keyno==0x7f)&&(d==0)){
if(pause_pass==0){
run_flag=1;
window_draw(1);
}
}
}
}
}
else if(job_fg[job_ct]!=0){
each_channel(job_ct);
job_fg[job_ct]=0;
job_ct=(job_ct+1)&0x07;
}
else if(kbhit()!=0){
d=getch();
if(d==0x1b) break;
else if((d==0x20)||(d==0x0d)){
if(run_flag==1){
put_data(0xfa);
run_flag=0;
window_draw(0);
}
else if(run_flag==2){
run_flag=0;
window_draw(0);
}
}
else if((d>0x30)&&(d<0x3a)){
for(ch=0;ch<8;ch++) velocity[ch]=0;
parameter_to_data_buffer();
section=d-0x30; screen_display();
}
else if((d=='c')||(d=='C')) put_data(0xfc);
else if((d=='b')||(d=='B')) put_data(0xfb);
else if(d=='A'){ put_data(0xfa); pause_pass=0; }
}
else{
getmouse(&right,&left,&moux,&mouy);
if((right==0)&&(left==0)) m_stat=0;
else if((old_l==0)&&(left!=0)){
m_stat=1; m_ctr=0; m_m=1;
}
else if((old_r==0)&&(right!=0)){
m_stat=2; m_ctr=0; m_m=1;
}
else if(left!=0){
if(++m_ctr>30){ m_stat=1; m_ctr=0; m_m=0; }
}
else if(right!=0){
if(++m_ctr>30){ m_stat=2; m_ctr=0; m_m=0;}
}
if(m_stat==1){ m_stat=0; m_stat_1(m_m); }
else if(m_stat==2){ m_stat=0; m_stat_2(m_m); }
old_r=right; old_l=left; old_x=moux; old_y=mouy;
if(bar_disp==0){
_settextposition(12,66);
printf("(X=%03d,Y=%03d)",moux,mouy);
}
midi_display(0,0,0,0,1);
}
}
vsync_int_stop(); mouse(0);
for(i=0;i<8;i++){
put_data(0x80+midich[i]); put_data(note[i]); put_data(0);
}
put_data(0xfc);
for(i=0;i<16;i++){ put_data(0xb0+i); put_data(0x7f); put_data(0); }
put_command(0xff);
parameter_to_data_buffer(); parameter_file_write();
for(i=0;i<4096;i++){ for(j=0;j<200;j++){} inp(0xe0d0); }
_clearscreen(_GCLEARSCREEN); _displaycursor(_GCURSORON);
_setvideomode (_DEFAULTMODE);
}
m_stat_1(m_m)
int m_m;
{
if((mouy>176)&&(mouy<189)) volume_change(0,m_m);
else if((mouy>384)&&(mouy<397)) volume_change(4,m_m);
else if((mouy>114)&&(mouy<128)) range_change(0,0);
else if((mouy>322)&&(mouy<336)) range_change(4,0);
else if((mouy>98)&&(mouy<112)) time_change(0,0);
else if((mouy>306)&&(mouy<320)) time_change(4,0);
else if((mouy>82)&&(mouy<96)) dwn_prg_change(0,0);
else if((mouy>290)&&(mouy<304)) dwn_prg_change(4,0);
else if((mouy>50)&&(mouy<64)) myu_change(0,0,m_m);
else if((mouy>258)&&(mouy<272)) myu_change(4,0,m_m);
else if((mouy>158)&&(mouy<174)) map_change(0,0);
else if((mouy>366)&&(mouy<382)) map_change(4,0);
else if((mouy>66)&&(mouy<80)) p1_p2_change(0,0);
else if((mouy>274)&&(mouy<288)) p1_p2_change(4,0);
else if((mouy>34)&&(mouy<48)) volpan_change(0,0);
else if((mouy>242)&&(mouy<256)) volpan_change(4,0);
else if((mouy>0)&&(mouy<16)) channel_trigger(0,m_m);
else if((mouy>208)&&(mouy<224)) channel_trigger(4,m_m);
}
m_stat_2(m_m)
int m_m;
{
if((mouy>176)&&(mouy<189)) volume_change(0,m_m);
else if((mouy>384)&&(mouy<397)) volume_change(4,m_m);
else if((mouy>114)&&(mouy<128)) range_change(0,1);
else if((mouy>322)&&(mouy<336)) range_change(4,1);
else if((mouy>98)&&(mouy<112)) time_change(0,1);
else if((mouy>306)&&(mouy<320)) time_change(4,1);
else if((mouy>82)&&(mouy<96)) dwn_prg_change(0,1);
else if((mouy>290)&&(mouy<304)) dwn_prg_change(4,1);
else if((mouy>50)&&(mouy<64)) myu_change(0,1,m_m);
else if((mouy>258)&&(mouy<272)) myu_change(4,1,m_m);
else if((mouy>158)&&(mouy<174)) map_change(0,1);
else if((mouy>366)&&(mouy<382)) map_change(4,1);
else if((mouy>66)&&(mouy<80)) p1_p2_change(0,1);
else if((mouy>274)&&(mouy<288)) p1_p2_change(4,1);
else if((mouy>34)&&(mouy<48)) volpan_change(0,1);
else if((mouy>242)&&(mouy<256)) volpan_change(4,1);
}
point_screen(mode,y,midi)
int mode,y,midi;
{
char ss[5];
int i,j,k,l,xx,yy,xt,yt,xx_b,yy_b;
xt=1+(y%4)*20; yt=(y/4)*13; xx=1+(y%4)*160; yy=1+(y/4)*208;
if(mode==0){
mouse(0); ss[0]='A'+y; ss[1]=0;
_setlinestyle(0xffff); _setcolor(0);
_rectangle(_GF,xx,yy,xx+157,yy+190); _setcolor(7);
_rectangle(_GB,xx,yy,xx+157,yy+190);
_rectangle(_GF,xx,yy,xx+157,yy+14);
_settextposition(yt,xt); printf("\x1b[30m");
printf(" == %s == ch:%d ",ss,midich[y]+1);
printf("\x1b[37m"); mouse(1);
}
else if(mode==1){
mouse(0); _setlinestyle(0xffff); _setcolor(0);
_rectangle(_GF,xx+1,yy+173,xx+156,yy+189); _setcolor(7);
xx_b=xx+6+(volume[y]/2)*143/64; yy_b=yy+176;
_moveto(xx+7,yy_b+5); _lineto(xx+150,yy_b+5);
_moveto(xx+7,yy_b+6); _lineto(xx+150,yy_b+6);
i=0; _moveto(xx+7+11*i,yy_b+2); _lineto(xx+7+11*i,yy_b+9);
i=13; _moveto(xx+7+11*i,yy_b+2); _lineto(xx+7+11*i,yy_b+9);
for(i=1;i<13;i++){
_moveto(xx+7+11*i,yy_b+3); _lineto(xx+7+11*i,yy_b+8);
}
_rectangle(_GF,xx_b,yy_b,xx_b+5,yy_b+11); _setcolor(0);
_rectangle(_GF,xx_b+1,yy_b+1,xx_b+4,yy_b+10); _setcolor(7);
_rectangle(_GF,xx_b+2,yy_b+2,xx_b+3,yy_b+9);
_settextposition(yt+2,xt);
printf(" vol=%03d pan=%03d",volume[y],panpot[y]);
if(midi==0){
put_data(0xb0+midich[y]);
put_data(0x07); put_data(volume[y]);
put_data(0xb0+midich[y]); put_data(0x0A);
put_data(panpot[y]);
}
mouse(1);
}
else if(mode==2){
mouse(0); _setlinestyle(0xffff); _setcolor(0);
_rectangle(_GF,xx+13,yy+131,xx+144,yy+157); _setcolor(7);
_setlinestyle(0x6666);
_rectangle(_GB,xx+12,yy+130,xx+145,yy+158);
_setlinestyle(0xffff);
for(i=0;i<7;i++){
_rectangle(_GB,xx+12+19*i,yy+158,xx+31+19*i,yy+172);
}
yy_b=yy+159;
xx_b=xx+31; _rectangle(_GF,xx_b-6,yy_b,xx_b+6,yy_b+7);
xx_b=xx+50; _rectangle(_GF,xx_b-6,yy_b,xx_b+6,yy_b+7);
xx_b=xx+88; _rectangle(_GF,xx_b-6,yy_b,xx_b+6,yy_b+7);
xx_b=xx+107; _rectangle(_GF,xx_b-6,yy_b,xx_b+6,yy_b+7);
xx_b=xx+126; _rectangle(_GF,xx_b-6,yy_b,xx_b+6,yy_b+7);
yy_b=yy+156;
_rectangle(_GB,xx+20,yy_b,xx+23,yy_b-filter[y][0]);
_rectangle(_GF,xx+29,yy_b,xx+33,yy_b-filter[y][1]);
_rectangle(_GB,xx+39,yy_b,xx+42,yy_b-filter[y][2]);
_rectangle(_GF,xx+48,yy_b,xx+52,yy_b-filter[y][3]);
_rectangle(_GB,xx+58,yy_b,xx+61,yy_b-filter[y][4]);
_rectangle(_GB,xx+77,yy_b,xx+80,yy_b-filter[y][5]);
_rectangle(_GF,xx+86,yy_b,xx+90,yy_b-filter[y][6]);
_rectangle(_GB,xx+96,yy_b,xx+99,yy_b-filter[y][7]);
_rectangle(_GF,xx+105,yy_b,xx+109,yy_b-filter[y][8]);
_rectangle(_GB,xx+115,yy_b,xx+118,yy_b-filter[y][9]);
_rectangle(_GF,xx+124,yy_b,xx+128,yy_b-filter[y][10]);
_rectangle(_GB,xx+134,yy_b,xx+137,yy_b-filter[y][11]);
mouse(1);
}
else if(mode==3){
_settextposition(yt+7,xt);
printf(" low=%03d high=%03d",range[0][y],range[1][y]);
}
else if(mode==4){
_settextposition(yt+6,xt);
printf(" dly=%03d stp=%03d",tim[0][y],tim[1][y]);
}
else if(mode==5){
_settextposition(yt+5,xt);
printf(" dwn=%03d prg=%03d",down[y],program[y]);
if(midi==0){
put_data(0xc0+midich[y]); put_data(program[y]);
}
}
else if(mode==6){
_settextposition(yt+3,xt);
printf(" myu=%f <%d>",myu[y],shift[y]+1);
}
else if(mode==7){
_settextposition(yt+1,xt);
printf(" note=%03d vel=%03d",note[y],velocity[y]);
}
else if(mode==8){
_settextposition(yt+4,xt);
printf(" pp1=%03d pp2=%03d",para1[y],para2[y]);
}
if((mode==2)||(mode==3)){
sum[y]=0; j=0;
for(i=range[0][y];i<range[1][y]+1;i++){
k=filter[y][i%12]; sum[y]=sum[y]+k;
for(l=0;l<k;l++) ref_table[y][j++]=i;
}
}
}
channel_trigger(off,m_m)
int off,m_m;
{
int of,y,x;
if(m_m==0) return(0);
if((moux>0)&&(moux<159)) of=0;
else if((moux>160)&&(moux<319)) of=1;
else if((moux>320)&&(moux<479)) of=2;
else if((moux>480)&&(moux<639)) of=3;
else return(0);
y=off+of;
phase[y]=1;
if(volume[y]!=0) velocity[y]=0x7f;
}
volume_change(off,m_m)
int off,m_m;
{
int of,y,x;
if(m_m==0) return(0);
if((moux>7)&&(moux<152)) { of=0; x=8; }
else if((moux>167)&&(moux<312)) { of=1; x=168; }
else if((moux>327)&&(moux<472)) { of=2; x=328; }
else if((moux>487)&&(moux<632)) { of=3; x=488; }
else return(0);
y=off+of;
volume[y]=(moux-x)*127/143;
point_screen(1,y,0); /* Volume */
}
range_change(off,md)
int off,md;
{
int of,y,z;
if((moux>15)&&(moux<71)) { of=0; z=0; }
else if((moux>80)&&(moux<143)) { of=0; z=1; }
else if((moux>175)&&(moux<231)) { of=1; z=0; }
else if((moux>240)&&(moux<303)) { of=1; z=1; }
else if((moux>335)&&(moux<391)) { of=2; z=0; }
else if((moux>400)&&(moux<463)) { of=2; z=1; }
else if((moux>495)&&(moux<551)) { of=3; z=0; }
else if((moux>560)&&(moux<623)) { of=3; z=1; }
else return(0);
y=off+of;
if((z==0)&&(md==0)){ if(range[0][y]>0) range[0][y]--; }
else if((z==0)&&(md==1)){ if(range[0][y]<127) range[0][y]++; }
else if((z==1)&&(md==0)){ if(range[1][y]>0) range[1][y]--; }
else if((z==1)&&(md==1)){ if(range[1][y]<127) range[1][y]++; }
point_screen(3,y,0); /* Range */
}
time_change(off,md)
int off,md;
{
int of,y,z;
if((moux>15)&&(moux<71)) { of=0; z=0; }
else if((moux>87)&&(moux<143)) { of=0; z=1; }
else if((moux>175)&&(moux<231)) { of=1; z=0; }
else if((moux>247)&&(moux<303)) { of=1; z=1; }
else if((moux>335)&&(moux<391)) { of=2; z=0; }
else if((moux>407)&&(moux<463)) { of=2; z=1; }
else if((moux>495)&&(moux<551)) { of=3; z=0; }
else if((moux>567)&&(moux<623)) { of=3; z=1; }
else return(0);
y=off+of;
if((z==0)&&(md==0)){ if(tim[0][y]>0) tim[0][y]--; }
else if((z==0)&&(md==1)){ if(tim[0][y]<127) tim[0][y]++; }
else if((z==1)&&(md==0)){ if(tim[1][y]>0) tim[1][y]--; }
else if((z==1)&&(md==1)){ if(tim[1][y]<127) tim[1][y]++; }
point_screen(4,y,0); /* Delay, Step */
}
dwn_prg_change(off,md)
int off,md;
{
int of,y,z;
if((moux>15)&&(moux<71)) { of=0; z=0; }
else if((moux>87)&&(moux<143)) { of=0; z=1; }
else if((moux>175)&&(moux<231)) { of=1; z=0; }
else if((moux>247)&&(moux<303)) { of=1; z=1; }
else if((moux>335)&&(moux<391)) { of=2; z=0; }
else if((moux>407)&&(moux<463)) { of=2; z=1; }
else if((moux>495)&&(moux<551)) { of=3; z=0; }
else if((moux>567)&&(moux<623)) { of=3; z=1; }
else return(0);
y=off+of;
if((z==0)&&(md==0)){ if(down[y]>0) down[y]--; }
else if((z==0)&&(md==1)){ if(down[y]<127) down[y]++; }
else if((z==1)&&(md==0)){ if(program[y]>0) program[y]--; }
else if((z==1)&&(md==1)){ if(program[y]<127) program[y]++; }
point_screen(5,y,0); /* Down, Program */
}
p1_p2_change(off,md)
int off,md;
{
int of,y,z;
if((moux>15)&&(moux<71)) { of=0; z=0; }
else if((moux>87)&&(moux<143)) { of=0; z=1; }
else if((moux>175)&&(moux<231)) { of=1; z=0; }
else if((moux>247)&&(moux<303)) { of=1; z=1; }
else if((moux>335)&&(moux<391)) { of=2; z=0; }
else if((moux>407)&&(moux<463)) { of=2; z=1; }
else if((moux>495)&&(moux<551)) { of=3; z=0; }
else if((moux>567)&&(moux<623)) { of=3; z=1; }
else return(0);
y=off+of;
if((z==0)&&(md==0)){ if(para1[y]>0) para1[y]--; }
else if((z==0)&&(md==1)){ if(para1[y]<127) para1[y]++; }
else if((z==1)&&(md==0)){ if(para2[y]>0) para2[y]--; }
else if((z==1)&&(md==1)){ if(para2[y]<127) para2[y]++; }
point_screen(8,y,0); /* Parameters */
}
volpan_change(off,md)
int off,md;
{
int of,y,z;
if((moux>15)&&(moux<71)) { of=0; z=0; }
else if((moux>87)&&(moux<143)) { of=0; z=1; }
else if((moux>175)&&(moux<231)) { of=1; z=0; }
else if((moux>247)&&(moux<303)) { of=1; z=1; }
else if((moux>335)&&(moux<391)) { of=2; z=0; }
else if((moux>407)&&(moux<463)) { of=2; z=1; }
else if((moux>495)&&(moux<551)) { of=3; z=0; }
else if((moux>567)&&(moux<623)) { of=3; z=1; }
else return(0);
y=off+of;
if((z==0)&&(md==0)){ if(volume[y]>0) volume[y]--; }
else if((z==0)&&(md==1)){ if(volume[y]<127) volume[y]++; }
else if((z==1)&&(md==0)){ if(panpot[y]>0) panpot[y]--; }
else if((z==1)&&(md==1)){ if(panpot[y]<127) panpot[y]++; }
point_screen(1,y,0); /* Volume, Panpot */
}
myu_change(off,md,m_m)
int off,md,m_m;
{
int of,y,z;
if((moux>15)&&(moux<111)) { of=0; z=0; }
else if((moux>120)&&(moux<142)) { of=0; z=1; }
else if((moux>175)&&(moux<271)) { of=1; z=0; }
else if((moux>280)&&(moux<302)) { of=1; z=1; }
else if((moux>335)&&(moux<431)) { of=2; z=0; }
else if((moux>440)&&(moux<462)) { of=2; z=1; }
else if((moux>495)&&(moux<591)) { of=3; z=0; }
else if((moux>600)&&(moux<622)) { of=3; z=1; }
else return(0);
y=off+of;
if((z==0)&&(md==0)){
if(shift[y]==0) myu[y]=myu[y]-0.1;
else if(shift[y]==1) myu[y]=myu[y]-0.01;
else if(shift[y]==2) myu[y]=myu[y]-0.001;
else if(shift[y]==3) myu[y]=myu[y]-0.0001;
else if(shift[y]==4) myu[y]=myu[y]-0.00001;
else if(shift[y]==5) myu[y]=myu[y]-0.000001;
if(myu[y]<1.0) myu[y]=1.0;
}
else if((z==0)&&(md==1)){
if(shift[y]==0) myu[y]=myu[y]+0.1;
else if(shift[y]==1) myu[y]=myu[y]+0.01;
else if(shift[y]==2) myu[y]=myu[y]+0.001;
else if(shift[y]==3) myu[y]=myu[y]+0.0001;
else if(shift[y]==4) myu[y]=myu[y]+0.00001;
else if(shift[y]==5) myu[y]=myu[y]+0.000001;
if(myu[y]>4.0) myu[y]=4.0;
}
else if((m_m!=0)&&(z==1)&&(md==0)){ if(shift[y]>0) shift[y]--; }
else if((m_m!=0)&&(z==1)&&(md==1)){ if(shift[y]<5) shift[y]++; }
point_screen(6,y,0); /* Myu, Shift */
}
map_change(off,md)
int off,md;
{
int f,of,y,z,xx,yy;
if(off==0) yy=mouy;
else yy=mouy-208;
if((moux>13)&&(moux<147)) { of=0; xx=moux; }
else if((moux>172)&&(moux<307)) { of=1; xx=moux-160; }
else if((moux>332)&&(moux<467)) { of=2; xx=moux-320; }
else if((moux>492)&&(moux<627)) { of=3; xx=moux-480; }
else return(0);
if((yy<168)&&(xx>25)&&(xx<38)) z=1;
else if((yy<168)&&(xx>44)&&(xx<58)) z=3;
else if((yy<168)&&(xx>82)&&(xx<96)) z=6;
else if((yy<168)&&(xx>101)&&(xx<115)) z=8;
else if((yy<168)&&(xx>120)&&(xx<134)) z=10;
else if(xx<32) z=0;
else if(xx<51) z=2;
else if(xx<70) z=4;
else if(xx<89) z=5;
else if(xx<108) z=7;
else if(xx<127) z=9;
else z=11;
y=off+of;
if(md==0){ if(filter[y][z]>0) filter[y][z]--; }
else { if(filter[y][z]<24) filter[y][z]++; }
point_screen(2,y,0); /* Note Map */
}
parameter_file_write(){
int i,j,k;
fds=fopen("chaosgen.dat","wb");
for(i=0;i<9;i++){
for(j=0;j<8;j++){
for(k=0;k<30;k++) fputc(data_buffer[k][j][i],fds);
fputc(0xff,fds);
fputc(0xff,fds);
}
}
fclose(fds);
}
parameter_file_read(){
int i,j,k;
if((fds=fopen("chaosgen.dat","rb"))==NULL){
for(i=0;i<9;i++){
for(j=0;j<8;j++){
data_buffer[0][j][i]=3; /* Myu over point */
data_buffer[1][j][i]=j; /* Myu (1) */
data_buffer[2][j][i]=j; /* Myu (2) */
data_buffer[3][j][i]=j; /* Myu (3) */
data_buffer[4][j][i]=j; /* Myu (4) */
data_buffer[5][j][i]=j; /* Myu (5) */
data_buffer[6][j][i]=j; /* Myu (6) */
data_buffer[7][j][i]=1; /* shift */
data_buffer[8][j][i]=1+2*j; /* down */
data_buffer[9][j][i]=2*j+1; /* program */
data_buffer[10][j][i]=64+2*j; /* volume */
data_buffer[11][j][i]=64; /* panpot */
data_buffer[12][j][i]=99; /* para(1) */
data_buffer[13][j][i]=99; /* para(2) */
data_buffer[14][j][i]=36-j; /* range[0] low */
data_buffer[15][j][i]=84+j; /* range[1] high */
data_buffer[16][j][i]=j; /* tim[0] Delay */
data_buffer[17][j][i]=1+j*2; /* tim[1] Step */
data_buffer[18][j][i]=12; /* filter[0] */
data_buffer[19][j][i]=12; /* filter[1] */
data_buffer[20][j][i]=12; /* filter[2] */
data_buffer[21][j][i]=12; /* filter[3] */
data_buffer[22][j][i]=12; /* filter[4] */
data_buffer[23][j][i]=12; /* filter[5] */
data_buffer[24][j][i]=12; /* filter[6] */
data_buffer[25][j][i]=12; /* filter[7] */
data_buffer[26][j][i]=12; /* filter[8] */
data_buffer[27][j][i]=12; /* filter[9] */
data_buffer[28][j][i]=12; /* filter[10] */
data_buffer[29][j][i]=12; /* filter[11] */
}
}
}
else{
for(i=0;i<9;i++){
for(j=0;j<8;j++){
for(k=0;k<30;k++){
data_buffer[k][j][i]=fgetc(fds);
}
fgetc(fds);
fgetc(fds);
}
}
fclose(fds);
}
}
screen_display(){
int i,j,k,m0,m1,m2,m3,m4,m5,m6;
i=section-1;
for(j=0;j<8;j++){
m0=data_buffer[0][j][i]; /* Myu over point */
m1=data_buffer[1][j][i]; /* Myu (1) */
m2=data_buffer[2][j][i]; /* Myu (2) */
m3=data_buffer[3][j][i]; /* Myu (3) */
m4=data_buffer[4][j][i]; /* Myu (4) */
m5=data_buffer[5][j][i]; /* Myu (5) */
m6=data_buffer[6][j][i]; /* Myu (6) */
myu[j]=(double)m0;
myu[j]=myu[j]+0.1*(double)m1;
myu[j]=myu[j]+0.01*(double)m2;
myu[j]=myu[j]+0.001*(double)m3;
myu[j]=myu[j]+0.0001*(double)m4;
myu[j]=myu[j]+0.00001*(double)m5;
myu[j]=myu[j]+0.000001*(double)m6;
shift[j]=data_buffer[7][j][i]; /* shift */
down[j]=data_buffer[8][j][i]; /* down */
program[j]=data_buffer[9][j][i]; /* program */
volume[j]=data_buffer[10][j][i]; /* volume */
panpot[j]=data_buffer[11][j][i]; /* panpot */
para1[j]=data_buffer[12][j][i]; /* para(1) */
para2[j]=data_buffer[13][j][i]; /* para(2) */
range[0][j]=data_buffer[14][j][i]; /* range[0] low */
range[1][j]=data_buffer[15][j][i]; /* range[1] high */
tim[0][j]=data_buffer[16][j][i]; /* tim[0] Delay */
tim[1][j]=data_buffer[17][j][i]; /* tim[1] Step */
for(k=0;k<12;k++){
filter[j][k]=data_buffer[18+k][j][i]; /* filter[k] */
}
}
for(i=0;i<8;i++){
point_screen(0,i,0); /* Whole Frame */
point_screen(7,i,0); /* Note, Velocity */
point_screen(6,i,0); /* Myu, Shift */
point_screen(8,i,0); /* Parameters */
point_screen(1,i,0); /* Volume, Panpot */
point_screen(5,i,0); /* Down, Program */
point_screen(4,i,0); /* Delay, Step */
point_screen(3,i,0); /* Range */
point_screen(2,i,0); /* Note Map */
}
_settextposition(12,1);
if(section==1) printf("【1】2 3 4 5 6 7 8 9 ");
else if(section==2) printf(" 1【2】3 4 5 6 7 8 9 ");
else if(section==3) printf(" 1 2【3】4 5 6 7 8 9 ");
else if(section==4) printf(" 1 2 3【4】5 6 7 8 9 ");
else if(section==5) printf(" 1 2 3 4【5】6 7 8 9 ");
else if(section==6) printf(" 1 2 3 4 5【6】7 8 9 ");
else if(section==7) printf(" 1 2 3 4 5 6【7】8 9 ");
else if(section==8) printf(" 1 2 3 4 5 6 7【8】9 ");
else if(section==9) printf(" 1 2 3 4 5 6 7 8【9】");
}
parameter_to_data_buffer(){
double myu_buff;
int i,j,k,m;
i=section-1;
for(j=0;j<8;j++){
myu_buff=myu[j];
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[0][j][i]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[1][j][i]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[2][j][i]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[3][j][i]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[4][j][i]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[5][j][i]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[6][j][i]=m;
data_buffer[7][j][i]=shift[j];
data_buffer[8][j][i]=down[j];
data_buffer[9][j][i]=program[j];
data_buffer[10][j][i]=volume[j];
data_buffer[11][j][i]=panpot[j];
data_buffer[12][j][i]=para1[j];
data_buffer[13][j][i]=para2[j];
data_buffer[14][j][i]=range[0][j];
data_buffer[15][j][i]=range[1][j];
data_buffer[16][j][i]=tim[0][j];
data_buffer[17][j][i]=tim[1][j];
for(k=0;k<12;k++){
data_buffer[18+k][j][i]=filter[j][k];
}
}
}
each_channel(ch)
int ch;
{
if(phase[ch]==0){ counter[ch]=0; }
else if(phase[ch]==1){ if(++counter[ch]>tim[0][ch]) phase[ch]=2; }
else if(phase[ch]==2){
phase[ch]=3; chaos[ch]=myu[ch]*chaos[ch]*(1.0-chaos[ch]);
note[ch]=(int)ref_table[ch][(int)(sum[ch]*chaos[ch])];
put_data(0x90+midich[ch]); put_data(note[ch]);
put_data(0x7f); velocity[ch]=0x7f;
point_screen(7,ch,0); /* Note, Velocity */
}
else if(phase[ch]==3){
phase[ch]=4; put_data(0x80+midich[ch]);
put_data(note[ch]); put_data(0x00); counter[ch]=0;
}
else if(phase[ch]==4){ if(++counter[ch]>tim[1][ch]) phase[ch]=5; }
else if(phase[ch]==5){
velocity[ch]=velocity[ch]-down[ch];
if(velocity[ch]<1){ phase[ch]=0; return(0); }
phase[ch]=3; chaos[ch]=myu[ch]*chaos[ch]*(1.0-chaos[ch]);
note[ch]=(int)ref_table[ch][(int)(sum[ch]*chaos[ch])];
put_data(0x90+midich[ch]); put_data(note[ch]);
put_data(velocity[ch]);
point_screen(7,ch,0); /* Note, Velocity */
}
}
myu_decode(j)
int j;
{
double myu_buff;
int i,m;
i=section-1;
myu_buff=myu[j];
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[0][j][i]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[1][j][i]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[2][j][i]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[3][j][i]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[4][j][i]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[5][j][i]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[6][j][i]=m;
}
myu_encode(j)
int j;
{
int i,m0,m1,m2,m3,m4,m5,m6;
i=section-1;
m0=data_buffer[0][j][i]; /* Myu over point */
m1=data_buffer[1][j][i]; /* Myu (1) */
m2=data_buffer[2][j][i]; /* Myu (2) */
m3=data_buffer[3][j][i]; /* Myu (3) */
m4=data_buffer[4][j][i]; /* Myu (4) */
m5=data_buffer[5][j][i]; /* Myu (5) */
m6=data_buffer[6][j][i]; /* Myu (6) */
myu[j]=(double)m0;
myu[j]=myu[j]+0.1*(double)m1;
myu[j]=myu[j]+0.01*(double)m2;
myu[j]=myu[j]+0.001*(double)m3;
myu[j]=myu[j]+0.0001*(double)m4;
myu[j]=myu[j]+0.00001*(double)m5;
myu[j]=myu[j]+0.000001*(double)m6;
}
edit_midi_rx(sel,data)
int sel,data;
{
int i,j,m0,m1,m2,m3,m4,m5,m6;
if((edit_ch<1)||(edit_ch>8)) return(0);
i=section-1;
j=edit_ch-1;
switch(sel){
case (63):
myu_decode(j);
data_buffer[0][j][i]=data; /* Myu over point */
myu_encode(j);
point_screen(6,j,0); /* Myu, Shift */
break;
case (64):
myu_decode(j);
data_buffer[1][j][i]=data; /* Myu (1) */
myu_encode(j);
point_screen(6,j,0); /* Myu, Shift */
break;
case (65):
myu_decode(j);
data_buffer[2][j][i]=data; /* Myu (2) */
myu_encode(j);
point_screen(6,j,0); /* Myu, Shift */
break;
case (66):
myu_decode(j);
data_buffer[3][j][i]=data; /* Myu (3) */
myu_encode(j);
point_screen(6,j,0); /* Myu, Shift */
break;
case (67):
myu_decode(j);
data_buffer[4][j][i]=data; /* Myu (4) */
myu_encode(j);
point_screen(6,j,0); /* Myu, Shift */
break;
case (68):
myu_decode(j);
data_buffer[5][j][i]=data; /* Myu (5) */
myu_encode(j);
point_screen(6,j,0); /* Myu, Shift */
break;
case (69):
myu_decode(j);
data_buffer[6][j][i]=data; /* Myu (6) */
myu_encode(j);
point_screen(6,j,0); /* Myu, Shift */
break;
case (70):
shift[j]=data;
point_screen(6,j,0); /* Myu, Shift */
break;
case (71):
down[j]=data;
point_screen(5,j,0); /* Down, Program */
break;
case (72):
program[j]=data;
point_screen(5,j,0); /* Down, Program */
break;
case (73):
volume[j]=data;
point_screen(1,j,0); /* Volume, Panpot */
break;
case (74):
panpot[j]=data;
point_screen(1,j,0); /* Volume, Panpot */
break;
case (75):
para1[j]=data;
point_screen(8,j,0); /* Parameters */
break;
case (76):
para2[j]=data;
point_screen(8,j,0); /* Parameters */
break;
case (77):
range[0][j]=data;
point_screen(3,j,0); /* Range */
break;
case (78):
range[1][j]=data;
point_screen(3,j,0); /* Range */
break;
case (79):
tim[0][j]=data;
point_screen(4,j,0); /* Delay, Step */
break;
case (80):
tim[1][j]=data;
point_screen(4,j,0); /* Delay, Step */
break;
case (81):
filter[j][0]=data;
point_screen(2,j,0); /* Note Map */
break;
case (82):
filter[j][1]=data;
point_screen(2,j,0); /* Note Map */
break;
case (83):
filter[j][2]=data;
point_screen(2,j,0); /* Note Map */
break;
case (84):
filter[j][3]=data;
point_screen(2,j,0); /* Note Map */
break;
case (85):
filter[j][4]=data;
point_screen(2,j,0); /* Note Map */
break;
case (86):
filter[j][5]=data;
point_screen(2,j,0); /* Note Map */
break;
case (87):
filter[j][6]=data;
point_screen(2,j,0); /* Note Map */
break;
case (88):
filter[j][7]=data;
point_screen(2,j,0); /* Note Map */
break;
case (89):
filter[j][8]=data;
point_screen(2,j,0); /* Note Map */
break;
case (90):
filter[j][9]=data;
point_screen(2,j,0); /* Note Map */
break;
case (91):
filter[j][10]=data;
point_screen(2,j,0); /* Note Map */
break;
case (92):
filter[j][11]=data;
point_screen(2,j,0); /* Note Map */
break;
}
}
midi_display(mode,status,keyno,data,u_d)
int mode,status,keyno,data,u_d;
{
int j,fifo_buff;
if(u_d==0){
fifo_buff=fifo_pointer;
midi_fifo[0][fifo_pointer]=mode;
midi_fifo[1][fifo_pointer]=status;
midi_fifo[2][fifo_pointer]=keyno;
midi_fifo[3][fifo_pointer]=data;
fifo_pointer++;
if(fifo_pointer>9999) fifo_pointer=0;
if(fifo_pointer==read_pointer) fifo_pointer=fifo_buff;
return(0);
}
if(fifo_pointer==read_pointer) return(0);
mode=midi_fifo[0][read_pointer];
status=midi_fifo[1][read_pointer];
keyno=midi_fifo[2][read_pointer];
data=midi_fifo[3][read_pointer];
read_pointer++;
if(read_pointer>9999) read_pointer=0;
switch(mode){
case(0):
_settextposition(12,32);
printf("%02X %02X %02X",status,keyno,data);
break;
case(1):
_settextposition(12,41);
printf("%02X %02X %02X",status,keyno,data);
break;
case(2):
_settextposition(12,50);
printf("%02X %02X %02X",status,keyno,data);
if(status>0xb7) break;
j=status&0x0f;
if(keyno==7) volume[j]=data;
else if(keyno==10) panpot[j]=data;
else break;
point_screen(1,j,1); /* Volume, Panpot */
break;
case(3):
_settextposition(12,59);
printf("%02X %02X",status,keyno);
if(status>0xc7) break;
j=status&0x0f;
program[j]=keyno;
point_screen(5,j,1); /* Down, Program */
break;
}
}
window_draw(d)
int d;
{
int w1x=7,w1y=133,w2x=632,w2y=170;
if(d==0){
_settextposition(9,15);
printf(" ");
mouse(0);
_putimage(w1x,w1y,wind,_GPSET);
mouse(1);
return(0);
}
mouse(0);
_getimage(w1x,w1y,w2x,w2y,wind);
_setcolor(0); _rectangle(_GFILLINTERIOR,w1x,w1y,w2x,w2y);
_setcolor(7); _rectangle(_GFILLINTERIOR,w1x+4,w1y+4,w2x-4,w2y-4);
_setcolor(0); _rectangle(_GFILLINTERIOR,w1x+8,w1y+8,w2x-8,w2y-8);
_setcolor(7);
mouse(1);
_settextposition(9,15);
printf("System is waiting ... Plaese Cueing with JOY/KBD !!");
}
bar_display(d)
int d;
{
_settextposition(12,66);
printf(" ★");
if(d>127) char_disp(10);
else if(d>99) char_disp(1);
else char_disp(0);
d=d-100*(d/100);
char_disp(d/10);
char_disp(d%10);
printf("★ ");
}
char_disp(x)
int x;
{
if(x==0) printf("0");
else if(x==1) printf("1");
else if(x==2) printf("2");
else if(x==3) printf("3");
else if(x==4) printf("4");
else if(x==5) printf("5");
else if(x==6) printf("6");
else if(x==7) printf("7");
else if(x==8) printf("8");
else if(x==9) printf("9");
else printf("*");
}
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <malloc.h>
#include <conio.h>
#include <graph.h>
#include <fcntl.h>
#include <dos.h>
#include <math.h>
#pragma check_stack(off)
#pragma intrinsic(_disable,_enable)
#pragma function(inp,outp)
#define _GB 2
#define _GF 3
void interrupt far new_0a(void);
void (interrupt far *old_0a)(void);
union REGS inregs,outregs;
struct SREGS segregs;
int moux,mouy,right,left,old_l,old_r,old_x,old_y;
FILE *fds,*fdo;
long vsync_counter;
double myu[8],chaos[8];
int volume[8],filter[8][12],midich[8],shift[8],range[2][8],tim[2][8];
int down[8],program[8],panpot[8],para1[8],para2[8],ch_trig;
int section,edit_ch,note[8],velocity[8],phase[8],counter[8],sum[8];
int data_buffer[30][8][9],fifo_pointer,read_pointer;
unsigned char ref_table[8][3200];
mouse(flag) int flag; {
if(flag==0){inregs.x.ax=2;} else if(flag==1){inregs.x.ax=1;}
int86(51,&inregs,&outregs); }
getmouse(right,left,x,y) int *right,*left,*x,*y; { inregs.x.ax=3;
int86(51,&inregs,&outregs); *right=outregs.x.bx;
*left=outregs.x.ax; *x=outregs.x.cx; *y=outregs.x.dx; }
setmouse(x,y) int x,y; { inregs.x.ax=4; inregs.x.cx=x; inregs.x.dx=y;
int86(51,&inregs,&outregs); }
m_style(x,y,buf) int x,y; char *buf; { inregs.x.ax=9; inregs.x.bx=x;
inregs.x.cx=y; segread(&segregs); segregs.es=segregs.ds;
inregs.x.dx=(int)buf; int86x(51,&inregs,&outregs,&segregs); }
m_view(xmin,ymin,xmax,ymax) int xmin,ymin,xmax,ymax; { inregs.x.ax=16;
inregs.x.cx=xmin; inregs.x.dx=xmax; int86(51,&inregs,&outregs);
inregs.x.ax=17; inregs.x.cx=ymin; inregs.x.dx=ymax;
int86(51,&inregs,&outregs); }
m_color(color) int color; {
inregs.x.ax=18; inregs.x.bx=color; int86(51,&inregs,&outregs); }
symbol(x,y,color,str,skip) int x,y,color,skip; unsigned char str[80]; {
int i=0; _setcolor(color);
while(str[i]!=0){ _gputchar(x,y,str[i++],_GXOR); x += skip; } }
int style[]={ 0,0,0,0,0,0,0,0,0x0070,0x0e88,0x1184,0x2142,0x2221,0x9210,
0xe107,0x1108,0x1108,0xe107,0x1108,0x1108,0xe107,0x4108,0x4208,
0xfc07,0,0,0,0,0,0,0,0 };
put_command(x) int x; { while((inp(0xe0d2)&0x40)!=0){} outp(0xe0d2,x); }
put_data(x) int x; { while((inp(0xe0d2)&0x40)!=0){} outp(0xe0d0,x); }
get_data(){ while((inp(0xe0d2)&0x80)!=0){} return(inp(0xe0d0)); }
set_command(x) int x; { put_command(x); while(get_data()!=0xfe){} }
msb98_check(){ int i,j; for(i=0;i<100;i++) inp(0xe0d0);
j=0; for(i=0;i<10000;i++){ if((inp(0xe0d2)&0x40)==0) j=1; }
if(j==0) return(-1);
outp(0xe0d2,0xff);
j=0; for(i=0;i<32000;i++){ if((inp(0xe0d2)&0x80)==0) j=1; }
if(j==0) return(-1);
if(inp(0xe0d0)!=0xfe) return(-1);
set_command(0xff); set_command(0xac); i=get_data();
if(i!=0x15) return(-1);
set_command(0xf0); set_command(0xac); i=get_data();
if(i!=0x28) return(-1);
set_command(0xff); return(0); }
msb_hot_reset(){ inp(0xe0d0); inp(0xe0d0); inp(0xe0d0); set_command(0xff); }
vsync_int_start(){ if(old_0a!=NULL) return;
old_0a=_dos_getvect(0x0a); _dos_setvect(0x0a,new_0a);
outp(0x64,0); _disable(); outp(0x02,inp(0x02)&0xfb); _enable();
signal(SIGINT,SIG_IGN); }
vsync_int_stop(){ if(old_0a==NULL) return;
_disable(); outp(0x02,inp(0x02)|0x04); _enable();
_dos_setvect(0x0a,old_0a); old_0a=NULL; signal(SIGINT,SIG_DFL); }
void interrupt far new_0a(){ outp(0x64,0);
vsync_counter++; _disable(); _chain_intr(old_0a); }
main(){
int i,j,d,ch,m_ctr,rsb,dcb,keyno,m_m,m_stat=0;
int job_fg[8],job_ct=0,run_flag=0,pause_pass=0,bar_disp=0;
inregs.x.ax=0; int86(51,&inregs,&outregs);
if(outregs.x.ax==0){printf("\nPlease install mouse.sys !\n");exit(0);}
m_style(0,8,style); m_color(1); m_view(0,0,639,399); setmouse(320,200);
if(msb98_check()==-1){
printf("\n\n\n\n\n\t\t\t[MSB-98] is not found !\n\n");
while(1){ if(kbhit()!=0) break; }
exit(0);
}
msb_hot_reset();
set_command(0x3f);
for(i=0;i<4096;i++){ for(j=0;j<200;j++){} inp(0xe0d0); }
for(d=0;d<8;d++){
midich[d]=d; velocity[d]=0;
phase[d]=0; counter[d]=0; chaos[d]=0.5; job_fg[d]=0;
}
_setvideomode(_98RESS16COLOR); _displaycursor(_GCURSOROFF);
_clearscreen(_GCLEARSCREEN);
parameter_file_read();
section=1; screen_display(); edit_ch=0;
_settextposition(12,31);
printf("[Chaos Generator] by Y.Nagashima");
fifo_pointer=0; read_pointer=0;
mouse(1); getmouse(&old_r,&old_l,&old_x,&old_y);
vsync_counter=0; vsync_int_start();
while(1){
if(vsync_counter!=0){
vsync_counter=0;
if(run_flag!=2) put_data(0xf8);
for(ch=0;ch<8;ch++) job_fg[ch]=1;
}
if(job_fg[job_ct]!=0){
each_channel(job_ct);
job_fg[job_ct]=0;
job_ct=(job_ct+1)&0x07;
}
else if(kbhit()!=0){
d=getch();
if(d==0x1b) break;
else if((d==0x20)||(d==0x0d)){
for(d=0;d<8;d++){
phase[d-1]=1;
if(volume[d-1]!=0) velocity[d-1]=0x7f;
}
}
else if((d>0x30)&&(d<0x3a)){
for(ch=0;ch<8;ch++) velocity[ch]=0;
parameter_to_data_buffer();
section=d-0x30; screen_display();
}
else if((d=='a')||(d=='A')){
d=1; phase[d-1]=1;
if(volume[d-1]!=0) velocity[d-1]=0x7f;
}
else if((d=='b')||(d=='B')){
d=2; phase[d-1]=1;
if(volume[d-1]!=0) velocity[d-1]=0x7f;
}
else if((d=='c')||(d=='C')){
d=3; phase[d-1]=1;
if(volume[d-1]!=0) velocity[d-1]=0x7f;
}
else if((d=='d')||(d=='D')){
d=4; phase[d-1]=1;
if(volume[d-1]!=0) velocity[d-1]=0x7f;
}
else if((d=='e')||(d=='E')){
d=5; phase[d-1]=1;
if(volume[d-1]!=0) velocity[d-1]=0x7f;
}
else if((d=='f')||(d=='F')){
d=6; phase[d-1]=1;
if(volume[d-1]!=0) velocity[d-1]=0x7f;
}
else if((d=='g')||(d=='G')){
d=7; phase[d-1]=1;
if(volume[d-1]!=0) velocity[d-1]=0x7f;
}
else if((d=='h')||(d=='H')){
d=8; phase[d-1]=1;
if(volume[d-1]!=0) velocity[d-1]=0x7f;
}
}
else{
getmouse(&right,&left,&moux,&mouy);
if((right==0)&&(left==0)) m_stat=0;
else if((old_l==0)&&(left!=0)){
m_stat=1; m_ctr=0; m_m=1;
}
else if((old_r==0)&&(right!=0)){
m_stat=2; m_ctr=0; m_m=1;
}
else if(left!=0){
if(++m_ctr>30){ m_stat=1; m_ctr=0; m_m=0; }
}
else if(right!=0){
if(++m_ctr>30){ m_stat=2; m_ctr=0; m_m=0;}
}
if(m_stat==1){ m_stat=0; m_stat_1(m_m); }
else if(m_stat==2){ m_stat=0; m_stat_2(m_m); }
old_r=right; old_l=left; old_x=moux; old_y=mouy;
if(bar_disp==0){
_settextposition(12,66);
printf("(X=%03d,Y=%03d)",moux,mouy);
}
}
}
vsync_int_stop(); mouse(0);
for(i=0;i<8;i++){
put_data(0x80+midich[i]); put_data(note[i]); put_data(0);
}
put_data(0xfc);
for(i=0;i<16;i++){ put_data(0xb0+i); put_data(0x7f); put_data(0); }
put_command(0xff);
parameter_to_data_buffer(); parameter_file_write();
for(i=0;i<4096;i++){ for(j=0;j<200;j++){} inp(0xe0d0); }
_clearscreen(_GCLEARSCREEN); _displaycursor(_GCURSORON);
_setvideomode (_DEFAULTMODE);
}
m_stat_1(m_m)
int m_m;
{
if((mouy>176)&&(mouy<189)) volume_change(0,m_m);
else if((mouy>384)&&(mouy<397)) volume_change(4,m_m);
else if((mouy>114)&&(mouy<128)) range_change(0,0);
else if((mouy>322)&&(mouy<336)) range_change(4,0);
else if((mouy>98)&&(mouy<112)) time_change(0,0);
else if((mouy>306)&&(mouy<320)) time_change(4,0);
else if((mouy>82)&&(mouy<96)) dwn_prg_change(0,0);
else if((mouy>290)&&(mouy<304)) dwn_prg_change(4,0);
else if((mouy>50)&&(mouy<64)) myu_change(0,0,m_m);
else if((mouy>258)&&(mouy<272)) myu_change(4,0,m_m);
else if((mouy>158)&&(mouy<174)) map_change(0,0);
else if((mouy>366)&&(mouy<382)) map_change(4,0);
else if((mouy>66)&&(mouy<80)) p1_p2_change(0,0);
else if((mouy>274)&&(mouy<288)) p1_p2_change(4,0);
else if((mouy>34)&&(mouy<48)) volpan_change(0,0);
else if((mouy>242)&&(mouy<256)) volpan_change(4,0);
else if((mouy>0)&&(mouy<16)) channel_trigger(0,m_m);
else if((mouy>208)&&(mouy<224)) channel_trigger(4,m_m);
}
m_stat_2(m_m)
int m_m;
{
if((mouy>176)&&(mouy<189)) volume_change(0,m_m);
else if((mouy>384)&&(mouy<397)) volume_change(4,m_m);
else if((mouy>114)&&(mouy<128)) range_change(0,1);
else if((mouy>322)&&(mouy<336)) range_change(4,1);
else if((mouy>98)&&(mouy<112)) time_change(0,1);
else if((mouy>306)&&(mouy<320)) time_change(4,1);
else if((mouy>82)&&(mouy<96)) dwn_prg_change(0,1);
else if((mouy>290)&&(mouy<304)) dwn_prg_change(4,1);
else if((mouy>50)&&(mouy<64)) myu_change(0,1,m_m);
else if((mouy>258)&&(mouy<272)) myu_change(4,1,m_m);
else if((mouy>158)&&(mouy<174)) map_change(0,1);
else if((mouy>366)&&(mouy<382)) map_change(4,1);
else if((mouy>66)&&(mouy<80)) p1_p2_change(0,1);
else if((mouy>274)&&(mouy<288)) p1_p2_change(4,1);
else if((mouy>34)&&(mouy<48)) volpan_change(0,1);
else if((mouy>242)&&(mouy<256)) volpan_change(4,1);
}
point_screen(mode,y,midi)
int mode,y,midi;
{
char ss[5];
int i,j,k,l,xx,yy,xt,yt,xx_b,yy_b;
xt=1+(y%4)*20; yt=(y/4)*13; xx=1+(y%4)*160; yy=1+(y/4)*208;
if(mode==0){
mouse(0); ss[0]='A'+y; ss[1]=0;
_setlinestyle(0xffff); _setcolor(0);
_rectangle(_GF,xx,yy,xx+157,yy+190); _setcolor(7);
_rectangle(_GB,xx,yy,xx+157,yy+190);
_rectangle(_GF,xx,yy,xx+157,yy+14);
_settextposition(yt,xt); printf("\x1b[30m");
printf(" == %s == ch:%d ",ss,midich[y]+1);
printf("\x1b[37m"); mouse(1);
}
else if(mode==1){
mouse(0); _setlinestyle(0xffff); _setcolor(0);
_rectangle(_GF,xx+1,yy+173,xx+156,yy+189); _setcolor(7);
xx_b=xx+6+(volume[y]/2)*143/64; yy_b=yy+176;
_moveto(xx+7,yy_b+5); _lineto(xx+150,yy_b+5);
_moveto(xx+7,yy_b+6); _lineto(xx+150,yy_b+6);
i=0; _moveto(xx+7+11*i,yy_b+2); _lineto(xx+7+11*i,yy_b+9);
i=13; _moveto(xx+7+11*i,yy_b+2); _lineto(xx+7+11*i,yy_b+9);
for(i=1;i<13;i++){
_moveto(xx+7+11*i,yy_b+3); _lineto(xx+7+11*i,yy_b+8);
}
_rectangle(_GF,xx_b,yy_b,xx_b+5,yy_b+11); _setcolor(0);
_rectangle(_GF,xx_b+1,yy_b+1,xx_b+4,yy_b+10); _setcolor(7);
_rectangle(_GF,xx_b+2,yy_b+2,xx_b+3,yy_b+9);
_settextposition(yt+2,xt);
printf(" vol=%03d pan=%03d",volume[y],panpot[y]);
if(midi==0){
put_data(0xb0+midich[y]);
put_data(0x07); put_data(volume[y]);
put_data(0xb0+midich[y]); put_data(0x0A);
put_data(panpot[y]);
}
mouse(1);
}
else if(mode==2){
mouse(0); _setlinestyle(0xffff); _setcolor(0);
_rectangle(_GF,xx+13,yy+131,xx+144,yy+157); _setcolor(7);
_setlinestyle(0x6666);
_rectangle(_GB,xx+12,yy+130,xx+145,yy+158);
_setlinestyle(0xffff);
for(i=0;i<7;i++){
_rectangle(_GB,xx+12+19*i,yy+158,xx+31+19*i,yy+172);
}
yy_b=yy+159;
xx_b=xx+31; _rectangle(_GF,xx_b-6,yy_b,xx_b+6,yy_b+7);
xx_b=xx+50; _rectangle(_GF,xx_b-6,yy_b,xx_b+6,yy_b+7);
xx_b=xx+88; _rectangle(_GF,xx_b-6,yy_b,xx_b+6,yy_b+7);
xx_b=xx+107; _rectangle(_GF,xx_b-6,yy_b,xx_b+6,yy_b+7);
xx_b=xx+126; _rectangle(_GF,xx_b-6,yy_b,xx_b+6,yy_b+7);
yy_b=yy+156;
_rectangle(_GB,xx+20,yy_b,xx+23,yy_b-filter[y][0]);
_rectangle(_GF,xx+29,yy_b,xx+33,yy_b-filter[y][1]);
_rectangle(_GB,xx+39,yy_b,xx+42,yy_b-filter[y][2]);
_rectangle(_GF,xx+48,yy_b,xx+52,yy_b-filter[y][3]);
_rectangle(_GB,xx+58,yy_b,xx+61,yy_b-filter[y][4]);
_rectangle(_GB,xx+77,yy_b,xx+80,yy_b-filter[y][5]);
_rectangle(_GF,xx+86,yy_b,xx+90,yy_b-filter[y][6]);
_rectangle(_GB,xx+96,yy_b,xx+99,yy_b-filter[y][7]);
_rectangle(_GF,xx+105,yy_b,xx+109,yy_b-filter[y][8]);
_rectangle(_GB,xx+115,yy_b,xx+118,yy_b-filter[y][9]);
_rectangle(_GF,xx+124,yy_b,xx+128,yy_b-filter[y][10]);
_rectangle(_GB,xx+134,yy_b,xx+137,yy_b-filter[y][11]);
mouse(1);
}
else if(mode==3){
_settextposition(yt+7,xt);
printf(" low=%03d high=%03d",range[0][y],range[1][y]);
}
else if(mode==4){
_settextposition(yt+6,xt);
printf(" dly=%03d stp=%03d",tim[0][y],tim[1][y]);
}
else if(mode==5){
_settextposition(yt+5,xt);
printf(" dwn=%03d prg=%03d",down[y],program[y]);
if(midi==0){
put_data(0xc0+midich[y]); put_data(program[y]);
}
}
else if(mode==6){
_settextposition(yt+3,xt);
printf(" myu=%f <%d>",myu[y],shift[y]+1);
}
else if(mode==7){
_settextposition(yt+1,xt);
printf(" note=%03d vel=%03d",note[y],velocity[y]);
}
else if(mode==8){
_settextposition(yt+4,xt);
printf(" pp1=%03d pp2=%03d",para1[y],para2[y]);
}
if((mode==2)||(mode==3)){
sum[y]=0; j=0;
for(i=range[0][y];i<range[1][y]+1;i++){
k=filter[y][i%12]; sum[y]=sum[y]+k;
for(l=0;l<k;l++) ref_table[y][j++]=i;
}
}
}
channel_trigger(off,m_m)
int off,m_m;
{
int of,y,x;
if(m_m==0) return(0);
if((moux>0)&&(moux<159)) of=0;
else if((moux>160)&&(moux<319)) of=1;
else if((moux>320)&&(moux<479)) of=2;
else if((moux>480)&&(moux<639)) of=3;
else return(0);
y=off+of;
phase[y]=1;
if(volume[y]!=0) velocity[y]=0x7f;
}
volume_change(off,m_m)
int off,m_m;
{
int of,y,x;
if(m_m==0) return(0);
if((moux>7)&&(moux<152)) { of=0; x=8; }
else if((moux>167)&&(moux<312)) { of=1; x=168; }
else if((moux>327)&&(moux<472)) { of=2; x=328; }
else if((moux>487)&&(moux<632)) { of=3; x=488; }
else return(0);
y=off+of;
volume[y]=(moux-x)*127/143;
point_screen(1,y,0); /* Volume */
}
range_change(off,md)
int off,md;
{
int of,y,z;
if((moux>15)&&(moux<71)) { of=0; z=0; }
else if((moux>80)&&(moux<143)) { of=0; z=1; }
else if((moux>175)&&(moux<231)) { of=1; z=0; }
else if((moux>240)&&(moux<303)) { of=1; z=1; }
else if((moux>335)&&(moux<391)) { of=2; z=0; }
else if((moux>400)&&(moux<463)) { of=2; z=1; }
else if((moux>495)&&(moux<551)) { of=3; z=0; }
else if((moux>560)&&(moux<623)) { of=3; z=1; }
else return(0);
y=off+of;
if((z==0)&&(md==0)){ if(range[0][y]>0) range[0][y]--; }
else if((z==0)&&(md==1)){ if(range[0][y]<127) range[0][y]++; }
else if((z==1)&&(md==0)){ if(range[1][y]>0) range[1][y]--; }
else if((z==1)&&(md==1)){ if(range[1][y]<127) range[1][y]++; }
point_screen(3,y,0); /* Range */
}
time_change(off,md)
int off,md;
{
int of,y,z;
if((moux>15)&&(moux<71)) { of=0; z=0; }
else if((moux>87)&&(moux<143)) { of=0; z=1; }
else if((moux>175)&&(moux<231)) { of=1; z=0; }
else if((moux>247)&&(moux<303)) { of=1; z=1; }
else if((moux>335)&&(moux<391)) { of=2; z=0; }
else if((moux>407)&&(moux<463)) { of=2; z=1; }
else if((moux>495)&&(moux<551)) { of=3; z=0; }
else if((moux>567)&&(moux<623)) { of=3; z=1; }
else return(0);
y=off+of;
if((z==0)&&(md==0)){ if(tim[0][y]>0) tim[0][y]--; }
else if((z==0)&&(md==1)){ if(tim[0][y]<127) tim[0][y]++; }
else if((z==1)&&(md==0)){ if(tim[1][y]>0) tim[1][y]--; }
else if((z==1)&&(md==1)){ if(tim[1][y]<127) tim[1][y]++; }
point_screen(4,y,0); /* Delay, Step */
}
dwn_prg_change(off,md)
int off,md;
{
int of,y,z;
if((moux>15)&&(moux<71)) { of=0; z=0; }
else if((moux>87)&&(moux<143)) { of=0; z=1; }
else if((moux>175)&&(moux<231)) { of=1; z=0; }
else if((moux>247)&&(moux<303)) { of=1; z=1; }
else if((moux>335)&&(moux<391)) { of=2; z=0; }
else if((moux>407)&&(moux<463)) { of=2; z=1; }
else if((moux>495)&&(moux<551)) { of=3; z=0; }
else if((moux>567)&&(moux<623)) { of=3; z=1; }
else return(0);
y=off+of;
if((z==0)&&(md==0)){ if(down[y]>0) down[y]--; }
else if((z==0)&&(md==1)){ if(down[y]<127) down[y]++; }
else if((z==1)&&(md==0)){ if(program[y]>0) program[y]--; }
else if((z==1)&&(md==1)){ if(program[y]<127) program[y]++; }
point_screen(5,y,0); /* Down, Program */
}
p1_p2_change(off,md)
int off,md;
{
int of,y,z;
if((moux>15)&&(moux<71)) { of=0; z=0; }
else if((moux>87)&&(moux<143)) { of=0; z=1; }
else if((moux>175)&&(moux<231)) { of=1; z=0; }
else if((moux>247)&&(moux<303)) { of=1; z=1; }
else if((moux>335)&&(moux<391)) { of=2; z=0; }
else if((moux>407)&&(moux<463)) { of=2; z=1; }
else if((moux>495)&&(moux<551)) { of=3; z=0; }
else if((moux>567)&&(moux<623)) { of=3; z=1; }
else return(0);
y=off+of;
if((z==0)&&(md==0)){ if(para1[y]>0) para1[y]--; }
else if((z==0)&&(md==1)){ if(para1[y]<127) para1[y]++; }
else if((z==1)&&(md==0)){ if(para2[y]>0) para2[y]--; }
else if((z==1)&&(md==1)){ if(para2[y]<127) para2[y]++; }
point_screen(8,y,0); /* Parameters */
}
volpan_change(off,md)
int off,md;
{
int of,y,z;
if((moux>15)&&(moux<71)) { of=0; z=0; }
else if((moux>87)&&(moux<143)) { of=0; z=1; }
else if((moux>175)&&(moux<231)) { of=1; z=0; }
else if((moux>247)&&(moux<303)) { of=1; z=1; }
else if((moux>335)&&(moux<391)) { of=2; z=0; }
else if((moux>407)&&(moux<463)) { of=2; z=1; }
else if((moux>495)&&(moux<551)) { of=3; z=0; }
else if((moux>567)&&(moux<623)) { of=3; z=1; }
else return(0);
y=off+of;
if((z==0)&&(md==0)){ if(volume[y]>0) volume[y]--; }
else if((z==0)&&(md==1)){ if(volume[y]<127) volume[y]++; }
else if((z==1)&&(md==0)){ if(panpot[y]>0) panpot[y]--; }
else if((z==1)&&(md==1)){ if(panpot[y]<127) panpot[y]++; }
point_screen(1,y,0); /* Volume, Panpot */
}
myu_change(off,md,m_m)
int off,md,m_m;
{
int of,y,z;
if((moux>15)&&(moux<111)) { of=0; z=0; }
else if((moux>120)&&(moux<142)) { of=0; z=1; }
else if((moux>175)&&(moux<271)) { of=1; z=0; }
else if((moux>280)&&(moux<302)) { of=1; z=1; }
else if((moux>335)&&(moux<431)) { of=2; z=0; }
else if((moux>440)&&(moux<462)) { of=2; z=1; }
else if((moux>495)&&(moux<591)) { of=3; z=0; }
else if((moux>600)&&(moux<622)) { of=3; z=1; }
else return(0);
y=off+of;
if((z==0)&&(md==0)){
if(shift[y]==0) myu[y]=myu[y]-0.1;
else if(shift[y]==1) myu[y]=myu[y]-0.01;
else if(shift[y]==2) myu[y]=myu[y]-0.001;
else if(shift[y]==3) myu[y]=myu[y]-0.0001;
else if(shift[y]==4) myu[y]=myu[y]-0.00001;
else if(shift[y]==5) myu[y]=myu[y]-0.000001;
if(myu[y]<1.0) myu[y]=1.0;
}
else if((z==0)&&(md==1)){
if(shift[y]==0) myu[y]=myu[y]+0.1;
else if(shift[y]==1) myu[y]=myu[y]+0.01;
else if(shift[y]==2) myu[y]=myu[y]+0.001;
else if(shift[y]==3) myu[y]=myu[y]+0.0001;
else if(shift[y]==4) myu[y]=myu[y]+0.00001;
else if(shift[y]==5) myu[y]=myu[y]+0.000001;
if(myu[y]>4.0) myu[y]=4.0;
}
else if((m_m!=0)&&(z==1)&&(md==0)){ if(shift[y]>0) shift[y]--; }
else if((m_m!=0)&&(z==1)&&(md==1)){ if(shift[y]<5) shift[y]++; }
point_screen(6,y,0); /* Myu, Shift */
}
map_change(off,md)
int off,md;
{
int f,of,y,z,xx,yy;
if(off==0) yy=mouy;
else yy=mouy-208;
if((moux>13)&&(moux<147)) { of=0; xx=moux; }
else if((moux>172)&&(moux<307)) { of=1; xx=moux-160; }
else if((moux>332)&&(moux<467)) { of=2; xx=moux-320; }
else if((moux>492)&&(moux<627)) { of=3; xx=moux-480; }
else return(0);
if((yy<168)&&(xx>25)&&(xx<38)) z=1;
else if((yy<168)&&(xx>44)&&(xx<58)) z=3;
else if((yy<168)&&(xx>82)&&(xx<96)) z=6;
else if((yy<168)&&(xx>101)&&(xx<115)) z=8;
else if((yy<168)&&(xx>120)&&(xx<134)) z=10;
else if(xx<32) z=0;
else if(xx<51) z=2;
else if(xx<70) z=4;
else if(xx<89) z=5;
else if(xx<108) z=7;
else if(xx<127) z=9;
else z=11;
y=off+of;
if(md==0){ if(filter[y][z]>0) filter[y][z]--; }
else { if(filter[y][z]<24) filter[y][z]++; }
point_screen(2,y,0); /* Note Map */
}
parameter_file_write(){
int i,j,k;
fds=fopen("chaosgen.dat","wb");
for(i=0;i<9;i++){
for(j=0;j<8;j++){
for(k=0;k<30;k++) fputc(data_buffer[k][j][i],fds);
fputc(0xff,fds);
fputc(0xff,fds);
}
}
fclose(fds);
}
parameter_file_read(){
int i,j,k;
if((fds=fopen("chaosgen.dat","rb"))==NULL){
for(i=0;i<9;i++){
for(j=0;j<8;j++){
data_buffer[0][j][i]=3; /* Myu over point */
data_buffer[1][j][i]=j; /* Myu (1) */
data_buffer[2][j][i]=j; /* Myu (2) */
data_buffer[3][j][i]=j; /* Myu (3) */
data_buffer[4][j][i]=j; /* Myu (4) */
data_buffer[5][j][i]=j; /* Myu (5) */
data_buffer[6][j][i]=j; /* Myu (6) */
data_buffer[7][j][i]=1; /* shift */
data_buffer[8][j][i]=1+2*j; /* down */
data_buffer[9][j][i]=2*j+1; /* program */
data_buffer[10][j][i]=64+2*j; /* volume */
data_buffer[11][j][i]=64; /* panpot */
data_buffer[12][j][i]=99; /* para(1) */
data_buffer[13][j][i]=99; /* para(2) */
data_buffer[14][j][i]=36-j; /* range[0] low */
data_buffer[15][j][i]=84+j; /* range[1] high */
data_buffer[16][j][i]=j; /* tim[0] Delay */
data_buffer[17][j][i]=1+j*2; /* tim[1] Step */
data_buffer[18][j][i]=12; /* filter[0] */
data_buffer[19][j][i]=12; /* filter[1] */
data_buffer[20][j][i]=12; /* filter[2] */
data_buffer[21][j][i]=12; /* filter[3] */
data_buffer[22][j][i]=12; /* filter[4] */
data_buffer[23][j][i]=12; /* filter[5] */
data_buffer[24][j][i]=12; /* filter[6] */
data_buffer[25][j][i]=12; /* filter[7] */
data_buffer[26][j][i]=12; /* filter[8] */
data_buffer[27][j][i]=12; /* filter[9] */
data_buffer[28][j][i]=12; /* filter[10] */
data_buffer[29][j][i]=12; /* filter[11] */
}
}
}
else{
for(i=0;i<9;i++){
for(j=0;j<8;j++){
for(k=0;k<30;k++){
data_buffer[k][j][i]=fgetc(fds);
}
fgetc(fds);
fgetc(fds);
}
}
fclose(fds);
}
}
screen_display(){
int i,j,k,m0,m1,m2,m3,m4,m5,m6;
i=section-1;
for(j=0;j<8;j++){
m0=data_buffer[0][j][i]; /* Myu over point */
m1=data_buffer[1][j][i]; /* Myu (1) */
m2=data_buffer[2][j][i]; /* Myu (2) */
m3=data_buffer[3][j][i]; /* Myu (3) */
m4=data_buffer[4][j][i]; /* Myu (4) */
m5=data_buffer[5][j][i]; /* Myu (5) */
m6=data_buffer[6][j][i]; /* Myu (6) */
myu[j]=(double)m0;
myu[j]=myu[j]+0.1*(double)m1;
myu[j]=myu[j]+0.01*(double)m2;
myu[j]=myu[j]+0.001*(double)m3;
myu[j]=myu[j]+0.0001*(double)m4;
myu[j]=myu[j]+0.00001*(double)m5;
myu[j]=myu[j]+0.000001*(double)m6;
shift[j]=data_buffer[7][j][i]; /* shift */
down[j]=data_buffer[8][j][i]; /* down */
program[j]=data_buffer[9][j][i]; /* program */
volume[j]=data_buffer[10][j][i]; /* volume */
panpot[j]=data_buffer[11][j][i]; /* panpot */
para1[j]=data_buffer[12][j][i]; /* para(1) */
para2[j]=data_buffer[13][j][i]; /* para(2) */
range[0][j]=data_buffer[14][j][i]; /* range[0] low */
range[1][j]=data_buffer[15][j][i]; /* range[1] high */
tim[0][j]=data_buffer[16][j][i]; /* tim[0] Delay */
tim[1][j]=data_buffer[17][j][i]; /* tim[1] Step */
for(k=0;k<12;k++){
filter[j][k]=data_buffer[18+k][j][i]; /* filter[k] */
}
}
for(i=0;i<8;i++){
point_screen(0,i,0); /* Whole Frame */
point_screen(7,i,0); /* Note, Velocity */
point_screen(6,i,0); /* Myu, Shift */
point_screen(8,i,0); /* Parameters */
point_screen(1,i,0); /* Volume, Panpot */
point_screen(5,i,0); /* Down, Program */
point_screen(4,i,0); /* Delay, Step */
point_screen(3,i,0); /* Range */
point_screen(2,i,0); /* Note Map */
}
_settextposition(12,1);
if(section==1) printf("【1】2 3 4 5 6 7 8 9 ");
else if(section==2) printf(" 1【2】3 4 5 6 7 8 9 ");
else if(section==3) printf(" 1 2【3】4 5 6 7 8 9 ");
else if(section==4) printf(" 1 2 3【4】5 6 7 8 9 ");
else if(section==5) printf(" 1 2 3 4【5】6 7 8 9 ");
else if(section==6) printf(" 1 2 3 4 5【6】7 8 9 ");
else if(section==7) printf(" 1 2 3 4 5 6【7】8 9 ");
else if(section==8) printf(" 1 2 3 4 5 6 7【8】9 ");
else if(section==9) printf(" 1 2 3 4 5 6 7 8【9】");
}
parameter_to_data_buffer(){
double myu_buff;
int i,j,k,m;
i=section-1;
for(j=0;j<8;j++){
myu_buff=myu[j];
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[0][j][i]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[1][j][i]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[2][j][i]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[3][j][i]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[4][j][i]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[5][j][i]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[6][j][i]=m;
data_buffer[7][j][i]=shift[j];
data_buffer[8][j][i]=down[j];
data_buffer[9][j][i]=program[j];
data_buffer[10][j][i]=volume[j];
data_buffer[11][j][i]=panpot[j];
data_buffer[12][j][i]=para1[j];
data_buffer[13][j][i]=para2[j];
data_buffer[14][j][i]=range[0][j];
data_buffer[15][j][i]=range[1][j];
data_buffer[16][j][i]=tim[0][j];
data_buffer[17][j][i]=tim[1][j];
for(k=0;k<12;k++){
data_buffer[18+k][j][i]=filter[j][k];
}
}
}
each_channel(ch)
int ch;
{
if(phase[ch]==0){ counter[ch]=0; }
else if(phase[ch]==1){ if(++counter[ch]>tim[0][ch]) phase[ch]=2; }
else if(phase[ch]==2){
phase[ch]=3; chaos[ch]=myu[ch]*chaos[ch]*(1.0-chaos[ch]);
note[ch]=(int)ref_table[ch][(int)(sum[ch]*chaos[ch])];
put_data(0x90+midich[ch]); put_data(note[ch]);
put_data(0x7f); velocity[ch]=0x7f;
point_screen(7,ch,0); /* Note, Velocity */
}
else if(phase[ch]==3){
phase[ch]=4; put_data(0x80+midich[ch]);
put_data(note[ch]); put_data(0x00); counter[ch]=0;
}
else if(phase[ch]==4){ if(++counter[ch]>tim[1][ch]) phase[ch]=5; }
else if(phase[ch]==5){
velocity[ch]=velocity[ch]-down[ch];
if(velocity[ch]<1){ phase[ch]=0; return(0); }
phase[ch]=3; chaos[ch]=myu[ch]*chaos[ch]*(1.0-chaos[ch]);
note[ch]=(int)ref_table[ch][(int)(sum[ch]*chaos[ch])];
put_data(0x90+midich[ch]); put_data(note[ch]);
put_data(velocity[ch]);
point_screen(7,ch,0); /* Note, Velocity */
}
}
myu_decode(j)
int j;
{
double myu_buff;
int i,m;
i=section-1;
myu_buff=myu[j];
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[0][j][i]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[1][j][i]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[2][j][i]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[3][j][i]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[4][j][i]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[5][j][i]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[6][j][i]=m;
}
myu_encode(j)
int j;
{
int i,m0,m1,m2,m3,m4,m5,m6;
i=section-1;
m0=data_buffer[0][j][i]; /* Myu over point */
m1=data_buffer[1][j][i]; /* Myu (1) */
m2=data_buffer[2][j][i]; /* Myu (2) */
m3=data_buffer[3][j][i]; /* Myu (3) */
m4=data_buffer[4][j][i]; /* Myu (4) */
m5=data_buffer[5][j][i]; /* Myu (5) */
m6=data_buffer[6][j][i]; /* Myu (6) */
myu[j]=(double)m0;
myu[j]=myu[j]+0.1*(double)m1;
myu[j]=myu[j]+0.01*(double)m2;
myu[j]=myu[j]+0.001*(double)m3;
myu[j]=myu[j]+0.0001*(double)m4;
myu[j]=myu[j]+0.00001*(double)m5;
myu[j]=myu[j]+0.000001*(double)m6;
}
bar_display(d)
int d;
{
_settextposition(12,66);
printf(" ★");
if(d>127) char_disp(10);
else if(d>99) char_disp(1);
else char_disp(0);
d=d-100*(d/100);
char_disp(d/10);
char_disp(d%10);
printf("★ ");
}
char_disp(x)
int x;
{
if(x==0) printf("0");
else if(x==1) printf("1");
else if(x==2) printf("2");
else if(x==3) printf("3");
else if(x==4) printf("4");
else if(x==5) printf("5");
else if(x==6) printf("6");
else if(x==7) printf("7");
else if(x==8) printf("8");
else if(x==9) printf("9");
else printf("*");
}
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <malloc.h>
#include <conio.h>
#include <graph.h>
#include <fcntl.h>
#include <dos.h>
#include <math.h>
#include <time.h>
#pragma check_stack(off)
#pragma intrinsic(_disable,_enable)
#pragma function(inp,outp)
#define _GB 2
#define _GF 3
void interrupt far new_0a(void);
void (interrupt far *old_0a)(void);
union REGS inregs,outregs;
struct SREGS segregs;
int moux,mouy,right,left,old_l,old_r,old_x,old_y;
time_t ltime;
FILE *fds,*fdo;
char far wind[14000];
long vsync_counter;
double myu[8],chaos[8];
unsigned char ref_table[8][3200],midi_fifo[3][10000];
int volume[8],filter[8][12],midich[8],shift[8],range[2][8],tim[2][8],sum[8];
int down[8],program[8],para1[8],note[8],velocity[8],phase[8],counter[8];
int pad_assign[3][8],pad_mark[8],pad_para[8],cond_pad[32];
int on_off[8],data_buffer[30][8],fifo_pointer,read_pointer;
int ch,dh,scene,ch_trig,edit_ch,debug;
int drums[12]={ 43,41,50,45,48,38,46,44,42,52,49,55 };
int pad_note[8]={ 40,43,47,50,38,42,45,49 };
int pad_cg[8]={ 1,3,5,7,0,2,4,6 };
mouse(flag) int flag; {
if(flag==0){inregs.x.ax=2;} else if(flag==1){inregs.x.ax=1;}
int86(51,&inregs,&outregs); }
getmouse(right,left,x,y) int *right,*left,*x,*y; { inregs.x.ax=3;
int86(51,&inregs,&outregs); *right=outregs.x.bx;
*left=outregs.x.ax; *x=outregs.x.cx; *y=outregs.x.dx; }
setmouse(x,y) int x,y; { inregs.x.ax=4; inregs.x.cx=x; inregs.x.dx=y;
int86(51,&inregs,&outregs); }
m_style(x,y,buf) int x,y; char *buf; { inregs.x.ax=9; inregs.x.bx=x;
inregs.x.cx=y; segread(&segregs); segregs.es=segregs.ds;
inregs.x.dx=(int)buf; int86x(51,&inregs,&outregs,&segregs); }
m_view(xmin,ymin,xmax,ymax) int xmin,ymin,xmax,ymax; { inregs.x.ax=16;
inregs.x.cx=xmin; inregs.x.dx=xmax; int86(51,&inregs,&outregs);
inregs.x.ax=17; inregs.x.cx=ymin; inregs.x.dx=ymax;
int86(51,&inregs,&outregs); }
m_color(color) int color; {
inregs.x.ax=18; inregs.x.bx=color; int86(51,&inregs,&outregs); }
symbol(x,y,color,str,skip) int x,y,color,skip; unsigned char str[80]; {
int i=0; _setcolor(color);
while(str[i]!=0){ _gputchar(x,y,str[i++],_GXOR); x += skip; } }
int style[]={ 0,0,0,0,0,0,0,0,0x0070,0x0e88,0x1184,0x2142,0x2221,0x9210,
0xe107,0x1108,0x1108,0xe107,0x1108,0x1108,0xe107,0x4108,0x4208,
0xfc07,0,0,0,0,0,0,0,0 };
put_command(x) int x; { while((inp(0xe0d2)&0x40)!=0){} outp(0xe0d2,x); }
put_data(x) int x; { while((inp(0xe0d2)&0x40)!=0){} outp(0xe0d0,x); }
get_data(){ while((inp(0xe0d2)&0x80)!=0){} return(inp(0xe0d0)); }
set_command(x) int x; { put_command(x); while(get_data()!=0xfe){} }
msb98_check(){ int i,j; for(i=0;i<100;i++) inp(0xe0d0);
j=0; for(i=0;i<10000;i++){ if((inp(0xe0d2)&0x40)==0) j=1; }
if(j==0) return(-1);
outp(0xe0d2,0xff);
j=0; for(i=0;i<32000;i++){ if((inp(0xe0d2)&0x80)==0) j=1; }
if(j==0) return(-1);
if(inp(0xe0d0)!=0xfe) return(-1);
set_command(0xff); set_command(0xac); i=get_data();
if(i!=0x15) return(-1);
set_command(0xf0); set_command(0xac); i=get_data();
if(i!=0x28) return(-1);
set_command(0xff);
if(debug==0){ set_command(0xf0); set_command(0xfd); }
set_command(0x3f);
for(i=0;i<4096;i++){ for(j=0;j<200;j++){} inp(0xe0d0); }
return(0); }
vsync_int_start(){ if(old_0a!=NULL) return;
old_0a=_dos_getvect(0x0a); _dos_setvect(0x0a,new_0a);
outp(0x64,0); _disable(); outp(0x02,inp(0x02)&0xfb); _enable();
signal(SIGINT,SIG_IGN); }
vsync_int_stop(){ if(old_0a==NULL) return;
_disable(); outp(0x02,inp(0x02)|0x04); _enable();
_dos_setvect(0x0a,old_0a); old_0a=NULL; signal(SIGINT,SIG_DFL); }
void interrupt far new_0a(){ outp(0x64,0);
vsync_counter++; _disable(); _chain_intr(old_0a); }
main(){
int i,j,d,y,z,m_ctr,rsb,dcb,keyno,m_m,m_stat=0;
int job_fg[8],job_ct=0,run_flag=0,bar_disp=0;
debug=0; /********** [0]=Normal, [1]=Debug ****************/
inregs.x.ax=0; int86(51,&inregs,&outregs);
if(outregs.x.ax==0){printf("\nPlease install mouse.sys !\n");exit(0);}
m_style(0,8,style); m_color(1); m_view(0,0,639,399); setmouse(580,65);
if(msb98_check()==-1){
printf("\n\n\n\n\n\t\t\t[MSB-98] is not found !\n\n");
while(1){ if(kbhit()!=0) break; }
exit(0);
}
for(d=0;d<8;d++){
midich[d]=d; velocity[d]=0; chaos[d]=0.5; phase[d]=0;
counter[d]=0; job_fg[d]=0; on_off[d]=0; pad_mark[d]=0;
pad_para[d]=0; cond_pad[d]=0;
}
_setvideomode(_98RESS16COLOR); _displaycursor(_GCURSOROFF);
_clearscreen(_GCLEARSCREEN);
time(<ime); srand((int)ltime);
parameter_file_read(); screen_display(); pad_assign_display(0);
edit_ch=0; scene=1; scene_display(); bar_display(0);
put_data(0xaf); put_data(98); put_data(11);
if(debug!=0){
_settextposition(4,59); printf("### Debug Mode ###");
put_data(0xcc); put_data(23); put_data(0xcd); put_data(51);
}
fifo_pointer=0; read_pointer=0;
mouse(1); getmouse(&old_r,&old_l,&old_x,&old_y);
vsync_counter=0; vsync_int_start();
while(1){
if(vsync_counter!=0){
vsync_counter=0; m_ctr++;
if(run_flag!=2) put_data(0xf8);
for(i=0;i<8;i++) job_fg[i]=1;
}
if((inp(0xe0d2)&0x80)==0){
d=inp(0xe0d0);
if(d>0xef){}
else if(d>0x7f){ rsb=d; dcb=0; }
else if(rsb==0x9f){
if(dcb==0){ keyno=d; dcb=1; }
else{
dcb=0;
if(d!=0){
midi_display(rsb,keyno,d,0);
pad_event(keyno,d);
}
}
}
else if(rsb==0xaf){
if(dcb==0){ keyno=d; dcb=1; }
else{
dcb=0;
if(scene!=5){
midi_display(rsb,keyno,d,0);
}
if(keyno==60){
if((d>0)&&(d<10)){
scene=d;
scene_display();
}
}
else if(keyno==61){
if((d>0)&&(d<9)){
if(volume[d-1]!=0){
dh=d-1; chaos_off();
phase[dh]=1;
}
}
}
else if(keyno==62) edit_ch=d;
else if((keyno>62)&&(keyno<93)){
edit_midi_rx(keyno,d);
}
else if(keyno==93){
run_flag=2; window_draw(1);
}
else if(keyno==94){
if(d==0) run_flag=0;
else run_flag=3;
ch_trig=1;
}
else if(keyno==95){
if(d==0) bar_disp=0;
else{
bar_disp=d;
bar_display(d);
}
}
else if((keyno>102)&&(keyno<127)){
edit_midi_rx(keyno,d);
}
}
}
else if(rsb==0xbf){
if(dcb==0){ keyno=d; dcb=1; }
else{
dcb=0; midi_display(rsb,keyno,d,0);
if((keyno==0x7f)&&(d==0)){
run_flag=1; window_draw(1);
}
}
}
else if((rsb==0xcf)||(rsb==0xdf)){
if((scene<4)||(scene>5)){
midi_display(rsb,d,0,0);
}
if((run_flag==1)&&((d==0x7f)||(d==0))){
put_data(0xfa); run_flag=0;
window_draw(0);
}
else if((run_flag==2)&&((d==0x7f)||(d==0))){
run_flag=0; window_draw(0);
}
else if((run_flag==3)&&((d==0x7f)||(d==0))){
d=ch_trig;
if(++ch_trig>4) ch_trig=1;
if(volume[d]!=0) phase[d]=1;
}
else joy_to_grain(rsb,d);
}
else if((rsb>0xbf)&&(rsb<0xc8)){
y=rsb-0xc0; program[y]=d; point_screen(5,y,1);
}
else if((rsb>0xaf)&&(rsb<0xb8)){
if(dcb==0){ keyno=d; dcb=1; }
else{
dcb=0; midi_display(rsb,keyno,d,0);
if(keyno==7){
y=rsb-0xb0; volume[y]=d;
point_screen(1,y,1);
}
}
}
}
else if(job_fg[job_ct]!=0){
ch=job_ct; each_channel();
job_fg[job_ct]=0; job_ct=(job_ct+1)&0x07;
}
else if(kbhit()!=0){
d=getch();
if(d==0x1b) break;
else if((d==0x20)||(d==0x0d)){
if(run_flag==1){
put_data(0xfa); run_flag=0;
window_draw(0);
}
else if(run_flag==2){
run_flag=0; window_draw(0);
}
else{
for(i=0;i<8;i++){
dh=i; chaos_off();
phase[dh]=0; velocity[dh]=0;
}
}
}
else if((d>0x30)&&(d<0x39)){
d=d-0x31;
if(volume[d]!=0){
dh=d; chaos_off(); phase[dh]=1;
}
else{
dh=d; chaos_off(); phase[dh]=0;
velocity[dh]=0;
}
}
else if((d=='i')||(d=='I')){
parameters_initial();
screen_display(); pad_assign_display(0);
}
else if((d=='m')||(d=='M')){
for(i=0;i<8;i++){
dh=i; chaos_off();
phase[dh]=0; velocity[dh]=0;
}
}
else if((d=='b')||(d=='B')){
put_data(0xaf); put_data(98); put_data(11);
}
}
else{
getmouse(&right,&left,&moux,&mouy);
if((right==0)&&(left==0)) m_stat=0;
else if((old_l==0)&&(left!=0)){
m_stat=1; m_ctr=0; m_m=1;
}
else if((old_r==0)&&(right!=0)){
m_stat=2; m_ctr=0; m_m=1;
}
else if(left!=0){
if(m_ctr>10){ m_stat=1; m_ctr=0; m_m=0; }
}
else if(right!=0){
if(m_ctr>10){ m_stat=2; m_ctr=0; m_m=0;}
}
if(m_stat==1){ m_stat=0; m_stat_1(m_m); }
else if(m_stat==2){ m_stat=0; m_stat_2(m_m); }
else{
_settextposition(6,67);
printf("(X=%03d,Y=%03d)",moux,mouy);
}
old_r=right; old_l=left; old_x=moux; old_y=mouy;
pad_mark_display();
midi_display(0,0,0,1);
}
}
vsync_int_stop(); mouse(0);
for(i=0;i<8;i++){
put_data(0x80+midich[i]); put_data(note[i]); put_data(0);
}
put_data(0xfc);
for(i=0;i<16;i++){ put_data(0xb0+i); put_data(0x7f); put_data(0); }
put_command(0xff);
parameter_file_write();
for(i=0;i<4096;i++){ for(j=0;j<200;j++){} inp(0xe0d0); }
_clearscreen(_GCLEARSCREEN); _displaycursor(_GCURSORON);
_setvideomode (_DEFAULTMODE);
}
m_stat_1(m_m)
int m_m;
{
if((mouy>240)&&(mouy<253)) volume_change(0,m_m);
else if((mouy>384)&&(mouy<397)) volume_change(4,m_m);
else if((mouy>178)&&(mouy<192)) range_change(0,0);
else if((mouy>322)&&(mouy<336)) range_change(4,0);
else if((mouy>162)&&(mouy<176)) time_change(0,0);
else if((mouy>306)&&(mouy<320)) time_change(4,0);
else if((mouy>146)&&(mouy<160)) dwn_prg_change(0,0);
else if((mouy>290)&&(mouy<304)) dwn_prg_change(4,0);
else if((mouy>114)&&(mouy<128)) myu_change(0,0,m_m);
else if((mouy>258)&&(mouy<272)) myu_change(4,0,m_m);
else if((mouy>222)&&(mouy<238)) map_change(0,0);
else if((mouy>366)&&(mouy<382)) map_change(4,0);
else if((mouy>130)&&(mouy<144)) p1_p2_change(0,0);
else if((mouy>274)&&(mouy<288)) p1_p2_change(4,0);
else if((mouy>29)&&(mouy<51)) pad_change(0,0);
else if((mouy>61)&&(mouy<83)) pad_change(4,0);
}
m_stat_2(m_m)
int m_m;
{
if((mouy>240)&&(mouy<253)) volume_change(0,m_m);
else if((mouy>384)&&(mouy<397)) volume_change(4,m_m);
else if((mouy>178)&&(mouy<192)) range_change(0,1);
else if((mouy>322)&&(mouy<336)) range_change(4,1);
else if((mouy>162)&&(mouy<176)) time_change(0,1);
else if((mouy>306)&&(mouy<320)) time_change(4,1);
else if((mouy>146)&&(mouy<160)) dwn_prg_change(0,1);
else if((mouy>290)&&(mouy<304)) dwn_prg_change(4,1);
else if((mouy>114)&&(mouy<128)) myu_change(0,1,m_m);
else if((mouy>258)&&(mouy<272)) myu_change(4,1,m_m);
else if((mouy>222)&&(mouy<238)) map_change(0,1);
else if((mouy>366)&&(mouy<382)) map_change(4,1);
else if((mouy>130)&&(mouy<144)) p1_p2_change(0,1);
else if((mouy>274)&&(mouy<288)) p1_p2_change(4,1);
else if((mouy>29)&&(mouy<51)) pad_change(0,1);
else if((mouy>61)&&(mouy<83)) pad_change(4,1);
}
point_screen(mode,y,midi)
int mode,y,midi;
{
int i,j,k,l,xx,yy,xt,yt,xx_b,yy_b;
char ss[4];
xt=1+(y%4)*20; yt=4+(y/4)*9; xx=1+(y%4)*160; yy=65+(y/4)*144;
if(mode==1){
mouse(0); _setlinestyle(0xffff); _setcolor(0);
_rectangle(_GF,xx+1,yy+173,xx+156,yy+189); _setcolor(7);
xx_b=xx+6+(volume[y]/2)*143/64; yy_b=yy+176;
_moveto(xx+7,yy_b+5); _lineto(xx+150,yy_b+5);
_moveto(xx+7,yy_b+6); _lineto(xx+150,yy_b+6);
i=0; _moveto(xx+7+11*i,yy_b+2); _lineto(xx+7+11*i,yy_b+9);
i=13; _moveto(xx+7+11*i,yy_b+2); _lineto(xx+7+11*i,yy_b+9);
for(i=1;i<13;i++){
_moveto(xx+7+11*i,yy_b+3); _lineto(xx+7+11*i,yy_b+8);
}
_rectangle(_GF,xx_b,yy_b,xx_b+5,yy_b+11); _setcolor(0);
_rectangle(_GF,xx_b+1,yy_b+1,xx_b+4,yy_b+10); _setcolor(7);
_rectangle(_GF,xx_b+2,yy_b+2,xx_b+3,yy_b+9);
if(midi==0){
if((scene>6)&&(y==6)) put_data(0xbb);
else put_data(0xb0+midich[y]);
put_data(0x07); put_data(volume[y]);
}
mouse(1);
}
else if(mode==2){
mouse(0); _setlinestyle(0xffff); _setcolor(0);
_rectangle(_GF,xx+13,yy+131,xx+144,yy+157); _setcolor(7);
_setlinestyle(0x6666);
_rectangle(_GB,xx+12,yy+130,xx+145,yy+158);
_setlinestyle(0xffff);
for(i=0;i<7;i++){
_rectangle(_GB,xx+12+19*i,yy+158,xx+31+19*i,yy+172);
}
yy_b=yy+159;
xx_b=xx+31; _rectangle(_GF,xx_b-6,yy_b,xx_b+6,yy_b+7);
xx_b=xx+50; _rectangle(_GF,xx_b-6,yy_b,xx_b+6,yy_b+7);
xx_b=xx+88; _rectangle(_GF,xx_b-6,yy_b,xx_b+6,yy_b+7);
xx_b=xx+107; _rectangle(_GF,xx_b-6,yy_b,xx_b+6,yy_b+7);
xx_b=xx+126; _rectangle(_GF,xx_b-6,yy_b,xx_b+6,yy_b+7);
yy_b=yy+156;
_rectangle(_GB,xx+20,yy_b,xx+23,yy_b-filter[y][0]);
_rectangle(_GF,xx+29,yy_b,xx+33,yy_b-filter[y][1]);
_rectangle(_GB,xx+39,yy_b,xx+42,yy_b-filter[y][2]);
_rectangle(_GF,xx+48,yy_b,xx+52,yy_b-filter[y][3]);
_rectangle(_GB,xx+58,yy_b,xx+61,yy_b-filter[y][4]);
_rectangle(_GB,xx+77,yy_b,xx+80,yy_b-filter[y][5]);
_rectangle(_GF,xx+86,yy_b,xx+90,yy_b-filter[y][6]);
_rectangle(_GB,xx+96,yy_b,xx+99,yy_b-filter[y][7]);
_rectangle(_GF,xx+105,yy_b,xx+109,yy_b-filter[y][8]);
_rectangle(_GB,xx+115,yy_b,xx+118,yy_b-filter[y][9]);
_rectangle(_GF,xx+124,yy_b,xx+128,yy_b-filter[y][10]);
_rectangle(_GB,xx+134,yy_b,xx+137,yy_b-filter[y][11]);
mouse(1);
}
else if((mode==3)&&(midi==0)){
_settextposition(yt+7,xt);
printf(" low=%03d high=%03d",range[0][y],range[1][y]);
}
else if(mode==4){
_settextposition(yt+6,xt);
printf(" dly=%03d stp=%03d",tim[0][y],tim[1][y]);
}
else if(mode==5){
_settextposition(yt+5,xt);
printf(" dwn=%03d prg=%03d",down[y],program[y]);
if(midi==0){
put_data(0xc0+midich[y]); put_data(program[y]);
}
}
else if(mode==6){
ss[0]='1'+y; ss[1]=0;
_settextposition(yt+3,xt);
printf(" [%s]=%f <%d>",ss,myu[y],shift[y]+1);
}
else if(mode==8){
_settextposition(yt+4,xt);
printf(" int=%03d vel=%03d",para1[y],velocity[y]);
}
else if(mode==0){
mouse(0); _setlinestyle(0xffff); _setcolor(0);
_rectangle(_GF,xx-1,yy+46,xx+158,yy+190); _setcolor(7);
_rectangle(_GB,xx-1,yy+46,xx+158,yy+190);
mouse(1);
}
if((mode==2)||(mode==3)){
sum[y]=0; j=0;
for(i=range[0][y];i<range[1][y]+1;i++){
k=filter[y][i%12]; sum[y]=sum[y]+k;
for(l=0;l<k;l++) ref_table[y][j++]=i;
}
}
}
volume_change(off,m_m)
int off,m_m;
{
int of,y,x;
if(m_m==0) return(0);
if((moux>7)&&(moux<152)) { of=0; x=8; }
else if((moux>167)&&(moux<312)) { of=1; x=168; }
else if((moux>327)&&(moux<472)) { of=2; x=328; }
else if((moux>487)&&(moux<632)) { of=3; x=488; }
else return(0);
y=off+of;
volume[y]=(moux-x)*127/143;
point_screen(1,y,0); /* Volume */
}
range_change(off,md)
int off,md;
{
int of,y,z;
if((moux>15)&&(moux<71)) { of=0; z=0; }
else if((moux>80)&&(moux<143)) { of=0; z=1; }
else if((moux>175)&&(moux<231)) { of=1; z=0; }
else if((moux>240)&&(moux<303)) { of=1; z=1; }
else if((moux>335)&&(moux<391)) { of=2; z=0; }
else if((moux>400)&&(moux<463)) { of=2; z=1; }
else if((moux>495)&&(moux<551)) { of=3; z=0; }
else if((moux>560)&&(moux<623)) { of=3; z=1; }
else return(0);
y=off+of;
if((z==0)&&(md==0)){ if(range[0][y]>0) range[0][y]--; }
else if((z==0)&&(md==1)){ if(range[0][y]<127) range[0][y]++; }
else if((z==1)&&(md==0)){ if(range[1][y]>0) range[1][y]--; }
else if((z==1)&&(md==1)){ if(range[1][y]<127) range[1][y]++; }
point_screen(3,y,0); /* Range */
}
time_change(off,md)
int off,md;
{
int of,y,z;
if((moux>15)&&(moux<71)) { of=0; z=0; }
else if((moux>87)&&(moux<143)) { of=0; z=1; }
else if((moux>175)&&(moux<231)) { of=1; z=0; }
else if((moux>247)&&(moux<303)) { of=1; z=1; }
else if((moux>335)&&(moux<391)) { of=2; z=0; }
else if((moux>407)&&(moux<463)) { of=2; z=1; }
else if((moux>495)&&(moux<551)) { of=3; z=0; }
else if((moux>567)&&(moux<623)) { of=3; z=1; }
else return(0);
y=off+of;
if((z==0)&&(md==0)){ if(tim[0][y]>0) tim[0][y]--; }
else if((z==0)&&(md==1)){ if(tim[0][y]<127) tim[0][y]++; }
else if((z==1)&&(md==0)){ if(tim[1][y]>0) tim[1][y]--; }
else if((z==1)&&(md==1)){ if(tim[1][y]<127) tim[1][y]++; }
point_screen(4,y,0); /* Delay, Step */
}
dwn_prg_change(off,md)
int off,md;
{
int of,y,z,zz;
if((moux>15)&&(moux<71)) { of=0; z=0; }
else if((moux>87)&&(moux<143)) { of=0; z=1; }
else if((moux>175)&&(moux<231)) { of=1; z=0; }
else if((moux>247)&&(moux<303)) { of=1; z=1; }
else if((moux>335)&&(moux<391)) { of=2; z=0; }
else if((moux>407)&&(moux<463)) { of=2; z=1; }
else if((moux>495)&&(moux<551)) { of=3; z=0; }
else if((moux>567)&&(moux<623)) { of=3; z=1; }
else return(0);
y=off+of;
if((z==0)&&(md==0)){ zz=1; if(down[y]>0) down[y]--; }
else if((z==0)&&(md==1)){ zz=1; if(down[y]<127) down[y]++; }
else if((z==1)&&(md==0)){ zz=0; if(program[y]>0) program[y]--; }
else if((z==1)&&(md==1)){ zz=0; if(program[y]<127) program[y]++; }
point_screen(5,y,zz); /* Down, Program */
}
p1_p2_change(off,md)
int off,md;
{
int of,y,z;
if((moux>15)&&(moux<71)) { of=0; z=0; }
else if((moux>175)&&(moux<231)) { of=1; z=0; }
else if((moux>335)&&(moux<391)) { of=2; z=0; }
else if((moux>495)&&(moux<551)) { of=3; z=0; }
else return(0);
y=off+of;
if((z==0)&&(md==0)){ if(para1[y]>0) para1[y]--; }
else if((z==0)&&(md==1)){ if(para1[y]<127) para1[y]++; }
point_screen(8,y,0); /* Parameters */
}
myu_change(off,md,m_m)
int off,md,m_m;
{
int of,y,z;
if((moux>15)&&(moux<111)) { of=0; z=0; }
else if((moux>120)&&(moux<142)) { of=0; z=1; }
else if((moux>175)&&(moux<271)) { of=1; z=0; }
else if((moux>280)&&(moux<302)) { of=1; z=1; }
else if((moux>335)&&(moux<431)) { of=2; z=0; }
else if((moux>440)&&(moux<462)) { of=2; z=1; }
else if((moux>495)&&(moux<591)) { of=3; z=0; }
else if((moux>600)&&(moux<622)) { of=3; z=1; }
else return(0);
y=off+of;
if((z==0)&&(md==0)){
if(shift[y]==0) myu[y]=myu[y]-0.1;
else if(shift[y]==1) myu[y]=myu[y]-0.01;
else if(shift[y]==2) myu[y]=myu[y]-0.001;
else if(shift[y]==3) myu[y]=myu[y]-0.0001;
else if(shift[y]==4) myu[y]=myu[y]-0.00001;
else if(shift[y]==5) myu[y]=myu[y]-0.000001;
if(myu[y]<1.0) myu[y]=1.0;
}
else if((z==0)&&(md==1)){
if(shift[y]==0) myu[y]=myu[y]+0.1;
else if(shift[y]==1) myu[y]=myu[y]+0.01;
else if(shift[y]==2) myu[y]=myu[y]+0.001;
else if(shift[y]==3) myu[y]=myu[y]+0.0001;
else if(shift[y]==4) myu[y]=myu[y]+0.00001;
else if(shift[y]==5) myu[y]=myu[y]+0.000001;
if(myu[y]>4.0) myu[y]=4.0;
}
else if((m_m!=0)&&(z==1)&&(md==0)){ if(shift[y]>0) shift[y]--; }
else if((m_m!=0)&&(z==1)&&(md==1)){ if(shift[y]<5) shift[y]++; }
point_screen(6,y,0); /* Myu, Shift */
}
map_change(off,md)
int off,md;
{
int f,of,y,z,xx,yy;
if(off==0) yy=mouy;
else yy=mouy-144;
if((moux>13)&&(moux<147)) { of=0; xx=moux; }
else if((moux>172)&&(moux<307)) { of=1; xx=moux-160; }
else if((moux>332)&&(moux<467)) { of=2; xx=moux-320; }
else if((moux>492)&&(moux<627)) { of=3; xx=moux-480; }
else return(0);
if((yy<232)&&(xx>25)&&(xx<38)) z=1;
else if((yy<232)&&(xx>44)&&(xx<58)) z=3;
else if((yy<232)&&(xx>82)&&(xx<96)) z=6;
else if((yy<232)&&(xx>101)&&(xx<115)) z=8;
else if((yy<232)&&(xx>120)&&(xx<134)) z=10;
else if(xx<32) z=0;
else if(xx<51) z=2;
else if(xx<70) z=4;
else if(xx<89) z=5;
else if(xx<108) z=7;
else if(xx<127) z=9;
else z=11;
y=off+of;
if(md==0){ if(filter[y][z]>0) filter[y][z]--; }
else { if(filter[y][z]<24) filter[y][z]++; }
point_screen(2,y,0); /* Note Map */
}
screen_display(){
int i,j,k,m0,m1,m2,m3,m4,m5,m6;
for(j=0;j<8;j++){
m0=data_buffer[0][j]; /* Myu over point */
m1=data_buffer[1][j]; /* Myu (1) */
m2=data_buffer[2][j]; /* Myu (2) */
m3=data_buffer[3][j]; /* Myu (3) */
m4=data_buffer[4][j]; /* Myu (4) */
m5=data_buffer[5][j]; /* Myu (5) */
m6=data_buffer[6][j]; /* Myu (6) */
myu[j]=(double)m0;
myu[j]=myu[j]+0.1*(double)m1;
myu[j]=myu[j]+0.01*(double)m2;
myu[j]=myu[j]+0.001*(double)m3;
myu[j]=myu[j]+0.0001*(double)m4;
myu[j]=myu[j]+0.00001*(double)m5;
myu[j]=myu[j]+0.000001*(double)m6;
shift[j]=data_buffer[7][j]; /* shift */
down[j]=data_buffer[8][j]; /* down */
program[j]=data_buffer[9][j]; /* program */
volume[j]=data_buffer[10][j]; /* volume */
para1[j]=data_buffer[12][j]; /* para(1) */
range[0][j]=data_buffer[14][j]; /* range[0] low */
range[1][j]=data_buffer[15][j]; /* range[1] high */
tim[0][j]=data_buffer[16][j]; /* tim[0] Delay */
tim[1][j]=data_buffer[17][j]; /* tim[1] Step */
for(k=0;k<12;k++){
filter[j][k]=data_buffer[18+k][j]; /* filter[k] */
}
}
for(i=0;i<8;i++){
point_screen(0,i,0); /* Whole Frame */
point_screen(6,i,0); /* Myu, Shift */
point_screen(8,i,0); /* Parameters */
point_screen(1,i,0); /* Volume */
point_screen(5,i,0); /* Down, Program */
point_screen(4,i,0); /* Delay, Step */
point_screen(3,i,0); /* Range */
point_screen(2,i,0); /* Note Map */
}
}
scene_display(){
_settextposition(0,0);
if(scene==1) printf("【1】2 3 4 5 6 7 8 9 ");
else if(scene==2) printf(" 1【2】3 4 5 6 7 8 9 ");
else if(scene==3) printf(" 1 2【3】4 5 6 7 8 9 ");
else if(scene==4) printf(" 1 2 3【4】5 6 7 8 9 ");
else if(scene==5) printf(" 1 2 3 4【5】6 7 8 9 ");
else if(scene==6) printf(" 1 2 3 4 5【6】7 8 9 ");
else if(scene==7) printf(" 1 2 3 4 5 6【7】8 9 ");
else if(scene==8) printf(" 1 2 3 4 5 6 7【8】9 ");
else if(scene==9) printf(" 1 2 3 4 5 6 7 8【9】");
}
myu_decode(j)
int j;
{
double myu_buff;
int i,m;
myu_buff=myu[j];
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[0][j]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[1][j]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[2][j]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[3][j]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[4][j]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[5][j]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[6][j]=m;
}
myu_encode(j)
int j;
{
int i,m0,m1,m2,m3,m4,m5,m6;
m0=data_buffer[0][j]; /* Myu over point */
m1=data_buffer[1][j]; /* Myu (1) */
m2=data_buffer[2][j]; /* Myu (2) */
m3=data_buffer[3][j]; /* Myu (3) */
m4=data_buffer[4][j]; /* Myu (4) */
m5=data_buffer[5][j]; /* Myu (5) */
m6=data_buffer[6][j]; /* Myu (6) */
myu[j]=(double)m0;
myu[j]=myu[j]+0.1*(double)m1;
myu[j]=myu[j]+0.01*(double)m2;
myu[j]=myu[j]+0.001*(double)m3;
myu[j]=myu[j]+0.0001*(double)m4;
myu[j]=myu[j]+0.00001*(double)m5;
myu[j]=myu[j]+0.000001*(double)m6;
}
edit_midi_rx(sel,data)
int sel,data;
{
int i,j,k,m0,m1,m2,m3,m4,m5,m6;
if((sel>102)&&(sel<111)){
k=sel-103; pad_assign[0][k]=data;
pad_assign_display(1); return(0);
}
else if((sel>110)&&(sel<119)){
k=sel-111; pad_assign[1][k]=data;
pad_assign_display(1); return(0);
}
else if((sel>118)&&(sel<127)){
k=sel-119; pad_assign[2][k]=1+(data-1)%7;
pad_assign_display(1); return(0);
}
if((edit_ch<1)||(edit_ch>8)) return(0);
j=edit_ch-1;
if((sel>63)&&(sel<70)){
k=sel-63; myu_decode(j); data_buffer[k][j]=data;
myu_encode(j); point_screen(6,j,0); return(0);
}
else if((sel>80)&&(sel<93)){
k=sel-81; filter[j][k]=data;
point_screen(2,j,0); return(0);
}
switch(sel){
case (63):
myu_decode(j);
data_buffer[0][j]=data; /* Myu over point */
myu_encode(j);
point_screen(6,j,0); /* Myu, Shift */
break;
case (70):
shift[j]=data;
point_screen(6,j,0); /* Myu, Shift */
break;
case (71):
down[j]=data;
point_screen(5,j,0); /* Down, Program */
break;
case (72):
program[j]=data;
point_screen(5,j,0); /* Down, Program */
break;
case (73):
volume[j]=data;
point_screen(1,j,0); /* Volume */
break;
case (75):
para1[j]=data;
point_screen(8,j,0); /* Parameters */
break;
case (77):
range[0][j]=data;
point_screen(3,j,0); /* Range */
break;
case (78):
range[1][j]=data;
point_screen(3,j,0); /* Range */
break;
case (79):
tim[0][j]=data;
point_screen(4,j,0); /* Delay, Step */
break;
case (80):
tim[1][j]=data;
point_screen(4,j,0); /* Delay, Step */
break;
}
}
midi_display(status,keyno,data,u_d)
int status,keyno,data,u_d;
{
int j,fifo_buff;
if(u_d==0){
fifo_buff=fifo_pointer;
midi_fifo[0][fifo_pointer]=status;
midi_fifo[1][fifo_pointer]=keyno;
midi_fifo[2][fifo_pointer]=data;
fifo_pointer++;
if(fifo_pointer>9999) fifo_pointer=0;
if(fifo_pointer==read_pointer) fifo_pointer=fifo_buff;
return(0);
}
if(fifo_pointer==read_pointer) return(0);
status=midi_fifo[0][read_pointer];
keyno=midi_fifo[1][read_pointer];
data=midi_fifo[2][read_pointer];
read_pointer++;
if(read_pointer>9999) read_pointer=0;
if((status>0xaf)&&(status<0xb8)){
_settextposition(0,52);
printf("[%02X-%02X-%02X]",status,keyno,data); return(0);
}
switch(status){
case(0x9f):
_settextposition(0,30);
printf("[%02X-%02X-%02X]",status,keyno,data);
break;
case(0xaf):
_settextposition(0,41);
printf("[%02X-%02X-%02X]",status,keyno,data);
break;
case(0xbf):
_settextposition(0,52);
printf("[%02X-%02X-%02X]",status,keyno,data);
break;
case(0xcf):
_settextposition(0,63);
printf("[%02X-%02X]",status,keyno);
break;
case(0xdf):
_settextposition(0,71);
printf("[%02X-%02X]",status,keyno);
break;
}
}
window_draw(d)
int d;
{
int w1x=7,w1y=197,w2x=632,w2y=234;
if(d==0){
_settextposition(13,15);
printf(" ");
mouse(0);
_putimage(w1x,w1y,wind,_GPSET);
mouse(1);
return(0);
}
mouse(0);
_getimage(w1x,w1y,w2x,w2y,wind);
_setcolor(0); _rectangle(_GFILLINTERIOR,w1x,w1y,w2x,w2y);
_setcolor(7); _rectangle(_GFILLINTERIOR,w1x+4,w1y+4,w2x-4,w2y-4);
_setcolor(0); _rectangle(_GFILLINTERIOR,w1x+8,w1y+8,w2x-8,w2y-8);
_setcolor(7);
mouse(1);
_settextposition(13,15);
printf("System is waiting ... Plaese Cueing with JOY/KBD !!");
}
bar_display(d)
int d;
{
_settextposition(2,61); printf("★★ ");
if(d>127) char_disp(10);
else if(d>99) char_disp(1);
else char_disp(0);
d=d-100*(d/100); char_disp(d/10); char_disp(d%10); printf(" ★★");
}
char_disp(x)
int x;
{
if(x==0) printf("0");
else if(x==1) printf("1");
else if(x==2) printf("2");
else if(x==3) printf("3");
else if(x==4) printf("4");
else if(x==5) printf("5");
else if(x==6) printf("6");
else if(x==7) printf("7");
else if(x==8) printf("8");
else if(x==9) printf("9");
else printf("*");
}
parameter_file_write(){
double myu_buff;
int j,k,m;
for(j=0;j<8;j++){
myu_buff=myu[j];
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[0][j]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[1][j]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[2][j]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[3][j]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[4][j]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[5][j]=m;
m=(int)myu_buff; myu_buff=10.0*(myu_buff-(double)m);
data_buffer[6][j]=m;
data_buffer[7][j]=shift[j];
data_buffer[8][j]=down[j];
data_buffer[9][j]=program[j];
data_buffer[10][j]=volume[j];
data_buffer[12][j]=para1[j];
data_buffer[14][j]=range[0][j];
data_buffer[15][j]=range[1][j];
data_buffer[16][j]=tim[0][j];
data_buffer[17][j]=tim[1][j];
for(k=0;k<12;k++){
data_buffer[18+k][j]=filter[j][k];
}
}
fds=fopen("chaosgen.dat","wb");
for(j=0;j<8;j++){
for(k=0;k<30;k++) fputc(data_buffer[k][j],fds);
fputc(0xff,fds); fputc(0xff,fds);
}
for(j=0;j<8;j++){
for(k=0;k<3;k++) fputc(pad_assign[k][j],fds);
fputc(0xff,fds);
}
fclose(fds);
}
parameters_initial(){
int j,k;
for(j=0;j<8;j++){
data_buffer[0][j]=3;
for(k=1;k<13;k++) data_buffer[k][j]=0;
data_buffer[14][j]=40; /* range[0] low */
data_buffer[15][j]=80; /* range[1] high */
data_buffer[16][j]=0; /* tim[0] Delay */
for(k=17;k<30;k++) data_buffer[k][j]=10;
pad_assign[0][j]=0x20;
pad_assign[1][j]=0x20;
pad_assign[2][j]=0;
}
}
parameter_file_read(){
int j,k;
if((fds=fopen("chaosgen.dat","rb"))==NULL) parameters_initial();
else{
for(j=0;j<8;j++){
for(k=0;k<30;k++) data_buffer[k][j]=fgetc(fds);
fgetc(fds); fgetc(fds);
}
for(j=0;j<8;j++){
for(k=0;k<3;k++) pad_assign[k][j]=fgetc(fds);
fgetc(fds);
}
fclose(fds);
}
}
chaos_on(){
double mpy;
chaos[dh]=myu[dh]*chaos[dh]*(1.0-chaos[dh]);
mpy=(double)sum[dh]*chaos[dh]; note[dh]=(int)ref_table[dh][(int)mpy];
if((scene>6)&&(dh==6)){
note[dh]=drums[note[dh]%12]; put_data(0x9b);
}
else put_data(0x90+midich[dh]);
put_data(note[dh]); put_data(velocity[dh]);
point_screen(8,dh,0); on_off[dh]=1;
}
chaos_off(){
if(on_off[dh]==1){
if((scene>6)&&(dh==6)) put_data(0x8b);
else put_data(0x80+midich[dh]);
put_data(note[dh]); put_data(0x00); on_off[dh]=0;
}
}
each_channel(){
int z;
dh=ch;
if(phase[ch]==0){ counter[ch]=0; }
else if(phase[ch]==1){
if(++counter[ch]>tim[0][ch]){
z=40+(rand()%20); chaos[ch]=(double)z/100.0;
phase[ch]=2;
}
}
else if(phase[ch]==2){ velocity[ch]=0x7f; chaos_on(); phase[ch]=3; }
else if(phase[ch]==3){ counter[ch]=0; chaos_off(); phase[ch]=4; }
else if(phase[ch]==4){ if(++counter[ch]>tim[1][ch]) phase[ch]=5; }
else if(phase[ch]==5){
if((rand()%127)>(127-para1[ch])){
counter[ch]=0; phase[ch]=4; return(0);
}
velocity[ch]=velocity[ch]-down[ch];
if(velocity[ch]<1){ velocity[ch]=0; phase[ch]=0; }
else { chaos_on(); phase[ch]=3; }
}
}
pad_change(off,md)
int off,md;
{
int of,y,z;
if((moux>18)&&(moux<44)) { of=0; z=0; }
else if((moux>50)&&(moux<76)) { of=1; z=0; }
else if((moux>82)&&(moux<108)) { of=2; z=0; }
else if((moux>114)&&(moux<140)) { of=3; z=0; }
else if((moux>170)&&(moux<196)) { of=0; z=1; }
else if((moux>202)&&(moux<228)) { of=1; z=1; }
else if((moux>234)&&(moux<260)) { of=2; z=1; }
else if((moux>266)&&(moux<292)) { of=3; z=1; }
else if((moux>322)&&(moux<347)) { of=0; z=2; }
else if((moux>354)&&(moux<379)) { of=1; z=2; }
else if((moux>386)&&(moux<411)) { of=2; z=2; }
else if((moux>418)&&(moux<443)) { of=3; z=2; }
else return(0);
y=off+of;
if(z==2){
if(md==0){ if(pad_assign[z][y]>0) pad_assign[z][y]--; }
else if(md==1){ if(pad_assign[z][y]<8) pad_assign[z][y]++; }
}
else{
if(md==0){ if(pad_assign[z][y]>0) pad_assign[z][y]--; }
else if(md==1){ if(pad_assign[z][y]<127) pad_assign[z][y]++; }
}
pad_assign_display(1);
if(debug!=0){
if((z==0)&&(y==0)) cg_debug(0);
else if((z==0)&&(y==4)) cg_debug(0);
else if((z==1)&&(y==0)) cg_debug(1);
else if((z==1)&&(y==4)) cg_debug(1);
}
}
pad_assign_display(mode)
int mode;
{
int i,j,xx,yy,k=0;
for(j=0;j<3;j++){
if(j==2) k=1;
if(mode==0){
mouse(0); _setlinestyle(0xffff); _setcolor(7);
_rectangle(_GB,13+152*j,24,145+152*j-k,88);
for(i=0;i<8;i++){
xx=32*(i%4)+18+152*j; yy=32*(i/4)+29;
_rectangle(_GB,xx,yy,xx+26-k,yy+22);
}
mouse(1);
}
for(i=0;i<8;i++){
_settextposition(2*(i/4)+2,4*(i%4)+3+19*j);
if(j==2) char_disp(pad_assign[j][i]);
else printf("%02X",pad_assign[j][i]);
}
}
}
pad_paint(no,mode)
int no,mode;
{
int j,xx,yy,k=0;
for(j=0;j<3;j++){
if(j==2) k=1;
xx=32*(no%4)+18+152*j; yy=32*(no/4)+29;
mouse(0); _setlinestyle(0xffff);
if(mode==0){
_setcolor(0); _rectangle(_GF,xx,yy,xx+26-k,yy+22);
_setcolor(7); _rectangle(_GB,xx,yy,xx+26-k,yy+22);
}
else if(mode==1){
_setcolor(7); _rectangle(_GF,xx,yy,xx+26-k,yy+22);
}
mouse(1);
}
}
pad_mark_display(){
int i;
for(i=0;i<8;i++){
if(pad_mark[i]!=0){
pad_mark[i]--;
if(pad_mark[i]==0) pad_paint(i,0);
}
}
}
pad_event(keyno,velo)
int keyno,velo;
{
int d,z,v,yura;
if((keyno>0x64)&&(keyno<0x6d)){
z=keyno-0x65;
pad_mark[z]=20; pad_paint(z,1);
if((scene<4)||(scene>5)){
put_data(0x99);
put_data(pad_assign[0][z]); put_data(velo);
put_data(0x9b);
put_data(pad_assign[1][z]); put_data(velo);
put_data(0x89);
put_data(pad_assign[0][z]); put_data(0);
put_data(0x8b);
put_data(pad_assign[1][z]); put_data(0);
}
if(pad_assign[2][z]!=0){
d=pad_assign[2][z]-1;
if(volume[d]!=0){ dh=d; chaos_off(); phase[dh]=1; }
else{ dh=d; chaos_off(); phase[dh]=0; velocity[dh]=0; }
}
if(scene==2){
if((keyno==0x65)||(keyno==0x68)){
put_data(0xaf); put_data(97);
pad_para[0]=(pad_para[0]+3)%5+1;
put_data(pad_para[0]);
}
}
else if((scene==4)||(scene==5)){
put_data(0x98); put_data(pad_note[z]); put_data(velo);
put_data(0x88); put_data(pad_note[z]); put_data(0);
put_data(0xaf); put_data(101);
put_data(0x40+8*pad_cg[z]);
if(keyno==0x68){
put_data(0xaf); put_data(97); put_data(26);
}
else if(keyno==0x66){
yura=rand()%100;
if(yura<33){
put_data(0xaf); put_data(97);
put_data(27);
}
}
}
else if(scene>6){
if(scene==7){
pad_para[1]=(pad_para[1]+3)%5+1;
if(keyno<0x69) d=pad_para[1]+5;
else d=pad_para[1]+10;
}
else if(scene==8){
pad_para[1]=(pad_para[1]+3)%5+1;
if(keyno<0x67) d=pad_para[1]+5;
else if(keyno<0x69) d=pad_para[1]+10;
else if(keyno<0x6b) d=pad_para[1]+15;
else d=pad_para[1]+20;
}
else{
pad_para[1]=(pad_para[1]+8)%25+1;
d=pad_para[1];
}
put_data(0xaf); put_data(97); put_data(d);
}
}
else if((keyno>0x22)&&(keyno<0x45)){
if(scene==3){
cond_pad[0]=(cond_pad[0]+1)%3;
if(cond_pad[0]==0){ z=54; v=112; }
else if(cond_pad[0]==1){ z=70; v=112; }
else { z=73; v=112; }
put_data(0x9b); put_data(z); put_data(v);
put_data(0x8b); put_data(z); put_data(0);
cond_pad[1]=(cond_pad[1]+53)%64;
put_data(0xaf); put_data(101); put_data(cond_pad[1]);
cond_pad[2]=(cond_pad[2]+1)%2; d=6+cond_pad[2];
if(volume[d]!=0){ dh=d; chaos_off(); phase[dh]=1; }
}
else if(scene>6){
cond_pad[3]=(cond_pad[3]+1)%2;
myu_decode(6); data_buffer[1][6]=5+3*cond_pad[3];
myu_encode(6); point_screen(6,6,0);
cond_pad[4]=(cond_pad[4]+1)%3;
d=scene-6+3*cond_pad[4];
put_data(0xaf); put_data(98); put_data(d);
d=3+2*cond_pad[3];
if(volume[d]!=0){ dh=d; chaos_off(); phase[dh]=1; }
}
}
}
cg_debug(mode)
int mode;
{
int aa,bb,cc;
aa=0x9c+mode; bb=pad_assign[mode][0]; cc=pad_assign[mode][4];
if(mode==0){
_settextposition(6,3);
printf("CG(1) Performer : %02X %02X %02X",aa,bb,cc);
}
else{
_settextposition(6,33);
printf("CG(2) Bars & Pipes : %02X %02X %02X",aa,bb,cc);
}
put_data(aa); put_data(bb); put_data(0x4c);
put_data(aa+0x50); put_data(00); put_data(cc);
}
joy_to_grain(rsb,data)
int rsb,data;
{
if(scene==4){
if((data%2)==0) return(0);
if(rsb==0xcf) range[1][1]=64+data/4;
else range[0][1]=58-(127-data)/5;
point_screen(3,1,1);
}
else if(scene==5){
if((data%3)!=0) return(0);
if(rsb==0xcf){
put_data(0xaf); put_data(19); put_data(data);
put_data(29); put_data(127-data);
}
else{
put_data(0xaf); put_data(14); put_data(data);
put_data(24); put_data(data);
}
}
}
#include <stdio.h>
#include <stdlib.h>
#include <graph.h>
#include <math.h>
int k[4],wave[4096],r_l,u_d,grow,dir;
double a[4],b[4],c[4],d[4];
main(){
int z,i;
double s,t,u,v,w,th;
display_setting(0);
for(i=0;i<4096;i++){
th=(double)i*3.1415926535/128.0;
s=sin(th*55.0)*0.1;
t=sin(th*36.0)*0.15;
u=sin(th*25.0)*0.2;
v=sin(th*13.0)*0.25;
w=sin(th*1.0)*1.0;
wave[i]=(int)(32767.9*(s+t+u+v+w)/2.0);
}
a[0]=0.5; b[0]=0.5; c[0]=0.5; d[0]=0.5; k[0]=3;
a[1]=0.5; b[1]=0.5; c[1]=0.5; d[1]=-0.5; k[1]=3;
a[2]=0.5; b[2]=0.5; c[2]=-0.5; d[2]=-0.5; k[2]=3;
a[3]=0.5; b[3]=-0.5; c[3]=-0.5; d[3]=-0.5; k[3]=3;
r_l=0; wave_display(0); keyboard(0);
for(i=0;i<4;i++){ u_d=i; wave_display(1); }
u_d=0; grow=1; dir=1;
while(1){
if(kbhit()!=0){
z=getch();
if(z==0x1b) break;
else keyboard(z);
}
else wave_display(1);
}
display_setting(1);
}
keyboard(data)
int data;
{
int i,j;
if(data==0x0b){ u_d=u_d-1; if(u_d<0) u_d=3; }
else if(data==0x0a){ u_d=u_d+1; if(u_d>3) u_d=0; }
else if(data==0x0c){ r_l=r_l+1; if(r_l>4) r_l=0; }
else if(data==0x08){ r_l=r_l-1; if(r_l<0) r_l=4; }
else if(data==0x20){ grow=(grow+1)&1; }
for(j=0;j<4;j++){
for(i=0;i<5;i++){
_settextposition(6+j*5,1+i*15); printf(" ");
}
}
_settextposition(6+u_d*5,1+r_l*15); printf("##");
if(data==0){
for(j=0;j<4;j++){
i=0; _settextposition(6+j*5,4+i*15);
printf(" ");
_settextposition(6+j*5,4+i*15);
printf("K=%d",k[j]);
i=1; _settextposition(6+j*5,4+i*15);
printf(" ");
_settextposition(6+j*5,4+i*15);
printf("a=%f",a[j]);
i=2; _settextposition(6+j*5,4+i*15);
printf(" ");
_settextposition(6+j*5,4+i*15);
printf("b=%f",b[j]);
i=3; _settextposition(6+j*5,4+i*15);
printf(" ");
_settextposition(6+j*5,4+i*15);
printf("c=%f",c[j]);
i=4; _settextposition(6+j*5,4+i*15);
printf(" ");
_settextposition(6+j*5,4+i*15);
printf("d=%f",d[j]);
}
}
else if((grow==1)&&(data==0x0d)){
j=u_d; i=r_l;
_settextposition(6+j*5,4+i*15);
printf(" ");
_settextposition(6+j*5,4+i*15);
if(i==0){
k[j]=k[j]+1; if(k[j]>128) k[j]=1;
printf("K=%d",k[j]);
}
else if(i==1){
a[j]=a[j]+0.1; if(a[j]>1.0) a[j]=-1.0;
printf("a=%f",a[j]);
}
else if(i==2){
b[j]=b[j]+0.1; if(b[j]>1.0) b[j]=-1.0;
printf("b=%f",b[j]);
}
else if(i==3){
c[j]=c[j]+0.1; if(c[j]>1.0) c[j]=-1.0;
printf("c=%f",c[j]);
}
else{
d[j]=d[j]+0.1; if(d[j]>1.0) d[j]=-1.0;
printf("d=%f",d[j]);
}
}
}
wave_display(mode)
int mode;
{
int v_point;
int i,j,l,x,y,ox,oy,p,q,r,s;
double e,f,g,h,u;
if(mode==0){
_clearscreen(_GCLEARTEXT); _clearscreen(_GCLEARSCREEN);
ox=0; oy=0; v_point=60;
for(i=0;i<512;i++){
x=i; y=wave[i]/656;
_moveto(ox+50,v_point-oy); _lineto(x+50,v_point-y);
ox=x; oy=y;
}
return(0);
}
if(grow==0){
j=u_d; i=r_l;
_settextposition(6+j*5,4+i*15);
printf(" ");
_settextposition(6+j*5,4+i*15);
if(i==0){
if(dir==1){ k[j]=k[j]+1; if(k[j]>127) dir=0; }
else{ k[j]=k[j]-1; if(k[j]<2) dir=1; }
printf("K=%d",k[j]);
}
else if(i==1){
if(dir==1){ a[j]=a[j]+0.1; if(a[j]>0.999) dir=0; }
else{ a[j]=a[j]-0.1; if(a[j]<-0.999) dir=1; }
printf("a=%f",a[j]);
}
else if(i==2){
if(dir==1){ b[j]=b[j]+0.1; if(b[j]>0.999) dir=0; }
else{ b[j]=b[j]-0.1; if(b[j]<-0.999) dir=1; }
printf("b=%f",b[j]);
}
else if(i==3){
if(dir==1){ c[j]=c[j]+0.1; if(c[j]>0.999) dir=0; }
else{ c[j]=c[j]-0.1; if(c[j]<-0.999) dir=1; }
printf("c=%f",c[j]);
}
else{
if(dir==1){ d[j]=d[j]+0.1; if(d[j]>0.999) dir=0; }
else{ d[j]=d[j]-0.1; if(d[j]<-0.999) dir=1; }
printf("d=%f",d[j]);
}
}
j=u_d; e=a[j]; f=b[j]; g=c[j]; h=d[j]; l=k[j];
ox=0; oy=0; v_point=140+j*70;
for(i=0;i<512;i++){
_setcolor(0);
_moveto(i+50,v_point-35); _lineto(i+50,v_point+35);
_setcolor(7);
p=wave[i]; q=wave[i+l]; r=wave[i+l*2]; s=wave[i+l*3];
u=e*(double)p+f*(double)q+g*(double)r+h*(double)s;
x=i; y=(int)(u/sqrt(e*e+f*f+g*g+h*h)/1312.0);
_moveto(ox+50,v_point-oy); _lineto(x+50,v_point-y);
ox=x; oy=y;
}
}
display_setting(x)
int x;
{
if(x==0){
_setvideomode(_98RESS16COLOR); _displaycursor(_GCURSOROFF);
_clearscreen(_GCLEARTEXT); _clearscreen(_GCLEARSCREEN);
}
else{
_clearscreen(_GCLEARSCREEN); _displaycursor(_GCURSORON);
_setvideomode (_DEFAULTMODE);
}
}
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <time.h>
#include <math.h>
#include <neuron.h>
#include <fcntl.h>
#include <graph.h>
#define INPUTUNIT 2
#define HIDDENUNIT 16
#define OUTPUTUNIT 2
#define BIASUNIT 1
#define ERROR -1
#define STATPT 0xe0d2
#define DATAPT 0xe0d0
#define DRR 0x0040
#define DSR 0x0080
#define PUT 8888
#define GET 9999
#define entry_table 0x0080
#define vector_offset_wave 1
#define vector_offset_w_block 2
#define vector_offset_user_com 10
#define vector_offset_w_bank 16
static union REGS inregs,outregs;
static struct SREGS segregs;
int moux,mouy,right,left,old_l,old_r,old_x,old_y;
double Eta=0.8,Alpha=0.7;
time_t ltime;
FILE *fds,*fdo;
double pattern[16][INPUTUNIT],teacher[16][OUTPUTUNIT],wc[512];
char dum[50],number[2],name[16];
int num,ww,wk,wt,kn[16],le[16],xp[16],yp[16];
unsigned char wb[512],wd[512];
unsigned char patch[577] = {
0x1C,0x66,0x29,0xEB,0xE1,0xFE,0x37,0x00,0xEB,0xE3,0xFE,0x37,
0x00,0xEB,0xE2,0xFE,0x37,0x00,0xEB,0xE4,0xFE,0x37,0x00,0x1C,
0xA4,0x41,0x1C,0x20,0x41,0xC8,0xF8,0x47,0x7F,0x77,0x7D,0xFE,
0xD6,0x39,0x00,0x70,0xF9,0x70,0xE2,0x28,0xEF,0x76,0x20,0x97,
0x7F,0xAC,0x80,0xC6,0x04,0x3F,0x7F,0x00,0x00,0xF8,0xAF,0xC6,
0x1F,0xF8,0x6F,0xF0,0xC7,0x0B,0xF8,0x6F,0xF8,0xFE,0xD6,0xFE,
0xDF,0x37,0x78,0x00,0x1E,0x20,0xF8,0x6C,0xF0,0xEF,0x78,0x20,
0x6C,0x0F,0x2F,0x77,0x37,0x7A,0x00,0x1E,0x27,0x78,0x6F,0x00,
0xFE,0xD6,0xEF,0x7A,0x6F,0x00,0xCE,0x0C,0x6F,0xC0,0xC6,0x0F,
0x6F,0xD0,0xC6,0x1F,0x37,0x7A,0x01,0x1E,0x37,0x7A,0x00,0x37,
0x78,0x00,0x1E,0xEF,0x77,0x6F,0x0F,0xFE,0xDE,0x3A,0x00,0x68,
0xE3,0xE1,0xFE,0x2E,0xF7,0x20,0xE3,0xE1,0xFE,0x87,0x1E,0xEF,
0x77,0x6F,0x0F,0xFE,0xDE,0x3A,0x00,0x6A,0xE3,0xE3,0xFE,0x2E,
0xF7,0x20,0xE3,0xE3,0xFE,0x87,0x1E,0xA8,0x62,0xCE,0x08,0xA9,
0x62,0xFE,0xD6,0xB1,0x62,0xC8,0x08,0xB0,0x62,0x1C,0x46,0x04,
0x1C,0xBB,0x41,0x27,0xF1,0x1E,0x27,0x5F,0x6C,0xF0,0xA7,0xA7,
0xA7,0x3A,0xC9,0x41,0xF3,0x4A,0xEA,0xC8,0x58,0x11,0x58,0x11,
0x58,0x11,0x41,0x12,0xE9,0x12,0xE9,0x12,0xE9,0x12,0xE9,0x12,
0x7F,0x13,0xDC,0x13,0xE9,0x41,0x8C,0x14,0xF2,0x14,0x3F,0x15,
0x1C,0x16,0xC3,0x16,0x27,0x5F,0xFE,0xAB,0xEB,0x19,0x14,0xC6,
0x6C,0x07,0xA6,0x3A,0xFB,0x41,0xF3,0x4A,0xEA,0xC8,0x1C,0x43,
0x51,0x42,0x0B,0x42,0x2A,0x14,0x33,0x14,0x41,0x14,0x4F,0x14,
0x84,0x14,0xE3,0xE2,0xFE,0x2E,0xE3,0xE1,0xFE,0x67,0xCE,0x10,
0xE3,0xE4,0xFE,0x2E,0xE3,0xE3,0xFE,0x67,0xCE,0x1C,0x30,0xFF,
0x1C,0x48,0x04,0x1E,0x30,0xCF,0x1C,0x48,0x04,0x3A,0x00,0x68,
0xE3,0xE2,0xFE,0x2E,0xF3,0x28,0xE3,0xE2,0xFE,0x87,0x1C,0x48,
0x04,0x1E,0x30,0xDF,0x1C,0x48,0x04,0x3A,0x00,0x6A,0xE3,0xE4,
0xFE,0x2E,0xF3,0x28,0xE3,0xE4,0xFE,0x87,0x1C,0x48,0x04,0x1E,
0x27,0xF1,0xA9,0x62,0xC6,0xFC,0xB1,0x62,0x27,0x60,0xEB,0xE5,
0xFE,0x26,0x27,0xF1,0xA9,0x62,0xC6,0xFC,0xB1,0x62,0x27,0x60,
0xEB,0xE6,0xFE,0x26,0x33,0x00,0x1C,0x79,0x42,0x83,0xFB,0x6F,
0x10,0xCE,0xF7,0x1E,0x30,0xFA,0xFB,0x31,0xF9,0x6E,0xC0,0xE8,
0x37,0xF0,0xFB,0x31,0xF9,0x6E,0xD0,0xE8,0x37,0x0F,0xE3,0xE6,
0xFE,0x28,0x31,0x48,0xF8,0x6A,0x02,0x35,0x20,0xF8,0x12,0x30,
0x00,0xF8,0x70,0x31,0x08,0xF8,0x70,0xFC,0x6E,0x90,0x30,0xFA,
0xE2,0x2E,0xFB,0x31,0xE8,0x26,0xFC,0x6C,0x0F,0xFC,0x6E,0xA0,
0xE2,0x2E,0xFB,0x31,0xF9,0x6E,0x10,0xE8,0x26,0xFC,0x6E,0x10,
0xE2,0x2E,0xFB,0x31,0xF9,0x6E,0x20,0xE8,0x26,0xFB,0x31,0xF9,
0x6E,0x30,0xE8,0x37,0x00,0xFB,0x31,0xF9,0x6E,0x40,0xE8,0x37,
0x00,0xE3,0xE5,0xFE,0x2E,0xFB,0x60,0xFB,0x31,0xF9,0x6E,0x50,
0xE8,0x26,0xFB,0x31,0xF9,0x6E,0x60,0xE8,0x37,0x80,0xFB,0x31,
0xF9,0x6E,0x70,0xE8,0x37,0x00,0xFB,0x31,0xF9,0x6E,0xA0,0xE8,
0x37,0x0F,0xFB,0x31,0xF9,0x6E,0xB0,0xE8,0x37,0x0F,0xFB,0x31,
0xF9,0x6E,0xC0,0xE8,0x37,0x0F,0xFB,0x31,0xF9,0x6E,0xD0,0xE8,
0x37,0x0F,0xFB,0x31,0xF9,0x6E,0x90,0xE8,0x37,0x03,0x1E,0x33,
0x00,0x1C,0x27,0x43,0x83,0xFB,0x6F,0x10,0xCE,0xF7,0x30,0xFA,
0xFB,0x31,0xF9,0x6E,0xC0,0xE8,0x37,0xF0,0xFB,0x31,0xF9,0x6E,
0xD0,0xE8,0x37,0x0F,0xFB,0x31,0xF9,0x6E,0x90,0xE8,0x37,0x00,
0x1E };
unsigned char speed_get_7[66] = {
0x27,0xF1,0xA9,0x62,0xC6,0xFC,0xB1,0x62,0xE7,0x60,0x28,0x27,0xF1,0xA9,
0x62,0xC6,0xFC,0xB1,0x62,0xE7,0x60,0x29,0x27,0xF1,0xA9,0x62,0xC6,0xFC,
0xB1,0x62,0xE7,0x60,0x2C,0x27,0xF1,0xA9,0x62,0xC6,0xFC,0xB1,0x62,0xE7,
0x60,0x2D,0x7F,0x00,0x00,0xFE,0xD6,0xAC,0xC6,0xC6,0xFC,0xE0,0x2E,0x2F,
0xFE,0x27,0xF0,0x90,0x7A,0x01,0x00,0xCE,0xF0,0x1E };
unsigned char speed_put_8[68] = {
0x27,0xF1,0xA9,0x62,0xC6,0xFC,0xB1,0x62,0xE7,0x60,0x28,0x27,0xF1,0xA9,
0x62,0xC6,0xFC,0xB1,0x62,0xE7,0x60,0x29,0x27,0xF1,0xA9,0x62,0xC6,0xFC,
0xB1,0x62,0xE7,0x60,0x2C,0x27,0xF1,0xA9,0x62,0xC6,0xFC,0xB1,0x62,0xE7,
0x60,0x2D,0x7F,0x00,0x00,0xFE,0xD6,0x27,0xF1,0xA9,0x62,0xC6,0xFC,0xB1,
0x62,0x27,0x60,0xE8,0x26,0x90,0x7A,0x01,0x00,0xCE,0xEE,0x1E };
unsigned get_entry(x) int x; { unsigned ent,z; z=(unsigned)x;
ent=msb_data_get(entry_table)+msb_data_get(entry_table+1)*256;
return(msb_data_get(ent+2*z)+msb_data_get(ent+2*z+1)*256); }
msb_data_put(add,data) unsigned add; int data; {
set_command(0xe3); put_data(add/256); set_command(0xe5);
put_data(add%256); set_command(0xeb); put_data(data); }
msb_data_get(add) unsigned add; {
set_command(0xe3); put_data(add/256); set_command(0xe5);
put_data(add%256); set_command(0xae); return(get_data()); }
msb_hot_reset(){ inp(DATAPT); inp(DATAPT); inp(DATAPT); set_command(0xff); }
put_command(x) int x; { while((inp(STATPT)&DRR)!=0){} outp(STATPT,x); }
put_data(x) int x; { while((inp(STATPT)&DRR)!=0){} outp(DATAPT,x); }
get_data(){ while((inp(STATPT)&DSR)!=0){} return(inp(DATAPT)); }
set_command(x) int x; { put_command(x); while(get_data()!=0xfe){} }
turbo_command_set(x,add,count) int x; unsigned add,count; {
if(x==PUT) set_command(0xcd);
else if(x==GET) set_command(0xcc);
put_data(add/256); put_data(add%256);
put_data(count/256); put_data(count%256); }
typedef struct _BP_NEURON {
unsigned count;
double out;
struct _BP_NEURON *next;
struct _BP_NEURON **link;
double *weight;
double *dw;
double delta;
} BP_NEURON;
BP_NEURON input[INPUTUNIT];
BP_NEURON hidden[HIDDENUNIT];
BP_NEURON output[OUTPUTUNIT];
BP_NEURON bias[BIASUNIT];
BpPropagate1(neuron) BP_NEURON *neuron;
{
double net;
net=Sigma(neuron); neuron->out=Sigmoid2(net);
}
BpPropagate(cluster) BP_NEURON *cluster;
{
do{ BpPropagate1(cluster); }while(cluster=cluster->next);
}
BpInput(cluster,pattern) BP_NEURON *cluster; double *pattern;
{
int i=0;
do{ cluster->out=pattern[i++]; }while(cluster=cluster->next);
}
BpReset(cluster) BP_NEURON *cluster;
{
BP_NEURON **n1; n1=&cluster;
do{
do{ cluster->delta=0.0; }while(cluster=cluster->next);
n1=(BP_NEURON**)((int)n1+sizeof(BP_NEURON*));
cluster=*n1;
}while(cluster);
}
BpOutputLearning(n1,teacher) BP_NEURON *n1; double *teacher;
{
int i=0; double tmp; BP_NEURON *n2; n2=n1;
do{
tmp=n2->out;
n2->delta=(teacher[i++]-tmp)*tmp*(1-tmp);
}while(n2=n2->next);
do{
for(i=0;i<n1->count;i++){
n1->link[i]->delta+=n1->delta*n1->weight[i];
n1->dw[i]=Eta*n1->delta*n1->link[i]->out+Alpha*n1->dw[i];
n1->weight[i]+=n1->dw[i];
}
}while(n1=n1->next);
}
BpHiddenLearning(n1) BP_NEURON *n1;
{
int i; BP_NEURON *n2; n2=n1;
do{ n2->delta*=n2->out*(1-n2->out); }while(n2=n2->next);
do{
for(i=0;i<n1->count;i++){
n1->link[i]->delta+=n1->delta*n1->weight[i];
n1->dw[i]=Eta*n1->delta*n1->link[i]->out+Alpha*n1->dw[i];
n1->weight[i]+=n1->dw[i];
}
}while(n1=n1->next);
}
nn_setting(){
srand(3);
Cluster1D(input,INPUTUNIT);
Cluster1D(hidden,HIDDENUNIT);
Cluster1D(output,OUTPUTUNIT);
InitWeight(UNIFORM,0.5,-0.5);
Connect(input,hidden);
Connect(hidden,output);
Connect(bias,hidden);
Connect(bias,output);
InitLinkAlloc(CONST,0.0,0.0);
LinkAlloc1D(hidden,dw);
LinkAlloc1D(output,dw);
bias->out=1.0;
strcpy(name,"hidden_"); strcat(name,number); strcat(name,".dat");
if((fds=fopen(name,"r"))==NULL){
printf("\n\tHidden Weight File is not found.\n");
}
else{ WeightLoad( name, 0, hidden ); fclose(fds); }
strcpy(name,"output_"); strcat(name,number); strcat(name,".dat");
if((fds=fopen(name,"r"))==NULL){
printf("\n\tOutput Weight File is not found.\n");
}
else{ WeightLoad( name, 0, output ); fclose(fds); }
}
neuro_file_write(){
strcpy(name,"output_"); strcat(name,number); strcat(name,".dat");
WeightSave( name, "w", output );
strcpy(name,"hidden_"); strcat(name,number); strcat(name,".dat");
WeightSave( name, "w", hidden );
}
hex_data(){
int i,j,k,ww;
char name[32],nm[5];
nm[1]=0;
printf("\n\n\n\t! ! ! C A U T I O N ! ! !");
printf("\n\n\n\tWriting ROM Data file takes very long time!");
printf("\n\n\n\t\t\t\tAre you OK ? (y/n) --- ");
while(1){ if(kbhit()){ if(getch()=='y') break; else return(0); } }
for(i=0;i<8;i++){
nm[0]=i+0x30;
strcpy(name,"d-"); strcat(name,nm); strcat(name,".bin");
fds=fopen(name,"wb"); printf("\n\nROM Bank = [%d]",i);
for(j=0;j<4;j++){
printf("\n\tWave = [%d] ",j);
for(ww=0;ww<32;ww++){
putchar('.'); wave_calc(ww,4*i+j);
for(k=0;k<512;k++) fputc(wb[k],fds);
}
}
fclose(fds);
}
}
intro_grain(){
int i,j,d,xx,yy,yyy,x_max,dt,pt;
_clearscreen(_GCLEARSCREEN); _setlinestyle(0x5555); _setcolor(7);
_rectangle(_GBORDER,0,0,639,399);
_settextposition(3,20); printf("Sample of Normal Sound Waveform");
wave_calc(16,16,0); xx=30; yy=500; x_max=2300; _setlinestyle(0xffff);
for(i=0;i<x_max;i=i+4){
if(wb[i%512]<128) dt=wb[i%512]+128;
else dt=128-(wb[i%512]&0x7f);
yyy=yy-7*dt/5;
if(i==0) _moveto(xx,yyy); else _lineto(xx+i/4,yyy);
}
mouse(1);
while(1){ if(kbhit()){ d=getch(); if(d==0x1b) return; else break; } }
mouse(0);
_clearscreen(_GCLEARSCREEN); _setlinestyle(0x5555); _setcolor(7);
_rectangle(_GBORDER,0,0,639,399);
_settextposition(3,25); printf("Sample of [ Grain ]");
wave_calc(16,16,0); xx=30; yy=500; x_max=2300; _setlinestyle(0xffff);
for(i=0;i<x_max;i=i+4){
if(wb[i%512]<128) dt=wb[i%512]+128;
else dt=128-(wb[i%512]&0x7f);
yyy=yy-7*dt/5;
if(i==0){ _moveto(xx,yyy); pt=yyy; }
else if((i>512)&&(i<1024)) _lineto(xx+i/4,yyy);
else _lineto(xx+i/4,pt);
}
mouse(1);
while(1){ if(kbhit()){ d=getch(); if(d==0x1b) return; else break; } }
mouse(0);
_clearscreen(_GCLEARSCREEN); _setlinestyle(0x5555); _setcolor(7);
_rectangle(_GBORDER,0,0,639,399);
_settextposition(3,20); printf("Normal [ Smooth ] Grain");
wave_calc(16,16,0); xx=50; yy=500; _setlinestyle(0xffff);
_moveto(25,yy-7*128/5); _lineto(50,yy-7*128/5);
for(i=0;i<512;i++){
if(wb[i]<128) dt=wb[i]+128;
else dt=128-(wb[i]&0x7f);
yyy=yy-7*dt/5; _lineto(xx+i,yyy);
}
_lineto(615,yy-7*128/5);
mouse(1);
while(1){ if(kbhit()){ d=getch(); if(d==0x1b) return; else break; } }
mouse(0);
for(j=30;j>4;j=j-2){
_clearscreen(_GCLEARSCREEN); _setlinestyle(0x5555);
_rectangle(_GBORDER,0,0,639,399);
_settextposition(3,15);
printf("Waveshape Conversion of Grain : Parameter = %d",j);
wave_calc(16,j,0); xx=50; yy=480; _setlinestyle(0xffff);
_moveto(25,yy-7*128/5); _lineto(50,yy-7*128/5);
for(i=0;i<512;i++){
if(wb[i]<128) dt=wb[i]+128;
else dt=128-(wb[i]&0x7f);
yyy=yy-7*dt/5; _lineto(xx+i,yyy);
}
_lineto(615,yy-7*128/5);
mouse(1);
while(1){if(kbhit()){d=getch();if(d==0x1b)return;else break;}}
mouse(0);
}
for(j=31;j>5;j=j-2){
_clearscreen(_GCLEARSCREEN); _setlinestyle(0x5555);
_rectangle(_GBORDER,0,0,639,399);
_settextposition(3,15);
printf("Waveshape Conversion of Grain : Parameter = %d",j);
wave_calc(16,j,1); xx=50; yy=480; _setlinestyle(0xffff);
_moveto(25,yy-7*128/5); _lineto(50,yy-7*128/5);
for(i=0;i<512;i++){
if(wb[i]<128) dt=wb[i]+128;
else dt=128-(wb[i]&0x7f);
yyy=yy-7*dt/5; _lineto(xx+i,yyy);
}
_lineto(615,yy-7*128/5);
mouse(1);
while(1){if(kbhit()){d=getch();if(d==0x1b)return;else break;}}
mouse(0);
}
for(j=16;j>-1;j--){
_clearscreen(_GCLEARSCREEN); _setlinestyle(0x5555);
_rectangle(_GBORDER,0,0,639,399);
_settextposition(3,15);
printf("Waveshape Conversion of Grain : Parameter = %d",j);
wave_calc(j,9,2); xx=50; yy=480; _setlinestyle(0xffff);
_moveto(25,yy-7*128/5); _lineto(50,yy-7*128/5);
for(i=0;i<512;i++){
if(wb[i]<128) dt=wb[i]+128;
else dt=128-(wb[i]&0x7f);
yyy=yy-7*dt/5; _lineto(xx+i,yyy);
}
_lineto(615,yy-7*128/5);
mouse(1);
while(1){if(kbhit()){d=getch();if(d==0x1b)return;else break;}}
mouse(0);
}
for(j=1;j<32;j++){
_clearscreen(_GCLEARSCREEN); _setlinestyle(0x5555);
_rectangle(_GBORDER,0,0,639,399);
_settextposition(3,15);
printf("Waveshape Conversion of Grain : Parameter = %d",j);
wave_calc(j,9,2); xx=50; yy=480; _setlinestyle(0xffff);
_moveto(25,yy-7*128/5); _lineto(50,yy-7*128/5);
for(i=0;i<512;i++){
if(wb[i]<128) dt=wb[i]+128;
else dt=128-(wb[i]&0x7f);
yyy=yy-7*dt/5; _lineto(xx+i,yyy);
}
_lineto(615,yy-7*128/5);
mouse(1);
while(1){if(kbhit()){d=getch();if(d==0x1b)return;else break;}}
mouse(0);
}
for(j=30;j>15;j--){
_clearscreen(_GCLEARSCREEN); _setlinestyle(0x5555);
_rectangle(_GBORDER,0,0,639,399);
_settextposition(3,15);
printf("Waveshape Conversion of Grain : Parameter = %d",j);
wave_calc(j,9,2); xx=50; yy=480; _setlinestyle(0xffff);
_moveto(25,yy-7*128/5); _lineto(50,yy-7*128/5);
for(i=0;i<512;i++){
if(wb[i]<128) dt=wb[i]+128;
else dt=128-(wb[i]&0x7f);
yyy=yy-7*dt/5; _lineto(xx+i,yyy);
}
_lineto(615,yy-7*128/5);
mouse(1);
while(1){if(kbhit()){d=getch();if(d==0x1b)return;else break;}}
mouse(0);
}
}
wave_draw(z,mode)
int z,mode;
{
unsigned add;
int i,j,xx,yy,xxx,yyy,tx,ty,dt,yyyy;
xx=24+336*(z/8); xxx=xx+285; yy=9+48*(z%8); yyy=yy+43;
_setcolor(0); _rectangle(_GFILLINTERIOR,xx,yy,xxx,yyy); _setcolor(7);
if(mode==0) _setlinestyle(0x9999);
else if(mode==1) _setlinestyle(0xffff);
xx=25+336*(z/8); xxx=xx+128; yy=10+48*(z%8); yyy=yy+42;
_rectangle(_GBORDER,xx,yy,xxx,yyy);
xx=157+336*(z/8); xxx=xx+145; yy=34+48*(z%8); yyy=yy+18;
_rectangle(_GBORDER,xx,yy,xxx,yyy);
ty=2+3*(z%8); tx=42*(z/8); _settextposition(ty,tx); printf("[%X]",z);
_settextposition(ty-1,tx+20); printf(" KN=%02x LE=%02x",kn[z],le[z]);
xx=26+336*(z/8); xxx=xx+kn[z]; yy=13+48*(z%8); yyy=yy+4;
_setlinestyle(0x5555); _rectangle(_GFILLINTERIOR,xx,yy,xxx,yyy);
xx=158+336*(z/8); xxx=xx+143*le[z]/127; yy=35+48*(z%8); yyy=yy+16;
_setlinestyle(0x5555); _rectangle(_GFILLINTERIOR,xx,yy,xxx,yyy);
xx=25+336*(z/8); xxx=xx+128; yy=10+48*(z%8); yyy=yy+42;
_setlinestyle(0xffff);
for(i=0;i<512;i=i+4){
if(i==0) _moveto(xx,yyy-14);
else{
if(wb[i]<128) dt=wb[i]+128;
else dt=128-(wb[i]&0x7f);
yyyy=yyy-56*dt/256+14;
if(yyyy>yyy) yyyy=yyy;
_lineto(xx+i/4,yyyy);
}
if (i==508) _lineto(xx+127,yyy-14);
}
if(mode==1) wave_sound(z);
}
wave_calc(ww,wk)
int ww,wk;
{
int i,wl,a,b;
double p=3.1415926535,q,r,u,v=0;
if(ww<16) wl=512-24*(16-ww);
else wl=512-24*(ww-16);
for(i=0;i<512;i++){
if(i<wl){
q=(double)i/(double)wl;
if(wt==0){
r=((double)wk-16)/11; /* sin(2t) */
wc[i]=1+sin(p*(2*q-0.5))+r*(1+sin(p*(4*q-0.5)));
}
else if(wt==1){
r=((double)wk-16)/16; /* sin(3t) */
wc[i]=1+sin(p*(2*q-0.5))+r*(1+sin(p*(6*q-0.5)));
}
else {
r=((double)wk-16)/13; /* sin(4t) */
wc[i]=1+sin(p*(2*q-0.5))+r*(1+sin(p*(8*q-0.5)));
}
}
else wc[i]=0;
if(v<wc[i]) v=wc[i];
}
for(i=0;i<512;i++){
u=127.9*wc[i]/v; if(u>=0) wd[i]=(char)u;
else wd[i]=(char)(128-u);
}
if(ww<16){
a=(512-wl)/2; b=a+wl; for(i=0;i<a;i++) wb[i]=0;
for(i=0;i<wl;i++) wb[i+a]=wd[i];
for(i=0;i<a;i++) wb[i+b]=0;
}
else if(ww>16){
a=wl/2; b=a+(512-wl); for(i=0;i<a;i++) wb[i]=wd[i];
for(i=0;i<512-wl;i++) wb[i+a]=wd[a];
for(i=0;i<a;i++) wb[i+b]=wd[i+a];
}
else{ for(i=0;i<512;i++) wb[i]=wd[i]; }
}
wave_set(){
unsigned add;
int i;
set_command(0x01); set_command(0xf0);
add=get_entry(vector_offset_w_block); msb_data_put(add,0);
add=get_entry(vector_offset_wave); turbo_command_set(PUT,add,256);
for(i=0;i<256;i++) put_data(wb[i]);
set_command(0xc0);
add=get_entry(vector_offset_w_block); msb_data_put(add,1);
add=get_entry(vector_offset_wave); turbo_command_set(PUT,add,256);
for(i=256;i<512;i++) put_data(wb[i]);
set_command(0xc0); set_command(0xf1);
}
wave_initialize_firmware_load(){
unsigned add;
int i;
printf("\n\n\n\n\n\t\tplease wait a moment...");
add=get_entry(vector_offset_user_com)+0x100*6;
for(i=0;i<66;i++) msb_data_put(add+(unsigned)i,(int)speed_get_7[i]);
add=get_entry(vector_offset_user_com)+0x100*7;
for(i=0;i<68;i++) msb_data_put(add+(unsigned)i,(int)speed_put_8[i]);
set_command(0xf0);
add=get_entry(vector_offset_wave); turbo_command_set(PUT,add,256);
for(i=0;i<256;i++) put_data(0);
set_command(0xf1); add=get_entry(vector_offset_w_block);
for(i=0;i<128;i++){ msb_data_put(add,i); set_command(0xc0); }
add=0x4101;
for(i=0;i<577;i++) msb_data_put(add+(unsigned)i,(int)patch[i]);
msb_data_put(0x4100,0);
}
wave_sound(z)
int z;
{
int d;
d=le[z];
if(d>127-16) d=127-16;
set_command(0xa9); put_data(d); put_data(kn[z]);
}
parameter_file_write(){
int i;
strcpy(name,"grain_"); strcat(name,number); strcat(name,".dat");
fds=fopen(name,"wb");
for(i=0;i<16;i++){ fputc(kn[i],fds); fputc(le[i],fds); }
for(i=0;i<16;i++){ fputc(xp[i],fds); fputc(yp[i],fds); }
fputc(ww,fds); fputc(wk,fds); fputc(wt,fds);
fclose(fds);
}
parameter_file_read(){
int i;
strcpy(name,"grain_"); strcat(name,number); strcat(name,".dat");
if((fds=fopen(name,"rb"))==NULL){
for(i=0;i<16;i++){ kn[15-i]=32+i*4; le[15-i]=4+i*8; }
for(i=0;i<16;i++){ xp[i]=8; yp[i]=8; }
ww=16; wk=16; wt=0;
}
else{
for(i=0;i<16;i++){ kn[i]=fgetc(fds); le[i]=fgetc(fds); }
for(i=0;i<16;i++){ xp[i]=fgetc(fds); yp[i]=fgetc(fds); }
ww=fgetc(fds); wk=fgetc(fds); wt=fgetc(fds);
fclose(fds);
}
}
mouse(flag) int flag; {
if(flag==0){inregs.x.ax=2;} else if(flag==1){inregs.x.ax=1;}
int86(51,&inregs,&outregs); }
getmouse(right,left,x,y) int *right,*left,*x,*y; {
inregs.x.ax=3; int86(51,&inregs,&outregs); *right=outregs.x.bx;
*left=outregs.x.ax; *x=outregs.x.cx; *y=outregs.x.dx; }
setmouse(x,y) int x,y; { inregs.x.ax=4; inregs.x.cx=x; inregs.x.dx=y;
int86(51,&inregs,&outregs); }
m_style(x,y,buf) int x,y; char *buf; { inregs.x.ax=9; inregs.x.bx=x;
inregs.x.cx=y; segread(&segregs); segregs.es=segregs.ds;
inregs.x.dx=(int)buf; int86x(51,&inregs,&outregs,&segregs); }
m_view(xmin,ymin,xmax,ymax) int xmin,ymin,xmax,ymax; {
inregs.x.ax=16; inregs.x.cx=xmin; inregs.x.dx=xmax;
int86(51,&inregs,&outregs); inregs.x.ax=17; inregs.x.cx=ymin;
inregs.x.dx=ymax; int86(51,&inregs,&outregs); }
m_color(color) int color; {
inregs.x.ax=18; inregs.x.bx=color; int86(51,&inregs,&outregs); }
symbol(x,y,color,str,skip) int x,y,color,skip; unsigned char str[80]; {
int i=0; _setcolor(color);
while(str[i]!=0){ _gputchar(x,y,str[i++],_GXOR); x += skip; } }
static int style[]={
0,0,0,0,0,0,0,0,0x0070,0x0e88,0x1184,0x2142,0x2221,0x9210,
0xe107,0x1108,0x1108,0xe107,0x1108,0x1108,0xe107,0x4108,
0x4208,0xfc07,0,0,0,0,0,0,0,0 };
main(argc,argv)
int argc; char *argv[];
{
int i,d;
num=1; number[1]=0;
number[0]='0'+num;
inregs.x.ax=0; int86(51,&inregs,&outregs);
if(outregs.x.ax==0){printf("\nPlease install mouse.sys !\n");exit(0);}
m_style(0,8,style); m_color(1); m_view(0,0,639,399);
msb_hot_reset(); wave_initialize_firmware_load();
setmouse(320,200);
parameter_file_read();
_main_loop_top:
mouse(0);
printf("\x1b[2J\n\n\n\n\n");
printf(" An Experiment of ");
printf("NEURO GRANULATION");
printf("\n\n\n\n\t\t\tYOICHI NAGASHIMA");
printf("\n\n\n\t\t\t\t\tSummer Symposium 1992 of JMACS\n\n");
printf("\n\t\t(1) Introduction of Granular Synthesis");
printf("\n\t\t(2) Select Sample Data File Group : [1]-[8]");
printf("\n\t\t(3) Setting : Granulation Parameter --> Teacher");
printf("\n\t\t(4) Mapping : Teacher Pattern --> Control Space");
printf("\n\t\t(5) Learning : Neural Network Back Propagation");
printf("\n\t\t(6) Running : Real-Time Neuro Granulation !");
printf("\n\t\t(7) Writing Current Wave to HEX Data File");
printf("\n\t\t\t\t\t\t\t\tselect : ");
while(1){
if(kbhit()){
d=getch();
if(d==0x1b){
printf("\x1b[2J"); set_command(0xfe); exit(0);
}
else if((d>'0')&&(d<'8')){
d=d-'0'; printf("\x1b[2J"); break;
}
}
}
switch(d){
case 1: _setvideomode(_98RESS16COLOR);
_displaycursor(_GCURSOROFF);
intro_grain();
_clearscreen(_GCLEARSCREEN);
_displaycursor(_GCURSORON); break;
case 2: file_group_change(); break;
case 3: granulation_para(); break;
case 4: teacher_mapping(); break;
case 5: neural_net_learning(); break;
case 6: sample_run(); break;
case 7: hex_data(); break;
}
goto _main_loop_top;
}
file_group_change(){
int d;
printf("\x1b[2J\n\n\n\t\tSelect Sample Data File Group : [1]-[8]");
printf("\n\n\n\t\t\tCurrent = %d",num);
printf("\n\n\n\t\t\t\t\tselect [1-8] ----- ");
while(1){
if(kbhit()){
d=getch();
if(d==0x1b) return(0);
else if((d>'0')&&(d<'9')){
number[0]=d; num=d-'0';
parameter_file_read(); break;
}
}
}
}
neural_net_learning()
{
int i,j,cnt=0,flg=0,err_count=30000;
double dif,err,err_limit=0.005;
long time1,time2;
for(i=0;i<16;i++){
pattern[i][0]=(double)xp[i]/17L;
pattern[i][1]=(double)yp[i]/17L;
teacher[i][0]=(double)kn[i]/127L;
teacher[i][1]=(double)le[i]/127L;
}
printf("\n\nNeural Network Computation Start ...\n\n");
nn_setting(); time(<ime); time1=ltime;
do{
for(err=0.0,i=0;i<16;i++){
BpInput(input,pattern[i]);
BpPropagate(hidden);
BpPropagate(output);
for(j=0;j<OUTPUTUNIT;j++){
dif=output[j].out-teacher[i][j]; err+=dif*dif;
}
BpReset(input,hidden,NULL);
BpOutputLearning(output,teacher[i]);
BpHiddenLearning(hidden);
}
printf("\tCount = %d , Error = %1.10lf\n",cnt,err);
if(kbhit()){
neuro_file_write();
return(ERROR);
}
}while((err>err_limit)&&(cnt++<err_count));
neuro_file_write();
time(<ime); time2=ltime;
printf("\nBack Propagation Learning is finished. ");
printf("Count = %d , Time = %ld (sec)\n\n",cnt,time2-time1);
while(1){ while(!kbhit()){} if(getch()==0x1b) break; }
}
granulation_para(){
int i,c,flg=0,pt=15;
_setvideomode(_98RESS16COLOR); _setcolor(7);
_displaycursor(_GCURSOROFF); _clearscreen(_GCLEARSCREEN);
_loop_loop:
mouse(0);
wave_calc(ww,wk); wave_set();
_settextposition(0,26); printf("[[ WW=%d WK=%d ]] ",ww,wk);
for(i=0;i<16;i++) wave_draw(i,0);
wave_draw(pt,1);
mouse(1);
while(1){
while(!kbhit()){}
c=getch();
if(c==0x1b){ /* Escape */
break;
}
else if(c==0x0b){ /* Up */
mouse(0);
wave_draw(pt,0); if(pt==0) pt=15;
else if(pt==8) pt=7;
else pt=pt-1;
wave_draw(pt,1);
mouse(1);
}
else if(c==0x0a){ /* Down */
mouse(0);
wave_draw(pt,0); if(pt==7) pt=8;
else if(pt==15) pt=0;
else pt=pt+1;
wave_draw(pt,1);
mouse(1);
}
else if(c==0x0c){ /* Right */
mouse(0);
wave_draw(pt,0); if(pt<8) pt=pt+8;
else pt=pt-8;
wave_draw(pt,1);
mouse(1);
}
else if(c==0x08){ /* Left */
mouse(0);
wave_draw(pt,0); if(pt<8) pt=pt+8;
else pt=pt-8;
wave_draw(pt,1);
mouse(1);
}
else if(c=='8'){ /* Key Number Up */
mouse(0);
if(kn[pt]!=127){ kn[pt]++; wave_draw(pt,1); }
mouse(1);
}
else if(c=='2'){ /* Key Number Down */
mouse(0);
if(kn[pt]!=0){ kn[pt]--; wave_draw(pt,1); }
mouse(1);
}
else if(c=='6'){ /* Loop End to Right */
mouse(0);
if(le[pt]!=127){ le[pt]++; wave_draw(pt,1); }
mouse(1);
}
else if(c=='4'){ /* Loop End to Left */
mouse(0);
if(le[pt]!=0){ le[pt]--; wave_draw(pt,1); }
mouse(1);
}
else if(c=='>'){ /* Wave Width +1 */
if(ww!=31){ flg=1; ww++; break; }
}
else if(c=='<'){ /* Wave Width -1 */
if(ww!=0){ flg=1; ww--; break; }
}
else if(c=='+'){ /* Wave Type +1 */
if(wk!=31){ flg=1; wk++; break; }
}
else if(c=='-'){ /* Wave Type -1 */
if(wk!=0){ flg=1; wk--; break; }
}
else if((c=='d')||(c=='D')){ /* Wave : 2*sin */
wt=0; flg=1; break;
}
else if((c=='t')||(c=='T')){ /* Wave : 3*sin */
wt=1; flg=1; break;
}
else if((c=='q')||(c=='Q')){ /* Wave : 4*sin */
wt=2; flg=1; break;
}
}
if(flg!=0){ flg=0; goto _loop_loop; }
parameter_file_write();
mouse(0);
_clearscreen(_GCLEARSCREEN); _displaycursor(_GCURSORON);
set_command(0xa8);
}
mark_draw(p1,p2,pp,pt)
int p1,p2,pp,pt;
{
int i,j,xx,xxx,yy,yyy,fg=0;
if(pp==99){
xx=475; xxx=583; yy=79+16*p2; yyy=yy+18; _setlinestyle(0x5555);
_setcolor(7); _rectangle(_GFILLINTERIOR,xx,yy,xxx,yyy);
xx=478; xxx=580; yy=79+16*p1; yyy=yy+18; _setlinestyle(0xffff);
_setcolor(0); _rectangle(_GFILLINTERIOR,xx,yy,xxx,yyy);
return(0);
}
if(pp==1){
xx=20+23*p1; xxx=xx+20; yy=5+23*(16-p2); yyy=yy+20;
_setlinestyle(0xffff); _setcolor(7);
_rectangle(_GFILLINTERIOR,xx,yy,xxx,yyy); return(0);
}
xx=20+23*p1; xxx=xx+20; yy=5+23*(16-p2); yyy=yy+20; _setcolor(0);
_setlinestyle(0xffff); _rectangle(_GFILLINTERIOR,xx,yy,xxx,yyy);
for(i=0;i<16;i++){ if((xp[i]==p1)&&(yp[i]==p2)) fg++; }
_setcolor(7);
if(pp==2){
_setlinestyle(0x5555);
if(fg==0) _rectangle(_GBORDER,xx,yy,xxx,yyy);
else _rectangle(_GFILLINTERIOR,xx,yy,xxx,yyy);
}
else if(pp==3){
if((fg!=0)&&(p1==xp[pt])&&(p2==yp[pt])){
_setlinestyle(0xffff);
_rectangle(_GBORDER,xx,yy,xxx,yyy);
_setlinestyle(0x6969);
_rectangle(_GFILLINTERIOR,xx,yy,xxx,yyy);
}
else if(fg!=0){
_setlinestyle(0x5555);
_rectangle(_GFILLINTERIOR,xx,yy,xxx,yyy);
}
else{
_setlinestyle(0x5555);
_rectangle(_GBORDER,xx,yy,xxx,yyy);
}
}
}
teacher_mapping(){
int i,j,c,d,xx,xxx,yy,yyy,rsb;
int rsc=0,rsd=0,px=64,py=64,ox=64,oy=64,pt=15,ot=15;
_setvideomode(_98RESS16COLOR); _setcolor(7);
_displaycursor(_GCURSOROFF); _clearscreen(_GCLEARSCREEN);
wave_calc(ww,wk); wave_set();
for(i=0;i<17;i++){ for(j=0;j<17;j++) mark_draw(i,j,2,0); }
_settextposition(2,57); printf("[[ WW=%d WK=%d ]] ",ww,wk);
_settextposition(23,59); printf("[[ Group = %d ]] ",num);
_setlinestyle(0x5555); _setcolor(7);
xx=475; xxx=583; yy=69; yyy=91+16*16;
_rectangle(_GFILLINTERIOR,xx,yy,xxx,yyy);
for(i=0;i<16;i++){_settextposition(i+5,61); printf("Pattern <%X>",i);}
mark_draw(pt,ot,99,0); wave_sound(pt);
mark_draw(xp[pt],yp[pt],3,pt); mark_draw(8,8,1,0);
while(1){
while(!kbhit()){
set_command(0xaa); d=get_data();
if(d==0xcf){
mouse(0);
rsc=d; rsb=d; px=get_data();
i=ox*100/753; j=oy*100/753;
mark_draw(i,j,3,pt);
i=px*100/753; j=py*100/753;
mark_draw(i,j,1,0); ox=px;
mouse(1);
}
else if(d==0xdf){
mouse(0);
rsd=d; rsb=d; py=get_data();
i=ox*100/753; j=oy*100/753;
mark_draw(i,j,3,pt);
i=px*100/753; j=py*100/753;
mark_draw(i,j,1,0); oy=py;
mouse(1);
}
}
c=getch();
if(c==0x1b){ /* Escape */
break;
}
else if(c==0x0b){ /* Up */
mouse(0);
pt=(pt+15)&0x0f; mark_draw(pt,ot,99,0);
mark_draw(xp[ot],yp[ot],2,0);
mark_draw(xp[pt],yp[pt],3,pt);
wave_sound(pt); ot=pt;
mouse(1);
}
else if(c==0x0a){ /* Down */
mouse(0);
pt=(pt+1)&0x0f; mark_draw(pt,ot,99);
mark_draw(xp[ot],yp[ot],2,0);
mark_draw(xp[pt],yp[pt],3,pt);
wave_sound(pt); ot=pt;
mouse(1);
}
else if(c==0x0d){ /* RETURN */
mouse(0);
i=xp[pt]; j=yp[pt];
xp[pt]=px*100/753; yp[pt]=py*100/753;
mark_draw(i,j,3,0);
i=px*100/753; j=py*100/753;
mark_draw(i,j,1,0);
mouse(1);
}
}
parameter_file_write();
mouse(0);
_clearscreen(_GCLEARSCREEN); _displaycursor(_GCURSORON);
set_command(0xa8);
}
sample_run()
{
int i,j,c,d,xx,xxx,yy,yyy;
int px=64,py=64,opx=8,opy=8,rsb=0xcf;
_setvideomode(_98RESS16COLOR); _setcolor(7);
_displaycursor(_GCURSOROFF); _clearscreen(_GCLEARSCREEN);
wave_calc(ww,wk); wave_set();
for(i=0;i<17;i++){ for(j=0;j<17;j++) mark_draw(i,j,2,0); }
_settextposition(3,54); printf("*** Real-Time Control ***");
_settextposition(6,60); printf("WW=%d WK=%d ",ww,wk);
_settextposition(16,59); printf("[[ Group = %d ]] ",num);
nn_setting(); mark_draw(8,8,1,0); nn_out(px,py,rsb);
while(1){
while(!kbhit()){
set_command(0xaa); d=get_data();
if(d==0xcf){
rsb=d; px=get_data();
i=px*100/753; j=py*100/753;
if((opx!=i)||(opy!=j)){
mark_draw(opx,opy,2,0);
mark_draw(i,j,1,0);
nn_out(px,py,rsb); opx=i; opy=j;
}
}
else if(d==0xdf){
rsb=d; py=get_data();
i=px*100/753; j=py*100/753;
if((opx!=i)||(opy!=j)){
mark_draw(opx,opy,2,0);
mark_draw(i,j,1,0);
nn_out(px,py,rsb); opx=i; opy=j;
}
}
}
if(getch()==0x1b) break;
}
_clearscreen(_GCLEARSCREEN); _displaycursor(_GCURSORON);
set_command(0xa8);
}
nn_out(px,py,rsb)
int px,py,rsb;
{
int i,j,k,l,d;
double test[INPUTUNIT];
test[0]=(double)px/127L; test[1]=(double)py/127L;
BpInput(input,test); BpPropagate(hidden); BpPropagate(output);
k=(int)(127.9L*output[0].out);
_settextposition(10,60); printf("Key No. = %02X ",k);
l=(int)(127.9L*output[1].out);
_settextposition(12,60); printf("Loop End = %02X ",l);
if(l>127-16) l=127-16;
set_command(0xa9); put_data(l); put_data(k);
}
.MODULE/RAM/BOOT=0/ABS=0 test;
{ SYSTEM I/O ADDRESS DEFINES }
.const Sys_Ctrl_Reg= 0x3fff;
.const Dm_Wait_Reg= 0x3ffe;
.const Tperiod_Reg= 0x3ffd;
.const Tcount_Reg= 0x3ffc;
.const Tscale_Reg= 0x3ffb;
.const Sport0_Rx_Words1= 0x3ffa;
.const Sport0_Rx_Words0= 0x3ff9;
.const Sport0_Tx_Words1= 0x3ff8;
.const Sport0_Tx_Words0= 0x3ff7;
.const Sport0_Ctrl_Reg= 0x3ff6;
.const Sport0_Sclkdiv= 0x3ff5;
.const Sport0_Rfsdiv= 0x3ff4;
.const Sport0_Autobuf_Ctrl= 0x3ff3;
.const Sport1_Ctrl_Reg= 0x3ff2;
.const Sport1_Sclkdiv= 0x3ff1;
.const Sport1_Rfsdiv= 0x3ff0;
.const Sport1_Autobuf_Ctrl= 0x3fef;
.CONST comcrdy = 0x0803;
.CONST comdrdy = 0x0804;
.CONST cpudt = 0x0810;
.CONST dspdt = 0x0811;
{ BOAD REGISTERS }
.CONST hs_readonly = 0x0600;
.CONST handshake = 0x0700;
.CONST dipswitch = 0x0400;
.CONST codec_ctrl = 0x0400;
{ CONTROLE BITS }
.CONST d2c = 0x2000;
.CONST c2d = 0x1000;
.CONST s8 = 0x8000;
.CONST s4 = 0x4000;
.CONST s2 = 0x2000;
.CONST s1 = 0x1000;
.CONST dc = 0x1000;
.CONST c2denb = 0x2000;
.CONST extenb = 0x4000;
{ MEMORY STRUCTURE }
.CONST dm_top = 0x0800;
.CONST dm_bottom = 0x3BFF;
.CONST pm_top = 0x0000;
.CONST pm_bottom = 0x3FFF;
.CONST ext_dm_top = 0x0800;
.CONST ext_dm_bottom = 0x37FF;
.CONST int_dm_top = 0x3800;
.CONST int_dm_bottom = 0x3BFF;
.CONST ext_pm_top = 0x0800;
.CONST ext_pm_bottom = 0x3FFF;
.CONST int_pm_top = 0x0000;
.CONST int_pm_bottom = 0x07FF;
{ TERMINATE PROGRAM }
.CONST end_of_prog = 0x001D;
/******************** Special Macro Defines ********************/
#define data_to_mem(data,memory) AX0=data; DM(memory)=AX0;
#define data_to_reg(data,register) AX0=data; DM(register)=AX0;
#define interrupt_disable IFC=0x3f; IMASK=0x00;
#define interrupt_s0_rx_enable IFC=0x3f; IMASK=0x08;
#define interrupt_s0_tx_enable IFC=0x3f; IMASK=0x10;
#define waiting_for_interrupt idle;
#define direct_tx_port_0(i_reg,m_reg) AX0=DM(i_reg,m_reg); TX0=AX0;
#define serial_port_0_disable data_to_reg(0x0408,Sys_Ctrl_Reg)
#define serial_port_0_enable data_to_reg(0x1408,Sys_Ctrl_Reg)
#define autobuf_port_0_disable data_to_reg(0x0000,Sport0_Autobuf_Ctrl)
#define autobuf_port_0_enable data_to_reg(0x0017,Sport0_Autobuf_Ctrl)
.MACRO codec_to_AR_reg_mono;
SR0=DM(I3,M3); AY0=DM(I3,M3);
SR=lshift SR0 by 8 (lo); AR=SR0 or AY0;
.ENDMACRO;
.MACRO SR0_reg_to_codec_mono;
AY0=0xff; AR=SR0 and AY0; SR=lshift SR0 by -8 (lo);
DM(I2,M2)=SR0; DM(I2,M2)=AR;
.ENDMACRO;
/******************** Buffer Memory Defines ********************/
.VAR/DM/RAM/ABS=0x0900/CIRC fifo_tx[8];
.VAR/DM/RAM/ABS=0x0910/CIRC fifo_rx[8];
/******************** Reset Vectors Defines ********************/
jump start; nop; nop; nop; {Reset Vector}
RTI; nop; nop; nop; {irq2}
RTI; nop; nop; nop; {sport0 TX}
RTI; nop; nop; nop; {sport0 RX}
RTI; nop; nop; nop; {irq0}
RTI; nop; nop; nop; {irq1}
RTI; nop; nop; nop; {timer}
/******************** Common Subroutines ********************/
codec_initialize:
call codec_system_init;
call codec_init_command_mode;
call codec_init_data_mode;
rts;
codec_system_init:
data_to_reg(0x01,Dm_Wait_Reg) /* 1 wait */
data_to_reg(0xff,Sport0_Rfsdiv) /* Multi-ch, 256bit */
data_to_reg(0x00,Sport0_Sclkdiv) /* divide rate */
data_to_reg(0xff,Sport0_Tx_Words0) /* LSB 16bit Tx */
data_to_reg(0xff,Sport0_Rx_Words0) /* Rx */
data_to_reg(0x00,Sport0_Tx_Words1) /* MSB 16bit Tx */
data_to_reg(0x00,Sport0_Rx_Words1) /* Rx */
rts;
codec_init_command_mode:
interrupt_disable
serial_port_0_disable
autobuf_port_0_disable
data_to_mem(0x08,fifo_tx+0) /* olb=1, clb=0(control) */
data_to_mem(0x1c,fifo_tx+1) /* 32KHz, Stereo, 16bit */
data_to_mem(0x9a,fifo_tx+2) /* 256bit, x1, gen.clk */
data_to_mem(0x00,fifo_tx+3) /* (reserved) */
data_to_mem(0xc0,fifo_tx+4) /* (reserved) */
data_to_mem(0x00,fifo_tx+6) /* (reserved) */
I0=^fifo_tx; M0=1; L0=8;
I1=^fifo_rx; M1=1; L1=8;
data_to_reg(0xc707,Sport0_Ctrl_Reg) /* CODEC --> Setting Mode */
direct_tx_port_0(I0,M0)
autobuf_port_0_enable /* tx=I0, rx=I1 */
serial_port_0_enable
interrupt_s0_rx_enable
loop_1:
waiting_for_interrupt
call check_1;
if ne jump loop_1;
interrupt_s0_tx_enable
data_to_mem(0x000C,fifo_tx+0) /* clb set */
waiting_for_interrupt
waiting_for_interrupt
waiting_for_interrupt
rts;
check_1:
AX0=DM(fifo_rx+0); AY0=0x04; AR=AX0 and AY0;
if ne jump chk_exit;
AX0=DM(fifo_tx+1); AY0=DM(fifo_rx+1); AR=AX0-AY0;
if ne jump chk_exit;
AX0=DM(fifo_tx+2); AY0=DM(fifo_rx+2); AF=AX0 xor AY0;
AX0=0xFF7F; AR=AX0 and AF;
chk_exit:
rts;
codec_init_data_mode:
interrupt_disable
serial_port_0_disable
autobuf_port_0_disable
data_to_mem(0x00,fifo_tx+0) /* (dummy) */
data_to_mem(0x00,fifo_tx+1) /* | */
data_to_mem(0x00,fifo_tx+2) /* | */
data_to_mem(0x00,fifo_tx+3) /* (dummy) */
data_to_mem(0xc0,fifo_tx+4) /* Output Enable, Lch : 0db ATT */
data_to_mem(0x00,fifo_tx+5) /* Rch : 0db ATT */
data_to_mem(0xc6,fifo_tx+6) /* Input <- Line, Lch : gain 9dB */
data_to_mem(0xf6,fifo_tx+7) /* Rch : gain 9dB */
I0=^fifo_tx; M0=1; L0=8;
I1=^fifo_rx; M1=1; L1=8;
I2=^fifo_tx; M2=1; L2=2; /* Data Buffer for Tx (L) */
I3=^fifo_rx; M3=1; L3=2; /* Rx (L) */
data_to_reg(0x8607,Sport0_Ctrl_Reg) /* CODEC --> Running Mode */
data_to_reg(dc,codec_ctrl) /* Change to Data Mode */
direct_tx_port_0(I0,M0)
autobuf_port_0_enable /* tx=I0, rx=I1 */
serial_port_0_enable
interrupt_s0_rx_enable
rts;
.VAR/DM/RAM/ABS=0x0800 interface;
/* Offset : +0 = original wave data */
/* : +1 = effected wave data */
/* : +2 = delay offset for 2nd */
/* : +3 = delay offset for 3rd */
/* : +4 = delay offset for 4th */
/* : +5 = multiply data for 1st */
/* : +6 = multiply data for 2nd */
/* : +7 = multiply data for 3rd */
/* : +8 = multiply data for 4th */
.VAR/DM/RAM/ABS=0x2000/CIRC data_fifo[4096];
start:
call codec_initialize; /* DSP_HEAD.H */
I4=^data_fifo; M4=1; L4=4096;
I5=^data_fifo; M5=1; L5=0;
main:
codec_to_AR_reg_mono; /* Get A/D Data : DSP_HEAD.H */
DM(I4,M4)=AR;
DM(interface+0)=AR;
AY0=I4;
AY1=0x2fff;
MY0=DM(interface+5);
MR=AR*MY0 (ss);
AX0=DM(interface+2);
AR=AX0+AY0;
AR=AR and AY1;
I5=AR;
AR=DM(I5,M5);
MY0=DM(interface+6);
MR=MR+AR*MY0 (ss);
AX0=DM(interface+3);
AR=AX0+AY0;
AR=AR and AY1;
I5=AR;
AR=DM(I5,M5);
MY0=DM(interface+7);
MR=MR+AR*MY0 (ss);
AX0=DM(interface+4);
AR=AX0+AY0;
AR=AR and AY1;
I5=AR;
AR=DM(I5,M5);
MY0=DM(interface+8);
MR=MR+AR*MY0 (ss);
SR0=MR1;
DM(interface+1)=SR0;
SR0_reg_to_codec_mono; /* Put to D/A : DSP_HEAD.H */
waiting_for_interrupt
jump main;
.ENDMOD;
=============================================================================
.MODULE/RAM/BOOT = 0/ABS = 0 transfer;
.const Sys_Ctrl_Reg= 0x3fff;
.const Dm_Wait_Reg= 0x3ffe;
.const Tperiod_Reg= 0x3ffd;
.const Tcount_Reg= 0x3ffc;
.const Tscale_Reg= 0x3ffb;
.const Sport0_Rx_Words1= 0x3ffa;
.const Sport0_Rx_Words0= 0x3ff9;
.const Sport0_Tx_Words1= 0x3ff8;
.const Sport0_Tx_Words0= 0x3ff7;
.const Sport0_Ctrl_Reg= 0x3ff6;
.const Sport0_Sclkdiv= 0x3ff5;
.const Sport0_Rfsdiv= 0x3ff4;
.const Sport0_Autobuf_Ctrl= 0x3ff3;
.const Sport1_Ctrl_Reg= 0x3ff2;
.const Sport1_Sclkdiv= 0x3ff1;
.const Sport1_Rfsdiv= 0x3ff0;
.const Sport1_Autobuf_Ctrl= 0x3fef;
{ SYSTEM I/O ADDRESS DEFINES }
.const Sys_Ctrl_Reg= 0x3fff;
.const Dm_Wait_Reg= 0x3ffe;
.const Tperiod_Reg= 0x3ffd;
.const Tcount_Reg= 0x3ffc;
.const Tscale_Reg= 0x3ffb;
.const Sport0_Rx_Words1= 0x3ffa;
.const Sport0_Rx_Words0= 0x3ff9;
.const Sport0_Tx_Words1= 0x3ff8;
.const Sport0_Tx_Words0= 0x3ff7;
.const Sport0_Ctrl_Reg= 0x3ff6;
.const Sport0_Sclkdiv= 0x3ff5;
.const Sport0_Rfsdiv= 0x3ff4;
.const Sport0_Autobuf_Ctrl= 0x3ff3;
.const Sport1_Ctrl_Reg= 0x3ff2;
.const Sport1_Sclkdiv= 0x3ff1;
.const Sport1_Rfsdiv= 0x3ff0;
.const Sport1_Autobuf_Ctrl= 0x3fef;
.CONST comcrdy = 0x0803;
.CONST comdrdy = 0x0804;
.CONST cpudt = 0x0810;
.CONST dspdt = 0x0811;
{ BOAD REGISTERS }
.CONST hs_readonly = 0x0600;
.CONST handshake = 0x0700;
.CONST dipswitch = 0x0400;
.CONST codec_ctrl = 0x0400;
{ CONTROLE BITS }
.CONST d2c = 0x2000;
.CONST c2d = 0x1000;
.CONST s8 = 0x8000;
.CONST s4 = 0x4000;
.CONST s2 = 0x2000;
.CONST s1 = 0x1000;
.CONST dc = 0x1000;
.CONST c2denb = 0x2000;
.CONST extenb = 0x4000;
{ MEMORY STRUCTURE }
.CONST dm_top = 0x0800;
.CONST dm_bottom = 0x3BFF;
.CONST pm_top = 0x0000;
.CONST pm_bottom = 0x3FFF;
.CONST ext_dm_top = 0x0800;
.CONST ext_dm_bottom = 0x37FF;
.CONST int_dm_top = 0x3800;
.CONST int_dm_bottom = 0x3BFF;
.CONST ext_pm_top = 0x0800;
.CONST ext_pm_bottom = 0x3FFF;
.CONST int_pm_top = 0x0000;
.CONST int_pm_bottom = 0x07FF;
{ TERMINATE PROGRAM }
.CONST end_of_prog = 0x001D;
/******************** Special Macro Defines ********************/
#define data_to_mem(data,memory) AX0=data; DM(memory)=AX0;
#define data_to_reg(data,register) AX0=data; DM(register)=AX0;
#define interrupt_disable IFC=0x3f; IMASK=0x00;
#define interrupt_s0_rx_enable IFC=0x3f; IMASK=0x08;
#define interrupt_s0_tx_enable IFC=0x3f; IMASK=0x10;
#define waiting_for_interrupt idle;
#define direct_tx_port_0(i_reg,m_reg) AX0=DM(i_reg,m_reg); TX0=AX0;
#define serial_port_0_disable data_to_reg(0x0408,Sys_Ctrl_Reg)
#define serial_port_0_enable data_to_reg(0x1408,Sys_Ctrl_Reg)
#define autobuf_port_0_disable data_to_reg(0x0000,Sport0_Autobuf_Ctrl)
#define autobuf_port_0_enable data_to_reg(0x0017,Sport0_Autobuf_Ctrl)
.MACRO codec_to_AR_reg_mono;
SR0=DM(I3,M3); AY0=DM(I3,M3);
SR=lshift SR0 by 8 (lo); AR=SR0 or AY0;
.ENDMACRO;
.MACRO SR0_reg_to_codec_mono;
AY0=0xff; AR=SR0 and AY0; SR=lshift SR0 by -8 (lo);
DM(I2,M2)=SR0; DM(I2,M2)=AR;
.ENDMACRO;
/******************** Buffer Memory Defines ********************/
.VAR/DM/RAM/ABS=0x0900/CIRC fifo_tx[8];
.VAR/DM/RAM/ABS=0x0910/CIRC fifo_rx[8];
/******************** Reset Vectors Defines ********************/
jump start; nop; nop; nop; {Reset Vector}
RTI; nop; nop; nop; {irq2}
RTI; nop; nop; nop; {sport0 TX}
RTI; nop; nop; nop; {sport0 RX}
RTI; nop; nop; nop; {irq0}
RTI; nop; nop; nop; {irq1}
RTI; nop; nop; nop; {timer}
/******************** Common Subroutines ********************/
codec_initialize:
call codec_system_init;
call codec_init_command_mode;
call codec_init_data_mode;
rts;
codec_system_init:
data_to_reg(0x01,Dm_Wait_Reg) /* 1 wait */
data_to_reg(0xff,Sport0_Rfsdiv) /* Multi-ch, 256bit */
data_to_reg(0x00,Sport0_Sclkdiv) /* divide rate */
data_to_reg(0xff,Sport0_Tx_Words0) /* LSB 16bit Tx */
data_to_reg(0xff,Sport0_Rx_Words0) /* Rx */
data_to_reg(0x00,Sport0_Tx_Words1) /* MSB 16bit Tx */
data_to_reg(0x00,Sport0_Rx_Words1) /* Rx */
rts;
codec_init_command_mode:
interrupt_disable
serial_port_0_disable
autobuf_port_0_disable
data_to_mem(0x08,fifo_tx+0) /* olb=1, clb=0(control) */
data_to_mem(0x1c,fifo_tx+1) /* 32KHz, Stereo, 16bit */
data_to_mem(0x9a,fifo_tx+2) /* 256bit, x1, gen.clk */
data_to_mem(0x00,fifo_tx+3) /* (reserved) */
data_to_mem(0xc0,fifo_tx+4) /* (reserved) */
data_to_mem(0x00,fifo_tx+6) /* (reserved) */
I0=^fifo_tx; M0=1; L0=8;
I1=^fifo_rx; M1=1; L1=8;
data_to_reg(0xc707,Sport0_Ctrl_Reg) /* CODEC --> Setting Mode */
direct_tx_port_0(I0,M0)
autobuf_port_0_enable /* tx=I0, rx=I1 */
serial_port_0_enable
interrupt_s0_rx_enable
loop_1:
waiting_for_interrupt
call check_1;
if ne jump loop_1;
interrupt_s0_tx_enable
data_to_mem(0x000C,fifo_tx+0) /* clb set */
waiting_for_interrupt
waiting_for_interrupt
waiting_for_interrupt
rts;
check_1:
AX0=DM(fifo_rx+0); AY0=0x04; AR=AX0 and AY0;
if ne jump chk_exit;
AX0=DM(fifo_tx+1); AY0=DM(fifo_rx+1); AR=AX0-AY0;
if ne jump chk_exit;
AX0=DM(fifo_tx+2); AY0=DM(fifo_rx+2); AF=AX0 xor AY0;
AX0=0xFF7F; AR=AX0 and AF;
chk_exit:
rts;
codec_init_data_mode:
interrupt_disable
serial_port_0_disable
autobuf_port_0_disable
data_to_mem(0x00,fifo_tx+0) /* (dummy) */
data_to_mem(0x00,fifo_tx+1) /* | */
data_to_mem(0x00,fifo_tx+2) /* | */
data_to_mem(0x00,fifo_tx+3) /* (dummy) */
data_to_mem(0xc0,fifo_tx+4) /* Output Enable, Lch : 0db ATT */
data_to_mem(0x00,fifo_tx+5) /* Rch : 0db ATT */
data_to_mem(0xc6,fifo_tx+6) /* Input <- Line, Lch : gain 9dB */
data_to_mem(0xf6,fifo_tx+7) /* Rch : gain 9dB */
I0=^fifo_tx; M0=1; L0=8;
I1=^fifo_rx; M1=1; L1=8;
I2=^fifo_tx; M2=1; L2=2; /* Data Buffer for Tx (L) */
I3=^fifo_rx; M3=1; L3=2; /* Rx (L) */
data_to_reg(0x8607,Sport0_Ctrl_Reg) /* CODEC --> Running Mode */
data_to_reg(dc,codec_ctrl) /* Change to Data Mode */
direct_tx_port_0(I0,M0)
autobuf_port_0_enable /* tx=I0, rx=I1 */
serial_port_0_enable
interrupt_s0_rx_enable
rts;
{ interupt vector table }
jump start; RTI; RTI; RTI; {Reset Vector}
RTI; RTI; RTI; RTI; {irq2}
RTI; RTI; RTI; RTI; {sport0 TX}
RTI; RTI; RTI; RTI; {sport0 RX}
RTI; RTI; RTI; RTI; {irq0}
RTI; RTI; RTI; RTI; {irq1}
RTI; RTI; RTI; RTI; {timer}
#include <dsp_tail.h>;
start:
AX0 = 0x0408; DM(Sys_Ctrl_Reg) = AX0;
AX0 = 1; DM(Dm_Wait_Reg) = AX0;
AX0 = 0; DM(comdrdy) = AX0; DM(comcrdy) = AX0;
AX0 = d2c; DM(handshake) = AX0;
testtop:
CALL get_wd;
AY0 = SI;
AR = AY0 + 1;
SI = AR;
CALL put_wd;
JUMP testtop;
.ENDMOD;
=============================================================================
.MODULE/RAM/BOOT = 0/ABS = 0 test;
.const Sys_Ctrl_Reg= 0x3fff;
.const Dm_Wait_Reg= 0x3ffe;
.const Tperiod_Reg= 0x3ffd;
.const Tcount_Reg= 0x3ffc;
.const Tscale_Reg= 0x3ffb;
.const Sport0_Rx_Words1= 0x3ffa;
.const Sport0_Rx_Words0= 0x3ff9;
.const Sport0_Tx_Words1= 0x3ff8;
.const Sport0_Tx_Words0= 0x3ff7;
.const Sport0_Ctrl_Reg= 0x3ff6;
.const Sport0_Sclkdiv= 0x3ff5;
.const Sport0_Rfsdiv= 0x3ff4;
.const Sport0_Autobuf_Ctrl= 0x3ff3;
.const Sport1_Ctrl_Reg= 0x3ff2;
.const Sport1_Sclkdiv= 0x3ff1;
.const Sport1_Rfsdiv= 0x3ff0;
.const Sport1_Autobuf_Ctrl= 0x3fef;
{ SYSTEM I/O ADDRESS DEFINES }
.const Sys_Ctrl_Reg= 0x3fff;
.const Dm_Wait_Reg= 0x3ffe;
.const Tperiod_Reg= 0x3ffd;
.const Tcount_Reg= 0x3ffc;
.const Tscale_Reg= 0x3ffb;
.const Sport0_Rx_Words1= 0x3ffa;
.const Sport0_Rx_Words0= 0x3ff9;
.const Sport0_Tx_Words1= 0x3ff8;
.const Sport0_Tx_Words0= 0x3ff7;
.const Sport0_Ctrl_Reg= 0x3ff6;
.const Sport0_Sclkdiv= 0x3ff5;
.const Sport0_Rfsdiv= 0x3ff4;
.const Sport0_Autobuf_Ctrl= 0x3ff3;
.const Sport1_Ctrl_Reg= 0x3ff2;
.const Sport1_Sclkdiv= 0x3ff1;
.const Sport1_Rfsdiv= 0x3ff0;
.const Sport1_Autobuf_Ctrl= 0x3fef;
.CONST comcrdy = 0x0803;
.CONST comdrdy = 0x0804;
.CONST cpudt = 0x0810;
.CONST dspdt = 0x0811;
{ BOAD REGISTERS }
.CONST hs_readonly = 0x0600;
.CONST handshake = 0x0700;
.CONST dipswitch = 0x0400;
.CONST codec_ctrl = 0x0400;
{ CONTROLE BITS }
.CONST d2c = 0x2000;
.CONST c2d = 0x1000;
.CONST s8 = 0x8000;
.CONST s4 = 0x4000;
.CONST s2 = 0x2000;
.CONST s1 = 0x1000;
.CONST dc = 0x1000;
.CONST c2denb = 0x2000;
.CONST extenb = 0x4000;
{ MEMORY STRUCTURE }
.CONST dm_top = 0x0800;
.CONST dm_bottom = 0x3BFF;
.CONST pm_top = 0x0000;
.CONST pm_bottom = 0x3FFF;
.CONST ext_dm_top = 0x0800;
.CONST ext_dm_bottom = 0x37FF;
.CONST int_dm_top = 0x3800;
.CONST int_dm_bottom = 0x3BFF;
.CONST ext_pm_top = 0x0800;
.CONST ext_pm_bottom = 0x3FFF;
.CONST int_pm_top = 0x0000;
.CONST int_pm_bottom = 0x07FF;
{ TERMINATE PROGRAM }
.CONST end_of_prog = 0x001D;
/******************** Special Macro Defines ********************/
#define data_to_mem(data,memory) AX0=data; DM(memory)=AX0;
#define data_to_reg(data,register) AX0=data; DM(register)=AX0;
#define interrupt_disable IFC=0x3f; IMASK=0x00;
#define interrupt_s0_rx_enable IFC=0x3f; IMASK=0x08;
#define interrupt_s0_tx_enable IFC=0x3f; IMASK=0x10;
#define waiting_for_interrupt idle;
#define direct_tx_port_0(i_reg,m_reg) AX0=DM(i_reg,m_reg); TX0=AX0;
#define serial_port_0_disable data_to_reg(0x0408,Sys_Ctrl_Reg)
#define serial_port_0_enable data_to_reg(0x1408,Sys_Ctrl_Reg)
#define autobuf_port_0_disable data_to_reg(0x0000,Sport0_Autobuf_Ctrl)
#define autobuf_port_0_enable data_to_reg(0x0017,Sport0_Autobuf_Ctrl)
.MACRO codec_to_AR_reg_mono;
SR0=DM(I3,M3); AY0=DM(I3,M3);
SR=lshift SR0 by 8 (lo); AR=SR0 or AY0;
.ENDMACRO;
.MACRO SR0_reg_to_codec_mono;
AY0=0xff; AR=SR0 and AY0; SR=lshift SR0 by -8 (lo);
DM(I2,M2)=SR0; DM(I2,M2)=AR;
.ENDMACRO;
/******************** Buffer Memory Defines ********************/
.VAR/DM/RAM/ABS=0x0900/CIRC fifo_tx[8];
.VAR/DM/RAM/ABS=0x0910/CIRC fifo_rx[8];
/******************** Reset Vectors Defines ********************/
jump start; nop; nop; nop; {Reset Vector}
RTI; nop; nop; nop; {irq2}
RTI; nop; nop; nop; {sport0 TX}
RTI; nop; nop; nop; {sport0 RX}
RTI; nop; nop; nop; {irq0}
RTI; nop; nop; nop; {irq1}
RTI; nop; nop; nop; {timer}
/******************** Common Subroutines ********************/
codec_initialize:
call codec_system_init;
call codec_init_command_mode;
call codec_init_data_mode;
rts;
codec_system_init:
data_to_reg(0x01,Dm_Wait_Reg) /* 1 wait */
data_to_reg(0xff,Sport0_Rfsdiv) /* Multi-ch, 256bit */
data_to_reg(0x00,Sport0_Sclkdiv) /* divide rate */
data_to_reg(0xff,Sport0_Tx_Words0) /* LSB 16bit Tx */
data_to_reg(0xff,Sport0_Rx_Words0) /* Rx */
data_to_reg(0x00,Sport0_Tx_Words1) /* MSB 16bit Tx */
data_to_reg(0x00,Sport0_Rx_Words1) /* Rx */
rts;
codec_init_command_mode:
interrupt_disable
serial_port_0_disable
autobuf_port_0_disable
data_to_mem(0x08,fifo_tx+0) /* olb=1, clb=0(control) */
data_to_mem(0x1c,fifo_tx+1) /* 32KHz, Stereo, 16bit */
data_to_mem(0x9a,fifo_tx+2) /* 256bit, x1, gen.clk */
data_to_mem(0x00,fifo_tx+3) /* (reserved) */
data_to_mem(0xc0,fifo_tx+4) /* (reserved) */
data_to_mem(0x00,fifo_tx+6) /* (reserved) */
I0=^fifo_tx; M0=1; L0=8;
I1=^fifo_rx; M1=1; L1=8;
data_to_reg(0xc707,Sport0_Ctrl_Reg) /* CODEC --> Setting Mode */
direct_tx_port_0(I0,M0)
autobuf_port_0_enable /* tx=I0, rx=I1 */
serial_port_0_enable
interrupt_s0_rx_enable
loop_1:
waiting_for_interrupt
call check_1;
if ne jump loop_1;
interrupt_s0_tx_enable
data_to_mem(0x000C,fifo_tx+0) /* clb set */
waiting_for_interrupt
waiting_for_interrupt
waiting_for_interrupt
rts;
check_1:
AX0=DM(fifo_rx+0); AY0=0x04; AR=AX0 and AY0;
if ne jump chk_exit;
AX0=DM(fifo_tx+1); AY0=DM(fifo_rx+1); AR=AX0-AY0;
if ne jump chk_exit;
AX0=DM(fifo_tx+2); AY0=DM(fifo_rx+2); AF=AX0 xor AY0;
AX0=0xFF7F; AR=AX0 and AF;
chk_exit:
rts;
codec_init_data_mode:
interrupt_disable
serial_port_0_disable
autobuf_port_0_disable
data_to_mem(0x00,fifo_tx+0) /* (dummy) */
data_to_mem(0x00,fifo_tx+1) /* | */
data_to_mem(0x00,fifo_tx+2) /* | */
data_to_mem(0x00,fifo_tx+3) /* (dummy) */
data_to_mem(0xc0,fifo_tx+4) /* Output Enable, Lch : 0db ATT */
data_to_mem(0x00,fifo_tx+5) /* Rch : 0db ATT */
data_to_mem(0xc6,fifo_tx+6) /* Input <- Line, Lch : gain 9dB */
data_to_mem(0xf6,fifo_tx+7) /* Rch : gain 9dB */
I0=^fifo_tx; M0=1; L0=8;
I1=^fifo_rx; M1=1; L1=8;
I2=^fifo_tx; M2=1; L2=2; /* Data Buffer for Tx (L) */
I3=^fifo_rx; M3=1; L3=2; /* Rx (L) */
data_to_reg(0x8607,Sport0_Ctrl_Reg) /* CODEC --> Running Mode */
data_to_reg(dc,codec_ctrl) /* Change to Data Mode */
direct_tx_port_0(I0,M0)
autobuf_port_0_enable /* tx=I0, rx=I1 */
serial_port_0_enable
interrupt_s0_rx_enable
rts;
.VAR/DM/RAM/ABS=0x2010/CIRC s0_ctl_send[8]; /* 2010-2017 */
.VAR/DM/RAM/ABS=0x2020/CIRC s0_ctl_recv[8]; /* 2020-2027 */
.VAR/DM/RAM/ABS=0x2030/CIRC s0_dat_send[8]; /* 2030-2037 */
.VAR/DM/RAM/ABS=0x2040/CIRC s0_dat_recv[8]; /* 2040-2047 */
#define ts1 0
#define ts2 1
#define ts3 2
#define ts4 3
#define ts5 4
#define ts6 5
#define ts7 6
#define ts8 7
{ interupt vector table }
jump start; RTI; RTI; RTI; {Reset Vector}
RTI; RTI; RTI; RTI; {irq2}
jump s0send; RTI; RTI; RTI; {sport0 TX}
jump s0recv; RTI; RTI; RTI; {sport0 RX}
RTI; RTI; RTI; RTI; {irq0}
RTI; RTI; RTI; RTI; {irq1}
RTI; RTI; RTI; RTI; {timer}
#include <dsp_tail.h>;
start:
ifc=0x3f; IMASK=0x00; /* int disable */
AX0 = 0x0408; DM(Sys_Ctrl_Reg) = AX0; /* sport0 disable */
AX0 = 1; DM(Dm_Wait_Reg) = AX0;
initcodec:
AX0=0x00ff; DM(Sport0_Tx_Words0)=AX0; /* 64bit */
AX0=0x00ff; DM(Sport0_Rx_Words0)=AX0; /* 64bit */
AX0=0x0000; DM(Sport0_Tx_Words1)=AX0;
AX0=0x0000; DM(Sport0_Rx_Words1)=AX0;
AX0=0xc707; DM(Sport0_Ctrl_Reg)=AX0; /* rfs send mode */
AX0=0x0000; DM(Sport0_Sclkdiv)=AX0;
AX0=255; DM(Sport0_Rfsdiv)=AX0; /* multichannel,256bit */
{ control mode timeslot }
AX0=0x8; DM(s0_ctl_send+ts1)=AX0; /* olb=1,clb=0 */
/* AX0=0x0; DM(s0_ctl_send+ts1)=AX0; olb=0,clb=0 */
AX0=0x34; DM(s0_ctl_send+ts2)=AX0; /* 48KHz,st,16bit */
AX0=0x9a; DM(s0_ctl_send+ts3)=AX0; /* 256b,x1,gen.clk */
AX0=0; DM(s0_ctl_send+ts4)=AX0;
AX0=0xc0; DM(s0_ctl_send+ts5)=AX0;
AX0=0; DM(s0_ctl_send+ts6)=AX0;
AX0=0; DM(s0_ctl_send+ts7)=AX0;
AX0=0; DM(s0_ctl_send+ts8)=AX0;
AX0=0xffff; DM(s0_ctl_recv+ts1)=AX0;
AX0=0xffff; DM(s0_ctl_recv+ts2)=AX0;
AX0=0xffff; DM(s0_ctl_recv+ts3)=AX0;
{ data time slot }
AX0=0x0; DM(s0_dat_send+ts1)=AX0;
AX0=0x0; DM(s0_dat_send+ts2)=AX0;
AX0=0x0; DM(s0_dat_send+ts3)=AX0;
AX0=0x0; DM(s0_dat_send+ts4)=AX0;
AX0=0xc2; DM(s0_dat_send+ts5)=AX0; /* out enb,Rch:3dbATT */
AX0=0x02; DM(s0_dat_send+ts6)=AX0; /* Rch:3dbATT */
AX0=0xdc; DM(s0_dat_send+ts7)=AX0; /* AUX-I,Lch:gain24dB */
AX0=0xfc; DM(s0_dat_send+ts8)=AX0; /* AUX-I,Rch:gain24dB */
AX0=0xaa; DM(s0_dat_recv+ts1)=AX0;
AX0=0xaa; DM(s0_dat_recv+ts2)=AX0;
AX0=0xaa; DM(s0_dat_recv+ts3)=AX0;
AX0=0x0; DM(s0_dat_recv+ts4)=AX0;
AX0=0x0; DM(s0_dat_recv+ts5)=AX0;
AX0=0x0; DM(s0_dat_recv+ts6)=AX0;
AX0=0x0; DM(s0_dat_recv+ts7)=AX0;
AX0=0x0; DM(s0_dat_recv+ts8)=AX0;
{ control mode set }
I0 =^s0_ctl_send; M0=1; L0=8;
I1 =^s0_ctl_recv; M1=1; L1=8;
AX0 =DM(I0,M0); TX0=AX0;
AX0=0x17; /* tx=I0,rx=I1 autobuf enable */
DM(Sport0_Autobuf_Ctrl)=AX0;
AX0 = 0x1408; DM(Sys_Ctrl_Reg) = AX0; /* sport0 enable */
ifc=0x3f; /* all int clr */
IMASK=0x08; /* s0 rx int enable */
loop1: idle;
CALL control_mode_chk;
IF NE jump loop1;
ifc=0x3f;
IMASK=0x10; /* s0 tx int enb */
AX0=0x0C; DM(s0_ctl_send+ts1)=AX0; /* clb set */
/* AX0=0x04; DM(s0_ctl_send+ts1)=AX0; clb set */
idle;
idle;
idle;
IMASK=0; IFC=0x3F;
AX0=0x00; DM(Sport0_Autobuf_Ctrl)=AX0;
AX0 = 0x0408; DM(Sys_Ctrl_Reg) = AX0; /* sport0 disable */
{ dsp set data mode }
AX0=0x8607; DM(Sport0_Ctrl_Reg)=AX0; /* rfs receive mode */
AX0=0xff; DM(Sport0_Tx_Words0)=AX0; /* 64bit */
AX0=0xff; DM(Sport0_Rx_Words0)=AX0; /* 64bit */
AX0=0x00; DM(Sport0_Tx_Words1)=AX0;
AX0=0x00; DM(Sport0_Rx_Words1)=AX0;
I0 =^s0_dat_send; M0=1; L0=8;
I1 =^s0_dat_recv; M1=1; L1=8;
I2 =^s0_dat_recv; M2=1; L2=4;
I3 =^s0_dat_send; M3=1; L3=4;
AX0 = 0x1408; DM(Sys_Ctrl_Reg) = AX0; /* sport0 enable */
AX0=DM(I0,M0); TX0=AX0;
AX0=0x17; /* tx=I0,rx=I1 autobuf enable */
DM(Sport0_Autobuf_Ctrl)=AX0;
AX0=dc; DM(codec_ctrl)=AX0; /* set dc to high */
IFC=0x3f; IMASK=0x08;
loop2: idle;
AY1=DM(I2,M2); DM(I3,M3)=AY1; /* left msb 8bit */
AY1=DM(I2,M2); DM(I3,M3)=AY1; /* left lsb 8bit */
AY1=DM(I2,M2); DM(I3,M3)=AY1; /* right msb 8bit */
AY1=DM(I2,M2); DM(I3,M3)=AY1; /* right msb 8bit */
jump loop2;
control_mode_chk:
{ for CS4215 rev.1 }
AX0=DM(s0_ctl_recv+ts1);
AY0=0x04; AR=AX0 and AY0;
IF NE jump chk1;
AX0=DM(s0_ctl_send+ts2);
AY0=DM(s0_ctl_recv+ts2);
AR=AX0-AY0;
IF NE jump chk1;
AX0=DM(s0_ctl_send+ts3);
AY0=DM(s0_ctl_recv+ts3);
AF=AX0 xor AY0;
AX0=0xFF7F; AR=AX0 and AF;
chk1: rts;
s0send: rti;
s0recv: rti;
.ENDMOD;
=============================================================================
.MODULE/RAM/BOOT = 0/ABS = 0 sine;
.const Sys_Ctrl_Reg= 0x3fff;
.const Dm_Wait_Reg= 0x3ffe;
.const Tperiod_Reg= 0x3ffd;
.const Tcount_Reg= 0x3ffc;
.const Tscale_Reg= 0x3ffb;
.const Sport0_Rx_Words1= 0x3ffa;
.const Sport0_Rx_Words0= 0x3ff9;
.const Sport0_Tx_Words1= 0x3ff8;
.const Sport0_Tx_Words0= 0x3ff7;
.const Sport0_Ctrl_Reg= 0x3ff6;
.const Sport0_Sclkdiv= 0x3ff5;
.const Sport0_Rfsdiv= 0x3ff4;
.const Sport0_Autobuf_Ctrl= 0x3ff3;
.const Sport1_Ctrl_Reg= 0x3ff2;
.const Sport1_Sclkdiv= 0x3ff1;
.const Sport1_Rfsdiv= 0x3ff0;
.const Sport1_Autobuf_Ctrl= 0x3fef;
{ SYSTEM I/O ADDRESS DEFINES }
.const Sys_Ctrl_Reg= 0x3fff;
.const Dm_Wait_Reg= 0x3ffe;
.const Tperiod_Reg= 0x3ffd;
.const Tcount_Reg= 0x3ffc;
.const Tscale_Reg= 0x3ffb;
.const Sport0_Rx_Words1= 0x3ffa;
.const Sport0_Rx_Words0= 0x3ff9;
.const Sport0_Tx_Words1= 0x3ff8;
.const Sport0_Tx_Words0= 0x3ff7;
.const Sport0_Ctrl_Reg= 0x3ff6;
.const Sport0_Sclkdiv= 0x3ff5;
.const Sport0_Rfsdiv= 0x3ff4;
.const Sport0_Autobuf_Ctrl= 0x3ff3;
.const Sport1_Ctrl_Reg= 0x3ff2;
.const Sport1_Sclkdiv= 0x3ff1;
.const Sport1_Rfsdiv= 0x3ff0;
.const Sport1_Autobuf_Ctrl= 0x3fef;
.CONST comcrdy = 0x0803;
.CONST comdrdy = 0x0804;
.CONST cpudt = 0x0810;
.CONST dspdt = 0x0811;
{ BOAD REGISTERS }
.CONST hs_readonly = 0x0600;
.CONST handshake = 0x0700;
.CONST dipswitch = 0x0400;
.CONST codec_ctrl = 0x0400;
{ CONTROLE BITS }
.CONST d2c = 0x2000;
.CONST c2d = 0x1000;
.CONST s8 = 0x8000;
.CONST s4 = 0x4000;
.CONST s2 = 0x2000;
.CONST s1 = 0x1000;
.CONST dc = 0x1000;
.CONST c2denb = 0x2000;
.CONST extenb = 0x4000;
{ MEMORY STRUCTURE }
.CONST dm_top = 0x0800;
.CONST dm_bottom = 0x3BFF;
.CONST pm_top = 0x0000;
.CONST pm_bottom = 0x3FFF;
.CONST ext_dm_top = 0x0800;
.CONST ext_dm_bottom = 0x37FF;
.CONST int_dm_top = 0x3800;
.CONST int_dm_bottom = 0x3BFF;
.CONST ext_pm_top = 0x0800;
.CONST ext_pm_bottom = 0x3FFF;
.CONST int_pm_top = 0x0000;
.CONST int_pm_bottom = 0x07FF;
{ TERMINATE PROGRAM }
.CONST end_of_prog = 0x001D;
/******************** Special Macro Defines ********************/
#define data_to_mem(data,memory) AX0=data; DM(memory)=AX0;
#define data_to_reg(data,register) AX0=data; DM(register)=AX0;
#define interrupt_disable IFC=0x3f; IMASK=0x00;
#define interrupt_s0_rx_enable IFC=0x3f; IMASK=0x08;
#define interrupt_s0_tx_enable IFC=0x3f; IMASK=0x10;
#define waiting_for_interrupt idle;
#define direct_tx_port_0(i_reg,m_reg) AX0=DM(i_reg,m_reg); TX0=AX0;
#define serial_port_0_disable data_to_reg(0x0408,Sys_Ctrl_Reg)
#define serial_port_0_enable data_to_reg(0x1408,Sys_Ctrl_Reg)
#define autobuf_port_0_disable data_to_reg(0x0000,Sport0_Autobuf_Ctrl)
#define autobuf_port_0_enable data_to_reg(0x0017,Sport0_Autobuf_Ctrl)
.MACRO codec_to_AR_reg_mono;
SR0=DM(I3,M3); AY0=DM(I3,M3);
SR=lshift SR0 by 8 (lo); AR=SR0 or AY0;
.ENDMACRO;
.MACRO SR0_reg_to_codec_mono;
AY0=0xff; AR=SR0 and AY0; SR=lshift SR0 by -8 (lo);
DM(I2,M2)=SR0; DM(I2,M2)=AR;
.ENDMACRO;
/******************** Buffer Memory Defines ********************/
.VAR/DM/RAM/ABS=0x0900/CIRC fifo_tx[8];
.VAR/DM/RAM/ABS=0x0910/CIRC fifo_rx[8];
/******************** Reset Vectors Defines ********************/
jump start; nop; nop; nop; {Reset Vector}
RTI; nop; nop; nop; {irq2}
RTI; nop; nop; nop; {sport0 TX}
RTI; nop; nop; nop; {sport0 RX}
RTI; nop; nop; nop; {irq0}
RTI; nop; nop; nop; {irq1}
RTI; nop; nop; nop; {timer}
/******************** Common Subroutines ********************/
codec_initialize:
call codec_system_init;
call codec_init_command_mode;
call codec_init_data_mode;
rts;
codec_system_init:
data_to_reg(0x01,Dm_Wait_Reg) /* 1 wait */
data_to_reg(0xff,Sport0_Rfsdiv) /* Multi-ch, 256bit */
data_to_reg(0x00,Sport0_Sclkdiv) /* divide rate */
data_to_reg(0xff,Sport0_Tx_Words0) /* LSB 16bit Tx */
data_to_reg(0xff,Sport0_Rx_Words0) /* Rx */
data_to_reg(0x00,Sport0_Tx_Words1) /* MSB 16bit Tx */
data_to_reg(0x00,Sport0_Rx_Words1) /* Rx */
rts;
codec_init_command_mode:
interrupt_disable
serial_port_0_disable
autobuf_port_0_disable
data_to_mem(0x08,fifo_tx+0) /* olb=1, clb=0(control) */
data_to_mem(0x1c,fifo_tx+1) /* 32KHz, Stereo, 16bit */
data_to_mem(0x9a,fifo_tx+2) /* 256bit, x1, gen.clk */
data_to_mem(0x00,fifo_tx+3) /* (reserved) */
data_to_mem(0xc0,fifo_tx+4) /* (reserved) */
data_to_mem(0x00,fifo_tx+6) /* (reserved) */
I0=^fifo_tx; M0=1; L0=8;
I1=^fifo_rx; M1=1; L1=8;
data_to_reg(0xc707,Sport0_Ctrl_Reg) /* CODEC --> Setting Mode */
direct_tx_port_0(I0,M0)
autobuf_port_0_enable /* tx=I0, rx=I1 */
serial_port_0_enable
interrupt_s0_rx_enable
loop_1:
waiting_for_interrupt
call check_1;
if ne jump loop_1;
interrupt_s0_tx_enable
data_to_mem(0x000C,fifo_tx+0) /* clb set */
waiting_for_interrupt
waiting_for_interrupt
waiting_for_interrupt
rts;
check_1:
AX0=DM(fifo_rx+0); AY0=0x04; AR=AX0 and AY0;
if ne jump chk_exit;
AX0=DM(fifo_tx+1); AY0=DM(fifo_rx+1); AR=AX0-AY0;
if ne jump chk_exit;
AX0=DM(fifo_tx+2); AY0=DM(fifo_rx+2); AF=AX0 xor AY0;
AX0=0xFF7F; AR=AX0 and AF;
chk_exit:
rts;
codec_init_data_mode:
interrupt_disable
serial_port_0_disable
autobuf_port_0_disable
data_to_mem(0x00,fifo_tx+0) /* (dummy) */
data_to_mem(0x00,fifo_tx+1) /* | */
data_to_mem(0x00,fifo_tx+2) /* | */
data_to_mem(0x00,fifo_tx+3) /* (dummy) */
data_to_mem(0xc0,fifo_tx+4) /* Output Enable, Lch : 0db ATT */
data_to_mem(0x00,fifo_tx+5) /* Rch : 0db ATT */
data_to_mem(0xc6,fifo_tx+6) /* Input <- Line, Lch : gain 9dB */
data_to_mem(0xf6,fifo_tx+7) /* Rch : gain 9dB */
I0=^fifo_tx; M0=1; L0=8;
I1=^fifo_rx; M1=1; L1=8;
I2=^fifo_tx; M2=1; L2=2; /* Data Buffer for Tx (L) */
I3=^fifo_rx; M3=1; L3=2; /* Rx (L) */
data_to_reg(0x8607,Sport0_Ctrl_Reg) /* CODEC --> Running Mode */
data_to_reg(dc,codec_ctrl) /* Change to Data Mode */
direct_tx_port_0(I0,M0)
autobuf_port_0_enable /* tx=I0, rx=I1 */
serial_port_0_enable
interrupt_s0_rx_enable
rts;
.VAR/DM/RAM/ABS=0x1000/CIRC dac_buf[0x1000];
.VAR/DM/RAM/ABS=0x2000 dac_amt;
.VAR/DM/RAM/ABS=0x2010/CIRC s0_ctl_send[8];
.VAR/DM/RAM/ABS=0x2020/CIRC s0_ctl_recv[8];
.VAR/DM/RAM/ABS=0x2030/CIRC s0_dat_send[8];
.VAR/DM/RAM/ABS=0x2040/CIRC s0_dat_recv[8];
#define ts1 0
#define ts2 1
#define ts3 2
#define ts4 3
#define ts5 4
#define ts6 5
#define ts7 6
#define ts8 7
{ interupt vector table }
jump start; RTI; RTI; RTI; {Reset Vector}
RTI; RTI; RTI; RTI; {irq2}
jump s0send; RTI; RTI; RTI; {sport0 TX}
jump s0recv; RTI; RTI; RTI; {sport0 RX}
RTI; RTI; RTI; RTI; {irq0}
RTI; RTI; RTI; RTI; {irq1}
RTI; RTI; RTI; RTI; {timer}
#include <dsp_tail.h>;
start:
ifc=0x3f; IMASK=0x00; /* int disable */
AX0 = 0x0408; DM(Sys_Ctrl_Reg) = AX0; /* sport0 disable */
AX0 = 1; DM(Dm_Wait_Reg) = AX0;
initcodec:
AX0=0x00ff; DM(Sport0_Tx_Words0)=AX0; /* 64bit */
AX0=0x00ff; DM(Sport0_Rx_Words0)=AX0; /* 64bit */
AX0=0x0000; DM(Sport0_Tx_Words1)=AX0;
AX0=0x0000; DM(Sport0_Rx_Words1)=AX0;
AX0=0xc707; DM(Sport0_Ctrl_Reg)=AX0; /* rfs send mode */
AX0=0x0000; DM(Sport0_Sclkdiv)=AX0;
AX0=255; DM(Sport0_Rfsdiv)=AX0; /* multichannel,256bit */
{ control mode timeslot }
AX0=0x8; DM(s0_ctl_send+ts1)=AX0; /* olb=1,clb=0 */
/* AX0=0x0; DM(s0_ctl_send+ts1)=AX0; olb=0,clb=0 */
AX0=0x34; DM(s0_ctl_send+ts2)=AX0; /* 48KHz,st,16bit */
AX0=0x9a; DM(s0_ctl_send+ts3)=AX0; /* 256b,x1,gen.clk */
AX0=0; DM(s0_ctl_send+ts4)=AX0;
AX0=0xc0; DM(s0_ctl_send+ts5)=AX0;
AX0=0; DM(s0_ctl_send+ts6)=AX0;
AX0=0; DM(s0_ctl_send+ts7)=AX0;
AX0=0; DM(s0_ctl_send+ts8)=AX0;
AX0=0xffff; DM(s0_ctl_recv+ts1)=AX0;
AX0=0xffff; DM(s0_ctl_recv+ts2)=AX0;
AX0=0xffff; DM(s0_ctl_recv+ts3)=AX0;
{ data time slot }
AX0=0x0; DM(s0_dat_send+ts1)=AX0;
AX0=0x0; DM(s0_dat_send+ts2)=AX0;
AX0=0x0; DM(s0_dat_send+ts3)=AX0;
AX0=0x0; DM(s0_dat_send+ts4)=AX0;
AX0=0xc5; DM(s0_dat_send+ts5)=AX0;
AX0=0x05; DM(s0_dat_send+ts6)=AX0;
AX0=0xd0; DM(s0_dat_send+ts7)=AX0;
AX0=0xf0; DM(s0_dat_send+ts8)=AX0;
AX0=0x0; DM(s0_dat_recv+ts1)=AX0;
AX0=0x0; DM(s0_dat_recv+ts2)=AX0;
AX0=0x0; DM(s0_dat_recv+ts3)=AX0;
AX0=0x0; DM(s0_dat_recv+ts4)=AX0;
AX0=0x0; DM(s0_dat_recv+ts5)=AX0;
AX0=0x0; DM(s0_dat_recv+ts6)=AX0;
AX0=0x0; DM(s0_dat_recv+ts7)=AX0;
AX0=0x0; DM(s0_dat_recv+ts8)=AX0;
{ control mode set }
I0 =^s0_ctl_send; M0=1; L0=8;
I1 =^s0_ctl_recv; M1=1; L1=8;
AX0 =DM(I0,M0); TX0=AX0;
AX0=0x17;
SI = RX0;
DM(Sport0_Autobuf_Ctrl)=AX0;
AX0 = 0x1408;
SI = RX0;
DM(Sys_Ctrl_Reg) = AX0;
IMASK=0x08; /* s0 rx int enb */
loop1: idle;
CALL control_mode_chk;
IF NE jump loop1;
IMASK=0x10; /* s0 tx int enb */
AX0=0x0C; DM(s0_ctl_send+ts1)=AX0; /* clb set */
idle;
idle;
IMASK=0;
{ dsp set data mode }
AX0=0x8607; DM(Sport0_Ctrl_Reg)=AX0;
AX0=0x00ff; DM(Sport0_Tx_Words0)=AX0;
AX0=0x00ff; DM(Sport0_Rx_Words0)=AX0;
AX0=0x0000; DM(Sport0_Tx_Words1)=AX0;
AX0=0x0000; DM(Sport0_Rx_Words1)=AX0;
{ }
I2 =^dac_buf; M2=1; L2=DM(dac_amt);
SI =DM(dac_amt); SR=LSHIFT SI BY -1 (LO);
AY0=^dac_buf; AR=SR0+AY0;
I3=AR; M3=1; L3=DM(dac_amt);
I0 =^s0_dat_send; M0=1; L0=8;
I1 =^s0_dat_recv; M1=1; L1=8;
AX0=0x16; SI = RX0;
DM(Sport0_Autobuf_Ctrl)=AX0;
CALL sin_dat_set;
IMASK=0x10;
AX0=dc; DM(codec_ctrl)=AX0; /* set dc to high */
loop2: idle;
CALL sin_dat_set;
jump loop2;
control_mode_chk:
{ for CS4215 rev. 1 }
AX0=DM(s0_ctl_recv+ts1);
AY0=0x04; AR=AX0 and AY0;
IF NE jump chk1;
AX0=DM(s0_ctl_send+ts2);
AY0=DM(s0_ctl_recv+ts2);
AR=AX0-AY0;
IF NE jump chk1;
AX0=DM(s0_ctl_send+ts3);
AY0=DM(s0_ctl_recv+ts3);
AF=AX0 xor AY0;
AX0=0xFF7F; AR=AX0 and AF;
chk1: rts;
sin_dat_set:
SI=DM(I2,M2);
SR=LSHIFT SI BY -8 (LO);
DM(s0_dat_send+ts1)=SR0;
DM(s0_dat_send+ts2)=SI;
SI=DM(I3,M3);
SR=LSHIFT SI BY -8 (LO);
DM(s0_dat_send+ts3)=SR0;
DM(s0_dat_send+ts4)=SI;
rts;
s0send: rti;
s0recv: rti;
.ENDMOD;
=============================================================================
.MODULE/RAM/BOOT = 0/ABS = 0 selftest;
.CONST dm_test_top = 0x0820;
.CONST pm_test_top = 0x1000;
.CONST complete = 0;
.CONST dm_fail = 1;
.CONST pm_fail = 2;
.CONST erradr = 0x0812;
.const Sys_Ctrl_Reg= 0x3fff;
.const Dm_Wait_Reg= 0x3ffe;
.const Tperiod_Reg= 0x3ffd;
.const Tcount_Reg= 0x3ffc;
.const Tscale_Reg= 0x3ffb;
.const Sport0_Rx_Words1= 0x3ffa;
.const Sport0_Rx_Words0= 0x3ff9;
.const Sport0_Tx_Words1= 0x3ff8;
.const Sport0_Tx_Words0= 0x3ff7;
.const Sport0_Ctrl_Reg= 0x3ff6;
.const Sport0_Sclkdiv= 0x3ff5;
.const Sport0_Rfsdiv= 0x3ff4;
.const Sport0_Autobuf_Ctrl= 0x3ff3;
.const Sport1_Ctrl_Reg= 0x3ff2;
.const Sport1_Sclkdiv= 0x3ff1;
.const Sport1_Rfsdiv= 0x3ff0;
.const Sport1_Autobuf_Ctrl= 0x3fef;
{ SYSTEM I/O ADDRESS DEFINES }
.const Sys_Ctrl_Reg= 0x3fff;
.const Dm_Wait_Reg= 0x3ffe;
.const Tperiod_Reg= 0x3ffd;
.const Tcount_Reg= 0x3ffc;
.const Tscale_Reg= 0x3ffb;
.const Sport0_Rx_Words1= 0x3ffa;
.const Sport0_Rx_Words0= 0x3ff9;
.const Sport0_Tx_Words1= 0x3ff8;
.const Sport0_Tx_Words0= 0x3ff7;
.const Sport0_Ctrl_Reg= 0x3ff6;
.const Sport0_Sclkdiv= 0x3ff5;
.const Sport0_Rfsdiv= 0x3ff4;
.const Sport0_Autobuf_Ctrl= 0x3ff3;
.const Sport1_Ctrl_Reg= 0x3ff2;
.const Sport1_Sclkdiv= 0x3ff1;
.const Sport1_Rfsdiv= 0x3ff0;
.const Sport1_Autobuf_Ctrl= 0x3fef;
.CONST comcrdy = 0x0803;
.CONST comdrdy = 0x0804;
.CONST cpudt = 0x0810;
.CONST dspdt = 0x0811;
{ BOAD REGISTERS }
.CONST hs_readonly = 0x0600;
.CONST handshake = 0x0700;
.CONST dipswitch = 0x0400;
.CONST codec_ctrl = 0x0400;
{ CONTROLE BITS }
.CONST d2c = 0x2000;
.CONST c2d = 0x1000;
.CONST s8 = 0x8000;
.CONST s4 = 0x4000;
.CONST s2 = 0x2000;
.CONST s1 = 0x1000;
.CONST dc = 0x1000;
.CONST c2denb = 0x2000;
.CONST extenb = 0x4000;
{ MEMORY STRUCTURE }
.CONST dm_top = 0x0800;
.CONST dm_bottom = 0x3BFF;
.CONST pm_top = 0x0000;
.CONST pm_bottom = 0x3FFF;
.CONST ext_dm_top = 0x0800;
.CONST ext_dm_bottom = 0x37FF;
.CONST int_dm_top = 0x3800;
.CONST int_dm_bottom = 0x3BFF;
.CONST ext_pm_top = 0x0800;
.CONST ext_pm_bottom = 0x3FFF;
.CONST int_pm_top = 0x0000;
.CONST int_pm_bottom = 0x07FF;
{ TERMINATE PROGRAM }
.CONST end_of_prog = 0x001D;
/******************** Special Macro Defines ********************/
#define data_to_mem(data,memory) AX0=data; DM(memory)=AX0;
#define data_to_reg(data,register) AX0=data; DM(register)=AX0;
#define interrupt_disable IFC=0x3f; IMASK=0x00;
#define interrupt_s0_rx_enable IFC=0x3f; IMASK=0x08;
#define interrupt_s0_tx_enable IFC=0x3f; IMASK=0x10;
#define waiting_for_interrupt idle;
#define direct_tx_port_0(i_reg,m_reg) AX0=DM(i_reg,m_reg); TX0=AX0;
#define serial_port_0_disable data_to_reg(0x0408,Sys_Ctrl_Reg)
#define serial_port_0_enable data_to_reg(0x1408,Sys_Ctrl_Reg)
#define autobuf_port_0_disable data_to_reg(0x0000,Sport0_Autobuf_Ctrl)
#define autobuf_port_0_enable data_to_reg(0x0017,Sport0_Autobuf_Ctrl)
.MACRO codec_to_AR_reg_mono;
SR0=DM(I3,M3); AY0=DM(I3,M3);
SR=lshift SR0 by 8 (lo); AR=SR0 or AY0;
.ENDMACRO;
.MACRO SR0_reg_to_codec_mono;
AY0=0xff; AR=SR0 and AY0; SR=lshift SR0 by -8 (lo);
DM(I2,M2)=SR0; DM(I2,M2)=AR;
.ENDMACRO;
/******************** Buffer Memory Defines ********************/
.VAR/DM/RAM/ABS=0x0900/CIRC fifo_tx[8];
.VAR/DM/RAM/ABS=0x0910/CIRC fifo_rx[8];
/******************** Reset Vectors Defines ********************/
jump start; nop; nop; nop; {Reset Vector}
RTI; nop; nop; nop; {irq2}
RTI; nop; nop; nop; {sport0 TX}
RTI; nop; nop; nop; {sport0 RX}
RTI; nop; nop; nop; {irq0}
RTI; nop; nop; nop; {irq1}
RTI; nop; nop; nop; {timer}
/******************** Common Subroutines ********************/
codec_initialize:
call codec_system_init;
call codec_init_command_mode;
call codec_init_data_mode;
rts;
codec_system_init:
data_to_reg(0x01,Dm_Wait_Reg) /* 1 wait */
data_to_reg(0xff,Sport0_Rfsdiv) /* Multi-ch, 256bit */
data_to_reg(0x00,Sport0_Sclkdiv) /* divide rate */
data_to_reg(0xff,Sport0_Tx_Words0) /* LSB 16bit Tx */
data_to_reg(0xff,Sport0_Rx_Words0) /* Rx */
data_to_reg(0x00,Sport0_Tx_Words1) /* MSB 16bit Tx */
data_to_reg(0x00,Sport0_Rx_Words1) /* Rx */
rts;
codec_init_command_mode:
interrupt_disable
serial_port_0_disable
autobuf_port_0_disable
data_to_mem(0x08,fifo_tx+0) /* olb=1, clb=0(control) */
data_to_mem(0x1c,fifo_tx+1) /* 32KHz, Stereo, 16bit */
data_to_mem(0x9a,fifo_tx+2) /* 256bit, x1, gen.clk */
data_to_mem(0x00,fifo_tx+3) /* (reserved) */
data_to_mem(0xc0,fifo_tx+4) /* (reserved) */
data_to_mem(0x00,fifo_tx+6) /* (reserved) */
I0=^fifo_tx; M0=1; L0=8;
I1=^fifo_rx; M1=1; L1=8;
data_to_reg(0xc707,Sport0_Ctrl_Reg) /* CODEC --> Setting Mode */
direct_tx_port_0(I0,M0)
autobuf_port_0_enable /* tx=I0, rx=I1 */
serial_port_0_enable
interrupt_s0_rx_enable
loop_1:
waiting_for_interrupt
call check_1;
if ne jump loop_1;
interrupt_s0_tx_enable
data_to_mem(0x000C,fifo_tx+0) /* clb set */
waiting_for_interrupt
waiting_for_interrupt
waiting_for_interrupt
rts;
check_1:
AX0=DM(fifo_rx+0); AY0=0x04; AR=AX0 and AY0;
if ne jump chk_exit;
AX0=DM(fifo_tx+1); AY0=DM(fifo_rx+1); AR=AX0-AY0;
if ne jump chk_exit;
AX0=DM(fifo_tx+2); AY0=DM(fifo_rx+2); AF=AX0 xor AY0;
AX0=0xFF7F; AR=AX0 and AF;
chk_exit:
rts;
codec_init_data_mode:
interrupt_disable
serial_port_0_disable
autobuf_port_0_disable
data_to_mem(0x00,fifo_tx+0) /* (dummy) */
data_to_mem(0x00,fifo_tx+1) /* | */
data_to_mem(0x00,fifo_tx+2) /* | */
data_to_mem(0x00,fifo_tx+3) /* (dummy) */
data_to_mem(0xc0,fifo_tx+4) /* Output Enable, Lch : 0db ATT */
data_to_mem(0x00,fifo_tx+5) /* Rch : 0db ATT */
data_to_mem(0xc6,fifo_tx+6) /* Input <- Line, Lch : gain 9dB */
data_to_mem(0xf6,fifo_tx+7) /* Rch : gain 9dB */
I0=^fifo_tx; M0=1; L0=8;
I1=^fifo_rx; M1=1; L1=8;
I2=^fifo_tx; M2=1; L2=2; /* Data Buffer for Tx (L) */
I3=^fifo_rx; M3=1; L3=2; /* Rx (L) */
data_to_reg(0x8607,Sport0_Ctrl_Reg) /* CODEC --> Running Mode */
data_to_reg(dc,codec_ctrl) /* Change to Data Mode */
direct_tx_port_0(I0,M0)
autobuf_port_0_enable /* tx=I0, rx=I1 */
serial_port_0_enable
interrupt_s0_rx_enable
rts;
{ interupt vector table }
JUMP start; RTI; RTI; RTI; {Reset Vector}
JUMP handler; RTI; RTI; RTI; {irq2}
RTI; RTI; RTI; RTI; {sport0 TX}
RTI; RTI; RTI; RTI; {sport0 RX}
RTI; RTI; RTI; RTI; {irq0}
RTI; RTI; RTI; RTI; {irq1}
RTI; RTI; RTI; RTI; {timer}
#include <dsp_tail.h>;
start:
AX0 = 0x0408; DM(Sys_Ctrl_Reg) = AX0;
AX0 = 1; DM(Dm_Wait_Reg) = AX0;
dm_5555:
SI = 0x5555;
CALL dmfill;
SI = 0x1234; { jam }
PX = 0x67;
CALL pmfill;
AX0 = 0x5555;
CALL dmcheck;
AR = PASS AX1;
IF EQ JUMP dm_AAAA;
AX0 = 0; DM(comdrdy) = AX0; DM(comcrdy) = AX0;
DM(erradr) = AY1;
SI = dm_fail; CALL put_wd;
IDLE;
dm_AAAA:
SI = 0xAAAA;
CALL dmfill;
SI = 0xfedc; { jam }
PX = 0xb9;
CALL pmfill;
AX0 = 0xAAAA;
CALL dmcheck;
AR = PASS AX1;
IF EQ JUMP dm_end;
AX0 = 0; DM(comdrdy) = AX0; DM(comcrdy) = AX0;
DM(comcrdy) = AX0;
DM(erradr) = AY1;
SI = dm_fail; CALL put_wd;
IDLE;
dm_end:
pm_5555:
SI = 0x5555;
PX = 0x55;
CALL pmfill;
SI = 0x1234; { JAM }
CALL dmfill;
AX0 = 0x5555;
PX = 0x55;
CALL pmcheck;
AR = PASS AX1;
IF EQ JUMP pm_AAAA;
AX0 = 0; DM(comdrdy) = AX0; DM(comcrdy) = AX0;
DM(erradr) = AY1;
SI = pm_fail; CALL put_wd;
IDLE;
pm_AAAA:
SI = 0xAAAA;
PX = 0xAA;
CALL pmfill;
SI = 0xfedc; { JAM }
CALL dmfill;
AX0 = 0xAAAA;
PX = 0xAA;
CALL pmcheck;
AR = PASS AX1;
IF EQ JUMP pm_end;
AX0 = 0; DM(comdrdy) = AX0; DM(comcrdy) = AX0;
DM(erradr) = AY1;
SI = pm_fail; CALL put_wd;
IDLE;
pm_end:
AX0 = 0; DM(comdrdy) = AX0; DM(comcrdy) = AX0;
DM(erradr) = AY1;
SI = complete; CALL put_wd;
int_cpu:
CALL intcheck;
int_dsp:
CALL intdsp;
IDLE;
{--------------------}
{ fill data memory with SI }
dmfill:
I0 = dm_test_top; M0 = 1; L0 = 0;
CNTR = dm_bottom - dm_test_top + 1;
DO fill_0 UNTIL CE;
fill_0: DM(I0, M0) = SI;
RTS;
{--------------------}
{ check data memory with AX0 }
dmcheck:
I0 = dm_test_top; M0 = 1; L0 = 0;
AR = dm_bottom - dm_test_top + 1;
AF = PASS AR;
check_0: AY0 = DM(I0, M0);
AR = AX0 - AY0;
IF EQ JUMP continue_0;
AX1 = dm_bottom + 1;
AR = AX1 - AF; AY1 = AR;
AX1 = 0xFFFF;
RTS;
continue_0: AF = AF - 1;
IF NE JUMP check_0;
AX1 = dm_bottom ;
AR = AX1 - AF; AY1 = AR;
AX1 = 0;
RTS;
{--------------------}
{ fill program memory with SI }
pmfill:
I4 = pm_test_top; M4 = 1; L4 = 0;
CNTR = pm_bottom - pm_test_top + 1;
DO fill_1 UNTIL CE;
fill_1: PM(I4, M4) = SI;
RTS;
{--------------------}
{ check program memory with AX0 }
pmcheck:
AX1 = PX;
I4 = pm_test_top; M4 = 1; L4 = 0;
AR = pm_bottom - pm_test_top + 1;
AF = PASS AR;
check_1: AY0 = PM(I4, M4);
AR = AX0 - AY0;
IF NE JUMP else_1;
AY0 = PX;
AR = AX1 - AY0;
IF NE JUMP else_1;
continue_1: AF = AF - 1;
IF NE JUMP check_1;
AX1 = pm_bottom ;
AR = AX1 - AF; AY1 = AR;
AX1 = 0;
RTS;
else_1: AX1 = pm_bottom + 1;
AR = AX1 - AF; AY1 = AR;
AX1 = 0xFFFF;
RTS;
{--------------------}
{ check Interrupt to CPU }
intcheck:
AX1 = 0; DM(handshake) = AX1; /* make int signal to low */
CALL get_wd; /* wait for CPU executes put_word(NULL); */
AX1 = d2c; DM(handshake) = AX1; /* make int signal hi */
RTS;
{--------------------}
{ check Interrupt to DSP }
intdsp:
AX0=c2denb; DM(codec_ctrl)=AX0;
IFC=0x20;
CALL put_wd; /* dummy data */
IMASK = 0x20;
IDLE;
AX0=0; DM(codec_ctrl)=AX0;
IMASK = 0;
RTS;
{--------------------}
{ Interrupt handler }
handler:
AX1 = DM(handshake);
RTI;
.ENDMOD;
=============================================================================
.MODULE/RAM/BOOT=0/ABS=0 test;
.const Sys_Ctrl_Reg= 0x3fff;
.const Dm_Wait_Reg= 0x3ffe;
.const Tperiod_Reg= 0x3ffd;
.const Tcount_Reg= 0x3ffc;
.const Tscale_Reg= 0x3ffb;
.const Sport0_Rx_Words1= 0x3ffa;
.const Sport0_Rx_Words0= 0x3ff9;
.const Sport0_Tx_Words1= 0x3ff8;
.const Sport0_Tx_Words0= 0x3ff7;
.const Sport0_Ctrl_Reg= 0x3ff6;
.const Sport0_Sclkdiv= 0x3ff5;
.const Sport0_Rfsdiv= 0x3ff4;
.const Sport0_Autobuf_Ctrl= 0x3ff3;
.const Sport1_Ctrl_Reg= 0x3ff2;
.const Sport1_Sclkdiv= 0x3ff1;
.const Sport1_Rfsdiv= 0x3ff0;
.const Sport1_Autobuf_Ctrl= 0x3fef;
{ SYSTEM I/O ADDRESS DEFINES }
.const Sys_Ctrl_Reg= 0x3fff;
.const Dm_Wait_Reg= 0x3ffe;
.const Tperiod_Reg= 0x3ffd;
.const Tcount_Reg= 0x3ffc;
.const Tscale_Reg= 0x3ffb;
.const Sport0_Rx_Words1= 0x3ffa;
.const Sport0_Rx_Words0= 0x3ff9;
.const Sport0_Tx_Words1= 0x3ff8;
.const Sport0_Tx_Words0= 0x3ff7;
.const Sport0_Ctrl_Reg= 0x3ff6;
.const Sport0_Sclkdiv= 0x3ff5;
.const Sport0_Rfsdiv= 0x3ff4;
.const Sport0_Autobuf_Ctrl= 0x3ff3;
.const Sport1_Ctrl_Reg= 0x3ff2;
.const Sport1_Sclkdiv= 0x3ff1;
.const Sport1_Rfsdiv= 0x3ff0;
.const Sport1_Autobuf_Ctrl= 0x3fef;
.CONST comcrdy = 0x0803;
.CONST comdrdy = 0x0804;
.CONST cpudt = 0x0810;
.CONST dspdt = 0x0811;
{ BOAD REGISTERS }
.CONST hs_readonly = 0x0600;
.CONST handshake = 0x0700;
.CONST dipswitch = 0x0400;
.CONST codec_ctrl = 0x0400;
{ CONTROLE BITS }
.CONST d2c = 0x2000;
.CONST c2d = 0x1000;
.CONST s8 = 0x8000;
.CONST s4 = 0x4000;
.CONST s2 = 0x2000;
.CONST s1 = 0x1000;
.CONST dc = 0x1000;
.CONST c2denb = 0x2000;
.CONST extenb = 0x4000;
{ MEMORY STRUCTURE }
.CONST dm_top = 0x0800;
.CONST dm_bottom = 0x3BFF;
.CONST pm_top = 0x0000;
.CONST pm_bottom = 0x3FFF;
.CONST ext_dm_top = 0x0800;
.CONST ext_dm_bottom = 0x37FF;
.CONST int_dm_top = 0x3800;
.CONST int_dm_bottom = 0x3BFF;
.CONST ext_pm_top = 0x0800;
.CONST ext_pm_bottom = 0x3FFF;
.CONST int_pm_top = 0x0000;
.CONST int_pm_bottom = 0x07FF;
{ TERMINATE PROGRAM }
.CONST end_of_prog = 0x001D;
/******************** Special Macro Defines ********************/
#define data_to_mem(data,memory) AX0=data; DM(memory)=AX0;
#define data_to_reg(data,register) AX0=data; DM(register)=AX0;
#define interrupt_disable IFC=0x3f; IMASK=0x00;
#define interrupt_s0_rx_enable IFC=0x3f; IMASK=0x08;
#define interrupt_s0_tx_enable IFC=0x3f; IMASK=0x10;
#define waiting_for_interrupt idle;
#define direct_tx_port_0(i_reg,m_reg) AX0=DM(i_reg,m_reg); TX0=AX0;
#define serial_port_0_disable data_to_reg(0x0408,Sys_Ctrl_Reg)
#define serial_port_0_enable data_to_reg(0x1408,Sys_Ctrl_Reg)
#define autobuf_port_0_disable data_to_reg(0x0000,Sport0_Autobuf_Ctrl)
#define autobuf_port_0_enable data_to_reg(0x0017,Sport0_Autobuf_Ctrl)
.MACRO codec_to_AR_reg_mono;
SR0=DM(I3,M3); AY0=DM(I3,M3);
SR=lshift SR0 by 8 (lo); AR=SR0 or AY0;
.ENDMACRO;
.MACRO SR0_reg_to_codec_mono;
AY0=0xff; AR=SR0 and AY0; SR=lshift SR0 by -8 (lo);
DM(I2,M2)=SR0; DM(I2,M2)=AR;
.ENDMACRO;
/******************** Buffer Memory Defines ********************/
.VAR/DM/RAM/ABS=0x0900/CIRC fifo_tx[8];
.VAR/DM/RAM/ABS=0x0910/CIRC fifo_rx[8];
/******************** Reset Vectors Defines ********************/
jump start; nop; nop; nop; {Reset Vector}
RTI; nop; nop; nop; {irq2}
RTI; nop; nop; nop; {sport0 TX}
RTI; nop; nop; nop; {sport0 RX}
RTI; nop; nop; nop; {irq0}
RTI; nop; nop; nop; {irq1}
RTI; nop; nop; nop; {timer}
/******************** Common Subroutines ********************/
codec_initialize:
call codec_system_init;
call codec_init_command_mode;
call codec_init_data_mode;
rts;
codec_system_init:
data_to_reg(0x01,Dm_Wait_Reg) /* 1 wait */
data_to_reg(0xff,Sport0_Rfsdiv) /* Multi-ch, 256bit */
data_to_reg(0x00,Sport0_Sclkdiv) /* divide rate */
data_to_reg(0xff,Sport0_Tx_Words0) /* LSB 16bit Tx */
data_to_reg(0xff,Sport0_Rx_Words0) /* Rx */
data_to_reg(0x00,Sport0_Tx_Words1) /* MSB 16bit Tx */
data_to_reg(0x00,Sport0_Rx_Words1) /* Rx */
rts;
codec_init_command_mode:
interrupt_disable
serial_port_0_disable
autobuf_port_0_disable
data_to_mem(0x08,fifo_tx+0) /* olb=1, clb=0(control) */
data_to_mem(0x1c,fifo_tx+1) /* 32KHz, Stereo, 16bit */
data_to_mem(0x9a,fifo_tx+2) /* 256bit, x1, gen.clk */
data_to_mem(0x00,fifo_tx+3) /* (reserved) */
data_to_mem(0xc0,fifo_tx+4) /* (reserved) */
data_to_mem(0x00,fifo_tx+6) /* (reserved) */
I0=^fifo_tx; M0=1; L0=8;
I1=^fifo_rx; M1=1; L1=8;
data_to_reg(0xc707,Sport0_Ctrl_Reg) /* CODEC --> Setting Mode */
direct_tx_port_0(I0,M0)
autobuf_port_0_enable /* tx=I0, rx=I1 */
serial_port_0_enable
interrupt_s0_rx_enable
loop_1:
waiting_for_interrupt
call check_1;
if ne jump loop_1;
interrupt_s0_tx_enable
data_to_mem(0x000C,fifo_tx+0) /* clb set */
waiting_for_interrupt
waiting_for_interrupt
waiting_for_interrupt
rts;
check_1:
AX0=DM(fifo_rx+0); AY0=0x04; AR=AX0 and AY0;
if ne jump chk_exit;
AX0=DM(fifo_tx+1); AY0=DM(fifo_rx+1); AR=AX0-AY0;
if ne jump chk_exit;
AX0=DM(fifo_tx+2); AY0=DM(fifo_rx+2); AF=AX0 xor AY0;
AX0=0xFF7F; AR=AX0 and AF;
chk_exit:
rts;
codec_init_data_mode:
interrupt_disable
serial_port_0_disable
autobuf_port_0_disable
data_to_mem(0x00,fifo_tx+0) /* (dummy) */
data_to_mem(0x00,fifo_tx+1) /* | */
data_to_mem(0x00,fifo_tx+2) /* | */
data_to_mem(0x00,fifo_tx+3) /* (dummy) */
data_to_mem(0xc0,fifo_tx+4) /* Output Enable, Lch : 0db ATT */
data_to_mem(0x00,fifo_tx+5) /* Rch : 0db ATT */
data_to_mem(0xc6,fifo_tx+6) /* Input <- Line, Lch : gain 9dB */
data_to_mem(0xf6,fifo_tx+7) /* Rch : gain 9dB */
I0=^fifo_tx; M0=1; L0=8;
I1=^fifo_rx; M1=1; L1=8;
I2=^fifo_tx; M2=1; L2=2; /* Data Buffer for Tx (L) */
I3=^fifo_rx; M3=1; L3=2; /* Rx (L) */
data_to_reg(0x8607,Sport0_Ctrl_Reg) /* CODEC --> Running Mode */
data_to_reg(dc,codec_ctrl) /* Change to Data Mode */
direct_tx_port_0(I0,M0)
autobuf_port_0_enable /* tx=I0, rx=I1 */
serial_port_0_enable
interrupt_s0_rx_enable
rts;
.VAR/DM/RAM/ABS=0x2010/CIRC s0_ctl_send[8]; /* 2010-2017 */
.VAR/DM/RAM/ABS=0x2020/CIRC s0_ctl_recv[8]; /* 2020-2027 */
.VAR/DM/RAM/ABS=0x2030/CIRC s0_dat_send[8]; /* 2030-2037 */
.VAR/DM/RAM/ABS=0x2040/CIRC s0_dat_recv[8]; /* 2040-2047 */
#define ts1 0
#define ts2 1
#define ts3 2
#define ts4 3
#define ts5 4
#define ts6 5
#define ts7 6
#define ts8 7
{ interupt vector table }
jump start; RTI; RTI; RTI; {Reset Vector}
RTI; RTI; RTI; RTI; {irq2}
jump s0send; RTI; RTI; RTI; {sport0 TX}
jump s0recv; RTI; RTI; RTI; {sport0 RX}
RTI; RTI; RTI; RTI; {irq0}
RTI; RTI; RTI; RTI; {irq1}
RTI; RTI; RTI; RTI; {timer}
#include <dsp_tail.h>;
start:
ifc=0x3f; IMASK=0x00; /* int disable */
AX0=0x0408; DM(Sys_Ctrl_Reg) = AX0; /* sport0 disable */
AX0=0x0001; DM(Dm_Wait_Reg) = AX0;
initcodec:
AX0=0x00ff; DM(Sport0_Tx_Words0)=AX0; /* 64bit */
AX0=0x00ff; DM(Sport0_Rx_Words0)=AX0; /* 64bit */
AX0=0x0000; DM(Sport0_Tx_Words1)=AX0;
AX0=0x0000; DM(Sport0_Rx_Words1)=AX0;
AX0=0xc707; DM(Sport0_Ctrl_Reg)=AX0; /* rfs send mode */
AX0=0x0000; DM(Sport0_Sclkdiv)=AX0;
AX0=0x00ff; DM(Sport0_Rfsdiv)=AX0; /* multi-ch,256bit */
{ control mode timeslot }
AX0=0x8; DM(s0_ctl_send+ts1)=AX0; /* olb=1,clb=0 */
AX0=0x34; DM(s0_ctl_send+ts2)=AX0; /* 48KHz,st,16bit */
AX0=0x9a; DM(s0_ctl_send+ts3)=AX0; /* 256b,x1,gen.clk */
AX0=0; DM(s0_ctl_send+ts4)=AX0;
AX0=0xc0; DM(s0_ctl_send+ts5)=AX0;
AX0=0; DM(s0_ctl_send+ts6)=AX0;
AX0=0; DM(s0_ctl_send+ts7)=AX0;
AX0=0; DM(s0_ctl_send+ts8)=AX0;
AX0=0xffff; DM(s0_ctl_recv+ts1)=AX0;
AX0=0xffff; DM(s0_ctl_recv+ts2)=AX0;
AX0=0xffff; DM(s0_ctl_recv+ts3)=AX0;
{ data time slot }
AX0=0x0; DM(s0_dat_send+ts1)=AX0;
AX0=0x0; DM(s0_dat_send+ts2)=AX0;
AX0=0x0; DM(s0_dat_send+ts3)=AX0;
AX0=0x0; DM(s0_dat_send+ts4)=AX0;
AX0=0xc0; DM(s0_dat_send+ts5)=AX0; /* out enb,Rch:0dbATT */
AX0=0x00; DM(s0_dat_send+ts6)=AX0; /* Rch:0dbATT */
AX0=0xc6; DM(s0_dat_send+ts7)=AX0; /* Line-I,Lch:gain9dB */
AX0=0xf6; DM(s0_dat_send+ts8)=AX0; /* Rch:gain9dB */
AX0=0xaa; DM(s0_dat_recv+ts1)=AX0;
AX0=0xaa; DM(s0_dat_recv+ts2)=AX0;
AX0=0xaa; DM(s0_dat_recv+ts3)=AX0;
AX0=0x0; DM(s0_dat_recv+ts4)=AX0;
AX0=0x0; DM(s0_dat_recv+ts5)=AX0;
AX0=0x0; DM(s0_dat_recv+ts6)=AX0;
AX0=0x0; DM(s0_dat_recv+ts7)=AX0;
AX0=0x0; DM(s0_dat_recv+ts8)=AX0;
{ control mode set }
I0 =^s0_ctl_send; M0=1; L0=8;
I1 =^s0_ctl_recv; M1=1; L1=8;
AX0 =DM(I0,M0); TX0=AX0;
AX0=0x17; /* tx=I0,rx=I1 autobuf enable */
DM(Sport0_Autobuf_Ctrl)=AX0;
AX0 = 0x1408; DM(Sys_Ctrl_Reg) = AX0; /* sport0 enable */
ifc=0x3f; /* all int clr */
IMASK=0x08; /* s0 rx int enable */
loop1: idle;
CALL control_mode_chk;
IF NE jump loop1;
ifc=0x3f;
IMASK=0x10; /* s0 tx int enb */
AX0=0x0C; DM(s0_ctl_send+ts1)=AX0; /* clb set */
idle;
idle;
idle;
IMASK=0; IFC=0x3F;
AX0=0x00; DM(Sport0_Autobuf_Ctrl)=AX0;
AX0=0x0408; DM(Sys_Ctrl_Reg) = AX0; /* sport0 disable */
{ dsp set data mode }
AX0=0x8607; DM(Sport0_Ctrl_Reg)=AX0; /* rfs receive mode */
AX0=0xff; DM(Sport0_Tx_Words0)=AX0; /* 64bit */
AX0=0xff; DM(Sport0_Rx_Words0)=AX0; /* 64bit */
AX0=0x00; DM(Sport0_Tx_Words1)=AX0;
AX0=0x00; DM(Sport0_Rx_Words1)=AX0;
I0 =^s0_dat_send; M0=1; L0=8;
I1 =^s0_dat_recv; M1=1; L1=8;
I2 =^s0_dat_recv; M2=1; L2=4;
I3 =^s0_dat_send; M3=1; L3=4;
AX0 = 0x1408; DM(Sys_Ctrl_Reg)=AX0; /* sport0 enable */
AX0=DM(I0,M0); TX0=AX0;
AX0=0x17; /* tx=I0,rx=I1 autobuf enable */
DM(Sport0_Autobuf_Ctrl)=AX0;
AX0=dc; DM(codec_ctrl)=AX0; /* set dc to high */
IFC=0x3f; IMASK=0x08;
loop2: idle;
AY1=DM(I2,M2); DM(I3,M3)=AY1; /* left msb 8bit */
AY1=DM(I2,M2); DM(I3,M3)=AY1; /* left lsb 8bit */
AY1=DM(I2,M2); DM(I3,M3)=AY1; /* right msb 8bit */
AY1=DM(I2,M2); DM(I3,M3)=AY1; /* right msb 8bit */
jump loop2;
control_mode_chk:
AX0=DM(s0_ctl_recv+ts1);
AY0=0x04; AR=AX0 and AY0;
IF NE jump chk1;
AX0=DM(s0_ctl_send+ts2);
AY0=DM(s0_ctl_recv+ts2);
AR=AX0-AY0;
IF NE jump chk1;
AX0=DM(s0_ctl_send+ts3);
AY0=DM(s0_ctl_recv+ts3);
AF=AX0 xor AY0;
AX0=0xFF7F; AR=AX0 and AF;
chk1: rts;
s0send: rti;
s0recv: rti;
.ENDMOD;
=============================================================================
.MODULE/RAM/BOOT=0/ABS=0 test;
{ SYSTEM I/O ADDRESS DEFINES }
.const Sys_Ctrl_Reg= 0x3fff;
.const Dm_Wait_Reg= 0x3ffe;
.const Tperiod_Reg= 0x3ffd;
.const Tcount_Reg= 0x3ffc;
.const Tscale_Reg= 0x3ffb;
.const Sport0_Rx_Words1= 0x3ffa;
.const Sport0_Rx_Words0= 0x3ff9;
.const Sport0_Tx_Words1= 0x3ff8;
.const Sport0_Tx_Words0= 0x3ff7;
.const Sport0_Ctrl_Reg= 0x3ff6;
.const Sport0_Sclkdiv= 0x3ff5;
.const Sport0_Rfsdiv= 0x3ff4;
.const Sport0_Autobuf_Ctrl= 0x3ff3;
.const Sport1_Ctrl_Reg= 0x3ff2;
.const Sport1_Sclkdiv= 0x3ff1;
.const Sport1_Rfsdiv= 0x3ff0;
.const Sport1_Autobuf_Ctrl= 0x3fef;
.CONST comcrdy = 0x0803;
.CONST comdrdy = 0x0804;
.CONST cpudt = 0x0810;
.CONST dspdt = 0x0811;
{ BOAD REGISTERS }
.CONST hs_readonly = 0x0600;
.CONST handshake = 0x0700;
.CONST dipswitch = 0x0400;
.CONST codec_ctrl = 0x0400;
{ CONTROLE BITS }
.CONST d2c = 0x2000;
.CONST c2d = 0x1000;
.CONST s8 = 0x8000;
.CONST s4 = 0x4000;
.CONST s2 = 0x2000;
.CONST s1 = 0x1000;
.CONST dc = 0x1000;
.CONST c2denb = 0x2000;
.CONST extenb = 0x4000;
{ MEMORY STRUCTURE }
.CONST dm_top = 0x0800;
.CONST dm_bottom = 0x3BFF;
.CONST pm_top = 0x0000;
.CONST pm_bottom = 0x3FFF;
.CONST ext_dm_top = 0x0800;
.CONST ext_dm_bottom = 0x37FF;
.CONST int_dm_top = 0x3800;
.CONST int_dm_bottom = 0x3BFF;
.CONST ext_pm_top = 0x0800;
.CONST ext_pm_bottom = 0x3FFF;
.CONST int_pm_top = 0x0000;
.CONST int_pm_bottom = 0x07FF;
{ TERMINATE PROGRAM }
.CONST end_of_prog = 0x001D;
/******************** Special Macro Defines ********************/
#define data_to_mem(data,memory) AX0=data; DM(memory)=AX0;
#define data_to_reg(data,register) AX0=data; DM(register)=AX0;
#define interrupt_disable IFC=0x3f; IMASK=0x00;
#define interrupt_s0_rx_enable IFC=0x3f; IMASK=0x08;
#define interrupt_s0_tx_enable IFC=0x3f; IMASK=0x10;
#define waiting_for_interrupt idle;
#define direct_tx_port_0(i_reg,m_reg) AX0=DM(i_reg,m_reg); TX0=AX0;
#define serial_port_0_disable data_to_reg(0x0408,Sys_Ctrl_Reg)
#define serial_port_0_enable data_to_reg(0x1408,Sys_Ctrl_Reg)
#define autobuf_port_0_disable data_to_reg(0x0000,Sport0_Autobuf_Ctrl)
#define autobuf_port_0_enable data_to_reg(0x0017,Sport0_Autobuf_Ctrl)
.MACRO codec_to_AR_reg_mono;
SR0=DM(I3,M3); AY0=DM(I3,M3);
SR=lshift SR0 by 8 (lo); AR=SR0 or AY0;
.ENDMACRO;
.MACRO SR0_reg_to_codec_mono;
AY0=0xff; AR=SR0 and AY0; SR=lshift SR0 by -8 (lo);
DM(I2,M2)=SR0; DM(I2,M2)=AR;
.ENDMACRO;
/******************** Buffer Memory Defines ********************/
.VAR/DM/RAM/ABS=0x0900/CIRC fifo_tx[8];
.VAR/DM/RAM/ABS=0x0910/CIRC fifo_rx[8];
/******************** Reset Vectors Defines ********************/
jump start; nop; nop; nop; {Reset Vector}
RTI; nop; nop; nop; {irq2}
RTI; nop; nop; nop; {sport0 TX}
RTI; nop; nop; nop; {sport0 RX}
RTI; nop; nop; nop; {irq0}
RTI; nop; nop; nop; {irq1}
RTI; nop; nop; nop; {timer}
/******************** Common Subroutines ********************/
codec_initialize:
call codec_system_init;
call codec_init_command_mode;
call codec_init_data_mode;
rts;
codec_system_init:
data_to_reg(0x01,Dm_Wait_Reg) /* 1 wait */
data_to_reg(0xff,Sport0_Rfsdiv) /* Multi-ch, 256bit */
data_to_reg(0x00,Sport0_Sclkdiv) /* divide rate */
data_to_reg(0xff,Sport0_Tx_Words0) /* LSB 16bit Tx */
data_to_reg(0xff,Sport0_Rx_Words0) /* Rx */
data_to_reg(0x00,Sport0_Tx_Words1) /* MSB 16bit Tx */
data_to_reg(0x00,Sport0_Rx_Words1) /* Rx */
rts;
codec_init_command_mode:
interrupt_disable
serial_port_0_disable
autobuf_port_0_disable
data_to_mem(0x08,fifo_tx+0) /* olb=1, clb=0(control) */
data_to_mem(0x1c,fifo_tx+1) /* 32KHz, Stereo, 16bit */
data_to_mem(0x9a,fifo_tx+2) /* 256bit, x1, gen.clk */
data_to_mem(0x00,fifo_tx+3) /* (reserved) */
data_to_mem(0xc0,fifo_tx+4) /* (reserved) */
data_to_mem(0x00,fifo_tx+6) /* (reserved) */
I0=^fifo_tx; M0=1; L0=8;
I1=^fifo_rx; M1=1; L1=8;
data_to_reg(0xc707,Sport0_Ctrl_Reg) /* CODEC --> Setting Mode */
direct_tx_port_0(I0,M0)
autobuf_port_0_enable /* tx=I0, rx=I1 */
serial_port_0_enable
interrupt_s0_rx_enable
loop_1:
waiting_for_interrupt
call check_1;
if ne jump loop_1;
interrupt_s0_tx_enable
data_to_mem(0x000C,fifo_tx+0) /* clb set */
waiting_for_interrupt
waiting_for_interrupt
waiting_for_interrupt
rts;
check_1:
AX0=DM(fifo_rx+0); AY0=0x04; AR=AX0 and AY0;
if ne jump chk_exit;
AX0=DM(fifo_tx+1); AY0=DM(fifo_rx+1); AR=AX0-AY0;
if ne jump chk_exit;
AX0=DM(fifo_tx+2); AY0=DM(fifo_rx+2); AF=AX0 xor AY0;
AX0=0xFF7F; AR=AX0 and AF;
chk_exit:
rts;
codec_init_data_mode:
interrupt_disable
serial_port_0_disable
autobuf_port_0_disable
data_to_mem(0x00,fifo_tx+0) /* (dummy) */
data_to_mem(0x00,fifo_tx+1) /* | */
data_to_mem(0x00,fifo_tx+2) /* | */
data_to_mem(0x00,fifo_tx+3) /* (dummy) */
data_to_mem(0xc0,fifo_tx+4) /* Output Enable, Lch : 0db ATT */
data_to_mem(0x00,fifo_tx+5) /* Rch : 0db ATT */
data_to_mem(0xc6,fifo_tx+6) /* Input <- Line, Lch : gain 9dB */
data_to_mem(0xf6,fifo_tx+7) /* Rch : gain 9dB */
I0=^fifo_tx; M0=1; L0=8;
I1=^fifo_rx; M1=1; L1=8;
I2=^fifo_tx; M2=1; L2=2; /* Data Buffer for Tx (L) */
I3=^fifo_rx; M3=1; L3=2; /* Rx (L) */
data_to_reg(0x8607,Sport0_Ctrl_Reg) /* CODEC --> Running Mode */
data_to_reg(dc,codec_ctrl) /* Change to Data Mode */
direct_tx_port_0(I0,M0)
autobuf_port_0_enable /* tx=I0, rx=I1 */
serial_port_0_enable
interrupt_s0_rx_enable
rts;
.VAR/DM/RAM/ABS=0x0800 interface;
.VAR/DM/RAM/ABS=0x2000/CIRC data_fifo[4096];
start:
call codec_initialize; /* DSP_HEAD.H */
I4=^data_fifo; M4=1; L4=4096;
data_to_mem(1024,interface)
I5=^data_fifo; M5=1; L5=0;
main:
codec_to_AR_reg_mono; /* Get A/D Data : DSP_HEAD.H */
DM(I4,M4)=AR;
DM(interface+1)=AR;
AX0=DM(interface);
AY0=I4;
AR=AX0+AY0;
AY0=0x2fff;
AR=AR and AY0;
I5=AR;
SR0=DM(I5,M5);
DM(interface+2)=SR0;
SR0_reg_to_codec_mono; /* Put to D/A : DSP_HEAD.H */
waiting_for_interrupt
jump main;
.ENDMOD;
=============================================================================
.MODULE/RAM/BOOT=0/ABS=0 test;
{ SYSTEM I/O ADDRESS DEFINES }
.const Sys_Ctrl_Reg= 0x3fff;
.const Dm_Wait_Reg= 0x3ffe;
.const Tperiod_Reg= 0x3ffd;
.const Tcount_Reg= 0x3ffc;
.const Tscale_Reg= 0x3ffb;
.const Sport0_Rx_Words1= 0x3ffa;
.const Sport0_Rx_Words0= 0x3ff9;
.const Sport0_Tx_Words1= 0x3ff8;
.const Sport0_Tx_Words0= 0x3ff7;
.const Sport0_Ctrl_Reg= 0x3ff6;
.const Sport0_Sclkdiv= 0x3ff5;
.const Sport0_Rfsdiv= 0x3ff4;
.const Sport0_Autobuf_Ctrl= 0x3ff3;
.const Sport1_Ctrl_Reg= 0x3ff2;
.const Sport1_Sclkdiv= 0x3ff1;
.const Sport1_Rfsdiv= 0x3ff0;
.const Sport1_Autobuf_Ctrl= 0x3fef;
.CONST comcrdy = 0x0803;
.CONST comdrdy = 0x0804;
.CONST cpudt = 0x0810;
.CONST dspdt = 0x0811;
{ BOAD REGISTERS }
.CONST hs_readonly = 0x0600;
.CONST handshake = 0x0700;
.CONST dipswitch = 0x0400;
.CONST codec_ctrl = 0x0400;
{ CONTROLE BITS }
.CONST d2c = 0x2000;
.CONST c2d = 0x1000;
.CONST s8 = 0x8000;
.CONST s4 = 0x4000;
.CONST s2 = 0x2000;
.CONST s1 = 0x1000;
.CONST dc = 0x1000;
.CONST c2denb = 0x2000;
.CONST extenb = 0x4000;
{ MEMORY STRUCTURE }
.CONST dm_top = 0x0800;
.CONST dm_bottom = 0x3BFF;
.CONST pm_top = 0x0000;
.CONST pm_bottom = 0x3FFF;
.CONST ext_dm_top = 0x0800;
.CONST ext_dm_bottom = 0x37FF;
.CONST int_dm_top = 0x3800;
.CONST int_dm_bottom = 0x3BFF;
.CONST ext_pm_top = 0x0800;
.CONST ext_pm_bottom = 0x3FFF;
.CONST int_pm_top = 0x0000;
.CONST int_pm_bottom = 0x07FF;
{ TERMINATE PROGRAM }
.CONST end_of_prog = 0x001D;
/******************** Special Macro Defines ********************/
#define data_to_mem(data,memory) AX0=data; DM(memory)=AX0;
#define data_to_reg(data,register) AX0=data; DM(register)=AX0;
#define interrupt_disable IFC=0x3f; IMASK=0x00;
#define interrupt_s0_rx_enable IFC=0x3f; IMASK=0x08;
#define interrupt_s0_tx_enable IFC=0x3f; IMASK=0x10;
#define waiting_for_interrupt idle;
#define direct_tx_port_0(i_reg,m_reg) AX0=DM(i_reg,m_reg); TX0=AX0;
#define serial_port_0_disable data_to_reg(0x0408,Sys_Ctrl_Reg)
#define serial_port_0_enable data_to_reg(0x1408,Sys_Ctrl_Reg)
#define autobuf_port_0_disable data_to_reg(0x0000,Sport0_Autobuf_Ctrl)
#define autobuf_port_0_enable data_to_reg(0x0017,Sport0_Autobuf_Ctrl)
.MACRO codec_to_AR_reg_mono;
SR0=DM(I3,M3); AY0=DM(I3,M3);
SR=lshift SR0 by 8 (lo); AR=SR0 or AY0;
.ENDMACRO;
.MACRO SR0_reg_to_codec_mono;
AY0=0xff; AR=SR0 and AY0; SR=lshift SR0 by -8 (lo);
DM(I2,M2)=SR0; DM(I2,M2)=AR;
.ENDMACRO;
/******************** Buffer Memory Defines ********************/
.VAR/DM/RAM/ABS=0x0900/CIRC fifo_tx[8];
.VAR/DM/RAM/ABS=0x0910/CIRC fifo_rx[8];
/******************** Reset Vectors Defines ********************/
jump start; nop; nop; nop; {Reset Vector}
RTI; nop; nop; nop; {irq2}
RTI; nop; nop; nop; {sport0 TX}
RTI; nop; nop; nop; {sport0 RX}
RTI; nop; nop; nop; {irq0}
RTI; nop; nop; nop; {irq1}
RTI; nop; nop; nop; {timer}
/******************** Common Subroutines ********************/
codec_initialize:
call codec_system_init;
call codec_init_command_mode;
call codec_init_data_mode;
rts;
codec_system_init:
data_to_reg(0x01,Dm_Wait_Reg) /* 1 wait */
data_to_reg(0xff,Sport0_Rfsdiv) /* Multi-ch, 256bit */
data_to_reg(0x00,Sport0_Sclkdiv) /* divide rate */
data_to_reg(0xff,Sport0_Tx_Words0) /* LSB 16bit Tx */
data_to_reg(0xff,Sport0_Rx_Words0) /* Rx */
data_to_reg(0x00,Sport0_Tx_Words1) /* MSB 16bit Tx */
data_to_reg(0x00,Sport0_Rx_Words1) /* Rx */
rts;
codec_init_command_mode:
interrupt_disable
serial_port_0_disable
autobuf_port_0_disable
data_to_mem(0x08,fifo_tx+0) /* olb=1, clb=0(control) */
data_to_mem(0x1c,fifo_tx+1) /* 32KHz, Stereo, 16bit */
data_to_mem(0x9a,fifo_tx+2) /* 256bit, x1, gen.clk */
data_to_mem(0x00,fifo_tx+3) /* (reserved) */
data_to_mem(0xc0,fifo_tx+4) /* (reserved) */
data_to_mem(0x00,fifo_tx+6) /* (reserved) */
I0=^fifo_tx; M0=1; L0=8;
I1=^fifo_rx; M1=1; L1=8;
data_to_reg(0xc707,Sport0_Ctrl_Reg) /* CODEC --> Setting Mode */
direct_tx_port_0(I0,M0)
autobuf_port_0_enable /* tx=I0, rx=I1 */
serial_port_0_enable
interrupt_s0_rx_enable
loop_1:
waiting_for_interrupt
call check_1;
if ne jump loop_1;
interrupt_s0_tx_enable
data_to_mem(0x000C,fifo_tx+0) /* clb set */
waiting_for_interrupt
waiting_for_interrupt
waiting_for_interrupt
rts;
check_1:
AX0=DM(fifo_rx+0); AY0=0x04; AR=AX0 and AY0;
if ne jump chk_exit;
AX0=DM(fifo_tx+1); AY0=DM(fifo_rx+1); AR=AX0-AY0;
if ne jump chk_exit;
AX0=DM(fifo_tx+2); AY0=DM(fifo_rx+2); AF=AX0 xor AY0;
AX0=0xFF7F; AR=AX0 and AF;
chk_exit:
rts;
codec_init_data_mode:
interrupt_disable
serial_port_0_disable
autobuf_port_0_disable
data_to_mem(0x00,fifo_tx+0) /* (dummy) */
data_to_mem(0x00,fifo_tx+1) /* | */
data_to_mem(0x00,fifo_tx+2) /* | */
data_to_mem(0x00,fifo_tx+3) /* (dummy) */
data_to_mem(0xc0,fifo_tx+4) /* Output Enable, Lch : 0db ATT */
data_to_mem(0x00,fifo_tx+5) /* Rch : 0db ATT */
data_to_mem(0xc6,fifo_tx+6) /* Input <- Line, Lch : gain 9dB */
data_to_mem(0xf6,fifo_tx+7) /* Rch : gain 9dB */
I0=^fifo_tx; M0=1; L0=8;
I1=^fifo_rx; M1=1; L1=8;
I2=^fifo_tx; M2=1; L2=2; /* Data Buffer for Tx (L) */
I3=^fifo_rx; M3=1; L3=2; /* Rx (L) */
data_to_reg(0x8607,Sport0_Ctrl_Reg) /* CODEC --> Running Mode */
data_to_reg(dc,codec_ctrl) /* Change to Data Mode */
direct_tx_port_0(I0,M0)
autobuf_port_0_enable /* tx=I0, rx=I1 */
serial_port_0_enable
interrupt_s0_rx_enable
rts;
.VAR/DM/RAM/ABS=0x0800 interface;
.VAR/DM/RAM/ABS=0x2000/CIRC data_fifo[4096];
start:
call codec_initialize;
I4=^data_fifo; M4=1; L4=4096;
data_to_mem(1024,interface)
I5=^data_fifo; M5=1; L5=0;
main:
call codec_to_Y_reg_mono;
DM(I4,M4)=AY0; /* Left */
AX0=DM(interface);
AY0=I4;
AR=AX0+AY0;
AY0=0x2fff;
AR=AR and AY0;
I5=AR;
AY0=DM(I5,M5);
call Y_reg_to_codec_mono;
waiting_for_interrupt
jump main;
codec_to_Y_reg_mono:
SR0=DM(I3,M3); /* Left MSB 8bit */
AY0=DM(I3,M3); /* LSB 8bit */
SR=lshift SR0 by 8 (lo);
AR=SR0 or AY0;
AY0=AR;
rts;
Y_reg_to_codec_mono:
AX0=0xff;
SR0=AY0;
SR=lshift SR0 by -8 (lo);
AR=AX0 and AY0;
DM(I2,M2)=SR0; /* Left MSB 8bit */
DM(I2,M2)=AR; /* LSB 8bit */
rts;
.ENDMOD;
=============================================================================
.MODULE/RAM/BOOT=0/ABS=0 test;
{ SYSTEM I/O ADDRESS DEFINES }
.const Sys_Ctrl_Reg= 0x3fff;
.const Dm_Wait_Reg= 0x3ffe;
.const Tperiod_Reg= 0x3ffd;
.const Tcount_Reg= 0x3ffc;
.const Tscale_Reg= 0x3ffb;
.const Sport0_Rx_Words1= 0x3ffa;
.const Sport0_Rx_Words0= 0x3ff9;
.const Sport0_Tx_Words1= 0x3ff8;
.const Sport0_Tx_Words0= 0x3ff7;
.const Sport0_Ctrl_Reg= 0x3ff6;
.const Sport0_Sclkdiv= 0x3ff5;
.const Sport0_Rfsdiv= 0x3ff4;
.const Sport0_Autobuf_Ctrl= 0x3ff3;
.const Sport1_Ctrl_Reg= 0x3ff2;
.const Sport1_Sclkdiv= 0x3ff1;
.const Sport1_Rfsdiv= 0x3ff0;
.const Sport1_Autobuf_Ctrl= 0x3fef;
.CONST comcrdy = 0x0803;
.CONST comdrdy = 0x0804;
.CONST cpudt = 0x0810;
.CONST dspdt = 0x0811;
{ BOAD REGISTERS }
.CONST hs_readonly = 0x0600;
.CONST handshake = 0x0700;
.CONST dipswitch = 0x0400;
.CONST codec_ctrl = 0x0400;
{ CONTROLE BITS }
.CONST d2c = 0x2000;
.CONST c2d = 0x1000;
.CONST s8 = 0x8000;
.CONST s4 = 0x4000;
.CONST s2 = 0x2000;
.CONST s1 = 0x1000;
.CONST dc = 0x1000;
.CONST c2denb = 0x2000;
.CONST extenb = 0x4000;
{ MEMORY STRUCTURE }
.CONST dm_top = 0x0800;
.CONST dm_bottom = 0x3BFF;
.CONST pm_top = 0x0000;
.CONST pm_bottom = 0x3FFF;
.CONST ext_dm_top = 0x0800;
.CONST ext_dm_bottom = 0x37FF;
.CONST int_dm_top = 0x3800;
.CONST int_dm_bottom = 0x3BFF;
.CONST ext_pm_top = 0x0800;
.CONST ext_pm_bottom = 0x3FFF;
.CONST int_pm_top = 0x0000;
.CONST int_pm_bottom = 0x07FF;
{ TERMINATE PROGRAM }
.CONST end_of_prog = 0x001D;
/******************** Special Macro Defines ********************/
#define data_to_mem(data,memory) AX0=data; DM(memory)=AX0;
#define data_to_reg(data,register) AX0=data; DM(register)=AX0;
#define interrupt_disable IFC=0x3f; IMASK=0x00;
#define interrupt_s0_rx_enable IFC=0x3f; IMASK=0x08;
#define interrupt_s0_tx_enable IFC=0x3f; IMASK=0x10;
#define waiting_for_interrupt idle;
#define direct_tx_port_0(i_reg,m_reg) AX0=DM(i_reg,m_reg); TX0=AX0;
#define serial_port_0_disable data_to_reg(0x0408,Sys_Ctrl_Reg)
#define serial_port_0_enable data_to_reg(0x1408,Sys_Ctrl_Reg)
#define autobuf_port_0_disable data_to_reg(0x0000,Sport0_Autobuf_Ctrl)
#define autobuf_port_0_enable data_to_reg(0x0017,Sport0_Autobuf_Ctrl)
.MACRO codec_to_AR_reg_mono;
SR0=DM(I3,M3); AY0=DM(I3,M3);
SR=lshift SR0 by 8 (lo); AR=SR0 or AY0;
.ENDMACRO;
.MACRO SR0_reg_to_codec_mono;
AY0=0xff; AR=SR0 and AY0; SR=lshift SR0 by -8 (lo);
DM(I2,M2)=SR0; DM(I2,M2)=AR;
.ENDMACRO;
/******************** Buffer Memory Defines ********************/
.VAR/DM/RAM/ABS=0x0900/CIRC fifo_tx[8];
.VAR/DM/RAM/ABS=0x0910/CIRC fifo_rx[8];
/******************** Reset Vectors Defines ********************/
jump start; nop; nop; nop; {Reset Vector}
RTI; nop; nop; nop; {irq2}
RTI; nop; nop; nop; {sport0 TX}
RTI; nop; nop; nop; {sport0 RX}
RTI; nop; nop; nop; {irq0}
RTI; nop; nop; nop; {irq1}
RTI; nop; nop; nop; {timer}
/******************** Common Subroutines ********************/
codec_initialize:
call codec_system_init;
call codec_init_command_mode;
call codec_init_data_mode;
rts;
codec_system_init:
data_to_reg(0x01,Dm_Wait_Reg) /* 1 wait */
data_to_reg(0xff,Sport0_Rfsdiv) /* Multi-ch, 256bit */
data_to_reg(0x00,Sport0_Sclkdiv) /* divide rate */
data_to_reg(0xff,Sport0_Tx_Words0) /* LSB 16bit Tx */
data_to_reg(0xff,Sport0_Rx_Words0) /* Rx */
data_to_reg(0x00,Sport0_Tx_Words1) /* MSB 16bit Tx */
data_to_reg(0x00,Sport0_Rx_Words1) /* Rx */
rts;
codec_init_command_mode:
interrupt_disable
serial_port_0_disable
autobuf_port_0_disable
data_to_mem(0x08,fifo_tx+0) /* olb=1, clb=0(control) */
data_to_mem(0x1c,fifo_tx+1) /* 32KHz, Stereo, 16bit */
data_to_mem(0x9a,fifo_tx+2) /* 256bit, x1, gen.clk */
data_to_mem(0x00,fifo_tx+3) /* (reserved) */
data_to_mem(0xc0,fifo_tx+4) /* (reserved) */
data_to_mem(0x00,fifo_tx+6) /* (reserved) */
I0=^fifo_tx; M0=1; L0=8;
I1=^fifo_rx; M1=1; L1=8;
data_to_reg(0xc707,Sport0_Ctrl_Reg) /* CODEC --> Setting Mode */
direct_tx_port_0(I0,M0)
autobuf_port_0_enable /* tx=I0, rx=I1 */
serial_port_0_enable
interrupt_s0_rx_enable
loop_1:
waiting_for_interrupt
call check_1;
if ne jump loop_1;
interrupt_s0_tx_enable
data_to_mem(0x000C,fifo_tx+0) /* clb set */
waiting_for_interrupt
waiting_for_interrupt
waiting_for_interrupt
rts;
check_1:
AX0=DM(fifo_rx+0); AY0=0x04; AR=AX0 and AY0;
if ne jump chk_exit;
AX0=DM(fifo_tx+1); AY0=DM(fifo_rx+1); AR=AX0-AY0;
if ne jump chk_exit;
AX0=DM(fifo_tx+2); AY0=DM(fifo_rx+2); AF=AX0 xor AY0;
AX0=0xFF7F; AR=AX0 and AF;
chk_exit:
rts;
codec_init_data_mode:
interrupt_disable
serial_port_0_disable
autobuf_port_0_disable
data_to_mem(0x00,fifo_tx+0) /* (dummy) */
data_to_mem(0x00,fifo_tx+1) /* | */
data_to_mem(0x00,fifo_tx+2) /* | */
data_to_mem(0x00,fifo_tx+3) /* (dummy) */
data_to_mem(0xc0,fifo_tx+4) /* Output Enable, Lch : 0db ATT */
data_to_mem(0x00,fifo_tx+5) /* Rch : 0db ATT */
data_to_mem(0xc6,fifo_tx+6) /* Input <- Line, Lch : gain 9dB */
data_to_mem(0xf6,fifo_tx+7) /* Rch : gain 9dB */
I0=^fifo_tx; M0=1; L0=8;
I1=^fifo_rx; M1=1; L1=8;
I2=^fifo_tx; M2=1; L2=2; /* Data Buffer for Tx (L) */
I3=^fifo_rx; M3=1; L3=2; /* Rx (L) */
data_to_reg(0x8607,Sport0_Ctrl_Reg) /* CODEC --> Running Mode */
data_to_reg(dc,codec_ctrl) /* Change to Data Mode */
direct_tx_port_0(I0,M0)
autobuf_port_0_enable /* tx=I0, rx=I1 */
serial_port_0_enable
interrupt_s0_rx_enable
rts;
.VAR/DM/RAM/ABS=0x3820 buffer[16];
.VAR/DM/RAM/ABS=0x0800 interface[16];
.VAR/DM/RAM/ABS=0x1000/CIRC data_fifo_l[2048];
.VAR/DM/RAM/ABS=0x2000/CIRC data_fifo_r[2048];
start:
call codec_initialize;
I4=^data_fifo_l; M4=1; L4=2048;
I5=^data_fifo_r; M5=1; L5=2048;
data_to_mem(1024,interface+0)
data_to_mem(1024,interface+1)
I6=^data_fifo_l+1024; M6=1; L6=0;
I7=^data_fifo_r+1024; M7=1; L7=0;
main:
call codec_to_Y_reg;
DM(I4,M4)=AY0; /* Left */
DM(I5,M5)=AY1; /* Right */
SR0=AY0;
SR=ashift SR0 by -1 (lo);
DM(buffer+0)=SR0;
SR0=AY1;
SR=ashift SR0 by -1 (lo);
DM(buffer+1)=SR0;
jump dummy;
AX0=DM(interface+0);
AY0=I4;
AR=AX0+AY0;
AY0=0x17ff;
AR=AR and AY0;
I6=AR;
SR0=DM(I6,M6);
SR=ashift SR0 by -1 (lo);
AX0=SR0;
AX1=DM(interface+1);
AY1=I5;
AR=AX1+AY1;
AY1=0x17ff;
AR=AR and AY1;
I7=AR;
SR0=DM(I7,M7);
SR=ashift SR0 by -1 (lo);
AX1=SR0;
AY0=DM(buffer+0);
AR=AX0+AY0;
AY0=AR;
AY1=DM(buffer+1);
AR=AX1+AY1;
AY1=AR;
dummy:
call Y_reg_to_codec;
waiting_for_interrupt
jump main;
codec_to_Y_reg:
SR0=DM(I3,M3); /* Left MSB 8bit */
AY0=DM(I3,M3); /* LSB 8bit */
SR=lshift SR0 by 8 (lo);
AR=SR0 or AY0;
AY0=AR;
SR0=DM(I3,M3); /* Right MSB 8bit */
AY1=DM(I3,M3); /* LSB 8bit */
SR=lshift SR0 by 8 (lo);
AR=SR0 or AY1;
AY1=AR;
rts;
Y_reg_to_codec:
AX0=0xff;
SR0=AY0;
SR=lshift SR0 by -8 (lo);
AR=AX0 and AY0;
DM(I2,M2)=SR0; /* Left MSB 8bit */
DM(I2,M2)=AR; /* LSB 8bit */
SR0=AY1;
SR=lshift SR0 by -8 (lo);
AR=AX0 and AY1;
DM(I2,M2)=SR0; /* Right MSB 8bit */
DM(I2,M2)=AR; /* LSB 8bit */
rts;
.ENDMOD;
</pre>
</h6>
<h3>IndyのC その1 世界一高価なMIDIスルーボックス</h3>
<h6>
<pre>
#include <stdio.h>
#include <signal.h>
#include <midi.h>
#include <midiio.h>
#include <malloc.h>
#include <sys/types.h>
#include <sys/prctl.h>
#include <sys/schedctl.h>
/*** (^_^;) Bug Recovery of SGI Media Library --> Original MIDI Defines !! (^_^;) ***/
#define MES(x) ( (x[0]).mm.msgbuf )
#define midi_get_status(x) ( ( ( ( MES(x) & 0xff000000 ) == 0x60000000 ) || \
( ( MES(x) & 0xff000000 ) == 0x40000000 ) ) ? \
( ( MES(x) & 0x0f00000 ) >> 16 ) : 0 ) /* Serial Port #2 Only ! */
#define midi_get_channel(x) ( ( MES(x) & 0x00f0000 ) >> 16 ) /* 1 - 16 channel Only ! */
#define midi_get_keyno(x) ( ( MES(x) & 0x0007f00 ) >> 8 ) /* device ID : #1 Only ! */
#define midi_get_velocity(x) ( ( MES(x) & 0x000007f ) )
#define midi_set_status(x,d) ( MES(x) = ( ( d > 0xbf ) && ( d < 0xe0 ) ) ? 0x40000000 : 0x60000000, \
MES(x) &= 0xff0fffff, MES(x) |= ( ( d & 0xf0 ) << 16 ) )
#define midi_set_channel(x,d) ( MES(x) &= 0xfff0ffff, MES(x) |= ( ( d & 0x0f ) << 16 ) )
#define midi_set_keyno(x,d) ( MES(x) &= 0xffff00ff, MES(x) |= ( ( d & 0x7f ) << 8 ) )
#define midi_set_velocity(x,d) ( MES(x) &= 0xffffff00, MES(x) |= ( d & 0x7f ) )
static unsigned char status, channel, keyno, velocity;
int retval;
MIport *midi_port;
MIevent midi[10000];
void midi_initialize();
int midi_receive();
int midi_transmit();
void main(unsigned int argc, char** argv)
{
int count = 0;
midi_initialize();
printf("\nLet's start MIDI! (^_^)/\n\n");
schedctl(NDPRI, 0, NDPNORMMAX);
while(1){
retval = midi_receive();
if( retval > 0 ){
if( (status==0x90)&&(velocity!=0) ) count++;
if( (status==0x90)&&(velocity==0) ) count--;
fprintf(stderr," %d ", count );
retval = midi_transmit();
if( retval < 0 ) exit(-1);
}
}
MIclose( midi_port );
MIfreeport( midi_port );
}
void midi_initialize()
{
MIconfig *c;
c = MInewconfig();
midi_port = MInewport();
retval = MIopen( midi_port, "rw", &c );
if( retval < 0 ) exit(-1);
}
int midi_receive()
{
retval = MIreceive( midi_port, midi, 1 );
if( retval > 0 ){
status = midi_get_status( midi );
if( ( status > 0xef ) || ( status < 0x80 ) ) return(0);
channel = midi_get_channel( midi );
keyno = midi_get_keyno( midi );
if( ( status > 0xbf ) && ( status < 0xe0 ) ) return(2);
velocity = midi_get_velocity( midi );
return(3);
}
return(retval);
}
int midi_transmit()
{
midi_set_status( midi, status );
midi_set_channel( midi, channel );
midi_set_keyno( midi, keyno );
midi_set_velocity ( midi, velocity );
return( MIsend( midi_port, midi, 1 ) );
}
#include <Xm/Xm.h>
#include <Xm/PushB.h>
#include <sys/types.h>
#include <sys/prctl.h>
#include <audio.h>
#include <signal.h>
#include <stdio.h>
int audio_pid;
void owari();
void do_audio();
main(int argc, char **argv)
{
Widget toplevel, button;
audio_pid = sproc( do_audio, PR_SALL );
if (audio_pid == -1) exit(-1);
toplevel = XtInitialize( argv[0], "", NULL, 0, &argc, argv );
button = XtCreateManagedWidget( " Stop Audio ", xmPushButtonWidgetClass, toplevel, NULL, 0 );
XtAddCallback( button, XmNactivateCallback, owari, NULL );
XtRealizeWidget(toplevel);
XtMainLoop();
}
void do_audio()
{
ALconfig config;
ALport input_port, output_port;
short *buff[48000];
int i;
config = ALnewconfig();
ALsetqueuesize( config, 48000 );
input_port = ALopenport( "input", "r", config );
output_port = ALopenport( "output", "w", config );
if (input_port == NULL || output_port == NULL) exit(-1);
while (1)
{
ALreadsamps( input_port, buff, 256 );
for(i=0;i<256;i++)
ALwritesamps( output_port, buff, 1 );
}
}
void owari(Widget w, caddr_t d1, caddr_t d2)
{
kill(audio_pid, SIGKILL);
exit(0);
}
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <malloc.h>
#include <math.h>
#include <string.h>
#include <audio.h>
#include <audiofile.h>
#include <getopt.h>
#include <limits.h>
#include <sys/prctl.h>
#include <sys/schedctl.h>
static char *filename, *filenametail, *sampbuf;
static int fd, bytes_per_samp, samps_per_frame, frames_per_sec;
static int bytes_per_buf, samps_per_buf, frames_per_buf;
static long filefmt, bits_per_samp, compression;
static double file_rate, secs_per_frame, secs_per_buf;
int InitAudio();
int PlaySamples();
void GetPathTail();
void main(int argc, char **argv)
{
AFfilehandle audio_file;
ALport audio_port;
extern int optind;
filename = argv[optind];
GetPathTail(filename, &filenametail);
fd = open(filename, O_RDONLY);
AFidentifyfd(fd);
audio_file = AFopenfd(fd,"r",AF_NULL_FILESETUP);
InitAudio(audio_file, &audio_port);
PlaySamples(audio_file, audio_port);
AFclosefile(audio_file);
ALcloseport(audio_port);
free(sampbuf);
}
static int PlaySamples(AFfilehandle audio_file, ALport audio_port)
{
int num_bufs, leftover_bytes, leftover_samps, leftover_frames, i;
int bytes_read, samples_read, frames_read, total_frames, total_samps, total_samp_bytes;
float file_playingtime, fileplayingtime;
char compressionname[10];
int samp_count = 0, frame_count = 0;
double sec_count = 0.0;
total_frames = AFgetframecnt(audio_file, AF_DEFAULT_TRACK);
total_samps = total_frames * samps_per_frame;
total_samp_bytes = total_samps * bytes_per_samp;
num_bufs = total_samp_bytes / bytes_per_buf;
leftover_bytes = total_samp_bytes % bytes_per_buf;
leftover_samps = leftover_bytes / bytes_per_samp;
leftover_frames = leftover_samps / samps_per_frame;
GetPathTail(filename, &filenametail);
schedctl(NDPRI, 0, NDPNORMMAX);
AFseekframe(audio_file, AF_DEFAULT_TRACK, 0);
for (i=0; num_bufs<0 || i<num_bufs; i++){
samp_count += samps_per_buf;
frame_count += frames_per_buf;
sec_count += secs_per_buf;
frames_read = AFreadframes(audio_file, AF_DEFAULT_TRACK, sampbuf, frames_per_buf);
samples_read = frames_read * samps_per_frame;
ALwritesamps(audio_port, sampbuf, samples_read);
fprintf(stderr,"%d ",i);
}
samp_count += leftover_samps;
frame_count += leftover_frames;
sec_count += ((double)leftover_frames) * secs_per_frame;
if (leftover_samps>0) printf("\n%d sample frames %6.3f secs\n", frame_count, sec_count);
frames_read = AFreadframes(audio_file, AF_DEFAULT_TRACK, sampbuf, leftover_frames);
samples_read = frames_read * samps_per_frame;
ALwritesamps(audio_port, sampbuf, samples_read);
while(ALgetfilled(audio_port) > 0) sginap(1);
sginap(10);
}
static int InitAudio(AFfilehandle audio_file, ALport *audio_port)
{
ALconfig audio_port_config;
long pvbuf[4], audio_rate, output_rate, samp_type, samp_wordsize, vers;
samps_per_frame = AFgetchannels(audio_file, AF_DEFAULT_TRACK);
file_rate = AFgetrate(audio_file, AF_DEFAULT_TRACK);
compression = AFgetcompression(audio_file, AF_DEFAULT_TRACK);
filefmt = AFgetfilefmt(audio_file, &vers);
AFgetsampfmt(audio_file, AF_DEFAULT_TRACK, &samp_type, &bits_per_samp);
pvbuf[0] = AL_OUTPUT_COUNT; pvbuf[2] = AL_MONITOR_CTL;
ALgetparams(AL_DEFAULT_DEVICE, pvbuf, 4);
audio_rate = frames_per_sec = (long) file_rate;
output_rate = GetOutputRate();
if (bits_per_samp <= 8) { bytes_per_samp = 1; samp_wordsize = AL_SAMPLE_8; }
else if (bits_per_samp <= 16) { bytes_per_samp = 2; samp_wordsize = AL_SAMPLE_16; }
else if (bits_per_samp <= 24) { bytes_per_samp = 4; samp_wordsize = AL_SAMPLE_24; }
secs_per_frame = 1.0 / ((double)frames_per_sec);
frames_per_buf = (frames_per_sec+1)/2;
samps_per_buf = frames_per_buf * samps_per_frame;
bytes_per_buf = samps_per_buf * bytes_per_samp;
secs_per_buf = secs_per_frame * frames_per_buf;
sampbuf = malloc(bytes_per_buf);
audio_port_config = ALnewconfig();
ALsetwidth(audio_port_config, samp_wordsize);
ALsetchannels(audio_port_config, samps_per_frame);
ALsetqueuesize(audio_port_config, samps_per_buf*2);
*audio_port = ALopenport("player", "w", audio_port_config);
}
int GetInputRate()
{
long buf[6];
buf[0] = AL_INPUT_RATE; buf[2] = AL_INPUT_SOURCE; buf[4] = AL_DIGITAL_INPUT_RATE;
ALgetparams(AL_DEFAULT_DEVICE, buf, 6);
if ((buf[1] == AL_RATE_AES_1)||(buf[3] == AL_INPUT_DIGITAL)){
if (ALgetdefault(AL_DEFAULT_DEVICE, AL_DIGITAL_INPUT_RATE) >= 0) return (buf[5]);
}
else if (buf[1] > 0) return (buf[1]);
return (AL_RATE_UNDEFINED);
}
int GetOutputRate()
{
long buf[4];
buf[0] = AL_OUTPUT_RATE; buf[2] = AL_DIGITAL_INPUT_RATE;
ALgetparams(AL_DEFAULT_DEVICE, buf, 4);
if (buf[1] > 0) return (buf[1]);
else if (buf[1] == AL_RATE_AES_1){
if (ALgetdefault(AL_DEFAULT_DEVICE,AL_DIGITAL_INPUT_RATE) >= 0) return (buf[3]);
}
else if (buf[1] == AL_RATE_INPUTRATE) return (GetInputRate());
return (AL_RATE_UNDEFINED);
}
static void GetPathTail(char *thepath, char **thetail)
{
char *p;
p = strrchr(thepath, '/');
if (p) p++;
else p = thepath;
*thetail = (char *)malloc(strlen(p) + 1);
strcpy(*thetail, p);
}
#include <math.h>
#include <stdio.h>
#include <signal.h>
#include <midi.h>
#include <midiio.h>
#include <malloc.h>
#include <sys/types.h>
#include <sys/prctl.h>
#include <sys/schedctl.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <X11/Xatom.h>
#define XK_MISCELLANY /* Needed for defininition of Esc */
#include <X11/keysymdef.h>
#include <Xm/MwmUtil.h>
#include <gl/glws.h>
#include <gl/gl.h>
#define XSCREENSIZE(d,s) DisplayWidth(d,s)
#define YSCREENSIZE(d,s) DisplayHeight(d,s)
#define WORLD_XMIN 0.0
#define WORLD_XMAX 200.0
#define WORLD_YMIN 0.0
#define WORLD_YMAX 200.0
#define GREY1 8
#define GREY2 15
#define MOUSE_OBJ 1
#define LEN 700.0
/*** (^_^;) Bug Recovery of SGI Media Library --> Original MIDI Defines !! (^_^;) ***/
#define MES(x) ( (x[0]).mm.msgbuf )
#define midi_set_status(x,d) ( MES(x) = ( ( d > 0xbf ) && ( d < 0xe0 ) ) ? 0x40000000 : 0x60000000, \
MES(x) &= 0xff0fffff, MES(x) |= ( ( d & 0xf0 ) << 16 ) )
#define midi_set_channel(x,d) ( MES(x) &= 0xfff0ffff, MES(x) |= ( ( d & 0x0f ) << 16 ) )
#define midi_set_keyno(x,d) ( MES(x) &= 0xffff00ff, MES(x) |= ( ( d & 0x7f ) << 8 ) )
#define midi_set_velocity(x,d) ( MES(x) &= 0xffffff00, MES(x) |= ( d & 0x7f ) )
char *progname = "midi";
long xmin, xmax, ymin, ymax;
unsigned int screen_w, screen_h;
float xrat, yrat;
int screen_num, old_x, old_y, old_button, color_no, action_mode;
Display *display;
MIport *midi_port;
MIevent midi[100];
Window glx_create_window();
void set_wm_hints();
void define_geom();
void draw_screen();
void midi_initialize();
void midi_event_generate();
void midi_transmit();
void midi_tx_3byte();
void main(int argc, char **argv)
{
Window top, glwin, root, child, windows[2];
XEvent event;
char buffer[5];
int got_expose;
int x, y, root_x, root_y;
unsigned int keys_buttons;
KeySym keysym;
XComposeStatus compose;
srandom(1);
color_no = action_mode = 0;
midi_initialize();
midi_tx_3byte( 159, 1, 127 ); /* to Draw */
midi_tx_3byte( 159, 1, 0 );
display = XOpenDisplay(NULL);
screen_num = DefaultScreen(display);
screen_w = XSCREENSIZE(display, screen_num);
screen_h = YSCREENSIZE(display, screen_num);
xmin = ymin = 0;
xmax = screen_w - 1;
ymax = screen_h - 1;
xrat = (WORLD_XMAX - WORLD_XMIN) / (float)(xmax - xmin);
yrat = (WORLD_YMAX - WORLD_YMIN) / (float)(ymax - ymin);
top = XCreateSimpleWindow(display,RootWindow(display,screen_num),0,0,screen_w, screen_h,0,0,0);
set_wm_hints(argc, argv, top);
glwin = glx_create_window(display, top, 0, 0, screen_w, screen_h, 0);
XSelectInput(display,top,KeyPressMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask);
XSelectInput(display, glwin, ExposureMask);
windows[0] = glwin;
windows[1] = top;
XSetWMColormapWindows(display, top, windows, 2);
XMapWindow(display, glwin);
XMapWindow(display, top);
GLXwinset(display, glwin);
define_geom();
XGrabButton(display, AnyButton, AnyModifier, RootWindow(display, screen_num), False,
ButtonPressMask | ButtonReleaseMask | PointerMotionMask, GrabModeAsync, GrabModeAsync,
None, None);
got_expose = FALSE;
while (1) {
gflush();
XNextEvent(display, &event);
switch (event.type) {
case Expose:
if (event.xexpose.count) continue;
got_expose = TRUE;
break;
case MotionNotify:
case ButtonPress:
case ButtonRelease:
break;
case KeyPress:
XLookupString(&event, buffer, sizeof(buffer), &keysym, &compose);
if (keysym == XK_Escape) {
XCloseDisplay(display);
MIclose( midi_port );
MIfreeport( midi_port );
exit(0);
}
continue;
default:
continue;
}
if (!XEventsQueued(display, QueuedAlready) && got_expose) {
XQueryPointer(display,glwin,&root,&child,&root_x,&root_y,&x,&y,&keys_buttons);
midi_event_generate(x, y, keys_buttons);
draw_screen(x, y, keys_buttons);
}
}
}
static Window glx_create_window(Display* dpy, Window parent, int x, int y,
int w, int h, int borderWidth)
{
static GLXconfig params[] = {{GLX_NORMAL,GLX_RGB,FALSE},{GLX_NORMAL,GLX_DOUBLE,TRUE},{0,0,0},};
GLXconfig *next, *retconfig;
Colormap cmap = DefaultColormap(dpy, DefaultScreen(dpy));
XVisualInfo *vis;
XVisualInfo template;
XSetWindowAttributes cwa;
int nret;
Window win;
retconfig = GLXgetconfig(dpy, DefaultScreen(dpy), params);
for (next = retconfig; next->buffer; next++) {
if (next->buffer == GLX_NORMAL) {
if (next->mode == GLX_COLORMAP) {
cmap = next->arg;
}
else if (next->mode == GLX_VISUAL) {
template.visualid = next->arg;
template.screen = DefaultScreen(dpy);
vis = XGetVisualInfo(dpy,VisualScreenMask | VisualIDMask,&template,&nret);
}
}
}
cwa.colormap = cmap;
cwa.border_pixel = 0;
win = XCreateWindow(dpy, parent, x, y, w, h,
borderWidth, vis->depth, InputOutput, vis->visual,
CWColormap|CWBorderPixel, &cwa);
for (next = retconfig; next->buffer; next++) {
if ((next->buffer == GLX_NORMAL) && (next->mode == GLX_WINDOW)) {
next->arg = win;
break;
}
}
GLXlink(dpy, retconfig);
return win;
}
static void set_wm_hints(int argc, char *argv[], Window top)
{
XTextProperty windowName;
XSizeHints size_hints;
XClassHint class_hints;
XWMHints wm_hints;
MotifWmHints mwm_hints;
Atom mwm_hints_atom;
size_hints.flags = USPosition | PBaseSize | PMaxSize;
size_hints.x = 0;
size_hints.y = 0;
size_hints.base_width = size_hints.max_width = screen_w;
size_hints.base_height = size_hints.max_height = screen_h;
XStringListToTextProperty(&progname, 1, &windowName);
wm_hints.initial_state = NormalState;
wm_hints.input = True;
wm_hints.flags = StateHint | InputHint;
class_hints.res_name = progname;
class_hints.res_class = "test";
XSetWMProperties(display,top,&windowName,NULL,argv,argc,&size_hints,&wm_hints,&class_hints);
mwm_hints_atom = XInternAtom(display, _XA_MOTIF_WM_HINTS, False);
mwm_hints.flags = MWM_HINTS_DECORATIONS | MWM_HINTS_FUNCTIONS;
mwm_hints.decorations = 0;
mwm_hints.functions = MWM_FUNC_CLOSE;
XChangeProperty(display, top, mwm_hints_atom, mwm_hints_atom, 32, PropModeReplace, &mwm_hints,
PROP_MWM_HINTS_ELEMENTS);
}
static void define_geom()
{
Matrix C_spline = {
{-0.5, 1.5, -1.5, 0.5},
{ 1.0, -2.5, 2.0, -0.5},
{-0.5, 0.0, 0.5, 0.0},
{ 0.0, 1.0, 0.0, 0.0},
};
ortho2(WORLD_XMIN, WORLD_XMAX, WORLD_YMIN, WORLD_YMAX);
defbasis(100,C_spline);
curveprecision(20);
curvebasis(100);
makeobj(MOUSE_OBJ);
color(WHITE);
rectf(-4.0,-6.0,4.0,6.0);
color(BLACK);
rect(-4.0,-6.0,4.0,6.0);
rect(-2.75,0.0,-1.25,4.5);
rect(-0.75,0.0, 0.75,4.5);
rect( 1.25,0.0, 2.75,4.5);
color(GREY1);
rectf(-3.0,-6.0,5.0,-7.0);
rectf(4.0,-7.0,5.0,5.0);
closeobj();
}
static void draw_screen(int x, int y, unsigned int keys_buttons)
{
static Coord geom[4][3] = {
{ WORLD_XMIN, 6.0-LEN, 0.0 },
{ 0.0, 6.0, 0.0 },
{ WORLD_XMIN, WORLD_YMAX, 0.0 },
{ 0.0, WORLD_YMAX+LEN, 0.0 },
};
static char disp_message[3][120] = {
" ===== [1] DRAW Mode ( left = draw , middle = Error , right --> Paint ) =====",
" ===== [2] PAINT Mode ( left = paint , middle = Effect , right --> Stamp ) =====",
" ===== [3] STAMP Mode ( left = stamp , middle = Erase , right --> Draw ) =====",
};
static int mode_color_table[6] = { 9, 10, 11, 12, 13, 14 };
static int first_time = TRUE;
float xoff, yoff;
if (first_time) {
frontbuffer(TRUE);
backbuffer(TRUE);
}
color( mode_color_table[color_no] );
clear();
color(BLACK);
cmov2i( (Icoord)( 20 + 10 * action_mode ), (Icoord)( 150 - 40 * action_mode ) );
charstr( disp_message[action_mode] );
xoff = (float)(x - xmin) * xrat;
yoff = (float)(ymax - ymin - y) * yrat;
geom[0][1] = yoff + 6.0 - LEN;
geom[1][0] = xoff;
geom[1][1] = yoff + 6.0;
geom[3][0] = xoff;
crv(geom);
pushmatrix();
translate(xoff,yoff,0.0);
callobj(MOUSE_OBJ);
if (keys_buttons & Button1Mask) rectf(-2.75,0.0,-1.25,4.5);
if (keys_buttons & Button2Mask) rectf(-0.75,0.0, 0.75,4.5);
if (keys_buttons & Button3Mask) rectf( 1.25,0.0, 2.75,4.5);
popmatrix();
if (first_time) {
frontbuffer(FALSE);
first_time = FALSE;
}
else swapbuffers();
}
static void midi_initialize()
{
MIconfig *c;
c = MInewconfig();
midi_port = MInewport();
if( MIopen( midi_port, "rw", &c ) < 0 ) exit(-1);
}
static void midi_transmit( int status, int channel, int keyno, int velocity )
{
midi_set_status( midi, ( status & 0xf0 ) );
midi_set_channel( midi, ( channel & 0x0f ) );
midi_set_keyno( midi, ( keyno & 0x7f ) );
midi_set_velocity ( midi, ( velocity & 0x7f ) );
if( MIsend( midi_port, midi, 1 ) < 0 ) exit(-1);
}
static void midi_tx_3byte( int status_byte, int keyno, int velocity )
{
midi_transmit( ( status_byte & 0xf0 ), ( status_byte & 0x0f ), keyno, velocity );
}
static void midi_event_generate(int x, int y, unsigned int keys_buttons)
{
int d, new_x, new_y, new_button = 0, point_event = 0, color_change = 0;
new_x = 20 + (int)( (float)x * 80.9 / 1024.0 );
new_y = 20 + (int)( (float)( 767 - y ) * 80.9 / 768.0 );
if( keys_buttons & Button1Mask ) new_button = 1;
if( keys_buttons & Button2Mask ) new_button = 2;
if( keys_buttons & Button3Mask ) new_button = 3;
if( old_x != new_x ){
old_x = new_x;
point_event++;
}
if( old_y != new_y ){
old_x = new_x;
point_event++;
}
if( old_button != new_button ){
if( ( new_button == 2 ) && ( old_button == 0 ) ){
color_change++;
if( action_mode == 0 ){
midi_tx_3byte( 157, 120, 127 ); /* Error */
midi_tx_3byte( 157, 120, 0 );
}
else if( action_mode == 1 ){
d = random() % 3;
midi_tx_3byte( 159, 121 + d, 127 ); /* Effect */
midi_tx_3byte( 159, 121 + d, 0 );
}
else if( action_mode == 2 ){
d = random() % 3;
midi_tx_3byte( 159, 65 + d, 127 ); /* Erase */
midi_tx_3byte( 159, 65 + d, 0 );
}
}
else if( ( new_button == 3 ) && ( old_button == 0 ) ){
color_change++;
if( action_mode == 0 ){
midi_tx_3byte( 159, 60, 127 ); /* to Paint */
midi_tx_3byte( 159, 60, 0 );
action_mode = 1;
}
else if( action_mode == 1 ){
d = 71 + 20 * ( random() % 2 ) + random() % 10;
midi_tx_3byte( 159, d, 127 ); /* to Stamp */
midi_tx_3byte( 159, d, 0 );
action_mode = 2;
}
else if( action_mode == 2 ){
d = 1 + 20 * ( random() % 2 ) + random() % 16;
midi_tx_3byte( 159, d, 127 ); /* to Draw */
midi_tx_3byte( 159, d, 0 );
action_mode = 0;
}
}
else if( ( new_button == 1 ) && ( old_button == 0 ) ){
if( action_mode == 0 ){
midi_tx_3byte( 157, new_x, new_y );
midi_tx_3byte( 157, new_x, 0 );
}
else if( action_mode == 1 ){
d = 41 + ( random() % 16 );
midi_tx_3byte( 159, d, 127 );
midi_tx_3byte( 159, d, 0 );
color_change++;
}
else if( action_mode == 2 ){
midi_tx_3byte( 158, new_x, new_y );
midi_tx_3byte( 158, new_x, 0 );
}
}
old_button = new_button;
}
else if( point_event != 0 ){
if( ( new_button == 1 ) && ( action_mode == 0 ) ){
midi_tx_3byte( 157, new_x, new_y );
midi_tx_3byte( 157, new_x, 0 );
}
else if( ( new_button == 1 ) && ( action_mode == 2 ) ){
midi_tx_3byte( 158, new_x, new_y );
midi_tx_3byte( 158, new_x, 0 );
}
}
if( color_change != 0 ) color_no = (color_no+1) % 6;
}
#include <midi.h>
#include <midiio.h>
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <Xm/Form.h>
#include <Xm/Frame.h>
#include <Xm/PushB.h>
#include <X11/Xirisw/GlxMDraw.h>
#define WORLD_XMIN 0.0
#define WORLD_XMAX 200.0
#define WORLD_YMIN 0.0
#define WORLD_YMAX 200.0
#define GREY 8
#define MOUSE_OBJ 1
#define LEN 700.0
/*** (^_^;) Bug Recovery of SGI Media Library --> Original MIDI Defines !! (^_^;) ***/
#define MES(x) ( (x[0]).mm.msgbuf )
#define midi_set_status(x,d) ( MES(x) = ( ( d > 0xbf ) && ( d < 0xe0 ) ) ? 0x40000000 : 0x60000000, \
MES(x) &= 0xff0fffff, MES(x) |= ( ( d & 0xf0 ) << 16 ) )
#define midi_set_channel(x,d) ( MES(x) &= 0xfff0ffff, MES(x) |= ( ( d & 0x0f ) << 16 ) )
#define midi_set_keyno(x,d) ( MES(x) &= 0xffff00ff, MES(x) |= ( ( d & 0x7f ) << 8 ) )
#define midi_set_velocity(x,d) ( MES(x) &= 0xffffff00, MES(x) |= ( d & 0x7f ) )
MIport *midi_port;
MIevent midi[100];
XtAppContext app_context;
int mx, my, xmin, xmax, ymin, ymax, button[3], color_no, action_mode, error_st;
float xrat, yrat, cx, cy;
int mode_color_table[7] = { 9, 10, 11, 12, 13, 14, 15 };
void init_window(), do_resize(), input(), draw_screen(), quit(), clear_screen();
void draw_mode(), paint_mode(), stamp_mode(), effect_mode(), erase_mode();
void midi_initialize(), midi_event_generate(), midi_transmit(), midi_tx_3byte();
main(int argc, char **argv)
{
Arg args[20];
int n;
Widget glw, toplevel, form, frame, pushb[10];
GLXconfig glxConfig [] = { { GLX_NORMAL, GLX_RGB, FALSE },
{ GLX_NORMAL, GLX_DOUBLE, TRUE }, { 0,0,0 }, };
long background[] = { 0, 0, 0 };
toplevel = XtAppInitialize(&app_context, "", (XrmOptionDescList)NULL , 0, (Cardinal*)&argc,
(String*)argv, (String*)NULL, (ArgList)NULL, 0);
n = 0;
XtSetArg(args[n], XtNwidth, 900); n++;
XtSetArg(args[n], XtNheight, 650); n++;
form = XtCreateManagedWidget("", xmFormWidgetClass, toplevel, args, n);
n = 0;
XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
XtSetArg(args[n], XmNbottomOffset, 10); n++;
XtSetArg(args[n], XmNrightOffset, 40); n++;
pushb[0] = XtCreateManagedWidget("Quit", xmPushButtonWidgetClass, form, args, n);
XtAddCallback(pushb[0], XmNactivateCallback, quit,0);
n = 0;
XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
XtSetArg(args[n], XmNbottomOffset, 10); n++;
XtSetArg(args[n], XmNleftOffset, 40); n++;
pushb[1] = XtCreateManagedWidget("Draw", xmPushButtonWidgetClass, form, args, n);
XtAddCallback(pushb[1], XmNactivateCallback, draw_mode,0);
n = 0;
XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
XtSetArg(args[n], XmNbottomOffset, 10); n++;
XtSetArg(args[n], XmNleftWidget, pushb[1]); n++;
XtSetArg(args[n], XmNleftOffset, 30); n++;
pushb[2] = XtCreateManagedWidget("Paint", xmPushButtonWidgetClass, form, args, n);
XtAddCallback(pushb[2], XmNactivateCallback, paint_mode,0);
n = 0;
XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
XtSetArg(args[n], XmNbottomOffset, 10); n++;
XtSetArg(args[n], XmNleftWidget, pushb[2]); n++;
XtSetArg(args[n], XmNleftOffset, 30); n++;
pushb[3] = XtCreateManagedWidget("Stamp", xmPushButtonWidgetClass, form, args, n);
XtAddCallback(pushb[3], XmNactivateCallback, stamp_mode,0);
n = 0;
XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
XtSetArg(args[n], XmNbottomOffset, 10); n++;
XtSetArg(args[n], XmNleftWidget, pushb[3]); n++;
XtSetArg(args[n], XmNleftOffset, 30); n++;
pushb[4] = XtCreateManagedWidget("Effect", xmPushButtonWidgetClass, form, args, n);
XtAddCallback(pushb[4], XmNactivateCallback, effect_mode,0);
n = 0;
XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
XtSetArg(args[n], XmNbottomOffset, 10); n++;
XtSetArg(args[n], XmNleftWidget, pushb[4]); n++;
XtSetArg(args[n], XmNleftOffset, 30); n++;
pushb[5] = XtCreateManagedWidget("Erase", xmPushButtonWidgetClass, form, args, n);
XtAddCallback(pushb[5], XmNactivateCallback, erase_mode,0);
n = 0;
XtSetArg(args[n], XtNx, 30); n++;
XtSetArg(args[n], XtNy, 30); n++;
XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
XtSetArg(args[n], XmNbottomAttachment, XmATTACH_WIDGET); n++;
XtSetArg(args[n], XmNtopOffset, 20); n++;
XtSetArg(args[n], XmNleftOffset, 20); n++;
XtSetArg(args[n], XmNrightOffset, 20); n++;
XtSetArg(args[n], XmNbottomWidget, pushb[0]); n++;
XtSetArg(args[n], XmNbottomOffset, 10); n++;
frame = XtCreateManagedWidget("", xmFrameWidgetClass, form, args, n);
n = 0;
XtSetArg(args[n], GlxNglxConfig, glxConfig); n++;
glw = XtCreateManagedWidget("", glxMDrawWidgetClass, frame, args, n);
XtAddCallback(glw, GlxNginitCallback, init_window, 0);
XtAddCallback(glw, GlxNinputCallback, input, 0);
XtAddCallback(glw, GlxNresizeCallback, do_resize, 0);
WidgetBackgroundToGlC3i(glw,background);
XtRealizeWidget(toplevel);
installColormap(toplevel,glw);
XtAppMainLoop(app_context);
}
static void quit(Widget w, caddr_t client_data, caddr_t call_data)
{
midi_tx_3byte( 160, 127, 127 );
midi_tx_3byte( 160, 127, 0 );
MIclose( midi_port );
MIfreeport( midi_port );
exit (0);
}
static void init_window(Widget w, caddr_t client_data, GlxDrawCallbackStruct *call_data)
{
Matrix C_spline={{-0.5,1.5,-1.5,0.5},{1.0,-2.5,2.0,-0.5},{-0.5,0.0,0.5,0.0},{0.0,1.0,0.0,0.0},};
ortho2( WORLD_XMIN, WORLD_XMAX, WORLD_YMIN, WORLD_YMAX );
defbasis( 100, C_spline );
curveprecision( 20 );
curvebasis( 100);
makeobj(MOUSE_OBJ);
color(WHITE); rectf(-4.0,-6.0,4.0,6.0);
color(BLACK); rect(-4.0,-6.0,4.0,6.0); rect(-2.75,0.0,-1.25,4.5);
rect(-0.75,0.0, 0.75,4.5); rect( 1.25,0.0, 2.75,4.5);
color(GREY); rectf(-3.0,-6.0,5.0,-7.0); rectf(4.0,-7.0,5.0,5.0);
closeobj();
button[0] = button[1] = button[2] = 0;
do_resize(w,client_data,call_data);
srandom(1);
color_no = 6;
action_mode = error_st = 0;
midi_initialize();
midi_tx_3byte( 159, 1, 127 ); /* to Draw */
midi_tx_3byte( 159, 1, 0 );
}
static void do_resize(Widget w, caddr_t client_data, GlxDrawCallbackStruct *call_data)
{
GLXwinset(XtDisplay(w), XtWindow(w));
xmin = 0; xmax = (Screencoord)call_data->width - 1;
ymin = 0; ymax = (Screencoord)call_data->height - 1;
xrat = (WORLD_XMAX - WORLD_XMIN) / (float)(xmax - xmin);
yrat = (WORLD_YMAX - WORLD_YMIN) / (float)(ymax - ymin);
viewport( 0, xmax, 0, ymax );
mx = xmax / 2; my = ymax / 2;
draw_screen(w);
}
static void midi_initialize()
{
MIconfig *c;
c = MInewconfig();
midi_port = MInewport();
if( MIopen( midi_port, "rw", &c ) < 0 ) exit(-1);
}
static void midi_transmit( int status, int channel, int keyno, int velocity )
{
midi_set_status( midi, ( status & 0xf0 ) );
midi_set_channel( midi, ( channel & 0x0f ) );
midi_set_keyno( midi, ( keyno & 0x7f ) );
midi_set_velocity ( midi, ( velocity & 0x7f ) );
if( MIsend( midi_port, midi, 1 ) < 0 ) exit(-1);
}
static void midi_tx_3byte( int status_byte, int keyno, int velocity )
{
midi_transmit( ( status_byte & 0xf0 ), ( status_byte & 0x0f ), keyno, velocity );
}
static void draw_screen(Widget w)
{
static Coord geom[4][3] = { { WORLD_XMIN, 6.0-LEN, 0.0 }, { 0.0, 6.0, 0.0 },
{ WORLD_XMIN, WORLD_YMAX, 0.0 }, { 0.0, WORLD_YMAX+LEN, 0.0 }, };
GLXwinset(XtDisplay(w), XtWindow(w));
color( mode_color_table[color_no] );
clear();
color(BLACK);
geom[0][1] = cy + 6.0 - LEN;
geom[1][0] = cx;
geom[1][1] = cy + 6.0;
geom[3][0] = cx;
crvn(4,geom);
pushmatrix();
translate( cx, cy, 0.0 );
callobj(MOUSE_OBJ);
if ( button[0] == 1 ) rectf(-2.75,0.0,-1.25,4.5);
if ( button[1] == 1 ) rectf(-0.75,0.0, 0.75,4.5);
if ( button[2] == 1 ) rectf( 1.25,0.0, 2.75,4.5);
popmatrix();
swapbuffers();
}
static void clear_screen(Widget w)
{
GLXwinset(XtDisplay(w), XtWindow(w));
color( mode_color_table[color_no] );
clear();
swapbuffers();
error_st = 0;
}
static void draw_mode(Widget w, caddr_t client_data, caddr_t call_data)
{
int d, p=0;
if( action_mode == 0 ) p = 20;
else error_st == 0;
d = 1 + p + random() % 16;
midi_tx_3byte( 159, d, 127 ); /* to Draw */
midi_tx_3byte( 159, d, 0 );
action_mode = 0;
color_no = (color_no+1) % 6;
clear_screen(w);
}
static void paint_mode(Widget w, caddr_t client_data, caddr_t call_data)
{
midi_tx_3byte( 159, 60, 127 ); /* to Paint */
midi_tx_3byte( 159, 60, 0 );
action_mode = 1;
color_no = 6;
clear_screen(w);
}
static void stamp_mode(Widget w, caddr_t client_data, caddr_t call_data)
{
int d, p=0;
if( action_mode == 2 ) p = 20;
else error_st == 0;
d = 71 + p + random() % 10;
midi_tx_3byte( 159, d, 127 ); /* to Stamp */
midi_tx_3byte( 159, d, 0 );
action_mode = 2;
color_no = (color_no+1) % 6;
clear_screen(w);
}
static void effect_mode(Widget w, caddr_t client_data, caddr_t call_data)
{
int d;
d = random() % 3;
midi_tx_3byte( 159, 121 + d, 127 ); /* Effect */
midi_tx_3byte( 159, 121 + d, 0 );
action_mode = 3;
color_no = 6;
clear_screen(w);
}
static void erase_mode(Widget w, caddr_t client_data, caddr_t call_data)
{
int d;
d = random() % 3;
midi_tx_3byte( 159, 65 + d, 127 ); /* Erase */
midi_tx_3byte( 159, 65 + d, 0 );
action_mode = 3;
color_no = 6;
clear_screen(w);
}
static void input(Widget w, caddr_t client_data, GlxDrawCallbackStruct *call_data)
{
int d, new_x, new_y, in_out = 0;
mx = call_data->event->xbutton.x;
my = call_data->event->xbutton.y;
cx = (float)(mx - xmin) * xrat;
cy = (float)(ymax - ymin - my) * yrat;
new_x = 20 + (int)( cx * 0.4 );
new_y = 20 + (int)( cy * 0.4 );
switch(call_data->event->type){
case ButtonPress:
switch(call_data->event->xbutton.button){
case Button1:
button[0] = 1;
if( action_mode == 1 ){
d = 41 + ( random() % 16 );
midi_tx_3byte( 159, d, 127 );
midi_tx_3byte( 159, d, 0 );
color_no = (color_no+1) % 6;
}
else if( action_mode == 0 ){
midi_tx_3byte( 157, new_x, new_y );
midi_tx_3byte( 157, new_x, 0 );
}
else if( action_mode == 2 ){
midi_tx_3byte( 158, new_x, new_y );
midi_tx_3byte( 158, new_x, 0 );
color_no = (color_no+1) % 6;
}
break;
case Button2: button[1] = 1; break;
case Button3: button[2] = 1; break;
}
draw_screen(w);
break;
case ButtonRelease:
switch(call_data->event->xbutton.button){
case Button1: button[0] = 0; break;
case Button2: button[1] = 0; break;
case Button3: button[2] = 0; break;
}
draw_screen(w);
break;
case MotionNotify:
if (call_data->event->xmotion.state){
if( button[0] == 1 ){
if( (cx<0.0)||(cx>200.0)||(cy<0.0)||(cy>200.0) ) in_out = 1;
if( (error_st == 0) && (in_out == 1) ){
midi_tx_3byte( 157, 120, 127 );
midi_tx_3byte( 157, 120, 0 );
error_st = 1;
}
else if( in_out == 0 ){
if( action_mode == 0 ){
midi_tx_3byte( 157, new_x, new_y );
midi_tx_3byte( 157, new_x, 0 );
}
else if( action_mode == 2 ){
midi_tx_3byte( 158, new_x, new_y );
midi_tx_3byte( 158, new_x, 0 );
}
if( error_st == 1 ) error_st = 0;
}
}
draw_screen(w);
}
break;
}
}
#include <stdio.h>
#include <math.h>
#include <limits.h>
#include <signal.h>
#include <unistd.h>
#include <audio.h>
#include <sys/types.h>
#include <sys/prctl.h>
#include <sys/schedctl.h>
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/Xaw/Box.h>
#include <Xm/Xm.h>
#include <Xm/PushB.h>
#include <Xm/Label.h>
#include <Xm/Scale.h>
#define FIFO_SIZE 48000
#define pi 3.1415926535
unsigned int audio_pid;
int audio_mode, sample_param, pitch_param, offset_param;
char *audio_menu[] = { "through", "distrotion", "oscillator", "granular synth", "granular sampling" };
short buffer[FIFO_SIZE];
void self_kill(), create_sound(), sound_off(), scaler_volume(), scaler_sample(), scaler_pitch(), scaler_offset();
void audio_through(), audio_distrotion(), audio_oscillator(), audio_granular(), audio_effector();
void main(unsigned int argc, char** argv)
{
Widget toplevel, title, bigbox, sbox[10], pb2[5], pb3[3], volume, sample, pitch, offset;
XmString xmstr;
Arg args[10];
char buf[80];
int i,n;
/***** Motif Screen Define *****/
toplevel = XtInitialize( argv[0], "", NULL, 0, &argc, argv );
bigbox = XtCreateManagedWidget( "", boxWidgetClass, toplevel, NULL, 0 );
xmstr = XmStringCreateSimple(" (^_^) Audio Test by Yoichi Nagashima (^_^) ");
XtSetArg( args[0], XmNlabelString, xmstr );
title = XtCreateManagedWidget( "", xmLabelWidgetClass, bigbox, args, 1 );
for(i=0;i<10;i++){
sbox[i] = XtCreateManagedWidget( "", boxWidgetClass, bigbox, NULL, 0 );
}
pb3[0] = XtCreateManagedWidget( "Sound Port OFF", xmPushButtonWidgetClass, sbox[0], NULL, 0 );
pb3[1] = XtCreateManagedWidget( "Quit to System", xmPushButtonWidgetClass, sbox[0], NULL, 0 );
pb2[0] = XtCreateManagedWidget( "Mode(1) Through", xmPushButtonWidgetClass, sbox[1], NULL, 0 );
pb2[1] = XtCreateManagedWidget( "Mode(2) Distortion", xmPushButtonWidgetClass, sbox[1], NULL, 0 );
pb2[2] = XtCreateManagedWidget( "Mode(3) Oscillator", xmPushButtonWidgetClass, sbox[1], NULL, 0 );
pb2[3] = XtCreateManagedWidget( "Mode(4) Granular Synth", xmPushButtonWidgetClass, sbox[1], NULL, 0 );
pb2[4] = XtCreateManagedWidget( "Mode(5) Granular Sampling", xmPushButtonWidgetClass, sbox[1], NULL, 0 );
n = 0;
XtSetArg( args[n], XmNminimum, 0 ); n++;
XtSetArg( args[n], XmNmaximum, 255 ); n++;
XtSetArg( args[n], XmNscaleHeight, 30 ); n++;
XtSetArg( args[n], XmNscaleWidth, 250 ); n++;
XtSetArg( args[n], XmNorientation, XmHORIZONTAL ); n++;
xmstr = XmStringCreateSimple("Speaker Gain Control");
XtSetArg( args[n], XmNtitleString, xmstr ); n++;
XtSetArg( args[n], XmNshowValue, True ); n++;
volume = XtCreateManagedWidget( "", xmScaleWidgetClass, sbox[2], args, n );
n = 0;
XtSetArg( args[n], XmNminimum, 1 ); n++;
XtSetArg( args[n], XmNmaximum, 99 ); n++;
XtSetArg( args[n], XmNscaleHeight, 30 ); n++;
XtSetArg( args[n], XmNscaleWidth, 250 ); n++;
XtSetArg( args[n], XmNorientation, XmHORIZONTAL ); n++;
xmstr = XmStringCreateSimple("Gr. Density Control");
XtSetArg( args[n], XmNtitleString, xmstr ); n++;
XtSetArg( args[n], XmNshowValue, True ); n++;
sample = XtCreateManagedWidget( "", xmScaleWidgetClass, sbox[3], args, n );
n = 0;
XtSetArg( args[n], XmNminimum, 1 ); n++;
XtSetArg( args[n], XmNmaximum, 99 ); n++;
XtSetArg( args[n], XmNscaleHeight, 30 ); n++;
XtSetArg( args[n], XmNscaleWidth, 250 ); n++;
XtSetArg( args[n], XmNorientation, XmHORIZONTAL ); n++;
xmstr = XmStringCreateSimple("Grain Width Control");
XtSetArg( args[n], XmNtitleString, xmstr ); n++;
XtSetArg( args[n], XmNshowValue, True ); n++;
pitch = XtCreateManagedWidget( "", xmScaleWidgetClass, sbox[4], args, n );
n = 0;
XtSetArg( args[n], XmNminimum, 1 ); n++;
XtSetArg( args[n], XmNmaximum, 32 ); n++;
XtSetArg( args[n], XmNscaleHeight, 30 ); n++;
XtSetArg( args[n], XmNscaleWidth, 250 ); n++;
XtSetArg( args[n], XmNorientation, XmHORIZONTAL ); n++;
xmstr = XmStringCreateSimple("Grain Offset Control");
XtSetArg( args[n], XmNtitleString, xmstr ); n++;
XtSetArg( args[n], XmNshowValue, True ); n++;
offset = XtCreateManagedWidget( "", xmScaleWidgetClass, sbox[5], args, n );
/***** Callback Routine Define *****/
for(i=0;i<5;i++){
XtAddCallback( pb2[i], XmNactivateCallback, create_sound, audio_menu[i] );
}
XtAddCallback( pb3[0], XmNactivateCallback, sound_off, NULL );
XtAddCallback( pb3[1], XmNactivateCallback, self_kill, NULL );
XtAddCallback( volume, XmNvalueChangedCallback, scaler_volume, NULL );
XtAddCallback( volume, XmNdragCallback, scaler_volume, NULL );
XtAddCallback( sample, XmNvalueChangedCallback, scaler_sample, NULL );
XtAddCallback( sample, XmNdragCallback, scaler_sample, NULL );
XtAddCallback( pitch, XmNvalueChangedCallback, scaler_pitch, NULL );
XtAddCallback( pitch, XmNdragCallback, scaler_pitch, NULL );
XtAddCallback( offset, XmNvalueChangedCallback, scaler_offset, NULL );
XtAddCallback( offset, XmNdragCallback, scaler_offset, NULL );
/***** Start Realize ! *****/
XtRealizeWidget(toplevel);
XtMainLoop();
}
void self_kill(Widget w, caddr_t message, caddr_t para)
{
sound_off();
printf("\nBye Bye ! (^o^)/\n\n");
exit(0);
}
void create_sound(Widget w, caddr_t message, caddr_t para)
{
sound_off();
if( !strcmp( message, "distrotion" ) ){
sample_param = 1;
audio_pid = sproc( audio_distrotion, PR_SALL );
audio_mode = 1;
}
else if( !strcmp( message, "oscillator" ) ){
sample_param = 1;
audio_pid = sproc( audio_oscillator, PR_SALL );
audio_mode = 2;
}
else if( !strcmp( message, "granular synth" ) ){
sample_param = 1;
pitch_param = 1;
audio_pid = sproc( audio_granular, PR_SALL );
audio_mode = 3;
}
else if( !strcmp( message, "granular sampling" ) ){
sample_param = 16;
pitch_param = 1;
offset_param = 1;
audio_pid = sproc( audio_effector, PR_SALL );
audio_mode = 4;
}
else if( !strcmp( message, "through" ) ){
audio_pid = sproc( audio_through, PR_SALL );
audio_mode = 5;
}
if (audio_pid == -1) exit(-1);
printf(" Registered Audio PID = %d\n",audio_pid);
}
void sound_off()
{
long parameter_buffer[4];
if(audio_pid != 0){
parameter_buffer[0] = AL_LEFT_SPEAKER_GAIN;
parameter_buffer[2] = AL_RIGHT_SPEAKER_GAIN;
ALgetparams( AL_DEFAULT_DEVICE, parameter_buffer, 4 );
parameter_buffer[1] = 50;
parameter_buffer[3] = 50;
ALsetparams( AL_DEFAULT_DEVICE, parameter_buffer, 4 );
kill(audio_pid, SIGKILL);
printf(" Killed : Audio PID = %d\n",audio_pid);
audio_pid = 0; audio_mode = 0;
}
}
void scaler_volume(Widget w, caddr_t message, caddr_t para)
{
long parameter_buffer[4];
XmScaleCallbackStruct *callback = (XmScaleCallbackStruct *) para;
parameter_buffer[0] = AL_LEFT_SPEAKER_GAIN;
parameter_buffer[2] = AL_RIGHT_SPEAKER_GAIN;
ALgetparams( AL_DEFAULT_DEVICE, parameter_buffer, 4 );
parameter_buffer[1] = callback->value;
parameter_buffer[3] = callback->value;
ALsetparams( AL_DEFAULT_DEVICE, parameter_buffer, 4 );
}
void scaler_sample(Widget w, caddr_t message, caddr_t para)
{
XmScaleCallbackStruct *callback = (XmScaleCallbackStruct *) para;
sample_param = callback->value;
}
void scaler_pitch(Widget w, caddr_t message, caddr_t para)
{
int i, width;
XmScaleCallbackStruct *callback = (XmScaleCallbackStruct *) para;
pitch_param = callback->value;
if( audio_mode == 3){
width = 64 + 4 * pitch_param;
for(i=0;i<width;i++) buffer[i] = (short)( 800.0 * ( 1.0 + sin(2.0*pi*(double)i/(double)width + 2.0*pi*3.0/4.0)));
for(i=width;i<FIFO_SIZE;i++) buffer[i] = 0;
}
}
void scaler_offset(Widget w, caddr_t message, caddr_t para)
{
XmScaleCallbackStruct *callback = (XmScaleCallbackStruct *) para;
offset_param = callback->value;
}
void audio_through()
{
ALconfig config;
ALport input_port, output_port;
short buff[256];
int result, i = 256;
config = ALnewconfig();
ALsetqueuesize( config, 2048 );
input_port = ALopenport( "input", "r", config );
output_port = ALopenport( "output", "w", config );
if ( input_port == NULL || output_port == NULL ) exit(-1);
result = prctl(PR_RESIDENT);
if(result == -1) fprintf(stderr, "permission denied to be [memory-resident]. (;_;)\n");
result = schedctl(NDPRI, 0, NDPHIMAX);
if(result == -1) fprintf(stderr, "permission denied to set process priority. (;_;)\n");
while (1)
{
ALreadsamps( input_port, buff, i );
ALwritesamps( output_port, buff, i );
}
}
void audio_distrotion()
{
ALconfig config;
ALport input_port, output_port;
short buff[256];
int result, i = 256;
config = ALnewconfig();
ALsetqueuesize( config, 2048 );
input_port = ALopenport( "input", "r", config );
output_port = ALopenport( "output", "w", config );
if ( input_port == NULL || output_port == NULL ) exit(-1);
result = prctl(PR_RESIDENT);
if(result == -1) fprintf(stderr, "permission denied to be [memory-resident]. (;_;)\n");
result = schedctl(NDPRI, 0, NDPHIMAX);
if(result == -1) fprintf(stderr, "permission denied to set process priority. (;_;)\n");
while (1)
{
ALreadsamps( input_port, buff, sample_param );
for(i=0;i<sample_param;i++){
ALwritesamps( output_port, buff, 1 );
}
}
}
void audio_oscillator()
{
ALconfig config;
ALport output_port;
short buff[256];
unsigned int read_pointer=0;
int i;
config = ALnewconfig();
ALsetqueuesize( config, FIFO_SIZE );
output_port = ALopenport( "output", "w", config );
if ( output_port == NULL ) exit(-1);
for(i=0;i<256;i++) buffer[i] = (short)( 15000.0 * sin( 2.0 * pi * (double)i / 256.0 ));
for(i=256;i<FIFO_SIZE;i++) buffer[i] = 0;
while (1)
{
if( ALgetfillable(output_port) > 256 ){
for(i=0;i<256;i++){
buff[i] = buffer[read_pointer++];
if( read_pointer > sample_param * 256 ) read_pointer=0;
}
ALwritesamps( output_port, buff, 256 );
}
}
}
void audio_granular()
{
ALconfig config;
ALport output_port;
short buff[256];
unsigned int read_pointer[20];
int i, j;
config = ALnewconfig();
ALsetqueuesize( config, FIFO_SIZE );
output_port = ALopenport( "output", "w", config );
if ( output_port == NULL ) exit(-1);
for(i=0;i<20;i++) read_pointer[i] = 0;
for(i=0;i<128;i++) buffer[i] = (short)( 800.0 * ( 1.0 + sin( 2.0 * pi * (double)i / 128.0 + 2.0 * pi * 3.0 / 4.0 )));
for(i=128;i<FIFO_SIZE;i++) buffer[i] = 0;
while (1)
{
if( ALgetfillable(output_port) > 256 ){
for(i=0;i<256;i++){
buff[i] = 0;
for(j=0;j<20;j++){
buff[i] = buff[i] + buffer[read_pointer[j]++];
if( read_pointer[j] > ( sample_param + 10 ) * 10 * (j+5) ) read_pointer[j] = 0;
}
}
ALwritesamps( output_port, buff, 256 );
}
}
}
void audio_effector()
{
ALconfig config;
ALport input_port, output_port;
short buff[1024];
float shift, weight[1024];
unsigned int read_pointer[20];
int i, j, result;
config = ALnewconfig();
ALsetqueuesize( config, 8192 );
input_port = ALopenport( "input", "r", config );
output_port = ALopenport( "output", "w", config );
if ( input_port == NULL || output_port == NULL ) exit(-1);
result = prctl(PR_RESIDENT);
if(result == -1) fprintf(stderr, "permission denied to be [memory-resident]. (;_;)\n");
result = schedctl(NDPRI, 0, NDPHIMAX);
if(result == -1) fprintf(stderr, "permission denied to set process priority. (;_;)\n");
for(i=0;i<20;i++) read_pointer[i] = 0;
for(i=0;i<1024;i++) weight[i] = ( 1.0 + sin( 2.0 * pi * (float)i / 1024.0 + 2.0 * pi * 3.0 / 4.0 )) / 2.0;
for(i=0;i<FIFO_SIZE;i++) buffer[i] = 0;
while (1)
{
ALreadsamps( input_port, buff, 1024 );
shift = 1024.0 - ( (float)pitch_param - 1.0 ) * 9.8;
for(i=0;i<(int)shift;i++){
j = (int)( (float)i * 1024.0 / shift );
buffer[i] = (short)( (float)buff[j] * weight[j] / 40.0 );
}
for(i=(int)shift;i<1024;i++) buffer[i] = 0;
for(i=0;i<1024;i++){
buff[i] = 0;
for(j=0;j<20;j++){
buff[i] = buff[i] + buffer[read_pointer[j]++];
if( read_pointer[j] > 1001 + 20 * sample_param + j * offset_param ) read_pointer[j] = 0;
}
}
ALwritesamps( output_port, buff, 1024 );
}
}
#include <midi.h>
#include <midiio.h>
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <Xm/ScrollBar.h>
#include <Xm/PushB.h>
#include <Xm/Form.h>
#include <Xm/Frame.h>
#include <X11/Xirisw/GlxMDraw.h>
#define XS 100
#define YS 100
/*** (^_^;) Bug Recovery of SGI Media Library --> Original MIDI Defines !! (^_^;) ***/
#define MES(x) ( (x[0]).mm.msgbuf )
#define midi_set_status(x,d) ( MES(x) = ( ( d > 0xbf ) && ( d < 0xe0 ) ) ? 0x40000000 : 0x60000000, \
MES(x) &= 0xff0fffff, MES(x) |= ( ( d & 0xf0 ) << 16 ) )
#define midi_set_channel(x,d) ( MES(x) &= 0xfff0ffff, MES(x) |= ( ( d & 0x0f ) << 16 ) )
#define midi_set_keyno(x,d) ( MES(x) &= 0xffff00ff, MES(x) |= ( ( d & 0x7f ) << 8 ) )
#define midi_set_velocity(x,d) ( MES(x) &= 0xffffff00, MES(x) |= ( d & 0x7f ) )
MIport *midi_port;
MIevent midi[100];
int interval = 10, st = 5, mx, my, sc_x, sc_y, sp = 3, spp = 0, mode = 0, sst, ssp, mmx, mmy;
XtAppContext app_context;
int vert[8][4][3] = { 110,110,0,10,110,0,10,10,0,110,10,0,-110,110,0,-10,110,0,-10,10,0,-110,10,0,
110,-110,0,10,-110,0,10,-10,0,110,-10,0,-110,-110,0,-10,-110,0,-10,-10,0,-110,-10,0,
-220,-220,0,-120,-220,0,-120,-120,0,-220,-120,0,220,220,0,120,220,0,120,120,0,220,120,0,
-220,220,0,-120,220,0,-120,120,0,-220,120,0,220,-220,0,120,-220,0,120,-120,0,220,-120,0 };
int vcolor[8][3] = { 30,30,255,255,30,30,255,30,30,30,30,255,210,250,50,210,250,50,210,250,50,210,250,50 };
int t_mpy[8] = { 1,1,1,1,3,3,3,3 };
int t_sgn[4][8] = { 1,1,1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1 };
long background[3] = { 0, 0, 0 };
GLXconfig glxConfig [] = { { GLX_NORMAL, GLX_DOUBLE, TRUE }, { GLX_NORMAL, GLX_RGB, TRUE },
{ GLX_NORMAL, GLX_ZSIZE, GLX_NOCONFIG }, { 0, 0, 0 } };
void init_window(), do_resize(), input(), set_inc(), set_rot(), quit(), handle_timeout(), sound_on(), sound_off();
void midi_initialize(), midi_event_generate(), midi_transmit(), midi_tx_3byte(), midi_tx_2byte();
main(int argc, char **argv)
{
Arg args[20];
int n;
Widget glw, toplevel, form, frame, slider1, slider2, pushb[3];
toplevel = XtAppInitialize(&app_context, "", (XrmOptionDescList)NULL , 0, (Cardinal*)&argc,
(String*)argv, (String*)NULL, (ArgList)NULL, 0);
n = 0;
XtSetArg(args[n], XtNwidth, 750); n++;
XtSetArg(args[n], XtNheight, 700); n++;
form = XtCreateManagedWidget("", xmFormWidgetClass, toplevel, args, n);
n = 0;
XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
XtSetArg(args[n], XmNtopOffset, 10); n++;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
XtSetArg(args[n], XmNleftOffset, 30); n++;
pushb[0] = XtCreateManagedWidget("Quit", xmPushButtonWidgetClass, form, args, n);
XtAddCallback(pushb[0], XmNactivateCallback, quit,0);
n = 0;
XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
XtSetArg(args[n], XmNtopOffset, 10); n++;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
XtSetArg(args[n], XmNleftWidget, pushb[0]); n++;
XtSetArg(args[n], XmNleftOffset, 20); n++;
pushb[1] = XtCreateManagedWidget("Sound Off", xmPushButtonWidgetClass, form, args, n);
XtAddCallback(pushb[1], XmNactivateCallback, sound_off,0);
n = 0;
XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
XtSetArg(args[n], XmNtopOffset, 10); n++;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
XtSetArg(args[n], XmNleftWidget, pushb[1]); n++;
XtSetArg(args[n], XmNleftOffset, 20); n++;
pushb[2] = XtCreateManagedWidget("Sound On", xmPushButtonWidgetClass, form, args, n);
XtAddCallback(pushb[2], XmNactivateCallback, sound_on,0);
n = 0;
XtSetArg(args[n], XtNwidth, 20); n++;
XtSetArg(args[n], XtNheight, 420); n++;
XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
XtSetArg(args[n], XmNtopWidget, pushb[0]); n++;
XtSetArg(args[n], XmNtopOffset, 10); n++;
XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
XtSetArg(args[n], XmNrightOffset, 30); n++;
XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
XtSetArg(args[n], XmNbottomOffset, 30); n++;
XtSetArg(args[n], XmNminimum, -375); n++;
XtSetArg(args[n], XmNmaximum, 400); n++;
XtSetArg(args[n], XmNvalue, st); n++;
XtSetArg(args[n], XmNsliderSize, 25); n++;
XtSetArg(args[n], XmNincrement, 1); n++;
XtSetArg(args[n], XmNpageIncrement, 10); n++;
XtSetArg(args[n], XmNvalue, -20); n++;
slider2 = XtCreateManagedWidget("", xmScrollBarWidgetClass, form, args, n);
XtAddCallback(slider2, XmNdecrementCallback, set_inc,0);
XtAddCallback(slider2, XmNincrementCallback, set_inc,0);
XtAddCallback(slider2, XmNdragCallback, set_inc,0);
XtAddCallback(slider2, XmNpageIncrementCallback, set_inc,0);
XtAddCallback(slider2, XmNpageDecrementCallback, set_inc,0);
n = 0;
XtSetArg(args[n], XtNwidth, 20); n++;
XtSetArg(args[n], XtNheight, 420); n++;
XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
XtSetArg(args[n], XmNtopWidget, pushb[0]); n++;
XtSetArg(args[n], XmNtopOffset, 10); n++;
XtSetArg(args[n], XmNrightAttachment, XmATTACH_WIDGET); n++;
XtSetArg(args[n], XmNrightWidget, slider2); n++;
XtSetArg(args[n], XmNrightOffset, 20); n++;
XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
XtSetArg(args[n], XmNbottomOffset, 30); n++;
XtSetArg(args[n], XmNminimum, -175); n++;
XtSetArg(args[n], XmNmaximum, 200); n++;
XtSetArg(args[n], XmNvalue, sp); n++;
XtSetArg(args[n], XmNsliderSize, 25); n++;
XtSetArg(args[n], XmNincrement, 1); n++;
XtSetArg(args[n], XmNpageIncrement, 10); n++;
XtSetArg(args[n], XmNvalue, 0); n++;
slider1 = XtCreateManagedWidget("", xmScrollBarWidgetClass, form, args, n);
XtAddCallback(slider1, XmNdecrementCallback, set_rot,0);
XtAddCallback(slider1, XmNincrementCallback, set_rot,0);
XtAddCallback(slider1, XmNdragCallback, set_rot,0);
XtAddCallback(slider1, XmNpageIncrementCallback, set_rot,0);
XtAddCallback(slider1, XmNpageDecrementCallback, set_rot,0);
n = 0;
XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
XtSetArg(args[n], XmNtopWidget, pushb[0]); n++;
XtSetArg(args[n], XmNtopOffset, 10); n++;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
XtSetArg(args[n], XmNleftOffset, 30); n++;
XtSetArg(args[n], XmNrightAttachment, XmATTACH_WIDGET); n++;
XtSetArg(args[n], XmNrightWidget, slider1); n++;
XtSetArg(args[n], XmNrightOffset, 25); n++;
XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
XtSetArg(args[n], XmNbottomOffset, 30); n++;
XtSetArg(args[n], XmNshadowType, XmSHADOW_IN); n++;
frame = XtCreateManagedWidget("", xmFrameWidgetClass, form, args, n);
n = 0;
XtSetArg(args[n], GlxNglxConfig, glxConfig); n++;
glw = XtCreateManagedWidget("", glxMDrawWidgetClass, frame, args, n);
XtAddCallback(glw, GlxNresizeCallback, do_resize, 0);
XtAddCallback(glw, GlxNginitCallback, init_window, 0);
XtAddCallback(glw, GlxNinputCallback, input, 0);
XtAppAddTimeOut(app_context, interval, handle_timeout, glw);
WidgetBackgroundToGlC3i(glw,background);
XtRealizeWidget(toplevel);
installColormap(toplevel,glw);
XtAppMainLoop(app_context);
}
static void quit(Widget w, caddr_t client_data, caddr_t call_data)
{
midi_tx_2byte( 0xdf, 0 );
MIclose( midi_port );
MIfreeport( midi_port );
exit (0);
}
static void init_window(Widget w, caddr_t client_data, caddr_t call_data)
{
do_resize(w);
RGBmode();
RGBcolor(0,0,0); clear();
doublebuffer();
blendfunction(BF_ONE, BF_MDC);
mmode(MVIEWING);
perspective(900,1,-100,0);
lookat (0,0,500,0,0,0,0);
midi_initialize();
}
static void do_resize(Widget w, caddr_t client_data, GlxDrawCallbackStruct *call_data)
{
sp = 0;
GLXwinset(XtDisplay(w), XtWindow(w));
sc_x = (Screencoord)call_data->width;
sc_y = (Screencoord)call_data->height;
viewport(0, sc_x-1, 0, sc_y-1);
}
static void input(Widget w, caddr_t client_data, GlxDrawCallbackStruct *call_data)
{
char buffer[1];
switch(call_data->event->type){
case ButtonPress:
switch(call_data->event->xbutton.button){
case Button1:
mx = call_data->event->xbutton.x - sc_x/2;
my = call_data->event->xbutton.y - sc_y/2;
scale_change();
break;
}
break;
case MotionNotify:
if (call_data->event->xmotion.state & Button1Mask){
mx = call_data->event->xbutton.x - sc_x/2;
my = call_data->event->xbutton.y - sc_y/2;
scale_change();
}
break;
}
}
static void handle_timeout(Widget w)
{
int i,j;
XtAppAddTimeOut(app_context, interval, handle_timeout, w);
GLXwinset(XtDisplay(w), XtWindow(w));
RGBcolor(0,0,0); clear();
rotate (st,'y');
for(i=0;i<4;i++){
RGBcolor(vcolor[i][0],vcolor[i][1],vcolor[i][2]);
bgnpolygon();
for(j=0;j<4;j++) v3i(vert[i][j]);
endpolygon();
}
pushmatrix();
rotate (spp,'z');
for(i=4;i<8;i++){
RGBcolor(vcolor[i][0],vcolor[i][1],vcolor[i][2]);
bgnpolygon();
for(j=0;j<4;j++) v3i(vert[i][j]);
endpolygon();
}
popmatrix();
spp = spp + sp;
swapbuffers();
gflush();
}
static void midi_initialize()
{
MIconfig *c;
c = MInewconfig();
midi_port = MInewport();
if( MIopen( midi_port, "rw", &c ) < 0 ) exit(-1);
}
static void midi_transmit( int status, int channel, int keyno, int velocity )
{
midi_set_status( midi, ( status & 0xf0 ) );
midi_set_channel( midi, ( channel & 0x0f ) );
midi_set_keyno( midi, ( keyno & 0x7f ) );
midi_set_velocity ( midi, ( velocity & 0x7f ) );
if( MIsend( midi_port, midi, 1 ) < 0 ) exit(-1);
}
static void midi_tx_3byte( int status_byte, int keyno, int velocity )
{
midi_transmit( ( status_byte & 0xf0 ), ( status_byte & 0x0f ), keyno, velocity );
}
static void midi_tx_2byte( int status_byte, int param )
{
midi_transmit( ( status_byte & 0xf0 ), ( status_byte & 0x0f ), param, 0 );
}
static void sound_on(Widget w, caddr_t client_data, caddr_t call_data)
{
if(mode == 0){
mode = 1;
midi_tx_2byte( 0xdf, 1 );
}
}
static void sound_off(Widget w, caddr_t client_data, caddr_t call_data)
{
if(mode != 0){
mode = 0;
midi_tx_2byte( 0xdf, 0 );
}
}
scale_change()
{
int i;
for(i=0;i<8;i++){
vert[i][0][0] = t_sgn[i%4][0] * mx * t_mpy[i] - XS/2;
vert[i][0][1] = t_sgn[i%4][1] * my * t_mpy[i] + YS/2;
vert[i][1][0] = t_sgn[i%4][2] * mx * t_mpy[i] - XS/2;
vert[i][1][1] = t_sgn[i%4][3] * my * t_mpy[i] - YS/2;
vert[i][2][0] = t_sgn[i%4][4] * mx * t_mpy[i] + XS/2;
vert[i][2][1] = t_sgn[i%4][5] * my * t_mpy[i] - YS/2;
vert[i][3][0] = t_sgn[i%4][6] * mx * t_mpy[i] + XS/2;
vert[i][3][1] = t_sgn[i%4][7] * my * t_mpy[i] + YS/2;
}
mmx = (int)( (mx+sc_x/2) * 128 / sc_x );
if( mmx<0 ) mmx = 0;
else if( mmx>127 ) mmx = 127;
mmy = (int)( 127.9 - (my+sc_y/2) * 128 / sc_y );
if( mmy<0 ) mmy = 0;
else if( mmy>127 ) mmy = 127;
/* printf(" [mx/my] changes : mx = %d, mmx = %d, my = %d mmy = %d\n",mx,mmx,my,mmy); */
midi_tx_3byte( 0xaf, mmx, mmy );
}
static void set_inc(Widget w, caddr_t client_data, XmScrollBarCallbackStruct *call_data)
{
st = call_data->value;
if( st == 0 ) sst = 64;
else if( st > 0 ) sst = 63 + (int)( 62.9 - (st+375) * 63 / 375 );
else if( st < 0 ) sst = 65 + (int)( 62.9 - (st+375) * 63 / 375 );
/* printf(" [st] changes : st = %d, sst = %d, sp = %d ssp = %d\n",st,sst,sp,ssp); */
midi_tx_3byte( 0xbf, ssp, sst );
}
static void set_rot(Widget w, caddr_t client_data, XmScrollBarCallbackStruct *call_data)
{
sp = call_data->value;
if( sp == 0 ) ssp = 64;
else if( sp > 0 ) ssp = 63 + (int)( 62.9 - (sp+175) * 63 / 175 );
else if( sp < 0 ) ssp = 65 + (int)( 62.9 - (sp+175) * 63 / 175 );
/* printf(" [sp] changes : st = %d, sst = %d, sp = %d ssp = %d\n",st,sst,sp,ssp); */
midi_tx_3byte( 0xbf, ssp, sst );
}