EXTERNALINTEGER  OMFRCODE
EXTERNALINTEGERFNSPEC  RETURN CODE
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
   IF  MODE > 10 THEN  MODE = MODE-10 AND  OMFRCODE = 0 C 
      ELSE  OMFRCODE = -1
   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 C 
         ELSE  I = (MAXFSIZE//3)*2
      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  IF  OMFRCODE = -1
         OMFRCODE = RETURN CODE
         RETURN 
      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  IF  OMFRCODE = -1
         OMFRCODE = RETURN CODE
         RETURN 
      FINISH 
      IF  INTEGER(IN_CONAD+12) # 4 START 
         PRINTSTRING("
".FILE." - HAS INCORRECT FILETYPE ")
         NEWLINE
         STOP  IF  OMFRCODE = -1
         OMFRCODE = 1;  RETURN 
      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 
      IF  OMFRCODE = -1 THEN  STOP 
      OMFRCODE = 1
      RETURN 
   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  IF  OMFRCODE = -1
         OMFRCODE = RETURN CODE
         RETURN 
      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 THEN  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  IF  OMFRCODE = -1
      OMFRCODE = RETURN CODE
      RETURN 
   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. C 
            """. 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  IF  OMFRCODE = -1
   OMFRCODE = 1
   RETURN 
END 
ENDOFFILE