Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/yabause/src/carbon/cpustatus.c
2 views
1
/* Copyright 2006 Anders Montonen
2
3
This file is part of Yabause.
4
5
Yabause is free software; you can redistribute it and/or modify
6
it under the terms of the GNU General Public License as published by
7
the Free Software Foundation; either version 2 of the License, or
8
(at your option) any later version.
9
10
Yabause is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
GNU General Public License for more details.
14
15
You should have received a copy of the GNU General Public License
16
along with Yabause; if not, write to the Free Software
17
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
*/
19
20
#include <Carbon/Carbon.h>
21
22
#include "cpustatus.h"
23
#include "../sh2core.h"
24
25
/* Dialog field IDs */
26
27
#define SLAVE_ID_OFFSET 30
28
29
#define R0_ID 1
30
#define R1_ID 2
31
#define R2_ID 3
32
#define R3_ID 4
33
#define R4_ID 5
34
#define R5_ID 6
35
#define R6_ID 7
36
#define R7_ID 8
37
#define R8_ID 9
38
#define R9_ID 10
39
#define R10_ID 11
40
#define R11_ID 12
41
#define R12_ID 13
42
#define R13_ID 14
43
#define R14_ID 15
44
#define R15_ID 16
45
#define MACH_ID 17
46
#define MACL_ID 18
47
#define GBR_ID 19
48
#define VBR_ID 20
49
#define PC_ID 21
50
#define PR_ID 22
51
#define SR_ID 23
52
53
static WindowRef CPUStatusWindow;
54
55
static OSStatus CPUStatusWindowEventHandler(EventHandlerCallRef myHandler,
56
EventRef theEvent,
57
void *userData)
58
{
59
OSStatus result = eventNotHandledErr;
60
WindowRef window;
61
MenuRef menu;
62
63
switch(GetEventKind(theEvent))
64
{
65
case kEventWindowClose:
66
GetEventParameter(theEvent, kEventParamDirectObject, typeWindowRef,
67
0, sizeof(typeWindowRef), 0, &window);
68
DisposeWindow(window);
69
menu = GetMenuRef(1);
70
ChangeMenuItemAttributes(menu, 4, 0, kMenuItemAttrHidden);
71
ChangeMenuItemAttributes(menu, 5, kMenuItemAttrHidden, 0);
72
73
result = noErr;
74
break;
75
}
76
77
return result;
78
}
79
80
void ShowCPUStatusWindow(void)
81
{
82
IBNibRef nib;
83
84
EventTypeSpec eventList[] = { {kEventClassWindow, kEventWindowClose} };
85
86
CreateNibReference(CFSTR("cpustatus"), &nib);
87
CreateWindowFromNib(nib, CFSTR("Window"), &CPUStatusWindow);
88
ShowWindow(CPUStatusWindow);
89
90
InstallWindowEventHandler(CPUStatusWindow,
91
NewEventHandlerUPP(CPUStatusWindowEventHandler),
92
GetEventTypeCount(eventList),
93
eventList, CPUStatusWindow, NULL);
94
95
UpdateCPUStatusWindow();
96
}
97
98
void HideCPUStatusWindow(void)
99
{
100
DisposeWindow(CPUStatusWindow);
101
}
102
103
static void SetSRString(u32 SR, CFMutableStringRef s)
104
{
105
int ii;
106
107
for(ii = 0; ii < 32; ii++)
108
{
109
if(SR & 0x80000000)
110
CFStringAppendCString(s, "1", kCFStringEncodingASCII);
111
else
112
CFStringAppendCString(s, "0", kCFStringEncodingASCII);
113
114
SR <<= 1;
115
}
116
}
117
118
static void SetRegisterValue(const int controlId, CFStringRef s)
119
{
120
ControlID id;
121
ControlRef control;
122
123
id.signature = 'cpus';
124
id.id = controlId;
125
GetControlByID(CPUStatusWindow, &id, &control);
126
SetControlData(control, kControlEditTextPart,
127
kControlEditTextCFStringTag, sizeof(CFStringRef), &s);
128
129
}
130
131
void UpdateCPUStatusWindow(void)
132
{
133
CFStringRef s;
134
CFMutableStringRef ms;
135
sh2regs_struct master = {0};
136
sh2regs_struct slave = {0};
137
int ii = 0;
138
int srNumber = 0;
139
140
if(MSH2)
141
SH2GetRegisters(MSH2, &master);
142
143
if(SSH2)
144
SH2GetRegisters(SSH2, &slave);
145
146
/* Master registers */
147
for(ii = 0; ii < 16; ii++)
148
{
149
s = CFStringCreateWithFormat(kCFAllocatorDefault, NULL,
150
CFSTR("%x"), master.R[ii]);
151
SetRegisterValue(ii+1, s);
152
}
153
154
s = CFStringCreateWithFormat(kCFAllocatorDefault, NULL,
155
CFSTR("%x"), master.MACH);
156
SetRegisterValue(MACH_ID, s);
157
s = CFStringCreateWithFormat(kCFAllocatorDefault, NULL,
158
CFSTR("%x"), master.MACL);
159
SetRegisterValue(MACL_ID, s);
160
s = CFStringCreateWithFormat(kCFAllocatorDefault, NULL,
161
CFSTR("%x"), master.GBR);
162
SetRegisterValue(GBR_ID, s);
163
s = CFStringCreateWithFormat(kCFAllocatorDefault, NULL,
164
CFSTR("%x"), master.VBR);
165
SetRegisterValue(VBR_ID, s);
166
s = CFStringCreateWithFormat(kCFAllocatorDefault, NULL,
167
CFSTR("%x"), master.PC);
168
SetRegisterValue(PC_ID, s);
169
s = CFStringCreateWithFormat(kCFAllocatorDefault, NULL,
170
CFSTR("%x"), master.PR);
171
SetRegisterValue(PR_ID, s);
172
173
ms = CFStringCreateMutable(kCFAllocatorDefault, 32);
174
SetSRString(master.SR.all, ms);
175
SetRegisterValue(SR_ID, ms);
176
177
/* Slave registers */
178
for(ii = 0; ii < 16; ii++)
179
{
180
s = CFStringCreateWithFormat(kCFAllocatorDefault, NULL,
181
CFSTR("%x"), slave.R[ii]);
182
SetRegisterValue(ii+1+SLAVE_ID_OFFSET, s);
183
}
184
185
s = CFStringCreateWithFormat(kCFAllocatorDefault, NULL,
186
CFSTR("%x"), slave.MACH);
187
SetRegisterValue(MACH_ID+SLAVE_ID_OFFSET, s);
188
s = CFStringCreateWithFormat(kCFAllocatorDefault, NULL,
189
CFSTR("%x"), slave.MACL);
190
SetRegisterValue(MACL_ID+SLAVE_ID_OFFSET, s);
191
s = CFStringCreateWithFormat(kCFAllocatorDefault, NULL,
192
CFSTR("%x"), slave.GBR);
193
SetRegisterValue(GBR_ID+SLAVE_ID_OFFSET, s);
194
s = CFStringCreateWithFormat(kCFAllocatorDefault, NULL,
195
CFSTR("%x"), slave.VBR);
196
SetRegisterValue(VBR_ID+SLAVE_ID_OFFSET, s);
197
s = CFStringCreateWithFormat(kCFAllocatorDefault, NULL,
198
CFSTR("%x"), slave.PC);
199
SetRegisterValue(PC_ID+SLAVE_ID_OFFSET, s);
200
s = CFStringCreateWithFormat(kCFAllocatorDefault, NULL,
201
CFSTR("%x"), slave.PR);
202
SetRegisterValue(PR_ID+SLAVE_ID_OFFSET, s);
203
ms = CFStringCreateMutable(kCFAllocatorDefault, 32);
204
SetSRString(slave.SR.all, ms);
205
SetRegisterValue(SR_ID+SLAVE_ID_OFFSET, ms);
206
}
207
208