1 CLR 2 KWEENOGNIE=3:REM for testing only 10 REM *** CD Audio player 0.01 *** 20 DDEVIC=768:DUNIT=769:DCOMND=770 30 DSTATS=771:DBUFLO=772:DBUFHI=773 40 DTIMO=774:DBYTLO=776:DBYTHI=777 50 DAUX1=778:DAUX2=779 55 ROWCRS=54:COLCRS=55 60 ROW=64:REM Read (This is CD_ROM) 62 CMDLEN=6:REM Command lenght (6,10,12) 64 CI=0:MSF=1:INDEX2PLAY=1:OLDSTATUS=-1:OLDSTATUS2=-1:OLDQCTRL=-1:OLDTRACK2=0 68 INFO=1:REM Temp Value 70 DIM KEY$(1),TOC$(198),ENTRY$(2),BUFFER$(804) 75 DBUFR=ADR(BUFFER$) 80 BRUN "D1:MSC:BBAS040.COM" 90 ? "}":POKE 752,1:REM  Îï ãõòóïò  95 MMC=0:REM  Îï ÍÍàóõððïòô ùåô¡  100 EXEC CMDDCB 110 EXEC SETUP_SUB 120 EXEC SETUP_CMDS 130 EXEC FIND_CD 140 EXEC MMC_DETECT 300 EXEC READ_TOC 350 IF T=0 400 EXEC TOCOUT 410 ELSE 420 T=0 430 ENDIF 500 EXEC MENU 19996 ? "}";"Bye" 19997 POKE 752,0:REM  ó÷éôãè ãõòóïò âáãë ïî  19998 END 19999 ------------------------------ 25000 PROC HELPSCREEN 25005 DPOKE SCREENSTART+(DASHONTRACK-1)*10+6,0 25010 HELPPAGE=1 25015 POSITION 1,4:? "" 25020 FOR LINE=5 TO 13:POSITION 1,LINE:? "|":POSITION 38,LINE:? "|":NEXT LINE 25025 POSITION 1,14:? "" 25030 REPEAT 25035 POSITION 2,5 25040 ON HELPPAGE EXEC SCREEN1,SCREEN2,SCREEN3,SCREEN4,SCREEN5,SCREEN6,SCREEN7,SCREEN8,SCREEN9 25045 IF KEY$="*" THEN HELPPAGE=HELPPAGE+1:IF HELPPAGE=10 THEN HELPPAGE=9 25050 IF KEY$="+" THEN HELPPAGE=HELPPAGE-1:IF HELPPAGE=0 THEN HELPPAGE=1 25055 KEY$=INKEY$ 25060 EXEC CURTRACK 25065 UNTIL KEY$="" 25070 HELP=0:OLDTRACK2=0 25075 EXEC SHOWTOC 25080 EXEC MENU 25098 ENDPROC 25099 ------------------------------ 25100 PROC SCREEN1 25105 ? " Welcome to the CD Audio Player ":? " Version 1.00 " 25110 ? " (c) 2001 Mathy van Nisselroy ":? " " 25115 ? " In this menu: ":? " " 25120 ? " Press Åóã to return to AudioPlayer ":? " Press Áòòï÷ òéçèô for next page " 25125 ? " Press Áòòï÷ ìåæô for previous page " 25148 ENDPROC 25149 ------------------------------ 25150 PROC SCREEN2 25155 ? " To use this software you need ":? " a version of the Atari 8 bit " 25160 ? " ASPI manager that has been written ":? " for your SCSI or IDE interface. " 25165 ? " ":? " At the moment of this writing, the " 25170 ? " only A8 ASPI version available is ":? " is the BlackBox ASPI manager. " 25175 ? " ¼­ Åóã ­¾ " 25198 ENDPROC 25199 ------------------------------ 25200 PROC SCREEN3 25205 ? " In line 80, CD-ROM Audio Player ":? " loads the BlackBox version of " 25210 ? " the ASPI manager. Change this ":? " line so the Audio Player looks in " 25215 ? " the right place for the right ":? " file. " 25220 ? " ":? " " 25248 ENDPROC 25249 ------------------------------ 25250 PROC SCREEN4 25255 ? " Press: Result: ":? " " 25260 ? " P Toggles PLAY and PAUSE ":? " < To play previous track " 25265 ? " > To play next track ":? " H,?,[HELP] This text " 25270 ? " Any number Start at this number ":? " O Toggles OPEN and CLOSE " 25298 ENDPROC 25299 ------------------------------ 25300 PROC SCREEN5 25305 ? " You can't select a track that does ":? " not exist. If a CD contains " 25310 ? " less than 10 tracks, you only have ":? " to press one number. On CD's with " 25315 ? " more than 9 track, you have to ":? " press 0 first to get to the " 25320 ? " lower numbers. ":? " " 25348 ENDPROC 25349 ------------------------------ 25350 PROC SCREEN6 25355 ? " CD-ROM players using a slot or ":? " caddy have no tray to close. " 25360 ? " Untill I fix this, you might have ":? " to press O twice on the next OPEN. " 25365 ? " ":? " Sometimes it takes a while before " 25370 ? " something happens. This can be ":? " caused by hard- or software. " 25398 ENDPROC 25399 ------------------------------ 25400 PROC SCREEN7 25405 ? " You don't get a warning if you try ":? " to PLAY a DATA track. Your CD-ROM " 25410 ? " player will not accept AUDIO ":? " commands for DATA tracks. " 25415 ? " ":? " You can't really STOP a CD unless " 25420 ? " your CD-ROM player supports an ":? " extension of the SCSI 2 commandset " 25448 ENDPROC 25449 ------------------------------ 25450 PROC SCREEN8 25455 ? " I hope to find out soon if mine ":? " does. In the mean time you'll " 25460 ? " have to use PAUSE. ":? " " 25465 ? " If you have more than one CD-ROM ":? " connected to your 8 bit ATARI or " 25470 ? " find bugs in this software, please ":? " contact me. " 25475 POSITION 35,13:? "­¾" 25498 ENDPROC 25499 ------------------------------ 25500 PROC SCREEN9 25505 ? " Special thanks to Matthias Belitz ":? " who came up with the idea for an " 25510 ? " Atari 8 bit version of ASPI. ":? " " 25515 ? " He also helped me develope the ":? " CD Audio Player you are using now. " 25520 ? " ":? " " 25525 POSITION 35,13:? " " 25548 ENDPROC 25549 ------------------------------ 27300 PROC DASH_DISPLAY 27310 DASHONTRACK=CURRENTTRACK 27311 IF (MAXSCREEN>1 AND CURRENTTRACK>36) 27312 WHILE DASHONTRACK>36 27313 DASHONTRACK=DASHONTRACK-36 27314 SCREENONDISPLAY=SCREENONDISPLAY+1 27315 WEND 27316 ELSE 27317 SCREENONDISPLAY=1 27318 ENDIF 27319 IF DASHONTRACK<>OLDTRACK2 27320 IF (AUDIOSTATUS>0 AND HELP=0) 27330 IF (AUDIOSTATUS<21 AND CURRENTTRACK<170) 27340 SCREENSTART=DPEEK(88)+163 27350 VERT_POS1=(TRUNC((DASHONTRACK-1)/4)) 27355 HOR_POS1=(DASHONTRACK-(1+(VERT_POS1)*4))*10 27360 POSITION HOR_POS1+3,VERT_POS1+4 27365 ? "_" 27370 DPOKE SCREENSTART+(DASHONTRACK-1)*10+6,63 27375 ENDIF 27376 POSITION 2,21:? OLDTRACK2;" " 27380 IF (OLDTRACK2>0 AND OLDTRACK2<100) 27385 VERT_POS2=(TRUNC((OLDTRACK2-1)/4)) 27390 HOR_POS2=(OLDTRACK2-(1+(VERT_POS2)*4))*10 27395 POSITION HOR_POS2+3,VERT_POS2+4 27400 ? " " 27405 DPOKE SCREENSTART+(OLDTRACK2-1)*10+6,0 27410 ENDIF 27420 ENDIF 27430 IF AUDIOSTATUS<21 THEN OLDTRACK2=DASHONTRACK 27440 ENDIF 27498 ENDPROC 27499 ------------------------------ 27500 PROC PLAY_AUDIO_MSF 27510 EXEC CMDDCB 27520 POKE DAUX1,123 27530 POKE DAUX2,6 27540 DPOKE DBYTLO,0 27550 POKE 1659,CDID 27560 EXEC GO_ML 27570 EXEC CHECK 27598 ENDPROC 27599 ------------------------------ 27600 PROC SCAN_NO_MMC 27610 EXEC CURTRACK 27620 IF AUDIOSTATUS=17 27630 HOURSPAST=PEEK(DBUFR+8) 27635 MINUTESPAST=PEEK(DBUFR+9) 27640 SECONDSPAST=PEEK(DBUFR+10) 27650 IF KEY$="*" 27660 SECONDSPAST=SECONDSPAST+3 27670 IF SECONDSPAST>59 27675 SECONDSPAST=SECONDSPAST-60 27680 MINUTESPAST=MINUTESPAST+1 27685 IF MINUTESPAST>59 THEN MINUTESPAST=MINUTESPAST-60:HOURSPAST=HOURSPAST+1 27690 ENDIF 27700 ELSE 27710 SECONDSPAST=SECONDSPAST-3 27720 IF SECONDSPAST<0 27725 SECONDSPAST=SECONDSPAST+60 27730 MINUTESPAST=MINUTESPAST-1 27735 IF MINUTESPAST<0 THEN MINUTESPAST=MINUTESPAST+60:HOURSPAST=HOURSPAST-1 27740 IF HOURSPAST<0 THEN HOURSPAST=0 27745 ENDIF 27750 ENDIF 27755 MINUTES=MINUTESPAST+HOURSPAST*60 27760 MINUTES=MINUTESPAST+HOURSPAST*60 27765 SECONDS=SECONDSPAST 27770 POKE 1664,MINUTES 27775 POKE 1665,SECONDS 27780 EXEC PLAY_AUDIO_MSF 27790 ENDIF 27798 ENDPROC 27799 ------------------------------ 27800 PROC ISRC 27803 POKE 1612,MSF*2 27804 POKE 1613,64 27805 POKE 1614,3 27806 POKE 1617,CURRENTTRACK 27810 EXEC READ_SUBCHAN 27815 IF PEEK(DBUFR+8)>127 AND PEEK(DBUFR+5)=48 27820 FOR X=0 TO 11 27830 ? CHR$(PEEK(DBUFR+9+X)); 27840 NEXT X 27841 FOR X=0 TO 9 27842 ? " ";PEEK(DBUFR+X); 27843 NEXT X 27845 ENDIF 27895 POKE 1614,1 27898 ENDPROC 27899 ------------------------------ 27900 PROC MCN 27902 IF AUDIOSTATUS<20 27903 POKE 1612,MSF*2 27904 POKE 1613,64 27905 POKE 1614,2 27908 POKE 1617,0 27910 EXEC READ_SUBCHAN 27915 IF PEEK(DBUFR+8)>127 27920 FOR X=0 TO 12 27930 ? CHR$(PEEK(DBUFR+9+X)); 27940 NEXT X 27945 ENDIF 27990 POKE 1614,1 27995 ENDIF 27998 ENDPROC 27999 ------------------------------ 28000 PROC CHANGE_INDEX 28005 EXEC CURTRACK 28010 IF KEY$="-" AND CURRENTINDEX>1 28020 INDEX2PLAY=CURRENTINDEX-1 28025 TRACK2PLAY=CURRENTTRACK 28030 EXEC PLAYTRACK 28040 ENDIF 28050 IF KEY$="=" 28060 INDEX2PLAY=CURRENTINDEX+1 28065 TRACK2PLAY=CURRENTTRACK 28070 EXEC PLAYTRACK 28080 ENDIF 28098 ENDPROC 28099 ------------------------------ 28100 PROC SELECT_A_TRACK 28110 IF LASTTRACK<10 28115 POSITION 9,22:? KEY$ 28120 TRACK2PLAY=VAL(KEY$) 28125 INDEX2PLAY=1 28130 ELSE 28135 POSITION 8,22:? VAL(KEY$);"_" 28140 ENTRY$(1,1)=KEY$ 28145 IF VAL(ENTRY$(1,1))=TRUNC(LASTTRACK/10) 28150 REPEAT 28160 KEY$=INKEY$ 28170 UNTIL KEY$>CHR$(47) AND KEY$CHR$(47) AND KEY$AUDIOSTATUS) 28320 POSITION 2,18 28330 ON AUDIOSTATUS-16 EXEC IN_PROGRESS,PAUSED,COMPLETED,ERROR,NOSTATUS 28340 OLDSTATUS=AUDIOSTATUS 28350 ENDIF 28398 ENDPROC 28399 ------------------------------ 28400 PROC IN_PROGRESS 28405 ? "Audio Play in progress " 28410 ENDPROC 28419 ------------------------------ 28420 PROC PAUSED 28425 ? "Audio Play PAUSED " 28430 ENDPROC 28439 ------------------------------ 28440 PROC COMPLETED 28445 ? "Audio Play successfully completed" 28447 PAUSE 30 28450 ENDPROC 28459 ------------------------------ 28460 PROC ERROR 28465 ? "Audio Play stopped due to error " 28470 ENDPROC 28479 ------------------------------ 28480 PROC NOSTATUS 28485 ? "No current audio status " 28490 ENDPROC 28499 ------------------------------ 28500 PROC MMC_DETECT 28510 EXEC CMDDCB 28520 POKE DAUX1,85 28530 POKE DAUX2,6 28540 POKE 1621,CDID 28550 DPOKE DBYTLO,256 28560 EXEC GO_ML 28570 EXEC CHECK 28575 IF STAT=1 THEN MMC=1 28580 REM  Ôèéó ãïííáîä ãèåãëó éæ ùïõò ÃÄßÒÏÍ óõððïòôó Íõìôé Íåäéá Ãïííáîäó ¨ÍÍé®  Íéîå äïåóî§ô óååí ôï®  28581 REM  Ùïõ ãáî äï çòåáô ôèéîçó ÷éôè ÍÍî  Âõô óéîãå íù ³²ø äïåóî§ô óååí ôï óõððïòô ôèåí¬ É ãáî§ô ôåóô ôèåí®  28582 REM  Éæ ùïõòó äïåó¬ ðìåáóå ãïîôáãô íå®  Âõô É§í ÎÏÔ ðòïíéóéîç ÁÎÙÔÈÉÎÇ¡¡¡  28598 ENDPROC 28599 ------------------------------ 28600 PROC TRACK_INDEX 28610 POSITION 2,22 28620 ? " " 28630 REM POSITION 2,22 28640 REM ? "TRACK "; 28645 POSITION 8,22 28650 IF CURRENTTRACK<10 THEN ? " "; 28660 ? CURRENTTRACK 28665 POSITION 19,22 28670 REM POSITION 13,22 28680 REM ? "INDEX "; 28690 IF CURRENTINDEX<10 THEN ? " "; 28700 IF CURRENTINDEX>0 THEN ? CURRENTINDEX 28798 ENDPROC 28799 ------------------------------ 28800 PROC SHOWTOC 28802 FOR LINE=4 TO 14 28804 POSITION 1,LINE:? " " 28806 NEXT LINE 28808 IF LASTTRACK>0 28810 TITLE=0 28820 POKE 82,1 28830 POSITION 1,4 28840 REM FOR X=1 TO LASTTRACK*2 STEP 2 28845 FOR X=FIRSTONDISPLAY*2-1 TO LASTONDISPLAY*2 STEP 2 28850 Y=(X+1)/2 28860 IF NOT TOC$(X,X+1)="DT" 28870 IF Y<10 THEN ? " "; 28880 ? Y;" "; 28890 IF ASC(TOC$(X,X))<10 THEN ? "0"; 28900 ? ASC(TOC$(X,X)); 28910 ? ":"; 28915 IF ASC(TOC$(X+1,X+1))<10 THEN ? "0"; 28920 ? ASC(TOC$(X+1,X+1)); 28930 ELSE 28932 IF Y<10 THEN ? " "; 28935 ? Y;" DATA "; 28940 ENDIF 28945 IF TITLE<3 THEN ? " "; 28950 TITLE=TITLE+1:IF TITLE=4 THEN TITLE=0:? CHR$(155); 28960 NEXT X 28970 POKE 82,2 28980 ? CHR$(155) 28990 ENDIF 28995 IF (MAXSCREEN>1 AND KWEETNOGNIE<3) THEN POSITION 10,14:? LASTTRACK;" Tracks on this CD" 28998 ENDPROC 28999 ------------------------------ 29000 PROC PLAYPAUSE 29005 EXEC CURTRACK 29010 AUDIOSTATUS=PEEK(DBUFR+1) 29015 IF AUDIOSTATUS=18 OR AUDIOSTATUS=19 OR AUDIOSTATUS=21 29020 RESUME=1:POKE 1587,RESUME 29025 IF AUDIOSTATUS<>18 29030 TRACK2PLAY=1 29035 INDEX2PLAY=1 29040 EXEC PLAYTRACK 29050 ENDIF 29060 ELSE 29070 IF AUDIOSTATUS=17 29080 RESUME=0:POKE 1587,RESUME 29090 ENDIF 29100 ENDIF 29120 EXEC CMDDCB 29130 POKE DAUX1,41 29140 POKE DAUX2,6 29150 DPOKE DBYTLO,0 29160 POKE 1577,CDID 29170 EXEC GO_ML 29180 EXEC CHECK 29198 ENDPROC 29199 ------------------------------ 29200 PROC READ_SUBCHAN 29210 EXEC CMDDCB 29220 POKE DAUX1,73 29230 POKE DAUX2,6 29240 DPOKE DBYTLO,SCDFC:REM SubChannel data format code 29250 POKE 1609,CDID 29260 EXEC GO_ML 29270 EXEC CHECK 29298 ENDPROC 29299 ------------------------------ 29300 PROC PLAYTRACK 29310 POKE 1595,TRACK2PLAY 29315 POKE 1596,INDEX2PLAY 29320 POKE 1598,LASTTRACK 29330 EXEC CMDDCB 29340 POKE DAUX1,53 29350 POKE DAUX2,6 29360 DPOKE DBYTLO,0 29370 POKE 1589,CDID 29380 EXEC GO_ML 29385 EXEC CHECK 29390 POKE 1596,1 29398 ENDPROC 29399 ------------------------------ 29400 PROC CURTRACK 29410 POKE 1612,MSF*2 29420 POKE 1613,64:REM bit 6 for Sub-Channel Q 29430 POKE 1614,1:REM $01 for CDROM current position 29440 SCDFC=48 29450 EXEC READ_SUBCHAN 29455 LENDAT=PEEK(DBUFR+3)+PEEK(DBUFR+2)*256:REM Maybe I need this later 29460 QADRCTRL=PEEK(DBUFR+5) 29465 QCTRL=QADRCTRL&15 29470 IF (OLDQCTRL<>QCTRL) 29475 POSITION 2,16 29480 IF QCTRL&8=0 29485 ? "2 Channel Audio" 29490 ELSE 29495 ? "4 Channel Audio" 29500 ENDIF 29510 IF QCTRL&2=0 29515 ? "Digital copy prohibited" 29520 ELSE 29525 ? "Digital copy permitted " 29530 ENDIF 29532 OLDQCTRL=QCTRL 29533 ENDIF 29535 CURRENTTRACK=PEEK(DBUFR+6) 29540 CURRENTINDEX=PEEK(DBUFR+7) 29543 AUDIOSTATUS=PEEK(DBUFR+1) 29545 IF (AUDIOSTATUS<21 AND AUDIOSTATUS>0) 29546 IF (OLDTRACK<>CURRENTTRACK OR OLDINDEX<>CURRENTINDEX) 29548 POSITION 2,22 29549 REM POSITION 8,22 29550 ? "TRACK "; 29551 IF CURRENTTRACK<10 THEN ? " "; 29552 IF CURRENTTRACK<100 THEN ? CURRENTTRACK 29553 POSITION 13,22 29554 REM POSITION 19,22 29555 ? "INDEX "; 29556 IF CURRENTINDEX<10 THEN ? " "; 29557 IF CURRENTINDEX>0 THEN ? CURRENTINDEX 29560 OLDTRACK=CURRENTTRACK 29565 OLDINDEX=CURRENTINDEX 29568 ENDIF 29570 ENDIF 29575 POSITION 27,22 29580 HOURSPAST=PEEK(DBUFR+12) 29585 MINUTESPAST=PEEK(DBUFR+13) 29590 SECONDSPAST=PEEK(DBUFR+14) 29595 AUDIOSTATUS=PEEK(DBUFR+1) 29600 IF AUDIOSTATUS<21 AND AUDIOSTATUS>16 29605 IF AUDIOSTATUS<>18 OR (AUDIOSTATUS=18 AND OLDSTATUS2=-1) 29610 IF HOURSPAST=1 THEN ? "h01" 29620 POSITION 31,22 29625 ? "m"; 29630 IF MINUTESPAST<10 THEN ? "0"; 29635 ? MINUTESPAST;" "; 29640 ? "s"; 29645 IF SECONDSPAST<10 THEN ? "0"; 29650 ? SECONDSPAST 29652 OLDSTATUS2=AUDIOSTATUS 29655 ENDIF 29660 ELSE 29665 IF OLDSTATUS2<>AUDIOSTATUS 29670 ? " " 29675 OLDSTATUS2=AUDIOSTATUS 29680 ENDIF 29690 ENDIF 29695 EXEC DASH_DISPLAY 29698 ENDPROC 29699 ------------------------------ 29700 PROC PREVTRACK 29710 EXEC CURTRACK 29715 IF CURRENTTRACK<>0 29720 IF FIRSTTRACK=CURRENTTRACK 29723 POSITION 2,22 29725 FOR FLASHLOOP=0 TO 3 29730 ? "This is the first track! ":PAUSE 10 29735 ? "Ôèéó éó ôèå æéòóô ôòáãë¡ ":PAUSE 10 29740 NEXT FLASHLOOP 29750 EXEC TRACK_INDEX 29760 ELSE 29770 TRACK2PLAY=CURRENTTRACK-1 29780 EXEC PLAYTRACK 29790 ENDIF 29795 ENDIF 29798 ENDPROC 29799 ------------------------------ 29800 PROC NEXTTRACK 29810 EXEC CURTRACK 29820 IF LASTTRACK=CURRENTTRACK 29823 POSITION 2,22 29825 FOR FLASHLOOP=0 TO 3 29830 ? "This is the last track! ":PAUSE 10 29835 ? "Ôèéó éó ôèå ìáóô ôòáãë¡ ":PAUSE 10 29840 NEXT FLASHLOOP 29850 EXEC TRACK_INDEX 29860 ELSE 29870 TRACK2PLAY=CURRENTTRACK+1 29880 EXEC PLAYTRACK 29890 ENDIF 29998 ENDPROC 29999 ------------------------------ 30000 PROC GO_ML 30010 X=USR(1536) 30020 ENDPROC 30099 ------------------------------ 30100 PROC TOCOUT 30110 LASTTRACK=PEEK(DBUFR+3) 30120 FIRSTTRACK=PEEK(DBUFR+2) 30200 IF FIRSTTRACK=LASTTRACK 30201 POSITION 6,12:? "disk consists of one track" 30202 PAUSE 20 30203 ENDIF 30204 TITL=0 30205 FOR DAT=FIRSTTRACK TO LASTTRACK 30206 TRACKTY