home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Go64!
/
Go64_2000-06_2000_CSW_Side_A.d64
/
audio-d
(
.txt
)
< prev
next >
Wrap
Commodore BASIC
|
2023-02-26
|
9KB
|
296 lines
1000 rem ------------------------------
1010 rem scsi listing4
1011 rem original by achim taege 1997
1012 rem adapted for c64 and modified
1013 rem by torsten baade 2000
1014 rem email:torsten@sport-moeller.de
1015 rem v1.10 24-07-2000
1020 rem ------------------------------
1060 print chr$(147);chr$(14) :rem clr sreen & s/b
1070 bd=peek(186):rem aktuelle floppy
1080 dim pu(9),td(36,7),pe%(512)
1090 bl=2352:rem laenge des audioblocks =1/75 sec
1100 sk=0 :rem sessionnummer
1110 :
1120 mh=48:ml=0: rem h- & l-byte of scsi buffer
1130 dp=48*256: rem scsi daten puffer
1140 z$="----------------------------------------"
1150 l$=" "
1190 goto 60000 :rem zum hauptprogramm
2000 rem - scsi-command: inquiry 6 byte
2010 sc$=chr$(18)+chr$(lu*32)+chr$(0)+chr$(0)+chr$(32)+chr$(0)
2020 gosub 4000:return:rem sende befehl
2030 :
2040 rem ---------- scsi-kommando test unit ready 6 byte ---
2050 sc$=chr$(0)+chr$(lu*32)+chr$(0)+chr$(0)+chr$(0)+chr$(0)
2060 gosub 4000:return:rem sende befehl
2070 :
2400 rem ---------- scsi-kommando read toc 10 byte ----------
2410 sc$=chr$(67)+chr$(lu*32+2)+chr$(0)+chr$(0)+chr$(0)
2420 sc$=sc$+chr$(0)+chr$(0)+chr$(int(bl/256))+chr$(bl and 255)+chr$(0)
2430 gosub 4000
2440 if fe<>0 then 2600: rem sonst titel einlesen
2450 ii=1:rem reicht fuer 36 titel
2460 :open 15,dv,15
2470 :for b=0 to ii
2480 : print#15,"m-r"chr$(ml)chr$(mh+b)chr$(0)
2490 : for i=0 to 255:get#15,b$:pe%(b*256+i)=asc(b$+chr$(0)):next
2500 :next
2510 :close15
2520 tn=pe%(0)*256+pe%(1): rem lenght of toc
2530 fk=pe%(2) :rem erster titel
2540 lk=pe%(3) :rem letzter titel
2550 for i=fk-1 to lk:print : rem lese start und endzeit
2560 : for ii=0 to 7 : rem 8 byte pro titel
2570 : td(i,ii)=pe%(4+(i*8)+ii)
2580 : next
2590 :next
2600 :
2610 return
2620 :
2700 rem ---------- play mfs ------
2710 sc$=chr$(71)+chr$(lu*32)+chr$(0)
2720 sc$=sc$+chr$(td(nr,5))+chr$(td(nr,6))+chr$(td(nr,7))
2730 sc$=sc$+chr$(mm)+chr$(ss)+chr$(dd)+chr$(0)
2740 gosub 4000:return:rem sende befehl
2750 :
2800 rem ---------- read subchannel
2801 print "[212]itelnummer > [157][157][157][157][157][157][157][157][157][157][157][157][157][157][157][157][157][157][157][157]";t
2802 pa=td(nr,5)*4500+td(nr,6)*75+td(nr,7):pe=mm*4500+ss*75+dd
2803 pg=(pe-pa)/4500:a=pg:gosub3600
2804 print l$:print "[145][212]itellaenge > ";a$:a$=""
2805 print l$
2806 print l$: print l$
2807 print "[145][145][199]espielt > "
2808 print "[210]estzeit > "
2810 sc$=chr$(66)+chr$(lu*32+2)+chr$(64)+chr$(1)
2820 sc$=sc$+chr$(0)+chr$(0)+chr$(0)+chr$(0)
2830 sc$=sc$+chr$(15)+chr$(0)
2835 tf=0
2840 gosub 4000 :rem sende befehl
2845 if fe>0 then tf=1:return :rem device not ready
2850 open 15,dv,15
2860 :print#15,"m-r"chr$(ml)chr$(mh)chr$(15)
2870 :for i=0 to 14:get#15,b$
2872 pe%(i)=asc(b$+chr$(0))
2875 next
2880 close15
2890 :
2900 pp=(pe%(13)*4500+pe%(14)*75+pe%(15))/4500+0.004
2910 a=pp:gosub 3600
2920 print "[145][145] [157][157][157][157][157][157][157]";a$
2925 a=pg-pp:gosub 3600
2930 print " [157][157][157][157][157][157][157]";a$:a$=""
2940 :
2950 x$="":get x$
2960 if x$="_" then t=lk+1:goto 2990:rem lk+1 = abbruch
2970 if x$="+" then 2990 :rem naechster titel
2972 if x$="-"then t=t-2-(t=1):goto 2990 :rem voriger titel
2980 if pe%(1)<>21 then 2840 :rem 21 = titel zuende
2990 return
2995 :
3100 rem --------- start / stop unit -------------------------------
3110 sc$=chr$(27)+chr$(lu*32)+chr$(0)+chr$(0)+chr$(0)+chr$(0)
3120 gosub 4000
3130 :
3500 rem ---------- mfs to lbn -------------------------------------
3510 bn=td(t,5)*4500+td(t,6)*75+td(t,7)-150
3520 return
3530 :
3540 rem ---------- lbn to mfs -------------------------------------
3550 bn=bn+150:mm=int(bn/4500):ss=int((bn-mm*4500)/75)
3560 dd=bn-mm*4500-ss*75
3570 return
3580 :
3600 rem ------------- 1/100 min to sec
3610 b=int(a)
3620 c=(a-b)*60/100
3630 c=int(c*100)
3640 a$=right$(str$(b),2)+":"+right$("0"+mid$(str$(c),2),2)
3650 return
4000 rem ---------- scsi-kommando request sense 6 byte ------
4010 gosub 4110
4015 return
4020 rem request sense macht beim audio player keinen sinn
4030 :
4110 rem ---------- send scsi-kommando -----------------------------
4120 gosub 4160
4130 if fe>0 then gosub 4160
4140 return
4150 :
4160 open 15,dv,15
4170 :print#15,"s-c"+chr$(id)chr$(ml)chr$(mh)sc$ :rem sende befehl
4180 get#15,fe$
4182 if fe$="" then fe=0:goto4190
4185 fe=asc(fe$)
4190 close 15
4200 return
4210 :
5000 rem -------------- scann cbm-bus for cmd-hd ------------------
5010 print "[211]uche nach einer [195][205][196]-[200][196]"
5020 :
5030 for ga=8 to 30 :rem teste geraete 8 - 30
5040 : open 15,ga,15 :rem geraet oeffnen und gleich wieder
5050 : close 15 :rem scliessen um st zu setzen
5060 : if st=-128 then 5170 :rem st=-128 : device not present
5070 : open 15,ga,15 :rem st=0 laufwerk ist vorhanden
5080 : print#15,"ui" :rem sende reset
5090 : input#15,fe,fe$ :rem lese fehlernummer und string
5100 : close 15
5110 if left$(fe$,6)<>"cmd hd" then fe=1:goto5170
5120 : dv=ga :rem cmd-hd gefunden
5130 : ga=30:fe=0 :rem schleife beebdeb
5140 : print "[195][205][196]-[200][196] ist [199]eraet #";dv;"[146]":print
5170 next
5180 return
5190 :
5200 rem scann scsi-bus for scsi-device
5210 print "[211]uche nach [211][195][211][201]-[199]eraeten"
5220 dp=48*256 :rem scsi datenpuffer
5230 mh=48:ml=0 :rem init h.byte und l.byte des scsi puffer
5250 sd=0:sl=0 :rem init scsi id und lun
5260 id=sd:lu=sl
5270 gosub 2000 :rem inquiry
5280 if fe<>0 then 5570 :rem lese 1byte aus puffer
5290 open 15,dv,15,"m-r"+chr$(ml)+chr$(mh)+chr$(1)
5300 get#15,ty$:rem scsi geraeteklasse
5302 if ty$=""then ty=0:goto 5305
5303 ty=(asc(ty$) and 31)
5305 : close 15
5310 : if ty<>5 then 5570 :rem cd/drive nicht gefunden
5510 : lu=sl:id=sd:sl=7:sd=8
5570 :sl=sl+1:if sl=8 then sl=0:sd=sd+1
5575 print".";
5580 if sd<8 then 5260
5585 print
5590 return
5600 :
6000 rem -------------- clr screen
6010 poke53280,6:poke53281,11
6020 print"[147] [195][196]-[193]udio-[208]layer von [193]chim [212]aege"
6030 print" adaptiert fuer [195]64 von [212]orsten [194]aade[153]"
6050 print z$
6060 print"[194]edienung waehrend des [193]bspielens:
6062 [153]" +waitprint - naechster (NULL)itel
6063 print" -[146][153] - voriger [212]itel
6065 [153]" _waitprint - atnbspielen beenden
6080 return
6100 rem ------------- akt screen
6110 print"";
6120 print "[211]tatus > [157][157][157][157][157][157][157][157][157][157][157][157][157][157][157][157][157][157][157]";"";ts$;"[153]"
6130 return
6200 rem ------------- init screen
6210 fe=0:pu=pu(0)
6220 gosub 6000:gosub 6100
6230 return
6240 :
7000 rem -------- scan for hd and cd rom
7010 rem dummy
7011 rem ^^^ loesche zeile 7010 um erneut nach geraetenummern zu suchen
7030 gosub 5000: rem scan cbm-bus
7040 if fe=0 then 7070
7050 print"[211]chade, keine [200][196] gefunden..."
7060 end
7070 gosub 5200: rem scan scsi-bus
7080 print"[211][195][211][201]-[201][196] ist ";id;"[146], [204][213][206] ist ";lu"[146]"
7100 print"[196]ieses [208]rogramm ist selbstmodifizierend.";
7105 print"[196]ruecke _[146] um ein neues [208]rogramm abzu-"
7110 print"speichern (audio cd player), in dem alle";
7111 print"[199]eraetenummern enthalten sind. [194]eim
7115 [153]"naechsten (NULL)tart des neuen (NULL)rogrammes
7120 print"entfaellt die [215]artezeit bei der [211]uche
7125 [153]"nach den (NULL)aufwerken. peekei chr$eraetenummer-";
7130 [153]"aenderung einfach (NULL)eile 7010 loeschen"
7135 [153]"und das (NULL)rogramm erneut starten.
7140 print"[194][212][215]: jede andere [212]aste veraendert nichts"
7150 get a$: if a$="" then 7150
7180 if a$="_" then 7200
7190 return
7200 rem self modification
7210 open15,bd,15,"s:audio cd player":close15:rem delete old file
7220 print
7225 print"7010 dv=";dv;":id=";id;":lun=";lu;":return"
7230 print"save"+chr$(34)+"audio cd player"+chr$(34)+","+str$(bd)
7240 print"run[145][145][145][145][145]"
7250 poke631,13:poke632,13:poke633,145:poke634,145:poke635,145:poke636,13
7260 poke 198,6 :rem 3*return + 3*^ to key buffer
7290 end
7500 rem ------------ input-ersatz
7510 poke 204,0:rem cursor
7520 get a$: if a$="" then 7520
7530 wa$=a$
7540 if val(a$)=0 then 7595:rem alphanumerisch oder 0
7545 print a$;
7550 get a$:if a$="" then 7550
7560 if asc(a$)=13 then 7595:rem return gedrueckt
7570 if asc(a$)<48 or asc(a$)>57 then 7550:rem falsche eingabe
7580 wa$=wa$+a$
7590 goto 7545
7595 poke204,1:return
60000 rem ---------- main program
60010 gosub 7000:rem scan for hd and cd-rom
60050 ts$="[194]itte [195][196] einlegen":gosub 6200 :rem init screen
60060 fe=8
60070 :
60080 : gosub 2040 :rem test unit ready
60090 : gosub 6100
60100 if fe>0 goto 60070
60120 ts$="[204]ese [212][207][195]":gosub 6100
60130 gosub 2400 :rem lese toc
60140 ts$="[194]itte auswaehlen":gosub 6100
60150 fori=0to5:printl$:next:print"[145][145][145][145][145][145]";
60155 print" p[146] - gesamte [195][196] starten & [197]nde
60156 [153]" rwait - zufaellig abspielen
60157 print" _[146] - [208]rogramm beenden[145][145][145][145][145]"
60160 print " a[146]lle oder [212]itel";fk;"-";lk;" >";:gosub 7500:rem input
60170 if wa$="a" then gosub 60500
60180 if wa$="_"then gosub3100:print"":end
60185 if wa$="r" then gosub 60800
60190 if wa$="p"then gosub60700:print"":end:rem spielen und ende
60200 if tf=1 then tf=0: goto 60050: rem fehler waehrend abspielen
60210 t=val(wa$)
60220 if t<fk or t>lk then 60140
60230 gosub 3500:bn=bn-1:gosub 3540:nr=t-1:gosub 2700
60240 ts$="[211]piele":gosub 6100
60250 gosub 2800
60260 gosub 3100
60265 if tf=1 then 60050
60266 if pe%(1)=21 then 60140: rem neuer titel
60267 t=t+1:if t<lk+1 then 60230: rem next/previous titel
60270 goto 60140
60500 rem --------------- play all
60510 for t=fk to lk
60520 gosub 3500:rem lbn fuer titelende
60530 :bn=bn-1 :rem lbn des titelendes
60540 :gosub 3540:rem wandle lbn in mfs
60550 :nr=t-1 :rem gezaehlt wird ab 0
60560 :gosub 2700 :rem starte abspielen
60570 ts$="[211]piele alles":gosub 6100
60580 :
60590 gosub 2800 :rem lese subcannel till title end
60600 if tf=1 then t=lk+1: rem fehler waehrend abspielen -> ende
60610 next
60620 gosub 3100 :rem stop unit
60630 return
60700 rem --- spiele ganze cd
60710 t=lk:rem letzter titel
60720 gosub3500: rem lbn von titelende
60730 bn=bn-1
60740 gosub3540: rem lbn -> mfs
60750 nr=fk-1: rem starte bei 1. titel
60760 gosub2700: rem starte abspielen
60770 return
60800 rem ------------- random play
60805 t=rnd(-ti)
60810 t=int((lk-fk+1)*rnd(ti)+fk)
60820 gosub 3500:rem lbn fuer titelende
60830 bn=bn-1 :rem lbn des titelendes
60840 gosub 3540:rem wandle lbn in mfs
60850 nr=t-1 :rem gezaehlt wird ab 0
60860 :gosub 2700 :rem starte abspielen
60870 ts$="[211]piele zufaellig":gosub 6100
60880 gosub 2800 :rem lese subcannel till title end
60890 if(not(x$="_")and(tf=0)) then 60810
60895 gosub 3100 :rem stop unit
60899 return