;exec.macros V1.5

;EXEC Execbase structure
(macro ExecBase
    (addsymbol EBase (@l (addsymbol SysBase 4)))
    (addsymbol eb_LibNode EBase)
    (addsymbol eb_SoftVer (+ eb_LibNode 22))
    (addsymbol eb_LowMemChkSum (+ eb_SoftVer 2))
    (addsymbol eb_ChkBase (+ eb_LowMemChkSum 2))
    (addsymbol eb_ColdCapture (+ eb_ChkBase 4))
    (addsymbol eb_CoolCapture (+ eb_ColdCapture 4))
    (addsymbol eb_WarmCapture (+ eb_CoolCapture 4))
    (addsymbol eb_SysStkUpper (+ eb_WarmCapture 4))
    (addsymbol eb_SysStkLower (+ eb_SysStkUpper 4))
    (addsymbol eb_MaxLocMem (+ eb_SysStkLower 4))
    (addsymbol eb_DebugEntry (+ eb_MaxLocMem 4))
    (addsymbol eb_DebugData (+ eb_DebugEntry 4))
    (addsymbol eb_AlertData (+ eb_DebugData 4))
    (addsymbol eb_MaxExtMem (+ eb_AlertData 4))
    (addsymbol eb_ChkSum (+ eb_MaxExtMem 4))
    (addsymbol eb_IntVects (+ eb_ChkSum 2))
    (addsymbol eb_ThisTask (+ eb_IntVects c0))
    (addsymbol eb_IdleCount (+ eb_ThisTask 4))
    (addsymbol eb_DispCount (+ eb_IdleCount 4))
    (addsymbol eb_Quantum (+ eb_DispCount 4))
    (addsymbol eb_Elapsed (+ eb_Quantum 2))
    (addsymbol eb_SysFlags (+ eb_Elapsed 2))
    (addsymbol eb_IDNestCnt (+ eb_SysFlags 2))
    (addsymbol eb_TDNestCnt (+ eb_IDNestCnt 1))
    (addsymbol eb_AttnFlags (+ eb_TDNestCnt 1))
    (addsymbol eb_AttnResched (+ eb_AttnFlags 2))
    (addsymbol eb_ResModules (+ eb_AttnResched 2))
    (addsymbol eb_TaskTrapCode (+ eb_ResModules 4))
    (addsymbol eb_TaskExceptCode (+ eb_TaskTrapCode 4))
    (addsymbol eb_TaskExitCode (+ eb_TaskExceptCode 4))
    (addsymbol eb_TaskSigAlloc (+ eb_TaskExitCode 4))
    (addsymbol eb_TaskTrapAlloc (+ eb_TaskSigAlloc 4))
    (addsymbol eb_MemList (+ eb_TaskTrapAlloc 2))
    (addsymbol eb_ResourceList (+ eb_MemList e))
    (addsymbol eb_DeviceList (+ eb_ResourceList e))
    (addsymbol eb_IntrList (+ eb_DeviceList e))
    (addsymbol eb_LibList (+ eb_IntrList e))
    (addsymbol eb_PortList (+ eb_LibList e))
    (addsymbol eb_TaskReady (+ eb_PortList e))
    (addsymbol eb_TaskWait (+ eb_TaskReady e))
    (addsymbol eb_SoftInts (+ eb_TaskWait e))
    (addsymbol eb_LastAlert (+ eb_SoftInts 50))
    (addsymbol eb_VBlankFrequency (+ eb_LastAlert 4))
    (addsymbol eb_PowerSupplyFrequency (+ eb_VBlankFrequency 1))
    (addsymbol eb_SemaphoreList (+ eb_PowerSupplyFrequency 1))
    (addsymbol eb_KickMemPtr (+ eb_SemaphoreList e))
    (addsymbol eb_KickTagPtr (+ eb_KickMemPtr 4))
    (addsymbol eb_KickCheckSum (+ eb_KickTagPtr 4))
    (addsymbol eb_ExecBaseReserve (+ eb_KickCheckSum 4))
    (addsymbol eb_ExecBaseNewReserve (+ eb_ExecBaseReserve 1))
)

;EXEC Library structure
(macro Library
    (if (!= (nargs) 0)
	(addsymbol lib_Node (arg 1))
	(addsymbol lib_Node (current)))
    (addsymbol lib_Flags (+ lib_Node e))
    (addsymbol lib_pad (+ lib_Flags 1))
    (addsymbol lib_NegSize (+ lib_pad 1))
    (addsymbol lib_PosSize (+ lib_NegSize 2))
    (addsymbol lib_Version (+ lib_PosSize 2))
    (addsymbol lib_Revision (+ lib_Version 2))
    (addsymbol lib_IdString (+ lib_Revision 2))
    (addsymbol lib_Sum (+ lib_IdString 4))
    (addsymbol lib_OpenCnt (+ lib_Sum 4))
)

;EXEC List structure
(macro List
    (if (!= (nargs) 0)
	(addsymbol lh_Head (arg 1))
	(addsymbol lh_Head (current)))
    (addsymbol lh_Tail (+ lh_Head 4))
    (addsymbol lh_TailPred (+ lh_Tail 4))
    (addsymbol lh_Type (+ lh_TailPred 4))
    (addsymbol lh_pad (+ lh_Type 1))
)

;EXEC MemChunk structure
(macro MemChunk
    (if (!= (nargs) 0)
	(addsymbol mc_Next (arg 1))
	(addsymbol mc_Next (current)))
    (addsymbol mc_Bytes (+ mc_Next 4))
)

;EXEC MemHeader structure
(macro MemHeader
    (if (!= (nargs) 0)
	(addsymbol mh_Node (arg 1))
	(addsymbol mh_Node (current)))
    (addsymbol mh_Attributes (+ mh_Node e))
    (addsymbol mh_First (+ mh_Attributes 2))
    (addsymbol mh_Lower (+ mh_First 4))
    (addsymbol mh_Upper (+ mh_Lower 4))
    (addsymbol mh_Free (+ mh_Upper 4))
)

;EXEC Resident structure
(macro Resident
    (if (!= (nargs) 0)
	(addsymbol rt_MatchWord (arg 1))
	(addsymbol rt_MatchWord (current)))
    (addsymbol rt_MatchTag (+ rt_MatchWord 2))
    (addsymbol rt_EndSkip (+ rt_MatchTag 4))
    (addsymbol rt_Flags (+ rt_EndSkip 4))
    (addsymbol rt_Version (+ rt_Flags 1))
    (addsymbol rt_Type (+ rt_Version 1))
    (addsymbol rt_Pri (+ rt_Type 1))
    (addsymbol rt_Name (+ rt_Pri 1))
    (addsymbol rt_IdString (+ rt_Name 4))
    (addsymbol rt_Init (+ rt_IdString 4))
)

;EXEC Task structure
(macro Task
    (if (!= (nargs) 0)
	(addsymbol tc_Node (arg 1))
	(addsymbol tc_Node (current)))
    (addsymbol tc_Flags (+ tc_Node e))
    (addsymbol tc_State (+ tc_Flags 1))
    (addsymbol tc_IDNestCnt (+ tc_State 1))
    (addsymbol tc_TDNestCnt (+ tc_IDNestCnt 1))
    (addsymbol tc_SigAlloc (+ tc_TDNestCnt 1))
    (addsymbol tc_SigWait (+ tc_SigAlloc 4))
    (addsymbol tc_SigRecvd (+ tc_SigWait 4))
    (addsymbol tc_SigExcept (+ tc_SigRecvd 4))
    (addsymbol tc_TrapAlloc (+ tc_SigExcept 4))
    (addsymbol tc_TrapAble (+ tc_TrapAlloc 2))
    (addsymbol tc_ExceptData (+ tc_TrapAble 2))
    (addsymbol tc_ExceptCode (+ tc_ExceptData 4))
    (addsymbol tc_TrapData (+ tc_ExceptCode 4))
    (addsymbol tc_TrapCode (+ tc_TrapData 4))
    (addsymbol tc_SPReg (+ tc_TrapCode 4))
    (addsymbol tc_SPLower (+ tc_SPReg 4))
    (addsymbol tc_SPUpper (+ tc_SPLower 4))
    (addsymbol tc_Switch (+ tc_SPUpper 4))
    (addsymbol tc_Launch (+ tc_Switch 4))
    (addsymbol tc_MemEntry (+ tc_Launch 4))
    (addsymbol tc_UserData (+ tc_MemEntry e))
)

;DOS Process structure
(macro Process
    (if (!= (nargs) 0)
	(addsymbol pr_Task (arg 1))
	(addsymbol pr_Task (current)))
    (addsymbol pr_MsgPort (+ pr_Task 5c))
    (addsymbol pr_Pad (+ pr_MsgPort 22))
    (addsymbol pr_SegList (+ pr_Pad 2))
    (addsymbol pr_StackSize (+ pr_SegList 4))
    (addsymbol pr_GlobVec (+ pr_StackSize 4))
    (addsymbol pr_TaskNum (+ pr_GlobVec 4))
    (addsymbol pr_StackBase (+ pr_TaskNum 4))
    (addsymbol pr_Result2 (+ pr_StackBase 4))
    (addsymbol pr_CurrentDir (+ pr_Result2 4))
    (addsymbol pr_CIS (+ pr_CurrentDir 4))
    (addsymbol pr_COS (+ pr_CIS 4))
    (addsymbol pr_ConsoleTask (+ pr_COS 4))
    (addsymbol pr_FileSystemTask (+ pr_ConsoleTask 4))
    (addsymbol pr_CLI (+ pr_FileSystemTask 4))
    (addsymbol pr_ReturnAddr (+ pr_CLI 4))
    (addsymbol pr_PktWait (+ pr_ReturnAddr 4))
    (addsymbol pr_WindowPtr (+ pr_PktWait 4))
)

;DOS CommandLineInterface structure
(macro CommandLineInterface
    (if (!= (nargs) 0)
	(addsymbol cli_Result2 (arg 1))
	(addsymbol cli_Result2 (current)))
    (addsymbol cli_SetName (+ cli_Result2 4))
    (addsymbol cli_CommandDir (+ cli_SetName 4))
    (addsymbol cli_ReturnCode (+ cli_CommandDir 4))
    (addsymbol cli_CommandName (+ cli_ReturnCode 4))
    (addsymbol cli_FailLevel (+ cli_CommandName 4))
    (addsymbol cli_Prompt (+ cli_FailLevel 4))
    (addsymbol cli_StandardInput (+ cli_Prompt 4))
    (addsymbol cli_CurrentInput (+ cli_StandardInput 4))
    (addsymbol cli_CommandFile (+ cli_CurrentInput 4))
    (addsymbol cli_Interactive (+ cli_CommandFile 4))
    (addsymbol cli_Background (+ cli_Interactive 4))
    (addsymbol cli_CurrentOutput (+ cli_Background 4))
    (addsymbol cli_DefaultStack (+ cli_CurrentOutput 4))
    (addsymbol cli_StandardOutput (+ cli_DefaultStack 4))
    (addsymbol cli_Module (+ cli_StandardOutput 4))
)

;show some important ExecBase members
(macro ebase
    (ExecBase)
    (print "ExecBase at %8lx, Version: %ld\n" EBase (@ eb_SoftVer))
    (print "ColdCapture $%06lx  CoolCapture $%06lx  WarmCapture $%06lx\n"
      (@l eb_ColdCapture) (@l eb_CoolCapture) (@l eb_WarmCapture))
    (print "SysStkUpper $%06lx  SysStkLower $%06lx  MaxLocMem   $%06lx\n"
      (@l eb_SysStkUpper) (@l eb_SysStkLower) (@l eb_MaxLocMem))
    (print "DebugEntry  $%06lx  DebugData   $%06lx  AlertData   $%06lx\n"
      (@l eb_DebugEntry) (@l eb_DebugData) (@l eb_AlertData))
    (print "TrapCode    $%06lx  ExceptCode  $%06lx  ExitCode    $%06lx\n"
      (@l eb_TaskTrapCode) (@l eb_TaskExceptCode) (@l eb_TaskExitCode))
    (print "SigAlloc  $%08lx  TrapAlloc     $%04lx\n"
      (@l eb_TaskSigAlloc) (@ eb_TaskTrapAlloc))
    (print "ThisTask    $%06lx  SysFlags      $%04lx\n"
      (@l eb_ThisTask) (@ eb_SysFlags))
    (print "IdleCount  %8ld  DispCount  %8ld\n"
      (@l eb_IdleCount) (@l eb_DispCount))
    (print "Quantum       %5ld  Elapsed       %5ld\n"
      (@ eb_Quantum) (@ eb_Elapsed))
    (print "IDNestCnt      %4ld  TDNestCnt      %4ld\n"
      (@b eb_IDNestCnt) (@b eb_TDNestCnt))
    (print "AttnFlags     $%04lx\n" (@ eb_AttnFlags))
)

;show one of four lists
(macro showlist
    (ExecBase)
    (select
	(== (arg 1) 1) (List eb_DeviceList)
	(== (arg 1) 2) (List eb_LibList)
	(== (arg 1) 3) (List eb_ResourceList)
	(== (arg 1) 4) (List (current)))
    (print "Address NT  Pri Ver Rev Name\n")
    (for (Node (@l lh_Head)) (!= (@l ln_Succ) 0) (Node (@l ln_Succ))
    (
	(Library ln_Succ)
	(print "$%6lx %2lx " lib_Node (@b ln_Type))
	(signb (@b ln_Pri))
	(print " %3ld %3ld \"%s\"\n" (@ lib_Version) (@ lib_Revision)
	    (@l ln_Name))
    ))
)

;show device list
(macro devices
    (showlist 1)
)

;show library list
(macro libraries
    (showlist 2)
)

;show resource list
(macro resources
    (showlist 3)
)

;show a list of nodes
(macro nodes
    (showlist 4)
)

;show memory allocation list
(macro memory
    (ExecBase)
    (MemHeader (@l eb_MemList))
    (forbid)
    (print "$%lx attr:%lx lower:$%lx upper:$%lx first:$%lx free:$%ld.\n"
      mh_Node (@ mh_Attributes) (@l mh_Lower) (@l mh_Upper) (@l mh_First)
      (@l mh_Free))
    (for (MemChunk (@l mh_First)) (!= mc_Next 0) (MemChunk (@l mc_Next))
    (
	(print "  %6lx  size:%6lx (%ld.)\n" mc_Next (@l mc_Bytes)
	  (@l mc_Bytes))
    ))
    (permit)
)

;show system modules
(macro modules (local res)
    (ExecBase)
    (print "Address Pri Type Ver Name\n")
    (= res (@l eb_ResModules))
    (while(!= (@l res) 0)
    (
	(Resident (@l res))
	(print "$%6lx " (@l res))
	(signb (@b rt_Pri))
	(print " %4ld %3ld %s" (@b rt_Type) (@b rt_Version) (@l rt_IdString))
	(= res (+ res 4))
    ))
)

;print task state
(macro PrintTaskState (local state)
    (= state (@b tc_State))
    (if (or (< state 0) (> state 6)) (= state 0))
    (select
	(== state 0) (print "????")
	(== state 1) (print " add")
	(== state 2) (print " run")
	(== state 3) (print "redy")
	(== state 4) (print "wait")
	(== state 5) (print "expt")
	(== state 6) (print "remv")
    )
)

;tasks subroutine: show task
(macro ShowTaskHead
    (Task ln_Succ)
    (print "$%06lx %2ld " tc_Node (@b ln_Type))
    (signb (@b ln_Pri))
    (PrintTaskState)
    (print " $%08lx $%06lx \"%s\"\n" (@l tc_SigWait) (@l tc_SPReg)
      (@l ln_Name))
)

;show all tasks
(macro tasks
    (ExecBase)
    (print "Address NT  Pri Stat   SigWait   SPReg Name\n")
    (disable)
    (Node (@l eb_ThisTask))
    (ShowTaskHead)
    (List eb_TaskReady)
    (for (Node (@l lh_Head)) (!= (@l ln_Succ) 0) (Node (@l ln_Succ))
	(ShowTaskHead)
    )
    (List eb_TaskWait)
    (for (Node (@l lh_Head)) (!= (@l ln_Succ) 0) (Node (@l ln_Succ))
	(ShowTaskHead)
    )
    (enable)
)

;format given address or current frame as a Task
(macro showtask (local i cpu AFB_68020)
    (if (!= (nargs) 0)
	(Task (arg 1))
	(Task (current)))
    (ExecBase)
    (= AFB_68020 1)
    (Node tc_Node)
    (print "'%s', in " (@l ln_Name))
    (PrintTaskState)
    (print " state (#%ld) at priority " (@b tc_State))
    (signb (@b ln_Pri))
    (print " \n")
    (print "Type %ld  Flags %02lx  IDNestCnt %ld  TDNestCnt %ld\n"
      (@b ln_Type) (@b tc_Flags) (@b tc_IDNestCnt) (@b tc_TDNestCnt))
    (print "Signal:  Alloc %08lx  Wait  %08lx  Recvd %08lx  Except %08lx\n"
      (@l tc_SigAlloc) (@l tc_SigWait) (@l tc_SigRecvd) (@l tc_SigExcept))
    (print "Trap:    Data  %08lx  Code  %08lx  Alloc %04lx      Able   %04lx\n"
      (@l tc_TrapData) (@l tc_TrapCode) (@ tc_TrapAlloc) (@ tc_TrapAble))
    (print "Except:  Data  %08lx  Code  %08lx\n"
      (@l tc_ExceptData) (@l tc_ExceptCode))
    (print "Stack:   Reg   %08lx  Lower %08lx  Upper %08lx\n"
      (@l tc_SPReg) (@l tc_SPLower) (@l tc_SPUpper))

    (if (and (@ eb_AttnFlags) AFB_68020) (= cpu 4) (= cpu 0))
    (if (or (== (@b tc_State) 3) (== (@b tc_State) 4))
    (
	(print "CPURegs: PC    %08lx  SR    %04lx\n"
	    (@l (+ cpu (@l tc_SPReg))) (@ (+ (+ 4 cpu) (@l tc_SPReg))))
	(print "D: ")
	(for (= i 0) (< i 8) (= i (+ 1 i))
	    (print "%08lx " (@l (+ (+ (+ 6 cpu) (@l tc_SPReg)) (* i 4)))))
	(print "\nA: ")
	(for (= i 8) (< i f) (= i (+ 1 i))
	    (print "%08lx " (@l (+ (+ (+ 6 cpu) (@l tc_SPReg)) (* i 4)))))
    ))
    (print "\n")
)

;format given address or current frame as a Process
(macro showprocess (local addr)
    (if (!= (nargs) 0)
	(= addr (arg 1))
	(= addr (current)))
    (showtask addr)
    (Process addr)
    (print "Process Dependent ------------------------------------------\n")
    (print "SegList      $%08lx  StackSize    $%08lx  GlobVec      $%08lx\n"
      (LTOB pr_SegList) (@l pr_StackSize) (@l pr_GlobVec))
    (print "TaskNum       %8ld  StackBase    $%08lx  Result2       %8ld\n"
      (@l pr_TaskNum) (LTOB pr_StackBase) (@l pr_Result2))
    (print "CurrentDir   $%08lx  CIS          $%08lx  COS          $%08lx\n"
      (LTOB pr_CurrentDir) (LTOB pr_CIS) (LTOB pr_COS))
    (print "ConsoleTask  $%08lx  FileSysTask  $%08lx  CLI          $%08lx\n"
      (@l pr_ConsoleTask) (@l pr_FileSystemTask) (LTOB pr_CLI))
    (print "ReturnAddr   $%08lx  PktWait      $%08lx\n"
      (@l pr_ReturnAddr) (@l pr_PktWait))

    (if (== 0 (@l pr_CLI))
	(return 0))

    (print "\nCLI Dependent ----------------------------------------------\n")
    (CommandLineInterface (LTOB pr_CLI))
    (print "Command: ") (BSTR cli_CommandName)
    (print ",  Directory: ") (BSTR cli_SetName)
    (print "\n")
    (print "Module (SegList)  $%08lx\n" (LTOB cli_Module))
    (print "DefaultStack $%08lx  ReturnCode    %8ld\n"
      (@l cli_DefaultStack) (@l cli_ReturnCode))
)



;key bindings
(key '~0 libraries)
(key '~1 modules)
(key '~2 devices)
(key '~3 resources)
(key '~4 memory)
(key '~5 tasks)
(key '~6 showtask)
(key '~7 showprocess)
(key '~8 ebase)
(key '~9 symbols)

