Rev 796 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
716 | lvd | 1 | #include "std.h" |
2 | |||
3 | #include "emul.h" |
||
4 | #include "vars.h" |
||
5 | #include "debug.h" |
||
6 | #include "dbgpaint.h" |
||
7 | #include "dbgreg.h" |
||
8 | |||
9 | const TRegLayout regs_layout[] = |
||
10 | { |
||
11 | { offsetof(TZ80State, a) , 8, 3, 0, 0, 1, 0, 2 }, // 0 a |
||
12 | { offsetof(TZ80State, f) , 8, 5, 0, 0, 5, 1, 2 }, // 1 f |
||
13 | { offsetof(TZ80State, bc) , 16, 3, 1, 2, 6, 0, 3 }, // 2 bc |
||
14 | { offsetof(TZ80State, de) , 16, 3, 2, 3, 7, 2, 4 }, // 3 de |
||
15 | { offsetof(TZ80State, hl) , 16, 3, 3, 4, 8, 3, 4 }, // 4 hl |
||
16 | { offsetof(TZ80State, alt.af), 16, 11, 0, 1, 9, 5, 6 }, // 5 af' |
||
17 | { offsetof(TZ80State, alt.bc), 16, 11, 1, 2,10, 5, 7 }, // 6 bc' |
||
18 | { offsetof(TZ80State, alt.de), 16, 11, 2, 3,11, 6, 8 }, // 7 de' |
||
19 | { offsetof(TZ80State, alt.hl), 16, 11, 3, 4,12, 7, 8 }, // 8 hl' |
||
20 | { offsetof(TZ80State, sp) , 16, 19, 0, 5,13, 9,10 }, // 9 sp |
||
21 | { offsetof(TZ80State, pc) , 16, 19, 1, 6,10, 9,11 }, // 10 pc |
||
22 | { offsetof(TZ80State, ix) , 16, 19, 2, 7,15,10,12 }, // 11 ix |
||
23 | { offsetof(TZ80State, iy) , 16, 19, 3, 8,18,11,12 }, // 12 iy |
||
24 | { offsetof(TZ80State, i) , 8, 28, 0, 9,14,13,16 }, // 13 i |
||
25 | { offsetof(TZ80State, r_low) , 8, 30, 0,13,14,14,17 }, // 14 r |
||
26 | { offsetof(TZ80State, im) , 2, 26, 2,11,16,13,20 }, // 15 im |
||
27 | { offsetof(TZ80State, iff1) , 1, 30, 2,15,17,13,24 }, // 16 iff1 |
||
28 | { offsetof(TZ80State, iff2) , 1, 31, 2,16,17,14,25 }, // 17 iff2 |
||
29 | { offsetof(TZ80State, f) , 37, 24, 3,12,19,15,18 }, // 18 SF |
||
30 | { offsetof(TZ80State, f) , 36, 25, 3,18,20,15,19 }, // 19 ZF |
||
31 | { offsetof(TZ80State, f) , 35, 26, 3,19,21,15,20 }, // 20 F5 |
||
32 | { offsetof(TZ80State, f) , 34, 27, 3,20,22,15,21 }, // 21 HF |
||
33 | { offsetof(TZ80State, f) , 33, 28, 3,21,23,15,22 }, // 22 F3 |
||
34 | { offsetof(TZ80State, f) , 32, 29, 3,22,24,16,23 }, // 23 PV |
||
35 | { offsetof(TZ80State, f) , 31, 30, 3,23,25,16,24 }, // 24 NF |
||
36 | { offsetof(TZ80State, f) , 30, 31, 3,24,25,17,25 }, // 25 CF |
||
37 | }; |
||
38 | |||
39 | const size_t regs_layout_count = _countof(regs_layout); |
||
40 | |||
41 | void showregs() |
||
42 | { |
||
43 | Z80 &cpu = CpuMgr.Cpu(); |
||
44 | const TZ80State &prevcpu = CpuMgr.PrevCpu(); |
||
45 | |||
46 | unsigned char atr = (activedbg == WNDREGS) ? W_SEL : W_NORM; |
||
47 | char line[40]; |
||
48 | tprint(regs_x,regs_y+0, "af:**** af'**** sp:**** ir: ****", atr); |
||
49 | tprint(regs_x,regs_y+1, "bc:**** bc'**** pc:**** t:******", atr); |
||
50 | tprint(regs_x,regs_y+2, "de:**** de'**** ix:**** im?,i:**", atr); |
||
51 | tprint(regs_x,regs_y+3, "hl:**** hl'**** iy:**** ########", atr); |
||
52 | |||
53 | if (cpu.halted && !cpu.iff1) |
||
54 | { |
||
55 | tprint(regs_x+26,regs_y+1,"DiHALT", (activedbg == WNDREGS) ? W_DIHALT1 : W_DIHALT2); |
||
56 | } |
||
57 | else |
||
58 | { |
||
796 | DimkaM | 59 | sprintf(line, "%6u", cpu.t); |
716 | lvd | 60 | tprint(regs_x+26,regs_y+1,line,atr); |
61 | } |
||
62 | |||
63 | cpu.r_low = (cpu.r_low & 0x7F) + cpu.r_hi; |
||
64 | for (unsigned i = 0; i < regs_layout_count; i++) |
||
65 | { |
||
66 | unsigned mask = (1 << regs_layout[i].width) - 1; |
||
67 | unsigned val = mask & *(unsigned*)(PCHAR((TZ80State*)&cpu)+regs_layout[i].offs); |
||
68 | unsigned char atr1 = atr; |
||
69 | if (activedbg == WNDREGS && i == regs_curs) |
||
70 | atr1 = W_CURS; |
||
71 | if (val != (mask & *(unsigned*)(PCHAR(&prevcpu)+regs_layout[i].offs))) |
||
72 | atr1 |= 0x08; |
||
73 | |||
74 | char bf[16]; |
||
75 | switch (regs_layout[i].width) |
||
76 | { |
||
77 | case 8: sprintf(bf, "%02X", val); break; |
||
78 | case 16: sprintf(bf, "%04X", val); break; |
||
79 | case 1: |
||
80 | case 2: sprintf(bf, "%X", val); break; |
||
81 | default: *bf = 0; |
||
82 | } |
||
83 | tprint(regs_x + regs_layout[i].x, regs_y + regs_layout[i].y, bf, atr1); |
||
84 | } |
||
85 | static const char flg[] = "SZ5H3PNCsz.h.pnc"; |
||
86 | for (unsigned char q = 0; q < 8; q++) |
||
87 | { |
||
88 | unsigned ln; unsigned char atr1 = atr; |
||
89 | if (activedbg == WNDREGS && regs_curs == (unsigned)(q+18)) atr1 = W_CURS; |
||
796 | DimkaM | 90 | ln = unsigned(flg[q+((cpu.af & (0x80>>q)) ? 0 : 8)]); |
716 | lvd | 91 | if ((0x80>>q)&(cpu.f^prevcpu.f)) atr1 |= 0x08; |
92 | tprint(regs_x+24+q,regs_y+3,(char*)&ln, atr1); |
||
93 | } |
||
94 | tprint(regs_x, regs_y-1, "regs", W_TITLE); |
||
95 | frame(regs_x,regs_y,32,4, FRAME); |
||
96 | } |
||
97 | |||
98 | void rleft() { regs_curs = regs_layout[regs_curs].lf; } |
||
99 | void rright() { regs_curs = regs_layout[regs_curs].rt; } |
||
100 | void rup() { regs_curs = regs_layout[regs_curs].up; } |
||
101 | void rdown() { regs_curs = regs_layout[regs_curs].dn; } |
||
102 | void renter() |
||
103 | { |
||
104 | Z80 &cpu = CpuMgr.Cpu(); |
||
105 | debugscr(); |
||
106 | debugflip(); |
||
107 | unsigned char sz = regs_layout[regs_curs].width; |
||
108 | unsigned val = ((1 << sz) - 1) & *(unsigned*)(PCHAR((TZ80State*)&cpu) + regs_layout[regs_curs].offs); |
||
109 | unsigned char *ptr = PUCHAR((TZ80State*)&cpu) + regs_layout[regs_curs].offs; |
||
110 | |||
111 | u8 Kbd[256]; |
||
112 | GetKeyboardState(Kbd); |
||
113 | unsigned short k = 0; |
||
114 | if (ToAscii(input.lastkey,0,Kbd,&k,0) != 1) |
||
115 | return; |
||
796 | DimkaM | 116 | u8 u = u8(toupper(k)); |
716 | lvd | 117 | if ((sz == 8 || sz == 16) && ((u >= '0' && u <= '9') || (u >= 'A' && u <= 'F'))) |
118 | PostThreadMessage(GetCurrentThreadId(), WM_KEYDOWN, input.lastkey, 1); |
||
119 | switch (sz) |
||
120 | { |
||
121 | case 8: |
||
796 | DimkaM | 122 | val = unsigned(input2(regs_x + regs_layout[regs_curs].x, regs_y + regs_layout[regs_curs].y, val)); |
123 | if (int(val) != -1) |
||
124 | *ptr = u8(val); |
||
716 | lvd | 125 | break; |
126 | case 16: |
||
796 | DimkaM | 127 | val = unsigned(input4(regs_x + regs_layout[regs_curs].x, regs_y + regs_layout[regs_curs].y, val)); |
128 | if (int(val) != -1) |
||
129 | *(unsigned short*)ptr = u16(val); |
||
716 | lvd | 130 | break; |
131 | case 1: |
||
132 | *ptr ^= 1; break; |
||
133 | case 2: |
||
134 | *ptr = (*ptr + 1) % 3; break; |
||
135 | default: // flags |
||
136 | *ptr ^= (1 << (sz-30)); |
||
137 | } |
||
138 | cpu.r_hi = cpu.r_low & 0x80; |
||
139 | } |
||
140 | void ra() { regs_curs = 0; input.lastkey = 0; renter(); } |
||
141 | void rf() { regs_curs = 1; input.lastkey = 0; renter(); } |
||
142 | void rbc() { regs_curs = 2; input.lastkey = 0; renter(); } |
||
143 | void rde() { regs_curs = 3; input.lastkey = 0; renter(); } |
||
144 | void rhl() { regs_curs = 4; input.lastkey = 0; renter(); } |
||
145 | void rsp() { regs_curs = 9; input.lastkey = 0; renter(); } |
||
146 | void rpc() { regs_curs = 10; input.lastkey = 0; renter(); } |
||
147 | void rix() { regs_curs = 11; input.lastkey = 0; renter(); } |
||
148 | void riy() { regs_curs = 12; input.lastkey = 0; renter(); } |
||
149 | void ri() { regs_curs = 13; input.lastkey = 0; renter(); } |
||
150 | void rr() { regs_curs = 14; input.lastkey = 0; renter(); } |
||
151 | void rm() { regs_curs = 15; renter(); } |
||
152 | void r_1() { regs_curs = 16; renter(); } |
||
153 | void r_2() { regs_curs = 17; renter(); } |
||
154 | void rSF() { regs_curs = 18; renter(); } |
||
155 | void rZF() { regs_curs = 19; renter(); } |
||
156 | void rF5() { regs_curs = 20; renter(); } |
||
157 | void rHF() { regs_curs = 21; renter(); } |
||
158 | void rF3() { regs_curs = 22; renter(); } |
||
159 | void rPF() { regs_curs = 23; renter(); } |
||
160 | void rNF() { regs_curs = 24; renter(); } |
||
161 | void rCF() { regs_curs = 25; renter(); } |
||
162 | |||
163 | void rcodejump() |
||
164 | { |
||
165 | Z80 &cpu = CpuMgr.Cpu(); |
||
166 | if (regs_layout[regs_curs].width == 16) |
||
167 | { |
||
168 | activedbg = WNDTRACE; |
||
169 | cpu.trace_curs = cpu.trace_top = *(unsigned short*)(PCHAR((TZ80State*)&cpu) + regs_layout[regs_curs].offs); |
||
170 | } |
||
171 | } |
||
172 | void rdatajump() |
||
173 | { |
||
174 | Z80 &cpu = CpuMgr.Cpu(); |
||
175 | if (regs_layout[regs_curs].width == 16) |
||
176 | { |
||
177 | activedbg = WNDMEM; |
||
178 | editor = ED_MEM; |
||
179 | cpu.mem_curs = *(unsigned short*)(PCHAR((TZ80State*)&cpu) + regs_layout[regs_curs].offs); |
||
180 | } |
||
181 | } |
||
182 | |||
183 | char dispatch_regs() |
||
184 | { |
||
185 | if ((input.lastkey >= '0' && input.lastkey <= '9') || (input.lastkey >= 'A' && input.lastkey <= 'F')) |
||
186 | { |
||
187 | renter(); |
||
188 | return 1; |
||
189 | } |
||
190 | return 0; |
||
191 | } |