1 REM +++++++++++++++++++++++++++++++
2 REM ! Program .... MUSINT1.BAS
3 REM ! Utg}va 85-08-06
4 REM ! av David Andersson <5201>
5 REM ! Minne 16 Kbytes
6 REM ! Screening TES
7 REM +++++++++++++++++++++++++++++++
170 REM
180 REM PROGRAMMET SPELAR MUSIK I
190 REM H\GTALAREN, [VEN N[R MAN
200 REM INTE K\R PROGRAMMET.
210 REM ST[NG AV MED CALL(62258).
220 REM
230 REM DATASATSERNA INNEH]LLER NOTERNA
240 REM F\R "THE ENTERTAINER".
250 REM
260 REM MASKINKOD LADDAS P] ADRESSERNA
270 REM 60000..62500 (FLYTTAR STACKEN).
280 REM
290 REM ===============================
300 REM
310 REM
320 REM
500 REM BESKRIVNING AV DATASATSER
510 REM -------------------------------
520 REM Tonh|jder i fyra oktaver;
530 REM (1 l{gst, 4 h|gst)
540 REM 1. c >d >e >f >g >a >h
580 REM
590 REM "+" h|jer en halvton, ex. D+,4
600 REM "-" s{nker en halvton,ex. a-,8
610 REM "_" g|r att tonen flyter ihop
620 REM med n{sta, ex. e_,2,f,2
630 REM "!" g|r tonen distinkt dvs den
640 REM blir kortare, ex. C!,2
650 REM
660 REM -------------------------------
670 REM Paus;
680 REM enbart "-" anger paus,ex. -,8
690 REM
700 REM -------------------------------
710 REM Tidv{rden;
720 REM siffran efter kommat (efter
730 REM tonh|jd eller paus) anger
740 REM tidv{rde.
750 REM
760 REM helton=1,halvton=2,kvartston=4
770 REM }ttondelston=8 osv., ex. C,8
780 REM
790 REM -------------------------------
800 REM Speciella data;
810 REM _ s{tt p}/av hopflytning
820 REM _,0 toner ska flyta ihop.
830 REM _,1 distinkta toner.
840 REM REPEAT slut markering,
850 REM REPEAT,0 sluta spela.
860 REM REPEAT,1 play it again.
870 REM U s{tter OUT 6,X koden,
880 REM ex. U,121
890 REM T s{tt takter/minut
900 REM ex. L,40
910 REM -------------------------------
920 REM
1000 REM DATASATSER
1010 DATA T,40,_,0,U,121
1030 DATA >d,8,>e,8,>c,8,a,4,h,8,g,4
1040 DATA d,8,e,8,c,8,A,4,H,8,G,4
1050 DATA d,8,e,8,c,8,A,4,H,8,A,8,A-,8
1060 DATA G,2,H,4,_,1,U,121,d,8,d+,8
1070 DATA e,8,>c,4,e,8,>c,4,e,8,>c_,8
1080 DATA >c_,2,-,8,>c,8,>d,8,>d+,8
1090 DATA >e,8,>c,8,>d,8,>e,4,h,8,>d,4
1100 DATA >c!,1.333,d,8,d+,8
1110 DATA e,8,>c,4,e,8,>c,4,e,8,>c_,8
1120 DATA >c!,1.333,a,8,g,8
1130 DATA f+,8,a,8,>c,8,>e,4,>d,8,>c,8,a,8
1140 DATA >d_,2,-,4,d,8,d+,8
1150 DATA e,8,>c,4,e,8,>c,4,e,8,>c_,8
1160 DATA >c_,2,-,8,>c,8,>d,8,>d+,8
1170 DATA >e,8,>c,8,>d,8,>e,4,h,8,>d,4
1180 DATA >c!,1.333,>c,8,>d,8
1190 DATA >e,8,>c,8,>d,8,>e,4,>c,8,>d,8,>c,8
1200 DATA >e,8,>c,8,>d,8,>e,4,>c,8,>d,8,>c,8
1210 DATA >e,8,>c,8,>d,8,>e,4,>H,8,>d,4
1220 DATA >c_,2,-,8,_,0,e,8,f,8,f+,8
1230 DATA g,4,a,8,g,4,e,8,f,8,f+,8
1240 DATA g,4,a,8,g,4,>e,8,>c,8,g,8
1250 DATA a,8,h,8,>c,8,>d,8,>e,8,>d,8,>c,8,>d,8
1260 DATA g,8,e,8,f,8,g,8,a,8,g,8,e,8,f,8
1270 DATA g,4,a,8,g,4,e,8,f,8,f+,8
1280 DATA g,4,a,8,g,4,g,8,a,8,a+,8
1290 DATA h,8,h,4,h,4,a,8,f+,8,d,8
1300 DATA g_,2,-,8,e,8,f,8,f+,8
1310 DATA g,4,a,8,g,4,e,8,f,8,f+,8
1320 DATA g,4,a,8,g,4,>e,8,>c,8,g,8
1330 DATA a,8,h,8,>c,8,>d,8,>e,8,>d,8,>c,8,>d,8
1340 DATA >c_,2,-,8,_,1,g,8,f+,8,g,8
1350 DATA >c,4,a,8,>c,4,a,8,>c,8,a,8
1360 DATA g,8,>c,8,>e,8,>g,4,>e,8,>c,8,g,8
1370 DATA a,4,>c,4,>e,8,>d,4,>c_,8
1380 DATA >c!,1
1390 DATA -,1,-,1,-,1
1400 DATA REPEAT,1
2000 REM INITIERINGAR
2010 DIM F%(48%) : REM TONSKALA
2020 ; CHR$(12%)'**************** MUSIK ****************'
2030 ;
2040 M0%=62258% : REM MASKINKODSADRESS
2050 A0%=60000% : REM F\RSTA ADRESS F\R MUSIK LISTA I MINNET
2060 A9%=62258% : REM MAX ADRESS MUSIK LISTA
2070 S%=PEEK(65063%)+SWAP%(PEEK(65064%)) : REM STACK
2080 IF PEEK(65056%)+SWAP%(PEEK(65057%))+100%>S% ; 'MINNET FULLT ([NDRA BOFA ELLER RESET)' : STOP
2090 IF S%<>A0% OR PEEK(A9%)<>24% IF S%0% AND B1%<40% ; CHR$(23%)STRING$(39%-B1%,B1%+33%)TAB(39%)CHR$(13%);
3150 GOTO 3100
3160 END
4000 REM DEFINIERA TONSKALAN
4010 RESTORE 4050
4020 FOR F%=1% TO 48%
4030 READ F%(F%)
4040 NEXT F%
4050 REM TONSKALAN
4060 DATA 238,226,212,200,190,180,168,159,150,142,134,126
4070 DATA 119,113,106,100,095,090,084,080,075,071,067,063
4080 DATA 060,056,053,050,047,045,042,040,038,036,034,032
4090 DATA 030,028,027,025,024,022,021,020,019,018,017,016
4100 RETURN
5000 REM KONVERTERA DATASATSER TILL MUSIKLISTA
5010 U1%=121% : REM DEFAULT OUT-KOD
5020 D0=7812*60/40 : REM DEFAULT TAKT
5030 P0%=0% : REM DEFAULT DISTINKTA TONER
5100 REM LOOP
5110 IF A%+15%>A9% ; 'F\R L]NG MUSIKLISTA (TA BORT DATASATSER ELLER [NDRA A0%)' : GOTO 5600
5120 READ F$,D
5130 ; F$' ';
5140 REM KOLLA SPECIALKOMMANDON
5150 IF F$='REPEAT' OR F$='repeat' GOTO 5600
5160 IF F$='_' P0%=D : GOTO 5100
5170 IF F$='T' OR F$='t' D0=7812.5*60/D : GOTO 5100
5180 IF F$='U' OR F$='u' U1%=D : POKE A%,0%,U1% : A%=A%+3% : GOTO 5100
5190 REM BER[KNA TIDV[RDE
5200 D1%=D0/D
5210 REM KOLLA PAUS
5220 IF F$='-' C%=255% : GOSUB 6000 : GOTO 5100 : REM PAUS
5230 REM KOLLA TONH\JD
5240 F%=12%
5250 IF LEFT$(F$,1%)='<' F%=0% : F$=RIGHT$(F$,2%)
5260 IF LEFT$(F$,1%)='>' F%=24% : F$=RIGHT$(F$,2%)
5270 F1%=INSTR(1%,'CCDDEFFGGAAHccddeffggaah',LEFT$(F$,1%))
5280 IF F1%=0% ; 'FEL I DATASATSERNA ([NDRA I DATASATERNA)'
5290 F%=F%+F1%
5300 IF INSTR(2%,F$,'+') THEN F%=F%+1%
5310 IF INSTR(2%,F$,'-') THEN F%=F%-1%
5320 REM KOLLA DISTINKT ELLER HOPFLYTANDE
5330 REM DISTINKT; 90% LJUDANDE OCH 10% TYST
5340 IF P0% P1%=0% ELSE P1%=D1%/10%
5350 IF INSTR(2%,F$,'_') P1%=0%
5360 IF INSTR(2%,F$,'!') P1%=P1%+(D1%-P1%)/10%
5370 D1%=D1%-P1%
5380 REM STOPPA IN I MUSIKLISTAN
5390 C%=F%(F%) : GOSUB 6000 : REM TON
5400 IF P1% C%=255% : D1%=P1% : GOSUB 6000 : REM EV. PAUS
5410 GOTO 5100
5600 REM END LOOP
5610 IF D D1%=A0% ELSE D1%=0% : REM REPEAT ELLER SLUTA
5620 C%=1% : GOSUB 6000 : REM SISTA POST I MUSIKLISTAN
5630 RETURN
6000 REM L[GG POST I MUSIKLISTAN
6010 POKE A%,C%,D1%,SWAP%(D1%)
6020 A%=A%+3%
6030 RETURN
7000 REM LADDA MASKINKOD
7010 REM STARTA MUSIK MED CALL(62258,A) D[R A [R ADRESS TILL MUSIKLISTA
7020 REM STOPPA MUSIK MED CALL(62258)
7030 REM MUSIKLISTA BEST]R AV MUSIKPOSTER, EN MUSIKPOST [R 3 BYTES L]NG
7040 REM 1;A BYTEN [R EN KOD ELLER ANGER EN TONH\JD
7050 REM 2;A OCH 3;E BYTEN [R DATA ELLER ANGER TIDV[RDE
7060 REM OM KOD=0 [R 2;A BYTEN OUTV[RDET VID OUT 6,X SOM SKA ANV[NDAS
7070 REM OM KOD=1 [R 2;A OCH 3;E BYTEN ADRESS D[R LISTAN FORTS[TTER (HOPP)
7080 REM OM KOD=2..254 [R DET EN TONH\JD OCH 2;A OCH 3;E BYTEN [R TIDV[RDE
7090 REM OM KOD=255 BETYDER DET TYST OCH 2;A OCH 3;E BYTEN ANGER HUR L[NGE
7100 REM TONH\JDEN BLIR 7812/KOD (HERTZ)
7110 REM VARAKTIGHET BLIR 7812/TIDV[RDE (SEKUNDER)
7120 POKE 62258%,24%,14%,111%,243%,148%,5%,79%,135%,135%,135%,243%,207%,255%,183%,127%,0%
7130 POKE 62274%,122%,179%,33%,61%,243%,40%,16%,235%,164%,40%,9%,34%,170%,243%,33%,1%
7140 POKE 62290%,0%,34%,149%,243%,33%,56%,243%,237%,87%,254%,243%,40%,3%,50%,65%,243%
7150 POKE 62306%,197%,1%,57%,4%,243%,237%,179%,126%,237%,71%,251%,193%,201%,245%,229%,219%
7160 POKE 62322%,56%,254%,111%,202%,126%,243%,50%,116%,243%,7%,56%,84%,62%,111%,61%,194%
7170 POKE 62338%,141%,243%,62%,111%,50%,127%,243%,175%,195%,146%,243%,50%,127%,243%,62%,121%
7180 POKE 62354%,211%,6%,33%,111%,0%,43%,124%,181%,40%,13%,34%,149%,243%,33%,246%,253%
7190 POKE 62370%,203%,150%,225%,241%,251%,237%,77%,33%
7200 POKE 62380%,126%,35%,254%,1%,40%,43%
7210 POKE 62386%,56%,34%,50%,133%,243%,60%,62%,194%,32%,1%,60%,50%,129%,243%,126%,50%
7220 POKE 62402%,149%,243%,35%,126%,50%,150%,243%,35%,34%,170%,243%,225%,241%,251%,237%,77%
7230 POKE 62418%,225%,195%,31%,3%,126%,35%,50%,145%,243%,24%,236%,126%,50%,170%,243%,35%
7240 POKE 62434%,126%,50%,171%,243%,167%,204%,68%,243%,24%,225%
7250 RETURN