home *** CD-ROM | disk | FTP | other *** search
- SUBT Useful procedure entry/exit macros => &.Hdr.Proc
-
- OldOpt SETA {OPT}
- OPT OptNoList+OptNoP1List
-
- GBLS Proc_RegList ; Which registers to preserve
- GBLA Proc_LocalStack ; And any ADJSP on entry/exit for local vars
-
- GBLL Proc_Debug ; Whether to dump procedure name in image
- Proc_Debug SETL False
-
- ; *****************************************************************************
- ; *** Keep a note of local stack and register use at the routine entry ***
- ; *** point so that an exit may be effected anywhere in the body without ***
- ; *** remembering how many (and which) registers to destack and ADJSP. ***
- ; *** Also ensures that the code entry label is word-aligned. ***
- ; *****************************************************************************
- MACRO
- $label ENTRY $reglist,$framesize
- ALIGN
- Proc_RegList SETS "$reglist"
- [ "$framesize" = ""
- Proc_LocalStack SETA 0
- |
- Proc_LocalStack SETA $framesize
- ]
- [ "$label" <> ""
- [ Proc_Debug
- B $label
- DCB "$label", 0
- ALIGN
- ]
- $label ROUT
- ]
- [ "$Proc_RegList" = ""
- Push lr
- |
- Push "$Proc_RegList, lr"
- ]
- [ Proc_LocalStack <> 0
- SUB sp, sp, #Proc_LocalStack
- ]
- MEND
-
- ; *****************************************************************************
- ; *** Another entry point so we can use the same routine body. NOROUT also ***
- ; *** Stacks the same registers as does the corresponding ENTRY macro ***
- ; *****************************************************************************
- MACRO
- $label ALTENTRY
- ALIGN
- [ "$label" <> ""
- [ Proc_Debug
- B $label
- DCB "$label", 0
- ALIGN
- ]
- $label ; NOROUT
- ]
- [ "$Proc_RegList" = ""
- Push lr
- |
- Push "$Proc_RegList, lr"
- ]
- [ Proc_LocalStack <> 0
- SUB sp, sp, #Proc_LocalStack
- ]
- MEND
-
- ; *****************************************************************************
- ; *** Exit procedure, restore stack and saved registers to values on entry ***
- ; *****************************************************************************
- MACRO
- $label EXIT $cond
- $label
- [ Proc_LocalStack <> 0
- ADD$cond sp, sp, #Proc_LocalStack
- ]
- [ "$Proc_RegList" = ""
- Pull pc,$cond
- |
- Pull "$Proc_RegList, pc",$cond
- ]
- MEND
-
- ; *****************************************************************************
- ; *** Exit procedure : restore stack and saved registers + psr to values on ***
- ; *** entry. No longer copes with 3um ARM bug fix (world is 2um'ised) ***
- ; *****************************************************************************
- MACRO
- $label EXITS $cond
- $label
- [ Proc_LocalStack <> 0
- ADD$cond sp, sp, #Proc_LocalStack
- ]
- [ "$Proc_RegList" = ""
- Pull pc,$cond,^
- |
- Pull "$Proc_RegList, pc",$cond,^
- ]
- MEND
-
- ; *****************************************************************************
- ; *** Restore stack and saved registers, lr to values on entry to procedure ***
- ; *****************************************************************************
- MACRO
- $label PullEnv $cond
- $label
- [ Proc_LocalStack <> 0
- ADD$cond sp, sp, #Proc_LocalStack
- ]
- [ "$Proc_RegList" = ""
- Pull lr, $cond
- |
- Pull "$Proc_RegList, lr", $cond
- ]
- MEND
-
- ; *****************************************************************************
-
- OPT OldOpt
- END
-