EXTERNALROUTINESPEC  DESTROY(STRING  (64) S)
EXTERNALROUTINESPEC  COPY(STRING  (63) S)
EXTERNALSTRINGFNSPEC  UINFS(INTEGER  ENTRY)
EXTERNALINTEGERFNSPEC  DSFI(STRING  (6) USER,  C 
   INTEGER  FSYS, TYPE, SET, ADR)
SYSTEMROUTINESPEC  DISCONNECT(STRING (31) FILE, INTEGERNAME  FLAG)
SYSTEMROUTINESPEC  PHEX(INTEGER  MN)
SYSTEMINTEGERMAPSPEC  COMREG(INTEGER  N)
SYSTEMROUTINESPEC  MOVE(INTEGER  L, F, T)
SYSTEMROUTINESPEC  CHANGEFILESIZE(STRING  (31) S,  C 
   INTEGER  NEWSIZE, INTEGERNAME  FLAG)
OWNSTRING  (32) ARRAY  FILENAME(0 : 100)
OWNSTRING  (8) ARRAY  TEMPFILE(0 : 100)
OWNINTEGERARRAY  RECORDS(0 : 100)
OWNINTEGERARRAY  CONAD(1 : 100)
OWNBYTEINTEGERARRAY  MODES(1 : 100)
OWNINTEGERARRAY  READPTR(1 : 100)
OWNSTRING  (63) PDFILE
OWNSTRING  (15) SUBFILE
CONSTINTEGER  SEG = X'40000'

EXTERNALROUTINE  OPENOMF(STRING  (32) FILE, INTEGER  CH, MODE)
RECORDFORMAT  INRFM(INTEGER  CONAD, FILESIZE, A,  C 
      STRING  (6) B, INTEGER  C, D, E, F)
SYSTEMROUTINESPEC  CONNECT(STRING  (32) S,  C 
      INTEGER  ACCESS, MAXBYTES, PROTECTION,  C 
      RECORDNAME  R, INTEGERNAME  J)
RECORD  IN(INRFM)
SYSTEMROUTINESPEC  OUTFILE(STRING  (32) S,  C 
      INTEGER  L, M, P, INTEGERNAME  C, F)
STRING  (6) USER
CONSTINTEGER  WRT = 1
INTEGER  I, MAXFSIZE
INTEGER  FLAG
   TEMPFILE(CH) = ""
   FILENAME(CH) = FILE
   MODES(CH) = MODE
   IF  MODE = WRT START 
      IF  FILE -> PDFILE.("_").SUBFILE THEN  START 
         FILE = "T#OMF__"
         BYTEINTEGER(ADDR(FILE)+6) = '0'+(CH//10)
         BYTEINTEGER(ADDR(FILE)+7) = '0'+(CH-((CH//10)*10))
         TEMPFILE(CH) = FILE
      FINISH 
      USER = UINFS(1)
      I = DSFI(USER,-1,12,0,ADDR(MAXFSIZE))
      MAXFSIZE = MAXFSIZE*1024
IF  COMREG(26)&64#0 THEN  I=MAXFSIZE ELSE  I=MAXFSIZE//3
      OUTFILE(FILE,SEG,I,0,CONAD(CH),FLAG)
      IF  FLAG # 0 START 
         PRINTSTRING('
OPEN OMF// OUTFILE '.FILE. C 
            ' FAILS, FLAG =')
         WRITE(FLAG,1)
         NEWLINES(2)
         STOP 
      FINISH 
      INTEGER(CONAD(CH)+12) = 4
      INTEGER(CONAD(CH)+24) = (4096<<16)!2
   FINISH  ELSE  START 
      CONNECT(FILE,0,0,0,IN,FLAG)
      IF  FLAG # 0 START 
         PRINTSTRING('
OPEN OMF// CONNECT '.FILE. C 
            ' FAILS,FLAG=')
         WRITE(FLAG,1)
         NEWLINES(2)
         STOP 
      FINISH 
      RECORDS(CH) = 0
      READPTR(CH) = IN_CONAD+32
      CONAD(CH) = IN_CONAD
   FINISH 
END 
ROUTINESPEC  NOTOPEN

EXTERNALROUTINE  WRITEOMF(INTEGER  CH, A, L)
INTEGER  PTR, CFSIZE, FLAG
   IF  CONAD(CH) = 0 THEN  NOTOPEN
   PTR = INTEGER(CONAD(CH))+CONAD(CH)
IF  L<=0 START 
PRINTSTRING("
RECORD LENGTH TOO SMALL
")
MONITOR 
STOP 
FINISH 
   RECORDS(CH) = RECORDS(CH)+1
   L = L+2
   CFSIZE = INTEGER(CONAD(CH)+8)
   IF  INTEGER(CONAD(CH))+L > CFSIZE THEN  START 
      CFSIZE = CFSIZE+SEG
      CHANGEFILESIZE(FILENAME(CH),CFSIZE,FLAG)
       INTEGER(CONAD(CH)+8)=CFSIZE
      IF  FLAG # 0 START 
         PRINTSTRING("
CHANGEFILESIZE FAILS ON ".FILENAME(CH). C 
            " , FLAG= ")
         WRITE(FLAG,1)
         NEWLINES(2)
         STOP 
      FINISH 
   FINISH 
   MOVE(2,ADDR(L)+2,PTR)
   MOVE(L-2,A,PTR+2)
   INTEGER(CONAD(CH)) = INTEGER(CONAD(CH))+L
END 

EXTERNALROUTINE  READ OMF(INTEGER  CH, A, INTEGERNAME  L)
INTEGER  I
   IF  COMREG(26)&X'400000' # 0 THENC 
PRINTSTRING("
READ OMF//")
   IF  CONAD(CH) = 0 THEN  NOTOPEN
   IF  COMREG(26)&X'400000' # 0 START 
  CYCLE  I=4,4,20
   PHEX(INTEGER(READPTR(CH)+I))
  REPEAT 
   FINISH 
   IF  READPTR(CH) >= INTEGER(CONAD(CH))+CONAD(CH) C 
      THEN  L = 0 AND  RETURN 
   L = 0
   MOVE(2,READPTR(CH),ADDR(L)+2)
   MOVE(L-2,READPTR(CH)+2,A)
   READPTR(CH) = READPTR(CH)+L
   L = L-2
END 

EXTERNALROUTINE  CLOSE OMF(INTEGER  CH)
STRING  (63) FILE,REST
INTEGER  FLAG, NEWSIZE
   RETURN  IF  MODES(CH) = 0
   IF  TEMPFILE(CH) = "" THEN  FILE = FILENAME(CH) C 
      ELSE  FILE = TEMPFILE(CH)
   NEWSIZE = (INTEGER(CONAD(CH))+1024)&X'FFFFFC00'
   CHANGEFILESIZE(FILE,NEWSIZE,FLAG)
   IF  FLAG # 0 START 
      PRINTSTRING("
CHANGEFILESIZE ON ".FILE." FAILS, FLAG = ")
      WRITE(FLAG,1)
      NEWLINE
      STOP 
   FINISH 
INTEGER(CONAD(CH)+8)=NEWSIZE
   INTEGER(CONAD(CH)+28) = RECORDS(CH)
   IF  TEMPFILE(CH) # "" THEN  COPY(TEMPFILE(CH).",".FILENAME( C 
      CH)) AND  DESTROY(TEMPFILE(CH))
UNLESS  FILE->("T#").REST START 
DISCONNECT(FILE ,FLAG)
IF  FLAG#0 START 
PRINTSTRING("
DISCONNECT ON """.FILE.""". FAILS, FLAG = ")
WRITE(FLAG,1)
NEWLINE
FINISH 
FINISH 
CONAD(CH)=0
   RECORDS(CH) = 0
END 
!!

EXTERNALROUTINE  NOTEOMF(INTEGER  CH, INTEGERNAME  POS)
   POS = READPTR(CH)
END 
!!

EXTERNALROUTINE  RESETOMF(INTEGER  CH, POS)
   READPTR(CH) = POS
END 
!!

ROUTINE  NOT OPEN
   PRINTSTRING('
OMF// FILE NOT OPEN
')
   STOP 
END 
ENDOFFILE