annotate cdd_mcu.c @ 2065:02a9846668d1 segacd

Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
author Michael Pavone <pavone@retrodev.com>
date Sat, 29 Jan 2022 17:43:37 -0800
parents 91e4d2fe5cd9
children f22e04b69272
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1 #include "cdd_mcu.h"
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
2 #include "backend.h"
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
3
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
4 #define SCD_MCLKS 50000000
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
5 #define CD_BLOCK_CLKS 16934400
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
6 #define CDD_MCU_DIVIDER 8
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
7 #define SECTOR_CLOCKS (CD_BLOCK_CLKS/75)
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
8 #define NIBBLE_CLOCKS (CDD_MCU_DIVIDER * 77)
2062
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
9 #define BYTE_CLOCKS (SECTOR_CLOCKS/2352) // 96
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
10
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
11 //lead in start max diameter 46 mm
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
12 //program area start max diameter 50 mm
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
13 //difference 4 mm = 4000 um
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
14 //radius difference 2 mm = 2000 um
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
15 //track pitch 1.6 um
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
16 //1250 physical tracks in between
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
17 //linear speed 1.2 m/s - 1.4 m/s
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
18 // 1.3 m = 1300 mm
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
19 // circumference at 46 mm ~ 144.51 mm
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
20 // circumference at 50 mm ~ 157.08 mm
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
21 // avg is 150.795
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
22 // 75 sectors per second
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
23 // 17.3333 mm "typical" length of a sector
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
24 // ~8.7 sectors per track in lead-in area
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
25 #define LEADIN_SECTORS 10875
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
26
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
27 static uint32_t cd_block_to_mclks(uint32_t cycles)
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
28 {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
29 return ((uint64_t)cycles) * ((uint64_t)SCD_MCLKS) / ((uint64_t)CD_BLOCK_CLKS);
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
30 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
31
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
32 static uint32_t mclks_to_cd_block(uint32_t cycles)
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
33 {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
34 return ((uint64_t)cycles) * ((uint64_t)CD_BLOCK_CLKS) / ((uint64_t)SCD_MCLKS);
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
35 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
36
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
37 void cdd_mcu_init(cdd_mcu *context, system_media *media)
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
38 {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
39 context->next_int_cycle = CYCLE_NEVER;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
40 context->last_subcode_cycle = CYCLE_NEVER;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
41 context->last_nibble_cycle = CYCLE_NEVER;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
42 context->requested_format = SF_NOTREADY;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
43 context->media = media;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
44 context->current_status_nibble = -1;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
45 context->current_cmd_nibble = -1;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
46 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
47
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
48 enum {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
49 GAO_CDD_CTRL,
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
50 GAO_CDD_STATUS,
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
51 GAO_CDD_CMD = GAO_CDD_STATUS+5
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
52 };
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
53
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
54 static uint8_t checksum(uint8_t *vbuffer)
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
55 {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
56 uint8_t *buffer = vbuffer;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
57 uint8_t sum = 0;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
58 for (int i = 0; i < 9; i++)
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
59 {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
60 sum += buffer[i];
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
61 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
62 return (~sum) & 0xF;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
63 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
64 #define SEEK_SPEED 2200 //made up number
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
65 static void handle_seek(cdd_mcu *context)
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
66 {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
67 if (context->seeking) {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
68 if (context->seek_pba == context->head_pba) {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
69 context->seeking = 0;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
70 } else if (context->seek_pba > context->head_pba) {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
71 context->head_pba += SEEK_SPEED;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
72 if (context->head_pba > context->seek_pba) {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
73 context->head_pba = context->seek_pba;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
74 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
75 } else {
2064
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
76 if (context->head_pba >= SEEK_SPEED) {
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
77 context->head_pba -= SEEK_SPEED;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
78 } else {
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
79 context->head_pba = 0;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
80 }
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
81 if (context->head_pba < context->seek_pba) {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
82 context->head_pba = context->seek_pba;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
83 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
84 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
85 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
86 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
87
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
88 static void lba_to_status(cdd_mcu *context, uint32_t lba)
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
89 {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
90 uint32_t seconds = lba / 75;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
91 uint32_t frames = lba % 75;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
92 uint32_t minutes = seconds / 60;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
93 seconds = seconds % 60;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
94 context->status_buffer.b.time.min_high = minutes / 10;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
95 context->status_buffer.b.time.min_low = minutes % 10;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
96 context->status_buffer.b.time.sec_high = seconds / 10;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
97 context->status_buffer.b.time.sec_low = seconds % 10;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
98 context->status_buffer.b.time.frame_high = frames / 10;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
99 context->status_buffer.b.time.frame_low = frames % 10;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
100 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
101
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
102 static void update_status(cdd_mcu *context)
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
103 {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
104 switch (context->status)
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
105 {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
106 case DS_PLAY:
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
107 handle_seek(context);
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
108 if (!context->seeking) {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
109 context->head_pba++;
2062
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
110 uint32_t lba = context->head_pba - LEADIN_SECTORS;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
111 for (uint32_t i = 0; i < context->media->num_tracks; i++)
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
112 {
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
113 if (lba < context->media->tracks[i].fake_pregap) {
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
114 context->in_fake_pregap = 1;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
115 break;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
116 }
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
117 lba -= context->media->tracks[i].fake_pregap;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
118 if (lba < context->media->tracks[i].start_lba) {
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
119 context->in_fake_pregap = 1;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
120 break;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
121 }
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
122 if (lba < context->media->tracks[i].end_lba) {
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
123 fseek(context->media->f, lba * 2352, SEEK_SET);
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
124 context->in_fake_pregap = 0;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
125 break;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
126 }
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
127 }
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
128 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
129 break;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
130 case DS_PAUSE:
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
131 handle_seek(context);
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
132 break;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
133 case DS_TOC_READ:
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
134 handle_seek(context);
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
135 if (!context->seeking) {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
136 context->head_pba++;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
137 if (context->media && context->media->type == MEDIA_CDROM && context->media->num_tracks) {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
138 if (context->head_pba > 3*context->media->num_tracks + 1) {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
139 context->toc_valid = 1;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
140 context->seeking = 1;
2062
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
141 context->seek_pba = LEADIN_SECTORS + context->media->tracks[0].start_lba;
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
142 context->status = DS_PAUSE;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
143 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
144
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
145 } else {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
146 context->status = DS_NO_DISC;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
147 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
148 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
149 break;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
150
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
151 }
2064
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
152 if (context->first_cmd_received) {
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
153 switch (context->requested_format)
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
154 {
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
155 case SF_ABSOLUTE:
2065
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
156 if (context->toc_valid && context->head_pba >= LEADIN_SECTORS) {
2064
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
157 lba_to_status(context, context->head_pba - LEADIN_SECTORS);
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
158 context->status_buffer.format = SF_ABSOLUTE;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
159 } else {
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
160 context->status_buffer.format = SF_NOTREADY;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
161 }
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
162 break;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
163 case SF_RELATIVE:
2065
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
164 if (context->toc_valid && context->head_pba >= LEADIN_SECTORS) {
2064
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
165 uint32_t lba =context->head_pba - LEADIN_SECTORS;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
166 for (uint32_t i = 0; i < context->media->num_tracks; i++)
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
167 {
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
168 if (lba < context->media->tracks[i].end_lba) {
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
169 if (context->media->tracks[i].fake_pregap) {
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
170 if (lba > context->media->tracks[i].fake_pregap) {
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
171 lba -= context->media->tracks[i].fake_pregap;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
172 } else {
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
173 //relative time counts down to 0 in pregap
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
174 lba = context->media->tracks[i].fake_pregap - lba;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
175 break;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
176 }
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
177 }
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
178 if (lba < context->media->tracks[i].start_lba) {
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
179 //relative time counts down to 0 in pregap
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
180 lba = context->media->tracks[i].start_lba - lba;
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
181 } else {
2064
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
182 lba -= context->media->tracks[i].start_lba;
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
183 }
2064
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
184 break;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
185 } else if (context->media->tracks[i].fake_pregap) {
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
186 lba -= context->media->tracks[i].fake_pregap;
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
187 }
2064
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
188 }
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
189 lba_to_status(context, lba);
2065
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
190 context->status_buffer.format = SF_RELATIVE;
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
191 } else {
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
192 context->status_buffer.format = SF_NOTREADY;
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
193 }
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
194 break;
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
195 case SF_TRACK:
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
196 if (context->toc_valid && context->head_pba >= LEADIN_SECTORS) {
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
197 uint32_t lba =context->head_pba - LEADIN_SECTORS;
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
198 uint32_t i;
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
199 for (i = 0; i < context->media->num_tracks; i++)
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
200 {
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
201 if (lba < context->media->tracks[i].end_lba) {
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
202 if (context->media->tracks[i].fake_pregap) {
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
203 if (lba > context->media->tracks[i].fake_pregap) {
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
204 lba -= context->media->tracks[i].fake_pregap;
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
205 } else {
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
206 //relative time counts down to 0 in pregap
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
207 lba = context->media->tracks[i].fake_pregap - lba;
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
208 break;
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
209 }
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
210 }
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
211 if (lba < context->media->tracks[i].start_lba) {
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
212 //relative time counts down to 0 in pregap
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
213 lba = context->media->tracks[i].start_lba - lba;
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
214 } else {
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
215 lba -= context->media->tracks[i].start_lba;
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
216 }
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
217 break;
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
218 } else if (context->media->tracks[i].fake_pregap) {
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
219 lba -= context->media->tracks[i].fake_pregap;
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
220 }
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
221 }
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
222 context->status_buffer.b.track.track_high = (i + 1) / 10;
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
223 context->status_buffer.b.track.track_low = (i + 1) % 10;
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
224 if (context->media->tracks[i].type == TRACK_DATA) {
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
225 context->status_buffer.b.track.control = 4;
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
226 } else {
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
227 //TODO: pre-emphasis flag
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
228 //TODO: copy permitted flag
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
229 context->status_buffer.b.track.control = 0;
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
230 }
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
231 context->status_buffer.b.track.adr = 1;
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
232 context->status_buffer.format = SF_TRACK;
2064
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
233 } else {
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
234 context->status_buffer.format = SF_NOTREADY;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
235 }
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
236 break;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
237 case SF_TOCO:
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
238 if (context->toc_valid) {
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
239 uint32_t total_fake_pregap = 0;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
240 for (uint32_t i = 0; i < context->media->num_tracks; i++)
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
241 {
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
242 total_fake_pregap += context->media->tracks[i].fake_pregap;
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
243 }
2064
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
244 lba_to_status(context, context->media->tracks[context->media->num_tracks - 1].end_lba + total_fake_pregap);
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
245 context->status_buffer.format = SF_TOCO;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
246 } else {
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
247 context->status_buffer.format = SF_NOTREADY;
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
248 }
2064
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
249 break;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
250 case SF_TOCT:
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
251 if (context->toc_valid) {
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
252 context->status_buffer.b.toct.first_track_high = 0;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
253 context->status_buffer.b.toct.first_track_low = 1;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
254 context->status_buffer.b.toct.last_track_high = (context->media->num_tracks + 1) / 10;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
255 context->status_buffer.b.toct.last_track_low = (context->media->num_tracks + 1) % 10;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
256 context->status_buffer.b.toct.version = 0;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
257 context->status_buffer.format = SF_TOCT;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
258 } else {
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
259 context->status_buffer.format = SF_NOTREADY;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
260 }
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
261 break;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
262 case SF_TOCN:
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
263 if (context->toc_valid) {
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
264 uint32_t lba = context->media->tracks[context->requested_track - 1].start_lba;
2065
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
265 for (uint32_t i = 0; i < context->requested_track; i++) {
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
266 lba += context->media->tracks[i].fake_pregap;
2064
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
267 }
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
268 lba_to_status(context, lba);
2065
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
269 if (context->media->tracks[context->requested_track - 1].type == TRACK_DATA) {
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
270 context->status_buffer.b.tocn.frame_low |= 0x80;
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
271 }
2064
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
272 context->status_buffer.b.tocn.track_low = context->requested_track % 10;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
273 context->status_buffer.format = SF_TOCN;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
274 } else {
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
275 context->status_buffer.format = SF_NOTREADY;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
276 }
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
277 break;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
278 case SF_NOTREADY:
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
279 memset(&context->status_buffer, 0, sizeof(context->status_buffer) - 1);
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
280 context->status_buffer.format = SF_NOTREADY;
2064
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
281 break;
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
282 }
2064
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
283 if (context->error_status == DS_STOP) {
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
284 if (context->requested_format >= SF_TOCO && context->requested_format <= SF_TOCN) {
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
285 context->status_buffer.status = DS_TOC_READ;
2065
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
286 } else if (context->seeking) {
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
287 context->status_buffer.status = DS_SEEK;
2064
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
288 } else {
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
289 context->status_buffer.status = context->status;
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
290 }
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
291 } else {
2064
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
292 context->status_buffer.status = context->error_status;
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
293 context->status_buffer.format = SF_NOTREADY;
2064
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
294 context->error_status = DS_STOP;
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
295 }
2064
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
296 if (context->requested_format != SF_TOCN) {
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
297 context->status_buffer.b.time.flags = 1; //TODO: populate these
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
298 }
2064
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
299 } else {
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
300 // Did not receive our first command so just send zeroes
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
301 memset(&context->status_buffer, 0, sizeof(context->status_buffer) - 1);
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
302 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
303 context->status_buffer.checksum = checksum((uint8_t *)&context->status_buffer);
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
304 if (context->status_buffer.format != SF_NOTREADY) {
2062
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
305 printf("CDD Status %X%X.%X%X%X%X%X%X.%X%X\n",
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
306 context->status_buffer.status, context->status_buffer.format,
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
307 context->status_buffer.b.time.min_high, context->status_buffer.b.time.min_low,
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
308 context->status_buffer.b.time.sec_high, context->status_buffer.b.time.sec_low,
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
309 context->status_buffer.b.time.frame_high, context->status_buffer.b.time.frame_low,
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
310 context->status_buffer.b.time.flags, context->status_buffer.checksum
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
311 );
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
312 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
313 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
314
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
315 static void run_command(cdd_mcu *context)
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
316 {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
317 uint8_t check = checksum((uint8_t*)&context->cmd_buffer);
2064
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
318 printf("cmd %X, checksum: %X, calc: %X\n", context->cmd_buffer.cmd_type, context->cmd_buffer.checksum, check);
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
319 if (check != context->cmd_buffer.checksum) {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
320 context->error_status = DS_SUM_ERROR;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
321 return;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
322 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
323 if (context->cmd_buffer.must_be_zero) {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
324 context->error_status = DS_CMD_ERROR;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
325 return;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
326 }
2064
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
327 context->first_cmd_received = 1;
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
328 switch (context->cmd_buffer.cmd_type)
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
329 {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
330 case CMD_NOP:
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
331 break;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
332 case CMD_STOP:
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
333 puts("CDD CMD: STOP");
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
334 context->status = DS_STOP;
2064
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
335 context->requested_format = SF_ABSOLUTE;
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
336 break;
2062
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
337 case CMD_READ:
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
338 case CMD_SEEK: {
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
339 if (context->status == DS_DOOR_OPEN || context->status == DS_TRAY_MOVING || context->status == DS_DISC_LEADOUT || context->status == DS_DISC_LEADIN) {
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
340 context->error_status = DS_CMD_ERROR;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
341 break;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
342 }
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
343 if (context->requested_format == SF_TOCT || context->requested_format == SF_TOCN) {
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
344 context->requested_format = SF_ABSOLUTE;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
345 }
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
346 if (!context->toc_valid) {
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
347 context->error_status = DS_CMD_ERROR;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
348 break;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
349 }
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
350 uint32_t lba = context->cmd_buffer.b.time.min_high * 10 + context->cmd_buffer.b.time.min_low;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
351 lba *= 60;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
352 lba += context->cmd_buffer.b.time.sec_high * 10 + context->cmd_buffer.b.time.sec_low;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
353 lba *= 75;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
354 lba += context->cmd_buffer.b.time.frame_high * 10 + context->cmd_buffer.b.time.frame_low;
2065
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
355 printf("READ/SEEK cmd for lba %d, MM:SS:FF %u%u:%u%u:%u%u\n", lba,
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
356 context->cmd_buffer.b.time.min_high, context->cmd_buffer.b.time.min_low,
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
357 context->cmd_buffer.b.time.sec_high, context->cmd_buffer.b.time.sec_low,
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
358 context->cmd_buffer.b.time.frame_high, context->cmd_buffer.b.time.frame_low
02a9846668d1 Implement transfer of data from CDC to elsewhere. Other miscellaneous CDD/CDC improvements
Michael Pavone <pavone@retrodev.com>
parents: 2064
diff changeset
359 );
2062
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
360 if (lba >= context->media->tracks[0].fake_pregap + context->media->tracks[context->media->num_tracks - 1].end_lba) {
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
361 context->error_status = DS_CMD_ERROR;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
362 break;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
363 }
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
364 context->seek_pba = lba + LEADIN_SECTORS - 4;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
365 context->seeking = 1;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
366 context->status = context->cmd_buffer.cmd_type == CMD_READ ? DS_PLAY : DS_PAUSE;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
367 break;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
368 }
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
369 case CMD_REPORT_REQUEST:
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
370 switch (context->cmd_buffer.b.format.status_type)
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
371 {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
372 case SF_ABSOLUTE:
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
373 case SF_RELATIVE:
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
374 case SF_TRACK:
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
375 context->requested_format = context->cmd_buffer.b.format.status_type;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
376 break;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
377 case SF_TOCO:
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
378 if (context->toc_valid) {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
379 context->requested_format = SF_TOCO;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
380 } else {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
381 context->error_status = DS_CMD_ERROR;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
382 context->requested_format = SF_ABSOLUTE;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
383 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
384 break;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
385 case SF_TOCT:
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
386 if (context->toc_valid) {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
387 if (context->status == DS_STOP) {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
388 context->status = DS_TOC_READ;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
389 context->seeking = 1;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
390 context->seek_pba = 0;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
391 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
392 } else {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
393 context->status = DS_TOC_READ;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
394 context->seeking = 1;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
395 context->seek_pba = 0;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
396 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
397 context->requested_format = SF_TOCT;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
398 break;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
399 case SF_TOCN:
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
400 context->requested_track = context->cmd_buffer.b.format.track_high * 10;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
401 context->requested_track += context->cmd_buffer.b.format.track_low;
2062
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
402 if (!context->media || context->requested_track > context->media->num_tracks) {
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
403 context->requested_format = SF_ABSOLUTE;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
404 context->error_status = DS_CMD_ERROR;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
405 }
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
406 context->status = DS_TOC_READ;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
407 context->seeking = 1;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
408 context->seek_pba = 0;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
409 context->requested_format = SF_TOCN;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
410 break;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
411 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
412 printf("CDD CMD: REPORT REQUEST(%d), format set to %d\n", context->cmd_buffer.b.format.status_type, context->requested_format);
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
413 break;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
414 default:
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
415 printf("CDD CMD: Unimplemented(%d)\n", context->cmd_buffer.cmd_type);
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
416 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
417 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
418
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
419 #define BIT_HOCK 0x4
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
420 #define BIT_DRS 0x2
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
421 #define BIT_DTS 0x1
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
422
2062
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
423 void cdd_mcu_run(cdd_mcu *context, uint32_t cycle, uint16_t *gate_array, lc8951* cdc)
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
424 {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
425 uint32_t cd_cycle = mclks_to_cd_block(cycle);
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
426 if (!(gate_array[GAO_CDD_CTRL] & BIT_HOCK)) {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
427 //it's a little unclear if this gates the actual cd block clock or just handshaking
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
428 //assum it's actually the clock for now
2064
91e4d2fe5cd9 Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
429 context->cycle = cd_cycle;
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
430 return;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
431 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
432 uint32_t next_subcode = context->last_subcode_cycle + SECTOR_CLOCKS;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
433 uint32_t next_nibble = context->current_status_nibble >= 0 ? context->last_nibble_cycle + NIBBLE_CLOCKS : CYCLE_NEVER;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
434 uint32_t next_cmd_nibble = context->current_cmd_nibble >= 0 ? context->last_nibble_cycle + NIBBLE_CLOCKS : CYCLE_NEVER;
2062
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
435 uint32_t next_byte = context->current_sector_byte >= 0 ? context->last_byte_cycle + BYTE_CLOCKS : CYCLE_NEVER;
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
436 for (; context->cycle < cd_cycle; context->cycle += CDD_MCU_DIVIDER)
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
437 {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
438 if (context->cycle >= next_subcode) {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
439 context->last_subcode_cycle = context->cycle;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
440 next_subcode = context->cycle + SECTOR_CLOCKS;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
441 update_status(context);
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
442 next_nibble = context->cycle;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
443 context->current_status_nibble = 0;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
444 gate_array[GAO_CDD_STATUS] |= BIT_DRS;
2062
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
445 if (context->status == DS_PLAY && !context->seeking) {
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
446 next_byte = context->cycle;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
447 context->current_sector_byte = 0;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
448 }
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
449 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
450 if (context->cycle >= next_nibble) {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
451 if (context->current_status_nibble == sizeof(cdd_status)) {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
452 context->current_status_nibble = -1;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
453 gate_array[GAO_CDD_STATUS] &= ~BIT_DRS;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
454 if (context->cmd_recv_pending) {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
455 context->cmd_recv_pending = 0;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
456 context->current_cmd_nibble = 0;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
457 gate_array[GAO_CDD_STATUS] |= BIT_DTS;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
458 next_nibble = context->cycle + NIBBLE_CLOCKS;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
459 } else {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
460 context->cmd_recv_wait = 1;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
461 next_nibble = CYCLE_NEVER;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
462 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
463 } else {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
464 uint8_t value = ((uint8_t *)&context->status_buffer)[context->current_status_nibble];
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
465 int ga_index = GAO_CDD_STATUS + (context->current_status_nibble >> 1);
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
466 if (context->current_status_nibble & 1) {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
467 gate_array[ga_index] = value | (gate_array[ga_index] & 0xFF00);
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
468 } else {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
469 gate_array[ga_index] = (value << 8) | (gate_array[ga_index] & 0x00FF);
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
470 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
471 if (context->current_status_nibble == 7) {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
472 context->int_pending = 1;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
473 context->next_int_cycle = cd_block_to_mclks(cycle + SECTOR_CLOCKS);
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
474 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
475 context->current_status_nibble++;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
476 context->last_nibble_cycle = context->cycle;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
477 next_nibble = context->cycle + NIBBLE_CLOCKS;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
478 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
479 } else if (context->cycle >= next_cmd_nibble) {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
480 if (context->current_cmd_nibble == sizeof(cdd_cmd)) {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
481 next_cmd_nibble = CYCLE_NEVER;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
482 context->current_cmd_nibble = -1;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
483 gate_array[GAO_CDD_STATUS] &= ~BIT_DTS;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
484 run_command(context);
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
485 } else {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
486 int ga_index = GAO_CDD_CMD + (context->current_cmd_nibble >> 1);
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
487 uint8_t value = (context->current_cmd_nibble & 1) ? gate_array[ga_index] : gate_array[ga_index] >> 8;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
488 ((uint8_t *)&context->cmd_buffer)[context->current_cmd_nibble] = value;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
489 context->current_cmd_nibble++;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
490 context->last_nibble_cycle = context->cycle;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
491 next_cmd_nibble = context->cycle + NIBBLE_CLOCKS;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
492 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
493 }
2062
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
494 if (context->cycle >= next_byte) {
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
495 uint8_t byte;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
496 if (context->in_fake_pregap) {
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
497 if (!context->current_sector_byte || (context->current_sector_byte >= 16)) {
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
498 byte = 0;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
499 //TODO: error detection and correction bytes
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
500 } else if (context->current_sector_byte < 12) {
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
501 byte = 0xFF;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
502 } else if (context->current_sector_byte == 12) {
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
503 uint32_t minute = ((context->head_pba - LEADIN_SECTORS) / 75) / 60;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
504 byte = (minute % 10) | ((minute / 10 ) << 4);
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
505 } else if (context->current_sector_byte == 13) {
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
506 uint32_t seconds = ((context->head_pba - LEADIN_SECTORS) / 75) % 60;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
507 byte = (seconds % 10) | ((seconds / 10 ) << 4);
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
508 } else if (context->current_sector_byte == 14) {
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
509 uint32_t frames = (context->head_pba - LEADIN_SECTORS) % 75;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
510 byte = (frames % 10) | ((frames / 10 ) << 4);
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
511 } else {
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
512 byte = 1;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
513 }
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
514 } else {
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
515 byte = fgetc(context->media->f);
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
516 }
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
517 lc8951_write_byte(cdc, cd_block_to_mclks(context->cycle), context->current_sector_byte++, byte);
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
518 context->last_byte_cycle = context->cycle;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
519 next_byte = context->cycle + BYTE_CLOCKS;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
520 if (context->current_sector_byte == 2352) {
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
521 context->current_sector_byte = -1;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
522
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
523 }
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
524 }
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
525 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
526 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
527
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
528 void cdd_mcu_start_cmd_recv(cdd_mcu *context, uint16_t *gate_array)
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
529 {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
530 if (context->cmd_recv_wait) {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
531 context->current_cmd_nibble = 0;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
532 gate_array[GAO_CDD_STATUS] |= BIT_DTS;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
533 context->last_nibble_cycle = context->cycle;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
534 context->cmd_recv_wait = 0;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
535 } else {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
536 context->cmd_recv_pending = 1;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
537 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
538 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
539
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
540 void cdd_hock_enabled(cdd_mcu *context)
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
541 {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
542 context->last_subcode_cycle = context->cycle;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
543 context->next_int_cycle = cd_block_to_mclks(context->cycle + SECTOR_CLOCKS + 7 * NIBBLE_CLOCKS);
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
544 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
545
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
546 void cdd_hock_disabled(cdd_mcu *context)
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
547 {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
548 context->last_subcode_cycle = CYCLE_NEVER;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
549 context->next_int_cycle = CYCLE_NEVER;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
550 context->last_nibble_cycle = CYCLE_NEVER;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
551 context->current_status_nibble = -1;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
552 context->current_cmd_nibble = -1;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
553 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
554
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
555 void cdd_mcu_adjust_cycle(cdd_mcu *context, uint32_t deduction)
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
556 {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
557 uint32_t cd_deduction = mclks_to_cd_block(deduction);
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
558 if (context->next_int_cycle != CYCLE_NEVER) {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
559 context->next_int_cycle -= deduction;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
560 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
561 if (context->last_subcode_cycle != CYCLE_NEVER) {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
562 context->last_subcode_cycle -= cd_deduction;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
563 }
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
564 if (context->last_nibble_cycle != CYCLE_NEVER) {
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
565 context->last_nibble_cycle -= cd_deduction;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
566 }
2062
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
567 if (context->last_byte_cycle != CYCLE_NEVER) {
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
568 context->last_byte_cycle -= cd_deduction;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
569 }
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
570 }