[Info-vax] Very simple DCL question
Arne Vajhøj
arne at vajhoej.dk
Sat Dec 31 16:03:24 EST 2022
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
More information about the Info-vax
mailing list