[Info-vax] Listeners in VMS Basic, was: Re: Integrity iLO Configuration?
Stephen Hoffman
seaohveh at hoffmanlabs.invalid
Tue Jul 13 10:47:56 EDT 2021
On 2021-07-12 23:12:57 +0000, Dave Froble said:
> On 7/12/2021 4:16 PM, Stephen Hoffman wrote:
>> On 2021-07-09 23:45:31 +0000, Dave Froble said:
>>
>>> Just because some agree, doesn't make them right.
>>>
>>> But, Ok, a practical example, tell me, too many comments, not enough
>>> comments, what?
>>>
>>> ;+
>>> ; Base block must be > 0
>>> ; # of blocks must be > 0 & < 128
>>> ; End block must be <= EOF block
>>> ; Grant lock if caller has exclusive access to the file
>>> ;-
>>>
>>> MOVZWL #SS$_ABORT,R0 ; Assume failure
>>> TSTL R3 ; Base block zero?
>>> BNEQU 020$ ; No, continue
>>> 010$: BRW RETURN ; Yes, return
>>> 020$: TSTL R4 ; Block count zero?
>>> BEQLU 010$ ; Yes, return
>>> CMPL #127,R4 ; Block count <= 127
>>> BLSSU 010$ ; No, return
>>> MOVAB -1(R3)[R4],R5 ; Last block to lock
>>> CMPL CIB_L_FILSIZ(R7),R5 ; LE filesize?
>>> BGEQU 030$ ; Yes, continue
>>> MOVL CIB_L_FILSIZ(R7),R5 ; Else lock only to EOF
>>
>>
>> BLEQU, not BLSSU? Or BLSSU with 128?
>>
>> I'd suggest using a string constant for 127 (or 128) rather than a
>> magic number, too.
>>
>
> Now I'm sorry I started this ...
>
> Ok, could you expound upon your comments? I'm totally not understanding.
>
> This particular code is from 1984, and written by Ben Carter, a much
> better Macro-32 programmer than I have ever been.
Yeah, ignore my previous, I'm mis-reading the code; the CMPL.
The control flow in this Macro32 is not what I'd choose. I prefer
errors to be branches or RSBs or RETs, with mainline flow straight
through.
CIB_K_IOLIM = 128
; R3 block address
; R4 block count
; R5 address + count - 1
; R7 file context block
{following branch located somewhere within BRB range, but interstitial}
010$:
BRW RETURN ; helper branch for
the exit {would prefer a RET here}
ENTRY:
MOVZWL #SS$_ABORT,R0 ; Assume failure
TSTL R3 ; block address zero?
BEQLU 010$ ; Yes, exit via helper BRW
TSTL R4 ; block count zero?
BEQLU 010$ ; yes, done, return
CMPL #CIB_K_IOLIM,R4 ; limit <= block count?
BLEQU 010$ ; Yes, exit via helper BRW
MOVAB -1(R3)[R4],R5 ; address of last block to lock
CMPL CIB_L_FILSIZ(R7),R5 ; filesize < address of last block?
BGEQU 030$ ; Yes, continue
MOVL CIB_L_FILSIZ(R7),R5 ; Else lock only to the EOF
...
030$: ...
{It seems the original code is storing an address in a field named
filesize. Which is weird.}
Which translates into idiomatic C {declarations omitted} as:
if ( !blockbase || !blockcount || blockcount >= CIB_K_IOLIM )
return SS$_ABORT;
lastblocktolock = blockbase + blockcount;
if ( lastblocktolock > context->filesize )
lastblocktolock = context->filesize;
--
Pure Personal Opinion | HoffmanLabs LLC
More information about the Info-vax
mailing list