Skip to content

Commit b17129b

Browse files
peek_word tweak
1 parent a77d037 commit b17129b

8 files changed

+984
-100
lines changed

ESP32/console_esp32.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ void console_esp32::panel_update_thread()
121121
if (panel_mode == PM_BITS) {
122122
memory_addresses_t rc = b->getMMU()->calculate_physical_address(run_mode, current_PC);
123123

124-
uint16_t current_instr = b->peek_word(current_PC);
124+
uint16_t current_instr = b->peek_word(run_mode, current_PC);
125125

126126
int pixel_offset = 0;
127127

breakpoint_memory.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ std::optional<std::string> breakpoint_memory::is_triggered() const
2323
uint16_t v = 0;
2424

2525
if (is_virtual)
26-
v = b->peek_word(addr);
26+
v = b->peek_word(rm_cur, addr); // FIXME rm_cur
2727
else
2828
v = b->read_physical(addr);
2929

bus.cpp

+61-67
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ void bus::init()
238238
mmu_->setMMR3(0);
239239
}
240240

241-
uint16_t bus::read(const uint16_t addr_in, const word_mode_t word_mode, const rm_selection_t mode_selection, const bool peek_only, const d_i_space_t space)
241+
uint16_t bus::read(const uint16_t addr_in, const word_mode_t word_mode, const rm_selection_t mode_selection, const d_i_space_t space)
242242
{
243243
int run_mode = mode_selection == rm_cur ? c->getPSW_runmode() : c->getPSW_prev_runmode();
244244

@@ -253,60 +253,58 @@ uint16_t bus::read(const uint16_t addr_in, const word_mode_t word_mode, const rm
253253
//// REGISTERS ////
254254
if (a >= ADDR_KERNEL_R && a <= ADDR_KERNEL_R + 5) { // kernel R0-R5
255255
uint16_t temp = c->getRegister(a - ADDR_KERNEL_R) & (word_mode == wm_byte ? 0xff : 0xffff);
256-
if (!peek_only) TRACE("READ-I/O kernel R%d: %06o", a - ADDR_KERNEL_R, temp);
256+
TRACE("READ-I/O kernel R%d: %06o", a - ADDR_KERNEL_R, temp);
257257
return temp;
258258
}
259259
if (a >= ADDR_USER_R && a <= ADDR_USER_R + 5) { // user R0-R5
260260
uint16_t temp = c->getRegister(a - ADDR_USER_R) & (word_mode == wm_byte ? 0xff : 0xffff);
261-
if (!peek_only) TRACE("READ-I/O user R%d: %06o", a - ADDR_USER_R, temp);
261+
TRACE("READ-I/O user R%d: %06o", a - ADDR_USER_R, temp);
262262
return temp;
263263
}
264264
if (a == ADDR_KERNEL_SP) { // kernel SP
265265
uint16_t temp = c->getStackPointer(0) & (word_mode == wm_byte ? 0xff : 0xffff);
266-
if (!peek_only) TRACE("READ-I/O kernel SP: %06o", temp);
266+
TRACE("READ-I/O kernel SP: %06o", temp);
267267
return temp;
268268
}
269269
if (a == ADDR_PC) { // PC
270270
uint16_t temp = c->getPC() & (word_mode == wm_byte ? 0xff : 0xffff);
271-
if (!peek_only) TRACE("READ-I/O PC: %06o", temp);
271+
TRACE("READ-I/O PC: %06o", temp);
272272
return temp;
273273
}
274274
if (a == ADDR_SV_SP) { // supervisor SP
275275
uint16_t temp = c->getStackPointer(1) & (word_mode == wm_byte ? 0xff : 0xffff);
276-
if (!peek_only) TRACE("READ-I/O supervisor SP: %06o", temp);
276+
TRACE("READ-I/O supervisor SP: %06o", temp);
277277
return temp;
278278
}
279279
if (a == ADDR_USER_SP) { // user SP
280280
uint16_t temp = c->getStackPointer(3) & (word_mode == wm_byte ? 0xff : 0xffff);
281-
if (!peek_only) TRACE("READ-I/O user SP: %06o", temp);
281+
TRACE("READ-I/O user SP: %06o", temp);
282282
return temp;
283283
}
284284
///^ registers ^///
285285

286286
if ((a & 1) && word_mode == wm_word) [[unlikely]] {
287-
if (!peek_only) {
288-
TRACE("READ-I/O odd address %06o UNHANDLED", a);
289-
mmu_->trap_if_odd(addr_in, run_mode, space, false);
290-
throw 0;
291-
return 0;
292-
}
287+
TRACE("READ-I/O odd address %06o UNHANDLED", a);
288+
mmu_->trap_if_odd(addr_in, run_mode, space, false);
289+
throw 0;
290+
return 0;
293291
}
294292

295293
if (a == ADDR_CPU_ERR) { // cpu error register
296294
uint16_t temp = mmu_->getCPUERR() & 0xff;
297-
if (!peek_only) TRACE("READ-I/O CPU error: %03o", temp);
295+
TRACE("READ-I/O CPU error: %03o", temp);
298296
return temp;
299297
}
300298

301299
if (a == ADDR_MAINT) { // MAINT
302300
uint16_t temp = 1; // POWER OK
303-
if (!peek_only) TRACE("READ-I/O MAINT: %o", temp);
301+
TRACE("READ-I/O MAINT: %o", temp);
304302
return temp;
305303
}
306304

307305
if (a == ADDR_CONSW) { // console switch & display register
308306
uint16_t temp = console_switches;
309-
if (!peek_only) TRACE("READ-I/O console switch: %o", temp);
307+
TRACE("READ-I/O console switch: %o", temp);
310308
return temp;
311309
}
312310

@@ -320,13 +318,13 @@ uint16_t bus::read(const uint16_t addr_in, const word_mode_t word_mode, const rm
320318
else
321319
temp = a == ADDR_PIR ? PIR & 255 : PIR >> 8;
322320

323-
if (!peek_only) TRACE("READ-I/O PIR: %o", temp);
321+
TRACE("READ-I/O PIR: %o", temp);
324322
return temp;
325323
}
326324

327325
if (a == ADDR_SYSTEM_ID) {
328326
uint16_t temp = 011064;
329-
if (!peek_only) TRACE("READ-I/O system id: %o", temp);
327+
TRACE("READ-I/O system id: %o", temp);
330328
return temp;
331329
}
332330

@@ -335,7 +333,7 @@ uint16_t bus::read(const uint16_t addr_in, const word_mode_t word_mode, const rm
335333

336334
if (a == ADDR_LP11CSR) { // printer, CSR register, LP11
337335
uint16_t temp = 0x80;
338-
if (!peek_only) TRACE("READ-I/O LP11 CSR: %o", temp);
336+
TRACE("READ-I/O LP11 CSR: %o", temp);
339337
return temp;
340338
}
341339

@@ -354,176 +352,166 @@ uint16_t bus::read(const uint16_t addr_in, const word_mode_t word_mode, const rm
354352
///////////
355353

356354
if (a >= 0177740 && a <= 0177753) { // cache control register and others
357-
if (!peek_only) TRACE("READ-I/O cache control register/others (%06o): %o", a, 0);
355+
TRACE("READ-I/O cache control register/others (%06o): %o", a, 0);
358356
// TODO
359357
return 0;
360358
}
361359

362360
if (a >= 0170200 && a <= 0170377) { // unibus map
363-
if (!peek_only) TRACE("READ-I/O unibus map (%06o): %o", a, 0);
361+
TRACE("READ-I/O unibus map (%06o): %o", a, 0);
364362
// TODO
365363
return 0;
366364
}
367365

368366
if (a >= 0172100 && a <= 0172137) { // MM11-LP parity
369-
if (!peek_only) TRACE("READ-I/O MM11-LP parity (%06o): %o", a, 1);
367+
TRACE("READ-I/O MM11-LP parity (%06o): %o", a, 1);
370368
return 1;
371369
}
372370

373371
if (word_mode == wm_byte) {
374372
if (a == ADDR_PSW) { // PSW
375373
uint8_t temp = c->getPSW();
376-
if (!peek_only) TRACE("READ-I/O PSW LSB: %03o", temp);
374+
TRACE("READ-I/O PSW LSB: %03o", temp);
377375
return temp;
378376
}
379377

380378
if (a == ADDR_PSW + 1) {
381379
uint8_t temp = c->getPSW() >> 8;
382-
if (!peek_only) TRACE("READ-I/O PSW MSB: %03o", temp);
380+
TRACE("READ-I/O PSW MSB: %03o", temp);
383381
return temp;
384382
}
385383
if (a == ADDR_STACKLIM) { // stack limit register
386384
uint8_t temp = c->getStackLimitRegister();
387-
if (!peek_only) TRACE("READ-I/O stack limit register (low): %03o", temp);
385+
TRACE("READ-I/O stack limit register (low): %03o", temp);
388386
return temp;
389387
}
390388
if (a == ADDR_STACKLIM + 1) { // stack limit register
391389
uint8_t temp = c->getStackLimitRegister() >> 8;
392-
if (!peek_only) TRACE("READ-I/O stack limit register (high): %03o", temp);
390+
TRACE("READ-I/O stack limit register (high): %03o", temp);
393391
return temp;
394392
}
395393

396394
if (a == ADDR_MICROPROG_BREAK_REG) { // microprogram break register
397395
uint8_t temp = microprogram_break_register;
398-
if (!peek_only) TRACE("READ-I/O microprogram break register (low): %03o", temp);
396+
TRACE("READ-I/O microprogram break register (low): %03o", temp);
399397
return temp;
400398
}
401399
if (a == ADDR_MICROPROG_BREAK_REG + 1) { // microprogram break register
402400
uint8_t temp = microprogram_break_register >> 8;
403-
if (!peek_only) TRACE("READ-I/O microprogram break register (high): %03o", temp);
401+
TRACE("READ-I/O microprogram break register (high): %03o", temp);
404402
return temp;
405403
}
406404

407405
if (a == ADDR_MMR0) {
408406
uint8_t temp = mmu_->getMMR0();
409-
if (!peek_only) TRACE("READ-I/O MMR0 LO: %03o", temp);
407+
TRACE("READ-I/O MMR0 LO: %03o", temp);
410408
return temp;
411409
}
412410
if (a == ADDR_MMR0 + 1) {
413411
uint8_t temp = mmu_->getMMR0() >> 8;
414-
if (!peek_only) TRACE("READ-I/O MMR0 HI: %03o", temp);
412+
TRACE("READ-I/O MMR0 HI: %03o", temp);
415413
return temp;
416414
}
417415
}
418416
else {
419417
if (a == ADDR_MMR0) {
420418
uint16_t temp = mmu_->getMMR0();
421-
if (!peek_only) TRACE("READ-I/O MMR0: %06o", temp);
419+
TRACE("READ-I/O MMR0: %06o", temp);
422420
return temp;
423421
}
424422

425423
if (a == ADDR_MMR1) { // MMR1
426424
uint16_t temp = mmu_->getMMR1();
427-
if (!peek_only) TRACE("READ-I/O MMR1: %06o", temp);
425+
TRACE("READ-I/O MMR1: %06o", temp);
428426
return temp;
429427
}
430428

431429
if (a == ADDR_MMR2) { // MMR2
432430
uint16_t temp = mmu_->getMMR2();
433-
if (!peek_only) TRACE("READ-I/O MMR2: %06o", temp);
431+
TRACE("READ-I/O MMR2: %06o", temp);
434432
return temp;
435433
}
436434

437435
if (a == ADDR_MMR3) { // MMR3
438436
uint16_t temp = mmu_->getMMR3();
439-
if (!peek_only) TRACE("READ-I/O MMR3: %06o", temp);
437+
TRACE("READ-I/O MMR3: %06o", temp);
440438
return temp;
441439
}
442440

443441
if (a == ADDR_PSW) { // PSW
444442
uint16_t temp = c->getPSW();
445-
if (!peek_only) TRACE("READ-I/O PSW: %06o", temp);
443+
TRACE("READ-I/O PSW: %06o", temp);
446444
return temp;
447445
}
448446

449447
if (a == ADDR_STACKLIM) { // stack limit register
450448
uint16_t temp = c->getStackLimitRegister();
451-
if (!peek_only) TRACE("READ-I/O stack limit register: %06o", temp);
449+
TRACE("READ-I/O stack limit register: %06o", temp);
452450
return temp;
453451
}
454452

455453
if (a == ADDR_CPU_ERR) { // cpu error register
456454
uint16_t temp = mmu_->getCPUERR();
457-
if (!peek_only) TRACE("READ-I/O CPUERR: %06o", temp);
455+
TRACE("READ-I/O CPUERR: %06o", temp);
458456
return temp;
459457
}
460458

461459
if (a == ADDR_MICROPROG_BREAK_REG) { // microprogram break register
462460
uint16_t temp = microprogram_break_register;
463-
if (!peek_only) TRACE("READ-I/O microprogram break register: %06o", temp);
461+
TRACE("READ-I/O microprogram break register: %06o", temp);
464462
return temp;
465463
}
466464
}
467465

468-
if (tm11 && a >= TM_11_BASE && a < TM_11_END && !peek_only)
466+
if (tm11 && a >= TM_11_BASE && a < TM_11_END)
469467
return word_mode == wm_byte ? tm11->read_byte(a) : tm11->read_word(a);
470468

471-
if (rk05_ && a >= RK05_BASE && a < RK05_END && !peek_only)
469+
if (rk05_ && a >= RK05_BASE && a < RK05_END)
472470
return word_mode == wm_byte ? rk05_->read_byte(a) : rk05_->read_word(a);
473471

474-
if (rl02_ && a >= RL02_BASE && a < RL02_END && !peek_only)
472+
if (rl02_ && a >= RL02_BASE && a < RL02_END)
475473
return word_mode == wm_byte ? rl02_->read_byte(a) : rl02_->read_word(a);
476474

477-
if (tty_ && a >= PDP11TTY_BASE && a < PDP11TTY_END && !peek_only)
475+
if (tty_ && a >= PDP11TTY_BASE && a < PDP11TTY_END)
478476
return word_mode == wm_byte ? tty_->read_byte(a) : tty_->read_word(a);
479477

480-
if (dc11_ && a >= DC11_BASE && a < DC11_END && !peek_only)
478+
if (dc11_ && a >= DC11_BASE && a < DC11_END)
481479
return word_mode == wm_byte ? dc11_->read_byte(a) : dc11_->read_word(a);
482480

483-
if (rp06_ && a >= RP06_BASE && a < RP06_END && !peek_only)
481+
if (rp06_ && a >= RP06_BASE && a < RP06_END)
484482
return word_mode == wm_byte ? rp06_->read_byte(a) : rp06_->read_word(a);
485483

486484
// LO size register field must be all 1s, so subtract 1
487485
uint32_t system_size = m->get_memory_size() / 64 - 1;
488486

489487
if (a == ADDR_SYSSIZE + 2) { // system size HI
490488
uint16_t temp = system_size >> 16;
491-
if (!peek_only) TRACE("READ-I/O accessing system size HI: %06o", temp);
489+
TRACE("READ-I/O accessing system size HI: %06o", temp);
492490
return temp;
493491
}
494492

495493
if (a == ADDR_SYSSIZE) { // system size LO
496494
uint16_t temp = system_size;
497-
if (!peek_only) TRACE("READ-I/O accessing system size LO: %06o", temp);
495+
TRACE("READ-I/O accessing system size LO: %06o", temp);
498496
return temp;
499497
}
500498

501-
if (!peek_only) {
502-
TRACE("READ-I/O UNHANDLED read %08o (%c), (base: %o)", m_offset, word_mode == wm_byte ? 'B' : ' ', mmu_->get_io_base());
499+
TRACE("READ-I/O UNHANDLED read %08o (%c), (base: %o)", m_offset, word_mode == wm_byte ? 'B' : ' ', mmu_->get_io_base());
503500

504-
c->trap(004); // no such i/o
505-
throw 1;
506-
}
501+
c->trap(004); // no such i/o
502+
throw 1;
507503

508504
return -1;
509505
}
510506

511507
if ((addr_in & 1) && word_mode == wm_word) {
512-
if (peek_only == false) {
513-
TRACE("READ from %06o - odd address!", addr_in);
514-
mmu_->trap_if_odd(addr_in, run_mode, space, false);
515-
throw 2;
516-
return 0;
517-
}
508+
TRACE("READ from %06o - odd address!", addr_in);
509+
mmu_->trap_if_odd(addr_in, run_mode, space, false);
510+
throw 2;
511+
return 0;
518512
}
519513

520-
// TODO: this will fail for peek & odd addressing
521514
if (m_offset >= m->get_memory_size()) {
522-
if (peek_only) {
523-
TRACE("READ from %06o - out of range!", addr_in);
524-
return 0;
525-
}
526-
527515
c->trap(004); // no such RAM
528516
throw 1;
529517
}
@@ -534,7 +522,7 @@ uint16_t bus::read(const uint16_t addr_in, const word_mode_t word_mode, const rm
534522
else
535523
temp = m->read_word(m_offset);
536524

537-
if (!peek_only) TRACE("READ from %06o/%07o %c %c: %06o (%s)", addr_in, m_offset, space == d_space ? 'D' : 'I', word_mode == wm_byte ? 'B' : 'W', temp, mode_selection == rm_prev ? "prev" : "cur");
525+
TRACE("READ from %06o/%07o %c %c: %06o (%s)", addr_in, m_offset, space == d_space ? 'D' : 'I', word_mode == wm_byte ? 'B' : 'W', temp, mode_selection == rm_prev ? "prev" : "cur");
538526

539527
return temp;
540528
}
@@ -861,12 +849,18 @@ uint16_t bus::read_physical(const uint32_t a)
861849

862850
uint16_t bus::read_word(const uint16_t a, const d_i_space_t s)
863851
{
864-
return read(a, wm_word, rm_cur, false, s);
852+
return read(a, wm_word, rm_cur, s);
865853
}
866854

867-
uint16_t bus::peek_word(const uint16_t a)
855+
uint16_t bus::peek_word(const int run_mode, const uint16_t a)
868856
{
869-
return read(a, wm_word, rm_cur, true);
857+
auto meta = mmu_->calculate_physical_address(run_mode, a);
858+
859+
uint32_t io_base = mmu_->get_io_base();
860+
if (meta.physical_instruction >= io_base) // TODO: I/O always returns 0xffff
861+
return 0xffff;
862+
863+
return m->read_word(meta.physical_instruction);
870864
}
871865

872866
void bus::write_word(const uint16_t a, const uint16_t value, const d_i_space_t s)

0 commit comments

Comments
 (0)