home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 2 / crawlyvol2.bin / program / c / cdplay2 / commands.c < prev    next >
C/C++ Source or Header  |  1993-05-26  |  8KB  |  305 lines

  1. #include <aes.h>
  2. #include <vdi.h>
  3. #include <tos.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include "dma.h"
  8. #include "chinon.h"
  9. #include "cdplayer.h"
  10. #include "globals.h"
  11.  
  12. void inquire_device(char * buffer) ;
  13.  
  14. void find_Chinon(void)
  15. {
  16. char buffer[128] ;
  17.  
  18.   for (ID = 0; ID < 16; ID++)
  19.   {
  20.     inquire_device(buffer) ;
  21.     if (strncmp(&buffer[8], "CHINON  CD-ROM CDS-43", 21) == 0)
  22.       return ;
  23.   }
  24.   return ;
  25. }
  26.  
  27. void inquire_device(char * buffer)
  28. {
  29. int result ;
  30.  
  31.   Command.Data[0] = CD_INQUIRY_length ;
  32.   Command.Data[1] = CD_INQUIRY ;
  33.   Command.Data[2] = 0;
  34.   Command.Data[3] = 0;
  35.   Command.Data[4] = 0;
  36.   Command.Data[5] = 64;
  37.   Command.Data[6] = 0;
  38.   Command.Data[7] = 0;
  39.   Command.Data[8] = 0;
  40.   Command.Data[9] = 0;
  41.   Command.Data[10] = 0;
  42.  
  43.   result = _xdma(ID,Command.Data,buffer,READ_DIR+FULLSCSI,nBlocks,30l*ONE_SECOND) ;
  44.   return ;
  45. }
  46.  
  47. void read_TOC(TOC_DATA_FORMAT * toc)
  48. {
  49. int result ;
  50. int i ;
  51. int num_tracks ;
  52.  
  53.   Command.Data[0] = CD_READ_TOC_length;
  54.   Command.Data[1] = CD_READ_TOC ;
  55.   Command.Data[2] = 2;
  56.   Command.Data[3] = 0;
  57.   Command.Data[4] = 0;
  58.   Command.Data[5] = 0;
  59.   Command.Data[6] = 0;
  60.   Command.Data[7] = 0;
  61.   Command.Data[8] = ((256 >> 8) & 0xff) ;
  62.   Command.Data[9] = (256 &0xff) ;
  63.   Command.Data[10] = 0;
  64.  
  65.   result = _xdma(ID,Command.Data,(char *)toc,READ_DIR+FULLSCSI,nBlocks,30l*ONE_SECOND) ;
  66.  
  67.     toc->header.first_track = BCD_to_UCHAR(toc->header.first_track) ;
  68.     toc->header.last_track = BCD_to_UCHAR(toc->header.last_track) ;
  69. /*
  70.   Convert the track numbers from BCD to unsigend char
  71. */
  72.     num_tracks = toc->header.last_track - toc->header.first_track + 1 ;
  73.     for (i=0; i < num_tracks; i++)
  74.     {
  75.       toc->tracks[i].number = BCD_to_UCHAR(toc->tracks[i].number) ;
  76.     }
  77.   return ;
  78. }
  79.  
  80. void read_sub_channel(void)
  81. {
  82. int result ;
  83.  
  84.   Command.Data[0] = CD_READ_SUBCHANNEL_length;
  85.   Command.Data[1] = CD_READ_SUBCHANNEL ;
  86.   Command.Data[2] = 2;
  87.   Command.Data[3] = 0x40;   /* flag to cause sub_channel data to be transfered */
  88. /* 
  89.   only 0 works with the 431 3 should give MPC and ISRC 
  90.   see 13.2.10 of SCSI-II Spec for details
  91. */
  92.   Command.Data[4] = 0;   /* Sub-Channel format */
  93.   Command.Data[5] = 0;
  94.   Command.Data[6] = 0;
  95.   Command.Data[7] = 0;
  96.   Command.Data[8] = ((sizeof(SUB_CHANNEL_DATA) >> 8) & 0xff) ;
  97.   Command.Data[9] = (sizeof(SUB_CHANNEL_DATA) &0xff) ;
  98.   Command.Data[10] = 0;
  99.  
  100.   result = _xdma(ID,Command.Data,(char *)&sub_channel,READ_DIR+FULLSCSI,nBlocks,30l*ONE_SECOND) ;
  101.  
  102.   return ;
  103. }
  104. void    eject_cd(void)
  105. {
  106. int result ;
  107.  
  108.   Command.Data[0] = CD_EJECT_DISK_length;
  109.   Command.Data[1] = CD_EJECT_DISK ;
  110.   Command.Data[2] = 0;
  111.   Command.Data[3] = 0;
  112.   Command.Data[4] = 0;
  113.   Command.Data[5] = 0;
  114.   Command.Data[6] = 0;
  115.   Command.Data[7] = 0;
  116.   Command.Data[8] = 0 ;
  117.   Command.Data[9] = 0 ;
  118.   Command.Data[10] = 0;
  119.  
  120.   result = _xdma(ID,Command.Data,scrap,READ_DIR+FULLSCSI,nBlocks,30l*ONE_SECOND) ;
  121.  
  122.   return ;
  123. }
  124.  
  125. void    stop_audio(void)
  126. {
  127. int result ;
  128.  
  129.   Command.Data[0] = CD_STOP_AUDIO_length;
  130.   Command.Data[1] = CD_STOP_AUDIO ;
  131.   Command.Data[2] = 0;
  132.   Command.Data[3] = 0;
  133.   Command.Data[4] = 0;
  134.   Command.Data[5] = 0;
  135.   Command.Data[6] = 0;
  136.   Command.Data[7] = 0;
  137.   Command.Data[8] = 0 ;
  138.   Command.Data[9] = 0 ;
  139.   Command.Data[10] = 0;
  140.  
  141.   result = _xdma(ID,Command.Data,scrap,READ_DIR+FULLSCSI,nBlocks,30l*ONE_SECOND) ;
  142.  
  143.   return ;
  144. }
  145. void    pause_audio(void)
  146. {
  147. int result ;
  148.  
  149.   Command.Data[0] = CD_PAUSE_AUDIO_length;
  150.   Command.Data[1] = CD_PAUSE_AUDIO ;
  151.   Command.Data[2] = 0;
  152.   Command.Data[3] = 0;
  153.   Command.Data[4] = 0;
  154.   Command.Data[5] = 0;
  155.   Command.Data[6] = 0;
  156.   Command.Data[7] = 0;
  157.   Command.Data[8] = 0 ;
  158.   Command.Data[9] = 0 ;
  159.   Command.Data[10] = 0;
  160.  
  161.   result = _xdma(ID,Command.Data,scrap,READ_DIR+FULLSCSI,nBlocks,30l*ONE_SECOND) ;
  162.  
  163.   return ;
  164. }
  165. void    resume_audio(void)
  166. {
  167. int result ;
  168.  
  169.   Command.Data[0] = CD_PAUSE_AUDIO_length;
  170.   Command.Data[1] = CD_PAUSE_AUDIO ;
  171.   Command.Data[2] = 0;
  172.   Command.Data[3] = 0;
  173.   Command.Data[4] = 0;
  174.   Command.Data[5] = 0;
  175.   Command.Data[6] = 0;
  176.   Command.Data[7] = 0;
  177.   Command.Data[8] = 0 ;
  178.   Command.Data[9] = 1 ;
  179.   Command.Data[10] = 0;
  180.  
  181.   result = _xdma(ID,Command.Data,scrap,READ_DIR+FULLSCSI,nBlocks,30l*ONE_SECOND) ;
  182.  
  183.   return ;
  184. }
  185.  
  186. void    play_audio(int track)
  187. {
  188. int result ;
  189.  
  190.   track++ ;
  191.   Command.Data[0] = CD_PLAY_TRACK_length;
  192.   Command.Data[1] = CD_PLAY_TRACK ;
  193.   Command.Data[2] = 0;
  194.   Command.Data[3] = 0;
  195.   Command.Data[4] = 0;
  196.   Command.Data[5] = (char) track;
  197.   Command.Data[6] = 1;
  198.   Command.Data[7] = 0;
  199.   Command.Data[8] = (char) track;
  200.   Command.Data[9] = 0x99;
  201.   Command.Data[10] = 0;
  202.  
  203. /*
  204.   Command.Data[0] = CD_PLAY_AUDIO_length;
  205.   Command.Data[1] = CD_PLAY_AUDIO ;
  206.   Command.Data[2] = 0;
  207.   Command.Data[3] = 0;
  208.   Command.Data[4] = toc.tracks[track].addr.minute ;
  209.   Command.Data[5] = toc.tracks[track].addr.second ;
  210.   Command.Data[6] = toc.tracks[track].addr.field ;
  211.   track++ ;
  212.   Command.Data[7] = toc.tracks[track].addr.minute ;
  213.   Command.Data[8] = toc.tracks[track].addr.second ;
  214.   if (toc.tracks[track].addr.field == 0)
  215.   {
  216.     Command.Data[8] -= 1 ;
  217.     Command.Data[9] = 0 ;
  218.   }
  219.   else
  220.     Command.Data[9] = toc.tracks[track].addr.field - 1 ;
  221.   Command.Data[10] = 0;
  222. */
  223.  
  224.   result = _xdma(ID,Command.Data,scrap,READ_DIR+FULLSCSI,nBlocks,30l*ONE_SECOND) ;
  225.  
  226.   return ;
  227. }
  228.  
  229. void    continue_audio(void)
  230. {
  231. int result ;
  232.  
  233.   read_sub_channel() ;
  234.  
  235.   Command.Data[0] = CD_PLAY_AUDIO_length;
  236.   Command.Data[1] = CD_PLAY_AUDIO ;
  237.   Command.Data[2] = 0;
  238.   Command.Data[3] = 0;
  239.   Command.Data[4] = sub_channel.abs_addr.minute ;
  240.   Command.Data[5] = sub_channel.abs_addr.second ;
  241.   Command.Data[6] = sub_channel.abs_addr.field ;
  242.   Command.Data[7] = toc.tracks[sub_channel.track+1].addr.minute ;
  243.   Command.Data[8] = toc.tracks[sub_channel.track+1].addr.second ;
  244.   if (toc.tracks[sub_channel.track+1].addr.field == 0)
  245.   {
  246.     Command.Data[8] -= 1 ;
  247.     Command.Data[9] = 0 ;
  248.   }
  249.   else
  250.     Command.Data[9] = toc.tracks[sub_channel.track+1].addr.field - 1 ;
  251.   Command.Data[10] = 0;
  252.  
  253.   result = _xdma(ID,Command.Data,scrap,READ_DIR+FULLSCSI,nBlocks,30l*ONE_SECOND) ;
  254.  
  255.   return ;
  256. }
  257.  
  258.  
  259. /*
  260. ===========================================================================
  261.                 Some examples of DMA type calls
  262.                 -------------------------------
  263. */
  264.  
  265. /* examples of ACSI format commands */
  266. int Read_Sector (char *buffer, long secno, int blocks)
  267. {
  268.   Command.Data[0] = 0x08;
  269.   Command.Data[1] = (secno & 0xFF0000l) / 0x10000l + 0x20*LUN;
  270.   Command.Data[2] = (secno & 0x00FF00l) / 0x100l;
  271.   Command.Data[3] = secno & 0x0000FFl;
  272.   Command.Data[4] = blocks;
  273.   Command.Data[5] = 0;
  274.   return( _xdma(ID,Command.Data,buffer,READ_DIR,blocks,30l*ONE_SECOND) );
  275. }
  276.  
  277.  
  278.  
  279. int Write_Sector (char * buffer, long secno, int blocks)
  280. {
  281.   Command.Data[0] = 0x0A;
  282.   Command.Data[1] = (secno & 0xFF0000l) / 0x10000l + 0x20*LUN;
  283.   Command.Data[2] = (secno & 0x00FF00l) / 0x100l;
  284.   Command.Data[3] = secno & 0x0000FFl;
  285.   Command.Data[4] = blocks;
  286.   Command.Data[5] = 0;
  287.   return( _xdma(ID,Command.buf,buffer,WRITE_DIR,blocks,30*ONE_SECOND) );
  288. }
  289.  
  290. /* example of a FULL SCSI command */
  291. long Read_Capacity(void)
  292. {
  293. int   i ;
  294.   Command.Data[0] = 10;               /* 10 bytes in command frame  */
  295.   Command.Data[1] = 0x25;             /* read capacity command      */
  296.   Command.Data[2] = 0x20*LUN;
  297.   for (i=3; i<=10; i++)
  298.     Command.Data [i] = 0;
  299.  
  300.   if (_sxdma(ID,Command.buf,SecBuf.buf,READ_DIR+FULLSCSI,1,3*ONE_SECOND)== 0 )
  301.      return SecBuf.longs[0] ;
  302.   else
  303.      return 0;
  304. }
  305.