cdrom.c (2419B)
1 /* CDRom Drive */ 2 #include <stdlib.h> 3 #include <string.h> 4 #include <stdio.h> 5 6 #include "cdrom.h" 7 #include "util.h" 8 #include "interconnect.h" 9 10 extern Interconnect* inter; 11 12 cdrom* 13 cdrom_new(void) 14 { 15 cdrom* cd = (cdrom*)malloc(sizeof(cdrom)); 16 memset(cd, 0, sizeof(cdrom)); 17 return cd; 18 } 19 20 u8 21 cdrom_fifo_empty(fifo fifo) 22 { 23 return fifo.write_idx == fifo.read_idx; 24 } 25 26 u8 27 cdrom_fifo_full(fifo fifo) 28 { 29 return fifo.write_idx == (fifo.read_idx ^ 0x10); 30 } 31 32 /*void 33 cdrom_store8(cdrom* cd, u32 off, u8 val) 34 { 35 off &= 0x3; 36 37 }*/ 38 39 void 40 cdrom_write(cdrom* cd, u32 offset, u8 val) 41 { 42 printf("CDROM_WRITE: THE OFFSET IS %08X\n", offset); 43 printf("CDROM_WRITE: THE VAL IS %d\n", val); 44 45 u8 idx; 46 47 idx = cd->status & STATUS_INDEX_MASK; 48 49 switch (offset) { 50 case 0: 51 cd->status = val & 3; 52 break; 53 case 1: 54 fprintf(stderr, "offset 1\n"); 55 fprintf(stderr, "cd->status: %08X\n", cd->status); 56 57 cdrom_exec_cmd(cd, val); 58 break; 59 case 2: 60 cdrom_irq_write_mask(cd, val); 61 break; 62 case 3: 63 switch (idx) { 64 case 1: 65 cdrom_irq_ack(cd, val & 0x1f); 66 67 if ((val & 0x40) != 0) 68 memset(&cd->host_params, 0, sizeof(fifo)); 69 70 break; 71 default: 72 fprintf(stderr, "cdrom_write: Unimplemented write on offset %08X and index %08X\n", offset, idx); 73 exit(EXIT_FAILURE); 74 } 75 break; 76 default: 77 break; 78 } 79 80 return; 81 } 82 83 u8 84 cdrom_load(cdrom* cd, u32 offset) 85 { 86 printf("Offset %08X\n", offset); 87 88 switch (offset) { 89 case 0: 90 return cdrom_status(cd); 91 default: 92 break; 93 } 94 95 return 0; 96 } 97 98 void 99 cdrom_exec_cmd(cdrom* cd, u8 cmd) 100 { 101 // u32 ret; 102 103 switch ((cdrom_cmd)cmd) 104 { 105 case CDROM_CMD_GETSTAT: 106 fprintf(stderr, "Not implemented TEST COMMAND"); 107 cd->status = cdrom_status(cd); 108 break; 109 case CDROM_CMD_TEST: 110 fprintf(stderr, "Not implemented TEST COMMAND"); 111 break; 112 default: 113 fprintf(stderr, "ERR: Unimplemented command -> %02X\n", cmd); 114 break; 115 } 116 117 return; 118 } 119 120 void 121 cdrom_irq_ack(cdrom* cd, u8 val) 122 { 123 // TODO 124 cd->irq_flags &= val; 125 } 126 127 void 128 cdrom_irq_write_mask(cdrom* cd, u8 val) 129 { 130 if ((val & 0x18) != 0) 131 fprintf(stderr, "WARNING: Unhandled IRQ Mask: %02X\n", val); 132 133 cd->irq_mask = val & 0x1f; 134 } 135 136 u8 137 cdrom_status(cdrom* cd) 138 { 139 u8 S = cd->status; 140 141 S |= 0 << 2; 142 143 S |= cdrom_fifo_empty(cd->host_params) << 3; 144 S |= !cdrom_fifo_full(cd->host_params) << 4; 145 S |= !cdrom_fifo_full(cd->host_response) << 5; 146 147 S |= (cd->rx_index < cd->rx_len) << 6; 148 149 // BLOCKING 150 S |= 0 << 7;/* cd-rom->sub_cpu.busy() << 7; */ 151 152 return S; 153 }