w11 - cpp 0.794
Backend server for Rlink and w11
Loading...
Searching...
No Matches
Rw11Cpu.cpp
Go to the documentation of this file.
1// $Id: Rw11Cpu.cpp 1346 2023-01-06 12:56:08Z mueller $
2// SPDX-License-Identifier: GPL-3.0-or-later
3// Copyright 2013-2023 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
4//
5// Revision History:
6// Date Rev Version Comment
7// 2023-01-05 1346 1.2.22 add kCPUUBMAP
8// 2022-08-08 1274 1.2.21 ssr->mmr rename
9// 2019-06-29 1175 1.2.20 MemWriteByte(): use membe
10// 2019-04-30 1143 1.2.19 add m9312 setup and HasM9312()
11// 2019-04-19 1133 1.2.18 add ExecWibr(),ExecRibr(); LoadAbs(): better trace
12// 2019-04-13 1131 1.2.17 add defs for w11 cpu component addresses; add
13// MemSize(),MemWriteByte(); LoadAbs(): return start,
14// better odd byte handling;
15// 2019-02-16 1112 1.2.16 add ibmon setup and HasIbtst()
16// 2018-12-23 1091 1.2.19 AddWbibr(): add move version
17// 2018-12-19 1090 1.2.18 use RosPrintf(bool)
18// 2018-12-17 1085 1.2.17 use std::mutex,condition_variable instead of boost
19// 2018-12-07 1078 1.2.16 use std::shared_ptr instead of boost
20// 2018-11-16 1070 1.2.15 use auto; use emplace,make_pair; use range loop
21// 2018-09-23 1050 1.2.14 add HasPcnt()
22// 2018-09-22 1048 1.2.13 coverity fixup (drop unreachable code)
23// 2017-04-07 868 1.2.12 Dump(): add detail arg
24// 2017-02-26 857 1.2.11 add kCPAH_M_UBM22
25// 2017-02-19 853 1.2.10 use Rtime
26// 2017-02-17 851 1.2.9 probe/setup auxilliary devices: kw11l,kw11p,iist
27// 2017-02-10 850 1.2.8 add ModLalh()
28// 2017-02-04 848 1.2.7 ProbeCntl: handle probe data
29// 2015-12-26 719 1.2.6 BUGFIX: IM* correct register offset definitions
30// 2015-07-12 700 1.2.5 use ..CpuAct instead ..CpuGo (new active based lam);
31// add probe and map setup for optional cpu components
32// 2015-05-15 682 1.2.4 BUGFIX: Boot(): extract unit number properly
33// Boot(): stop cpu before load, check unit number
34// 2015-05-08 675 1.2.3 w11a start/stop/suspend overhaul
35// 2015-04-25 668 1.2.2 add AddRbibr(), AddWbibr()
36// 2015-04-03 661 1.2.1 add kStat_M_* defs
37// 2015-03-21 659 1.2 add RAddrMap()
38// 2015-01-01 626 1.1 Adopt for rlink v4 and 4k ibus window
39// 2014-12-21 617 1.0.3 use kStat_M_RbTout for rbus timeout
40// 2014-08-02 576 1.0.2 adopt rename of LastExpect->SetLastExpect
41// 2013-04-14 506 1.0.1 add AddLalh(),AddRMem(),AddWMem()
42// 2013-04-12 504 1.0 Initial version
43// 2013-01-27 478 0.1 First draft
44// ---------------------------------------------------------------------------
45
50#include <stdlib.h>
51#include <fcntl.h>
52#include <errno.h>
53#include <unistd.h>
54
55#include <vector>
56#include <map>
57#include <algorithm>
58#include <chrono>
59
61#include "librtools/RlogMsg.hpp"
62#include "librtools/RosFill.hpp"
65#include "Rw11Cntl.hpp"
66
67#include "Rw11Cpu.hpp"
68
69using namespace std;
70
76// all method definitions in namespace Retro
77namespace Retro {
78
79//------------------------------------------+-----------------------------------
80// constants definitions
81
82const uint16_t Rw11Cpu::kCPCONF;
83const uint16_t Rw11Cpu::kCPCNTL;
84const uint16_t Rw11Cpu::kCPSTAT;
85const uint16_t Rw11Cpu::kCPPSW;
86const uint16_t Rw11Cpu::kCPAL;
87const uint16_t Rw11Cpu::kCPAH;
88const uint16_t Rw11Cpu::kCPMEM;
89const uint16_t Rw11Cpu::kCPMEMI;
90const uint16_t Rw11Cpu::kCPR0;
91const uint16_t Rw11Cpu::kCPPC;
92const uint16_t Rw11Cpu::kCPMEMBE;
93
94const uint16_t Rw11Cpu::kCPFUNC_NOOP;
95const uint16_t Rw11Cpu::kCPFUNC_START;
96const uint16_t Rw11Cpu::kCPFUNC_STOP;
97const uint16_t Rw11Cpu::kCPFUNC_STEP;
98const uint16_t Rw11Cpu::kCPFUNC_CRESET;
99const uint16_t Rw11Cpu::kCPFUNC_BRESET;
100const uint16_t Rw11Cpu::kCPFUNC_SUSPEND;
101const uint16_t Rw11Cpu::kCPFUNC_RESUME;
102
103const uint16_t Rw11Cpu::kCPSTAT_M_SuspExt;
104const uint16_t Rw11Cpu::kCPSTAT_M_SuspInt;
105const uint16_t Rw11Cpu::kCPSTAT_M_CpuRust;
106const uint16_t Rw11Cpu::kCPSTAT_V_CpuRust;
107const uint16_t Rw11Cpu::kCPSTAT_B_CpuRust;
108const uint16_t Rw11Cpu::kCPSTAT_M_CpuSusp;
109const uint16_t Rw11Cpu::kCPSTAT_M_CpuGo;
110const uint16_t Rw11Cpu::kCPSTAT_M_CmdMErr;
111const uint16_t Rw11Cpu::kCPSTAT_M_CmdErr;
112
113const uint16_t Rw11Cpu::kCPURUST_INIT;
114const uint16_t Rw11Cpu::kCPURUST_HALT;
115const uint16_t Rw11Cpu::kCPURUST_RESET;
116const uint16_t Rw11Cpu::kCPURUST_STOP;
117const uint16_t Rw11Cpu::kCPURUST_STEP;
118const uint16_t Rw11Cpu::kCPURUST_SUSP;
119const uint16_t Rw11Cpu::kCPURUST_HBPT;
120const uint16_t Rw11Cpu::kCPURUST_RUNS;
121const uint16_t Rw11Cpu::kCPURUST_VECFET;
122const uint16_t Rw11Cpu::kCPURUST_RECRSV;
123const uint16_t Rw11Cpu::kCPURUST_SFAIL;
124const uint16_t Rw11Cpu::kCPURUST_VFAIL;
125
126const uint16_t Rw11Cpu::kCPAH_M_ADDR;
127const uint16_t Rw11Cpu::kCPAH_M_22BIT;
128const uint16_t Rw11Cpu::kCPAH_M_UBMAP;
129const uint16_t Rw11Cpu::kCPAH_M_UBM22;
130
131const uint16_t Rw11Cpu::kCPMEMBE_M_STICK;
132const uint16_t Rw11Cpu::kCPMEMBE_M_BE;
133const uint16_t Rw11Cpu::kCPMEMBE_M_BE0;
134const uint16_t Rw11Cpu::kCPMEMBE_M_BE1;
135
136const uint8_t Rw11Cpu::kStat_M_CmdErr;
137const uint8_t Rw11Cpu::kStat_M_CmdMErr;
138const uint8_t Rw11Cpu::kStat_M_CpuSusp;
139const uint8_t Rw11Cpu::kStat_M_CpuGo;
140
141const uint16_t Rw11Cpu::kCPUPSW;
142const uint16_t Rw11Cpu::kCPUSTKLIM;
143const uint16_t Rw11Cpu::kCPUPIRQ;
144const uint16_t Rw11Cpu::kCPUMBRK;
145const uint16_t Rw11Cpu::kCPUERR;
146const uint16_t Rw11Cpu::kCPUSYSID;
147const uint16_t Rw11Cpu::kCPUSDREG;
148const uint16_t Rw11Cpu::kCPUUBMAP;
149
150const uint16_t Rw11Cpu::kMEMHISIZE;
151const uint16_t Rw11Cpu::kMEMLOSIZE;
152const uint16_t Rw11Cpu::kMEMHM;
153const uint16_t Rw11Cpu::kMEMMAINT;
154const uint16_t Rw11Cpu::kMEMCNTRL;
155const uint16_t Rw11Cpu::kMEMSYSERR;
156const uint16_t Rw11Cpu::kMEMHIADDR;
157const uint16_t Rw11Cpu::kMEMLOADDR;
158
159const uint16_t Rw11Cpu::kMMUMMR3;
160const uint16_t Rw11Cpu::kMMUMMR2;
161const uint16_t Rw11Cpu::kMMUMMR1;
162const uint16_t Rw11Cpu::kMMUMMR0;
163const uint16_t Rw11Cpu::kMMUPDRK;
164const uint16_t Rw11Cpu::kMMUPARK;
165const uint16_t Rw11Cpu::kMMUPDRS;
166const uint16_t Rw11Cpu::kMMUPARS;
167const uint16_t Rw11Cpu::kMMUPDRU;
168const uint16_t Rw11Cpu::kMMUPARU;
169
170const uint16_t Rw11Cpu::kSCBASE;
171const uint16_t Rw11Cpu::kSCCNTL;
172const uint16_t Rw11Cpu::kSCADDR;
173const uint16_t Rw11Cpu::kSCDATA;
174
175const uint16_t Rw11Cpu::kCMBASE;
176const uint16_t Rw11Cpu::kCMCNTL;
177const uint16_t Rw11Cpu::kCMSTAT;
178const uint16_t Rw11Cpu::kCMADDR;
179const uint16_t Rw11Cpu::kCMDATA;
180const uint16_t Rw11Cpu::kCMIADDR;
181const uint16_t Rw11Cpu::kCMIPC;
182const uint16_t Rw11Cpu::kCMIREG;
183const uint16_t Rw11Cpu::kCMIMAL;
184
185const uint16_t Rw11Cpu::kHBBASE;
186const uint16_t Rw11Cpu::kHBSIZE;
187const uint16_t Rw11Cpu::kHBNMAX;
188const uint16_t Rw11Cpu::kHBCNTL;
189const uint16_t Rw11Cpu::kHBSTAT;
190const uint16_t Rw11Cpu::kHBHILIM;
191const uint16_t Rw11Cpu::kHBLOLIM;
192
193const uint16_t Rw11Cpu::kPCBASE;
194const uint16_t Rw11Cpu::kPCCNTL;
195const uint16_t Rw11Cpu::kPCSTAT;
196const uint16_t Rw11Cpu::kPCDATA;
197
198const uint16_t Rw11Cpu::kIMBASE;
199const uint16_t Rw11Cpu::kIMCNTL;
200const uint16_t Rw11Cpu::kIMSTAT;
201const uint16_t Rw11Cpu::kIMHILIM;
202const uint16_t Rw11Cpu::kIMLOLIM;
203const uint16_t Rw11Cpu::kIMADDR;
204const uint16_t Rw11Cpu::kIMDATA;
205
206const uint16_t Rw11Cpu::kM9BASE;
207const uint16_t Rw11Cpu::kKWLBASE;
208const uint16_t Rw11Cpu::kKWPBASE;
209const uint16_t Rw11Cpu::kKWPCSR;
210const uint16_t Rw11Cpu::kKWPCSB;
211const uint16_t Rw11Cpu::kKWPCTR;
212const uint16_t Rw11Cpu::kIISTBASE;
213const uint16_t Rw11Cpu::kIISTACR;
214const uint16_t Rw11Cpu::kIISTADR;
215
216//------------------------------------------+-----------------------------------
218
219Rw11Cpu::Rw11Cpu(const std::string& type)
220 : fpW11(nullptr),
221 fType(type),
222 fIndex(0),
223 fBase(0),
224 fIBase(0x4000),
225 fMemSize(0),
226 fHasScnt(false),
227 fHasPcnt(false),
228 fHasCmon(false),
229 fHasHbpt(0),
230 fHasIbmon(false),
231 fHasIbtst(false),
232 fHasM9312(false),
233 fHasKw11l(false),
234 fHasKw11p(false),
235 fHasIist(false),
236 fCpuAct(0),
237 fCpuStat(0),
238 fCpuActMutex(),
239 fCpuActCond(),
240 fCntlMap(),
241 fIAddrMap(),
242 fRAddrMap(),
243 fStats()
244{}
245
246//------------------------------------------+-----------------------------------
248
250{}
251
252//------------------------------------------+-----------------------------------
254
256{
257 fpW11 = pw11;
258 SetupStd();
259 SetupOpt();
260 return;
261}
262
263//------------------------------------------+-----------------------------------
265
266void Rw11Cpu::AddCntl(const std::shared_ptr<Rw11Cntl>& spcntl)
267{
268 if (!spcntl)
269 throw Rexception("Rw11Cpu::AddCntl","Bad args: spcntl == 0");
270
271 string name(spcntl->Name());
272 if (fCntlMap.find(name) != fCntlMap.end())
273 throw Rexception("Rw11Cpu::AddCntl",
274 "Bad state: duplicate controller name");;
275
276 fCntlMap.emplace(make_pair(name, spcntl));
277 spcntl->SetCpu(this);
278 return;
279}
280
281//------------------------------------------+-----------------------------------
283
284bool Rw11Cpu::TestCntl(const std::string& name) const
285{
286 return fCntlMap.find(name) != fCntlMap.end();
287}
288
289//------------------------------------------+-----------------------------------
291
292void Rw11Cpu::ListCntl(std::vector<std::string>& list) const
293{
294 list.clear();
295 for (auto& o: fCntlMap) {
296 list.push_back(o.second->Name());
297 }
298 return;
299}
300
301//------------------------------------------+-----------------------------------
303
304Rw11Cntl& Rw11Cpu::Cntl(const std::string& name) const
305{
306 auto it=fCntlMap.find(name);
307 if (it == fCntlMap.end())
308 throw Rexception("Rw11Cpu::Cntl()",
309 "Bad args: controller name '" + name + "' unknown");
310 return *(it->second);
311}
312
313//------------------------------------------+-----------------------------------
315
317{
318 for (auto& o: fCntlMap) {
319 Rw11Cntl& cntl(*o.second);
320 cntl.Probe();
321 if (cntl.ProbeStatus().Found() && cntl.Enable()) {
322 cntl.Start();
323 }
324 }
325 return;
326}
327
328//------------------------------------------+-----------------------------------
330
331std::string Rw11Cpu::NextCntlName(const std::string& base) const
332{
333 for (char let='a'; let<='z'; let++) {
334 string name = base + let;
335 if (fCntlMap.find(name) == fCntlMap.end()) return name;
336 }
337 throw Rexception("Rw11Cpu::NextCntlName",
338 "Bad args: all controller letters used for '" + base + "'");
339}
340
341//------------------------------------------+-----------------------------------
343
344int Rw11Cpu::AddMembe(RlinkCommandList& clist, uint16_t be, bool stick)
345{
346 uint16_t data = be & kCPMEMBE_M_BE;
347 if (stick) data |= kCPMEMBE_M_STICK;
348 return clist.AddWreg(fBase+kCPMEMBE, data);
349}
350
351//------------------------------------------+-----------------------------------
353
354int Rw11Cpu::AddRibr(RlinkCommandList& clist, uint16_t ibaddr)
355{
356 if ((ibaddr & 0160001) != 0160000)
357 throw Rexception("Rw11Cpu::AddRibr", "ibaddr out of IO page or odd");
358
359 return clist.AddRreg(IbusRemoteAddr(ibaddr));
360}
361
362//------------------------------------------+-----------------------------------
364
365int Rw11Cpu::AddWibr(RlinkCommandList& clist, uint16_t ibaddr, uint16_t data)
366{
367 if ((ibaddr & 0160001) != 0160000)
368 throw Rexception("Rw11Cpu::AddWibr", "ibaddr out of IO page or odd");
369
370 return clist.AddWreg(IbusRemoteAddr(ibaddr), data);
371}
372
373//------------------------------------------+-----------------------------------
375int Rw11Cpu::AddRbibr(RlinkCommandList& clist, uint16_t ibaddr, size_t size)
376{
377 if ((ibaddr & 0160001) != 0160000)
378 throw Rexception("Rw11Cpu::AddRbibr", "ibaddr out of IO page or odd");
379
380 return clist.AddRblk(IbusRemoteAddr(ibaddr), size);
381}
382
383//------------------------------------------+-----------------------------------
385int Rw11Cpu::AddWbibr(RlinkCommandList& clist, uint16_t ibaddr,
386 const std::vector<uint16_t>& block)
387{
388 if ((ibaddr & 0160001) != 0160000)
389 throw Rexception("Rw11Cpu::AddWbibr", "ibaddr out of IO page or odd");
390
391 return clist.AddWblk(IbusRemoteAddr(ibaddr), block);
392}
393
394//------------------------------------------+-----------------------------------
396int Rw11Cpu::AddWbibr(RlinkCommandList& clist, uint16_t ibaddr,
397 std::vector<uint16_t>&& block)
398{
399 if ((ibaddr & 0160001) != 0160000)
400 throw Rexception("Rw11Cpu::AddWbibr", "ibaddr out of IO page or odd");
401
402 return clist.AddWblk(IbusRemoteAddr(ibaddr), move(block));
403}
404
405//------------------------------------------+-----------------------------------
407
408int Rw11Cpu::AddLalh(RlinkCommandList& clist, uint32_t addr, uint16_t mode)
409{
410 uint16_t al = uint16_t(addr);
411 uint16_t ah = uint16_t(addr>>16) & kCPAH_M_ADDR;
412 ah |= mode & (kCPAH_M_22BIT|kCPAH_M_UBMAP);
413 int ind = clist.AddWreg(fBase+kCPAL, al);
414 clist.AddWreg(fBase+kCPAH, ah);
415 return ind;
416}
417
418//------------------------------------------+-----------------------------------
420
421void Rw11Cpu::ModLalh(RlinkCommandList& clist, size_t ind,
422 uint32_t addr, uint16_t mode)
423{
424 if (ind + 1 > clist.Size())
425 throw Rexception("Rw11Cpu::ModLalh","Bad args: ind out of range");
426
427 uint16_t al = uint16_t(addr);
428 uint16_t ah = uint16_t(addr>>16) & kCPAH_M_ADDR;
429 ah |= mode & (kCPAH_M_22BIT|kCPAH_M_UBMAP);
430
431 RlinkCommand& cmdal = clist[ind];
432 RlinkCommand& cmdah = clist[ind+1];
433
434 if (cmdal.Command() != RlinkCommand::kCmdWreg ||
435 cmdal.Address() != fBase+kCPAL ||
436 cmdah.Command() != RlinkCommand::kCmdWreg ||
437 cmdah.Address() != fBase+kCPAH)
438 throw Rexception("Rw11Cpu::ModLalh","Bad state: not writing cpal/cpah");
439
440 cmdal.SetData(al);
441 cmdah.SetData(ah);
442 return;
443}
444
445//------------------------------------------+-----------------------------------
447
448int Rw11Cpu::AddRMem(RlinkCommandList& clist, uint32_t addr, uint16_t* buf,
449 size_t size, uint16_t mode, bool singleblk)
450{
451 size_t blkmax = Connect().BlockSizeMax();
452 if (singleblk && size > blkmax)
453 throw Rexception("Rw11Cpu::AddRMem",
454 "Bad args: singleblk==true && size > BlockSizeMax()");
455
456 int ind = AddLalh(clist, addr, mode);
457 while (size > 0) {
458 size_t bsize = (size>blkmax) ? blkmax : size;
459 clist.AddRblk(fBase+kCPMEMI, buf, bsize);
460 buf += bsize;
461 size -= bsize;
462 }
463 return ind;
464}
465
466//------------------------------------------+-----------------------------------
468
469int Rw11Cpu::AddWMem(RlinkCommandList& clist, uint32_t addr,
470 const uint16_t* buf, size_t size,
471 uint16_t mode, bool singleblk)
472{
473 size_t blkmax = Connect().BlockSizeMax();
474 if (singleblk && size > blkmax)
475 throw Rexception("Rw11Cpu::AddWMem",
476 "Bad args: singleblk==true && size > BlockSizeMax()");
477
478 int ind = AddLalh(clist, addr, mode);
479 while (size > 0) {
480 size_t bsize = (size>blkmax) ? blkmax : size;
481 clist.AddWblk(fBase+kCPMEMI, buf, bsize);
482 buf += bsize;
483 size -= bsize;
484 }
485 return ind;
486}
487
488//------------------------------------------+-----------------------------------
490
491void Rw11Cpu::ExecWibr(uint16_t ibaddr0, uint16_t data0,
492 uint16_t ibaddr1, uint16_t data1,
493 uint16_t ibaddr2, uint16_t data2)
494{
495 RlinkCommandList clist;
496 AddWibr(clist, ibaddr0, data0);
497 if (ibaddr1 > 0) AddWibr(clist, ibaddr1, data1);
498 if (ibaddr2 > 0) AddWibr(clist, ibaddr2, data2);
499 Server().Exec(clist);
500 return;
501}
502
503//------------------------------------------+-----------------------------------
505
506uint16_t Rw11Cpu::ExecRibr(uint16_t ibaddr)
507{
508 RlinkCommandList clist;
509 int ic = AddRibr(clist, ibaddr);
510 Server().Exec(clist);
511 return clist[ic].Data();
512}
513
514//------------------------------------------+-----------------------------------
516
517bool Rw11Cpu::MemRead(uint16_t addr, std::vector<uint16_t>& data,
518 size_t nword, RerrMsg& emsg)
519{
520 size_t blkmax = Connect().BlockSizePrudent();
521 data.resize(nword);
522 size_t ndone = 0;
523 while (nword>ndone) {
524 size_t nblk = min(blkmax, nword-ndone);
525 RlinkCommandList clist;
526 clist.AddWreg(fBase+kCPAL, addr+2*ndone);
527 clist.AddRblk(fBase+kCPMEMI, data.data()+ndone, nblk);
528 if (!Server().Exec(clist, emsg)) return false;
529 ndone += nblk;
530 }
531 return true;
532}
533
534//------------------------------------------+-----------------------------------
536
537bool Rw11Cpu::MemWrite(uint16_t addr, const std::vector<uint16_t>& data,
538 RerrMsg& emsg)
539{
540 size_t blkmax = Connect().BlockSizePrudent();
541 size_t nword = data.size();
542 size_t ndone = 0;
543 while (nword>ndone) {
544 size_t nblk = min(blkmax, nword-ndone);
545 RlinkCommandList clist;
546 clist.AddWreg(fBase+kCPAL, addr+2*ndone);
547 clist.AddWblk(fBase+kCPMEMI, data.data()+ndone, nblk);
548 if (!Server().Exec(clist, emsg)) return false;
549 ndone += nblk;
550 }
551 return true;
552}
553
554//------------------------------------------+-----------------------------------
556
557bool Rw11Cpu::MemWriteByte(uint32_t addr, uint8_t data, RerrMsg& emsg)
558{
559 if (addr >= MemSize()) {
560 emsg.Init("Rw11Cpu::MemWriteByte", "addr out of range");
561 return false;
562 }
563
564 RlinkCommandList clist;
565 uint16_t be = (addr & 0x01) ? kCPMEMBE_M_BE1 : kCPMEMBE_M_BE0;
566 uint16_t wdata = (uint16_t(data)<<8) | data; // fill byte into word
567 AddLalh(clist, addr&0x3ffffe, kCPAH_M_22BIT); // setup address
568 AddMembe(clist, be); // setup byte enable
569 clist.AddWreg(fBase+kCPMEM, wdata); // and finally write byte
570 if (!Server().Exec(clist, emsg)) return false;
571 return true;
572}
573
574//------------------------------------------+-----------------------------------
576
578{
579 if (!(dsc.fProbeInt | dsc.fProbeRem) || dsc.fAddr == 0)
580 throw Rexception("Rw11Cpu::Probe",
581 "Bad args: fAddr == 0 or fProbeInt|fProbeRem == false");
582
583 if (!dsc.fProbeDone) {
584 RlinkCommandList clist;
585 int iib = -1;
586 int irb = -1;
587 if (dsc.fProbeInt) {
588 clist.AddWreg(fBase+kCPAL, dsc.fAddr);
589 iib = clist.AddRreg(fBase+kCPMEM);
590 clist.SetLastExpectStatus(0,0); // disable stat check
591 }
592 if (dsc.fProbeRem) {
593 irb = AddRibr(clist, dsc.fAddr);
594 clist.SetLastExpectStatus(0,0); // disable stat check
595 }
596
597 dsc.fFoundInt = false;
598 dsc.fFoundRem = false;
599 dsc.fDataInt = 0;
600 dsc.fDataRem = 0;
601
602 Server().Exec(clist);
603
604 if (dsc.fProbeInt) {
605 dsc.fFoundInt = (clist[iib].Status() &
609 if (dsc.fFoundInt) dsc.fDataInt = clist[iib].Data();
610 }
611 if (dsc.fProbeRem) {
612 dsc.fFoundRem = (clist[irb].Status() &
616 if (dsc.fFoundRem) dsc.fDataRem = clist[irb].Data();
617 }
618 dsc.fProbeDone = true;
619 }
620
621 return dsc.Found();
622}
623
624//------------------------------------------+-----------------------------------
626
627// absolute binary format described in notes_ptape.txt
628
629bool Rw11Cpu::LoadAbs(const std::string& fname, RerrMsg& emsg,
630 uint16_t& start, bool trace)
631{
632 start = -1;
633 int fd = open(fname.c_str(), O_RDONLY);
634
635 if (fd < 0) {
636 emsg.InitErrno("Rw11Cpu::LoadAbs()", string("open() for '") + fname +
637 "' failed: ", errno);
638 return false;
639 }
640
641 enum states {
642 s_chr0, // skip 000; search 001 start code
643 s_chr1, // read 000 record starte code
644 s_cntlow, // read count lsb
645 s_cnthgh, // read count msb
646 s_adrlow, // read address lsb
647 s_adrhgh, // read address msb
648 s_data, // read data
649 s_chksum // read checksum
650 };
651
652 vector<uint16_t> data;
653 data.reserve(256);
654
655 int chrnum = -1; // char number in block
656 int blknum = 0; // block number
657 int bytcnt = 0; // byte count
658 uint16_t ldaddr = 0; // load address
659 uint8_t chksum = 0; // check sum
660 uint16_t addr = 0; // current address
661 uint16_t word = 0; // current word
662
663 bool firstodd = false; // first byte to odd address
664
665 bool ok = false;
666 bool go = true;
667 enum states state = s_chr0;
668
669 while (go) {
670 uint8_t byte;
671 int irc = ::read(fd, &byte, 1);
672 if (irc == 0) {
673 if (state == s_chr0) {
674 ok = true;
675 } else {
676 emsg.Init("Rw11Cpu::LoadAbs()", "unexpected EOF");
677 }
678 break;
679 } else if (irc < 0) {
680 emsg.InitErrno("Rw11Cpu::LoadAbs()", "read() failed: ", errno);
681 break;
682 }
683
684 chrnum += 1;
685 chksum += byte;
686
687 //cout << "+++1 " << blknum << "," << chrnum << " s=" << state << " : "
688 // << RosPrintBvi(byte,8) << endl;
689
690 switch (state) {
691 case s_chr0: // skip 000; search 001 start code
692 if (byte == 0) {
693 chrnum = -1;
694 state = s_chr0;
695 } else if (byte == 1) {
696 state = s_chr1;
697 } else {
698 emsg.InitPrintf("Rw11Cpu::LoadAbs()",
699 "unexpected start-of-block %3.3o", byte);
700 go = false;
701 }
702 break;
703
704 case s_chr1: // read 000 record starte code ---
705 if (byte == 0) {
706 state = s_cntlow;
707 } else {
708 emsg.InitPrintf("Rw11Cpu::LoadAbs()",
709 "unexpected 2nd char %3.3o", byte);
710 go = false;
711 }
712 break;
713
714 case s_cntlow: // read count lsb ----------------
715 bytcnt = byte;
716 state = s_cnthgh;
717 break;
718
719 case s_cnthgh: // read count msb ----------------
720 bytcnt |= uint16_t(byte) << 8;
721 state = s_adrlow;
722 break;
723
724 case s_adrlow: // read address lsb --------------
725 ldaddr = byte;
726 state = s_adrhgh;
727 break;
728
729 case s_adrhgh: // read address msb --------------
730 ldaddr |= uint16_t(byte) << 8;
731 addr = ldaddr;
732 word = 0;
733 firstodd = (addr & 0x01) == 1;
734
735 if (trace) {
736 RlogMsg lmsg(Connect().LogFile());
737 lmsg << "LoadAbs-I: block " << RosPrintf(blknum,"d",3)
738 << ", length " << RosPrintf(bytcnt-6,"d",5)
739 << " byte, address " << RosPrintBvi(ldaddr,8);
740 if (bytcnt > 6)
741 lmsg << ":" << RosPrintBvi(uint16_t(ldaddr+(bytcnt-6)-1),8);
742 }
743 state = (bytcnt == 6) ? s_chksum : s_data;
744 break;
745
746 case s_data: // read data ---------------------
747 if ((addr & 0x01) == 0) { // even (low) byte
748 word = byte;
749 } else { // odd (high) byte
750 if (firstodd) { // first odd byte
751 if (!MemWriteByte(addr, byte, emsg)) go = false; // write byte and
752 ldaddr += 1; // update blk addr
753 firstodd = false;
754 } else {
755 word |= uint16_t(byte) << 8;
756 data.push_back(word);
757 }
758 }
759 addr += 1;
760 if (chrnum == bytcnt-1) state = s_chksum;
761 break;
762
763 case s_chksum: // read checksum -----------------
764 if (chksum != 0) {
765 emsg.InitPrintf("Rw11Cpu::LoadAbs()", "check sum error %3.3o", chksum);
766 go = false;
767 } else if (bytcnt == 6) {
768 start = ldaddr;
769 if (trace) {
770 RlogMsg lmsg(Connect().LogFile());
771 lmsg << "LoadAbs-I: start address " << RosPrintBvi(ldaddr,8);
772 }
773 go = false;
774 ok = true;
775 } else {
776 if (!MemWrite(ldaddr, data, emsg)) go = false;
777 if ((addr & 0x01) == 1) { // last byte even -> write it
778 if (!MemWriteByte(addr-1, uint8_t(word), emsg)) go = false;
779 }
780 data.clear();
781 }
782 chrnum = -1;
783 blknum += 1;
784 state = s_chr0;
785 break;
786
787 } // switch(state)
788 } // while(go)
789
790 ::close(fd);
791
792 return ok;
793}
794
795//------------------------------------------+-----------------------------------
797
798bool Rw11Cpu::Boot(const std::string& uname, RerrMsg& emsg)
799{
800 string cname;
801 size_t uind=0;
802 for (size_t i=0; i<uname.length(); i++) {
803 char c = uname[i];
804 if (c >= '0' && c <= '9') {
805 string unum = uname.substr(i);
806 uind = ::atoi(unum.c_str());
807 break;
808 } else {
809 cname.push_back(c);
810 }
811 }
812
813 if (!TestCntl(cname)) {
814 emsg.Init("Rw11Cpu::Boot", string("controller '") + cname + "' not known");
815 return false;
816 }
817
818 Rw11Cntl& cntl = Cntl(cname);
819 if (uind >= cntl.NUnit()) {
820 emsg.Init("Rw11Cpu::Boot", string("unit number '") + uname + "' invalid");
821 return false;
822 }
823
824 vector<uint16_t> code;
825 uint16_t aload = 0;
826 uint16_t astart = 0;
827
828 if (!cntl.BootCode(uind, code, aload, astart) || code.size()==0) {
829 emsg.Init("Rw11Cpu::Boot", string("boot not supported for controller '")
830 + cname + "'");
831 return false;
832 }
833
834 // stop and reset cpu, just in case
835 RlinkCommandList clist;
836 clist.AddWreg(fBase+kCPCNTL, kCPFUNC_STOP); // stop cpu
837 clist.AddWreg(fBase+kCPCNTL, kCPFUNC_CRESET); // init cpu and bus
838 if (!Server().Exec(clist, emsg)) return false;
839
840 // load boot code
841 if (!MemWrite(aload, code, emsg)) return false;
842
843 // and start cpu at boot loader start address
844 clist.Clear();
845 clist.AddWreg(fBase+kCPPC, astart); // load PC
846 clist.AddWreg(fBase+kCPCNTL, kCPFUNC_START); // and start
847 SetCpuActUp();
848 if (!Server().Exec(clist, emsg)) return false;
849
850 return true;
851}
852
853//------------------------------------------+-----------------------------------
855
857{
858 lock_guard<mutex> lock(fCpuActMutex);
859 fCpuAct = true;
860 fCpuStat = 0;
861 fCpuActCond.notify_all();
862 return;
863}
864
865//------------------------------------------+-----------------------------------
867
868void Rw11Cpu::SetCpuActDown(uint16_t stat)
869{
870 if ((stat & kCPSTAT_M_CpuGo) == 0 || (stat & kCPSTAT_M_CpuSusp) != 0 ) {
871 lock_guard<mutex> lock(fCpuActMutex);
872 fCpuAct = false;
873 fCpuStat = stat;
874 fCpuActCond.notify_all();
875 }
876 return;
877}
878
879//------------------------------------------+-----------------------------------
881
882int Rw11Cpu::WaitCpuActDown(const Rtime& tout, Rtime& twait)
883{
884 Rtime tstart(CLOCK_MONOTONIC);
885 twait.Clear();
886
887 chrono::duration<double> timeout(chrono::duration<double>::max());
888 if (tout.IsPositive())
889 timeout = chrono::duration<double>(tout.ToDouble());
890
891 unique_lock<mutex> lock(fCpuActMutex);
892 while (fCpuAct) {
893 if (fCpuActCond.wait_for(lock, timeout) == cv_status::timeout) return -1;
894 }
895 twait = Rtime(CLOCK_MONOTONIC) - tstart;
896 return twait.IsPositive();
897}
898
899//------------------------------------------+-----------------------------------
901
902void Rw11Cpu::AllIAddrMapInsert(const std::string& name, uint16_t ibaddr)
903{
904 IAddrMapInsert(name, ibaddr);
905 uint16_t rbaddr = IbusRemoteAddr(ibaddr);
906 RAddrMapInsert(name, rbaddr);
907
908 // add ix. to name in common Connect AddrMap to keep name unique
909 string cname = "i";
910 cname += '0'+Index();
911 cname += '.';
912 cname += name;
913 Connect().AddrMapInsert(cname, rbaddr);
914
915 return;
916}
917
918//------------------------------------------+-----------------------------------
920
921void Rw11Cpu::AllRAddrMapInsert(const std::string& name, uint16_t rbaddr)
922{
923 RAddrMapInsert(name, rbaddr);
924
925 // add cx. to name in common Connect AddrMap to keep name unique
926 string cname = "c";
927 cname += '0'+Index();
928 cname += '.';
929 cname += name;
930 Connect().AddrMapInsert(cname, rbaddr);
931
932 return;
933}
934
935//------------------------------------------+-----------------------------------
937
939{
940 RlinkCommandList clist;
941 clist.AddRreg(fBase+kCPSTAT);
942 Server().Exec(clist);
943 SetCpuActDown(clist[0].Data());
944 return;
945}
946
947//------------------------------------------+-----------------------------------
949
950void Rw11Cpu::Dump(std::ostream& os, int ind, const char* text,
951 int detail) const
952{
953 RosFill bl(ind);
954 os << bl << (text?text:"--") << "Rw11Cpu @ " << this << endl;
955
956 os << bl << " fpW11: " << fpW11 << endl;
957 os << bl << " fType: " << fType << endl;
958 os << bl << " fIndex: " << fIndex << endl;
959 os << bl << " fBase: " << RosPrintf(fBase,"$x0",4) << endl;
960 os << bl << " fIBase: " << RosPrintf(fIBase,"$x0",4) << endl;
961 os << bl << " fHasScnt: " << RosPrintf(fHasScnt) << endl;
962 os << bl << " fHasPcnt: " << RosPrintf(fHasPcnt) << endl;
963 os << bl << " fHasCmon: " << RosPrintf(fHasCmon) << endl;
964 os << bl << " fHasHbpt: " << fHasHbpt << endl;
965 os << bl << " fHasIbmon: " << RosPrintf(fHasIbmon) << endl;
966 os << bl << " fHasIbtst: " << RosPrintf(fHasIbtst) << endl;
967 os << bl << " fHasM9312: " << RosPrintf(fHasM9312) << endl;
968 os << bl << " fHasKw11l: " << RosPrintf(fHasKw11l) << endl;
969 os << bl << " fHasKw11p: " << RosPrintf(fHasKw11p) << endl;
970 os << bl << " fHasIist: " << RosPrintf(fHasIist) << endl;
971 os << bl << " fCpuAct: " << RosPrintf(fCpuAct) << endl;
972 os << bl << " fCpuStat: " << RosPrintf(fCpuStat,"$x0",4) << endl;
973 os << bl << " fCntlMap: " << endl;
974 for (auto& o: fCntlMap) {
975 os << bl << " " << RosPrintf(o.first.c_str(), "-s",8)
976 << " : " << o.second << endl;
977 }
978 fIAddrMap.Dump(os, ind+2, "fIAddrMap: ", detail-1);
979 fRAddrMap.Dump(os, ind+2, "fRAddrMap: ", detail-1);
980 fStats.Dump(os, ind+2, "fStats: ", detail);
981 return;
982}
983
984//------------------------------------------+-----------------------------------
986
988{
989 // add control port address rbus mappings
990 AllRAddrMapInsert("conf" , Base()+kCPCONF);
991 AllRAddrMapInsert("cntl" , Base()+kCPCNTL);
992 AllRAddrMapInsert("stat" , Base()+kCPSTAT);
993 AllRAddrMapInsert("psw" , Base()+kCPPSW);
994 AllRAddrMapInsert("al" , Base()+kCPAL);
995 AllRAddrMapInsert("ah" , Base()+kCPAH);
996 AllRAddrMapInsert("mem" , Base()+kCPMEM);
997 AllRAddrMapInsert("memi" , Base()+kCPMEMI);
998 AllRAddrMapInsert("r0" , Base()+kCPR0);
999 AllRAddrMapInsert("r1" , Base()+kCPR0+1);
1000 AllRAddrMapInsert("r2" , Base()+kCPR0+2);
1001 AllRAddrMapInsert("r3" , Base()+kCPR0+3);
1002 AllRAddrMapInsert("r4" , Base()+kCPR0+4);
1003 AllRAddrMapInsert("r5" , Base()+kCPR0+5);
1004 AllRAddrMapInsert("sp" , Base()+kCPR0+6);
1005 AllRAddrMapInsert("pc" , Base()+kCPR0+7);
1006 AllRAddrMapInsert("membe", Base()+kCPMEMBE);
1007
1008 // add cpu register address ibus and rbus mappings
1009 AllIAddrMapInsert("psw" , kCPUPSW);
1010 AllIAddrMapInsert("stklim" , kCPUSTKLIM);
1011 AllIAddrMapInsert("pirq" , kCPUPIRQ);
1012 AllIAddrMapInsert("mbrk" , kCPUMBRK);
1013 AllIAddrMapInsert("cpuerr" , kCPUERR);
1014 AllIAddrMapInsert("sysid" , kCPUSYSID);
1015 AllIAddrMapInsert("sdreg" , kCPUSDREG);
1016
1017 AllIAddrMapInsert("hisize" , kMEMHISIZE);
1018 AllIAddrMapInsert("losize" , kMEMLOSIZE);
1019 AllIAddrMapInsert("hm" , kMEMHM);
1020 AllIAddrMapInsert("maint" , kMEMMAINT);
1021 AllIAddrMapInsert("cntrl" , kMEMCNTRL);
1022 AllIAddrMapInsert("syserr" , kMEMSYSERR);
1023 AllIAddrMapInsert("hiaddr" , kMEMHIADDR);
1024 AllIAddrMapInsert("loaddr" , kMEMLOADDR);
1025
1026 AllIAddrMapInsert("mmr3" , kMMUMMR3);
1027 AllIAddrMapInsert("mmr2" , kMMUMMR2);
1028 AllIAddrMapInsert("mmr1" , kMMUMMR1);
1029 AllIAddrMapInsert("mmr0" , kMMUMMR0);
1030
1031 // add mmu segment register files
1032 string pdr = "pdr";
1033 string par = "par";
1034 for (char i=0; i<8; i++) {
1035 char ichar = '0'+i;
1036 AllIAddrMapInsert(pdr+"ki."+ichar, kMMUPDRK+000+2*i);
1037 AllIAddrMapInsert(pdr+"kd."+ichar, kMMUPDRK+020+2*i);
1038 AllIAddrMapInsert(par+"ki."+ichar, kMMUPARK+000+2*i);
1039 AllIAddrMapInsert(par+"kd."+ichar, kMMUPARK+020+2*i);
1040 AllIAddrMapInsert(pdr+"si."+ichar, kMMUPDRS+000+2*i);
1041 AllIAddrMapInsert(pdr+"sd."+ichar, kMMUPDRS+020+2*i);
1042 AllIAddrMapInsert(par+"si."+ichar, kMMUPARS+000+2*i);
1043 AllIAddrMapInsert(par+"sd."+ichar, kMMUPARS+020+2*i);
1044 AllIAddrMapInsert(pdr+"ui."+ichar, kMMUPDRU+000+2*i);
1045 AllIAddrMapInsert(pdr+"ud."+ichar, kMMUPDRU+020+2*i);
1046 AllIAddrMapInsert(par+"ui."+ichar, kMMUPARU+000+2*i);
1047 AllIAddrMapInsert(par+"ud."+ichar, kMMUPARU+020+2*i);
1048 }
1049
1050 return;
1051}
1052
1053//------------------------------------------+-----------------------------------
1055
1057{
1058 // probe
1059 // - memory size: read losize register
1060 // - optional cpu components: dmscnt, dmcmon, dmhbpt and ibmon, ibtst
1061 // - optional devices: KW11-L, KW11-P, M9312, IIST
1062 RlinkCommandList clist;
1063
1064 int ims = AddRibr(clist, kMEMLOSIZE); // read losize
1065
1066 int isc = clist.AddRreg(Base()+kSCBASE+kSCCNTL);
1067 clist.SetLastExpectStatus(0,0);
1068
1069 int icm = clist.AddRreg(Base()+kCMBASE+kCMCNTL);
1070 clist.SetLastExpectStatus(0,0);
1071
1072 int ihb[kHBNMAX];
1073 for (int i=0; i<kHBNMAX; i++) {
1074 ihb[i] = clist.AddRreg(Base()+kHBBASE+i*kHBSIZE+kHBCNTL);
1075 clist.SetLastExpectStatus(0,0);
1076 }
1077
1078 int iim = AddRibr(clist, kIMBASE+kIMCNTL); // ibmon probe rem (no loc resp)
1079 clist.SetLastExpectStatus(0,0);
1080
1081 int iit = AddRibr(clist, kITBASE+kITCNTL); // ibtst probe rem (loc disabled)
1082 clist.SetLastExpectStatus(0,0);
1083
1084 int ipc = clist.AddRreg(Base()+kPCBASE+kPCCNTL);
1085 clist.SetLastExpectStatus(0,0);
1086
1087 // probe auxilliary cpu components: m9312, kw11-l, kw11-p, iist
1088 int im9= AddRibr(clist, kM9BASE); // m9312 probe rem
1089 clist.SetLastExpectStatus(0,0);
1090
1091 int ikwl= AddRibr(clist, kKWLBASE); // kw11-l probe rem
1092 clist.SetLastExpectStatus(0,0);
1093
1094 int ikwp= AddRibr(clist, kKWPBASE + kKWPCSR); // kw11-p probe rem
1095 clist.SetLastExpectStatus(0,0);
1096
1097 int iii = AddRibr(clist, kIISTBASE + kIISTACR); // iist probe rem
1098 clist.SetLastExpectStatus(0,0);
1099
1100 Connect().Exec(clist);
1101
1102 fMemSize = uint32_t(clist[ims].Data()+1)<<6; // losize is click count -1
1103
1104 uint8_t statmsk = RlinkCommand::kStat_M_RbTout |
1107
1108 fHasScnt = (clist[isc].Status() & statmsk) == 0;
1109 if (fHasScnt) {
1110 uint16_t base = Base() + kSCBASE;
1111 AllRAddrMapInsert("sc.cntl" , base + kSCCNTL);
1112 AllRAddrMapInsert("sc.addr" , base + kSCADDR);
1113 AllRAddrMapInsert("sc.data" , base + kSCDATA);
1114 }
1115
1116 fHasCmon = (clist[icm].Status() & statmsk) == 0;
1117 if (fHasCmon) {
1118 uint16_t base = Base() + kCMBASE;
1119 AllRAddrMapInsert("cm.cntl" , base + kCMCNTL);
1120 AllRAddrMapInsert("cm.stat" , base + kCMSTAT);
1121 AllRAddrMapInsert("cm.addr" , base + kCMADDR);
1122 AllRAddrMapInsert("cm.data" , base + kCMDATA);
1123 AllRAddrMapInsert("cm.iaddr" , base + kCMIADDR);
1124 AllRAddrMapInsert("cm.ipc" , base + kCMIPC);
1125 AllRAddrMapInsert("cm.ireg" , base + kCMIREG);
1126 AllRAddrMapInsert("cm.imal" , base + kCMIMAL);
1127 }
1128
1129 fHasHbpt = 0;
1130 for (int i=0; i<kHBNMAX; i++) {
1131 if ((clist[ihb[i]].Status() & statmsk) != 0) break;
1132 fHasHbpt += 1;
1133 uint16_t base = Base() + kHBBASE + i*kHBSIZE;
1134 std::string pref = "hb";
1135 pref += '0'+i;
1136 AllRAddrMapInsert(pref+".cntl" , base + kHBCNTL);
1137 AllRAddrMapInsert(pref+".stat" , base + kHBSTAT);
1138 AllRAddrMapInsert(pref+".hilim" , base + kHBHILIM);
1139 AllRAddrMapInsert(pref+".lolim" , base + kHBLOLIM);
1140 }
1141
1142 fHasPcnt = (clist[ipc].Status() & statmsk) == 0;
1143 if (fHasPcnt) {
1144 uint16_t base = Base() + kPCBASE;
1145 AllRAddrMapInsert("pc.cntl" , base + kPCCNTL);
1146 AllRAddrMapInsert("pc.stat" , base + kPCSTAT);
1147 AllRAddrMapInsert("pc.data" , base + kPCDATA);
1148 }
1149
1150 fHasIbmon = (clist[iim].Status() & statmsk) == 0;
1151 if (fHasIbmon) {
1152 AllIAddrMapInsert("im.cntl", kIMBASE + kIMCNTL);
1153 AllIAddrMapInsert("im.stat", kIMBASE + kIMSTAT);
1154 AllIAddrMapInsert("im.hilim", kIMBASE + kIMHILIM);
1155 AllIAddrMapInsert("im.lolim", kIMBASE + kIMLOLIM);
1156 AllIAddrMapInsert("im.addr", kIMBASE + kIMADDR);
1157 AllIAddrMapInsert("im.data", kIMBASE + kIMDATA);
1158 }
1159
1160 fHasIbtst = (clist[iit].Status() & statmsk) == 0;
1161 if (fHasIbtst) {
1162 AllIAddrMapInsert("it.cntl", kITBASE + kITCNTL);
1163 AllIAddrMapInsert("it.stat", kITBASE + kITSTAT);
1164 AllIAddrMapInsert("it.data", kITBASE + kITDATA);
1165 AllIAddrMapInsert("it.fifo", kITBASE + kITFIFO);
1166 }
1167
1168 fHasKw11l = (clist[ikwl].Status() & statmsk) == 0;
1169 if (fHasKw11l) {
1170 AllIAddrMapInsert("kwl.csr", kKWLBASE);
1171 }
1172
1173 fHasM9312 = (clist[im9].Status() & statmsk) == 0;
1174 if (fHasM9312) {
1175 AllIAddrMapInsert("m9.csr", kM9BASE);
1176 }
1177
1178 fHasKw11p = (clist[ikwp].Status() & statmsk) == 0;
1179 if (fHasKw11p) {
1180 AllIAddrMapInsert("kwp.csr", kKWPBASE + kKWPCSR);
1181 AllIAddrMapInsert("kwp.csb", kKWPBASE + kKWPCSB);
1182 AllIAddrMapInsert("kwp.ctr", kKWPBASE + kKWPCTR);
1183 }
1184
1185 fHasIist = (clist[iii].Status() & statmsk) == 0;
1186 if (fHasIist) {
1187 AllIAddrMapInsert("iist.acr", kIISTBASE + kIISTACR);
1188 AllIAddrMapInsert("iist.adr", kIISTBASE + kIISTADR);
1189 }
1190
1191 return;
1192}
1193
1194
1195} // end namespace Retro
FIXME_docs.
Definition: RerrMsg.hpp:25
void Init(const std::string &meth, const std::string &text)
FIXME_docs.
Definition: RerrMsg.cpp:74
void InitPrintf(const std::string &meth, const char *format,...)
FIXME_docs.
Definition: RerrMsg.cpp:96
void InitErrno(const std::string &meth, const std::string &text, int errnum)
FIXME_docs.
Definition: RerrMsg.cpp:84
FIXME_docs.
Definition: Rexception.hpp:29
void Dump(std::ostream &os, int ind=0, const char *text=0, int detail=0) const
FIXME_docs.
size_t AddWreg(uint16_t addr, uint16_t data)
FIXME_docs.
size_t Size() const
FIXME_docs.
size_t AddRblk(uint16_t addr, size_t size)
FIXME_docs.
void SetLastExpectStatus(uint8_t stat, uint8_t statmsk=0xff)
FIXME_docs.
size_t AddWblk(uint16_t addr, const std::vector< uint16_t > &block)
FIXME_docs.
size_t AddRreg(uint16_t addr)
FIXME_docs.
uint16_t Address() const
FIXME_docs.
static const uint8_t kStat_M_RbErr
stat: rberr flag set
static const uint8_t kStat_M_RbNak
stat: rbnak flag set
static const uint8_t kStat_M_RbTout
stat: rbtout flag set
void SetData(uint16_t data)
FIXME_docs.
uint8_t Command() const
FIXME_docs.
static const uint8_t kCmdWreg
command code write register
bool AddrMapInsert(const std::string &name, uint16_t addr)
FIXME_docs.
bool Exec(RlinkCommandList &clist, RerrMsg &emsg)
FIXME_docs.
size_t BlockSizeMax() const
FIXME_docs.
size_t BlockSizePrudent() const
FIXME_docs.
bool Exec(RlinkCommandList &clist, RerrMsg &emsg)
FIXME_docs.
Definition: RlinkServer.ipp:60
FIXME_docs.
Definition: RlogMsg.hpp:24
I/O appicator to generate fill characters.
Definition: RosFill.hpp:24
void Dump(std::ostream &os, int ind=0, const char *text=0, int detail=0) const
FIXME_docs.
Definition: Rstats.cpp:178
FIXME_docs.
Definition: Rtime.hpp:25
bool IsPositive() const
FIXME_docs.
Definition: Rtime.ipp:93
void Clear()
FIXME_docs.
Definition: Rtime.ipp:76
double ToDouble() const
FIXME_docs.
Definition: Rtime.ipp:142
FIXME_docs.
Definition: Rw11Cntl.hpp:42
const Rw11Probe & ProbeStatus() const
FIXME_docs.
Definition: Rw11Cntl.ipp:136
bool Enable() const
FIXME_docs.
Definition: Rw11Cntl.ipp:104
virtual bool BootCode(size_t unit, std::vector< uint16_t > &code, uint16_t &aload, uint16_t &astart)
FIXME_docs.
Definition: Rw11Cntl.cpp:93
virtual void Start()
FIXME_docs.
Definition: Rw11Cntl.cpp:84
virtual bool Probe()
FIXME_docs.
Definition: Rw11Cntl.cpp:76
virtual size_t NUnit() const =0
static const uint16_t kITSTAT
IT.STAT reg offset.
Definition: Rw11Cpu.hpp:311
static const uint16_t kMEMLOSIZE
MEM LOSIZE address.
Definition: Rw11Cpu.hpp:252
static const uint8_t kStat_M_CmdMErr
stat: cmdmerr flag
Definition: Rw11Cpu.hpp:237
static const uint16_t kCPURUST_STEP
cpu was stepped
Definition: Rw11Cpu.hpp:216
static const uint16_t kPCDATA
PC.DATA reg offset.
Definition: Rw11Cpu.hpp:299
static const uint16_t kCPURUST_VECFET
vector fetch halt
Definition: Rw11Cpu.hpp:220
static const uint16_t kHBSTAT
HB.STAT reg offset.
Definition: Rw11Cpu.hpp:292
static const uint16_t kCPUUBMAP
UBMAP base address.
Definition: Rw11Cpu.hpp:249
static const uint16_t kIISTADR
II.ADR reg offset.
Definition: Rw11Cpu.hpp:324
void SetCpuActDown(uint16_t stat)
FIXME_docs.
Definition: Rw11Cpu.cpp:868
static const uint16_t kMEMCNTRL
MEM CNTRL address.
Definition: Rw11Cpu.hpp:255
static const uint16_t kCPURUST_RUNS
cpu running
Definition: Rw11Cpu.hpp:219
uint16_t Base() const
FIXME_docs.
Definition: Rw11Cpu.ipp:78
bool fHasIbtst
has ibtst (ibus tester)
Definition: Rw11Cpu.hpp:345
static const uint16_t kHBHILIM
HB.HILIM reg offset.
Definition: Rw11Cpu.hpp:293
static const uint16_t kIMSTAT
IM.STAT reg offset.
Definition: Rw11Cpu.hpp:303
void Setup(Rw11 *pw11)
FIXME_docs.
Definition: Rw11Cpu.cpp:255
static const uint16_t kKWPCTR
KWP.CTR reg offset.
Definition: Rw11Cpu.hpp:321
static const uint16_t kCPMEM
CPMEM reg offset.
Definition: Rw11Cpu.hpp:187
void SetupOpt()
FIXME_docs.
Definition: Rw11Cpu.cpp:1056
static const uint16_t kMMUPDRU
MMU PDRU address.
Definition: Rw11Cpu.hpp:269
static const uint16_t kITBASE
Ibtst ibus address.
Definition: Rw11Cpu.hpp:309
std::condition_variable fCpuActCond
Definition: Rw11Cpu.hpp:353
static const uint16_t kCPUPIRQ
CPU PIRQ address.
Definition: Rw11Cpu.hpp:244
static const uint16_t kCMIREG
CM.IREG reg offset.
Definition: Rw11Cpu.hpp:285
static const uint16_t kCPFUNC_STOP
STOP func code.
Definition: Rw11Cpu.hpp:195
std::mutex fCpuActMutex
Definition: Rw11Cpu.hpp:352
bool fHasIist
has iist (smp comm)
Definition: Rw11Cpu.hpp:349
static const uint16_t kCPR0
CPR0 reg offset.
Definition: Rw11Cpu.hpp:189
static const uint16_t kKWPCSB
KWP.CSB reg offset.
Definition: Rw11Cpu.hpp:320
bool Boot(const std::string &uname, RerrMsg &emsg)
FIXME_docs.
Definition: Rw11Cpu.cpp:798
static const uint16_t kCPFUNC_NOOP
NOOP func code.
Definition: Rw11Cpu.hpp:193
static const uint16_t kIMLOLIM
IM.LOLIM reg offset.
Definition: Rw11Cpu.hpp:305
static const uint16_t kIMADDR
IM.ADDR reg offset.
Definition: Rw11Cpu.hpp:306
RlinkConnect & Connect() const
FIXME_docs.
Definition: Rw11Cpu.ipp:46
static const uint16_t kCPMEMBE_M_BE
membe: be field
Definition: Rw11Cpu.hpp:231
static const uint16_t kSCBASE
DMSCNT reg base offset.
Definition: Rw11Cpu.hpp:273
static const uint16_t kHBNMAX
DMHBPT max number units.
Definition: Rw11Cpu.hpp:290
void AllIAddrMapInsert(const std::string &name, uint16_t ibaddr)
FIXME_docs.
Definition: Rw11Cpu.cpp:902
uint16_t ExecRibr(uint16_t ibaddr)
FIXME_docs.
Definition: Rw11Cpu.cpp:506
static const uint16_t kIMHILIM
IM.HILIM reg offset.
Definition: Rw11Cpu.hpp:304
static const uint16_t kCPMEMBE_M_BE0
membe: be0 flag
Definition: Rw11Cpu.hpp:232
static const uint16_t kCPSTAT_M_CpuGo
cpugo mask
Definition: Rw11Cpu.hpp:208
void ListCntl(std::vector< std::string > &list) const
FIXME_docs.
Definition: Rw11Cpu.cpp:292
static const uint16_t kCPSTAT_M_SuspInt
suspint mask
Definition: Rw11Cpu.hpp:203
static const uint16_t kMMUPDRS
MMU PDRS address.
Definition: Rw11Cpu.hpp:267
static const uint16_t kCPURUST_SFAIL
sequencer failure
Definition: Rw11Cpu.hpp:222
static const uint16_t kCMIPC
CM.IPC reg offset.
Definition: Rw11Cpu.hpp:284
static const uint16_t kCPAH
CPAH reg offset.
Definition: Rw11Cpu.hpp:186
bool fHasM9312
has m9312 (boot rom)
Definition: Rw11Cpu.hpp:346
void SetCpuActUp()
FIXME_docs.
Definition: Rw11Cpu.cpp:856
static const uint16_t kIMDATA
IM.DATA reg offset.
Definition: Rw11Cpu.hpp:307
static const uint16_t kCPFUNC_STEP
STEP func code.
Definition: Rw11Cpu.hpp:196
int AddRbibr(RlinkCommandList &clist, uint16_t ibaddr, size_t size)
FIXME_docs.
Definition: Rw11Cpu.cpp:375
static const uint16_t kHBLOLIM
HB.LOLIM reg offset.
Definition: Rw11Cpu.hpp:294
static const uint16_t kCPCONF
CPCONF reg offset.
Definition: Rw11Cpu.hpp:181
static const uint16_t kCPSTAT_B_CpuRust
cpurust bit mask
Definition: Rw11Cpu.hpp:206
void Start()
FIXME_docs.
Definition: Rw11Cpu.cpp:316
uint16_t fHasHbpt
has dmhbpt (hardware breakpoint)
Definition: Rw11Cpu.hpp:343
static const uint16_t kPCBASE
DMPCNT reg base offset.
Definition: Rw11Cpu.hpp:296
RlinkAddrMap fRAddrMap
rbus name<->address mapping
Definition: Rw11Cpu.hpp:356
RlogFile & LogFile() const
FIXME_docs.
Definition: Rw11Cpu.ipp:54
static const uint16_t kCPAL
CPAL reg offset.
Definition: Rw11Cpu.hpp:185
Rstats fStats
statistics
Definition: Rw11Cpu.hpp:357
std::string NextCntlName(const std::string &base) const
FIXME_docs.
Definition: Rw11Cpu.cpp:331
RlinkServer & Server() const
FIXME_docs.
Definition: Rw11Cpu.ipp:38
static const uint16_t kCMIADDR
CM.IADDR reg offset.
Definition: Rw11Cpu.hpp:283
static const uint16_t kMEMHIADDR
MEM HIADDR address.
Definition: Rw11Cpu.hpp:257
static const uint16_t kMMUMMR0
MMU MMR0 address.
Definition: Rw11Cpu.hpp:263
static const uint16_t kCMDATA
CM.DATA reg offset.
Definition: Rw11Cpu.hpp:282
bool IAddrMapInsert(const std::string &name, uint16_t ibaddr)
FIXME_docs.
Definition: Rw11Cpu.ipp:206
uint16_t fIBase
Definition: Rw11Cpu.hpp:338
static const uint16_t kCPURUST_VFAIL
vmbox failure
Definition: Rw11Cpu.hpp:223
static const uint16_t kCPPSW
CPPSW reg offset.
Definition: Rw11Cpu.hpp:184
void ModLalh(RlinkCommandList &clist, size_t ind, uint32_t addr, uint16_t mode=kCPAH_M_22BIT)
FIXME_docs.
Definition: Rw11Cpu.cpp:421
static const uint16_t kSCCNTL
SC.CNTL reg offset.
Definition: Rw11Cpu.hpp:274
static const uint16_t kCMADDR
CM.ADDR reg offset.
Definition: Rw11Cpu.hpp:281
static const uint16_t kCPFUNC_RESUME
RESUME func code.
Definition: Rw11Cpu.hpp:200
static const uint16_t kCPUSTKLIM
CPU STKLIM address.
Definition: Rw11Cpu.hpp:243
static const uint16_t kHBBASE
DMHBPT reg base offset.
Definition: Rw11Cpu.hpp:288
virtual void Dump(std::ostream &os, int ind=0, const char *text=0, int detail=0) const
FIXME_docs.
Definition: Rw11Cpu.cpp:950
static const uint16_t kCPFUNC_CRESET
CRESET func code.
Definition: Rw11Cpu.hpp:197
int AddLalh(RlinkCommandList &clist, uint32_t addr, uint16_t mode=kCPAH_M_22BIT)
FIXME_docs.
Definition: Rw11Cpu.cpp:408
static const uint16_t kCPURUST_SUSP
cpu was suspended
Definition: Rw11Cpu.hpp:217
static const uint16_t kITDATA
IT.DATA reg offset.
Definition: Rw11Cpu.hpp:312
size_t Index() const
FIXME_docs.
Definition: Rw11Cpu.ipp:70
void SetupStd()
FIXME_docs.
Definition: Rw11Cpu.cpp:987
static const uint16_t kCPMEMBE_M_STICK
membe: sticky flag
Definition: Rw11Cpu.hpp:230
static const uint16_t kCPSTAT_M_CmdMErr
cmdmerr mask
Definition: Rw11Cpu.hpp:209
static const uint16_t kCPURUST_RECRSV
rec red-stack halt
Definition: Rw11Cpu.hpp:221
static const uint16_t kCPURUST_STOP
cpu was stopped
Definition: Rw11Cpu.hpp:215
bool fHasIbmon
has ibmon (ibus monitor)
Definition: Rw11Cpu.hpp:344
static const uint16_t kIISTBASE
IIST ibus address.
Definition: Rw11Cpu.hpp:322
static const uint16_t kCPSTAT_M_CmdErr
cmderr mask
Definition: Rw11Cpu.hpp:210
static const uint16_t kMEMLOADDR
MEM LOADDR address.
Definition: Rw11Cpu.hpp:258
uint32_t fMemSize
memory size in byte
Definition: Rw11Cpu.hpp:339
static const uint16_t kPCSTAT
PC.STAT reg offset.
Definition: Rw11Cpu.hpp:298
static const uint16_t kKWPCSR
KWP.CSR reg offset.
Definition: Rw11Cpu.hpp:319
static const uint16_t kCPFUNC_BRESET
BRESET func code.
Definition: Rw11Cpu.hpp:198
bool fHasScnt
has dmscnt (state counter)
Definition: Rw11Cpu.hpp:340
uint16_t fBase
Definition: Rw11Cpu.hpp:337
static const uint16_t kMMUPDRK
MMU PDRK address.
Definition: Rw11Cpu.hpp:265
int AddWMem(RlinkCommandList &clist, uint32_t addr, const uint16_t *buf, size_t size, uint16_t mode=kCPAH_M_22BIT, bool singleblk=false)
FIXME_docs.
Definition: Rw11Cpu.cpp:469
static const uint16_t kCPURUST_HALT
cpu executed HALT
Definition: Rw11Cpu.hpp:213
static const uint16_t kCPURUST_RESET
cpu was reset
Definition: Rw11Cpu.hpp:214
static const uint8_t kStat_M_CpuGo
stat: cpugo flag
Definition: Rw11Cpu.hpp:239
static const uint16_t kCPUERR
CPU CPUERR address.
Definition: Rw11Cpu.hpp:246
Rw11 * fpW11
Definition: Rw11Cpu.hpp:334
static const uint16_t kCPAH_M_22BIT
ena 22bit addressing
Definition: Rw11Cpu.hpp:226
static const uint16_t kPCCNTL
PC.CNTL reg offset.
Definition: Rw11Cpu.hpp:297
bool LoadAbs(const std::string &fname, RerrMsg &emsg, uint16_t &start, bool trace=false)
FIXME_docs.
Definition: Rw11Cpu.cpp:629
static const uint16_t kITFIFO
IT.FIFO reg offset.
Definition: Rw11Cpu.hpp:313
static const uint16_t kCPUSDREG
CPU SDREG address.
Definition: Rw11Cpu.hpp:248
uint32_t MemSize() const
FIXME_docs.
Definition: Rw11Cpu.ipp:94
int AddRMem(RlinkCommandList &clist, uint32_t addr, uint16_t *buf, size_t size, uint16_t mode=kCPAH_M_22BIT, bool singleblk=false)
FIXME_docs.
Definition: Rw11Cpu.cpp:448
static const uint16_t kMEMHISIZE
MEM HISIZE address.
Definition: Rw11Cpu.hpp:251
void ExecWibr(uint16_t ibaddr0, uint16_t data0, uint16_t ibaddr1=0, uint16_t data1=0, uint16_t ibaddr2=0, uint16_t data2=0)
FIXME_docs.
Definition: Rw11Cpu.cpp:491
static const uint8_t kStat_M_CmdErr
stat: cmderr flag
Definition: Rw11Cpu.hpp:236
static const uint16_t kMEMMAINT
MEM MAINT address.
Definition: Rw11Cpu.hpp:254
bool ProbeCntl(Rw11Probe &dsc)
FIXME_docs.
Definition: Rw11Cpu.cpp:577
bool MemWriteByte(uint32_t addr, uint8_t data, RerrMsg &emsg)
FIXME_docs.
Definition: Rw11Cpu.cpp:557
int AddMembe(RlinkCommandList &clist, uint16_t be, bool stick=false)
FIXME_docs.
Definition: Rw11Cpu.cpp:344
bool fHasPcnt
has dmpcnt (perf counters)
Definition: Rw11Cpu.hpp:341
Rw11Cntl & Cntl(const std::string &name) const
FIXME_docs.
Definition: Rw11Cpu.cpp:304
static const uint16_t kCPAH_M_ADDR
mask for 6bit msb
Definition: Rw11Cpu.hpp:225
static const uint16_t kMMUPARK
MMU PARK address.
Definition: Rw11Cpu.hpp:266
static const uint16_t kCPUMBRK
CPU MBRK address.
Definition: Rw11Cpu.hpp:245
uint16_t IbusRemoteAddr(uint16_t ibaddr) const
FIXME_docs.
Definition: Rw11Cpu.ipp:198
size_t fIndex
Definition: Rw11Cpu.hpp:336
static const uint16_t kCPSTAT_V_CpuRust
cpurust shift
Definition: Rw11Cpu.hpp:205
bool MemRead(uint16_t addr, std::vector< uint16_t > &data, size_t nword, RerrMsg &emsg)
FIXME_docs.
Definition: Rw11Cpu.cpp:517
static const uint16_t kHBCNTL
HB.CNTL reg offset.
Definition: Rw11Cpu.hpp:291
static const uint16_t kHBSIZE
DMHBPT unit size.
Definition: Rw11Cpu.hpp:289
static const uint16_t kIMBASE
Ibmon ibus address.
Definition: Rw11Cpu.hpp:301
static const uint16_t kCPSTAT_M_CpuRust
cpurust mask
Definition: Rw11Cpu.hpp:204
static const uint16_t kCPMEMBE_M_BE1
membe: be1 flag
Definition: Rw11Cpu.hpp:233
cmap_t fCntlMap
name->cntl map
Definition: Rw11Cpu.hpp:354
static const uint16_t kCPPC
CPPC reg offset.
Definition: Rw11Cpu.hpp:190
static const uint16_t kCPFUNC_START
START func code.
Definition: Rw11Cpu.hpp:194
uint16_t fCpuStat
Definition: Rw11Cpu.hpp:351
static const uint16_t kCPMEMI
CPMEMI reg offset.
Definition: Rw11Cpu.hpp:188
static const uint16_t kCPMEMBE
CPMEMBE reg offset.
Definition: Rw11Cpu.hpp:191
virtual ~Rw11Cpu()
Destructor.
Definition: Rw11Cpu.cpp:249
void AddCntl(const std::shared_ptr< Rw11Cntl > &spcntl)
FIXME_docs.
Definition: Rw11Cpu.cpp:266
bool fHasKw11l
has kw11-l (line clock)
Definition: Rw11Cpu.hpp:347
int AddWibr(RlinkCommandList &clist, uint16_t ibaddr, uint16_t data)
FIXME_docs.
Definition: Rw11Cpu.cpp:365
static const uint16_t kSCADDR
SC.ADDR reg offset.
Definition: Rw11Cpu.hpp:275
static const uint16_t kM9BASE
M9312 ibus address.
Definition: Rw11Cpu.hpp:316
int WaitCpuActDown(const Rtime &tout, Rtime &twait)
FIXME_docs.
Definition: Rw11Cpu.cpp:882
Rw11Cpu()
default ctor blocker
Definition: Rw11Cpu.hpp:331
static const uint8_t kStat_M_CpuSusp
stat: cpususp flag
Definition: Rw11Cpu.hpp:238
void W11AttnHandler()
FIXME_docs.
Definition: Rw11Cpu.cpp:938
static const uint16_t kMMUMMR3
MMU MMR3 address.
Definition: Rw11Cpu.hpp:260
static const uint16_t kCPUPSW
CPU PSW address.
Definition: Rw11Cpu.hpp:242
RlinkAddrMap fIAddrMap
ibus name<->address mapping
Definition: Rw11Cpu.hpp:355
static const uint16_t kMMUPARU
MMU PARU address.
Definition: Rw11Cpu.hpp:270
bool MemWrite(uint16_t addr, const std::vector< uint16_t > &data, RerrMsg &emsg)
FIXME_docs.
Definition: Rw11Cpu.cpp:537
static const uint16_t kCPUSYSID
CPU SYSID address.
Definition: Rw11Cpu.hpp:247
static const uint16_t kKWLBASE
KW11-L ibus address.
Definition: Rw11Cpu.hpp:317
static const uint16_t kCPURUST_INIT
cpu in init state
Definition: Rw11Cpu.hpp:212
static const uint16_t kMMUMMR2
MMU MMR2 address.
Definition: Rw11Cpu.hpp:261
int AddRibr(RlinkCommandList &clist, uint16_t ibaddr)
FIXME_docs.
Definition: Rw11Cpu.cpp:354
static const uint16_t kCMBASE
DMCMON reg base offset.
Definition: Rw11Cpu.hpp:278
static const uint16_t kCPAH_M_UBM22
ubmap+22bit
Definition: Rw11Cpu.hpp:228
void AllRAddrMapInsert(const std::string &name, uint16_t rbaddr)
FIXME_docs.
Definition: Rw11Cpu.cpp:921
static const uint16_t kMMUMMR1
MMU MMR1 address.
Definition: Rw11Cpu.hpp:262
static const uint16_t kCMIMAL
CM.IMAL reg offset.
Definition: Rw11Cpu.hpp:286
bool RAddrMapInsert(const std::string &name, uint16_t rbaddr)
FIXME_docs.
Definition: Rw11Cpu.ipp:246
static const uint16_t kKWPBASE
KW11-P ibus address.
Definition: Rw11Cpu.hpp:318
int AddWbibr(RlinkCommandList &clist, uint16_t ibaddr, const std::vector< uint16_t > &block)
FIXME_docs.
Definition: Rw11Cpu.cpp:385
static const uint16_t kITCNTL
IT.CNTL reg offset.
Definition: Rw11Cpu.hpp:310
static const uint16_t kCPSTAT
CPSTAT reg offset.
Definition: Rw11Cpu.hpp:183
std::string fType
Definition: Rw11Cpu.hpp:335
static const uint16_t kSCDATA
SC.DATA reg offset.
Definition: Rw11Cpu.hpp:276
static const uint16_t kIISTACR
II.ACR reg offset.
Definition: Rw11Cpu.hpp:323
static const uint16_t kCPSTAT_M_SuspExt
suspext mask
Definition: Rw11Cpu.hpp:202
static const uint16_t kMMUPARS
MMU PARS address.
Definition: Rw11Cpu.hpp:268
static const uint16_t kCPCNTL
CPADDR reg offset.
Definition: Rw11Cpu.hpp:182
bool fHasCmon
has dmcmon (cpu monitor)
Definition: Rw11Cpu.hpp:342
static const uint16_t kCMCNTL
CM.CNTL reg offset.
Definition: Rw11Cpu.hpp:279
bool fHasKw11p
has kw11-p (prog clock)
Definition: Rw11Cpu.hpp:348
static const uint16_t kCPSTAT_M_CpuSusp
cpususp mask
Definition: Rw11Cpu.hpp:207
static const uint16_t kCMSTAT
CM.STAT reg offset.
Definition: Rw11Cpu.hpp:280
static const uint16_t kCPAH_M_UBMAP
ena ubmap
Definition: Rw11Cpu.hpp:227
static const uint16_t kMEMHM
MEM HM address.
Definition: Rw11Cpu.hpp:253
static const uint16_t kCPURUST_HBPT
cpu hardware bpt
Definition: Rw11Cpu.hpp:218
static const uint16_t kCPFUNC_SUSPEND
SUSPEND func code.
Definition: Rw11Cpu.hpp:199
static const uint16_t kMEMSYSERR
MEM SYSERR address.
Definition: Rw11Cpu.hpp:256
static const uint16_t kIMCNTL
IM.CNTL reg offset.
Definition: Rw11Cpu.hpp:302
bool TestCntl(const std::string &name) const
FIXME_docs.
Definition: Rw11Cpu.cpp:284
FIXME_docs.
Definition: Rw11.hpp:31
RosPrintfS< bool > RosPrintf(bool value, const char *form=0, int width=0, int prec=0)
Creates a print object for the formatted output of a bool value.
Definition: RosPrintf.ipp:38
Declaration of class ReventLoop.
Definition: ReventLoop.cpp:47
FIXME_docs.
Definition: Rw11Probe.hpp:23
bool Found() const
FIXME_docs.
Definition: Rw11Probe.cpp:52
uint16_t fDataRem
Definition: Rw11Probe.hpp:31
uint16_t fDataInt
Definition: Rw11Probe.hpp:30
uint16_t fAddr
Definition: Rw11Probe.hpp:24