Details | 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 "dbgcmd.h" |
||
8 | #include "dbgmem.h" |
||
9 | #include "wd93crc.h" |
||
10 | #include "util.h" |
||
11 | |||
12 | TRKCACHE edited_track; |
||
13 | |||
14 | unsigned sector_offset, sector; |
||
15 | |||
16 | void findsector(unsigned addr) |
||
17 | { |
||
18 | for (sector_offset = sector = 0; sector < edited_track.s; sector++, sector_offset += edited_track.hdr[sector].datlen) |
||
19 | if (addr >= sector_offset && addr < sector_offset + edited_track.hdr[sector].datlen) |
||
20 | return; |
||
21 | errexit("internal diskeditor error"); |
||
22 | } |
||
23 | |||
24 | unsigned char *editam(unsigned addr) |
||
25 | { |
||
26 | Z80 &cpu = CpuMgr.Cpu(); |
||
27 | if (editor == ED_CMOS) return &cmos[addr & (sizeof(cmos)-1)]; |
||
28 | if (editor == ED_NVRAM) return &nvram[addr & (sizeof(nvram)-1)]; |
||
29 | if (editor == ED_MEM) return cpu.DirectMem(addr); |
||
30 | if (!edited_track.trkd) return 0; |
||
31 | if (editor == ED_PHYS) return edited_track.trkd + addr; |
||
32 | // editor == ED_LOG |
||
33 | findsector(addr); return edited_track.hdr[sector].data + addr - sector_offset; |
||
34 | } |
||
35 | |||
36 | void editwm(unsigned addr, unsigned char byte) |
||
37 | { |
||
38 | if (editrm(addr) == byte) return; |
||
39 | unsigned char *ptr = editam(addr); |
||
40 | if (!ptr) return; *ptr = byte; |
||
41 | if (editor == ED_MEM || editor == ED_CMOS || editor == ED_NVRAM) return; |
||
42 | if (editor == ED_PHYS) { comp.wd.fdd[mem_disk].optype |= 2; return; } |
||
43 | comp.wd.fdd[mem_disk].optype |= 1; |
||
44 | // recalc sector checksum |
||
45 | findsector(addr); |
||
46 | *(unsigned short*)(edited_track.hdr[sector].data + edited_track.hdr[sector].datlen) = |
||
47 | wd93_crc(edited_track.hdr[sector].data - 1, edited_track.hdr[sector].datlen + 1); |
||
48 | } |
||
49 | |||
50 | unsigned memadr(unsigned addr) |
||
51 | { |
||
52 | if (editor == ED_MEM) return (addr & 0xFFFF); |
||
53 | if (editor == ED_CMOS) return (addr & (sizeof(cmos)-1)); |
||
54 | if (editor == ED_NVRAM) return (addr & (sizeof(nvram)-1)); |
||
55 | // else if (editor == ED_PHYS || editor == ED_LOG) |
||
56 | if (!mem_max) return 0; |
||
57 | while ((int)addr < 0) addr += mem_max; |
||
58 | while (addr >= mem_max) addr -= mem_max; |
||
59 | return addr; |
||
60 | } |
||
61 | |||
62 | void showmem() |
||
63 | { |
||
64 | Z80 &cpu = CpuMgr.Cpu(); |
||
65 | char line[80]; unsigned ii; |
||
66 | unsigned cursor_found = 0; |
||
67 | if (mem_dump) mem_ascii = 1, mem_sz = 32; else mem_sz = 8; |
||
68 | |||
69 | if (editor == ED_LOG || editor == ED_PHYS) |
||
70 | { |
||
71 | edited_track.clear(); |
||
72 | edited_track.seek(comp.wd.fdd+mem_disk, mem_track/2, mem_track & 1, (editor == ED_LOG)? LOAD_SECTORS : JUST_SEEK); |
||
73 | if (!edited_track.trkd) { // no track |
||
74 | for (ii = 0; ii < mem_size; ii++) { |
||
75 | sprintf(line, (ii == mem_size/2)? |
||
76 | " track not found ": |
||
77 | " "); |
||
78 | tprint(mem_x, mem_y+ii, line, (activedbg == WNDMEM) ? W_SEL : W_NORM); |
||
79 | } |
||
80 | mem_max = 0; |
||
81 | goto title; |
||
82 | } |
||
83 | mem_max = edited_track.trklen; |
||
84 | if (editor == ED_LOG) |
||
85 | for (mem_max = ii = 0; ii < edited_track.s; ii++) |
||
86 | mem_max += edited_track.hdr[ii].datlen; |
||
87 | } |
||
88 | else if(editor == ED_MEM) |
||
89 | mem_max = 0x10000; |
||
90 | else if(editor == ED_CMOS) |
||
91 | mem_max = sizeof(cmos); |
||
92 | else if(editor == ED_NVRAM) |
||
93 | mem_max = sizeof(nvram); |
||
94 | |||
95 | redraw: |
||
96 | cpu.mem_curs = memadr(cpu.mem_curs); |
||
97 | cpu.mem_top = memadr(cpu.mem_top); |
||
98 | for (ii = 0; ii < mem_size; ii++) |
||
99 | { |
||
100 | unsigned ptr = memadr(cpu.mem_top + ii*mem_sz); |
||
101 | sprintf(line, "%04X ", ptr); |
||
102 | unsigned cx = 0; |
||
103 | if (mem_dump) |
||
104 | { // 0000 0123456789ABCDEF0123456789ABCDEF |
||
105 | for (unsigned dx = 0; dx < 32; dx++) |
||
106 | { |
||
107 | if (ptr == cpu.mem_curs) cx = dx+5; |
||
108 | unsigned char c = editrm(ptr); ptr = memadr(ptr+1); |
||
109 | line[dx+5] = c ? c : '.'; |
||
110 | } |
||
111 | } |
||
112 | else |
||
113 | { // 0000 11 22 33 44 55 66 77 88 abcdefgh |
||
114 | for (unsigned dx = 0; dx < 8; dx++) |
||
115 | { |
||
116 | if (ptr == cpu.mem_curs) cx = (mem_ascii) ? dx+29 : dx*3 + 5 + cpu.mem_second; |
||
117 | unsigned char c = editrm(ptr); ptr = memadr(ptr+1); |
||
118 | sprintf(line+5+3*dx, "%02X", c); line[7+3*dx] = ' '; |
||
119 | line[29+dx] = c ? c : '.'; |
||
120 | } |
||
121 | } |
||
122 | line[37] = 0; |
||
123 | tprint(mem_x, mem_y+ii, line, (activedbg == WNDMEM) ? W_SEL : W_NORM); |
||
124 | cursor_found |= cx; |
||
125 | if (cx && (activedbg == WNDMEM)) |
||
126 | txtscr[(mem_y+ii)*80+mem_x+cx+80*30] = W_CURS; |
||
127 | } |
||
128 | if (!cursor_found) { cursor_found=1; cpu.mem_top=cpu.mem_curs & ~(mem_sz-1); goto redraw; } |
||
129 | title: |
||
130 | const char *MemName = 0; |
||
131 | if (editor == ED_MEM) |
||
132 | MemName = "memory"; |
||
133 | else if (editor == ED_CMOS) |
||
134 | MemName = "cmos"; |
||
135 | else if (editor == ED_NVRAM) |
||
136 | MemName = "nvram"; |
||
137 | |||
138 | if(editor == ED_MEM || editor == ED_CMOS || editor == ED_NVRAM) |
||
139 | { |
||
140 | sprintf(line, "%s: %04X gsdma: %06X", MemName, cpu.mem_curs & 0xFFFF, temp.gsdmaaddr); |
||
141 | } |
||
142 | else if (editor == ED_PHYS) |
||
143 | sprintf(line, "disk %c, trk %02X, offs %04X", mem_disk+'A', mem_track, cpu.mem_curs); |
||
144 | else |
||
145 | { // ED_LOG |
||
146 | if (mem_max) |
||
147 | findsector(cpu.mem_curs); |
||
148 | sprintf(line, "disk %c, trk %02X, sec %02X[%02X], offs %04X", |
||
149 | mem_disk+'A', mem_track, sector, edited_track.hdr[sector].n, |
||
150 | cpu.mem_curs-sector_offset); |
||
151 | } |
||
152 | tprint(mem_x, mem_y-1, line, W_TITLE); |
||
153 | frame(mem_x,mem_y,37,mem_size,FRAME); |
||
154 | } |
||
155 | |||
156 | /* ------------------------------------------------------------- */ |
||
157 | void mstl() |
||
158 | { |
||
159 | Z80 &cpu = CpuMgr.Cpu(); |
||
160 | if (mem_max) cpu.mem_curs &= ~(mem_sz-1), cpu.mem_second = 0; |
||
161 | } |
||
162 | void mendl() |
||
163 | { |
||
164 | Z80 &cpu = CpuMgr.Cpu(); |
||
165 | if (mem_max) cpu.mem_curs |= (mem_sz-1), cpu.mem_second = 1; |
||
166 | } |
||
167 | void mup() |
||
168 | { |
||
169 | Z80 &cpu = CpuMgr.Cpu(); |
||
170 | if (mem_max) cpu.mem_curs -= mem_sz; |
||
171 | } |
||
172 | void mpgdn() |
||
173 | { |
||
174 | Z80 &cpu = CpuMgr.Cpu(); |
||
175 | if (mem_max) cpu.mem_curs += mem_size*mem_sz, cpu.mem_top += mem_size*mem_sz; |
||
176 | } |
||
177 | |||
178 | void mpgup() |
||
179 | { |
||
180 | Z80 &cpu = CpuMgr.Cpu(); |
||
181 | if (mem_max) cpu.mem_curs -= mem_size*mem_sz, cpu.mem_top -= mem_size*mem_sz; |
||
182 | } |
||
183 | |||
184 | void mdown() |
||
185 | { |
||
186 | if (!mem_max) return; |
||
187 | |||
188 | Z80 &cpu = CpuMgr.Cpu(); |
||
189 | cpu.mem_curs += mem_sz; |
||
190 | if (((cpu.mem_curs - cpu.mem_top + mem_max) % mem_max) / mem_sz >= mem_size) cpu.mem_top += mem_sz; |
||
191 | } |
||
192 | |||
193 | void mleft() |
||
194 | { |
||
195 | if (!mem_max) return; |
||
196 | Z80 &cpu = CpuMgr.Cpu(); |
||
197 | if (mem_ascii || !cpu.mem_second) cpu.mem_curs--; |
||
198 | if (!mem_ascii) cpu.mem_second ^= 1; |
||
199 | } |
||
200 | |||
201 | void mright() |
||
202 | { |
||
203 | Z80 &cpu = CpuMgr.Cpu(); |
||
204 | if (!mem_max) return; |
||
205 | if (mem_ascii || cpu.mem_second) cpu.mem_curs++; |
||
206 | if (!mem_ascii) cpu.mem_second ^= 1; |
||
207 | if (((cpu.mem_curs - cpu.mem_top + mem_max) % mem_max) / mem_sz >= mem_size) cpu.mem_top += mem_sz; |
||
208 | } |
||
209 | |||
210 | char dispatch_mem() |
||
211 | { |
||
212 | Z80 &cpu = CpuMgr.Cpu(); |
||
213 | if (!mem_max) |
||
214 | return 0; |
||
215 | |||
216 | u8 Kbd[256]; |
||
217 | GetKeyboardState(Kbd); |
||
218 | unsigned short k = 0; |
||
219 | if (ToAscii(input.lastkey,0,Kbd,&k,0) != 1) |
||
220 | return 0; |
||
221 | |||
222 | if (mem_ascii) |
||
223 | { |
||
224 | k &= 0xFF; |
||
225 | if (k < 0x20 || k >= 0x80) |
||
226 | return 0; |
||
227 | editwm(cpu.mem_curs, (unsigned char)k); |
||
228 | mright(); |
||
229 | return 1; |
||
230 | } |
||
231 | else |
||
232 | { |
||
233 | u8 u = toupper(k); |
||
234 | if ((u >= '0' && u <= '9') || (u >= 'A' && u <= 'F')) |
||
235 | { |
||
236 | unsigned char k = (u >= 'A') ? u - 'A'+10 : u - '0'; |
||
237 | unsigned char c = editrm(cpu.mem_curs); |
||
238 | if (cpu.mem_second) editwm(cpu.mem_curs, (c & 0xF0) | k); |
||
239 | else editwm(cpu.mem_curs, (c & 0x0F) | (k << 4)); |
||
240 | mright(); |
||
241 | return 1; |
||
242 | } |
||
243 | } |
||
244 | return 0; |
||
245 | } |
||
246 | |||
247 | void mtext() |
||
248 | { |
||
249 | Z80 &cpu = CpuMgr.Cpu(); |
||
250 | unsigned rs = find1dlg(cpu.mem_curs); |
||
251 | if (rs != -1) cpu.mem_curs = rs; |
||
252 | } |
||
253 | |||
254 | void mcode() |
||
255 | { |
||
256 | Z80 &cpu = CpuMgr.Cpu(); |
||
257 | unsigned rs = find2dlg(cpu.mem_curs); |
||
258 | if (rs != -1) cpu.mem_curs = rs; |
||
259 | } |
||
260 | |||
261 | void mgoto() |
||
262 | { |
||
263 | Z80 &cpu = CpuMgr.Cpu(); |
||
264 | unsigned v = input4(mem_x, mem_y, cpu.mem_top); |
||
265 | if (v != -1) cpu.mem_top = (v & ~(mem_sz-1)), cpu.mem_curs = v; |
||
266 | } |
||
267 | |||
268 | void mswitch() { mem_ascii ^= 1; } |
||
269 | |||
270 | void msp() |
||
271 | { |
||
272 | Z80 &cpu = CpuMgr.Cpu(); |
||
273 | cpu.mem_curs = cpu.sp; |
||
274 | } |
||
275 | void mpc() |
||
276 | { |
||
277 | Z80 &cpu = CpuMgr.Cpu(); |
||
278 | cpu.mem_curs = cpu.pc; |
||
279 | } |
||
280 | |||
281 | void mbc() |
||
282 | { |
||
283 | Z80 &cpu = CpuMgr.Cpu(); |
||
284 | cpu.mem_curs = cpu.bc; |
||
285 | } |
||
286 | |||
287 | void mde() |
||
288 | { |
||
289 | Z80 &cpu = CpuMgr.Cpu(); |
||
290 | cpu.mem_curs = cpu.de; |
||
291 | } |
||
292 | |||
293 | void mhl() |
||
294 | { |
||
295 | Z80 &cpu = CpuMgr.Cpu(); |
||
296 | cpu.mem_curs = cpu.hl; |
||
297 | } |
||
298 | |||
299 | void mix() |
||
300 | { |
||
301 | Z80 &cpu = CpuMgr.Cpu(); |
||
302 | cpu.mem_curs = cpu.ix; |
||
303 | } |
||
304 | |||
305 | void miy() |
||
306 | { |
||
307 | Z80 &cpu = CpuMgr.Cpu(); |
||
308 | cpu.mem_curs = cpu.iy; |
||
309 | } |
||
310 | |||
311 | void mmodemem() { editor = ED_MEM; } |
||
312 | void mmodephys() { editor = ED_PHYS; } |
||
313 | void mmodelog() { editor = ED_LOG; } |
||
314 | |||
315 | void mdiskgo() |
||
316 | { |
||
317 | Z80 &cpu = CpuMgr.Cpu(); |
||
318 | if (editor == ED_MEM) return; |
||
319 | for (;;) { |
||
320 | *(unsigned*)str = mem_disk + 'A'; |
||
321 | if (!inputhex(mem_x+5, mem_y-1, 1, true)) return; |
||
322 | if (*str >= 'A' && *str <= 'D') break; |
||
323 | } |
||
324 | mem_disk = *str-'A'; showmem(); |
||
325 | unsigned x = input2(mem_x+12, mem_y-1, mem_track); |
||
326 | if (x == -1) return; |
||
327 | mem_track = x; |
||
328 | if (editor == ED_PHYS) return; |
||
329 | showmem(); |
||
330 | // enter sector |
||
331 | for (;;) { |
||
332 | findsector(cpu.mem_curs); x = input2(mem_x+20, mem_y-1, sector); |
||
333 | if (x == -1) return; if (x < edited_track.s) break; |
||
334 | } |
||
335 | for (cpu.mem_curs = 0; x; x--) cpu.mem_curs += edited_track.hdr[x-1].datlen; |
||
336 | } |