[Info-vax] Very simple DCL question
Chris Townley
news at cct-net.co.uk
Sat Dec 31 18:30:26 EST 2022
On 31/12/2022 21:03, Arne Vajhøj wrote:
> On 12/28/2022 9:58 PM, Arne Vajhøj wrote:
>> On 12/28/2022 10:49 PM, VAXman- at SendSpamHere.ORG wrote:
>>> In article <toisqe$p0r$1 at gioia.aioe.org>,
>>> =?UTF-8?Q?Arne_Vajh=c3=b8j?= <arne at vajhoej.dk> writes:
> [Macro-32 omitted]
>>> Good grief! I needed an airsick bag and bottle of Tums after reading
>>> that.
>>
>> That bad? Hmmm.
>
> You will probably not like the zweiter sehr verbesserte ausgabe either.
>
> .title realp
> $SSDEF
> $DSCDEF
> SPACE=32
> PRC_C_CMDBUFSIZ=4097 ; 1025 on VAX
> PRC$W_PROCLEVEL=56
> .macro if_end_command,lbl
> cmpl r3,r4
> bgeq lbl
> .endm
> .macro if_space,lbl
> cmpb (r3),#SPACE
> beql lbl
> .endm
> .psect $PDATA quad,pic,con,lcl,shr,noexe,nowrt
> nomsg: .ascid "This is not run from first level COM file so no action
> taken"
> .psect $LOCAL quad,pic,con,lcl,noshr,noexe,wrt
> copy1: .blkb PRC_C_CMDBUFSIZ
> copy2: .blkb PRC_C_CMDBUFSIZ
> pnam: .ascid "P1"
> pval: .blkw 1
> .byte DSC$K_DTYPE_T
> .byte DSC$K_CLASS_S
> .address pvala
> pvala: .blkb 256
> .psect $CODE quad,pic,con,lcl,shr,exe,nowrt
> .entry realp,^m<r2,r3,r4,r5,r6>
> ; phase 1 : grab copy of recall buffer
> ; out r0 = command length
> ; out r1 = command address
> ; temp r2 & r3 for working storage
> ; temp r6 = pointer recall buffer P1 space
> movl #CTL$AG_CLIDATA,r6
> movl W^PPD$L_PRC(r6),r6
> cmpw W^PRC$W_PROCLEVEL(r6),#1 ; test if run from first level
> COM file
> bneq nogood
> movc3 #PRC_C_CMDBUFSIZ,W^PRC_G_COMMANDS(r6),copy1 ; make two
> copies of data to handle circular buffer
> movc3 #PRC_C_CMDBUFSIZ,W^PRC_G_COMMANDS(r6),copy2
> movab W^PRC_G_COMMANDS(r6),r2 ; find address next command
> movl W^PRC_L_RECALLPTR(r6),r3
> subl3 r2,r3,r1
> movab copy2,r6
> addl2 r6,r1
> subl2 #2,r1 ; find length current command
> cvtwl (r1),r0
> subl2 r0,r1 ; find address current command
> ; phase 2 : parse
> ; in r0 = command length
> ; in r1 = command address
> ; temp r2 = parameter number
> ; temp r3 = current character in command
> ; temp r4 = end of command
> ; temp r5 = current Pn output character
> movl r1,r3 ; current character = first
> character
> addl3 r0,r3,r4 ; find end of command
> ; skip command itself
> 100$: if_end_command done
> if_space start
> incl r3 ; skip if not space
> brb 100$
> ; process parameters
> start: incl r3 ; skip space between command
> itself and P1
> movl #1,r2 ; n = 1
> 200$: if_end_command done
> movw #0,pval ; reset parameter data
> movab pvala,r5
> 300$: if_end_command 500$
> if_space 400$
> incw pval ; add to parameter data
> movb (r3)+,(r5)+
> brb 300$
> 400$: incl r3 ; skip space between Pn and Pn+1
> 500$: pushl #0
> pushab pval ; set Pn symbol
> pushab pnam
> calls #3,G^LIB$SET_SYMBOL
> incb pnam+9 ; update Pn -> Pn+1
> incl r2 ; n = n + 1
> cmpl r2,#8 ; while n <= 8
> bleq 200$
> brb done
> ; message due to to not being run from first level COM file
> nogood: pushab nomsg
> calls #1,G^LIB$PUT_OUTPUT
> ; all done
> done: movl #SS$_NORMAL,r0
> ret
> .end realp
>
> Arne
That reminds why I told the development manager, when being interviewed
to join the programming team, that I would not do macro...
I still got the job!
Later when there was a problem with any of the macro, I just rewrote in
a high level language
--
Chris
More information about the Info-vax
mailing list