Mercurial > repos > blastem
annotate cdd_mcu.c @ 2064:91e4d2fe5cd9 segacd
Get CDD working well enough to get into BIOS CD player
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 28 Jan 2022 22:48:06 -0800 |
parents | 07ed42bd7b4c |
children | 02a9846668d1 |
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: |
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
156 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
|
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: |
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
164 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
|
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); |
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
190 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
|
191 } else { |
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
192 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
|
193 } |
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
194 break; |
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
195 case SF_TOCO: |
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
196 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
|
197 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
|
198 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
|
199 { |
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
200 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
|
201 } |
2064
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
202 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
|
203 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
|
204 } else { |
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
205 context->status_buffer.format = SF_NOTREADY; |
2061
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
206 } |
2064
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
207 break; |
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
208 case SF_TOCT: |
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
209 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
|
210 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
|
211 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
|
212 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
|
213 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
|
214 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
|
215 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
|
216 } else { |
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
217 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
|
218 } |
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
219 break; |
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
220 case SF_TOCN: |
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
221 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
|
222 uint32_t lba = context->media->tracks[context->requested_track - 1].start_lba; |
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
223 if (context->requested_track > 1) { |
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
224 lba += context->media->tracks[1].fake_pregap; |
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
225 } |
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
226 lba_to_status(context, lba); |
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
227 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
|
228 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
|
229 } else { |
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
230 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
|
231 } |
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
232 break; |
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
233 case SF_NOTREADY: |
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
234 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
|
235 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
|
236 break; |
2061
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
237 } |
2064
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
238 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
|
239 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
|
240 context->status_buffer.status = DS_TOC_READ; |
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
241 } else { |
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
242 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
|
243 } |
2061
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
244 } else { |
2064
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.status = context->error_status; |
2061
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
246 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
|
247 context->error_status = DS_STOP; |
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 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
|
250 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
|
251 } |
2064
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
252 } else { |
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
253 // 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
|
254 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
|
255 } |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
256 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
|
257 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
|
258 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
|
259 context->status_buffer.status, context->status_buffer.format, |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
260 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
|
261 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
|
262 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
|
263 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
|
264 ); |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
265 } |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
266 } |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
267 |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
268 static void run_command(cdd_mcu *context) |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
269 { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
270 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
|
271 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
|
272 if (check != context->cmd_buffer.checksum) { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
273 context->error_status = DS_SUM_ERROR; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
274 return; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
275 } |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
276 if (context->cmd_buffer.must_be_zero) { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
277 context->error_status = DS_CMD_ERROR; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
278 return; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
279 } |
2064
91e4d2fe5cd9
Get CDD working well enough to get into BIOS CD player
Michael Pavone <pavone@retrodev.com>
parents:
2062
diff
changeset
|
280 context->first_cmd_received = 1; |
2061
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
281 switch (context->cmd_buffer.cmd_type) |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
282 { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
283 case CMD_NOP: |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
284 break; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
285 case CMD_STOP: |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
286 puts("CDD CMD: STOP"); |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
287 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
|
288 context->requested_format = SF_ABSOLUTE; |
2061
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
289 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
|
290 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
|
291 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
|
292 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
|
293 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
|
294 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
|
295 } |
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
|
296 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
|
297 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
|
298 } |
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
|
299 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
|
300 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
|
301 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
|
302 } |
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
|
303 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
|
304 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
|
305 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
|
306 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
|
307 lba += context->cmd_buffer.b.time.frame_high * 10 + context->cmd_buffer.b.time.frame_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
|
308 printf("READ/SEEK cmd for lba %d\n", 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
|
309 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
|
310 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
|
311 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
|
312 } |
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
|
313 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
|
314 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
|
315 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
|
316 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
|
317 } |
2061
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
318 case CMD_REPORT_REQUEST: |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
319 switch (context->cmd_buffer.b.format.status_type) |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
320 { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
321 case SF_ABSOLUTE: |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
322 case SF_RELATIVE: |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
323 case SF_TRACK: |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
324 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
|
325 break; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
326 case SF_TOCO: |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
327 if (context->toc_valid) { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
328 context->requested_format = SF_TOCO; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
329 } else { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
330 context->error_status = DS_CMD_ERROR; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
331 context->requested_format = SF_ABSOLUTE; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
332 } |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
333 break; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
334 case SF_TOCT: |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
335 if (context->toc_valid) { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
336 if (context->status == DS_STOP) { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
337 context->status = DS_TOC_READ; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
338 context->seeking = 1; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
339 context->seek_pba = 0; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
340 } |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
341 } else { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
342 context->status = DS_TOC_READ; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
343 context->seeking = 1; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
344 context->seek_pba = 0; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
345 } |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
346 context->requested_format = SF_TOCT; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
347 break; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
348 case SF_TOCN: |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
349 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
|
350 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
|
351 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
|
352 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
|
353 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
|
354 } |
2061
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
355 context->status = DS_TOC_READ; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
356 context->seeking = 1; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
357 context->seek_pba = 0; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
358 context->requested_format = SF_TOCN; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
359 break; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
360 } |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
361 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
|
362 break; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
363 default: |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
364 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
|
365 } |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
366 } |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
367 |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
368 #define BIT_HOCK 0x4 |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
369 #define BIT_DRS 0x2 |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
370 #define BIT_DTS 0x1 |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
371 |
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
|
372 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
|
373 { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
374 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
|
375 if (!(gate_array[GAO_CDD_CTRL] & BIT_HOCK)) { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
376 //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
|
377 //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
|
378 context->cycle = cd_cycle; |
2061
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
379 return; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
380 } |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
381 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
|
382 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
|
383 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
|
384 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
|
385 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
|
386 { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
387 if (context->cycle >= next_subcode) { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
388 context->last_subcode_cycle = context->cycle; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
389 next_subcode = context->cycle + SECTOR_CLOCKS; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
390 update_status(context); |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
391 next_nibble = context->cycle; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
392 context->current_status_nibble = 0; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
393 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
|
394 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
|
395 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
|
396 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
|
397 } |
2061
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
398 } |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
399 if (context->cycle >= next_nibble) { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
400 if (context->current_status_nibble == sizeof(cdd_status)) { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
401 context->current_status_nibble = -1; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
402 gate_array[GAO_CDD_STATUS] &= ~BIT_DRS; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
403 if (context->cmd_recv_pending) { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
404 context->cmd_recv_pending = 0; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
405 context->current_cmd_nibble = 0; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
406 gate_array[GAO_CDD_STATUS] |= BIT_DTS; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
407 next_nibble = context->cycle + NIBBLE_CLOCKS; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
408 } else { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
409 context->cmd_recv_wait = 1; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
410 next_nibble = CYCLE_NEVER; |
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 } else { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
413 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
|
414 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
|
415 if (context->current_status_nibble & 1) { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
416 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
|
417 } else { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
418 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
|
419 } |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
420 if (context->current_status_nibble == 7) { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
421 context->int_pending = 1; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
422 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
|
423 } |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
424 context->current_status_nibble++; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
425 context->last_nibble_cycle = context->cycle; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
426 next_nibble = context->cycle + NIBBLE_CLOCKS; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
427 } |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
428 } else if (context->cycle >= next_cmd_nibble) { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
429 if (context->current_cmd_nibble == sizeof(cdd_cmd)) { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
430 next_cmd_nibble = CYCLE_NEVER; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
431 context->current_cmd_nibble = -1; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
432 gate_array[GAO_CDD_STATUS] &= ~BIT_DTS; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
433 run_command(context); |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
434 } else { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
435 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
|
436 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
|
437 ((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
|
438 context->current_cmd_nibble++; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
439 context->last_nibble_cycle = context->cycle; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
440 next_cmd_nibble = context->cycle + NIBBLE_CLOCKS; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
441 } |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
442 } |
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
|
443 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
|
444 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
|
445 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
|
446 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
|
447 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 //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
|
449 } 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
|
450 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
|
451 } 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
|
452 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
|
453 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
|
454 } 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
|
455 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
|
456 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
|
457 } 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
|
458 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
|
459 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
|
460 } 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
|
461 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
|
462 } |
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
|
463 } 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
|
464 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
|
465 } |
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
|
466 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
|
467 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
|
468 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
|
469 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
|
470 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
|
471 |
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
|
472 } |
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
|
473 } |
2061
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 } |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
476 |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
477 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
|
478 { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
479 if (context->cmd_recv_wait) { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
480 context->current_cmd_nibble = 0; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
481 gate_array[GAO_CDD_STATUS] |= BIT_DTS; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
482 context->last_nibble_cycle = context->cycle; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
483 context->cmd_recv_wait = 0; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
484 } else { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
485 context->cmd_recv_pending = 1; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
486 } |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
487 } |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
488 |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
489 void cdd_hock_enabled(cdd_mcu *context) |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
490 { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
491 context->last_subcode_cycle = context->cycle; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
492 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
|
493 } |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
494 |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
495 void cdd_hock_disabled(cdd_mcu *context) |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
496 { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
497 context->last_subcode_cycle = CYCLE_NEVER; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
498 context->next_int_cycle = CYCLE_NEVER; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
499 context->last_nibble_cycle = CYCLE_NEVER; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
500 context->current_status_nibble = -1; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
501 context->current_cmd_nibble = -1; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
502 } |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
503 |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
504 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
|
505 { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
506 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
|
507 if (context->next_int_cycle != CYCLE_NEVER) { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
508 context->next_int_cycle -= deduction; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
509 } |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
510 if (context->last_subcode_cycle != CYCLE_NEVER) { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
511 context->last_subcode_cycle -= cd_deduction; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
512 } |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
513 if (context->last_nibble_cycle != CYCLE_NEVER) { |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
514 context->last_nibble_cycle -= cd_deduction; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
515 } |
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
|
516 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
|
517 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
|
518 } |
2061
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
519 } |