home *** CD-ROM | disk | FTP | other *** search
/ Go64! / Go64_2000-06_2000_CSW_Side_A.d64 / audio-d (.txt) < prev    next >
Commodore BASIC  |  2023-02-26  |  9KB  |  296 lines

  1. 1000 rem ------------------------------
  2. 1010 rem scsi listing4
  3. 1011 rem original by achim taege   1997
  4. 1012 rem adapted for c64 and modified
  5. 1013 rem          by torsten baade 2000
  6. 1014 rem email:torsten@sport-moeller.de
  7. 1015 rem          v1.10      24-07-2000
  8. 1020 rem ------------------------------
  9. 1060 print chr$(147);chr$(14)                :rem clr sreen & s/b
  10. 1070 bd=peek(186):rem aktuelle floppy
  11. 1080 dim pu(9),td(36,7),pe%(512)
  12. 1090 bl=2352:rem laenge des audioblocks                   =1/75 sec
  13. 1100 sk=0   :rem sessionnummer
  14. 1110 :
  15. 1120 mh=48:ml=0: rem h- & l-byte of scsi buffer
  16. 1130 dp=48*256: rem scsi daten puffer
  17. 1140 z$="----------------------------------------"
  18. 1150 l$="                                      "
  19. 1190 goto 60000 :rem zum hauptprogramm
  20. 2000 rem - scsi-command: inquiry 6 byte
  21. 2010 sc$=chr$(18)+chr$(lu*32)+chr$(0)+chr$(0)+chr$(32)+chr$(0)
  22. 2020 gosub 4000:return:rem sende befehl
  23. 2030 :
  24. 2040 rem ---------- scsi-kommando  test unit ready 6 byte ---
  25. 2050 sc$=chr$(0)+chr$(lu*32)+chr$(0)+chr$(0)+chr$(0)+chr$(0)
  26. 2060 gosub 4000:return:rem sende befehl
  27. 2070 :
  28. 2400 rem ---------- scsi-kommando read toc 10 byte ----------
  29. 2410 sc$=chr$(67)+chr$(lu*32+2)+chr$(0)+chr$(0)+chr$(0)
  30. 2420 sc$=sc$+chr$(0)+chr$(0)+chr$(int(bl/256))+chr$(bl and 255)+chr$(0)
  31. 2430 gosub 4000
  32. 2440 if fe<>0 then 2600:                     rem sonst titel einlesen
  33. 2450 ii=1:rem  reicht fuer 36 titel
  34. 2460 :open 15,dv,15
  35. 2470 :for b=0 to ii
  36. 2480 : print#15,"m-r"chr$(ml)chr$(mh+b)chr$(0)
  37. 2490 : for i=0 to 255:get#15,b$:pe%(b*256+i)=asc(b$+chr$(0)):next
  38. 2500 :next
  39. 2510 :close15
  40. 2520 tn=pe%(0)*256+pe%(1):                   rem lenght of toc
  41. 2530 fk=pe%(2) :rem erster  titel
  42. 2540 lk=pe%(3) :rem letzter titel
  43. 2550 for i=fk-1 to lk:print         :        rem lese start und endzeit
  44. 2560 : for ii=0 to 7 :                       rem 8 byte pro titel
  45. 2570 :  td(i,ii)=pe%(4+(i*8)+ii)
  46. 2580 : next
  47. 2590 :next
  48. 2600 :
  49. 2610 return
  50. 2620 :
  51. 2700 rem ---------- play mfs ------
  52. 2710 sc$=chr$(71)+chr$(lu*32)+chr$(0)
  53. 2720 sc$=sc$+chr$(td(nr,5))+chr$(td(nr,6))+chr$(td(nr,7))
  54. 2730 sc$=sc$+chr$(mm)+chr$(ss)+chr$(dd)+chr$(0)
  55. 2740 gosub 4000:return:rem sende befehl
  56. 2750 :
  57. 2800 rem ---------- read subchannel
  58. 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
  59. 2802 pa=td(nr,5)*4500+td(nr,6)*75+td(nr,7):pe=mm*4500+ss*75+dd
  60. 2803 pg=(pe-pa)/4500:a=pg:gosub3600
  61. 2804 print l$:print "[145][212]itellaenge  > ";a$:a$=""
  62. 2805 print l$
  63. 2806 print l$: print l$
  64. 2807 print "[145][145][199]espielt     > "
  65. 2808 print "[210]estzeit     > "
  66. 2810 sc$=chr$(66)+chr$(lu*32+2)+chr$(64)+chr$(1)
  67. 2820 sc$=sc$+chr$(0)+chr$(0)+chr$(0)+chr$(0)
  68. 2830 sc$=sc$+chr$(15)+chr$(0)
  69. 2835 tf=0
  70. 2840 gosub 4000 :rem sende befehl
  71. 2845 if fe>0 then tf=1:return                 :rem device not ready
  72. 2850 open 15,dv,15
  73. 2860 :print#15,"m-r"chr$(ml)chr$(mh)chr$(15)
  74. 2870 :for i=0 to 14:get#15,b$
  75. 2872 pe%(i)=asc(b$+chr$(0))
  76. 2875 next
  77. 2880 close15
  78. 2890 :
  79. 2900 pp=(pe%(13)*4500+pe%(14)*75+pe%(15))/4500+0.004
  80. 2910 a=pp:gosub 3600
  81. 2920 print "[145][145]      [157][157][157][157][157][157][157]";a$
  82. 2925 a=pg-pp:gosub 3600
  83. 2930 print "      [157][157][157][157][157][157][157]";a$:a$=""
  84. 2940 :
  85. 2950 x$="":get x$
  86. 2960 if x$="_" then t=lk+1:goto 2990:rem lk+1 = abbruch
  87. 2970 if x$="+" then 2990                     :rem naechster titel
  88. 2972 if x$="-"then t=t-2-(t=1):goto 2990     :rem voriger titel
  89. 2980 if pe%(1)<>21 then 2840                 :rem 21 = titel zuende
  90. 2990 return
  91. 2995 :
  92. 3100 rem --------- start / stop unit -------------------------------
  93. 3110 sc$=chr$(27)+chr$(lu*32)+chr$(0)+chr$(0)+chr$(0)+chr$(0)
  94. 3120 gosub 4000
  95. 3130 :
  96. 3500 rem ---------- mfs to lbn -------------------------------------
  97. 3510 bn=td(t,5)*4500+td(t,6)*75+td(t,7)-150
  98. 3520 return
  99. 3530 :
  100. 3540 rem ---------- lbn to mfs -------------------------------------
  101. 3550 bn=bn+150:mm=int(bn/4500):ss=int((bn-mm*4500)/75)
  102. 3560 dd=bn-mm*4500-ss*75
  103. 3570 return
  104. 3580 :
  105. 3600 rem ------------- 1/100 min to sec
  106. 3610 b=int(a)
  107. 3620 c=(a-b)*60/100
  108. 3630 c=int(c*100)
  109. 3640 a$=right$(str$(b),2)+":"+right$("0"+mid$(str$(c),2),2)
  110. 3650 return
  111. 4000 rem ---------- scsi-kommando request sense 6 byte ------
  112. 4010 gosub 4110
  113. 4015 return
  114. 4020 rem request sense macht beim audio      player keinen sinn
  115. 4030 :
  116. 4110 rem ---------- send scsi-kommando -----------------------------
  117. 4120 gosub 4160
  118. 4130 if fe>0 then gosub 4160
  119. 4140 return
  120. 4150 :
  121. 4160 open 15,dv,15
  122. 4170 :print#15,"s-c"+chr$(id)chr$(ml)chr$(mh)sc$   :rem sende befehl
  123. 4180 get#15,fe$
  124. 4182 if fe$="" then fe=0:goto4190
  125. 4185 fe=asc(fe$)
  126. 4190 close 15
  127. 4200 return
  128. 4210 :
  129. 5000 rem -------------- scann cbm-bus for cmd-hd ------------------
  130. 5010 print "[211]uche nach einer [195][205][196]-[200][196]"
  131. 5020 :
  132. 5030 for ga=8 to 30                    :rem teste geraete 8 - 30
  133. 5040 : open 15,ga,15                   :rem geraet oeffnen und gleich wieder
  134. 5050 : close 15                        :rem scliessen um st zu setzen
  135. 5060 : if st=-128 then 5170            :rem st=-128 : device not present
  136. 5070 :  open 15,ga,15                  :rem st=0 laufwerk ist vorhanden
  137. 5080 :  print#15,"ui"                  :rem sende reset
  138. 5090 :  input#15,fe,fe$                :rem lese fehlernummer und string
  139. 5100 :  close 15
  140. 5110 if left$(fe$,6)<>"cmd hd" then fe=1:goto5170
  141. 5120 :   dv=ga                         :rem cmd-hd gefunden
  142. 5130 :   ga=30:fe=0                    :rem schleife beebdeb
  143. 5140 :   print "[195][205][196]-[200][196] ist [199]eraet #";dv;"[146]":print
  144. 5170 next
  145. 5180 return
  146. 5190 :
  147. 5200 rem scann scsi-bus for scsi-device
  148. 5210 print "[211]uche nach [211][195][211][201]-[199]eraeten"
  149. 5220 dp=48*256                      :rem scsi datenpuffer
  150. 5230 mh=48:ml=0  :rem init h.byte und                    l.byte des scsi puffer
  151. 5250 sd=0:sl=0                         :rem init scsi id und lun
  152. 5260 id=sd:lu=sl
  153. 5270 gosub 2000 :rem inquiry
  154. 5280 if fe<>0 then 5570 :rem lese 1byte aus puffer
  155. 5290 open 15,dv,15,"m-r"+chr$(ml)+chr$(mh)+chr$(1)
  156. 5300 get#15,ty$:rem scsi geraeteklasse
  157. 5302 if ty$=""then ty=0:goto 5305
  158. 5303 ty=(asc(ty$) and 31)
  159. 5305 : close 15
  160. 5310 : if ty<>5 then 5570 :rem cd/drive        nicht gefunden
  161. 5510 :  lu=sl:id=sd:sl=7:sd=8
  162. 5570 :sl=sl+1:if sl=8 then sl=0:sd=sd+1
  163. 5575 print".";
  164. 5580 if sd<8 then 5260
  165. 5585 print
  166. 5590 return
  167. 5600 :
  168. 6000 rem -------------- clr screen
  169. 6010 poke53280,6:poke53281,11
  170. 6020 print"[147]     [195][196]-[193]udio-[208]layer von [193]chim [212]aege"
  171. 6030 print"  adaptiert fuer [195]64 von [212]orsten [194]aade[153]"
  172. 6050 print z$
  173. 6060 print"[194]edienung waehrend des [193]bspielens:
  174. 6062 [153]"     +waitprint - naechster (NULL)itel
  175. 6063 print"     -[146][153] - voriger   [212]itel
  176. 6065 [153]"     _waitprint - atnbspielen beenden
  177. 6080 return
  178. 6100 rem ------------- akt screen
  179. 6110 print"";
  180. 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]"
  181. 6130 return
  182. 6200 rem ------------- init screen
  183. 6210 fe=0:pu=pu(0)
  184. 6220 gosub 6000:gosub 6100
  185. 6230 return
  186. 6240 :
  187. 7000 rem -------- scan for hd and cd rom
  188. 7010 rem dummy
  189. 7011 rem ^^^ loesche zeile 7010 um         erneut nach geraetenummern zu suchen
  190. 7030 gosub 5000: rem scan cbm-bus
  191. 7040 if fe=0 then 7070
  192. 7050 print"[211]chade, keine [200][196] gefunden..."
  193. 7060 end
  194. 7070 gosub 5200: rem scan scsi-bus
  195. 7080 print"[211][195][211][201]-[201][196] ist ";id;"[146], [204][213][206] ist ";lu"[146]"
  196. 7100 print"[196]ieses [208]rogramm ist selbstmodifizierend.";
  197. 7105 print"[196]ruecke _[146] um ein neues [208]rogramm abzu-"
  198. 7110 print"speichern (audio cd player), in dem alle";
  199. 7111 print"[199]eraetenummern enthalten sind. [194]eim
  200. 7115 [153]"naechsten (NULL)tart des neuen (NULL)rogrammes
  201. 7120 print"entfaellt die [215]artezeit bei der [211]uche
  202. 7125 [153]"nach den (NULL)aufwerken.  peekei chr$eraetenummer-";
  203. 7130 [153]"aenderung einfach (NULL)eile 7010 loeschen"
  204. 7135 [153]"und das (NULL)rogramm erneut starten.
  205. 7140 print"[194][212][215]: jede andere [212]aste veraendert nichts"
  206. 7150 get a$: if a$="" then 7150
  207. 7180 if a$="_" then 7200
  208. 7190 return
  209. 7200 rem self modification
  210. 7210 open15,bd,15,"s:audio cd player":close15:rem delete old file
  211. 7220 print
  212. 7225 print"7010 dv=";dv;":id=";id;":lun=";lu;":return"
  213. 7230 print"save"+chr$(34)+"audio cd player"+chr$(34)+","+str$(bd)
  214. 7240 print"run[145][145][145][145][145]"
  215. 7250 poke631,13:poke632,13:poke633,145:poke634,145:poke635,145:poke636,13
  216. 7260 poke 198,6                        :rem 3*return + 3*^ to key buffer
  217. 7290 end
  218. 7500 rem ------------ input-ersatz
  219. 7510 poke 204,0:rem cursor
  220. 7520 get a$: if a$="" then 7520
  221. 7530 wa$=a$
  222. 7540 if val(a$)=0 then 7595:rem              alphanumerisch oder 0
  223. 7545 print a$;
  224. 7550 get a$:if a$="" then 7550
  225. 7560 if asc(a$)=13 then 7595:rem             return gedrueckt
  226. 7570 if asc(a$)<48 or asc(a$)>57 then 7550:rem falsche eingabe
  227. 7580 wa$=wa$+a$
  228. 7590 goto 7545
  229. 7595 poke204,1:return
  230. 60000 rem ---------- main program
  231. 60010 gosub 7000:rem scan for hd and cd-rom
  232. 60050 ts$="[194]itte [195][196] einlegen":gosub 6200                   :rem init screen
  233. 60060 fe=8
  234. 60070 :
  235. 60080 :  gosub 2040                :rem test unit ready
  236. 60090 :  gosub 6100
  237. 60100 if fe>0 goto 60070
  238. 60120 ts$="[204]ese [212][207][195]":gosub 6100
  239. 60130 gosub 2400                   :rem lese toc
  240. 60140 ts$="[194]itte auswaehlen":gosub 6100
  241. 60150 fori=0to5:printl$:next:print"[145][145][145][145][145][145]";
  242. 60155 print"     p[146] - gesamte [195][196] starten & [197]nde
  243. 60156 [153]"     rwait - zufaellig abspielen
  244. 60157 print"     _[146] - [208]rogramm beenden[145][145][145][145][145]"
  245. 60160 print "     a[146]lle oder [212]itel";fk;"-";lk;" >";:gosub 7500:rem input
  246. 60170 if wa$="a" then gosub 60500
  247. 60180 if wa$="_"then gosub3100:print"":end
  248. 60185 if wa$="r" then gosub 60800
  249. 60190 if wa$="p"then gosub60700:print"":end:rem spielen und ende
  250. 60200 if tf=1 then tf=0: goto 60050:           rem fehler waehrend abspielen
  251. 60210 t=val(wa$)
  252. 60220 if t<fk or t>lk then 60140
  253. 60230 gosub 3500:bn=bn-1:gosub 3540:nr=t-1:gosub 2700
  254. 60240 ts$="[211]piele":gosub 6100
  255. 60250 gosub 2800
  256. 60260 gosub 3100
  257. 60265 if tf=1 then 60050
  258. 60266 if pe%(1)=21 then 60140:                rem neuer titel
  259. 60267 t=t+1:if t<lk+1 then 60230:               rem next/previous titel
  260. 60270 goto 60140
  261. 60500 rem --------------- play all
  262. 60510 for t=fk to lk
  263. 60520 gosub 3500:rem lbn fuer titelende
  264. 60530 :bn=bn-1  :rem lbn des titelendes
  265. 60540 :gosub 3540:rem wandle lbn in mfs
  266. 60550 :nr=t-1 :rem gezaehlt wird ab 0
  267. 60560 :gosub 2700 :rem starte abspielen
  268. 60570 ts$="[211]piele alles":gosub 6100
  269. 60580 :
  270. 60590 gosub 2800                       :rem lese subcannel till title end
  271. 60600 if tf=1 then t=lk+1: rem                fehler waehrend abspielen -> ende
  272. 60610 next
  273. 60620 gosub 3100               :rem stop unit
  274. 60630 return
  275. 60700 rem --- spiele ganze cd
  276. 60710 t=lk:rem letzter titel
  277. 60720 gosub3500: rem lbn von titelende
  278. 60730 bn=bn-1
  279. 60740 gosub3540: rem lbn -> mfs
  280. 60750 nr=fk-1: rem starte bei 1. titel
  281. 60760 gosub2700: rem starte abspielen
  282. 60770 return
  283. 60800 rem ------------- random play
  284. 60805 t=rnd(-ti)
  285. 60810 t=int((lk-fk+1)*rnd(ti)+fk)
  286. 60820 gosub 3500:rem lbn fuer titelende
  287. 60830 bn=bn-1  :rem lbn des titelendes
  288. 60840 gosub 3540:rem wandle lbn in mfs
  289. 60850 nr=t-1 :rem gezaehlt wird ab 0
  290. 60860 :gosub 2700 :rem starte abspielen
  291. 60870 ts$="[211]piele zufaellig":gosub 6100
  292. 60880 gosub 2800                       :rem lese subcannel till title end
  293. 60890 if(not(x$="_")and(tf=0)) then 60810
  294. 60895 gosub 3100        :rem stop unit
  295. 60899 return
  296.