Skip to content

Latest commit

 

History

History
41 lines (34 loc) · 1.37 KB

ECO-032-MMR1_fix.md

File metadata and controls

41 lines (34 loc) · 1.37 KB

ECO-032: MMR1 write logic fix (2022-09-02)

Scope

  • was in w11a since 2009
  • affects: all w11a systems

Symptom summary

Test 12 @ 042056 of ekbee1 expects after a

  mov    #100000,@#mmr0

which sets an error bit in MMR0 and thus freezes MMR1.
MMR1 contains 013427 (00010 111 00010 111) (+2,r7;+2,r7).
w11a has 000047 (00000 000 00100 111) (--,--;+4,r7).

Background

MMM1 holds the information to roll back changed registers in case of an MMU abort. For this purpose, it doesn't matter whether the changes for a register are lumped up or stored separately. Both possibilities fulfill the requirements.

Analysis

The 11/70 Technical manual clearly states that there is an additional state that counts the write accesses to MMR1. This ensures that each of the two logged accesses end up in separate bytes (byte 0 filled first).

The w11a added changes and only used byte 1 when the register number differed. SimH doesn't use a state bit, it writes to the upper byte when the lower byte is non-zero

  #define calc_MMR1(val)  ((reg_mods)? (((val) << 8) | reg_mods): (val))

Fixes

  • remove adder logic in pdp11_mmu_mmr1
  • use SimH logic, write to upper half if lower != 0
  • that's functionally equivalent to the 11/70 logic but saves a state bit

Hindsight

Took 13 years to fix. No OS depends on this detail, only test codes will probe the difference.