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);