[Info-vax] Fortran problem with QIO

gerry77 at no.spam.mail.com gerry77 at no.spam.mail.com
Wed Dec 2 17:19:58 EST 2009


On Wed, 2 Dec 2009 10:07:27 -0800 (PST), Hein RMS van den Heuvel
<heinvandenheuvel at gmail.com> wrote:

> > Call me crazy, but I'm trying to (re)learn Fortran while experimenting with
> > some system services, and I have chosen the steepest approach to the matter:
> > I'm trying to create a file with $QIOW in Fortran 77 on a VAX. :-P
> 
> You are Crazy!
> Nobody does that.

Well, I'm crazy, so I DO that! :->

After posting my message here, and also following the good suggestion about
looking into the Unzip sources, I understood that my problem was due to some
bad descriptors. I've managed to create them right, and now the program
works! :-) It's just a proof of concept (I want to stress it again), and as
a matter of facts there are also some hard-coded values (e.g. the DID), but
it does what it's expected do to. It was a very instructive experience...

Here it is, comments are welcome:

      PROGRAM IOTEST

      IMPLICIT NONE

      INCLUDE '($SYSSRVNAM)'
      INCLUDE '($EFNDEF)'
      INCLUDE '($FIBDEF)'
      INCLUDE '($ATRDEF)'
      INCLUDE '($DSCDEF)'
      INCLUDE '($IODEF)'
      INCLUDE '($SSDEF)'

      STRUCTURE /FATDEF/  ! As per FATDEF in LIB.REQ et al.
        PARAMETER FAT$K_LENGTH = '00000020'X
        PARAMETER FAT$C_LENGTH = '00000020'X
        PARAMETER FAT$S_FATDEF = '00000020'X
        UNION
          MAP
            BYTE FAT$B_RTYPE
          END MAP
          MAP
            PARAMETER FAT$C_UNDEFINED = '00000000'X
            PARAMETER FAT$C_FIXED = '00000001'X
            PARAMETER FAT$C_VARIABLE = '00000002'X
            PARAMETER FAT$C_VFC = '00000003'X
            PARAMETER FAT$C_STREAM = '00000004'X
            PARAMETER FAT$C_STREAMLF = '00000005'X
            PARAMETER FAT$C_STREAMCR = '00000006'X
            BYTE FAT$V_RTYPE
          END MAP
          MAP
            PARAMETER FAT$C_SEQUENTIAL = '00000000'X
            PARAMETER FAT$C_RELATIVE = '00000008'X
            PARAMETER FAT$C_INDEXED = '00000010'X
            PARAMETER FAT$C_DIRECT = '0000001F'X
            BYTE FAT$V_FILEORG
          END MAP
        END UNION
        PARAMETER FAT$C_FORTRANCC = '00000001'X
        PARAMETER FAT$C_IMPLIEDCC = '00000002'X
        PARAMETER FAT$C_PRINTCC = '00000004'X
        PARAMETER FAT$C_NOSPAN = '00000008'X
        PARAMETER FAT$C_MSBRCW = '00000010'X
        BYTE FAT$B_RATTRIB
        INTEGER*2 FAT$W_RSIZE
        UNION
          MAP
            INTEGER*4 FAT$L_HIBLK
          END MAP
          MAP
            INTEGER*2 FAT$W_HIBLKH
            INTEGER*2 FAT$W_HIBLKL
          END MAP
        END UNION
        UNION
          MAP
            INTEGER*4 FAT$L_EFBLK
          END MAP
          MAP
            INTEGER*2 FAT$W_EFBLKH
            INTEGER*2 FAT$W_EFBLKL
          END MAP
        END UNION
        INTEGER*2 FAT$W_FFBYTE
        BYTE FAT$B_BKTSIZE
        BYTE FAT$B_VFCSIZE
        INTEGER*2 FAT$W_MAXREC
        INTEGER*2 FAT$W_DEFEXT
        INTEGER*2 FAT$W_GBC
        BYTE %FILL(8)
        INTEGER*2 FAT$W_VERSIONS
      END STRUCTURE

      STRUCTURE /IOSBDEF/  ! Official definition somewhere?
        INTEGER*2 IOSB_W_STATUS
        INTEGER*2 IOSB_W_BYTECOUNT
        INTEGER*4 IOSB_L_BLKCOUNT 
      END STRUCTURE

      STRUCTURE /ATRDSC/           ! Made up of two different pieces:
        UNION                      !
          MAP                      !
            RECORD /DSCDEF1/ DSC1  ! 1. Sort of generic header
          END MAP                  !
          MAP                      !
            RECORD /DSCDEF5/ DSC5  ! 2. Specific body for array descriptors
          END MAP
        END UNION
      END STRUCTURE

      RECORD /ATRDEF/  ATR(4)
      RECORD /FIBDEF/  FIB
      RECORD /FATDEF/  FAT
      RECORD /IOSBDEF/ IOSB
      RECORD /DSCDEF1/ FIBDSC  ! String/generic descriptor
      RECORD /ATRDSC/ ATRDSC   ! Array descriptor

      INTEGER*4 
     +    SS_STATUS,
     +    CHAN,
     +    FUNC

      INTEGER*2
     +    UIC(2),
     +    FPRO     ! File protection bitmask

      CHARACTER
     +    DEVNAM*9   /'SYS$DISK:'/,
     +    FILNAM*10  /'MYFILE.DAT'/

      FIB.FIB$W_DID_NUM = 146            ! Actual DID of my work directory
      FIB.FIB$W_DID_SEQ = 34             !
      FIB.FIB$W_DID_RVN = 0              !
      FIB.FIB$L_ACCTL = FIB$M_WRITETHRU
      FIB.FIB$W_NMCTL = FIB$M_NEWVER
      FIB.FIB$W_EXCTL = FIB$M_EXTEND + FIB$M_ALDEF
      FIB.FIB$L_EXSZ = 3
      FIB.FIB$L_EXVBN = 0

      FAT.FAT$B_RTYPE = FAT$C_FIXED + FAT$C_SEQUENTIAL
      FAT.FAT$W_RSIZE = 30
      FAT.FAT$W_MAXREC = 30
      FAT.FAT$W_EFBLKH = 0
      FAT.FAT$W_EFBLKL = 1
      FAT.FAT$W_FFBYTE = 0

      UIC(1) = '201'O             ! My actual UIC in octal and reversed
      UIC(2) = '200'O             !

      FPRO = '1100110011001100'B  ! RW for everyone (S,O,G,W)

      ATR(1).ATR$W_SIZE = ATR$S_RECATTR
      ATR(1).ATR$W_TYPE = ATR$C_RECATTR
      ATR(1).ATR$L_ADDR = LOC(FAT)

      ATR(2).ATR$W_SIZE = ATR$S_UIC
      ATR(2).ATR$W_TYPE = ATR$C_UIC
      ATR(2).ATR$L_ADDR = LOC(UIC)

      ATR(3).ATR$W_SIZE = ATR$S_FPRO
      ATR(3).ATR$W_TYPE = ATR$C_FPRO
      ATR(3).ATR$L_ADDR = LOC(FPRO)

      ATR(4).ATR$W_SIZE = 0           ! Values to signal list-end
      ATR(4).ATR$W_TYPE = 0           !

      FIBDSC.DSC$W_MAXSTRLEN = FIB$K_LENGTH
      FIBDSC.DSC$B_DTYPE = DSC$K_DTYPE_T
      FIBDSC.DSC$B_CLASS = DSC$K_CLASS_S
      FIBDSC.DSC$A_POINTER = LOC(FIB)

      ATRDSC.DSC1.DSC$W_MAXSTRLEN = SIZEOF(ATR)
      ATRDSC.DSC1.DSC$B_DTYPE = DSC$K_DTYPE_T
      ATRDSC.DSC1.DSC$B_CLASS = DSC$K_CLASS_A  ! Array type descriptor
      ATRDSC.DSC1.DSC$A_POINTER = LOC(ATR)       
      ATRDSC.DSC5.DSC$B_SCALE = 0              ! Are all this things
      ATRDSC.DSC5.DSC$B_DIGITS = 0             !   really needed?
      ATRDSC.DSC5.DSC$B_AFLAGS = 0             !
      ATRDSC.DSC5.DSC$B_DIMCT = 1              !
      ATRDSC.DSC5.DSC$L_ARSIZE = SIZEOF(ATR)   !
      ATRDSC.DSC5.DSC$A_A0 = LOC(ATR)          !

      FUNC = IO$_CREATE + IO$M_CREATE

      SS_STATUS = SYS$ASSIGN(%DESCR(DEVNAM),CHAN,,,)

      SS_STATUS = SYS$QIOW(EFN$C_ENF,             ! Efn (no EF used)
     +                     %VAL(CHAN),            ! Chan
     +                     %VAL(FUNC),            ! Func
     +                     %REF(IOSB),            ! Iosb
     +                     ,                      ! ASTadr
     +                     ,                      ! ASTprm
     +                     %REF(FIBDSC),          ! P1 (FIB)
     +                     %DESCR(FILNAM),        ! P2 (file name)
     +                     ,                      ! P3
     +                     ,                      ! P4
     +                     %REF(ATR),             ! P5 (file attr.)
     +                     )                      ! P6

      SS_STATUS = SYS$DASSGN(%VAL(CHAN))

      END



More information about the Info-vax mailing list