diff --git a/example/GdromTest.java b/example/GdromTest.java index 69105af..44a72c1 100644 --- a/example/GdromTest.java +++ b/example/GdromTest.java @@ -1,9 +1,43 @@ package example; import sega.dreamcast.gdrom.GdromProtocol; +import sega.dreamcast.gdrom.G1IF; +import java.misc.Memory; class GdromTest { + static byte[] buf; + + static { + buf = new byte[2048]; + } + + public static void g1_dma_start(int start_address, int transfer_length) { + int gdstar = start_address & ~(0b111 << 29); + int gdlen = (transfer_length + 31) & ~(31); + + Memory.putU4(G1IF.GDAPRO, 0x8843407F); + Memory.putU4(G1IF.G1GDRC, 0x00001001); + Memory.putU4(G1IF.GDSTAR, gdstar); + Memory.putU4(G1IF.GDLEN, gdlen); + Memory.putU4(G1IF.GDDIR, 1); + Memory.putU4(G1IF.GDEN, 1); + Memory.putU4(G1IF.GDST, 1); + } + public static void main() { - GdromProtocol.tocGetDataTrackFad(); + // assume gdrom is already unlocked + + int data_track_fad = GdromProtocol.tocGetDataTrackFad(); + + int primary_volume_descriptor = data_track_fad + 16; + + GdromProtocol.cdReadPIO(buf, primary_volume_descriptor, 1); + + System.out.println("data:"); + for (int i = 0; i < 16; i++) { + System.out.print(buf[i]); + System.out.print(' '); + } + System.out.println(); } } diff --git a/generate.sh b/generate.sh index d4b7868..4534d6e 100644 --- a/generate.sh +++ b/generate.sh @@ -4,11 +4,10 @@ python gen_decoder.py > c/decode.inc.c python regs/register_gen.py ../dreamcast/regs/holly.csv holly holly Holly 0xa05f8000 > sega/dreamcast/holly/Holly.java python regs/register_gen.py ../dreamcast/regs/systembus.csv systembus systembus Systembus 0xa05f6800 > sega/dreamcast/systembus/Systembus.java python regs/register_gen.py ../dreamcast/regs/systembus.csv maple_if maple MapleIF 0xa05f6c00 > sega/dreamcast/maple/MapleIF.java -python regs/register_gen.py ../dreamcast/regs/systembus.csv gdrom_if gdrom GdromIF 0xa05f7000 > sega/dreamcast/gdrom/GdromIF.java +python regs/register_gen.py ../dreamcast/regs/gdrom.csv gdrom gdrom Gdrom 0xa05f7000 > sega/dreamcast/gdrom/Gdrom.java python regs/register_gen.py ../dreamcast/regs/systembus.csv g1_if gdrom G1IF 0xa05f7400 > sega/dreamcast/gdrom/G1IF.java python regs/register_gen.py ../dreamcast/regs/systembus.csv g2_if g2_if G2IF 0xa05f7800 > sega/dreamcast/g2_if/G2IF.java python regs/register_gen.py ../dreamcast/regs/systembus.csv pvr_if pvr_if PVRIF 0xa05f7c00 > sega/dreamcast/pvr_if/PVRIF.java -python regs/register_gen.py ../dreamcast/regs/gdrom.csv gdrom gdrom Gdrom 0xa05f7000 > sega/dreamcast/gdrom/Gdrom.java python regs/bits_gen.py ../dreamcast/regs/core_bits.csv holly CoreBits > sega/dreamcast/holly/CoreBits.java python regs/bits_gen.py ../dreamcast/regs/ta_bits.csv holly TABits > sega/dreamcast/holly/TABits.java diff --git a/sega/dreamcast/gdrom/GdromIF.java b/sega/dreamcast/gdrom/GdromIF.java deleted file mode 100644 index f984d1a..0000000 --- a/sega/dreamcast/gdrom/GdromIF.java +++ /dev/null @@ -1,2 +0,0 @@ -package sega.dreamcast.gdrom; - diff --git a/sega/dreamcast/gdrom/GdromProtocol.java b/sega/dreamcast/gdrom/GdromProtocol.java index 7e07b74..80bdddb 100644 --- a/sega/dreamcast/gdrom/GdromProtocol.java +++ b/sega/dreamcast/gdrom/GdromProtocol.java @@ -5,7 +5,7 @@ import sega.dreamcast.gdrom.GdromCommandPacketFormat; public class GdromProtocol { static GdromCommandPacketFormat.get_toc get_toc_command; - static short[] toc_buf; + static byte[] toc_buf; static GdromCommandPacketFormat.cd_read cd_read_command; @@ -15,7 +15,7 @@ public class GdromProtocol { get_toc_command = new GdromCommandPacketFormat.get_toc(single_density_area, maximum_toc_length); - toc_buf = new short[maximum_toc_length >> 1]; + toc_buf = new byte[maximum_toc_length]; cd_read_command = new GdromCommandPacketFormat.cd_read(0, 0, 0); } @@ -53,18 +53,18 @@ public class GdromProtocol { } } - public static void readData(short[] buf, int length) { + public static void readData(byte[] buf, int length) { for (int i = 0; i < (length >> 1); i++) { - buf[i] = (short)Memory.getU2(Gdrom.data); + int data = Memory.getU2(Gdrom.data); + buf[i * 2] = (byte)((data >> 8) & 0xff); + buf[i * 2 + 1] = (byte)(data & 0xff); } } - public static int getFad(short[] buf, int i) { - int low = toc_buf[i * 2] & 0xffff; - int high = toc_buf[i * 2 + 1] & 0xffff; - int i0 = (high >> 8) & 0xff; - int i1 = high & 0xff; - int i2 = (low >> 8) & 0xff; + public static int getFad(byte[] buf, int i) { + int i0 = buf[0]; + int i1 = buf[1]; + int i2 = buf[2]; //int i3 = low & 0xff; return (i2 << 16) | (i1 << 8) | i0; @@ -110,12 +110,50 @@ public class GdromProtocol { cd_read_command.transfer_length2 = (transfer_length >> 0) & 0xff; } - public static void cdReadDMA(int starting_address, int transfer_length) { + // transfer_length is in sectors + public static void cdReadPIO(byte[] buf, int starting_address, int transfer_length) { int data_select = 0b0010; // data int expected_data_type = 0b100; // XA mode 2 form 1 int parameter_type = 0b0; // FAD specified int data = (data_select << 4) | (expected_data_type << 1) | (parameter_type); + cdReadSet(data, starting_address, transfer_length); + packetCommand(cd_read_command, false); // PIO mode + + int length = 0; + + System.out.println("cdReadPIO"); + + while (true) { + int status = Memory.getU1(Gdrom.status); + if (GdromBits.status__drq(status) == 0) + break; + + int low = Memory.getU1(Gdrom.byte_count_low); + int high = Memory.getU1(Gdrom.byte_count_high); + int byte_count = ((high & 0xff) << 8) | (low & 0xff); + + readData(buf, byte_count); + length += byte_count; + } + + int status = Memory.getU1(Gdrom.status); + System.out.print("status: "); + System.out.println(status); + + System.out.print("read length: "); + System.out.println(length); + } + + // transfer_length is in sectors + public static void cdReadDMA(int starting_address, int transfer_length) { + int data_select = 0b0010; // data + int expected_data_type = 0b100; // XA mode 2 form 1 + int parameter_type = 0b0; // FAD specified + int data = (data_select << 4) | (expected_data_type << 1) | (parameter_type); + + System.out.println("cdReadDMA"); + cdReadSet(data, starting_address, transfer_length); packetCommand(cd_read_command, true); // DMA mode }