<html>
<body>
  <div id="body" style="background-color:#ffffff;" >
<table cellspacing="0" cellpadding="0" border="0" rules="cols">
<tr class="head" style="border-bottom-width:1px;border-bottom-style:solid;" ><td class="headtd" style="padding:0;padding-top:.2em;" colspan="4">Commit in <b><tt>lxdream/src</tt></b></td></tr>
<tr><td><tt><a href="#file1">bios.c</a></tt></td><td id="added" class="headtd2" style="padding-left:.3em;padding-right:.3em; background-color:#ddffdd;" align="right">+80</td><td id="removed" class="headtd2" style="padding-left:.3em;padding-right:.3em; background-color:#ffdddd;" align="right">-30</td><td class="headtd2" style="padding-left:.3em;padding-right:.3em;" nowrap="nowrap">50e702af9373 -> 78e762cec843</td></tr>
<tr class="alt" style=";" ><td><tt>gdrom/<a href="#file2">gdrom.c</a></tt></td><td></td><td id="removed" class="headtd2" style="padding-left:.3em;padding-right:.3em; background-color:#ffdddd;" align="right">-5</td><td class="headtd2" style="padding-left:.3em;padding-right:.3em;" nowrap="nowrap">50e702af9373 -> 78e762cec843</td></tr>
<tr><td><tt>     /<a href="#file3">gdrom.h</a></tt></td><td id="added" class="headtd2" style="padding-left:.3em;padding-right:.3em; background-color:#ddffdd;" align="right">+5</td><td></td><td class="headtd2" style="padding-left:.3em;padding-right:.3em;" nowrap="nowrap">50e702af9373 -> 78e762cec843</td></tr>
<tr><td></td><td id="added" class="headtd2" style="padding-left:.3em;padding-right:.3em; background-color:#ddffdd;" align="right">+85</td><td id="removed" class="headtd2" style="padding-left:.3em;padding-right:.3em; background-color:#ffdddd;" align="right">-35</td><td></td></tr>
</table>
<small id="info" style="color: #888888;" >3 modified files</small><br />
<pre class="comment" style="white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;padding:4px;border:1px dashed #000000;background-color:#ffffdd;" >
Implement BIOS read cd + read toc2 functions
</pre>
<hr /><a name="file1" /><div class="file" style="border:1px solid #eeeeee;margin-top:1em;margin-bottom:1em;" >
<span class="pathname" style="font-family:monospace; float:right;" >lxdream/src</span><br />
<div class="fileheader" style="margin-bottom:.5em;" ><big><b>bios.c</b></big> <small id="info" style="color: #888888;" >50e702af9373 -> 78e762cec843</small></div>
<pre class="diff" style="margin:0;" ><small id="info" style="color: #888888;" >--- lxdream/src/bios.c
+++ lxdream/src/bios.c
@@ -56,24 +56,28 @@
</small></pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" > #define GD_ERROR_DISC_CHANGE 6
 #define GD_ERROR_SYSTEM      1
 
</pre><pre id="added" class="diff" style="margin:0; background-color:#ddffdd;" >+struct gdrom_toc2_params {
+    uint32_t session;
+    sh4addr_t buffer;
+};
+
+struct gdrom_readcd_params {
+    cdrom_lba_t lba;
+    cdrom_count_t count;
+    sh4addr_t buffer;
+    uint32_t unknown;
+};
+
+struct gdrom_playcd_params {
+    cdrom_lba_t start;
+    cdrom_lba_t end;
+    uint32_t repeat;
+};
+
</pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" > typedef union gdrom_cmd_params {
</pre><pre id="removed" class="diff" style="margin:0; background-color:#ffdddd;" >-    struct gdrom_toc2_params {
-        uint32_t session;
-        sh4addr_t buffer;
-    } toc2;
-
-    struct gdrom_readcd_params {
-        cdrom_lba_t sector;
-        cdrom_count_t count;
-        sh4addr_t buffer;
-        uint32_t unknown;
-    } readcd;
-
-    struct gdrom_playcd_params {
-        cdrom_lba_t start;
-        cdrom_lba_t end;
-        uint32_t repeat;
-    } playcd;
</pre><pre id="added" class="diff" style="margin:0; background-color:#ddffdd;" >+    struct gdrom_toc2_params toc2;
+    struct gdrom_readcd_params readcd;
+    struct gdrom_playcd_params playcd;
</pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" > } *gdrom_cmd_params_t;
 
 
</pre><pre class="diff" style="margin:0;" ><small id="info" style="color: #888888;" >@@ -82,7 +86,7 @@
</small></pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" > typedef struct gdrom_queue_entry {
     int status;
     uint32_t cmd_code;
</pre><pre id="removed" class="diff" style="margin:0; background-color:#ffdddd;" >-    sh4ptr_t data;
</pre><pre id="added" class="diff" style="margin:0; background-color:#ddffdd;" >+    union gdrom_cmd_params params;
</pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" >     uint32_t result[4];
 } *gdrom_queue_entry_t;
 
</pre><pre class="diff" style="margin:0;" ><small id="info" style="color: #888888;" >@@ -93,34 +97,83 @@
</small></pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" >     uint32_t disk_type;
 } bios_gdrom_status;
 
</pre><pre id="added" class="diff" style="margin:0; background-color:#ddffdd;" >+void bios_gdrom_init( void )
+{
+    memset( &gdrom_cmd_queue, 0, sizeof(gdrom_cmd_queue) );
+}
+
</pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" > void bios_gdrom_run_command( gdrom_queue_entry_t cmd )
 {
     DEBUG( "BIOS GD command %d", cmd->cmd_code );
</pre><pre id="added" class="diff" style="margin:0; background-color:#ddffdd;" >+    cdrom_error_t status = CDROM_ERROR_OK;
+    sh4ptr_t ptr;
</pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" >     switch( cmd->cmd_code ) {
     case GD_CMD_INIT:
         /* *shrug* */
         cmd->status = GD_CMD_STATUS_DONE;
         break;
</pre><pre id="added" class="diff" style="margin:0; background-color:#ddffdd;" >+    case GD_CMD_GETTOC2:
+        ptr = mem_get_region( cmd->params.toc2.buffer );
+        status = gdrom_read_toc( ptr );
+        if( status == CDROM_ERROR_OK ) {
+            /* Convert data to little-endian */
+            struct gdrom_toc *toc = (struct gdrom_toc *)ptr;
+            for( unsigned i=0; i<99; i++ ) {
+                toc->track[i] = ntohl(toc->track[i]);
+            }
+            toc->first = ntohl(toc->first);
+            toc->last = ntohl(toc->last);
+            toc->leadout = ntohl(toc->leadout);
+        }
+        break;
+    case GD_CMD_PIOREAD:
+    case GD_CMD_DMAREAD:
+        ptr = mem_get_region( cmd->params.readcd.buffer );
+        status = gdrom_read_cd( cmd->params.readcd.lba,
+                cmd->params.readcd.count, 0x28, ptr, NULL );
+        break;
+    default:
+        WARN( "Unknown BIOS GD command %d\n", cmd->cmd_code );
+        cmd->status = GD_CMD_STATUS_ERROR;
+        cmd->result[0] = GD_ERROR_SYSTEM;
+        return;
+    }
+
+    switch( status ) {
+    case CDROM_ERROR_OK:
+        cmd->status = GD_CMD_STATUS_DONE;
+        cmd->result[0] = GD_ERROR_OK;
+        break;
+    case CDROM_ERROR_NODISC:
+        cmd->status = GD_CMD_STATUS_ERROR;
+        cmd->result[0] = GD_ERROR_NO_DISC;
+        break;
</pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" >     default:
         cmd->status = GD_CMD_STATUS_ERROR;
         cmd->result[0] = GD_ERROR_SYSTEM;
</pre><pre id="removed" class="diff" style="margin:0; background-color:#ffdddd;" >-        break;
</pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" >     }
 }
 
</pre><pre id="removed" class="diff" style="margin:0; background-color:#ffdddd;" >-void bios_gdrom_init( void )
-{
-    memset( &gdrom_cmd_queue, 0, sizeof(gdrom_cmd_queue) );
-}
-
-uint32_t bios_gdrom_enqueue( uint32_t cmd, sh4ptr_t ptr )
</pre><pre id="added" class="diff" style="margin:0; background-color:#ddffdd;" >+uint32_t bios_gdrom_enqueue( uint32_t cmd, sh4addr_t data )
</pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" > {
     int i;
     for( i=0; i<COMMAND_QUEUE_LENGTH; i++ ) {
         if( gdrom_cmd_queue[i].status != GD_CMD_STATUS_ACTIVE ) {
             gdrom_cmd_queue[i].status = GD_CMD_STATUS_ACTIVE;
             gdrom_cmd_queue[i].cmd_code = cmd;
</pre><pre id="removed" class="diff" style="margin:0; background-color:#ffdddd;" >-            gdrom_cmd_queue[i].data = ptr;
</pre><pre id="added" class="diff" style="margin:0; background-color:#ddffdd;" >+            switch( cmd ) {
+            case GD_CMD_PIOREAD:
+            case GD_CMD_DMAREAD:
+                mem_copy_from_sh4( (unsigned char *)&gdrom_cmd_queue[i].params.readcd, data, sizeof(struct gdrom_readcd_params) );
+                break;
+            case GD_CMD_GETTOC2:
+                mem_copy_from_sh4( (unsigned char *)&gdrom_cmd_queue[i].params.toc2, data, sizeof(struct gdrom_toc2_params) );
+                break;
+            case GD_CMD_PLAY:
+            case GD_CMD_PLAY2:
+                mem_copy_from_sh4( (unsigned char *)&gdrom_cmd_queue[i].params.playcd, data, sizeof(struct gdrom_playcd_params) );
+                break;
+            }
</pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" >             return i;
         }
     }
</pre><pre class="diff" style="margin:0;" ><small id="info" style="color: #888888;" >@@ -165,10 +218,7 @@
</small></pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" >         case 0: /* GD-Rom */
             switch( sh4r.r[7] ) {
             case 0: /* Send command */
</pre><pre id="removed" class="diff" style="margin:0; background-color:#ffdddd;" >-                if( sh4r.r[5] == 0 )
-                    sh4r.r[0] = bios_gdrom_enqueue( sh4r.r[4], NULL );
-                else
-                    sh4r.r[0] = bios_gdrom_enqueue( sh4r.r[4], mem_get_region(sh4r.r[5]) );
</pre><pre id="added" class="diff" style="margin:0; background-color:#ddffdd;" >+                sh4r.r[0] = bios_gdrom_enqueue( sh4r.r[4], sh4r.r[5] );
</pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" >                 break;
             case 1:  /* Check command */
                 cmd = bios_gdrom_get_command( sh4r.r[4] );
</pre></div>
<hr /><a name="file2" /><div class="file" style="border:1px solid #eeeeee;margin-top:1em;margin-bottom:1em;" >
<span class="pathname" style="font-family:monospace; float:right;" >lxdream/src/gdrom</span><br />
<div class="fileheader" style="margin-bottom:.5em;" ><big><b>gdrom.c</b></big> <small id="info" style="color: #888888;" >50e702af9373 -> 78e762cec843</small></div>
<pre class="diff" style="margin:0;" ><small id="info" style="color: #888888;" >--- lxdream/src/gdrom/gdrom.c
+++ lxdream/src/gdrom/gdrom.c
@@ -112,11 +112,6 @@
</small></pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" > 
 cdrom_error_t gdrom_read_toc( unsigned char *buf )
 {
</pre><pre id="removed" class="diff" style="margin:0; background-color:#ffdddd;" >-   struct gdrom_toc {
-           uint32_t track[99];
-           uint32_t first, last, leadout;
-       };
-       
</pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" >     struct gdrom_toc *toc = (struct gdrom_toc *)buf;
     int i;
     
</pre></div>
<hr /><a name="file3" /><div class="file" style="border:1px solid #eeeeee;margin-top:1em;margin-bottom:1em;" >
<span class="pathname" style="font-family:monospace; float:right;" >lxdream/src/gdrom</span><br />
<div class="fileheader" style="margin-bottom:.5em;" ><big><b>gdrom.h</b></big> <small id="info" style="color: #888888;" >50e702af9373 -> 78e762cec843</small></div>
<pre class="diff" style="margin:0;" ><small id="info" style="color: #888888;" >--- lxdream/src/gdrom/gdrom.h
+++ lxdream/src/gdrom/gdrom.h
@@ -29,6 +29,11 @@
</small></pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" > extern "C" {
 #endif
 
</pre><pre id="added" class="diff" style="margin:0; background-color:#ddffdd;" >+struct gdrom_toc {
+    uint32_t track[99];
+    uint32_t first, last, leadout;
+};
+
</pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" > #define GDROM_TOC_SIZE (102*4) /* Size of GDROM TOC structure */
 #define GDROM_SESSION_INFO_SIZE 6 /* Size of GDROM session info structure */
 #define GDROM_SHORT_STATUS_SIZE 14 /* Size of GDROM short status structure */
</pre></div>
<center><small>Chaos Theory</small></center>
</div></body></html>