ultimecia

A ps1 emulator in c
Log | Files | Refs

cdrom.h (2193B)


      1 #pragma once
      2 #include "types.h"
      3 
      4 enum {
      5  cdrom_raw_sector_size = 2352,
      6  cdrom_data_sector_size = 2048,
      7  cdrom_sector_sync_size = 12,
      8  cdrom_sector_header_size = 4,
      9  cdrom_mode1_header_size = 4,
     10  cdrom_mode2_header_size = 12,
     11  cdrom_mode2_data_sector_size = 2336, 
     12  cdrom_frames_per_second = 75,       
     13  cdrom_seconds_per_minute = 60,
     14  cdrom_frames_per_minute = cdrom_frames_per_second * cdrom_seconds_per_minute,
     15  cdrom_subchannel_bytes_per_frame = 12,
     16  cdrom_lead_out_sector_count = 6750,
     17  cdrom_all_subcode_size = 96,
     18  cdrom_audio_sample_rate = 44100,
     19  cdrom_audio_channels = 2
     20 };
     21 
     22 typedef struct {
     23 	u8 buffer[16];
     24     u8 write_idx;
     25     u8 read_idx;
     26 } fifo;
     27 
     28 typedef enum {
     29 	CDROM_CMD_SYNC = 0x00,
     30 	CDROM_CMD_GETSTAT = 0x01,
     31 	CDROM_CMD_SETLOC = 0x02,
     32 	CDROM_CMD_TEST = 0x19,
     33 	CDROM_CMD_INIT = 0xA
     34 } cdrom_cmd;
     35 
     36 #define STATUS_INDEX_MASK    0x03
     37 #define STATUS_ADPBUSY_MASK  0x04
     38 #define STATUS_PRMEMPT_MASK  0x08
     39 #define STATUS_PRMWRDY_MASK  0x10
     40 #define STATUS_RSLRRDY_MASK  0x20
     41 #define STATUS_DRQSTS_MASK   0x40
     42 #define STATUS_BUSYSTS_MASK  0x80
     43 
     44 typedef enum {
     45 	CDROM_IRQ_NOINTR,		/* No interrupt */
     46 	CDROM_IRQ_DATAREADY,	/* Data Read */
     47 	CDROM_IRQ_ACKNOWLEGE,	/* Command Complete */
     48 	CDROM_IRQ_COMPLETE,		/* Acknowledge */
     49 	CDROM_IRQ_DATAEND,		/* End of data detected */
     50 	CDROM_IRQ_DISKERROR	/* Error detected */
     51 } cdrom_irq_type;
     52 
     53 /* 4 memory-mapped registers. 
     54    First of 'em has an index that dictates how the others behave.
     55 */
     56 typedef struct cdrom {
     57 	u8 status; /* Status Register */
     58 
     59 	/* Command parameter FIFO */
     60 	fifo host_params;
     61 	fifo host_response;
     62 
     63 	cdrom_cmd command;
     64 	u8 irq_flags;
     65 	u8 irq_mask;
     66 
     67 	u8 rx_index;
     68 	u8 rx_len;
     69 
     70 	u8 sb[2340];
     71 	u32 SB_in;
     72 } cdrom;
     73 
     74 cdrom* cdrom_new(void);
     75 
     76 void cdrom_store8(cdrom*, u32, u8);
     77 void cdrom_store16(cdrom*, u32, u16);
     78 void cdrom_store32(cdrom*, u32, u32);
     79 void cdrom_write(cdrom*, u32, u8);
     80 u8 cdrom_load(cdrom*, u32);
     81 
     82 void cdrom_load8(cdrom*, u8);
     83 void cdrom_load16(cdrom*, u16);
     84 void cdrom_load32(cdrom*, u32);
     85 u8	 cdrom_status(cdrom*);
     86 
     87 u8 	 cdrom_fifo_empty(fifo);
     88 u8 	 cdrom_fifo_full(fifo);
     89 u8 	 cdrom_fifo_push(void);
     90 
     91 void cdrom_exec_cmd(cdrom*, u8);
     92 void cdrom_irq_ack(cdrom*, u8);
     93 void cdrom_irq_write_mask(cdrom*, u8);