1. module gd_emu (mclock,
  2.                     gd_data, gd_addr, gd_rd_n, gd_wr_n, gd_dma_rq, gd_dma_ack, gd_int_rq, gd_iordy, gd_cs, gd_rst,  // GD-Rom stuff.
  3.                     gd_cdlrck, gd_cdda_clk, gd_cdbck,   // CDDA stuff (missing CDSD atm).
  4.                     cf_data, cf_addr, cf_rd_n, cf_wr_n, cf_dma_rq, cf_dma_ack,  // Onboard IDE / CF Card.
  5.                     led);
  6.  
  7.  
  8.     input wire mclock;      // Master clock input
  9.  
  10.     reg [15:0] cf_data_write;
  11.  
  12.     inout [15:0] cf_data;       // Hard drive / CF card data port (bidir).
  13.     assign cf_data = !cf_wr_n ? cf_data_write : 16'bz;  // Output data to IDE when "cf_wr_n" is low.
  14.                                                             // (force to High-Z if "cf_rd_n" is low too).
  15.  
  16.     output reg [2:0] cf_addr;   // IDE address bits.
  17. //  output reg [1:0] cf_cs;     // IDE "Chip-Select" bits. NOTE: The MSB is labelled CS3 on many specs!
  18.                                 // (Note: CS pins are hard-tied on Nemesis board. OzOnE).
  19.     output reg cf_rd_n;         // IDE Read (active low).
  20.     output reg cf_wr_n;         // IDE Write (active low).
  21.  
  22.     input cf_dma_rq;            // IDE DMA ReQuest input.
  23.     output reg cf_dma_ack;      // IDE DMA ACKnowledge output.
  24.    
  25.     reg [23:0] cf_hold_time;    // (for holding Read or Write pin state for a set time).
  26.  
  27. //  reg gd_rd_n_1, gd_rd_n_2;
  28. //  reg gd_wr_n_1, gd_wr_n_2;
  29. //  reg gd_rst_1, gd_rst_2;
  30.  
  31.     reg [15:0] gd_data_write;
  32.  
  33.     inout wire [15:0] gd_data/* synthesis noprune */;
  34.     assign gd_data = 16'bz;                             // !! GD-Rom drive Spy mode !!
  35.  
  36. //  inout wire gd_data = !gd_wr_n ? gd_data_write : 16'bz;  // !! GD-Rom emu mode !!
  37.  
  38.     reg gd_wr_n_1;  // Flip-flops for detecting edges.
  39.     reg gd_wr_n_2;
  40.     reg gd_rd_n_1;
  41.     reg gd_rd_n_2;
  42.    
  43.     wire gd_wr_rising = gd_wr_n_1 & ~gd_wr_n_2;
  44.     wire gd_rd_rising = gd_rd_n_1 & ~gd_rd_n_2;
  45.    
  46.     input wire [2:0] gd_addr/* synthesis noprune */;    // !! GD-Rom drive Spy mode !!
  47.     input wire gd_rd_n/* synthesis noprune */;
  48.     input wire gd_wr_n/* synthesis noprune */;
  49.     input wire gd_dma_rq/* synthesis noprune */;
  50.     input wire gd_dma_ack/* synthesis noprune */;
  51.     input wire gd_int_rq/* synthesis noprune */;
  52.     input wire gd_iordy/* synthesis noprune */;
  53.     input wire [1:0] gd_cs/* synthesis noprune */;
  54.     input wire gd_rst/* synthesis noprune */;
  55.    
  56.     input wire gd_cdlrck/* synthesis noprune */;
  57.     input wire gd_cdda_clk/* synthesis noprune */;
  58.     input wire gd_cdbck/* synthesis noprune */;
  59.  
  60.     output wire led = !gd_dma_ack;
  61.    
  62.     reg [7:0] cf_sec_count;
  63.  
  64.     reg [31:0] cf_lba;
  65.     wire [7:0] cf_lba3 = cf_lba[31:24] | 8'hE0; // Need to BITWISE OR the top LBA byte with 0xE0 (use 0xE0 mask to select MASTER drive).
  66.     wire [7:0] cf_lba2 = cf_lba[23:16];
  67.     wire [7:0] cf_lba1 = cf_lba[15:8];
  68.     wire [7:0] cf_lba0 = cf_lba[7:0];
  69.    
  70.     reg [7:0] cf_wordcount;
  71.    
  72.     reg [9:0] gd_state;
  73.     reg [15:0] ata_cmd;
  74.    
  75.     reg [15:0] gd_ata_cmd;
  76.  
  77.     reg [15:0] packet_1/* synthesis noprune */;
  78.     reg [15:0] packet_2/* synthesis noprune */;
  79.     reg [15:0] packet_3/* synthesis noprune */;
  80.     reg [15:0] packet_4/* synthesis noprune */;
  81.     reg [15:0] packet_5/* synthesis noprune */;
  82.     reg [15:0] packet_6/* synthesis noprune */;
  83.  
  84.     wire [7:0] packet_0b = packet_1[7:0]/* synthesis noprune */;
  85.     wire [7:0] packet_1b = packet_1[15:8]/* synthesis noprune */;
  86.     wire [7:0] packet_2b = packet_2[7:0]/* synthesis noprune */;
  87.     wire [7:0] packet_3b = packet_2[15:8]/* synthesis noprune */;
  88.     wire [7:0] packet_4b = packet_3[7:0]/* synthesis noprune */;
  89.     wire [7:0] packet_5b = packet_3[15:8]/* synthesis noprune */;
  90.     wire [7:0] packet_6b = packet_4[7:0]/* synthesis noprune */;
  91.     wire [7:0] packet_7b = packet_4[15:8]/* synthesis noprune */;
  92.     wire [7:0] packet_8b = packet_5[7:0]/* synthesis noprune */;
  93.     wire [7:0] packet_9b = packet_5[15:8]/* synthesis noprune */;
  94.     wire [7:0] packet_10b = packet_6[7:0]/* synthesis noprune */;
  95.     wire [7:0] packet_11b = packet_6[15:8]/* synthesis noprune */;
  96.    
  97.     reg [11:0] gd_sector_type/* synthesis noprune */;   // No point wasting bits! (OzOnE).
  98.     reg [31:0] gd_start_sector/* synthesis noprune */;
  99.     reg [31:0] gd_sector_count/* synthesis noprune */;
  100.    
  101.     reg [3:0] gd_status;        // Only using nibble!
  102.     reg [3:0] gd_discformat;    // Only using nibble!
  103.     reg [3:0] cdda_repeats;     // Only using nibble!
  104.    
  105.     reg [23:0] cdda_curraddr;   // Using full three bytes together (need to part select when needed). OzOnE.
  106.    
  107.     reg [7:0] gd_stat [0:9];    // Array of bytes for sending status back.
  108.    
  109.     reg [9:0] reply_rom_addr;
  110.    
  111.     reg toc_density/* synthesis noprune */;
  112.     reg [15:0] toc_bytes/* synthesis noprune */;
  113.     reg [15:0] toc_byte_count/* synthesis noprune */;
  114.  
  115. // ATA Commands
  116. parameter ATA_NOP =         8'h00;
  117. parameter ATA_SOFT_RESET =  8'h08;
  118. parameter ATA_EXEC_DIAG =   8'h90;
  119. parameter ATA_SPI_PACKET =  8'hA0;
  120. parameter ATA_IDENTIFY_DEV = 8'hA1;
  121. parameter ATA_SET_FEATURES = 8'hEF;
  122.  
  123. // SPI Packet Commands
  124. parameter SPI_TEST_UNIT =   8'h00;
  125. parameter SPI_REQ_STAT =    8'h10;
  126. parameter SPI_REQ_MODE =    8'h11;
  127. parameter SPI_SET_MODE =    8'h12;
  128. parameter SPI_REQ_ERROR =   8'h13;
  129. parameter SPI_GET_TOC =     8'h14;
  130. parameter SPI_REQ_SES =     8'h15;
  131. parameter SPI_CD_OPEN =     8'h16;
  132. parameter SPI_CD_PLAY =     8'h20;
  133. parameter SPI_CD_SEEK =     8'h21;
  134. parameter SPI_CD_SCAN =     8'h22;
  135. parameter SPI_CD_READ =     8'h30;
  136. parameter SPI_CD_READ2 =    8'h31;
  137. parameter SPI_GET_SCD =     8'h40;
  138.  
  139. initial begin
  140.     gd_state <= 10'd0;
  141.     ata_cmd <= 8'h0;
  142. //  led <= 1'b0;
  143.  
  144.     reply_rom_addr <= 10'h00;
  145.  
  146.     cf_addr <= 3'h00;   // Zero IDE address (not really necessary).
  147. //  cf_cs <= 2'b10;     // IDE CS3 = HIGH, IDE CS1 = LOW (tied on Nemesis board anyway)
  148.     cf_dma_ack <= 1'b1; // De-assert DMA ACKnowledge (active low).
  149.    
  150.     cf_rd_n <= 1'b1;        // De-assert IDE Read at power up!
  151.     cf_wr_n <= 1'b1;        // De-assert IDE WRite at power up!
  152.     end
  153.  
  154.  
  155. always @(posedge mclock) begin
  156.     gd_wr_n_1 <= gd_wr_n;
  157.     gd_wr_n_2 <= gd_wr_n_1;
  158.  
  159.     gd_rd_n_1 <= gd_rd_n;
  160.     gd_rd_n_2 <= gd_rd_n_1;
  161.  
  162.     case (gd_state)
  163.         0: if (gd_addr == 3'd7 && gd_wr_rising) begin  // If in COMMAND reg on RISING edge of "gd_wr_n"...
  164.                 gd_ata_cmd <= gd_data;
  165.                 gd_state <= 10'd2;
  166.         end
  167.  
  168. //      1: gd_state <= 10'd2;   // Spare.
  169.  
  170.         2: begin
  171.             case (gd_ata_cmd[7:0])
  172.                 ATA_NOP: gd_state <= 10'd0;             // Unhandled? (as yet). OzOnE
  173.  
  174.                 ATA_SOFT_RESET: gd_state <= 10'd0;      // Unhandled (as yet). OzOnE
  175.  
  176.                 ATA_EXEC_DIAG: gd_state <= 10'd0;       // Unhandled (as yet) - not implemented on nullDC anyway. OzOnE
  177.  
  178.                 ATA_SPI_PACKET:                                 // PACKET command! (Sega type, duh!)
  179.                     if (gd_addr == 3'd0 && gd_wr_rising) begin  // If in DATA reg on RISING edge of "gd_wr_n"...
  180.                         packet_1 <= gd_data;                    // Grab packet WORD 1.
  181.                         gd_state <= 10'd3;
  182.                         end
  183.  
  184.                 ATA_IDENTIFY_DEV: gd_state <= 10'd0;    // Unhandled (as yet) - don't think it ever gets called by my DC BIOS? OzOnE
  185.  
  186.                 ATA_SET_FEATURES: gd_state <= 10'd0;    // Unhandled (as yet). OzOnE
  187.  
  188.             default: gd_state <= 10'd0;     // Unhandled ATA command, back to idle.
  189.             endcase
  190.         end
  191.            
  192.         3: if (gd_addr == 3'd0 && gd_wr_rising) begin
  193.                 packet_2 <= gd_data;                    // Grab packet WORD 2.
  194.                 gd_state <= 10'd4;
  195.         end
  196.  
  197.        
  198.         4: if (gd_addr == 3'd0 && gd_wr_rising) begin
  199.                 packet_3 <= gd_data;                    // Grab packet WORD 3.
  200.                 gd_state <= 10'd5;
  201.         end
  202.  
  203.         5: if (gd_addr == 3'd0 && gd_wr_rising) begin
  204.                 packet_4 <= gd_data;                    // Grab packet WORD 4.
  205.                 gd_state <= 10'd6;
  206.         end
  207.  
  208.         6: if (gd_addr == 3'd0 && gd_wr_rising) begin
  209.                 packet_5 <= gd_data[7:0];               // Grab packet WORD 5.
  210.                 gd_state <= 10'd7;
  211.         end
  212.  
  213.         7: if (gd_addr == 3'd0 && gd_wr_rising) begin
  214.                 packet_6 <= gd_data[7:0];               // Grab packet WORD 6.
  215.                 gd_state <= 10'd8;
  216.         end
  217.  
  218.         8: begin                                // ** Process SPI (Sega) command packet **
  219.             case (packet_0b)                    // <- (byte addressing starts at zero!)
  220.  
  221.                 SPI_TEST_UNIT: gd_state <= 10'd0;   // Unhandled (as yet). OzOnE
  222.  
  223.                 SPI_REQ_STAT: begin
  224.                     gd_stat[0] <= {4'b0, gd_status};    // Status is low nibble (force top bits to zero).
  225.                     gd_stat[1] <= {gd_discformat, cdda_repeats};
  226.                     gd_stat[2] <= 8'h04;                // ? This is what nullDC does?
  227.                     gd_stat[3] <= 8'd02;                // TNO
  228.                     gd_stat[4] <= 8'd00;                // X
  229.                     gd_stat[5] <= cdda_curraddr[23:16]; // Current FAD (MSB?)
  230.                     gd_stat[6] <= cdda_curraddr[15:8];  // Current FAD
  231.                     gd_stat[7] <= cdda_curraddr[7:0];   // Current FAD (LSB?)
  232.                     gd_stat[8] <= 8'd00;                // Max Read Error Retry Times.
  233.                     gd_stat[9] <= 8'd00;                // All bits zeros.
  234.                    
  235.                                                         // *** TODO - SORT OUT PIO WORD OUTPUT !! ***
  236.                
  237.                     gd_state <= 10'd0;
  238.                 end
  239.  
  240.                 SPI_REQ_MODE: gd_state <= 10'd0;    // Unhandled (as yet). OzOnE
  241.  
  242.                 SPI_SET_MODE: gd_state <= 10'd0;    // Unhandled (as yet). OzOnE
  243.  
  244.                 SPI_REQ_ERROR: gd_state <= 10'd0;   // Unhandled (as yet). OzOnE
  245.  
  246.                 SPI_GET_TOC: begin
  247.                     toc_density <= packet_1b[0];            // Request TOC from Single-density area (0) or Double-density area (1).
  248.                     toc_bytes <= {packet_3b, packet_4b};    // Allocation length in bytes, usually 0x198 (408 bytes).
  249.                     gd_state <= 10'd0;
  250.                 end
  251.  
  252.                 8'h70: gd_state <= 10'd0;           // Unhandled (as yet). OzOnE
  253.  
  254.                 8'h71: gd_state <= 10'd0;           // Unhandled (as yet). OzOnE
  255.  
  256.                 SPI_REQ_SES: gd_state <= 10'd0;     // Unhandled (as yet). OzOnE
  257.  
  258.                 SPI_CD_OPEN: gd_state <= 10'd0;     // Unhandled (as yet). OzOnE
  259.  
  260.                 SPI_CD_PLAY: gd_state <= 10'd0;     // Unhandled (as yet). OzOnE
  261.  
  262.                 SPI_CD_SEEK: gd_state <= 10'd0;     // Unhandled (as yet). OzOnE
  263.  
  264.                 SPI_CD_SCAN: gd_state <= 10'd0;     // Unhandled (as yet). OzOnE
  265.  
  266.                 SPI_CD_READ: begin
  267.                     if (packet_1b[7]==1 && packet_1b[6]==1 && packet_1b[5]==1 && packet_1b[3:1]==3 && packet_1b[4]==0) gd_sector_type <= 12'd2340;
  268.                     else gd_sector_type <= 12'd2048;
  269.                    
  270.                     if (packet_1b[0]) begin // If "parameter type" == 1 (MSF)...
  271.                         gd_start_sector <= (packet_2b*60*75<<16) | (packet_3b*75<<8) | (packet_4b[2]);
  272.                     end else
  273.                         gd_start_sector <= (packet_2b<<16) | (packet_3b<<8) | (packet_4b);
  274.                    
  275.                     gd_sector_count = (packet_8b<<16) | (packet_9b<<8) | (packet_10b);
  276.                    
  277.                     gd_state <= 10'd0;
  278.                 end
  279.  
  280.                 SPI_CD_READ2: gd_state <= 10'd0;    // Unhandled (as yet). OzOnE
  281.  
  282.                 SPI_GET_SCD: gd_state <= 10'd0;     // Unhandled (as yet). OzOnE
  283.  
  284.             default:  gd_state <= 10'd0;    // Unhandled SPI command, back to idle.
  285.             endcase
  286.         end
  287.  
  288.  
  289.     default: gd_state <= 10'd0; // Shouldn't ever get a wrong state here, but just in case.
  290.     endcase
  291. end
  292.  
  293. wire [15:0] reply_rom_data;
  294.  
  295. reply_rom   reply_rom_inst (
  296.     .address ( reply_rom_addr ),
  297.     .clock ( mclock ),
  298.     .q ( reply_rom_data )
  299.     );
  300.  
  301. endmodule
  302.  
  303.