; --------------------------------------------------------------------------------
; @Title: startup script for HQGIF software with NXP S32K14x
; @Description:
; --------------------------------------------------------------------------------
  PMACRO.EXPLICIT

  GLOBAL &project &cpu &base &opt
  GLOBAL &dir_base &file_user_flash
  GLOBAL &eft_range &dataflash_range &codeflash_range
  GLOBAL &pwd &phd &psd &ptd &ppd

  PRIVATE &pos

  ENTRY &project &cpu &base &opt

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

  ;--------------------------------------------------------------------------------
  &pwd=OS.PWD()
  &phd=OS.PHD()
  &psd=OS.PSD()
  &ptd=OS.PTD()
  &ppd=OS.PPD()   ; store current script path in &ppd

  ECHO %COLOR.GREEN "PWD = &pwd"
  ECHO %COLOR.GREEN "PHD = &phd"
  ECHO %COLOR.GREEN "PSD = &psd"
  ECHO %COLOR.GREEN "PTD = &ptd"
  ECHO %COLOR.GREEN "PPD = &ppd"
  ECHO

  ; --------------------------------------------------------------------------------
  ; prepare parameters (script debugging)
  IF "&cpu"==""
  (
    &cpu="CYT2B95CA"
  )

  ; --------------------------------------------------------------------------------
  ; additional settings
  &eft_range=0x1020C000--0x1020D3FF
  &dataflash_range=0x14000000--0x1401FFFF
  &codeflash_range=0x10000000--0x1020FFFF

  ; show shortcut parameters
  ECHO %COLOR.GREEN "parameter project = &project"
  ECHO %COLOR.GREEN "parameter cpu     = &cpu"
  ECHO %COLOR.GREEN "parameter base    = &base"
  IF "&opt"==""
  (
    &opt=0
  )
  ELSE
  (
    ECHO %COLOR.GREEN "parameter opt     = &opt"
  )
  ECHO

  ; show file where path of actual flash configuration is stored
  &file_user_flash="&phd"+"\AppData\Roaming\TRACE32\"+"&project"+"_flash.txt"
  ECHO %COLOR.GREEN "file_user_flash = &file_user_flash"

  ; calculate &dir_base for relative paths in flash configuration files
  IF "&base"==""
  (
    ;if optional parameter &base is missing
    &base="&project"
  )

  ; check type of parameter &base
  IF STRing.COUNT("&base",":")==0
  (
    ; scan script path from right to left until &base was found (case insensitive)
    &pos=STRing.SCAN(STRing.LoWeR("&ppd"),STRing.LoWeR("&base"),0)
    IF &pos<0
    (
      &dir_base="&ppd"
    )
    ELSE
    (
      &dir_base=STRing.MID("&ppd",0,&pos)
    )
  )
  ELSE
  (
    ; use &base as absolute path if it contains ':'
    &dir_base="&base\"
  )

  ECHO %COLOR.GREEN "dir_base = &dir_base"
  ECHO

  ; --------------------------------------------------------------------------------
  ; check prerequisites
  IF SYStem.INSTANCE()!=1.
  (
    PRINT %ERROR "This script must be called from MASTER GUI!"
    ENDDO
  )

  ; --------------------------------------------------------------------------------
  ; [optional] close any existing REMOTE GUIs
  ; IC OTHERS QUIT

  ; --------------------------------------------------------------------------------
  ; assign InterCom name M0 to this TRACE32 PowerView Instance
  InterCom.NAME M0

  ; --------------------------------------------------------------------------------
  ; check if PowerView instance with InterCom name M4 already exists
  IF !INTERCOM.PING(M4)
  (
    ; create additional PowerView instance with InterCom name M4
   TargetSystem.NewInstance M4 /ARCHitecture ARM
  )

  ; --------------------------------------------------------------------------------
  ; set titles for SLAVE GUIs
  TITLE "TRACE32 for ARM - &cpu-CM0+ [MASTER]"
  FramePOS 2 8 50% 50% Normal 1.
  WinCLEAR

  InterCom M4 TITLE "TRACE32 for ARM - &cpu-CM4F [SLAVE1]"
  InterCom M4 FramePOS 10 2 50% 50% Normal 3.
  InterCom M4 WinCLEAR

  ; --------------------------------------------------------------------------------
  ; common SYStem settings
  RESet
  InterCom M4 RESet

  SYStem.CPU &cpu-CM0+
  SYStem.CONFIG CORE 1. 1.
  SYStem.CONFIG SLAVE OFF
  SYStem.CONFIG DEBUGPORTTYPE SWD
  SYStem.JtagClock 10MHz

  IF COMBIPROBE()||UTRACE()
  (
    SYStem.CONFIG.CONNECTOR MIPI20T
  )

  (
    ; assert reset line and do another debugger based reset
    ; -> M0+ should stop in BootROM/Supervisory Flash
    SYStem.Option EnReset ON
    SYStem.Option WaitIDCODE ON
    SYStem.Option CoreSightRESet ON
  )

  InterCom M4 SYStem.CPU &cpu-CM4
  InterCom M4 SYStem.CONFIG CORE 2. 1.
  InterCom M4 SYStem.CONFIG SLAVE ON

  ; Activate DUALPORT option for both instances. Allow memory and register access during Software running
  SYStem.Option DUALPORT ON
  InterCom M4 SYStem.Option DUALPORT ON

  ;Deactivate the interrupt routine during single-step operation CM0 and CM4
  SYStem.Option IMASKASM ON
  SYStem.Option IMASKHLL ON
  InterCom M4 SYStem.Option IMASKASM ON
  InterCom M4 SYStem.Option IMASKHLL ON
  InterCom M4 SYStem.Option DisMode THUMB

  SYStem.Attach
  InterCom M4 SYStem.Attach

  ;Prepare synchronization between both cores
  InterCom M0 SYnch.Connect M4
  InterCom M0 SYnch.OFF
  InterCom M0 SYnch.MasterGo ON
  InterCom M0 SYnch.MasterBreak ON
  InterCom M0 SYnch.SlaveGo ON
  InterCom M0 SYnch.SlaveBreak ON
  InterCom M4 SYnch.Connect M0
  InterCom M4 SYnch.OFF
  InterCom M4 SYnch.MasterGo ON
  InterCom M4 SYnch.MasterBreak ON
  InterCom M4 SYnch.SlaveGo ON
  InterCom M4 SYnch.SlaveBreak ON

  ; --------------------------------------------------------------------------------
  ;Set SWV as default trace interface
  InterCom M4 DO prepare_traceclock.cmm "SWV"

  ; --------------------------------------------------------------------------------
  ; Prepare Flash programming
  DO &psd/demo/arm/flash/traveo_ii.cmm PREPAREONLY

  ; --------------------------------------------------------------------------------
  ; open some windows
  ;Mode.Hll
  List.auto

  ; prepare PowerView instance M4
  ;InterCom M4 Mode.Hll
  InterCom M4 List.auto

  ; --------------------------------------------------------------------------------
  ; add menu and toolbar
  DO &ppd/menu_cm0.cmm
  InterCom M4 DO &ppd/menu_cm4.cmm &opt

  WAIT InterCom.GetPracticeState(M4)!="running"

  ; add a button toolbar to exit all TRACE32 instances
  DO &psd/demo/practice/intercom/toolbar_quit_all.cmm
  InterCom M4 DO &psd/demo/practice/intercom/toolbar_quit_all.cmm

  ;Add Menu specific for TRAVEO II
  ;Menu TRAVEII_2M added automatically to Menu bar

  ;Add a button toolbar to reset CPU
  ;Menu.ReProgram &ppd/../menu/mensysuptoolbar.men
  ;InterCom M4 Menu.ReProgram &ppd/../menu/mensysuptoolbar.men

  ENDDO
