[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