ultimecia

A ps1 emulator in c
Log | Files | Refs

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 }