From a8f3b5e92133e423950aa63428b0b3cd39b15ca0 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Wed, 1 Jan 2025 15:39:21 -0600 Subject: [PATCH] (re)add GdromCommandPacketFormat --- c/classpath.h | 19 + c/classpath.inc.c | 19 + c/main_dreamcast.c | 7 +- classpath.mk | 19 + example/GdromTest.class.h | 15 + example/GdromTest.java | 9 + regs/gdrom_command_packet_format.py | 2 +- regs/sparse_struct_java.py | 20 +- .../gdrom/GdromCommandPacketFormat.class.h | 15 + .../gdrom/GdromCommandPacketFormat.java | 336 ++++++++++++++++++ .../GdromCommandPacketFormat_cd_open.class.h | 15 + .../GdromCommandPacketFormat_cd_play.class.h | 15 + .../GdromCommandPacketFormat_cd_read.class.h | 15 + .../GdromCommandPacketFormat_cd_read2.class.h | 15 + .../GdromCommandPacketFormat_cd_scan.class.h | 15 + .../GdromCommandPacketFormat_cd_scd.class.h | 15 + .../GdromCommandPacketFormat_cd_seek.class.h | 15 + .../GdromCommandPacketFormat_get_toc.class.h | 15 + ...GdromCommandPacketFormat_req_error.class.h | 15 + .../GdromCommandPacketFormat_req_mode.class.h | 15 + .../GdromCommandPacketFormat_req_ses.class.h | 15 + .../GdromCommandPacketFormat_req_stat.class.h | 15 + .../GdromCommandPacketFormat_set_mode.class.h | 15 + ...GdromCommandPacketFormat_test_unit.class.h | 15 + .../gdrom/GdromCommandPacketInterface.class.h | 15 + .../gdrom/GdromCommandPacketInterface.java | 5 + sega/dreamcast/gdrom/GdromProtocol.class.h | 15 + sega/dreamcast/gdrom/GdromProtocol.java | 98 +++++ 28 files changed, 795 insertions(+), 9 deletions(-) create mode 100644 example/GdromTest.class.h create mode 100644 example/GdromTest.java create mode 100644 sega/dreamcast/gdrom/GdromCommandPacketFormat.class.h create mode 100644 sega/dreamcast/gdrom/GdromCommandPacketFormat.java create mode 100644 sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_open.class.h create mode 100644 sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_play.class.h create mode 100644 sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_read.class.h create mode 100644 sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_read2.class.h create mode 100644 sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_scan.class.h create mode 100644 sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_scd.class.h create mode 100644 sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_seek.class.h create mode 100644 sega/dreamcast/gdrom/GdromCommandPacketFormat_get_toc.class.h create mode 100644 sega/dreamcast/gdrom/GdromCommandPacketFormat_req_error.class.h create mode 100644 sega/dreamcast/gdrom/GdromCommandPacketFormat_req_mode.class.h create mode 100644 sega/dreamcast/gdrom/GdromCommandPacketFormat_req_ses.class.h create mode 100644 sega/dreamcast/gdrom/GdromCommandPacketFormat_req_stat.class.h create mode 100644 sega/dreamcast/gdrom/GdromCommandPacketFormat_set_mode.class.h create mode 100644 sega/dreamcast/gdrom/GdromCommandPacketFormat_test_unit.class.h create mode 100644 sega/dreamcast/gdrom/GdromCommandPacketInterface.class.h create mode 100644 sega/dreamcast/gdrom/GdromCommandPacketInterface.java create mode 100644 sega/dreamcast/gdrom/GdromProtocol.class.h create mode 100644 sega/dreamcast/gdrom/GdromProtocol.java diff --git a/c/classpath.h b/c/classpath.h index 409ac4d..f83d3e6 100644 --- a/c/classpath.h +++ b/c/classpath.h @@ -1,5 +1,7 @@ #include "example/DreamcastVideo2.class.h" #include "example/DreamcastVideo.class.h" +#include "example/GdromTest.class.h" +#include "example/Vec2.class.h" #include "java/io/PrintStream.class.h" #include "java/lang/Boolean.class.h" #include "java/lang/Byte.class.h" @@ -26,6 +28,23 @@ #include "model/Vec3.class.h" #include "sega/dreamcast/gdrom/GdromBits.class.h" #include "sega/dreamcast/gdrom/Gdrom.class.h" +#include "sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_open.class.h" +#include "sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_play.class.h" +#include "sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_read2.class.h" +#include "sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_read.class.h" +#include "sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_scan.class.h" +#include "sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_scd.class.h" +#include "sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_seek.class.h" +#include "sega/dreamcast/gdrom/GdromCommandPacketFormat.class.h" +#include "sega/dreamcast/gdrom/GdromCommandPacketFormat_get_toc.class.h" +#include "sega/dreamcast/gdrom/GdromCommandPacketFormat_req_error.class.h" +#include "sega/dreamcast/gdrom/GdromCommandPacketFormat_req_mode.class.h" +#include "sega/dreamcast/gdrom/GdromCommandPacketFormat_req_ses.class.h" +#include "sega/dreamcast/gdrom/GdromCommandPacketFormat_req_stat.class.h" +#include "sega/dreamcast/gdrom/GdromCommandPacketFormat_set_mode.class.h" +#include "sega/dreamcast/gdrom/GdromCommandPacketFormat_test_unit.class.h" +#include "sega/dreamcast/gdrom/GdromCommandPacketInterface.class.h" +#include "sega/dreamcast/gdrom/GdromProtocol.class.h" #include "sega/dreamcast/holly/Background.class.h" #include "sega/dreamcast/holly/CoreBits.class.h" #include "sega/dreamcast/holly/Core.class.h" diff --git a/c/classpath.inc.c b/c/classpath.inc.c index 01f9cee..f95769e 100644 --- a/c/classpath.inc.c +++ b/c/classpath.inc.c @@ -1,5 +1,7 @@ (const uint8_t *)&_binary_example_DreamcastVideo2_class_start, (const uint8_t *)&_binary_example_DreamcastVideo_class_start, +(const uint8_t *)&_binary_example_GdromTest_class_start, +(const uint8_t *)&_binary_example_Vec2_class_start, (const uint8_t *)&_binary_java_io_PrintStream_class_start, (const uint8_t *)&_binary_java_lang_Boolean_class_start, (const uint8_t *)&_binary_java_lang_Byte_class_start, @@ -26,6 +28,23 @@ (const uint8_t *)&_binary_model_Vec3_class_start, (const uint8_t *)&_binary_sega_dreamcast_gdrom_GdromBits_class_start, (const uint8_t *)&_binary_sega_dreamcast_gdrom_Gdrom_class_start, +(const uint8_t *)&_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_open_class_start, +(const uint8_t *)&_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_play_class_start, +(const uint8_t *)&_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_read2_class_start, +(const uint8_t *)&_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_read_class_start, +(const uint8_t *)&_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_scan_class_start, +(const uint8_t *)&_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_scd_class_start, +(const uint8_t *)&_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_seek_class_start, +(const uint8_t *)&_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_class_start, +(const uint8_t *)&_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_get_toc_class_start, +(const uint8_t *)&_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_error_class_start, +(const uint8_t *)&_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_mode_class_start, +(const uint8_t *)&_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_ses_class_start, +(const uint8_t *)&_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_stat_class_start, +(const uint8_t *)&_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_set_mode_class_start, +(const uint8_t *)&_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_test_unit_class_start, +(const uint8_t *)&_binary_sega_dreamcast_gdrom_GdromCommandPacketInterface_class_start, +(const uint8_t *)&_binary_sega_dreamcast_gdrom_GdromProtocol_class_start, (const uint8_t *)&_binary_sega_dreamcast_holly_Background_class_start, (const uint8_t *)&_binary_sega_dreamcast_holly_CoreBits_class_start, (const uint8_t *)&_binary_sega_dreamcast_holly_Core_class_start, diff --git a/c/main_dreamcast.c b/c/main_dreamcast.c index ac0a119..eeb0eff 100644 --- a/c/main_dreamcast.c +++ b/c/main_dreamcast.c @@ -18,9 +18,14 @@ void main() }; int class_file_buffers_length = (sizeof (class_file_buffers)) / (sizeof (class_file_buffers[0])); - const uint8_t * main_class = (const uint8_t *)"example/DreamcastVideo2"; + //const uint8_t * main_class = (const uint8_t *)"example/DreamcastVideo2"; + const uint8_t * main_class = (const uint8_t *)"example/GdromTest"; int main_class_length = string_length((const char *)main_class); + for (int i = 0; i < main_class_length; i++) + scif_character(main_class[i]); + scif_character('\n'); + int class_hash_table_length; struct hash_table_entry * class_hash_table = class_resolver_load_from_buffers(class_file_buffers, class_file_buffers_length, diff --git a/classpath.mk b/classpath.mk index 1fec1cd..b1e803f 100644 --- a/classpath.mk +++ b/classpath.mk @@ -1,6 +1,8 @@ CLASS_PATH = \ example/DreamcastVideo2.class.o \ example/DreamcastVideo.class.o \ + example/GdromTest.class.o \ + example/Vec2.class.o \ java/io/PrintStream.class.o \ java/lang/Boolean.class.o \ java/lang/Byte.class.o \ @@ -27,6 +29,23 @@ CLASS_PATH = \ model/Vec3.class.o \ sega/dreamcast/gdrom/GdromBits.class.o \ sega/dreamcast/gdrom/Gdrom.class.o \ + sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_open.class.o \ + sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_play.class.o \ + sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_read2.class.o \ + sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_read.class.o \ + sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_scan.class.o \ + sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_scd.class.o \ + sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_seek.class.o \ + sega/dreamcast/gdrom/GdromCommandPacketFormat.class.o \ + sega/dreamcast/gdrom/GdromCommandPacketFormat_get_toc.class.o \ + sega/dreamcast/gdrom/GdromCommandPacketFormat_req_error.class.o \ + sega/dreamcast/gdrom/GdromCommandPacketFormat_req_mode.class.o \ + sega/dreamcast/gdrom/GdromCommandPacketFormat_req_ses.class.o \ + sega/dreamcast/gdrom/GdromCommandPacketFormat_req_stat.class.o \ + sega/dreamcast/gdrom/GdromCommandPacketFormat_set_mode.class.o \ + sega/dreamcast/gdrom/GdromCommandPacketFormat_test_unit.class.o \ + sega/dreamcast/gdrom/GdromCommandPacketInterface.class.o \ + sega/dreamcast/gdrom/GdromProtocol.class.o \ sega/dreamcast/holly/Background.class.o \ sega/dreamcast/holly/CoreBits.class.o \ sega/dreamcast/holly/Core.class.o \ diff --git a/example/GdromTest.class.h b/example/GdromTest.class.h new file mode 100644 index 0000000..15269f8 --- /dev/null +++ b/example/GdromTest.class.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern C { +#endif + +extern uint32_t _binary_example_GdromTest_class_start __asm("_binary_example_GdromTest_class_start"); +extern uint32_t _binary_example_GdromTest_class_end __asm("_binary_example_GdromTest_class_end"); +extern uint32_t _binary_example_GdromTest_class_size __asm("_binary_example_GdromTest_class_size"); + +#ifdef __cplusplus +} +#endif diff --git a/example/GdromTest.java b/example/GdromTest.java new file mode 100644 index 0000000..69105af --- /dev/null +++ b/example/GdromTest.java @@ -0,0 +1,9 @@ +package example; + +import sega.dreamcast.gdrom.GdromProtocol; + +class GdromTest { + public static void main() { + GdromProtocol.tocGetDataTrackFad(); + } +} diff --git a/regs/gdrom_command_packet_format.py b/regs/gdrom_command_packet_format.py index b71146a..b57bbb5 100644 --- a/regs/gdrom_command_packet_format.py +++ b/regs/gdrom_command_packet_format.py @@ -6,7 +6,7 @@ from sparse_struct import parse from sparse_struct_java import render_declarations def get_type(field_name: str): - return "byte" + return "int" if __name__ == "__main__": rows = read_input_headerless(sys.argv[1]) diff --git a/regs/sparse_struct_java.py b/regs/sparse_struct_java.py index e00c0e9..4f15a8e 100644 --- a/regs/sparse_struct_java.py +++ b/regs/sparse_struct_java.py @@ -1,5 +1,8 @@ -def render_fields(get_type, fields): +def render_fields(get_type, fields, want_get_byte): for field in fields: + if want_get_byte and field.name.startswith("_res"): + continue + field_type = get_type(field.name) if field.array_length == 1: yield f"public {field_type} {field.name};" @@ -7,7 +10,7 @@ def render_fields(get_type, fields): for i in range(field.array_length): yield f"public {field_type} {field.name}{i};" -def render_constructor(get_type, declaration): +def render_constructor(get_type, declaration, want_get_byte): initializer = f"public {declaration.name}(" padding = " " * len(initializer) def start(i): @@ -32,6 +35,9 @@ def render_constructor(get_type, declaration): yield initializer + ') {' for i, field in enumerate(declaration.fields): + if want_get_byte and field.name.startswith("_res"): + continue + value = field.name if not field.name.startswith('_res') else '0' value = hex(field.default) if field.default is not None else value s = ':' if i == 0 else ',' @@ -41,7 +47,7 @@ def render_constructor(get_type, declaration): max_shift = 8 * (field.array_length - 1) for i in range(field.array_length): shift = max_shift - (i * 8) - yield f"this.{field.name}{i} = (byte)(({field.name} >> {shift}) & 0xff);" + yield f"this.{field.name}{i} = ({field.name} >> {shift}) & 0xff;" yield "}" @@ -50,7 +56,7 @@ def render_constructor(get_type, declaration): def render_get_byte(fields): ix = 0 - yield "public int get_byte(int ix) {" + yield "public int getByte(int ix) {" yield "switch (ix) {" for field in fields: if "_res" in field.name: @@ -66,9 +72,9 @@ def render_get_byte(fields): yield "}" def render_declaration(get_type, declaration, want_get_byte): - yield f"public static class {declaration.name} {{" - yield from render_fields(get_type, declaration.fields) - yield from render_constructor(get_type, declaration) + yield f"public static class {declaration.name} implements GdromCommandPacketInterface {{" + yield from render_fields(get_type, declaration.fields, want_get_byte) + yield from render_constructor(get_type, declaration, want_get_byte) if want_get_byte: yield from render_get_byte(declaration.fields) yield "}" diff --git a/sega/dreamcast/gdrom/GdromCommandPacketFormat.class.h b/sega/dreamcast/gdrom/GdromCommandPacketFormat.class.h new file mode 100644 index 0000000..1698b37 --- /dev/null +++ b/sega/dreamcast/gdrom/GdromCommandPacketFormat.class.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern C { +#endif + +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_class_start __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_class_start"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_class_end __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_class_end"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_class_size __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_class_size"); + +#ifdef __cplusplus +} +#endif diff --git a/sega/dreamcast/gdrom/GdromCommandPacketFormat.java b/sega/dreamcast/gdrom/GdromCommandPacketFormat.java new file mode 100644 index 0000000..3d6f286 --- /dev/null +++ b/sega/dreamcast/gdrom/GdromCommandPacketFormat.java @@ -0,0 +1,336 @@ +package sega.dreamcast.gdrom; + + +public class GdromCommandPacketFormat { + public static class test_unit implements GdromCommandPacketInterface { + public int command_code; + public test_unit() { + this.command_code = 0x0; + } + public int getByte(int ix) { + switch (ix) { + case 0: return command_code; + default: return 0; + } + } + } + public static class req_stat implements GdromCommandPacketInterface { + public int command_code; + public int starting_address; + public int allocation_length; + public req_stat(int starting_address, + int allocation_length + ) { + this.command_code = 0x10; + this.starting_address = starting_address; + this.allocation_length = allocation_length; + } + public int getByte(int ix) { + switch (ix) { + case 0: return command_code; + case 2: return starting_address; + case 4: return allocation_length; + default: return 0; + } + } + } + public static class req_mode implements GdromCommandPacketInterface { + public int command_code; + public int starting_address; + public int allocation_length; + public req_mode(int starting_address, + int allocation_length + ) { + this.command_code = 0x11; + this.starting_address = starting_address; + this.allocation_length = allocation_length; + } + public int getByte(int ix) { + switch (ix) { + case 0: return command_code; + case 2: return starting_address; + case 4: return allocation_length; + default: return 0; + } + } + } + public static class set_mode implements GdromCommandPacketInterface { + public int command_code; + public int starting_address; + public int allocation_length; + public set_mode(int starting_address, + int allocation_length + ) { + this.command_code = 0x12; + this.starting_address = starting_address; + this.allocation_length = allocation_length; + } + public int getByte(int ix) { + switch (ix) { + case 0: return command_code; + case 2: return starting_address; + case 4: return allocation_length; + default: return 0; + } + } + } + public static class req_error implements GdromCommandPacketInterface { + public int command_code; + public int allocation_length; + public req_error(int allocation_length + ) { + this.command_code = 0x13; + this.allocation_length = allocation_length; + } + public int getByte(int ix) { + switch (ix) { + case 0: return command_code; + case 4: return allocation_length; + default: return 0; + } + } + } + public static class get_toc implements GdromCommandPacketInterface { + public int command_code; + public int select; + public int allocation_length0; + public int allocation_length1; + public get_toc(int select, + int allocation_length + ) { + this.command_code = 0x14; + this.select = select; + this.allocation_length0 = (allocation_length >> 8) & 0xff; + this.allocation_length1 = (allocation_length >> 0) & 0xff; + } + public int getByte(int ix) { + switch (ix) { + case 0: return command_code; + case 1: return select; + case 3: return allocation_length0; + case 4: return allocation_length1; + default: return 0; + } + } + } + public static class req_ses implements GdromCommandPacketInterface { + public int command_code; + public int session_number; + public int allocation_length; + public req_ses(int session_number, + int allocation_length + ) { + this.command_code = 0x15; + this.session_number = session_number; + this.allocation_length = allocation_length; + } + public int getByte(int ix) { + switch (ix) { + case 0: return command_code; + case 2: return session_number; + case 4: return allocation_length; + default: return 0; + } + } + } + public static class cd_open implements GdromCommandPacketInterface { + public int command_code; + public cd_open() { + this.command_code = 0x16; + } + public int getByte(int ix) { + switch (ix) { + case 0: return command_code; + default: return 0; + } + } + } + public static class cd_play implements GdromCommandPacketInterface { + public int command_code; + public int parameter_type; + public int starting_point0; + public int starting_point1; + public int starting_point2; + public int repeat_times; + public int end_point0; + public int end_point1; + public int end_point2; + public cd_play(int parameter_type, + int starting_point, + int repeat_times, + int end_point + ) { + this.command_code = 0x20; + this.parameter_type = parameter_type; + this.starting_point0 = (starting_point >> 16) & 0xff; + this.starting_point1 = (starting_point >> 8) & 0xff; + this.starting_point2 = (starting_point >> 0) & 0xff; + this.repeat_times = repeat_times; + this.end_point0 = (end_point >> 16) & 0xff; + this.end_point1 = (end_point >> 8) & 0xff; + this.end_point2 = (end_point >> 0) & 0xff; + } + public int getByte(int ix) { + switch (ix) { + case 0: return command_code; + case 1: return parameter_type; + case 2: return starting_point0; + case 3: return starting_point1; + case 4: return starting_point2; + case 6: return repeat_times; + case 8: return end_point0; + case 9: return end_point1; + case 10: return end_point2; + default: return 0; + } + } + } + public static class cd_seek implements GdromCommandPacketInterface { + public int command_code; + public int parameter_type; + public int seek_point0; + public int seek_point1; + public int seek_point2; + public cd_seek(int parameter_type, + int seek_point + ) { + this.command_code = 0x21; + this.parameter_type = parameter_type; + this.seek_point0 = (seek_point >> 16) & 0xff; + this.seek_point1 = (seek_point >> 8) & 0xff; + this.seek_point2 = (seek_point >> 0) & 0xff; + } + public int getByte(int ix) { + switch (ix) { + case 0: return command_code; + case 1: return parameter_type; + case 2: return seek_point0; + case 3: return seek_point1; + case 4: return seek_point2; + default: return 0; + } + } + } + public static class cd_scan implements GdromCommandPacketInterface { + public int command_code; + public int direction; + public int speed; + public cd_scan(int direction, + int speed + ) { + this.command_code = 0x22; + this.direction = direction; + this.speed = speed; + } + public int getByte(int ix) { + switch (ix) { + case 0: return command_code; + case 2: return direction; + case 3: return speed; + default: return 0; + } + } + } + public static class cd_read implements GdromCommandPacketInterface { + public int command_code; + public int data; + public int starting_address0; + public int starting_address1; + public int starting_address2; + public int transfer_length0; + public int transfer_length1; + public int transfer_length2; + public cd_read(int data, + int starting_address, + int transfer_length + ) { + this.command_code = 0x30; + this.data = data; + this.starting_address0 = (starting_address >> 16) & 0xff; + this.starting_address1 = (starting_address >> 8) & 0xff; + this.starting_address2 = (starting_address >> 0) & 0xff; + this.transfer_length0 = (transfer_length >> 16) & 0xff; + this.transfer_length1 = (transfer_length >> 8) & 0xff; + this.transfer_length2 = (transfer_length >> 0) & 0xff; + } + public int getByte(int ix) { + switch (ix) { + case 0: return command_code; + case 1: return data; + case 2: return starting_address0; + case 3: return starting_address1; + case 4: return starting_address2; + case 8: return transfer_length0; + case 9: return transfer_length1; + case 10: return transfer_length2; + default: return 0; + } + } + } + public static class cd_read2 implements GdromCommandPacketInterface { + public int command_code; + public int data; + public int starting_address0; + public int starting_address1; + public int starting_address2; + public int transfer_length0; + public int transfer_length1; + public int next_address0; + public int next_address1; + public int next_address2; + public cd_read2(int data, + int starting_address, + int transfer_length, + int next_address + ) { + this.command_code = 0x31; + this.data = data; + this.starting_address0 = (starting_address >> 16) & 0xff; + this.starting_address1 = (starting_address >> 8) & 0xff; + this.starting_address2 = (starting_address >> 0) & 0xff; + this.transfer_length0 = (transfer_length >> 8) & 0xff; + this.transfer_length1 = (transfer_length >> 0) & 0xff; + this.next_address0 = (next_address >> 16) & 0xff; + this.next_address1 = (next_address >> 8) & 0xff; + this.next_address2 = (next_address >> 0) & 0xff; + } + public int getByte(int ix) { + switch (ix) { + case 0: return command_code; + case 1: return data; + case 2: return starting_address0; + case 3: return starting_address1; + case 4: return starting_address2; + case 6: return transfer_length0; + case 7: return transfer_length1; + case 8: return next_address0; + case 9: return next_address1; + case 10: return next_address2; + default: return 0; + } + } + } + public static class cd_scd implements GdromCommandPacketInterface { + public int command_code; + public int data_format; + public int allocation_length0; + public int allocation_length1; + public cd_scd(int data_format, + int allocation_length + ) { + this.command_code = 0x40; + this.data_format = data_format; + this.allocation_length0 = (allocation_length >> 8) & 0xff; + this.allocation_length1 = (allocation_length >> 0) & 0xff; + } + public int getByte(int ix) { + switch (ix) { + case 0: return command_code; + case 1: return data_format; + case 3: return allocation_length0; + case 4: return allocation_length1; + default: return 0; + } + } + } +} diff --git a/sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_open.class.h b/sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_open.class.h new file mode 100644 index 0000000..7897560 --- /dev/null +++ b/sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_open.class.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern C { +#endif + +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_open_class_start __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_open_class_start"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_open_class_end __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_open_class_end"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_open_class_size __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_open_class_size"); + +#ifdef __cplusplus +} +#endif diff --git a/sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_play.class.h b/sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_play.class.h new file mode 100644 index 0000000..492ef87 --- /dev/null +++ b/sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_play.class.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern C { +#endif + +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_play_class_start __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_play_class_start"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_play_class_end __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_play_class_end"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_play_class_size __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_play_class_size"); + +#ifdef __cplusplus +} +#endif diff --git a/sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_read.class.h b/sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_read.class.h new file mode 100644 index 0000000..da65f91 --- /dev/null +++ b/sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_read.class.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern C { +#endif + +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_read_class_start __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_read_class_start"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_read_class_end __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_read_class_end"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_read_class_size __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_read_class_size"); + +#ifdef __cplusplus +} +#endif diff --git a/sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_read2.class.h b/sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_read2.class.h new file mode 100644 index 0000000..cef1aee --- /dev/null +++ b/sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_read2.class.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern C { +#endif + +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_read2_class_start __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_read2_class_start"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_read2_class_end __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_read2_class_end"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_read2_class_size __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_read2_class_size"); + +#ifdef __cplusplus +} +#endif diff --git a/sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_scan.class.h b/sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_scan.class.h new file mode 100644 index 0000000..4191e71 --- /dev/null +++ b/sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_scan.class.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern C { +#endif + +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_scan_class_start __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_scan_class_start"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_scan_class_end __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_scan_class_end"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_scan_class_size __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_scan_class_size"); + +#ifdef __cplusplus +} +#endif diff --git a/sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_scd.class.h b/sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_scd.class.h new file mode 100644 index 0000000..1d92d88 --- /dev/null +++ b/sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_scd.class.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern C { +#endif + +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_scd_class_start __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_scd_class_start"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_scd_class_end __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_scd_class_end"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_scd_class_size __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_scd_class_size"); + +#ifdef __cplusplus +} +#endif diff --git a/sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_seek.class.h b/sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_seek.class.h new file mode 100644 index 0000000..b75baa7 --- /dev/null +++ b/sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_seek.class.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern C { +#endif + +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_seek_class_start __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_seek_class_start"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_seek_class_end __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_seek_class_end"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_seek_class_size __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_cd_seek_class_size"); + +#ifdef __cplusplus +} +#endif diff --git a/sega/dreamcast/gdrom/GdromCommandPacketFormat_get_toc.class.h b/sega/dreamcast/gdrom/GdromCommandPacketFormat_get_toc.class.h new file mode 100644 index 0000000..d247ccc --- /dev/null +++ b/sega/dreamcast/gdrom/GdromCommandPacketFormat_get_toc.class.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern C { +#endif + +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_get_toc_class_start __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_get_toc_class_start"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_get_toc_class_end __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_get_toc_class_end"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_get_toc_class_size __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_get_toc_class_size"); + +#ifdef __cplusplus +} +#endif diff --git a/sega/dreamcast/gdrom/GdromCommandPacketFormat_req_error.class.h b/sega/dreamcast/gdrom/GdromCommandPacketFormat_req_error.class.h new file mode 100644 index 0000000..d3ec08c --- /dev/null +++ b/sega/dreamcast/gdrom/GdromCommandPacketFormat_req_error.class.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern C { +#endif + +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_error_class_start __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_error_class_start"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_error_class_end __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_error_class_end"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_error_class_size __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_error_class_size"); + +#ifdef __cplusplus +} +#endif diff --git a/sega/dreamcast/gdrom/GdromCommandPacketFormat_req_mode.class.h b/sega/dreamcast/gdrom/GdromCommandPacketFormat_req_mode.class.h new file mode 100644 index 0000000..e8c57e5 --- /dev/null +++ b/sega/dreamcast/gdrom/GdromCommandPacketFormat_req_mode.class.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern C { +#endif + +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_mode_class_start __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_mode_class_start"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_mode_class_end __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_mode_class_end"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_mode_class_size __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_mode_class_size"); + +#ifdef __cplusplus +} +#endif diff --git a/sega/dreamcast/gdrom/GdromCommandPacketFormat_req_ses.class.h b/sega/dreamcast/gdrom/GdromCommandPacketFormat_req_ses.class.h new file mode 100644 index 0000000..9b239d4 --- /dev/null +++ b/sega/dreamcast/gdrom/GdromCommandPacketFormat_req_ses.class.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern C { +#endif + +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_ses_class_start __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_ses_class_start"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_ses_class_end __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_ses_class_end"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_ses_class_size __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_ses_class_size"); + +#ifdef __cplusplus +} +#endif diff --git a/sega/dreamcast/gdrom/GdromCommandPacketFormat_req_stat.class.h b/sega/dreamcast/gdrom/GdromCommandPacketFormat_req_stat.class.h new file mode 100644 index 0000000..4568098 --- /dev/null +++ b/sega/dreamcast/gdrom/GdromCommandPacketFormat_req_stat.class.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern C { +#endif + +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_stat_class_start __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_stat_class_start"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_stat_class_end __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_stat_class_end"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_stat_class_size __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_req_stat_class_size"); + +#ifdef __cplusplus +} +#endif diff --git a/sega/dreamcast/gdrom/GdromCommandPacketFormat_set_mode.class.h b/sega/dreamcast/gdrom/GdromCommandPacketFormat_set_mode.class.h new file mode 100644 index 0000000..1d96b3b --- /dev/null +++ b/sega/dreamcast/gdrom/GdromCommandPacketFormat_set_mode.class.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern C { +#endif + +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_set_mode_class_start __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_set_mode_class_start"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_set_mode_class_end __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_set_mode_class_end"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_set_mode_class_size __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_set_mode_class_size"); + +#ifdef __cplusplus +} +#endif diff --git a/sega/dreamcast/gdrom/GdromCommandPacketFormat_test_unit.class.h b/sega/dreamcast/gdrom/GdromCommandPacketFormat_test_unit.class.h new file mode 100644 index 0000000..7dc7ff4 --- /dev/null +++ b/sega/dreamcast/gdrom/GdromCommandPacketFormat_test_unit.class.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern C { +#endif + +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_test_unit_class_start __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_test_unit_class_start"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_test_unit_class_end __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_test_unit_class_end"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_test_unit_class_size __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketFormat_test_unit_class_size"); + +#ifdef __cplusplus +} +#endif diff --git a/sega/dreamcast/gdrom/GdromCommandPacketInterface.class.h b/sega/dreamcast/gdrom/GdromCommandPacketInterface.class.h new file mode 100644 index 0000000..38800e3 --- /dev/null +++ b/sega/dreamcast/gdrom/GdromCommandPacketInterface.class.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern C { +#endif + +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketInterface_class_start __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketInterface_class_start"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketInterface_class_end __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketInterface_class_end"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromCommandPacketInterface_class_size __asm("_binary_sega_dreamcast_gdrom_GdromCommandPacketInterface_class_size"); + +#ifdef __cplusplus +} +#endif diff --git a/sega/dreamcast/gdrom/GdromCommandPacketInterface.java b/sega/dreamcast/gdrom/GdromCommandPacketInterface.java new file mode 100644 index 0000000..03b6351 --- /dev/null +++ b/sega/dreamcast/gdrom/GdromCommandPacketInterface.java @@ -0,0 +1,5 @@ +package sega.dreamcast.gdrom; + +public interface GdromCommandPacketInterface { + public int getByte(int ix); +} diff --git a/sega/dreamcast/gdrom/GdromProtocol.class.h b/sega/dreamcast/gdrom/GdromProtocol.class.h new file mode 100644 index 0000000..de7e6bf --- /dev/null +++ b/sega/dreamcast/gdrom/GdromProtocol.class.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern C { +#endif + +extern uint32_t _binary_sega_dreamcast_gdrom_GdromProtocol_class_start __asm("_binary_sega_dreamcast_gdrom_GdromProtocol_class_start"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromProtocol_class_end __asm("_binary_sega_dreamcast_gdrom_GdromProtocol_class_end"); +extern uint32_t _binary_sega_dreamcast_gdrom_GdromProtocol_class_size __asm("_binary_sega_dreamcast_gdrom_GdromProtocol_class_size"); + +#ifdef __cplusplus +} +#endif diff --git a/sega/dreamcast/gdrom/GdromProtocol.java b/sega/dreamcast/gdrom/GdromProtocol.java new file mode 100644 index 0000000..69849ce --- /dev/null +++ b/sega/dreamcast/gdrom/GdromProtocol.java @@ -0,0 +1,98 @@ +package sega.dreamcast.gdrom; + +import java.misc.Memory; +import sega.dreamcast.gdrom.GdromCommandPacketFormat; + +public class GdromProtocol { + static GdromCommandPacketFormat.get_toc get_toc_command; + static short[] toc_buf; + + static { + int single_density_area = 0; + int maximum_toc_length = 0x0198; + get_toc_command = new GdromCommandPacketFormat.get_toc(single_density_area, + maximum_toc_length); + + toc_buf = new short[maximum_toc_length >> 1]; + } + + public static void packetCommand(GdromCommandPacketInterface command, boolean enable_dma) { + while (true) { + int status = Memory.getU1(Gdrom.status); + if ((GdromBits.status__bsy(status) | GdromBits.status__drq(status)) == 0) + break; + } + + int features = enable_dma ? GdromBits.features__dma__enable : GdromBits.features__dma__disable; + Memory.putU1(Gdrom.features, features); + + int drive_select = GdromBits.drive_select__drive_select + | GdromBits.drive_select__lun(0); + Memory.putU1(Gdrom.drive_select, drive_select); + + Memory.putU1(Gdrom.command, GdromBits.command__code__packet_command); + + System.out.println("words:"); + for (int i = 0; i < 6; i++) { + int i0 = command.getByte(i * 2); + int i1 = command.getByte(i * 2 + 1); + // little endian + int word = ((i1 & 0xff) << 8) | (i0 & 0xff); + System.out.println(word); + Memory.putU2(Gdrom.data, word); + } + + while (true) { + int status = Memory.getU1(Gdrom.status); + if (GdromBits.status__bsy(status) == 0) + break; + } + } + + public static void readData(short[] buf, int length) { + for (int i = 0; i < (length >> 1); i++) { + buf[i] = (short)Memory.getU2(Gdrom.data); + } + } + + 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; + //int i3 = low & 0xff; + + return (i2 << 16) | (i1 << 8) | i0; + } + + public static int tocGetDataTrackFad() { + System.out.println("PacketCommand:"); + packetCommand(get_toc_command, false); // PIO mode + + int low = Memory.getU1(Gdrom.byte_count_low); + int high = Memory.getU1(Gdrom.byte_count_high); + int byte_count = ((high & 0xff) << 8) | (low & 0xff); + System.out.print("byte count:"); + System.out.println(byte_count); + + System.out.println("tracks:"); + readData(toc_buf, byte_count); + for (int i = 0; i < 99; i++) { + int fad = getFad(toc_buf, i); + if (fad == 0xffffff) + break; + System.out.print("["); + System.out.print(i); + System.out.print("] "); + System.out.println(fad); + } + + int status = Memory.getU1(Gdrom.status); + System.out.print("status: "); + System.out.println(status); + + // assume track 1 is the correct track + return getFad(toc_buf, 1); + } +}