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