; ---------------------------------------------------------------------------
; prepare_cmx.cmm
; ---------------------------------------------------------------------------
  PMACRO.EXPLICIT

  PRIVATE &resetvector

  ; show path and name of this script (present practice file)
  ECHO ""
  ECHO %COLOR.BLUE "### " OS.PPF() " ###"

; ---------------------------------------------------------------------------

  ; enable reset vector catch
  InterCom ALL TrOnchip.Set CORERESET ON

  ; reset target system (cm0 and cm4)
  SYStem.Up
  DO prepare_system.cmm

; get cm0 reset-vector from CM0_VECTOR_TABLE_BASE
  &resetvector=Data.Long(A:(Data.Long(A:0x40201120)+0x4))

  REPEAT
  (
    ; go until pc reaches resetvector
    Go.direct &resetvector
    WAIT !STATE.RUN() 1s
    IF TIMEOUT()
    (
      PRINT %WARNING "CM0+ resetvector not reached"
      ENDDO
    )
  )
  WHILE (STATE.TARGET()=="stopped at vector catch")

  ; ---------------------------------------------------------------------------
  ; CM4 startup

  InterCom M4 SYStem.Attach

  ; backup breakpoint settings
  STORE ~~~/brk Break
  Break.Delete /ALL

  ; set bp on CM0 write-access to CM4_PWR_CTL
  Break.Set A:0x40201200 /Write

  ; CM0: go until CM4 is started
  Go.direct
  WAIT !STATE.RUN() 1s
  IF TIMEOUT()
  (
    PRINT %WARNING "CM4 start not reached"
    ENDDO
  )

  ; restore breakpoint settings
  DO ~~~/brk

  ; CM4 should be stopped at reset vector catch
  InterCom.WAIT M4 !STATE.RUN()

  ; get CM4 resetvector out of CM4_VECTOR_TABLE_BASE register
  &resetvector=Data.Long(A:(Data.Long(A:0x40200200)+0x4))

  ; CM4: go until pc reaches resetvector
  InterCom M4 Go.direct &resetvector
  InterCom.WAIT M4 !STATE.RUN()

  ECHO %COLOR.GREEN "CM0/CM4 Core ready!"

  ENDDO

